diff --git a/.eslintrc b/.eslintrc index 218cb72b81..844933e68b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,7 +4,8 @@ "node": true, "mocha": true, "browser": true, - "builtin": true + "builtin": true, + "es6": true }, "parserOptions": { "ecmaVersion": 7, @@ -47,6 +48,7 @@ "selectKitSelectRowByValue":true, "selectKitSelectRowByName":true, "selectKitSelectRowByIndex":true, + "keyboardHelper":true, "selectKitSelectNoneRow":true, "selectKitFillInFilter":true, "asyncTestDiscourse":true, diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..ab6bcfe3d8 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +app/assets/stylesheets/vendor/ +plugins/**/assets/stylesheets/vendor/ +package.json diff --git a/.rubocop.yml b/.rubocop.yml index 8472c89a91..e28a0876aa 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -102,6 +102,9 @@ Layout/EndAlignment: Lint/RequireParentheses: Enabled: true +Lint/ShadowingOuterLocalVariable: + Enabled: true + Layout/MultilineMethodCallIndentation: Enabled: true EnforcedStyle: indented diff --git a/.ruby-version.sample b/.ruby-version.sample index 005119baaa..79a614418f 100644 --- a/.ruby-version.sample +++ b/.ruby-version.sample @@ -1 +1 @@ -2.4.1 +2.4.4 diff --git a/.travis.yml b/.travis.yml index eb5f8087fe..c93734e824 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,9 @@ addons: matrix: fast_finish: true + exclude: + - rvm: 2.4.4 + env: "RAILS_MASTER=0 QUNIT_RUN=0 RUN_LINT=1" rvm: - 2.5.1 @@ -58,6 +61,7 @@ before_install: - git clone --depth=1 https://github.com/discourse/discourse-assign.git plugins/discourse-assign - git clone --depth=1 https://github.com/discourse/discourse-patreon.git plugins/discourse-patreon - git clone --depth=1 https://github.com/discourse/discourse-staff-notes.git plugins/discourse-staff-notes + - git clone --depth=1 https://github.com/discourse/discourse-group-tracker - export PATH=$HOME/.yarn/bin:$PATH install: @@ -71,6 +75,7 @@ script: bash -c " if [ '$RUN_LINT' == '1' ]; then bundle exec rubocop --parallel && \ + bundle exec danger && \ yarn eslint --ext .es6 app/assets/javascripts && \ yarn eslint --ext .es6 test/javascripts && \ yarn eslint --ext .es6 plugins/**/assets/javascripts && \ diff --git a/.tx/config b/.tx/config index bc1bcb84c9..7167d96bc5 100644 --- a/.tx/config +++ b/.tx/config @@ -1,6 +1,6 @@ [main] host = https://www.transifex.com -lang_map = el_GR: el, es_ES: es, fr_FR: fr, ko_KR: ko, pt_PT: pt, sk_SK: sk, vi_VN: vi +lang_map = el_GR: el, es_ES: es, fr_FR: fr, hu_HU: hu, ko_KR: ko, pt_PT: pt, sk_SK: sk, vi_VN: vi [discourse-org.core-client-yml] file_filter = config/locales/client..yml diff --git a/Dangerfile b/Dangerfile new file mode 100644 index 0000000000..3941cffbed --- /dev/null +++ b/Dangerfile @@ -0,0 +1,11 @@ +if github.pr_json && (github.pr_json["additions"] || 0) > 250 || (github.pr_json["deletions"] || 0) > 250 + warn("This pull request is big! We prefer smaller PRs whenever possible, as they are easier to review. Can this be split into a few smaller PRs?") +end + +prettier_offenses = `prettier --list-different "app/assets/stylesheets/**/*.scss" "app/assets/javascripts/**/*.es6" "test/javascripts/**/*.es6"`.split('\n') +if !prettier_offenses.empty? + fail(%{ +This PR doesn't match our required code formatting standards, as enforced by prettier.io. Here's how to set up prettier in your code editor.\n +#{prettier_offenses.map { |o| github.html_link(o) }.join("\n")} + }) +end diff --git a/Gemfile b/Gemfile index f5a03d7d5d..ca22ff21f3 100644 --- a/Gemfile +++ b/Gemfile @@ -13,13 +13,13 @@ if rails_master? gem 'rails', git: 'https://github.com/rails/rails.git' gem 'seed-fu', git: 'https://github.com/SamSaffron/seed-fu.git', branch: 'discourse' else - gem 'actionmailer', '~> 5.1' - gem 'actionpack', '~> 5.1' - gem 'actionview', '~> 5.1' - gem 'activemodel', '~> 5.1' - gem 'activerecord', '~> 5.1' - gem 'activesupport', '~> 5.1' - gem 'railties', '~> 5.1' + gem 'actionmailer', '5.2' + gem 'actionpack', '5.2' + gem 'actionview', '5.2' + gem 'activemodel', '5.2' + gem 'activerecord', '5.2' + gem 'activesupport', '5.2' + gem 'railties', '5.2' gem 'sprockets-rails' gem 'seed-fu' end @@ -34,7 +34,7 @@ gem 'redis-namespace' gem 'active_model_serializers', '~> 0.8.3' -gem 'onebox', '1.8.48' +gem 'onebox', '1.8.60' gem 'http_accept_language', '~>2.0.5', require: false @@ -60,7 +60,7 @@ gem 'unf', require: false gem 'email_reply_trimmer', '~> 0.1' -# Forked until https://github.com/toy/image_optim/pull/149 is merged +# Forked until https://github.com/toy/image_optim/pull/162 is merged gem 'discourse_image_optim', require: 'image_optim' gem 'multi_json' gem 'mustache' @@ -78,7 +78,8 @@ gem 'omniauth-oauth2', require: false gem 'omniauth-google-oauth2' gem 'oj' -gem 'pg', '~> 0.21.0' +gem 'pg' +gem 'mini_sql' gem 'pry-rails', require: false gem 'r2', '~> 0.2.5', require: false gem 'rake' @@ -87,13 +88,14 @@ gem 'thor', require: false gem 'rinku' gem 'sanitize' gem 'sidekiq' +gem 'mini_scheduler' # for sidekiq web gem 'tilt', require: false gem 'execjs', require: false gem 'mini_racer' -gem 'highline', require: false +gem 'highline', '~> 1.7.0', require: false gem 'rack-protection' # security # Gems used only for assets and not required in production environments by default. @@ -107,6 +109,7 @@ group :test do gem 'webmock', require: false gem 'fakeweb', '~> 1.3.0', require: false gem 'minitest', require: false + gem 'danger' end group :test, :development do @@ -178,12 +181,16 @@ gem 'rqrcode' gem 'sshkey', require: false +gem 'rchardet', require: false + if ENV["IMPORT"] == "1" gem 'mysql2' gem 'redcarpet' gem 'sqlite3', '~> 1.3.13' gem 'ruby-bbcode-to-md', github: 'nlalonde/ruby-bbcode-to-md' gem 'reverse_markdown' + gem 'tiny_tds' end gem 'webpush', require: false +gem 'colored2', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 8a55439195..689fe3d92d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,97 +1,119 @@ GEM remote: https://rubygems.org/ specs: - actionmailer (5.1.4) - actionpack (= 5.1.4) - actionview (= 5.1.4) - activejob (= 5.1.4) + actionmailer (5.2.0) + actionpack (= 5.2.0) + actionview (= 5.2.0) + activejob (= 5.2.0) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.1.4) - actionview (= 5.1.4) - activesupport (= 5.1.4) + actionpack (5.2.0) + actionview (= 5.2.0) + activesupport (= 5.2.0) rack (~> 2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.1.4) - activesupport (= 5.1.4) + actionview (5.2.0) + activesupport (= 5.2.0) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - active_model_serializers (0.8.3) + active_model_serializers (0.8.4) activemodel (>= 3.0) - activejob (5.1.4) - activesupport (= 5.1.4) + activejob (5.2.0) + activesupport (= 5.2.0) globalid (>= 0.3.6) - activemodel (5.1.4) - activesupport (= 5.1.4) - activerecord (5.1.4) - activemodel (= 5.1.4) - activesupport (= 5.1.4) - arel (~> 8.0) - activesupport (5.1.4) + activemodel (5.2.0) + activesupport (= 5.2.0) + activerecord (5.2.0) + activemodel (= 5.2.0) + activesupport (= 5.2.0) + arel (>= 9.0) + activesupport (5.2.0) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (~> 0.7) + i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.5.1) - public_suffix (~> 2.0, >= 2.0.2) - annotate (2.7.2) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + annotate (2.7.4) activerecord (>= 3.2, < 6.0) rake (>= 10.4, < 13.0) - arel (8.0.0) + arel (9.0.0) ast (2.4.0) - aws-partitions (1.24.0) - aws-sdk-core (3.6.0) + aws-eventstream (1.0.1) + aws-partitions (1.92.0) + aws-sdk-core (3.21.2) + aws-eventstream (~> 1.0) aws-partitions (~> 1.0) aws-sigv4 (~> 1.0) jmespath (~> 1.0) - aws-sdk-kms (1.2.0) + aws-sdk-kms (1.5.0) aws-sdk-core (~> 3) aws-sigv4 (~> 1.0) - aws-sdk-s3 (1.4.0) - aws-sdk-core (~> 3) + aws-sdk-s3 (1.14.0) + aws-sdk-core (~> 3, >= 3.21.2) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.0) aws-sigv4 (1.0.2) - barber (0.11.2) - ember-source (>= 1.0, < 3) + barber (0.12.0) + ember-source (>= 1.0, < 3.1) execjs (>= 1.2, < 3) - better_errors (2.1.1) + better_errors (2.4.0) coderay (>= 1.0.0) - erubis (>= 2.6.6) + erubi (>= 1.0.0) rack (>= 0.9.0) binding_of_caller (0.8.0) debug_inspector (>= 0.0.1) - bootsnap (1.1.8) + bootsnap (1.3.0) msgpack (~> 1.0) builder (3.2.3) - bullet (5.5.1) + bullet (5.7.5) activesupport (>= 3.0.0) - uniform_notifier (~> 1.10.0) - byebug (9.0.6) + uniform_notifier (~> 1.11.0) + byebug (10.0.2) certified (1.0.0) - chunky_png (1.3.8) + chunky_png (1.3.10) + claide (1.0.2) + claide-plugins (0.9.2) + cork + nap + open4 (~> 1.3) coderay (1.1.2) + colored2 (3.1.2) concurrent-ruby (1.0.5) - connection_pool (2.2.1) + connection_pool (2.2.2) + cork (0.3.0) + colored2 (~> 3.1) cppjieba_rb (0.3.0) crack (0.4.3) safe_yaml (~> 1.0.0) - crass (1.0.3) + crass (1.0.4) + danger (5.6.3) + claide (~> 1.0) + claide-plugins (>= 0.9.2) + colored2 (~> 3.1) + cork (~> 0.1) + faraday (~> 0.9) + faraday-http-cache (~> 1.0) + git (~> 1) + kramdown (~> 1.5) + no_proxy_fix + octokit (~> 4.7) + terminal-table (~> 1) debug_inspector (0.0.3) diff-lcs (1.3) - discourse_image_optim (0.24.5) + discourse_image_optim (0.26.2) exifr (~> 1.2, >= 1.2.2) fspath (~> 3.0) image_size (~> 1.5) in_threads (~> 1.3) progress (~> 3.0, >= 3.0.1) email_reply_trimmer (0.1.12) - ember-data-source (2.2.1) - ember-source (>= 1.8, < 3.0) + ember-data-source (3.0.2) + ember-source (>= 2, < 3.0) ember-handlebars-template (0.7.5) barber (>= 0.11.0) sprockets (>= 3.3, < 4) @@ -103,61 +125,66 @@ GEM jquery-rails (>= 1.0.17) railties (>= 3.1) ember-source (2.13.3) - erubi (1.6.1) - erubis (2.7.0) - excon (0.56.0) + erubi (1.7.1) + excon (0.62.0) execjs (2.7.0) - exifr (1.2.5) - fabrication (2.9.8) + exifr (1.3.4) + fabrication (2.20.1) fakeweb (1.3.0) - faraday (0.11.0) + faraday (0.12.2) multipart-post (>= 1.2, < 3) + faraday-http-cache (1.3.1) + faraday (~> 0.8) fast_blank (1.0.0) fast_xor (1.1.3) rake rake-compiler fast_xs (0.8.0) - fastimage (2.1.1) - ffi (1.9.18) + fastimage (2.1.3) + ffi (1.9.25) flamegraph (0.9.5) - foreman (0.84.0) + foreman (0.85.0) thor (~> 0.19.1) fspath (3.1.0) gc_tracer (1.5.1) - globalid (0.4.0) + git (1.4.0) + globalid (0.4.1) activesupport (>= 4.2.0) guess_html_encoding (0.0.11) - hashdiff (0.3.4) - hashie (3.5.5) - highline (1.7.8) + hashdiff (0.3.7) + hashie (3.5.7) + highline (1.7.10) hiredis (0.6.1) hkdf (0.3.0) htmlentities (4.3.4) http_accept_language (2.0.5) - i18n (0.8.6) + i18n (1.0.1) + concurrent-ruby (~> 1.0) image_size (1.5.0) - in_threads (1.4.0) - jmespath (1.3.1) - jquery-rails (4.3.1) + in_threads (1.5.0) + jaro_winkler (1.5.1) + jmespath (1.4.0) + jquery-rails (4.3.3) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) jwt (1.5.6) - kgio (2.11.1) + kgio (2.11.2) + kramdown (1.17.0) libv8 (6.7.288.46.1) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) - lograge (0.7.1) - actionpack (>= 4, < 5.2) - activesupport (>= 4, < 5.2) - railties (>= 4, < 5.2) + lograge (0.10.0) + actionpack (>= 4) + activesupport (>= 4) + railties (>= 4) request_store (~> 1.0) logstash-event (1.2.02) - logstash-logger (0.25.1) + logstash-logger (0.26.1) logstash-event (~> 1.2) - logster (1.2.9) + logster (1.2.11) loofah (2.2.2) crass (~> 1.0.2) nokogiri (>= 1.5.9) @@ -173,94 +200,100 @@ GEM mini_portile2 (2.3.0) mini_racer (0.2.0) libv8 (>= 6.3) + mini_scheduler (0.8.1) + mini_sql (0.1.10) mini_suffix (0.3.0) ffi (~> 1.9) - minitest (5.10.3) - mocha (1.2.1) + minitest (5.11.3) + mocha (1.5.0) metaclass (~> 0.0.1) - mock_redis (0.17.3) + mock_redis (0.18.0) moneta (1.0.0) msgpack (1.2.4) multi_json (1.13.1) multi_xml (0.6.0) multipart-post (2.0.0) mustache (1.0.5) - nokogiri (1.8.2) + nap (1.1.0) + no_proxy_fix (0.1.2) + nokogiri (1.8.3) mini_portile2 (~> 2.3.0) nokogumbo (1.5.0) nokogiri - oauth (0.5.1) - oauth2 (1.3.1) - faraday (>= 0.8, < 0.12) + oauth (0.5.4) + oauth2 (1.4.0) + faraday (>= 0.8, < 0.13) jwt (~> 1.0) multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - oj (3.4.0) - omniauth (1.6.1) + octokit (4.9.0) + sawyer (~> 0.8.0, >= 0.5.3) + oj (3.6.2) + omniauth (1.8.1) hashie (>= 3.4.6, < 3.6.0) rack (>= 1.6.2, < 3) - omniauth-facebook (4.0.0) + omniauth-facebook (5.0.0) omniauth-oauth2 (~> 1.2) omniauth-github (1.3.0) omniauth (~> 1.5) omniauth-oauth2 (>= 1.4.0, < 2.0) - omniauth-google-oauth2 (0.3.1) - jwt (~> 1.0) - multi_json (~> 1.3) + omniauth-google-oauth2 (0.5.3) + jwt (>= 1.5) omniauth (>= 1.1.1) - omniauth-oauth2 (>= 1.3.1) - omniauth-instagram (1.0.2) + omniauth-oauth2 (>= 1.5) + omniauth-instagram (1.3.0) omniauth (~> 1) omniauth-oauth2 (~> 1) omniauth-oauth (1.1.0) oauth omniauth (~> 1.0) - omniauth-oauth2 (1.4.0) - oauth2 (~> 1.0) + omniauth-oauth2 (1.5.0) + oauth2 (~> 1.1) omniauth (~> 1.2) omniauth-openid (1.0.1) omniauth (~> 1.0) rack-openid (~> 1.3.1) - omniauth-twitter (1.3.0) + omniauth-twitter (1.4.0) omniauth-oauth (~> 1.1) rack - onebox (1.8.48) + onebox (1.8.60) htmlentities (~> 4.3) moneta (~> 1.0) multi_json (~> 1.11) mustache nokogiri (~> 1.7) sanitize + open4 (1.3.4) openid-redis-store (0.0.2) redis ruby-openid parallel (1.12.1) - parser (2.5.0.3) + parser (2.5.1.0) ast (~> 2.4.0) - pg (0.21.0) - powerpack (0.1.1) - progress (3.3.1) + pg (1.1.0) + powerpack (0.1.2) + progress (3.4.0) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) pry-nav (0.2.4) pry (>= 0.9.10, < 0.11.0) - pry-rails (0.3.4) - pry (>= 0.9.10) - public_suffix (2.0.5) - puma (3.9.1) - r2 (0.2.6) + pry-rails (0.3.6) + pry (>= 0.10.4) + public_suffix (3.0.2) + puma (3.11.4) + r2 (0.2.7) rack (2.0.5) rack-mini-profiler (1.0.0) rack (>= 1.2.0) rack-openid (1.3.1) rack (>= 1.1.0) ruby-openid (>= 2.1.8) - rack-protection (2.0.1) + rack-protection (2.0.3) rack - rack-test (0.7.0) + rack-test (1.0.0) rack (>= 1.0, < 3) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) @@ -270,58 +303,61 @@ GEM rails_multisite (2.0.4) activerecord (> 4.2, < 6) railties (> 4.2, < 6) - railties (5.1.4) - actionpack (= 5.1.4) - activesupport (= 5.1.4) + railties (5.2.0) + actionpack (= 5.2.0) + activesupport (= 5.2.0) method_source rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (3.0.0) raindrops (0.19.0) - rake (12.3.0) + rake (12.3.1) rake-compiler (1.0.4) rake - rb-fsevent (0.9.8) - rb-inotify (0.9.8) - ffi (>= 0.5.0) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) rbtrace (0.4.10) ffi (>= 1.0.6) msgpack (>= 0.4.3) trollop (>= 1.16.2) + rchardet (1.8.0) redis (4.0.1) redis-namespace (1.6.0) redis (>= 3.0.4) - request_store (1.3.2) - rinku (2.0.2) - rotp (3.3.0) + request_store (1.4.1) + rack (>= 1.4) + rinku (2.0.4) + rotp (3.3.1) rqrcode (0.10.1) chunky_png (~> 1.0) - rspec (3.6.0) - rspec-core (~> 3.6.0) - rspec-expectations (~> 3.6.0) - rspec-mocks (~> 3.6.0) - rspec-core (3.6.0) - rspec-support (~> 3.6.0) - rspec-expectations (3.6.0) + rspec (3.7.0) + rspec-core (~> 3.7.0) + rspec-expectations (~> 3.7.0) + rspec-mocks (~> 3.7.0) + rspec-core (3.7.1) + rspec-support (~> 3.7.0) + rspec-expectations (3.7.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.6.0) + rspec-support (~> 3.7.0) rspec-html-matchers (0.9.1) nokogiri (~> 1) rspec (>= 3.0.0.a, < 4) - rspec-mocks (3.6.0) + rspec-mocks (3.7.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.6.0) - rspec-rails (3.6.1) + rspec-support (~> 3.7.0) + rspec-rails (3.7.2) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec-core (~> 3.6.0) - rspec-expectations (~> 3.6.0) - rspec-mocks (~> 3.6.0) - rspec-support (~> 3.6.0) - rspec-support (3.6.0) + rspec-core (~> 3.7.0) + rspec-expectations (~> 3.7.0) + rspec-mocks (~> 3.7.0) + rspec-support (~> 3.7.0) + rspec-support (3.7.1) rtlit (0.0.5) - rubocop (0.53.0) + rubocop (0.57.2) + jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.5) powerpack (~> 0.1) @@ -329,23 +365,30 @@ GEM ruby-progressbar (~> 1.7) unicode-display_width (~> 1.0, >= 1.0.1) ruby-openid (2.7.0) - ruby-prof (0.16.2) + ruby-prof (0.17.0) ruby-progressbar (1.9.0) ruby-readability (0.7.0) guess_html_encoding (>= 0.0.4) nokogiri (>= 1.6.0) ruby_dep (1.5.0) safe_yaml (1.0.4) - sanitize (4.6.4) + sanitize (4.6.5) crass (~> 1.0.2) nokogiri (>= 1.4.4) nokogumbo (~> 1.4) - sass (3.4.24) - sassc (1.11.2) + sass (3.5.6) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sassc (1.11.4) bundler ffi (~> 1.9.6) sass (>= 3.3.0) - seed-fu (2.3.7) + sawyer (0.8.1) + addressable (>= 2.3.5, < 2.6) + faraday (~> 0.8, < 1.0) + seed-fu (2.3.9) activerecord (>= 3.1) activesupport (>= 3.1) shoulda (3.5.0) @@ -363,29 +406,31 @@ GEM sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.0) + sprockets-rails (3.2.1) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) sshkey (1.9.0) - stackprof (0.2.10) + stackprof (0.2.11) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) thor (0.19.4) thread_safe (0.3.6) - tilt (2.0.7) + tilt (2.0.8) trollop (2.1.2) - tzinfo (1.2.3) + tzinfo (1.2.5) thread_safe (~> 0.1) - uglifier (3.2.0) + uglifier (4.1.11) execjs (>= 0.3.0, < 3) unf (0.1.4) unf_ext - unf_ext (0.0.7.4) - unicode-display_width (1.3.0) + unf_ext (0.0.7.5) + unicode-display_width (1.4.0) unicorn (5.4.0) kgio (~> 2.6) raindrops (~> 0.7) - uniform_notifier (1.10.0) - webmock (3.0.1) + uniform_notifier (1.11.0) + webmock (3.4.2) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff @@ -397,13 +442,13 @@ PLATFORMS ruby DEPENDENCIES - actionmailer (~> 5.1) - actionpack (~> 5.1) - actionview (~> 5.1) + actionmailer (= 5.2) + actionpack (= 5.2) + actionview (= 5.2) active_model_serializers (~> 0.8.3) - activemodel (~> 5.1) - activerecord (~> 5.1) - activesupport (~> 5.1) + activemodel (= 5.2) + activerecord (= 5.2) + activesupport (= 5.2) annotate aws-sdk-s3 barber @@ -413,7 +458,9 @@ DEPENDENCIES bullet byebug certified + colored2 cppjieba_rb + danger discourse_image_optim email_reply_trimmer (~> 0.1) ember-handlebars-template (= 0.7.5) @@ -430,7 +477,7 @@ DEPENDENCIES flamegraph foreman gc_tracer - highline + highline (~> 1.7.0) hiredis htmlentities http_accept_language (~> 2.0.5) @@ -445,6 +492,8 @@ DEPENDENCIES message_bus mini_mime mini_racer + mini_scheduler + mini_sql mini_suffix minitest mocha @@ -461,9 +510,9 @@ DEPENDENCIES omniauth-oauth2 omniauth-openid omniauth-twitter - onebox (= 1.8.48) + onebox (= 1.8.60) openid-redis-store - pg (~> 0.21.0) + pg pry-nav pry-rails puma @@ -471,11 +520,12 @@ DEPENDENCIES rack-mini-profiler rack-protection rails_multisite - railties (~> 5.1) + railties (= 5.2) rake rb-fsevent rb-inotify (~> 0.9) rbtrace + rchardet redis redis-namespace rinku @@ -505,4 +555,4 @@ DEPENDENCIES webpush BUNDLED WITH - 1.16.2 + 1.16.4 diff --git a/README.md b/README.md index 6e04e399e9..a34a9619b1 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Browse [lots more notable Discourse instances](https://www.discourse.org/custome 2. If you're familiar with how Rails works and are comfortable setting up your own environment, use our [**Discourse Advanced Developer Guide**](docs/DEVELOPER-ADVANCED.md). -Before you get started, ensure you have the following minimum versions: [Ruby 2.3+](http://www.ruby-lang.org/en/downloads/), [PostgreSQL 9.3+](http://www.postgresql.org/download/), [Redis 2.6+](http://redis.io/download). If you're having trouble, please see our [**TROUBLESHOOTING GUIDE**](docs/TROUBLESHOOTING.md) first! +Before you get started, ensure you have the following minimum versions: [Ruby 2.4+](http://www.ruby-lang.org/en/downloads/), [PostgreSQL 9.3+](http://www.postgresql.org/download/), [Redis 2.6+](http://redis.io/download). If you're having trouble, please see our [**TROUBLESHOOTING GUIDE**](docs/TROUBLESHOOTING.md) first! ## Setting up Discourse diff --git a/app/assets/javascripts/admin/adapters/build-plugin.js.es6 b/app/assets/javascripts/admin/adapters/build-plugin.js.es6 index b73bf7ecb1..0297aaa8be 100644 --- a/app/assets/javascripts/admin/adapters/build-plugin.js.es6 +++ b/app/assets/javascripts/admin/adapters/build-plugin.js.es6 @@ -1,9 +1,11 @@ -import RestAdapter from 'discourse/adapters/rest'; +import RestAdapter from "discourse/adapters/rest"; export default function buildPluginAdapter(pluginName) { return RestAdapter.extend({ pathFor(store, type, findArgs) { - return "/admin/plugins/" + pluginName + this._super(store, type, findArgs); + return ( + "/admin/plugins/" + pluginName + this._super(store, type, findArgs) + ); } }); } diff --git a/app/assets/javascripts/admin/adapters/customization-base.js.es6 b/app/assets/javascripts/admin/adapters/customization-base.js.es6 index f57240a116..d1087e7019 100644 --- a/app/assets/javascripts/admin/adapters/customization-base.js.es6 +++ b/app/assets/javascripts/admin/adapters/customization-base.js.es6 @@ -1,4 +1,4 @@ -import RestAdapter from 'discourse/adapters/rest'; +import RestAdapter from "discourse/adapters/rest"; export default RestAdapter.extend({ basePath() { diff --git a/app/assets/javascripts/admin/adapters/embedding.js.es6 b/app/assets/javascripts/admin/adapters/embedding.js.es6 index c8985cfdca..c1d5eceace 100644 --- a/app/assets/javascripts/admin/adapters/embedding.js.es6 +++ b/app/assets/javascripts/admin/adapters/embedding.js.es6 @@ -1,4 +1,4 @@ -import RestAdapter from 'discourse/adapters/rest'; +import RestAdapter from "discourse/adapters/rest"; export default RestAdapter.extend({ pathFor() { diff --git a/app/assets/javascripts/admin/adapters/flagged-post.js.es6 b/app/assets/javascripts/admin/adapters/flagged-post.js.es6 index 1a1065f638..dc44315170 100644 --- a/app/assets/javascripts/admin/adapters/flagged-post.js.es6 +++ b/app/assets/javascripts/admin/adapters/flagged-post.js.es6 @@ -1,4 +1,4 @@ -import RestAdapter from 'discourse/adapters/rest'; +import RestAdapter from "discourse/adapters/rest"; export default RestAdapter.extend({ pathFor(store, type, findArgs) { @@ -17,20 +17,20 @@ export default RestAdapter.extend({ hasMore: pa.conversation.has_more, response: { excerpt: pa.conversation.response.excerpt, - user: helper.lookup('user', pa.conversation.response.user_id) + user: helper.lookup("user", pa.conversation.response.user_id) } }; if (pa.conversation.reply) { conversation.reply = { excerpt: pa.conversation.reply.excerpt, - user: helper.lookup('user', pa.conversation.reply.user_id) + user: helper.lookup("user", pa.conversation.reply.user_id) }; } conversations.push(conversation); } }); - flag.set('conversations', conversations); + flag.set("conversations", conversations); }); return results; diff --git a/app/assets/javascripts/admin/adapters/site-text.js.es6 b/app/assets/javascripts/admin/adapters/site-text.js.es6 index b547b06f3c..f362b06fe1 100644 --- a/app/assets/javascripts/admin/adapters/site-text.js.es6 +++ b/app/assets/javascripts/admin/adapters/site-text.js.es6 @@ -1,2 +1,2 @@ -import CustomizationBase from 'admin/adapters/customization-base'; +import CustomizationBase from "admin/adapters/customization-base"; export default CustomizationBase; diff --git a/app/assets/javascripts/admin/adapters/theme.js.es6 b/app/assets/javascripts/admin/adapters/theme.js.es6 index df9c8830d1..b98ba3e423 100644 --- a/app/assets/javascripts/admin/adapters/theme.js.es6 +++ b/app/assets/javascripts/admin/adapters/theme.js.es6 @@ -1,4 +1,4 @@ -import RestAdapter from 'discourse/adapters/rest'; +import RestAdapter from "discourse/adapters/rest"; export default RestAdapter.extend({ basePath() { @@ -7,7 +7,9 @@ export default RestAdapter.extend({ afterFindAll(results) { let map = {}; - results.forEach(theme => {map[theme.id] = theme;}); + results.forEach(theme => { + map[theme.id] = theme; + }); results.forEach(theme => { let mapped = theme.get("child_themes") || []; mapped = mapped.map(t => map[t.id]); diff --git a/app/assets/javascripts/admin/adapters/user-field.js.es6 b/app/assets/javascripts/admin/adapters/user-field.js.es6 index b547b06f3c..f362b06fe1 100644 --- a/app/assets/javascripts/admin/adapters/user-field.js.es6 +++ b/app/assets/javascripts/admin/adapters/user-field.js.es6 @@ -1,2 +1,2 @@ -import CustomizationBase from 'admin/adapters/customization-base'; +import CustomizationBase from "admin/adapters/customization-base"; export default CustomizationBase; diff --git a/app/assets/javascripts/admin/adapters/web-hook-event.js.es6 b/app/assets/javascripts/admin/adapters/web-hook-event.js.es6 index 122070ce3e..4c80ac3ff0 100644 --- a/app/assets/javascripts/admin/adapters/web-hook-event.js.es6 +++ b/app/assets/javascripts/admin/adapters/web-hook-event.js.es6 @@ -1,7 +1,7 @@ -import RESTAdapter from 'discourse/adapters/rest'; +import RESTAdapter from "discourse/adapters/rest"; export default RESTAdapter.extend({ basePath() { - return '/admin/api/'; + return "/admin/api/"; } }); diff --git a/app/assets/javascripts/admin/adapters/web-hook.js.es6 b/app/assets/javascripts/admin/adapters/web-hook.js.es6 index 122070ce3e..4c80ac3ff0 100644 --- a/app/assets/javascripts/admin/adapters/web-hook.js.es6 +++ b/app/assets/javascripts/admin/adapters/web-hook.js.es6 @@ -1,7 +1,7 @@ -import RESTAdapter from 'discourse/adapters/rest'; +import RESTAdapter from "discourse/adapters/rest"; export default RESTAdapter.extend({ basePath() { - return '/admin/api/'; + return "/admin/api/"; } }); diff --git a/app/assets/javascripts/admin/components/ace-editor.js.es6 b/app/assets/javascripts/admin/components/ace-editor.js.es6 index faad36798a..192bc4b410 100644 --- a/app/assets/javascripts/admin/components/ace-editor.js.es6 +++ b/app/assets/javascripts/admin/components/ace-editor.js.es6 @@ -1,37 +1,37 @@ -import loadScript from 'discourse/lib/load-script'; -import { observes } from 'ember-addons/ember-computed-decorators'; +import loadScript from "discourse/lib/load-script"; +import { observes } from "ember-addons/ember-computed-decorators"; const LOAD_ASYNC = !Ember.testing; export default Ember.Component.extend({ - mode: 'css', - classNames: ['ace-wrapper'], + mode: "css", + classNames: ["ace-wrapper"], _editor: null, _skipContentChangeEvent: null, disabled: false, - @observes('editorId') + @observes("editorId") editorIdChanged() { - if (this.get('autofocus')) { - this.send('focus'); + if (this.get("autofocus")) { + this.send("focus"); } }, - @observes('content') + @observes("content") contentChanged() { if (this._editor && !this._skipContentChangeEvent) { - this._editor.getSession().setValue(this.get('content')); + this._editor.getSession().setValue(this.get("content")); } }, - @observes('mode') + @observes("mode") modeChanged() { if (LOAD_ASYNC && this._editor && !this._skipContentChangeEvent) { - this._editor.getSession().setMode("ace/mode/" + this.get('mode')); + this._editor.getSession().setMode("ace/mode/" + this.get("mode")); } }, - @observes('disabled') + @observes("disabled") disabledStateChanged() { this.changeDisabledState(); }, @@ -39,7 +39,7 @@ export default Ember.Component.extend({ changeDisabledState() { const editor = this._editor; if (editor) { - const disabled = this.get('disabled'); + const disabled = this.get("disabled"); editor.setOptions({ readOnly: disabled, highlightActiveLine: !disabled, @@ -56,12 +56,11 @@ export default Ember.Component.extend({ } if (this.appEvents) { // xxx: don't run during qunit tests - this.appEvents.off('ace:resize', this, this.resize); + this.appEvents.off("ace:resize", this, this.resize); } - $(window).off('ace:resize'); - - }.on('willDestroyElement'), + $(window).off("ace:resize"); + }.on("willDestroyElement"), resize() { if (this._editor) { @@ -73,37 +72,41 @@ export default Ember.Component.extend({ this._super(); loadScript("/javascripts/ace/ace.js", { scriptTag: true }).then(() => { - window.ace.require(['ace/ace'], loadedAce => { - if (!this.element || this.isDestroying || this.isDestroyed) { return; } - const editor = loadedAce.edit(this.$('.ace')[0]); + window.ace.require(["ace/ace"], loadedAce => { + if (!this.element || this.isDestroying || this.isDestroyed) { + return; + } + const editor = loadedAce.edit(this.$(".ace")[0]); if (LOAD_ASYNC) { editor.setTheme("ace/theme/chrome"); } editor.setShowPrintMargin(false); - editor.setOptions({fontSize: "14px"}); + editor.setOptions({ fontSize: "14px" }); if (LOAD_ASYNC) { - editor.getSession().setMode("ace/mode/" + this.get('mode')); + editor.getSession().setMode("ace/mode/" + this.get("mode")); } - editor.on('change', () => { + editor.on("change", () => { this._skipContentChangeEvent = true; - this.set('content', editor.getSession().getValue()); + this.set("content", editor.getSession().getValue()); this._skipContentChangeEvent = false; }); editor.$blockScrolling = Infinity; - editor.renderer.setScrollMargin(10,10); + editor.renderer.setScrollMargin(10, 10); - this.$().data('editor', editor); + this.$().data("editor", editor); this._editor = editor; this.changeDisabledState(); - $(window).off('ace:resize').on('ace:resize', ()=>{ - this.appEvents.trigger('ace:resize'); - }); + $(window) + .off("ace:resize") + .on("ace:resize", () => { + this.appEvents.trigger("ace:resize"); + }); if (this.appEvents) { // xxx: don't run during qunit tests - this.appEvents.on('ace:resize', ()=>this.resize()); + this.appEvents.on("ace:resize", () => this.resize()); } if (this.get("autofocus")) { diff --git a/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 index 01f4547b17..c2f9df5205 100644 --- a/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 @@ -1,57 +1,64 @@ -import debounce from 'discourse/lib/debounce'; -import { renderSpinner } from 'discourse/helpers/loading-spinner'; -import { escapeExpression } from 'discourse/lib/utilities'; -import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import debounce from "discourse/lib/debounce"; +import { renderSpinner } from "discourse/helpers/loading-spinner"; +import { escapeExpression } from "discourse/lib/utilities"; +import { bufferedRender } from "discourse-common/lib/buffered-render"; -export default Ember.Component.extend(bufferedRender({ - classNames: ["admin-backups-logs"], +export default Ember.Component.extend( + bufferedRender({ + classNames: ["admin-backups-logs"], - init() { - this._super(); - this._reset(); - }, + init() { + this._super(); + this._reset(); + }, - _reset() { - this.setProperties({ formattedLogs: "", index: 0 }); - }, + _reset() { + this.setProperties({ formattedLogs: "", index: 0 }); + }, - _scrollDown() { - const $div = this.$()[0]; - $div.scrollTop = $div.scrollHeight; - }, + _scrollDown() { + const $div = this.$()[0]; + $div.scrollTop = $div.scrollHeight; + }, - _updateFormattedLogs: debounce(function() { - const logs = this.get("logs"); - if (logs.length === 0) { - this._reset(); // reset the cached logs whenever the model is reset - } else { - // do the log formatting only once for HELLish performance - let formattedLogs = this.get("formattedLogs"); - for (let i = this.get("index"), length = logs.length; i < length; i++) { - const date = logs[i].get("timestamp"), - message = escapeExpression(logs[i].get("message")); - formattedLogs += "[" + date + "] " + message + "\n"; + _updateFormattedLogs: debounce(function() { + const logs = this.get("logs"); + if (logs.length === 0) { + this._reset(); // reset the cached logs whenever the model is reset + } else { + // do the log formatting only once for HELLish performance + let formattedLogs = this.get("formattedLogs"); + for (let i = this.get("index"), length = logs.length; i < length; i++) { + const date = logs[i].get("timestamp"), + message = escapeExpression(logs[i].get("message")); + formattedLogs += "[" + date + "] " + message + "\n"; + } + // update the formatted logs & cache index + this.setProperties({ + formattedLogs: formattedLogs, + index: logs.length + }); + // force rerender + this.rerenderBuffer(); } - // update the formatted logs & cache index - this.setProperties({ formattedLogs: formattedLogs, index: logs.length }); - // force rerender - this.rerenderBuffer(); - } - Ember.run.scheduleOnce('afterRender', this, this._scrollDown); - }, 150).observes("logs.[]").on('init'), + Ember.run.scheduleOnce("afterRender", this, this._scrollDown); + }, 150) + .observes("logs.[]") + .on("init"), - buildBuffer(buffer) { - const formattedLogs = this.get("formattedLogs"); - if (formattedLogs && formattedLogs.length > 0) { - buffer.push("
");
-      buffer.push(formattedLogs);
-      buffer.push("
"); - } else { - buffer.push("

" + I18n.t("admin.backups.logs.none") + "

"); + buildBuffer(buffer) { + const formattedLogs = this.get("formattedLogs"); + if (formattedLogs && formattedLogs.length > 0) { + buffer.push("
");
+        buffer.push(formattedLogs);
+        buffer.push("
"); + } else { + buffer.push("

" + I18n.t("admin.backups.logs.none") + "

"); + } + // add a loading indicator + if (this.get("status.isOperationRunning")) { + buffer.push(renderSpinner("small")); + } } - // add a loading indicator - if (this.get("status.isOperationRunning")) { - buffer.push(renderSpinner('small')); - } - } -})); + }) +); diff --git a/app/assets/javascripts/admin/components/admin-directory-toggle.js.es6 b/app/assets/javascripts/admin/components/admin-directory-toggle.js.es6 index 8d43474a9d..add82cbbe7 100644 --- a/app/assets/javascripts/admin/components/admin-directory-toggle.js.es6 +++ b/app/assets/javascripts/admin/components/admin-directory-toggle.js.es6 @@ -1,33 +1,37 @@ -import { iconHTML } from 'discourse-common/lib/icon-library'; -import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { bufferedRender } from "discourse-common/lib/buffered-render"; -export default Ember.Component.extend(bufferedRender({ - tagName: 'th', - classNames: ['sortable'], - rerenderTriggers: ['order', 'ascending'], +export default Ember.Component.extend( + bufferedRender({ + tagName: "th", + classNames: ["sortable"], + rerenderTriggers: ["order", "ascending"], - buildBuffer(buffer) { - const icon = this.get('icon'); + buildBuffer(buffer) { + const icon = this.get("icon"); - if (icon) { - buffer.push(iconHTML(icon)); + if (icon) { + buffer.push(iconHTML(icon)); + } + + buffer.push(I18n.t(this.get("i18nKey"))); + + if (this.get("field") === this.get("order")) { + buffer.push( + iconHTML(this.get("ascending") ? "chevron-up" : "chevron-down") + ); + } + }, + + click() { + const currentOrder = this.get("order"); + const field = this.get("field"); + + if (currentOrder === field) { + this.set("ascending", this.get("ascending") ? null : true); + } else { + this.setProperties({ order: field, ascending: null }); + } } - - buffer.push(I18n.t(this.get('i18nKey'))); - - if (this.get('field') === this.get('order')) { - buffer.push(iconHTML(this.get('ascending') ? 'chevron-up' : 'chevron-down')); - } - }, - - click() { - const currentOrder = this.get('order'); - const field = this.get('field'); - - if (currentOrder === field) { - this.set('ascending', this.get('ascending') ? null : true); - } else { - this.setProperties({ order: field, ascending: null }); - } - } -})); + }) +); diff --git a/app/assets/javascripts/admin/components/admin-form-row.js.es6 b/app/assets/javascripts/admin/components/admin-form-row.js.es6 index e7cef2edb0..5159168c30 100644 --- a/app/assets/javascripts/admin/components/admin-form-row.js.es6 +++ b/app/assets/javascripts/admin/components/admin-form-row.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - classNames: ['row'] + classNames: ["row"] }); diff --git a/app/assets/javascripts/admin/components/admin-graph.js.es6 b/app/assets/javascripts/admin/components/admin-graph.js.es6 index 724e967374..7752230cfb 100644 --- a/app/assets/javascripts/admin/components/admin-graph.js.es6 +++ b/app/assets/javascripts/admin/components/admin-graph.js.es6 @@ -1,49 +1,56 @@ -import loadScript from 'discourse/lib/load-script'; -import { number } from 'discourse/lib/formatter'; +import loadScript from "discourse/lib/load-script"; +import { number } from "discourse/lib/formatter"; export default Ember.Component.extend({ - tagName: 'canvas', - refreshChart(){ + tagName: "canvas", + refreshChart() { const ctx = this.$()[0].getContext("2d"); const model = this.get("model"); const rawData = this.get("model.data"); var data = { labels: rawData.map(r => r.x), - datasets: [{ - data: rawData.map(r => r.y), - label: model.get('title'), - backgroundColor: "rgba(200,220,240,0.3)", - borderColor: "#08C" - }] + datasets: [ + { + data: rawData.map(r => r.y), + label: model.get("title"), + backgroundColor: "rgba(200,220,240,0.3)", + borderColor: "#08C" + } + ] }; const config = { - type: 'line', + type: "line", data: data, options: { responsive: true, tooltips: { callbacks: { - title: (context) => moment(context[0].xLabel, "YYYY-MM-DD").format("LL") + title: context => + moment(context[0].xLabel, "YYYY-MM-DD").format("LL") } }, scales: { - yAxes: [{ - display: true, - ticks: { - callback: (label) => number(label), - suggestedMin: 0 + yAxes: [ + { + display: true, + ticks: { + callback: label => number(label), + suggestedMin: 0 + } } - }] + ] } - }, + } }; this._chart = new window.Chart(ctx, config); }, - didInsertElement(){ - loadScript("/javascripts/Chart.min.js").then(() => this.refreshChart.apply(this)); + didInsertElement() { + loadScript("/javascripts/Chart.min.js").then(() => + this.refreshChart.apply(this) + ); } }); diff --git a/app/assets/javascripts/admin/components/admin-nav.js.es6 b/app/assets/javascripts/admin/components/admin-nav.js.es6 index 9250c1ae73..91ad923ffc 100644 --- a/app/assets/javascripts/admin/components/admin-nav.js.es6 +++ b/app/assets/javascripts/admin/components/admin-nav.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: '' + tagName: "" }); diff --git a/app/assets/javascripts/admin/components/admin-report-chart.js.es6 b/app/assets/javascripts/admin/components/admin-report-chart.js.es6 new file mode 100644 index 0000000000..116b4a8730 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-chart.js.es6 @@ -0,0 +1,116 @@ +import { number } from "discourse/lib/formatter"; +import loadScript from "discourse/lib/load-script"; + +export default Ember.Component.extend({ + classNames: ["admin-report-chart"], + limit: 8, + total: 0, + + willDestroyElement() { + this._super(...arguments); + + this._resetChart(); + }, + + didReceiveAttrs() { + this._super(...arguments); + + Ember.run.schedule("afterRender", () => { + const $chartCanvas = this.$(".chart-canvas"); + if (!$chartCanvas || !$chartCanvas.length) return; + + const context = $chartCanvas[0].getContext("2d"); + const model = this.get("model"); + const chartData = Ember.makeArray( + model.get("chartData") || model.get("data") + ); + const prevChartData = Ember.makeArray( + model.get("prevChartData") || model.get("prev_data") + ); + + const labels = chartData.map(d => d.x); + + const data = { + labels, + datasets: [ + { + data: chartData.map(d => Math.round(parseFloat(d.y))), + backgroundColor: prevChartData.length + ? "transparent" + : model.secondary_color, + borderColor: model.primary_color + } + ] + }; + + if (prevChartData.length) { + data.datasets.push({ + data: prevChartData.map(d => Math.round(parseFloat(d.y))), + borderColor: model.primary_color, + borderDash: [5, 5], + backgroundColor: "transparent", + borderWidth: 1, + pointRadius: 0 + }); + } + + loadScript("/javascripts/Chart.min.js").then(() => { + this._resetChart(); + this._chart = new window.Chart(context, this._buildChartConfig(data)); + }); + }); + }, + + _buildChartConfig(data) { + return { + type: "line", + data, + options: { + tooltips: { + callbacks: { + title: tooltipItem => + moment(tooltipItem[0].xLabel, "YYYY-MM-DD").format("LL") + } + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + layout: { + padding: { + left: 0, + top: 0, + right: 0, + bottom: 0 + } + }, + scales: { + yAxes: [ + { + display: true, + ticks: { callback: label => number(label) } + } + ], + xAxes: [ + { + display: true, + gridLines: { display: false }, + type: "time", + time: { + parser: "YYYY-MM-DD" + } + } + ] + } + } + }; + }, + + _resetChart() { + if (this._chart) { + this._chart.destroy(); + this._chart = null; + } + } +}); diff --git a/app/assets/javascripts/admin/components/admin-report-counters.js.es6 b/app/assets/javascripts/admin/components/admin-report-counters.js.es6 new file mode 100644 index 0000000000..3806e29ecb --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-counters.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + classNames: ["admin-report-counters"] +}); diff --git a/app/assets/javascripts/admin/components/admin-report-counts.js.es6 b/app/assets/javascripts/admin/components/admin-report-counts.js.es6 index 1739a186b3..849d81460a 100644 --- a/app/assets/javascripts/admin/components/admin-report-counts.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-counts.js.es6 @@ -1,6 +1,9 @@ export default Ember.Component.extend({ allTime: true, - tagName: 'tr', - reverseColors: Ember.computed.match('report.type', /^(time_to_first_response|topics_with_no_response)$/), - classNameBindings: ['reverseColors'] + tagName: "tr", + reverseColors: Ember.computed.match( + "report.type", + /^(time_to_first_response|topics_with_no_response)$/ + ), + classNameBindings: ["reverseColors"] }); diff --git a/app/assets/javascripts/admin/components/admin-report-inline-table.js.es6 b/app/assets/javascripts/admin/components/admin-report-inline-table.js.es6 new file mode 100644 index 0000000000..7e4933381c --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-inline-table.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + classNames: ["admin-report-inline-table"] +}); diff --git a/app/assets/javascripts/admin/components/admin-report-per-day-counts.js.es6 b/app/assets/javascripts/admin/components/admin-report-per-day-counts.js.es6 index 25bf94db21..b7620b66cd 100644 --- a/app/assets/javascripts/admin/components/admin-report-per-day-counts.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-per-day-counts.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: 'tr' + tagName: "tr" }); diff --git a/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 b/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 new file mode 100644 index 0000000000..7140b69668 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 @@ -0,0 +1,18 @@ +import computed from "ember-addons/ember-computed-decorators"; + +export default Ember.Component.extend({ + tagName: "td", + classNames: ["admin-report-table-cell"], + classNameBindings: ["type", "property"], + options: null, + + @computed("label", "data", "options") + computedLabel(label, data, options) { + return label.compute(data, options || {}); + }, + + type: Ember.computed.alias("label.type"), + property: Ember.computed.alias("label.mainProperty"), + formatedValue: Ember.computed.alias("computedLabel.formatedValue"), + value: Ember.computed.alias("computedLabel.value") +}); diff --git a/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 b/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 new file mode 100644 index 0000000000..ab986f2946 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 @@ -0,0 +1,18 @@ +import computed from "ember-addons/ember-computed-decorators"; + +export default Ember.Component.extend({ + tagName: "th", + classNames: ["admin-report-table-header"], + classNameBindings: ["label.mainProperty", "label.type", "isCurrentSort"], + attributeBindings: ["label.title:title"], + + @computed("currentSortLabel.sortProperty", "label.sortProperty") + isCurrentSort(currentSortField, labelSortField) { + return currentSortField === labelSortField; + }, + + @computed("currentSortDirection") + sortIcon(currentSortDirection) { + return currentSortDirection === 1 ? "caret-up" : "caret-down"; + } +}); diff --git a/app/assets/javascripts/admin/components/admin-report-table-row.js.es6 b/app/assets/javascripts/admin/components/admin-report-table-row.js.es6 new file mode 100644 index 0000000000..3be140c308 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-table-row.js.es6 @@ -0,0 +1,5 @@ +export default Ember.Component.extend({ + tagName: "tr", + classNames: ["admin-report-table-row"], + options: null +}); diff --git a/app/assets/javascripts/admin/components/admin-report-table.js.es6 b/app/assets/javascripts/admin/components/admin-report-table.js.es6 new file mode 100644 index 0000000000..bf1ea4efae --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report-table.js.es6 @@ -0,0 +1,139 @@ +import computed from "ember-addons/ember-computed-decorators"; + +const PAGES_LIMIT = 8; + +export default Ember.Component.extend({ + classNameBindings: ["sortable", "twoColumns"], + classNames: ["admin-report-table"], + sortable: false, + sortDirection: 1, + perPage: Ember.computed.alias("options.perPage"), + page: 0, + + @computed("model.computedLabels.length") + twoColumns(labelsLength) { + return labelsLength === 2; + }, + + @computed("totalsForSample", "options.total", "model.dates_filtering") + showTotalForSample(totalsForSample, total, datesFiltering) { + // check if we have at least one cell which contains a value + const sum = totalsForSample + .map(t => t.value) + .compact() + .reduce((s, v) => s + v, 0); + + return sum >= 1 && total && datesFiltering; + }, + + @computed("model.total", "options.total", "twoColumns") + showTotal(reportTotal, total, twoColumns) { + return reportTotal && total && twoColumns; + }, + + @computed("model.data.length") + showSortingUI(dataLength) { + return dataLength >= 5; + }, + + @computed("totalsForSampleRow", "model.computedLabels") + totalsForSample(row, labels) { + return labels.map(label => { + const computedLabel = label.compute(row); + computedLabel.type = label.type; + computedLabel.property = label.mainProperty; + return computedLabel; + }); + }, + + @computed("model.data", "model.computedLabels") + totalsForSampleRow(rows, labels) { + if (!rows || !rows.length) return {}; + + let totalsRow = {}; + + labels.forEach(label => { + const reducer = (sum, row) => { + const computedLabel = label.compute(row); + const value = computedLabel.value; + + if (!["seconds", "number", "percent"].includes(label.type)) { + return; + } else { + return sum + Math.round(value || 0); + } + }; + + const total = rows.reduce(reducer, 0); + totalsRow[label.mainProperty] = + label.type === "percent" ? Math.round(total / rows.length) : total; + }); + + return totalsRow; + }, + + @computed("sortLabel", "sortDirection", "model.data.[]") + sortedData(sortLabel, sortDirection, data) { + data = Ember.makeArray(data); + + if (sortLabel) { + const compare = (label, direction) => { + return (a, b) => { + let aValue = label.compute(a).value; + let bValue = label.compute(b).value; + const result = aValue < bValue ? -1 : aValue > bValue ? 1 : 0; + return result * direction; + }; + }; + + return data.sort(compare(sortLabel, sortDirection)); + } + + return data; + }, + + @computed("sortedData.[]", "perPage", "page") + paginatedData(data, perPage, page) { + if (perPage < data.length) { + const start = perPage * page; + return data.slice(start, start + perPage); + } + + return data; + }, + + @computed("model.data", "perPage", "page") + pages(data, perPage, page) { + if (!data || data.length <= perPage) return []; + + let pages = [...Array(Math.ceil(data.length / perPage)).keys()].map(v => { + return { + page: v + 1, + index: v, + class: v === page ? "is-current" : null + }; + }); + + if (pages.length > PAGES_LIMIT) { + const before = Math.max(0, page - PAGES_LIMIT / 2); + const after = Math.max(PAGES_LIMIT, page + PAGES_LIMIT / 2); + pages = pages.slice(before, after); + } + + return pages; + }, + + actions: { + changePage(page) { + this.set("page", page); + }, + + sortByLabel(label) { + if (this.get("sortLabel") === label) { + this.set("sortDirection", this.get("sortDirection") === 1 ? -1 : 1); + } else { + this.set("sortLabel", label); + } + } + } +}); diff --git a/app/assets/javascripts/admin/components/admin-report-trust-level-counts.js.es6 b/app/assets/javascripts/admin/components/admin-report-trust-level-counts.js.es6 index 25bf94db21..b7620b66cd 100644 --- a/app/assets/javascripts/admin/components/admin-report-trust-level-counts.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-trust-level-counts.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: 'tr' + tagName: "tr" }); diff --git a/app/assets/javascripts/admin/components/admin-report.js.es6 b/app/assets/javascripts/admin/components/admin-report.js.es6 new file mode 100644 index 0000000000..0a1947e4b4 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-report.js.es6 @@ -0,0 +1,408 @@ +import ReportLoader from "discourse/lib/reports-loader"; +import Category from "discourse/models/category"; +import { exportEntity } from "discourse/lib/export-csv"; +import { outputExportResult } from "discourse/lib/export-result"; +import { SCHEMA_VERSION, default as Report } from "admin/models/report"; +import computed from "ember-addons/ember-computed-decorators"; +import { + registerHoverTooltip, + unregisterHoverTooltip +} from "discourse/lib/tooltip"; + +const TABLE_OPTIONS = { + perPage: 8, + total: true, + limit: 20, + formatNumbers: true +}; + +const CHART_OPTIONS = {}; + +function collapseWeekly(data, average) { + let aggregate = []; + let bucket, i; + let offset = data.length % 7; + for (i = offset; i < data.length; i++) { + if (bucket && i % 7 === offset) { + if (average) { + bucket.y = parseFloat((bucket.y / 7.0).toFixed(2)); + } + aggregate.push(bucket); + bucket = null; + } + + bucket = bucket || { x: data[i].x, y: 0 }; + bucket.y += data[i].y; + } + return aggregate; +} + +export default Ember.Component.extend({ + classNameBindings: ["isEnabled", "isLoading", "dasherizedDataSourceName"], + classNames: ["admin-report"], + isEnabled: true, + disabledLabel: "admin.dashboard.disabled", + isLoading: false, + rateLimitationString: null, + dataSourceName: null, + report: null, + model: null, + reportOptions: null, + forcedModes: null, + showAllReportsLink: false, + filters: null, + startDate: null, + endDate: null, + category: null, + groupId: null, + showTrend: false, + showHeader: true, + showTitle: true, + showFilteringUI: false, + showCategoryOptions: Ember.computed.alias("model.category_filtering"), + showDatesOptions: Ember.computed.alias("model.dates_filtering"), + showGroupOptions: Ember.computed.alias("model.group_filtering"), + showExport: Ember.computed.not("model.onlyTable"), + showRefresh: Ember.computed.or( + "showCategoryOptions", + "showDatesOptions", + "showGroupOptions" + ), + shouldDisplayTrend: Ember.computed.and("showTrend", "model.prev_period"), + + init() { + this._super(...arguments); + + this._reports = []; + }, + + didReceiveAttrs() { + this._super(...arguments); + + const state = this.get("filters") || {}; + + this.setProperties({ + category: Category.findById(state.categoryId), + groupId: state.groupId, + startDate: state.startDate, + endDate: state.endDate + }); + + if (this.get("report")) { + this._renderReport( + this.get("report"), + this.get("forcedModes"), + this.get("currentMode") + ); + } else if (this.get("dataSourceName")) { + this._fetchReport(); + } + }, + + didRender() { + this._super(...arguments); + + registerHoverTooltip($(".info[data-tooltip]")); + }, + + willDestroyElement() { + this._super(...arguments); + + unregisterHoverTooltip($(".info[data-tooltip]")); + }, + + showError: Ember.computed.or("showTimeoutError", "showExceptionError"), + showTimeoutError: Ember.computed.equal("model.error", "timeout"), + showExceptionError: Ember.computed.equal("model.error", "exception"), + + hasData: Ember.computed.notEmpty("model.data"), + + @computed("dataSourceName", "model.type") + dasherizedDataSourceName(dataSourceName, type) { + return (dataSourceName || type || "undefined").replace(/_/g, "-"); + }, + + @computed("dataSourceName", "model.type") + dataSource(dataSourceName, type) { + dataSourceName = dataSourceName || type; + return `/admin/reports/${dataSourceName}`; + }, + + @computed("displayedModes.length") + showModes(displayedModesLength) { + return displayedModesLength > 1; + }, + + categoryId: Ember.computed.alias("category.id"), + + @computed("currentMode", "model.modes", "forcedModes") + displayedModes(currentMode, reportModes, forcedModes) { + const modes = forcedModes ? forcedModes.split(",") : reportModes; + + return Ember.makeArray(modes).map(mode => { + const base = `mode-btn ${mode}`; + const cssClass = currentMode === mode ? `${base} is-current` : base; + + return { + mode, + cssClass, + icon: mode === "table" ? "table" : "signal" + }; + }); + }, + + @computed() + groupOptions() { + const arr = [ + { name: I18n.t("admin.dashboard.reports.groups"), value: "all" } + ]; + return arr.concat( + (this.site.groups || []).map(i => { + return { name: i["name"], value: i["id"] }; + }) + ); + }, + + @computed("currentMode") + modeComponent(currentMode) { + return `admin-report-${currentMode}`; + }, + + @computed("startDate") + normalizedStartDate(startDate) { + return startDate && typeof startDate.isValid === "function" + ? moment + .utc(startDate.toISOString()) + .locale("en") + .format("YYYYMMDD") + : moment(startDate) + .locale("en") + .format("YYYYMMDD"); + }, + + @computed("endDate") + normalizedEndDate(endDate) { + return endDate && typeof endDate.isValid === "function" + ? moment + .utc(endDate.toISOString()) + .locale("en") + .format("YYYYMMDD") + : moment(endDate) + .locale("en") + .format("YYYYMMDD"); + }, + + @computed( + "dataSourceName", + "categoryId", + "groupId", + "normalizedStartDate", + "normalizedEndDate" + ) + reportKey(dataSourceName, categoryId, groupId, startDate, endDate) { + if (!dataSourceName || !startDate || !endDate) return null; + + let reportKey = "reports:"; + reportKey += [ + dataSourceName, + categoryId, + startDate.replace(/-/g, ""), + endDate.replace(/-/g, ""), + groupId, + "[:prev_period]", + this.get("reportOptions.table.limit"), + SCHEMA_VERSION + ] + .filter(x => x) + .map(x => x.toString()) + .join(":"); + + return reportKey; + }, + + actions: { + refreshReport() { + this.attrs.onRefresh({ + categoryId: this.get("categoryId"), + groupId: this.get("groupId"), + startDate: this.get("startDate"), + endDate: this.get("endDate") + }); + }, + + exportCsv() { + exportEntity("report", { + name: this.get("model.type"), + start_date: this.get("startDate"), + end_date: this.get("endDate"), + category_id: + this.get("categoryId") === "all" ? undefined : this.get("categoryId"), + group_id: + this.get("groupId") === "all" ? undefined : this.get("groupId") + }).then(outputExportResult); + }, + + changeMode(mode) { + this.set("currentMode", mode); + } + }, + + _computeReport() { + if (!this.element || this.isDestroying || this.isDestroyed) { + return; + } + + if (!this._reports || !this._reports.length) { + return; + } + + // on a slow network _fetchReport could be called multiple times between + // T and T+x, and all the ajax responses would occur after T+(x+y) + // to avoid any inconsistencies we filter by period and make sure + // the array contains only unique values + let filteredReports = this._reports.uniqBy("report_key"); + let report; + + const sort = r => { + if (r.length > 1) { + return r.findBy("type", this.get("dataSourceName")); + } else { + return r; + } + }; + + if (!this.get("startDate") || !this.get("endDate")) { + report = sort(filteredReports)[0]; + } else { + let reportKey = this.get("reportKey"); + + report = sort( + filteredReports.filter(r => r.report_key.includes(reportKey)) + )[0]; + + if (!report) return; + } + + this._renderReport( + report, + this.get("forcedModes"), + this.get("currentMode") + ); + }, + + _renderReport(report, forcedModes, currentMode) { + const modes = forcedModes ? forcedModes.split(",") : report.modes; + currentMode = currentMode || (modes ? modes[0] : null); + + this.setProperties({ + model: report, + currentMode, + options: this._buildOptions(currentMode) + }); + }, + + _fetchReport() { + this._super(); + + this.setProperties({ isLoading: true, rateLimitationString: null }); + + Ember.run.next(() => { + let payload = this._buildPayload(["prev_period"]); + + const callback = response => { + if (!this.element || this.isDestroying || this.isDestroyed) { + return; + } + + this.set("isLoading", false); + + if (response === 429) { + this.set( + "rateLimitationString", + I18n.t("admin.dashboard.too_many_requests") + ); + } else if (response === 500) { + this.set("model.error", "exception"); + } else if (response) { + this._reports.push(this._loadReport(response)); + this._computeReport(); + } + }; + + ReportLoader.enqueue(this.get("dataSourceName"), payload.data, callback); + }); + }, + + _buildPayload(facets) { + let payload = { data: { cache: true, facets } }; + + if (this.get("startDate")) { + payload.data.start_date = moment + .utc(this.get("startDate"), "YYYY-MM-DD") + .toISOString(); + } + + if (this.get("endDate")) { + payload.data.end_date = moment + .utc(this.get("endDate"), "YYYY-MM-DD") + .toISOString(); + } + + if (this.get("groupId") && this.get("groupId") !== "all") { + payload.data.group_id = this.get("groupId"); + } + + if (this.get("categoryId") && this.get("categoryId") !== "all") { + payload.data.category_id = this.get("categoryId"); + } + + if (this.get("reportOptions.table.limit")) { + payload.data.limit = this.get("reportOptions.table.limit"); + } + + return payload; + }, + + _buildOptions(mode) { + if (mode === "table") { + const tableOptions = JSON.parse(JSON.stringify(TABLE_OPTIONS)); + return Ember.Object.create( + Object.assign(tableOptions, this.get("reportOptions.table") || {}) + ); + } else { + const chartOptions = JSON.parse(JSON.stringify(CHART_OPTIONS)); + return Ember.Object.create( + Object.assign(chartOptions, this.get("reportOptions.chart") || {}) + ); + } + }, + + _loadReport(jsonReport) { + Report.fillMissingDates(jsonReport, { filledField: "chartData" }); + + if (jsonReport.chartData && jsonReport.chartData.length > 40) { + jsonReport.chartData = collapseWeekly( + jsonReport.chartData, + jsonReport.average + ); + } + + if (jsonReport.prev_data) { + Report.fillMissingDates(jsonReport, { + filledField: "prevChartData", + dataField: "prev_data", + starDate: jsonReport.prev_start_date, + endDate: jsonReport.prev_end_date + }); + + if (jsonReport.prevChartData && jsonReport.prevChartData.length > 40) { + jsonReport.prevChartData = collapseWeekly( + jsonReport.prevChartData, + jsonReport.average + ); + } + } + + return Report.create(jsonReport); + } +}); diff --git a/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 b/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 index 907f803aed..64e95cecf9 100644 --- a/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 +++ b/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 @@ -1,97 +1,111 @@ -import UserField from 'admin/models/user-field'; -import { bufferedProperty } from 'discourse/mixins/buffered-content'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import { propertyEqual } from 'discourse/lib/computed'; +import UserField from "admin/models/user-field"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { propertyEqual } from "discourse/lib/computed"; -export default Ember.Component.extend(bufferedProperty('userField'), { - editing: Ember.computed.empty('userField.id'), - classNameBindings: [':user-field'], +export default Ember.Component.extend(bufferedProperty("userField"), { + editing: Ember.computed.empty("userField.id"), + classNameBindings: [":user-field"], - cantMoveUp: propertyEqual('userField', 'firstField'), - cantMoveDown: propertyEqual('userField', 'lastField'), + cantMoveUp: propertyEqual("userField", "firstField"), + cantMoveDown: propertyEqual("userField", "lastField"), userFieldsDescription: function() { - return I18n.t('admin.user_fields.description'); + return I18n.t("admin.user_fields.description"); }.property(), bufferedFieldType: function() { - return UserField.fieldTypeById(this.get('buffered.field_type')); - }.property('buffered.field_type'), + return UserField.fieldTypeById(this.get("buffered.field_type")); + }.property("buffered.field_type"), _focusOnEdit: function() { - if (this.get('editing')) { - Ember.run.scheduleOnce('afterRender', this, '_focusName'); + if (this.get("editing")) { + Ember.run.scheduleOnce("afterRender", this, "_focusName"); } - }.observes('editing').on('didInsertElement'), + } + .observes("editing") + .on("didInsertElement"), _focusName: function() { - $('.user-field-name').select(); + $(".user-field-name").select(); }, fieldName: function() { - return UserField.fieldTypeById(this.get('userField.field_type')).get('name'); - }.property('userField.field_type'), + return UserField.fieldTypeById(this.get("userField.field_type")).get( + "name" + ); + }.property("userField.field_type"), flags: function() { const ret = []; - if (this.get('userField.editable')) { - ret.push(I18n.t('admin.user_fields.editable.enabled')); + if (this.get("userField.editable")) { + ret.push(I18n.t("admin.user_fields.editable.enabled")); } - if (this.get('userField.required')) { - ret.push(I18n.t('admin.user_fields.required.enabled')); + if (this.get("userField.required")) { + ret.push(I18n.t("admin.user_fields.required.enabled")); } - if (this.get('userField.show_on_profile')) { - ret.push(I18n.t('admin.user_fields.show_on_profile.enabled')); + if (this.get("userField.show_on_profile")) { + ret.push(I18n.t("admin.user_fields.show_on_profile.enabled")); } - if (this.get('userField.show_on_user_card')) { - ret.push(I18n.t('admin.user_fields.show_on_user_card.enabled')); + if (this.get("userField.show_on_user_card")) { + ret.push(I18n.t("admin.user_fields.show_on_user_card.enabled")); } - return ret.join(', '); - }.property('userField.editable', 'userField.required', 'userField.show_on_profile', 'userField.show_on_user_card'), + return ret.join(", "); + }.property( + "userField.editable", + "userField.required", + "userField.show_on_profile", + "userField.show_on_user_card" + ), actions: { save() { const self = this; - const buffered = this.get('buffered'); - const attrs = buffered.getProperties('name', - 'description', - 'field_type', - 'editable', - 'required', - 'show_on_profile', - 'show_on_user_card', - 'options'); + const buffered = this.get("buffered"); + const attrs = buffered.getProperties( + "name", + "description", + "field_type", + "editable", + "required", + "show_on_profile", + "show_on_user_card", + "options" + ); - this.get('userField').save(attrs).then(function() { - self.set('editing', false); - self.commitBuffer(); - }).catch(popupAjaxError); + this.get("userField") + .save(attrs) + .then(function() { + self.set("editing", false); + self.commitBuffer(); + }) + .catch(popupAjaxError); }, moveUp() { - this.sendAction('moveUpAction', this.get('userField')); + this.sendAction("moveUpAction", this.get("userField")); }, moveDown() { - this.sendAction('moveDownAction', this.get('userField')); + this.sendAction("moveDownAction", this.get("userField")); }, edit() { - this.set('editing', true); + this.set("editing", true); }, destroy() { - this.sendAction('destroyAction', this.get('userField')); + this.sendAction("destroyAction", this.get("userField")); }, cancel() { - const id = this.get('userField.id'); + const id = this.get("userField.id"); if (Ember.isEmpty(id)) { - this.sendAction('destroyAction', this.get('userField')); + this.sendAction("destroyAction", this.get("userField")); } else { this.rollbackBuffer(); - this.set('editing', false); + this.set("editing", false); } } } diff --git a/app/assets/javascripts/admin/components/admin-watched-word.js.es6 b/app/assets/javascripts/admin/components/admin-watched-word.js.es6 index 3c78becb49..d1283e8b3a 100644 --- a/app/assets/javascripts/admin/components/admin-watched-word.js.es6 +++ b/app/assets/javascripts/admin/components/admin-watched-word.js.es6 @@ -1,19 +1,28 @@ -import { iconHTML } from 'discourse-common/lib/icon-library'; -import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { bufferedRender } from "discourse-common/lib/buffered-render"; -export default Ember.Component.extend(bufferedRender({ - classNames: ['watched-word'], +export default Ember.Component.extend( + bufferedRender({ + classNames: ["watched-word"], - buildBuffer(buffer) { - buffer.push(iconHTML('times')); - buffer.push(' ' + this.get('word.word')); - }, + buildBuffer(buffer) { + buffer.push(iconHTML("times")); + buffer.push(" " + this.get("word.word")); + }, - click() { - this.get('word').destroy().then(() => { - this.sendAction('action', this.get('word')); - }).catch(e => { - bootbox.alert(I18n.t("generic_error_with_reason", {error: `http: ${e.status} - ${e.body}`})); - });; - } -})); + click() { + this.get("word") + .destroy() + .then(() => { + this.sendAction("action", this.get("word")); + }) + .catch(e => { + bootbox.alert( + I18n.t("generic_error_with_reason", { + error: `http: ${e.status} - ${e.body}` + }) + ); + }); + } + }) +); diff --git a/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 index 976b483995..6e91ce55c7 100644 --- a/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 +++ b/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 @@ -1,38 +1,40 @@ -import computed from 'ember-addons/ember-computed-decorators'; +import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - classNames: ['hook-event'], - typeName: Ember.computed.alias('type.name'), + classNames: ["hook-event"], + typeName: Ember.computed.alias("type.name"), - @computed('typeName') + @computed("typeName") name(typeName) { return I18n.t(`admin.web_hooks.${typeName}_event.name`); }, - @computed('typeName') + @computed("typeName") details(typeName) { return I18n.t(`admin.web_hooks.${typeName}_event.details`); }, - @computed('model.[]', 'typeName') + @computed("model.[]", "typeName") eventTypeExists(eventTypes, typeName) { return eventTypes.any(event => event.name === typeName); }, - @computed('eventTypeExists') + @computed("eventTypeExists") enabled: { get(eventTypeExists) { return eventTypeExists; }, set(value, eventTypeExists) { - const type = this.get('type'); - const model = this.get('model'); + const type = this.get("type"); + const model = this.get("model"); // add an association when not exists if (value !== eventTypeExists) { if (value) { model.addObject(type); } else { - model.removeObjects(model.filter(eventType => eventType.name === type.name)); + model.removeObjects( + model.filter(eventType => eventType.name === type.name) + ); } } diff --git a/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 index 264e827da6..5191412c29 100644 --- a/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 +++ b/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 @@ -1,78 +1,92 @@ -import computed from 'ember-addons/ember-computed-decorators'; -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import { ensureJSON, plainJSON, prettyJSON } from 'discourse/lib/formatter'; +import computed from "ember-addons/ember-computed-decorators"; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { ensureJSON, plainJSON, prettyJSON } from "discourse/lib/formatter"; export default Ember.Component.extend({ - tagName: 'li', + tagName: "li", expandDetails: null, - @computed('model.status') + @computed("model.status") statusColorClasses(status) { - if (!status) return ''; + if (!status) return ""; if (status >= 200 && status <= 299) { - return 'text-successful'; + return "text-successful"; } else { - return 'text-danger'; + return "text-danger"; } }, - @computed('model.created_at') + @computed("model.created_at") createdAt(createdAt) { - return moment(createdAt).format('YYYY-MM-DD HH:mm:ss'); + return moment(createdAt).format("YYYY-MM-DD HH:mm:ss"); }, - @computed('model.duration') + @computed("model.duration") completion(duration) { const seconds = Math.floor(duration / 10.0) / 100.0; - return I18n.t('admin.web_hooks.events.completed_in', { count: seconds }); + return I18n.t("admin.web_hooks.events.completed_in", { count: seconds }); }, actions: { redeliver() { - return bootbox.confirm(I18n.t('admin.web_hooks.events.redeliver_confirm'), I18n.t('no_value'), I18n.t('yes_value'), result => { - if (result) { - ajax(`/admin/api/web_hooks/${this.get('model.web_hook_id')}/events/${this.get('model.id')}/redeliver`, { type: 'POST' }).then(json => { - this.set('model', json.web_hook_event); - }).catch(popupAjaxError); + return bootbox.confirm( + I18n.t("admin.web_hooks.events.redeliver_confirm"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + ajax( + `/admin/api/web_hooks/${this.get( + "model.web_hook_id" + )}/events/${this.get("model.id")}/redeliver`, + { type: "POST" } + ) + .then(json => { + this.set("model", json.web_hook_event); + }) + .catch(popupAjaxError); + } } - }); + ); }, toggleRequest() { - const expandDetailsKey = 'request'; + const expandDetailsKey = "request"; - if (this.get('expandDetails') !== expandDetailsKey) { - let headers = _.extend({ - 'Request URL': this.get('model.request_url'), - 'Request method': 'POST' - }, ensureJSON(this.get('model.headers'))); + if (this.get("expandDetails") !== expandDetailsKey) { + let headers = _.extend( + { + "Request URL": this.get("model.request_url"), + "Request method": "POST" + }, + ensureJSON(this.get("model.headers")) + ); this.setProperties({ headers: plainJSON(headers), - body: prettyJSON(this.get('model.payload')), + body: prettyJSON(this.get("model.payload")), expandDetails: expandDetailsKey, - bodyLabel: I18n.t('admin.web_hooks.events.payload') + bodyLabel: I18n.t("admin.web_hooks.events.payload") }); } else { - this.set('expandDetails', null); + this.set("expandDetails", null); } }, toggleResponse() { - const expandDetailsKey = 'response'; + const expandDetailsKey = "response"; - if (this.get('expandDetails') !== expandDetailsKey) { + if (this.get("expandDetails") !== expandDetailsKey) { this.setProperties({ - headers: plainJSON(this.get('model.response_headers')), - body: this.get('model.response_body'), + headers: plainJSON(this.get("model.response_headers")), + body: this.get("model.response_body"), expandDetails: expandDetailsKey, - bodyLabel: I18n.t('admin.web_hooks.events.body') + bodyLabel: I18n.t("admin.web_hooks.events.body") }); } else { - this.set('expandDetails', null); + this.set("expandDetails", null); } } } - }); diff --git a/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 index c5f1a4a244..9e508e904c 100644 --- a/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 +++ b/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 @@ -1,28 +1,32 @@ -import computed from 'ember-addons/ember-computed-decorators'; -import { iconHTML } from 'discourse-common/lib/icon-library'; -import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import computed from "ember-addons/ember-computed-decorators"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { bufferedRender } from "discourse-common/lib/buffered-render"; -export default Ember.Component.extend(bufferedRender({ - classes: ["text-muted", "text-danger", "text-successful"], - icons: ["circle-o", "times-circle", "circle"], +export default Ember.Component.extend( + bufferedRender({ + classes: ["text-muted", "text-danger", "text-successful"], + icons: ["circle-o", "times-circle", "circle"], - @computed('deliveryStatuses', 'model.last_delivery_status') - status(deliveryStatuses, lastDeliveryStatus) { - return deliveryStatuses.find(s => s.id === lastDeliveryStatus); - }, + @computed("deliveryStatuses", "model.last_delivery_status") + status(deliveryStatuses, lastDeliveryStatus) { + return deliveryStatuses.find(s => s.id === lastDeliveryStatus); + }, - @computed('status.id', 'icons') - icon(statusId, icons) { - return icons[statusId - 1]; - }, + @computed("status.id", "icons") + icon(statusId, icons) { + return icons[statusId - 1]; + }, - @computed('status.id', 'classes') - class(statusId, classes) { - return classes[statusId - 1]; - }, + @computed("status.id", "classes") + class(statusId, classes) { + return classes[statusId - 1]; + }, - buildBuffer(buffer) { - buffer.push(iconHTML(this.get('icon'), { class: this.get('class') })); - buffer.push(I18n.t(`admin.web_hooks.delivery_status.${this.get('status.name')}`)); - } -})); + buildBuffer(buffer) { + buffer.push(iconHTML(this.get("icon"), { class: this.get("class") })); + buffer.push( + I18n.t(`admin.web_hooks.delivery_status.${this.get("status.name")}`) + ); + } + }) +); diff --git a/app/assets/javascripts/admin/components/admin-wrapper.js.es6 b/app/assets/javascripts/admin/components/admin-wrapper.js.es6 index 118728f66c..034e2a0af4 100644 --- a/app/assets/javascripts/admin/components/admin-wrapper.js.es6 +++ b/app/assets/javascripts/admin/components/admin-wrapper.js.es6 @@ -1,11 +1,11 @@ export default Ember.Component.extend({ didInsertElement() { this._super(); - $('body').addClass('admin-interface'); + $("body").addClass("admin-interface"); }, willDestroyElement() { this._super(); - $('body').removeClass('admin-interface'); + $("body").removeClass("admin-interface"); } }); diff --git a/app/assets/javascripts/admin/components/cancel-link.js.es6 b/app/assets/javascripts/admin/components/cancel-link.js.es6 index 9250c1ae73..91ad923ffc 100644 --- a/app/assets/javascripts/admin/components/cancel-link.js.es6 +++ b/app/assets/javascripts/admin/components/cancel-link.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: '' + tagName: "" }); diff --git a/app/assets/javascripts/admin/components/color-input.js.es6 b/app/assets/javascripts/admin/components/color-input.js.es6 index 005c4f5d4b..17ae5a9296 100644 --- a/app/assets/javascripts/admin/components/color-input.js.es6 +++ b/app/assets/javascripts/admin/components/color-input.js.es6 @@ -1,4 +1,4 @@ -import {default as loadScript, loadCSS } from 'discourse/lib/load-script'; +import { default as loadScript, loadCSS } from "discourse/lib/load-script"; /** An input field for a color. @@ -8,35 +8,43 @@ import {default as loadScript, loadCSS } from 'discourse/lib/load-script'; @params valid is a boolean indicating if the input field is a valid color. **/ export default Ember.Component.extend({ - classNames: ['color-picker'], + classNames: ["color-picker"], hexValueChanged: function() { - var hex = this.get('hexValue'); - let $text = this.$('input.hex-input'); + var hex = this.get("hexValue"); + let $text = this.$("input.hex-input"); - if (this.get('valid')) { - $text.attr('style', 'color: ' + (this.get('brightnessValue') > 125 ? 'black' : 'white') + '; background-color: #' + hex + ';'); + if (this.get("valid")) { + $text.attr( + "style", + "color: " + + (this.get("brightnessValue") > 125 ? "black" : "white") + + "; background-color: #" + + hex + + ";" + ); - if (this.get('pickerLoaded')) { - this.$('.picker').spectrum({color: "#" + this.get('hexValue')}); + if (this.get("pickerLoaded")) { + this.$(".picker").spectrum({ color: "#" + this.get("hexValue") }); } } else { - $text.attr('style', ''); + $text.attr("style", ""); } - }.observes('hexValue', 'brightnessValue', 'valid'), + }.observes("hexValue", "brightnessValue", "valid"), didInsertElement() { - loadScript('/javascripts/spectrum.js').then(()=>{ - loadCSS('/javascripts/spectrum.css').then(()=>{ - Em.run.schedule('afterRender', ()=>{ - this.$('.picker').spectrum({color: "#" + this.get('hexValue')}) - .on("change.spectrum", (me, color)=>{ - this.set('hexValue', color.toHexString().replace("#","")); - }); - this.set('pickerLoaded', true); + loadScript("/javascripts/spectrum.js").then(() => { + loadCSS("/javascripts/spectrum.css").then(() => { + Em.run.schedule("afterRender", () => { + this.$(".picker") + .spectrum({ color: "#" + this.get("hexValue") }) + .on("change.spectrum", (me, color) => { + this.set("hexValue", color.toHexString().replace("#", "")); + }); + this.set("pickerLoaded", true); }); }); }); - Em.run.schedule('afterRender', ()=>{ + Em.run.schedule("afterRender", () => { this.hexValueChanged(); }); } diff --git a/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 b/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 deleted file mode 100644 index 8fae065f7b..0000000000 --- a/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 +++ /dev/null @@ -1,19 +0,0 @@ -import { ajax } from "discourse/lib/ajax"; -import AsyncReport from "admin/mixins/async-report"; - -export default Ember.Component.extend(AsyncReport, { - classNames: ["dashboard-inline-table"], - - fetchReport() { - this._super(); - - let payload = this.buildPayload(["total", "prev30Days"]); - - return Ember.RSVP.Promise.all(this.get("dataSources").map(dataSource => { - return ajax(dataSource, payload) - .then(response => { - this.get("reports").pushObject(this.loadReport(response.report)); - }); - })); - } -}); diff --git a/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 b/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 deleted file mode 100644 index 36a95dc15c..0000000000 --- a/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 +++ /dev/null @@ -1,165 +0,0 @@ -import { ajax } from "discourse/lib/ajax"; -import AsyncReport from "admin/mixins/async-report"; -import Report from "admin/models/report"; -import { number } from 'discourse/lib/formatter'; -import loadScript from "discourse/lib/load-script"; -import { registerTooltip, unregisterTooltip } from "discourse/lib/tooltip"; - -function collapseWeekly(data, average) { - let aggregate = []; - let bucket, i; - let offset = data.length % 7; - for(i = offset; i < data.length; i++) { - - if (bucket && (i % 7 === offset)) { - if (average) { - bucket.y = parseFloat((bucket.y / 7.0).toFixed(2)); - } - aggregate.push(bucket); - bucket = null; - } - - bucket = bucket || { x: data[i].x, y: 0 }; - bucket.y += data[i].y; - } - return aggregate; -} - -export default Ember.Component.extend(AsyncReport, { - classNames: ["chart", "dashboard-mini-chart"], - total: 0, - - init() { - this._super(); - - this._colorsPool = ["rgb(0,136,204)", "rgb(235,83,148)"]; - }, - - didRender() { - this._super(); - registerTooltip($(this.element).find("[data-tooltip]")); - }, - - willDestroyElement() { - this._super(); - unregisterTooltip($(this.element).find("[data-tooltip]")); - }, - - pickColorAtIndex(index) { - return this._colorsPool[index] || this._colorsPool[0]; - }, - - fetchReport() { - this._super(); - - let payload = this.buildPayload(["prev_period"]); - - if (this._chart) { - this._chart.destroy(); - this._chart = null; - } - - return Ember.RSVP.Promise.all(this.get("dataSources").map(dataSource => { - return ajax(dataSource, payload) - .then(response => { - this.get("reports").pushObject(this.loadReport(response.report)); - }); - })); - }, - - loadReport(report, previousReport) { - Report.fillMissingDates(report); - - if (report.data && report.data.length > 40) { - report.data = collapseWeekly(report.data, report.average); - } - - if (previousReport && previousReport.color.length) { - report.color = previousReport.color; - } else { - const dataSourceNameIndex = this.get("dataSourceNames").split(",").indexOf(report.type); - report.color = this.pickColorAtIndex(dataSourceNameIndex); - } - - return Report.create(report); - }, - - renderReport() { - this._super(); - - Ember.run.schedule("afterRender", () => { - const $chartCanvas = this.$(".chart-canvas"); - if (!$chartCanvas.length) return; - const context = $chartCanvas[0].getContext("2d"); - - const reportsForPeriod = this.get("reportsForPeriod"); - - const labels = Ember.makeArray(reportsForPeriod.get("firstObject.data")).map(d => d.x); - - const data = { - labels, - datasets: reportsForPeriod.map(report => { - return { - data: Ember.makeArray(report.data).map(d => Math.round(parseFloat(d.y))), - backgroundColor: "rgba(200,220,240,0.3)", - borderColor: report.color - }; - }) - }; - - if (this._chart) { - this._chart.destroy(); - this._chart = null; - } - - loadScript("/javascripts/Chart.min.js").then(() => { - if (this._chart) { - this._chart.destroy(); - } - - this._chart = new window.Chart(context, this._buildChartConfig(data)); - }); - }); - }, - - _buildChartConfig(data) { - return { - type: "line", - data, - options: { - tooltips: { - callbacks: { - title: (context) => moment(context[0].xLabel, "YYYY-MM-DD").format("LL") - } - }, - legend: { - display: false - }, - responsive: true, - maintainAspectRatio: false, - layout: { - padding: { - left: 0, - top: 0, - right: 0, - bottom: 0 - } - }, - scales: { - yAxes: [{ - display: true, - ticks: { callback: (label) => number(label) } - }], - xAxes: [{ - display: true, - gridLines: { display: false }, - type: "time", - time: { - parser: "YYYY-MM-DD" - } - }], - } - }, - }; - } -}); diff --git a/app/assets/javascripts/admin/components/dashboard-table.js.es6 b/app/assets/javascripts/admin/components/dashboard-table.js.es6 deleted file mode 100644 index 96b74e6e15..0000000000 --- a/app/assets/javascripts/admin/components/dashboard-table.js.es6 +++ /dev/null @@ -1,19 +0,0 @@ -import { ajax } from "discourse/lib/ajax"; -import AsyncReport from "admin/mixins/async-report"; - -export default Ember.Component.extend(AsyncReport, { - classNames: ["dashboard-table"], - - fetchReport() { - this._super(); - - let payload = this.buildPayload(["total", "prev30Days"]); - - return Ember.RSVP.Promise.all(this.get("dataSources").map(dataSource => { - return ajax(dataSource, payload) - .then(response => { - this.get("reports").pushObject(this.loadReport(response.report)); - }); - })); - } -}); diff --git a/app/assets/javascripts/admin/components/embeddable-host.js.es6 b/app/assets/javascripts/admin/components/embeddable-host.js.es6 index 70c1ed272c..7264d42c1c 100644 --- a/app/assets/javascripts/admin/components/embeddable-host.js.es6 +++ b/app/assets/javascripts/admin/components/embeddable-host.js.es6 @@ -1,63 +1,79 @@ -import { bufferedProperty } from 'discourse/mixins/buffered-content'; -import computed from 'ember-addons/ember-computed-decorators'; -import { on, observes } from 'ember-addons/ember-computed-decorators'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import computed from "ember-addons/ember-computed-decorators"; +import { on, observes } from "ember-addons/ember-computed-decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; -export default Ember.Component.extend(bufferedProperty('host'), { +export default Ember.Component.extend(bufferedProperty("host"), { editToggled: false, - tagName: 'tr', + tagName: "tr", categoryId: null, - editing: Ember.computed.or('host.isNew', 'editToggled'), + editing: Ember.computed.or("host.isNew", "editToggled"), - @on('didInsertElement') - @observes('editing') + @on("didInsertElement") + @observes("editing") _focusOnInput() { - Ember.run.schedule('afterRender', () => { this.$('.host-name').focus(); }); + Ember.run.schedule("afterRender", () => { + this.$(".host-name").focus(); + }); }, - @computed('buffered.host', 'host.isSaving') + @computed("buffered.host", "host.isSaving") cantSave(host, isSaving) { return isSaving || Ember.isEmpty(host); }, actions: { edit() { - this.set('categoryId', this.get('host.category.id')); - this.set('editToggled', true); + this.set("categoryId", this.get("host.category.id")); + this.set("editToggled", true); }, save() { - if (this.get('cantSave')) { return; } + if (this.get("cantSave")) { + return; + } - const props = this.get('buffered').getProperties('host', 'path_whitelist', 'class_name'); - props.category_id = this.get('categoryId'); + const props = this.get("buffered").getProperties( + "host", + "path_whitelist", + "class_name" + ); + props.category_id = this.get("categoryId"); - const host = this.get('host'); + const host = this.get("host"); - host.save(props).then(() => { - host.set('category', Discourse.Category.findById(this.get('categoryId'))); - this.set('editToggled', false); - }).catch(popupAjaxError); + host + .save(props) + .then(() => { + host.set( + "category", + Discourse.Category.findById(this.get("categoryId")) + ); + this.set("editToggled", false); + }) + .catch(popupAjaxError); }, delete() { - bootbox.confirm(I18n.t('admin.embedding.confirm_delete'), (result) => { + bootbox.confirm(I18n.t("admin.embedding.confirm_delete"), result => { if (result) { - this.get('host').destroyRecord().then(() => { - this.sendAction('deleteHost', this.get('host')); - }); + this.get("host") + .destroyRecord() + .then(() => { + this.sendAction("deleteHost", this.get("host")); + }); } }); }, cancel() { - const host = this.get('host'); - if (host.get('isNew')) { - this.sendAction('deleteHost', host); + const host = this.get("host"); + if (host.get("isNew")) { + this.sendAction("deleteHost", host); } else { this.rollbackBuffer(); - this.set('editToggled', false); + this.set("editToggled", false); } } } diff --git a/app/assets/javascripts/admin/components/embedding-setting.js.es6 b/app/assets/javascripts/admin/components/embedding-setting.js.es6 index f1d31fcf68..4791e84e35 100644 --- a/app/assets/javascripts/admin/components/embedding-setting.js.es6 +++ b/app/assets/javascripts/admin/components/embedding-setting.js.es6 @@ -1,22 +1,30 @@ -import computed from 'ember-addons/ember-computed-decorators'; +import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - classNames: ['embed-setting'], + classNames: ["embed-setting"], - @computed('field') - inputId(field) { return field.dasherize(); }, + @computed("field") + inputId(field) { + return field.dasherize(); + }, - @computed('field') - translationKey(field) { return `admin.embedding.${field}`; }, + @computed("field") + translationKey(field) { + return `admin.embedding.${field}`; + }, - @computed('type') - isCheckbox(type) { return type === "checkbox"; }, + @computed("type") + isCheckbox(type) { + return type === "checkbox"; + }, - @computed('value') + @computed("value") checked: { - get(value) { return !!value; }, + get(value) { + return !!value; + }, set(value) { - this.set('value', value); + this.set("value", value); return value; } } diff --git a/app/assets/javascripts/admin/components/flag-user-lists.js.es6 b/app/assets/javascripts/admin/components/flag-user-lists.js.es6 index cd843ff7ab..ae6094c6a7 100644 --- a/app/assets/javascripts/admin/components/flag-user-lists.js.es6 +++ b/app/assets/javascripts/admin/components/flag-user-lists.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - classNames: ['flag-user-lists'] + classNames: ["flag-user-lists"] }); diff --git a/app/assets/javascripts/admin/components/flagged-post-response.js.es6 b/app/assets/javascripts/admin/components/flagged-post-response.js.es6 index e031f33e03..e8dc2a230c 100644 --- a/app/assets/javascripts/admin/components/flagged-post-response.js.es6 +++ b/app/assets/javascripts/admin/components/flagged-post-response.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - classNames: ['flagged-post-response'] + classNames: ["flagged-post-response"] }); diff --git a/app/assets/javascripts/admin/components/flagged-post-title.js.es6 b/app/assets/javascripts/admin/components/flagged-post-title.js.es6 index 7c1c013375..4a6fa5d604 100644 --- a/app/assets/javascripts/admin/components/flagged-post-title.js.es6 +++ b/app/assets/javascripts/admin/components/flagged-post-title.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: 'h3' + tagName: "h3" }); diff --git a/app/assets/javascripts/admin/components/flagged-post.js.es6 b/app/assets/javascripts/admin/components/flagged-post.js.es6 index 8aff3d2a2d..03edebab6c 100644 --- a/app/assets/javascripts/admin/components/flagged-post.js.es6 +++ b/app/assets/javascripts/admin/components/flagged-post.js.es6 @@ -1,21 +1,21 @@ -import showModal from 'discourse/lib/show-modal'; -import computed from 'ember-addons/ember-computed-decorators'; +import showModal from "discourse/lib/show-modal"; +import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ adminTools: Ember.inject.service(), expanded: false, - tagName: 'div', + tagName: "div", classNameBindings: [ - ':flagged-post', - 'flaggedPost.hidden:hidden-post', - 'flaggedPost.deleted' + ":flagged-post", + "flaggedPost.hidden:hidden-post", + "flaggedPost.deleted" ], - canAct: Ember.computed.alias('actableFilter'), + canAct: Ember.computed.alias("actableFilter"), - @computed('filter') + @computed("filter") actableFilter(filter) { - return filter === 'active'; + return filter === "active"; }, removeAfter(promise) { @@ -24,7 +24,7 @@ export default Ember.Component.extend({ _spawnModal(name, model, modalClass) { let controller = showModal(name, { model, admin: true, modalClass }); - controller.removeAfter = (p) => this.removeAfter(p); + controller.removeAfter = p => this.removeAfter(p); }, actions: { @@ -33,23 +33,25 @@ export default Ember.Component.extend({ }, disagree() { - this.removeAfter(this.get('flaggedPost').disagreeFlags()); + this.removeAfter(this.get("flaggedPost").disagreeFlags()); }, defer() { - this.removeAfter(this.get('flaggedPost').deferFlags()); + this.removeAfter(this.get("flaggedPost").deferFlags()); }, expand() { - this.get('flaggedPost').expandHidden().then(() => { - this.set('expanded', true); - }); + this.get("flaggedPost") + .expandHidden() + .then(() => { + this.set("expanded", true); + }); }, showModerationHistory() { - this.get('adminTools').showModerationHistory({ - filter: 'post', - post_id: this.get('flaggedPost.id') + this.get("adminTools").showModerationHistory({ + filter: "post", + post_id: this.get("flaggedPost.id") }); } } diff --git a/app/assets/javascripts/admin/components/highlighted-code.js.es6 b/app/assets/javascripts/admin/components/highlighted-code.js.es6 index 4fc413fd89..62cf58f21b 100644 --- a/app/assets/javascripts/admin/components/highlighted-code.js.es6 +++ b/app/assets/javascripts/admin/components/highlighted-code.js.es6 @@ -1,12 +1,10 @@ -import { on, observes } from 'ember-addons/ember-computed-decorators'; -import highlightSyntax from 'discourse/lib/highlight-syntax'; +import { on, observes } from "ember-addons/ember-computed-decorators"; +import highlightSyntax from "discourse/lib/highlight-syntax"; export default Ember.Component.extend({ - - @on('didInsertElement') - @observes('code') + @on("didInsertElement") + @observes("code") _refresh: function() { highlightSyntax(this.$()); } - }); diff --git a/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 b/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 index 5c168760c7..f14ba62201 100644 --- a/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 +++ b/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 @@ -1,12 +1,15 @@ -import {default as computed, observes} from "ember-addons/ember-computed-decorators"; +import { + default as computed, + observes +} from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - init(){ + init() { this._super(); this.set("checkedInternal", this.get("checked")); }, - classNames: ['inline-edit'], + classNames: ["inline-edit"], @observes("checked") checkedChanged() { @@ -20,15 +23,15 @@ export default Ember.Component.extend({ @computed("checked", "checkedInternal") changed(checked, checkedInternal) { - return (!!checked) !== (!!checkedInternal); + return !!checked !== !!checkedInternal; }, actions: { - cancelled(){ + cancelled() { this.set("checkedInternal", this.get("checked")); }, - finished(){ + finished() { this.set("checked", this.get("checkedInternal")); this.sendAction(); } diff --git a/app/assets/javascripts/admin/components/ip-lookup.js.es6 b/app/assets/javascripts/admin/components/ip-lookup.js.es6 index a185e4c0b6..4717b36502 100644 --- a/app/assets/javascripts/admin/components/ip-lookup.js.es6 +++ b/app/assets/javascripts/admin/components/ip-lookup.js.es6 @@ -1,15 +1,18 @@ -import { ajax } from 'discourse/lib/ajax'; -import AdminUser from 'admin/models/admin-user'; +import { ajax } from "discourse/lib/ajax"; +import AdminUser from "admin/models/admin-user"; +import copyText from "discourse/lib/copy-text"; export default Ember.Component.extend({ classNames: ["ip-lookup"], - city: function () { + city: function() { return [ this.get("location.city"), this.get("location.region"), this.get("location.country") - ].filter(Boolean).join(", "); + ] + .filter(Boolean) + .join(", "); }.property("location.{city,region,country}"), otherAccountsToDelete: function() { @@ -20,14 +23,14 @@ export default Ember.Component.extend({ }.property("other_accounts", "totalOthersWithSameIP"), actions: { - lookup: function () { + lookup: function() { var self = this; this.set("show", true); if (!this.get("location")) { ajax("/admin/users/ip-info", { data: { ip: this.get("ip") } - }).then(function (location) { + }).then(function(location) { self.set("location", Em.Object.create(location)); }); } @@ -36,50 +39,92 @@ export default Ember.Component.extend({ this.set("otherAccountsLoading", true); var data = { - "ip": this.get("ip"), - "exclude": this.get("userId"), - "order": "trust_level DESC" + ip: this.get("ip"), + exclude: this.get("userId"), + order: "trust_level DESC" }; - ajax("/admin/users/total-others-with-same-ip", { data }).then(function (result) { + ajax("/admin/users/total-others-with-same-ip", { data }).then(function( + result + ) { self.set("totalOthersWithSameIP", result.total); }); - AdminUser.findAll("active", data).then(function (users) { + AdminUser.findAll("active", data).then(function(users) { self.setProperties({ other_accounts: users, - otherAccountsLoading: false, + otherAccountsLoading: false }); }); } }, - hide: function () { + hide: function() { this.set("show", false); }, + copy: function() { + let text = `IP: ${this.get("ip")}\n`; + const location = this.get("location"); + if (location) { + if (location.hostname) { + text += `${I18n.t("ip_lookup.hostname")}: ${location.hostname}\n`; + } + + text += I18n.t("ip_lookup.location"); + if (location.loc) { + text += `: ${location.loc} ${this.get("city")}\n`; + } else { + text += `: ${I18n.t("ip_lookup.location_not_found")}\n`; + } + + if (location.org) { + text += I18n.t("ip_lookup.organisation"); + text += `: ${location.org}\n`; + } + + if (location.phone) { + text += I18n.t("ip_lookup.phone"); + text += `: ${location.phone}\n`; + } + } + const copyRange = $('

'); + copyRange.html(text.trim().replace("\n", "
")); + $(document.body).append(copyRange); + if (copyText(text, copyRange[0])) { + this.set("copied", true); + Ember.run.later(() => this.set("copied", false), 2000); + } + copyRange.remove(); + }, + deleteOtherAccounts: function() { var self = this; - bootbox.confirm(I18n.t("ip_lookup.confirm_delete_other_accounts"), I18n.t("no_value"), I18n.t("yes_value"), function (confirmed) { - if (confirmed) { - self.setProperties({ - other_accounts: null, - otherAccountsLoading: true, - totalOthersWithSameIP: null - }); + bootbox.confirm( + I18n.t("ip_lookup.confirm_delete_other_accounts"), + I18n.t("no_value"), + I18n.t("yes_value"), + function(confirmed) { + if (confirmed) { + self.setProperties({ + other_accounts: null, + otherAccountsLoading: true, + totalOthersWithSameIP: null + }); - ajax("/admin/users/delete-others-with-same-ip.json", { - type: "DELETE", - data: { - "ip": self.get("ip"), - "exclude": self.get("userId"), - "order": "trust_level DESC" - } - }).then(function() { - self.send("lookup"); - }); + ajax("/admin/users/delete-others-with-same-ip.json", { + type: "DELETE", + data: { + ip: self.get("ip"), + exclude: self.get("userId"), + order: "trust_level DESC" + } + }).then(function() { + self.send("lookup"); + }); + } } - }); + ); } } }); diff --git a/app/assets/javascripts/admin/components/moderation-history-item.js.es6 b/app/assets/javascripts/admin/components/moderation-history-item.js.es6 index b8674a8aaf..b7620b66cd 100644 --- a/app/assets/javascripts/admin/components/moderation-history-item.js.es6 +++ b/app/assets/javascripts/admin/components/moderation-history-item.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: 'tr', + tagName: "tr" }); diff --git a/app/assets/javascripts/admin/components/penalty-post-action.js.es6 b/app/assets/javascripts/admin/components/penalty-post-action.js.es6 index d89c69a32d..b4d82aba8b 100644 --- a/app/assets/javascripts/admin/components/penalty-post-action.js.es6 +++ b/app/assets/javascripts/admin/components/penalty-post-action.js.es6 @@ -1,6 +1,6 @@ -import computed from 'ember-addons/ember-computed-decorators'; +import computed from "ember-addons/ember-computed-decorators"; -const ACTIONS = ['delete', 'edit', 'none']; +const ACTIONS = ["delete", "edit", "none"]; export default Ember.Component.extend({ postAction: null, postEdit: null, @@ -12,19 +12,19 @@ export default Ember.Component.extend({ }); }, - editing: Ember.computed.equal('postAction', 'edit'), + editing: Ember.computed.equal("postAction", "edit"), actions: { penaltyChanged() { - let postAction = this.get('postAction'); + let postAction = this.get("postAction"); // If we switch to edit mode, jump to the edit textarea - if (postAction === 'edit') { - Ember.run.scheduleOnce('afterRender', () => { + if (postAction === "edit") { + Ember.run.scheduleOnce("afterRender", () => { let $elem = this.$(); - let body = $elem.closest('.modal-body'); + let body = $elem.closest(".modal-body"); body.scrollTop(body.height()); - $elem.find('.post-editor').focus(); + $elem.find(".post-editor").focus(); }); } } diff --git a/app/assets/javascripts/admin/components/permalink-form.js.es6 b/app/assets/javascripts/admin/components/permalink-form.js.es6 index 90dcf2a7b2..969840a308 100644 --- a/app/assets/javascripts/admin/components/permalink-form.js.es6 +++ b/app/assets/javascripts/admin/components/permalink-form.js.es6 @@ -1,45 +1,58 @@ -import Permalink from 'admin/models/permalink'; +import Permalink from "admin/models/permalink"; export default Ember.Component.extend({ - classNames: ['permalink-form'], + classNames: ["permalink-form"], formSubmitted: false, - permalinkType: 'topic_id', + permalinkType: "topic_id", permalinkTypes: function() { return [ - {id: 'topic_id', name: I18n.t('admin.permalink.topic_id')}, - {id: 'post_id', name: I18n.t('admin.permalink.post_id')}, - {id: 'category_id', name: I18n.t('admin.permalink.category_id')}, - {id: 'external_url', name: I18n.t('admin.permalink.external_url')} + { id: "topic_id", name: I18n.t("admin.permalink.topic_id") }, + { id: "post_id", name: I18n.t("admin.permalink.post_id") }, + { id: "category_id", name: I18n.t("admin.permalink.category_id") }, + { id: "external_url", name: I18n.t("admin.permalink.external_url") } ]; }.property(), permalinkTypePlaceholder: function() { - return 'admin.permalink.' + this.get('permalinkType'); - }.property('permalinkType'), + return "admin.permalink." + this.get("permalinkType"); + }.property("permalinkType"), actions: { submit: function() { - if (!this.get('formSubmitted')) { + if (!this.get("formSubmitted")) { const self = this; - self.set('formSubmitted', true); - const permalink = Permalink.create({url: self.get('url'), permalink_type: self.get('permalinkType'), permalink_type_value: self.get('permalink_type_value')}); - permalink.save().then(function(result) { - self.set('url', ''); - self.set('permalink_type_value', ''); - self.set('formSubmitted', false); - self.sendAction('action', Permalink.create(result.permalink)); - Em.run.schedule('afterRender', function() { self.$('.permalink-url').focus(); }); - }, function(e) { - self.set('formSubmitted', false); - let error; - if (e.responseJSON && e.responseJSON.errors) { - error = I18n.t("generic_error_with_reason", {error: e.responseJSON.errors.join('. ')}); - } else { - error = I18n.t("generic_error"); - } - bootbox.alert(error, function() { self.$('.permalink-url').focus(); }); + self.set("formSubmitted", true); + const permalink = Permalink.create({ + url: self.get("url"), + permalink_type: self.get("permalinkType"), + permalink_type_value: self.get("permalink_type_value") }); + permalink.save().then( + function(result) { + self.set("url", ""); + self.set("permalink_type_value", ""); + self.set("formSubmitted", false); + self.sendAction("action", Permalink.create(result.permalink)); + Em.run.schedule("afterRender", function() { + self.$(".permalink-url").focus(); + }); + }, + function(e) { + self.set("formSubmitted", false); + let error; + if (e.responseJSON && e.responseJSON.errors) { + error = I18n.t("generic_error_with_reason", { + error: e.responseJSON.errors.join(". ") + }); + } else { + error = I18n.t("generic_error"); + } + bootbox.alert(error, function() { + self.$(".permalink-url").focus(); + }); + } + ); } } }, @@ -47,10 +60,11 @@ export default Ember.Component.extend({ didInsertElement: function() { var self = this; self._super(); - Em.run.schedule('afterRender', function() { - self.$('.external-url').keydown(function(e) { - if (e.keyCode === 13) { // enter key - self.send('submit'); + Em.run.schedule("afterRender", function() { + self.$(".external-url").keydown(function(e) { + if (e.keyCode === 13) { + // enter key + self.send("submit"); } }); }); diff --git a/app/assets/javascripts/admin/components/resumable-upload.js.es6 b/app/assets/javascripts/admin/components/resumable-upload.js.es6 index 36f420d100..4a8545b3ab 100644 --- a/app/assets/javascripts/admin/components/resumable-upload.js.es6 +++ b/app/assets/javascripts/admin/components/resumable-upload.js.es6 @@ -1,5 +1,5 @@ -import { iconHTML } from 'discourse-common/lib/icon-library'; -import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { bufferedRender } from "discourse-common/lib/buffered-render"; /*global Resumable:true */ @@ -13,111 +13,119 @@ import { bufferedRender } from 'discourse-common/lib/buffered-render'; uploadText="UPLOAD" }} **/ -export default Ember.Component.extend(bufferedRender({ - tagName: "button", - classNames: ["btn", "ru"], - classNameBindings: ["isUploading"], - attributeBindings: ["translatedTitle:title"], +export default Ember.Component.extend( + bufferedRender({ + tagName: "button", + classNames: ["btn", "ru"], + classNameBindings: ["isUploading"], + attributeBindings: ["translatedTitle:title"], - resumable: null, + resumable: null, - isUploading: false, - progress: 0, + isUploading: false, + progress: 0, - rerenderTriggers: ['isUploading', 'progress'], + rerenderTriggers: ["isUploading", "progress"], - translatedTitle: function() { - const title = this.get('title'); - return title ? I18n.t(title) : this.get('text'); - }.property('title', 'text'), + translatedTitle: function() { + const title = this.get("title"); + return title ? I18n.t(title) : this.get("text"); + }.property("title", "text"), - text: function() { - if (this.get("isUploading")) { - return this.get("progress") + " %"; - } else { - return this.get("uploadText"); - } - }.property("isUploading", "progress"), + text: function() { + if (this.get("isUploading")) { + return this.get("progress") + " %"; + } else { + return this.get("uploadText"); + } + }.property("isUploading", "progress"), - buildBuffer(buffer) { - const icon = this.get("isUploading") ? "times" : "upload"; - buffer.push(iconHTML(icon)); - buffer.push("" + this.get("text") + ""); - buffer.push(""); - }, + buildBuffer(buffer) { + const icon = this.get("isUploading") ? "times" : "upload"; + buffer.push(iconHTML(icon)); + buffer.push("" + this.get("text") + ""); + buffer.push( + "" + ); + }, + + click: function() { + if (this.get("isUploading")) { + this.resumable.cancel(); + var self = this; + Em.run.later(function() { + self._reset(); + }); + return false; + } else { + return true; + } + }, + + _reset: function() { + this.setProperties({ isUploading: false, progress: 0 }); + }, + + _initialize: function() { + this.resumable = new Resumable({ + target: Discourse.getURL(this.get("target")), + maxFiles: 1, // only 1 file at a time + headers: { + "X-CSRF-Token": $("meta[name='csrf-token']").attr("content") + } + }); - click: function() { - if (this.get("isUploading")) { - this.resumable.cancel(); var self = this; - Em.run.later(function() { self._reset(); }); - return false; - } else { - return true; - } - }, - _reset: function() { - this.setProperties({ isUploading: false, progress: 0 }); - }, - - _initialize: function() { - this.resumable = new Resumable({ - target: Discourse.getURL(this.get("target")), - maxFiles: 1, // only 1 file at a time - headers: { "X-CSRF-Token": $("meta[name='csrf-token']").attr("content") } - }); - - var self = this; - - this.resumable.on("fileAdded", function() { - // automatically upload the selected file - self.resumable.upload(); - // mark as uploading - Em.run.later(function() { - self.set("isUploading", true); + this.resumable.on("fileAdded", function() { + // automatically upload the selected file + self.resumable.upload(); + // mark as uploading + Em.run.later(function() { + self.set("isUploading", true); + }); }); - }); - this.resumable.on("fileProgress", function(file) { - // update progress - Em.run.later(function() { - self.set("progress", parseInt(file.progress() * 100, 10)); + this.resumable.on("fileProgress", function(file) { + // update progress + Em.run.later(function() { + self.set("progress", parseInt(file.progress() * 100, 10)); + }); }); - }); - this.resumable.on("fileSuccess", function(file) { - Em.run.later(function() { - // mark as not uploading anymore - self._reset(); - // fire an event to allow the parent route to reload its model - self.sendAction("success", file.fileName); + this.resumable.on("fileSuccess", function(file) { + Em.run.later(function() { + // mark as not uploading anymore + self._reset(); + // fire an event to allow the parent route to reload its model + self.sendAction("success", file.fileName); + }); }); - }); - this.resumable.on("fileError", function(file, message) { - Em.run.later(function() { - // mark as not uploading anymore - self._reset(); - // fire an event to allow the parent route to display the error message - self.sendAction("error", file.fileName, message); + this.resumable.on("fileError", function(file, message) { + Em.run.later(function() { + // mark as not uploading anymore + self._reset(); + // fire an event to allow the parent route to display the error message + self.sendAction("error", file.fileName, message); + }); }); - }); + }.on("init"), - }.on("init"), + _assignBrowse: function() { + var self = this; + Em.run.schedule("afterRender", function() { + self.resumable.assignBrowse(self.$()); + }); + }.on("didInsertElement"), - _assignBrowse: function() { - var self = this; - Em.run.schedule("afterRender", function() { - self.resumable.assignBrowse(self.$()); - }); - }.on("didInsertElement"), - - _teardown: function() { - if (this.resumable) { - this.resumable.cancel(); - this.resumable = null; - } - }.on("willDestroyElement") - -})); + _teardown: function() { + if (this.resumable) { + this.resumable.cancel(); + this.resumable = null; + } + }.on("willDestroyElement") + }) +); diff --git a/app/assets/javascripts/admin/components/save-controls.js.es6 b/app/assets/javascripts/admin/components/save-controls.js.es6 index 414bbf3661..51adbaf3c5 100644 --- a/app/assets/javascripts/admin/components/save-controls.js.es6 +++ b/app/assets/javascripts/admin/components/save-controls.js.es6 @@ -1,13 +1,13 @@ -import computed from 'ember-addons/ember-computed-decorators'; +import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - classNames: ['controls'], + classNames: ["controls"], - buttonDisabled: Ember.computed.or('model.isSaving', 'saveDisabled'), + buttonDisabled: Ember.computed.or("model.isSaving", "saveDisabled"), - @computed('model.isSaving') + @computed("model.isSaving") savingText(saving) { - return saving ? 'saving' : 'save'; + return saving ? "saving" : "save"; }, actions: { diff --git a/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 b/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 index ef6e7596d1..6197bfc320 100644 --- a/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 +++ b/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 @@ -9,14 +9,14 @@ as an argument. **/ -import ScreenedIpAddress from 'admin/models/screened-ip-address'; -import computed from 'ember-addons/ember-computed-decorators'; -import { on } from 'ember-addons/ember-computed-decorators'; +import ScreenedIpAddress from "admin/models/screened-ip-address"; +import computed from "ember-addons/ember-computed-decorators"; +import { on } from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - classNames: ['screened-ip-address-form'], + classNames: ["screened-ip-address-form"], formSubmitted: false, - actionName: 'block', + actionName: "block", @computed adminWhitelistEnabled() { @@ -27,51 +27,67 @@ export default Ember.Component.extend({ actionNames(adminWhitelistEnabled) { if (adminWhitelistEnabled) { return [ - {id: 'block', name: I18n.t('admin.logs.screened_ips.actions.block')}, - {id: 'do_nothing', name: I18n.t('admin.logs.screened_ips.actions.do_nothing')}, - {id: 'allow_admin', name: I18n.t('admin.logs.screened_ips.actions.allow_admin')} + { id: "block", name: I18n.t("admin.logs.screened_ips.actions.block") }, + { + id: "do_nothing", + name: I18n.t("admin.logs.screened_ips.actions.do_nothing") + }, + { + id: "allow_admin", + name: I18n.t("admin.logs.screened_ips.actions.allow_admin") + } ]; } else { return [ - {id: 'block', name: I18n.t('admin.logs.screened_ips.actions.block')}, - {id: 'do_nothing', name: I18n.t('admin.logs.screened_ips.actions.do_nothing')} + { id: "block", name: I18n.t("admin.logs.screened_ips.actions.block") }, + { + id: "do_nothing", + name: I18n.t("admin.logs.screened_ips.actions.do_nothing") + } ]; } }, actions: { submit() { - if (!this.get('formSubmitted')) { - this.set('formSubmitted', true); + if (!this.get("formSubmitted")) { + this.set("formSubmitted", true); const screenedIpAddress = ScreenedIpAddress.create({ - ip_address: this.get('ip_address'), - action_name: this.get('actionName') - }); - screenedIpAddress.save().then(result => { - if (result.success) { - this.setProperties({ ip_address: '', formSubmitted: false }); - this.sendAction('action', ScreenedIpAddress.create(result.screened_ip_address)); - Ember.run.schedule('afterRender', () => this.$('.ip-address-input').focus()); - } else { - bootbox.alert(result.errors); - } - }).catch(e => { - this.set('formSubmitted', false); - const msg = (e.jqXHR.responseJSON && e.jqXHR.responseJSON.errors) ? - I18n.t("generic_error_with_reason", {error: e.jqXHR.responseJSON.errors.join('. ')}) : - I18n.t("generic_error"); - bootbox.alert(msg, () => this.$('.ip-address-input').focus()); + ip_address: this.get("ip_address"), + action_name: this.get("actionName") }); + screenedIpAddress + .save() + .then(result => { + this.setProperties({ ip_address: "", formSubmitted: false }); + this.sendAction( + "action", + ScreenedIpAddress.create(result.screened_ip_address) + ); + Ember.run.schedule("afterRender", () => + this.$(".ip-address-input").focus() + ); + }) + .catch(e => { + this.set("formSubmitted", false); + const msg = + e.jqXHR.responseJSON && e.jqXHR.responseJSON.errors + ? I18n.t("generic_error_with_reason", { + error: e.jqXHR.responseJSON.errors.join(". ") + }) + : I18n.t("generic_error"); + bootbox.alert(msg, () => this.$(".ip-address-input").focus()); + }); } } }, @on("didInsertElement") _init() { - Ember.run.schedule('afterRender', () => { - this.$('.ip-address-input').keydown(e => { + Ember.run.schedule("afterRender", () => { + this.$(".ip-address-input").keydown(e => { if (e.keyCode === 13) { - this.send('submit'); + this.send("submit"); } }); }); diff --git a/app/assets/javascripts/admin/components/silence-details.js.es6 b/app/assets/javascripts/admin/components/silence-details.js.es6 index 9250c1ae73..91ad923ffc 100644 --- a/app/assets/javascripts/admin/components/silence-details.js.es6 +++ b/app/assets/javascripts/admin/components/silence-details.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: '' + tagName: "" }); diff --git a/app/assets/javascripts/admin/components/site-setting.js.es6 b/app/assets/javascripts/admin/components/site-setting.js.es6 index 98bdf950f6..bd68c7d11e 100644 --- a/app/assets/javascripts/admin/components/site-setting.js.es6 +++ b/app/assets/javascripts/admin/components/site-setting.js.es6 @@ -1,10 +1,10 @@ -import BufferedContent from 'discourse/mixins/buffered-content'; -import SiteSetting from 'admin/models/site-setting'; -import SettingComponent from 'admin/mixins/setting-component'; +import BufferedContent from "discourse/mixins/buffered-content"; +import SiteSetting from "admin/models/site-setting"; +import SettingComponent from "admin/mixins/setting-component"; export default Ember.Component.extend(BufferedContent, SettingComponent, { _save() { - const setting = this.get('buffered'); - return SiteSetting.update(setting.get('setting'), setting.get('value')); + const setting = this.get("buffered"); + return SiteSetting.update(setting.get("setting"), setting.get("value")); } }); diff --git a/app/assets/javascripts/admin/components/site-settings/bool.js.es6 b/app/assets/javascripts/admin/components/site-settings/bool.js.es6 index 6be1a14e27..f46e965832 100644 --- a/app/assets/javascripts/admin/components/site-settings/bool.js.es6 +++ b/app/assets/javascripts/admin/components/site-settings/bool.js.es6 @@ -1,17 +1,17 @@ import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - @computed("value") enabled: { get(value) { - if (Ember.isEmpty(value)) { return false; } + if (Ember.isEmpty(value)) { + return false; + } return value.toString() === "true"; }, set(value) { this.set("value", value ? "true" : "false"); return value; } - }, - + } }); diff --git a/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 b/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 index 487239b78f..36c712fa8d 100644 --- a/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 +++ b/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 @@ -1,7 +1,6 @@ import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - @computed("value") selectedCategories: { get(value) { @@ -12,5 +11,4 @@ export default Ember.Component.extend({ return value; } } - }); diff --git a/app/assets/javascripts/admin/components/site-settings/uploaded-image-list.js.es6 b/app/assets/javascripts/admin/components/site-settings/uploaded-image-list.js.es6 new file mode 100644 index 0000000000..57bd7fa49b --- /dev/null +++ b/app/assets/javascripts/admin/components/site-settings/uploaded-image-list.js.es6 @@ -0,0 +1,15 @@ +import showModal from "discourse/lib/show-modal"; + +export default Ember.Component.extend({ + actions: { + showUploadModal({ value, setting }) { + showModal("admin-uploaded-image-list", { + admin: true, + title: `admin.site_settings.${setting.setting}.title`, + model: { value, setting } + }).setProperties({ + save: v => this.set("value", v) + }); + } + } +}); diff --git a/app/assets/javascripts/admin/components/site-text-summary.js.es6 b/app/assets/javascripts/admin/components/site-text-summary.js.es6 index 642164f871..0ebd139614 100644 --- a/app/assets/javascripts/admin/components/site-text-summary.js.es6 +++ b/app/assets/javascripts/admin/components/site-text-summary.js.es6 @@ -1,25 +1,27 @@ -import { on } from 'ember-addons/ember-computed-decorators'; +import { on } from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - classNames: ['site-text'], - classNameBindings: ['siteText.overridden'], + classNames: ["site-text"], + classNameBindings: ["siteText.overridden"], - @on('didInsertElement') + @on("didInsertElement") highlightTerm() { - const term = this.get('term'); + const term = this.get("term"); if (term) { - this.$('.site-text-id, .site-text-value').highlight(term, {className: 'text-highlight'}); + this.$(".site-text-id, .site-text-value").highlight(term, { + className: "text-highlight" + }); } - this.$('.site-text-value').ellipsis(); + this.$(".site-text-value").ellipsis(); }, click() { - this.send('edit'); + this.send("edit"); }, actions: { edit() { - this.sendAction('editAction', this.get('siteText')); + this.sendAction("editAction", this.get("siteText")); } } }); diff --git a/app/assets/javascripts/admin/components/staff-actions.js.es6 b/app/assets/javascripts/admin/components/staff-actions.js.es6 index 9e742526af..07764a8018 100644 --- a/app/assets/javascripts/admin/components/staff-actions.js.es6 +++ b/app/assets/javascripts/admin/components/staff-actions.js.es6 @@ -1,20 +1,20 @@ -import DiscourseURL from 'discourse/lib/url'; +import DiscourseURL from "discourse/lib/url"; export default Ember.Component.extend({ - classNames: ['table', 'staff-actions'], + classNames: ["table", "staff-actions"], willDestroyElement() { - this.$().off('click.discourse-staff-logs'); + this.$().off("click.discourse-staff-logs"); }, didInsertElement() { this._super(); - this.$().on('click.discourse-staff-logs', '[data-link-post-id]', e => { - let postId = $(e.target).attr('data-link-post-id'); + this.$().on("click.discourse-staff-logs", "[data-link-post-id]", e => { + let postId = $(e.target).attr("data-link-post-id"); - this.store.find('post', postId).then(p => { - DiscourseURL.routeTo(p.get('url')); + this.store.find("post", postId).then(p => { + DiscourseURL.routeTo(p.get("url")); }); return false; }); diff --git a/app/assets/javascripts/admin/components/suspension-details.js.es6 b/app/assets/javascripts/admin/components/suspension-details.js.es6 index 9250c1ae73..91ad923ffc 100644 --- a/app/assets/javascripts/admin/components/suspension-details.js.es6 +++ b/app/assets/javascripts/admin/components/suspension-details.js.es6 @@ -1,3 +1,3 @@ export default Ember.Component.extend({ - tagName: '' + tagName: "" }); diff --git a/app/assets/javascripts/admin/components/theme-setting.js.es6 b/app/assets/javascripts/admin/components/theme-setting.js.es6 index eb576e9b64..c95dd220db 100644 --- a/app/assets/javascripts/admin/components/theme-setting.js.es6 +++ b/app/assets/javascripts/admin/components/theme-setting.js.es6 @@ -1,9 +1,12 @@ -import BufferedContent from 'discourse/mixins/buffered-content'; -import SettingComponent from 'admin/mixins/setting-component'; +import BufferedContent from "discourse/mixins/buffered-content"; +import SettingComponent from "admin/mixins/setting-component"; export default Ember.Component.extend(BufferedContent, SettingComponent, { - layoutName: 'admin/templates/components/site-setting', + layoutName: "admin/templates/components/site-setting", _save() { - return this.get('model').saveSettings(this.get('setting.setting'), this.get('buffered.value')); + return this.get("model").saveSettings( + this.get("setting.setting"), + this.get("buffered.value") + ); } }); diff --git a/app/assets/javascripts/admin/components/themes-list.js.es6 b/app/assets/javascripts/admin/components/themes-list.js.es6 new file mode 100644 index 0000000000..5e40d157fb --- /dev/null +++ b/app/assets/javascripts/admin/components/themes-list.js.es6 @@ -0,0 +1,4 @@ +export default Ember.Component.extend({ + classNames: ["themes-list"], + hasThemes: Ember.computed.gt("themes.length", 0) +}); diff --git a/app/assets/javascripts/admin/components/value-list.js.es6 b/app/assets/javascripts/admin/components/value-list.js.es6 index 3aa66ff187..9e656bed70 100644 --- a/app/assets/javascripts/admin/components/value-list.js.es6 +++ b/app/assets/javascripts/admin/components/value-list.js.es6 @@ -1,104 +1,95 @@ +import { on } from "ember-addons/ember-computed-decorators"; +import computed from "ember-addons/ember-computed-decorators"; + export default Ember.Component.extend({ - classNameBindings: [':value-list'], + classNameBindings: [":value-list"], - _enableSorting: function() { - const self = this; - const placeholder = document.createElement("div"); - placeholder.className = "placeholder"; + inputInvalid: Ember.computed.empty("newValue"), - let dragging = null; - let over = null; - let nodePlacement; + inputDelimiter: null, + inputType: null, + newValue: "", + collection: null, + values: null, + noneKey: Ember.computed.alias("addKey"), - this.$().on('dragstart.discourse', '.values .value', function(e) { - dragging = e.currentTarget; - e.dataTransfer.effectAllowed = 'move'; - e.dataTransfer.setData("text/html", e.currentTarget); - }); - - this.$().on('dragend.discourse', '.values .value', function() { - Ember.run(function() { - dragging.parentNode.removeChild(placeholder); - dragging.style.display = 'block'; - - // Update data - const from = Number(dragging.dataset.index); - let to = Number(over.dataset.index); - if (from < to) to--; - if (nodePlacement === "after") to++; - - const collection = self.get('collection'); - const fromObj = collection.objectAt(from); - collection.replace(from, 1); - collection.replace(to, 0, [fromObj]); - self._saveValues(); - }); - return false; - }); - - this.$().on('dragover.discourse', '.values', function(e) { - e.preventDefault(); - dragging.style.display = 'none'; - if (e.target.className === "placeholder") { return; } - over = e.target; - - const relY = e.originalEvent.clientY - over.offsetTop; - const height = over.offsetHeight / 2; - const parent = e.target.parentNode; - - if (relY > height) { - nodePlacement = "after"; - parent.insertBefore(placeholder, e.target.nextElementSibling); - } else if(relY < height) { - nodePlacement = "before"; - parent.insertBefore(placeholder, e.target); - } - }); - }.on('didInsertElement'), - - _removeSorting: function() { - this.$().off('dragover.discourse').off('dragend.discourse').off('dragstart.discourse'); - }.on('willDestroyElement'), - - _setupCollection: function() { - const values = this.get('values'); - if (this.get('inputType') === "array") { - this.set('collection', values || []); - } else { - this.set('collection', (values && values.length) ? values.split("\n") : []); + @on("didReceiveAttrs") + _setupCollection() { + const values = this.get("values"); + if (this.get("inputType") === "array") { + this.set("collection", values || []); + return; } - }.on('init').observes('values'), - _saveValues: function() { - if (this.get('inputType') === "array") { - this.set('values', this.get('collection')); - } else { - this.set('values', this.get('collection').join("\n")); - } + this.set( + "collection", + this._splitValues(values, this.get("inputDelimiter") || "\n") + ); }, - inputInvalid: Ember.computed.empty('newValue'), + @computed("choices.[]", "collection.[]") + filteredChoices(choices, collection) { + return Ember.makeArray(choices).filter(i => collection.indexOf(i) < 0); + }, - keyDown(e) { - if (e.keyCode === 13) { - this.send('addValue'); - } + keyDown(event) { + if (event.keyCode === 13) this.send("addValue", this.get("newValue")); }, actions: { - addValue() { - if (this.get('inputInvalid')) { return; } + changeValue(index, newValue) { + this._replaceValue(index, newValue); + }, - this.get('collection').addObject(this.get('newValue')); - this.set('newValue', ''); + addValue(newValue) { + if (this.get("inputInvalid")) return; - this._saveValues(); + this.set("newValue", ""); + this._addValue(newValue); }, removeValue(value) { - const collection = this.get('collection'); - collection.removeObject(value); - this._saveValues(); + this._removeValue(value); + }, + + selectChoice(choice) { + this._addValue(choice); + } + }, + + _addValue(value) { + this.get("collection").addObject(value); + this._saveValues(); + }, + + _removeValue(value) { + const collection = this.get("collection"); + collection.removeObject(value); + this._saveValues(); + }, + + _replaceValue(index, newValue) { + this.get("collection").replace(index, 1, [newValue]); + this._saveValues(); + }, + + _saveValues() { + if (this.get("inputType") === "array") { + this.set("values", this.get("collection")); + return; + } + + this.set( + "values", + this.get("collection").join(this.get("inputDelimiter") || "\n") + ); + }, + + _splitValues(values, delimiter) { + if (values && values.length) { + return values.split(delimiter).filter(x => x); + } else { + return []; } } }); diff --git a/app/assets/javascripts/admin/components/watched-word-form.js.es6 b/app/assets/javascripts/admin/components/watched-word-form.js.es6 index e7ead641f2..c9a61965e8 100644 --- a/app/assets/javascripts/admin/components/watched-word-form.js.es6 +++ b/app/assets/javascripts/admin/components/watched-word-form.js.es6 @@ -1,65 +1,94 @@ -import WatchedWord from 'admin/models/watched-word'; -import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators'; +import WatchedWord from "admin/models/watched-word"; +import { + default as computed, + on, + observes +} from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - classNames: ['watched-word-form'], + classNames: ["watched-word-form"], formSubmitted: false, actionKey: null, showMessage: false, - @computed('regularExpressions') + @computed("regularExpressions") placeholderKey(regularExpressions) { - return "admin.watched_words.form.placeholder" + - (regularExpressions ? "_regexp" : ""); + return ( + "admin.watched_words.form.placeholder" + + (regularExpressions ? "_regexp" : "") + ); }, - @observes('word') + @observes("word") removeMessage() { - if (this.get('showMessage') && !Ember.isEmpty(this.get('word'))) { - this.set('showMessage', false); + if (this.get("showMessage") && !Ember.isEmpty(this.get("word"))) { + this.set("showMessage", false); } }, - @computed('word') + @computed("word") isUniqueWord(word) { const words = this.get("filteredContent") || []; - const filtered = words.filter(content => content.action === this.get("actionKey")); - return filtered.every(content => content.word.toLowerCase() !== word.toLowerCase()); + const filtered = words.filter( + content => content.action === this.get("actionKey") + ); + return filtered.every( + content => content.word.toLowerCase() !== word.toLowerCase() + ); }, actions: { submit() { if (!this.get("isUniqueWord")) { - this.setProperties({ showMessage: true, message: I18n.t('admin.watched_words.form.exists') }); + this.setProperties({ + showMessage: true, + message: I18n.t("admin.watched_words.form.exists") + }); return; } - if (!this.get('formSubmitted')) { - this.set('formSubmitted', true); + if (!this.get("formSubmitted")) { + this.set("formSubmitted", true); - const watchedWord = WatchedWord.create({ word: this.get('word'), action: this.get('actionKey') }); - - watchedWord.save().then(result => { - this.setProperties({ word: '', formSubmitted: false, showMessage: true, message: I18n.t('admin.watched_words.form.success') }); - this.sendAction('action', WatchedWord.create(result)); - Ember.run.schedule('afterRender', () => this.$('.watched-word-input').focus()); - }).catch(e => { - this.set('formSubmitted', false); - const msg = (e.jqXHR.responseJSON && e.jqXHR.responseJSON.errors) ? - I18n.t("generic_error_with_reason", {error: e.jqXHR.responseJSON.errors.join('. ')}) : - I18n.t("generic_error"); - bootbox.alert(msg, () => this.$('.watched-word-input').focus()); + const watchedWord = WatchedWord.create({ + word: this.get("word"), + action: this.get("actionKey") }); + + watchedWord + .save() + .then(result => { + this.setProperties({ + word: "", + formSubmitted: false, + showMessage: true, + message: I18n.t("admin.watched_words.form.success") + }); + this.sendAction("action", WatchedWord.create(result)); + Ember.run.schedule("afterRender", () => + this.$(".watched-word-input").focus() + ); + }) + .catch(e => { + this.set("formSubmitted", false); + const msg = + e.jqXHR.responseJSON && e.jqXHR.responseJSON.errors + ? I18n.t("generic_error_with_reason", { + error: e.jqXHR.responseJSON.errors.join(". ") + }) + : I18n.t("generic_error"); + bootbox.alert(msg, () => this.$(".watched-word-input").focus()); + }); } } }, @on("didInsertElement") _init() { - Ember.run.schedule('afterRender', () => { - this.$('.watched-word-input').keydown(e => { + Ember.run.schedule("afterRender", () => { + this.$(".watched-word-input").keydown(e => { if (e.keyCode === 13) { - this.send('submit'); + this.send("submit"); } }); }); diff --git a/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 b/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 index 8d9e6ba0a9..e5ff9a1fd7 100644 --- a/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 +++ b/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 @@ -2,16 +2,16 @@ import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; export default Em.Component.extend(UploadMixin, { - type: 'csv', - classNames: 'watched-words-uploader', - uploadUrl: '/admin/logs/watched_words/upload', + type: "csv", + classNames: "watched-words-uploader", + uploadUrl: "/admin/logs/watched_words/upload", addDisabled: Em.computed.alias("uploading"), validateUploadedFilesOptions() { return { csvOnly: true }; }, - @computed('actionKey') + @computed("actionKey") data(actionKey) { return { action_key: actionKey }; }, diff --git a/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 b/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 index 529538263c..69a1c321f7 100644 --- a/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 @@ -1,32 +1,40 @@ -import ApiKey from 'admin/models/api-key'; +import ApiKey from "admin/models/api-key"; export default Ember.Controller.extend({ - actions: { generateMasterKey() { - ApiKey.generateMasterKey().then(key => this.get('model').pushObject(key)); + ApiKey.generateMasterKey().then(key => this.get("model").pushObject(key)); }, regenerateKey(key) { - bootbox.confirm(I18n.t("admin.api.confirm_regen"), I18n.t("no_value"), I18n.t("yes_value"), result => { - if (result) { - key.regenerate(); + bootbox.confirm( + I18n.t("admin.api.confirm_regen"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + key.regenerate(); + } } - }); + ); }, revokeKey(key) { - bootbox.confirm(I18n.t("admin.api.confirm_revoke"), I18n.t("no_value"), I18n.t("yes_value"), result => { - if (result) { - key.revoke().then(() => this.get('model').removeObject(key)); + bootbox.confirm( + I18n.t("admin.api.confirm_revoke"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + key.revoke().then(() => this.get("model").removeObject(key)); + } } - }); + ); } }, // Has a master key already been generated? hasMasterKey: function() { - return !!this.get('model').findBy('user', null); - }.property('model.[]') - + return !!this.get("model").findBy("user", null); + }.property("model.[]") }); diff --git a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 index 67b6c58d06..49e8d9d441 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 @@ -1,13 +1,15 @@ -import { ajax } from 'discourse/lib/ajax'; +import { ajax } from "discourse/lib/ajax"; export default Ember.Controller.extend({ adminBackups: Ember.inject.controller(), - status: Ember.computed.alias('adminBackups.model'), + status: Ember.computed.alias("adminBackups.model"), - uploadLabel: function() { return I18n.t("admin.backups.upload.label"); }.property(), + uploadLabel: function() { + return I18n.t("admin.backups.upload.label"); + }.property(), restoreTitle: function() { - if (!this.get('status.allowRestore')) { + if (!this.get("status.allowRestore")) { return "admin.backups.operations.restore.is_disabled"; } else if (this.get("status.isOperationRunning")) { return "admin.backups.operations.is_running"; @@ -17,7 +19,6 @@ export default Ember.Controller.extend({ }.property("status.{allowRestore,isOperationRunning}"), actions: { - toggleReadOnlyMode() { var self = this; if (!this.site.get("isReadOnly")) { @@ -38,9 +39,8 @@ export default Ember.Controller.extend({ }, download(backup) { - let link = backup.get('filename'); - ajax("/admin/backups/" + link, { type: "PUT" }) - .then(() => { + let link = backup.get("filename"); + ajax("/admin/backups/" + link, { type: "PUT" }).then(() => { bootbox.alert(I18n.t("admin.backups.operations.download.alert")); }); } diff --git a/app/assets/javascripts/admin/controllers/admin-backups.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups.js.es6 index a429883378..5cfa57271e 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups.js.es6 @@ -1,5 +1,9 @@ export default Ember.Controller.extend({ noOperationIsRunning: Ember.computed.not("model.isOperationRunning"), - rollbackEnabled: Ember.computed.and("model.canRollback", "model.restoreEnabled", "noOperationIsRunning"), + rollbackEnabled: Ember.computed.and( + "model.canRollback", + "model.restoreEnabled", + "noOperationIsRunning" + ), rollbackDisabled: Ember.computed.not("rollbackEnabled") }); diff --git a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 index 7ddc6f3ac4..c0d58e3b11 100644 --- a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 @@ -1,108 +1,139 @@ -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import BufferedContent from 'discourse/mixins/buffered-content'; -import { propertyNotEqual } from 'discourse/lib/computed'; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import BufferedContent from "discourse/mixins/buffered-content"; +import { propertyNotEqual } from "discourse/lib/computed"; export default Ember.Controller.extend(BufferedContent, { adminBadges: Ember.inject.controller(), saving: false, - savingStatus: '', + savingStatus: "", - badgeTypes: Ember.computed.alias('adminBadges.badgeTypes'), - badgeGroupings: Ember.computed.alias('adminBadges.badgeGroupings'), - badgeTriggers: Ember.computed.alias('adminBadges.badgeTriggers'), - protectedSystemFields: Ember.computed.alias('adminBadges.protectedSystemFields'), + badgeTypes: Ember.computed.alias("adminBadges.badgeTypes"), + badgeGroupings: Ember.computed.alias("adminBadges.badgeGroupings"), + badgeTriggers: Ember.computed.alias("adminBadges.badgeTriggers"), + protectedSystemFields: Ember.computed.alias( + "adminBadges.protectedSystemFields" + ), - readOnly: Ember.computed.alias('buffered.system'), - showDisplayName: propertyNotEqual('name', 'displayName'), + readOnly: Ember.computed.alias("buffered.system"), + showDisplayName: propertyNotEqual("name", "displayName"), hasQuery: function() { - const bQuery = this.get('buffered.query'); + const bQuery = this.get("buffered.query"); if (bQuery) { return bQuery.trim().length > 0; } - const mQuery = this.get('model.query'); + const mQuery = this.get("model.query"); return mQuery && mQuery.trim().length > 0; - }.property('model.query', 'buffered.query'), + }.property("model.query", "buffered.query"), _resetSaving: function() { - this.set('saving', false); - this.set('savingStatus', ''); - }.observes('model.id'), + this.set("saving", false); + this.set("savingStatus", ""); + }.observes("model.id"), actions: { save() { - if (!this.get('saving')) { - let fields = ['allow_title', 'multiple_grant', - 'listable', 'auto_revoke', - 'enabled', 'show_posts', - 'target_posts', 'name', 'description', - 'long_description', - 'icon', 'image', 'query', 'badge_grouping_id', - 'trigger', 'badge_type_id']; + if (!this.get("saving")) { + let fields = [ + "allow_title", + "multiple_grant", + "listable", + "auto_revoke", + "enabled", + "show_posts", + "target_posts", + "name", + "description", + "long_description", + "icon", + "image", + "query", + "badge_grouping_id", + "trigger", + "badge_type_id" + ]; - if (this.get('buffered.system')){ - var protectedFields = this.get('protectedSystemFields'); - fields = _.filter(fields, function(f){ - return !_.include(protectedFields,f); + if (this.get("buffered.system")) { + var protectedFields = this.get("protectedSystemFields"); + fields = _.filter(fields, function(f) { + return !_.include(protectedFields, f); }); } - this.set('saving', true); - this.set('savingStatus', I18n.t('saving')); + this.set("saving", true); + this.set("savingStatus", I18n.t("saving")); - const boolFields = ['allow_title', 'multiple_grant', - 'listable', 'auto_revoke', - 'enabled', 'show_posts', - 'target_posts' ]; + const boolFields = [ + "allow_title", + "multiple_grant", + "listable", + "auto_revoke", + "enabled", + "show_posts", + "target_posts" + ]; const data = {}; - const buffered = this.get('buffered'); - fields.forEach(function(field){ + const buffered = this.get("buffered"); + fields.forEach(function(field) { var d = buffered.get(field); - if (_.include(boolFields, field)) { d = !!d; } + if (_.include(boolFields, field)) { + d = !!d; + } data[field] = d; }); - const newBadge = !this.get('id'); - const model = this.get('model'); - this.get('model').save(data).then(() => { - if (newBadge) { - const adminBadges = this.get('adminBadges.model'); - if (!adminBadges.includes(model)) { - adminBadges.pushObject(model); + const newBadge = !this.get("id"); + const model = this.get("model"); + this.get("model") + .save(data) + .then(() => { + if (newBadge) { + const adminBadges = this.get("adminBadges.model"); + if (!adminBadges.includes(model)) { + adminBadges.pushObject(model); + } + this.transitionToRoute("adminBadges.show", model.get("id")); + } else { + this.commitBuffer(); + this.set("savingStatus", I18n.t("saved")); } - this.transitionToRoute('adminBadges.show', model.get('id')); - } else { - this.commitBuffer(); - this.set('savingStatus', I18n.t('saved')); - } - - }).catch(popupAjaxError).finally(() => { - this.set('saving', false); - this.set('savingStatus', ''); - }); + }) + .catch(popupAjaxError) + .finally(() => { + this.set("saving", false); + this.set("savingStatus", ""); + }); } }, destroy() { - const adminBadges = this.get('adminBadges.model'); - const model = this.get('model'); + const adminBadges = this.get("adminBadges.model"); + const model = this.get("model"); - if (!model.get('id')) { - this.transitionToRoute('adminBadges.index'); + if (!model.get("id")) { + this.transitionToRoute("adminBadges.index"); return; } - return bootbox.confirm(I18n.t("admin.badges.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { - if (result) { - model.destroy().then(() => { - adminBadges.removeObject(model); - this.transitionToRoute('adminBadges.index'); - }).catch(() => { - bootbox.alert(I18n.t('generic_error')); - }); + return bootbox.confirm( + I18n.t("admin.badges.delete_confirm"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + model + .destroy() + .then(() => { + adminBadges.removeObject(model); + this.transitionToRoute("adminBadges.index"); + }) + .catch(() => { + bootbox.alert(I18n.t("generic_error")); + }); + } } - }); + ); } } }); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 index e333d2a58d..ca62835a04 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 @@ -1,7 +1,7 @@ -import computed from 'ember-addons/ember-computed-decorators'; +import computed from "ember-addons/ember-computed-decorators"; export default Ember.Controller.extend({ - @computed("model.colors","onlyOverridden") + @computed("model.colors", "onlyOverridden") colors(allColors, onlyOverridden) { if (onlyOverridden) { return allColors.filter(color => color.get("overridden")); @@ -11,7 +11,6 @@ export default Ember.Controller.extend({ }, actions: { - revert: function(color) { color.revert(); }, @@ -28,14 +27,20 @@ export default Ember.Controller.extend({ let range = document.createRange(); range.selectNode(area[0]); window.getSelection().addRange(range); - let successful = document.execCommand('copy'); + let successful = document.execCommand("copy"); if (successful) { - this.set("model.savingStatus", I18n.t("admin.customize.copied_to_clipboard")); + this.set( + "model.savingStatus", + I18n.t("admin.customize.copied_to_clipboard") + ); } else { - this.set("model.savingStatus", I18n.t("admin.customize.copy_to_clipboard_error")); + this.set( + "model.savingStatus", + I18n.t("admin.customize.copy_to_clipboard_error") + ); } - setTimeout(()=>{ + setTimeout(() => { this.set("model.savingStatus", null); }, 2000); @@ -46,29 +51,38 @@ export default Ember.Controller.extend({ }, copy() { - var newColorScheme = Em.copy(this.get('model'), true); - newColorScheme.set('name', I18n.t('admin.customize.colors.copy_name_prefix') + ' ' + this.get('model.name')); - newColorScheme.save().then(()=>{ - this.get('allColors').pushObject(newColorScheme); - this.replaceRoute('adminCustomize.colors.show', newColorScheme); + var newColorScheme = Em.copy(this.get("model"), true); + newColorScheme.set( + "name", + I18n.t("admin.customize.colors.copy_name_prefix") + + " " + + this.get("model.name") + ); + newColorScheme.save().then(() => { + this.get("allColors").pushObject(newColorScheme); + this.replaceRoute("adminCustomize.colors.show", newColorScheme); }); }, save: function() { - this.get('model').save(); + this.get("model").save(); }, destroy: function() { - - const model = this.get('model'); - return bootbox.confirm(I18n.t("admin.customize.colors.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { - if (result) { - model.destroy().then(()=>{ - this.get('allColors').removeObject(model); - this.replaceRoute('adminCustomize.colors'); - }); + const model = this.get("model"); + return bootbox.confirm( + I18n.t("admin.customize.colors.delete_confirm"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + model.destroy().then(() => { + this.get("allColors").removeObject(model); + this.replaceRoute("adminCustomize.colors"); + }); + } } - }); + ); } } }); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 index 87166e386f..945a46acf3 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 @@ -1,41 +1,43 @@ -import showModal from 'discourse/lib/show-modal'; +import showModal from "discourse/lib/show-modal"; export default Ember.Controller.extend({ baseColorScheme: function() { - return this.get('model').findBy('is_base', true); - }.property('model.@each.id'), + return this.get("model").findBy("is_base", true); + }.property("model.@each.id"), baseColorSchemes: function() { - return this.get('model').filterBy('is_base', true); - }.property('model.@each.id'), + return this.get("model").filterBy("is_base", true); + }.property("model.@each.id"), baseColors: function() { var baseColorsHash = Em.Object.create({}); - _.each(this.get('baseColorScheme.colors'), function(color){ - baseColorsHash.set(color.get('name'), color); + _.each(this.get("baseColorScheme.colors"), function(color) { + baseColorsHash.set(color.get("name"), color); }); return baseColorsHash; - }.property('baseColorScheme'), + }.property("baseColorScheme"), actions: { - newColorSchemeWithBase(baseKey) { - const base = this.get('baseColorSchemes').findBy('base_scheme_id', baseKey); + const base = this.get("baseColorSchemes").findBy( + "base_scheme_id", + baseKey + ); const newColorScheme = Em.copy(base, true); - newColorScheme.set('name', I18n.t('admin.customize.colors.new_name')); - newColorScheme.set('base_scheme_id', base.get('base_scheme_id')); - newColorScheme.save().then(()=>{ - this.get('model').pushObject(newColorScheme); - newColorScheme.set('savingStatus', null); - this.replaceRoute('adminCustomize.colors.show', newColorScheme); + newColorScheme.set("name", I18n.t("admin.customize.colors.new_name")); + newColorScheme.set("base_scheme_id", base.get("base_scheme_id")); + newColorScheme.save().then(() => { + this.get("model").pushObject(newColorScheme); + newColorScheme.set("savingStatus", null); + this.replaceRoute("adminCustomize.colors.show", newColorScheme); }); }, newColorScheme() { - showModal('admin-color-scheme-select-base', { model: this.get('baseColorSchemes'), admin: true}); - }, - - + showModal("admin-color-scheme-select-base", { + model: this.get("baseColorSchemes"), + admin: true + }); + } } - }); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 index 4c5a2a2854..5a20a94cbf 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 @@ -1,38 +1,47 @@ -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import { bufferedProperty } from 'discourse/mixins/buffered-content'; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; -export default Ember.Controller.extend(bufferedProperty('emailTemplate'), { +export default Ember.Controller.extend(bufferedProperty("emailTemplate"), { saved: false, hasMultipleSubjects: function() { - const buffered = this.get('buffered'); - if (buffered.getProperties('subject')['subject']) { + const buffered = this.get("buffered"); + if (buffered.getProperties("subject")["subject"]) { return false; } else { - return buffered.getProperties('id')['id']; + return buffered.getProperties("id")["id"]; } }.property("buffered"), actions: { saveChanges() { - this.set('saved', false); - const buffered = this.get('buffered'); - this.get('emailTemplate').save(buffered.getProperties('subject', 'body')).then(() => { - this.set('saved', true); - }).catch(popupAjaxError); + this.set("saved", false); + const buffered = this.get("buffered"); + this.get("emailTemplate") + .save(buffered.getProperties("subject", "body")) + .then(() => { + this.set("saved", true); + }) + .catch(popupAjaxError); }, revertChanges() { - this.set('saved', false); - bootbox.confirm(I18n.t('admin.customize.email_templates.revert_confirm'), result => { - if (result) { - this.get('emailTemplate').revert().then(props => { - const buffered = this.get('buffered'); - buffered.setProperties(props); - this.commitBuffer(); - }).catch(popupAjaxError); + this.set("saved", false); + bootbox.confirm( + I18n.t("admin.customize.email_templates.revert_confirm"), + result => { + if (result) { + this.get("emailTemplate") + .revert() + .then(props => { + const buffered = this.get("buffered"); + buffered.setProperties(props); + this.commitBuffer(); + }) + .catch(popupAjaxError); + } } - }); + ); } } }); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-email-templates.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-email-templates.js.es6 index fe9cd69804..6fe215c9c3 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-email-templates.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-email-templates.js.es6 @@ -1,6 +1,6 @@ export default Ember.Controller.extend({ - titleSorting: ['title'], + titleSorting: ["title"], emailTemplates: null, - sortedTemplates: Ember.computed.sort('emailTemplates', 'titleSorting') + sortedTemplates: Ember.computed.sort("emailTemplates", "titleSorting") }); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 index 28ae718afa..7cbe893fe5 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 @@ -1,66 +1,86 @@ -import { url } from 'discourse/lib/computed'; -import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import { url } from "discourse/lib/computed"; +import { + default as computed, + observes +} from "ember-addons/ember-computed-decorators"; export default Ember.Controller.extend({ maximized: false, section: null, - editRouteName: 'adminCustomizeThemes.edit', + editRouteName: "adminCustomizeThemes.edit", targets: [ - { id: 0, name: 'common' }, - { id: 1, name: 'desktop' }, - { id: 2, name: 'mobile' }, - { id: 3, name: 'settings' } + { id: 0, name: "common" }, + { id: 1, name: "desktop" }, + { id: 2, name: "mobile" }, + { id: 3, name: "settings" } ], - fieldsForTarget: function (target) { - const common = ["scss", "head_tag", "header", "after_header", "body_tag", "footer"]; - switch(target) { - case "common": return [...common, "embedded_scss"]; - case "desktop": return common; - case "mobile": return common; - case "settings": return ["yaml"]; + fieldsForTarget: function(target) { + const common = [ + "scss", + "head_tag", + "header", + "after_header", + "body_tag", + "footer" + ]; + switch (target) { + case "common": + return [...common, "embedded_scss"]; + case "desktop": + return common; + case "mobile": + return common; + case "settings": + return ["yaml"]; } }, - @computed('onlyOverridden') + @computed("onlyOverridden") showCommon() { - return this.shouldShow('common'); + return this.shouldShow("common"); }, - @computed('onlyOverridden') + @computed("onlyOverridden") showDesktop() { - return this.shouldShow('desktop'); + return this.shouldShow("desktop"); }, - @computed('onlyOverridden') + @computed("onlyOverridden") showMobile() { - return this.shouldShow('mobile'); + return this.shouldShow("mobile"); }, - @computed('onlyOverridden', 'model.remote_theme') - showSettings() { - return false; - }, - - @observes('onlyOverridden') + @observes("onlyOverridden") onlyOverriddenChanged() { - if (this.get('onlyOverridden')) { - if (!this.get('model').hasEdited(this.get('currentTargetName'), this.get('fieldName'))) { - let target = (this.get('showCommon') && 'common') || - (this.get('showDesktop') && 'desktop') || - (this.get('showMobile') && 'mobile'); + if (this.get("onlyOverridden")) { + if ( + !this.get("model").hasEdited( + this.get("currentTargetName"), + this.get("fieldName") + ) + ) { + let target = + (this.get("showCommon") && "common") || + (this.get("showDesktop") && "desktop") || + (this.get("showMobile") && "mobile"); - let fields = this.get('model.theme_fields'); - let field = fields && fields.find(f => (f.target === target)); - this.replaceRoute(this.get('editRouteName'), this.get('model.id'), target, field && field.name); + let fields = this.get("model.theme_fields"); + let field = fields && fields.find(f => f.target === target); + this.replaceRoute( + this.get("editRouteName"), + this.get("model.id"), + target, + field && field.name + ); } } }, - shouldShow(target){ - if(!this.get("onlyOverridden")) { + shouldShow(target) { + if (!this.get("onlyOverridden")) { return true; } return this.get("model").hasEdited(target); @@ -69,13 +89,13 @@ export default Ember.Controller.extend({ currentTarget: 0, setTargetName: function(name) { - const target = this.get('targets').find(t => t.name === name); + const target = this.get("targets").find(t => t.name === name); this.set("currentTarget", target && target.id); }, @computed("currentTarget") currentTargetName(id) { - const target = this.get('targets').find(t => t.id === parseInt(id, 10)); + const target = this.get("targets").find(t => t.id === parseInt(id, 10)); return target && target.name; }, @@ -87,7 +107,7 @@ export default Ember.Controller.extend({ @computed("currentTargetName", "fieldName", "saving") error(target, fieldName) { - return this.get('model').getError(target, fieldName); + return this.get("model").getError(target, fieldName); }, @computed("fieldName", "currentTargetName") @@ -116,9 +136,9 @@ export default Ember.Controller.extend({ fields = fields.filter(name => model.hasEdited(targetName, name)); } - return fields.map(name=>{ + return fields.map(name => { let hash = { - key: (`admin.customize.theme.${name}.text`), + key: `admin.customize.theme.${name}.text`, name: name }; @@ -132,30 +152,36 @@ export default Ember.Controller.extend({ }); }, - previewUrl: url('model.id', '/admin/themes/%@/preview'), + previewUrl: url("model.id", "/admin/themes/%@/preview"), maximizeIcon: function() { - return this.get('maximized') ? 'compress' : 'expand'; - }.property('maximized'), + return this.get("maximized") ? "compress" : "expand"; + }.property("maximized"), saveButtonText: function() { - return this.get('model.isSaving') ? I18n.t('saving') : I18n.t('admin.customize.save'); - }.property('model.isSaving'), + return this.get("model.isSaving") + ? I18n.t("saving") + : I18n.t("admin.customize.save"); + }.property("model.isSaving"), saveDisabled: function() { - return !this.get('model.changed') || this.get('model.isSaving'); - }.property('model.changed', 'model.isSaving'), + return !this.get("model.changed") || this.get("model.isSaving"); + }.property("model.changed", "model.isSaving"), actions: { save() { - this.set('saving', true); - this.get('model').saveChanges("theme_fields").finally(()=>{this.set('saving', false);}); + this.set("saving", true); + this.get("model") + .saveChanges("theme_fields") + .finally(() => { + this.set("saving", false); + }); }, toggleMaximize: function() { - this.toggleProperty('maximized'); - Em.run.next(()=>{ - this.appEvents.trigger('ace:resize'); + this.toggleProperty("maximized"); + Em.run.next(() => { + this.appEvents.trigger("ace:resize"); }); } } diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 index 16eff82947..40ce1b37c7 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 @@ -1,78 +1,108 @@ -import { default as computed } from 'ember-addons/ember-computed-decorators'; -import { url } from 'discourse/lib/computed'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import showModal from 'discourse/lib/show-modal'; -import ThemeSettings from 'admin/models/theme-settings'; +import { + default as computed, + observes +} from "ember-addons/ember-computed-decorators"; +import { url } from "discourse/lib/computed"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import showModal from "discourse/lib/show-modal"; +import ThemeSettings from "admin/models/theme-settings"; const THEME_UPLOAD_VAR = 2; +const SETTINGS_TYPE_ID = 5; export default Ember.Controller.extend({ + editRouteName: "adminCustomizeThemes.edit", - editRouteName: 'adminCustomizeThemes.edit', + @observes("allowChildThemes") + setSelectedThemeId() { + const available = this.get("selectableChildThemes"); + if ( + !this.get("selectedChildThemeId") && + available && + available.length > 0 + ) { + this.set("selectedChildThemeId", available[0].get("id")); + } + }, - @computed("model", "allThemes") + @computed("model", "allThemes", "model.component") parentThemes(model, allThemes) { + if (!model.get("component")) { + return null; + } let parents = allThemes.filter(theme => - _.contains(theme.get("childThemes"), model)); + _.contains(theme.get("childThemes"), model) + ); return parents.length === 0 ? null : parents; }, @computed("model.theme_fields.@each") hasEditedFields(fields) { - return fields.any(f=>!Em.isBlank(f.value)); + return fields.any( + f => !Em.isBlank(f.value) && f.type_id !== SETTINGS_TYPE_ID + ); }, - @computed('model.theme_fields.@each') + @computed("model.theme_fields.@each") editedDescriptions(fields) { let descriptions = []; let description = target => { - let current = fields.filter(field => field.target === target && !Em.isBlank(field.value)); + let current = fields.filter( + field => field.target === target && !Em.isBlank(field.value) + ); if (current.length > 0) { - let text = I18n.t('admin.customize.theme.'+target); - let localized = current.map(f=>I18n.t('admin.customize.theme.'+f.name + '.text')); + let text = I18n.t("admin.customize.theme." + target); + let localized = current.map(f => + I18n.t("admin.customize.theme." + f.name + ".text") + ); return text + ": " + localized.join(" , "); } }; - ['common', 'desktop', 'mobile'].forEach(target => { + ["common", "desktop", "mobile"].forEach(target => { descriptions.push(description(target)); }); - return descriptions.reject(d=>Em.isBlank(d)); + return descriptions.reject(d => Em.isBlank(d)); }, - previewUrl: url('model.id', '/admin/themes/%@/preview'), + previewUrl: url("model.id", "/admin/themes/%@/preview"), @computed("colorSchemeId", "model.color_scheme_id") colorSchemeChanged(colorSchemeId, existingId) { colorSchemeId = colorSchemeId === null ? null : parseInt(colorSchemeId); - return colorSchemeId !== existingId; + return colorSchemeId !== existingId; }, - @computed("availableChildThemes", "model.childThemes.@each", "model", "allowChildThemes") - selectableChildThemes(available, childThemes, model, allowChildThemes) { + @computed( + "availableChildThemes", + "model.childThemes.@each", + "model", + "allowChildThemes" + ) + selectableChildThemes(available, childThemes, allowChildThemes) { if (!allowChildThemes && (!childThemes || childThemes.length === 0)) { return null; } let themes = []; - available.forEach(t=> { - if (!childThemes || (childThemes.indexOf(t) === -1)) { + available.forEach(t => { + if (!childThemes || childThemes.indexOf(t) === -1) { themes.push(t); - }; + } }); return themes.length === 0 ? null : themes; }, - @computed("allThemes", "allThemes.length", "model") - availableChildThemes(allThemes, count) { - if (count === 1) { + @computed("allThemes", "allThemes.length", "model.component", "model") + availableChildThemes(allThemes, count, component) { + if (count === 1 || component) { return null; } - let excludeIds = [this.get("model.id")]; + const themeId = this.get("model.id"); let themes = []; allThemes.forEach(theme => { - if (excludeIds.indexOf(theme.get("id")) === -1) { + if (themeId !== theme.get("id") && theme.get("component")) { themes.push(theme); } }); @@ -80,6 +110,12 @@ export default Ember.Controller.extend({ return themes; }, + @computed("model.component") + switchKey(component) { + const type = component ? "component" : "theme"; + return `admin.customize.theme.switch_${type}`; + }, + @computed("model.settings") settings(settings) { return settings.map(setting => ThemeSettings.create(setting)); @@ -90,44 +126,48 @@ export default Ember.Controller.extend({ return settings.length > 0; }, - downloadUrl: url('model.id', '/admin/themes/%@'), + downloadUrl: url("model.id", "/admin/themes/%@"), actions: { - updateToLatest() { this.set("updatingRemote", true); - this.get("model").updateToLatest() + this.get("model") + .updateToLatest() .catch(popupAjaxError) - .finally(()=>{ + .finally(() => { this.set("updatingRemote", false); }); }, checkForThemeUpdates() { this.set("updatingRemote", true); - this.get("model").checkForUpdates() + this.get("model") + .checkForUpdates() .catch(popupAjaxError) - .finally(()=>{ + .finally(() => { this.set("updatingRemote", false); }); }, addUploadModal() { - showModal('admin-add-upload', {admin: true, name: ''}); + showModal("admin-add-upload", { admin: true, name: "" }); }, addUpload(info) { let model = this.get("model"); - model.setField('common', info.name, '', info.upload_id, THEME_UPLOAD_VAR); - model.saveChanges('theme_fields').catch(e => popupAjaxError(e)); + model.setField("common", info.name, "", info.upload_id, THEME_UPLOAD_VAR); + model.saveChanges("theme_fields").catch(e => popupAjaxError(e)); }, cancelChangeScheme() { this.set("colorSchemeId", this.get("model.color_scheme_id")); }, - changeScheme(){ + changeScheme() { let schemeId = this.get("colorSchemeId"); - this.set("model.color_scheme_id", schemeId === null ? null : parseInt(schemeId)); + this.set( + "model.color_scheme_id", + schemeId === null ? null : parseInt(schemeId) + ); this.get("model").saveChanges("color_scheme_id"); }, startEditingName() { @@ -144,14 +184,23 @@ export default Ember.Controller.extend({ }, editTheme() { - let edit = ()=>this.transitionToRoute(this.get('editRouteName'), this.get('model.id'), 'common', 'scss'); + let edit = () => + this.transitionToRoute( + this.get("editRouteName"), + this.get("model.id"), + "common", + "scss" + ); if (this.get("model.remote_theme")) { - bootbox.confirm(I18n.t("admin.customize.theme.edit_confirm"), result => { - if (result) { - edit(); - } - }); + bootbox.confirm( + I18n.t("admin.customize.theme.edit_confirm"), + result => { + if (result) { + edit(); + } + } + ); } else { edit(); } @@ -159,10 +208,10 @@ export default Ember.Controller.extend({ applyDefault() { const model = this.get("model"); - model.saveChanges("default").then(()=>{ + model.saveChanges("default").then(() => { if (model.get("default")) { - this.get("allThemes").forEach(theme=>{ - if (theme !== model && theme.get('default')) { + this.get("allThemes").forEach(theme => { + if (theme !== model && theme.get("default")) { theme.set("default", false); } }); @@ -182,13 +231,15 @@ export default Ember.Controller.extend({ removeUpload(upload) { return bootbox.confirm( - I18n.t("admin.customize.theme.delete_upload_confirm"), - I18n.t("no_value"), - I18n.t("yes_value"), result => { - if (result) { - this.get("model").removeField(upload); - } - }); + I18n.t("admin.customize.theme.delete_upload_confirm"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + this.get("model").removeField(upload); + } + } + ); }, removeChildTheme(theme) { @@ -196,17 +247,47 @@ export default Ember.Controller.extend({ }, destroy() { - return bootbox.confirm(I18n.t("admin.customize.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { - if (result) { - const model = this.get('model'); - model.destroyRecord().then(() => { - this.get('allThemes').removeObject(model); - this.transitionToRoute('adminCustomizeThemes'); - }); + return bootbox.confirm( + I18n.t("admin.customize.delete_confirm"), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + const model = this.get("model"); + model.destroyRecord().then(() => { + this.get("allThemes").removeObject(model); + this.transitionToRoute("adminCustomizeThemes"); + }); + } } - }); + ); }, + switchType() { + return bootbox.confirm( + I18n.t(`${this.get("switchKey")}_alert`), + I18n.t("no_value"), + I18n.t("yes_value"), + result => { + if (result) { + const model = this.get("model"); + model.set("component", !model.get("component")); + model + .saveChanges("component") + .then(() => { + this.set("colorSchemeId", null); + model.setProperties({ + default: false, + color_scheme_id: null, + user_selectable: false, + child_themes: [], + childThemes: [] + }); + }) + .catch(popupAjaxError); + } + } + ); + } } - }); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 index b9a897a26a..8468634a0a 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 @@ -1,10 +1,19 @@ -import { default as computed } from 'ember-addons/ember-computed-decorators'; +import { default as computed } from "ember-addons/ember-computed-decorators"; export default Ember.Controller.extend({ - @computed('model', 'model.@each') - sortedThemes(themes) { - return _.sortBy(themes.content, t => { - return [!t.get("default"), !t.get("user_selectable"), t.get("name").toLowerCase()]; + @computed("model", "model.@each", "model.@each.component") + fullThemes(themes) { + return _.sortBy(themes.filter(t => !t.get("component")), t => { + return [ + !t.get("default"), + !t.get("user_selectable"), + t.get("name").toLowerCase() + ]; }); + }, + + @computed("model", "model.@each", "model.@each.component") + childThemes(themes) { + return themes.filter(t => t.get("component")); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-next-general.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-next-general.js.es6 new file mode 100644 index 0000000000..2de7b16f16 --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-next-general.js.es6 @@ -0,0 +1,134 @@ +import { setting } from "discourse/lib/computed"; +import computed from "ember-addons/ember-computed-decorators"; +import AdminDashboardNext from "admin/models/admin-dashboard-next"; +import Report from "admin/models/report"; +import PeriodComputationMixin from "admin/mixins/period-computation"; + +function staticReport(reportType) { + return function() { + return Ember.makeArray(this.get("reports")).find( + report => report.type === reportType + ); + }.property("reports.[]"); +} + +export default Ember.Controller.extend(PeriodComputationMixin, { + isLoading: false, + dashboardFetchedAt: null, + exceptionController: Ember.inject.controller("exception"), + diskSpace: Ember.computed.alias("model.attributes.disk_space"), + logSearchQueriesEnabled: setting("log_search_queries"), + lastBackupTakenAt: Ember.computed.alias( + "model.attributes.last_backup_taken_at" + ), + shouldDisplayDurability: Ember.computed.and("diskSpace"), + + @computed + activityMetrics() { + return [ + "page_view_total_reqs", + "visits", + "time_to_first_response", + "likes", + "flags", + "user_to_user_private_messages_with_replies" + ]; + }, + + @computed + activityMetricsFilters() { + return { + startDate: this.get("lastMonth"), + endDate: this.get("today") + }; + }, + + @computed + topReferredTopicsOptions() { + return { + table: { total: false, limit: 8 } + }; + }, + + @computed + topReferredTopicsFilters() { + return { + startDate: moment() + .subtract(6, "days") + .startOf("day"), + endDate: this.get("today") + }; + }, + + @computed + trendingSearchFilters() { + return { + startDate: moment() + .subtract(6, "days") + .startOf("day"), + endDate: this.get("today") + }; + }, + + @computed + trendingSearchOptions() { + return { + table: { total: false, limit: 8 } + }; + }, + + usersByTypeReport: staticReport("users_by_type"), + usersByTrustLevelReport: staticReport("users_by_trust_level"), + + fetchDashboard() { + if (this.get("isLoading")) return; + + if ( + !this.get("dashboardFetchedAt") || + moment() + .subtract(30, "minutes") + .toDate() > this.get("dashboardFetchedAt") + ) { + this.set("isLoading", true); + + AdminDashboardNext.fetchGeneral() + .then(adminDashboardNextModel => { + this.setProperties({ + dashboardFetchedAt: new Date(), + model: adminDashboardNextModel, + reports: Ember.makeArray(adminDashboardNextModel.reports).map(x => + Report.create(x) + ) + }); + }) + .catch(e => { + this.get("exceptionController").set("thrown", e.jqXHR); + this.replaceRoute("exception"); + }) + .finally(() => this.set("isLoading", false)); + } + }, + + @computed("startDate", "endDate") + filters(startDate, endDate) { + return { startDate, endDate }; + }, + + @computed("model.attributes.updated_at") + updatedTimestamp(updatedAt) { + return moment(updatedAt) + .tz(moment.tz.guess()) + .format("LLL"); + }, + + @computed("lastBackupTakenAt") + backupTimestamp(lastBackupTakenAt) { + return moment(lastBackupTakenAt) + .tz(moment.tz.guess()) + .format("LLL"); + }, + + _reportsForPeriodURL(period) { + return Discourse.getURL(`/admin?period=${period}`); + } +}); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-next-moderation.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-next-moderation.js.es6 new file mode 100644 index 0000000000..059bcd6176 --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-next-moderation.js.es6 @@ -0,0 +1,28 @@ +import computed from "ember-addons/ember-computed-decorators"; +import PeriodComputationMixin from "admin/mixins/period-computation"; + +export default Ember.Controller.extend(PeriodComputationMixin, { + @computed + flagsStatusOptions() { + return { + table: { + total: false, + perPage: 10 + } + }; + }, + + @computed("startDate", "endDate") + filters(startDate, endDate) { + return { startDate, endDate }; + }, + + @computed("lastWeek", "endDate") + lastWeekfilters(startDate, endDate) { + return { startDate, endDate }; + }, + + _reportsForPeriodURL(period) { + return Discourse.getURL(`/admin/dashboard/moderation?period=${period}`); + } +}); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 index f65e2f04fd..1be0a8a7fa 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 @@ -1,127 +1,90 @@ import { setting } from "discourse/lib/computed"; -import DiscourseURL from "discourse/lib/url"; import computed from "ember-addons/ember-computed-decorators"; import AdminDashboardNext from "admin/models/admin-dashboard-next"; -import Report from "admin/models/report"; import VersionCheck from "admin/models/version-check"; const PROBLEMS_CHECK_MINUTES = 1; export default Ember.Controller.extend({ - queryParams: ["period"], - period: "monthly", isLoading: false, dashboardFetchedAt: null, exceptionController: Ember.inject.controller("exception"), showVersionChecks: setting("version_checks"), - diskSpace: Ember.computed.alias("model.attributes.disk_space"), - logSearchQueriesEnabled: setting("log_search_queries"), - availablePeriods: ["yearly", "quarterly", "monthly", "weekly"], @computed("problems.length") foundProblems(problemsLength) { return this.currentUser.get("admin") && (problemsLength || 0) > 0; }, - fetchDashboard() { - if (this.get("isLoading")) return; + fetchProblems() { + if (this.get("isLoadingProblems")) return; - if (!this.get("dashboardFetchedAt") || moment().subtract(30, "minutes").toDate() > this.get("dashboardFetchedAt")) { - this.set("isLoading", true); - - const versionChecks = this.siteSettings.version_checks; - - AdminDashboardNext.find().then(adminDashboardNextModel => { - - if (versionChecks) { - this.set("versionCheck", VersionCheck.create(adminDashboardNextModel.version_check)); - } - - this.setProperties({ - dashboardFetchedAt: new Date(), - model: adminDashboardNextModel, - reports: adminDashboardNextModel.reports.map(x => Report.create(x)) - }); - }).catch(e => { - this.get("exceptionController").set("thrown", e.jqXHR); - this.replaceRoute("exception"); - }).finally(() => { - this.set("isLoading", false); - }); - } - - if (!this.get("problemsFetchedAt") || moment().subtract(PROBLEMS_CHECK_MINUTES, "minutes").toDate() > this.get("problemsFetchedAt")) { - this.loadProblems(); + if ( + !this.get("problemsFetchedAt") || + moment() + .subtract(PROBLEMS_CHECK_MINUTES, "minutes") + .toDate() > this.get("problemsFetchedAt") + ) { + this._loadProblems(); } }, - loadProblems() { - this.set("loadingProblems", true); - this.set("problemsFetchedAt", new Date()); - AdminDashboardNext.fetchProblems().then(d => { - this.set("problems", d.problems); - }).finally(() => { - this.set("loadingProblems", false); + fetchDashboard() { + const versionChecks = this.siteSettings.version_checks; + + if (this.get("isLoading") || !versionChecks) return; + + if ( + !this.get("dashboardFetchedAt") || + moment() + .subtract(30, "minutes") + .toDate() > this.get("dashboardFetchedAt") + ) { + this.set("isLoading", true); + + AdminDashboardNext.fetch() + .then(model => { + let properties = { + dashboardFetchedAt: new Date() + }; + + if (versionChecks) { + properties.versionCheck = VersionCheck.create(model.version_check); + } + + this.setProperties(properties); + }) + .catch(e => { + this.get("exceptionController").set("thrown", e.jqXHR); + this.replaceRoute("exception"); + }) + .finally(() => { + this.set("isLoading", false); + }); + } + }, + + _loadProblems() { + this.setProperties({ + loadingProblems: true, + problemsFetchedAt: new Date() }); + + AdminDashboardNext.fetchProblems() + .then(model => this.set("problems", model.problems)) + .finally(() => this.set("loadingProblems", false)); }, @computed("problemsFetchedAt") problemsTimestamp(problemsFetchedAt) { - return moment(problemsFetchedAt).locale("en").format("LLL"); - }, - - @computed("period") - startDate(period) { - let fullDay = moment().locale("en").utc().subtract(1, "day"); - - switch (period) { - case "yearly": - return fullDay.subtract(1, "year").startOf("day"); - break; - case "quarterly": - return fullDay.subtract(3, "month").startOf("day"); - break; - case "weekly": - return fullDay.subtract(1, "week").startOf("day"); - break; - case "monthly": - return fullDay.subtract(1, "month").startOf("day"); - break; - default: - return fullDay.subtract(1, "month").startOf("day"); - } - }, - - @computed() - lastWeek() { - return moment().locale("en").utc().endOf("day").subtract(1, "week"); - }, - - @computed() - endDate() { - return moment().locale("en").utc().subtract(1, "day").endOf("day"); - }, - - @computed("model.attributes.updated_at") - updatedTimestamp(updatedAt) { - return moment(updatedAt).format("LLL"); - }, - - @computed("model.attributes.last_backup_taken_at") - backupTimestamp(lastBackupTakenAt) { - return moment(lastBackupTakenAt).format("LLL"); + return moment(problemsFetchedAt) + .locale("en") + .format("LLL"); }, actions: { - changePeriod(period) { - DiscourseURL.routeTo(this._reportsForPeriodURL(period)); - }, refreshProblems() { - this.loadProblems(); - }, - }, - - _reportsForPeriodURL(period) { - return Discourse.getURL(`/admin?period=${period}`); + this._loadProblems(); + } } }); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 index 973cd3d57c..9b545fc2fb 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 @@ -1,50 +1,74 @@ -import AdminDashboard from 'admin/models/admin-dashboard'; -import Report from 'admin/models/report'; -import AdminUser from 'admin/models/admin-user'; -import computed from 'ember-addons/ember-computed-decorators'; +import AdminDashboard from "admin/models/admin-dashboard"; +import Report from "admin/models/report"; +import AdminUser from "admin/models/admin-user"; +import computed from "ember-addons/ember-computed-decorators"; +const ATTRIBUTES = [ + "disk_space", + "admins", + "moderators", + "silenced", + "suspended", + "top_traffic_sources", + "top_referred_topics", + "updated_at" +]; -const ATTRIBUTES = [ 'disk_space','admins', 'moderators', 'silenced', 'suspended', 'top_traffic_sources', - 'top_referred_topics', 'updated_at']; - -const REPORTS = [ 'global_reports', 'page_view_reports', 'private_message_reports', 'http_reports', - 'user_reports', 'mobile_reports']; +const REPORTS = [ + "global_reports", + "page_view_reports", + "private_message_reports", + "http_reports", + "user_reports", + "mobile_reports" +]; // This controller supports the default interface when you enter the admin section. export default Ember.Controller.extend({ loading: null, versionCheck: null, dashboardFetchedAt: null, - exceptionController: Ember.inject.controller('exception'), + exceptionController: Ember.inject.controller("exception"), fetchDashboard() { - if (!this.get('dashboardFetchedAt') || moment().subtract(30, 'minutes').toDate() > this.get('dashboardFetchedAt')) { - this.set('loading', true); - AdminDashboard.find().then(d => { - this.set('dashboardFetchedAt', new Date()); + if ( + !this.get("dashboardFetchedAt") || + moment() + .subtract(30, "minutes") + .toDate() > this.get("dashboardFetchedAt") + ) { + this.set("loading", true); + AdminDashboard.find() + .then(d => { + this.set("dashboardFetchedAt", new Date()); - REPORTS.forEach(name => this.set(name, d[name].map(r => Report.create(r)))); + REPORTS.forEach(name => + this.set(name, d[name].map(r => Report.create(r))) + ); - const topReferrers = d.top_referrers; - if (topReferrers && topReferrers.data) { - d.top_referrers.data = topReferrers.data.map(user => AdminUser.create(user)); - this.set('top_referrers', topReferrers); - } + const topReferrers = d.top_referrers; + if (topReferrers && topReferrers.data) { + d.top_referrers.data = topReferrers.data.map(user => + AdminUser.create(user) + ); + this.set("top_referrers", topReferrers); + } - ATTRIBUTES.forEach(a => this.set(a, d[a])); - }).catch(e => { - this.get('exceptionController').set('thrown', e.jqXHR); - this.replaceRoute('exception'); - }).finally(() => { - this.set('loading', false); - }); + ATTRIBUTES.forEach(a => this.set(a, d[a])); + }) + .catch(e => { + this.get("exceptionController").set("thrown", e.jqXHR); + this.replaceRoute("exception"); + }) + .finally(() => { + this.set("loading", false); + }); } }, - - @computed('updated_at') + @computed("updated_at") updatedTimestamp(updatedAt) { - return moment(updatedAt).format('LLL'); + return moment(updatedAt).format("LLL"); }, actions: { @@ -52,5 +76,4 @@ export default Ember.Controller.extend({ this.set("showTrafficReport", true); } } - }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-bounced.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-bounced.js.es6 index ae75d18715..c2ec582af2 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-bounced.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-bounced.js.es6 @@ -1,9 +1,9 @@ -import AdminEmailLogsController from 'admin/controllers/admin-email-logs'; -import debounce from 'discourse/lib/debounce'; -import EmailLog from 'admin/models/email-log'; +import AdminEmailLogsController from "admin/controllers/admin-email-logs"; +import debounce from "discourse/lib/debounce"; +import EmailLog from "admin/models/email-log"; export default AdminEmailLogsController.extend({ filterEmailLogs: debounce(function() { EmailLog.findAll(this.get("filter")).then(logs => this.set("model", logs)); - }, 250).observes("filter.{user,address,type,skipped_reason}") + }, 250).observes("filter.{user,address,type}") }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-incomings.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-incomings.js.es6 index a6acd9af78..9dc59589fb 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-incomings.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-incomings.js.es6 @@ -1,21 +1,25 @@ -import IncomingEmail from 'admin/models/incoming-email'; +import IncomingEmail from "admin/models/incoming-email"; export default Ember.Controller.extend({ loading: false, actions: { - loadMore() { - if (this.get("loading") || this.get("model.allLoaded")) { return; } - this.set('loading', true); + if (this.get("loading") || this.get("model.allLoaded")) { + return; + } + this.set("loading", true); IncomingEmail.findAll(this.get("filter"), this.get("model.length")) - .then(incoming => { - if (incoming.length < 50) { this.get("model").set("allLoaded", true); } - this.get("model").addObjects(incoming); - }).finally(() => { - this.set('loading', false); - }); + .then(incoming => { + if (incoming.length < 50) { + this.get("model").set("allLoaded", true); + } + this.get("model").addObjects(incoming); + }) + .finally(() => { + this.set("loading", false); + }); } } }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-index.js.es6 index fce0cb891e..1bab3fe297 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-index.js.es6 @@ -1,12 +1,11 @@ -import { ajax } from 'discourse/lib/ajax'; +import { ajax } from "discourse/lib/ajax"; export default Ember.Controller.extend({ - /** Is the "send test email" button disabled? @property sendTestEmailDisabled **/ - sendTestEmailDisabled: Em.computed.empty('testEmailAddress'), + sendTestEmailDisabled: Em.computed.empty("testEmailAddress"), /** Clears the 'sentTestEmail' property on successful send. @@ -14,8 +13,8 @@ export default Ember.Controller.extend({ @method testEmailAddressChanged **/ testEmailAddressChanged: function() { - this.set('sentTestEmail', false); - }.observes('testEmailAddress'), + this.set("sentTestEmail", false); + }.observes("testEmailAddress"), actions: { /** @@ -29,23 +28,25 @@ export default Ember.Controller.extend({ sentTestEmail: false }); - var self = this; ajax("/admin/email/test", { - type: 'POST', - data: { email_address: this.get('testEmailAddress') } - }).then(function () { - self.set('sentTestEmail', true); - }, function(e) { - if (e.responseJSON && e.responseJSON.errors) { - bootbox.alert(I18n.t('admin.email.error', { server_error: e.responseJSON.errors[0] })); - } else { - bootbox.alert(I18n.t('admin.email.test_error')); - } - }).finally(function() { - self.set('sendingEmail', false); - }); - + type: "POST", + data: { email_address: this.get("testEmailAddress") } + }) + .then(response => + this.set("sentTestEmailMessage", response.send_test_email_message) + ) + .catch(e => { + if (e.responseJSON && e.responseJSON.errors) { + bootbox.alert( + I18n.t("admin.email.error", { + server_error: e.responseJSON.errors[0] + }) + ); + } else { + bootbox.alert(I18n.t("admin.email.test_error")); + } + }) + .finally(() => this.set("sendingEmail", false)); } } - }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-logs.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-logs.js.es6 index 44a38dfa32..a86ae42111 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-logs.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-logs.js.es6 @@ -1,20 +1,25 @@ -import EmailLog from 'admin/models/email-log'; +import EmailLog from "admin/models/email-log"; export default Ember.Controller.extend({ loading: false, actions: { loadMore() { - if (this.get("loading") || this.get("model.allLoaded")) { return; } + if (this.get("loading") || this.get("model.allLoaded")) { + return; + } - this.set('loading', true); + this.set("loading", true); return EmailLog.findAll(this.get("filter"), this.get("model.length")) - .then(logs => { - if (logs.length < 50) { this.get("model").set("allLoaded", true); } - this.get("model").addObjects(logs); - }).finally(() => { - this.set('loading', false); - }); + .then(logs => { + if (logs.length < 50) { + this.get("model").set("allLoaded", true); + } + this.get("model").addObjects(logs); + }) + .finally(() => { + this.set("loading", false); + }); } } }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 index eb03301c92..9517a3f9a7 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 @@ -1,52 +1,60 @@ -import EmailPreview from 'admin/models/email-preview'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import EmailPreview from "admin/models/email-preview"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Ember.Controller.extend({ username: null, lastSeen: null, - emailEmpty: Ember.computed.empty('email'), - sendEmailDisabled: Ember.computed.or('emailEmpty', 'sendingEmail'), - showSendEmailForm: Ember.computed.notEmpty('model.html_content'), - htmlEmpty: Ember.computed.empty('model.html_content'), + emailEmpty: Ember.computed.empty("email"), + sendEmailDisabled: Ember.computed.or("emailEmpty", "sendingEmail"), + showSendEmailForm: Ember.computed.notEmpty("model.html_content"), + htmlEmpty: Ember.computed.empty("model.html_content"), actions: { refresh() { - const model = this.get('model'); + const model = this.get("model"); - this.set('loading', true); - this.set('sentEmail', false); + this.set("loading", true); + this.set("sentEmail", false); - let username = this.get('username'); + let username = this.get("username"); if (!username) { - username = this.currentUser.get('username'); - this.set('username', username); + username = this.currentUser.get("username"); + this.set("username", username); } - EmailPreview.findDigest(username, this.get('lastSeen')).then(email => { - model.setProperties(email.getProperties('html_content', 'text_content')); - this.set('loading', false); + EmailPreview.findDigest(username, this.get("lastSeen")).then(email => { + model.setProperties( + email.getProperties("html_content", "text_content") + ); + this.set("loading", false); }); }, toggleShowHtml() { - this.toggleProperty('showHtml'); + this.toggleProperty("showHtml"); }, sendEmail() { - this.set('sendingEmail', true); - this.set('sentEmail', false); + this.set("sendingEmail", true); + this.set("sentEmail", false); - EmailPreview.sendDigest(this.get('username'), this.get('lastSeen'), this.get('email')).then(result => { - if (result.errors) { - bootbox.alert(result.errors); - } else { - this.set('sentEmail', true); - } - }).catch(popupAjaxError).finally(() => { - this.set('sendingEmail', false); - }); + EmailPreview.sendDigest( + this.get("username"), + this.get("lastSeen"), + this.get("email") + ) + .then(result => { + if (result.errors) { + bootbox.alert(result.errors); + } else { + this.set("sentEmail", true); + } + }) + .catch(popupAjaxError) + .finally(() => { + this.set("sendingEmail", false); + }); } } - }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-received.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-received.js.es6 index 69ebd5e4c4..a5f240fdbf 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-received.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-received.js.es6 @@ -1,9 +1,11 @@ -import AdminEmailIncomingsController from 'admin/controllers/admin-email-incomings'; -import debounce from 'discourse/lib/debounce'; -import IncomingEmail from 'admin/models/incoming-email'; +import AdminEmailIncomingsController from "admin/controllers/admin-email-incomings"; +import debounce from "discourse/lib/debounce"; +import IncomingEmail from "admin/models/incoming-email"; export default AdminEmailIncomingsController.extend({ filterIncomingEmails: debounce(function() { - IncomingEmail.findAll(this.get("filter")).then(incomings => this.set("model", incomings)); + IncomingEmail.findAll(this.get("filter")).then(incomings => + this.set("model", incomings) + ); }, 250).observes("filter.{from,to,subject}") }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-rejected.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-rejected.js.es6 index 317a669cd0..b9341dd7e3 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-rejected.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-rejected.js.es6 @@ -1,9 +1,11 @@ -import AdminEmailIncomingsController from 'admin/controllers/admin-email-incomings'; -import debounce from 'discourse/lib/debounce'; -import IncomingEmail from 'admin/models/incoming-email'; +import AdminEmailIncomingsController from "admin/controllers/admin-email-incomings"; +import debounce from "discourse/lib/debounce"; +import IncomingEmail from "admin/models/incoming-email"; export default AdminEmailIncomingsController.extend({ filterIncomingEmails: debounce(function() { - IncomingEmail.findAll(this.get("filter")).then(incomings => this.set("model", incomings)); + IncomingEmail.findAll(this.get("filter")).then(incomings => + this.set("model", incomings) + ); }, 250).observes("filter.{from,to,subject,error}") }); diff --git a/app/assets/javascripts/admin/controllers/admin-email-sent.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-sent.js.es6 index d73d640adc..691b017c6f 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-sent.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-sent.js.es6 @@ -1,6 +1,6 @@ -import AdminEmailLogsController from 'admin/controllers/admin-email-logs'; -import debounce from 'discourse/lib/debounce'; -import EmailLog from 'admin/models/email-log'; +import AdminEmailLogsController from "admin/controllers/admin-email-logs"; +import debounce from "discourse/lib/debounce"; +import EmailLog from "admin/models/email-log"; export default AdminEmailLogsController.extend({ filterEmailLogs: debounce(function() { diff --git a/app/assets/javascripts/admin/controllers/admin-email-skipped.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-skipped.js.es6 index ae75d18715..c2ec582af2 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-skipped.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-skipped.js.es6 @@ -1,9 +1,9 @@ -import AdminEmailLogsController from 'admin/controllers/admin-email-logs'; -import debounce from 'discourse/lib/debounce'; -import EmailLog from 'admin/models/email-log'; +import AdminEmailLogsController from "admin/controllers/admin-email-logs"; +import debounce from "discourse/lib/debounce"; +import EmailLog from "admin/models/email-log"; export default AdminEmailLogsController.extend({ filterEmailLogs: debounce(function() { EmailLog.findAll(this.get("filter")).then(logs => this.set("model", logs)); - }, 250).observes("filter.{user,address,type,skipped_reason}") + }, 250).observes("filter.{user,address,type}") }); diff --git a/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 b/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 index 266aa6975e..33240955b5 100644 --- a/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 @@ -1,22 +1,20 @@ -import computed from 'ember-addons/ember-computed-decorators'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import computed from "ember-addons/ember-computed-decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Ember.Controller.extend({ saved: false, embedding: null, // show settings if we have at least one created host - @computed('embedding.embeddable_hosts.@each.isCreated') + @computed("embedding.embeddable_hosts.@each.isCreated") showSecondary() { - const hosts = this.get('embedding.embeddable_hosts'); - return hosts.length && hosts.findBy('isCreated'); + const hosts = this.get("embedding.embeddable_hosts"); + return hosts.length && hosts.findBy("isCreated"); }, - @computed('embedding.base_url') + @computed("embedding.base_url") embeddingCode(baseUrl) { - - const html = -`
+ const html = `
COMPILED @@ -82,7 +97,9 @@ COMPILED node.replace < (function() { + if ('Em' in window) { Ember.TEMPLATES[#{name.inspect}] = #{template}; + } })(); COMPILED @@ -221,8 +238,8 @@ COMPILED Stylesheet::Manager.clear_theme_cache! if self.name.include?("scss") # TODO message for mobile vs desktop - MessageBus.publish "/header-change/#{theme.key}", self.value if theme && self.name == "header" - MessageBus.publish "/footer-change/#{theme.key}", self.value if theme && self.name == "footer" + MessageBus.publish "/header-change/#{theme.id}", self.value if theme && self.name == "header" + MessageBus.publish "/footer-change/#{theme.id}", self.value if theme && self.name == "footer" end end diff --git a/app/models/theme_setting.rb b/app/models/theme_setting.rb index 782d214864..4134d4cb10 100644 --- a/app/models/theme_setting.rb +++ b/app/models/theme_setting.rb @@ -56,7 +56,7 @@ end # # Table name: theme_settings # -# id :integer not null, primary key +# id :bigint(8) not null, primary key # name :string(255) not null # data_type :integer not null # value :text diff --git a/app/models/top_topic.rb b/app/models/top_topic.rb index 709148167c..58703023b4 100644 --- a/app/models/top_topic.rb +++ b/app/models/top_topic.rb @@ -59,7 +59,7 @@ class TopTopic < ActiveRecord::Base end def self.remove_invisible_topics - exec_sql("WITH category_definition_topic_ids AS ( + DB.exec("WITH category_definition_topic_ids AS ( SELECT COALESCE(topic_id, 0) AS id FROM categories ), invisible_topic_ids AS ( SELECT id @@ -76,7 +76,7 @@ class TopTopic < ActiveRecord::Base end def self.add_new_visible_topics - exec_sql("WITH category_definition_topic_ids AS ( + DB.exec("WITH category_definition_topic_ids AS ( SELECT COALESCE(topic_id, 0) AS id FROM categories ), visible_topics AS ( SELECT t.id @@ -167,7 +167,7 @@ class TopTopic < ActiveRecord::Base time_filter = "topics.created_at < :from" end - sql = <<-SQL + sql = <<~SQL WITH top AS ( SELECT CASE WHEN #{time_filter} THEN 0 @@ -197,7 +197,7 @@ class TopTopic < ActiveRecord::Base AND #{period}_score <> top.score SQL - exec_sql(sql, from: start_of(period)) + DB.exec(sql, from: start_of(period)) end def self.start_of(period) @@ -211,7 +211,7 @@ class TopTopic < ActiveRecord::Base end def self.update_top_topics(period, sort, inner_join) - exec_sql("UPDATE top_topics + DB.exec("UPDATE top_topics SET #{period}_#{sort}_count = c.count FROM top_topics tt INNER JOIN (#{inner_join}) c ON tt.topic_id = c.topic_id diff --git a/app/models/topic.rb b/app/models/topic.rb index 78cc39584e..c0bbb02163 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -13,6 +13,9 @@ require_dependency 'topic_posters_summary' require_dependency 'topic_featured_users' class Topic < ActiveRecord::Base + # TODO remove 01-01-2019 + self.ignored_columns = ["percent_rank", "vote_count"] + class UserExists < StandardError; end include ActionView::Helpers::SanitizeHelper include RateLimiter::OnCreateRecord @@ -41,10 +44,6 @@ class Topic < ActiveRecord::Base end end - def self.max_sort_order - @max_sort_order ||= (2**31) - 1 - end - def self.max_fancy_title_length 400 end @@ -191,6 +190,17 @@ class Topic < ActiveRecord::Base where("topics.category_id IS NULL OR topics.category_id IN (SELECT id FROM categories WHERE #{condition[0]})", condition[1]) } + IN_CATEGORY_AND_SUBCATEGORIES_SQL = <<~SQL + t.category_id = :category_id + OR t.category_id IN (SELECT id FROM categories WHERE categories.parent_category_id = :category_id) + SQL + + scope :in_category_and_subcategories, lambda { |category_id| + where("topics.category_id = ? OR topics.category_id IN (SELECT id FROM categories WHERE categories.parent_category_id = ?)", + category_id, + category_id) if category_id + } + scope :with_subtype, ->(subtype) { where('topics.subtype = ?', subtype) } attr_accessor :ignore_category_auto_close @@ -278,7 +288,7 @@ class Topic < ActiveRecord::Base def ensure_topic_has_a_category if category_id.nil? && (archetype.nil? || self.regular?) - self.category_id = SiteSetting.uncategorized_category_id + self.category_id = category&.id || SiteSetting.uncategorized_category_id end end @@ -352,7 +362,7 @@ class Topic < ActiveRecord::Base if !new_record? && !Discourse.readonly_mode? # make sure data is set in table, this also allows us to change algorithm # by simply nulling this column - exec_sql("UPDATE topics SET fancy_title = :fancy_title where id = :id", id: self.id, fancy_title: fancy_title) + DB.exec("UPDATE topics SET fancy_title = :fancy_title where id = :id", id: self.id, fancy_title: fancy_title) end end @@ -522,130 +532,140 @@ class Topic < ActiveRecord::Base # Atomically creates the next post number def self.next_post_number(topic_id, reply = false, whisper = false) - highest = exec_sql("SELECT coalesce(max(post_number),0) AS max FROM posts WHERE topic_id = ?", topic_id).first['max'].to_i + highest = DB.query_single("SELECT coalesce(max(post_number),0) AS max FROM posts WHERE topic_id = ?", topic_id).first.to_i if whisper - result = exec_sql("UPDATE topics - SET highest_staff_post_number = ? + 1 - WHERE id = ? - RETURNING highest_staff_post_number", highest, topic_id) + result = DB.query_single(<<~SQL, highest, topic_id) + UPDATE topics + SET highest_staff_post_number = ? + 1 + WHERE id = ? + RETURNING highest_staff_post_number + SQL - result.first['highest_staff_post_number'].to_i + result.first.to_i else reply_sql = reply ? ", reply_count = reply_count + 1" : "" - result = exec_sql("UPDATE topics - SET highest_staff_post_number = :highest + 1, - highest_post_number = :highest + 1#{reply_sql}, - posts_count = posts_count + 1 - WHERE id = :topic_id - RETURNING highest_post_number", highest: highest, topic_id: topic_id) + result = DB.query_single(<<~SQL, highest: highest, topic_id: topic_id) + UPDATE topics + SET highest_staff_post_number = :highest + 1, + highest_post_number = :highest + 1#{reply_sql}, + posts_count = posts_count + 1 + WHERE id = :topic_id + RETURNING highest_post_number + SQL - result.first['highest_post_number'].to_i + result.first.to_i end end def self.reset_all_highest! - exec_sql < 4 - GROUP BY topic_id -) -UPDATE topics -SET - highest_staff_post_number = X.highest_post_number, - highest_post_number = Y.highest_post_number, - last_posted_at = Y.last_posted_at, - posts_count = Y.posts_count -FROM X, Y -WHERE - X.topic_id = topics.id AND - Y.topic_id = topics.id AND ( - topics.highest_staff_post_number <> X.highest_post_number OR - topics.highest_post_number <> Y.highest_post_number OR - topics.last_posted_at <> Y.last_posted_at OR - topics.posts_count <> Y.posts_count - ) -SQL + DB.exec <<~SQL + WITH + X as ( + SELECT topic_id, + COALESCE(MAX(post_number), 0) highest_post_number + FROM posts + WHERE deleted_at IS NULL + GROUP BY topic_id + ), + Y as ( + SELECT topic_id, + coalesce(MAX(post_number), 0) highest_post_number, + count(*) posts_count, + max(created_at) last_posted_at + FROM posts + WHERE deleted_at IS NULL AND post_type <> 4 + GROUP BY topic_id + ) + UPDATE topics + SET + highest_staff_post_number = X.highest_post_number, + highest_post_number = Y.highest_post_number, + last_posted_at = Y.last_posted_at, + posts_count = Y.posts_count + FROM X, Y + WHERE + X.topic_id = topics.id AND + Y.topic_id = topics.id AND ( + topics.highest_staff_post_number <> X.highest_post_number OR + topics.highest_post_number <> Y.highest_post_number OR + topics.last_posted_at <> Y.last_posted_at OR + topics.posts_count <> Y.posts_count + ) + SQL end # If a post is deleted we have to update our highest post counters def self.reset_highest(topic_id) - result = exec_sql "UPDATE topics - SET - highest_staff_post_number = ( - SELECT COALESCE(MAX(post_number), 0) FROM posts - WHERE topic_id = :topic_id AND - deleted_at IS NULL - ), - highest_post_number = ( - SELECT COALESCE(MAX(post_number), 0) FROM posts - WHERE topic_id = :topic_id AND - deleted_at IS NULL AND - post_type <> 4 - ), - posts_count = ( - SELECT count(*) FROM posts - WHERE deleted_at IS NULL AND - topic_id = :topic_id AND - post_type <> 4 - ), + result = DB.query_single(<<~SQL, topic_id: topic_id) + UPDATE topics + SET + highest_staff_post_number = ( + SELECT COALESCE(MAX(post_number), 0) FROM posts + WHERE topic_id = :topic_id AND + deleted_at IS NULL + ), + highest_post_number = ( + SELECT COALESCE(MAX(post_number), 0) FROM posts + WHERE topic_id = :topic_id AND + deleted_at IS NULL AND + post_type <> 4 + ), + posts_count = ( + SELECT count(*) FROM posts + WHERE deleted_at IS NULL AND + topic_id = :topic_id AND + post_type <> 4 + ), - last_posted_at = ( - SELECT MAX(created_at) FROM posts - WHERE topic_id = :topic_id AND - deleted_at IS NULL AND - post_type <> 4 - ) - WHERE id = :topic_id - RETURNING highest_post_number", topic_id: topic_id + last_posted_at = ( + SELECT MAX(created_at) FROM posts + WHERE topic_id = :topic_id AND + deleted_at IS NULL AND + post_type <> 4 + ) + WHERE id = :topic_id + RETURNING highest_post_number + SQL - highest_post_number = result.first['highest_post_number'].to_i + highest_post_number = result.first.to_i # Update the forum topic user records - exec_sql "UPDATE topic_users - SET last_read_post_number = CASE - WHEN last_read_post_number > :highest THEN :highest - ELSE last_read_post_number - END, - highest_seen_post_number = CASE - WHEN highest_seen_post_number > :highest THEN :highest - ELSE highest_seen_post_number - END - WHERE topic_id = :topic_id", - highest: highest_post_number, - topic_id: topic_id + DB.exec(<<~SQL, highest: highest_post_number, topic_id: topic_id) + UPDATE topic_users + SET last_read_post_number = CASE + WHEN last_read_post_number > :highest THEN :highest + ELSE last_read_post_number + END, + highest_seen_post_number = CASE + WHEN highest_seen_post_number > :highest THEN :highest + ELSE highest_seen_post_number + END + WHERE topic_id = :topic_id + SQL end # This calculates the geometric mean of the posts and stores it with the topic def self.calculate_avg_time(min_topic_age = nil) - builder = SqlBuilder.new("UPDATE topics - SET avg_time = x.gmean - FROM (SELECT topic_id, - round(exp(avg(ln(avg_time)))) AS gmean - FROM posts - WHERE avg_time > 0 AND avg_time IS NOT NULL - GROUP BY topic_id) AS x - /*where*/") + builder = DB.build <<~SQL + UPDATE topics + SET avg_time = x.gmean + FROM (SELECT topic_id, + round(exp(avg(ln(avg_time)))) AS gmean + FROM posts + WHERE avg_time > 0 AND avg_time IS NOT NULL + GROUP BY topic_id) AS x + /*where*/ + SQL - builder.where("x.topic_id = topics.id AND - (topics.avg_time <> x.gmean OR topics.avg_time IS NULL)") + builder.where <<~SQL + x.topic_id = topics.id AND + (topics.avg_time <> x.gmean OR topics.avg_time IS NULL) + SQL if min_topic_age builder.where("topics.bumped_at > :bumped_at", bumped_at: min_topic_age) @@ -655,14 +675,14 @@ SQL end def changed_to_category(new_category) - return true if new_category.blank? || Category.find_by(topic_id: id).present? + return true if new_category.blank? || Category.exists?(topic_id: id) return false if new_category.id == SiteSetting.uncategorized_category_id && !SiteSetting.allow_uncategorized_topics Topic.transaction do old_category = category if self.category_id != new_category.id - self.update!(category_id: new_category.id) + self.update_attribute(:category_id, new_category.id) if old_category Category @@ -677,7 +697,9 @@ SQL if post = self.ordered_posts.first notified_user_ids = [post.user_id, post.last_editor_id].uniq - Jobs.enqueue(:notify_category_change, post_id: post.id, notified_user_ids: notified_user_ids) + DB.after_commit do + Jobs.enqueue(:notify_category_change, post_id: post.id, notified_user_ids: notified_user_ids) + end end end @@ -689,10 +711,16 @@ SQL true end - def add_small_action(user, action_code, who = nil) + def add_small_action(user, action_code, who = nil, opts = {}) custom_fields = {} custom_fields["action_code_who"] = who if who.present? - add_moderator_post(user, nil, post_type: Post.types[:small_action], action_code: action_code, custom_fields: custom_fields) + opts = opts.merge( + post_type: Post.types[:small_action], + action_code: action_code, + custom_fields: custom_fields + ) + + add_moderator_post(user, nil, opts) end def add_moderator_post(user, text, opts = nil) @@ -773,6 +801,11 @@ SQL false end + def reached_recipients_limit? + return false unless private_message? + topic_allowed_users.count + topic_allowed_groups.count >= SiteSetting.max_allowed_message_recipients + end + def invite_group(user, group) TopicAllowedGroup.create!(topic_id: id, group_id: group.id) @@ -900,9 +933,16 @@ SQL post_mover = PostMover.new(self, moved_by, post_ids) if opts[:destination_topic_id] - post_mover.to_topic opts[:destination_topic_id] + topic = post_mover.to_topic(opts[:destination_topic_id]) + + DiscourseEvent.trigger(:topic_merged, + post_mover.original_topic, + post_mover.destination_topic + ) + + topic elsif opts[:title] - post_mover.to_new_topic(opts[:title], opts[:category_id]) + post_mover.to_new_topic(opts[:title], opts[:category_id], opts[:tags]) end end @@ -1179,30 +1219,30 @@ SQL # OR if you have it archived as a user explicitly sql = <<~SQL - SELECT 1 - WHERE - ( - SELECT count(*) FROM topic_allowed_groups tg - JOIN group_archived_messages gm - ON gm.topic_id = tg.topic_id AND - gm.group_id = tg.group_id - WHERE tg.group_id IN (SELECT g.group_id FROM group_users g WHERE g.user_id = :user_id) - AND tg.topic_id = :topic_id - ) = - ( - SELECT case when count(*) = 0 then -1 else count(*) end FROM topic_allowed_groups tg - WHERE tg.group_id IN (SELECT g.group_id FROM group_users g WHERE g.user_id = :user_id) - AND tg.topic_id = :topic_id - ) + SELECT 1 + WHERE + ( + SELECT count(*) FROM topic_allowed_groups tg + JOIN group_archived_messages gm + ON gm.topic_id = tg.topic_id AND + gm.group_id = tg.group_id + WHERE tg.group_id IN (SELECT g.group_id FROM group_users g WHERE g.user_id = :user_id) + AND tg.topic_id = :topic_id + ) = + ( + SELECT case when count(*) = 0 then -1 else count(*) end FROM topic_allowed_groups tg + WHERE tg.group_id IN (SELECT g.group_id FROM group_users g WHERE g.user_id = :user_id) + AND tg.topic_id = :topic_id + ) - UNION ALL + UNION ALL - SELECT 1 FROM topic_allowed_users tu - JOIN user_archived_messages um ON um.user_id = tu.user_id AND um.topic_id = tu.topic_id - WHERE tu.user_id = :user_id AND tu.topic_id = :topic_id -SQL + SELECT 1 FROM topic_allowed_users tu + JOIN user_archived_messages um ON um.user_id = tu.user_id AND um.topic_id = tu.topic_id + WHERE tu.user_id = :user_id AND tu.topic_id = :topic_id + SQL - User.exec_sql(sql, user_id: user.id, topic_id: id).to_a.length > 0 + DB.exec(sql, user_id: user.id, topic_id: id) > 0 end TIME_TO_FIRST_RESPONSE_SQL ||= <<-SQL @@ -1231,10 +1271,10 @@ SQL def self.time_to_first_response(sql, opts = nil) opts ||= {} - builder = SqlBuilder.new(sql) + builder = DB.build(sql) builder.where("t.created_at >= :start_date", start_date: opts[:start_date]) if opts[:start_date] builder.where("t.created_at < :end_date", end_date: opts[:end_date]) if opts[:end_date] - builder.where("t.category_id = :category_id", category_id: opts[:category_id]) if opts[:category_id] + builder.where(IN_CATEGORY_AND_SUBCATEGORIES_SQL, category_id: opts[:category_id]) if opts[:category_id] builder.where("t.archetype <> '#{Archetype.private_message}'") builder.where("t.deleted_at IS NULL") builder.where("p.deleted_at IS NULL") @@ -1243,7 +1283,7 @@ SQL builder.where("p.user_id in (:user_ids)", user_ids: opts[:user_ids]) if opts[:user_ids] builder.where("p.post_type = :post_type", post_type: Post.types[:regular]) builder.where("EXTRACT(EPOCH FROM p.created_at - t.created_at) > 0") - builder.exec + builder.query_hash end def self.time_to_first_response_per_day(start_date, end_date, opts = {}) @@ -1270,13 +1310,13 @@ SQL SQL def self.with_no_response_per_day(start_date, end_date, category_id = nil) - builder = SqlBuilder.new(WITH_NO_RESPONSE_SQL) + builder = DB.build(WITH_NO_RESPONSE_SQL) builder.where("t.created_at >= :start_date", start_date: start_date) if start_date builder.where("t.created_at < :end_date", end_date: end_date) if end_date - builder.where("t.category_id = :category_id", category_id: category_id) if category_id + builder.where(IN_CATEGORY_AND_SUBCATEGORIES_SQL, category_id: category_id) if category_id builder.where("t.archetype <> '#{Archetype.private_message}'") builder.where("t.deleted_at IS NULL") - builder.exec + builder.query_hash end WITH_NO_RESPONSE_TOTAL_SQL ||= <<-SQL @@ -1292,11 +1332,11 @@ SQL SQL def self.with_no_response_total(opts = {}) - builder = SqlBuilder.new(WITH_NO_RESPONSE_TOTAL_SQL) - builder.where("t.category_id = :category_id", category_id: opts[:category_id]) if opts[:category_id] + builder = DB.build(WITH_NO_RESPONSE_TOTAL_SQL) + builder.where(IN_CATEGORY_AND_SUBCATEGORIES_SQL, category_id: opts[:category_id]) if opts[:category_id] builder.where("t.archetype <> '#{Archetype.private_message}'") builder.where("t.deleted_at IS NULL") - builder.exec.first["count"].to_i + builder.query_single.first.to_i end def convert_to_public_topic(user) @@ -1325,8 +1365,8 @@ SQL ) = 1 SQL - result = Topic.exec_sql(sql, private_message: Archetype.private_message, topic_id: self.id) - result.ntuples != 0 + result = DB.exec(sql, private_message: Archetype.private_message, topic_id: self.id) + result != 0 end def featured_link_root_domain @@ -1334,13 +1374,28 @@ SQL end def self.private_message_topics_count_per_day(start_date, end_date, topic_subtype) - private_messages.with_subtype(topic_subtype).where('topics.created_at >= ? AND topics.created_at <= ?', start_date, end_date).group('date(topics.created_at)').order('date(topics.created_at)').count + private_messages + .with_subtype(topic_subtype) + .where('topics.created_at >= ? AND topics.created_at <= ?', start_date, end_date) + .group('date(topics.created_at)') + .order('date(topics.created_at)') + .count end def is_category_topic? @is_category_topic ||= Category.exists?(topic_id: self.id.to_i) end + def reset_bumped_at + post = ordered_posts.where( + user_deleted: false, + hidden: false, + post_type: Topic.visible_post_types + ).last + + update!(bumped_at: post.created_at) + end + private def update_category_topic_count_by(num) @@ -1411,14 +1466,12 @@ end # archived :boolean default(FALSE), not null # bumped_at :datetime not null # has_summary :boolean default(FALSE), not null -# vote_count :integer default(0), not null # archetype :string default("regular"), not null # featured_user4_id :integer # notify_moderators_count :integer default(0), not null # spam_count :integer default(0), not null # pinned_at :datetime # score :float -# percent_rank :float default(1.0), not null # subtype :string # slug :string # deleted_by_id :integer @@ -1434,12 +1487,12 @@ end # Indexes # # idx_topics_front_page (deleted_at,visible,archetype,category_id,id) -# idx_topics_user_id_deleted_at (user_id) -# idxtopicslug (slug) +# idx_topics_user_id_deleted_at (user_id) WHERE (deleted_at IS NULL) +# idxtopicslug (slug) WHERE ((deleted_at IS NULL) AND (slug IS NOT NULL)) # index_topics_on_bumped_at (bumped_at) -# index_topics_on_created_at_and_visible (created_at,visible) +# index_topics_on_created_at_and_visible (created_at,visible) WHERE ((deleted_at IS NULL) AND ((archetype)::text <> 'private_message'::text)) # index_topics_on_id_and_deleted_at (id,deleted_at) # index_topics_on_lower_title (lower((title)::text)) -# index_topics_on_pinned_at (pinned_at) -# index_topics_on_pinned_globally (pinned_globally) +# index_topics_on_pinned_at (pinned_at) WHERE (pinned_at IS NOT NULL) +# index_topics_on_pinned_globally (pinned_globally) WHERE pinned_globally # diff --git a/app/models/topic_custom_field.rb b/app/models/topic_custom_field.rb index 5dd6e53c73..e539bb90f6 100644 --- a/app/models/topic_custom_field.rb +++ b/app/models/topic_custom_field.rb @@ -16,5 +16,5 @@ end # Indexes # # index_topic_custom_fields_on_topic_id_and_name (topic_id,name) -# topic_custom_fields_value_key_idx (value,name) +# topic_custom_fields_value_key_idx (value,name) WHERE ((value IS NOT NULL) AND (char_length(value) < 400)) # diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index 42d078e003..9284c41a76 100644 --- a/app/models/topic_embed.rb +++ b/app/models/topic_embed.rb @@ -71,16 +71,30 @@ class TopicEmbed < ActiveRecord::Base else absolutize_urls(url, contents) post = embed.post - # Update the topic if it changed - if post && post.topic && content_sha1 != embed.content_sha1 - post_revision_args = { - raw: absolutize_urls(url, contents), - user_id: user.id, - title: title, - } - post.revise(user, post_revision_args, skip_validations: true, bypass_rate_limiter: true) - embed.update_column(:content_sha1, content_sha1) + # Update the topic if it changed + if post&.topic + if post.user != user + PostOwnerChanger.new( + post_ids: [post.id], + topic_id: post.topic_id, + new_owner: user, + acting_user: Discourse.system_user + ).change_owner! + + # make sure the post returned has the right author + post.reload + end + + if content_sha1 != embed.content_sha1 + post.revise( + user, + { raw: absolutize_urls(url, contents) }, + skip_validations: true, + bypass_rate_limiter: true + ) + embed.update!(content_sha1: content_sha1) + end end end @@ -139,7 +153,7 @@ class TopicEmbed < ActiveRecord::Base uri.host = original_uri.host node[url_param] = uri.to_s end - rescue URI::InvalidURIError, URI::InvalidComponentError + rescue URI::Error # If there is a mistyped URL, just do nothing end end diff --git a/app/models/topic_featured_users.rb b/app/models/topic_featured_users.rb index d3f705149b..7b442423b2 100644 --- a/app/models/topic_featured_users.rb +++ b/app/models/topic_featured_users.rb @@ -79,13 +79,13 @@ WHERE tt.id = tt2.id AND #{filter2} SQL - Topic.exec_sql(sql) + DB.exec(sql) end private - def update_participant_count - count = topic.posts.where('NOT hidden AND post_type in (?)', Topic.visible_post_types).count('distinct user_id') - topic.update_columns(participant_count: count) - end + def update_participant_count + count = topic.posts.where('NOT hidden AND post_type in (?)', Topic.visible_post_types).count('distinct user_id') + topic.update_columns(participant_count: count) + end end diff --git a/app/models/topic_link.rb b/app/models/topic_link.rb index 40fbcab801..22f8feeab7 100644 --- a/app/models/topic_link.rb +++ b/app/models/topic_link.rb @@ -38,7 +38,7 @@ class TopicLink < ActiveRecord::Base def self.topic_map(guardian, topic_id) # Sam: complicated reports are really hard in AR - builder = SqlBuilder.new <<-SQL + builder = DB.build <<-SQL SELECT ftl.url, COALESCE(ft.title, ftl.title) AS title, ftl.link_topic_id, @@ -61,19 +61,21 @@ SQL # note that ILIKE means "case insensitive LIKE" builder.where("NOT(ftl.url ILIKE '%.png' OR ftl.url ILIKE '%.jpg' OR ftl.url ILIKE '%.gif')") builder.where("COALESCE(ft.archetype, 'regular') <> :archetype", archetype: Archetype.private_message) + # do not show links with 0 click + builder.where("clicks > 0") builder.secure_category(guardian.secure_category_ids) - builder.exec.to_a + builder.query end def self.counts_for(guardian, topic, posts) return {} if posts.blank? - # Sam: I don't know how to write this cleanly in AR, - # in particular the securing logic is tricky and would fallback to SQL anyway - builder = SqlBuilder.new("SELECT + # Sam: this is not tidy in AR and also happens to be a critical path + # for topic view + builder = DB.build("SELECT l.post_id, l.url, l.clicks, @@ -91,10 +93,11 @@ SQL builder.where("COALESCE(t.archetype, 'regular') <> :archetype", archetype: Archetype.private_message) # not certain if pluck is right, cause it may interfere with caching - builder.where('l.post_id IN (:post_ids)', post_ids: posts.map(&:id)) + builder.where('l.post_id in (:post_ids)', post_ids: posts.map(&:id)) builder.secure_category(guardian.secure_category_ids) - builder.map_exec(OpenStruct).each_with_object({}) do |l, result| + result = {} + builder.query.each do |l| result[l.post_id] ||= [] result[l.post_id] << { url: l.url, clicks: l.clicks, @@ -102,6 +105,7 @@ SQL internal: l.internal, reflection: l.reflection } end + result end def self.extract_from(post) @@ -132,8 +136,10 @@ SQL topic_id = nil post_number = nil - if Discourse.store.has_been_uploaded?(url) + if upload = Upload.get_from_url(url) internal = Discourse.store.internal? + # Store the same URL that will be used in the cooked version of the post + url = UrlHelper.cook_url(upload.url) elsif route = Discourse.route_for(parsed) internal = true @@ -212,7 +218,7 @@ SQL end end - rescue URI::InvalidURIError + rescue URI::Error # if the URI is invalid, don't store it. rescue ActionController::RoutingError # If we can't find the route, no big deal diff --git a/app/models/topic_link_click.rb b/app/models/topic_link_click.rb index 422c974bfd..7ae52e6b09 100644 --- a/app/models/topic_link_click.rb +++ b/app/models/topic_link_click.rb @@ -17,7 +17,7 @@ class TopicLinkClick < ActiveRecord::Base uri = begin URI.parse(url) - rescue URI::InvalidURIError + rescue URI::Error end urls = Set.new @@ -47,7 +47,7 @@ class TopicLinkClick < ActiveRecord::Base if Discourse.asset_host.present? cdn_uri = begin URI.parse(Discourse.asset_host) - rescue URI::InvalidURIError + rescue URI::Error end if cdn_uri && cdn_uri.hostname == uri.hostname && uri.path.starts_with?(cdn_uri.path) @@ -59,7 +59,7 @@ class TopicLinkClick < ActiveRecord::Base if SiteSetting.Upload.s3_cdn_url.present? cdn_uri = begin URI.parse(SiteSetting.Upload.s3_cdn_url) - rescue URI::InvalidURIError + rescue URI::Error end if cdn_uri && cdn_uri.hostname == uri.hostname && uri.path.starts_with?(cdn_uri.path) diff --git a/app/models/topic_search_data.rb b/app/models/topic_search_data.rb index ddf065327b..7203a84709 100644 --- a/app/models/topic_search_data.rb +++ b/app/models/topic_search_data.rb @@ -14,5 +14,5 @@ end # # Indexes # -# idx_search_topic (search_data) +# idx_search_topic (search_data) USING gin # diff --git a/app/models/topic_timer.rb b/app/models/topic_timer.rb index 39f882dbaf..e884f33ade 100644 --- a/app/models/topic_timer.rb +++ b/app/models/topic_timer.rb @@ -83,66 +83,66 @@ class TopicTimer < ActiveRecord::Base private - def ensure_update_will_happen - if created_at && (execute_at < created_at) - errors.add(:execute_at, I18n.t( - 'activerecord.errors.models.topic_timer.attributes.execute_at.in_the_past' - )) - end + def ensure_update_will_happen + if created_at && (execute_at < created_at) + errors.add(:execute_at, I18n.t( + 'activerecord.errors.models.topic_timer.attributes.execute_at.in_the_past' + )) end + end - def cancel_auto_close_job - Jobs.cancel_scheduled_job(:toggle_topic_closed, topic_timer_id: id) - end - alias_method :cancel_auto_open_job, :cancel_auto_close_job + def cancel_auto_close_job + Jobs.cancel_scheduled_job(:toggle_topic_closed, topic_timer_id: id) + end + alias_method :cancel_auto_open_job, :cancel_auto_close_job - def cancel_auto_publish_to_category_job - Jobs.cancel_scheduled_job(:publish_topic_to_category, topic_timer_id: id) - end + def cancel_auto_publish_to_category_job + Jobs.cancel_scheduled_job(:publish_topic_to_category, topic_timer_id: id) + end - def cancel_auto_delete_job - Jobs.cancel_scheduled_job(:delete_topic, topic_timer_id: id) - end + def cancel_auto_delete_job + Jobs.cancel_scheduled_job(:delete_topic, topic_timer_id: id) + end - def cancel_auto_reminder_job - Jobs.cancel_scheduled_job(:topic_reminder, topic_timer_id: id) - end + def cancel_auto_reminder_job + Jobs.cancel_scheduled_job(:topic_reminder, topic_timer_id: id) + end - def schedule_auto_open_job(time) - return unless topic - topic.update_status('closed', true, user) if !topic.closed + def schedule_auto_open_job(time) + return unless topic + topic.update_status('closed', true, user) if !topic.closed - Jobs.enqueue_at(time, :toggle_topic_closed, - topic_timer_id: id, - state: false - ) - end + Jobs.enqueue_at(time, :toggle_topic_closed, + topic_timer_id: id, + state: false + ) + end - def schedule_auto_close_job(time) - return unless topic - topic.update_status('closed', false, user) if topic.closed + def schedule_auto_close_job(time) + return unless topic + topic.update_status('closed', false, user) if topic.closed - Jobs.enqueue_at(time, :toggle_topic_closed, - topic_timer_id: id, - state: true - ) - end + Jobs.enqueue_at(time, :toggle_topic_closed, + topic_timer_id: id, + state: true + ) + end - def schedule_auto_publish_to_category_job(time) - Jobs.enqueue_at(time, :publish_topic_to_category, topic_timer_id: id) - end + def schedule_auto_publish_to_category_job(time) + Jobs.enqueue_at(time, :publish_topic_to_category, topic_timer_id: id) + end - def publishing_to_category? - self.status_type.to_i == TopicTimer.types[:publish_to_category] - end + def publishing_to_category? + self.status_type.to_i == TopicTimer.types[:publish_to_category] + end - def schedule_auto_delete_job(time) - Jobs.enqueue_at(time, :delete_topic, topic_timer_id: id) - end + def schedule_auto_delete_job(time) + Jobs.enqueue_at(time, :delete_topic, topic_timer_id: id) + end - def schedule_auto_reminder_job(time) - Jobs.enqueue_at(time, :topic_reminder, topic_timer_id: id) - end + def schedule_auto_reminder_job(time) + Jobs.enqueue_at(time, :topic_reminder, topic_timer_id: id) + end end # == Schema Information @@ -164,6 +164,6 @@ end # # Indexes # -# idx_topic_id_public_type_deleted_at (topic_id) UNIQUE +# idx_topic_id_public_type_deleted_at (topic_id) UNIQUE WHERE ((public_type = true) AND (deleted_at IS NULL)) # index_topic_timers_on_user_id (user_id) # diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb index 61b3fab871..27965ecf4f 100644 --- a/app/models/topic_tracking_state.rb +++ b/app/models/topic_tracking_state.rb @@ -174,8 +174,12 @@ class TopicTrackingState sql << "\nUNION ALL\n\n" sql << report_raw_sql(topic_id: topic_id, skip_new: true, skip_order: true, staff: user.staff?) - SqlBuilder.new(sql) - .map_exec(TopicTrackingState, user_id: user.id, topic_id: topic_id, min_new_topic_date: Time.at(SiteSetting.min_new_topics_time).to_datetime) + DB.query( + sql, + user_id: user.id, + topic_id: topic_id, + min_new_topic_date: Time.at(SiteSetting.min_new_topics_time).to_datetime + ) end def self.report_raw_sql(opts = nil) @@ -288,11 +292,11 @@ SQL topic_id: topic.id } - channels.each do |channel, user_ids| + channels.each do |channel, ids| MessageBus.publish( channel, message.as_json, - user_ids: user_ids + user_ids: ids ) end end diff --git a/app/models/topic_user.rb b/app/models/topic_user.rb index a6cff083de..8122286406 100644 --- a/app/models/topic_user.rb +++ b/app/models/topic_user.rb @@ -40,7 +40,7 @@ class TopicUser < ActiveRecord::Base def auto_notification(user_id, topic_id, reason, notification_level) should_change = TopicUser .where(user_id: user_id, topic_id: topic_id) - .where("notifications_reason_id IS NULL OR (notification_level < :min AND notification_level > :max)", min: notification_level, max: notification_levels[:regular]) + .where("notifications_reason_id IS NULL OR (notification_level < :max AND notification_level > :min)", max: notification_level, min: notification_levels[:regular]) .exists? change(user_id, topic_id, notification_level: notification_level, notifications_reason_id: reason) if should_change @@ -53,26 +53,26 @@ class TopicUser < ActiveRecord::Base def unwatch_categories!(user, category_ids) track_threshold = user.user_option.auto_track_topics_after_msecs - sql = < :track_threshold AND :track_threshold >= 0 THEN :tracking - ELSE :regular - end - FROM topics t - WHERE t.id = tu.topic_id AND tu.notification_level <> :muted AND category_id IN (:category_ids) AND tu.user_id = :user_id -SQL + sql = <<~SQL + UPDATE topic_users tu + SET notification_level = CASE + WHEN t.user_id = :user_id THEN :watching + WHEN total_msecs_viewed > :track_threshold AND :track_threshold >= 0 THEN :tracking + ELSE :regular + end + FROM topics t + WHERE t.id = tu.topic_id AND tu.notification_level <> :muted AND category_id IN (:category_ids) AND tu.user_id = :user_id + SQL - exec_sql(sql, - watching: notification_levels[:watching], - tracking: notification_levels[:tracking], - regular: notification_levels[:regular], - muted: notification_levels[:muted], - category_ids: category_ids, - user_id: user.id, - track_threshold: track_threshold - ) + DB.exec(sql, + watching: notification_levels[:watching], + tracking: notification_levels[:tracking], + regular: notification_levels[:regular], + muted: notification_levels[:muted], + category_ids: category_ids, + user_id: user.id, + track_threshold: track_threshold + ) end # Find the information specific to a user in a forum topic @@ -243,7 +243,8 @@ SQL notification_level = case when tu.notifications_reason_id is null and (tu.total_msecs_viewed + :msecs) > coalesce(uo.auto_track_topics_after_msecs,:threshold) and - coalesce(uo.auto_track_topics_after_msecs, :threshold) >= 0 then + coalesce(uo.auto_track_topics_after_msecs, :threshold) >= 0 + and t.archetype = 'regular' then :tracking else tu.notification_level @@ -296,16 +297,15 @@ SQL # 86400000 = 1 day rows = if user.staff? - exec_sql(UPDATE_TOPIC_USER_SQL_STAFF, args).values + DB.query(UPDATE_TOPIC_USER_SQL_STAFF, args) else - exec_sql(UPDATE_TOPIC_USER_SQL, args).values + DB.query(UPDATE_TOPIC_USER_SQL, args) end if rows.length == 1 - before = rows[0][1].to_i - after = rows[0][0].to_i - - before_last_read = rows[0][2].to_i + before = rows[0].old_level.to_i + after = rows[0].notification_level.to_i + before_last_read = rows[0].last_read_post_number.to_i if before_last_read < post_number # The user read at least one new post @@ -333,9 +333,9 @@ SQL begin if user.staff? - exec_sql(INSERT_TOPIC_USER_SQL_STAFF, args) + DB.exec(INSERT_TOPIC_USER_SQL_STAFF, args) else - exec_sql(INSERT_TOPIC_USER_SQL, args) + DB.exec(INSERT_TOPIC_USER_SQL, args) end rescue PG::UniqueViolation # if record is inserted between two statements this can happen @@ -371,28 +371,28 @@ SQL return end - builder = SqlBuilder.new < LEAST(GREATEST(last_read, last_read_post_number), max_post_number) OR - highest_seen_post_number <> LEAST(max_post_number,GREATEST(t.highest_seen_post_number, last_read)) -) -SQL + builder.where <<~SQL + X.topic_id = t.topic_id AND + X.user_id = t.user_id AND + ( + last_read_post_number <> LEAST(GREATEST(last_read, last_read_post_number), max_post_number) OR + highest_seen_post_number <> LEAST(max_post_number,GREATEST(t.highest_seen_post_number, last_read)) + ) + SQL if topic_id builder.where("t.topic_id = :topic_id", topic_id: topic_id) diff --git a/app/models/topic_view_item.rb b/app/models/topic_view_item.rb index 04b231fa9b..9fbb9aa98a 100644 --- a/app/models/topic_view_item.rb +++ b/app/models/topic_view_item.rb @@ -7,7 +7,7 @@ class TopicViewItem < ActiveRecord::Base validates_presence_of :topic_id, :ip_address, :viewed_at def self.add(topic_id, ip, user_id = nil, at = nil, skip_redis = false) - # Only store a view once per day per thing per user per ip + # Only store a view once per day per thing per (user || ip) at ||= Date.today redis_key = "view:#{topic_id}:#{at}" if user_id @@ -28,19 +28,20 @@ class TopicViewItem < ActiveRecord::Base /*where*/ )" - builder = SqlBuilder.new(sql) + builder = DB.build(sql) if !user_id builder.where("ip_address = :ip_address AND topic_id = :topic_id AND user_id IS NULL") else builder.where("user_id = :user_id AND topic_id = :topic_id") + ip = nil # do not store IP of logged in users end result = builder.exec(topic_id: topic_id, ip_address: ip, viewed_at: at, user_id: user_id) Topic.where(id: topic_id).update_all 'views = views + 1' - if result.cmd_tuples > 0 + if result > 0 UserStat.where(user_id: user_id).update_all 'topics_entered = topics_entered + 1' if user_id end @@ -58,13 +59,12 @@ end # topic_id :integer not null # viewed_at :date not null # user_id :integer -# ip_address :inet not null +# ip_address :inet # # Indexes # # index_topic_views_on_topic_id_and_viewed_at (topic_id,viewed_at) # index_topic_views_on_user_id_and_viewed_at (user_id,viewed_at) # index_topic_views_on_viewed_at_and_topic_id (viewed_at,topic_id) -# ip_address_topic_id_topic_views (ip_address,topic_id) UNIQUE -# user_id_topic_id_topic_views (user_id,topic_id) UNIQUE +# uniq_ip_or_user_id_topic_views (user_id,ip_address,topic_id) UNIQUE # diff --git a/app/models/trust_level3_requirements.rb b/app/models/trust_level3_requirements.rb index ac63e5ae6a..7b85690508 100644 --- a/app/models/trust_level3_requirements.rb +++ b/app/models/trust_level3_requirements.rb @@ -122,7 +122,7 @@ class TrustLevel3Requirements AND uh.action IN (:silence_user, :unsilence_user, :suspend_user, :unsuspend_user) SQL - PenaltyCounts.new(UserHistory.exec_sql(sql, args).first) + PenaltyCounts.new(DB.query_hash(sql, args).first) end def min_days_visited diff --git a/app/models/trust_level_and_staff_setting.rb b/app/models/trust_level_and_staff_setting.rb new file mode 100644 index 0000000000..49d46ce039 --- /dev/null +++ b/app/models/trust_level_and_staff_setting.rb @@ -0,0 +1,21 @@ +require_dependency 'enum_site_setting' + +class TrustLevelAndStaffSetting < TrustLevelSetting + def self.valid_value?(val) + special_group?(val) || + (val.to_i.to_s == val.to_s && + valid_values.any? { |v| v == val.to_i }) + end + + def self.valid_values + TrustLevel.valid_range.to_a + special_groups + end + + def self.special_group?(val) + special_groups.include?(val.to_s) + end + + def self.special_groups + ['staff', 'admin'] + end +end diff --git a/app/models/twitter_user_info.rb b/app/models/twitter_user_info.rb index a57608a468..07302bc777 100644 --- a/app/models/twitter_user_info.rb +++ b/app/models/twitter_user_info.rb @@ -9,7 +9,7 @@ end # id :integer not null, primary key # user_id :integer not null # screen_name :string not null -# twitter_user_id :integer not null +# twitter_user_id :bigint(8) not null # created_at :datetime not null # updated_at :datetime not null # email :string(1000) diff --git a/app/models/unsubscribe_key.rb b/app/models/unsubscribe_key.rb index 967d8f34a1..7f5ee933cb 100644 --- a/app/models/unsubscribe_key.rb +++ b/app/models/unsubscribe_key.rb @@ -19,9 +19,9 @@ class UnsubscribeKey < ActiveRecord::Base private - def generate_random_key - self.key = SecureRandom.hex(32) - end + def generate_random_key + self.key = SecureRandom.hex(32) + end end # == Schema Information diff --git a/app/models/upload.rb b/app/models/upload.rb index 754e5d7f69..00f17cbead 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -7,6 +7,8 @@ require_dependency "file_store/local_store" require_dependency "base62" class Upload < ActiveRecord::Base + SHA1_LENGTH = 40 + belongs_to :user has_many :post_uploads, dependent: :destroy @@ -24,7 +26,13 @@ class Upload < ActiveRecord::Base validates_with ::Validators::UploadValidator - def thumbnail(width = self.width, height = self.height) + after_destroy do + User.where(uploaded_avatar_id: self.id).update_all(uploaded_avatar_id: nil) + UserAvatar.where(gravatar_upload_id: self.id).update_all(gravatar_upload_id: nil) + UserAvatar.where(custom_upload_id: self.id).update_all(custom_upload_id: nil) + end + + def thumbnail(width = self.thumbnail_width, height = self.thumbnail_height) optimized_images.find_by(width: width, height: height) end @@ -36,18 +44,58 @@ class Upload < ActiveRecord::Base return unless SiteSetting.create_thumbnails? opts = { - filename: self.original_filename, allow_animation: SiteSetting.allow_animated_thumbnails, crop: crop } - if _thumbnail = OptimizedImage.create_for(self, width, height, opts) - self.width = width - self.height = height + if get_optimized_image(width, height, opts) save(validate: false) end end + # this method attempts to correct old incorrect extensions + def get_optimized_image(width, height, opts) + if (!extension || extension.length == 0) + fix_image_extension + end + + opts = opts.merge(raise_on_error: true) + begin + OptimizedImage.create_for(self, width, height, opts) + rescue + opts = opts.merge(raise_on_error: false) + if fix_image_extension + OptimizedImage.create_for(self, width, height, opts) + else + nil + end + end + end + + def fix_image_extension + return false if extension == "unknown" + + begin + # this is relatively cheap once cached + original_path = Discourse.store.path_for(self) + if original_path.blank? + external_copy = Discourse.store.download(self) rescue nil + original_path = external_copy.try(:path) + end + + image_info = FastImage.new(original_path) rescue nil + new_extension = image_info&.type&.to_s || "unknown" + + if new_extension != self.extension + self.update_columns(extension: new_extension) + true + end + rescue + self.update_columns(extension: "unknown") + true + end + end + def destroy Upload.transaction do Discourse.store.remove_upload(self) @@ -59,14 +107,59 @@ class Upload < ActiveRecord::Base "upload://#{Base62.encode(sha1.hex)}.#{extension}" end + def local? + !(url =~ /^(https?:)?\/\//) + end + + def fix_dimensions! + return if !FileHelper.is_image?("image.#{extension}") + + path = + if local? + Discourse.store.path_for(self) + else + Discourse.store.download(self).path + end + + self.width, self.height = size = FastImage.new(path).size + self.thumbnail_width, self.thumbnail_height = ImageSizer.resize(*size) + nil + end + + # on demand image size calculation, this allows us to null out image sizes + # and still handle as needed + def get_dimension(key) + if v = read_attribute(key) + return v + end + fix_dimensions! + read_attribute(key) + end + + def width + get_dimension(:width) + end + + def height + get_dimension(:height) + end + + def thumbnail_width + get_dimension(:thumbnail_width) + end + + def thumbnail_height + get_dimension(:thumbnail_height) + end + def self.sha1_from_short_url(url) if url =~ /(upload:\/\/)?([a-zA-Z0-9]+)(\..*)?/ sha1 = Base62.decode($2).to_s(16) - if sha1.length > 40 + if sha1.length > SHA1_LENGTH nil else - sha1.rjust(40, '0') + sha1.rjust(SHA1_LENGTH, '0') end end end @@ -77,20 +170,19 @@ class Upload < ActiveRecord::Base def self.get_from_url(url) return if url.blank? - # we store relative urls, so we need to remove any host/cdn - url = url.sub(Discourse.asset_host, "") if Discourse.asset_host.present? && Discourse.asset_host != SiteSetting.Upload.s3_cdn_url - # when using s3, we need to replace with the absolute base url - url = url.sub(SiteSetting.Upload.s3_cdn_url, Discourse.store.absolute_base_url) if SiteSetting.Upload.s3_cdn_url.present? - # always try to get the path uri = begin URI(URI.unescape(url)) - rescue URI::InvalidURIError, URI::InvalidComponentError + rescue URI::Error end - url = uri.path if uri.try(:scheme) - - Upload.find_by(url: url) + return if uri&.path.blank? + data = uri.path.match(/(\/original\/\dX\/[\/\.\w]+\/([a-zA-Z0-9]+)[\.\w]+)/) + return if data.blank? + sha1 = data[2] + upload = nil + upload = Upload.find_by(sha1: sha1) if sha1&.length == SHA1_LENGTH + upload || Upload.find_by("url LIKE ?", "%#{data[1]}") end def self.migrate_to_new_scheme(limit = nil) diff --git a/app/models/user.rb b/app/models/user.rb index 90f5064c8f..fe0e40bf46 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -20,9 +20,6 @@ class User < ActiveRecord::Base include HasCustomFields include SecondFactorManager - # TODO: Remove this after 7th Jan 2018 - self.ignored_columns = %w{email} - has_many :posts has_many :notifications, dependent: :destroy has_many :topic_users, dependent: :destroy @@ -50,6 +47,7 @@ class User < ActiveRecord::Base has_many :email_change_requests, dependent: :destroy has_many :directory_items, dependent: :delete_all has_many :user_auth_tokens, dependent: :destroy + has_many :user_auth_token_logs, dependent: :destroy has_many :group_users, dependent: :destroy has_many :groups, through: :group_users @@ -65,9 +63,9 @@ class User < ActiveRecord::Base has_one :twitter_user_info, dependent: :destroy has_one :github_user_info, dependent: :destroy has_one :google_user_info, dependent: :destroy - has_one :oauth2_user_info, dependent: :destroy + has_many :oauth2_user_infos, dependent: :destroy has_one :instagram_user_info, dependent: :destroy - has_one :user_second_factor, dependent: :destroy + has_many :user_second_factors, dependent: :destroy has_one :user_stat, dependent: :destroy has_one :user_profile, dependent: :destroy, inverse_of: :user has_one :single_sign_on_record, dependent: :destroy @@ -104,6 +102,7 @@ class User < ActiveRecord::Base after_create :create_user_stat after_create :create_user_option after_create :create_user_profile + after_create :set_random_avatar after_create :ensure_in_trust_level_group after_create :set_default_categories_preferences @@ -117,6 +116,7 @@ class User < ActiveRecord::Base after_save :expire_old_email_tokens after_save :index_search after_commit :trigger_user_created_event, on: :create + after_commit :trigger_user_destroyed_event, on: :destroy before_destroy do # These tables don't have primary keys, so destroying them with activerecord is tricky: @@ -205,10 +205,10 @@ class User < ActiveRecord::Base SiteSetting.min_username_length.to_i..SiteSetting.max_username_length.to_i end - def self.username_available?(username, email = nil) + def self.username_available?(username, email = nil, allow_reserved_username: false) lower = username.downcase - return false if reserved_username?(lower) - return true if User.exec_sql(User::USERNAME_EXISTS_SQL, username: lower).count == 0 + return false if !allow_reserved_username && reserved_username?(lower) + return true if DB.exec(User::USERNAME_EXISTS_SQL, username: lower) == 0 # staged users can use the same username since they will take over the account email.present? && User.joins(:user_emails).exists?(staged: true, username_lower: lower, user_emails: { primary: true, email: email }) @@ -222,6 +222,24 @@ class User < ActiveRecord::Base end end + def self.plugin_editable_user_custom_fields + @plugin_editable_user_custom_fields ||= {} + end + + def self.register_plugin_editable_user_custom_field(custom_field_name, plugin) + plugin_editable_user_custom_fields[custom_field_name] = plugin + end + + def self.editable_user_custom_fields + fields = [] + + plugin_editable_user_custom_fields.each do |k, v| + fields << k if v.enabled? + end + + fields.uniq + end + def self.plugin_staff_user_custom_fields @plugin_staff_user_custom_fields ||= {} end @@ -313,6 +331,11 @@ class User < ActiveRecord::Base Jobs.enqueue(:send_system_message, user_id: id, message_type: message_type) end + def enqueue_member_welcome_message + return unless SiteSetting.send_tl1_welcome_message? + Jobs.enqueue(:send_system_message, user_id: id, message_type: "welcome_tl1_user") + end + def change_username(new_username, actor = nil) UsernameChanger.change(self, new_username, actor) end @@ -387,7 +410,8 @@ class User < ActiveRecord::Base AND NOT read SQL - User.exec_sql(sql, user_id: id, type: notification_type).getvalue(0, 0).to_i + # to avoid coalesce we do to_i + DB.query_single(sql, user_id: id, type: notification_type)[0].to_i end def unread_private_messages @@ -408,11 +432,11 @@ class User < ActiveRecord::Base AND NOT read SQL - User.exec_sql(sql, + DB.query_single(sql, user_id: id, seen_notification_id: seen_notification_id, pm: Notification.types[:private_message] - ).getvalue(0, 0).to_i + )[0].to_i end end @@ -443,10 +467,10 @@ class User < ActiveRecord::Base def publish_notifications_state # publish last notification json with the message so we can apply an update - notification = notifications.visible.order('notifications.id desc').first + notification = notifications.visible.order('notifications.created_at desc').first json = NotificationSerializer.new(notification).as_json if notification - sql = " + sql = (<<~SQL).freeze SELECT * FROM ( SELECT n.id, n.read FROM notifications n LEFT JOIN topics t ON n.topic_id = t.id @@ -469,13 +493,13 @@ class User < ActiveRecord::Base ORDER BY n.id DESC LIMIT 20 ) AS y - " + SQL - recent = User.exec_sql(sql, + recent = DB.query(sql, user_id: id, type: Notification.types[:private_message] - ).values.map! do |id, read| - [id.to_i, read] + ).map! do |r| + [r.id, r.read] end payload = { @@ -536,7 +560,7 @@ class User < ActiveRecord::Base def new_user_posting_on_first_day? !staff? && trust_level < TrustLevel[2] && - (self.first_post_created_at.nil? || self.first_post_created_at >= 24.hours.ago) + (trust_level == TrustLevel[0] || self.first_post_created_at.nil? || self.first_post_created_at >= 24.hours.ago) end def new_user? @@ -606,8 +630,7 @@ class User < ActiveRecord::Base end def self.gravatar_template(email) - email_hash = self.email_hash(email) - "//www.gravatar.com/avatar/#{email_hash}.png?s={size}&r=pg&d=identicon" + "//www.gravatar.com/avatar/#{self.email_hash(email)}.png?s={size}&r=pg&d=identicon" end # Don't pass this up to the client - it's meant for server side use @@ -622,19 +645,19 @@ class User < ActiveRecord::Base UrlHelper.schemaless UrlHelper.absolute avatar_template end + def self.username_hash(username) + username.each_char.reduce(0) do |result, char| + [((result << 5) - result) + char.ord].pack('L').unpack('l').first + end.abs + end + def self.default_template(username) if SiteSetting.default_avatars.present? - split_avatars = SiteSetting.default_avatars.split("\n") - if split_avatars.present? - hash = username.each_char.reduce(0) do |result, char| - [((result << 5) - result) + char.ord].pack('L').unpack('l').first - end - - split_avatars[hash.abs % split_avatars.size] - end - else - system_avatar_template(username) + urls = SiteSetting.default_avatars.split("\n") + return urls[username_hash(username) % urls.size] if urls.present? end + + system_avatar_template(username) end def self.avatar_template(username, uploaded_avatar_id) @@ -844,7 +867,7 @@ class User < ActiveRecord::Base if start_date && end_date result = result.group("date(users.created_at)") result = result.where("users.created_at >= ? AND users.created_at <= ?", start_date, end_date) - result = result.order('date(users.created_at)') + result = result.order("date(users.created_at)") end if group_id @@ -948,27 +971,28 @@ class User < ActiveRecord::Base def associated_accounts result = [] - result << "Twitter(#{twitter_user_info.screen_name})" if twitter_user_info - result << "Facebook(#{facebook_user_info.username})" if facebook_user_info - result << "Google(#{google_user_info.email})" if google_user_info - result << "GitHub(#{github_user_info.screen_name})" if github_user_info - result << "Instagram(#{instagram_user_info.screen_name})" if instagram_user_info - result << "#{oauth2_user_info.provider}(#{oauth2_user_info.email})" if oauth2_user_info - - user_open_ids.each do |oid| - result << "OpenID #{oid.url[0..20]}...(#{oid.email})" + Discourse.authenticators.each do |authenticator| + account_description = authenticator.description_for_user(self) + unless account_description.empty? + result << { + name: authenticator.name, + description: account_description, + } + end end - result.empty? ? I18n.t("user.no_accounts_associated") : result.join(", ") + result end + USER_FIELD_PREFIX ||= "user_field_" + def user_fields return @user_fields if @user_fields user_field_ids = UserField.pluck(:id) if user_field_ids.present? @user_fields = {} user_field_ids.each do |fid| - @user_fields[fid.to_s] = custom_fields["user_field_#{fid}"] + @user_fields[fid.to_s] = custom_fields["#{USER_FIELD_PREFIX}#{fid}"] end end @user_fields @@ -1012,6 +1036,18 @@ class User < ActiveRecord::Base UserProfile.create(user_id: id) end + def set_random_avatar + if SiteSetting.selectable_avatars_enabled? && SiteSetting.selectable_avatars.present? + urls = SiteSetting.selectable_avatars.split("\n") + if urls.present? + if upload = Upload.find_by(url: urls.sample) + update_column(:uploaded_avatar_id, upload.id) + UserAvatar.create(user_id: id, custom_upload_id: upload.id) + end + end + end + end + def anonymous? SiteSetting.allow_anonymous_posting && trust_level >= 1 && @@ -1063,6 +1099,14 @@ class User < ActiveRecord::Base end end + def emails + self.user_emails.order("user_emails.primary DESC NULLS LAST").pluck(:email) + end + + def secondary_emails + self.user_emails.secondary.pluck(:email) + end + def recent_time_read self.created_at && self.created_at < 60.days.ago ? self.user_visits.where('visited_at >= ?', 60.days.ago).sum(:time_read) : @@ -1073,6 +1117,10 @@ class User < ActiveRecord::Base custom_fields[User::FROM_STAGED] end + def mature_staged? + from_staged? && self.created_at && self.created_at < 1.day.ago + end + protected def badge_grant @@ -1151,12 +1199,12 @@ class User < ActiveRecord::Base end USERNAME_EXISTS_SQL = <<~SQL - (SELECT users.id AS user_id FROM users + (SELECT users.id AS id, true as is_user FROM users WHERE users.username_lower = :username) UNION ALL - (SELECT groups.id AS group_id FROM groups + (SELECT groups.id, false as is_user FROM groups WHERE lower(groups.name) = :username) SQL @@ -1164,11 +1212,14 @@ class User < ActiveRecord::Base username_format_validator || begin lower = username.downcase - existing = User.exec_sql( + existing = DB.query( USERNAME_EXISTS_SQL, username: lower - ).to_a.first + ) - if will_save_change_to_username? && existing.present? && existing["user_id"] != self.id + user_id = existing.select { |u| u.is_user }.first&.id + same_user = user_id && user_id == self.id + + if will_save_change_to_username? && existing.present? && !same_user errors.add(:username, I18n.t(:'user.username.unique')) end end @@ -1196,7 +1247,7 @@ class User < ActiveRecord::Base end if values.present? - exec_sql("INSERT INTO category_users (user_id, category_id, notification_level) VALUES #{values.join(",")}") + DB.exec("INSERT INTO category_users (user_id, category_id, notification_level) VALUES #{values.join(",")}") end end @@ -1209,7 +1260,9 @@ class User < ActiveRecord::Base .where(active: false) .where("created_at < ?", SiteSetting.purge_unactivated_users_grace_period_days.days.ago) .where("NOT admin AND NOT moderator") - .where("NOT EXISTS (SELECT 1 FROM topic_allowed_users WHERE user_id = users.id LIMIT 1)") + .where("NOT EXISTS + (SELECT 1 FROM topic_allowed_users tu JOIN topics t ON t.id = tu.topic_id AND t.user_id > 0 WHERE tu.user_id = users.id LIMIT 1) + ") .limit(200) .find_each do |user| begin @@ -1238,6 +1291,11 @@ class User < ActiveRecord::Base true end + def trigger_user_destroyed_event + DiscourseEvent.trigger(:user_destroyed, self) + true + end + def set_skip_validate_email if self.primary_email self.primary_email.skip_validate_email = !should_validate_email_address? @@ -1246,6 +1304,20 @@ class User < ActiveRecord::Base true end + def self.ensure_consistency! + DB.exec <<~SQL + UPDATE users + SET uploaded_avatar_id = NULL + WHERE uploaded_avatar_id IN ( + SELECT u1.uploaded_avatar_id FROM users u1 + LEFT JOIN uploads up + ON u1.uploaded_avatar_id = up.id + WHERE u1.uploaded_avatar_id IS NOT NULL AND + up.id IS NULL + ) + SQL + end + end # == Schema Information @@ -1291,8 +1363,8 @@ end # # Indexes # -# idx_users_admin (id) -# idx_users_moderator (id) +# idx_users_admin (id) WHERE admin +# idx_users_moderator (id) WHERE moderator # index_users_on_last_posted_at (last_posted_at) # index_users_on_last_seen_at (last_seen_at) # index_users_on_uploaded_avatar_id (uploaded_avatar_id) diff --git a/app/models/user_action.rb b/app/models/user_action.rb index f36c034b0e..4d9e86da4a 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -39,17 +39,6 @@ class UserAction < ActiveRecord::Base ASSIGNED, ].each_with_index.to_a.flatten] - # note, this is temporary until we upgrade to rails 4 - # in rails 4 types are mapped correctly so you dont end up - # having strings where you would expect bools - class UserActionRow < OpenStruct - include ActiveModel::SerializerSupport - - def as_json(options = nil) - @table.as_json(options) - end - end - def self.last_action_in_topic(user_id, topic_id) UserAction.where(user_id: user_id, target_topic_id: topic_id, @@ -59,25 +48,24 @@ class UserAction < ActiveRecord::Base def self.stats(user_id, guardian) # Sam: I tried this in AR and it got complex - builder = UserAction.sql_builder < ORDER[b.action_type] } - results end @@ -97,7 +85,8 @@ SQL AND t.id IN (SELECT topic_id FROM topic_allowed_users WHERE user_id = :user_id) SQL - all, mine, unread = exec_sql(sql, user_id: user_id).values[0].map(&:to_i) + # map is there due to count returning nil + all, mine, unread = DB.query_single(sql, user_id: user_id).map(&:to_i) sql = <<-SQL SELECT g.name, COUNT(*) "count" @@ -112,8 +101,8 @@ SQL result = { all: all, mine: mine, unread: unread } - exec_sql(sql, user_id: user_id).each do |row| - (result[:groups] ||= []) << { name: row["name"], count: row["count"].to_i } + DB.query(sql, user_id: user_id).each do |row| + (result[:groups] ||= []) << { name: row.name, count: row.count.to_i } end result @@ -138,19 +127,50 @@ SQL stream(action_id: action_id, guardian: guardian).first end + NULL_QUEUED_STREAM_COLS = %i{ + cooked + uploaded_avatar_id + acting_name + acting_username + acting_user_id + target_name + target_username + target_user_id + post_number + post_id + deleted + hidden + post_type + action_type + action_code + action_code_who + topic_closed + topic_id + topic_archived + }.map! { |s| "NULL as #{s}" }.join(", ") + def self.stream_queued(opts = nil) opts ||= {} offset = opts[:offset] || 0 limit = opts[:limit] || 60 - builder = SqlBuilder.new <<-SQL + # this is somewhat ugly, but the serializer wants all these columns + # it is more correct to have an object with all the fields needed + # cause then we can catch and change if we ever add columns + builder = DB.build <<~SQL SELECT a.id, - t.title, a.action_type, a.created_at, t.id topic_id, - u.username, u.name, u.id AS user_id, + t.title, + a.action_type, + a.created_at, + t.id topic_id, + u.username, + u.name, + u.id AS user_id, qp.raw, - t.category_id + t.category_id, + #{NULL_QUEUED_STREAM_COLS} FROM user_actions as a JOIN queued_posts AS qp ON qp.id = a.queued_post_id LEFT OUTER JOIN topics t on t.id = qp.topic_id @@ -168,7 +188,7 @@ SQL .order_by("a.created_at desc") .offset(offset.to_i) .limit(limit.to_i) - .map_exec(UserActionRow) + .query end def self.stream(opts = nil) @@ -196,7 +216,7 @@ SQL # The weird thing is that target_post_id can be null, so it makes everything # ever so more complex. Should we allow this, not sure. - builder = SqlBuilder.new <<-SQL + builder = DB.build <<~SQL SELECT a.id, t.title, a.action_type, a.created_at, t.id topic_id, @@ -248,7 +268,7 @@ SQL .limit(limit.to_i) end - builder.map_exec(UserActionRow) + builder.query end def self.log_action!(hash) @@ -320,19 +340,19 @@ SQL def self.synchronize_target_topic_ids(post_ids = nil) # nuke all dupes, using magic - builder = SqlBuilder.new < 0 AND - user_actions.id > ua2.id -SQL + builder.where <<~SQL + user_actions.action_type = ua2.action_type AND + user_actions.user_id = ua2.user_id AND + user_actions.acting_user_id = ua2.acting_user_id AND + user_actions.target_post_id = ua2.target_post_id AND + user_actions.target_post_id > 0 AND + user_actions.id > ua2.id + SQL if post_ids builder.where("user_actions.target_post_id in (:post_ids)", post_ids: post_ids) @@ -340,9 +360,11 @@ SQL builder.exec - builder = SqlBuilder.new("UPDATE user_actions - SET target_topic_id = (select topic_id from posts where posts.id = target_post_id) - /*where*/") + builder = DB.build <<~SQL + UPDATE user_actions + SET target_topic_id = (select topic_id from posts where posts.id = target_post_id) + /*where*/ + SQL builder.where("target_topic_id <> (select topic_id from posts where posts.id = target_post_id)") if post_ids diff --git a/app/models/user_api_key.rb b/app/models/user_api_key.rb index dc1edca2d6..13eddc9274 100644 --- a/app/models/user_api_key.rb +++ b/app/models/user_api_key.rb @@ -74,6 +74,7 @@ end # updated_at :datetime not null # revoked_at :datetime # scopes :text default([]), not null, is an Array +# last_used_at :datetime not null # # Indexes # diff --git a/app/models/user_archived_message.rb b/app/models/user_archived_message.rb index 1edd3863c4..6c2c604042 100644 --- a/app/models/user_archived_message.rb +++ b/app/models/user_archived_message.rb @@ -36,11 +36,11 @@ class UserArchivedMessage < ActiveRecord::Base private - def self.publish_topic_tracking_state(topic, user_id) - TopicTrackingState.publish_private_message( - topic, archive_user_id: user_id - ) - end + def self.publish_topic_tracking_state(topic, user_id) + TopicTrackingState.publish_private_message( + topic, archive_user_id: user_id + ) + end end # == Schema Information diff --git a/app/models/user_auth_token.rb b/app/models/user_auth_token.rb index 57eeaca888..3f6ca49acd 100644 --- a/app/models/user_auth_token.rb +++ b/app/models/user_auth_token.rb @@ -11,8 +11,19 @@ class UserAuthToken < ActiveRecord::Base # used when token did not arrive at client URGENT_ROTATE_TIME = 1.minute + USER_ACTIONS = ['generate'] + attr_accessor :unhashed_auth_token + before_destroy do + UserAuthToken.log(action: 'destroy', + user_auth_token_id: self.id, + user_id: self.user_id, + user_agent: self.user_agent, + client_ip: self.client_ip, + auth_token: self.auth_token) + end + def self.log(info) if SiteSetting.verbose_auth_token_logging UserAuthTokenLog.create!(info) @@ -131,7 +142,7 @@ class UserAuthToken < ActiveRecord::Base token = SecureRandom.hex(16) - result = UserAuthToken.exec_sql(" + result = DB.exec(" UPDATE user_auth_tokens SET auth_token_seen = false, @@ -150,7 +161,7 @@ class UserAuthToken < ActiveRecord::Base safeguard_time: 30.seconds.ago ) - if result.cmdtuples > 0 + if result > 0 reload self.unhashed_auth_token = token diff --git a/app/models/user_auth_token_log.rb b/app/models/user_auth_token_log.rb index 532d363d73..b2edaebe54 100644 --- a/app/models/user_auth_token_log.rb +++ b/app/models/user_auth_token_log.rb @@ -1,4 +1,5 @@ class UserAuthTokenLog < ActiveRecord::Base + belongs_to :user end # == Schema Information diff --git a/app/models/user_avatar.rb b/app/models/user_avatar.rb index 4774df14f3..69d0ff7764 100644 --- a/app/models/user_avatar.rb +++ b/app/models/user_avatar.rb @@ -32,12 +32,28 @@ class UserAvatar < ActiveRecord::Base ) if tempfile - upload = UploadCreator.new(tempfile, 'gravatar.png', origin: gravatar_url, type: "avatar").create_for(user_id) + ext = File.extname(tempfile) + ext = '.png' if ext.blank? - if gravatar_upload_id != upload.id - gravatar_upload&.destroy! - self.gravatar_upload = upload - save! + upload = UploadCreator.new( + tempfile, + "gravatar#{ext}", + origin: gravatar_url, + type: "avatar" + ).create_for(user_id) + + upload_id = upload.id + + if gravatar_upload_id != upload_id + User.transaction do + if gravatar_upload_id && user.uploaded_avatar_id == gravatar_upload_id + user.update!(uploaded_avatar_id: upload_id) + end + + gravatar_upload&.destroy! + self.gravatar_upload = upload + save! + end end end rescue OpenURI::HTTPError @@ -87,17 +103,17 @@ class UserAvatar < ActiveRecord::Base upload = UploadCreator.new(tempfile, "external-avatar." + ext, origin: avatar_url, type: "avatar").create_for(user.id) - user.create_user_avatar unless user.user_avatar + user.create_user_avatar! unless user.user_avatar if !user.user_avatar.contains_upload?(upload.id) - user.user_avatar.update_columns(custom_upload_id: upload.id) - + user.user_avatar.update!(custom_upload_id: upload.id) override_gravatar = !options || options[:override_gravatar] if user.uploaded_avatar_id.nil? || !user.user_avatar.contains_upload?(user.uploaded_avatar_id) || override_gravatar - user.update_columns(uploaded_avatar_id: upload.id) + + user.update!(uploaded_avatar_id: upload.id) end end @@ -107,6 +123,31 @@ class UserAvatar < ActiveRecord::Base tempfile.close! if tempfile && tempfile.respond_to?(:close!) end + def self.ensure_consistency! + DB.exec <<~SQL + UPDATE user_avatars + SET gravatar_upload_id = NULL + WHERE gravatar_upload_id IN ( + SELECT u1.gravatar_upload_id FROM user_avatars u1 + LEFT JOIN uploads up + ON u1.gravatar_upload_id = up.id + WHERE u1.gravatar_upload_id IS NOT NULL AND + up.id IS NULL + ) + SQL + + DB.exec <<~SQL + UPDATE user_avatars + SET custom_upload_id = NULL + WHERE custom_upload_id IN ( + SELECT u1.custom_upload_id FROM user_avatars u1 + LEFT JOIN uploads up + ON u1.custom_upload_id = up.id + WHERE u1.custom_upload_id IS NOT NULL AND + up.id IS NULL + ) + SQL + end end # == Schema Information diff --git a/app/models/user_badge.rb b/app/models/user_badge.rb index 53979ec9cf..1e46287892 100644 --- a/app/models/user_badge.rb +++ b/app/models/user_badge.rb @@ -26,9 +26,9 @@ class UserBadge < ActiveRecord::Base private - def single_grant_badge? - self.badge.single_grant? - end + def single_grant_badge? + self.badge.single_grant? + end end # == Schema Information @@ -47,7 +47,7 @@ end # Indexes # # index_user_badges_on_badge_id_and_user_id (badge_id,user_id) -# index_user_badges_on_badge_id_and_user_id_and_post_id (badge_id,user_id,post_id) UNIQUE -# index_user_badges_on_badge_id_and_user_id_and_seq (badge_id,user_id,seq) UNIQUE +# index_user_badges_on_badge_id_and_user_id_and_post_id (badge_id,user_id,post_id) UNIQUE WHERE (post_id IS NOT NULL) +# index_user_badges_on_badge_id_and_user_id_and_seq (badge_id,user_id,seq) UNIQUE WHERE (post_id IS NULL) # index_user_badges_on_user_id (user_id) # diff --git a/app/models/user_email.rb b/app/models/user_email.rb index 101eddcd5c..fca7a28967 100644 --- a/app/models/user_email.rb +++ b/app/models/user_email.rb @@ -11,10 +11,12 @@ class UserEmail < ActiveRecord::Base validates :email, email: true, format: { with: EmailValidator.email_regex }, if: :validate_email? - validates :primary, uniqueness: { scope: [:user_id] }, if: :user_id + validates :primary, uniqueness: { scope: [:user_id] }, if: [:user_id, :primary] validate :user_id_not_changed, if: :primary validate :unique_email + scope :secondary, -> { where(primary: false) } + private def strip_downcase_email @@ -59,5 +61,5 @@ end # # index_user_emails_on_email (lower((email)::text)) UNIQUE # index_user_emails_on_user_id (user_id) -# index_user_emails_on_user_id_and_primary (user_id,primary) UNIQUE +# index_user_emails_on_user_id_and_primary (user_id,primary) UNIQUE WHERE "primary" # diff --git a/app/models/user_export.rb b/app/models/user_export.rb index 10314c029b..6db61c3725 100644 --- a/app/models/user_export.rb +++ b/app/models/user_export.rb @@ -1,12 +1,13 @@ class UserExport < ActiveRecord::Base + belongs_to :user def self.remove_old_exports - UserExport.where('created_at < ?', 2.days.ago).find_each do |expired_export| - file_name = "#{expired_export.file_name}-#{expired_export.id}.csv.gz" + UserExport.where('created_at < ?', 2.days.ago).find_each do |user_export| + file_name = "#{user_export.file_name}-#{user_export.id}.csv.gz" file_path = "#{UserExport.base_directory}/#{file_name}" File.delete(file_path) if File.exist?(file_path) - expired_export.destroy + user_export.destroy! end end diff --git a/app/models/user_history.rb b/app/models/user_history.rb index f500d83179..0ce8a8da6d 100644 --- a/app/models/user_history.rb +++ b/app/models/user_history.rb @@ -80,6 +80,8 @@ class UserHistory < ActiveRecord::Base removed_suspend_user: 61, removed_unsilence_user: 62, removed_unsuspend_user: 63, + post_rejected: 64, + merge_user: 65 ) end @@ -138,6 +140,8 @@ class UserHistory < ActiveRecord::Base :create_badge, :change_badge, :delete_badge, + :post_rejected, + :merge_user ] end diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 828ac58c60..a447a8eae9 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -1,4 +1,7 @@ class UserOption < ActiveRecord::Base + # TODO: remove in 2019 + self.ignored_columns = ["theme_key"] + self.primary_key = :user_id belongs_to :user before_create :set_defaults @@ -6,10 +9,14 @@ class UserOption < ActiveRecord::Base after_save :update_tracked_topics def self.ensure_consistency! - exec_sql("SELECT u.id FROM users u - LEFT JOIN user_options o ON o.user_id = u.id - WHERE o.user_id IS NULL").values.each do |id, _| - UserOption.create(user_id: id.to_i) + sql = <<~SQL + SELECT u.id FROM users u + LEFT JOIN user_options o ON o.user_id = u.id + WHERE o.user_id IS NULL + SQL + + DB.query_single(sql).each do |id| + UserOption.create(user_id: id) end end @@ -141,10 +148,10 @@ class UserOption < ActiveRecord::Base private - def update_tracked_topics - return unless saved_change_to_auto_track_topics_after_msecs? - TrackedTopicsUpdater.new(id, auto_track_topics_after_msecs).call - end + def update_tracked_topics + return unless saved_change_to_auto_track_topics_after_msecs? + TrackedTopicsUpdater.new(id, auto_track_topics_after_msecs).call + end end @@ -173,10 +180,10 @@ end # mailing_list_mode_frequency :integer default(1), not null # include_tl0_in_digests :boolean default(FALSE) # notification_level_when_replying :integer -# theme_key :string # theme_key_seq :integer default(0), not null # allow_private_messages :boolean default(TRUE), not null # homepage_id :integer +# theme_ids :integer default([]), not null, is an Array # # Indexes # diff --git a/app/models/user_profile.rb b/app/models/user_profile.rb index 11ebf37cb5..ffc62a263f 100644 --- a/app/models/user_profile.rb +++ b/app/models/user_profile.rb @@ -142,7 +142,7 @@ class UserProfile < ActiveRecord::Base domain = begin URI.parse(self.website).host - rescue URI::InvalidURIError + rescue URI::Error end self.errors.add :base, (I18n.t('user.website.domain_not_allowed', domains: allowed_domains.split('|').join(", "))) unless allowed_domains.split('|').include?(domain) end diff --git a/app/models/user_profile_view.rb b/app/models/user_profile_view.rb index 237318a101..6864b57179 100644 --- a/app/models/user_profile_view.rb +++ b/app/models/user_profile_view.rb @@ -25,7 +25,7 @@ class UserProfileView < ActiveRecord::Base /*where*/ )" - builder = SqlBuilder.new(sql) + builder = DB.build(sql) if !user_id builder.where("viewed_at = :viewed_at AND ip_address = :ip_address AND user_profile_id = :user_profile_id AND user_id IS NULL") @@ -35,7 +35,7 @@ class UserProfileView < ActiveRecord::Base result = builder.exec(user_profile_id: user_profile_id, ip_address: ip, viewed_at: at, user_id: user_id) - if result.cmd_tuples > 0 + if result > 0 UserProfile.find(user_profile_id).increment!(:views) end end diff --git a/app/models/user_search.rb b/app/models/user_search.rb index a9eceda1e9..3acdf917c3 100644 --- a/app/models/user_search.rb +++ b/app/models/user_search.rb @@ -54,7 +54,7 @@ class UserSearch users = users.includes(:user_search_data) .references(:user_search_data) .where("user_search_data.search_data @@ #{query}") - .order(User.sql_fragment("CASE WHEN username_lower LIKE ? THEN 0 ELSE 1 END ASC", @term_like)) + .order(DB.sql_fragment("CASE WHEN username_lower LIKE ? THEN 0 ELSE 1 END ASC", @term_like)) else users = users.where("username_lower LIKE :term_like", term_like: @term_like) diff --git a/app/models/user_search_data.rb b/app/models/user_search_data.rb index 2de3be31cb..ce61e991fa 100644 --- a/app/models/user_search_data.rb +++ b/app/models/user_search_data.rb @@ -14,5 +14,5 @@ end # # Indexes # -# idx_search_user (search_data) +# idx_search_user (search_data) USING gin # diff --git a/app/models/user_second_factor.rb b/app/models/user_second_factor.rb index 0ffa9717d5..dc7f1695c8 100644 --- a/app/models/user_second_factor.rb +++ b/app/models/user_second_factor.rb @@ -1,18 +1,28 @@ class UserSecondFactor < ActiveRecord::Base belongs_to :user + scope :backup_codes, -> do + where(method: UserSecondFactor.methods[:backup_codes], enabled: true) + end + def self.methods @methods ||= Enum.new( totp: 1, + backup_codes: 2, ) end + + def self.totp + where(method: self.methods[:totp]).first + end + end # == Schema Information # # Table name: user_second_factors # -# id :integer not null, primary key +# id :bigint(8) not null, primary key # user_id :integer not null # method :integer not null # data :string not null @@ -21,3 +31,7 @@ end # created_at :datetime not null # updated_at :datetime not null # +# Indexes +# +# index_user_second_factors_on_user_id (user_id) +# diff --git a/app/models/user_stat.rb b/app/models/user_stat.rb index cf9ab05e2c..86731032a3 100644 --- a/app/models/user_stat.rb +++ b/app/models/user_stat.rb @@ -23,34 +23,36 @@ class UserStat < ActiveRecord::Base # we also ensure we only touch the table if data changes # Update denormalized topics_entered - exec_sql "UPDATE user_stats SET topics_entered = X.c - FROM - (SELECT v.user_id, COUNT(topic_id) AS c - FROM topic_views AS v - WHERE v.user_id IN ( - SELECT u1.id FROM users u1 where u1.last_seen_at > :seen_at - ) - GROUP BY v.user_id) AS X - WHERE - X.user_id = user_stats.user_id AND - X.c <> topics_entered - ", seen_at: last_seen + DB.exec(<<~SQL, seen_at: last_seen) + UPDATE user_stats SET topics_entered = X.c + FROM + (SELECT v.user_id, COUNT(topic_id) AS c + FROM topic_views AS v + WHERE v.user_id IN ( + SELECT u1.id FROM users u1 where u1.last_seen_at > :seen_at + ) + GROUP BY v.user_id) AS X + WHERE + X.user_id = user_stats.user_id AND + X.c <> topics_entered + SQL # Update denormalzied posts_read_count - exec_sql "UPDATE user_stats SET posts_read_count = X.c - FROM - (SELECT pt.user_id, - COUNT(*) AS c - FROM users AS u - JOIN post_timings AS pt ON pt.user_id = u.id - JOIN topics t ON t.id = pt.topic_id - WHERE u.last_seen_at > :seen_at AND - t.archetype = 'regular' AND - t.deleted_at IS NULL - GROUP BY pt.user_id) AS X - WHERE X.user_id = user_stats.user_id AND - X.c <> posts_read_count - ", seen_at: last_seen + DB.exec(<<~SQL, seen_at: last_seen) + UPDATE user_stats SET posts_read_count = X.c + FROM + (SELECT pt.user_id, + COUNT(*) AS c + FROM users AS u + JOIN post_timings AS pt ON pt.user_id = u.id + JOIN topics t ON t.id = pt.topic_id + WHERE u.last_seen_at > :seen_at AND + t.archetype = 'regular' AND + t.deleted_at IS NULL + GROUP BY pt.user_id) AS X + WHERE X.user_id = user_stats.user_id AND + X.c <> posts_read_count + SQL end # topic_reply_count is a count of posts in other users' topics diff --git a/app/models/user_summary.rb b/app/models/user_summary.rb index 6eb177382d..e75a53cd52 100644 --- a/app/models/user_summary.rb +++ b/app/models/user_summary.rb @@ -155,6 +155,56 @@ class UserSummary @user.recent_time_read end + class CategoryWithCounts < OpenStruct + include ActiveModel::SerializerSupport + KEYS = [:id, :name, :color, :text_color, :slug, :read_restricted, :parent_category_id] + end + + def top_categories + post_count_query = Post + .joins(:topic) + .includes(:topic) + .secured(@guardian) + .merge(Topic.listable_topics.visible.secured(@guardian)) + .where(user: @user) + .group('topics.category_id') + .order('COUNT(*) DESC') + + top_categories = {} + + Category.where(id: post_count_query.limit(MAX_SUMMARY_RESULTS).pluck('category_id')) + .pluck(:id, :name, :color, :text_color, :slug, :read_restricted, :parent_category_id) + .each do |c| + top_categories[c[0].to_i] = CategoryWithCounts.new( + Hash[CategoryWithCounts::KEYS.zip(c)].merge( + topic_count: 0, + post_count: 0 + ) + ) + end + + post_count_query.where('post_number > 1') + .where('topics.category_id in (?)', top_categories.keys) + .pluck('category_id, COUNT(*)') + .each do |r| + top_categories[r[0].to_i].post_count = r[1] + end + + Topic.listable_topics.visible.secured(@guardian) + .where('topics.category_id in (?)', top_categories.keys) + .where(user: @user) + .group('topics.category_id') + .order('COUNT(*) DESC') + .pluck('category_id, COUNT(*)') + .each do |r| + top_categories[r[0].to_i].topic_count = r[1] + end + + top_categories.values.sort_by do |r| + -(r[:post_count] + r[:topic_count]) + end + end + delegate :likes_given, :likes_received, :days_visited, diff --git a/app/models/user_visit.rb b/app/models/user_visit.rb index 52bd2fab9c..6fe21eae7b 100644 --- a/app/models/user_visit.rb +++ b/app/models/user_visit.rb @@ -11,7 +11,7 @@ class UserVisit < ActiveRecord::Base end def self.count_by_active_users(start_date, end_date) - sql = < - ( - SELECT COUNT(*) FROM user_visits v WHERE v.user_id = u.user_id - ) -SQL + DB.exec <<~SQL + UPDATE user_stats u set days_visited = + ( + SELECT COUNT(*) FROM user_visits v WHERE v.user_id = u.user_id + ) + WHERE days_visited <> + ( + SELECT COUNT(*) FROM user_visits v WHERE v.user_id = u.user_id + ) + SQL end end diff --git a/app/models/web_crawler_request.rb b/app/models/web_crawler_request.rb index 8f082222d8..905cb835ae 100644 --- a/app/models/web_crawler_request.rb +++ b/app/models/web_crawler_request.rb @@ -79,7 +79,7 @@ end # # Table name: web_crawler_requests # -# id :integer not null, primary key +# id :bigint(8) not null, primary key # date :date not null # user_agent :string not null # count :integer default(0), not null diff --git a/app/models/web_hook.rb b/app/models/web_hook.rb index c2c016741e..8bea527b71 100644 --- a/app/models/web_hook.rb +++ b/app/models/web_hook.rb @@ -93,9 +93,9 @@ class WebHook < ActiveRecord::Base private - def self.guardian - @guardian ||= Guardian.new(Discourse.system_user) - end + def self.guardian + @guardian ||= Guardian.new(Discourse.system_user) + end end # == Schema Information diff --git a/app/models/web_hook_event_type.rb b/app/models/web_hook_event_type.rb index 7d6d595566..8841bb64e4 100644 --- a/app/models/web_hook_event_type.rb +++ b/app/models/web_hook_event_type.rb @@ -6,6 +6,7 @@ class WebHookEventType < ActiveRecord::Base CATEGORY = 5 TAG = 6 FLAG = 7 + QUEUED_POST = 8 has_and_belongs_to_many :web_hooks diff --git a/app/serializers/admin_user_action_serializer.rb b/app/serializers/admin_user_action_serializer.rb index dfe2cbc631..4bc1db5f5a 100644 --- a/app/serializers/admin_user_action_serializer.rb +++ b/app/serializers/admin_user_action_serializer.rb @@ -81,12 +81,12 @@ class AdminUserActionSerializer < ApplicationSerializer private - # we need this to handle deleted topics which aren't loaded via the .includes(:topic) - # because Rails 4 "unscoped" support is bugged (cf. https://github.com/rails/rails/issues/13775) - def topic - return @topic if @topic - @topic = object.topic || Topic.with_deleted.find(object.topic_id) - @topic - end + # we need this to handle deleted topics which aren't loaded via the .includes(:topic) + # because Rails 4 "unscoped" support is bugged (cf. https://github.com/rails/rails/issues/13775) + def topic + return @topic if @topic + @topic = object.topic || Topic.with_deleted.find(object.topic_id) + @topic + end end diff --git a/app/serializers/admin_user_list_serializer.rb b/app/serializers/admin_user_list_serializer.rb index 32021dad74..47e5fea86d 100644 --- a/app/serializers/admin_user_list_serializer.rb +++ b/app/serializers/admin_user_list_serializer.rb @@ -1,6 +1,7 @@ class AdminUserListSerializer < BasicUserSerializer attributes :email, + :secondary_emails, :active, :admin, :moderator, @@ -41,6 +42,7 @@ class AdminUserListSerializer < BasicUserSerializer (scope.is_staff? && object.staged?) end + alias_method :include_secondary_emails?, :include_email? alias_method :include_associated_accounts?, :include_email? def silenced diff --git a/app/serializers/auth_provider_serializer.rb b/app/serializers/auth_provider_serializer.rb new file mode 100644 index 0000000000..35c3de789b --- /dev/null +++ b/app/serializers/auth_provider_serializer.rb @@ -0,0 +1,26 @@ +class AuthProviderSerializer < ApplicationSerializer + + attributes :name, :custom_url, :pretty_name_override, :title_override, :message_override, + :frame_width, :frame_height, :full_screen_login, :can_connect, :can_revoke + + def title_override + return SiteSetting.send(object.title_setting) if object.title_setting + object.title + end + + def pretty_name_override + return SiteSetting.send(object.pretty_name_setting) if object.pretty_name_setting + object.pretty_name + end + + def full_screen_login + return SiteSetting.send(object.full_screen_login_setting) if object.full_screen_login_setting + return object.full_screen_login if object.full_screen_login + false + end + + def message_override + object.message + end + +end diff --git a/app/serializers/basic_category_serializer.rb b/app/serializers/basic_category_serializer.rb index 4149a32cf2..6be2df27ff 100644 --- a/app/serializers/basic_category_serializer.rb +++ b/app/serializers/basic_category_serializer.rb @@ -25,7 +25,8 @@ class BasicCategorySerializer < ApplicationSerializer :default_view, :subcategory_list_style, :default_top_period, - :minimum_required_tags + :minimum_required_tags, + :navigate_to_first_post_after_read has_one :uploaded_logo, embed: :object, serializer: CategoryUploadSerializer has_one :uploaded_background, embed: :object, serializer: CategoryUploadSerializer diff --git a/app/serializers/basic_group_serializer.rb b/app/serializers/basic_group_serializer.rb index 26fb3ea2de..6ac6f23b49 100644 --- a/app/serializers/basic_group_serializer.rb +++ b/app/serializers/basic_group_serializer.rb @@ -68,15 +68,15 @@ class BasicGroupSerializer < ApplicationSerializer private - def staff? - @staff ||= scope.is_staff? - end + def staff? + @staff ||= scope.is_staff? + end - def user_group_ids - @options[:user_group_ids] - end + def user_group_ids + @options[:user_group_ids] + end - def owner_group_ids - @options[:owner_group_ids] - end + def owner_group_ids + @options[:owner_group_ids] + end end diff --git a/app/serializers/basic_user_serializer.rb b/app/serializers/basic_user_serializer.rb index d14877e6da..c7eaa38482 100644 --- a/app/serializers/basic_user_serializer.rb +++ b/app/serializers/basic_user_serializer.rb @@ -1,5 +1,9 @@ class BasicUserSerializer < ApplicationSerializer - attributes :id, :username, :avatar_template + attributes :id, :username, :name, :avatar_template + + def name + Hash === user ? user[:name] : user.try(:name) + end def include_name? SiteSetting.enable_names? @@ -16,5 +20,4 @@ class BasicUserSerializer < ApplicationSerializer def user object[:user] || object end - end diff --git a/app/serializers/concerns/email_logs_mixin.rb b/app/serializers/concerns/email_logs_mixin.rb new file mode 100644 index 0000000000..1e3470e2b7 --- /dev/null +++ b/app/serializers/concerns/email_logs_mixin.rb @@ -0,0 +1,29 @@ +module EmailLogsMixin + def self.included(klass) + klass.attributes :id, + :to_address, + :email_type, + :user_id, + :created_at, + :post_url, + :post_description + + klass.has_one :user, serializer: BasicUserSerializer, embed: :objects + end + + def post_url + object.post.url + end + + def include_post_url? + object.post.present? + end + + def include_post_description? + object.post.present? && object.post.topic.present? + end + + def post_description + "#{object.post.topic.title} ##{object.post.post_number}" + end +end diff --git a/app/serializers/concerns/user_auth_tokens_mixin.rb b/app/serializers/concerns/user_auth_tokens_mixin.rb new file mode 100644 index 0000000000..e4dac0e2a5 --- /dev/null +++ b/app/serializers/concerns/user_auth_tokens_mixin.rb @@ -0,0 +1,71 @@ +module UserAuthTokensMixin + extend ActiveSupport::Concern + + included do + attributes :id, + :client_ip, + :os, + :device_name, + :icon, + :created_at + end + + def client_ip + object.client_ip.to_s + end + + def os + case object.user_agent + when /Android/i + 'Android' + when /iPhone|iPad|iPod/i + 'iOS' + when /Macintosh/i + 'macOS' + when /Linux/i + 'Linux' + when /Windows/i + 'Windows' + else + I18n.t('staff_action_logs.unknown') + end + end + + def device_name + case object.user_agent + when /Android/i + I18n.t('user_auth_tokens.devices.android') + when /iPad/i + I18n.t('user_auth_tokens.devices.ipad') + when /iPhone/i + I18n.t('user_auth_tokens.devices.iphone') + when /iPod/i + I18n.t('user_auth_tokens.devices.ipod') + when /Mobile/i + I18n.t('user_auth_tokens.devices.mobile') + when /Macintosh/i + I18n.t('user_auth_tokens.devices.mac') + when /Linux/i + I18n.t('user_auth_tokens.devices.linux') + when /Windows/i + I18n.t('user_auth_tokens.devices.windows') + else + I18n.t('user_auth_tokens.devices.unknown') + end + end + + def icon + case os + when 'Android' + 'android' + when 'macOS', 'iOS' + 'apple' + when 'Linux' + 'linux' + when 'Windows' + 'windows' + else + 'question' + end + end +end diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb index 37395c5b8b..2ddfe2533e 100644 --- a/app/serializers/current_user_serializer.rb +++ b/app/serializers/current_user_serializer.rb @@ -40,11 +40,12 @@ class CurrentUserSerializer < BasicUserSerializer :primary_group_id, :primary_group_name, :can_create_topic, - :can_post_link, - :external_id + :link_posting_access, + :external_id, + :top_category_ids - def can_post_link - scope.can_post_link? + def link_posting_access + scope.link_posting_access end def can_create_topic @@ -100,7 +101,7 @@ class CurrentUserSerializer < BasicUserSerializer end def can_send_private_email_messages - scope.cand_send_private_messages_to_email? + scope.can_send_private_messages_to_email? end def can_edit @@ -153,9 +154,21 @@ class CurrentUserSerializer < BasicUserSerializer end def muted_category_ids - @muted_category_ids ||= CategoryUser.where(user_id: object.id, - notification_level: TopicUser.notification_levels[:muted]) + CategoryUser.lookup(object, :muted).pluck(:category_id) + end + + def top_category_ids + omitted_notification_levels = [CategoryUser.notification_levels[:muted], CategoryUser.notification_levels[:regular]] + CategoryUser.where(user_id: object.id) + .where.not(notification_level: omitted_notification_levels) + .order(" + CASE + WHEN notification_level = 3 THEN 1 + WHEN notification_level = 2 THEN 2 + WHEN notification_level = 4 THEN 3 + END") .pluck(:category_id) + .slice(0, SiteSetting.header_dropdown_category_count) end def dismissed_banner_key diff --git a/app/serializers/detailed_user_badge_serializer.rb b/app/serializers/detailed_user_badge_serializer.rb index b32f72b6b8..91c52562df 100644 --- a/app/serializers/detailed_user_badge_serializer.rb +++ b/app/serializers/detailed_user_badge_serializer.rb @@ -1,5 +1,5 @@ class DetailedUserBadgeSerializer < BasicUserBadgeSerializer - has_one :granted_by + has_one :granted_by, serializer: UserBadgeSerializer::UserSerializer attributes :post_number, :topic_id, :topic_title diff --git a/app/serializers/draft_serializer.rb b/app/serializers/draft_serializer.rb new file mode 100644 index 0000000000..52399d3588 --- /dev/null +++ b/app/serializers/draft_serializer.rb @@ -0,0 +1,56 @@ +require_relative 'post_item_excerpt' + +class DraftSerializer < ApplicationSerializer + include PostItemExcerpt + + attributes :created_at, + :draft_key, + :sequence, + :draft_username, + :avatar_template, + :data, + :topic_id, + :username, + :username_lower, + :name, + :user_id, + :title, + :slug, + :category_id, + :closed, + :archetype, + :archived + + def avatar_template + User.avatar_template(object.username, object.uploaded_avatar_id) + end + + def slug + Slug.for(object.title) + end + + def include_slug? + object.title.present? + end + + def closed + object.topic_closed + end + + def archived + object.topic_archived + end + + def include_closed? + object.topic_closed.present? + end + + def include_archived? + object.topic_archived.present? + end + + def include_category_id? + object.category_id.present? + end + +end diff --git a/app/serializers/email_log_serializer.rb b/app/serializers/email_log_serializer.rb index 1d83496b85..75c7010298 100644 --- a/app/serializers/email_log_serializer.rb +++ b/app/serializers/email_log_serializer.rb @@ -1,37 +1,17 @@ class EmailLogSerializer < ApplicationSerializer + include EmailLogsMixin - attributes :id, - :reply_key, - :to_address, - :email_type, - :user_id, - :created_at, - :skipped, - :skipped_reason, - :post_url, - :post_description, + attributes :reply_key, :bounced has_one :user, serializer: BasicUserSerializer, embed: :objects - def include_skipped_reason? - object.skipped + def include_reply_key? + reply_keys = @options[:reply_keys] + reply_keys.present? && reply_keys[[object.post_id, object.user_id]] end - def post_url - object.post.url + def reply_key + @options[:reply_keys][[object.post_id, object.user_id]].delete("-") end - - def include_post_url? - object.post.present? - end - - def include_post_description? - object.post.present? && object.post.topic.present? - end - - def post_description - "#{object.post.topic.title} ##{object.post.post_number}" - end - end diff --git a/app/serializers/flagged_user_serializer.rb b/app/serializers/flagged_user_serializer.rb index c9ec0aa6e8..9ada8a7296 100644 --- a/app/serializers/flagged_user_serializer.rb +++ b/app/serializers/flagged_user_serializer.rb @@ -3,7 +3,8 @@ class FlaggedUserSerializer < BasicUserSerializer :can_be_deleted, :post_count, :topic_count, - :ip_address + :ip_address, + :custom_fields def can_delete_all_posts scope.can_delete_all_posts?(object) @@ -17,4 +18,15 @@ class FlaggedUserSerializer < BasicUserSerializer object.ip_address.try(:to_s) end + def custom_fields + fields = User.whitelisted_user_custom_fields(scope) + + result = {} + fields.each do |k| + result[k] = object.custom_fields[k] if object.custom_fields[k].present? + end + + result + end + end diff --git a/app/serializers/group_show_serializer.rb b/app/serializers/group_show_serializer.rb index e97d49e9eb..2772e08c4f 100644 --- a/app/serializers/group_show_serializer.rb +++ b/app/serializers/group_show_serializer.rb @@ -1,5 +1,5 @@ class GroupShowSerializer < BasicGroupSerializer - attributes :is_group_user, :is_group_owner, :mentionable, :messageable + attributes :is_group_user, :is_group_owner, :is_group_owner_display, :mentionable, :messageable def include_is_group_user? authenticated? @@ -17,6 +17,14 @@ class GroupShowSerializer < BasicGroupSerializer scope.is_admin? || fetch_group_user&.owner end + def include_is_group_owner_display? + authenticated? + end + + def is_group_owner_display + !!fetch_group_user&.owner + end + def include_mentionable? authenticated? end diff --git a/app/serializers/listable_topic_serializer.rb b/app/serializers/listable_topic_serializer.rb index aeecddbeae..40b29f6383 100644 --- a/app/serializers/listable_topic_serializer.rb +++ b/app/serializers/listable_topic_serializer.rb @@ -121,8 +121,8 @@ class ListableTopicSerializer < BasicTopicSerializer protected - def unread_helper - @unread_helper ||= Unread.new(object, object.user_data, scope) - end + def unread_helper + @unread_helper ||= Unread.new(object, object.user_data, scope) + end end diff --git a/app/serializers/post_action_type_serializer.rb b/app/serializers/post_action_type_serializer.rb index 718c84a5b7..9ea2847e9a 100644 --- a/app/serializers/post_action_type_serializer.rb +++ b/app/serializers/post_action_type_serializer.rb @@ -45,9 +45,9 @@ class PostActionTypeSerializer < ApplicationSerializer protected - def i18n(field, vars = nil) - key = "post_action_types.#{name_key}.#{field}" - vars ? I18n.t(key, vars) : I18n.t(key) - end + def i18n(field, vars = nil) + key = "post_action_types.#{name_key}.#{field}" + vars ? I18n.t(key, vars) : I18n.t(key) + end end diff --git a/app/serializers/post_revision_serializer.rb b/app/serializers/post_revision_serializer.rb index e8c7e9f16e..6bfb7dbb03 100644 --- a/app/serializers/post_revision_serializer.rb +++ b/app/serializers/post_revision_serializer.rb @@ -173,94 +173,94 @@ class PostRevisionSerializer < ApplicationSerializer protected - def post - @post ||= object.post + def post + @post ||= object.post + end + + def topic + @topic ||= object.post.topic + end + + def revisions + @revisions ||= all_revisions.select { |r| scope.can_view_hidden_post_revisions? || !r["hidden"] } + end + + def all_revisions + return @all_revisions if @all_revisions + + post_revisions = PostRevision.where(post_id: object.post_id).order(:number).to_a + + latest_modifications = { + "raw" => [post.raw], + "cooked" => [post.cooked], + "edit_reason" => [post.edit_reason], + "wiki" => [post.wiki], + "post_type" => [post.post_type], + "user_id" => [post.user_id] + } + + # Retrieve any `tracked_topic_fields` + PostRevisor.tracked_topic_fields.each_key do |field| + latest_modifications[field.to_s] = [topic.send(field)] if topic.respond_to?(field) end - def topic - @topic ||= object.post.topic - end + latest_modifications["featured_link"] = [post.topic.featured_link] if SiteSetting.topic_featured_link_enabled + latest_modifications["tags"] = [topic.tags.pluck(:name)] if scope.can_see_tags?(topic) - def revisions - @revisions ||= all_revisions.select { |r| scope.can_view_hidden_post_revisions? || !r["hidden"] } - end + post_revisions << PostRevision.new( + number: post_revisions.last.number + 1, + hidden: post.hidden, + modifications: latest_modifications + ) - def all_revisions - return @all_revisions if @all_revisions + @all_revisions = [] - post_revisions = PostRevision.where(post_id: object.post_id).order(:number).to_a + # backtrack + post_revisions.each do |pr| + revision = HashWithIndifferentAccess.new + revision[:revision] = pr.number + revision[:hidden] = pr.hidden - latest_modifications = { - "raw" => [post.raw], - "cooked" => [post.cooked], - "edit_reason" => [post.edit_reason], - "wiki" => [post.wiki], - "post_type" => [post.post_type], - "user_id" => [post.user_id] - } - - # Retrieve any `tracked_topic_fields` - PostRevisor.tracked_topic_fields.each_key do |field| - latest_modifications[field.to_s] = [topic.send(field)] if topic.respond_to?(field) + pr.modifications.each_key do |field| + revision[field] = pr.modifications[field][0] end - latest_modifications["featured_link"] = [post.topic.featured_link] if SiteSetting.topic_featured_link_enabled - latest_modifications["tags"] = [topic.tags.pluck(:name)] if scope.can_see_tags?(topic) - - post_revisions << PostRevision.new( - number: post_revisions.last.number + 1, - hidden: post.hidden, - modifications: latest_modifications - ) - - @all_revisions = [] - - # backtrack - post_revisions.each do |pr| - revision = HashWithIndifferentAccess.new - revision[:revision] = pr.number - revision[:hidden] = pr.hidden - - pr.modifications.each_key do |field| - revision[field] = pr.modifications[field][0] - end - - @all_revisions << revision - end - - # waterfall - (@all_revisions.count - 1).downto(1).each do |r| - cur = @all_revisions[r] - prev = @all_revisions[r - 1] - - cur.each_key do |field| - prev[field] = prev.has_key?(field) ? prev[field] : cur[field] - end - end - - @all_revisions + @all_revisions << revision end - def previous - @previous ||= revisions.select { |r| r["revision"] <= current_revision }.last - end + # waterfall + (@all_revisions.count - 1).downto(1).each do |r| + cur = @all_revisions[r] + prev = @all_revisions[r - 1] - def current - @current ||= revisions.select { |r| r["revision"] > current_revision }.first - end - - def user - # if stuff goes pear shape attribute to system - object.user || Discourse.system_user - end - - def filter_visible_tags(tags) - if tags.is_a?(Array) && tags.size > 0 - @hidden_tag_names ||= DiscourseTagging.hidden_tag_names(scope) - tags - @hidden_tag_names - else - tags + cur.each_key do |field| + prev[field] = prev.has_key?(field) ? prev[field] : cur[field] end end + @all_revisions + end + + def previous + @previous ||= revisions.select { |r| r["revision"] <= current_revision }.last + end + + def current + @current ||= revisions.select { |r| r["revision"] > current_revision }.first + end + + def user + # if stuff goes pear shape attribute to system + object.user || Discourse.system_user + end + + def filter_visible_tags(tags) + if tags.is_a?(Array) && tags.size > 0 + @hidden_tag_names ||= DiscourseTagging.hidden_tag_names(scope) + tags - @hidden_tag_names + else + tags + end + end + end diff --git a/app/serializers/post_serializer.rb b/app/serializers/post_serializer.rb index e66fa720fd..d389cecafe 100644 --- a/app/serializers/post_serializer.rb +++ b/app/serializers/post_serializer.rb @@ -380,26 +380,26 @@ class PostSerializer < BasicPostSerializer private - def topic - @topic = object.topic - @topic ||= Topic.with_deleted.find(object.topic_id) if scope.is_staff? - @topic - end + def topic + @topic = object.topic + @topic ||= Topic.with_deleted.find(object.topic_id) if scope.is_staff? + @topic + end - def post_actions - @post_actions ||= (@topic_view&.all_post_actions || {})[object.id] - end + def post_actions + @post_actions ||= (@topic_view&.all_post_actions || {})[object.id] + end - def active_flags - @active_flags ||= (@topic_view&.all_active_flags || {})[object.id] - end + def active_flags + @active_flags ||= (@topic_view&.all_active_flags || {})[object.id] + end - def post_custom_fields - @post_custom_fields ||= if @topic_view - (@topic_view.post_custom_fields || {})[object.id] || {} - else - object.custom_fields - end + def post_custom_fields + @post_custom_fields ||= if @topic_view + (@topic_view.post_custom_fields || {})[object.id] || {} + else + object.custom_fields end + end end diff --git a/app/serializers/post_stream_serializer_mixin.rb b/app/serializers/post_stream_serializer_mixin.rb index 26213f059c..efe69a9285 100644 --- a/app/serializers/post_stream_serializer_mixin.rb +++ b/app/serializers/post_stream_serializer_mixin.rb @@ -3,18 +3,43 @@ require_dependency 'post_serializer' require_dependency 'timeline_lookup' module PostStreamSerializerMixin - def self.included(klass) klass.attributes :post_stream klass.attributes :timeline_lookup end + def include_stream? + true + end + + def include_gaps? + true + end + def post_stream - result = { posts: posts, stream: object.filtered_post_ids } - result[:gaps] = GapSerializer.new(object.gaps, root: false) if object.gaps.present? + result = { posts: posts } + + if include_stream? + if !object.is_mega_topic? + result[:stream] = object.filtered_post_ids + else + result[:isMegaTopic] = true + result[:firstId] = object.first_post_id + result[:lastId] = object.last_post_id + end + end + + if include_gaps? && object.gaps.present? + result[:gaps] = GapSerializer.new(object.gaps, root: false) + end + result end + def include_timeline_lookup? + !object.is_mega_topic? + end + def timeline_lookup TimelineLookup.build(object.filtered_post_stream) end diff --git a/app/serializers/site_serializer.rb b/app/serializers/site_serializer.rb index bd52b8d2e2..4b162bf128 100644 --- a/app/serializers/site_serializer.rb +++ b/app/serializers/site_serializer.rb @@ -35,15 +35,16 @@ class SiteSerializer < ApplicationSerializer has_many :categories, serializer: BasicCategorySerializer, embed: :objects has_many :trust_levels, embed: :objects has_many :archetypes, embed: :objects, serializer: ArchetypeSerializer - has_many :user_fields, embed: :objects, serialzer: UserFieldSerializer + has_many :user_fields, embed: :objects, serializer: UserFieldSerializer + has_many :auth_providers, embed: :objects, serializer: AuthProviderSerializer def user_themes cache_fragment("user_themes") do - Theme.where('key = :default OR user_selectable', - default: SiteSetting.default_theme_key) + Theme.where('id = :default OR user_selectable', + default: SiteSetting.default_theme_id) .order(:name) - .pluck(:key, :name) - .map { |k, n| { theme_key: k, name: n, default: k == SiteSetting.default_theme_key } } + .pluck(:id, :name) + .map { |id, n| { theme_id: id, name: n, default: id == SiteSetting.default_theme_id } } .as_json end end diff --git a/app/serializers/skipped_email_log_serializer.rb b/app/serializers/skipped_email_log_serializer.rb new file mode 100644 index 0000000000..9527f6f8c7 --- /dev/null +++ b/app/serializers/skipped_email_log_serializer.rb @@ -0,0 +1,9 @@ +class SkippedEmailLogSerializer < ApplicationSerializer + include EmailLogsMixin + + attributes :skipped_reason + + def skipped_reason + object.reason + end +end diff --git a/app/serializers/tag_group_serializer.rb b/app/serializers/tag_group_serializer.rb index 47db578ce8..cdfec08ef6 100644 --- a/app/serializers/tag_group_serializer.rb +++ b/app/serializers/tag_group_serializer.rb @@ -12,12 +12,14 @@ class TagGroupSerializer < ApplicationSerializer def permissions @permissions ||= begin h = {} - object.tag_group_permissions.joins(:group).includes(:group).order("groups.name").each do |tgp| - h[tgp.group.name] = tgp.permission_type - end - if h.size == 0 - h['everyone'] = TagGroupPermission.permission_types[:full] + + object.tag_group_permissions.joins(:group).includes(:group).find_each do |tgp| + name = Group::AUTO_GROUP_IDS.fetch(tgp.group_id, tgp.group.name).to_s + h[name] = tgp.permission_type end + + h["everyone"] = TagGroupPermission.permission_types[:full] if h.empty? + h end end diff --git a/app/serializers/theme_serializer.rb b/app/serializers/theme_serializer.rb index 4938b5fac9..d8e6f5e662 100644 --- a/app/serializers/theme_serializer.rb +++ b/app/serializers/theme_serializer.rb @@ -33,10 +33,10 @@ class ThemeFieldSerializer < ApplicationSerializer end class ChildThemeSerializer < ApplicationSerializer - attributes :id, :name, :key, :created_at, :updated_at, :default + attributes :id, :name, :created_at, :updated_at, :default, :component def include_default? - object.key == SiteSetting.default_theme_key + object.id == SiteSetting.default_theme_id end def default @@ -46,13 +46,18 @@ end class RemoteThemeSerializer < ApplicationSerializer attributes :id, :remote_url, :remote_version, :local_version, :about_url, - :license_url, :commits_behind, :remote_updated_at, :updated_at + :license_url, :commits_behind, :remote_updated_at, :updated_at, + :github_diff_link # wow, AMS has some pretty nutty logic where it tries to find the path here # from action dispatch, tell it not to def about_url object.about_url end + + def include_github_diff_link? + github_diff_link.present? + end end class ThemeSerializer < ChildThemeSerializer @@ -71,6 +76,10 @@ class ThemeSerializer < ChildThemeSerializer def settings object.settings.map { |setting| ThemeSettingsSerializer.new(setting, root: false) } end + + def include_child_themes? + !object.component? + end end class ThemeFieldWithEmbeddedUploadsSerializer < ThemeFieldSerializer diff --git a/app/serializers/theme_settings_serializer.rb b/app/serializers/theme_settings_serializer.rb index cb3aa20794..d7fe44c140 100644 --- a/app/serializers/theme_settings_serializer.rb +++ b/app/serializers/theme_settings_serializer.rb @@ -1,5 +1,6 @@ class ThemeSettingsSerializer < ApplicationSerializer - attributes :setting, :type, :default, :value, :description, :valid_values + attributes :setting, :type, :default, :value, :description, :valid_values, + :list_type def setting object.name @@ -32,4 +33,12 @@ class ThemeSettingsSerializer < ApplicationSerializer def include_description? object.description.present? end + + def list_type + object.list_type + end + + def include_list_type? + object.type == ThemeSetting.types[:list] + end end diff --git a/app/serializers/topic_flag_type_serializer.rb b/app/serializers/topic_flag_type_serializer.rb index c0ac6951bd..4caa98a698 100644 --- a/app/serializers/topic_flag_type_serializer.rb +++ b/app/serializers/topic_flag_type_serializer.rb @@ -2,9 +2,9 @@ class TopicFlagTypeSerializer < PostActionTypeSerializer protected - def i18n(field, vars = nil) - key = "topic_flag_types.#{name_key}.#{field}" - vars ? I18n.t(key, vars) : I18n.t(key) - end + def i18n(field, vars = nil) + key = "topic_flag_types.#{name_key}.#{field}" + vars ? I18n.t(key, vars) : I18n.t(key) + end end diff --git a/app/serializers/topic_link_serializer.rb b/app/serializers/topic_link_serializer.rb index 42367857c5..4ef9afc65b 100644 --- a/app/serializers/topic_link_serializer.rb +++ b/app/serializers/topic_link_serializer.rb @@ -2,7 +2,7 @@ class TopicLinkSerializer < ApplicationSerializer attributes :url, :title, - :fancy_title, + # :fancy_title, :internal, :attachment, :reflection, @@ -11,44 +11,12 @@ class TopicLinkSerializer < ApplicationSerializer :domain, :root_domain, - def url - object['url'] - end - - def title - object['title'] - end - - def fancy_title - object['fancy_title'] - end - - def internal - object['internal'] == 't' - end - def attachment - Discourse.store.has_been_uploaded?(object['url']) - end - - def reflection - object['reflection'] == 't' - end - - def clicks - object['clicks'].to_i - end - - def user_id - object['user_id'].to_i + Discourse.store.has_been_uploaded?(object.url) end def include_user_id? - object['user_id'].present? - end - - def domain - object['domain'] + object.user_id.present? end def root_domain diff --git a/app/serializers/topic_view_posts_serializer.rb b/app/serializers/topic_view_posts_serializer.rb index 98c6cabff7..4fbd733051 100644 --- a/app/serializers/topic_view_posts_serializer.rb +++ b/app/serializers/topic_view_posts_serializer.rb @@ -8,4 +8,16 @@ class TopicViewPostsSerializer < ApplicationSerializer object.topic.id end + def include_stream? + false + end + + def include_gaps? + false + end + + def include_timeline_lookup? + false + end + end diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb index 44479aa7e0..a14dd9ff30 100644 --- a/app/serializers/topic_view_serializer.rb +++ b/app/serializers/topic_view_serializer.rb @@ -67,7 +67,7 @@ class TopicViewSerializer < ApplicationSerializer :message_bus_last_id, :participant_count, :destination_category_id, - :pm_with_non_human_user, + :pm_with_non_human_user # TODO: Split off into proper object / serializer def details @@ -186,10 +186,8 @@ class TopicViewSerializer < ApplicationSerializer end def last_read_post_id - return nil unless object.filtered_post_stream && last_read_post_number - object.filtered_post_stream.each do |ps| - return ps[0] if ps[1] === last_read_post_number - end + return nil unless last_read_post_number + object.filtered_post_id(last_read_post_number) end alias_method :include_last_read_post_id?, :has_topic_user? @@ -301,8 +299,8 @@ class TopicViewSerializer < ApplicationSerializer private - def private_message?(topic) - @private_message ||= topic.private_message? - end + def private_message?(topic) + @private_message ||= topic.private_message? + end end diff --git a/app/serializers/upload_serializer.rb b/app/serializers/upload_serializer.rb index a02fbef9b0..9e2098b815 100644 --- a/app/serializers/upload_serializer.rb +++ b/app/serializers/upload_serializer.rb @@ -5,6 +5,8 @@ class UploadSerializer < ApplicationSerializer :filesize, :width, :height, + :thumbnail_width, + :thumbnail_height, :extension, :short_url, :retain_hours diff --git a/app/serializers/user_auth_token_log_serializer.rb b/app/serializers/user_auth_token_log_serializer.rb new file mode 100644 index 0000000000..220d9aa477 --- /dev/null +++ b/app/serializers/user_auth_token_log_serializer.rb @@ -0,0 +1,16 @@ +class UserAuthTokenLogSerializer < ApplicationSerializer + include UserAuthTokensMixin + + attributes :action + + def action + case object.action + when 'generate' + I18n.t('log_in') + when 'destroy' + I18n.t('unsubscribe.log_out') + else + I18n.t('staff_action_logs.unknown') + end + end +end diff --git a/app/serializers/user_auth_token_serializer.rb b/app/serializers/user_auth_token_serializer.rb new file mode 100644 index 0000000000..8a9fa01c99 --- /dev/null +++ b/app/serializers/user_auth_token_serializer.rb @@ -0,0 +1,5 @@ +class UserAuthTokenSerializer < ApplicationSerializer + include UserAuthTokensMixin + + attributes :seen_at +end diff --git a/app/serializers/user_option_serializer.rb b/app/serializers/user_option_serializer.rb index 6bccbe8176..23b86fddd2 100644 --- a/app/serializers/user_option_serializer.rb +++ b/app/serializers/user_option_serializer.rb @@ -19,7 +19,7 @@ class UserOptionSerializer < ApplicationSerializer :email_in_reply_to, :like_notification_frequency, :include_tl0_in_digests, - :theme_key, + :theme_ids, :theme_key_seq, :allow_private_messages, :homepage_id, @@ -36,8 +36,8 @@ class UserOptionSerializer < ApplicationSerializer object.new_topic_duration_minutes || SiteSetting.default_other_new_topic_duration_minutes end - def theme_key - object.theme_key || SiteSetting.default_theme_key + def theme_ids + object.theme_ids.presence || [SiteSetting.default_theme_id] end end diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb index f7b56ebf4b..eedadd87bf 100644 --- a/app/serializers/user_serializer.rb +++ b/app/serializers/user_serializer.rb @@ -73,7 +73,10 @@ class UserSerializer < BasicUserSerializer :primary_group_flair_bg_color, :primary_group_flair_color, :staged, - :second_factor_enabled + :second_factor_enabled, + :second_factor_backup_enabled, + :second_factor_remaining_backup_codes, + :associated_accounts has_one :invited_by, embed: :object, serializer: BasicUserSerializer has_many :groups, embed: :object, serializer: BasicGroupSerializer @@ -109,7 +112,9 @@ class UserSerializer < BasicUserSerializer :muted_usernames, :mailing_list_posts_per_day, :can_change_bio, - :user_api_keys + :user_api_keys, + :user_auth_tokens, + :user_auth_token_logs untrusted_attributes :bio_raw, :bio_cooked, @@ -143,6 +148,10 @@ class UserSerializer < BasicUserSerializer (scope.is_staff? && object.staged?) end + def include_associated_accounts? + (object.id && object.id == scope.user.try(:id)) + end + def include_second_factor_enabled? (object&.id == scope.user&.id) || scope.is_staff? end @@ -151,6 +160,22 @@ class UserSerializer < BasicUserSerializer object.totp_enabled? end + def include_second_factor_backup_enabled? + object&.id == scope.user&.id + end + + def second_factor_backup_enabled + object.backup_codes_enabled? + end + + def include_second_factor_remaining_backup_codes? + (object&.id == scope.user&.id) && object.backup_codes_enabled? + end + + def second_factor_remaining_backup_codes + object.remaining_backup_codes + end + def can_change_bio !(SiteSetting.enable_sso && SiteSetting.sso_overrides_bio) end @@ -161,13 +186,31 @@ class UserSerializer < BasicUserSerializer id: k.id, application_name: k.application_name, scopes: k.scopes.map { |s| I18n.t("user_api_key.scopes.#{s}") }, - created_at: k.created_at + created_at: k.created_at, + last_used_at: k.last_used_at, } end + keys.sort! { |a, b| a[:last_used_at].to_time <=> b[:last_used_at].to_time } keys.length > 0 ? keys : nil end + def user_auth_tokens + ActiveModel::ArraySerializer.new( + object.user_auth_tokens.order(:seen_at).reverse_order, + each_serializer: UserAuthTokenSerializer + ) + end + + def user_auth_token_logs + ActiveModel::ArraySerializer.new( + object.user_auth_token_logs.where( + action: UserAuthToken::USER_ACTIONS + ).order(:created_at).reverse_order, + each_serializer: UserAuthTokenLogSerializer + ) + end + def bio_raw object.user_profile.bio_raw end @@ -183,7 +226,7 @@ class UserSerializer < BasicUserSerializer def website_name uri = begin URI(website.to_s) - rescue URI::InvalidURIError + rescue URI::Error end return if uri.nil? || uri.host.nil? diff --git a/app/serializers/user_summary_serializer.rb b/app/serializers/user_summary_serializer.rb index c641843796..fcb5a00aeb 100644 --- a/app/serializers/user_summary_serializer.rb +++ b/app/serializers/user_summary_serializer.rb @@ -22,6 +22,12 @@ class UserSummarySerializer < ApplicationSerializer attributes :count, :name end + class CategoryWithCountsSerializer < ApplicationSerializer + attributes :topic_count, :post_count, + :id, :name, :color, :text_color, :slug, + :read_restricted, :parent_category_id + end + has_many :topics, serializer: TopicSerializer has_many :replies, serializer: ReplySerializer, embed: :object has_many :links, serializer: LinkSerializer, embed: :object @@ -29,6 +35,7 @@ class UserSummarySerializer < ApplicationSerializer has_many :most_liked_users, serializer: UserWithCountSerializer, embed: :object has_many :most_replied_to_users, serializer: UserWithCountSerializer, embed: :object has_many :badges, serializer: UserBadgeSerializer, embed: :object + has_many :top_categories, serializer: CategoryWithCountsSerializer, embed: :object attributes :likes_given, :likes_received, diff --git a/app/serializers/web_hook_user_serializer.rb b/app/serializers/web_hook_user_serializer.rb index d715e4b025..1e89fc34d2 100644 --- a/app/serializers/web_hook_user_serializer.rb +++ b/app/serializers/web_hook_user_serializer.rb @@ -24,6 +24,8 @@ class WebHookUserSerializer < UserSerializer can_change_bio user_api_keys group_users + user_auth_tokens + user_auth_token_logs }.each do |attr| define_method("include_#{attr}?") do false diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb index 5e88683cff..6999be26e1 100644 --- a/app/services/badge_granter.rb +++ b/app/services/badge_granter.rb @@ -43,7 +43,6 @@ class BadgeGranter end if SiteSetting.enable_badges? - unless @badge.badge_type_id == BadgeType::Bronze && user_badge.granted_at < 2.days.ago I18n.with_locale(@user.effective_locale) do notification = @user.notifications.create( @@ -185,7 +184,7 @@ class BadgeGranter # hack to allow for params, otherwise sanitizer will trigger sprintf count_sql = "SELECT COUNT(*) count FROM (#{sql}) q WHERE :backfill = :backfill" - grant_count = SqlBuilder.map_exec(OpenStruct, count_sql, params).first.count.to_i + grant_count = DB.query_single(count_sql, params).first.to_i grants_sql = if opts[:target_posts] @@ -205,17 +204,18 @@ class BadgeGranter end query_plan = nil - # HACK: active record is weird, force it to go down the sanitization path that cares not for % stuff - query_plan = ActiveRecord::Base.exec_sql("EXPLAIN #{sql} /*:backfill*/", params) if opts[:explain] + # HACK: active record sanitization too flexible, force it to go down the sanitization path that cares not for % stuff + # note mini_sql uses AR sanitizer at the moment (review if changed) + query_plan = DB.query_hash("EXPLAIN #{sql} /*:backfill*/", params) if opts[:explain] - sample = SqlBuilder.map_exec(OpenStruct, grants_sql, params).map(&:to_h) + sample = DB.query(grants_sql, params) sample.each do |result| - raise "Query returned a non-existent user ID:\n#{result[:id]}" unless User.find(result[:id]).present? - raise "Query did not return a badge grant time\n(Try using 'current_timestamp granted_at')" unless result[:granted_at] + raise "Query returned a non-existent user ID:\n#{result.id}" unless User.exists?(id: result.id) + raise "Query did not return a badge grant time\n(Try using 'current_timestamp granted_at')" unless result.granted_at if opts[:target_posts] - raise "Query did not return a post ID" unless result[:post_id] - raise "Query returned a non-existent post ID:\n#{result[:post_id]}" unless Post.find(result[:post_id]).present? + raise "Query did not return a post ID" unless result.post_id + raise "Query returned a non-existent post ID:\n#{result.post_id}" unless Post.exists?(result.post_id).present? end end @@ -259,28 +259,31 @@ class BadgeGranter WHERE ub.badge_id = :id AND q.user_id IS NULL )" - Badge.exec_sql(sql, id: badge.id, - post_ids: [-1], - user_ids: [-2], - backfill: true, - multiple_grant: true # cheat here, cause we only run on backfill and are deleting - ) if badge.auto_revoke && full_backfill + DB.exec( + sql, + id: badge.id, + post_ids: [-1], + user_ids: [-2], + backfill: true, + multiple_grant: true # cheat here, cause we only run on backfill and are deleting + ) if badge.auto_revoke && full_backfill - sql = " WITH w as ( - INSERT INTO user_badges(badge_id, user_id, granted_at, granted_by_id, post_id) - SELECT :id, q.user_id, q.granted_at, -1, #{post_id_field} - FROM ( #{badge.query} ) q - LEFT JOIN user_badges ub ON - ub.badge_id = :id AND ub.user_id = q.user_id - #{post_clause} - /*where*/ - RETURNING id, user_id, granted_at - ) - select w.*, username, locale, (u.admin OR u.moderator) AS staff FROM w - JOIN users u on u.id = w.user_id - " + sql = <<~SQL + WITH w as ( + INSERT INTO user_badges(badge_id, user_id, granted_at, granted_by_id, post_id) + SELECT :id, q.user_id, q.granted_at, -1, #{post_id_field} + FROM ( #{badge.query} ) q + LEFT JOIN user_badges ub ON + ub.badge_id = :id AND ub.user_id = q.user_id + #{post_clause} + /*where*/ + RETURNING id, user_id, granted_at + ) + select w.*, username, locale, (u.admin OR u.moderator) AS staff FROM w + JOIN users u on u.id = w.user_id + SQL - builder = SqlBuilder.new(sql) + builder = DB.build(sql) builder.where("ub.badge_id IS NULL AND q.user_id <> -1") if (post_ids || user_ids) && !badge.query.include?(":backfill") @@ -298,11 +301,12 @@ class BadgeGranter return end - builder.map_exec(OpenStruct, id: badge.id, - multiple_grant: badge.multiple_grant, - backfill: full_backfill, - post_ids: post_ids || [-2], - user_ids: user_ids || [-2]).each do |row| + builder.query( + id: badge.id, + multiple_grant: badge.multiple_grant, + backfill: full_backfill, + post_ids: post_ids || [-2], + user_ids: user_ids || [-2]).each do |row| # old bronze badges do not matter next if badge.badge_type_id == (BadgeType::Bronze) && row.granted_at < (2.days.ago) @@ -333,10 +337,11 @@ class BadgeGranter }.to_json) end - Badge.exec_sql("UPDATE user_badges SET notification_id = :notification_id WHERE id = :id", - notification_id: notification.id, - id: row.id - ) + DB.exec( + "UPDATE user_badges SET notification_id = :notification_id WHERE id = :id", + notification_id: notification.id, + id: row.id + ) end badge.reset_grant_count! @@ -346,21 +351,22 @@ class BadgeGranter end def self.revoke_ungranted_titles! - Badge.exec_sql("UPDATE users SET title = '' - WHERE NOT title IS NULL AND - title <> '' AND - EXISTS ( - SELECT 1 - FROM user_profiles - WHERE user_id = users.id AND badge_granted_title - ) AND - title NOT IN ( - SELECT name - FROM badges - WHERE allow_title AND enabled AND - badges.id IN (SELECT badge_id FROM user_badges ub where ub.user_id = users.id) - ) - ") + DB.exec <<~SQL + UPDATE users SET title = '' + WHERE NOT title IS NULL AND + title <> '' AND + EXISTS ( + SELECT 1 + FROM user_profiles + WHERE user_id = users.id AND badge_granted_title + ) AND + title NOT IN ( + SELECT name + FROM badges + WHERE allow_title AND enabled AND + badges.id IN (SELECT badge_id FROM user_badges ub where ub.user_id = users.id) + ) + SQL end end diff --git a/app/services/destroy_task.rb b/app/services/destroy_task.rb index 86768a79f7..aa5c8c86bd 100644 --- a/app/services/destroy_task.rb +++ b/app/services/destroy_task.rb @@ -2,12 +2,13 @@ # we are capturing all log output into a log array to return # to the rake task rather than using `puts` statements. class DestroyTask - def self.destroy_topics(category) - c = Category.find_by_slug(category) + def self.destroy_topics(category, parent_category = nil) + c = Category.find_by_slug(category, parent_category) log = [] - return "A category with the slug: #{category} could not be found" if c.nil? + descriptive_slug = parent_category ? "#{parent_category}/#{category}" : category + return "A category with the slug: #{descriptive_slug} could not be found" if c.nil? topics = Topic.where(category_id: c.id, pinned_at: nil).where.not(user_id: -1) - log << "There are #{topics.count} topics to delete in #{category} category" + log << "There are #{topics.count} topics to delete in #{descriptive_slug} category" topics.each do |topic| log << "Deleting #{topic.slug}..." first_post = topic.ordered_posts.first @@ -24,7 +25,7 @@ class DestroyTask categories = Category.all log = [] categories.each do |c| - log << destroy_topics(c.slug) + log << destroy_topics(c.slug, c.parent_category&.slug) end log end diff --git a/app/services/group_action_logger.rb b/app/services/group_action_logger.rb index 58674016c3..bcd5e56908 100644 --- a/app/services/group_action_logger.rb +++ b/app/services/group_action_logger.rb @@ -58,21 +58,21 @@ class GroupActionLogger private - def excluded_attributes - [ - :bio_cooked, - :updated_at, - :created_at, - :user_count - ] - end + def excluded_attributes + [ + :bio_cooked, + :updated_at, + :created_at, + :user_count + ] + end - def default_params - { group: @group, acting_user: @acting_user } - end + def default_params + { group: @group, acting_user: @acting_user } + end - def can_edit? - raise Discourse::InvalidParameters.new unless Guardian.new(@acting_user).can_log_group_changes?(@group) - end + def can_edit? + raise Discourse::InvalidParameters.new unless Guardian.new(@acting_user).can_log_group_changes?(@group) + end end diff --git a/app/services/post_action_notifier.rb b/app/services/post_action_notifier.rb index cc42feec42..c4d988f25d 100644 --- a/app/services/post_action_notifier.rb +++ b/app/services/post_action_notifier.rb @@ -103,7 +103,8 @@ class PostActionNotifier Notification.types[:edited], post, display_username: post_revision.user.username, - acting_user_id: post_revision.try(:user_id) + acting_user_id: post_revision.try(:user_id), + revision_number: post_revision.number ) end diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 476856253b..84166bdd4c 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -90,7 +90,7 @@ class PostAlerter if new_record if post.topic.private_message? notify_pm_users(post, reply_to_user, notified) - elsif post.post_type == Post.types[:regular] + elsif notify_about_reply?(post) notify_post_users(post, notified) end end @@ -194,16 +194,18 @@ class PostAlerter } def group_stats(topic) + sql = <<~SQL + SELECT COUNT(*) FROM topics t + JOIN topic_allowed_groups g ON g.group_id = :group_id AND g.topic_id = t.id + LEFT JOIN group_archived_messages a ON a.topic_id = t.id AND a.group_id = g.group_id + WHERE a.id IS NULL AND t.deleted_at is NULL AND t.archetype = 'private_message' + SQL + topic.allowed_groups.map do |g| { group_id: g.id, group_name: g.name.downcase, - inbox_count: Topic.exec_sql( - "SELECT COUNT(*) FROM topics t - JOIN topic_allowed_groups g ON g.group_id = :group_id AND g.topic_id = t.id - LEFT JOIN group_archived_messages a ON a.topic_id = t.id AND a.group_id = g.group_id - WHERE a.id IS NULL AND t.deleted_at is NULL AND t.archetype = 'private_message'", - group_id: g.id).values[0][0].to_i + inbox_count: DB.query_single(sql, group_id: g.id).first.to_i } end end @@ -367,6 +369,7 @@ class PostAlerter original_post_id: original_post.id, original_post_type: original_post.post_type, original_username: original_username, + revision_number: opts[:revision_number], display_username: opts[:display_username] || post.user.username) if group = opts[:group] diff --git a/app/services/search_indexer.rb b/app/services/search_indexer.rb index 35ccd7a378..04dc32b697 100644 --- a/app/services/search_indexer.rb +++ b/app/services/search_indexer.rb @@ -61,7 +61,7 @@ class SearchIndexer # Would be nice to use AR here but not sure how to execut Postgres functions # when inserting data like this. - rows = Post.exec_sql_row_count(<<~SQL, params) + rows = DB.exec(<<~SQL, params) UPDATE #{table_name} SET raw_data = :raw_data, @@ -72,7 +72,7 @@ class SearchIndexer SQL if rows == 0 - Post.exec_sql(<<~SQL, params) + DB.exec(<<~SQL, params) INSERT INTO #{table_name} (#{foreign_key}, search_data, locale, raw_data, version) VALUES (:id, #{ranked_index}, :locale, :raw_data, :version) @@ -111,7 +111,7 @@ class SearchIndexer def self.queue_post_reindex(topic_id) return if @disabled - ActiveRecord::Base.exec_sql(<<~SQL, topic_id: topic_id) + DB.exec(<<~SQL, topic_id: topic_id) UPDATE post_search_data SET version = 0 WHERE post_id IN (SELECT id FROM posts WHERE topic_id = :topic_id) @@ -121,7 +121,8 @@ class SearchIndexer def self.index(obj, force: false) return if @disabled - category_name, tag_names = nil + category_name = nil + tag_names = nil topic = nil if Topic === obj @@ -148,8 +149,7 @@ class SearchIndexer if Topic === obj && (obj.saved_change_to_title? || force) if obj.posts - post = obj.posts.find_by(post_number: 1) - if post + if post = obj.posts.find_by(post_number: 1) SearchIndexer.update_posts_index(post.id, obj.title, category_name, tag_names, post.cooked) SearchIndexer.update_topics_index(obj.id, obj.title, post.cooked) end @@ -166,47 +166,45 @@ class SearchIndexer end class HtmlScrubber < Nokogiri::XML::SAX::Document - attr_reader :scrubbed - def initialize - @scrubbed = +"" + def self.strip_diacritics(str) + s = str.unicode_normalize(:nfkd) + s.gsub!(DIACRITICS, "") + s.strip! + s end - def self.scrub(html) - me = new - parser = Nokogiri::HTML::SAX::Parser.new(me) - begin - copy = +"
" - copy << html unless html.nil? - copy << "
" - parser.parse(html) unless html.nil? - end + attr_reader :scrubbed + + def initialize(strip_diacritics: false) + @scrubbed = +"" + # for now we are disabling this per: https://meta.discourse.org/t/discourse-should-ignore-if-a-character-is-accented-when-doing-a-search/90198/16?u=sam + @strip_diacritics = strip_diacritics + end + + def self.scrub(html, strip_diacritics: false) + return +"" if html.blank? + + me = new(strip_diacritics: strip_diacritics) + Nokogiri::HTML::SAX::Parser.new(me).parse("
#{html}
") me.scrubbed end - def start_element(name, attributes = []) + ATTRIBUTES ||= %w{alt title href data-youtube-title} + + def start_element(_, attributes = []) attributes = Hash[*attributes.flatten] - if attributes["alt"] - scrubbed << " " - scrubbed << attributes["alt"] - scrubbed << " " - end - if attributes["title"] - scrubbed << " " - scrubbed << attributes["title"] - scrubbed << " " - end - if attributes["data-youtube-title"] - scrubbed << " " - scrubbed << attributes["data-youtube-title"] - scrubbed << " " + + ATTRIBUTES.each do |name| + characters(attributes[name]) if attributes[name].present? end end - def characters(string) - scrubbed << " " - scrubbed << string - scrubbed << " " + DIACRITICS ||= /([\u0300-\u036f]|[\u1AB0-\u1AFF]|[\u1DC0-\u1DFF]|[\u20D0-\u20FF])/ + + def characters(str) + str = HtmlScrubber.strip_diacritics(str) if @strip_diacritics + scrubbed << " #{str} " end end end diff --git a/app/services/spam_rules_enforcer.rb b/app/services/spam_rules_enforcer.rb index ecfc2a1f6e..7a5133c1a6 100644 --- a/app/services/spam_rules_enforcer.rb +++ b/app/services/spam_rules_enforcer.rb @@ -12,8 +12,10 @@ class SpamRulesEnforcer end def enforce! - SpamRule::AutoSilence.new(@user).perform if @user - SpamRule::FlagSockpuppets.new(@post).perform if @post + I18n.with_locale(SiteSetting.default_locale) do + SpamRule::AutoSilence.new(@user).perform if @user + SpamRule::FlagSockpuppets.new(@post).perform if @post + end true end diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb index 07a47a4c48..aa2338b305 100644 --- a/app/services/staff_action_logger.rb +++ b/app/services/staff_action_logger.rb @@ -46,9 +46,9 @@ class StaffActionLogger topic = deleted_post.topic || Topic.with_deleted.find_by(id: deleted_post.topic_id) - username = deleted_post.user.try(:username) || "unknown" - name = deleted_post.user.try(:name) || "unknown" - topic_title = topic.try(:title) || "not found" + username = deleted_post.user.try(:username) || I18n.t('staff_action_logs.unknown') + name = deleted_post.user.try(:name) || I18n.t('staff_action_logs.unknown') + topic_title = topic.try(:title) || I18n.t('staff_action_logs.not_found') details = [ "id: #{deleted_post.id}", @@ -242,6 +242,16 @@ class StaffActionLogger )) end + def log_user_merge(user, source_username, source_email, opts = {}) + raise Discourse::InvalidParameters.new(:user) unless user + UserHistory.create!(params(opts).merge( + action: UserHistory.actions[:merge_user], + target_user_id: user.id, + context: I18n.t("staff_action_logs.user_merged", username: source_username), + email: source_email + )) + end + BADGE_FIELDS ||= %i{id name description long_description icon image badge_type_id badge_grouping_id query allow_title multiple_grant listable target_posts enabled auto_revoke show_posts system} @@ -526,15 +536,37 @@ class StaffActionLogger )) end + def log_post_rejected(rejected_post, opts = {}) + raise Discourse::InvalidParameters.new(:rejected_post) unless rejected_post && rejected_post.is_a?(QueuedPost) + + topic = rejected_post.topic || Topic.with_deleted.find_by(id: rejected_post.topic_id) + topic_title = topic&.title || I18n.t('staff_action_logs.not_found') + username = rejected_post.user&.username || I18n.t('staff_action_logs.unknown') + name = rejected_post.user&.name || I18n.t('staff_action_logs.unknown') + + details = [ + "created_at: #{rejected_post.created_at}", + "rejected_at: #{rejected_post.rejected_at}", + "user: #{username} (#{name})", + "topic: #{topic_title}", + "raw: #{rejected_post.raw}", + ] + + UserHistory.create!(params(opts).merge( + action: UserHistory.actions[:post_rejected], + details: details.join("\n") + )) + end + private - def params(opts = nil) - opts ||= {} - { acting_user_id: @admin.id, context: opts[:context] } - end + def params(opts = nil) + opts ||= {} + { acting_user_id: @admin.id, context: opts[:context] } + end - def validate_category(category) - raise Discourse::InvalidParameters.new(:category) unless category && category.is_a?(Category) - end + def validate_category(category) + raise Discourse::InvalidParameters.new(:category) unless category && category.is_a?(Category) + end end diff --git a/app/services/user_anonymizer.rb b/app/services/user_anonymizer.rb index 7184f1ac87..daaa976301 100644 --- a/app/services/user_anonymizer.rb +++ b/app/services/user_anonymizer.rb @@ -20,17 +20,22 @@ class UserAnonymizer @prev_email = @user.email @prev_username = @user.username - @user.update_attribute(:uploaded_avatar_id, nil) - raise "Failed to change username" unless UsernameChanger.change(@user, make_anon_username) + unless UsernameChanger.new(@user, make_anon_username).change(run_update_job: false) + raise "Failed to change username" + end @user.reload @user.password = SecureRandom.hex - @user.email = "#{@user.username}@example.com" + @user.email = "#{@user.username}@anonymized.invalid" @user.name = SiteSetting.full_name_required ? @user.username : nil @user.date_of_birth = nil @user.title = nil + @user.uploaded_avatar_id = nil - anonymize_ips(@opts[:anonymize_ip]) if @opts.has_key?(:anonymize_ip) + if @opts.has_key?(:anonymize_ip) + @user.ip_address = @opts[:anonymize_ip] + @user.registration_ip_address = @opts[:anonymize_ip] + end @user.save @@ -42,9 +47,10 @@ class UserAnonymizer options.email_direct = false options.save - profile = @user.user_profile - profile.destroy if profile - @user.create_user_profile + if profile = @user.user_profile + profile.update(location: nil, website: nil, bio_raw: nil, bio_cooked: nil, + profile_background: nil, card_background: nil) + end @user.user_avatar.try(:destroy) @user.twitter_user_info.try(:destroy) @@ -52,62 +58,50 @@ class UserAnonymizer @user.github_user_info.try(:destroy) @user.facebook_user_info.try(:destroy) @user.single_sign_on_record.try(:destroy) - @user.oauth2_user_info.try(:destroy) + @user.oauth2_user_infos.try(:destroy_all) @user.instagram_user_info.try(:destroy) @user.user_open_ids.find_each { |x| x.destroy } @user.api_key.try(:destroy) - history_details = { - action: UserHistory.actions[:anonymize_user], - target_user_id: @user.id, - acting_user_id: @actor ? @actor.id : @user.id, - } - - if SiteSetting.log_anonymizer_details? - history_details[:email] = @prev_email - history_details[:details] = "username: #{@prev_username}" - end - - @user_history = UserHistory.create(history_details) + @user_history = log_action end + UsernameChanger.update_username(user_id: @user.id, + old_username: @prev_username, + new_username: @user.username, + avatar_template: @user.avatar_template) + + Jobs.enqueue(:anonymize_user, + user_id: @user.id, + prev_email: @prev_email, + anonymize_ip: @opts[:anonymize_ip]) + DiscourseEvent.trigger(:user_anonymized, user: @user, opts: @opts) @user end private - def make_anon_username - 100.times do - new_username = "anon#{(SecureRandom.random_number * 100000000).to_i}" - return new_username unless User.where(username_lower: new_username).exists? - end - raise "Failed to generate an anon username" + def make_anon_username + 100.times do + new_username = "anon#{(SecureRandom.random_number * 100000000).to_i}" + return new_username unless User.where(username_lower: new_username).exists? + end + raise "Failed to generate an anon username" + end + + def log_action + history_details = { + action: UserHistory.actions[:anonymize_user], + target_user_id: @user.id, + acting_user_id: @actor ? @actor.id : @user.id, + } + + if SiteSetting.log_anonymizer_details? + history_details[:email] = @prev_email + history_details[:details] = "username: #{@prev_username}" end - def ip_where(column = 'user_id') - ["#{column} = :user_id AND ip_address IS NOT NULL", user_id: @user.id] + UserHistory.create(history_details) end - - def anonymize_ips(new_ip) - @user.ip_address = new_ip - @user.registration_ip_address = new_ip - - IncomingLink.where(ip_where('current_user_id')).update_all(ip_address: new_ip) - ScreenedEmail.where(email: @prev_email).update_all(ip_address: new_ip) - SearchLog.where(ip_where).update_all(ip_address: new_ip) - TopicLinkClick.where(ip_where).update_all(ip_address: new_ip) - TopicViewItem.where(ip_where).update_all(ip_address: new_ip) - UserHistory.where(ip_where('acting_user_id')).update_all(ip_address: new_ip) - UserProfileView.where(ip_where).update_all(ip_address: new_ip) - - # UserHistory for delete_user logs the user's IP. Note this is quite ugly but we don't - # have a better way of querying on details right now. - UserHistory.where( - "action = :action AND details LIKE 'id: #{@user.id}\n%'", - action: UserHistory.actions[:delete_user] - ).update_all(ip_address: new_ip) - - end - end diff --git a/app/services/user_destroyer.rb b/app/services/user_destroyer.rb index b245bd32d8..956171593b 100644 --- a/app/services/user_destroyer.rb +++ b/app/services/user_destroyer.rb @@ -81,9 +81,14 @@ class UserDestroyer end unless opts[:quiet] - StaffActionLogger.new(@actor == user ? Discourse.system_user : @actor).log_user_deletion(user, opts.slice(:context)) + if @actor == user + deleted_by = Discourse.system_user + opts[:context] = I18n.t("staff_action_logs.user_delete_self", url: opts[:context]) + else + deleted_by = @actor + end + StaffActionLogger.new(deleted_by).log_user_deletion(user, opts.slice(:context)) end - MessageBus.publish "/file-change", ["refresh"], user_ids: [u.id] end end diff --git a/app/services/user_merger.rb b/app/services/user_merger.rb index d745bc0e7c..1d31a802e7 100644 --- a/app/services/user_merger.rb +++ b/app/services/user_merger.rb @@ -1,7 +1,9 @@ class UserMerger - def initialize(source_user, target_user) + def initialize(source_user, target_user, acting_user = nil) @source_user = source_user @target_user = target_user + @acting_user = acting_user + @source_primary_email = source_user.email end def merge! @@ -19,15 +21,17 @@ class UserMerger delete_source_user delete_source_user_references + log_merge end protected def update_username - Jobs::UpdateUsername.new.execute(user_id: @source_user.id, - old_username: @source_user.username, - new_username: @target_user.username, - avatar_template: @target_user.avatar_template) + UsernameChanger.update_username(user_id: @source_user.id, + old_username: @source_user.username, + new_username: @target_user.username, + avatar_template: @target_user.avatar_template, + asynchronous: false) end def move_posts @@ -85,11 +89,13 @@ class UserMerger limit_reached = EXCLUDED.limit_reached SQL - GivenDailyLike.exec_sql(sql, - source_user_id: @source_user.id, - target_user_id: @target_user.id, - max_likes_per_day: SiteSetting.max_likes_per_day, - action_type_id: PostActionType.types[:like]) + DB.exec( + sql, + source_user_id: @source_user.id, + target_user_id: @target_user.id, + max_likes_per_day: SiteSetting.max_likes_per_day, + action_type_id: PostActionType.types[:like] + ) end def merge_post_timings @@ -103,7 +109,7 @@ class UserMerger AND t.topic_id = s.topic_id AND t.post_number = s.post_number SQL - PostTiming.exec_sql(sql, source_user_id: @source_user.id, target_user_id: @target_user.id) + DB.exec(sql, source_user_id: @source_user.id, target_user_id: @target_user.id) end def merge_user_visits @@ -119,7 +125,7 @@ class UserMerger AND t.visited_at = s.visited_at SQL - UserVisit.exec_sql(sql, source_user_id: @source_user.id, target_user_id: @target_user.id) + DB.exec(sql, source_user_id: @source_user.id, target_user_id: @target_user.id) end def update_site_settings @@ -132,7 +138,7 @@ class UserMerger def update_user_stats # topics_entered - UserStat.exec_sql(<<~SQL, target_user_id: @target_user.id) + DB.exec(<<~SQL, target_user_id: @target_user.id) UPDATE user_stats SET topics_entered = ( SELECT COUNT(topic_id) @@ -143,7 +149,7 @@ class UserMerger SQL # time_read and days_visited - UserStat.exec_sql(<<~SQL, target_user_id: @target_user.id) + DB.exec(<<~SQL, target_user_id: @target_user.id) UPDATE user_stats SET time_read = COALESCE(x.time_read, 0), days_visited = COALESCE(x.days_visited, 0) @@ -158,7 +164,7 @@ class UserMerger SQL # posts_read_count - UserStat.exec_sql(<<~SQL, target_user_id: @target_user.id) + DB.exec(<<~SQL, target_user_id: @target_user.id) UPDATE user_stats SET posts_read_count = ( SELECT COUNT(1) @@ -172,7 +178,7 @@ class UserMerger SQL # likes_given, likes_received, new_since, read_faq, first_post_created_at - UserStat.exec_sql(<<~SQL, source_user_id: @source_user.id, target_user_id: @target_user.id) + DB.exec(<<~SQL, source_user_id: @source_user.id, target_user_id: @target_user.id) UPDATE user_stats AS t SET likes_given = t.likes_given + s.likes_given, likes_received = t.likes_received + s.likes_received, @@ -185,7 +191,7 @@ class UserMerger end def merge_user_attributes - User.exec_sql(<<~SQL, source_user_id: @source_user.id, target_user_id: @target_user.id) + DB.exec(<<~SQL, source_user_id: @source_user.id, target_user_id: @target_user.id) UPDATE users AS t SET created_at = LEAST(t.created_at, s.created_at), updated_at = LEAST(t.updated_at, s.updated_at), @@ -209,7 +215,7 @@ class UserMerger WHERE t.id = :target_user_id AND s.id = :source_user_id SQL - UserProfile.exec_sql(<<~SQL, source_user_id: @source_user.id, target_user_id: @target_user.id) + DB.exec(<<~SQL, source_user_id: @source_user.id, target_user_id: @target_user.id) UPDATE user_profiles AS t SET location = COALESCE(t.location, s.location), website = COALESCE(t.website, s.website), @@ -347,8 +353,12 @@ class UserMerger def delete_source_user @source_user.reload - @source_user.update_attribute(:admin, false) - UserDestroyer.new(Discourse.system_user).destroy(@source_user) + @source_user.update_attributes( + admin: false, + email: "#{@source_user.username}_#{SecureRandom.hex}@no-email.invalid" + ) + + UserDestroyer.new(Discourse.system_user).destroy(@source_user, quiet: true) end def delete_source_user_references @@ -361,6 +371,11 @@ class UserMerger UserAction.where(acting_user_id: @source_user.id).delete_all end + def log_merge + logger = StaffActionLogger.new(@acting_user || Discourse.system_user) + logger.log_user_merge(@target_user, @source_user.username, @source_primary_email) + end + def update_user_id(table_name, opts = {}) builder = update_user_id_sql_builder(table_name, opts) builder.exec(source_user_id: @source_user.id, target_user_id: @target_user.id) @@ -371,7 +386,7 @@ class UserMerger conditions = Array.wrap(opts[:conditions]) updates = Array.wrap(opts[:updates]) - builder = SqlBuilder.new(<<~SQL) + builder = DB.build(<<~SQL) UPDATE #{table_name} AS x /*set*/ WHERE x.#{user_id_column_name} = :source_user_id AND NOT EXISTS( diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb index ade3e97db9..de238e50ec 100644 --- a/app/services/user_updater.rb +++ b/app/services/user_updater.rb @@ -34,7 +34,7 @@ class UserUpdater :email_in_reply_to, :like_notification_frequency, :include_tl0_in_digests, - :theme_key, + :theme_ids, :allow_private_messages, :homepage_id, ] @@ -85,9 +85,16 @@ class UserUpdater save_options = false - # special handling for theme_key cause we need to bump a sequence number - if attributes.key?(:theme_key) && user.user_option.theme_key != attributes[:theme_key] - user.user_option.theme_key_seq += 1 + # special handling for theme_id cause we need to bump a sequence number + if attributes.key?(:theme_ids) + user_guardian = Guardian.new(user) + attributes[:theme_ids].reject!(&:blank?) + attributes[:theme_ids].map!(&:to_i) + if user_guardian.allow_themes?(attributes[:theme_ids]) + user.user_option.theme_key_seq += 1 if user.user_option.theme_ids != attributes[:theme_ids] + else + attributes.delete(:theme_ids) + end end OPTION_ATTR.each do |attribute| @@ -143,17 +150,18 @@ class UserUpdater MutedUser.where('user_id = ? AND muted_user_id not in (?)', user.id, desired_ids).destroy_all # SQL is easier here than figuring out how to do the same in AR - MutedUser.exec_sql("INSERT into muted_users(user_id, muted_user_id, created_at, updated_at) - SELECT :user_id, id, :now, :now - FROM users - WHERE - id in (:desired_ids) AND - id NOT IN ( - SELECT muted_user_id - FROM muted_users - WHERE user_id = :user_id - )", - now: Time.now, user_id: user.id, desired_ids: desired_ids) + DB.exec(<<~SQL, now: Time.now, user_id: user.id, desired_ids: desired_ids) + INSERT into muted_users(user_id, muted_user_id, created_at, updated_at) + SELECT :user_id, id, :now, :now + FROM users + WHERE + id in (:desired_ids) AND + id NOT IN ( + SELECT muted_user_id + FROM muted_users + WHERE user_id = :user_id + ) + SQL end end diff --git a/app/services/username_changer.rb b/app/services/username_changer.rb index e5df339c12..70ce9caabb 100644 --- a/app/services/username_changer.rb +++ b/app/services/username_changer.rb @@ -13,31 +13,37 @@ class UsernameChanger self.new(user, new_username, actor).change end - def change(asynchronous: true) + def change(asynchronous: true, run_update_job: true) if @actor && @old_username != @new_username StaffActionLogger.new(@actor).log_username_change(@user, @old_username, @new_username) end @user.username = @new_username + if @user.save - - args = { - user_id: @user.id, - old_username: @old_username, - new_username: @new_username, - avatar_template: @user.avatar_template - } - - if asynchronous - Jobs.enqueue(:update_username, args) - else - Jobs::UpdateUsername.new.execute(args) - end - + UsernameChanger.update_username(user_id: @user.id, + old_username: @old_username, + new_username: @new_username, + avatar_template: @user.avatar_template, + asynchronous: asynchronous) if run_update_job return true end false end + def self.update_username(user_id:, old_username:, new_username:, avatar_template:, asynchronous: true) + args = { + user_id: user_id, + old_username: old_username, + new_username: new_username, + avatar_template: avatar_template + } + + if asynchronous + Jobs.enqueue(:update_username, args) + else + Jobs::UpdateUsername.new.execute(args) + end + end end diff --git a/app/services/username_checker_service.rb b/app/services/username_checker_service.rb index 539e07e39c..8da0748d04 100644 --- a/app/services/username_checker_service.rb +++ b/app/services/username_checker_service.rb @@ -1,4 +1,7 @@ class UsernameCheckerService + def initialize(allow_reserved_username: false) + @allow_reserved_username = allow_reserved_username + end def check_username(username, email) if username && username.length > 0 @@ -12,7 +15,13 @@ class UsernameCheckerService end def check_username_availability(username, email) - if User.username_available?(username, email) + available = User.username_available?( + username, + email, + allow_reserved_username: @allow_reserved_username + ) + + if available { available: true, is_developer: is_developer?(email) } else { available: false, suggestion: UserNameSuggester.suggest(username) } diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 2733cc8167..012c5ff999 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,11 +1,14 @@
- <% @category_list.categories.each do |c| %> + <% @category_list.categories.each_with_index do |c, index| %>
- -

- <%= c.name %> -

+ + +

+ + <%= c.name %> + +

<%= c.description&.html_safe %>
<% end %> diff --git a/app/views/common/_discourse_javascript.html.erb b/app/views/common/_discourse_javascript.html.erb index 150c88f3fe..8a4f64b109 100644 --- a/app/views/common/_discourse_javascript.html.erb +++ b/app/views/common/_discourse_javascript.html.erb @@ -58,7 +58,7 @@ <%- if SiteSetting.Upload.s3_cdn_url.present? %> Discourse.S3CDN = '<%= SiteSetting.Upload.s3_cdn_url %>'; <%- end %> - Discourse.S3BaseUrl = '<%= SiteSetting.Upload.absolute_base_url %>'; + Discourse.S3BaseUrl = '<%= SiteSetting.Upload.s3_base_url %>'; <%- end %> })(); diff --git a/app/views/common/_discourse_stylesheet.html.erb b/app/views/common/_discourse_stylesheet.html.erb index 044ce2fc76..45f6476e90 100644 --- a/app/views/common/_discourse_stylesheet.html.erb +++ b/app/views/common/_discourse_stylesheet.html.erb @@ -8,6 +8,6 @@ <%= discourse_stylesheet_link_tag(:admin) %> <%- end %> -<%- if theme_key %> +<%- if theme_ids.present? %> <%= discourse_stylesheet_link_tag(mobile_view? ? :mobile_theme : :desktop_theme) %> <%- end %> diff --git a/app/views/common/_second_factor_backup_input.html.erb b/app/views/common/_second_factor_backup_input.html.erb new file mode 100644 index 0000000000..dfe1961672 --- /dev/null +++ b/app/views/common/_second_factor_backup_input.html.erb @@ -0,0 +1,2 @@ +<%= text_field_tag(:second_factor_token, nil, autofocus: true, pattern: '[a-z0-9]{16}', maxlength: 16, type: 'text') %> +<%= hidden_field_tag 'second_factor_method', '2' %> \ No newline at end of file diff --git a/app/views/common/_second_factor_form_script.html.erb b/app/views/common/_second_factor_form_script.html.erb new file mode 100644 index 0000000000..226136b7be --- /dev/null +++ b/app/views/common/_second_factor_form_script.html.erb @@ -0,0 +1,18 @@ +<%= javascript_tag do %> + var useTotp = "<%= t("login.second_factor_toggle.totp") %>"; + var useBackup = "<%= t("login.second_factor_toggle.backup_code") %>"; + var backupForm = document.getElementById("backup-second-factor-form"); + var primaryForm = document.getElementById("primary-second-factor-form"); + document.getElementById("toggle-form").onclick = function(event) { + event.preventDefault(); + if (backupForm.style.display === "none") { + backupForm.style.display = "block"; + primaryForm.style.display = "none"; + document.getElementById("toggle-form").innerHTML = useTotp; + } else { + backupForm.style.display = "none"; + primaryForm.style.display = "block"; + document.getElementById("toggle-form").innerHTML = useBackup; + } + } +<% end %> diff --git a/app/views/common/_second_factor_text_field.html.erb b/app/views/common/_second_factor_text_field.html.erb index ad6d61c397..6e4a822edd 100644 --- a/app/views/common/_second_factor_text_field.html.erb +++ b/app/views/common/_second_factor_text_field.html.erb @@ -1 +1,2 @@ <%= text_field_tag(:second_factor_token, nil, autofocus: true, pattern: '[0-9]{6}', maxlength: 6, type: 'tel') %> +<%= hidden_field_tag 'second_factor_method', '1' %> diff --git a/app/views/email/notification.html.erb b/app/views/email/notification.html.erb index cfd7fa6940..d5d458c7c8 100644 --- a/app/views/email/notification.html.erb +++ b/app/views/email/notification.html.erb @@ -30,12 +30,7 @@ <% end %> <% end %> - - <% if post.topic.private_message? %> - - <% end %> +
diff --git a/app/views/embed/comments.html.erb b/app/views/embed/comments.html.erb index 3c26b1b32d..25735bfc4a 100644 --- a/app/views/embed/comments.html.erb +++ b/app/views/embed/comments.html.erb @@ -1,4 +1,4 @@ -
+
<% if @topic_view.topic.posts_count < 2 %> <%= link_to(I18n.t('embed.start_discussion'), @topic_view.topic.url, class: 'button', target: '_blank') %> <% elsif @topic_view.topic.posts_count > 10 %> diff --git a/app/views/embed/embed_error.html.erb b/app/views/embed/embed_error.html.erb index 65f4c3c43d..b6b1121b80 100644 --- a/app/views/embed/embed_error.html.erb +++ b/app/views/embed/embed_error.html.erb @@ -1,4 +1,4 @@ -
+

<%= t 'embed.error' %>

<%= link_to(image_tag(SiteSetting.logo_url, class: 'logo'), Discourse.base_url) %>
diff --git a/app/views/embed/loading.html.erb b/app/views/embed/loading.html.erb index 2a5621de82..ccb68dbdf4 100644 --- a/app/views/embed/loading.html.erb +++ b/app/views/embed/loading.html.erb @@ -1,4 +1,4 @@ -
+

<%= t 'embed.loading' %>

<%= link_to(image_tag(SiteSetting.logo_url, class: 'logo'), Discourse.base_url) %>
diff --git a/app/views/exceptions/not_found.html.erb b/app/views/exceptions/not_found.html.erb index e06acfd090..7949a1b5ab 100644 --- a/app/views/exceptions/not_found.html.erb +++ b/app/views/exceptions/not_found.html.erb @@ -25,15 +25,14 @@ <% end %> -<%- unless @hide_google %> +<%- unless @hide_search%>
diff --git a/app/views/finish_installation/confirm_email.html.erb b/app/views/finish_installation/confirm_email.html.erb index 9d15c3621a..ea8526d2d0 100644 --- a/app/views/finish_installation/confirm_email.html.erb +++ b/app/views/finish_installation/confirm_email.html.erb @@ -3,7 +3,7 @@ <%= raw(t 'finish_installation.confirm_email.message', email: @email) %>
- <%= button_to(finish_installation_resend_email_path, method: :put, class: 'wizard-btn') do %> + <%= button_to(finish_installation_resend_email_path, method: :put, class: 'wizard-btn primary') do %> <%= t 'finish_installation.resend_email.title' %> <% end %>
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 58fff0c1a1..b815383d67 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,10 +1,10 @@ - + <%= content_for?(:title) ? yield(:title) : SiteSetting.title %> - + "> <%= render partial: "layouts/head" %> <%= discourse_csrf_tags %> @@ -46,7 +46,7 @@ <%= render_google_tag_manager_head_code %> <%= render_google_universal_analytics_code %> - + <%- if SiteSetting.native_app_install_banner? %> diff --git a/app/views/layouts/crawler.html.erb b/app/views/layouts/crawler.html.erb index ab98695c27..4cbf2eef8d 100644 --- a/app/views/layouts/crawler.html.erb +++ b/app/views/layouts/crawler.html.erb @@ -1,14 +1,17 @@ - + <%= content_for?(:title) ? yield(:title) : SiteSetting.title %> <%= render partial: "layouts/head" %> <%- if rtl? %> - <%= discourse_stylesheet_link_tag(mobile_view? ? :mobile_rtl : :desktop_rtl) %> + <%= discourse_stylesheet_link_tag(mobile_view? ? :mobile_rtl : :desktop_rtl) %> <%- else %> - <%= discourse_stylesheet_link_tag(mobile_view? ? :mobile : :desktop) %> + <%= discourse_stylesheet_link_tag(mobile_view? ? :mobile : :desktop) %> + <%- end %> + <%- if theme_ids.present? %> + <%= discourse_stylesheet_link_tag(mobile_view? ? :mobile_theme : :desktop_theme) %> <%- end %> <%= theme_lookup("head_tag") %> <%= render_google_universal_analytics_code %> diff --git a/app/views/layouts/embed.html.erb b/app/views/layouts/embed.html.erb index 59b87e46a0..8f91159c53 100644 --- a/app/views/layouts/embed.html.erb +++ b/app/views/layouts/embed.html.erb @@ -3,7 +3,7 @@ - <%= discourse_stylesheet_link_tag 'embed', theme_key: nil %> + <%= discourse_stylesheet_link_tag 'embed', theme_ids: nil %> <%- unless customization_disabled? %> <%= discourse_stylesheet_link_tag :embedded_theme %> <%- end %> @@ -38,8 +38,15 @@ } window.onload = function() { - // Send a post message with our loaded height - postUp({type: 'discourse-resize', height: document['body'].offsetHeight}); + // get state info from data attribute + var header = document.querySelector('header'); + var state = 'unknown'; + if (header) { + state = header.getAttribute('data-embed-state'); + } + + // Send a post message with our loaded height and state + postUp({type: 'discourse-resize', height: document['body'].offsetHeight, state: state}); var postLinks = document.querySelectorAll("a[data-link-to-post]"), i; diff --git a/app/views/layouts/finish_installation.html.erb b/app/views/layouts/finish_installation.html.erb index abf274f54f..8fc25c08eb 100644 --- a/app/views/layouts/finish_installation.html.erb +++ b/app/views/layouts/finish_installation.html.erb @@ -1,6 +1,6 @@ - <%= discourse_stylesheet_link_tag 'wizard', theme_key: nil %> + <%= discourse_stylesheet_link_tag 'wizard', theme_ids: nil %> <%= render partial: "common/special_font_face" %> <%= preload_script 'ember_jquery' %> <%= preload_script 'wizard-vendor' %> diff --git a/app/views/layouts/no_ember.html.erb b/app/views/layouts/no_ember.html.erb index eb8c6fabdf..8b68e33910 100644 --- a/app/views/layouts/no_ember.html.erb +++ b/app/views/layouts/no_ember.html.erb @@ -1,5 +1,5 @@ - + <%= content_for?(:title) ? yield(:title) : SiteSetting.title %> diff --git a/app/views/list/list.erb b/app/views/list/list.erb index 7d1179c746..99abddc494 100644 --- a/app/views/list/list.erb +++ b/app/views/list/list.erb @@ -26,19 +26,14 @@
<% if params[:page].to_i == 0 && @subcategories.present? %> -
- <% @subcategories.each do |subcategory| %> -
- - - <%= subcategory.name %> - - <% if subcategory.description.present? %> - <%= subcategory.description %> - <% end %> -
+ <% @subcategories.each do |subcategory| %> + + <%= subcategory.name %> + + <% if subcategory.description.present? %> + <%= subcategory.description %> <% end %> -
+ <% end %>
<% end %> <% end %> @@ -47,8 +42,9 @@ <% @list.topics.each_with_index do |t,i| %>
+ - + <%= t.title %> <%= page_links(t) %> @@ -56,6 +52,12 @@ [<%= t.category.name %>] <% end %> '>(<%= t.posts_count %>) + + <% if t.pinned_until && (t.pinned_until > Time.zone.now) && (t.pinned_globally || @list.category) && t.excerpt %> +

+ <%= t.excerpt.html_safe %> +

+ <% end %>
<% end %>
diff --git a/app/views/offline/offline.html.erb b/app/views/offline/offline.html.erb index 8e3115986a..3c6d870fb9 100644 --- a/app/views/offline/offline.html.erb +++ b/app/views/offline/offline.html.erb @@ -1,5 +1,5 @@ - + diff --git a/app/views/session/email_login.html.erb b/app/views/session/email_login.html.erb index a0f390df78..1929995e01 100644 --- a/app/views/session/email_login.html.erb +++ b/app/views/session/email_login.html.erb @@ -5,8 +5,8 @@ <%end%> <%if @second_factor_required%> -
-
+
+
<%= form_tag(method: "post") do%>

<%=t "login.second_factor_title" %>

<%= label_tag(:second_factor_token, t("login.second_factor_description")) %> @@ -14,9 +14,24 @@ <%= submit_tag(t("submit"), class: "btn btn-large btn-primary") %> <%end%>
+ + <%if @backup_codes_enabled%> + + <%=t "login.second_factor_toggle.backup_code" %> + <%= render 'common/second_factor_form_script' %> + <%end%>
<%end%> + + <% content_for :title do %><%=t "email_login.title" %><% end %> <%- content_for(:no_ember_head) do %> diff --git a/app/views/topics/plain.html.erb b/app/views/topics/plain.html.erb index 7e7e31bd02..25531cb837 100644 --- a/app/views/topics/plain.html.erb +++ b/app/views/topics/plain.html.erb @@ -1,9 +1,9 @@ - + <%= @topic_view.topic.title %> - <%= raw crawlable_meta_data(title: @topic_view.title, description: @topic_view.summary(strip_images: true), image: @topic_view.image_url, read_time: @topic_view.read_time, like_count: @topic_view.like_count) %> + <%= raw crawlable_meta_data(title: @topic_view.title, description: @topic_view.summary(strip_images: true), image: @topic_view.image_url, read_time: @topic_view.read_time, like_count: @topic_view.like_count, published_time: @topic_view.published_time) %> <% if @topic_view.prev_page %> <% end %> diff --git a/app/views/topics/show.html.erb b/app/views/topics/show.html.erb index c67fd23ecf..21788d3b77 100644 --- a/app/views/topics/show.html.erb +++ b/app/views/topics/show.html.erb @@ -88,7 +88,7 @@ <% content_for :head do %> <%= auto_discovery_link_tag(@topic_view, {action: :feed, slug: @topic_view.topic.slug, topic_id: @topic_view.topic.id}, title: t('rss_posts_in_topic', topic: @topic_view.title), type: 'application/rss+xml') %> - <%= raw crawlable_meta_data(title: @topic_view.title, description: @topic_view.summary(strip_images: true), image: @topic_view.image_url, read_time: @topic_view.read_time, like_count: @topic_view.like_count, ignore_canonical: true) %> + <%= raw crawlable_meta_data(title: @topic_view.title, description: @topic_view.summary(strip_images: true), image: @topic_view.image_url, read_time: @topic_view.read_time, like_count: @topic_view.like_count, ignore_canonical: true, published_time: @topic_view.published_time) %> <% if @topic_view.prev_page || @topic_view.next_page %> <% if @topic_view.prev_page %> diff --git a/app/views/topics/show.rss.erb b/app/views/topics/show.rss.erb index a7efff9364..729fa86071 100644 --- a/app/views/topics/show.rss.erb +++ b/app/views/topics/show.rss.erb @@ -31,7 +31,7 @@ <%= post_url %> <%= post.created_at.rfc2822 %> <%= Discourse.current_hostname %>-post-<%= post.topic_id %>-<%= post.post_number %> - <%= @topic_view.title %> + <%= @topic_view.title %> <% end %> diff --git a/app/views/user_notifications/digest.html.erb b/app/views/user_notifications/digest.html.erb index b09bc3b736..71ebed0cb3 100644 --- a/app/views/user_notifications/digest.html.erb +++ b/app/views/user_notifications/digest.html.erb @@ -1,5 +1,5 @@ - + @@ -420,7 +420,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo <%=raw(t 'user_notifications.digest.unsubscribe', site_link: html_site_link(@anchor_color), email_preferences_link: link_to(t('user_notifications.digest.your_email_settings'), Discourse.base_url + '/my/preferences/emails'), - unsubscribe_link: link_to(t('user_notifications.digest.click_here'), email_unsubscribe_url(host: Discourse.base_url, key: @unsubscribe_key), {:style=>"color: ##{@anchor_color}"})) %> + unsubscribe_link: link_to(t('user_notifications.digest.click_here'), "#{Discourse.base_url}/email/unsubscribe/#{@unsubscribe_key}", {:style=>"color: ##{@anchor_color}"})) %>
<%= digest_custom_html("below_footer") %> diff --git a/app/views/user_notifications/digest.text.erb b/app/views/user_notifications/digest.text.erb index e3bbc1f818..40ce99b8ef 100644 --- a/app/views/user_notifications/digest.text.erb +++ b/app/views/user_notifications/digest.text.erb @@ -13,7 +13,7 @@ ### <%=t 'user_notifications.digest.popular_topics' %> <%- @popular_topics.each_with_index do |t,i| %> -<%= raw(@markdown_linker.create(t.title, t.relative_url)) %> +<%= raw(@markdown_linker.create(t.title, t.url)) %> <%- if t.best_post.present? %> <%= raw(t.best_post.excerpt(1000, strip_links: true, text_entities: true, markdown_images: true)) %> @@ -29,7 +29,7 @@ ### <%=t 'user_notifications.digest.popular_posts' %> <%- @popular_posts.each_with_index do |post,i| %> -<%= post.user.username -%> - <%= raw(@markdown_linker.create(post.topic.title, post.topic.relative_url)) %> +<%= post.user.username -%> - <%= raw(@markdown_linker.create(post.topic.title, post.topic.url)) %> <%= raw(post.excerpt(1000, strip_links: true, text_entities: true, markdown_images: true)) %> -------------------------------------------------------------------------------- @@ -41,7 +41,7 @@ **<%=t 'user_notifications.digest.more_new' %>** <%- @other_new_for_you.each do |t| %> -* <%= raw(@markdown_linker.create(t.title, t.relative_url)) %> - <%= t.posts_count %> - <%- if t.category %>[<%= t.category.name %>]<%- end %> +* <%= raw(@markdown_linker.create(t.title, t.url)) %> - <%= t.posts_count %> - <%- if t.category %>[<%= t.category.name %>]<%- end %> <%- end -%> <%- end %> @@ -53,7 +53,7 @@ <%=raw(t :'user_notifications.digest.unsubscribe', site_link: site_link, email_preferences_link: raw(@markdown_linker.create(t('user_notifications.digest.your_email_settings'), '/my/preferences/emails')), - unsubscribe_link: raw(@markdown_linker.create(t('user_notifications.digest.click_here'), email_unsubscribe_url(key: @unsubscribe_key, only_path: true)))) %> + unsubscribe_link: raw(@markdown_linker.create(t('user_notifications.digest.click_here'), "/email/unsubscribe/#{@unsubscribe_key}"))) %> <%= raw(@markdown_linker.references) %> diff --git a/app/views/users/admin_login.html.erb b/app/views/users/admin_login.html.erb index 2304944071..aa29bc0fa8 100644 --- a/app/views/users/admin_login.html.erb +++ b/app/views/users/admin_login.html.erb @@ -8,11 +8,25 @@ <% if @error %>

<%= @error %>

<% end %> <% if @second_factor_required %> - <%=form_tag({}, method: :put) do %> - <%= label_tag(:second_factor_token, t('login.second_factor_description')) %> - <%= render 'common/second_factor_text_field' %>

- <%= submit_tag t('submit')%> - <% end %> +
+ <%=form_tag({}, method: :put) do %> + <%= label_tag(:second_factor_token, t('login.second_factor_description')) %> + <%= render 'common/second_factor_text_field' %>

+ <%= submit_tag t('submit')%> + <% end %> +
+ + <%if @backup_codes_enabled%> + + <%=t "login.second_factor_backup" %> + <%= render 'common/second_factor_form_script' %> + <%end%> <% end %> <% else %> <%=form_tag({}, method: :put) do %> diff --git a/app/views/users_email/confirm.html.erb b/app/views/users_email/confirm.html.erb index 35877cd95d..0f236a1992 100644 --- a/app/views/users_email/confirm.html.erb +++ b/app/views/users_email/confirm.html.erb @@ -8,16 +8,33 @@
<%= t('change_email.please_continue', site_name: SiteSetting.title) %> <% elsif @update_result == :invalid_second_factor%> -

<%= t('login.second_factor_title') %>

-
- <%=form_tag({}, method: :put) do %> - <%= label_tag(:second_factor_token, t('login.second_factor_description')) %> - <%= text_field_tag(:second_factor_token, nil, autofocus: true) %>
- <% if @show_invalid_second_factor_error %> -
<%= t('login.invalid_second_factor_code') %>
+
+

<%= t('login.second_factor_title') %>

+
+ <%=form_tag({}, method: :put) do %> + <%= label_tag(:second_factor_token, t('login.second_factor_description')) %> +
<%= render 'common/second_factor_text_field' %>
+ <% if @show_invalid_second_factor_error %> +
<%= t('login.invalid_second_factor_code') %>
+ <% end %> + <%= submit_tag t('submit'), class: "btn btn-primary" %> <% end %> - <%= submit_tag t('submit'), class: "btn btn-primary" %> - <% end %> +
+ + <%if @backup_codes_enabled %> + + <%=t "login.second_factor_backup" %> + <%= render 'common/second_factor_form_script' %> + <%end%> <% else %>
<%=t 'change_email.already_done' %> diff --git a/app/views/wizard/index.html.erb b/app/views/wizard/index.html.erb index b090b4539c..74092def2e 100644 --- a/app/views/wizard/index.html.erb +++ b/app/views/wizard/index.html.erb @@ -1,12 +1,12 @@ - <%= discourse_stylesheet_link_tag :wizard, theme_key: nil %> + <%= discourse_stylesheet_link_tag :wizard, theme_ids: nil %> <%= preload_script 'ember_jquery' %> + <%= preload_script "locales/#{I18n.locale}" %> <%= preload_script 'wizard-vendor' %> <%= preload_script 'wizard-application' %> - <%= preload_script "locales/#{I18n.locale}" %> <%= render partial: "common/special_font_face" %> - + <%= csrf_meta_tags %> diff --git a/app/views/wizard/qunit.html.erb b/app/views/wizard/qunit.html.erb index 561a2ade04..31755ff4d8 100644 --- a/app/views/wizard/qunit.html.erb +++ b/app/views/wizard/qunit.html.erb @@ -4,7 +4,7 @@ QUnit Test Runner <%= stylesheet_link_tag "qunit" %> <%= stylesheet_link_tag "test_helper" %> - <%= discourse_stylesheet_link_tag :wizard %> + <%= discourse_stylesheet_link_tag :wizard, theme_ids: nil %> <%= javascript_include_tag "qunit" %> <%= javascript_include_tag "wizard/test/test_helper" %> <%= csrf_meta_tags %> diff --git a/bin/docker/boot_dev b/bin/docker/boot_dev index 781f0567a3..65f92a3dfc 100755 --- a/bin/docker/boot_dev +++ b/bin/docker/boot_dev @@ -7,13 +7,16 @@ DATA_DIR="$SOURCE_DIR/data/postgres" show_help() { cat <& 2 show_help >& 2 @@ -38,7 +59,7 @@ echo "Using data in: ${DATA_DIR}" mkdir -p "${DATA_DIR}" -docker run -d -p 1080:1080 -p 3000:3000 -v "$DATA_DIR:/shared/postgres_data:delegated" -v "$SOURCE_DIR:/src:delegated" --hostname=discourse --name=discourse_dev --restart=always discourse/discourse_dev:release /sbin/boot +docker run -d -p 1080:1080 -p 3000:3000 -v "$DATA_DIR:/shared/postgres_data:delegated" -v "$SOURCE_DIR:/src:delegated" $ENV_ARGS --hostname=discourse --name=discourse_dev --restart=always discourse/discourse_dev:release /sbin/boot if [ "${initialize}" = "initialize" ]; then echo "Installing gems..." diff --git a/bin/puma b/bin/puma deleted file mode 100755 index 3249ddee00..0000000000 --- a/bin/puma +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by Bundler. -# -# The application 'puma' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -if ARGV[0] == '--kill-existing' - ARGV.delete_at(0) - - pids = `ps aux | grep puma | grep discourse | grep -v grep | awk '{print $2;}'`.strip - .split("\n") - .map(&:to_i) - .reject { |pid| pid == Process.pid } - - if pids.length > 0 - STDERR.puts "Terminating old version of puma at pid #{pids[0]}" - `kill -9 #{pids[0]}` - sleep 1 - end - -end - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) - -require 'rubygems' -require 'bundler/setup' - -load Gem.bin_path('puma', 'puma') diff --git a/bin/rails b/bin/rails index 0739660237..5481cad3fe 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,16 @@ #!/usr/bin/env ruby + +if !ENV["RAILS_ENV"] && (ARGV[0] == "s" || ARGV[0] == "server") + ENV["UNICORN_PORT"] ||= "3000" + + if ARGV[1] == "-p" && (port = ARGV[2].to_i) > 0 + ENV["UNICORN_PORT"] = port.to_s + end + + ENV["RAILS_LOGS_STDOUT"] ||= "1" + exec File.expand_path("unicorn", __dir__) +end + APP_PATH = File.expand_path('../config/application', __dir__) require_relative '../config/boot' require 'rails/commands' diff --git a/bin/unicorn b/bin/unicorn new file mode 100755 index 0000000000..a425691870 --- /dev/null +++ b/bin/unicorn @@ -0,0 +1,48 @@ +#!/usr/bin/env ruby + +require 'pathname' +ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +require 'rubygems' +require 'bundler/setup' + +# in development do some fussing around, to automate config +if !ARGV.include?("-E") && + !ARGV.include?("--env") && + (ENV["RAILS_ENV"] == "development" || !ENV["RAILS_ENV"]) + + ARGV.push("-N") + if !ARGV.include?("-c") && !ARGV.include?("--config-file") + ARGV.push("-c") + ARGV.push(File.expand_path("../../config/unicorn.conf.rb", + Pathname.new(__FILE__).realpath)) + end + + # we do not want to listen on 2 ports, so lets fix it + if (idx = ARGV.index("-p")) && (port = ARGV[idx + 1].to_i) > 0 + ENV["UNICORN_PORT"] ||= port.to_s + end + + ENV["UNICORN_PORT"] ||= "9292" + + if ARGV.delete("-x") + puts "Running without sidekiq" + ENV["UNICORN_SIDEKIQS"] = "0" + end + + ENV["UNICORN_SIDEKIQS"] ||= "1" + +end + +if ARGV.include?("--help") + fork do + load Gem.bin_path('unicorn', 'unicorn') + end + Process.wait + puts "Extra Discourse Options:" + puts " -x run without sidekiq" + exit +end + +load Gem.bin_path('unicorn', 'unicorn') diff --git a/config/application.rb b/config/application.rb index 93efe88702..90218a83eb 100644 --- a/config/application.rb +++ b/config/application.rb @@ -49,12 +49,15 @@ module Discourse # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. - require 'discourse' - require 'es6_module_transpiler/rails' - require 'js_locale_helper' + # this pattern is somewhat odd but the reloader gets very + # confused here if we load the deps without `lib` it thinks + # discourse.rb is under the discourse folder incorrectly + require_dependency 'lib/discourse' + require_dependency 'lib/es6_module_transpiler/rails' + require_dependency 'lib/js_locale_helper' # tiny file needed by site settings - require 'highlight_js/highlight_js' + require_dependency 'lib/highlight_js/highlight_js' # mocha hates us, active_support/testing/mochaing.rb line 2 is requiring the wrong # require, patched in source, on upgrade remove this @@ -89,6 +92,7 @@ module Discourse if Rails.env == "development" || Rails.env == "test" config.assets.paths << "#{config.root}/test/javascripts" config.assets.paths << "#{config.root}/test/stylesheets" + config.assets.paths << "#{config.root}/node_modules" end # Allows us to skip minifincation on some files @@ -116,8 +120,10 @@ module Discourse } # Precompile all available locales - Dir.glob("#{config.root}/app/assets/javascripts/locales/*.js.erb").each do |file| - config.assets.precompile << "locales/#{file.match(/([a-z_A-Z]+\.js)\.erb$/)[1]}" + unless GlobalSetting.try(:omit_base_locales) + Dir.glob("#{config.root}/app/assets/javascripts/locales/*.js.erb").each do |file| + config.assets.precompile << "locales/#{file.match(/([a-z_A-Z]+\.js)\.erb$/)[1]}" + end end # out of the box sprockets 3 grabs loose files that are hanging in assets, @@ -270,13 +276,9 @@ module Discourse g.test_framework :rspec, fixture: false end - end -end + # we have a monkey_patch we need to require early... prior to connection + # init + require 'freedom_patches/reaper' -if defined?(PhusionPassenger) - PhusionPassenger.on_event(:starting_worker_process) do |forked| - if forked - Discourse.after_fork - end end end diff --git a/config/discourse_defaults.conf b/config/discourse_defaults.conf index 7715cb2927..43ce40ba2d 100644 --- a/config/discourse_defaults.conf +++ b/config/discourse_defaults.conf @@ -143,10 +143,9 @@ new_version_emails = true # will not work properly with huge numbers of open connections # reap connections from pool that are older than 30 seconds connection_reaper_age = 30 + # run reap check every 30 seconds connection_reaper_interval = 30 -# also reap any connections older than this -connection_reaper_max_age = 600 # set to relative URL (for subdirectory hosting) # IMPORTANT: path must not include a trailing / @@ -175,7 +174,8 @@ s3_access_key_id = s3_secret_access_key = s3_use_iam_profile = false s3_cdn_url = - +s3_endpoint = +s3_force_path_style = ### rate limits apply to all sites max_user_api_reqs_per_minute = 20 diff --git a/config/environments/test.rb b/config/environments/test.rb index 7a6f94612a..df30b744fb 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -63,7 +63,9 @@ Discourse::Application.configure do s.set_regardless_of_locale(:crawl_images, false) s.set_regardless_of_locale(:download_remote_images_to_local, false) s.set_regardless_of_locale(:unique_posts_mins, 0) - s.set_regardless_of_locale(:queue_jobs, false) + # Running jobs are expensive and most of our tests are not concern with + # code that runs inside jobs + s.set_regardless_of_locale(:queue_jobs, true) # disable plugins if ENV['LOAD_PLUGINS'] == '1' s.set_regardless_of_locale(:discourse_narrative_bot_enabled, false) diff --git a/config/initializers/000-mini_sql.rb b/config/initializers/000-mini_sql.rb new file mode 100644 index 0000000000..35f8713b8b --- /dev/null +++ b/config/initializers/000-mini_sql.rb @@ -0,0 +1,2 @@ +require 'mini_sql_multisite_connection' +::DB = MiniSqlMultisiteConnection.instance diff --git a/config/initializers/001-redis.rb b/config/initializers/001-redis.rb index af3e829842..e92fb9320c 100644 --- a/config/initializers/001-redis.rb +++ b/config/initializers/001-redis.rb @@ -2,13 +2,3 @@ if Rails.env.development? && ENV['DISCOURSE_FLUSH_REDIS'] puts "Flushing redis (development mode)" $redis.flushall end - -if defined?(PhusionPassenger) - PhusionPassenger.on_event(:starting_worker_process) do |forked| - if forked - Discourse.after_fork - else - # We're in conservative spawning mode. We don't need to do anything. - end - end -end diff --git a/config/initializers/008-rack-cors.rb b/config/initializers/008-rack-cors.rb index 689cdd3e2e..83419039e0 100644 --- a/config/initializers/008-rack-cors.rb +++ b/config/initializers/008-rack-cors.rb @@ -39,7 +39,7 @@ class Discourse::Cors end headers['Access-Control-Allow-Origin'] = origin || cors_origins[0] - headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-CSRF-Token, Discourse-Visible' + headers['Access-Control-Allow-Headers'] = 'Content-Type, X-Requested-With, X-CSRF-Token, Discourse-Visible, User-Api-Key, User-Api-Client-Id' headers['Access-Control-Allow-Credentials'] = 'true' end diff --git a/config/initializers/012-web_hook_events.rb b/config/initializers/012-web_hook_events.rb index 671fbd56b7..0834b875f6 100644 --- a/config/initializers/012-web_hook_events.rb +++ b/config/initializers/012-web_hook_events.rb @@ -41,6 +41,7 @@ end user_logged_in user_approved user_updated + user_destroyed ).each do |event| DiscourseEvent.on(event) do |user| WebHook.enqueue_object_hooks(:user, user, event) @@ -87,3 +88,13 @@ end WebHook.enqueue_object_hooks(:flag, flag, event) end end + +%i( + queued_post_created + approved_post + rejected_post +).each do |event| + DiscourseEvent.on(event) do |queued_post| + WebHook.enqueue_object_hooks(:queued_post, queued_post, event, QueuedPostSerializer) + end +end diff --git a/config/initializers/100-logster.rb b/config/initializers/100-logster.rb index a3ba1e860a..833e1c60b3 100644 --- a/config/initializers/100-logster.rb +++ b/config/initializers/100-logster.rb @@ -1,3 +1,14 @@ +if Rails.env.development? && !Sidekiq.server? && ENV["RAILS_LOGS_STDOUT"] == "1" + console = ActiveSupport::Logger.new(STDOUT) + original_logger = Rails.logger.chained.first + console.formatter = original_logger.formatter + console.level = original_logger.level + + unless ActiveSupport::Logger.logger_outputs_to?(original_logger, STDOUT) + original_logger.extend(ActiveSupport::Logger.broadcast(console)) + end +end + if Rails.env.production? Logster.store.ignore = [ # honestly, Rails should not be logging this, its real noisy @@ -89,6 +100,6 @@ RailsMultisite::ConnectionManagement.each_connection do end if Rails.configuration.multisite - chained = Rails.logger.instance_variable_get(:@chained) + chained = Rails.logger.chained chained && chained.first.formatter = RailsMultisite::Formatter.new end diff --git a/config/initializers/100-sidekiq.rb b/config/initializers/100-sidekiq.rb index f361c9fdee..1e2ff8dddf 100644 --- a/config/initializers/100-sidekiq.rb +++ b/config/initializers/100-sidekiq.rb @@ -12,7 +12,36 @@ Sidekiq.configure_server do |config| end end +MiniScheduler.configure do |config| + + config.redis = $redis + + config.job_exception_handler do |ex, context| + Discourse.handle_job_exception(ex, context) + end + + config.job_ran do |stat| + DiscourseEvent.trigger(:scheduled_job_ran, stat) + end + + config.before_sidekiq_web_request do + RailsMultisite::ConnectionManagement.establish_connection(db: 'default') + end + +end + if Sidekiq.server? + + module Sidekiq + class CLI + private + + def print_banner + # banner takes up too much space + end + end + end + # defer queue should simply run in sidekiq Scheduler::Defer.async = false @@ -27,22 +56,7 @@ if Sidekiq.server? scheduler_hostname = ENV["UNICORN_SCHEDULER_HOSTNAME"] if !scheduler_hostname || scheduler_hostname.split(',').include?(`hostname`.strip) - require 'scheduler/scheduler' - manager = Scheduler::Manager.new($redis.without_namespace) - Scheduler::Manager.discover_schedules.each do |schedule| - manager.ensure_schedule!(schedule) - end - Thread.new do - while true - begin - manager.tick - rescue => e - # the show must go on - Discourse.handle_job_exception(e, message: "While ticking scheduling manager") - end - sleep 1 - end - end + MiniScheduler.start end end end diff --git a/config/initializers/101-lograge.rb b/config/initializers/101-lograge.rb index 650a046039..c9a4eb9275 100644 --- a/config/initializers/101-lograge.rb +++ b/config/initializers/101-lograge.rb @@ -19,7 +19,9 @@ if (Rails.env.production? && SiteSetting.logging_provider == 'lograge') || ENV[" begin username = begin - controller.current_user&.username + if controller.respond_to?(:current_user) + controller.current_user&.username + end rescue Discourse::InvalidAccess nil end @@ -46,7 +48,16 @@ if (Rails.env.production? && SiteSetting.logging_provider == 'lograge') || ENV[" exceptions = %w(controller action format id) params = event.payload[:params].except(*exceptions) - params[:files].map!(&:headers) if params[:files] + + if (file = params[:file]) && file.respond_to?(:headers) + params[:file] = file.headers + end + + if (files = params[:files]) && files.respond_to?(:map) + params[:files] = files.map do |f| + f.respond_to?(:headers) ? f.headers : f + end + end output = { params: params.to_query, @@ -97,7 +108,7 @@ if (Rails.env.production? && SiteSetting.logging_provider == 'lograge') || ENV[" # Remove ActiveSupport::Logger from the chain and replace with Lograge's # logger - Rails.logger.instance_variable_get(:@chained).pop + Rails.logger.chained.pop Rails.logger.chain(config.lograge.logger) end end diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index dc6b70b185..ee39319494 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -16,12 +16,12 @@ ar: format: '%n %u' units: byte: + zero: بايت + one: بايت + two: بايت few: بايت many: بايت - one: بايت other: بايت - two: بايت - zero: بايت gb: غ.بايت kb: Ùƒ.بايت mb: Ù….بايت @@ -47,130 +47,130 @@ ar: tiny: half_a_minute: "< دقيقة" less_than_x_seconds: - few: < %{count}Ø« - many: < %{count}Ø« - one: < 1 ثانية - other: < %{count}Ø« - two: < ثانيتين - zero: < 0 ثانية + zero: "< 0 ثانية" + one: "< 1 ثانية" + two: "< ثانيتين" + few: "< %{count}Ø«" + many: "< %{count}Ø«" + other: "< %{count}Ø«" x_seconds: - few: '%{count}Ø«' - many: '%{count}Ø«' - one: '%{count}Ø«' - other: '%{count}Ø«' - two: '%{count}Ø«' - zero: '%{count}Ø«' + zero: "%{count}Ø«" + one: "%{count}Ø«" + two: "%{count}Ø«" + few: "%{count}Ø«" + many: "%{count}Ø«" + other: "%{count}Ø«" x_minutes: - few: '%{count}د' - many: '%{count}د' - one: '%{count}د' - other: '%{count}د' - two: '%{count}د' - zero: '%{count}د' + zero: "%{count}د" + one: "%{count}د" + two: "%{count}د" + few: "%{count}د" + many: "%{count}د" + other: "%{count}د" about_x_hours: - few: '%{count}س' - many: '%{count}س' - one: '%{count}س' - other: '%{count}س' - two: '%{count}س' - zero: '%{count}س' + zero: "%{count}س" + one: "%{count}س" + two: "%{count}س" + few: "%{count}س" + many: "%{count}س" + other: "%{count}س" x_days: - few: '%{count}ÙŠ' - many: '%{count}ÙŠ' - one: '%{count}ÙŠ' - other: '%{count}ÙŠ' - two: '%{count}ÙŠ' - zero: '%{count}ÙŠ' + zero: "%{count}ÙŠ" + one: "%{count}ÙŠ" + two: "%{count}ÙŠ" + few: "%{count}ÙŠ" + many: "%{count}ÙŠ" + other: "%{count}ÙŠ" about_x_years: - few: '%{count}ع' - many: '%{count}ع' - one: '%{count}ع' - other: '%{count}ع' - two: '%{count}ع' - zero: '%{count}ع' + zero: "%{count}ع" + one: "%{count}ع" + two: "%{count}ع" + few: "%{count}ع" + many: "%{count}ع" + other: "%{count}ع" over_x_years: - few: '> %{count}ع' - many: '> %{count}ع' - one: '> %{count}ع' - other: '> %{count}ع' - two: '> %{count}ع' - zero: '> %{count}ع' + zero: "> %{count}ع" + one: "> %{count}ع" + two: "> %{count}ع" + few: "> %{count}ع" + many: "> %{count}ع" + other: "> %{count}ع" almost_x_years: - few: '%{count}ع' - many: '%{count}ع' - one: '%{count}ع' - other: '%{count}ع' - two: '%{count}ع' - zero: '%{count}ع' + zero: "%{count}ع" + one: "%{count}ع" + two: "%{count}ع" + few: "%{count}ع" + many: "%{count}ع" + other: "%{count}ع" date_month: "[ÙÙŠ] D MMM" date_year: "[ÙÙŠ] MMM YYYY" medium: x_minutes: - few: '%{count} دقائق' - many: '%{count} دقيقة' - one: دقيقة واحدة - other: '%{count} دقيقة' - two: دقيقتان - zero: أقل من دقيقة + zero: "أقل من دقيقة" + one: "دقيقة واحدة" + two: "دقيقتان" + few: "%{count} دقائق" + many: "%{count} دقيقة" + other: "%{count} دقيقة" x_hours: - few: '%{count} ساعات' - many: '%{count} ساعة' - one: ساعة واحدة - other: '%{count} ساعة' - two: ساعتان - zero: أقل من ساعة + zero: "أقل من ساعة" + one: "ساعة واحدة" + two: "ساعتان" + few: "%{count} ساعات" + many: "%{count} ساعة" + other: "%{count} ساعة" x_days: - few: '%{count} أيام' - many: '%{count} يوما' - one: يوم واحد - other: '%{count} يوم' - two: يومان - zero: أقل من يوم + zero: "أقل من يوم" + one: "يوم واحد" + two: "يومان" + few: "%{count} أيام" + many: "%{count} يوما" + other: "%{count} يوم" date_year: "D MMMØŒ YYYY" medium_with_ago: x_minutes: - few: قبل %{count} دقائق - many: قبل %{count} دقيقة - one: قبل دقيقة واحدة - other: قبل %{count} دقيقة - two: قبل دقيقتين - zero: قبل أقل من دقيقة + zero: "قبل أقل من دقيقة" + one: "قبل دقيقة واحدة" + two: "قبل دقيقتين" + few: "قبل %{count} دقائق" + many: "قبل %{count} دقيقة" + other: "قبل %{count} دقيقة" x_hours: - few: قبل %{count} ساعات - many: قبل %{count} ساعة - one: قبل ساعة واحدة - other: قبل %{count} ساعة - two: قبل ساعتين - zero: قبل أقل من ساعة + zero: "قبل أقل من ساعة" + one: "قبل ساعة واحدة" + two: "قبل ساعتين" + few: "قبل %{count} ساعات" + many: "قبل %{count} ساعة" + other: "قبل %{count} ساعة" x_days: - few: قبل %{count} أيام - many: قبل %{count} يوما - one: قبل يوم واحد - other: قبل %{count} يوما - two: قبل يومين - zero: قبل أقل من يوم + zero: "قبل أقل من يوم" + one: "قبل يوم واحد" + two: "قبل يومين" + few: "قبل %{count} أيام" + many: "قبل %{count} يوما" + other: "قبل %{count} يوما" later: x_days: - few: بعد %{count} أيام - many: بعد %{count} يوما - one: بعد يوم واحد - other: بعد %{count} يوم - two: بعد يومين - zero: بعد أقل من يوم + zero: "بعد أقل من يوم" + one: "بعد يوم واحد" + two: "بعد يومين" + few: "بعد %{count} أيام" + many: "بعد %{count} يوما" + other: "بعد %{count} يوم" x_months: - few: بعد %{count} أشهر - many: بعد %{count} شهرا - one: بعد شهر واحد - other: بعد %{count} شهر - two: بعد شهرين - zero: بعد أقل من شهر + zero: "بعد أقل من شهر" + one: "بعد شهر واحد" + two: "بعد شهرين" + few: "بعد %{count} أشهر" + many: "بعد %{count} شهرا" + other: "بعد %{count} شهر" x_years: - few: بعد %{count} عام - many: بعد %{count} عام - one: بعد عام واحدة - other: بعد %{count} عام - two: بعد عامين - zero: بعد أقل من عام + zero: "بعد أقل من عام" + one: "بعد عام واحدة" + two: "بعد عامين" + few: "بعد %{count} عام" + many: "بعد %{count} عام" + other: "بعد %{count} عام" previous_month: 'الشهر السابق' next_month: 'الشهر التالي' placeholder: التاريخ @@ -212,7 +212,7 @@ ar: banner: enabled: 'اجعل هذا إعلانا %{when}. سو٠يظهر اعلى جميع Ø§Ù„ØµÙØ­Ø§Øª حتى يتم الغاؤه بواسطة المستخدم.' disabled: 'أزل هذا الإعلان %{when}. لن يظهر بعد الآن ÙÙŠ أعلى كلّ ØµÙØ­Ø©.' - topic_admin_menu: "صلاحيات المدير علي الموضوعات" + topic_admin_menu: "صلاحيات المدير علي المواضيع" wizard_required: "مرحبًا ÙÙŠ نسختك الجديدة من دسكورس! Ùلنبدأ مع Ù…ÙØ±Ø´Ø¯ الإعدادات ✨" emails_are_disabled: "لقد عطّل أحد المدراء الرّسائل الصادرة للجميع. لن ØªÙØ±Ø³Ù„ إشعارات عبر البريد الإلكتروني أيا كان نوعها." themes: @@ -251,17 +251,17 @@ ar: show_help: "خيارات" links: "روابط" links_lowercase: - few: الروابط - many: الروابط - one: الروابط - other: روابط - two: الروابط - zero: الروابط + zero: "الروابط" + one: "الروابط" + two: "الروابط" + few: "الروابط" + many: "الروابط" + other: "روابط" faq: "الأسئلة الشائعة" guidelines: "القواعد العامة" privacy_policy: "سياسة الخصوصية " privacy: "الخصوصية " - terms_of_service: "شروط الخدمة" + tos: "شروط الخدمة" mobile_view: "نسخة الهواتÙ" desktop_view: "نسخة سطح المكتب" you: "انت" @@ -280,14 +280,14 @@ ar: max_of_count: "أقصى عدد هو {{count}}" alternation: "أو" character_count: - few: '{{count}} محارÙ' - many: '{{count}} Ù…Ø­Ø±ÙØ§' - one: محر٠واحد - other: '{{count}} حرÙ' - two: Ù…Ø­Ø±ÙØ§Ù† - zero: لا محار٠+ zero: "لا محارÙ" + one: "محر٠واحد" + two: "Ù…Ø­Ø±ÙØ§Ù†" + few: "{{count}} محارÙ" + many: "{{count}} Ù…Ø­Ø±ÙØ§" + other: "{{count}} حرÙ" suggested_topics: - title: "الموضوعات المقترحة" + title: "المواضيع المقترحة" pm_title: "رسائل مقترحة " about: simple_title: "عنّا" @@ -298,7 +298,7 @@ ar: stat: all_time: "منذ التأسيس" like_count: "الإعجابات" - topic_count: "الموضوعات" + topic_count: "المواضيع" post_count: "المنشورات" user_count: "الأعضاء" active_user_count: "الأعضاء النشطون" @@ -354,24 +354,24 @@ ar: cancel: "ألغÙ" view_pending: "اعرض المنشورات المعلّقة" has_pending_posts: - few: ÙÙŠ هذا الموضوع {{count}} مشاركات تحتاج مراجعة - many: ÙÙŠ هذا الموضوع {{count}} مشاركة تحتاج مراجعة - one: ÙÙŠ هذا الموضوع مشاركة واحدة تحتاج مراجعة - other: ÙÙŠ هذا الموضوع {{count}} منشور يحتاج إلي مراجعة - two: ÙÙŠ هذا الموضوع مشاركتين تحتاج مراجعة - zero: ليس ÙÙŠ هذا الموضوع أيّة مشاركات تحتاج مراجعة + zero: "ليس ÙÙŠ هذا الموضوع أيّة مشاركات تحتاج مراجعة" + one: "ÙÙŠ هذا الموضوع مشاركة واحدة تحتاج مراجعة" + two: "ÙÙŠ هذا الموضوع مشاركتين تحتاج مراجعة" + few: "ÙÙŠ هذا الموضوع {{count}} مشاركات تحتاج مراجعة" + many: "ÙÙŠ هذا الموضوع {{count}} مشاركة تحتاج مراجعة" + other: "ÙÙŠ هذا الموضوع {{count}} منشور يحتاج إلي مراجعة" confirm: "Ø§Ø­ÙØ¸ التعديلات" delete_prompt: "أمتأكد من حذ٠%{username}ØŸ Ø³ØªÙØ­Ø°Ù كل منشوراتة وسيÙمنع بريده الإلكتروني وعنوان الـ IP." approval: title: "المنشور يحتاج مواÙقة" description: "لقد وصلنا منشورك ولكنة يحتاج مواÙقة المشر٠قبل ظهورها. نرجو منك الصبر." pending_posts: - few: لديك {{count}} مشاركات معلّقة. - many: لديك {{count}} مشاركة معلّقة. - one: لديك مشاركة واحدة معلّقة. - other: لديك {{count}} منشور معلّق. - two: لديك مشاركتين معلّقتين. - zero: لا مشاركات معلّقة. + zero: "لا مشاركات معلّقة." + one: "لديك مشاركة واحدة معلّقة." + two: "لديك مشاركتين معلّقتين." + few: "لديك {{count}} مشاركات معلّقة." + many: "لديك {{count}} مشاركة معلّقة." + other: "لديك {{count}} منشور معلّق." ok: "حسنا" user_action: user_posted_topic: "نشر {{user}} الموضوع" @@ -393,10 +393,10 @@ ar: likes_given: "المعطاة" likes_received: "المتلقاة" topics_entered: "Ø§Ù„Ù…ÙØ´Ø§Ù‡Ø¯Ø©" - topics_entered_long: "الموضوعات Ø§Ù„Ù…ÙØ´Ø§Ù‡Ø¯Ø©" + topics_entered_long: "المواضيع التي تمت مشاهدتها" time_read: "وقت القراءة" - topic_count: "الموضوعات" - topic_count_long: "الموضوعات المنشورة" + topic_count: "المواضيع" + topic_count_long: "المواضيع المنشورة" post_count: "الردود" post_count_long: "الردود المنشورة" no_results: "لا نتائج." @@ -405,12 +405,12 @@ ar: posts_read: "المقروءة" posts_read_long: "المنشورات المقروءة" total_rows: - few: '%{count} أعضاء' - many: '%{count} عضوًا' - one: عضو واحد - other: '%{count} عضو' - two: عضوان - zero: لا أعضاء + zero: "لا أعضاء" + one: "عضو واحد" + two: "عضوان" + few: "%{count} أعضاء" + many: "%{count} عضوًا" + other: "%{count} عضو" group_histories: actions: change_group_setting: "تغيير إعدادات المجموعة" @@ -478,19 +478,19 @@ ar: is_group_user: "عضو" is_group_owner: "المالك" title: - few: المجموعات - many: المجموعات - one: مجموعة - other: المجموعات - two: مجموعتان - zero: مجموعة + zero: "مجموعة" + one: "مجموعة" + two: "مجموعتان" + few: "المجموعات" + many: "المجموعات" + other: "المجموعات" activity: "النشاط" members: title: "الأعضاء" filter_placeholder: "اسم المستخدم" remove_owner: "حذ٠كمالك" owner: "المالك" - topics: "الموضوعات" + topics: "المواضيع" posts: "المنشورات" mentions: "الإشارات" messages: "الرسائل" @@ -531,7 +531,7 @@ ar: "1": "الإعجابات المعطاة" "2": "الإعجابات المتلقاة" "3": "العلامات المرجعية" - "4": "الموضوعات" + "4": "المواضيع" "5": "الردود" "6": "الردود" "7": "الإشارات" @@ -548,31 +548,29 @@ ar: reorder: title: "إعادة ترتيب الأقسام" title_long: "إعادة تنظيم قائمة الأقسام" - fix_order: "ثبّت الترتيب" - fix_order_tooltip: "ليست كل الأقسام لديها رقم ÙØ±ÙŠØ¯ لترتيبها ÙÙŠ القائمة، ربما يتسبب هذا ÙÙŠ نتيجة غير متوقعة." save: "Ø­ÙØ¸ الترتيب" apply_all: "تطبيق" position: "مكان" posts: "المنشورات" - topics: "الموضوعات" - latest: "آخر الموضوعات" + topics: "المواضيع" + latest: "آخر المواضيع" latest_by: "الاحدث بـ" toggle_ordering: "تبديل التحكم ÙÙŠ الترتيب" subcategories: "أقسام ÙØ±Ø¹ÙŠØ©" topic_sentence: - few: '%{count} مواضيع' - many: '%{count} موضوعًا' - one: موضوع واحد - other: '%{count} موضوع' - two: موضوعان - zero: لا مواضيع + zero: "لا مواضيع" + one: "موضوع واحد" + two: "موضوعان" + few: "%{count} مواضيع" + many: "%{count} موضوعًا" + other: "%{count} موضوع" topic_stat_sentence: - few: '%{count} مواضيع جديدة ÙÙŠ ال%{unit} الماضي.' - many: '%{count} موضوعًا جديدًا ÙÙŠ ال%{unit} الماضي.' - one: موضوع واحد جديد ÙÙŠ ال%{unit} الماضي. - other: '%{count} موضوع جديد ÙÙŠ ال%{unit} الماضي.' - two: موضوعان جديدان ÙÙŠ ال%{unit} الماضي. - zero: لا مواضيع جديدة ÙÙŠ ال%{unit} الماضي. + zero: "لا مواضيع جديدة ÙÙŠ ال%{unit} الماضي." + one: "موضوع واحد جديد ÙÙŠ ال%{unit} الماضي." + two: "موضوعان جديدان ÙÙŠ ال%{unit} الماضي." + few: "%{count} مواضيع جديدة ÙÙŠ ال%{unit} الماضي." + many: "%{count} موضوعًا جديدًا ÙÙŠ ال%{unit} الماضي." + other: "%{count} موضوع جديد ÙÙŠ ال%{unit} الماضي." ip_lookup: title: جدول عناوين الIP hostname: اسم المضي٠@@ -627,7 +625,7 @@ ar: dismiss_notifications_tooltip: "اجعل كل الإشعارات مقروءة" first_notification: "إشعارك الأول! قم بالضغط عليه للبدء." disable_jump_reply: "لا تنتقل إلى منشوري بعد النشر" - dynamic_favicon: "أظهر عدد الموضوعات الجديدة/المحدّثة ÙÙŠ أيقونة Ø§Ù„Ù…ØªØµÙØ­" + dynamic_favicon: "أظهر عدد المواضيع الجديدة/المحدّثة ÙÙŠ أيقونة Ø§Ù„Ù…ØªØµÙØ­" theme_default_on_all_devices: "اجعل هذة الواجهة Ø§ÙØªØ±Ø§Ø¶ÙŠØ© على جميع اجهزتي" external_links_in_new_tab: "ÙØªØ­ الروابط الخارجية ÙÙŠ تبويب جديد" enable_quoting: "ÙØ¹Ù„ خاصية إقتباس النصوص المظللة" @@ -653,7 +651,7 @@ ar: few_per_day: "أرسل لي رسالة لكل منشور جديد (تقريبا إثنتان يوميا)" tag_settings: "الأوسمة" watched_tags: "مراقب" - watched_tags_instructions: "ستراقب آليا كل الموضوعات التي تستخدم هذه الأوسمة. ستصلك إشعارات بالمنشورات Ùˆ الموضوعات الجديدة، وسيظهر أيضا عدّاد للمنشورات الجديدة بجانب كل موضوع." + watched_tags_instructions: "ستراقب آليا كل المواضيع التي تستخدم هذه الأوسمة. ستصلك إشعارات بالمنشورات Ùˆ الموضوعات الجديدة، وسيظهر أيضا عدّاد للمنشورات الجديدة بجانب كل موضوع." tracked_tags: "متابع" tracked_tags_instructions: "ستتابع آليا كل الموضوعات التي تستخدم هذه الأوسمة. وسيظهر أيضا عدّاد للمنشورات الجديدة بجانب كل موضوع." muted_tags: "مكتوم" @@ -730,7 +728,6 @@ ar: error: "حدث عطل أثناء تغيير هذه القيمة." change_username: title: "تغيير اسم المستخدم" - confirm: "إن غيّرت اسم المستخدم ستتعطل كل الاقتباسات من منشوراتك Ùˆ كل الاشارات إلي @اسمك. أواثق تمام الثّقة من ذلك؟" taken: "عذرا، اسم المستخدم غير متاح." invalid: "اسم المستخدم غير صالح. يمكنه احتواء احر٠و ارقام انجليزية ÙØ­Ø³Ø¨" change_email: @@ -750,7 +747,6 @@ ar: upload_title: "Ø§Ø±ÙØ¹ صورتك " upload_picture: "Ø§Ø±ÙØ¹ صورة" image_is_not_a_square: "تحذير: لقد قصصنا صورتك، لأن عرضها ÙˆØ§Ø±ØªÙØ§Ø¹Ù‡Ø§ غير متساويان." - cache_notice: "لقد غيّرت صورة الملÙÙƒ الشخصي بنجاح، ولكن تحديث الصورة قد ياخد وقتا نتيجة تسجيل الصورة القديمة Ø¨Ø§Ù„Ù…ØªØµÙØ­." change_profile_background: title: "خلÙية المل٠الشخصي" instructions: "سيتم وضع خلÙية المل٠الشخصي ÙÙŠ المنتص٠بعرض Ø§ÙØªØ±Ø§Ø¶ÙŠ ÙŠØµÙ„ الى 850px" @@ -765,12 +761,12 @@ ar: authenticated: "تم توثيق بريدك الإلكتروني بواسطة {{provider}}" frequency_immediately: "سيتم ارسال رسالة الكترونية Ùورا ÙÙŠ حال أنك لم تقرأ الرسائل السابقة التي كنا نرسلها لك." frequency: - few: سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة. - many: سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة. - one: سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة. - other: سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة. - two: سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة. - zero: سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة. + zero: "سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة." + one: "سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة." + two: "سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة." + few: "سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة." + many: "سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة." + other: "سنراسلك على بريدك Ùقط ÙÙŠ حال لم تزر الموقع منذ {{count}} دقيقة." name: title: "الاسم" instructions: "اسمك الكامل (اختياريّ)" @@ -855,12 +851,12 @@ ar: user: "المستخدمين المدعويين" sent: "تم الإرسال" truncated: - few: عرض الدعوات الأولية. - many: عرض الدعوات {{count}} الأولى. - one: عرض الدعوة الأولى. - other: عرض الدعوات {{count}} الأولى. - two: عرض الدعوتان الأولتان. - zero: لا يوجد دعوات لعرضها. + zero: "لا يوجد دعوات لعرضها." + one: "عرض الدعوة الأولى." + two: "عرض الدعوتان الأولتان." + few: "عرض الدعوات الأولية." + many: "عرض الدعوات {{count}} الأولى." + other: "عرض الدعوات {{count}} الأولى." redeemed: "دعوات محررة" redeemed_tab: "محررة" redeemed_tab_with_count: "({{count}}) محررة" @@ -907,40 +903,40 @@ ar: time_read: "وقت القراءة" recent_time_read: "وقت القراءة الحديث" topic_count: - few: عدد المواضيع المنشأة - many: عدد المواضيع المنشأة - one: عدد المواضيع المنشأة - other: عدد المواضيع المنشأة - two: عدد المواضيع المنشأة - zero: عدد المواضيع المنشأة + zero: "عدد المواضيع المنشأة" + one: "عدد المواضيع المنشأة" + two: "عدد المواضيع المنشأة" + few: "عدد المواضيع المنشأة" + many: "عدد المواضيع المنشأة" + other: "عدد المواضيع المنشأة" post_count: - few: المنشورات المنشأة - many: المنشورات المنشأة - one: المنشورات المنشأة - other: المنشورات المنشأة - two: المنشورات المنشأة - zero: المنشورات المنشأة + zero: "المنشورات المنشأة" + one: "المنشورات المنشأة" + two: "المنشورات المنشأة" + few: "المنشورات المنشأة" + many: "المنشورات المنشأة" + other: "المنشورات المنشأة" days_visited: - few: أيّام الزّيارة - many: أيّام الزّيارة - one: أيّام الزّيارة - other: أيام الزيارة - two: أيّام الزّيارة - zero: أيّام الزّيارة + zero: "أيّام الزّيارة" + one: "أيّام الزّيارة" + two: "أيّام الزّيارة" + few: "أيّام الزّيارة" + many: "أيّام الزّيارة" + other: "أيام الزيارة" posts_read: - few: المنشورات المقروءة - many: المنشورات المقروءة - one: المنشورات المقروءة - other: المنشورات المقروءة - two: المنشورات المقروءة - zero: المنشورات المقروءة + zero: "المنشورات المقروءة" + one: "المنشورات المقروءة" + two: "المنشورات المقروءة" + few: "المنشورات المقروءة" + many: "المنشورات المقروءة" + other: "المنشورات المقروءة" bookmark_count: - few: العلامات المرجعية - many: العلامات المرجعية - one: العلامات المرجعية - other: العلامات المرجعية - two: العلامات المرجعية - zero: العلامات المرجعية + zero: "العلامات المرجعية" + one: "العلامات المرجعية" + two: "العلامات المرجعية" + few: "العلامات المرجعية" + many: "العلامات المرجعية" + other: "العلامات المرجعية" top_replies: "Ø£ÙØ¶Ù„ الردود" no_replies: "لا يوجد ردود بعد." more_replies: "ردود أخرى" @@ -956,7 +952,6 @@ ar: most_liked_users: "أكثر من أعجبه" most_replied_to_users: "أكثر من رد عليه" no_likes: "لا يوجد إعجابات بعد." - associated_accounts: "تسجيلات الدخول" ip_address: title: "عنوان IP الأخير" registration_ip_address: @@ -1008,12 +1003,12 @@ ar: reached: "%{relativeAge} – %{rate} وصل الحد الاقصي لإعدادت الموقع %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} يتجاوز الحد الاقصي لإعدادت الموقع %{siteSettingRate}." rate: - few: '%{count} خطا / %{duration}' - many: '%{count} خطا /%{duration}' - one: خطا واحد / %{duration} - other: '%{count} خطا /%{duration}' - two: '%{count} خطا / %{duration}' - zero: خطا واحد / %{duration} + zero: "خطا واحد / %{duration}" + one: "خطا واحد / %{duration}" + two: "%{count} خطا / %{duration}" + few: "%{count} خطا / %{duration}" + many: "%{count} خطا /%{duration}" + other: "%{count} خطا /%{duration}" learn_more: "اطّلع على المزيد..." all_time: 'المجموع' all_time_desc: 'عدد المواضيع المنشأة' @@ -1031,19 +1026,17 @@ ar: time_read: المقروءة last_reply_lowercase: آخر رد replies_lowercase: + zero: الردود + one: الردود + two: الردود few: الردود many: الردود - one: الردود other: الردود - two: الردود - zero: الردود signup_cta: sign_up: "إنشاء حساب" hide_session: "ذكرني غدا" hide_forever: "لا شكرا" hidden_for_session: "لا بأس، سأسلك غدًا. يمكنك دوما استخدام 'تسجيل الدخول' لإنشاء حساب ايضا." - intro: "مرحبًا! :heart_eyes: يبدو أنك مستمتع بقراءة هذا النقاش، يمكنك إنشاء حساب Ùˆ مشاركتهم اطرا٠الحديث." - value_prop: "عندما تنتهي من إنشاء الحساب، سنعيدك بالضبط إلي النقطه التي ØªÙˆÙ‚ÙØª عندها Ùˆ سو٠تتلقي إشعارات هنا Ùˆ عبر البريد الإلكتروني بكل رد جديد ينشر. Ùˆ سيمكنك الإعجاب بالمنشورات :heartbeat:" summary: enabled_description: "أنت تطالع ملخّصًا لهذا الموضوع، أي أكثر المنشورات الجديرة بالاهتمام حسب نظرة المجتمع." description: "هناك {{replyCount}} من الردود." @@ -1057,7 +1050,6 @@ ar: disable: "أظهر المشاركات Ø§Ù„Ù…Ø­Ø°ÙˆÙØ©" private_message_info: title: "رسالة" - invite: " إدعو اخرين" remove_allowed_user: "أمتأكّد من إزالة {{name}} من هذه الرّسالة؟" remove_allowed_group: "أمتأكّد من إزالة {{name}} من هذه الرّسالة؟" email: 'البريد الإلكتروني' @@ -1116,9 +1108,6 @@ ar: preferences: "عليك تسجل الدخول لتغيير ØªÙØ¶ÙŠÙ„اتك الشخصية." forgot: "لا أتذكر معلومات حسابي" not_approved: "لم تتمّ المواÙقة على حسابك بعد. سيصلك إشعار عبر البريد عندما تكون مستعدا لتسجيل الدخول." - google: - title: "عبر Google" - message: "تسجيل الدخول عبر Google (تأكد من السماح للـ pop up)" google_oauth2: title: "عبر Google " message: "تسجيل الدخول عبر Google (تأكد من السماح للـ pop up)" @@ -1161,7 +1150,7 @@ ar: category_page_style: categories_only: "الأقسام Ùقط" categories_with_featured_topics: "أقسام ذات مواضيع Ù…Ùميزة" - categories_and_latest_topics: "الأقسام Ùˆ الموضوعات الأخيرة" + categories_and_latest_topics: "الأقسام والمواضيع الأخيرة" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -1204,12 +1193,12 @@ ar: similar_topics: "موضوعك يشابه..." drafts_offline: "مسودات محÙوظة " group_mentioned: - few: الإشارة إلى {{group}} تعني إخطار {{count}} أشخاص. أمتأكّد؟ - many: الإشارة إلى {{group}} تعني إخطار {{count}} شخصًا. أمتأكّد؟ - one: الإشارة إلى {{group}} تعني إخطار شخص واحد. أمتأكّد؟ - other: بالإشارة إلى {{group}} تعني إشعار{{count}} شخص– أمتأكد من ذلك؟ - two: الإشارة إلى {{group}} تعني إخطار شخصين. أمتأكّد؟ - zero: الإشارة إلى {{group}} تعني عدم إخطار أحد. أمتأكّد؟ + zero: "الإشارة إلى {{group}} تعني عدم إخطار أحد. أمتأكّد؟" + one: "الإشارة إلى {{group}} تعني إخطار شخص واحد. أمتأكّد؟" + two: "الإشارة إلى {{group}} تعني إخطار شخصين. أمتأكّد؟" + few: "الإشارة إلى {{group}} تعني إخطار {{count}} أشخاص. أمتأكّد؟" + many: "الإشارة إلى {{group}} تعني إخطار {{count}} شخصًا. أمتأكّد؟" + other: "بالإشارة إلى {{group}} تعني إشعار{{count}} شخص– أمتأكد من ذلك؟" cannot_see_mention: category: "لقد قمت بالإشارة إلي {{username}} لكن لن يتم إشعارهم لأن ليس لديهم صلاحية الوصول لهذا القسم. عليك ان تقوم Ø¨Ø§Ø¶Ø§ÙØªÙ‡Ù… لمجموعة لديها حق الوصول لهذا القسم." private: "لقد قمت بالإشارة إلي {{username}} لكن لن يتم إشعارهم لأن ليس لديهم صلاحية الوصول لهذه الرسالة الخاصة. عليك ان تقوم Ø¨Ø§Ø¶Ø§ÙØªÙ‡Ù… إلي هذة الرسالة." @@ -1290,12 +1279,12 @@ ar: liked: "{{username}}{{description}} " liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - few: {{username}}, {{username2}} Ùˆ {{count}} اخرون {{description}} - many: {{username}}, {{username2}} Ùˆ {{count}} اخرون {{description}} - one: {{username}}, {{username2}} Ùˆ وواحد اخر {{description}} - other: {{username}}, {{username2}} Ùˆ {{count}} اخرون {{description}} - two: {{username}}, {{username2}} Ùˆ اثنين اخرون {{description}} - zero: {{username}}, {{username2}} {{description}} + zero: "{{username}}, {{username2}} {{description}}" + one: "{{username}}, {{username2}} Ùˆ وواحد اخر {{description}}" + two: "{{username}}, {{username2}} Ùˆ اثنين اخرون {{description}}" + few: "{{username}}, {{username2}} Ùˆ {{count}} اخرون {{description}}" + many: "{{username}}, {{username2}} Ùˆ {{count}} اخرون {{description}}" + other: "{{username}}, {{username2}} Ùˆ {{count}} اخرون {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1306,12 +1295,12 @@ ar: topic_reminder: "{{username}}{{description}} " watching_first_post: "موضوع جديد {{description}}" group_message_summary: - few: '{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} ' - many: '{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} ' - one: 'رسالة واحدة ÙÙŠ صندوق رسائل {{group_name}} ' - other: '{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} ' - two: '{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} ' - zero: 'لا يوجد رسائل ÙÙŠ صندوق رسائل {{group_name}} ' + zero: "لا يوجد رسائل ÙÙŠ صندوق رسائل {{group_name}} " + one: "رسالة واحدة ÙÙŠ صندوق رسائل {{group_name}} " + two: "{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} " + few: "{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} " + many: "{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} " + other: "{{count}} رسالة ÙÙŠ صندوق رسائل {{group_name}} " popup: mentioned: 'أشار {{username}} إليك ÙÙŠ "{{topic}}" - {{site_title}}' group_mentioned: 'أشار {{username}} إليك ÙÙŠ "{{topic}}" - {{site_title}}' @@ -1425,12 +1414,12 @@ ar: notification_level: "الاشعارات" choose_new_category: "اختر القسم الجديد للموضوعات:" selected: - few: حددت {{count}} مواضيع. - many: حددت {{count}} موضوعا. - one: حددت موضوع واحد. - other: حددت {{count}} موضوع. - two: حددت موضوعين. - zero: لم تحدد شيئا. + zero: "لم تحدد شيئا." + one: "حددت موضوع واحد." + two: "حددت موضوعين." + few: "حددت {{count}} مواضيع." + many: "حددت {{count}} موضوعا." + other: "حددت {{count}} موضوع." change_tags: "غيّر الأوسمة" append_tags: "اض٠الأوسمة" choose_new_tags: "اختر أوسمة جديدة لهذه الموضوعات:" @@ -1463,12 +1452,12 @@ ar: search: "لا يوجد نتائج بحث أخرى." topic: filter_to: - few: '{{count}} منشور ÙÙŠ الموضوع' - many: '{{count}} منشور ÙÙŠ الموضوع' - one: منشور واحد ÙÙŠ الموضوع - other: '{{count}} منشور ÙÙŠ الموضوع' - two: منشورين ÙÙŠ الموضوع - zero: لا يوجد منشورات ÙÙŠ الموضوع + zero: "لا يوجد منشورات ÙÙŠ الموضوع" + one: "منشور واحد ÙÙŠ الموضوع" + two: "منشورين ÙÙŠ الموضوع" + few: "{{count}} منشور ÙÙŠ الموضوع" + many: "{{count}} منشور ÙÙŠ الموضوع" + other: "{{count}} منشور ÙÙŠ الموضوع" create: 'موضوع جديد' create_long: 'كتابة موضوع جديد' private_message: 'أرسل رسالة خاصة' @@ -1484,19 +1473,19 @@ ar: new: 'موضوع جديد' unread: 'غير مقروء' new_topics: + zero: 'لا مواضيع جديدة' + one: 'موضوع واحد جديد' + two: 'موضوعان جديدان' few: '{{count}} مواضيع جديدة' many: '{{count}} موضوعًا جديدًا' - one: موضوع واحد جديد other: '{{count}} موضوع جديد' - two: موضوعان جديدان - zero: لا مواضيع جديدة unread_topics: + zero: 'لا مواضيع غير مقروءة' + one: 'موضوع واحد غير مقروء' + two: 'موضوعان غير مقروءان' few: '{{count}} مواضيع غير مقروءة' many: '{{count}} موضوعًا غير مقروء' - one: موضوع واحد غير مقروء other: '{{count}} موضوع غير مقروء' - two: موضوعان غير مقروءان - zero: لا مواضيع غير مقروءة title: 'الموضوع' invalid_access: title: "الموضوع خاص" @@ -1509,33 +1498,33 @@ ar: title: "لم ÙŠÙØ¹Ø«Ø± على الموضوع" description: "عذرا، لم نجد هذا الموضوع. ربما أزاله أحد المشرÙين؟" total_unread_posts: - few: لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع - many: لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع - one: لديك منشور واحد غير مقروء ÙÙŠ هذا الموضوع - other: لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع - two: لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع - zero: لا يوجد منشورات غير مقروء ÙÙŠ هذا الموضوع + zero: "لا يوجد منشورات غير مقروء ÙÙŠ هذا الموضوع" + one: "لديك منشور واحد غير مقروء ÙÙŠ هذا الموضوع" + two: "لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع" + few: "لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع" + many: "لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع" + other: "لديك {{count}} منشور غير مقروء ÙÙŠ هذا الموضوع" unread_posts: - few: لديك {{count}} مشاركات قديمة غير مقروءة ÙÙŠ هذا الموضوع - many: لديك {{count}} مشاركة قديمة غير مقروءة ÙÙŠ هذا الموضوع - one: لديك مشاركة واحدة قديمة غير مقروءة ÙÙŠ هذا الموضوع - other: لديك {{count}} مشاركة قديمة غير مقروءة ÙÙŠ هذا الموضوع - two: لديك مشاركتين قديمتين غير مقروءتين ÙÙŠ هذا الموضوع - zero: لا مشاركات قديمة غير مقروءة ÙÙŠ هذا الموضوع + zero: "لا مشاركات قديمة غير مقروءة ÙÙŠ هذا الموضوع" + one: "لديك مشاركة واحدة قديمة غير مقروءة ÙÙŠ هذا الموضوع" + two: "لديك مشاركتين قديمتين غير مقروءتين ÙÙŠ هذا الموضوع" + few: "لديك {{count}} مشاركات قديمة غير مقروءة ÙÙŠ هذا الموضوع" + many: "لديك {{count}} مشاركة قديمة غير مقروءة ÙÙŠ هذا الموضوع" + other: "لديك {{count}} مشاركة قديمة غير مقروءة ÙÙŠ هذا الموضوع" new_posts: - few: هناك {{count}} منشور جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته - many: هناك {{count}} منشور جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته - one: هناك منشور واحد جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته - other: هناك {{count}} منشور جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته - two: هناك منشورين جديدين ÙÙŠ هذا الموضوع منذ اخر مرة قرأته - zero: لا يوجد منشورات جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته + zero: "لا يوجد منشورات جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته" + one: "هناك منشور واحد جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته" + two: "هناك منشورين جديدين ÙÙŠ هذا الموضوع منذ اخر مرة قرأته" + few: "هناك {{count}} منشور جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته" + many: "هناك {{count}} منشور جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته" + other: "هناك {{count}} منشور جديد ÙÙŠ هذا الموضوع منذ اخر مرة قرأته" likes: - few: هناك {{count}} إعجابات ÙÙŠ هذا الموضوع - many: هناك {{count}} إعجابا ÙÙŠ هذا الموضوع - one: هناك إعجاب واحد ÙÙŠ هذا الموضوع - other: هناك {{count}} إعجاب ÙÙŠ هذا الموضوع - two: هناك إعجابين ÙÙŠ هذا الموضوع - zero: لا إعجابات ÙÙŠ هذا الموضوع + zero: "لا إعجابات ÙÙŠ هذا الموضوع" + one: "هناك إعجاب واحد ÙÙŠ هذا الموضوع" + two: "هناك إعجابين ÙÙŠ هذا الموضوع" + few: "هناك {{count}} إعجابات ÙÙŠ هذا الموضوع" + many: "هناك {{count}} إعجابا ÙÙŠ هذا الموضوع" + other: "هناك {{count}} إعجاب ÙÙŠ هذا الموضوع" back_to_list: "عد إلى قائمة الموضوعات" options: "خيارات الموضوعات" show_links: "اظهر الروابط ÙÙŠ هذا الموضوع" @@ -1592,12 +1581,12 @@ ar: auto_reminder: "سو٠يتم تذكيرك بهذا الموضوع %{timeLeft}." auto_close_title: 'إعدادات الإغلاق الآلي' auto_close_immediate: - few: اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ %{count} ساعة, لذا سيتم غلق الموضوع الأن. - many: اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ %{count} ساعة, لذا سيتم غلق الموضوع الأن. - one: اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ ساعة واحدة, لذا سيتم غلق الموضوع الأن. - other: اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ %{count} ساعة, لذا سيتم غلق الموضوع الأن. - two: اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ ساعتين, لذا سيتم غلق الموضوع الأن. - zero: اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ اقل من ساعة, لذا سيتم غلق الموضوع الأن. + zero: "اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ اقل من ساعة, لذا سيتم غلق الموضوع الأن." + one: "اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ ساعة واحدة, لذا سيتم غلق الموضوع الأن." + two: "اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ ساعتين, لذا سيتم غلق الموضوع الأن." + few: "اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ %{count} ساعة, لذا سيتم غلق الموضوع الأن." + many: "اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ %{count} ساعة, لذا سيتم غلق الموضوع الأن." + other: "اخر منشور بهذا الموضوع نشر Ø¨Ø§Ù„ÙØ¹Ù„ منذ %{count} ساعة, لذا سيتم غلق الموضوع الأن." timeline: back: "الرجوع" back_description: "عد إلى آخر منشور غير مقروء" @@ -1704,12 +1693,12 @@ ar: pin_validation: "التاريخ مطلوب لتثبيت هذا الموضوع." not_pinned: "لا يوجد موضوعات مثبتة ÙÙŠ {{categoryLink}}." already_pinned: - few: 'المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}' - many: 'المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}' - one: 'المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: 1' - other: 'الموضوعات مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}' - two: 'المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}' - zero: 'المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}' + zero: "المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}" + one: "المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: 1" + two: "المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}" + few: "المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}" + many: "المواضيع مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}" + other: "الموضوعات مثبتة حالياً ÙÙŠ {{categoryLink}}: {{count}}" pin_globally: "اعرض هذا الموضوع أعلى كل قوائم الموضوعات حتى" confirm_pin_globally: "لديك {{count}} موضوع مثبت علي عموم الموقع مما قد يشكل عبئ على الأعضاء الجدد Ùˆ الزوار. هل أنت واثق أنك تريد تثبيت موضوع أخر على عموم الموقع؟" unpin_globally: "أزل هذا الموضوع من أعلى كل قوائم الموضوعات." @@ -1717,12 +1706,12 @@ ar: global_pin_note: "يمكن للاعضاء إذالة تثبيت الموضوع Ù„Ø£Ù†ÙØ³Ù‡Ù…. " not_pinned_globally: "لا يوجد موضوعات مثبتة للعموم." already_pinned_globally: - few: 'الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}' - many: 'الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}' - one: 'الموضوعات المثبتة علي عموم الموقع حاليا: 1' - other: 'الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}' - two: 'الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}' - zero: 'الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}' + zero: "الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}" + one: "الموضوعات المثبتة علي عموم الموقع حاليا: 1" + two: "الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}" + few: "الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}" + many: "الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}" + other: "الموضوعات المثبتة علي عموم الموقع حاليا: {{count}}" make_banner: "اجعل هذا الموضوع إعلانا يظهر أعلى كل Ø§Ù„ØµÙØ­Ø§Øª." remove_banner: "أزل الإعلان الذي يظهر أعلى كل Ø§Ù„ØµÙØ­Ø§Øª." banner_note: "الأعضاء يستطيعون تجاهل الموضوع المثبت كإعلان بإغلاقه. لا تمكن تعيين اكثر من موضوع ÙÙŠ Ù†ÙØ³ الوقت كإعلان." @@ -1759,12 +1748,12 @@ ar: login_reply: 'عليك تسجيل الدخول للرد' filters: n_posts: - few: '{{count}} منشور' - many: '{{count}} منشور' - one: منشور واحد - other: '{{count}} منشور' - two: منشوران - zero: لا يوجد منشورات + zero: "لا يوجد منشورات" + one: "منشور واحد" + two: "منشوران" + few: "{{count}} منشور" + many: "{{count}} منشور" + other: "{{count}} منشور" cancel: "إزالة الترشيح" split_topic: title: "نقل الى موضوع جديد" @@ -1772,23 +1761,23 @@ ar: topic_name: "اسم الموضوع الجديد" error: "حدث عطل أثناء نقل المنشورات إلى موضوع جديد." instructions: - few: أنت على وشك انشاء موضوع جديد وتعبئته بـ {{count}} منشور اخترتة. - many: أنت على وشك انشاء موضوع جديد وتعبئته بـ {{count}} منشور اخترتة. - one: أنت على وشك انشاء موضوع جديد وتعبئته بمنشورم اخترتة. - other: أنت على وشك انشاء موضوع جديد وتعبئته بـ {{count}} منشور اخترتة. - two: أنت على وشك انشاء موضوع جديد وتعبئته منشورين اخترتهما. - zero: أنت على وشك انشاء موضوع جديد, ولم تقم باختيار أي منشور لتعبئته. + zero: "أنت على وشك انشاء موضوع جديد, ولم تقم باختيار أي منشور لتعبئته." + one: "أنت على وشك انشاء موضوع جديد وتعبئته بمنشورم اخترتة." + two: "أنت على وشك انشاء موضوع جديد وتعبئته منشورين اخترتهما." + few: "أنت على وشك انشاء موضوع جديد وتعبئته بـ {{count}} منشور اخترتة." + many: "أنت على وشك انشاء موضوع جديد وتعبئته بـ {{count}} منشور اخترتة." + other: "أنت على وشك انشاء موضوع جديد وتعبئته بـ {{count}} منشور اخترتة." merge_topic: title: "نقل الى موضوع موجود" action: "نقل الى موضوع موجود" error: "حدث عطل أثناء نقل المنشورات إلى الموضوع ذاك." instructions: - few: الرجاء اختيار الموضوع الذي تود نقل الـ{{count}} منشور إليه. - many: الرجاء اختيار الموضوع الذي تود نقل الـ{{count}} منشور إليه. - one: الرجاء اختيار الموضوع الذي تود نقل منشور واحد إليه. - other: الرجاء اختيار الموضوع الذي تود نقل الـ{{count}} منشور إليه. - two: الرجاء اختيار الموضوع الذي تود نقل منشورين إليه. - zero: لم يتم اختيار أي منشورات لنقلها ! + zero: "لم يتم اختيار أي منشورات لنقلها !" + one: "الرجاء اختيار الموضوع الذي تود نقل منشور واحد إليه." + two: "الرجاء اختيار الموضوع الذي تود نقل منشورين إليه." + few: "الرجاء اختيار الموضوع الذي تود نقل الـ{{count}} منشور إليه." + many: "الرجاء اختيار الموضوع الذي تود نقل الـ{{count}} منشور إليه." + other: "الرجاء اختيار الموضوع الذي تود نقل الـ{{count}} منشور إليه." merge_posts: title: "ادمج المنشورات المحدّدة" action: "ادمج المنشورات المحددة" @@ -1800,12 +1789,12 @@ ar: label: "الكاتب الجديد للمنشورات" placeholder: "اسم مستخدم الكاتب الجديد" instructions: - few: الرجاء اختيار المالك الجديد لـ {{count}} منشور Ù†ÙØ´Ø± بواسطة {{old_user}}. - many: الرجاء اختيار المالك الجديد لـ {{count}} منشور Ù†ÙØ´Ø± بواسطة {{old_user}}. - one: الرجاء اختيار المالك الجديد لمنشور Ù†ÙØ´Ø± بواسطة {{old_user}}. - other: الرجاء اختيار الكاتب الجديد لـ {{count}} منشور Ù†ÙØ´Ø± بواسطة {{old_user}}. - two: الرجاء اختيار المالك الجديد لمنشورين Ù†ÙØ´Ø±ÙˆØ§ بواسطة {{old_user}}. - zero: لم يتم تحديد أي منشورات! + zero: "لم يتم تحديد أي منشورات!" + one: "الرجاء اختيار المالك الجديد لمنشور Ù†ÙØ´Ø± بواسطة {{old_user}}." + two: "الرجاء اختيار المالك الجديد لمنشورين Ù†ÙØ´Ø±ÙˆØ§ بواسطة {{old_user}}." + few: "الرجاء اختيار المالك الجديد لـ {{count}} منشور Ù†ÙØ´Ø± بواسطة {{old_user}}." + many: "الرجاء اختيار المالك الجديد لـ {{count}} منشور Ù†ÙØ´Ø± بواسطة {{old_user}}." + other: "الرجاء اختيار الكاتب الجديد لـ {{count}} منشور Ù†ÙØ´Ø± بواسطة {{old_user}}." change_timestamp: title: "غير تاريخ النشر..." action: "غير تاريخ النشر..." @@ -1820,12 +1809,12 @@ ar: select_all: حدد الكل deselect_all: أزل تحديد الكل description: - few: لقد حدّدت {{count}} منشور. - many: لقد حدّدت {{count}} منشور. + zero: "لم تحدّد أي منشورات." one: لقد حدّدت منشورواحد. - other: لقد حدّدت {{count}} منشور. - two: لقد حدّدت منشورين. - zero: لم تحدّد أي منشورات. + two: "لقد حدّدت منشورين." + few: "لقد حدّدت {{count}} منشور." + many: "لقد حدّدت {{count}} منشور." + other: "لقد حدّدت {{count}} منشور." post: quote_reply: "اقتبس" edit_reason: "السبب:" @@ -1839,50 +1828,50 @@ ar: show_full: "عرض كامل المنشور" show_hidden: 'اعرض المحتوى المخÙيّ.' deleted_by_author: - few: (سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه) - many: (سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه) - one: (سحب الكاتب المنشور، سيحذ٠آليًّا خلال ساعة واحدة ما لم ÙŠÙØ¨Ù„ّغ عنه) - other: (سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه) - two: (سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه) - zero: (سحب الكاتب المنشور، سيحذ٠آليًّا الأن ما لم ÙŠÙØ¨Ù„ّغ عنه) + zero: "(سحب الكاتب المنشور، سيحذ٠آليًّا الأن ما لم ÙŠÙØ¨Ù„ّغ عنه)" + one: "(سحب الكاتب المنشور، سيحذ٠آليًّا خلال ساعة واحدة ما لم ÙŠÙØ¨Ù„ّغ عنه)" + two: "(سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه)" + few: "(سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه)" + many: "(سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه)" + other: "(سحب الكاتب المنشور، سيحذ٠آليًّا خلال %{count} ساعة ما لم ÙŠÙØ¨Ù„ّغ عنه)" expand_collapse: "إظهار/Ø¥Ø®ÙØ§Ø¡" gap: - few: اعرض ال†{{count}} رد مخÙÙŠ - many: اعرض ال†{{count}} رد مخÙÙŠ - one: اعرض رد واحد مخÙÙŠ - other: اعرض ال†{{count}} رد مخÙÙŠ - two: اعرض ال†{{count}} رد مخÙÙŠ - zero: لا يوجد ردود مخÙية + zero: "لا يوجد ردود مخÙية" + one: "اعرض رد واحد مخÙÙŠ" + two: "اعرض ال†{{count}} رد مخÙÙŠ" + few: "اعرض ال†{{count}} رد مخÙÙŠ" + many: "اعرض ال†{{count}} رد مخÙÙŠ" + other: "اعرض ال†{{count}} رد مخÙÙŠ" unread: "المنشور غير مقروء" has_replies: - few: '{{count}} رد' - many: '{{count}} رد' - one: رد واحد - other: '{{count}} رد' - two: '{{count}} رد' - zero: لا ردود + zero: "لا ردود" + one: "رد واحد" + two: "{{count}} رد" + few: "{{count}} رد" + many: "{{count}} رد" + other: "{{count}} رد" has_likes: - few: '{{count}} إعجاب' - many: '{{count}} إعجاب' - one: إعجاب واحد - other: '{{count}} إعجاب' - two: '{{count}} إعجاب' - zero: لا إعجابات + zero: "لا إعجابات" + one: "إعجاب واحد" + two: "{{count}} إعجاب" + few: "{{count}} إعجاب" + many: "{{count}} إعجاب" + other: "{{count}} إعجاب" has_likes_title: - few: '{{count}} عضو اعجب بهذا المشروع' - many: '{{count}} عضو اعجب بهذا المشروع' - one: عضو واحد اعجب بهذا المشروع - other: '{{count}} عضو اعجب بهذا المشروع' - two: '{{count}} عضو اعجب بهذا المشروع' - zero: '{{count}} عضو اعجب بهذا المشروع' + zero: "{{count}} عضو اعجب بهذا المشروع" + one: "عضو واحد اعجب بهذا المشروع" + two: "{{count}} عضو اعجب بهذا المشروع" + few: "{{count}} عضو اعجب بهذا المشروع" + many: "{{count}} عضو اعجب بهذا المشروع" + other: "{{count}} عضو اعجب بهذا المشروع" has_likes_title_only_you: "اعجبك هذا المنشور" has_likes_title_you: - few: انت Ùˆ {{count}} غيرك اعجبكم هذا المنشور. - many: انت Ùˆ {{count}} غيرك اعجبكم هذا المنشور. - one: انت Ùˆ عضو واحد غيرك اعجبكم هذا المنشور. - other: انت Ùˆ {{count}} غيرك اعجبكم هذا المنشور. - two: انت Ùˆ عضوين غيرك اعجبكم هذا المنشور. - zero: لم يعجب احد غيرك بهذا المنشور + zero: "لم يعجب احد غيرك بهذا المنشور" + one: "انت Ùˆ عضو واحد غيرك اعجبكم هذا المنشور." + two: "انت Ùˆ عضوين غيرك اعجبكم هذا المنشور." + few: "انت Ùˆ {{count}} غيرك اعجبكم هذا المنشور." + many: "انت Ùˆ {{count}} غيرك اعجبكم هذا المنشور." + other: "انت Ùˆ {{count}} غيرك اعجبكم هذا المنشور." errors: create: "عذرا، حدثت مشكلة اثناء إنشاء منشورك. من ÙØ¶Ù„Ùƒ حاول مجددا." edit: "عذرا، حدثت مشكلة اثناء تعديل منشورك. من ÙØ¶Ù„Ùƒ حاول مجددا." @@ -1897,7 +1886,7 @@ ar: abandon: confirm: "أمتأكد من التخلي عن المنشور؟" no_value: "لا، أبقها" - yes_value: "نعم، لا أريدها" + yes_value: "نعم، لا أريده" via_email: "وصل هذا المنشور عبر البريد" via_auto_generated_email: "وصل هذا المنشور عبر بريد مولّد آلياً" whisper: "هذا المنشور سري خاص بالمشرÙين" @@ -1935,7 +1924,6 @@ ar: inappropriate: "تراجع عن البلاغ" bookmark: "تراجع عن البلاغ" like: "تراجع عن الإعجاب" - vote: "تراجع عن التصويت" people: off_topic: "ابلغ عنه انه خارج الموضوع" spam: "ابلغ عنه انه سبام" @@ -1944,7 +1932,6 @@ ar: notify_user: "ارسلت رساله" bookmark: "وضع علية علامة مرجعية" like: "أعجبهم هذا" - vote: "صوت لهذا" by_you: off_topic: "لقد ابلغت ان هذا المنشور خارج الموضوع" spam: "لقد ابلغت ان هذا المنشور سبام" @@ -1953,129 +1940,114 @@ ar: notify_user: "لقد أرسلت رسالة إلى هذا العضو" bookmark: "لقد وضعت علامة مرجعية علي هذا المنشور" like: "أعجبت بهذا المنشور" - vote: "لقد صوّت على هذا المنشور" by_you_and_others: off_topic: - few: أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع - many: أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع - one: أنت وشخص اخر أبلّغتما بأن هذا المنشور خارج الموضوع. - other: أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع - two: أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع - zero: أنت أبلّغت بأن هذا المنشور خارج الموضوع. + zero: "أنت أبلّغت بأن هذا المنشور خارج الموضوع." + one: "أنت وشخص اخر أبلّغتما بأن هذا المنشور خارج الموضوع." + two: "أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع" + few: "أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع" + many: "أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع" + other: "أنت Ùˆ {{count}} آخرون أبلغتم بأن هذا المنشور خارج الموضوع" spam: - few: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام. - many: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام. - one: أنت وشخص آخر أبلّغتما بأن هذا المنشور سبام. - other: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام. - two: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام. - zero: أنت أبلّغت بأن هذا هذا المنشور سبام. + zero: "أنت أبلّغت بأن هذا هذا المنشور سبام." + one: "أنت وشخص آخر أبلّغتما بأن هذا المنشور سبام." + two: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام." + few: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام." + many: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام." + other: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور سبام." inappropriate: - few: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق. - many: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق. - one: أنت Ùˆ شخص آخر أبلّغتما بأن هذا المنشور غير لائق. - other: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق. - two: أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق. - zero: أنت أبلّغت بأن هذا المنشور غير لائق. + zero: "أنت أبلّغت بأن هذا المنشور غير لائق." + one: "أنت Ùˆ شخص آخر أبلّغتما بأن هذا المنشور غير لائق." + two: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق." + few: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق." + many: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق." + other: "أنت Ùˆ {{count}} آخرون أبلّغتم بأن هذا المنشور غير لائق." notify_moderators: - few: أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور. - many: أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور. - one: أنت Ùˆ شخص آخر أبلّغتما المشرÙين عن هذا المنشور. - other: أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور. - two: أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور. - zero: أنت أبلّغت المشرÙين عن هذا المنشور. + zero: "أنت أبلّغت المشرÙين عن هذا المنشور." + one: "أنت Ùˆ شخص آخر أبلّغتما المشرÙين عن هذا المنشور." + two: "أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور." + few: "أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور." + many: "أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور." + other: "أنت Ùˆ {{count}} آخرون أبلّغتم المشرÙين عن هذا المنشور." notify_user: - few: أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو. - many: أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو. - one: أنت Ùˆ شخص اخر ارسلتما رسالة لهذا العضو. - other: أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو. - two: أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو. - zero: أنت أرسلت رسالة لهذا العضو. + zero: "أنت أرسلت رسالة لهذا العضو." + one: "أنت Ùˆ شخص اخر ارسلتما رسالة لهذا العضو." + two: "أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو." + few: "أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو." + many: "أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو." + other: "أنت Ùˆ {{count}} آخرون ارسلتم رسالة لهذا العضو." bookmark: - few: أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور - many: أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور - one: أنت Ùˆ شخص آخر وضعتما علامة مرجعية علي هذا المنشور - other: أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور - two: أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور - zero: أنت وضعت علامة مرجعية علي هذا المنشور + zero: "أنت وضعت علامة مرجعية علي هذا المنشور" + one: "أنت Ùˆ شخص آخر وضعتما علامة مرجعية علي هذا المنشور" + two: "أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور" + few: "أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور" + many: "أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور" + other: "أنت Ùˆ {{count}} آخرون وضعتم علامة مرجعية علي هذا المنشور" like: - few: أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور - many: أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور - one: أنت Ùˆ شخص آخر اعجبتما بهذا المنشور - other: أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور - two: أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور - zero: أنت اعجبت بهذا المنشور - vote: - few: أنت Ùˆ {{count}} آخرون صوتم علي هذا المنشور - many: أنت Ùˆ {{count}} آخرون صوتم علي هذا المنشور - one: أنت Ùˆ شخص آخر صوتما علي هذا المنشور - other: أنت Ùˆ {{count}} آخرون صوتم علي هذا المنشور - two: أنت Ùˆ {{count}} آخرون صوتم علي هذا المنشور - zero: أنت صوت علي هذا المنشور + zero: "أنت اعجبت بهذا المنشور" + one: "أنت Ùˆ شخص آخر اعجبتما بهذا المنشور" + two: "أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور" + few: "أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور" + many: "أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور" + other: "أنت Ùˆ {{count}} آخرون اعجبتم بهذا المنشور" by_others: off_topic: - few: '{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع' - many: '{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع' - one: عضو واحد أبلغ بأن هذا المنشور خارج الموضوع - other: '{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع' - two: '{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع' - zero: لم يبلغ احد بأن هذا المنشور خارج الموضوع + zero: "لم يبلغ احد بأن هذا المنشور خارج الموضوع" + one: "عضو واحد أبلغ بأن هذا المنشور خارج الموضوع" + two: "{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع" + few: "{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع" + many: "{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع" + other: "{{count}} عضو أبلغ بأن هذا المنشور خارج الموضوع" spam: - few: '{{count}} عضو أبلّغ بأن هذا المنشور سبام.' - many: '{{count}} عضو أبلّغ بأن هذا المنشور سبام.' - one: عضو واحد أبلّغ بأن هذا المنشور سبام. - other: '{{count}} عضو أبلّغ بأن هذا المنشور سبام.' - two: '{{count}} عضو أبلّغ بأن هذا المنشور سبام.' - zero: لم يبلّغ احد بأن هذا المنشور سبام. + zero: "لم يبلّغ احد بأن هذا المنشور سبام." + one: "عضو واحد أبلّغ بأن هذا المنشور سبام." + two: "{{count}} عضو أبلّغ بأن هذا المنشور سبام." + few: "{{count}} عضو أبلّغ بأن هذا المنشور سبام." + many: "{{count}} عضو أبلّغ بأن هذا المنشور سبام." + other: "{{count}} عضو أبلّغ بأن هذا المنشور سبام." inappropriate: - few: '{{count}} عضو أبلّغ بأن هذا المنشور غير لائق.' - many: '{{count}} عضو أبلّغ بأن هذا المنشور غير لائق.' - one: عضو واحد أبلّغ بأن هذا المنشور غير لائق. - other: '{{count}} عضو أبلّغ بأن هذا المنشور غير لائق.' - two: '{{count}} عضو أبلّغ بأن هذا المنشور غير لائق.' - zero: لم يبلغ احد بأن هذا المنشور غير لائق. + zero: "لم يبلغ احد بأن هذا المنشور غير لائق." + one: "عضو واحد أبلّغ بأن هذا المنشور غير لائق." + two: "{{count}} عضو أبلّغ بأن هذا المنشور غير لائق." + few: "{{count}} عضو أبلّغ بأن هذا المنشور غير لائق." + many: "{{count}} عضو أبلّغ بأن هذا المنشور غير لائق." + other: "{{count}} عضو أبلّغ بأن هذا المنشور غير لائق." notify_moderators: - few: '{{count}} عضو أبلّغ المشرÙين عن هذا المنشور' - many: '{{count}} عضو أبلّغ المشرÙين عن هذا المنشور' - one: عضو واحد أبلّغ المشرÙين عن هذا المنشور - other: '{{count}} عضو أبلّغ المشرÙين عن هذا المنشور' - two: '{{count}} عضو أبلّغ المشرÙين عن هذا المنشور' - zero: لم يبلغ احد المشرÙين عن هذا المنشور + zero: "لم يبلغ احد المشرÙين عن هذا المنشور" + one: "عضو واحد أبلّغ المشرÙين عن هذا المنشور" + two: "{{count}} عضو أبلّغ المشرÙين عن هذا المنشور" + few: "{{count}} عضو أبلّغ المشرÙين عن هذا المنشور" + many: "{{count}} عضو أبلّغ المشرÙين عن هذا المنشور" + other: "{{count}} عضو أبلّغ المشرÙين عن هذا المنشور" notify_user: - few: '{{count}} عضو ارسل رسالة لهذا العضو' - many: '{{count}} عضو ارسل رسالة لهذا العضو' - one: عضو واحد ارسل رسالة لهذا العضو - other: '{{count}} عضو ارسل رسالة لهذا العضو' - two: '{{count}} عضو ارسل رسالة لهذا العضو' - zero: لم يرسل احد رسالة لهذا العضو + zero: "لم يرسل احد رسالة لهذا العضو" + one: "عضو واحد ارسل رسالة لهذا العضو" + two: "{{count}} عضو ارسل رسالة لهذا العضو" + few: "{{count}} عضو ارسل رسالة لهذا العضو" + many: "{{count}} عضو ارسل رسالة لهذا العضو" + other: "{{count}} عضو ارسل رسالة لهذا العضو" bookmark: - few: '{{count}} عضو وضع علامة مرجعية علي هذا المنشور' - many: '{{count}} عضو وضع علامة مرجعية علي هذا المنشور' - one: عضو واحد وضع علامة مرجعية علي هذا المنشور - other: '{{count}} عضو وضع علامة مرجعية علي هذا المنشور' - two: '{{count}} عضو وضع علامة مرجعية علي هذا المنشور' - zero: لم يضع احد علامة مرجعية علي هذا المنشور + zero: "لم يضع احد علامة مرجعية علي هذا المنشور" + one: "عضو واحد وضع علامة مرجعية علي هذا المنشور" + two: "{{count}} عضو وضع علامة مرجعية علي هذا المنشور" + few: "{{count}} عضو وضع علامة مرجعية علي هذا المنشور" + many: "{{count}} عضو وضع علامة مرجعية علي هذا المنشور" + other: "{{count}} عضو وضع علامة مرجعية علي هذا المنشور" like: - few: '{{count}} عضو اعجب بهذا المنشور' - many: '{{count}} عضو اعجب بهذا المنشور' - one: عضو واحد اعجب بهذا المنشور - other: '{{count}} عضو اعجب بهذا المنشور' - two: '{{count}} عضو اعجب بهذا المنشور' - zero: لم يعجب احد بهذا المنشور - vote: - few: '{{count}} عضو صوت علي هذا المنشور' - many: '{{count}} عضو صوت علي هذا المنشور' - one: عضو واحد صوت علي هذا المنشور - other: '{{count}} عضو صوت علي هذا المنشور' - two: '{{count}} عضو صوت علي هذا المنشور' - zero: لم يصوت احد علي هذا المنشور + zero: "لم يعجب احد بهذا المنشور" + one: "عضو واحد اعجب بهذا المنشور" + two: "{{count}} عضو اعجب بهذا المنشور" + few: "{{count}} عضو اعجب بهذا المنشور" + many: "{{count}} عضو اعجب بهذا المنشور" + other: "{{count}} عضو اعجب بهذا المنشور" merge: confirm: - few: هل انت متاكد انك تريد دمج الـ {{count}} منشور؟ - many: هل انت متاكد انك تريد دمج الـ {{count}} منشور؟ - one: هل انت متاكد انك تريد دمج هذا المنشور؟ - other: هل انت متاكد انك تريد دمج الـ {{count}} منشور؟ - two: هل انت متاكد انك تريد دمج هذان المنشوران؟ - zero: لا يوجد منشورات لدمجها + zero: "لا يوجد منشورات لدمجها" + one: "هل انت متاكد انك تريد دمج هذا المنشور؟" + two: "هل انت متاكد انك تريد دمج هذان المنشوران؟" + few: "هل انت متاكد انك تريد دمج الـ {{count}} منشور؟" + many: "هل انت متاكد انك تريد دمج الـ {{count}} منشور؟" + other: "هل انت متاكد انك تريد دمج الـ {{count}} منشور؟" revisions: controls: first: "أول مراجعة" @@ -2113,7 +2085,6 @@ ar: can: 'قادر علي…' none: '(غير مصنÙ)' all: 'كل الأقسام' - choose: 'اختر قسم …' edit: 'تعديل' edit_long: "تعديل" view: 'أظهار الموضوعات ÙÙŠ القسم' @@ -2160,7 +2131,6 @@ ar: show_subcategory_list: "أظهر الأقسام Ø§Ù„ÙØ±Ø¹ÙŠØ© Ùوق الموضوعات من هذا القسم." num_featured_topics: "عدد الموضوعات المعروضة ÙÙŠ ØµÙØ­Ø© الأقسام:" subcategory_num_featured_topics: "عدد الموضوعات المÙميزة ÙÙŠ ØµÙØ­Ø© القسم الرئيسي." - all_topics_wiki: "اجعل المواضيع الجديدة \"ويكي\" Ø§ÙØªØ±Ø§Ø¶ÙŠÙ‘ًا." subcategory_list_style: "أسلوب عرض قائمة الأقسام Ø§Ù„ÙØ±Ø¹ÙŠØ©:" sort_order: "رتب قائمة الموضوعات حسب:" default_view: "قائمة الموضوعات Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠØ©" @@ -2169,7 +2139,6 @@ ar: edit_permissions: "عدل التصاريح" add_permission: "أض٠تصريحًا" this_year: "هذه السنة" - position: "المكان" default_position: "المكان Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ" position_disabled: "Ø³ÙˆÙ ØªÙØ¹Ø±Ø¶ الاقسام بترتيب نشاطها. للتّحكّم بترتيب الأقسام ÙÙŠ القائمة،" position_disabled_click: 'ÙØ¹Ù‘Ù„ خاصية "تثبيت ترتيب الأقسام".' @@ -2230,26 +2199,26 @@ ar: custom_placeholder_notify_moderators: "يمكنك تزودنا بمعلومات أكثر عن سبب عدم ارتياحك إلي هذا المنشور؟ زودنا ببعض الروابط Ùˆ الأمثلة قدر الإمكان." custom_message: at_least: - few: أدخل {{count}} احر٠على الأقل - many: أدخل {{count}} احر٠على الأقل - one: أدخل حر٠واحد على الأقل - other: أدخل {{count}} احر٠على الأقل - two: أدخل {{count}} احر٠على الأقل - zero: لا ØªÙØ¯Ø®Ù„ أيّ محر٠+ zero: "لا ØªÙØ¯Ø®Ù„ أيّ محرÙ" + one: "أدخل حر٠واحد على الأقل" + two: "أدخل {{count}} احر٠على الأقل" + few: "أدخل {{count}} احر٠على الأقل" + many: "أدخل {{count}} احر٠على الأقل" + other: "أدخل {{count}} احر٠على الأقل" more: - few: '{{count}} حر٠متبقي علي الحد الادني...' - many: '{{count}} حر٠متبقي علي الحد الادني...' - one: حر٠واحد متبقي علي الحد الادني... - other: '{{count}} حر٠متبقي علي الحد الادني...' - two: '{{count}} حر٠متبقي علي الحد الادني...' - zero: '{{count}} حر٠متبقي علي الحد الادني...' + zero: "{{count}} حر٠متبقي علي الحد الادني..." + one: "حر٠واحد متبقي علي الحد الادني..." + two: "{{count}} حر٠متبقي علي الحد الادني..." + few: "{{count}} حر٠متبقي علي الحد الادني..." + many: "{{count}} حر٠متبقي علي الحد الادني..." + other: "{{count}} حر٠متبقي علي الحد الادني..." left: - few: '{{count}} حر٠متبقي علي الحد الاقصي...' - many: '{{count}} حر٠متبقي علي الحد الاقصي...' - one: حر٠واحد متبقي علي الحد الاقصي... - other: '{{count}} حر٠متبقي علي الحد الاقصي...' - two: '{{count}} حر٠متبقي علي الحد الاقصي...' - zero: '{{count}} حر٠متبقي علي الحد الاقصي...' + zero: "{{count}} حر٠متبقي علي الحد الاقصي..." + one: "حر٠واحد متبقي علي الحد الاقصي..." + two: "{{count}} حر٠متبقي علي الحد الاقصي..." + few: "{{count}} حر٠متبقي علي الحد الاقصي..." + many: "{{count}} حر٠متبقي علي الحد الاقصي..." + other: "{{count}} حر٠متبقي علي الحد الاقصي..." flagging_topic: title: "شكرا لمساعدتنا ÙÙŠ ابقاء المجمتع متحضر" action: "التبليغ عن الموضوع" @@ -2260,21 +2229,21 @@ ar: links_title: "روابط مشهورة" links_shown: "أظهر روابط أخرى..." clicks: - few: '%{count} نقرات' - many: '%{count} نقرة' - one: نقرة واحدة - other: '%{count} نقرة' - two: نقرتان - zero: لا نقرات + zero: "لا نقرات" + one: "نقرة واحدة" + two: "نقرتان" + few: "%{count} نقرات" + many: "%{count} نقرة" + other: "%{count} نقرة" post_links: about: "وسّع المزيد من الروابط ÙÙŠ هذه المشاركة" title: - few: '%{count} أخرى' - many: '%{count} أخرى' - one: واحدة أخرى - other: '%{count} أكثر' - two: إثنتان أخريتان - zero: لا شيء آخر + zero: "لا شيء آخر" + one: "واحدة أخرى" + two: "إثنتان أخريتان" + few: "%{count} أخرى" + many: "%{count} أخرى" + other: "%{count} أكثر" topic_statuses: warning: help: "هذا تحذير رسمي." @@ -2308,38 +2277,38 @@ ar: original_post: "المنشور الاصلي" views: "المشاهدات" views_lowercase: - few: المشاهدات - many: المشاهدات - one: المشاهدات - other: المشاهدات - two: المشاهدات - zero: المشاهدات + zero: "المشاهدات" + one: "المشاهدات" + two: "المشاهدات" + few: "المشاهدات" + many: "المشاهدات" + other: "المشاهدات" replies: "الردود" views_long: - few: تم مشاهدة هذا الموضوع {{number}} مرة - many: تم مشاهدة هذا الموضوع {{number}} مرة - one: تم مشاهدة هذا الموضوع مرة واحدة - other: تم مشاهدة هذا الموضوع {{number}} مرة - two: تم مشاهدة هذا الموضوع {{number}} مرة - zero: تم مشاهدة هذا الموضوع {{number}} مرة + zero: "تم مشاهدة هذا الموضوع {{number}} مرة" + one: "تم مشاهدة هذا الموضوع مرة واحدة" + two: "تم مشاهدة هذا الموضوع {{number}} مرة" + few: "تم مشاهدة هذا الموضوع {{number}} مرة" + many: "تم مشاهدة هذا الموضوع {{number}} مرة" + other: "تم مشاهدة هذا الموضوع {{number}} مرة" activity: "النشاط" likes: "اعجابات" likes_lowercase: - few: اﻹعجابات - many: اﻹعجابات - one: اﻹعجابات - other: اﻹعجابات - two: اﻹعجابات - zero: اﻹعجابات + zero: "اﻹعجابات" + one: "اﻹعجابات" + two: "اﻹعجابات" + few: "اﻹعجابات" + many: "اﻹعجابات" + other: "اﻹعجابات" likes_long: "هناك {{number}} اعجابات ÙÙŠ هذا الموضوع" users: "الأعضاء" users_lowercase: - few: الأعضاء - many: الأعضاء - one: عضو واحد - other: الأعضاء - two: عضوين - zero: عضو + zero: "عضو" + one: "عضو واحد" + two: "عضوين" + few: "الأعضاء" + many: "الأعضاء" + other: "الأعضاء" category_title: "قسم" history: "تاريخ" changed_by: "الكاتب {{author}}" @@ -2353,12 +2322,12 @@ ar: latest: title: "الأخيرة" title_with_count: - few: الأخيرة ({{count}}) - many: الأخيرة ({{count}}) - one: الأخيرة ({{count}}) - other: الأخيرة ({{count}}) - two: الأخيرة ({{count}}) - zero: الأخيرة ({{count}}) + zero: "الأخيرة ({{count}})" + one: "الأخيرة ({{count}})" + two: "الأخيرة ({{count}})" + few: "الأخيرة ({{count}})" + many: "الأخيرة ({{count}})" + other: "الأخيرة ({{count}})" help: "الموضوعات التي بها منشورات حديثة" hot: title: "نَشط" @@ -2376,37 +2345,37 @@ ar: unread: title: "غير المقروءة" title_with_count: - few: غير المقروءة ({{count}}) - many: غير المقروءة ({{count}}) - one: غير المقروءة ({{count}}) - other: غير المقروءة ({{count}}) - two: غير المقروءة ({{count}}) - zero: غير المقروءة ({{count}}) + zero: "غير المقروءة ({{count}})" + one: "غير المقروءة ({{count}})" + two: "غير المقروءة ({{count}})" + few: "غير المقروءة ({{count}})" + many: "غير المقروءة ({{count}})" + other: "غير المقروءة ({{count}})" help: "الموضوعات التي تتابعها (أو تراقبها) والتي Ùيها منشورات غير مقروءة" lower_title_with_count: - few: '{{count}} غير مقروء ' - many: '{{count}} غير مقروء' - one: 1 غير مقروء - other: '{{count}} غير مقروء' - two: '{{count}} غير مقروء ' - zero: '1 غير مقررء ' + zero: "1 غير مقررء " + one: "1 غير مقروء" + two: "{{count}} غير مقروء " + few: "{{count}} غير مقروء " + many: "{{count}} غير مقروء" + other: "{{count}} غير مقروء" new: lower_title_with_count: - few: '{{count}} جديد' - many: '{{count}} جديد' - one: 1 جديد - other: '{{count}} جديدة' - two: '{{count}} جديد' - zero: لا جديد + zero: "لا جديد" + one: "1 جديد" + two: "{{count}} جديد" + few: "{{count}} جديد" + many: "{{count}} جديد" + other: "{{count}} جديدة" lower_title: "الجديدة" title: "الجديدة" title_with_count: - few: الجديدة ({{count}}) - many: الجديدة ({{count}}) - one: الجديدة ({{count}}) - other: الجديدة ({{count}}) - two: الجديدة ({{count}}) - zero: الجديدة ({{count}}) + zero: "الجديدة ({{count}})" + one: "الجديدة ({{count}})" + two: "الجديدة ({{count}})" + few: "الجديدة ({{count}})" + many: "الجديدة ({{count}})" + other: "الجديدة ({{count}})" help: "المواضيع المنشأة ÙÙŠ الأيّام القليلة الماضية" posted: title: "منشوراتي" @@ -2417,12 +2386,12 @@ ar: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - many: '{{categoryName}} ({{count}})' - one: '{{categoryName}} ({{count}})' - other: '{{categoryName}} ({{count}})' - two: '{{categoryName}} ({{count}})' - zero: '{{categoryName}} ({{count}})' + zero: "{{categoryName}} ({{count}})" + one: "{{categoryName}} ({{count}})" + two: "{{categoryName}} ({{count}})" + few: "{{categoryName}} ({{count}})" + many: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "آخر الموضوعات ÙÙŠ قسم {{categoryName}}" top: title: "الأكثر Ù…ÙØ´Ø§Ù‡Ø¯Ø©" @@ -2506,38 +2475,38 @@ ar: print: 'ctrl+p طباعة الموضوع' badges: earned_n_times: - few: Ù…Ùنحت هذه الشارة %{count} مرة - many: Ù…Ùنحت هذه الشارة %{count} مرة - one: Ù…Ùنحت هذة الشارة مرة واحدة - other: Ù…Ùنحت هذه الشارة %{count} مرة - two: Ù…Ùنحت هذة الشارة مرتان - zero: لم تمنح هذه الشارة ابدا + zero: "لم تمنح هذه الشارة ابدا" + one: "Ù…Ùنحت هذة الشارة مرة واحدة" + two: "Ù…Ùنحت هذة الشارة مرتان" + few: "Ù…Ùنحت هذه الشارة %{count} مرة" + many: "Ù…Ùنحت هذه الشارة %{count} مرة" + other: "Ù…Ùنحت هذه الشارة %{count} مرة" granted_on: "ممنوح منذ %{date}" others_count: "عدد من حصل علي Ù†ÙØ³ الشارة (%{count})" title: الشارات allow_title: "يمكنك استخدام هذة الشارة كلقب" multiple_grant: "ÙŠÙمكن ان تÙمنح هذة الشارة اكثر من مرة" badge_count: - few: '%{count} شارة' - many: '%{count} شارة' - one: شارة واحدة - other: '%{count} شارة' - two: شارتان - zero: لا شارات + zero: "لا شارات" + one: "شارة واحدة" + two: "شارتان" + few: "%{count} شارة" + many: "%{count} شارة" + other: "%{count} شارة" more_badges: - few: +%{count} اكثر - many: +%{count} اكثر - one: شارة واحدة اكثر - other: +%{count} اكثر - two: شارتان اكثر - zero: بدون شارات + zero: "بدون شارات" + one: "شارة واحدة اكثر" + two: "شارتان اكثر" + few: "+%{count} اكثر" + many: "+%{count} اكثر" + other: "+%{count} اكثر" granted: - few: '%{count} ممنوح.' - many: '%{count} ممنوح.' - one: ممنوح واحد - other: '%{count} ممنوح.' - two: '%{count} ممنوح' - zero: لا يوجد ممنوحين + zero: "لا يوجد ممنوحين" + one: "ممنوح واحد" + two: "%{count} ممنوح" + few: "%{count} ممنوح." + many: "%{count} ممنوح." + other: "%{count} ممنوح." select_badge_for_title: اختر شارة لتستخدمها كلقب لك. badge_grouping: getting_started: @@ -2567,12 +2536,12 @@ ar: tags: "الأوسمة" delete_tag: "احذ٠الوسم" delete_confirm: - few: هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟ - many: هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟ - one: هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من موضوع واحد؟ - other: هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟ - two: هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟ - zero: هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟ + zero: "هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟" + one: "هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من موضوع واحد؟" + two: "هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟" + few: "هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟" + many: "هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟" + other: "هل أنت متاكد انك تريد حذ٠هذا الوسم Ùˆ إذالتة من {{count}} موضوع؟" delete_confirm_no_topics: "هل أنت متاكد انك تريد حذ٠هذا الوسم؟" rename_tag: "أعد تسمية الوسم" rename_instructions: "اختر اسما جديدا للوسم:" @@ -2822,12 +2791,12 @@ ar: events: none: "لا يوجد أحداث مماثلة" incoming: - few: هناك {{count}} أحداث جديدة. - many: هناك {{count}} حدثًا جديدًا. - one: هناك حدث واحد جديد. - other: هناك {{count}} حدث جديد. - two: هناك حدثان جديدان. - zero: لا أحداث جديدة. + zero: "لا أحداث جديدة." + one: "هناك حدث واحد جديد." + two: "هناك حدثان جديدان." + few: "هناك {{count}} أحداث جديدة." + many: "هناك {{count}} حدثًا جديدًا." + other: "هناك {{count}} حدث جديد." request: "طلب" response: "الرد" headers: "الرؤوس" @@ -2974,7 +2943,6 @@ ar: import_file_tip: "مل٠الـ .dcstyle.json يحتوي على واجهة" about_theme: "عن الواجهة" license: "الرخصة" - component_of: "الواجهة مكونة من:" update_to_latest: "حدث لاحدث اصدار" check_for_updates: "تحقق من التحديثات" updating: "تحديث..." @@ -3102,7 +3070,6 @@ ar: address_placeholder: "name@example.com" type_placeholder: "الخلاصة، إنشاء حساب..." reply_key_placeholder: "Ù…ÙØªØ§Ø­ الرد" - skipped_reason_placeholder: "السبب" moderation_history: actions: delete_user: "Ø­ÙØ°Ù المستخدم." @@ -3255,19 +3222,19 @@ ar: suspect: 'المريبون' approved: "مواÙقة؟" approved_selected: - few: ' واÙÙ‚ المستخدمين ({{count}})' - many: ' واÙÙ‚ المستخدمين ({{count}})' - one: واÙÙ‚ المستخدم - other: ' واÙÙ‚ المستخدمين ({{count}})' - two: ' واÙÙ‚ المستخدمين ({{count}})' - zero: واÙÙ‚ المستخدم + zero: "واÙÙ‚ المستخدم" + one: "واÙÙ‚ المستخدم" + two: " واÙÙ‚ المستخدمين ({{count}})" + few: " واÙÙ‚ المستخدمين ({{count}})" + many: " واÙÙ‚ المستخدمين ({{count}})" + other: " واÙÙ‚ المستخدمين ({{count}})" reject_selected: - few: Ø±ÙØ¶ المستخدمين ({{count}}) - many: Ø±ÙØ¶ المستخدمين ({{count}}) - one: Ø±ÙØ¶ المستخدم - other: Ø±ÙØ¶ المستخدمين ({{count}}) - two: Ø±ÙØ¶ المستخدمين ({{count}}) - zero: Ø±ÙØ¶ المستخدمين + zero: "Ø±ÙØ¶ المستخدمين" + one: "Ø±ÙØ¶ المستخدم" + two: "Ø±ÙØ¶ المستخدمين ({{count}})" + few: "Ø±ÙØ¶ المستخدمين ({{count}})" + many: "Ø±ÙØ¶ المستخدمين ({{count}})" + other: "Ø±ÙØ¶ المستخدمين ({{count}})" titles: active: 'الأعضاء النشطون' new: 'الأعضاء الجدد' @@ -3283,19 +3250,19 @@ ar: suspended: 'أعضاء موقوÙين' suspect: 'الأعضاء المريبون' reject_successful: - few: Ø±ÙØ¶ بنجاح %{count} عضو. - many: Ø±ÙØ¶ بنجاح %{count} عضو. - one: Ø±ÙØ¶ بنجاح 1 عضو - other: Ø±ÙØ¶ بنجاح %{count} عضو. - two: Ø±ÙØ¶ بنجاح %{count} عضو. - zero: Ø±ÙØ¶ بنجاح 1 عضو + zero: "Ø±ÙØ¶ بنجاح 1 عضو" + one: "Ø±ÙØ¶ بنجاح 1 عضو" + two: "Ø±ÙØ¶ بنجاح %{count} عضو." + few: "Ø±ÙØ¶ بنجاح %{count} عضو." + many: "Ø±ÙØ¶ بنجاح %{count} عضو." + other: "Ø±ÙØ¶ بنجاح %{count} عضو." reject_failures: - few: ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو. - many: ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو. - one: ÙØ´Ù„ Ù„Ø±ÙØ¶ 1 عضو. - other: ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو. - two: ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو. - zero: ÙØ´Ù„ Ù„Ø±ÙØ¶ 1 عضو. + zero: "ÙØ´Ù„ Ù„Ø±ÙØ¶ 1 عضو." + one: "ÙØ´Ù„ Ù„Ø±ÙØ¶ 1 عضو." + two: "ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو." + few: "ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو." + many: "ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو." + other: "ÙØ´Ù„ Ù„Ø±ÙØ¶ %{count} عضو." not_verified: "لم يتم التحقق" check_email: title: "اكش٠عنوان البريد الإلكتروني لهذا العضو" @@ -3363,38 +3330,26 @@ ar: delete_forbidden_because_staff: "لا يمكن حذ٠المدراء والمشرÙين." delete_posts_forbidden_because_staff: "لا يمكن حذ٠جميع المشاركات للمدراء والمشرÙين. " delete_forbidden: - few: لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من %{count} أيام لا يمكن حذÙها.) - many: لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من %{count} يوما لا يمكن حذÙها.) - one: لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من يوم واحد لا يمكن حذÙها.) - other: لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من %{count} يوم لا يمكن حذÙها.) - two: لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من يومين لا يمكن حذÙها.) - zero: لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الآن لا يمكن حذÙها.) + zero: "لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الآن لا يمكن حذÙها.)" + one: "لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من يوم واحد لا يمكن حذÙها.)" + two: "لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من يومين لا يمكن حذÙها.)" + few: "لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من %{count} أيام لا يمكن حذÙها.)" + many: "لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من %{count} يوما لا يمكن حذÙها.)" + other: "لا يمكن حذ٠مَن لديه مشاركات. احذ٠كل المشاركات أولا قبل حذ٠المستخدم. (المشاركات الأقدم من %{count} يوم لا يمكن حذÙها.)" cant_delete_all_posts: - few: لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من أيام قليلة. (The delete_user_max_post_age setting.) - many: لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من أيام %{count}. (The delete_user_max_post_age setting.) - one: لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من يوم. (The delete_user_max_post_age setting.) - other: لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من %{count} أيام. (The delete_user_max_post_age setting.) - two: لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من يومين. (The delete_user_max_post_age setting.) - zero: لا تستطيع حذ٠جميع المشاركات. (The delete_user_max_post_age setting.) + zero: "لا تستطيع حذ٠جميع المشاركات. (The delete_user_max_post_age setting.)" + one: "لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من يوم. (The delete_user_max_post_age setting.)" + two: "لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من يومين. (The delete_user_max_post_age setting.)" + few: "لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من أيام قليلة. (The delete_user_max_post_age setting.)" + many: "لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من أيام %{count}. (The delete_user_max_post_age setting.)" + other: "لا تستطيع حذ٠جميع المشاركات. بعض المشاركات أقدم من %{count} أيام. (The delete_user_max_post_age setting.)" cant_delete_all_too_many_posts: - few: 'لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركات. - - (delete_all_posts_max)' - many: 'لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة. - - (delete_all_posts_max)' - one: 'لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة. - - (delete_all_posts_max)' - other: 'لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة. - - (delete_all_posts_max)' - two: 'لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركتين. - - (delete_all_posts_max)' - zero: 'لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة. - - (delete_all_posts_max)' + zero: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة.\n(delete_all_posts_max)" + one: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة.\n(delete_all_posts_max)" + two: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركتين.\n(delete_all_posts_max)" + few: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركات.\n(delete_all_posts_max)" + many: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة.\n(delete_all_posts_max)" + other: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة.\n(delete_all_posts_max)" delete_confirm: "أمتأكّد من حذ٠هذا المستخدم؟ لا عودة ÙÙŠ هذا!" delete_and_block: "احذÙÙ‡ وامنع بريده وعنوان IP" delete_dont_block: "Ùقط احذÙÙ‡" @@ -3593,12 +3548,12 @@ ar: text: "هناك عينات ممنوحة ضائعة. حدث هذا عندما أعادت شارة الإستعلام user IDs أو post IDs التي لم تكن موجودة. هذا ربما بسبب نتيجة غير متوقعة ÙÙŠ وقت لاحق - رجائا أنقر مرتين للتأكد من إستعلامك-" no_grant_count: "لا توجد اوسمه لتمنح " grant_count: - few: %{count} أوسمة لتمنح . - many: %{count} وساما لتمنح . - one: وسام واحد ليتم منحه . - other: %{count} وساما لتمنح . - two: وسامين ليتم منحهما . - zero: %{count} وساما لتمنح . + zero: "%{count} وساما لتمنح ." + one: "وسام واحد ليتم منحه ." + two: "وسامين ليتم منحهما ." + few: "%{count} أوسمة لتمنح ." + many: "%{count} وساما لتمنح ." + other: "%{count} وساما لتمنح ." sample: "أمثلة:" grant: with: "%{username}" @@ -3643,7 +3598,7 @@ ar: topic_title: "موضوع" post_id: "رقم المشاركة" post_title: "مشاركة" - category_id: "رقم القسم" + category_id: "رقم التصنيÙ" category_title: "قسم" external_url: "رابط خارجي" delete_confirm: هل أنت متأكد من حذ٠هذا الرابط الثابت ØŸ @@ -3658,7 +3613,8 @@ ar: next: "التالي" step: "%{current} من %{total}" upload: "Ø±ÙØ¹" - uploading: "ÙŠØ±ÙØ¹..." + uploading: "جاري Ø§Ù„Ø±ÙØ¹..." + upload_error: "عذرا ØŒ حدث خطأ أثناء تحميل هذا الملÙ. حاول مرة اخرى." quit: "ربما لاحقا" invites: add_user: "أضÙ" @@ -3667,3 +3623,7 @@ ar: admin: "مدير" moderator: "مشرÙ" regular: "مستخدم عادي" + previews: + topic_title: "موضوع النقاش" + share_button: "شاركها" + reply_button: "رد" diff --git a/config/locales/client.bg.yml b/config/locales/client.bg.yml index 4b98759095..ae24af6497 100644 --- a/config/locales/client.bg.yml +++ b/config/locales/client.bg.yml @@ -43,62 +43,62 @@ bg: tiny: half_a_minute: "< 1 мин." less_than_x_seconds: - one: < 1Ñек - other: < %{count}Ñек + one: "< 1Ñек" + other: "< %{count}Ñек" x_seconds: - one: 1Ñек - other: '%{count}Ñек' + one: "1Ñек" + other: "%{count}Ñек" x_minutes: - one: 1мин - other: '%{count}мин' + one: "1мин" + other: "%{count}мин" about_x_hours: - one: 1ч - other: '%{count}ч' + one: "1ч" + other: "%{count}ч" x_days: - one: 1д - other: '%{count}д' + one: "1д" + other: "%{count}д" about_x_years: - one: 1г - other: '%{count}г' + one: "1г" + other: "%{count}г" over_x_years: - one: '> 1г' - other: '> %{count}г' + one: "> 1г" + other: "> %{count}г" almost_x_years: - one: 1г - other: '%{count}г' + one: "1г" + other: "%{count}г" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 минута - other: '%{count} минути' + one: "1 минута" + other: "%{count} минути" x_hours: - one: 1 Ñ‡Ð°Ñ - other: '%{count} чаÑа' + one: "1 чаÑ" + other: "%{count} чаÑа" x_days: - one: 1 ден - other: '%{count} дни' + one: "1 ден" + other: "%{count} дни" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: преди 1 минута - other: преди %{count} минути + one: "преди 1 минута" + other: "преди %{count} минути" x_hours: - one: преди 1 Ñ‡Ð°Ñ - other: преди %{count} чаÑа + one: "преди 1 чаÑ" + other: "преди %{count} чаÑа" x_days: - one: преди 1 ден - other: преди %{count} дни + one: "преди 1 ден" + other: "преди %{count} дни" later: x_days: - one: 1 ден по-къÑно - other: '%{count} дни по-къÑно' + one: "1 ден по-къÑно" + other: "%{count} дни по-къÑно" x_months: - one: 1 меÑец по-къÑно - other: '%{count} меÑеца по-къÑно' + one: "1 меÑец по-къÑно" + other: "%{count} меÑеца по-къÑно" x_years: - one: 1 година по-къÑно - other: '%{count} години по-къÑно' + one: "1 година по-къÑно" + other: "%{count} години по-къÑно" previous_month: 'Предишен меÑец' next_month: 'Следващ меÑец' placeholder: дата @@ -174,13 +174,13 @@ bg: show_help: "опции" links: "Връзки" links_lowercase: - one: Линк - other: Линкове + one: "Линк" + other: "Линкове" faq: "FAQ" guidelines: "ÐаÑоки" privacy_policy: "Ð”ÐµÐºÐ»Ð°Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð° поверителноÑÑ‚" privacy: "ПоверителноÑÑ‚" - terms_of_service: "Правила за ползване" + tos: "Правила за ползване" mobile_view: "Мобилен изглед" desktop_view: "ДеÑктоп изглед" you: "Вие" @@ -199,8 +199,8 @@ bg: max_of_count: "макÑимално от {{count}}" alternation: "или" character_count: - one: '{{count}} Ñимвол' - other: '{{count}} Ñимвола' + one: "{{count}} Ñимвол" + other: "{{count}} Ñимвола" suggested_topics: title: "Подобни теми" pm_title: "Предложени ÑъобщениÑ" @@ -268,16 +268,16 @@ bg: cancel: "Прекрати" view_pending: "Покажи предÑтоÑщите публикации" has_pending_posts: - one: Тази тема има 1 Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡Ð°ÐºÐ°Ñ‰Ð° одобрение - other: Тази тема има {{count}} публикации които чакат одобрение + one: "Тази тема има 1 Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡Ð°ÐºÐ°Ñ‰Ð° одобрение" + other: "Тази тема има {{count}} публикации които чакат одобрение" confirm: "Запази промените" delete_prompt: "Сигурни ли Ñте, че иÑкате да изтриете %{username}? Така ще бъдат изтрити вÑички поÑтове аÑоциирани Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¸ ще бъде блокиран email адреÑа и IP адреÑа му." approval: title: "ПубликациÑта изиÑква одобрение" description: "Ðие получихме вашата публикациÑ, но Ñ‚Ñ Ñ‚Ñ€Ñбва да бъде одобрена от модератора преди да бъде показана. МолÑ, проÑвете търпение." pending_posts: - one: Вие имате 1 чакаща Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: Вие имате {{count}} чакащи публикации + one: "Вие имате 1 чакаща публикациÑ" + other: "Вие имате {{count}} чакащи публикации" ok: "ОК" user_action: user_posted_topic: "{{user}} публикува тази тема" @@ -311,8 +311,8 @@ bg: posts_read: "Прочетени" posts_read_long: "Прочетени публикации" total_rows: - one: 1 потребител - other: '%{count} потребители' + one: "1 потребител" + other: "%{count} потребители" group_histories: actions: change_group_setting: "Промени наÑтройки" @@ -425,15 +425,12 @@ bg: "14": "Чакащи" categories: all: "вÑички категории" - all_subcategories: "вÑички %{categoryName}" no_subcategory: "без подкатегориÑ" category: "Категории" category_list: "Покажи ÑпиÑък Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸Ñ‚Ðµ" reorder: title: "Пренареди Категориите" title_long: "Реорганизирай ÑпиÑъка Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸Ñ‚Ðµ" - fix_order: "Коригирай Позициите" - fix_order_tooltip: "Ðе вÑички категории имат уникален номер на позициÑта, което може да доведе до неочаквани резултати." save: "Запази реда" apply_all: "Приложи" position: "ПозициÑ" @@ -444,11 +441,11 @@ bg: toggle_ordering: "включете контрол на подредбата" subcategories: "Подкатегории" topic_sentence: - one: 1 тема - other: '%{count} теми' + one: "1 тема" + other: "%{count} теми" topic_stat_sentence: - one: '%{count} нова тема в поÑледните %{unit}.' - other: '%{count} нови теми в поÑледните %{unit}.' + one: "%{count} нова тема в поÑледните %{unit}." + other: "%{count} нови теми в поÑледните %{unit}." ip_lookup: title: ТърÑене по IP Ð°Ð´Ñ€ÐµÑ hostname: ХоÑÑ‚ @@ -596,7 +593,6 @@ bg: error: "Имаше грешка при промÑна на тази ÑтойноÑÑ‚." change_username: title: "СмÑна на потребителÑкото име." - confirm: "Ðко Ñмените вашето потребителÑко име, вÑички предишни цитати и @име ÑÐ¿Ð¾Ð¼ÐµÐ½Ð°Ð²Ð°Ð½Ð¸Ñ Ñ‰Ðµ бъдат повредени . Сигурни ли Ñте, че иÑкате да продължите?" taken: "СъжалÑваме, това потребителÑко име е заето." invalid: "ПотребителÑкото име не е валидно. ТрÑбва да включва Ñамо цифри и букви" change_email: @@ -616,7 +612,6 @@ bg: upload_title: "Качете изображение" upload_picture: "Качи изображение" image_is_not_a_square: "Внимание: изрÑзахмеИзрÑзахме вашата Ñнимка,Ñнимка защото не е Ñ ÐºÐ²Ð°Ð´Ñ€Ð°Ñ‚Ð½Ð° форма." - cache_notice: "Вие уÑпешно Ñменихте Ñнимката на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð», но ще отнеме извеÑтно време докато Ñе актуализира." change_profile_background: title: "Фон на профила" instructions: "Фонът на профила ще бъде центриран и ще има ширина по подразбиране 850 пикÑела." @@ -631,8 +626,8 @@ bg: authenticated: "ВашиÑÑ‚ имейл беше потвърден от {{provider}}." frequency_immediately: "Ще ви изпратим мейл веднага, ако не Ñте прочели поÑта за който Ñме ви пиÑали." frequency: - one: Ðие ще ви изпратим имейл Ñамо ако не Ñме ви виждали през поÑледната минута. - other: Ðие ще ви изпратим имейл Ñамо ако не Ñме ви виждали през поÑледните {{count}} минути. + one: "Ðие ще ви изпратим имейл Ñамо ако не Ñме ви виждали през поÑледната минута." + other: "Ðие ще ви изпратим имейл Ñамо ако не Ñме ви виждали през поÑледните {{count}} минути." name: title: "Име" instructions: "вашето пълно име (опционално)" @@ -715,8 +710,8 @@ bg: user: "Поканени потребители" sent: "Изпрати" truncated: - one: Показване на първата покана. - other: Показване на пъврите {{count}} покани. + one: "Показване на първата покана." + other: "Показване на пъврите {{count}} покани." redeemed: "Взети покани" redeemed_tab: "Взети" redeemed_tab_with_count: "Взети ({{count}})" @@ -754,20 +749,20 @@ bg: stats: "СтатиÑтика" time_read: "Време за прочитане" topic_count: - one: Създадена тема - other: Създадени теми + one: "Създадена тема" + other: "Създадени теми" post_count: - one: Създадена Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: 'Създадени публикации ' + one: "Създадена публикациÑ" + other: "Създадени публикации " days_visited: - one: ПоÑетен ден - other: ПоÑетени дни + one: "ПоÑетен ден" + other: "ПоÑетени дни" posts_read: - one: Прочетена Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: 'Прочетени публикации ' + one: "Прочетена публикациÑ" + other: "Прочетени публикации " bookmark_count: - one: маркер - other: маркери + one: "маркер" + other: "маркери" top_replies: "Ðай-отговарÑни" no_replies: "Ð’Ñе още нÑма отговори." more_replies: "Още отговори" @@ -783,7 +778,6 @@ bg: most_liked_users: "Ðай-хареÑвани" most_replied_to_users: "По най-отговарÑни" no_likes: "Ð’Ñе още нÑма хареÑваниÑ." - associated_accounts: "ЛогваниÑ" ip_address: title: "ПоÑледен IP адреÑ." registration_ip_address: @@ -833,8 +827,8 @@ bg: too_few_posts_notice: "Ðека да започнем диÑкуÑиÑта Ñега! Ð’ момента има %{currentPosts} / %{requiredPosts} поÑтове. Ðовите поÑетители Ñе нуждаÑÑ‚ от теми за разговор, за да има на какво да четат и да отговарÑÑ‚." logs_error_rate_notice: rate: - one: 1 грешка/%{duration} - other: '%{count} грешки/%{duration}' + one: "1 грешка/%{duration}" + other: "%{count} грешки/%{duration}" learn_more: "научете повече..." all_time: 'общо' all_time_desc: 'общо Ñъздадени теми' @@ -857,8 +851,6 @@ bg: hide_session: "Ðапомни ми утре" hide_forever: "не благодарÑ" hidden_for_session: "Добре, Ще ви питам отново утре. През това време можете да използвате бутона \"Влизане\" или да Ñи Ñъздадете нов потребител." - intro: "Здравей здравей! :heart_eyes: Изглежда че ти е хареÑала диÑкуÑиÑта тук, но вÑе още не Ñи Ñе региÑтрирал като потребител." - value_prop: "Когато Ñи Ñъздадете акаунт, ние ще запомним това което Ñте чели, така че винаги можете да Ñе върнете където Ñте Ñпрели. Можете Ñъщо така да получавате извеÑтиÑ, тук и по електронната поща, когато има нови мнениÑ. Вие може да хареÑвате поÑтовете и да ги ÑподелÑте Ñ Ð»ÑŽÐ±Ð¾Ð². :heartbeat:" summary: enabled_description: "Ð’ момента гледате резюме на тази тема: най-интереÑните публикации определени от общноÑтта." description: "Има {{replyCount}} отговора." @@ -872,7 +864,6 @@ bg: disable: "Покажи изтритите публикации" private_message_info: title: "Съобщение" - invite: "Поканете други..." remove_allowed_user: "Сигурни ли Ñте, че иÑкате да премахнете {{name}} от това Ñъобщение?" remove_allowed_group: "Сигурни ли Ñте, че иÑкате да премахнете {{name}} от това Ñъобщение?" email: 'Имейл' @@ -921,9 +912,6 @@ bg: to_continue: "ÐœÐ¾Ð»Ñ Ð²Ð»ÐµÐ·Ñ‚Ðµ" preferences: "ТрÑбва да Ñте влезли, за да можете да променÑте потребителÑките Ñи наÑтройки." forgot: "Ðе Ñи ÑпомнÑм подробноÑти за профила ми" - google: - title: "Ñ Google" - message: "УдоÑтоверÑване Ñ Google (проверете за блокирани на поп-ъп прозорци) " google_oauth2: title: "Ñ Google" message: "УдоÑтоверÑване Ñ Google (проверете за блокирани на поп-ъп прозорци)" @@ -1129,8 +1117,8 @@ bg: notification_level: "ИзвеÑтиÑ" choose_new_category: "Избери нова ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·Ð° тези теми:" selected: - one: Вие Ñте избрали 1 тема. - other: Вие Ñте избрали {{count}} теми. + one: "Вие Ñте избрали 1 тема." + other: "Вие Ñте избрали {{count}} теми." change_tags: "Замени етикетите" append_tags: "Добави етикетите" choose_new_tags: "Избери нови етикети за тези теми:" @@ -1178,10 +1166,10 @@ bg: new: 'нова тема' unread: 'непрочетено' new_topics: - one: 1 нова тема + one: '1 нова тема' other: '{{count}} нови теми' unread_topics: - one: 1 непрочетена тема + one: '1 непрочетена тема' other: '{{count}} непрочетени теми' title: 'Тема' invalid_access: @@ -1195,17 +1183,17 @@ bg: title: "Темата не е намерена" description: "Темата не може да бъде открита. Възможно ли е да е премахната от модератор?" total_unread_posts: - one: имате 1 непрочетено мнение в тази тема - other: ' Вие имате {{count}} непрочетени Ð¼Ð½ÐµÐ½Ð¸Ñ Ð² тази тема' + one: "имате 1 непрочетено мнение в тази тема" + other: " Вие имате {{count}} непрочетени Ð¼Ð½ÐµÐ½Ð¸Ñ Ð² тази тема" unread_posts: - one: Вие имате 1 непрочетено Ñтаро мнение в тази тема - other: Вие имате {{count}} непрочетени Ñтари Ð¼Ð½ÐµÐ½Ð¸Ñ Ð² тази тема + one: "Вие имате 1 непрочетено Ñтаро мнение в тази тема" + other: "Вие имате {{count}} непрочетени Ñтари Ð¼Ð½ÐµÐ½Ð¸Ñ Ð² тази тема" new_posts: - one: има 1 нова Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² темата от поÑледното Ви поÑещение на темата - other: от поÑледното Ви поÑещение в темата до Ñега има {{count}} нови публикации + one: "има 1 нова Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² темата от поÑледното Ви поÑещение на темата" + other: "от поÑледното Ви поÑещение в темата до Ñега има {{count}} нови публикации" likes: - one: има 1 хареÑване в тази тема - other: има {{count}} хареÑÐ²Ð°Ð½Ð¸Ñ Ð² тази тема + one: "има 1 хареÑване в тази тема" + other: "има {{count}} хареÑÐ²Ð°Ð½Ð¸Ñ Ð² тази тема" back_to_list: "Ðазад към СпиÑъка Ñ Ñ‚ÐµÐ¼Ð¸" options: "ÐаÑтройки на темата" show_links: "покажи връзките в тази тема" @@ -1321,8 +1309,8 @@ bg: pin_validation: "Ðеобходимо е да Ñе избере дата, за да може да Ñе закачи темата." not_pinned: "ÐÑма закачени теми в {{categoryLink}}." already_pinned: - one: 'Темата е закачена в {{categoryLink}}: е 1' - other: 'Темите закачени в {{categoryLink}}: Ñа {{count}}' + one: "Темата е закачена в {{categoryLink}}: е 1" + other: "Темите закачени в {{categoryLink}}: Ñа {{count}}" pin_globally: "Тази тема да Ñе поÑвÑва в горната чаÑÑ‚ на вÑички ÑпиÑъци докато" confirm_pin_globally: "Вие вече имате {{count}} глобално заковани теми. Прекалено много заковани теми може да объркат новите и анонимни потребители. Сигурни ли Ñте че иÑкате да заковете още една тема глобално към тази ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ?" unpin_globally: "Премахни тази тема от началото на ÑпиÑъците Ñ Ñ‚ÐµÐ¼Ð¸." @@ -1330,8 +1318,8 @@ bg: global_pin_note: "Потребителите могат да отговат темата индивидуално Ñамо за Ñ‚ÑÑ…." not_pinned_globally: "ÐÑма никакви закачени теми." already_pinned_globally: - one: 'Темата закачена глобално е: 1' - other: 'Темите закачени глобално: {{count}}' + one: "Темата закачена глобално е: 1" + other: "Темите закачени глобално: {{count}}" make_banner: "Ðаправете тази тема на банер който ще приÑÑŠÑтва в началото на вÑички Ñтраници" remove_banner: "Премахнете този банер който Ñе поÑвÑва в началото на вÑички Ñтраници" banner_note: "Потребителите могат да откажат банера като го затворÑÑ‚. Само една тема може да бъде банер в едно и Ñъщо време." @@ -1365,8 +1353,8 @@ bg: login_reply: 'Влезте, за да отговорите ' filters: n_posts: - one: 1 Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: '{{count}} публикации' + one: "1 публикациÑ" + other: "{{count}} публикации" cancel: "Премахни филтъра" split_topic: title: "ПремеÑти в нова тема" @@ -1374,15 +1362,15 @@ bg: topic_name: "Име на новата тема" error: "Възникна грешка при премеÑтването на публикациÑта в нова тема." instructions: - one: Ðа път Ñте да Ñъздадете нова тема и да Ñ Ð·Ð°Ð¿ÑŠÐ»Ð½Ð¸Ñ‚Ðµ Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñта коÑто избрахте. - other: Ðа път Ñте да Ñъздадете нова тема и да Ñ Ð·Ð°Ð¿ÑŠÐ»Ð½Ð¸Ñ‚Ðµ Ñ {{count}} избрани публикации. + one: "Ðа път Ñте да Ñъздадете нова тема и да Ñ Ð·Ð°Ð¿ÑŠÐ»Ð½Ð¸Ñ‚Ðµ Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñта коÑто избрахте." + other: "Ðа път Ñте да Ñъздадете нова тема и да Ñ Ð·Ð°Ð¿ÑŠÐ»Ð½Ð¸Ñ‚Ðµ Ñ {{count}} избрани публикации." merge_topic: title: "ПремеÑтете в ÑъщеÑтвуваща тема." action: "премеÑтете в ÑъщеÑтвуваща тема." error: "Възникна грешка при премеÑтване Ð¼Ð½ÐµÐ½Ð¸Ñ Ð² тази тема." instructions: - one: 'ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ тема в коÑто иÑкате да премеÑтите тази публикациÑ. ' - other: 'МолÑ, изберете тема, в коÑто иÑкате да премеÑтите тези {{count}} публикации. ' + one: "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ тема в коÑто иÑкате да премеÑтите тази публикациÑ. " + other: "МолÑ, изберете тема, в коÑто иÑкате да премеÑтите тези {{count}} публикации. " change_owner: title: "Смени ÑобÑтвеника на публикациÑта." action: "Ñмени ÑобÑтвеника" @@ -1390,8 +1378,8 @@ bg: label: "Ðов ÑобÑтвеник на публикациите" placeholder: "име на Ð½Ð¾Ð²Ð¸Ñ ÑобÑтвеник" instructions: - one: ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ нов ÑобÑтвеник на публикациÑта от {{old_user}}. - other: 'МолÑ, изберете новиÑÑ‚ ÑобÑтвеник на {{count}} публикации от {{old_user}}. ' + one: "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ нов ÑобÑтвеник на публикациÑта от {{old_user}}." + other: "МолÑ, изберете новиÑÑ‚ ÑобÑтвеник на {{count}} публикации от {{old_user}}. " instructions_warn: "Имайте предвид, че извеÑтиÑта към тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ñма да бъдат прехвърлени ÑÑŠÑ Ð·Ð°Ð´Ð½Ð° дата към Ð½Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»." change_timestamp: action: "Ñмени Ð²Ñ€ÐµÐ¼ÐµÐ²Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚ÐµÐ»" @@ -1407,7 +1395,7 @@ bg: deselect_all: "премахване на вÑички " description: one: Вие избрахте 1 публикациÑ. - other: 'Вие избрахте {{count}} публикации. ' + other: "Вие избрахте {{count}} публикации. " post: edit_reason: "Причина: " post_number: "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ {{number}} " @@ -1418,26 +1406,26 @@ bg: show_full: "Покажи цÑлата публикациÑ" show_hidden: 'Виж Ñкритото Ñъдържание.' deleted_by_author: - one: (Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ³Ð»ÐµÐ½Ð° от автора, ще бъде автоматично изтрита Ñлед %{count} чаÑ, оÑвен, ако не бъде Ñигнализирана) - other: '(Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ³Ð»ÐµÐ½Ð° от автора, ще бъде автоматично изтрита Ñлед %{count} чаÑа, оÑвен, ако не бъде Ñигнализирана) ' + one: "(Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ³Ð»ÐµÐ½Ð° от автора, ще бъде автоматично изтрита Ñлед %{count} чаÑ, оÑвен, ако не бъде Ñигнализирана)" + other: "(Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ³Ð»ÐµÐ½Ð° от автора, ще бъде автоматично изтрита Ñлед %{count} чаÑа, оÑвен, ако не бъде Ñигнализирана) " expand_collapse: "разшири/намали " gap: - one: покажи 1 Ñкрит отговор - other: покажи {{count}} Ñкрити отговора + one: "покажи 1 Ñкрит отговор" + other: "покажи {{count}} Ñкрити отговора" unread: "ПубликациÑта е непрочетена" has_replies: - one: '{{count}} Отговор' - other: '{{count}} Отговори' + one: "{{count}} Отговор" + other: "{{count}} Отговори" has_likes: - one: '{{count}} ХареÑване' - other: '{{count}} ХареÑваниÑ' + one: "{{count}} ХареÑване" + other: "{{count}} ХареÑваниÑ" has_likes_title: - one: 1 човек хареÑва тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: '{{count}} човека хареÑват тази публикациÑ' + one: "1 човек хареÑва тази публикациÑ" + other: "{{count}} човека хареÑват тази публикациÑ" has_likes_title_only_you: "вие хареÑахте този поÑÑ‚" has_likes_title_you: - one: вие и още 1 човек Ñте хареÑали този поÑÑ‚ - other: вие и {{count}} човека Ñте хареÑали този поÑÑ‚ + one: "вие и още 1 човек Ñте хареÑали този поÑÑ‚" + other: "вие и {{count}} човека Ñте хареÑали този поÑÑ‚" errors: create: "При Ñъздаването на Вашата Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñе получи грешка. МолÑ, опитайте отново." edit: "СъжалÑваме, възникна грешка при редактирането на публикациÑта. МолÑ, опитайте отново. " @@ -1483,7 +1471,6 @@ bg: inappropriate: "Отмени Ñигнала" bookmark: "Отмени отметката" like: "Отмен хареÑването " - vote: "Отмени глаÑуването " people: off_topic: "отбелÑзан като оф-топик" spam: "отбелÑзан като Ñпам" @@ -1492,7 +1479,6 @@ bg: notify_user: "изпрати Ñъобщение" bookmark: "маркирай това" like: "хареÑа това" - vote: "глаÑува за това" by_you: off_topic: "Маркирахте това като извън темата" spam: "Маркирахте това като Ñпам" @@ -1501,57 +1487,50 @@ bg: notify_user: "Изпратихте лично Ñъобщение на този потребител" bookmark: "Сложихте тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² Отметки" like: "Вие хареÑахте това" - vote: "ГлаÑувахте за тази публикациÑ" by_you_and_others: off_topic: - one: Вие и още 1 човек маркирахте това извън темата - other: Вие и още {{count}} човека маркирахте това извън темата + one: "Вие и още 1 човек маркирахте това извън темата" + other: "Вие и още {{count}} човека маркирахте това извън темата" spam: - one: Вие и още 1 човек маркирахте това като Ñпам - other: Вие и още {{count}} човека маркирахте това като Ñпам + one: "Вие и още 1 човек маркирахте това като Ñпам" + other: "Вие и още {{count}} човека маркирахте това като Ñпам" inappropriate: - one: Вие и още 1 човек маркирахте това като неприлично - other: Вие и още {{count}} човека маркирахте това като неприлично + one: "Вие и още 1 човек маркирахте това като неприлично" + other: "Вие и още {{count}} човека маркирахте това като неприлично" notify_moderators: - one: Вие и още 1 човек маркирахте това за Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ - other: Вие и още {{count}} човека маркирахте това за Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ + one: "Вие и още 1 човек маркирахте това за модерациÑ" + other: "Вие и още {{count}} човека маркирахте това за модерациÑ" notify_user: - one: Вие и още 1 човек изпратихте лично Ñъобщение на този потребител - other: Вие и още {{count}} човека изпратихте лично Ñъобщение на този потребител + one: "Вие и още 1 човек изпратихте лично Ñъобщение на този потребител" + other: "Вие и още {{count}} човека изпратихте лично Ñъобщение на този потребител" bookmark: - one: Вие и още 1 човек Ñложихте тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ¸ - other: Вие и още {{count}} човека Ñложихте тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² Отметки + one: "Вие и още 1 човек Ñложихте тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ¸" + other: "Вие и още {{count}} човека Ñложихте тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² Отметки" like: - one: Вие и още 1 човек хареÑвате това - other: Вие и още {{count}} човека хареÑахте това - vote: - one: Вие и още 1 човек глаÑувахте за тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: Вие и още {{count}} човека глаÑувахте за тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ + one: "Вие и още 1 човек хареÑвате това" + other: "Вие и още {{count}} човека хареÑахте това" by_others: off_topic: - one: 1 човек маркира това като извън темата - other: '{{count}} човека маркираха това като извън темата' + one: "1 човек маркира това като извън темата" + other: "{{count}} човека маркираха това като извън темата" spam: - one: 1 човек маркира това като Ñпам - other: '{{count}} човека маркираха това като Ñпам' + one: "1 човек маркира това като Ñпам" + other: "{{count}} човека маркираха това като Ñпам" inappropriate: - one: 1 човек маркира това като неприлично - other: '{{count}} човека маркираха това като неприлично' + one: "1 човек маркира това като неприлично" + other: "{{count}} човека маркираха това като неприлично" notify_moderators: - one: 1 човек маркира това за Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ - other: '{{count}} човека маркираха това за модерациÑ' + one: "1 човек маркира това за модерациÑ" + other: "{{count}} човека маркираха това за модерациÑ" notify_user: - one: 1 човек изпрати Ñъобщение на този потребител - other: '{{count}} човека изпратиха лично Ñъобщение на този потребител' + one: "1 човек изпрати Ñъобщение на този потребител" + other: "{{count}} човека изпратиха лично Ñъобщение на този потребител" bookmark: - one: 1 човек Ñложи този Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² отметки - other: '{{count}} човека Ñложиха този Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² отметки' + one: "1 човек Ñложи този Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² отметки" + other: "{{count}} човека Ñложиха този Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² отметки" like: - one: 1 човек хареÑва тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: '{{count}} човека хареÑват тази публикациÑ' - vote: - one: 1 човек глаÑува за тази Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: '{{count}} човека глаÑуваха за тази публикациÑ' + one: "1 човек хареÑва тази публикациÑ" + other: "{{count}} човека хареÑват тази публикациÑ" revisions: controls: first: "Първа ревизиÑ" @@ -1573,7 +1552,6 @@ bg: can: 'can…' none: '(без категориÑ)' all: 'Ð’Ñички категории' - choose: 'Изберете категорих ' edit: 'Ñ€ÐµÐ´ÐºÐ°Ñ†Ð¸Ñ ' edit_long: "РедакциÑ" view: 'Покажи темите в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ' @@ -1619,7 +1597,6 @@ bg: edit_permissions: "Ð ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð½Ð° доÑтъпа" add_permission: "Добави позволение " this_year: "тази година " - position: "Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ " default_position: "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿Ð¾ подразбиране " position_disabled: "КатегориÑта ще Ñе показва в ред на активноÑÑ‚. За да контролирате реда на категориите в ÑпиÑъците, " position_disabled_click: 'Разреши "fixed category positions" наÑтройка ' @@ -1684,8 +1661,8 @@ bg: links_title: "ПопулÑрни връзки" links_shown: "покажи повече адреÑи..." clicks: - one: 1 кликване - other: '%{count} кликваниÑ' + one: "1 кликване" + other: "%{count} кликваниÑ" topic_statuses: warning: help: "Това е официално предупреждение." @@ -1719,19 +1696,19 @@ bg: original_post: "Оригинална публикациÑ" views: "Прегледи" views_lowercase: - one: преглед - other: прегледи + one: "преглед" + other: "прегледи" replies: "Отговори" activity: "ÐктивноÑÑ‚" likes: "ХареÑваниÑ" likes_lowercase: - one: хареÑване - other: хареÑÐ²Ð°Ð½Ð¸Ñ + one: "хареÑване" + other: "хареÑваниÑ" likes_long: "има {{number}} хареÑÐ²Ð°Ð½Ð¸Ñ Ð² тази тема" users: "Потребители" users_lowercase: - one: потребител - other: потребители + one: "потребител" + other: "потребители" category_title: "КатегориÑ" history: "ИÑториÑ" changed_by: "от {{author}}" @@ -1745,8 +1722,8 @@ bg: latest: title: "ПоÑледни" title_with_count: - one: ПоÑледен (1) - other: ПоÑледни ({{count}}) + one: "ПоÑледен (1)" + other: "ПоÑледни ({{count}})" help: "теми ÑÑŠÑ Ñкорошни публикации" hot: title: "Горещи" @@ -1764,21 +1741,21 @@ bg: unread: title: "Ðепрочетени" title_with_count: - one: Ðепрочетен (1) - other: Ðепрочетени ({{count}}) + one: "Ðепрочетен (1)" + other: "Ðепрочетени ({{count}})" help: "теми които гледате или Ñледите, Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÐ½Ð¸ публикации" lower_title_with_count: - one: 1 непрочетен - other: '{{count}} непрочетени' + one: "1 непрочетен" + other: "{{count}} непрочетени" new: lower_title_with_count: - one: 1 нов - other: '{{count}} нови' + one: "1 нов" + other: "{{count}} нови" lower_title: "нови" title: "Ðов" title_with_count: - one: Ðов (1) - other: Ðови ({{count}}) + one: "Ðов (1)" + other: "Ðови ({{count}})" help: "теми Ñъздадени през поÑледните нÑколко дни" posted: title: "Моите публикации" @@ -1789,8 +1766,8 @@ bg: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "поÑледни теми в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ {{categoryName}}" top: title: "Топ" @@ -2232,7 +2209,6 @@ bg: address_placeholder: "name@example.com" type_placeholder: "дайджеÑÑ‚, региÑтрациÑ" reply_key_placeholder: "reply key " - skipped_reason_placeholder: "причина" logs: title: "Логове" action: "ДейÑтвиÑ" @@ -2381,11 +2357,11 @@ bg: suspect: 'Съмнителен ' approved: "Одобрен?" approved_selected: - one: одобрен потребител - other: одобрени потребители ({{count}}) + one: "одобрен потребител" + other: "одобрени потребители ({{count}})" reject_selected: - one: отхвърлен потребител - other: отхвърлени потребители ({{count}}) + one: "отхвърлен потребител" + other: "отхвърлени потребители ({{count}})" titles: active: 'Ðктивни потребители' new: 'Ðови потребители' @@ -2401,11 +2377,11 @@ bg: suspended: 'ОтÑтранени' suspect: 'Съмнителни потребители ' reject_successful: - one: Отхвърлите 1 потребител. - other: УÑпешно отхвърлите %{count} потребителÑ. + one: "Отхвърлите 1 потребител." + other: "УÑпешно отхвърлите %{count} потребителÑ." reject_failures: - one: Ðе уÑпÑхте да отхвърлите 1 потребител. - other: Ðе уÑпÑхте да отхвърлите %{count} юзъра + one: "Ðе уÑпÑхте да отхвърлите 1 потребител." + other: "Ðе уÑпÑхте да отхвърлите %{count} юзъра" not_verified: "Ðепроверен " check_email: title: "Разкрий имейла на този потребител" @@ -2462,14 +2438,14 @@ bg: delete_forbidden_because_staff: "Ðдмините и модераторите не могат да бъдат изтрити." delete_posts_forbidden_because_staff: "Ðе могат да бъдат изтрити вÑички поÑтове на админиÑтратори и модератори." delete_forbidden: - one: Ðе може да изтривате потребители които имат публикации. Първо изтрийте вÑички публикации на този потребител и опитайте отново. (Публикации по Ñтари от %{count} ден не може да бъдат изтривани) - other: 'Ðе може да изтривате потребители, които имат публикации. Първо изтрийте вÑички публикации на този потребител и опитайте отново. (Публикации по Ñтари от %{count} дни не могат да бъдат изтрити.) ' + one: "Ðе може да изтривате потребители които имат публикации. Първо изтрийте вÑички публикации на този потребител и опитайте отново. (Публикации по Ñтари от %{count} ден не може да бъдат изтривани)" + other: "Ðе може да изтривате потребители, които имат публикации. Първо изтрийте вÑички публикации на този потребител и опитайте отново. (Публикации по Ñтари от %{count} дни не могат да бъдат изтрити.) " cant_delete_all_posts: - one: Ðе може да изтриете вÑички публикации. ÐÑкои публикации Ñа по Ñтари от %{count} ден. (delete_user_max_post_age наÑтройката) - other: 'Ðе може да изтриете вÑички публикации. ÐÑкои публикации Ñа по Ñтари от %{count} дни. (delete_user_max_post_age наÑтройката) ' + one: "Ðе може да изтриете вÑички публикации. ÐÑкои публикации Ñа по Ñтари от %{count} ден. (delete_user_max_post_age наÑтройката)" + other: "Ðе може да изтриете вÑички публикации. ÐÑкои публикации Ñа по Ñтари от %{count} дни. (delete_user_max_post_age наÑтройката) " cant_delete_all_too_many_posts: - one: Ðе може да изтриете вÑички публикации защото този потребител има 1 публикациÑ. (delete_all_posts_max) - other: 'Ðе може да изтриете вÑички публикации, защото този потребител има повече от %{count} публикации.(delete_all_posts_max) ' + one: "Ðе може да изтриете вÑички публикации защото този потребител има 1 публикациÑ. (delete_all_posts_max)" + other: "Ðе може да изтриете вÑички публикации, защото този потребител има повече от %{count} публикации.(delete_all_posts_max) " delete_confirm: "Сигурни ли Ñте, че иÑкате да изтриете този потребител. Това е необратимо!" delete_and_block: "Изтрийте и блокирайте този имейл и IP Ð°Ð´Ñ€ÐµÑ " delete_dont_block: "Изтрий Ñамо " @@ -2661,8 +2637,8 @@ bg: text: "Открити Ñа примери за неÑъщеÑтвуващи награди. Това може да Ñе Ñлучи когато заÑвката за бадж Ñе връща при неÑъщеÑтвуващо потребителÑко име или Ñъобщение. Това може да доведе до неочаквани резултати - Ð¼Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ вашата заÑвка отново." no_grant_count: "ÐÑма значки за закачане." grant_count: - one: 1 значка за закачане. - other: %{count} значки за закачане. + one: "1 значка за закачане." + other: "%{count} значки за закачане." sample: "Образец: " grant: with: "%{username} " diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index 210666c0d7..85c8c1e257 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -16,8 +16,8 @@ bs_BA: format: '%n %u' units: byte: - few: Bajta one: Bajt + few: Bajta other: Bajta gb: GB kb: KB @@ -44,87 +44,87 @@ bs_BA: tiny: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count} sekundi - one: < 1 sekunda - other: < %{count} sekundi + one: "< 1 sekunda" + few: "< %{count} sekundi" + other: "< %{count} sekundi" x_seconds: - few: '%{count} sekundi' - one: 1 sekunda - other: '%{count} sekundi' + one: "1 sekunda" + few: "%{count} sekundi" + other: "%{count} sekundi" less_than_x_minutes: - few: < %{count}minute - one: < 1minute - other: < %{count}minuta + one: "< 1minute" + few: "< %{count}minute" + other: "< %{count}minuta" x_minutes: - few: minuta - one: minutu - other: '%{count} minuta' + one: "minutu" + few: "minuta" + other: "%{count} minuta" about_x_hours: - few: '%{count}sata' - one: 1 sat - other: '%{count}sati' + one: "1 sat" + few: "%{count}sata" + other: "%{count}sati" x_days: - few: '%{count}dana' - one: 1 dan - other: '%{count}dana' + one: "1 dan" + few: "%{count}dana" + other: "%{count}dana" x_months: - few: '%{count}mjeseca' - one: 1 mjesec - other: '%{count}mjeseci' + one: "1 mjesec" + few: "%{count}mjeseca" + other: "%{count}mjeseci" about_x_years: - few: '%{count}godine' - one: 1 godina - other: '%{count}godina' + one: "1 godina" + few: "%{count}godine" + other: "%{count}godina" over_x_years: - few: '> %{count}godine' - one: '> 1 godinu' - other: '> %{count}godina' + one: "> 1 godinu" + few: "> %{count}godine" + other: "> %{count}godina" almost_x_years: - few: '%{count}godine' - one: 1 godina - other: '%{count}godina' + one: "1 godina" + few: "%{count}godine" + other: "%{count}godina" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - few: Par minuta - one: 1 minuta - other: '%{count} minuta' + one: "1 minuta" + few: "Par minuta" + other: "%{count} minuta" x_hours: - few: Par sahati - one: 1 sahat - other: '%{count} sati' + one: "1 sahat" + few: "Par sahati" + other: "%{count} sati" x_days: - few: Par dana - one: 1 dan - other: '%{count} dana' + one: "1 dan" + few: "Par dana" + other: "%{count} dana" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - few: Prije par minuta - one: Prije 1 minutu - other: '%{count} minuta prije' + one: "Prije 1 minutu" + few: "Prije par minuta" + other: "%{count} minuta prije" x_hours: - few: Prije par sahati - one: 'Prije 1 sahat ' - other: '%{count} sati prije' + one: "Prije 1 sahat " + few: "Prije par sahati" + other: "%{count} sati prije" x_days: - few: 'Prije par dana ' - one: 'prije 1 dan ' - other: '%{count} dana prije' + one: "prije 1 dan " + few: "Prije par dana " + other: "%{count} dana prije" later: x_days: - few: Prije par dana - one: Prije 1 dan - other: '%{count} dana prije' + one: "Prije 1 dan" + few: "Prije par dana" + other: "%{count} dana prije" x_months: - few: Prije par mjeseci - one: Prije 1 mjesec - other: prije %{count} mjeseci + one: "Prije 1 mjesec" + few: "Prije par mjeseci" + other: "prije %{count} mjeseci" x_years: - few: Prije par godina - one: Prije 1 godinu - other: prije %{count} godine/a + one: "Prije 1 godinu" + few: "Prije par godina" + other: "prije %{count} godine/a" previous_month: 'ProÅ¡li mjesec' next_month: 'Sljedeći mjesec' placeholder: datum @@ -207,14 +207,14 @@ bs_BA: show_help: "opcije" links: "Linkovi" links_lowercase: - few: Link - one: Link - other: linkovi + one: "Link" + few: "Link" + other: "linkovi" faq: "ÄŒesta pitanja" guidelines: "Smjernice" privacy_policy: "Izjava o privatnosti" privacy: "Privatnost" - terms_of_service: "Uslovi koriÅ¡tenja" + tos: "Uslovi koriÅ¡tenja" mobile_view: "Mobilni zaslon" desktop_view: "Standardni zaslon" you: "Vi" @@ -233,9 +233,9 @@ bs_BA: max_of_count: "maksimalno {{count}}" alternation: "ili" character_count: - few: '{{count}} karaktera' - one: '{{count}} karakter' - other: '{{count}} karaktera' + one: "{{count}} karakter" + few: "{{count}} karaktera" + other: "{{count}} karaktera" suggested_topics: title: "PreporuÄene teme" pm_title: "PreporuÄene Poruke" @@ -270,17 +270,17 @@ bs_BA: remove: "Ukloni zabiljeÅ¡ku" confirm_clear: "Jeste li sigurni da želite oÄistiti sve zabiljeÅ¡ke iz ove kategorije?" topic_count_latest: - few: Pogledaj {{count}} nove ili ažurirane teme - one: Pogledaj {{count}} novu ili ažuriranu temu - other: Pogledaj {{count}} nove ili ažurirane tema + one: "Pogledaj {{count}} novu ili ažuriranu temu" + few: "Pogledaj {{count}} nove ili ažurirane teme" + other: "Pogledaj {{count}} nove ili ažurirane tema" topic_count_unread: - few: Pogledaj {{count}} neproÄitane teme - one: Pogledaj {{count}} neproÄitanu temu - other: Pogledaj {{count}} neproÄitanih tema + one: "Pogledaj {{count}} neproÄitanu temu" + few: "Pogledaj {{count}} neproÄitane teme" + other: "Pogledaj {{count}} neproÄitanih tema" topic_count_new: - few: Pogledaj {{count}} nove teme - one: Pogledaj {{count}} novu temu - other: Pogledaj {{count}} novih tema + one: "Pogledaj {{count}} novu temu" + few: "Pogledaj {{count}} nove teme" + other: "Pogledaj {{count}} novih tema" preview: "pregledaj" cancel: "otkaži" save: "Spremiti promjene" @@ -318,18 +318,18 @@ bs_BA: cancel: "Odustani" view_pending: "Vidi postove na Äekanju" has_pending_posts: - few: Ova tema ima {{count}} postova koji Äekaju odobrenje - one: Ova tema ima 1 post koji Äeka odobrenje - other: Ova tema ima {{count}} postova koji Äekaju odobrenje + one: "Ova tema ima 1 post koji Äeka odobrenje" + few: "Ova tema ima {{count}} postova koji Äekaju odobrenje" + other: "Ova tema ima {{count}} postova koji Äekaju odobrenje" confirm: "SaÄuvaj promjene" delete_prompt: "Da li ste sigurni da želite da izbriÅ¡ete %{username} nalog? Ovo će ukloniti svaku objavu tog naloga, te blokirati korisnikovu email adresu kao i njegov IP." approval: title: "Post treba odobrenje" description: "Primili smo VaÅ¡ novi post ali on treba biti odobren od strane moderatora prije nego bude javno dostupan. Molimo za strpljenje." pending_posts: - few: Imate {{count}} postova na Äekanju. - one: Imate 1 post na Äekanju. - other: Imate {{count}} postova na Äekanju. + one: "Imate 1 post na Äekanju." + few: "Imate {{count}} postova na Äekanju." + other: "Imate {{count}} postova na Äekanju." ok: "OK" user_action: user_posted_topic: "{{user}} je objavio/la temu" @@ -363,9 +363,9 @@ bs_BA: posts_read: "ÄŒitaj" posts_read_long: "ProÄitano postova" total_rows: - few: '%{count} korisnika' - one: '%{count} korisnik' - other: '%{count} korisnika' + one: "%{count} korisnik" + few: "%{count} korisnika" + other: "%{count} korisnika" group_histories: actions: change_group_setting: "Promjeni grupne postavke" @@ -450,9 +450,9 @@ bs_BA: is_group_user: "ÄŒlan" is_group_owner: "Vlasnik" title: - few: Grupe - one: Grupa - other: Grupa + one: "Grupa" + few: "Grupe" + other: "Grupa" activity: "Aktivnost" members: title: "ÄŒlanovi" @@ -524,8 +524,6 @@ bs_BA: reorder: title: "Preuredi kategorije" title_long: "Reorganizuj listu kategorija" - fix_order: "Fixirane Pozicije" - fix_order_tooltip: "Nemaju sve kategorije poziciju, Å¡to može da dovede do nepredvidljivih rezultata." save: "SaÄuvaj pozicije" apply_all: "Snimi" position: "Pozicija" @@ -536,13 +534,13 @@ bs_BA: toggle_ordering: "toggle ordering control" subcategories: "Podkategorije" topic_sentence: - few: '%{count} teme' - one: 1 tema - other: '%{count} tema' + one: "1 tema" + few: "%{count} teme" + other: "%{count} tema" topic_stat_sentence: - few: '%{count} nove teme u zadnjih %{unit}.' - one: '%{count} nova tema u zadnjih %{unit}.' - other: '%{count} novih tema u zadnjih %{unit}.' + one: "%{count} nova tema u zadnjih %{unit}." + few: "%{count} nove teme u zadnjih %{unit}." + other: "%{count} novih tema u zadnjih %{unit}." ip_lookup: title: forenzika IP adrese hostname: Hostname @@ -717,7 +715,6 @@ bs_BA: error: "Desila se greÅ¡ka prilikom promjene." change_username: title: "Change Username" - confirm: "Ukoliko promijenite vaÅ¡e korisniÄko ime, sva dosadaÅ¡nja citiranja u vaÅ¡im objavama te @ime spomeni će biti ugaÅ¡eni/sa vaÅ¡im eventualno novim nickom razdvojeni. Da li ste APSOLUTNO SIGURNI da to želite uÄiniti?" taken: "Nažalost, to korisniÄko ime je zauzeto." invalid: "To korisniÄko ime nije validno. Mora sadržavati samo brojeve i slova" change_email: @@ -738,7 +735,6 @@ bs_BA: upload_title: "UÄitajte vaÅ¡u sliku sa ureÄ‘aja" upload_picture: "UÄitavanje slike" image_is_not_a_square: "Upozorenje: morali smo izrezat vaÅ¡u sliku; nije bila kvadratnog oblika." - cache_notice: "UspjeÅ¡no ste promjenili sliku profila, možda potraje njeno prikazivanje zbog keÅ¡-a web preglednika" change_profile_background: title: "Pozadina profila" instructions: "Pozadinske slike profila će biti centrirane i imati Å¡irinu od 850px." @@ -753,9 +749,9 @@ bs_BA: authenticated: "VaÅ¡ email je ovjeren od strane {{provider}}." frequency_immediately: "Slati ćemo vam e-mail obavijesti odmah na novo, ukoliko niste proÄitali sadržaj koji smo vam prvobitno e-mailom poslali." frequency: - few: Poslaćemo vam email samo u sluÄaju da vas nismo vidjeli u zadnje{{count}} minute. - one: Poslaćemo vam email samo u sluÄaju da vas nismo vidjeli u zadnjoj minuti. - other: Poslaćemo vam email samo u sluÄaju da vas nismo vidjeli u zadnjih {{count}} minuta. + one: "Poslaćemo vam email samo u sluÄaju da vas nismo vidjeli u zadnjoj minuti." + few: "Poslaćemo vam email samo u sluÄaju da vas nismo vidjeli u zadnje{{count}} minute." + other: "Poslaćemo vam email samo u sluÄaju da vas nismo vidjeli u zadnjih {{count}} minuta." name: title: "Ime" instructions: "vaÅ¡e puno ime (opciono)" @@ -841,9 +837,9 @@ bs_BA: sent: "Poslano" none: "Nema pozivnica za prikazati" truncated: - few: Prikaz prvih {{count}} pozivnica. - one: Prikaz prve pozivnice. - other: Prikaz prvih {{count}} pozivnica. + one: "Prikaz prve pozivnice." + few: "Prikaz prvih {{count}} pozivnica." + other: "Prikaz prvih {{count}} pozivnica." redeemed: "IskoriÅ¡tene pozivnice" redeemed_tab: "IskoriÅ¡teno" redeemed_tab_with_count: "IskoriÅ¡teno ({{count}})" @@ -890,37 +886,37 @@ bs_BA: time_read: "vrijeme Äitanja" recent_time_read: "nedavno vrijeme Äitanja" topic_count: - few: teme kreirane - one: tema kreirana - other: tema kreirano + one: "tema kreirana" + few: "teme kreirane" + other: "tema kreirano" post_count: - few: objave kreirane - one: objava kreirana - other: objava kreirano + one: "objava kreirana" + few: "objave kreirane" + other: "objava kreirano" likes_given: - few: date - one: dat - other: dato + one: "dat" + few: "date" + other: "dato" likes_received: - few: primljene - one: primljen - other: primljeno + one: "primljen" + few: "primljene" + other: "primljeno" days_visited: - few: dana posjećeno - one: dan posjećeno - other: dana posjećeno + one: "dan posjećeno" + few: "dana posjećeno" + other: "dana posjećeno" topics_entered: - few: tema pregledane - one: tema pregledana - other: tema pregledano + one: "tema pregledana" + few: "tema pregledane" + other: "tema pregledano" posts_read: - few: objave proÄitane - one: objava proÄitana - other: objava proÄitano + one: "objava proÄitana" + few: "objave proÄitane" + other: "objava proÄitano" bookmark_count: - few: zabiljeÅ¡ke - one: zabiljeÅ¡ka - other: zabiljeÅ¡ke + one: "zabiljeÅ¡ka" + few: "zabiljeÅ¡ke" + other: "zabiljeÅ¡ke" top_replies: "Top odgovori" no_replies: "Bez odgovora." more_replies: "JoÅ¡ odgovora" @@ -936,7 +932,6 @@ bs_BA: most_liked_users: "Podijeljen lajk" most_replied_to_users: "NajviÅ¡e odgovoreno ka" no_likes: "JoÅ¡ uvijek nema lajkova." - associated_accounts: "Ulogovanje" ip_address: title: "Zadnja IP Adresa" registration_ip_address: @@ -989,9 +984,9 @@ bs_BA: reached: "%{relativeAge} – %{rate} dosegnut postavljeni limit sajta od %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} prelazi postavljeni limit sajta od %{siteSettingRate}." rate: - few: '%{count} greÅ¡ke/%{duration}' - one: 1 greÅ¡ka/%{duration} - other: '%{count} greÅ¡ke/%{duration}' + one: "1 greÅ¡ka/%{duration}" + few: "%{count} greÅ¡ke/%{duration}" + other: "%{count} greÅ¡ke/%{duration}" learn_more: "saznaj viÅ¡e..." all_time: 'ukupno' all_time_desc: 'ukupno kreiranih tema' @@ -1012,16 +1007,14 @@ bs_BA: time_read_recently_tooltip: '%{time_read} ukupno vrijeme Äitanja (%{recent_time_read} u zadnjih 60 dana)' last_reply_lowercase: zadnji odgovor replies_lowercase: - few: odgovora one: odgovor + few: odgovora other: odgovora signup_cta: sign_up: "Registruj se" hide_session: "Podsjeti me sutra" hide_forever: "ne hvala" hidden_for_session: "Uredu, pitati ću vas ovo opet sutra. TakoÄ‘er u svako doba možete koristiti 'Loguj se' kako bi napravili raÄun." - intro: "Hej tamo! :heart_eyes: Izgleda da uživaÅ¡ u ovoj diskusiji, ali joÅ¡ uvijek nemaÅ¡ prijavljen raÄun." - value_prop: "Kada jednom osnujete raÄun, mi u njemu pamtimo sve ono Å¡to ste do sada Äitali, tako da uvijek kada se vratite na vaÅ¡ raÄun, Äekat će vas obilježene neproÄitane teme, taÄno tamo gdje ste prvobitno stali. TakoÄ‘er pomoću njega dobijate i obavijesti, ovdje i preko redovnog e-maila, kad god su nove objave objavljene. I ovdje možete lajkati objave kako bi ste svijetu udijelili svoju velikoduÅ¡nu ljubav. :heartbeat:" summary: enabled_description: "Trenutno gledate sažetak ove teme: objave koje drugi Älanovi smatraju kao najinteresantnije." description: "Trenutno postoji {{replyCount}} odgovora." @@ -1035,7 +1028,6 @@ bs_BA: disable: "Prikaži obrisane objave" private_message_info: title: "Privatna poruka" - invite: "Pozovi druge..." leave_message: "Da li zaista želite da napustite ovu poruku?" remove_allowed_user: "Da li zaista želite da uklonite {{name}} sa ove privatne poruke?" remove_allowed_group: "Da li zaista želite da uklonite {{name}} sa ove poruke?" @@ -1106,9 +1098,6 @@ bs_BA: preferences: "Morate biti ulogovani kako bi mjenjali vaÅ¡e postavke" forgot: "Ne sjećam se svojih detalja korisniÄkog imena" not_approved: "VaÅ¡ korisniÄki raÄun nije joÅ¡ uvijek odobren od strane administratora. Dobiti ćete email kada dobijete mogućnost da se ulogirate." - google: - title: "koristeći Google" - message: "Prijava preko Google-a (osigurajte da pop up blokeri budu iskljuÄeni)" google_oauth2: title: "koristeći Google" message: "Prijava preko Google-a (osigurajte da pop up blokeri budu iskljuÄeni)" @@ -1165,13 +1154,13 @@ bs_BA: filter_placeholder: Pretraga... create: "Kreiraj: '{{content}}'" max_content_reached: - few: Možete oznaÄiti samo {{count}} predmeta. - one: Možete oznaÄiti samo {{count}} predmet. - other: Možete oznaÄiti samo {{count}} predmeta. + one: "Možete oznaÄiti samo {{count}} predmet." + few: "Možete oznaÄiti samo {{count}} predmeta." + other: "Možete oznaÄiti samo {{count}} predmeta." min_content_not_reached: - few: OznaÄi bar {{count}} predmeta. - one: OznaÄi bar {{count}} predmet. - other: OznaÄi bar {{count}} predmeta. + one: "OznaÄi bar {{count}} predmet." + few: "OznaÄi bar {{count}} predmeta." + other: "OznaÄi bar {{count}} predmeta." emoji_picker: filter_placeholder: Pretraži emotikone people: Osobe @@ -1214,9 +1203,9 @@ bs_BA: drafts_offline: "skicirano lokalno" group_mentioned_limit: "Pažnja! Spomenuli ste {{group}}, meÄ‘utim ova grupa ima viÅ¡e Älanova nego Å¡to je administrator postavio granicu na spominjanje od maximalno {{max}} korisnika. Stoga niko neće biti obavjeÅ¡ten. " group_mentioned: - few: Spominjući {{group}}, obavijestiti će te {{count}} korisnika – da li ste sigurni? - one: Spominjući {{group}}, obavijestiti će te {{count}} korisnika – da li ste sigurni? - other: Spominjući {{group}}, obavijestiti će te {{count}} korisnika – da li ste sigurni? + one: "Spominjući {{group}}, obavijestiti će te {{count}} korisnika – da li ste sigurni?" + few: "Spominjući {{group}}, obavijestiti će te {{count}} korisnika – da li ste sigurni?" + other: "Spominjući {{group}}, obavijestiti će te {{count}} korisnika – da li ste sigurni?" cannot_see_mention: category: "Spomenuli ste {{username}} ali isti neće biti obavjeÅ¡teni zbog toga Å¡to nemaju pristup ovoj kategoriji. Morate ih dodati u Grupu koja ima pristup ka ovoj kategoriji." private: "Spomenuli ste {{username}} ali isti neće biti obavijeÅ¡teni zbog toga Å¡to nisu u mogućnosti da vide ovu personalnu poruku. Morate ih prvobitno pozvati u ovu PP tj. Personalnu poruku." @@ -1315,13 +1304,13 @@ bs_BA: notifications: tooltip: regular: - few: '{{count}} nepregledane obavijesti' - one: 1 nepregledana obavijest - other: '{{count}} nepregledanih obavijesti' + one: "1 nepregledana obavijest" + few: "{{count}} nepregledane obavijesti" + other: "{{count}} nepregledanih obavijesti" message: - few: '{{count}} neproÄitane poruke' - one: 1 neproÄitana poruka - other: '{{count}} neproÄitanih poruka' + one: "1 neproÄitana poruka" + few: "{{count}} neproÄitane poruke" + other: "{{count}} neproÄitanih poruka" title: "obavijeÅ¡tenja na spomenuto @ime, odgovori na vaÅ¡e teme i postove, privatne poruke, itd" none: "Nemate obavijesti trenutno." empty: "Nema obavjeÅ¡tenja." @@ -1336,9 +1325,9 @@ bs_BA: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - few: {{username}}, {{username2}} i ostalih {{count}} {{description}} - one: {{username}}, {{username2}} and 1 ostali {{description}} - other: {{username}}, {{username2}} i ostalih {{count}} {{description}} + one: "{{username}}, {{username2}} and 1 ostali {{description}}" + few: "{{username}}, {{username2}} i ostalih {{count}} {{description}}" + other: "{{username}}, {{username2}} i ostalih {{count}} {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1349,9 +1338,9 @@ bs_BA: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nova tema {{description}}" group_message_summary: - few: '{{count}} poruke u vaÅ¡em {{group_name}} sanduÄiću' - one: '{{count}} poruka u vaÅ¡em {{group_name}} sanduÄiću' - other: '{{count}} poruka u vaÅ¡em {{group_name}} sanduÄiću' + one: "{{count}} poruka u vaÅ¡em {{group_name}} sanduÄiću" + few: "{{count}} poruke u vaÅ¡em {{group_name}} sanduÄiću" + other: "{{count}} poruka u vaÅ¡em {{group_name}} sanduÄiću" popup: mentioned: '{{username}} vas je spomenuo/la u "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} vas je spomenuo/la u "{{topic}}" - {{site_title}}' @@ -1388,9 +1377,9 @@ bs_BA: clear_all: "OÄisti sve" too_short: "VaÅ¡ termin za pretragu je prekratak." result_count: - few: {{count}}{{plus}} resultata za{{term}} - one: 1 rezultat za{{term}} - other: {{count}}{{plus}} rezultata za{{term}} + one: "1 rezultat za{{term}}" + few: "{{count}}{{plus}} resultata za{{term}}" + other: "{{count}}{{plus}} rezultata za{{term}}" title: "traži teme, postove, Älanove ili kategorije" full_page_title: "pretraži teme ili objave" no_results: "Nema rezultata." @@ -1481,9 +1470,9 @@ bs_BA: notification_level: "Obavijesti" choose_new_category: "Izaberi novu kategoriju za temu:" selected: - few: OznaÄili ste {{count}} teme. - one: OznaÄili ste 1 temu. - other: OznaÄili ste {{count}} teme. + one: "OznaÄili ste 1 temu." + few: "OznaÄili ste {{count}} teme." + other: "OznaÄili ste {{count}} teme." change_tags: "Zamijeni oznake" append_tags: "Pripoji oznake" choose_new_tags: "Odaberi nove tagove za ove teme:" @@ -1516,9 +1505,9 @@ bs_BA: search: "Nema viÅ¡e rezultata pretrage." topic: filter_to: - few: '{{count}} objave u temi' - one: 1 objava u temi - other: '{{count}} objava u temi' + one: "1 objava u temi" + few: "{{count}} objave u temi" + other: "{{count}} objava u temi" create: 'ZapoÄni Temu' create_long: 'ZapoÄni novu Temu' open_draft: "Otvori skicu" @@ -1536,12 +1525,12 @@ bs_BA: new: 'nova tema' unread: 'neproÄitana' new_topics: + one: '1 nova tema' few: '{{count}} nove teme' - one: 1 nova tema other: '{{count}} nove teme' unread_topics: + one: '1 neproÄitana tema' few: '{{count}} neproÄitane teme' - one: 1 neproÄitana tema other: '{{count}} neproÄitane teme' title: 'Tema' invalid_access: @@ -1555,21 +1544,21 @@ bs_BA: title: "Tema nije pronaÄ‘ena" description: "Nažalost, nismo pronaÅ¡li tu temu. Možda je uklonjena od strane moderatora?" total_unread_posts: - few: imate {{count}} neproÄitane objave u ovoj temi - one: imate 1 neproÄitanu objavu u ovoj temi - other: imate {{count}} neproÄitanih objava u ovoj temi + one: "imate 1 neproÄitanu objavu u ovoj temi" + few: "imate {{count}} neproÄitane objave u ovoj temi" + other: "imate {{count}} neproÄitanih objava u ovoj temi" unread_posts: - few: imate {{count}} neproÄitane stare objave u ovoj temi - one: imate 1 neproÄitanu staru objavu u ovoj temi - other: imate {{count}} neproÄitane stare objave u ovoj temi + one: "imate 1 neproÄitanu staru objavu u ovoj temi" + few: "imate {{count}} neproÄitane stare objave u ovoj temi" + other: "imate {{count}} neproÄitane stare objave u ovoj temi" new_posts: - few: imate {{count}} nove objave u ovoj temi od trenutka vaÅ¡e zadnje posjete - one: imate 1 novu objavu u ovoj temi od trenutka vaÅ¡e zadnje posjete - other: imate {{count}} nove objave u ovoj temi od trenutka vaÅ¡e zadnje posjete + one: "imate 1 novu objavu u ovoj temi od trenutka vaÅ¡e zadnje posjete" + few: "imate {{count}} nove objave u ovoj temi od trenutka vaÅ¡e zadnje posjete" + other: "imate {{count}} nove objave u ovoj temi od trenutka vaÅ¡e zadnje posjete" likes: - few: postoji {{count}} sviÄ‘anja u ovoj temi - one: postoji 1 sviÄ‘anje u ovoj temi - other: postoji {{count}} sviÄ‘anja u ovoj temi + one: "postoji 1 sviÄ‘anje u ovoj temi" + few: "postoji {{count}} sviÄ‘anja u ovoj temi" + other: "postoji {{count}} sviÄ‘anja u ovoj temi" back_to_list: "Vrati se na Listu Tema" options: "Opcije Teme" show_links: "pokaži linkove unutar ove teme" @@ -1633,9 +1622,9 @@ bs_BA: auto_reminder: "Bit će te obavijeÅ¡teni o ovoj temi za %{timeLeft}" auto_close_title: 'Auto-Close Settings' auto_close_immediate: - few: Zanja objava u ovoj temi je već sati %{count} stara, stoga će tema biti odmah zatvorena. - one: Zanja objava u ovoj temi je već 1 sat stara, stoga će tema biti odmah zatvorena. - other: Zanja objava u ovoj temi je već %{count} sati stara, stoga će tema biti odmah zatvorena. + one: "Zanja objava u ovoj temi je već 1 sat stara, stoga će tema biti odmah zatvorena." + few: "Zanja objava u ovoj temi je već sati %{count} stara, stoga će tema biti odmah zatvorena." + other: "Zanja objava u ovoj temi je već %{count} sati stara, stoga će tema biti odmah zatvorena." timeline: back: "Nazad" back_description: "Vratite se nazad na vaÅ¡u zadnju neproÄitanu objavu" @@ -1743,9 +1732,9 @@ bs_BA: pin_validation: "Potreban je datum kako bi okaÄili ovu temu." not_pinned: "Nema okaÄenih tema u {{categoryLink}}." already_pinned: - few: 'Teme trenutno zakaÄene u {{categoryLink}}: {{count}}' - one: 'Tema trenutno zakaÄena u {{categoryLink}}: 1' - other: Tema trenutno zakaÄenih u {{categoryLink}}: {{count}} + one: "Tema trenutno zakaÄena u {{categoryLink}}: 1" + few: "Teme trenutno zakaÄene u {{categoryLink}}: {{count}}" + other: "Tema trenutno zakaÄenih u {{categoryLink}}: {{count}}" pin_globally: "Postavi ovu temu da se prikazuje na vrhu svih lista tema sve do" confirm_pin_globally: "Već imate {{count}} globalno okaÄene teme. PreviÅ¡e okaÄenih tema mogu praviti teret za nove i anonimne korisnike. Da li ste sigurni da želite okaÄiti joÅ¡ jednu temu u ovoj kategoriji?" unpin_globally: "Uklonite ovu temu sa vrha svih lista tema." @@ -1753,9 +1742,9 @@ bs_BA: global_pin_note: "Korisnici mogu sami individualno za sebe ukloniti okaÄku sa teme." not_pinned_globally: "Nema tema okaÄenih globalno." already_pinned_globally: - few: 'Teme trenutno zakaÄene globalno: {{count}} ' - one: 'Tema trenutno zakaÄena globalno: 1' - other: 'Tema trenutno zakaÄeno globalno: {{count}} ' + one: "Tema trenutno zakaÄena globalno: 1" + few: "Teme trenutno zakaÄene globalno: {{count}} " + other: "Tema trenutno zakaÄeno globalno: {{count}} " make_banner: "Postavi ovu temu kao banner koji se pojavljuje na vrhu svih stranica." remove_banner: "Uklonite banner koji se pojavljuje u vrhu svih stranica." banner_note: "Korisnici mogu odkloniti banner tako Å¡to će ga zatvoriti. U svakom momentu samo jedna tema može biti postavljena za banner." @@ -1792,9 +1781,9 @@ bs_BA: login_reply: 'Uloguj se da odgovoriÅ¡' filters: n_posts: - few: '{{count}} objave' - one: 1 objava - other: '{{count}} objava' + one: "1 objava" + few: "{{count}} objave" + other: "{{count}} objava" cancel: "Show all posts in this topic again." split_topic: title: "Move to New Topic" @@ -1802,17 +1791,17 @@ bs_BA: topic_name: "Ime Nove Teme" error: "There was an error moving posts to the new topic." instructions: - few: Kreirati će te novu temu i popuniti je sa {{count}} objave koje ste oznaÄili. - one: Kreirati će te novu temu i popuniti je sa objavom koju ste oznaÄili. - other: Kreirati će te novu temu i popuniti je sa {{count}} objava koje ste oznaÄili. + one: "Kreirati će te novu temu i popuniti je sa objavom koju ste oznaÄili." + few: "Kreirati će te novu temu i popuniti je sa {{count}} objave koje ste oznaÄili." + other: "Kreirati će te novu temu i popuniti je sa {{count}} objava koje ste oznaÄili." merge_topic: title: "Move to Existing Topic" action: "move to existing topic" error: "There was an error moving posts into that topic." instructions: - few: Molimo da odaberete temu u koju će te pomjeriti {{count}} objave. - one: Molimo da odaberete temu u koju će te pomjeriti tu objavu. - other: Molimo da odaberete temu u koju će te pomjeriti {{count}} objava. + one: "Molimo da odaberete temu u koju će te pomjeriti tu objavu." + few: "Molimo da odaberete temu u koju će te pomjeriti {{count}} objave." + other: "Molimo da odaberete temu u koju će te pomjeriti {{count}} objava." merge_posts: title: "Spoji izabrane postove" action: "spoji izabrane postove" @@ -1824,9 +1813,9 @@ bs_BA: label: "New Owner of Posts" placeholder: "username of new owner" instructions: - few: Molimo da odaberete novog vlasnika za {{count}} objave od starog korisnika {{old_user}}. - one: Molimo da odaberete novog vlasnika objave od starog korisnika {{old_user}}. - other: Molimo da odaberete novog vlasnika za {{count}} objava od starog korisnika {{old_user}}. + one: "Molimo da odaberete novog vlasnika objave od starog korisnika {{old_user}}." + few: "Molimo da odaberete novog vlasnika za {{count}} objave od starog korisnika {{old_user}}." + other: "Molimo da odaberete novog vlasnika za {{count}} objava od starog korisnika {{old_user}}." instructions_warn: "Imajte na umu da bilo koje obavijesti o ovoj objavi neće biti proslijeÄ‘ene novom korisniku retroaktivno (naknadno). " change_timestamp: title: "Promijeni vremensku zabiljeÅ¡ku..." @@ -1854,9 +1843,9 @@ bs_BA: select_all: select all deselect_all: deselect all description: - few: OznaÄili ste {{count}}objave. one: OznaÄili ste 1 objavu. - other: OznaÄili ste {{count}} objava. + few: "OznaÄili ste {{count}}objave." + other: "OznaÄili ste {{count}} objava." post: quote_reply: "Citat" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1871,34 +1860,34 @@ bs_BA: show_full: "Pogledaj Cijeli Post" show_hidden: 'Pogledaj sakriven sadržaj.' deleted_by_author: - few: (objava povuÄena od strane autora, bit će automatski izbrisana za %{count} sata ukoliko u meÄ‘uvremenu na nju nije stavljena opomena) - one: (objava povuÄena od strane autora, bit će automatski izbrisana za %{count} sat ukoliko u meÄ‘uvremenu na nju nije stavljena opomena) - other: (objava povuÄena od strane autora, bit će automatski izbrisana za %{count} sati ukoliko u meÄ‘uvremenu na nju nije stavljena prijava) + one: "(objava povuÄena od strane autora, bit će automatski izbrisana za %{count} sat ukoliko u meÄ‘uvremenu na nju nije stavljena opomena)" + few: "(objava povuÄena od strane autora, bit će automatski izbrisana za %{count} sata ukoliko u meÄ‘uvremenu na nju nije stavljena opomena)" + other: "(objava povuÄena od strane autora, bit će automatski izbrisana za %{count} sati ukoliko u meÄ‘uvremenu na nju nije stavljena prijava)" collapse: "spusti" expand_collapse: "digni/spusti" locked: "administrator je zakljuÄao ovu objavu za nove izmjene" gap: - few: pogledaj {{count}} skrivena odgovora - one: pogledaj 1 skriven odgovor - other: pogledaj {{count}} skrivenih odgovora + one: "pogledaj 1 skriven odgovor" + few: "pogledaj {{count}} skrivena odgovora" + other: "pogledaj {{count}} skrivenih odgovora" unread: "Post je neproÄitan" has_replies: - few: '{{count}} Odgovora' - one: '{{count}} Odgovor' - other: '{{count}} Odgovora' + one: "{{count}} Odgovor" + few: "{{count}} Odgovora" + other: "{{count}} Odgovora" has_likes: - few: '{{count}} SviÄ‘anja' - one: '{{count}} SviÄ‘anje' - other: '{{count}} SviÄ‘anja' + one: "{{count}} SviÄ‘anje" + few: "{{count}} SviÄ‘anja" + other: "{{count}} SviÄ‘anja" has_likes_title: - few: '{{count}} osoba se sviÄ‘a ova objava' - one: 1 osobi se sviÄ‘a ova objava - other: '{{count}} osoba se sviÄ‘a ova objava' + one: "1 osobi se sviÄ‘a ova objava" + few: "{{count}} osoba se sviÄ‘a ova objava" + other: "{{count}} osoba se sviÄ‘a ova objava" has_likes_title_only_you: "sviÄ‘a vam se ova objava" has_likes_title_you: - few: vama i joÅ¡ {{count}} ostale osobe vam se sviÄ‘a ova objava - one: vama i joÅ¡ 1 osobi vam se sviÄ‘a ova objava - other: vama i joÅ¡ {{count}} ostalih osoba vam se sviÄ‘a ova objava + one: "vama i joÅ¡ 1 osobi vam se sviÄ‘a ova objava" + few: "vama i joÅ¡ {{count}} ostale osobe vam se sviÄ‘a ova objava" + other: "vama i joÅ¡ {{count}} ostalih osoba vam se sviÄ‘a ova objava" errors: create: "Sorry, there was an error creating your post. Please try again." edit: "Sorry, there was an error editing your post. Please try again." @@ -1938,13 +1927,13 @@ bs_BA: delete_replies: confirm: "Da li želite takoÄ‘er da obriÅ¡ete i odgovore na ovu objavu?" direct_replies: - few: Da, i {{count}} direktna odgovora - one: Da, i 1 direktni odgovor - other: Da, i {{count}} direktnih odgovora + one: "Da, i 1 direktni odgovor" + few: "Da, i {{count}} direktna odgovora" + other: "Da, i {{count}} direktnih odgovora" all_replies: - few: Da, i sva {{count}} odgovora - one: Da, i 1 odgovor - other: Da, i svih {{count}} odgovora + one: "Da, i 1 odgovor" + few: "Da, i sva {{count}} odgovora" + other: "Da, i svih {{count}} odgovora" just_the_post: "Ne, samo ovu objavu" admin: "post admin actions" wiki: "Make Wiki" @@ -1962,16 +1951,15 @@ bs_BA: actions: flag: 'Prijava' defer_flags: - few: IgnoriÅ¡i prijave - one: IgnoriÅ¡i prijavu - other: IgnoriÅ¡i prijave + one: "IgnoriÅ¡i prijavu" + few: "IgnoriÅ¡i prijave" + other: "IgnoriÅ¡i prijave" undo: off_topic: "Otkaži prijavu" spam: "Otkaži prijavu" inappropriate: "Otkaži prijavu" bookmark: "Otkaži bookmark" like: "Otkaži lajk" - vote: "Otkaži glas" people: off_topic: "prijava iskakanja iz okvira teme (off-topic)" spam: "prijava spama" @@ -1988,41 +1976,40 @@ bs_BA: notify_user: "You sent a private message to this user" bookmark: "You bookmarked this post" like: "Lajkovao si ovo" - vote: "Glasao si za ovaj post" by_you_and_others: off_topic: - few: Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo kao iskakanje iz okvira teme - one: Vi i joÅ¡ 1 osoba ste prijavili ovo kao iskakanje iz okvira teme - other: Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo kao iskakanje iz okvira teme + one: "Vi i joÅ¡ 1 osoba ste prijavili ovo kao iskakanje iz okvira teme" + few: "Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo kao iskakanje iz okvira teme" + other: "Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo kao iskakanje iz okvira teme" spam: - few: Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo kao spam - one: Vi i joÅ¡ 1 osoba ste prijavili ovo kao spam - other: Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo kao spam + one: "Vi i joÅ¡ 1 osoba ste prijavili ovo kao spam" + few: "Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo kao spam" + other: "Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo kao spam" inappropriate: - few: Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo kao neprimjereno - one: Vi i joÅ¡ 1 osoba ste prijavili ovo kao neprimjereno - other: Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo kao neprimjereno + one: "Vi i joÅ¡ 1 osoba ste prijavili ovo kao neprimjereno" + few: "Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo kao neprimjereno" + other: "Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo kao neprimjereno" notify_moderators: - few: Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo za korigovanje od strane moderatora - one: Vi i joÅ¡ 1 osoba ste prijavili ovo za korigovanje od strane moderatora - other: Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo za korigovanje od strane moderatora + one: "Vi i joÅ¡ 1 osoba ste prijavili ovo za korigovanje od strane moderatora" + few: "Vi i joÅ¡ {{count}} ostale osobe ste prijavili ovo za korigovanje od strane moderatora" + other: "Vi i joÅ¡ {{count}} ostalih osoba ste prijavili ovo za korigovanje od strane moderatora" by_others: off_topic: - few: '{{count}} osobe je prijavilo ovo kao iskakanje iz okvira teme' - one: 1 osoba je prijavila ovo kao iskakanje iz okvira teme - other: '{{count}} osoba je prijavilo ovo kao iskakanje iz okvira teme' + one: "1 osoba je prijavila ovo kao iskakanje iz okvira teme" + few: "{{count}} osobe je prijavilo ovo kao iskakanje iz okvira teme" + other: "{{count}} osoba je prijavilo ovo kao iskakanje iz okvira teme" spam: - few: '{{count}} osobe je prijavilo ovo kao spam' - one: 1 osoba je prijavila ovo kao spam - other: '{{count}} osoba je prijavilo ovo kao spam' + one: "1 osoba je prijavila ovo kao spam" + few: "{{count}} osobe je prijavilo ovo kao spam" + other: "{{count}} osoba je prijavilo ovo kao spam" inappropriate: - few: '{{count}} osobe je prijavilo ovo kao neprimjereno' - one: 1 osoba je prijavila ovo kao neprimjereno - other: '{{count}} osoba je prijavilo ovo kao neprimjereno' + one: "1 osoba je prijavila ovo kao neprimjereno" + few: "{{count}} osobe je prijavilo ovo kao neprimjereno" + other: "{{count}} osoba je prijavilo ovo kao neprimjereno" notify_moderators: - few: '{{count}} osobe je prijavilo ovo za korigovanje od strane moderatora' - one: 1 osoba je prijavila ovo za korigovanje od strane moderatora - other: '{{count}} osoba je prijavilo ovo za korigovanje od strane moderatora' + one: "1 osoba je prijavila ovo za korigovanje od strane moderatora" + few: "{{count}} osobe je prijavilo ovo za korigovanje od strane moderatora" + other: "{{count}} osoba je prijavilo ovo za korigovanje od strane moderatora" revisions: controls: first: "First revision" @@ -2041,7 +2028,6 @@ bs_BA: category: can: 'can… ' none: '(no category)' - choose: 'Select a category…' edit: 'edit' edit_long: "Edit" view: 'View Topics in Category' @@ -2078,7 +2064,6 @@ bs_BA: edit_permissions: "Edit Permissions" add_permission: "Add Permission" this_year: "this year" - position: "position" default_position: "Default Position" position_disabled: "Categories will be displayed in order of activity. To control the order of categories in lists, " position_disabled_click: 'enable the "fixed category positions" setting.' @@ -2171,15 +2156,15 @@ bs_BA: help: "teme koje trenutno pratite i motrite sa neproÄitanim postovima" new: lower_title_with_count: - few: '{{count}} nova' - one: 1 novi - other: '{{count}} novih' + one: "1 novi" + few: "{{count}} nova" + other: "{{count}} novih" lower_title: "nova" title: "Novo" title_with_count: - few: Novo ({{count}}) - one: Novo (1) - other: Novo ({{count}}) + one: "Novo (1)" + few: "Novo ({{count}})" + other: "Novo ({{count}})" help: "teme kreirane u zadnjih nekoliko dana" posted: title: "Moji Odgovori" @@ -2485,7 +2470,6 @@ bs_BA: address_placeholder: "name@example.com" type_placeholder: "digest, signup..." reply_key_placeholder: "reply key" - skipped_reason_placeholder: "reason" logs: title: "Logs" action: "Action" diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml index 6727ff03da..f8ecb9dc95 100644 --- a/config/locales/client.ca.yml +++ b/config/locales/client.ca.yml @@ -43,68 +43,68 @@ ca: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" x_months: - one: 1mes - other: '%{count}mes' + one: "1mes" + other: "%{count}mes" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} mins' + one: "1 min" + other: "%{count} mins" x_hours: - one: 1 hora - other: '%{count} hores' + one: "1 hora" + other: "%{count} hores" x_days: - one: 1 dia - other: '%{count} dies' + one: "1 dia" + other: "%{count} dies" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: fa 1 min - other: fa %{count} mins + one: "fa 1 min" + other: "fa %{count} mins" x_hours: - one: fa 1 hora - other: fa %{count} hores + one: "fa 1 hora" + other: "fa %{count} hores" x_days: - one: fa 1 dia - other: fa %{count} dies + one: "fa 1 dia" + other: "fa %{count} dies" later: x_days: - one: 1 dia després - other: '%{count} dies després' + one: "1 dia després" + other: "%{count} dies després" x_months: - one: 1 mes després - other: '%{count} mesos després' + one: "1 mes després" + other: "%{count} mesos després" x_years: - one: 1 any després - other: '%{count} anys després' + one: "1 any després" + other: "%{count} anys després" previous_month: 'Mes anterior' next_month: 'Següent mes' placeholder: data @@ -183,13 +183,13 @@ ca: show_help: "opcions" links: "Enllaços" links_lowercase: - one: enllaç - other: enllaços + one: "enllaç" + other: "enllaços" faq: "PMF" guidelines: "Directrius" privacy_policy: "Política de privadesa" privacy: "Privadesa" - terms_of_service: "Condicions generals d'ús" + tos: "Condicions generals d'ús" mobile_view: "Visió Mòbil" desktop_view: "Visió d'Escriptori" you: "Tu" @@ -208,8 +208,8 @@ ca: max_of_count: "màx de {{count}}" alternation: "o" character_count: - one: '{{count}} caràcter' - other: '{{count}} caràcters' + one: "{{count}} caràcter" + other: "{{count}} caràcters" suggested_topics: title: "Temes suggerits" pm_title: "Missatges proposats" @@ -277,16 +277,16 @@ ca: cancel: "Cancel·la" view_pending: "mira publicacions pendents" has_pending_posts: - one: Aquest tema té 1 publicació esperant l'aprovació - other: Aquest tema té {{count}} publicacions esperant l'aprovació + one: "Aquest tema té 1 publicació esperant l'aprovació" + other: "Aquest tema té {{count}} publicacions esperant l'aprovació" confirm: "Desa els canvis" delete_prompt: "Segur que vols esborrar %{username}? Això eliminarà totes les seves publicacions i blocarà el correu electrònic i l'adreça IP." approval: title: "La publicació necessita ser aprovada" description: "Hem rebut la teva nova publicació, però cal que sigui aprovada per una persona moderadora abans d'aparèixer. Si us plau, una mica de paciència." pending_posts: - one: Tens 1 publicació pendent. - other: Tens {{count}} publicacions pendents. + one: "Tens 1 publicació pendent." + other: "Tens {{count}} publicacions pendents." ok: "D'acord" user_action: user_posted_topic: "{{user}} va enviar el tema" @@ -320,8 +320,8 @@ ca: posts_read: "Llegit" posts_read_long: "Publicacions llegides" total_rows: - one: 1 persona usuària - other: '%{count} persones usuàries' + one: "1 persona usuària" + other: "%{count} persones usuàries" group_histories: actions: change_group_setting: "Canvia la configuració del grup" @@ -330,6 +330,10 @@ ca: make_user_group_owner: "Crea persona propietària" remove_user_as_group_owner: "Elimina persona propietària" groups: + add_members: + title: "Afegeix membres" + manage: + add_members: "Afegeix membres" empty: posts: "No hi ha publicacions de membres d'aquest grup." members: "No hi ha membres a aquest grup." @@ -337,7 +341,7 @@ ca: messages: "No hi ha missatges per a aquest grup." topics: "No hi ha temes de membres d'aquest grup." logs: "No hi ha registres per a aquest grup." - add: "Afegegix" + add: "Afegeix" message: "Missatge" membership: "Afiliació" name: "Nom" @@ -347,8 +351,8 @@ ca: title: "Grups" empty: "No hi ha grups visibles" title: - one: Grup - other: Grups + one: "Grup" + other: "Grups" activity: "Activitat" topics: "Temes" posts: "Publicacions" @@ -399,15 +403,12 @@ ca: "14": "Pendents" categories: all: "totes les categories" - all_subcategories: "Tot a %{categoryName}" no_subcategory: "cap" category: "Categoria" category_list: "Mostra la llista de categories" reorder: title: "Reordena categories" title_long: "Reorganitza la llista de categories" - fix_order: "Fixa posicions" - fix_order_tooltip: "No totes les categories tenen una xifra de posició única, perquè això podria causar resultats inesperats." save: "Desa ordre" apply_all: "Executa" position: "Posició" @@ -418,11 +419,11 @@ ca: toggle_ordering: "alterna el control de l'ordre" subcategories: "Subcategories" topic_sentence: - one: 1 tema - other: '%{count} temes' + one: "1 tema" + other: "%{count} temes" topic_stat_sentence: - one: '%{count} nou tema als passats %{unit}.' - other: '%{count} nous temes als passats %{unit}.' + one: "%{count} nou tema als passats %{unit}." + other: "%{count} nous temes als passats %{unit}." ip_lookup: title: Explora adreça IP hostname: Nom d'amfitrió @@ -570,7 +571,6 @@ ca: error: "Hi ha hagut una errada en canviar aquest valor" change_username: title: "Canvia nom de persona usuària" - confirm: "Si canvies el teu nom de persona usuària, les cites a les teves entrades i les mencions de @nom es trencaran. Estàs completament segur que vols fer-ho?" taken: "Disculpa, aquesta identitat usuària ja està agafada." invalid: "Aquest nom de persona usuària no és vàlid. Ha d'incloure només xifres i lletres." change_email: @@ -589,7 +589,6 @@ ca: upload_title: "Carrega la teva foto" upload_picture: "Actualitza la foto" image_is_not_a_square: "Atenció: hem retallat la teva imatge; l'amplada i l'alçada no són igual." - cache_notice: "Has canviat amb èxit la teva foto de perfil, però la seva aparició trigarà una mica a causa de la memòria cau del navegador." change_profile_background: title: "Fons del perfil" instructions: "Els fons de perfil se centraran i tindran una amplada per defecte de 850px." @@ -604,8 +603,8 @@ ca: authenticated: "El teu correu electrònic ha estat autenticat per {{provider}}" frequency_immediately: "T'enviarem un correu electrònic immediatament si no has llegit el que t'hem fet arribar." frequency: - one: Només t'enviarem un correu electrònic si no t'hem vist en el darrer minut. - other: Només t'enviarem un correu electrònic si no t'hem vist en els darrers {{count}} minuts. + one: "Només t'enviarem un correu electrònic si no t'hem vist en el darrer minut." + other: "Només t'enviarem un correu electrònic si no t'hem vist en els darrers {{count}} minuts." name: title: "Nom" instructions: "el teu nom complet (opcional)" @@ -633,7 +632,7 @@ ca: last_posted: "Darrer missatge" last_emailed: "Darrer correu" last_seen: "Mirat" - created: "Es va regsitrar" + created: "Es va registrar" log_out: "Sortir" location: "Ubicació" website: "Lloc web" @@ -690,8 +689,8 @@ ca: user: "Persona usuària convidada" sent: "Enviat" truncated: - one: Mostrant la primera invitació. - other: Mostrant les primeres {{count}} invitacions. + one: "Mostrant la primera invitació." + other: "Mostrant les primeres {{count}} invitacions." redeemed: "Invitacions recuperades" redeemed_tab: "Recuperada" redeemed_tab_with_count: "Recuperades ({{count}})" @@ -733,26 +732,26 @@ ca: stats: "Estadístiques" time_read: "temps de lectura" topic_count: - one: tema creat - other: temes creats + one: "tema creat" + other: "temes creats" post_count: - one: publicació creada - other: publicacions creades + one: "publicació creada" + other: "publicacions creades" likes_given: - one: donada - other: donada + one: "donada" + other: "donada" likes_received: - one: Rebuda - other: Rebudes + one: "Rebuda" + other: "Rebudes" days_visited: - one: dia visitat - other: dies visitats + one: "dia visitat" + other: "dies visitats" posts_read: - one: publicació llegida - other: publicacions llegides + one: "publicació llegida" + other: "publicacions llegides" bookmark_count: - one: preferit - other: preferits + one: "preferit" + other: "preferits" top_replies: "Principals respostes" no_replies: "Encara sense respostes" more_replies: "Més respostes" @@ -768,7 +767,6 @@ ca: most_liked_users: "Més agradat" most_replied_to_users: "Més respost a " no_likes: "Encara sense :heart:" - associated_accounts: "Sessions iniciades" ip_address: title: "Darrera adreça IP" registration_ip_address: @@ -778,6 +776,7 @@ ca: header_title: "perfil, missatges, preferits i preferències" title: title: "Títol" + none: "(cap)" filters: all: "Tot" stream: @@ -820,8 +819,8 @@ ca: reached: "%{relativeAge} – %{rate} ha arribat al límit de configuració de %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} ha superat el límit de configuració de %{siteSettingRate}." rate: - one: 1 error/%{duration} - other: '%{count} errors/%{duration}' + one: "1 error/%{duration}" + other: "%{count} errors/%{duration}" learn_more: "saber-ne més..." all_time: 'total' all_time_desc: 'total de temes creats' @@ -847,8 +846,6 @@ ca: hide_session: "Recorda-m'ho demà" hide_forever: "no, gràcies" hidden_for_session: "D'acord, to demanarem demà. També podràs fer servir sempre Iniciar sessió per crear un compte." - intro: "Hola! :heart_eyes: Sembla que estàs gaudint amb la conversa, però no t'hi has registrat." - value_prop: "En crear un compte, et recordem exactament el que has llegit, i així sempre arribes just on ho has deixat. També pots obtenir notificacions, aquí i per correu electrònic, sempre que hi hagi nous missatges. I pots rebre missatges de compartir l'amor. :heartbeat:" summary: enabled_description: "Estàs mirant un resum d'aquest tema: les publicacions més interessants segons determina la comunitat." description: "Hi ha {{replyCount}} respostes." @@ -862,7 +859,6 @@ ca: disable: "Mostra publicacions esborrades" private_message_info: title: "Missatge" - invite: "Convida altres..." remove_allowed_user: "De debò vols esborrar {{name}} d'aquest missatge?" remove_allowed_group: "De debò vols esborrar {{name}} d'aquest missatge?" email: 'Correu electrònic' @@ -913,9 +909,6 @@ ca: preferences: "Cal que t'identifiquis per canviar les teves preferències" forgot: "No recordo els detalls del meu compte" not_approved: "El teu compte encara no ha estat aprovat. Et notificarem per correu quan puguis connectar-t'hi." - google: - title: "amb Google" - message: "Autenticar amb Google (assegura't que no tens activats els bloquejadors de finestres emergents)" google_oauth2: title: "amb Google" message: "Autenticar amb Google (assegura't que no tens activats els bloquejadors de finestres emergents)" @@ -977,8 +970,8 @@ ca: similar_topics: "El teu tema és semblant a..." drafts_offline: "esborranys fora de línia" group_mentioned: - one: En mencionar {{group}}, estàs a punt de notificar-ho a {{count}} aquesta persona – Segur? - other: En mencionar {{group}}, estàs a punt de notificar-ho a {{count}} aquestes persones – Segur? + one: "En mencionar {{group}}, estàs a punt de notificar-ho a {{count}} aquesta persona – Segur?" + other: "En mencionar {{group}}, estàs a punt de notificar-ho a {{count}} aquestes persones – Segur?" cannot_see_mention: category: "Has mencionat {{username}} però no es notificarà res perquè aquesta gent no gaudeix d'accés a aquesta categoria. Et caldrà afegir-la a un grup que tingui accés a aquesta categoria." private: "Has mencionat {{username}} però no es notificarà res perquè aquesta gent no pot veure aquest missatge. Et caldrà convidar aquesta gent a aquest Missatge Personal." @@ -1045,8 +1038,8 @@ ca: notifications: tooltip: regular: - one: 1 notificació no vista - other: '{{count}} notificacions no vistes' + one: "1 notificació no vista" + other: "{{count}} notificacions no vistes" title: "notificacions de mencions via @nom, respostes a les teves entrades, missatges, etc" none: "Impossible carregar ara mateix les notificacions" empty: "No s'hi han trobat notificacions." @@ -1154,8 +1147,8 @@ ca: notification_level: "Notificacions" choose_new_category: "Tria la nova categoria per als temes:" selected: - one: Has triat 1 tema. - other: Has triat {{count}} temes. + one: "Has triat 1 tema." + other: "Has triat {{count}} temes." change_tags: "Reemplaça Etiquetes" append_tags: "Annexa Etiquetes" choose_new_tags: "Tria noves etiquetes per a aquests temes:" @@ -1188,8 +1181,8 @@ ca: search: "No hi ha més resultats de la cerca." topic: filter_to: - one: 1 publicació al tema - other: '{{count}} publicacions al tema' + one: "1 publicació al tema" + other: "{{count}} publicacions al tema" create: 'Nou tema' create_long: 'Crea un tema nou' private_message: 'Comença un missatge' @@ -1203,10 +1196,10 @@ ca: new: 'nou tema' unread: 'sense llegir' new_topics: - one: 1 tema nou + one: '1 tema nou' other: '{{count}} temes nous ' unread_topics: - one: 1 tema sense llegir + one: '1 tema sense llegir' other: '{{count}} temes sense llegir' title: 'Tema' invalid_access: @@ -1220,17 +1213,17 @@ ca: title: "Tema no trobat" description: "Disculpa, no hem pogut trobar aquest tema. Que potser ha estat esborrat per una persona moderadora?" total_unread_posts: - one: tens 1 missatge sense llegir a aquest tema - other: tens {{count}} missatges sense llegir a aquest tema + one: "tens 1 missatge sense llegir a aquest tema" + other: "tens {{count}} missatges sense llegir a aquest tema" unread_posts: - one: tens 1 publicació antiga sense llegir a aquest tema - other: tens {{count}} publicacions antigues sense llegir a aquest tema + one: "tens 1 publicació antiga sense llegir a aquest tema" + other: "tens {{count}} publicacions antigues sense llegir a aquest tema" new_posts: - one: hi ha 1 nova publicació a aquest tema des de la teva darrera lectura - other: hi ha {{count}} noves publicacions a aquest tema des de la teva darrera lectura + one: "hi ha 1 nova publicació a aquest tema des de la teva darrera lectura" + other: "hi ha {{count}} noves publicacions a aquest tema des de la teva darrera lectura" likes: - one: hi ha 1 M'agrada a aquest tema - other: hi ha {{count}} m'agrades en aquest tema + one: "hi ha 1 M'agrada a aquest tema" + other: "hi ha {{count}} m'agrades en aquest tema" back_to_list: "Torna al llistat de temes" options: "Opcions de tema" show_links: "mostra enllaços dins d'aquest tema" @@ -1253,8 +1246,8 @@ ca: auto_publish_to_category: "Aquest tema serà publicat a la categoria #%{categoryName}%{timeLeft}" auto_close_title: 'Configuració del tancament automàtic' auto_close_immediate: - one: La darrera publicació al tema ja té 1 hora, per això el tema es tancarà immediatament. - other: La darrera publicació al tema ja té %{count} hores, per això el tema es tancarà immediatament. + one: "La darrera publicació al tema ja té 1 hora, per això el tema es tancarà immediatament." + other: "La darrera publicació al tema ja té %{count} hores, per això el tema es tancarà immediatament." timeline: back: "Enrere" back_description: "Torna a la teva darrera publicació sense llegir" @@ -1360,8 +1353,8 @@ ca: pin_validation: "Cal una data per clavar aquest tema." not_pinned: "No hi ha temes clavats a {{categoryLink}}." already_pinned: - one: 'Temes clavats a hores d''ara{{categoryLink}}: 1' - other: 'Temes clavats a hores d''ara{{categoryLink}}: {{count}}' + one: "Temes clavats a hores d'ara{{categoryLink}}: 1" + other: "Temes clavats a hores d'ara{{categoryLink}}: {{count}}" pin_globally: "Fes que aquest tema aparegui al començament de tots fins " confirm_pin_globally: "Ja has arribat globalment a {{count}} temes clavats. Massa temes clavats poden carregar les persones usuàries noves o anònimes. Segur que vols clavar un altre tema globalment?" unpin_globally: "Eiimina aquest tema del principi del començament de tots." @@ -1369,8 +1362,8 @@ ca: global_pin_note: "Individualment, les mateixes persones usuàries poden desclavar el tema." not_pinned_globally: "No hi ha temes clavats globalment." already_pinned_globally: - one: 'Temes globalment clavats a hores d''ara{{categoryLink}}: 1' - other: 'Temes globalment clavats a hores d''ara{{categoryLink}}: {{count}}' + one: "Temes globalment clavats a hores d'ara{{categoryLink}}: 1" + other: "Temes globalment clavats a hores d'ara{{categoryLink}}: {{count}}" make_banner: "Fes que aquest tema aparegui emmarcat al començament de totes les pàgines." remove_banner: "Eiimina el marc que apareix al començament de totes les pàgines." banner_note: "Les persones usuàries poden descartar el marc en tancar-lo. Només es pot emmarcar un tema en qualsevol moment." @@ -1406,8 +1399,8 @@ ca: login_reply: 'Identifica''t per respondre' filters: n_posts: - one: 1 publicació - other: '{{count}} publicacions' + one: "1 publicació" + other: "{{count}} publicacions" cancel: "Filtre remot" split_topic: title: "Mou a un nou tema" @@ -1415,15 +1408,15 @@ ca: topic_name: "Nom del nou tema" error: "Hi ha hagut una errada en moure publicacions a aquest nou tema." instructions: - one: Estàs a punt de crear un nou tema i difondre'l amb la publicació que has triat. - other: Estàs a punt de crear un nou tema i difondre'l amb les {{count}} publicacions que has triat. + one: "Estàs a punt de crear un nou tema i difondre'l amb la publicació que has triat." + other: "Estàs a punt de crear un nou tema i difondre'l amb les {{count}} publicacions que has triat." merge_topic: title: "Mou a un tema existent" action: "mou a un tema existent" error: "Hi ha hagut una errada en moure publicacions a aquest tema." instructions: - one: Si us plau, tria el tema al qual t'agradaria moure aquesta publicació. - other: Si us plau, tria el tema al qual t'agradaria moure aquestes {{count}} publicacions. + one: "Si us plau, tria el tema al qual t'agradaria moure aquesta publicació." + other: "Si us plau, tria el tema al qual t'agradaria moure aquestes {{count}} publicacions." merge_posts: title: "Uneix les publicacions seleccionades" action: "uneix les publicacions seleccionades" @@ -1435,8 +1428,8 @@ ca: label: "Nova persona propietària de les publicacions" placeholder: "identitat de la nova persona propietària" instructions: - one: Si us plau, selecciona la nova persona propietària de la publicació per {{old_user}}. - other: Si us plau, selecciona la nova persona propietària de les {{count}} publicacions per {{old_user}}. + one: "Si us plau, selecciona la nova persona propietària de la publicació per {{old_user}}." + other: "Si us plau, selecciona la nova persona propietària de les {{count}} publicacions per {{old_user}}." change_timestamp: action: "canvia la marca de temps" invalid_timestamp: "La hi haurà marca en el futur." @@ -1451,7 +1444,7 @@ ca: deselect_all: desmarca-ho tot description: one: Has seleccionat 1 publicació - other: Has seleccionat {{count}} publicacions. + other: "Has seleccionat {{count}} publicacions." post: quote_reply: "Cita" edit_reason: "Motiu:" @@ -1465,26 +1458,26 @@ ca: show_full: "Mostra la publicació sencera" show_hidden: 'Mostra el contingut amagat.' deleted_by_author: - one: (publicació retirada per la persona autora, s'esborrarà automàticament en 1 hora, si no és marcada amb bandera) - other: (publicació retirada per la persona autora, s'esborrarà automàticament en %{count} hores, si no és marcada amb bandera) + one: "(publicació retirada per la persona autora, s'esborrarà automàticament en 1 hora, si no és marcada amb bandera)" + other: "(publicació retirada per la persona autora, s'esborrarà automàticament en %{count} hores, si no és marcada amb bandera)" expand_collapse: "eixampla/contrau" gap: - one: mira 1 resposta amagada - other: mira {{count}} respostes amagades + one: "mira 1 resposta amagada" + other: "mira {{count}} respostes amagades" unread: "Publicació no llegida" has_replies: - one: '{{count}} Resposta' - other: '{{count}} Respostes' + one: "{{count}} Resposta" + other: "{{count}} Respostes" has_likes: - one: '{{count}} M''agrada' - other: '{{count}} M''agrades' + one: "{{count}} M'agrada" + other: "{{count}} M'agrades" has_likes_title: - one: La publicació agrada a 1 persona - other: La publicació agrada a {{count}} persones + one: "La publicació agrada a 1 persona" + other: "La publicació agrada a {{count}} persones" has_likes_title_only_you: "t'ha agradat aquesta publicació" has_likes_title_you: - one: La publicació t'agrada a tu i a 1 persona - other: La publicació t'agrada a tu i a {{count}} persones + one: "La publicació t'agrada a tu i a 1 persona" + other: "La publicació t'agrada a tu i a {{count}} persones" errors: create: "Disculpa, s'ha produït una errada en crear la teva publicació. Si us plau, torna-ho a provar." edit: "Disculpa, s'ha produït una errada en editar la teva publicació. Si us plau, torna-ho a provar." @@ -1536,7 +1529,6 @@ ca: inappropriate: "Desfés bandera" bookmark: "Desfés preferit" like: "Desfés m'agrada" - vote: "Desfés votar" people: off_topic: "Marca amb bandera de fora de context" spam: "Marca amb bandera de brossa" @@ -1545,7 +1537,6 @@ ca: notify_user: "missatge enviat" bookmark: "marcat com a preferit" like: "ha agradat" - vote: "votat per això" by_you: off_topic: "Ho has marcat amb bandera de fora de context" spam: "Ho has marcat amb bandera de brossa" @@ -1554,57 +1545,50 @@ ca: notify_user: "Has enviat un missatge a aquesta persona" bookmark: "Has marcat aquesta publicació com a preferit" like: "Això t'ha agradat" - vote: "Has votat per aquesta publicació" by_you_and_others: off_topic: - one: Tu i 1 altra persona més heu marcat això amb bandera de fora de context - other: Tu i {{count}} persones més heu marcat això amb bandera de fora de context + one: "Tu i 1 altra persona més heu marcat això amb bandera de fora de context" + other: "Tu i {{count}} persones més heu marcat això amb bandera de fora de context" spam: - one: Tu i 1 persona més heu marcat això amb bandera de brossa - other: Tu i {{count}} persones més heu marcat això amb bandera de brossa + one: "Tu i 1 persona més heu marcat això amb bandera de brossa" + other: "Tu i {{count}} persones més heu marcat això amb bandera de brossa" inappropriate: - one: Tu i 1 persona més heu marcat això amb bandera d'inapropiat - other: Tu i {{count}} persones més heu marcat això amb bandera d'inapropiat + one: "Tu i 1 persona més heu marcat això amb bandera d'inapropiat" + other: "Tu i {{count}} persones més heu marcat això amb bandera d'inapropiat" notify_moderators: - one: Tu i 1 persona més heu marcat això amb bandera per moderar - other: Tu i {{count}} persones més heu marcat això amb bandera per moderar + one: "Tu i 1 persona més heu marcat això amb bandera per moderar" + other: "Tu i {{count}} persones més heu marcat això amb bandera per moderar" notify_user: - one: Tu i 1 persona més li heu enviat un missatge - other: Tu i {{count}} persones més li heu enviat un missatge + one: "Tu i 1 persona més li heu enviat un missatge" + other: "Tu i {{count}} persones més li heu enviat un missatge" bookmark: - one: Tu i 1 persona més heu marcat aquesta publicació com a preferit - other: Tu i {{count}} persones més heu marcat aquesta publicació com a preferit + one: "Tu i 1 persona més heu marcat aquesta publicació com a preferit" + other: "Tu i {{count}} persones més heu marcat aquesta publicació com a preferit" like: - one: Aquesta publicació us ha agradat a tu i a 1 persona més - other: Aquesta publicació us ha agradat a tu i a {{count}} persones més - vote: - one: Tu i 1 persona més heu votat per aquesta publicació - other: Tu i {{count}} persones més heu votat per aquesta publicació + one: "Aquesta publicació us ha agradat a tu i a 1 persona més" + other: "Aquesta publicació us ha agradat a tu i a {{count}} persones més" by_others: off_topic: - one: 1 person ha marcat aquesta publicació amb bandera de fora de context - other: '{{count}} persones han marcat aquesta publicació amb bandera de fora de context' + one: "1 person ha marcat aquesta publicació amb bandera de fora de context" + other: "{{count}} persones han marcat aquesta publicació amb bandera de fora de context" spam: - one: 1 persona ha marcat aquesta publicació amb bandera de brossa - other: '{{count}} persones han marcat aquesta publicació amb bandera de brossa' + one: "1 persona ha marcat aquesta publicació amb bandera de brossa" + other: "{{count}} persones han marcat aquesta publicació amb bandera de brossa" inappropriate: - one: 1 persona ha marcat aquesta publicació amb bandera d'inapropiat - other: '{{count}} persones han marcat aquesta publicació amb bandera d''inapropiat' + one: "1 persona ha marcat aquesta publicació amb bandera d'inapropiat" + other: "{{count}} persones han marcat aquesta publicació amb bandera d'inapropiat" notify_moderators: - one: 1 persona ha marcat aquesta publicació per moderar - other: '{{count}} persones han marcat aquesta publicació per moderar' + one: "1 persona ha marcat aquesta publicació per moderar" + other: "{{count}} persones han marcat aquesta publicació per moderar" notify_user: - one: 1 ha enviat un missatge a aquesta persona - other: '{{count}} han enviat un missatge a aquesta persona' + one: "1 ha enviat un missatge a aquesta persona" + other: "{{count}} han enviat un missatge a aquesta persona" bookmark: - one: 1 persona ha marcat aquesta publicació com a preferit - other: '{{count}} persones han marcat aquesta publicació com a preferit' + one: "1 persona ha marcat aquesta publicació com a preferit" + other: "{{count}} persones han marcat aquesta publicació com a preferit" like: - one: això ha agradat a 1 persona - other: això ha agradat a {{count}} persones - vote: - one: 1 persona ha votat per aquesta publicació - other: '{{count}} persones han votat per aquesta publicació' + one: "això ha agradat a 1 persona" + other: "això ha agradat a {{count}} persones" revisions: controls: first: "Primera revisió" @@ -1631,7 +1615,6 @@ ca: can: 'pot… ' none: '(sense categoria)' all: 'Totes les categories' - choose: 'Tria una categoria…' edit: 'edita' edit_long: "Edita" view: 'Mira temes per categories' @@ -1678,13 +1661,11 @@ ca: mailinglist_mirror: "La categoria replica una llista de correu" show_subcategory_list: "Mostrar les publicacions de les subcategories llistades a continuació d'aquesta categoria." subcategory_num_featured_topics: "Nombre de temes destacats en la pàgina mare de la categoria:" - all_topics_wiki: "Fes nou temes de wiki per defecte." subcategory_list_style: "Estil de llista de la subcategoria:" allow_badges_label: "Permet concedir distintius dins aquesta categoria" edit_permissions: "Edita permisos" add_permission: "Afegeix permisos" this_year: "aquest any" - position: "posició" default_position: "Posició per defecte" position_disabled: "Les categories es mostraran per ordre d'activitat. Per controlar l'ordre de les categories en llistes, " position_disabled_click: 'activa la configuració "posicions fixes de categories"' @@ -1740,14 +1721,14 @@ ca: custom_placeholder_notify_moderators: "Deixa'ns saber que t'amoïna i passa'ns tants enllaços rellevants i exemples com sigui possible." custom_message: at_least: - one: introdueix almenys 1 caràcter - other: introdueix almenys {{count}} caràcters + one: "introdueix almenys 1 caràcter" + other: "introdueix almenys {{count}} caràcters" more: - one: 1 per anar... - other: '{{count}} per anar...' + one: "1 per anar..." + other: "{{count}} per anar..." left: - one: 1 restant - other: '{{count}} restants' + one: "1 restant" + other: "{{count}} restants" flagging_topic: title: "Gràcies per ajudar-nos a mantenir polida la nostra comunitat!" action: "Marca el tema amb bandera " @@ -1758,13 +1739,13 @@ ca: links_title: "Enllaços populars" links_shown: "mostra més enllaços..." clicks: - one: 1 clic - other: '%{count} clics' + one: "1 clic" + other: "%{count} clics" post_links: about: "eixampla més enllaços per a aquesta publicació" title: - one: 1 més - other: '%{count} més' + one: "1 més" + other: "%{count} més" topic_statuses: warning: help: "Aquest és un avís oficial." @@ -1798,22 +1779,22 @@ ca: original_post: "Publicació original" views: "Vistes" views_lowercase: - one: vista - other: vistes + one: "vista" + other: "vistes" replies: "Respostes" views_long: - one: aquest tema ha estat vist 1 cop - other: aquest tema ha estat vist {{number}} cops + one: "aquest tema ha estat vist 1 cop" + other: "aquest tema ha estat vist {{number}} cops" activity: "Activitat" likes: "Ha agradat" likes_lowercase: - one: agrada - other: Agrada + one: "agrada" + other: "Agrada" likes_long: "aquest tema ha agradat {{number}} cops" users: "Persones usuàries" users_lowercase: - one: persona usuària - other: persones usuàries + one: "persona usuària" + other: "persones usuàries" category_title: "Categoria" history: "Història" changed_by: "per {{author}}" @@ -1826,8 +1807,8 @@ ca: latest: title: "Darrers" title_with_count: - one: Darrer (1) - other: Darrers ({{count}}) + one: "Darrer (1)" + other: "Darrers ({{count}})" help: "temes amb publicacions recents" hot: title: "Candent" @@ -1845,21 +1826,21 @@ ca: unread: title: "No llegits" title_with_count: - one: No llegit (1) - other: No llegits ({{count}}) + one: "No llegit (1)" + other: "No llegits ({{count}})" help: "temes que estàs mirant o seguint amb publicacions no llegides" lower_title_with_count: - one: 1 no llegit - other: '{{count}} no llegits' + one: "1 no llegit" + other: "{{count}} no llegits" new: lower_title_with_count: - one: 1 nou - other: '{{count}} nous' + one: "1 nou" + other: "{{count}} nous" lower_title: "nou" title: "Nous" title_with_count: - one: Nou (1) - other: Nous ({{count}}) + one: "Nou (1)" + other: "Nous ({{count}})" help: "temes creats durant els darrers dies" posted: title: "Les meves publicacions" @@ -1870,8 +1851,8 @@ ca: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "darrers temes a la categoria {{categoryName}} " top: title: "Més actius" @@ -1955,20 +1936,20 @@ ca: print: 'ctrl+p Imprimeix tema' badges: earned_n_times: - one: Ha rebut distintiu 1 cop - other: Ha rebut distintiu %{count} cops + one: "Ha rebut distintiu 1 cop" + other: "Ha rebut distintiu %{count} cops" granted_on: "Concedit %{date}" others_count: "Altres amb aquest distintiu (%{count})" title: Distintius badge_count: - one: 1 Distintiu - other: '%{count} Distintius' + one: "1 Distintiu" + other: "%{count} Distintius" more_badges: - one: +1 Més - other: +%{count} Més + one: "+1 Més" + other: "+%{count} Més" granted: - one: 1 concedit - other: '%{count} concedits' + one: "1 concedit" + other: "%{count} concedits" select_badge_for_title: Tria un distintiu per fer-lo servir com al teu títol badge_grouping: getting_started: @@ -2158,7 +2139,7 @@ ca: delete_confirm: "Esborra aquest grup?" delete_failed: "Impossible esborrar aquest grup. Si és un grup automàtic, no pot ser destruït." delete_owner_confirm: "Esborra privilegis propietaris per a '%{username}'?" - add: "Afegegix" + add: "Afegeix" custom: "Personalitza" automatic: "Automàtic" group_owners: Persones propietàries @@ -2225,11 +2206,11 @@ ca: none: "No hi ha esdeveniments relacionats" redeliver: "Relliura" incoming: - one: Hi ha un nou esdeveniment. - other: Hi ha {{count}} esdeveniments nous. + one: "Hi ha un nou esdeveniment." + other: "Hi ha {{count}} esdeveniments nous." completed_in: - one: Completat en 1 segon. - other: Completat en {{count}} segons. + one: "Completat en 1 segon." + other: "Completat en {{count}} segons." request: "Sol·licita" response: "Reacció" redeliver_confirm: "Segur que vols tornar a lliurar la mateixa càrrega útil?" @@ -2342,6 +2323,23 @@ ca: none_selected: "Tria un esborrany de correu per començar a editar." revert: "Reverteix canvis" revert_confirm: "Segur que vols revertir els teus canvis?" + theme: + edit: "Edita" + settings: "Configuracions" + license: "Llicència" + add: "Afegeix" + scss: + text: "CSS" + header: + text: "Capçalera" + after_header: + text: "Després de la capçalera" + footer: + text: "Peu" + body_tag: + text: "" + yaml: + text: "YAML" colors: title: "Colors" long_title: "Esquemes de color" @@ -2444,7 +2442,6 @@ ca: address_placeholder: "name@example.com" type_placeholder: "resum, registre..." reply_key_placeholder: "clau de resposta" - skipped_reason_placeholder: "motiu" logs: title: "Registres" action: "Acció" @@ -2462,6 +2459,8 @@ ca: block: "bloca" do_nothing: "no facis res" staff_actions: + all: "tot" + filter: "Filtre:" title: "Accions d'equip" clear_filters: "Mostra-ho tot" staff_user: "Persona de l'equip" @@ -2536,13 +2535,16 @@ ca: form: label: "Nou:" ip_address: "Adreça IP" - add: "Afegegix" + add: "Afegeix" filter: "Cerca" roll_up: text: "Enrotlla" title: "Crea entrades prohibides d'una nova subxarxa si com a mínim hi ha 'min_ban_entries_for_roll_up' entrades." logster: title: "Error de registres" + watched_words: + form: + add: 'Afegeix' impersonate: title: "Suplanta" help: "Fes servir aquesta eina per suplantar comptes amb l'objectiu de depurar. Hauràs de desconnectar quan acabis." @@ -2565,11 +2567,11 @@ ca: suspect: 'Sospita' approved: "Aprovat?" approved_selected: - one: Aprova persona usuària - other: Aprova persones usuàries ({{count}}) + one: "Aprova persona usuària" + other: "Aprova persones usuàries ({{count}})" reject_selected: - one: Refusa persona usuària - other: Refusa persones usuàries ({{count}}) + one: "Refusa persona usuària" + other: "Refusa persones usuàries ({{count}})" titles: active: 'Persones usuàries actives' new: 'Nova persones usuàries' @@ -2585,11 +2587,11 @@ ca: suspended: 'Persones usuàries suspeses' suspect: 'Persones usuàries sospitoses' reject_successful: - one: 1 persona usuària refusada amb èxit - other: '%{count} persones usuàries refusades amb èxit' + one: "1 persona usuària refusada amb èxit" + other: "%{count} persones usuàries refusades amb èxit" reject_failures: - one: Ha fallat en refusar 1 persona usuària. - other: Ha fallat en refusar %{count} persones usuàries. + one: "Ha fallat en refusar 1 persona usuària." + other: "Ha fallat en refusar %{count} persones usuàries." not_verified: "No verificat" check_email: title: "Mostra correu electrònic d'aquesta persona" @@ -2601,7 +2603,9 @@ ca: suspend_reason_label: "Per què suspens aquesta persona? Aquest text serà visible per a tothom a la pàgina del seu perfil i es mostrarà quan aquesta persona s'hi vulgui connectar. Fes-ho breu." suspend_reason: "Motiu" suspended_by: "Persona suspesa per" + silence_reason: "Raó" delete_all_posts: "Esborra totes les publicacions" + penalty_post_edit: "Edita l'entrada" delete_all_posts_confirm_MF: "Estàs a punt d'esborrar {POSTS, plural, one {1 publicació} other {# publicacions}} i {TOPICS, plural, one {1 tema} other {# temes}}. Segur?" moderator: "Moderador?" admin: "Admin?" @@ -2648,14 +2652,14 @@ ca: delete_forbidden_because_staff: "No es poden esborrar les persones administradores i moderadores." delete_posts_forbidden_because_staff: "No es poden esborrar totes les publicacions de les persones administradores i moderadores." delete_forbidden: - one: No es poden esborrar les persones usuàries si tenen publicacions. Esborra totes les publicacions abans d'eliminar una persona usuària. (No es poden esborrar les publicacions amb més d'%{count} dia) - other: No es poden esborrar les persones usuàries si tenen publicacions. Esborra totes les publicacions abans d'eliminar una persona usuària. (No es poden esborrar les publicacions amb més de %{count} dies) + one: "No es poden esborrar les persones usuàries si tenen publicacions. Esborra totes les publicacions abans d'eliminar una persona usuària. (No es poden esborrar les publicacions amb més d'%{count} dia)" + other: "No es poden esborrar les persones usuàries si tenen publicacions. Esborra totes les publicacions abans d'eliminar una persona usuària. (No es poden esborrar les publicacions amb més de %{count} dies)" cant_delete_all_posts: - one: No es poden esborrar totes les publicacions. Algunes publicacions tenen més d'%{count} dia. (La configuració delete_user_max_post_age) - other: No es poden esborrar totes les publicacions. Algunes publicacions tenen més de %{count} dies. (La configuració delete_user_max_post_age) + one: "No es poden esborrar totes les publicacions. Algunes publicacions tenen més d'%{count} dia. (La configuració delete_user_max_post_age)" + other: "No es poden esborrar totes les publicacions. Algunes publicacions tenen més de %{count} dies. (La configuració delete_user_max_post_age)" cant_delete_all_too_many_posts: - one: No es poden esborrar totes les publicacions perquè la persona usuària té més d'1 publicació. (delete_all_posts_max) - other: No es poden esborrar totes les publicacions perquè la persona usuària té més de %{count} publicacions. (delete_all_posts_max) + one: "No es poden esborrar totes les publicacions perquè la persona usuària té més d'1 publicació. (delete_all_posts_max)" + other: "No es poden esborrar totes les publicacions perquè la persona usuària té més de %{count} publicacions. (delete_all_posts_max)" delete_confirm: "Segur que vols esborrar aquesta persona? Això és permanent!" delete_and_block: "Esborra i bloca aquest correu electrònic i adreça IP" delete_dont_block: "Només esborra" @@ -2690,8 +2694,8 @@ ca: tl3_requirements: title: "Requisits per al nivell de confiança 3" table_title: - one: 'durant el darrer dia:' - other: 'durant els darrers %{count} dies:' + one: "durant el darrer dia:" + other: "durant els darrers %{count} dies:" value_heading: "Valor" requirement_heading: "Requisit" visits: "Visites" @@ -2765,6 +2769,8 @@ ca: go_back: "Torna a la cerca" recommended: "Recomanem personalitzar el següent text segons les teves necessitats:" show_overriden: 'Només mostra anul·lat' + settings: + none: 'cap' site_settings: title: 'Configuració' no_results: "Sense resultats" @@ -2788,6 +2794,7 @@ ca: developer: 'Desenvolupador' embedding: "Incrustant" legal: "Legal" + api: 'API' user_api: 'API de persona usuària' uncategorized: 'Altres' backups: "Còpies de seguretat" @@ -2856,8 +2863,8 @@ ca: text: "Hi ha mostres perdudes de concessions. Això passa quan la consulta de distintius retorna ID de persona usuària o de publicacions que no existeixen. Després això pot provocar resultats inesperats - si us plau, torna a revisar la teva consulta." no_grant_count: "No hi ha distintius per assignar." grant_count: - one: 1 distintiu per assignar. - other: %{count} distintius per assignar. + one: "1 distintiu per assignar." + other: "%{count} distintius per assignar." sample: "Exemple:" grant: with: "%{username}" @@ -2910,7 +2917,7 @@ ca: delete_confirm: "Segur que vols esborrar aquest enllaç permanent?" form: label: "Nou:" - add: "Afegegix" + add: "Afegeix" filter: "Cerca (URL o URL externa)" wizard_js: wizard: @@ -2922,7 +2929,7 @@ ca: uploading: "Actualitzant..." quit: "Potser més tard" invites: - add_user: "afegegix" + add_user: "afegeix" none_added: "No hi has convidat cap equip. Segur que vols continuar?" roles: admin: "Admin" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 67e5c43984..3147b2fc10 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -16,9 +16,9 @@ cs: format: '%n %u' units: byte: + one: bajt few: bajty many: bajtů - one: bajt other: bajtů gb: GB kb: kB @@ -45,106 +45,106 @@ cs: tiny: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - many: < %{count}s - one: < 1s - other: < %{count}s + one: "< 1s" + few: "< %{count}s" + many: "< %{count}s" + other: "< %{count}s" x_seconds: - few: '%{count}s' - many: '%{count}s' - one: 1s - other: '%{count}s' + one: "1s" + few: "%{count}s" + many: "%{count}s" + other: "%{count}s" less_than_x_minutes: - few: < %{count}m - many: < %{count}m - one: < 1m - other: < %{count}m + one: "< 1m" + few: "< %{count}m" + many: "< %{count}m" + other: "< %{count}m" x_minutes: - few: '%{count}m' - many: '%{count}m' - one: 1m - other: '%{count}m' + one: "1m" + few: "%{count}m" + many: "%{count}m" + other: "%{count}m" about_x_hours: - few: '%{count}h' - many: '%{count}h' - one: 1h - other: '%{count}h' + one: "1h" + few: "%{count}h" + many: "%{count}h" + other: "%{count}h" x_days: - few: '%{count}d' - many: '%{count}d' - one: 1d - other: '%{count}d' + one: "1d" + few: "%{count}d" + many: "%{count}d" + other: "%{count}d" x_months: - few: '%{count} mÄ›síce' - many: '%{count} mÄ›síců' - one: 1 mÄ›síc - other: '%{count} mÄ›síců' + one: "1 mÄ›síc" + few: "%{count} mÄ›síce" + many: "%{count} mÄ›síců" + other: "%{count} mÄ›síců" about_x_years: - few: '%{count}r' - many: '%{count}let' - one: 1r - other: '%{count}let' + one: "1r" + few: "%{count}r" + many: "%{count}let" + other: "%{count}let" over_x_years: - few: '> %{count}r' - many: '> %{count}let' - one: '> 1r' - other: '> %{count}let' + one: "> 1r" + few: "> %{count}r" + many: "> %{count}let" + other: "> %{count}let" almost_x_years: - few: '%{count}r' - many: '%{count}let' - one: 1r - other: '%{count}let' + one: "1r" + few: "%{count}r" + many: "%{count}let" + other: "%{count}let" date_month: "D. MMMM" date_year: "MMMM YYYY" medium: x_minutes: - few: '%{count} minuty' - many: '%{count} minut' - one: 1 minuta - other: '%{count} minut' + one: "1 minuta" + few: "%{count} minuty" + many: "%{count} minut" + other: "%{count} minut" x_hours: - few: '%{count} hodiny' - many: '%{count} hodin' - one: 1 hodina - other: '%{count} hodin' + one: "1 hodina" + few: "%{count} hodiny" + many: "%{count} hodin" + other: "%{count} hodin" x_days: - few: '%{count} dny' - many: '%{count} dní' - one: 1 den - other: '%{count} dní' + one: "1 den" + few: "%{count} dny" + many: "%{count} dní" + other: "%{count} dní" date_year: "D. M. YYYY" medium_with_ago: x_minutes: - few: pÅ™ed %{count} minutami - many: pÅ™ed %{count} minutami - one: pÅ™ed 1 minutou - other: pÅ™ed %{count} minutami + one: "pÅ™ed 1 minutou" + few: "pÅ™ed %{count} minutami" + many: "pÅ™ed %{count} minutami" + other: "pÅ™ed %{count} minutami" x_hours: - few: pÅ™ed %{count} hodinami - many: pÅ™ed %{count} hodinami - one: pÅ™ed 1 hodinou - other: pÅ™ed %{count} hodinami + one: "pÅ™ed 1 hodinou" + few: "pÅ™ed %{count} hodinami" + many: "pÅ™ed %{count} hodinami" + other: "pÅ™ed %{count} hodinami" x_days: - few: pÅ™ed %{count} dny - many: pÅ™ed %{count} dny - one: pÅ™ed 1 dnem - other: pÅ™ed %{count} dny + one: "pÅ™ed 1 dnem" + few: "pÅ™ed %{count} dny" + many: "pÅ™ed %{count} dny" + other: "pÅ™ed %{count} dny" later: x_days: - few: za %{count} dny - many: o %{count} dní pozdÄ›ji - one: za 1 den - other: o %{count} dní pozdÄ›ji + one: "za 1 den" + few: "za %{count} dny" + many: "o %{count} dní pozdÄ›ji" + other: "o %{count} dní pozdÄ›ji" x_months: - few: za %{count} mÄ›síce - many: o %{count} mÄ›síců pozdÄ›ji - one: za 1 mÄ›síc - other: o %{count} mÄ›síců pozdÄ›ji + one: "za 1 mÄ›síc" + few: "za %{count} mÄ›síce" + many: "o %{count} mÄ›síců pozdÄ›ji" + other: "o %{count} mÄ›síců pozdÄ›ji" x_years: - few: za %{count} roků - many: o %{count} let pozdÄ›ji - one: za 1 rok - other: o %{count} let pozdÄ›ji + one: "za 1 rok" + few: "za %{count} roků" + many: "o %{count} let pozdÄ›ji" + other: "o %{count} let pozdÄ›ji" previous_month: 'PÅ™edchozí mÄ›síc' next_month: 'Další mÄ›síc' placeholder: datum @@ -227,15 +227,15 @@ cs: show_help: "možnosti" links: "Odkazy" links_lowercase: - few: odkazy - many: odkazů - one: odkaz - other: odkazů + one: "odkaz" + few: "odkazy" + many: "odkazů" + other: "odkazů" faq: "FAQ" guidelines: "Pokyny" privacy_policy: "Ochrana soukromí" privacy: "Soukromí" - terms_of_service: "Podmínky používání" + tos: "Podmínky používání" mobile_view: "Mobilní verze" desktop_view: "Plná verze" you: "Vy" @@ -254,10 +254,10 @@ cs: max_of_count: "max z" alternation: "nebo" character_count: - few: '{{count}} znaky' - many: '{{count}} znaků' - one: '{{count}} znak' - other: '{{count}} znaků' + one: "{{count}} znak" + few: "{{count}} znaky" + many: "{{count}} znaků" + other: "{{count}} znaků" suggested_topics: title: "DoporuÄená témata" pm_title: "DoporuÄené zprávy" @@ -269,6 +269,8 @@ cs: our_moderators: "NaÅ¡i ModerátoÅ™i" stat: all_time: "Za celou dobu" + last_7_days: "Posledních 7" + last_30_days: "Posledních 30" like_count: "Líbí se" topic_count: "Témata" post_count: "PříspÄ›vky" @@ -290,20 +292,20 @@ cs: remove: "Odstranit záložku" confirm_clear: "Opravdu chcete odstranit vÅ¡echny záložky z tohoto tématu?" topic_count_latest: - few: Zobrazit {{count}} nová nebo upravená témata - many: Zobrazit {{count}} nových nebo upravených témat - one: Zobrazit {{count}} nové nebo upravené téma - other: Zobrazit {{count}} nových nebo upravených témat + one: "Zobrazit {{count}} nové nebo upravené téma" + few: "Zobrazit {{count}} nová nebo upravená témata" + many: "Zobrazit {{count}} nových nebo upravených témat" + other: "Zobrazit {{count}} nových nebo upravených témat" topic_count_unread: - few: Zobrazit {{count}} nepÅ™eÄtená témata - many: Zobrazit {{count}} nepÅ™eÄtených témat - one: Zobrazit {{count}} nepÅ™eÄtené téma - other: Zobrazit {{count}} nepÅ™eÄtených témat + one: "Zobrazit {{count}} nepÅ™eÄtené téma" + few: "Zobrazit {{count}} nepÅ™eÄtená témata" + many: "Zobrazit {{count}} nepÅ™eÄtených témat" + other: "Zobrazit {{count}} nepÅ™eÄtených témat" topic_count_new: - few: Zobrazit {{count}} nová témata - many: Zobrazit {{count}} nových témat - one: Zobrazit {{count}} nové téma - other: Zobrazit {{count}} nových témat + one: "Zobrazit {{count}} nové téma" + few: "Zobrazit {{count}} nová témata" + many: "Zobrazit {{count}} nových témat" + other: "Zobrazit {{count}} nových témat" preview: "ukázka" cancel: "zruÅ¡it" save: "Uložit zmÄ›ny" @@ -341,20 +343,20 @@ cs: cancel: "ZruÅ¡it" view_pending: "zobrazit příspÄ›vky Äekající na schválení" has_pending_posts: - few: Toto téma má {{count}} příspÄ›vky, které Äekají na schválení. - many: Toto téma má {{count}} příspÄ›vků, které Äekají na schválení. - one: Toto téma má 1 příspÄ›vek, který Äeká na schválení. - other: Toto téma má {{count}} příspÄ›vků, které Äekají na schválení. + one: "Toto téma má 1 příspÄ›vek, který Äeká na schválení." + few: "Toto téma má {{count}} příspÄ›vky, které Äekají na schválení." + many: "Toto téma má {{count}} příspÄ›vků, které Äekají na schválení." + other: "Toto téma má {{count}} příspÄ›vků, které Äekají na schválení." confirm: "Uložit zmÄ›ny" delete_prompt: "Jste si jistí, že chcete smazat uživatele %{username}? Tímto smažete vÅ¡echny jejich příspÄ›vky a zablokujete jejich emailovou a IP addresu." approval: title: "PříspÄ›vek potÅ™ebuje schválení" description: "Obdrželi jsme váš příspÄ›vek, ale musí být pÅ™ed zveÅ™ejnÄ›ním schválen moderátorem. BuÄte trpÄ›liví." pending_posts: - few: Máte {{count}} příspÄ›vků ke schválení. - many: Máte {{count}} příspÄ›vků ke schválení. - one: Máte 1 příspÄ›vek ke schválení. - other: Máte {{count}} příspÄ›vků ke schválení. + one: "Máte 1 příspÄ›vek ke schválení." + few: "Máte {{count}} příspÄ›vků ke schválení." + many: "Máte {{count}} příspÄ›vků ke schválení." + other: "Máte {{count}} příspÄ›vků ke schválení." ok: "OK" user_action: user_posted_topic: "{{user}} zaslal téma" @@ -388,10 +390,10 @@ cs: posts_read: "PÅ™eÄteno" posts_read_long: "PříspÄ›vků pÅ™eÄteno" total_rows: - few: '%{count} uživatelé' - many: '%{count} uživatelů' - one: 1 uživatel - other: '%{count} uživatelů' + one: "1 uživatel" + few: "%{count} uživatelé" + many: "%{count} uživatelů" + other: "%{count} uživatelů" group_histories: actions: change_group_setting: "ZmÄ›nit nastavení skupiny" @@ -469,10 +471,10 @@ cs: is_group_user: "ÄŒlen" is_group_owner: "Vlastník" title: - few: Skupiny - many: Skupin - one: Skupina - other: Skupin + one: "Skupina" + few: "Skupiny" + many: "Skupin" + other: "Skupin" activity: "Aktivita" members: title: "ÄŒlenové" @@ -532,17 +534,15 @@ cs: "12": "Odeslané zprávy" "13": "PÅ™ijaté zprávy" "14": "ÄŒeká na schválení" + "15": "Koncepty" categories: all: "vÅ¡echny kategorie" - all_subcategories: "vÅ¡echny v %{categoryName}" no_subcategory: "žádné" category: "Kategorie" category_list: "Zobrazit seznam kategorií" reorder: title: "PÅ™eÅ™adit kategorie" title_long: "PÅ™eorganizovat seznam kategorií" - fix_order: "Zafixovat umístÄ›ní" - fix_order_tooltip: "Ne vÅ¡echny kategorie mají jedineÄné Äíslo umístÄ›ni, což může způsobovat neÄekané následky." save: "Uložit poÅ™adí" apply_all: "Použít" position: "UmístÄ›ní" @@ -553,15 +553,15 @@ cs: toggle_ordering: "PÅ™epnout editaci poÅ™adí" subcategories: "Podkategorie" topic_sentence: - few: '%{count} témata' - many: '%{count} témat' - one: 1 téma - other: '%{count} témat' + one: "1 téma" + few: "%{count} témata" + many: "%{count} témat" + other: "%{count} témat" topic_stat_sentence: - few: '%{count} nová témata za posledních %{unit}.' - many: '%{count} nových témat za posledních %{unit}.' - one: '%{count} nové téma za posledních %{unit}.' - other: '%{count} nových témat za posledních %{unit}.' + one: "%{count} nové téma za posledních %{unit}." + few: "%{count} nová témata za posledních %{unit}." + many: "%{count} nových témat za posledních %{unit}." + other: "%{count} nových témat za posledních %{unit}." ip_lookup: title: Vyhledávání podle IP adresy hostname: Hostname @@ -724,7 +724,6 @@ cs: error: "DoÅ¡lo k chybÄ› pÅ™i pokusu zmÄ›nit tuto hodnotu." change_username: title: "ZmÄ›nit uživatelské jméno" - confirm: "Pokud si zmÄ›níte vaÅ¡e uživatelské jméno, vÅ¡echny pÅ™echozí citace vaÅ¡ich příspÄ›vků a zmínky vaÅ¡eho @jména budou rozbité. Jste si absolutnÄ› jistý, že chcete potvrdit toto operaci?" taken: "Toto uživatelské jméno je již zabrané." invalid: "Uživatelské jméno je neplatné. Musí obsahovat pouze písmena a Äíslice." change_email: @@ -745,7 +744,6 @@ cs: upload_title: "Nahrát obrázek" upload_picture: "Nahrát obrázek" image_is_not_a_square: "Varování: Ořízli jsme váš obrázek; šířka a délka nebyla stejná." - cache_notice: "ÚspěšnÄ› jste zmÄ›nili váš profilový obrázek, ale chvíli může trvat, než se zobrazí kvůli ukládání v mezipamÄ›ti prohlížeÄe. " change_profile_background: title: "Pozadí profilu" instructions: "Pozadí profilu je zarovnáno doprostÅ™ed a má výchozí šířku 850px." @@ -760,10 +758,10 @@ cs: authenticated: "VaÅ¡e emailová adresa byla autorizována pÅ™es službu {{provider}}." frequency_immediately: "Pokud jste obsah dosud neÄetli, poÅ¡leme vám ho ihned emailem." frequency: - few: Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem posledních {{count}} minut. - many: Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem posledních {{count}} minut. - one: Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem poslední minuty. - other: Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem posledních {{count}} minut. + one: "Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem poslední minuty." + few: "Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem posledních {{count}} minut." + many: "Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem posledních {{count}} minut." + other: "Email vám zaÅ¡leme pouze pokud jste se neukázali bÄ›hem posledních {{count}} minut." name: title: "Jméno" instructions: "vaÅ¡e celé jméno (nepovinné)" @@ -849,10 +847,10 @@ cs: sent: "Odeslané" none: "Nejsou žádné pozvánky k zobrazení." truncated: - few: Zobrazeno prvních {{count}} pozvánek. - many: Zobrazeno prvních {{count}} pozvánek. - one: Zobrazena první pozvánka. - other: Zobrazeno prvních {{count}} pozvánek. + one: "Zobrazena první pozvánka." + few: "Zobrazeno prvních {{count}} pozvánek." + many: "Zobrazeno prvních {{count}} pozvánek." + other: "Zobrazeno prvních {{count}} pozvánek." redeemed: "UplatnÄ›né pozvánky" redeemed_tab: "UplatnÄ›no" redeemed_tab_with_count: "Vyřízeno ({{count}})" @@ -899,45 +897,45 @@ cs: time_read: "naÄteno" recent_time_read: "poslední Äas Ätení" topic_count: - few: témata vytvoÅ™ena - many: témat vytvoÅ™eno - one: téma vytvoÅ™eno - other: témat vytvoÅ™eno + one: "téma vytvoÅ™eno" + few: "témata vytvoÅ™ena" + many: "témat vytvoÅ™eno" + other: "témat vytvoÅ™eno" post_count: - few: příspÄ›vky vytvoÅ™eny - many: příspÄ›vků vytvoÅ™eno - one: příspÄ›vek vytvoÅ™en - other: příspÄ›vků vytvoÅ™eno + one: "příspÄ›vek vytvoÅ™en" + few: "příspÄ›vky vytvoÅ™eny" + many: "příspÄ›vků vytvoÅ™eno" + other: "příspÄ›vků vytvoÅ™eno" likes_given: - few: dány - many: dáno - one: dán - other: dáno + one: "dán" + few: "dány" + many: "dáno" + other: "dáno" likes_received: - few: obdrženy - many: obdrženo - one: obdržen - other: obdrženo + one: "obdržen" + few: "obdrženy" + many: "obdrženo" + other: "obdrženo" days_visited: - few: dny navÅ¡tíveno - many: dní navÅ¡tíveno - one: den navÅ¡tíven - other: dní navÅ¡tíveno + one: "den navÅ¡tíven" + few: "dny navÅ¡tíveno" + many: "dní navÅ¡tíveno" + other: "dní navÅ¡tíveno" topics_entered: - few: zobrazeny témata - many: zobrazeno témat - one: zobrazeno téma - other: zobrazeno témat + one: "zobrazeno téma" + few: "zobrazeny témata" + many: "zobrazeno témat" + other: "zobrazeno témat" posts_read: - few: pÅ™eÄteny příspÄ›vky - many: pÅ™eÄteno příspÄ›vků - one: pÅ™eÄten příspÄ›vek - other: pÅ™eÄteno příspÄ›vků + one: "pÅ™eÄten příspÄ›vek" + few: "pÅ™eÄteny příspÄ›vky" + many: "pÅ™eÄteno příspÄ›vků" + other: "pÅ™eÄteno příspÄ›vků" bookmark_count: - few: záložky - many: záložek - one: záložka - other: záložek + one: "záložka" + few: "záložky" + many: "záložek" + other: "záložek" top_replies: "NejnovÄ›jší příspÄ›vky" no_replies: "Zatím žádné odpovÄ›di." more_replies: "Více odpovÄ›dí" @@ -953,7 +951,6 @@ cs: most_liked_users: "Nejvíce \"to se mi líbí\"" most_replied_to_users: "Nejvíce odpovÄ›dí" no_likes: "Zatím žádné \"to se mi líbí\"" - associated_accounts: "PÅ™ihlášení" ip_address: title: "Poslední IP adresa" registration_ip_address: @@ -1006,10 +1003,10 @@ cs: reached: "%{relativeAge} – %{rate} dosáhlo limitu stránky, který je %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} pÅ™esahuje limit stránky, který je %{siteSettingRate}." rate: - few: '%{count} chyby/%{duration}' - many: '%{count} chyb/%{duration}' - one: 1 chyba/%{duration} - other: '%{count} chyb/%{duration}' + one: "1 chyba/%{duration}" + few: "%{count} chyby/%{duration}" + many: "%{count} chyb/%{duration}" + other: "%{count} chyb/%{duration}" learn_more: "více informací..." all_time: 'celkem' all_time_desc: 'témat vytvoÅ™eno' @@ -1030,17 +1027,15 @@ cs: time_read_recently_tooltip: '%{time_read}celkový Äas Ätení (%{recent_time_read}za posledních 60 dnů)' last_reply_lowercase: poslední odpovÄ›Ä replies_lowercase: + one: odpovÄ›Ä few: odpovÄ›di many: odpovÄ›dí - one: odpovÄ›Ä other: odpovÄ›dí signup_cta: sign_up: "Registrovat se" hide_session: "PÅ™ipomenout mi zítra" hide_forever: "dÄ›kuji, ne" hidden_for_session: "Dobrá, zeptám se tÄ› zítra. Pro založení úÄtu můžeÅ¡ také vždy použít 'PÅ™ihlásit se'." - intro: "Nazdar! :heart_eyes: Vypadá to, že si užíváš diskuzi, ale zatím jsi si nezaložil úÄet." - value_prop: "Pokud si založíš úÄet, budeme si pÅ™esnÄ› pamatovat, co jsi Äetl, takže se vždycky vrátíš do bodu, odkud jsi odeÅ¡el. Také budeÅ¡ dostávat upozornÄ›ní zde a pÅ™es e-mail, kdykoli pÅ™ibudou novÄ› příspÄ›vky. A můžeÅ¡ pÅ™idávat 'to se mi líbí' a šířit tak lásku. :heartbeat:" summary: enabled_description: "ÄŒtete shrnutí tohoto tématu: nejzajímavÄ›jší příspÄ›vky podle komunity." description: "Je tu {{replyCount}} odpovÄ›dí." @@ -1054,7 +1049,6 @@ cs: disable: "Zobrazit smazané příspÄ›vky" private_message_info: title: "Zpráva" - invite: "Pozvat další..." leave_message: "Opravdu chcete opustit tuto zprávu?" remove_allowed_user: "UrÄitÄ› chcete odstranit {{name}} z této zprávy?" remove_allowed_group: "Opravdu chcete odstranit {{name}} z této zprávy?" @@ -1118,25 +1112,28 @@ cs: preferences: "Pro to, aby jsi mohl mÄ›nit své uživatelské nastavení, se musíš pÅ™ihlásit." forgot: "Nevybavuju si podrobnosti svého úÄtu" not_approved: "Váš úÄet zatím nebyl schválen. Až se tak stane, obdržíte oznámení emailem a budete se moci pÅ™ihlásit." - google: - title: "pÅ™es Google" - message: "Autentizuji pÅ™es Google (ujistÄ›te se, že nemáte zablokovaná popup okna)" google_oauth2: + name: "Google" title: "pÅ™es Google" message: "PÅ™ihlaÅ¡ování pÅ™es Google (ujistÄ›te se že nemáte zaplé blokování pop up oken)" twitter: + name: "Twitter" title: "pÅ™es Twitter" message: "Autentizuji pÅ™es Twitter (ujistÄ›te se, že nemáte zablokovaná popup okna)" instagram: + name: "Instagram" title: "s Instagramem" message: "Autentizuji pres Instagram (ujistÄ›te se, že nemáte zablokovaná popup okna)" facebook: + name: "Facebook" title: "pÅ™es Facebook" message: "Autentizuji pÅ™es Facebook (ujistÄ›te se, že nemáte zablokovaná popup okna)" yahoo: + name: "Yahoo" title: "pÅ™es Yahoo" message: "Autentizuji pÅ™es Yahoo (ujistÄ›te se, že nemáte zablokovaná popup okna)" github: + name: "GitHub" title: "pÅ™es GitHub" message: "Autentizuji pÅ™es GitHub (ujistÄ›te se, že nemáte zablokovaná popup okna)" invites: @@ -1216,10 +1213,10 @@ cs: drafts_offline: "koncepty offline" group_mentioned_limit: "Varování! Zmínili jste {{group}}, ale protože má tato skupina více Älenů než je administrátorem nastavený limit maximálního poÄtu {{max}} uživatelů, kteří mohou být informováni, nebude informován nikdo." group_mentioned: - few: ZmínÄ›ním {{group}}, upozorníš {{count}} lidi – jste si jistý/á? - many: ZmínÄ›ním {{group}}, upozorníš {{count}} lidí – jste si jistý/á? - one: ZmínÄ›ním {{group}}, upozorníš 1 ÄlovÄ›ka – jste si jistý/á? - other: ZmínÄ›ním {{group}}, upozorníš {{count}} lidí – jste si jistý/á? + one: "ZmínÄ›ním {{group}}, upozorníš 1 ÄlovÄ›ka – jste si jistý/á?" + few: "ZmínÄ›ním {{group}}, upozorníš {{count}} lidi – jste si jistý/á?" + many: "ZmínÄ›ním {{group}}, upozorníš {{count}} lidí – jste si jistý/á?" + other: "ZmínÄ›ním {{group}}, upozorníš {{count}} lidí – jste si jistý/á?" cannot_see_mention: category: "Zmínili jste uživatele {{username}}, ale oznámení se mu nepoÅ¡le, protože nemá přístup do této kategorie. Budete jej muset pÅ™idat do skupiny, která má přístup do této kategorie." private: "Zmínili jste uživatele {{username}}, ale oznámení se mu nepoÅ¡le, protože tuto osobní zprávu nevidí. Musíte ho pozvat do této osobní konverzace." @@ -1292,6 +1289,7 @@ cs: body: "Nyní tuto zprávu posíláte pouze sám/sama sobÄ›!" admin_options_title: "Volitelné redakÄní nastavení tématu" composer_actions: + edit: Upravit reply_to_post: label: "OdpovÄ›dÄ›t na příspÄ›vek %{postNumber} od %{postUsername}" desc: OdpovÄ›dÄ›t na konkrétní příspÄ›vek @@ -1315,15 +1313,15 @@ cs: notifications: tooltip: regular: - few: '{{count}} nepÅ™eÄtená upozornÄ›ní' - many: '{{count}} nepÅ™eÄtených upozornÄ›ní' - one: 1 nepÅ™eÄtene upozornÄ›ní - other: '{{count}} nepÅ™eÄtených upozornÄ›ní' + one: "1 nepÅ™eÄtene upozornÄ›ní" + few: "{{count}} nepÅ™eÄtená upozornÄ›ní" + many: "{{count}} nepÅ™eÄtených upozornÄ›ní" + other: "{{count}} nepÅ™eÄtených upozornÄ›ní" message: - few: '{{count}} nepÅ™eÄtené zprávy' - many: '{{count}} nepÅ™eÄtených zpráv' - one: 1 nepÅ™eÄtená zpráva - other: '{{count}} nepÅ™eÄtených zpráv' + one: "1 nepÅ™eÄtená zpráva" + few: "{{count}} nepÅ™eÄtené zprávy" + many: "{{count}} nepÅ™eÄtených zpráv" + other: "{{count}} nepÅ™eÄtených zpráv" title: "oznámení o zmínkách pomocí @name, odpovÄ›di na vaÅ¡e příspÄ›vky a témata, zprávy, atd." none: "Notifikace nebylo možné naÄíst." empty: "Žádné upozornÄ›ní nenalezeny." @@ -1338,10 +1336,10 @@ cs: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - few: {{username}}, {{username2}} a {{count}} další {{description}} - many: {{username}}, {{username2}} a {{count}} dalších {{description}} - one: {{username}}, {{username2}} a 1 další {{description}} - other: {{username}}, {{username2}} a {{count}} dalších {{description}} + one: "{{username}}, {{username2}} a 1 další {{description}}" + few: "{{username}}, {{username2}} a {{count}} další {{description}}" + many: "{{username}}, {{username2}} a {{count}} dalších {{description}}" + other: "{{username}}, {{username2}} a {{count}} dalších {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1352,10 +1350,10 @@ cs: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nové téma {{description}}" group_message_summary: - few: '{{count}} zprávy ve schránce skupiny {{group_name}}' - many: '{{count}} zpráv ve schránce skupiny {{group_name}}' - one: '{{count}} zpráva ve schránce skupiny {{group_name}}' - other: '{{count}} zpráv ve schránce skupiny {{group_name}}' + one: "{{count}} zpráva ve schránce skupiny {{group_name}}" + few: "{{count}} zprávy ve schránce skupiny {{group_name}}" + many: "{{count}} zpráv ve schránce skupiny {{group_name}}" + other: "{{count}} zpráv ve schránce skupiny {{group_name}}" popup: mentioned: '{{username}} vás zmínil v "{{topic}}" - {{site_title}}' group_mentioned: 'Uživatel {{username}} vás zmínil v "{{topic}}" - {{site_title}}' @@ -1478,10 +1476,10 @@ cs: notification_level: "UpozornÄ›ní" choose_new_category: "Zvolte novou kategorii pro témata:" selected: - few: Vybrali jste {{count}} témata. - many: Vybrali jste {{count}} témat. - one: Vybrali jste 1 téma. - other: Vybrali jste {{count}} témat. + one: "Vybrali jste 1 téma." + few: "Vybrali jste {{count}} témata." + many: "Vybrali jste {{count}} témat." + other: "Vybrali jste {{count}} témat." change_tags: "ZamÄ›nit Å¡títky" append_tags: "PÅ™idat Å¡títky" choose_new_tags: "Zvolte nové tagy pro témata:" @@ -1514,10 +1512,10 @@ cs: search: "There are no more search results." topic: filter_to: - few: '{{count}} příspÄ›vky v tématu' - many: '{{count}} příspÄ›vků v tématu' - one: 1 příspÄ›vek v tématu - other: '{{count}} příspÄ›vků v tématu' + one: "1 příspÄ›vek v tématu" + few: "{{count}} příspÄ›vky v tématu" + many: "{{count}} příspÄ›vků v tématu" + other: "{{count}} příspÄ›vků v tématu" create: 'Nové téma' create_long: 'VytvoÅ™it nové téma' open_draft: "Otevřít koncept" @@ -1535,14 +1533,14 @@ cs: new: 'nové téma' unread: 'nepÅ™eÄtený' new_topics: + one: '1 nové téma' few: '{{count}} nová témata' many: '{{count}} nových témat' - one: 1 nové téma other: '{{count}} nových témat' unread_topics: + one: '1 nepÅ™eÄtené téma' few: '{{count}} nepÅ™eÄtená témata' many: '{{count}} nepÅ™eÄtených témat' - one: 1 nepÅ™eÄtené téma other: '{{count}} nepÅ™eÄtených témat' title: 'Téma' invalid_access: @@ -1556,25 +1554,25 @@ cs: title: "Téma nenalezeno" description: "Bohužel se nám nepovedlo najít toto téma. Nebylo odstranÄ›no moderátorem?" total_unread_posts: - few: máte {{count}} nepÅ™eÄtené příspÄ›vky v tomto tématu. - many: máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu. - one: máte 1 nepÅ™eÄtený příspÄ›vek v tomto tématu - other: máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu. + one: "máte 1 nepÅ™eÄtený příspÄ›vek v tomto tématu" + few: "máte {{count}} nepÅ™eÄtené příspÄ›vky v tomto tématu." + many: "máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu." + other: "máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu." unread_posts: - few: máte {{count}} nepÅ™eÄtené příspÄ›vky v tomto tématu - many: máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu - one: máte 1 nepÅ™eÄtený příspÄ›vÄ›k v tomto tématu - other: máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu + one: "máte 1 nepÅ™eÄtený příspÄ›vÄ›k v tomto tématu" + few: "máte {{count}} nepÅ™eÄtené příspÄ›vky v tomto tématu" + many: "máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu" + other: "máte {{count}} nepÅ™eÄtených příspÄ›vků v tomto tématu" new_posts: - few: jsou zde {{count}} nové příspÄ›vky od doby, kdy jste toto téma naposledy Äetli - many: je zde {{count}} nových příspÄ›vků od doby, kdy jste toto téma naposledy Äetli - one: je zde 1 nový příspÄ›vek od doby, kdy jste toto téma naposledy Äetli - other: je zde {{count}} nových příspÄ›vků od doby, kdy jste toto téma naposledy Äetli + one: "je zde 1 nový příspÄ›vek od doby, kdy jste toto téma naposledy Äetli" + few: "jsou zde {{count}} nové příspÄ›vky od doby, kdy jste toto téma naposledy Äetli" + many: "je zde {{count}} nových příspÄ›vků od doby, kdy jste toto téma naposledy Äetli" + other: "je zde {{count}} nových příspÄ›vků od doby, kdy jste toto téma naposledy Äetli" likes: - few: v tomto tématu tématu je {{count}} 'líbí se' - many: v tomto tématu tématu je {{count}} 'líbí se' - one: v tomto tématu je jedno 'líbí se' - other: v tomto tématu tématu je {{count}} 'líbí se' + one: "v tomto tématu je jedno 'líbí se'" + few: "v tomto tématu tématu je {{count}} 'líbí se'" + many: "v tomto tématu tématu je {{count}} 'líbí se'" + other: "v tomto tématu tématu je {{count}} 'líbí se'" back_to_list: "Zpátky na seznam témat" options: "Možnosti" show_links: "zobrazit odkazy v tomto tématu" @@ -1638,10 +1636,10 @@ cs: auto_reminder: "Toto téma ti pÅ™ipomeneme %{timeLeft}." auto_close_title: 'Nastavení automatického zavÅ™ení' auto_close_immediate: - few: Poslední příspÄ›vek v témetu je již %{count} hodiny starý, takže toto téma bude okamžitÄ› uzavÅ™eno. - many: Poslední příspÄ›vek v témetu je již %{count} hodin starý, takže toto téma bude okamžitÄ› uzavÅ™eno. - one: Poslední příspÄ›vek v témetu je již 1 hodinu starý, takže toto téma bude okamžitÄ› uzavÅ™eno. - other: Poslední příspÄ›vek v témetu je již %{count} hodin starý, takže toto téma bude okamžitÄ› uzavÅ™eno. + one: "Poslední příspÄ›vek v témetu je již 1 hodinu starý, takže toto téma bude okamžitÄ› uzavÅ™eno." + few: "Poslední příspÄ›vek v témetu je již %{count} hodiny starý, takže toto téma bude okamžitÄ› uzavÅ™eno." + many: "Poslední příspÄ›vek v témetu je již %{count} hodin starý, takže toto téma bude okamžitÄ› uzavÅ™eno." + other: "Poslední příspÄ›vek v témetu je již %{count} hodin starý, takže toto téma bude okamžitÄ› uzavÅ™eno." timeline: back: "ZpÄ›t" back_description: "PÅ™ejít na poslední nepÅ™eÄtený příspÄ›vek" @@ -1656,6 +1654,7 @@ cs: jump_prompt_of: "%{count} příspÄ›vků" jump_prompt_long: "Na který příspÄ›vek chcete pÅ™ejít?" jump_bottom_with_number: "SkoÄit na příspÄ›vÄ›k %{post_number}" + jump_prompt_or: "nebo" total: celkem příspÄ›vků current: aktuální příspÄ›vek notifications: @@ -1749,10 +1748,10 @@ cs: pin_validation: "Pro pÅ™ipíchnutí tohoto tématu je tÅ™eba datum." not_pinned: "V kategorii {{categoryLink}} nejsou žádná pÅ™ipnutá témata." already_pinned: - few: 'PÅ™ipevnÄ›ná témata v {{categoryLink}}: {{count}}' - many: 'PÅ™ipevnÄ›ná témata v {{categoryLink}}: {{count}}' - one: 'PÅ™ipevnÄ›né téma v {{categoryLink}}: {{count}}' - other: 'PÅ™ipevnÄ›ná témata v {{categoryLink}}: {{count}}' + one: "PÅ™ipevnÄ›né téma v {{categoryLink}}: {{count}}" + few: "PÅ™ipevnÄ›ná témata v {{categoryLink}}: {{count}}" + many: "PÅ™ipevnÄ›ná témata v {{categoryLink}}: {{count}}" + other: "PÅ™ipevnÄ›ná témata v {{categoryLink}}: {{count}}" pin_globally: "Zobrazit toto téma na vrcholu seznamu vÅ¡ech témat dokud" confirm_pin_globally: "Již máte {{count}} globálnÄ› pÅ™ipevnÄ›ných příspÄ›vků. PříliÅ¡ mnoho pÅ™ipevnÄ›ných příspÄ›vků může zatěžovat nové nebo anonymní uživatele. UrÄitÄ› chcete pÅ™ipevnit další téma globálnÄ›?" unpin_globally: "Odstranit toto téma z vrcholu vÅ¡ech seznamů s tématy." @@ -1760,10 +1759,10 @@ cs: global_pin_note: "Uživatelé mohou odepnout téma sami pro sebe." not_pinned_globally: "Nemáte žádná globálnÄ› pÅ™ipevnÄ›ná témata." already_pinned_globally: - few: 'V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: {{count}}' - many: 'V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: {{count}}' - one: 'V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: 1' - other: 'V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: {{count}}' + one: "V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: 1" + few: "V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: {{count}}" + many: "V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: {{count}}" + other: "V souÄasnosti globálnÄ› pÅ™ipevnÄ›ná témata: {{count}}" make_banner: "UdÄ›lat z tohoto tématu banner, který se zobrazí na vrcholu vÅ¡ech stránek." remove_banner: "Odstranit banner, který se zobrazuje na vrcholu vÅ¡ech stránek." banner_note: "Uživatelé mohou odmítnout banner jeho zavÅ™ením. V jeden moment může být pouze jedno téma jako banner." @@ -1800,10 +1799,10 @@ cs: login_reply: 'PÅ™ihlaste se, chcete-li odpovÄ›dÄ›t' filters: n_posts: - few: Jsou zobrazeny pouze {{count}} příspÄ›vky - many: Je zobrazeno pouze {{count}} příspÄ›vků - one: Je zobrazen pouze 1 příspÄ›vek - other: Je zobrazeno pouze {{count}} příspÄ›vků + one: "Je zobrazen pouze 1 příspÄ›vek" + few: "Jsou zobrazeny pouze {{count}} příspÄ›vky" + many: "Je zobrazeno pouze {{count}} příspÄ›vků" + other: "Je zobrazeno pouze {{count}} příspÄ›vků" cancel: "ZruÅ¡it filtr" split_topic: title: "RozdÄ›lit téma" @@ -1811,19 +1810,19 @@ cs: topic_name: "Název nového tématu:" error: "Bohužel nastala chyba pÅ™i rozdÄ›lování tématu." instructions: - few: Chystate se vytvoÅ™it noté téma a naplnit ho {{count}} příspÄ›vky, které jste oznaÄili. - many: Chystate se vytvoÅ™it noté téma a naplnit ho {{count}} příspÄ›vky, které jste oznaÄili. - one: Chystáte se vytvoÅ™it nové téma a naplnit ho příspÄ›vkem, který jste oznaÄili. - other: Chystate se vytvoÅ™it noté téma a naplnit ho {{count}} příspÄ›vky, které jste oznaÄili. + one: "Chystáte se vytvoÅ™it nové téma a naplnit ho příspÄ›vkem, který jste oznaÄili." + few: "Chystate se vytvoÅ™it noté téma a naplnit ho {{count}} příspÄ›vky, které jste oznaÄili." + many: "Chystate se vytvoÅ™it noté téma a naplnit ho {{count}} příspÄ›vky, které jste oznaÄili." + other: "Chystate se vytvoÅ™it noté téma a naplnit ho {{count}} příspÄ›vky, které jste oznaÄili." merge_topic: title: "SlouÄit téma" action: "do jiného tématu" error: "Bohužel nastala chyba pÅ™i sluÄování tématu." instructions: - few: Prosím, vyberte téma, do kterého chcete tyto {{count}} příspÄ›vky pÅ™esunout. - many: Prosím, vyberte téma, do kterého chcete tÄ›chto {{count}} příspÄ›vků pÅ™esunout. - one: Prosím, vyberte téma, do kterého chcete příspÄ›vek pÅ™esunout. - other: Prosím, vyberte téma, do kterého chcete tÄ›chto {{count}} příspÄ›vků pÅ™esunout. + one: "Prosím, vyberte téma, do kterého chcete příspÄ›vek pÅ™esunout." + few: "Prosím, vyberte téma, do kterého chcete tyto {{count}} příspÄ›vky pÅ™esunout." + many: "Prosím, vyberte téma, do kterého chcete tÄ›chto {{count}} příspÄ›vků pÅ™esunout." + other: "Prosím, vyberte téma, do kterého chcete tÄ›chto {{count}} příspÄ›vků pÅ™esunout." merge_posts: title: "SluÄ vybrané příspÄ›vky" action: "sluÄ vybrané příspÄ›vky" @@ -1835,10 +1834,10 @@ cs: label: "Nový autor příspÄ›vků" placeholder: "uživatelské jméno nového autora" instructions: - few: Vyberte prosím nového autora {{count}} příspÄ›vků od {{old_user}}. - many: Vyberte prosím nového autora {{count}} příspÄ›vků od {{old_user}}. - one: Vyberte prosím nového autora příspÄ›vku od {{old_user}}. - other: Vyberte prosím nového autora {{count}} příspÄ›vků od {{old_user}}. + one: "Vyberte prosím nového autora příspÄ›vku od {{old_user}}." + few: "Vyberte prosím nového autora {{count}} příspÄ›vků od {{old_user}}." + many: "Vyberte prosím nového autora {{count}} příspÄ›vků od {{old_user}}." + other: "Vyberte prosím nového autora {{count}} příspÄ›vků od {{old_user}}." change_timestamp: title: "ZmÄ›nit Äasové razítko..." action: "zmÄ›nit Äasovou znaÄku" @@ -1865,10 +1864,10 @@ cs: select_all: vybrat vÅ¡e deselect_all: zruÅ¡it výbÄ›r description: - few: Máte oznaÄeny {{count}} příspÄ›vky. - many: Máte oznaÄeno {{count}} příspÄ›vků. one: Máte oznaÄen 1 příspÄ›vek. - other: Máte oznaÄeno {{count}} příspÄ›vků. + few: "Máte oznaÄeny {{count}} příspÄ›vky." + many: "Máte oznaÄeno {{count}} příspÄ›vků." + other: "Máte oznaÄeno {{count}} příspÄ›vků." post: quote_reply: "Cituj" edit: "{{link}} {{replyAvatar}} {{username}}" @@ -1883,40 +1882,40 @@ cs: show_full: "Zobrazit celý příspÄ›vek" show_hidden: 'Zobraz skrytý obsah.' deleted_by_author: - few: (post withdrawn by author, will be automatically deleted in %{count} hours unless flagged) - many: (post withdrawn by author, will be automatically deleted in %{count} hours unless flagged) - one: (post withdrawn by author, will be automatically deleted in %{count} hour unless flagged) - other: (post withdrawn by author, will be automatically deleted in %{count} hours unless flagged) + one: "(post withdrawn by author, will be automatically deleted in %{count} hour unless flagged)" + few: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" + many: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" + other: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" collapse: "kolaps" expand_collapse: "rozbalit/sbalit" locked: "Personál znemožnil upravování na tomto příspÄ›vku" gap: - few: zobrazit {{count}} skryté odpovÄ›di - many: zobrazit {{count}} skrytých odpovÄ›dí - one: zobrazit 1 skrytou odpovÄ›Ä - other: zobrazit {{count}} skrytých odpovÄ›dí + one: "zobrazit 1 skrytou odpovÄ›Ä" + few: "zobrazit {{count}} skryté odpovÄ›di" + many: "zobrazit {{count}} skrytých odpovÄ›dí" + other: "zobrazit {{count}} skrytých odpovÄ›dí" unread: "PříspÄ›vek je nepÅ™eÄtený." has_replies: - few: '{{count}} odpovÄ›di' - many: '{{count}} odpovÄ›dí' - one: '{{count}} odpovÄ›Ä' - other: '{{count}} odpovÄ›dí' + one: "{{count}} odpovÄ›Ä" + few: "{{count}} odpovÄ›di" + many: "{{count}} odpovÄ›dí" + other: "{{count}} odpovÄ›dí" has_likes: - few: '{{count}} líbí se mi' - many: '{{count}} líbí se mi' - one: '{{count}} líbí se mi' - other: '{{count}} líbí se mi' + one: "{{count}} líbí se mi" + few: "{{count}} líbí se mi" + many: "{{count}} líbí se mi" + other: "{{count}} líbí se mi" has_likes_title: - few: '{{count}} lidem se líbí tento příspÄ›vek' - many: '{{count}} lidem se líbí tento příspÄ›vek' - one: 1 ÄlovÄ›ku se líbí tento příspÄ›vek - other: '{{count}} lidem se líbí tento příspÄ›vek' + one: "1 ÄlovÄ›ku se líbí tento příspÄ›vek" + few: "{{count}} lidem se líbí tento příspÄ›vek" + many: "{{count}} lidem se líbí tento příspÄ›vek" + other: "{{count}} lidem se líbí tento příspÄ›vek" has_likes_title_only_you: "tento příspÄ›vek se mi líbí" has_likes_title_you: - few: vám a {{count}} dalším lidem se tento příspÄ›vek líbí - many: vám a {{count}} dalším lidem se tento příspÄ›vek líbí - one: vám a 1 dalšímu ÄlovÄ›ku se tento příspÄ›vek líbí - other: vám a {{count}} dalším lidem se tento příspÄ›vek líbí + one: "vám a 1 dalšímu ÄlovÄ›ku se tento příspÄ›vek líbí" + few: "vám a {{count}} dalším lidem se tento příspÄ›vek líbí" + many: "vám a {{count}} dalším lidem se tento příspÄ›vek líbí" + other: "vám a {{count}} dalším lidem se tento příspÄ›vek líbí" errors: create: "Bohužel nastala chyba pÅ™i vytváření příspÄ›vku. Prosím zkuste to znovu." edit: "Bohužel nastala chyba pÅ™i editaci příspÄ›vku. Prosím zkuste to znovu." @@ -1956,15 +1955,15 @@ cs: delete_replies: confirm: "ChceÅ¡ také smazat odpovÄ›di k tomuto příspÄ›vku? " direct_replies: - few: Ano a další přímé odpovÄ›di - many: Ano a další {{count}} odpovÄ›di - one: Ano a 1 přímá odpovÄ›Ä - other: Ano a další {{count}} odpovÄ›di + one: "Ano a 1 přímá odpovÄ›Ä" + few: "Ano a další přímé odpovÄ›di" + many: "Ano a další {{count}} odpovÄ›di" + other: "Ano a další {{count}} odpovÄ›di" all_replies: - few: Ano a dalších {{count}} odpovÄ›dí - many: Ano a dalších {{count}} odpovÄ›dí - one: Ano a další 1 odpovÄ›Ä - other: Ano a dalších {{count}} odpovÄ›dí + one: "Ano a další 1 odpovÄ›Ä" + few: "Ano a dalších {{count}} odpovÄ›dí" + many: "Ano a dalších {{count}} odpovÄ›dí" + other: "Ano a dalších {{count}} odpovÄ›dí" just_the_post: "Ne, pouze tento příspÄ›vek" admin: "post admin actions" wiki: "VytvoÅ™te Wiki" @@ -1982,17 +1981,16 @@ cs: actions: flag: 'Nahlásit' defer_flags: - few: Ignorovat nahlášení - many: Ignorovat nahlášení - one: Ignorovat nahlášení - other: Ignorovat nahlášení + one: "Ignorovat nahlášení" + few: "Ignorovat nahlášení" + many: "Ignorovat nahlášení" + other: "Ignorovat nahlášení" undo: off_topic: "ZruÅ¡it nahlášení" spam: "ZruÅ¡it nahlášení" inappropriate: "ZruÅ¡it nahlášení" bookmark: "Odebrat ze záložek" like: "Už se mi to nelíbí" - vote: "ZruÅ¡it hlas" people: off_topic: "oznaÄil příspÄ›vek jako off-topic" spam: "oznaÄil příspÄ›vek jako spam" @@ -2002,11 +2000,10 @@ cs: bookmark: "záložka pÅ™idána" like: "se líbí" like_capped: - few: a {{count}} dalším se to líbí - many: a {{count}} dalším se to líbí - one: a jednomu dalšímu se to líbí - other: a {{count}} dalším se to líbí - vote: "hlasoval pro tento příspÄ›vek" + one: "a jednomu dalšímu se to líbí" + few: "a {{count}} dalším se to líbí" + many: "a {{count}} dalším se to líbí" + other: "a {{count}} dalším se to líbí" by_you: off_topic: "OznaÄili jste tento příspÄ›vek jako off-topic" spam: "OznaÄili jste tento příspÄ›vek jako spam" @@ -2015,101 +2012,90 @@ cs: notify_user: "Tomuto uživateli jste zaslali zprávu" bookmark: "PÅ™idali jste si tento příspÄ›vek do záložek" like: "Toto se vám líbí" - vote: "Hlasovali jste pro tento příspÄ›vek" by_you_and_others: off_topic: - few: Vy a {{count}} další lidé jste oznaÄili tento příspÄ›vek jako off-topic - many: Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako off-topic - one: Vy a 1 další ÄlovÄ›k jste oznaÄili tento příspÄ›vek jako off-topic - other: Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako off-topic + one: "Vy a 1 další ÄlovÄ›k jste oznaÄili tento příspÄ›vek jako off-topic" + few: "Vy a {{count}} další lidé jste oznaÄili tento příspÄ›vek jako off-topic" + many: "Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako off-topic" + other: "Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako off-topic" spam: - few: Vy a {{count}} další lidé jste oznaÄili tento příspÄ›vek jako spam - many: Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako spam - one: Vy a 1 další ÄlovÄ›k jste oznaÄili tento příspÄ›vek jako spam - other: Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako spam + one: "Vy a 1 další ÄlovÄ›k jste oznaÄili tento příspÄ›vek jako spam" + few: "Vy a {{count}} další lidé jste oznaÄili tento příspÄ›vek jako spam" + many: "Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako spam" + other: "Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako spam" inappropriate: - few: Vy a {{count}} další lidé jste oznaÄili tento příspÄ›vek jako nevhodný - many: Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako nevhodný - one: Vy a 1 další ÄlovÄ›k jste oznaÄili tento příspÄ›vek jako nevhodný - other: Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako nevhodný + one: "Vy a 1 další ÄlovÄ›k jste oznaÄili tento příspÄ›vek jako nevhodný" + few: "Vy a {{count}} další lidé jste oznaÄili tento příspÄ›vek jako nevhodný" + many: "Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako nevhodný" + other: "Vy a {{count}} dalších lidí jste oznaÄili tento příspÄ›vek jako nevhodný" notify_moderators: - few: Vy a {{count}} další lidé jste nahlásili tento příspÄ›vek - many: Vy a {{count}} dalších lidí jste nahlásili tento příspÄ›vek - one: Vy a 1 další ÄlovÄ›k jste nahlásili tento příspÄ›vek - other: Vy a {{count}} dalších lidí jste nahlásili tento příspÄ›vek + one: "Vy a 1 další ÄlovÄ›k jste nahlásili tento příspÄ›vek" + few: "Vy a {{count}} další lidé jste nahlásili tento příspÄ›vek" + many: "Vy a {{count}} dalších lidí jste nahlásili tento příspÄ›vek" + other: "Vy a {{count}} dalších lidí jste nahlásili tento příspÄ›vek" notify_user: - few: Vy a {{count}} ostatní lidé jste poslali zprávu tomuto uživateli - many: Vy a {{count}} ostatních lidí jste poslali zprávu tomuto uživateli - one: Vy a 1 další uživatel jste poslali zprávu tomuto uživateli - other: Vy a {{count}} ostatních lidí jste poslali zprávu tomuto uživateli + one: "Vy a 1 další uživatel jste poslali zprávu tomuto uživateli" + few: "Vy a {{count}} ostatní lidé jste poslali zprávu tomuto uživateli" + many: "Vy a {{count}} ostatních lidí jste poslali zprávu tomuto uživateli" + other: "Vy a {{count}} ostatních lidí jste poslali zprávu tomuto uživateli" bookmark: - few: Vy a {{count}} další lidé jste si pÅ™idali tento příspÄ›vek do záložek - many: Vy a {{count}} dalších lidí si pÅ™idali tento příspÄ›vek do záložek - one: Vy a 1 další ÄlovÄ›k jste si pÅ™idali tento příspÄ›vek do záložek - other: Vy a {{count}} dalších lidí si pÅ™idali tento příspÄ›vek do záložek + one: "Vy a 1 další ÄlovÄ›k jste si pÅ™idali tento příspÄ›vek do záložek" + few: "Vy a {{count}} další lidé jste si pÅ™idali tento příspÄ›vek do záložek" + many: "Vy a {{count}} dalších lidí si pÅ™idali tento příspÄ›vek do záložek" + other: "Vy a {{count}} dalších lidí si pÅ™idali tento příspÄ›vek do záložek" like: - few: Vám a {{count}} dalším lidem se tento příspÄ›vek líbí - many: Vám a {{count}} dalším lidem se tento příspÄ›vek líbí - one: Vám a 1 dalšímu ÄlovÄ›ku se tento příspÄ›vek líbí - other: Vám a {{count}} dalším lidem se tento příspÄ›vek líbí - vote: - few: Vy a {{count}} další lidé jste hlasovali pro tento příspÄ›vek - many: Vy a {{count}} dalších lidí jste hlasovali pro tento příspÄ›vek - one: Vy a 1 další ÄlovÄ›k jste hlasovali pro tento příspÄ›vek - other: Vy a {{count}} dalších lidí jste hlasovali pro tento příspÄ›vek + one: "Vám a 1 dalšímu ÄlovÄ›ku se tento příspÄ›vek líbí" + few: "Vám a {{count}} dalším lidem se tento příspÄ›vek líbí" + many: "Vám a {{count}} dalším lidem se tento příspÄ›vek líbí" + other: "Vám a {{count}} dalším lidem se tento příspÄ›vek líbí" by_others: off_topic: - few: '{{count}} lidé oznaÄili tento příspÄ›vek jako off-topic' - many: '{{count}} lidí oznaÄilo tento příspÄ›vek jako off-topic' - one: 1 ÄlovÄ›k oznaÄil tento příspÄ›vek jako off-topic - other: '{{count}} lidí oznaÄilo tento příspÄ›vek jako off-topic' + one: "1 ÄlovÄ›k oznaÄil tento příspÄ›vek jako off-topic" + few: "{{count}} lidé oznaÄili tento příspÄ›vek jako off-topic" + many: "{{count}} lidí oznaÄilo tento příspÄ›vek jako off-topic" + other: "{{count}} lidí oznaÄilo tento příspÄ›vek jako off-topic" spam: - few: '{{count}} lidé oznaÄili tento příspÄ›vek jako spam' - many: '{{count}} lidí oznaÄilo tento příspÄ›vek jako spam' - one: 1 ÄlovÄ›k oznaÄil tento příspÄ›vek jako spam - other: '{{count}} lidí oznaÄilo tento příspÄ›vek jako spam' + one: "1 ÄlovÄ›k oznaÄil tento příspÄ›vek jako spam" + few: "{{count}} lidé oznaÄili tento příspÄ›vek jako spam" + many: "{{count}} lidí oznaÄilo tento příspÄ›vek jako spam" + other: "{{count}} lidí oznaÄilo tento příspÄ›vek jako spam" inappropriate: - few: '{{count}} lidé oznaÄili tento příspÄ›vek jako nevhodný' - many: '{{count}} lidí oznaÄilo tento příspÄ›vek jako nevhodný' - one: 1 ÄlovÄ›k oznaÄil tento příspÄ›vek jako nevhodný - other: '{{count}} lidí oznaÄilo tento příspÄ›vek jako nevhodný' + one: "1 ÄlovÄ›k oznaÄil tento příspÄ›vek jako nevhodný" + few: "{{count}} lidé oznaÄili tento příspÄ›vek jako nevhodný" + many: "{{count}} lidí oznaÄilo tento příspÄ›vek jako nevhodný" + other: "{{count}} lidí oznaÄilo tento příspÄ›vek jako nevhodný" notify_moderators: - few: '{{count}} lidé nahlásili tento příspÄ›vek' - many: '{{count}} lidí nahlásilo tento příspÄ›vek' - one: 1 ÄlovÄ›k nahlásil tento příspÄ›vek - other: '{{count}} lidí nahlásilo tento příspÄ›vek' + one: "1 ÄlovÄ›k nahlásil tento příspÄ›vek" + few: "{{count}} lidé nahlásili tento příspÄ›vek" + many: "{{count}} lidí nahlásilo tento příspÄ›vek" + other: "{{count}} lidí nahlásilo tento příspÄ›vek" notify_user: - few: '{{count}} lidé poslali zprávu tomuto uživateli' - many: '{{count}} lidí poslalo zprávu tomuto uživateli' - one: 1 ÄlovÄ›k poslal zprávu tomuto uživateli - other: '{{count}} lidí poslalo zprávu tomuto uživateli' + one: "1 ÄlovÄ›k poslal zprávu tomuto uživateli" + few: "{{count}} lidé poslali zprávu tomuto uživateli" + many: "{{count}} lidí poslalo zprávu tomuto uživateli" + other: "{{count}} lidí poslalo zprávu tomuto uživateli" bookmark: - few: '{{count}} lidé si pÅ™idali tento příspÄ›vek do záložek' - many: '{{count}} lidí si pÅ™idalo tento příspÄ›vek do záložek' - one: 1 ÄlovÄ›k si pÅ™idal tento příspÄ›vek do záložek - other: '{{count}} lidí si pÅ™idalo tento příspÄ›vek do záložek' + one: "1 ÄlovÄ›k si pÅ™idal tento příspÄ›vek do záložek" + few: "{{count}} lidé si pÅ™idali tento příspÄ›vek do záložek" + many: "{{count}} lidí si pÅ™idalo tento příspÄ›vek do záložek" + other: "{{count}} lidí si pÅ™idalo tento příspÄ›vek do záložek" like: - few: '{{count}} lidem se tento příspÄ›vek líbí' - many: '{{count}} lidem se tento příspÄ›vek líbí' - one: 1 ÄlovÄ›ku se tento příspÄ›vek líbí - other: '{{count}} lidem se tento příspÄ›vek líbí' - vote: - few: '{{count}} lidé hlasovali pro tento příspÄ›vek' - many: '{{count}} lidí hlasovalo pro tento příspÄ›vek' - one: 1 ÄlovÄ›k hlasoval pro tento příspÄ›vek - other: '{{count}} lidí hlasovalo pro tento příspÄ›vek' + one: "1 ÄlovÄ›ku se tento příspÄ›vek líbí" + few: "{{count}} lidem se tento příspÄ›vek líbí" + many: "{{count}} lidem se tento příspÄ›vek líbí" + other: "{{count}} lidem se tento příspÄ›vek líbí" delete: confirm: - few: 'Jsi si jistý, že chceÅ¡ smazat tyto vÅ¡echny {{count}} příspÄ›vky? ' - many: 'Jsi si jistý, že chceÅ¡ smazat tyto vÅ¡echny {{count}} příspÄ›vky? ' - one: Jsi si jistý, že chceÅ¡ smazat tento příspÄ›vek? - other: 'Jsi si jistý, že chceÅ¡ smazat tyto vÅ¡echny {{count}} příspÄ›vky? ' + one: "Jsi si jistý, že chceÅ¡ smazat tento příspÄ›vek?" + few: "Jsi si jistý, že chceÅ¡ smazat tyto vÅ¡echny {{count}} příspÄ›vky? " + many: "Jsi si jistý, že chceÅ¡ smazat tyto vÅ¡echny {{count}} příspÄ›vky? " + other: "Jsi si jistý, že chceÅ¡ smazat tyto vÅ¡echny {{count}} příspÄ›vky? " merge: confirm: - few: Opravdu chceÅ¡ slouÄit {{count}} příspÄ›vky? - many: Opravdu chceÅ¡ slouÄit {{count}} příspÄ›vků? - one: Opravdu chceÅ¡ slouÄit tyto příspÄ›vky? - other: Opravdu chceÅ¡ slouÄit {{count}} příspÄ›vků? + one: "Opravdu chceÅ¡ slouÄit tyto příspÄ›vky?" + few: "Opravdu chceÅ¡ slouÄit {{count}} příspÄ›vky?" + many: "Opravdu chceÅ¡ slouÄit {{count}} příspÄ›vků?" + other: "Opravdu chceÅ¡ slouÄit {{count}} příspÄ›vků?" revisions: controls: first: "První revize" @@ -2147,7 +2133,6 @@ cs: can: 'smí… ' none: '(bez kategorie)' all: 'VÅ¡echny kategorie' - choose: 'Vyberte kategorii…' edit: 'upravit' edit_long: "Upravit" view: 'Zobrazit témata v kategorii' @@ -2196,7 +2181,6 @@ cs: show_subcategory_list: "Ukázat seznam podkategorií nad tématy v této kategorii." num_featured_topics: "PoÄet témat, která se zobrazují na stránce kategorie " subcategory_num_featured_topics: "PoÄet zobrazených témat na stránce nadÅ™azené kategorie:" - all_topics_wiki: "VytvoÅ™it nové wiki témat ve výchozím nastavení." subcategory_list_style: "Styl seznamu podkategorií: " sort_order: "Seznam témat seÅ™azený podle: " default_view: "Výchozí seznam témat: " @@ -2205,7 +2189,6 @@ cs: edit_permissions: "Upravit oprávnÄ›ní" add_permission: "PÅ™idat oprávnÄ›ní" this_year: "letos" - position: "umístÄ›ní" default_position: "Výchozí umístÄ›ní" position_disabled: "Kategorie jsou zobrazovány podle poÅ™adí aktivity. Pro kontrolu poÅ™adí kategorií v seznamech," position_disabled_click: 'povolte nastavení "nemÄ›nné pozice kategorií" (fixed category positions).' @@ -2266,20 +2249,20 @@ cs: custom_placeholder_notify_moderators: "SdÄ›lte nám, co vás pÅ™esnÄ› trápí a kde to bude možné, tak nám poskytnÄ›te související odkazy a příklady." custom_message: at_least: - few: zadejte alespoň {{count}} znaky - many: zadejte alespoň {{count}} znaků - one: zadejte alespoň 1 znak - other: zadejte alespoň {{count}} znaků + one: "zadejte alespoň 1 znak" + few: "zadejte alespoň {{count}} znaky" + many: "zadejte alespoň {{count}} znaků" + other: "zadejte alespoň {{count}} znaků" more: - few: jeÅ¡tÄ› {{count}}... - many: jeÅ¡tÄ› {{count}}... - one: jeÅ¡tÄ› 1... - other: jeÅ¡tÄ› {{count}}... + one: "jeÅ¡tÄ› 1..." + few: "jeÅ¡tÄ› {{count}}..." + many: "jeÅ¡tÄ› {{count}}..." + other: "jeÅ¡tÄ› {{count}}..." left: - few: '{{count}} zbývají' - many: '{{count}} zbývá' - one: 1 zbývá - other: '{{count}} zbývá' + one: "1 zbývá" + few: "{{count}} zbývají" + many: "{{count}} zbývá" + other: "{{count}} zbývá" flagging_topic: title: "DÄ›kujeme, že pomáháte udržovat komunitu zdvoÅ™ilou!" action: "Nahlásit téma" @@ -2290,17 +2273,17 @@ cs: links_title: "Populární odkazy" links_shown: "zobrazit více odkazů..." clicks: - few: '%{count} kliknutí' - many: '%{count} kliknutí' - one: 1 kliknutí - other: '%{count} kliknutí' + one: "1 kliknutí" + few: "%{count} kliknutí" + many: "%{count} kliknutí" + other: "%{count} kliknutí" post_links: about: "expandovat více odkazů v tomto příspÄ›vku" title: - few: '%{count} více' - many: '%{count} více' - one: 1 více - other: '%{count} více' + one: "1 více" + few: "%{count} více" + many: "%{count} více" + other: "%{count} více" topic_statuses: warning: help: "Toto je oficiální varování." @@ -2334,30 +2317,30 @@ cs: original_post: "Původní příspÄ›vek" views: "Zobrazení" views_lowercase: - few: zobrazení - many: zobrazení - one: zobrazení - other: zobrazení + one: "zobrazení" + few: "zobrazení" + many: "zobrazení" + other: "zobrazení" replies: "OdpovÄ›di" views_long: - few: Toto téma bylo zobrazeno {{number}} krát - many: Toto téma bylo zobrazeno {{number}} krát - one: Toto téma bylo zobrazeno 1 krát - other: Toto téma bylo zobrazeno {{number}} krát + one: "Toto téma bylo zobrazeno 1 krát" + few: "Toto téma bylo zobrazeno {{number}} krát" + many: "Toto téma bylo zobrazeno {{number}} krát" + other: "Toto téma bylo zobrazeno {{number}} krát" activity: "Aktivita" likes: "Líbí se" likes_lowercase: - few: líbí se - many: líbí se - one: líbí se - other: líbí se + one: "líbí se" + few: "líbí se" + many: "líbí se" + other: "líbí se" likes_long: "v tomto tématu je {{number}} \"Líbí se\"" users: "ÚÄastníci" users_lowercase: - few: uživatelé - many: uživatelů - one: uživatel - other: uživatelů + one: "uživatel" + few: "uživatelé" + many: "uživatelů" + other: "uživatelů" category_title: "Kategorie" history: "Historie" changed_by: "od uživatele {{author}}" @@ -2371,10 +2354,10 @@ cs: latest: title: "Aktuální" title_with_count: - few: Nedávná ({{count}}) - many: Nedávná ({{count}}) - one: Nedávné (1) - other: Nedávná ({{count}}) + one: "Nedávné (1)" + few: "Nedávná ({{count}})" + many: "Nedávná ({{count}})" + other: "Nedávná ({{count}})" help: "aktuální témata" hot: title: "Populární" @@ -2392,29 +2375,29 @@ cs: unread: title: "NepÅ™eÄtená" title_with_count: - few: NepÅ™eÄtená ({{count}}) - many: NepÅ™eÄtená ({{count}}) - one: NepÅ™eÄtená (1) - other: NepÅ™eÄtená ({{count}}) + one: "NepÅ™eÄtená (1)" + few: "NepÅ™eÄtená ({{count}})" + many: "NepÅ™eÄtená ({{count}})" + other: "NepÅ™eÄtená ({{count}})" help: "témata, která sledujete nebo hlídáte, s nepÅ™eÄtenými příspÄ›vky" lower_title_with_count: - few: '{{count}} nepÅ™eÄtených' - many: '{{count}} nepÅ™eÄtených' - one: '{{count}} nepÅ™eÄtené' - other: '{{count}} nepÅ™eÄtených' + one: "{{count}} nepÅ™eÄtené" + few: "{{count}} nepÅ™eÄtených" + many: "{{count}} nepÅ™eÄtených" + other: "{{count}} nepÅ™eÄtených" new: lower_title_with_count: - few: '{{count}} nová' - many: '{{count}} nových' - one: 1 nové - other: '{{count}} nových' + one: "1 nové" + few: "{{count}} nová" + many: "{{count}} nových" + other: "{{count}} nových" lower_title: "nové" title: "Nová" title_with_count: - few: Nová ({{count}}) - many: Nová ({{count}}) - one: Nové - other: Nová ({{count}}) + one: "Nové" + few: "Nová ({{count}})" + many: "Nová ({{count}})" + other: "Nová ({{count}})" help: "témata vytvoÅ™ená za posledních nÄ›kolik dní" posted: title: "Mé příspÄ›vky" @@ -2425,10 +2408,10 @@ cs: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - many: '{{categoryName}} ({{count}})' - one: '{{categoryName}} ({{count}})' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} ({{count}})" + few: "{{categoryName}} ({{count}})" + many: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "populární témata v kategorii {{categoryName}}" top: title: "Nejlepší" @@ -2516,30 +2499,30 @@ cs: print: 'ctrl+p Vytiskni téma' badges: earned_n_times: - few: Získal tento odznak krát - many: Získal tento odznak %{count} krát - one: Získal tento odznak krát - other: Získal tento odznak %{count} krát + one: "Získal tento odznak krát" + few: "Získal tento odznak krát" + many: "Získal tento odznak %{count} krát" + other: "Získal tento odznak %{count} krát" granted_on: "Získán %{date}" others_count: "Ostatní s tímto odznakem (%{count})" title: Odznaky allow_title: "Tento odznak můžeÅ¡ použít jako titul" multiple_grant: "Toto si můžeÅ¡ zasloužit nÄ›kolikrát" badge_count: - few: '%{count} odznaky' - many: '%{count} odznaků' - one: 1 odznak - other: '%{count} odznaků' + one: "1 odznak" + few: "%{count} odznaky" + many: "%{count} odznaků" + other: "%{count} odznaků" more_badges: - few: +%{count} další - many: +%{count} dalších - one: +1 další - other: +%{count} dalších + one: "+1 další" + few: "+%{count} další" + many: "+%{count} dalších" + other: "+%{count} dalších" granted: - few: '%{count} pÅ™idÄ›len' - many: '%{count} pÅ™idÄ›len' - one: 1 pÅ™idÄ›len - other: '%{count} pÅ™idÄ›len' + one: "1 pÅ™idÄ›len" + few: "%{count} pÅ™idÄ›len" + many: "%{count} pÅ™idÄ›len" + other: "%{count} pÅ™idÄ›len" select_badge_for_title: "Vyberte odznak, který chcete použít jako svůj titul" none: "(žádný)" successfully_granted: "ÚspěšnÄ› pÅ™idÄ›lený %{badge}uživateli%{username}" @@ -2573,10 +2556,10 @@ cs: choose_for_topic: "volitelné Å¡títky" delete_tag: "Smaž Å¡títek" delete_confirm: - few: Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z {{count}} témat, kterým je pÅ™iÅ™azen? - many: Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z {{count}} témat, kterým je pÅ™iÅ™azen? - one: Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z tématu, kterému je pÅ™iÅ™azen? - other: Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z {{count}} témat, kterým je pÅ™iÅ™azen? + one: "Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z tématu, kterému je pÅ™iÅ™azen?" + few: "Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z {{count}} témat, kterým je pÅ™iÅ™azen?" + many: "Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z {{count}} témat, kterým je pÅ™iÅ™azen?" + other: "Jsi si jist, že chceÅ¡ smazat tento Å¡títek a odstranit ho z {{count}} témat, kterým je pÅ™iÅ™azen?" delete_confirm_no_topics: "Opravdu chceÅ¡ smazat tento Å¡títek? " rename_tag: "PÅ™ejmenovat Å¡títek" rename_instructions: "Vyber název nového Å¡títku:" @@ -2685,6 +2668,8 @@ cs: reports: today: "Dnes" yesterday: "VÄera" + last_7_days: "Posledních 7" + last_30_days: "Posledních 30" all_time: "Za celou dobu" 7_days_ago: "Týden" 30_days_ago: "MÄ›síc" @@ -2737,10 +2722,10 @@ cs: suspend_user: "Zakázat uživatele" suspend_user_title: "Pozastavit uživatele za tento příspÄ›vek" replies: - few: '[%{count} odpovÄ›di]' - many: '[%{count} odpovÄ›dí]' - one: '[1 odpovÄ›Ä]' - other: '[%{count} odpovÄ›dí]' + one: "[1 odpovÄ›Ä]" + few: "[%{count} odpovÄ›di]" + many: "[%{count} odpovÄ›dí]" + other: "[%{count} odpovÄ›dí]" dispositions: agreed: "schváleno" disagreed: "neschváleno" @@ -2889,15 +2874,15 @@ cs: none: "Nejsou zde žádné související události." redeliver: "Znovu dodat" incoming: - few: '{{count}} nové události' - many: '{{count}} nových událostí' - one: 1 nová událost - other: '{{count}} nových událostí' + one: "1 nová událost" + few: "{{count}} nové události" + many: "{{count}} nových událostí" + other: "{{count}} nových událostí" completed_in: - few: DokonÄen za {{count}} sekundy. - many: DokonÄen za {{count}} sekund. - one: DokonÄen za 1 sekundu. - other: DokonÄen za {{count}} sekund. + one: "DokonÄen za 1 sekundu." + few: "DokonÄen za {{count}} sekundy." + many: "DokonÄen za {{count}} sekund." + other: "DokonÄen za {{count}} sekund." request: "Požadavek" response: "Odezva" redeliver_confirm: "Jsi si jistý, že chceÅ¡ znovu doruÄit stejný payload?" @@ -3054,7 +3039,6 @@ cs: public_key: "PÅ™idÄ›lit přístup k repo následujícím veÅ™ejným klíÄem:" about_theme: "O motivu " license: "Licence" - component_of: "Motiv je souÄástí: " update_to_latest: "Aktualizovat na nejnovÄ›jší" check_for_updates: "kontrola aktualizací" updating: "Aktualizace..." @@ -3063,10 +3047,10 @@ cs: theme_settings: "Nastavení motivu" no_settings: "Tento motiv nemá nastavení" commits_behind: - few: Motiv je {{count}} zavázaný! - many: Motivy jsou {{count}} zavázané! - one: Motiv je {{count}} zavázaný! - other: Motivy jsou {{count}} zavázané! + one: "Motiv je {{count}} zavázaný!" + few: "Motiv je {{count}} zavázaný!" + many: "Motivy jsou {{count}} zavázané!" + other: "Motivy jsou {{count}} zavázané!" scss: text: "CSS" title: "Vložit vlastní CSS, akceptujeme vÅ¡echny platné CSS a SCSS styly." @@ -3198,7 +3182,6 @@ cs: address_placeholder: "jmeno@priklad.cz" type_placeholder: "souhrn, registrace..." reply_key_placeholder: "klÃ­Ä pro odpovÄ›Ä" - skipped_reason_placeholder: "důvod" moderation_history: performed_by: "Provedeno uživatelem" no_results: "Není k dispozici žádná historie akcí moderátorů." @@ -3339,10 +3322,10 @@ cs: clear_filter: "ZruÅ¡it" show_words: "zobrazit slova" word_count: - few: '%{count} slova' - many: '%{count} slov' - one: 1 slovo - other: '%{count} slov' + one: "1 slovo" + few: "%{count} slova" + many: "%{count} slov" + other: "%{count} slov" actions: block: 'Zablokovat' censor: 'Cenzurovat ' @@ -3384,15 +3367,15 @@ cs: suspect: 'PodezÅ™elí' approved: "Schválen?" approved_selected: - few: schválit uživatele ({{count}}) - many: schválit uživatele ({{count}}) - one: schválit uživatele - other: schválit uživatele ({{count}}) + one: "schválit uživatele" + few: "schválit uživatele ({{count}})" + many: "schválit uživatele ({{count}})" + other: "schválit uživatele ({{count}})" reject_selected: - few: reject users ({{count}}) - many: reject users ({{count}}) - one: reject user - other: reject users ({{count}}) + one: "reject user" + few: "reject users ({{count}})" + many: "reject users ({{count}})" + other: "reject users ({{count}})" titles: active: 'Aktivní uživatelé' new: 'Noví uživatelé' @@ -3409,15 +3392,15 @@ cs: suspended: 'Zakázaní uživatelé' suspect: 'PodezÅ™elí uživatelé' reject_successful: - few: Successfully rejected %{count} users. - many: Successfully rejected %{count} users. - one: Successfully rejected 1 user. - other: Successfully rejected %{count} users. + one: "Successfully rejected 1 user." + few: "Successfully rejected %{count} users." + many: "Successfully rejected %{count} users." + other: "Successfully rejected %{count} users." reject_failures: - few: Failed to reject %{count} users. - many: Failed to reject %{count} users. - one: Failed to reject 1 user. - other: Failed to reject %{count} users. + one: "Failed to reject 1 user." + few: "Failed to reject %{count} users." + many: "Failed to reject %{count} users." + other: "Failed to reject %{count} users." not_verified: "Neověřeno" check_email: title: "Odhal emailovou adresu tohoto uživatele" @@ -3502,20 +3485,20 @@ cs: delete_forbidden_because_staff: "Správci ani moderátoÅ™i nemůžou být odstranÄ›ni." delete_posts_forbidden_because_staff: "Nemohu smazat vÅ¡echny příspÄ›vky administrátorů a moderátorů." delete_forbidden: - few: Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než %{count} dny nemůžou být smazány.) - many: Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než %{count} dnů nemůžou být smazány.) - one: Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než den nemůžou být smazány.) - other: Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než %{count} dnů nemůžou být smazány.) + one: "Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než den nemůžou být smazány.)" + few: "Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než %{count} dny nemůžou být smazány.)" + many: "Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než %{count} dnů nemůžou být smazány.)" + other: "Uživatelé nemůžou být smazáni pokud mají příspÄ›vky. PÅ™ed smazáním uživatele smažte vÅ¡echny jeho příspÄ›vky. (PříspÄ›vky starší než %{count} dnů nemůžou být smazány.)" cant_delete_all_posts: - few: VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} dny. (Nastavení delete_user_max_post_age.) - many: VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} dní. (Nastavení delete_user_max_post_age.) - one: VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} den. (Nastavení delete_user_max_post_age.) - other: VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} dní. (Nastavení delete_user_max_post_age.) + one: "VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} den. (Nastavení delete_user_max_post_age.)" + few: "VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} dny. (Nastavení delete_user_max_post_age.)" + many: "VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} dní. (Nastavení delete_user_max_post_age.)" + other: "VÅ¡echny příspÄ›vky nelze smazat. NÄ›které příspÄ›vky jsou starší než %{count} dní. (Nastavení delete_user_max_post_age.)" cant_delete_all_too_many_posts: - few: Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než %{count} příspÄ›vky. (delete_all_posts_max) - many: Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než %{count} příspÄ›vků. (delete_all_posts_max) - one: Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než 1 příspÄ›vek. (delete_all_posts_max) - other: Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než %{count} příspÄ›vků. (delete_all_posts_max) + one: "Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než 1 příspÄ›vek. (delete_all_posts_max)" + few: "Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než %{count} příspÄ›vky. (delete_all_posts_max)" + many: "Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než %{count} příspÄ›vků. (delete_all_posts_max)" + other: "Nelze smazat vÅ¡echny příspÄ›vky, protože uživatel má více než %{count} příspÄ›vků. (delete_all_posts_max)" delete_confirm: "Jste si jistí, že chcete smazat tohoto uživatele? Tato akce je nevratná!" delete_and_block: "Smaž a blokuj tento email a IP adresu." delete_dont_block: "Pouze smazat" @@ -3556,10 +3539,10 @@ cs: tl3_requirements: title: "Požadavky pro důvÄ›ryhodnost 3" table_title: - few: 'Za posledních %{count} dny:' - many: 'Za posledních %{count} dní:' - one: 'V posledním dnu:' - other: 'Za posledních %{count} dní:' + one: "V posledním dnu:" + few: "Za posledních %{count} dny:" + many: "Za posledních %{count} dní:" + other: "Za posledních %{count} dní:" value_heading: "Hodnota" requirement_heading: "Požadavek" visits: "NávÅ¡tÄ›v" @@ -3729,10 +3712,10 @@ cs: text: "Chybí pÅ™idÄ›lení vzorků. To se stane pokud dotazový odznak vrátí ID uživatele nebo ID příspÄ›vků, které neexistují. Může to pozdÄ›ji způsobit neoÄekávané výsledky - prosím zkontrolujte svůj dotaz." no_grant_count: "Žádné odznaky k udÄ›lení." grant_count: - few: %{count} odznaků k udÄ›lení. - many: %{count} odznaků k udÄ›lení. - one: 1 odznak k udÄ›lení. - other: %{count} odznaků k udÄ›lení. + one: "1 odznak k udÄ›lení." + few: "%{count} odznaků k udÄ›lení." + many: "%{count} odznaků k udÄ›lení." + other: "%{count} odznaků k udÄ›lení." sample: "Příklad:" grant: with: "%{username}" @@ -3799,10 +3782,10 @@ cs: uploading: "Nahrává se..." quit: "Možná pozdÄ›ji" staff_count: - few: VaÅ¡e komunita má %{count} Äleny v redakci. - many: VaÅ¡e komunita má %{count} Älenů v redakci. - one: Jste jediným Älenem v redakci vaší komunity. - other: VaÅ¡e komunita má %{count} Älenů v redakci. + one: "Jste jediným Älenem v redakci vaší komunity." + few: "VaÅ¡e komunita má %{count} Äleny v redakci." + many: "VaÅ¡e komunita má %{count} Älenů v redakci." + other: "VaÅ¡e komunita má %{count} Älenů v redakci." invites: add_user: "pÅ™idat" none_added: "Nepozvali jste nikoho z redakce. UrÄitÄ› chcete pokraÄovat?" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 15d5ac6282..5c82358e4f 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -43,64 +43,65 @@ da: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1t - other: '%{count}t' + one: "1t" + other: "%{count}t" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_years: - one: 1Ã¥ - other: '%{count}Ã¥' + one: "1Ã¥" + other: "%{count}Ã¥" over_x_years: - one: '> 1Ã¥' - other: '> %{count}Ã¥' + one: "> 1Ã¥" + other: "> %{count}Ã¥" almost_x_years: - one: 1Ã¥ - other: '%{count}Ã¥' + one: "1Ã¥" + other: "%{count}Ã¥" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} min' + one: "1 min" + other: "%{count} min" x_hours: - one: 1 time - other: '%{count} timer' + one: "1 time" + other: "%{count} timer" x_days: - one: 1 dag - other: '%{count} dage' + one: "1 dag" + other: "%{count} dage" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: 1 min siden - other: '%{count} min siden' + one: "1 min siden" + other: "%{count} min siden" x_hours: - one: 1 time siden - other: '%{count} timer siden' + one: "1 time siden" + other: "%{count} timer siden" x_days: - one: 1 dag siden - other: '%{count} dage siden' + one: "1 dag siden" + other: "%{count} dage siden" later: x_days: - one: 1 dag senere - other: '%{count} dage senere' + one: "1 dag senere" + other: "%{count} dage senere" x_months: - one: 1 mÃ¥ned senere - other: '%{count} mÃ¥neder senere' + one: "1 mÃ¥ned senere" + other: "%{count} mÃ¥neder senere" x_years: - one: 1 Ã¥r senere - other: '%{count} Ã¥r senere' + one: "1 Ã¥r senere" + other: "%{count} Ã¥r senere" previous_month: 'Forrige mÃ¥ned' next_month: 'Næste mÃ¥ned' + placeholder: dato share: topic: 'del et link til dette emne' post: 'indlæg #%{postNumber}' @@ -111,9 +112,11 @@ da: email: 'send dette link i en e-mail' action_codes: public_topic: "offentliggjorde dette emne %{when}" + private_topic: "Gjorde dette enme" split_topic: "del dette emne op %{when}" invited_user: "Inviterede %{who} %{when}" invited_group: "inviterede %{who} %{when}" + user_left: "%{who} %{when}" removed_user: "fjernede %{who} %{when}" removed_group: "fjernede %{who} %{when}" autoclosed: @@ -175,13 +178,13 @@ da: show_help: "indstillinger" links: "Links" links_lowercase: - one: link - other: links + one: "link" + other: "links" faq: "FAQ" guidelines: "Retningslinier" privacy_policy: "Privatlivspolitik" privacy: "Privatliv" - terms_of_service: "Betingelser" + tos: "Betingelser" mobile_view: "Mobil-visning" desktop_view: "Desktop-visning" you: "Dig" @@ -200,8 +203,8 @@ da: max_of_count: "max af {{count}}" alternation: "eller" character_count: - one: '{{count}} tegn' - other: '{{count}} tegn' + one: "{{count}} tegn" + other: "{{count}} tegn" suggested_topics: title: "ForeslÃ¥ede emner" pm_title: "ForeslÃ¥ede beskeder" @@ -213,6 +216,8 @@ da: our_moderators: "Vores Moderatorer" stat: all_time: "Alt" + last_7_days: "Sidste 7" + last_30_days: "Sidste 30" like_count: "Synes godt om" topic_count: "Emner" post_count: "Indlæg" @@ -268,16 +273,16 @@ da: cancel: "Annuller" view_pending: "vis afventende indlæg" has_pending_posts: - one: Det emne har 1 indlæg der afventer godkendelse - other: Dette emne har {{count}} indlæg der afventer godkendelse + one: "Det emne har 1 indlæg der afventer godkendelse" + other: "Dette emne har {{count}} indlæg der afventer godkendelse" confirm: "Gem ændringer" delete_prompt: "Er du sikker pÃ¥ at du vil slette %{username}? Det fjerner alle indlæg og blokerer email og IP-adresse." approval: title: "Indlæg afventer godkendelse" description: "Vi har modtaget dit indlæg, men det skal først godkendes af en moderator. Hav venligst tÃ¥lmodighed." pending_posts: - one: Du har 1 afventende indlæg. - other: Du har {{count}} afventende indlæg. + one: "Du har 1 afventende indlæg." + other: "Du har {{count}} afventende indlæg." ok: "OK" user_action: user_posted_topic: "{{user}} oprettede emnet" @@ -311,8 +316,8 @@ da: posts_read: "Læste" posts_read_long: "Indlæg læst" total_rows: - one: 1 bruger - other: '%{count} brugere' + one: "1 bruger" + other: "%{count} brugere" group_histories: actions: change_group_setting: "Skift gruppe indstilling" @@ -321,6 +326,13 @@ da: make_user_group_owner: "Gør til ejer" remove_user_as_group_owner: "Fjern ejer" groups: + manage: + membership: + access: Adgang + logs: + when: "NÃ¥r" + from: "Fra" + to: "Til" public_admission: "Tillad brugere frit at tilmelde sig gruppen (Kræver at det er en offentlig synlig gruppe)" public_exit: "Tillad brugere frit at forlade gruppen" empty: @@ -345,7 +357,17 @@ da: index: title: "Grupper" empty: "Der er ingen synlige grupper" + is_group_user: "Bruger" + is_group_owner: "Ejer" activity: "Aktivitet" + members: + title: "Brugere" + filter_placeholder_admin: "brugernavn eller email" + filter_placeholder: "brugernavn" + remove_member: "Fjern Bruger" + make_owner: "Lav Ejer" + remove_owner: "Fjern som Ejer" + owner: "Ejer" topics: "Emner" posts: "Indlæg" mentions: "Omtaler" @@ -398,14 +420,13 @@ da: "14": "Afventer" categories: all: "alle kategorier" + all_subcategories: "alle" no_subcategory: "ingen" category: "Kategori" category_list: "Vis liste over kategorier" reorder: title: "Ret kategoriernes rækkefølge " title_long: "Omorganiser listen over kategorier" - fix_order: "LÃ¥s placeringer" - fix_order_tooltip: "Ikke alle kategorier har et unikt positionsnummer, hvilket kan give uventede resultater." save: "Gem rækkefølge" apply_all: "Anvend" position: "Position" @@ -416,11 +437,11 @@ da: toggle_ordering: "vis/skjul rækkefølgeskifter" subcategories: "Underkategorier:" topic_sentence: - one: 1 emne - other: '%{count} emner' + one: "1 emne" + other: "%{count} emner" topic_stat_sentence: - one: '%{count} nyt emne i den/det seneste %{unit}.' - other: '%{count} nye emner i den/det seneste %{unit}.' + one: "%{count} nyt emne i den/det seneste %{unit}." + other: "%{count} nye emner i den/det seneste %{unit}." ip_lookup: title: IP-adresse opslag hostname: Værtsnavn @@ -573,7 +594,6 @@ da: error: "Der opstod en fejl i ændringen af denne værdi." change_username: title: "Skift brugernavn" - confirm: "Hvis du ændrer dit brugernavn, vil alle tidligere citeringer af dine indlæg ikke længere kunne vises. Er du helt sikker pÃ¥ at du ønsker at ændre brugernavn?" taken: "Beklager, det brugernavn er optaget." invalid: "Det brugernavn er ugyldigt. Det mÃ¥ kun bestÃ¥ af bogstaver og tal." change_email: @@ -592,7 +612,6 @@ da: upload_title: "Upload dit profil billede" upload_picture: "Upload et billede" image_is_not_a_square: "Advarsel: vi har klippet i billedet; bredde og højde var ikke ens." - cache_notice: "Du har ændret dit profilbillede, men der kan godt gÃ¥ lidt tid inden ændringen træder i kraft." change_profile_background: title: "Profil baggrundsbillede" instructions: "Profil baggrunde vil blive centrerede og have en standard bredde pÃ¥ 850 pixels" @@ -607,8 +626,8 @@ da: authenticated: "Din email er blevet bekræftet af {{provider}}" frequency_immediately: "Vi sender dig en email med det samme, hvis du ikke har læst den ting vi emailer dig om." frequency: - one: Vi sender dig kun email, hvis vi ikke har set dig i det seneste minut. - other: Vi sender dig kun email. hvis vi ikke har set dig i de sidste {{count}} minutter. + one: "Vi sender dig kun email, hvis vi ikke har set dig i det seneste minut." + other: "Vi sender dig kun email. hvis vi ikke har set dig i de sidste {{count}} minutter." name: title: "Navn" instructions: "Dit fulde navn (valgfrit)" @@ -693,8 +712,8 @@ da: user: "Inviteret bruger" sent: "Sendt" truncated: - one: Viser den første invitation. - other: Viser de første {{count}} invitationer. + one: "Viser den første invitation." + other: "Viser de første {{count}} invitationer." redeemed: "Brugte invitationer" redeemed_tab: "Indløst" redeemed_tab_with_count: "Indløst ({{count}})" @@ -739,20 +758,20 @@ da: stats: "Statistik" time_read: "læsetid" topic_count: - one: emne oprettet - other: emner oprettet + one: "emne oprettet" + other: "emner oprettet" post_count: - one: Indlæg oprettet - other: Indlæg oprettet + one: "Indlæg oprettet" + other: "Indlæg oprettet" days_visited: - one: dag besøgt - other: dage besøgt + one: "dag besøgt" + other: "dage besøgt" posts_read: - one: Indlæg læst - other: Indlæg læst + one: "Indlæg læst" + other: "Indlæg læst" bookmark_count: - one: bogmærke - other: bogmærker + one: "bogmærke" + other: "bogmærker" top_replies: "Top svar" no_replies: "Ingen svar, endnu." more_replies: "Flere svar" @@ -768,7 +787,6 @@ da: most_liked_users: "Most Liked" most_replied_to_users: "Flest har responderet" no_likes: "Ingen likes, endnu." - associated_accounts: "Logins" ip_address: title: "Sidste IP-adresse" registration_ip_address: @@ -820,8 +838,8 @@ da: reached: "%{relativeAge} – %{rate} nÃ¥ede grænse for konfiguration af sitet pÃ¥ %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} overskred grænse for konfiguration af sitet pÃ¥ %{siteSettingRate}." rate: - one: 1 fejl/%{duration} - other: '%{count} fejl/%{duration}' + one: "1 fejl/%{duration}" + other: "%{count} fejl/%{duration}" learn_more: "Læs mere…" all_time: 'i alt' all_time_desc: 'emner oprettet i alt' @@ -844,8 +862,6 @@ da: hide_session: "Mind mig om det i morgen" hide_forever: "nej tak" hidden_for_session: "OK, jeg spørger dig i morgen. Du kan ogsÃ¥ altid bruge \"Log pÃ¥\" til at oprette en konto." - intro: "Hejsa! :heart_eyes: Det ser ud til, at du følger godt med i samtalerne, men du har endnu ikke oprettet en konto." - value_prop: "NÃ¥r du opretter en konto, sÃ¥ kan vi huske hvad du har læst, sÃ¥ du altid kan fortsætte, hvor du er kommet til. Du fÃ¥r ogsÃ¥ notifikationer - her og pÃ¥ email - nÃ¥r nye interessante indlæg postes. Og du kan like indlæg og dele begejstringen. :heartbeat:" summary: enabled_description: "Du ser et sammendrag af dette emne: kun de mest interessante indlæg som andre finder interresante." description: "Der er {{replyCount}} svar." @@ -859,7 +875,6 @@ da: disable: "Vis Slettede Indlæg" private_message_info: title: "Besked" - invite: "Invitér andre…" remove_allowed_user: "Ønsker du virkelig at fjerne {{name}} fra denne samtale?" remove_allowed_group: "Er du sikker pÃ¥ du vil fjerne {{name}} fra denne besked?" email: 'E-mail' @@ -913,25 +928,27 @@ da: preferences: "Du skal være logget ind for at ændre præferencer." forgot: "Jeg kan ikke huske min kontos detaljer" not_approved: "Din konto er endnu ikke blevet godkendt. Du fÃ¥r besked via e-mail nÃ¥r du kan logge ind." - google: - title: "med Google" - message: "Logger ind med Google (kontrollér at pop-op-blokering ikke er aktiv)" google_oauth2: title: "med google" message: "Validering med Google (vær sikker pÃ¥ at pop up blokeringer er slÃ¥et fra)" twitter: + name: "Twitter" title: "med Twitter" message: "Logger ind med Twitter (kontrollér at pop-op-blokering ikke er aktiv)" instagram: + name: "Instagram" title: "med Instagram" message: "Validering med Instagram (vær sikker pÃ¥ at pop-up blokering ikke er slÃ¥et til)" facebook: + name: "Facebook" title: "med Facebook" message: "Logger ind med Facebook (kontrollér at pop-op-blokering ikke er aktiv)" yahoo: + name: "Yahoo" title: "med Yahoo" message: "Logger ind med Yahoo (kontrollér at pop-op-blokering ikke er aktiv)" github: + name: "GitHub" title: "med GitHub" message: "Logger ind med GitHub (kontrollér at pop-op-blokering ikke er aktiv)" invites: @@ -942,6 +959,8 @@ da: your_email: "E-mail-adressen knyttet til kontoen er %{email}." accept_invite: "Accepter Invitation" success: "Din konto er blevet oprettet, og du er nu logget ind." + name_label: "Navn" + password_label: "Sæt Kodeord" password_reset: continue: "Fortsæt til %{site_name}" emoji_set: @@ -950,6 +969,8 @@ da: twitter: "Twitter" emoji_one: "Første Emoji" win10: "Win10" + google_classic: "Google Classic" + facebook_messenger: "Facebook Messenger" category_page_style: categories_only: "Kun Kategorier" categories_with_featured_topics: "Kategorier med Fremhævede Emner" @@ -958,6 +979,13 @@ da: shift: 'Skift' ctrl: 'Ctrl' alt: 'Alt' + conditional_loading_section: + loading: Loader... + select_kit: + default_header_text: Vælg... + filter_placeholder: Søg... + emoji_picker: + dark_tone: Mørk skin tone composer: emoji: "Emoji :)" more_emoji: "mere..." @@ -974,8 +1002,8 @@ da: similar_topics: "Dit emne minder om…" drafts_offline: "kladder offline" group_mentioned: - one: Ved at nævne {{group}} sender du en notifikation til 1 person - vil du fortsætte? - other: Ved at nævne {{group}} sender du en notifikation til {{count}} personer - vil du fortsætte? + one: "Ved at nævne {{group}} sender du en notifikation til 1 person - vil du fortsætte?" + other: "Ved at nævne {{group}} sender du en notifikation til {{count}} personer - vil du fortsætte?" cannot_see_mention: category: "Du nævnte {{username}}, men de vil ikke blive notificeret fordi de ikke har adgang til denne kategori. Du vil være nødt til at tilføje dem til en gruppe, der har adgang til kategori." private: "Du nævnte {{username}}, men de vil ikke blive notificeret fordi de ikke er i stand til at se denne personlige besked. Du vil være nødt til at invitere dem til denne personlige besked." @@ -1039,6 +1067,8 @@ da: title: "Glemte du at tilføje modtagere?" body: "Lige nu bliver denne besked kun sendt til dig selv!" admin_options_title: "Valgfrie staff-indstillinger for dette emne" + composer_actions: + edit: Rediger notifications: title: "notifikationer ved @navns nævnelse, svar pÃ¥ dine indlæg og emner, beskeder, mv." none: "Ikke i stand til at indlæse notifikationer for tiden." @@ -1066,6 +1096,7 @@ da: uploading: "Uploader billede" select_file: "Vælg fil" image_link: "link som dit billede vil pege pÃ¥" + default_image_alt_text: billede search: sort_by: "Sorter efter" relevance: "Relevans" @@ -1077,10 +1108,13 @@ da: clear_all: "Ryd alle" too_short: "Dit søgekriterie er for kort." title: "søg efter emner, indlæg, brugere eller kategorier" + full_page_title: "søg emner eller indlæg" no_results: "Ingen resultater fundet." no_more_results: "Ikke flere resultater." searching: "Søger…" post_format: "#{{post_number}} af {{username}}" + search_google_button: "Google" + search_google_title: "Søg denne side" context: user: "Søg i indlæg fra @{{username}}" category: "Søg i #{{category}} kategorien" @@ -1143,8 +1177,8 @@ da: archive_topics: "Arkiver Emner" choose_new_category: "Vælg den nye kategori for emnerne:" selected: - one: Du har valgt 1 indlæg. - other: Du har valgt {{count}} indlæg. + one: "Du har valgt 1 indlæg." + other: "Du har valgt {{count}} indlæg." change_tags: "Erstat Tags" append_tags: "Tilføj Tags" choose_new_tags: "Vælg nye tags for dette emne" @@ -1177,8 +1211,8 @@ da: search: "Der er ikke flere søgeresultater." topic: filter_to: - one: 1 indlæg i emnet - other: '{{count}} indlæg i emnet' + one: "1 indlæg i emnet" + other: "{{count}} indlæg i emnet" create: 'Nyt emne' create_long: 'Opret et nyt emne i debatten' private_message: 'Start en besked' @@ -1188,14 +1222,16 @@ da: move_to_inbox: title: 'Flyt til Indbakke' help: 'Flyt beskeder tilbage til Indbakke' + edit_message: + title: 'Rediger Besked' list: 'Emner' new: 'nyt emne' unread: 'ulæste' new_topics: - one: 1 nyt emne + one: '1 nyt emne' other: '{{count}} nye emner' unread_topics: - one: 1 ulæst emne + one: '1 ulæst emne' other: '{{count}} ulæste emner' title: 'Emne' invalid_access: @@ -1209,17 +1245,17 @@ da: title: "Emnet findes ikke" description: "Beklager, vi kunne ikke finde det emne i databasen. MÃ¥ske er det blevet fjernet af moderator?" total_unread_posts: - one: der er {{count}} indlæg du ikke har læst i dette emne - other: der er {{count}} indlæg du ikke har læst i dette emne + one: "der er {{count}} indlæg du ikke har læst i dette emne" + other: "der er {{count}} indlæg du ikke har læst i dette emne" unread_posts: - one: der er 1 indlæg du ikke har læst i dette emne - other: der er {{count}} indlæg du ikke har læst i dette emne + one: "der er 1 indlæg du ikke har læst i dette emne" + other: "der er {{count}} indlæg du ikke har læst i dette emne" new_posts: - one: der er kommet 1 nyt indlæg i dette emne siden du læste det sidst - other: der er kommet {{count}} nye indlæg i dette emne siden du læste det sidst + one: "der er kommet 1 nyt indlæg i dette emne siden du læste det sidst" + other: "der er kommet {{count}} nye indlæg i dette emne siden du læste det sidst" likes: - one: der er ét like i dette emne - other: der er {{count}} likes i dette emne + one: "der er ét like i dette emne" + other: "der er {{count}} likes i dette emne" back_to_list: "Tilbage til emneoversigt" options: "Emneindstillinger" show_links: "vis links i dette emne" @@ -1245,6 +1281,12 @@ da: later_this_week: "Senere pÃ¥ ugen" this_weekend: "Denne weekend" next_week: "Næste uge" + two_weeks: "To Uger" + next_month: "Næste MÃ¥nede" + three_months: "Tre MÃ¥neder" + six_months: "Seks MÃ¥neder" + one_year: "Et Ã¥r" + forever: "Forevigt" pick_date_and_time: "Vælg dato og tid" set_based_on_last_post: "Luk baseret pÃ¥ seneste indlæg" publish_to_category: @@ -1267,8 +1309,8 @@ da: auto_close_based_on_last_post: "Emnet vil lukke %{duration} efter det sidste svar." auto_close_title: 'Indstillinger for automatisk lukning' auto_close_immediate: - one: Seneste indlæg i emnet er allerede 1 time gammelt sÃ¥ emnet bliver lukket med det samme. - other: Seneste indlæg i emnet er allerede %{hours} timer gammelt sÃ¥ emnet bliver lukket med det samme. + one: "Seneste indlæg i emnet er allerede 1 time gammelt sÃ¥ emnet bliver lukket med det samme." + other: "Seneste indlæg i emnet er allerede %{hours} timer gammelt sÃ¥ emnet bliver lukket med det samme." timeline: back: "Tilbage" back_description: "Tilbage til dit seneste ulæste indlæg" @@ -1283,6 +1325,7 @@ da: jump_prompt_of: "af %{count} indlæg" jump_prompt_long: "Hvilket indlæg vil du gerne springe til?" jump_bottom_with_number: "hop til indlæg %{post_number}" + jump_prompt_or: "eller" total: antal indlæg current: nuværende indlæg notifications: @@ -1375,8 +1418,8 @@ da: pin_validation: "Der skal angives en dato for at fastgøre dette emne" not_pinned: "Der er ingen fastgjorte emner i {{categoryLink}}." already_pinned: - one: 'Emner fastgjort i {{categoryLink}}: 1' - other: 'Emner fastgjort i {{categoryLink}}: {{count}}' + one: "Emner fastgjort i {{categoryLink}}: 1" + other: "Emner fastgjort i {{categoryLink}}: {{count}}" pin_globally: "Fastgør dette emne til toppen af alle emnelister indtil" confirm_pin_globally: "Du har allerede {{count}} globalt fastgjorte emner. For mange fastgjorte emner kan være irriterende for nye og anonyme brugere. Er du sikker pÃ¥ du vil fastgøre et emne mere globalt?" unpin_globally: "Fjern dette emne fra toppen af alle emne lister." @@ -1384,8 +1427,8 @@ da: global_pin_note: "Brugere kan unpinne emnet individuelt." not_pinned_globally: "Der er ingen globalt fastgjorte emner." already_pinned_globally: - one: 'Globalt fastgjorte emner: 1' - other: 'Globalt fastgjorte emner: {{count}}' + one: "Globalt fastgjorte emner: 1" + other: "Globalt fastgjorte emner: {{count}}" make_banner: "Gør dette emne til en banner, der kommer til at stÃ¥ i toppen pÃ¥ alle sider." remove_banner: "Fjern banneret, der stÃ¥r pÃ¥ toppen af alle sider." banner_note: "Brugere kan fjernet banneret ved at lukke det. Kun én banner kan være aktiv ad gangen." @@ -1421,8 +1464,8 @@ da: login_reply: 'Log ind for at svare' filters: n_posts: - one: 1 indlæg - other: '{{count}} indlæg' + one: "1 indlæg" + other: "{{count}} indlæg" cancel: "Fjern filter" split_topic: title: "Flyt til nyt emne" @@ -1430,15 +1473,15 @@ da: topic_name: "Navn pÃ¥ nyt emne" error: "Der opstod en fejl under flytningen af indlæg til det nye emne." instructions: - one: Du er ved at oprette et nyt emne med det valgte indlæg. - other: Du er ved at oprette et nyt emne med de {{count}} valgte indlæg. + one: "Du er ved at oprette et nyt emne med det valgte indlæg." + other: "Du er ved at oprette et nyt emne med de {{count}} valgte indlæg." merge_topic: title: "Flyt til eksisterende emne" action: "flyt til eksisterende emne" error: "Der opstod en fejl under flytningen af indlæg til emnet." instructions: - one: Vælg venligst det emne som indlægget skal flyttes til. - other: Vælg venligst det emne som de {{count}} indlæg skal flyttes til. + one: "Vælg venligst det emne som indlægget skal flyttes til." + other: "Vælg venligst det emne som de {{count}} indlæg skal flyttes til." merge_posts: title: "Flet valgte indlæg" action: "flet valgte indlæg" @@ -1450,8 +1493,8 @@ da: label: "Ny ejer af emner" placeholder: "brugernavn pÃ¥ ny ejer" instructions: - one: Vælg den nye ejer af indlægget, oprindeligt skrevet af {{old_user}}. - other: Vælg den nye ejer af {{count}} indlæg, oprindeligt skrevet af {{old_user}}. + one: "Vælg den nye ejer af indlægget, oprindeligt skrevet af {{old_user}}." + other: "Vælg den nye ejer af {{count}} indlæg, oprindeligt skrevet af {{old_user}}." change_timestamp: title: "Tilpas tidsstempel..." action: "ret tidsstempel" @@ -1467,7 +1510,7 @@ da: deselect_all: marker ingen description: one: Du har valgt 1 indlæg. - other: Du har valgt {{count}} indlæg. + other: "Du har valgt {{count}} indlæg." post: quote_reply: "Citér" edit_reason: "Reason: " @@ -1481,26 +1524,26 @@ da: show_full: "Vis hele emnet" show_hidden: 'Vist skjult indhold.' deleted_by_author: - one: (indlæg trukket tilbage af forfatteren, slettes automatisk om %{count} time med mindre det bliver flaget) - other: (indlæg trukket tilbage af forfatteren, slettes automatisk om %{count} timer med mindre det bliver flaget) + one: "(indlæg trukket tilbage af forfatteren, slettes automatisk om %{count} time med mindre det bliver flaget)" + other: "(indlæg trukket tilbage af forfatteren, slettes automatisk om %{count} timer med mindre det bliver flaget)" expand_collapse: "fold ud/ind" gap: - one: 'se 1 udeladt indlæg ' - other: 'se {{count}} udeladte indlæg ' + one: "se 1 udeladt indlæg " + other: "se {{count}} udeladte indlæg " unread: "Indlæg er ulæst" has_replies: - one: '{{count}} svar' - other: '{{count}} svar' + one: "{{count}} svar" + other: "{{count}} svar" has_likes: - one: '{{count}} like' - other: '{{count}} likes' + one: "{{count}} like" + other: "{{count}} likes" has_likes_title: - one: 1 likede dette indlæg - other: '{{count}} likede dette indlæg' + one: "1 likede dette indlæg" + other: "{{count}} likede dette indlæg" has_likes_title_only_you: "du likede dette indlæg" has_likes_title_you: - one: du og 1 anden likede dette indlæg - other: du og {{count}} andre likede dette indlæg + one: "du og 1 anden likede dette indlæg" + other: "du og {{count}} andre likede dette indlæg" errors: create: "Beklager, der opstod en fejl under oprettelsen af dit indlæg. Prøv venligst igen." edit: "Beklager, der opstrod en fejl under redigeringen af dit indlæg. Prøv venligst igen." @@ -1544,6 +1587,7 @@ da: rebake: "Gendan HTML" unhide: "Vis" change_owner: "Skift ejerskab" + lock_post: "LÃ¥s Indlæg" actions: flag: 'Flag' undo: @@ -1552,7 +1596,6 @@ da: inappropriate: "Undo flag" bookmark: "Undo bookmark" like: "Undo like" - vote: "Undo vote" people: off_topic: "markerede dette som off-topic" spam: "markerede dette som spam" @@ -1561,7 +1604,6 @@ da: notify_user: "sendte en besked" bookmark: "bogmærkede dette" like: "likede dette" - vote: "stemte for dette" by_you: off_topic: "Du flagede dette som off-topic" spam: "Du flagede dette som spam" @@ -1570,57 +1612,50 @@ da: notify_user: "Du har sendt en besked til denne bruger" bookmark: "Du bogmærkede dette indlæg" like: "Du liker dette indlæg" - vote: "Du stemte for dette indlæg" by_you_and_others: off_topic: - one: Du og 1 anden flagede dette som off-topic - other: Du og {{count}} andre flagede dette som off-topic + one: "Du og 1 anden flagede dette som off-topic" + other: "Du og {{count}} andre flagede dette som off-topic" spam: - one: Du og 1 anden flagede dette som spam - other: Du og {{count}} andre flagede dette som spam + one: "Du og 1 anden flagede dette som spam" + other: "Du og {{count}} andre flagede dette som spam" inappropriate: - one: Du og 1 anden flagede dettes om upasende - other: Du og {{count}} andre flagede dettes om upasende + one: "Du og 1 anden flagede dettes om upasende" + other: "Du og {{count}} andre flagede dettes om upasende" notify_moderators: - one: Du og 1 anden flagede dette til moderation - other: Du og {{count}} andre flagede dette til moderation + one: "Du og 1 anden flagede dette til moderation" + other: "Du og {{count}} andre flagede dette til moderation" notify_user: - one: Dig og en anden har sendt en besked til denne bruger - other: Dig og {{count}} andre har sendt en besked til denne bruger + one: "Dig og en anden har sendt en besked til denne bruger" + other: "Dig og {{count}} andre har sendt en besked til denne bruger" bookmark: - one: Du og 1 anden bogmærkede dette indlæg - other: Du og {{count}} andre bogmærkede dette indlæg + one: "Du og 1 anden bogmærkede dette indlæg" + other: "Du og {{count}} andre bogmærkede dette indlæg" like: - one: Du og 1 anden liker dette - other: Du og {{count}} andre liker dette - vote: - one: Du og 1 anden stemte for dette indlæg - other: Du og {{count}} andre stemte for dette indlæg + one: "Du og 1 anden liker dette" + other: "Du og {{count}} andre liker dette" by_others: off_topic: - one: 1 person flagede dette som off-topic - other: '{{count}} personer flagede dette som off-topic' + one: "1 person flagede dette som off-topic" + other: "{{count}} personer flagede dette som off-topic" spam: - one: 1 person flagede dette som spam - other: '{{count}} personer flagede dette som spam' + one: "1 person flagede dette som spam" + other: "{{count}} personer flagede dette som spam" inappropriate: - one: 1 person flagede dette som upassende - other: '{{count}} personer flagede dette som upassende' + one: "1 person flagede dette som upassende" + other: "{{count}} personer flagede dette som upassende" notify_moderators: - one: 1 person flagede dette til moderation - other: '{{count}} personer flagede dette til moderation' + one: "1 person flagede dette til moderation" + other: "{{count}} personer flagede dette til moderation" notify_user: - one: 1 person har sendt en besked til denne bruger - other: '{{count}} har sendt en besked til denne bruger' + one: "1 person har sendt en besked til denne bruger" + other: "{{count}} har sendt en besked til denne bruger" bookmark: - one: 1 person bogmærkede dette indlæg - other: '{{count}} personer bogmærkede dette indlæg' + one: "1 person bogmærkede dette indlæg" + other: "{{count}} personer bogmærkede dette indlæg" like: - one: 1 person liker dette - other: '{{count}} personer liker dette' - vote: - one: 1 person stemte for dette indlæg - other: '{{count}} personer stemte for dette indlæg' + one: "1 person liker dette" + other: "{{count}} personer liker dette" revisions: controls: first: "Første udgave" @@ -1658,7 +1693,6 @@ da: can: 'kan… ' none: '(ingen kategori)' all: 'Alle kategorier' - choose: 'Vælg en kategori…' edit: 'redigér' edit_long: "Redigér" view: 'Vis emner i kategori' @@ -1703,7 +1737,6 @@ da: show_subcategory_list: "Vis oversigt med subkategorier ovenover emner i denne kategori." num_featured_topics: "Antal emner som skal vises pÃ¥ siden med kategorier:" subcategory_num_featured_topics: "Antal af fremhævede emner pÃ¥ siden for den overordnede kategori:" - all_topics_wiki: "Gør som standard nye emner til wikis" subcategory_list_style: "Oversigtsform for subkategori" sort_order: "Emneoversigt - sortér efter:" default_view: "Standard emneoversigt:" @@ -1712,7 +1745,6 @@ da: edit_permissions: "Redigér tilladelser" add_permission: "Tilføj tilladelse" this_year: "dette Ã¥r" - position: "position" default_position: "Standarposition" position_disabled: "Kategorier vil blive vist i rækkefølge efter aktivitet. For at styre rækkefølgen af kategorier i lister, " position_disabled_click: 'skal funktionen "fikserede kategori positioner" slÃ¥s til.' @@ -1773,14 +1805,14 @@ da: custom_placeholder_notify_moderators: "Lad os vide præcis hvad du er bekymret over og giv relevante links og eksempler hvor det er muligt." custom_message: at_least: - one: indtast mindst 1 tegn - other: indtast mindst {{count}} tegn + one: "indtast mindst 1 tegn" + other: "indtast mindst {{count}} tegn" more: - one: 1 mere... - other: '{{count}} mere...' + one: "1 mere..." + other: "{{count}} mere..." left: - one: 1 tilbage - other: '{{count}} tilbage' + one: "1 tilbage" + other: "{{count}} tilbage" flagging_topic: title: "Tak fordi du hjælper med at holde vores forum civiliseret!" action: "Rapporter emne" @@ -1791,13 +1823,13 @@ da: links_title: "Populære Links" links_shown: "vis flere links..." clicks: - one: 1 klik - other: '%{count} klik' + one: "1 klik" + other: "%{count} klik" post_links: about: "udvid flere links for dette indlæg" title: - one: 1 mere - other: '%{count} flere' + one: "1 mere" + other: "%{count} flere" topic_statuses: warning: help: "Dette er en officiel advarsel." @@ -1831,22 +1863,22 @@ da: original_post: "Oprindeligt indlæg" views: "Visninger" views_lowercase: - one: visning - other: visninger + one: "visning" + other: "visninger" replies: "Svar" views_long: - one: emnet er læst 1 gang - other: emnet er læst {{number}} gange + one: "emnet er læst 1 gang" + other: "emnet er læst {{number}} gange" activity: "Aktivitet" likes: "Likes" likes_lowercase: - one: like - other: likes + one: "like" + other: "likes" likes_long: "der er {{number}} likes i dette emne" users: "Deltagere" users_lowercase: - one: bruger - other: brugere + one: "bruger" + other: "brugere" category_title: "Kategori" history: "Historik" changed_by: "af {{author}}" @@ -1860,8 +1892,8 @@ da: latest: title: "Seneste" title_with_count: - one: Seneste (1) - other: Seneste ({{count}}) + one: "Seneste (1)" + other: "Seneste ({{count}})" help: "de seneste emner" hot: title: "Populære" @@ -1879,21 +1911,21 @@ da: unread: title: "Ulæst" title_with_count: - one: Ulæst (1) - other: Ulæste ({{count}}) + one: "Ulæst (1)" + other: "Ulæste ({{count}})" help: "emner du følger med i lige nu med ulæste indlæg" lower_title_with_count: - one: 1 ulæst - other: '{{count}} ulæste' + one: "1 ulæst" + other: "{{count}} ulæste" new: lower_title_with_count: - one: 1 ny - other: '{{count}} nye' + one: "1 ny" + other: "{{count}} nye" lower_title: "Ny" title: "Nye" title_with_count: - one: Nye (1) - other: Nye ({{count}}) + one: "Nye (1)" + other: "Nye ({{count}})" help: "Emner oprettet i de seneste par dage" posted: title: "Mine indlæg" @@ -1904,8 +1936,8 @@ da: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "populære emner i kategorien {{categoryName}}" top: title: "Top" @@ -1989,21 +2021,22 @@ da: print: 'ctrl+p Print emne' badges: earned_n_times: - one: Blev tildelt dette badge 1 gang - other: Blev tildelt dette badge %{count} gange + one: "Blev tildelt dette badge 1 gang" + other: "Blev tildelt dette badge %{count} gange" granted_on: "Tildelt %{date}" others_count: "Andre med dette badge (%{count})" title: Badges badge_count: - one: 1 Badge - other: '%{count} Badges' + one: "1 Badge" + other: "%{count} Badges" more_badges: - one: +1 Mere - other: +%{count} Flere + one: "+1 Mere" + other: "+%{count} Flere" granted: - one: 1 tildelt - other: '%{count} tildelt' + one: "1 tildelt" + other: "%{count} tildelt" select_badge_for_title: "Vælg en badge, du vil bruge som din titel" + none: "(ingen)" badge_grouping: getting_started: name: SÃ¥dan kommer du i gang @@ -2128,6 +2161,7 @@ da: space_free: "{{size}} tilbage" uploads: "uploads" backups: "backups" + lastest_backup: "Senest: %{date}" traffic_short: "Trafik" traffic: "Applikation web forespørgsler" page_views: "Sidevisninger" @@ -2136,6 +2170,8 @@ da: reports: today: "I dag" yesterday: "I gÃ¥r" + last_7_days: "Seneste 7" + last_30_days: "Seneste 30" all_time: "Altid" 7_days_ago: "7 dage siden" 30_days_ago: "30 dage siden" @@ -2153,6 +2189,7 @@ da: title: "Flag" agree: "Enig" agree_title: "Bekræft dette flag er gyldigt og korrekt" + agree_flag_hide_post: "Skjul Indlæg" delete: "Slet" delete_title: "Slet det indlæg, som flaget refererer til." delete_post_defer_flag_title: "Slet indlægget; hvis det er det første, sÃ¥ slet hele emnet" @@ -2180,7 +2217,12 @@ da: visit_topic: "Besøg emnet for at gøre noget ved det" was_edited: "Indlægget blev redigeret efter det første gang blev flagget" previous_flags_count: "Dette indlæg er allerede blevet markeret {{count}} gange." + flagged_topics: + users: "Brugere" groups: + manage: + interaction: + email: Email primary: "Primær gruppe" no_primary: "(ingen primær gruppe)" title: "Grupper" @@ -2261,11 +2303,11 @@ da: none: "Der er ingen relaterede events." redeliver: "Genfremsend" incoming: - one: Der er et nyt event. - other: Der er {{count}} nye events. + one: "Der er et nyt event." + other: "Der er {{count}} nye events." completed_in: - one: Fuldført pÃ¥ 1 sekund. - other: Fuldført pÃ¥ {{count}} sekunder. + one: "Fuldført pÃ¥ 1 sekund." + other: "Fuldført pÃ¥ {{count}} sekunder." request: "Forespørgsel" response: "Svar" redeliver_confirm: "Er du sikker pÃ¥ at du vil genfremsende det samme payload?" @@ -2396,6 +2438,7 @@ da: common: "Normal" desktop: "Desktop" mobile: "Mobil" + settings: "Indstillinger" preview: "ForhÃ¥ndsvisning" is_default: "Tema er slÃ¥et til som standard" user_selectable: "Tema kan vælges af brugerne" @@ -2403,6 +2446,7 @@ da: color_scheme_select: "Vælg farver som temaet skal anvende" custom_sections: "Tilpassede sektioner:" theme_components: "Temakomponenter" + variable_name: "SCSS var navn:" child_themes_check: "Tema inkluderer andre underordnede temaer" css_html: "Tilpasset CSS/HTML" edit_css_html: "Redigér CSS/HTML" @@ -2411,7 +2455,6 @@ da: import_file_tip: "Tema som indeholder filen .dcstyle.json" about_theme: "Om temaet" license: "Licens" - component_of: "Temaet er et komponent fra:" update_to_latest: "Opdatér til seneste" check_for_updates: "Tjek efter opdateringer" updating: "Opdaterer..." @@ -2545,7 +2588,6 @@ da: address_placeholder: "navn@eksempel.dk" type_placeholder: "sammenfatning, tilmelding..." reply_key_placeholder: "svar knap" - skipped_reason_placeholder: "grund" logs: title: "Logs" action: "Handling" @@ -2668,11 +2710,11 @@ da: suspect: 'Mistænkt' approved: "Godkendt?" approved_selected: - one: godkend bruger - other: godkend brugere ({{count}}) + one: "godkend bruger" + other: "godkend brugere ({{count}})" reject_selected: - one: afvis bruger - other: afvis brugere ({{count}}) + one: "afvis bruger" + other: "afvis brugere ({{count}})" titles: active: 'Aktive brugere' new: 'Nye brugere' @@ -2688,11 +2730,11 @@ da: suspended: 'Suspenderede brugere' suspect: 'Mistænkte brugere' reject_successful: - one: Afviste 1 bruger. - other: Afviste %{count} brugere. + one: "Afviste 1 bruger." + other: "Afviste %{count} brugere." reject_failures: - one: Kunne ikke afvise 1 bruger. - other: Kunne ikke afvise %{count} brugere. + one: "Kunne ikke afvise 1 bruger." + other: "Kunne ikke afvise %{count} brugere." not_verified: "Ikke verificeret" check_email: title: "Vis denne brugers email adresse" @@ -2704,6 +2746,7 @@ da: suspend_reason_label: "Hvorfor suspenderer du? Denne tekst er synlig for alle pÃ¥ brugerens profilside, og vises til brugeren nÃ¥r de prøver at logge ind. Fat dig i korthed." suspend_reason: "Begrundelse" suspended_by: "Suspenderet af" + silence_message: "Email Besked" delete_all_posts: "Slet alle indlæg" delete_all_posts_confirm_MF: "Du er ved at slette {POSTS, plural, one {1 post} other {# posts}} og {TOPICS, plural, one {1 topic} other {# topics}}. Er du sikker?" moderator: "Moderator?" @@ -2752,14 +2795,14 @@ da: delete_forbidden_because_staff: "Admins og moderatorer kan ikke slettes." delete_posts_forbidden_because_staff: "Kan ikke slette alle indlæg fra administratorer og moderatorer." delete_forbidden: - one: Brugere kan ikke slettes hvis de har oprettet sig for mere end %{count} dag siden, eller hvis de har oprettet indlæg. Slet alle indlæg før du forsøger at slette en bruger. - other: Brugere kan ikke slettes hvis de har oprettet sig for mere end %{count} dage siden, eller hvis de har oprettet indlæg. Slet alle indlæg før du forsøger at slette en bruger. + one: "Brugere kan ikke slettes hvis de har oprettet sig for mere end %{count} dag siden, eller hvis de har oprettet indlæg. Slet alle indlæg før du forsøger at slette en bruger." + other: "Brugere kan ikke slettes hvis de har oprettet sig for mere end %{count} dage siden, eller hvis de har oprettet indlæg. Slet alle indlæg før du forsøger at slette en bruger." cant_delete_all_posts: - one: Kan ikke slette alle indlæg. Der er indlæg der er over %{count} dag gamle. (Juster delete_user_max_post_age indstillingen.) - other: Kan ikke slette alle indlæg. Der er indlæg der er over %{count} dage gamle. (Juster delete_user_max_post_age indstillingen.) + one: "Kan ikke slette alle indlæg. Der er indlæg der er over %{count} dag gamle. (Juster delete_user_max_post_age indstillingen.)" + other: "Kan ikke slette alle indlæg. Der er indlæg der er over %{count} dage gamle. (Juster delete_user_max_post_age indstillingen.)" cant_delete_all_too_many_posts: - one: Kan ikke slette alle indlæg fordi denne bruger har flere end 1 indlæg. (delete_all_posts_max indstillingen) - other: Kan ikke slette alle indlæg fordi denne bruger har flere end %{count} indlæg. (delete_all_posts_max indstillingen) + one: "Kan ikke slette alle indlæg fordi denne bruger har flere end 1 indlæg. (delete_all_posts_max indstillingen)" + other: "Kan ikke slette alle indlæg fordi denne bruger har flere end %{count} indlæg. (delete_all_posts_max indstillingen)" delete_confirm: "Er du SIKKER pÃ¥ at du slette denne bruger? Det er permanent! " delete_and_block: "Slet og bloker denne email og IP-adresse" delete_dont_block: "Slet kun" @@ -2794,8 +2837,8 @@ da: tl3_requirements: title: "Krav for fortrolighedsniveau 3" table_title: - one: I den sidste dag - other: 'I de sidste %{count} dage:' + one: "I den sidste dag" + other: "I de sidste %{count} dage:" value_heading: "værdi" requirement_heading: "Obligatoriske" visits: "Besøg" @@ -2892,6 +2935,7 @@ da: developer: 'Udvikler' embedding: "Indlejring" legal: "Jura" + api: 'API' user_api: 'Bruger API' uncategorized: 'Andre' backups: "Backups" @@ -2960,8 +3004,8 @@ da: text: "Der mangler tildelinger. Dette sker nÃ¥r en SQL query returnerer bruger ID'er eller indlægs IS'er der ikke eksisterer. Dette kan give uventede resultater senere - vær venlig at dobbelt checke din SQL query." no_grant_count: "Ingen badges til tildeling." grant_count: - one: 1 badge til tildeling. - other: %{count} badges til tildeling. + one: "1 badge til tildeling." + other: "%{count} badges til tildeling." sample: "Eksempel:" grant: with: "%{username}" @@ -2981,6 +3025,7 @@ da: sample: "Tilføj denne HTML til dit site for at oprette og indlejre emner fra discourse. Erstat REPLACE_ME med den kanoniske URL for den side du indlejrer den pÃ¥," title: "Indlejring" host: "Tilladte servere" + class_name: "Klasse Navn" path_whitelist: "Sti for hvidliste" edit: "redigér" category: "Opret i kategorien" @@ -3032,3 +3077,5 @@ da: admin: "Admin" moderator: "Moderator" regular: "Fast bruger" + previews: + share_button: "Del" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 4bd98f6ea9..f1047c0452 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -43,68 +43,68 @@ de: tiny: half_a_minute: "< 1min" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1 Min. - other: < %{count} Min. + one: "< 1 Min." + other: "< %{count} Min." x_minutes: - one: 1min - other: '%{count}min' + one: "1min" + other: "%{count}min" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" x_months: - one: 1 Monat - other: '%{count}m' + one: "1 Monat" + other: "%{count}m" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "D. MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 Minute - other: '%{count} Minuten' + one: "1 Minute" + other: "%{count} Minuten" x_hours: - one: 1 Stunde - other: '%{count} Stunden' + one: "1 Stunde" + other: "%{count} Stunden" x_days: - one: 1 Tag - other: '%{count} Tage' + one: "1 Tag" + other: "%{count} Tage" date_year: "D. MMM 'YY" medium_with_ago: x_minutes: - one: vor einer Minute - other: vor %{count} Minuten + one: "vor einer Minute" + other: "vor %{count} Minuten" x_hours: - one: vor einer Stunde - other: vor %{count} Stunden + one: "vor einer Stunde" + other: "vor %{count} Stunden" x_days: - one: vor einem Tag - other: vor %{count} Tagen + one: "vor einem Tag" + other: "vor %{count} Tagen" later: x_days: - one: einen Tag später - other: '%{count} Tage später' + one: "einen Tag später" + other: "%{count} Tage später" x_months: - one: einen Monat später - other: '%{count} Monate später' + one: "einen Monat später" + other: "%{count} Monate später" x_years: - one: ein Jahr später - other: '%{count} Jahre später' + one: "ein Jahr später" + other: "%{count} Jahre später" previous_month: 'Vormonat' next_month: 'Nächster Monat' placeholder: Datum @@ -117,7 +117,7 @@ de: google+: 'diesen Link auf Google+ teilen' email: 'diesen Link per E-Mail senden' action_codes: - public_topic: "hat das Thema %{when} öffentlich gemacht" + public_topic: "hat das Thema öffentlich gemacht, %{when}" private_topic: "hat dieses Thema in eine Nachricht umgewandelt %{when}" split_topic: "Thema aufgeteilt, %{when}" invited_user: "%{who} eingeladen, %{when}" @@ -125,6 +125,7 @@ de: user_left: "%{who} hat sich selbst von dieser Nachricht entfernt %{when}" removed_user: "%{who} entfernt, %{when}" removed_group: "%{who} entfernt, %{when}" + autobumped: "Thema wurde automatisch nach oben geschoben, %{when}" autoclosed: enabled: 'geschlossen, %{when}' disabled: 'geöffnet, %{when}' @@ -164,6 +165,7 @@ de: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Irland)" eu_west_2: "EU (London)" + eu_west_3: "EU (Paris)" sa_east_1: "Südamerika (São Paulo)" us_east_1: "USA Ost (Nord-Virginia)" us_east_2: "USA Ost (Ohio)" @@ -187,13 +189,14 @@ de: show_help: "Erweiterte Suche" links: "Links" links_lowercase: - one: Link - other: Links + one: "Link" + other: "Links" faq: "FAQ" guidelines: "Richtlinien" privacy_policy: "Datenschutzrichtlinie" privacy: "Datenschutz" - terms_of_service: "Nutzungsbedingungen" + tos: "Nutzungsbedingungen" + rules: "Regeln" mobile_view: "Mobile Ansicht" desktop_view: "Desktop Ansicht" you: "Du" @@ -212,8 +215,8 @@ de: max_of_count: "von max. {{count}}" alternation: "oder" character_count: - one: '{{count}} Zeichen' - other: '{{count}} Zeichen' + one: "{{count}} Zeichen" + other: "{{count}} Zeichen" suggested_topics: title: "Vorgeschlagene Themen" pm_title: "Vorgeschlagene Nachrichten" @@ -247,15 +250,21 @@ de: last_read: "Das ist der letzte Beitrag, den du gelesen hast. Klicke, um ein Lesezeichen zu setzen." remove: "Lesezeichen entfernen" confirm_clear: "Bist du sicher, dass du alle Lesezeichen in diesem Thema entfernen möchtest?" + drafts: + resume: "Fortsetzen" + remove: "Entfernen" + new_topic: "Neues Thema Entwurf" + new_private_message: "Neuer privater Nachrichten Entwurf" + topic_reply: "Antwort Entwurf" topic_count_latest: - one: Zeige {{count}} neues oder aktualisiertes Thema - other: Zeige {{count}} neue oder aktualisierte Themen + one: "Zeige {{count}} neues oder aktualisiertes Thema" + other: "Zeige {{count}} neue oder aktualisierte Themen" topic_count_unread: - one: Zeige {{count}} ungelesenes Thema - other: Zeige {{count}} ungelesene Themen + one: "Zeige {{count}} ungelesenes Thema" + other: "Zeige {{count}} ungelesene Themen" topic_count_new: - one: Zeige {{count}} neues Thema - other: Zeige {{count}} neue Themen + one: "Zeige {{count}} neues Thema" + other: "Zeige {{count}} neue Themen" preview: "Vorschau" cancel: "Abbrechen" save: "Speichern" @@ -293,16 +302,16 @@ de: cancel: "Abbrechen" view_pending: "ausstehende Beiträge anzeigen" has_pending_posts: - one: Dieses Thema hat einen Beitrag, der genehmigt werden muss - other: Dieses Thema hat {{count}} Beiträge, die genehmigt werden müssen + one: "Dieses Thema hat einen Beitrag, der genehmigt werden muss" + other: "Dieses Thema hat {{count}} Beiträge, die genehmigt werden müssen" confirm: "Speichern" delete_prompt: "Möchtest du wirklich %{username} löschen? Damit werden alle Beiträge des Benutzers entfernt und dessen E-Mail- und IP-Adresse geblockt." approval: title: "Beitrag muss genehmigt werden" description: "Wir haben deinen neuen Beitrag erhalten. Dieser muss allerdings zunächst durch einen Moderator freigeschaltet werden. Bitte habe etwas Geduld. " pending_posts: - one: Du hast 1 ausstehenden Beitrag. - other: Du hast {{count}} ausstehende Beiträge. + one: "Du hast 1 ausstehenden Beitrag." + other: "Du hast {{count}} ausstehende Beiträge." ok: "OK" user_action: user_posted_topic: "{{user}} hat das Thema verfasst" @@ -336,8 +345,8 @@ de: posts_read: "Gelesen" posts_read_long: "Gelesene Beiträge" total_rows: - one: 1 Benutzer - other: '%{count} Benutzer' + one: "1 Benutzer" + other: "%{count} Benutzer" group_histories: actions: change_group_setting: "Gruppeneinstellung ändern" @@ -422,8 +431,8 @@ de: is_group_user: "Mitglied" is_group_owner: "Eigentümer" title: - one: Gruppe - other: Gruppen + one: "Gruppe" + other: "Gruppen" activity: "Aktivität" members: title: "Mitglieder" @@ -486,17 +495,16 @@ de: "12": "Gesendete Objekte" "13": "Posteingang" "14": "Ausstehend" + "15": "Entwürfe" categories: all: "Alle Kategorien" - all_subcategories: "alle in %{categoryName}" + all_subcategories: "alle" no_subcategory: "keine" category: "Kategorie" category_list: "Kategorieliste anzeigen" reorder: title: "Kategorien neu sortieren" title_long: "Neustrukturierung der Kategorieliste" - fix_order: "Positionen korrigieren" - fix_order_tooltip: "Nicht alle Kategorien haben eine eindeutige Positionsnummer, was zu unerwarteten Ergebnissen führen kann." save: "Reihenfolge speichern" apply_all: "Anwenden" position: "Position" @@ -507,11 +515,12 @@ de: toggle_ordering: "Reihenfolge ändern" subcategories: "Unterkategorien" topic_sentence: - one: 1 Thema - other: '%{count} Themen' + one: "1 Thema" + other: "%{count} Themen" topic_stat_sentence: - one: 1 neues Thema seit 1 %{unit}. - other: '%{count} neue Themen seit 1 %{unit}.' + one: "%{count} neues Thema seit 1 %{unit}." + other: "%{count} neue Themen seit 1 %{unit}." + more: "(%{count}mehr) …" ip_lookup: title: IP-Adressen-Abfrage hostname: Hostname @@ -528,6 +537,7 @@ de: post_count: "# Beiträge" confirm_delete_other_accounts: "Bist du sicher, dass du diese Konten löschen willst?" powered_by: "powered by ipinfo.io" + copied: "kopiert" user_fields: none: "(wähle eine Option aus)" user: @@ -630,6 +640,7 @@ de: revoke_access: "Entziehe Zugriffsrecht" undo_revoke_access: "Entziehe Zugriffsrecht widerrufen" api_approved: "Genehmigt:" + api_last_used_at: "Zuletzt benutzt am:" theme: "Design" home: "Standard-Startseite" staged: "Vorbereitet" @@ -668,6 +679,19 @@ de: set_password: "Passwort ändern" choose_new: "Wähle ein neues Passwort" choose: "Wähle ein Passwort" + second_factor_backup: + title: "Zwei-Faktor-Wiederherstellungs-Codes" + regenerate: "Erneuern" + disable: "Deaktivieren" + enable: "Aktivieren" + enable_long: "Wiederherstellungscodes aktivieren" + manage: "Wiederherstellungscodes verwalten" + copied_to_clipboard: "Wurde in Zwischenablage kopiert" + copy_to_clipboard_error: "Beim Kopieren in die Zwischenablage trat ein Fehler auf" + remaining_codes: "Du hast noch {{count}} Wiederherstellungscodes übrig." + codes: + title: "Wiederherstellungscodes generiert" + description: "Jeder dieser Wiederherstellungscodes kann nur einmal benutzt werden. Bewahre diese an einem sicheren aber verfügbaren Ort auf." second_factor: title: "Zwei-Faktor-Authentifizierung" disable: "Zwei-Faktor-Authentifizierung deaktivieren" @@ -686,7 +710,7 @@ de: error: "Beim Ändern dieses Wertes ist ein Fehler aufgetreten." change_username: title: "Benutzernamen ändern" - confirm: "Wenn du deinen Benutzernamen änderst, werden alle vorherigen Zitate deiner Beiträge und Erwähnungen deines vorherigen @Namens nicht mehr funktonieren. Bist du dir ganz sicher, dass du das tun möchtest?" + confirm: "Bist du dir ganz sicher, dass du deinen Benutzernamen ändern möchtest?" taken: "Der Benutzername ist bereits vergeben." invalid: "Der Benutzernamen ist nicht zulässig. Er darf nur Zahlen und Buchstaben enthalten." change_email: @@ -707,7 +731,6 @@ de: upload_title: "Lade dein Bild hoch" upload_picture: "Bild hochladen" image_is_not_a_square: "Achtung: Wir haben dein Bild zugeschnitten, weil Höhe und Breite nicht übereingestimmt haben." - cache_notice: "Du hast dein Profilbild erfolgreich geändert. Aufgrund von Caching im Browser kann es eine Weile dauern, bis dieses angezeigt wird." change_profile_background: title: "Profilhintergrund" instructions: "Hintergrundbilder werden zentriert und haben eine Standardbreite von 850px." @@ -716,14 +739,22 @@ de: instructions: "Hintergrundbilder werden zentriert und haben eine Standardbreite von 590px." email: title: "E-Mail" + primary: "Primäre E-Mail-Adresse" + secondary: "Weitere E-Mail-Adressen" + no_secondary: "Keine weiteren E-Mail-Adressen" instructions: "wird nicht öffentlich angezeigt" ok: "Wir senden dir zur Bestätigung eine E-Mail" invalid: "Bitte gib eine gültige E-Mail-Adresse ein" authenticated: "Deine E-Mail-Adresse wurde von {{provider}} bestätigt" frequency_immediately: "Wir werden dir sofort eine E-Mail senden, wenn du die betroffenen Inhalte noch nicht gelesen hast." frequency: - one: Wir werden dir nur dann eine E-Mail senden, wenn wir dich nicht innerhalb der letzten Minute gesehen haben. - other: Wir werden dir nur dann eine E-Mail senden, wenn wir dich nicht innerhalb der letzten {{count}} Minuten gesehen haben. + one: "Wir werden dir nur dann eine E-Mail senden, wenn wir dich nicht innerhalb der letzten Minute gesehen haben." + other: "Wir werden dir nur dann eine E-Mail senden, wenn wir dich nicht innerhalb der letzten {{count}} Minuten gesehen haben." + associated_accounts: + title: "Zugehörige Konten" + connect: "Verbinden" + revoke: "Entziehen" + not_connected: "(nicht verbunden)" name: title: "Name" instructions: "dein vollständiger Name (optional)" @@ -748,6 +779,18 @@ de: any: "(keine Einschränkung)" password_confirmation: title: "Wiederholung des Passworts" + auth_tokens: + title: "Kürzlich benutzte Geräte" + title_logs: "Authentifizierungs-Logs" + ip_address: "IP Adresse" + created: "Erzeugt" + first_seen: "Erstmalig gesehen" + last_seen: "Zuletzt gesehen" + operating_system: "Betriebssystem" + location: "Ort" + action: "Aktion" + login: "Einloggen" + logout: "Überall ausloggen" last_posted: "Letzter Beitrag" last_emailed: "Letzte E-Mail" last_seen: "Zuletzt gesehen" @@ -809,8 +852,8 @@ de: sent: "Gesendet" none: "Keine Einladungen anzuzeigen." truncated: - one: Zeige die erste Einladung. - other: Zeige die ersten {{count}} Einladungen. + one: "Zeige die erste Einladung." + other: "Zeige die ersten {{count}} Einladungen." redeemed: "Angenommene Einladungen" redeemed_tab: "Angenommen" redeemed_tab_with_count: "Angenommen ({{count}})" @@ -857,29 +900,29 @@ de: time_read: "Lesezeit" recent_time_read: "aktuelle Lesezeit" topic_count: - one: Thema erstellt - other: Themen erstellt + one: "Thema erstellt" + other: "Themen erstellt" post_count: - one: Beitrag erstellt - other: Beiträge erstellt + one: "Beitrag erstellt" + other: "Beiträge erstellt" likes_given: - one: gegeben - other: gegeben + one: "gegeben" + other: "gegeben" likes_received: - one: vergeben - other: erhalten + one: "vergeben" + other: "erhalten" days_visited: - one: Tag vorbeigekommen - other: Tage vorbeigekommen + one: "Tag vorbeigekommen" + other: "Tage vorbeigekommen" topics_entered: - one: betrachtetes Thema - other: betrachtete Themen + one: "betrachtetes Thema" + other: "betrachtete Themen" posts_read: - one: Beitrag gelesen - other: Beiträge gelesen + one: "Beitrag gelesen" + other: "Beiträge gelesen" bookmark_count: - one: Lesezeichen - other: Lesezeichen + one: "Lesezeichen" + other: "Lesezeichen" top_replies: "Die besten Beiträge" no_replies: "Noch keine Antworten." more_replies: "weitere Beiträge" @@ -895,7 +938,9 @@ de: most_liked_users: "Häufigste Likes für" most_replied_to_users: "Häufigste Antworten an" no_likes: "Noch keine Likes." - associated_accounts: "Anmeldeinformationen" + top_categories: "Top-Kategorien" + topics: "Themen" + replies: "Antworten" ip_address: title: "Letzte IP-Adresse" registration_ip_address: @@ -948,8 +993,8 @@ de: reached: "%{relativeAge} – %{rate} hat die eingestellte Grenze für die Site von %{siteSettingRate} erreicht." exceeded: "%{relativeAge} – %{rate} hat die eingestellte Grenze für die Site von %{siteSettingRate} überschritten." rate: - one: ein Fehler/%{duration} - other: '%{count} Fehler/%{duration}' + one: "ein Fehler/%{duration}" + other: "%{count} Fehler/%{duration}" learn_more: "mehr erfahren…" all_time: 'gesamt' all_time_desc: 'Erstellte Themen' @@ -977,8 +1022,8 @@ de: hide_session: "Erinnere mich morgen" hide_forever: "Nein danke" hidden_for_session: "In Ordnung, ich frag dich morgen wieder. Du kannst dir auch jederzeit unter „Anmelden“ ein Benutzerkonto erstellen." - intro: "Hallo! :heart_eyes: Es sieht so aus, als würde dir die Diskussion gefallen. Du hast aber noch kein Benutzerkonto." - value_prop: "Wenn du ein Benutzerkonto anlegst, merken wir uns, was du gelesen hast, damit du immer dort fortsetzen kannst, wo du aufgehört hast. Du kannst auch Benachrichtigungen – hier oder per E-Mail – erhalten, wenn neue Beiträge verfasst werden. Beiträge, die dir gefallen, kannst du mit einem Like versehen und diese Freude mit allen teilen. :heartbeat:" + intro: "Hallo! Es sieht so aus, als ob dir diese Diskussion gefällt, aber Du hast bislang noch kein Konto angelegt." + value_prop: "Wenn du ein Benutzerkonto anlegst, merken wir uns, was du gelesen hast, damit du immer dort fortsetzen kannst, wo du aufgehört hast. Du kannst auch Benachrichtigungen – hier oder per E-Mail – erhalten, wenn jemand auf deine Beiträge antwortet. Beiträge, die dir gefallen, kannst du mit einem Like versehen und diese Freude mit allen teilen. :heartpulse:" summary: enabled_description: "Du siehst gerade eine Zusammenfassung des Themas: die interessantesten Beiträge, die von der Community bestimmt wurden." description: "Es gibt {{replyCount}} Antworten." @@ -992,7 +1037,8 @@ de: disable: "Gelöschte Beiträge anzeigen" private_message_info: title: "Nachricht" - invite: "Andere einladen…" + invite: "Lade andere ein" + edit: "Hinzufügen oder Entfernen" leave_message: "Möchtest du diese Nachricht wirklich verlassen?" remove_allowed_user: "Willst du {{name}} wirklich aus dieser Unterhaltung entfernen?" remove_allowed_group: "Willst du {{name}} wirklich aus dieser Unterhaltung entfernen?" @@ -1036,9 +1082,14 @@ de: password: "Passwort" second_factor_title: "Zwei-Faktor-Authentifizierung" second_factor_description: "Bitte gib den Authentifizierungscode aus deiner App ein:" + second_factor_backup: "Anmeldung mit einem Wiederherstellungscode" + second_factor_backup_title: "Zwei-Faktor-Wiederherstellung" + second_factor_backup_description: "Bitte gib einen deiner Wiederherstellungs-Codes ein:" + second_factor: "Anmeldung mit Authenticator-App" email_placeholder: "E-Mail oder Benutzername" caps_lock_warning: "Feststelltaste ist aktiviert" error: "Unbekannter Fehler" + cookies_error: "Dein Browser scheint Cookies deaktiviert zu haben. Du kannst dich möglicherweise nicht anmelden, ohne diese zu aktivieren." rate_limit: "Warte bitte ein wenig, bevor du erneut versuchst dich anzumelden." blank_username: "Bitte gib deine E-Mail-Adresse oder deinen Benutzernamen ein." blank_username_or_password: "Bitte gib deine E-Mail-Adresse oder deinen Benutzernamen und dein Passwort ein." @@ -1063,25 +1114,28 @@ de: preferences: "Du musst angemeldet sein, um deine Benutzereinstellungen bearbeiten zu können." forgot: "Ich kann mich nicht an meine Zugangsdaten erinnern" not_approved: "Dein Benutzerkonto wurde noch nicht genehmigt. Du wirst per E-Mail benachrichtigt, sobald du dich anmelden kannst." - google: - title: "mit Google" - message: "Authentifiziere mit Google (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" google_oauth2: + name: "Google" title: "mit Google" message: "Authentifiziere mit Google (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" twitter: + name: "Twitter" title: "mit Twitter" message: "Authentifiziere mit Twitter (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" instagram: + name: "Instagram" title: "mit Instagram" message: "Authentifiziere mit Instagram (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" facebook: + name: "Facebook" title: "mit Facebook" message: "Authentifiziere mit Facebook (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" yahoo: + name: "Yahoo" title: "mit Yahoo" message: "Authentifiziere mit Yahoo (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" github: + name: "GitHub" title: "mit GitHub" message: "Authentifiziere mit GitHub (stelle sicher, dass keine Pop-up-Blocker aktiviert sind)" invites: @@ -1120,13 +1174,14 @@ de: default_header_text: Auswählen… no_content: Keine Treffer gefunden filter_placeholder: Suchen… + filter_placeholder_with_any: Suchen oder erzeugen create: "Erstelle: '{{content}}'" max_content_reached: - one: Du kannst nur einen Eintrag auswählen. - other: Du kannst nur {{count}} Einträge auswählen. + one: "Du kannst nur einen Eintrag auswählen." + other: "Du kannst nur {{count}} Einträge auswählen." min_content_not_reached: - one: Wähle mindestens einen Eintrag aus. - other: Wähle mindestens {{count}} Einträge aus. + one: "Wähle mindestens einen Eintrag aus." + other: "Wähle mindestens {{count}} Einträge aus." emoji_picker: filter_placeholder: Emoji suchen people: Personen @@ -1169,8 +1224,8 @@ de: drafts_offline: "Entwürfe offline" group_mentioned_limit: "Warnung! Du erwähnst {{group}}, aber diese Gruppe hat mehr Mitglieder als der Administrator als die maximale Anzahl von {{max}} Benutzern eingestellt hat, die gleichzeitig erwähnt werden können. Keiner davon wird benachrichtigt." group_mentioned: - one: Indem du {{group}} erwähnst, bist du dabei, eine Person zu benachrichtigen – bist du dir sicher? - other: Indem du {{group}} erwähnst, bist du dabei, {{count}} Personen zu benachrichtigen – bist du dir sicher? + one: "Indem du {{group}} erwähnst, bist du dabei, eine Person zu benachrichtigen – bist du dir sicher?" + other: "Indem du {{group}} erwähnst, bist du dabei, {{count}} Personen zu benachrichtigen – bist du dir sicher?" cannot_see_mention: category: "Du hast {{username}} erwähnt, aber diese Person wird nicht benachrichtigt da sie keinen Zugriff auf diese Kategorie hat. Füge sie einer Gruppe hinzu die Zugriff auf diese Kategorie hat." private: "Du hast {{username}} erwähnt, aber diese Person wird nicht benachrichtigt da sie diese persönliche Nachricht nicht sehen kann. Lade sie zu dieser PM ein." @@ -1246,6 +1301,9 @@ de: body: "Im Augenblick wird diese Nachricht nur an dich selbst gesendet!" admin_options_title: "Optionale Team-Einstellungen für dieses Thema" composer_actions: + reply: Antworten + draft: Entwurf + edit: Bearbeiten reply_to_post: label: "Antworte auf Beitrag %{postNumber} von %{postUsername}" desc: Antworte auf einen bestimmten Beitrag @@ -1264,16 +1322,19 @@ de: create_topic: label: "Neues Thema" shared_draft: - label: "Gemeinsame Vrolage" + label: "Gemeinsame Vorlage" desc: "Entwerfe ein Thema, das nur für das Team sichtbar ist." + toggle_topic_bump: + label: "Bump des Themas umschalten" + desc: "Antworten ohne das Bump-Datum des Themas zu ändern." notifications: tooltip: regular: - one: 1 nicht gesehene Benachrichtigung - other: '{{count}} nicht gesehene Benachrichtigungen' + one: "1 nicht gesehene Benachrichtigung" + other: "{{count}} nicht gesehene Benachrichtigungen" message: - one: 1 ungelesene Nachricht - other: '{{count}} ungelesene Nachrichten' + one: "1 ungelesene Nachricht" + other: "{{count}} ungelesene Nachrichten" title: "Benachrichtigung über @Name-Erwähnungen, Antworten auf deine Beiträge und Themen, Nachrichten, usw." none: "Die Benachrichtigungen können derzeit nicht geladen werden." empty: "Keine Benachrichtigungen gefunden." @@ -1288,8 +1349,8 @@ de: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} und jemand anderes {{description}} - other: {{username}}, {{username2}} und {{count}} andere {{description}} + one: "{{username}}, {{username2}} und jemand anderes {{description}}" + other: "{{username}}, {{username2}} und {{count}} andere {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1300,8 +1361,8 @@ de: topic_reminder: "{{username}} {{description}}" watching_first_post: "New Topic {{description}}" group_message_summary: - one: '{{count}} Nachricht in deinem {{group_name}} Posteingang' - other: '{{count}} Nachrichten in deinem {{group_name}} Posteingang' + one: "{{count}} Nachricht in deinem {{group_name}} Posteingang" + other: "{{count}} Nachrichten in deinem {{group_name}} Posteingang" popup: mentioned: '{{username}} hat dich in "{{topic}}" - {{site_title}} erwähnt' group_mentioned: '{{username}} hat dich in "{{topic}}" - {{site_title}} erwähnt' @@ -1338,8 +1399,8 @@ de: clear_all: "Auswahl aufheben" too_short: "Der Suchbegriff ist zu kurz." result_count: - one: 1 Ergebnis für {{term}} - other: {{count}}{{plus}} Ergebnisse für {{term}} + one: "1 Ergebnis für {{term}}" + other: "{{count}}{{plus}} Ergebnisse für {{term}}" title: "suche nach Themen, Beiträgen, Benutzern oder Kategorien" full_page_title: "suche nach Themen oder Beiträgen" no_results: "Keine Ergebnisse gefunden." @@ -1430,8 +1491,8 @@ de: notification_level: "Benachrichtigungen" choose_new_category: "Neue Kategorie für die gewählten Themen:" selected: - one: Du hast ein Thema ausgewählt. - other: Du hast {{count}} Themen ausgewählt. + one: "Du hast ein Thema ausgewählt." + other: "Du hast {{count}} Themen ausgewählt." change_tags: "Schlagwörter ersetzen" append_tags: "Schlagwörter hinzufügen" choose_new_tags: "Neue Schlagwörter für die gewählten Themen wählen:" @@ -1464,8 +1525,8 @@ de: search: "Es gibt keine weiteren Suchergebnisse." topic: filter_to: - one: 1 Beitrag im Thema - other: '{{count}} Beiträge im Thema' + one: "1 Beitrag im Thema" + other: "{{count}} Beiträge im Thema" create: 'Neues Thema' create_long: 'Ein neues Thema erstellen' open_draft: "Entwurf öffnen" @@ -1483,10 +1544,10 @@ de: new: 'neues Thema' unread: 'ungelesen' new_topics: - one: 1 neues Thema + one: '1 neues Thema' other: '{{count}} neue Themen' unread_topics: - one: 1 ungelesenes Thema + one: '1 ungelesenes Thema' other: '{{count}} ungelesene Themen' title: 'Thema' invalid_access: @@ -1500,17 +1561,17 @@ de: title: "Thema nicht gefunden" description: "Entschuldige, wir konnten dieses Thema nicht finden. Wurde es vielleicht von einem Moderator entfernt?" total_unread_posts: - one: du hast einen ungelesenen Beitrag in diesem Thema - other: du hast {{count}} ungelesene Beiträge in diesem Thema + one: "du hast einen ungelesenen Beitrag in diesem Thema" + other: "du hast {{count}} ungelesene Beiträge in diesem Thema" unread_posts: - one: Du hast einen ungelesenen, alten Beitrag zu diesem Thema - other: Du hast {{count}} ungelesene, alte Beiträge zu diesem Thema + one: "Du hast einen ungelesenen, alten Beitrag zu diesem Thema" + other: "Du hast {{count}} ungelesene, alte Beiträge zu diesem Thema" new_posts: - one: Es gibt einen neuen Beitrag zu diesem Thema seit du es das letzte Mal gelesen hast - other: Es gibt {{count}} neue Beiträge zu diesem Thema seit du es das letzte Mal gelesen hast + one: "Es gibt einen neuen Beitrag zu diesem Thema seit du es das letzte Mal gelesen hast" + other: "Es gibt {{count}} neue Beiträge zu diesem Thema seit du es das letzte Mal gelesen hast" likes: - one: Es gibt ein Like in diesem Thema - other: Es gibt {{count}} Likes in diesem Thema + one: "Es gibt ein Like in diesem Thema" + other: "Es gibt {{count}} Likes in diesem Thema" back_to_list: "Zurück zur Themenliste" options: "Themen-Optionen" show_links: "zeige Links innerhalb dieses Themas" @@ -1574,8 +1635,8 @@ de: auto_reminder: "Du wirst über dieses Thema erinnert %{timeLeft}." auto_close_title: 'Automatisches Schließen' auto_close_immediate: - one: Der letzte Beitrag in diesem Thema ist bereits eine Stunde alt. Das Thema wird daher sofort geschlossen. - other: Der letzte Beitrag in diesem Thema ist bereits %{count} Stunden alt. Das Thema wird daher sofort geschlossen. + one: "Der letzte Beitrag in diesem Thema ist bereits eine Stunde alt. Das Thema wird daher sofort geschlossen." + other: "Der letzte Beitrag in diesem Thema ist bereits %{count} Stunden alt. Das Thema wird daher sofort geschlossen." timeline: back: "Zurück" back_description: "Gehe zurück zum letzten ungelesenen Beitrag" @@ -1590,6 +1651,8 @@ de: jump_prompt_of: "von %{count} Beiträgen" jump_prompt_long: "Zu welchem Beitrag möchtest du springen?" jump_bottom_with_number: "springe zu Beitrag %{post_number}" + jump_prompt_to_date: "zu Datum" + jump_prompt_or: "oder" total: Beiträge insgesamt current: aktueller Beitrag notifications: @@ -1651,6 +1714,7 @@ de: reset_read: "„Gelesen“ zurücksetzen" make_public: "Umwandeln in öffentliches Thema" make_private: "in Nachricht umwandeln" + reset_bump_date: "Bump-Datum zurücksetzen" feature: pin: "Thema anheften" unpin: "Thema loslösen" @@ -1683,8 +1747,8 @@ de: pin_validation: "Ein Datum wird benötigt um diesen Beitrag anzuheften." not_pinned: "Es sind in {{categoryLink}} keine Themen angeheftet." already_pinned: - one: 'Momentan in {{categoryLink}} angeheftete Themen: 1' - other: 'Momentan in {{categoryLink}} angeheftete Themen: {{count}}' + one: "Momentan in {{categoryLink}} angeheftete Themen: 1" + other: "Momentan in {{categoryLink}} angeheftete Themen: {{count}}" pin_globally: "Dieses Thema am Anfang aller Themenlisten anzeigen bis" confirm_pin_globally: "Es gibt bereits {{count}} global angeheftete Themen. Zu viele angeheftete Themen könnten neue und unbekannte Benutzer leicht überwältigen. Willst du wirklich noch ein weiteres Thema global anheften?" unpin_globally: "Dieses Thema vom Anfang aller Themenlisten loslösen." @@ -1692,8 +1756,8 @@ de: global_pin_note: "Benutzer können das Thema für sich selbst loslösen." not_pinned_globally: "Es sind keine Themen global angeheftet." already_pinned_globally: - one: 'Momentan global angeheftete Themen: 1' - other: 'Momentan global angeheftete Themen: {{count}}' + one: "Momentan global angeheftete Themen: 1" + other: "Momentan global angeheftete Themen: {{count}}" make_banner: "Macht das Thema zu einem Ankündigungsbanner, welcher am Anfang aller Seiten angezeigt wird." remove_banner: "Entfernt das Ankündigungsbanner vom Anfang aller Seiten." banner_note: "Benutzer können das Ankündigungsbanner schließen und so für sich selbst dauerhaft ausblenden. Es kann zu jeder Zeit höchstens ein Thema ein Banner sein." @@ -1730,8 +1794,8 @@ de: login_reply: 'Anmelden, um zu antworten' filters: n_posts: - one: 1 Beitrag - other: '{{count}} Beiträge' + one: "1 Beitrag" + other: "{{count}} Beiträge" cancel: "Filter entfernen" split_topic: title: "In neues Thema verschieben" @@ -1739,15 +1803,15 @@ de: topic_name: "Bezeichnung des neuen Themas" error: "Beim Verschieben der Beiträge ins neue Thema ist ein Fehler aufgetreten." instructions: - one: Du bist dabei, ein neues Thema zu erstellen und den ausgewählten Beitrag dorthin zu verschieben. - other: Du bist dabei, ein neues Thema zu erstellen und die {{count}} ausgewählten Beiträge dorthin zu verschieben. + one: "Du bist dabei, ein neues Thema zu erstellen und den ausgewählten Beitrag dorthin zu verschieben." + other: "Du bist dabei, ein neues Thema zu erstellen und die {{count}} ausgewählten Beiträge dorthin zu verschieben." merge_topic: title: "In ein vorhandenes Thema verschieben" action: "in ein vorhandenes Thema verschieben" error: "Beim Verschieben der Beiträge in das Thema ist ein Fehler aufgetreten." instructions: - one: Bitte wähle das Thema, in welches du den Beitrag verschieben möchtest. - other: Bitte wähle das Thema, in welches du die {{count}} Beiträge verschieben möchtest. + one: "Bitte wähle das Thema, in welches du den Beitrag verschieben möchtest." + other: "Bitte wähle das Thema, in welches du die {{count}} Beiträge verschieben möchtest." merge_posts: title: "Ausgewählte Beiträge zusammenführen" action: "ausgewählte Beiträge zusammenführen" @@ -1759,8 +1823,8 @@ de: label: "Neuer Eigentümer der Beiträge" placeholder: "Benutzername des neuen Eigentümers" instructions: - one: Bitte wähle den neuen Eigentümer für den Beitrag von {{old_user}}. - other: Bitte wähle den neuen Eigentümer für {{count}} Beiträge von {{old_user}}. + one: "Bitte wähle den neuen Eigentümer für den Beitrag von {{old_user}}." + other: "Bitte wähle den neuen Eigentümer für {{count}} Beiträge von {{old_user}}." instructions_warn: "Bitte beachte, dass alle Benachrichtigungen für diesen Beitrag nicht rückwirkend auf den neuen Benutzer übertragen werden." change_timestamp: title: "Zeitstempel ändern…" @@ -1789,7 +1853,7 @@ de: deselect_all: keine auswählen description: one: Du hast 1 Beitrag ausgewählt. - other: Du hast {{count}} Beiträge ausgewählt. + other: "Du hast {{count}} Beiträge ausgewählt." post: quote_reply: "Zitat" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1804,28 +1868,28 @@ de: show_full: "Zeige ganzen Beitrag" show_hidden: 'Versteckte Inhalte anzeigen.' deleted_by_author: - one: (Beitrag wurde vom Autor zurückgezogen und wird automatisch in %{count} Stunde gelöscht, sofern dieser Beitrag nicht gemeldet wird) - other: (Beitrag wurde vom Autor zurückgezogen und wird automatisch in %{count} Stunden gelöscht, sofern dieser Beitrag nicht gemeldet wird) + one: "(Beitrag wurde vom Autor zurückgezogen und wird automatisch in %{count} Stunde gelöscht, sofern dieser Beitrag nicht gemeldet wird)" + other: "(Beitrag wurde vom Autor zurückgezogen und wird automatisch in %{count} Stunden gelöscht, sofern dieser Beitrag nicht gemeldet wird)" collapse: "zuklappen" expand_collapse: "erweitern/minimieren" locked: "Ein Team-Mitglied hat diesen Beitrag für die weitere Bearbeitung gesperrt" gap: - one: einen versteckten Beitrag anzeigen - other: '{{count}} versteckte Beiträge anzeigen' + one: "einen versteckten Beitrag anzeigen" + other: "{{count}} versteckte Beiträge anzeigen" unread: "Beitrag ist ungelesen" has_replies: - one: '{{count}} Antwort' - other: '{{count}} Antworten' + one: "{{count}} Antwort" + other: "{{count}} Antworten" has_likes: - one: '{{count}} Like' - other: '{{count}} Likes' + one: "{{count}} Like" + other: "{{count}} Likes" has_likes_title: - one: dieser Beitrag gefällt 1 Person - other: dieser Beitrag gefällt {{count}} Personen + one: "dieser Beitrag gefällt 1 Person" + other: "dieser Beitrag gefällt {{count}} Personen" has_likes_title_only_you: "dir gefällt dieser Beitrag" has_likes_title_you: - one: dir und einer weiteren Person gefällt dieser Beitrag - other: dir und {{count}} weiteren Personen gefällt dieser Beitrag + one: "dir und einer weiteren Person gefällt dieser Beitrag" + other: "dir und {{count}} weiteren Personen gefällt dieser Beitrag" errors: create: "Entschuldige, es gab einen Fehler beim Anlegen des Beitrags. Bitte versuche es noch einmal." edit: "Entschuldige, es gab einen Fehler beim Bearbeiten des Beitrags. Bitte versuche es noch einmal." @@ -1865,11 +1929,11 @@ de: delete_replies: confirm: "Möchtest du auch die Antworten auf diese Beiträge löschen?" direct_replies: - one: Ja, und eine direkte Antwort - other: Ja, und {{count}} direkte Antworten + one: "Ja, und eine direkte Antwort" + other: "Ja, und {{count}} direkte Antworten" all_replies: - one: Ja, und eine Antwort - other: Ja, und {{count}} Antworten + one: "Ja, und eine Antwort" + other: "Ja, und {{count}} Antworten" just_the_post: "Nein, nur diesen Beitrag" admin: "Administrative Aktionen" wiki: "Wiki erstellen" @@ -1884,18 +1948,19 @@ de: lock_post_description: "verhindern, dass der Autor den Beitrag bearbeitet" unlock_post: "Beitrag entsperren" unlock_post_description: "erlaube, dass der Autor den Beitrag bearbeitet" + delete_topic_disallowed_modal: "Du hast keine Berechtigung, dieses Thema zu löschen. Wenn du wirklich möchtest, dass es gelöscht wird, melde es mit einer Begründung, um einen Moderator darauf aufmerksam zu machen." + delete_topic_disallowed: "du hast keine Berechtigung, dieses Thema zu löschen" actions: flag: 'Melden' defer_flags: - one: Meldung ignorieren - other: Meldungen ignorieren + one: "Meldung ignorieren" + other: "Meldungen ignorieren" undo: off_topic: "Meldung widerrufen" spam: "Meldung widerrufen" inappropriate: "Meldung widerrufen" bookmark: "Lesezeichen entfernen" like: "Gefällt mir nicht mehr" - vote: "Stimme widerrufen" people: off_topic: "meldete/n dies als „am Thema vorbei“" spam: "Melde es als Spam" @@ -1905,9 +1970,8 @@ de: bookmark: "hat/haben ein Lesezeichen gesetzt" like: "gefällt dies" like_capped: - one: und {{count}} anderen gefällt das - other: und {{count}} anderen gefällt das - vote: "hat/haben dafür gestimmt" + one: "und {{count}} anderen gefällt das" + other: "und {{count}} anderen gefällt das" by_you: off_topic: "Du hast das als „am Thema vorbei“ gemeldet" spam: "Du hast das als Spam gemeldet" @@ -1916,65 +1980,58 @@ de: notify_user: "Du hast diesem Benutzer eine Nachricht gesendet" bookmark: "Du hast bei diesem Beitrag ein Lesezeichen gesetzt" like: "Dir gefällt dieser Beitrag" - vote: "Du hast für diesen Beitrag gestimmt" by_you_and_others: off_topic: - one: Du und eine weitere Person haben das als „am Thema vorbei“ gemeldet - other: Du und {{count}} weitere Personen haben das als „am Thema vorbei“ gemeldet + one: "Du und eine weitere Person haben das als „am Thema vorbei“ gemeldet" + other: "Du und {{count}} weitere Personen haben das als „am Thema vorbei“ gemeldet" spam: - one: Du und eine weitere Person haben das als Spam gemeldet - other: Du und {{count}} weitere Personen haben das als Spam gemeldet + one: "Du und eine weitere Person haben das als Spam gemeldet" + other: "Du und {{count}} weitere Personen haben das als Spam gemeldet" inappropriate: - one: Du und eine weitere Person haben das als Unangemessen gemeldet - other: Du und {{count}} weitere Personen haben das als Unangemessen gemeldet + one: "Du und eine weitere Person haben das als Unangemessen gemeldet" + other: "Du und {{count}} weitere Personen haben das als Unangemessen gemeldet" notify_moderators: - one: Du und eine weitere Person haben dies den Moderatoren gemeldet - other: Du und {{count}} weitere Personen haben dies den Moderatoren gemeldet + one: "Du und eine weitere Person haben dies den Moderatoren gemeldet" + other: "Du und {{count}} weitere Personen haben dies den Moderatoren gemeldet" notify_user: - one: Du und eine weitere Person haben diesem Benutzer eine Nachricht gesendet - other: Du und {{count}} weitere Personen haben diesem Benutzer eine Nachricht gesendet + one: "Du und eine weitere Person haben diesem Benutzer eine Nachricht gesendet" + other: "Du und {{count}} weitere Personen haben diesem Benutzer eine Nachricht gesendet" bookmark: - one: Du und eine weitere Person haben bei diesem Beitrag ein Lesezeichen gesetzt - other: Du und {{count}} weitere Personen haben bei diesem Beitrag ein Lesezeichen gesetzt + one: "Du und eine weitere Person haben bei diesem Beitrag ein Lesezeichen gesetzt" + other: "Du und {{count}} weitere Personen haben bei diesem Beitrag ein Lesezeichen gesetzt" like: - one: Dir und einer weiteren Person gefällt dieser Beitrag - other: Dir und {{count}} weiteren Personen gefällt dieser Beitrag - vote: - one: Du und eine weitere Person haben für diesen Beitrag gestimmt - other: Du und {{count}} weitere Personen haben für diesen Beitrag gestimmt + one: "Dir und einer weiteren Person gefällt dieser Beitrag" + other: "Dir und {{count}} weiteren Personen gefällt dieser Beitrag" by_others: off_topic: - one: Eine Person hat das als „am Thema vorbei“ gemeldet - other: '{{count}} Personen haben das als „am Thema vorbei“ gemeldet' + one: "Eine Person hat das als „am Thema vorbei“ gemeldet" + other: "{{count}} Personen haben das als „am Thema vorbei“ gemeldet" spam: - one: Eine Person hat das als Spam gemeldet - other: '{{count}} Personen haben das als Spam gemeldet' + one: "Eine Person hat das als Spam gemeldet" + other: "{{count}} Personen haben das als Spam gemeldet" inappropriate: - one: Eine Person hat das als Unangemessen gemeldet - other: '{{count}} Personen haben das als Unangemessen gemeldet' + one: "Eine Person hat das als Unangemessen gemeldet" + other: "{{count}} Personen haben das als Unangemessen gemeldet" notify_moderators: - one: Eine Person hat dies den Moderatoren gemeldet - other: '{{count}} Personen haben dies den Moderatoren gemeldet' + one: "Eine Person hat dies den Moderatoren gemeldet" + other: "{{count}} Personen haben dies den Moderatoren gemeldet" notify_user: - one: Eine Person hat diesem Benutzer eine Nachricht gesendet - other: '{{count}} Personen haben diesem Benutzer eine Nachricht gesendet' + one: "Eine Person hat diesem Benutzer eine Nachricht gesendet" + other: "{{count}} Personen haben diesem Benutzer eine Nachricht gesendet" bookmark: - one: Eine Person hat bei diesem Beitrag ein Lesezeichen gesetzt - other: '{{count}} Personen haben bei diesem Beitrag ein Lesezeichen gesetzt' + one: "Eine Person hat bei diesem Beitrag ein Lesezeichen gesetzt" + other: "{{count}} Personen haben bei diesem Beitrag ein Lesezeichen gesetzt" like: - one: Einer Person gefällt dieser Beitrag - other: '{{count}} Personen gefällt dieser Beitrag' - vote: - one: Eine Person hat für diesen Beitrag gestimmt - other: '{{count}} Personen haben für diesen Beitrag gestimmt' + one: "Einer Person gefällt dieser Beitrag" + other: "{{count}} Personen gefällt dieser Beitrag" delete: confirm: - one: Möchtest du wirklich diesen Beitrag löschen? - other: Möchtest du wirklich diese {{count}} Beiträge löschen? + one: "Möchtest du wirklich diesen Beitrag löschen?" + other: "Möchtest du wirklich diese {{count}} Beiträge löschen?" merge: confirm: - one: Möchtest du diese Beiträge wirklich zusammenführen? - other: Möchtest du diese {{count}} Beiträge wirklich zusammenführen? + one: "Möchtest du diese Beiträge wirklich zusammenführen?" + other: "Möchtest du diese {{count}} Beiträge wirklich zusammenführen?" revisions: controls: first: "Erste Überarbeitung" @@ -2012,7 +2069,7 @@ de: can: 'kann… ' none: '(keine Kategorie)' all: 'Alle Kategorien' - choose: 'Kategorie auswählen…' + choose: 'Kategorie…' edit: 'bearbeiten' edit_long: "Bearbeiten" view: 'Zeige Themen dieser Kategorie' @@ -2069,13 +2126,17 @@ de: allow_badges_label: "Erlaube das Verleihen von Abzeichen in dieser Kategorie." edit_permissions: "Berechtigungen bearbeiten" add_permission: "Berechtigung hinzufügen" + require_topic_approval: "Erfordere Moderator-Genehmigung für alle neuen Themen" + require_reply_approval: "Erfordere Moderator-Genehmigung für alle neuen Antworten" this_year: "dieses Jahr" - position: "Position" + position: "Position:" default_position: "Standardposition" position_disabled: "Kategorien werden in der Reihenfolge der Aktivität angezeigt. Um die Reihenfolge von Kategorien in Listen zu steuern," position_disabled_click: 'aktiviere die Einstellung „fixed category positions“.' minimum_required_tags: 'Minimal Anzahl an Schlagwörtern, die ein Thema erfordert' parent: "Übergeordnete Kategorie" + num_auto_bump_daily: 'Anzahl der offenen Themen, die automatisch täglich nach oben verschoben werden' + navigate_to_first_post_after_read: 'Gehe zum ersten Beitrag, nachdem Themen gelesen wurden' notifications: watching: title: "Beobachten" @@ -2116,7 +2177,7 @@ de: notify_action: 'Nachricht' official_warning: 'Offizielle Warnung' delete_spammer: "Spammer löschen" - delete_confirm_MF: "Du wirst {POSTS, plural, one {einen Beitrag} other {# Beiträge}} und {TOPICS, plural, one {ein Thema} other {# Themen}} von diesem Benutzer löschen, sein Konto entfernen, seine IP-Adresse %{ip_address} für Neuanmeldungen sperren und die E-Mail-Adresse %{ip_address} auf eine permanente Sperrliste setzen. Bist du dir sicher, dass dieser Benutzer wirklich ein Spammer ist?" + delete_confirm_MF: "Du wirst {POSTS, plural, one {einen Beitrag} other {# Beiträge}} und {TOPICS, plural, one {ein Thema} other {# Themen}} von diesem Benutzer löschen, sein Konto entfernen, seine IP-Adresse {ip_address} für Neuanmeldungen sperren und die E-Mail-Adresse {email} auf eine permanente Sperrliste setzen. Bist du dir sicher, dass dieser Benutzer wirklich ein Spammer ist?" yes_delete_spammer: "Ja, lösche den Spammer" ip_address_missing: "(nicht verfügbar)" hidden_email_address: "(versteckt)" @@ -2132,14 +2193,14 @@ de: custom_placeholder_notify_moderators: "Bitte lass uns wissen, was genau dich beunruhigt. Verweise, wenn möglich, auf relevante Links und Beispiele." custom_message: at_least: - one: gib mindestens ein Zeichen ein - other: gib mindestens {{count}} Zeichen ein + one: "gib mindestens ein Zeichen ein" + other: "gib mindestens {{count}} Zeichen ein" more: - one: eine weitere… - other: '{{count}} weitere…' + one: "eine weitere…" + other: "{{count}} weitere…" left: - one: eine übrig - other: '{{count}} übrig' + one: "eine übrig" + other: "{{count}} übrig" flagging_topic: title: "Danke für deine Mithilfe!" action: "Thema melden" @@ -2150,13 +2211,13 @@ de: links_title: "Beliebte Links" links_shown: "mehr Links anzeigen…" clicks: - one: 1 Klick - other: '%{count} Klicks' + one: "1 Klick" + other: "%{count} Klicks" post_links: about: "weitere Links für diesen Beitrag aufklappen" title: - one: ein weiterer - other: '%{count} weitere' + one: "ein weiterer" + other: "%{count} weitere" topic_statuses: warning: help: "Dies ist eine offizielle Warnung." @@ -2186,22 +2247,22 @@ de: original_post: "Original-Beitrag" views: "Aufrufe" views_lowercase: - one: Aufruf - other: Aufrufe + one: "Aufruf" + other: "Aufrufe" replies: "Antworten" views_long: - one: dieses Thema wurde 1-mal betrachtet - other: dieses Thema wurde {{number}}-mal betrachtet + one: "dieses Thema wurde 1-mal betrachtet" + other: "dieses Thema wurde {{number}}-mal betrachtet" activity: "Aktivität" likes: "Likes" likes_lowercase: - one: Like - other: Likes + one: "Like" + other: "Likes" likes_long: "es gibt {{number}} Likes in diesem Thema" users: "Benutzer" users_lowercase: - one: Benutzer - other: Benutzer + one: "Benutzer" + other: "Benutzer" category_title: "Kategorie" history: "Verlauf" changed_by: "von {{author}}" @@ -2215,8 +2276,8 @@ de: latest: title: "Aktuell" title_with_count: - one: Aktuell (1) - other: Aktuell ({{count}}) + one: "Aktuell (1)" + other: "Aktuell ({{count}})" help: "die zuletzt geänderten Themen" hot: title: "Beliebt" @@ -2234,21 +2295,21 @@ de: unread: title: "Ungelesen" title_with_count: - one: Ungelesen (1) - other: Ungelesen ({{count}}) + one: "Ungelesen (1)" + other: "Ungelesen ({{count}})" help: "Themen mit ungelesenen Beiträgen, die du derzeit beobachtest oder verfolgst" lower_title_with_count: - one: 1 ungelesenes - other: '{{count}} ungelesene' + one: "1 ungelesenes" + other: "{{count}} ungelesene" new: lower_title_with_count: - one: 1 neues - other: '{{count}} neue' + one: "1 neues" + other: "{{count}} neue" lower_title: "neu" title: "Neu" title_with_count: - one: Neu (1) - other: Neu ({{count}}) + one: "Neu (1)" + other: "Neu ({{count}})" help: "Themen, die in den letzten paar Tagen erstellt wurden" posted: title: "Meine Beiträge" @@ -2259,8 +2320,8 @@ de: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "aktuelle Themen in der Kategorie {{categoryName}}" top: title: "Angesagt" @@ -2304,6 +2365,7 @@ de: bookmarks: 'g, b Lesezeichen' profile: 'g, p Profil' messages: 'g, m Nachrichten' + drafts: 'g, d Entwürfe' navigation: title: 'Navigation' jump: '# Gehe zu Beitrag #' @@ -2348,22 +2410,22 @@ de: print: 'strg+p Thema ausdrucken' badges: earned_n_times: - one: Abzeichen 1-mal erhalten - other: Abzeichen %{count}-mal erhalten + one: "Abzeichen 1-mal erhalten" + other: "Abzeichen %{count}-mal erhalten" granted_on: "Verliehen %{date}" others_count: "Andere mit diesem Abzeichen (%{count})" title: Abzeichen allow_title: "Du kannst dieses Abzeichen als Titel verwenden" multiple_grant: "Du kannst dieses Abzeichen mehrmals verliehen bekommen" badge_count: - one: 1 Abzeichen - other: '%{count} Abzeichen' + one: "1 Abzeichen" + other: "%{count} Abzeichen" more_badges: - one: +1 weiteres - other: +%{count} weitere + one: "+1 weiteres" + other: "+%{count} weitere" granted: - one: 1-mal verliehen - other: '%{count}-mal verliehen' + one: "1-mal verliehen" + other: "%{count}-mal verliehen" select_badge_for_title: Wähle ein Abzeichen als deinen Titel aus none: "(keine)" successfully_granted: "%{badge} erfolgreich verliehen an %{username}" @@ -2397,8 +2459,8 @@ de: choose_for_topic: "optionale Schlagwörter" delete_tag: "Schlagwört löschen" delete_confirm: - one: Bist du sicher, dass du dieses Schlagwort löschen und von einem zugeordneten Thema entfernen möchtest? - other: Bist du sicher, dass du dieses Schlagwort löschen und von {{count}} zugeordneten Themen entfernen möchtest? + one: "Bist du sicher, dass du dieses Schlagwort löschen und von einem zugeordneten Thema entfernen möchtest?" + other: "Bist du sicher, dass du dieses Schlagwort löschen und von {{count}} zugeordneten Themen entfernen möchtest?" delete_confirm_no_topics: "Bist du sicher, dass du dieses Schlagwort löschen möchtest?" rename_tag: "Schlagwort umbenennen" rename_instructions: "Neuen Namen für das Schlagwort wählen:" @@ -2479,6 +2541,8 @@ de: admin: title: 'Discourse-Administrator' moderator: 'Moderator' + reports: + title: "Liste verfügbarer Berichte" dashboard: title: "Übersicht" last_updated: "Übersicht zuletzt aktualisiert:" @@ -2515,8 +2579,16 @@ de: page_views_short: "Seitenaufrufe" show_traffic_report: "Zeige detaillierten Traffic-Bericht" community_health: Community-Gesundheit + moderators_activity: Moderator-Aktivität whats_new_in_discourse: "Was ist neu in Discourse?" activity_metrics: Aktivitätsmetriken + all_reports: "Alle Berichte" + general_tab: "Allgemein" + moderation_tab: "Moderation" + disabled: Deaktiviert + timeout_error: "Entschuldige bitte, die Warteschlange ist zu lang, bitte wähle ein kürzeres Intervall" + exception_error: "Entschuldige, ein Fehler während der Ausführung des Query ist aufgetreten" + too_many_requests: Du hast diese Aktion zu oft ausgeführt. Bitte warte bevor Du es erneut probierst. reports: trend_title: "%{percent} Veränderung. Aktuell %{current}, war %{prev} in vorherigem Zeitraum." today: "Heute" @@ -2534,6 +2606,9 @@ de: end_date: "Enddatum" groups: "Alle Gruppen" disabled: "Dieser Bericht ist deaktiviert" + totals_for_sample: "Insgesamt für Stichprobe" + total: "Gesamt aller Zeiten" + no_data: "Keine Daten anzuzeigen." trending_search: more: 'Suchprotokoll' disabled: 'Der Bericht über beliebte Suchen ist deaktiviert. Aktiviere Suchanfragen protokollieren, um die Daten zu erheben.' @@ -2579,11 +2654,11 @@ de: suspend_user: "Benutzer sperren" suspend_user_title: "Benutzer für diesen Beitrag sperren" replies: - one: '[1 Antwort]' - other: '[%{count} Antworten]' + one: "[1 Antwort]" + other: "[%{count} Antworten]" delete_replies: - one: Auch die %{count} Antwort auf diesen Beitrag löschen? - other: Auch die %{count} Antworten auf diesen Beitrag löschen? + one: "Auch die %{count} Antwort auf diesen Beitrag löschen?" + other: "Auch die %{count} Antworten auf diesen Beitrag löschen?" dispositions: agreed: "zugestimmt" disagreed: "abgelehnt" @@ -2739,6 +2814,9 @@ de: flag_event: name: "Meldung-Ereignis" details: "Wenn eine Meldung erstellt, akzeptiert, abgelehnt oder ignoriert wird." + queued_post_event: + name: "Ereignis nach Beitragsgenehmigung" + details: "Wenn eine Beitrag in der Warteschlange erstellt, genehmigt oder abgelehnt wird." delivery_status: title: "Versandstatus" inactive: "Inaktiv" @@ -2748,11 +2826,11 @@ de: none: "Es gibt keine verwandten Ereignisse." redeliver: "Neu zustellen" incoming: - one: Es gibt ein neues Ereignis - other: Es gibt {{count}} neue Ereignisse. + one: "Es gibt ein neues Ereignis" + other: "Es gibt {{count}} neue Ereignisse." completed_in: - one: In 1 Sekunde fertiggestellt. - other: In {{count}} Sekunden fertiggestellt. + one: "In 1 Sekunde fertiggestellt." + other: "In {{count}} Sekunden fertiggestellt." request: "Request" response: "Response" redeliver_confirm: "Bist du sicher dass du denselben Payload noch einmal übertragen möchtest?" @@ -2877,9 +2955,16 @@ de: revert: "Änderungen verwerfen" revert_confirm: "Möchtest du wirklich deine Änderungen verwerfen?" theme: + theme: "Theme" + component: "Komponente" + components: "Komponenten" import_theme: "Design importieren" customize_desc: "Anpassen:" title: "Designs" + modal_title: "Erstelle Theme" + create: "Erstelle" + create_type: "Typ:" + create_name: "Name:" long_title: "Farben, CSS und HTML-Inhalte deiner Seite erweitern" edit: "Bearbeiten" edit_confirm: "Dies ist ein Remote-Theme, wenn du CSS/HTML bearbeitest, werden deine Änderungen zurückgesetzt, wenn du das Theme das nächste Mal aktualisierst." @@ -2894,6 +2979,10 @@ de: color_scheme_select: "Wähle Farben für dieses Theme" custom_sections: "Benutzerdefinierte Abschnitte:" theme_components: "Theme-Komponenten" + switch_component: "Erzeuge Theme" + switch_component_alert: "Bist Du sicher, dass Du diese Komponente in ein Theme konvertieren möchtest? Dies wird es zu einem unabhängigen Theme machen und es wird als Kind von allen Themes entfernt werden." + switch_theme: "Komponente erzeugen" + switch_theme_alert: "Bist Du sicher, dass Du dieses Theme zu einer Komponente konvertieren möchtest? Es will als Elternteil von all Komponenten entfernt werden." uploads: "Uploads" no_uploads: "Du kannst Medieninhalte hochladen, die zu deinem Theme gehören, wie etwa Schriftarten und Bilder." add_upload: "Upload hinzufügen" @@ -2916,7 +3005,7 @@ de: public_key: "Gewähre dem folgenden öffentlichen Schlüssel den Zugriff auf das Repository:" about_theme: "Über das Theme" license: "Lizenz" - component_of: "Theme ist eine Komponente von:" + component_of: "Komponente von:" update_to_latest: "Aktualisieren auf neueste Version" check_for_updates: "Nach Aktualisierungen suchen" updating: "Wird aktualisiert..." @@ -2924,9 +3013,11 @@ de: add: "Hinzufügen" theme_settings: "Theme-Einstellungen" no_settings: "Dieses Theme hat keine Einstellungen." + empty: "Keine Teile" commits_behind: - one: Theme liegt 1 Commit zurück! - other: Theme liegt {{count}} Commits zurück! + one: "Theme liegt 1 Commit zurück!" + other: "Theme liegt {{count}} Commits zurück!" + compare_commits: "(Siehe neue Beiträge)" scss: text: "CSS" title: "Gib benutzerdefiniertes CSS ein, wir akzeptieren alle gültigen CSS und SCSS-Stile" @@ -3058,7 +3149,6 @@ de: address_placeholder: "name@example.com" type_placeholder: "zusammenfassen, registrieren…" reply_key_placeholder: "Antwort-Schlüssel" - skipped_reason_placeholder: "Grund" moderation_history: performed_by: "Durchgeführt von" no_results: "Es ist keine Moderationshistorie verfügbar." @@ -3158,6 +3248,7 @@ de: create_badge: "Abzeichen erstellen" change_badge: "Abzeichen ändern" delete_badge: "Abzeichen löschen" + merge_user: "Benutzer zusammenführen" screened_emails: title: "Gefilterte E-Mails" description: "Wenn jemand ein Konto erstellt, werden die folgenden E-Mail-Adressen überprüft und es wird die Anmeldung blockiert oder eine andere Aktion ausgeführt." @@ -3209,8 +3300,8 @@ de: clear_filter: "Zurücksetzen" show_words: "Wörter anzeigen" word_count: - one: 1 Wort - other: '%{count} Wörter' + one: "1 Wort" + other: "%{count} Wörter" actions: block: 'Blockieren' censor: 'Zensieren' @@ -3254,11 +3345,11 @@ de: staged: 'Vorbereitet' approved: "Genehmigt?" approved_selected: - one: Benutzer genehmigen - other: Benutzer genehmigen ({{count}}) + one: "Benutzer genehmigen" + other: "Benutzer genehmigen ({{count}})" reject_selected: - one: Benutzer ablehnen - other: Benutzer ablehnen ({{count}}) + one: "Benutzer ablehnen" + other: "Benutzer ablehnen ({{count}})" titles: active: 'Aktive Benutzer' new: 'Neue Benutzer' @@ -3276,11 +3367,11 @@ de: suspect: 'Verdächtige Benutzer' staged: 'Vorbereite Benutzer' reject_successful: - one: Erfolgreich 1 Benutzer abgelehnt. - other: Erfolgreich %{count} Benutzer abgelehnt. + one: "Erfolgreich 1 Benutzer abgelehnt." + other: "Erfolgreich %{count} Benutzer abgelehnt." reject_failures: - one: Konnte 1 Benutzer nicht ablehnen. - other: Konnte %{count} Benutzer nicht ablehnen. + one: "Konnte 1 Benutzer nicht ablehnen." + other: "Konnte %{count} Benutzer nicht ablehnen." not_verified: "Nicht überprüft" check_email: title: "E-Mail-Adresse des Benutzers anzeigen" @@ -3369,14 +3460,14 @@ de: delete_forbidden_because_staff: "Administratoren und Moderatoren können nicht gelöscht werden." delete_posts_forbidden_because_staff: "Löschen aller Beiträge von Administratoren und Moderatoren ist nicht möglich." delete_forbidden: - one: Benutzer können nicht gelöscht werden, wenn diese Beiträge haben. Lösche zuerst all dessen Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge, die älter als %{count} Tag sind, können nicht gelöscht werden.) - other: Benutzer können nicht gelöscht werden, wenn diese Beiträge haben. Lösche zuerst all dessen Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge, die älter als %{count} Tage sind, können nicht gelöscht werden.) + one: "Benutzer können nicht gelöscht werden, wenn diese Beiträge haben. Lösche zuerst all dessen Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge, die älter als %{count} Tag sind, können nicht gelöscht werden.)" + other: "Benutzer können nicht gelöscht werden, wenn diese Beiträge haben. Lösche zuerst all dessen Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge, die älter als %{count} Tage sind, können nicht gelöscht werden.)" cant_delete_all_posts: - one: Nicht alle Beiträge können gelöscht werden. Einige Beiträge sind älter als %{count} Tag (die „delete_user_max_post_age“ Einstellung). - other: Nicht alle Beiträge können gelöscht werden. Einige Beiträge sind älter als %{count} Tage (die „delete_user_max_post_age“ Einstellung). + one: "Nicht alle Beiträge können gelöscht werden. Einige Beiträge sind älter als %{count} Tag (die „delete_user_max_post_age“ Einstellung)." + other: "Nicht alle Beiträge können gelöscht werden. Einige Beiträge sind älter als %{count} Tage (die „delete_user_max_post_age“ Einstellung)." cant_delete_all_too_many_posts: - one: Nicht alle Beiträge konnten gelöscht werden, da der Benutzer mehr als 1 Beitrag hat (die „delete_all_posts_max“ Einstellung). - other: Nicht alle Beiträge konnten gelöscht werden, da der Benutzer mehr als %{count} Beiträge hat (die „delete_all_posts_max“ Einstellung). + one: "Nicht alle Beiträge konnten gelöscht werden, da der Benutzer mehr als 1 Beitrag hat (die „delete_all_posts_max“ Einstellung)." + other: "Nicht alle Beiträge konnten gelöscht werden, da der Benutzer mehr als %{count} Beiträge hat (die „delete_all_posts_max“ Einstellung)." delete_confirm: "Bist du dir SICHER, dass du diesen Benutzer löschen willst? Dies kann nicht rückgängig gemacht werden!" delete_and_block: "Löschen und diese E-Mail-Adresse und IP-Adresse blockieren" delete_dont_block: "Nur löschen" @@ -3418,8 +3509,8 @@ de: tl3_requirements: title: "Anforderungen für Vertrauensstufe 3" table_title: - one: 'Innerhalb des letzten Tages:' - other: 'In den letzten %{count} Tagen:' + one: "Innerhalb des letzten Tages:" + other: "In den letzten %{count} Tagen:" value_heading: "Wert" requirement_heading: "Anforderung" visits: "Aufrufe" @@ -3506,6 +3597,14 @@ de: clear_filter: "Filter zurücksetzen" add_url: "URL hinzufügen" add_host: "Host hinzufügen" + uploaded_image_list: + label: "Liste bearbeiten" + empty: "Es gibt noch keine Bilder. Bitte lade eines hoch." + upload: + label: "Hochladen" + title: "Bild(er) hochladen" + selectable_avatars: + title: "Liste von Avataren, aus der Benutzer wählen können." categories: all_results: 'Alle' required: 'Erforderlich' @@ -3594,8 +3693,8 @@ de: text: "Es fehlen Beispieldaten. Das passiert, wenn die Abzeichen-Abfrage IDs von Benutzern oder Beiträgen liefert, die nicht existieren. Das kann in weiterer Folge zu unerwarteten Ergebnissen führen. Bitte überprüfe nochmals deine Abfrage." no_grant_count: "Es werden keine Abzeichen verliehen." grant_count: - one: Es wird 1 Abzeichen verliehen. - other: Es werden %{count} Abzeichen verliehen. + one: "Es wird 1 Abzeichen verliehen." + other: "Es werden %{count} Abzeichen verliehen." sample: "Beispiel:" grant: with: "%{username}" @@ -3660,10 +3759,11 @@ de: step: "%{current} von %{total}" upload: "Hochladen" uploading: "Hochladen..." + upload_error: "Entschuldige, es gab einen Fehler beim Hochladen der Datei. Bitte versuche es noch einmal." quit: "Vielleicht später" staff_count: - one: Deine Community hat ein Team-Mitglied (du). - other: Deine Community hat %{count} Team-Mitglieder, einschließlich dir. + one: "Deine Community hat ein Team-Mitglied (du)." + other: "Deine Community hat %{count} Team-Mitglieder, einschließlich dir." invites: add_user: "Hinzufügen" none_added: "Du hast bisher kein Team eingeladen. Möchtest du wirklich fortfahren?" @@ -3671,3 +3771,7 @@ de: admin: "Administration" moderator: "Moderator" regular: "Normaler Anwender" + previews: + topic_title: "Diskussionsthema" + share_button: "Teilen" + reply_button: "Antworten" diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index 4a71ab2ec8..28d9781503 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -43,68 +43,68 @@ el: tiny: half_a_minute: "< 1λ" less_than_x_seconds: - one: < 1δ - other: < %{count}δ + one: "< 1δ" + other: "< %{count}δ" x_seconds: - one: 1δ - other: '%{count}δ' + one: "1δ" + other: "%{count}δ" less_than_x_minutes: - one: < 1λ - other: < %{count}λ + one: "< 1λ" + other: "< %{count}λ" x_minutes: - one: 1λ - other: '%{count}λ' + one: "1λ" + other: "%{count}λ" about_x_hours: - one: 1ÏŽ - other: '%{count}ÏŽ' + one: "1ÏŽ" + other: "%{count}ÏŽ" x_days: - one: 1η - other: '%{count}η' + one: "1η" + other: "%{count}η" x_months: - one: 1μην - other: '%{count}μην' + one: "1μην" + other: "%{count}μην" about_x_years: - one: 1χ - other: '%{count}έ' + one: "1χ" + other: "%{count}έ" over_x_years: - one: '> 1χ' - other: '> %{count}έ' + one: "> 1χ" + other: "> %{count}έ" almost_x_years: - one: 1χ - other: '%{count}έ' + one: "1χ" + other: "%{count}έ" date_month: "DD MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 λεπτό - other: '%{count} λεπτά' + one: "1 λεπτό" + other: "%{count} λεπτά" x_hours: - one: 1 ÏŽÏα - other: '%{count} ÏŽÏες' + one: "1 ÏŽÏα" + other: "%{count} ÏŽÏες" x_days: - one: 1 ημέÏα - other: '%{count} ημέÏες' + one: "1 ημέÏα" + other: "%{count} ημέÏες" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: 'Ï€Ïιν από 1 λεπτό ' - other: Ï€Ïιν από %{count} λεπτά + one: "Ï€Ïιν από 1 λεπτό " + other: "Ï€Ïιν από %{count} λεπτά" x_hours: - one: Ï€Ïιν από 1 ÏŽÏα - other: Ï€Ïιν από %{count} ÏŽÏες + one: "Ï€Ïιν από 1 ÏŽÏα" + other: "Ï€Ïιν από %{count} ÏŽÏες" x_days: - one: Ï€Ïιν από 1 ημέÏα - other: Ï€Ïιν από %{count} ημέÏες + one: "Ï€Ïιν από 1 ημέÏα" + other: "Ï€Ïιν από %{count} ημέÏες" later: x_days: - one: 1 μέÏα μετά - other: '%{count} μέÏες μετά' + one: "1 μέÏα μετά" + other: "%{count} μέÏες μετά" x_months: - one: ένα μήνα μετά - other: '%{count} μήνες μετά' + one: "ένα μήνα μετά" + other: "%{count} μήνες μετά" x_years: - one: ενα χÏόνο μετά - other: '%{count} χÏόνια μετά' + one: "ενα χÏόνο μετά" + other: "%{count} χÏόνια μετά" previous_month: 'ΠÏοηγοÏμενος μήνας' next_month: 'Επόμενος μήνας' placeholder: ημεÏομηνία @@ -182,13 +182,13 @@ el: show_help: "επιλογές" links: "ΣÏνδεσμοι" links_lowercase: - one: ΣÏνδεσμος - other: σÏνδεσμοι + one: "ΣÏνδεσμος" + other: "σÏνδεσμοι" faq: "Συχνές εÏωτήσεις" guidelines: "Οδηγίες" privacy_policy: "Πολιτική Ιδιωτικότητας" privacy: "Ιδιωτικότητα" - terms_of_service: "ÎŒÏοι ΧÏήσης" + tos: "ÎŒÏοι ΧÏήσης" mobile_view: "ΠÏοβολή ΚινητοÏ" desktop_view: "ΠÏοβολή Υπολογιστή" you: "ΕσÏ" @@ -207,8 +207,8 @@ el: max_of_count: "μέγιστο {{count}}" alternation: "ή" character_count: - one: '{{count}} χαÏακτήÏα' - other: '{{count}} χαÏακτήÏες' + one: "{{count}} χαÏακτήÏα" + other: "{{count}} χαÏακτήÏες" suggested_topics: title: "ΠÏοτεινόμενα Îήματα" pm_title: "ΠÏοτεινόμενα ΜηνÏματα" @@ -275,16 +275,16 @@ el: cancel: "ΑκÏÏωση" view_pending: "Ï€Ïοβολή εκκÏεμών αναÏτήσεων" has_pending_posts: - one: Αυτό το θέμα έχει 1 ανάÏτηση που αναμένει έγκÏιση - other: Αυτό το νήμα έχει {{count}} αναÏτήσεις που αναμένουν έγκÏιση + one: "Αυτό το θέμα έχει 1 ανάÏτηση που αναμένει έγκÏιση" + other: "Αυτό το νήμα έχει {{count}} αναÏτήσεις που αναμένουν έγκÏιση" confirm: "Αποθήκευση Αλλαγών" delete_prompt: "Είστε σίγουÏος πως θέλετε να διαγÏάψετε τον/την %{username}; Αυτό θα διαγÏάψει όλες τις αναÏτήσεις και θα μπλοκάÏει την διεÏθυνση email καθώς και την IP διεÏθυνση." approval: title: "Απαιτείται ΈγκÏιση ΑνάÏτησης" description: "Λάβαμε την ανάÏτησή σου, αλλά Ï€Ïέπει Ï€Ïώτα να εγκÏιθεί από έναν συντονιστή Ï€Ïιν εμφανιστεί. ΠαÏακαλώ πεÏιμένετε." pending_posts: - one: Έχεις 1 εκκÏεμή ανάÏτηση. - other: Έχετε {{count}} εκκÏεμείς αναÏτήσεις. + one: "Έχεις 1 εκκÏεμή ανάÏτηση." + other: "Έχετε {{count}} εκκÏεμείς αναÏτήσεις." ok: "OK" user_action: user_posted_topic: "{{user}} ανάÏτησε το νήμα " @@ -318,8 +318,8 @@ el: posts_read: "Διαβασμένο" posts_read_long: "Διαβασμένες ΑναÏτήσεις" total_rows: - one: 1 χειÏιστής - other: '%{count} χÏήστες' + one: "1 χειÏιστής" + other: "%{count} χÏήστες" group_histories: actions: change_group_setting: "Αλλαγή Ïυθμίσεων ομάδας" @@ -353,8 +353,8 @@ el: title: "Ομάδες" empty: "Δεν υπάÏχουν οÏατές ομάδες." title: - one: Ομάδα - other: Ομάδες + one: "Ομάδα" + other: "Ομάδες" activity: "ΔÏαστηÏιότητα" topics: "Îήματα" posts: "ΑναÏτήσεις" @@ -414,8 +414,6 @@ el: reorder: title: "Επαναταξινόμησε τις κατηγοÏίες" title_long: "ΑναδιοÏγάνωση της λίστας κατηγοÏιών" - fix_order: "ΣταθεÏές Θέσεις" - fix_order_tooltip: "Δεν έχουν όλες οι κατηγοÏίες μοναδικό νοÏμεÏο θέσης, το οποίο ίσως Ï€Ïοκαλέσει αναπάντεχα αποτελέσματα." save: "Αποθήκευση Κατάταξης" apply_all: "ΕφαÏμογή" position: "Θέση" @@ -426,11 +424,11 @@ el: toggle_ordering: "εναλλαγή ταξινόμησης" subcategories: "ΥποκατηγοÏίες" topic_sentence: - one: 1 θέμα - other: '%{count} νήματα' + one: "1 θέμα" + other: "%{count} νήματα" topic_stat_sentence: - one: '%{count} νέο νήμα στα τελευταία %{unit}.' - other: '%{count} νέα νήματα στα τελευταία %{unit}.' + one: "%{count} νέο νήμα στα τελευταία %{unit}." + other: "%{count} νέα νήματα στα τελευταία %{unit}." ip_lookup: title: Αναζήτηση ΔιεÏθυνσης IP hostname: Hostname @@ -584,7 +582,6 @@ el: error: "ΠÏοέκυψε σφάλμα στην αλλαγή της αξίας." change_username: title: "Αλλαγή Ονόματος ΧÏήστη" - confirm: "Εάν αλλάξεις το όνομα χÏήστη σου, όλες οι Ï€ÏοηγοÏμενες παÏαθέσεις των αναÏτήσεων σου και οι αναφοÏές στο @όνομά σου θα χαθοÏν. Είσαι απόλυτα βέβαιος πως θέλεις;" taken: "ΛυποÏμαστε, αυτό το όνομα χÏήστη χÏησιμοποιείται ήδη." invalid: "Αυτό το όνομα χÏήστη δεν είναι έγκυÏο. Θα Ï€Ïέπει να αποτελείται μόνο από αÏιθμοÏÏ‚ και γÏάμματα" change_email: @@ -605,7 +602,6 @@ el: upload_title: "Ανέβασε την εικόνα σου" upload_picture: "Ανέβασμα Εικόνας" image_is_not_a_square: "ΠÏοσοχή: ΠεÏικόψαμε την εικόνα σου γιατί το Ïψος και το πλάτος δεν ήταν ίσα." - cache_notice: "Έχεις αλλάξει επιτυχώς την εικόνα του Ï€Ïοφίλ σου αλλά ίσως πάÏει λίγο χÏόνο μέχÏι να εμφανιστεί εξαιτίας της κÏυφής μνήμης του Ï€ÏογÏάμματος πεÏιήγησης." change_profile_background: title: "Φόντο ΠÏοφίλ" instructions: "Οι εικόνες που μπαίνουν στο φόντο του Ï€Ïοφίλ σου θα κεντÏαÏίζονται και το Ï€ÏοκαθοÏισμένο πλάτος τους είναι 850px." @@ -620,8 +616,8 @@ el: authenticated: "Η διεÏθυνση email σου ταυτοποιήθηκε από τον πάÏοχο {{provider}}" frequency_immediately: "Θα σου στείλουμε αμέσως email, εάν δεν έχεις διαβάσει αυτό για το οποίο σου στέλνουμε το μήνυμα." frequency: - one: Θα σου στείλουμε ηλεκτÏονικό μήνυμα μόνο εάν δε σε έχουμε δει το τελευταίο λεπτό. - other: Θα σου στείλουμε ηλεκτÏονικό μήνυμα μόνο εάν δεν σε έχουμε δει τα τελευταία {{count}} λεπτά. + one: "Θα σου στείλουμε ηλεκτÏονικό μήνυμα μόνο εάν δε σε έχουμε δει το τελευταίο λεπτό." + other: "Θα σου στείλουμε ηλεκτÏονικό μήνυμα μόνο εάν δεν σε έχουμε δει τα τελευταία {{count}} λεπτά." name: title: "Όνομα" instructions: "το ονοματεπώνυμό σου (Ï€ÏοαιÏετικό)" @@ -706,8 +702,8 @@ el: user: "ΠÏοσκεκλημένος ΧÏήστης" sent: "Απεσταλμένα" truncated: - one: Δείχνοντας την Ï€Ïώτη Ï€Ïόσκληση. - other: ΠÏοβάλονται οι Ï€Ïώτες {{count}} Ï€Ïοσκλήσεις. + one: "Δείχνοντας την Ï€Ïώτη Ï€Ïόσκληση." + other: "ΠÏοβάλονται οι Ï€Ïώτες {{count}} Ï€Ïοσκλήσεις." redeemed: "Αποδεκτές ΠÏοσκλήσεις" redeemed_tab: "Αποδεκτές" redeemed_tab_with_count: "Αποδεκτές ({{count}})" @@ -754,29 +750,29 @@ el: time_read: "χÏόνος ανάγνωσης" recent_time_read: "Ï€Ïόσφατος χÏόνος ανάγνωσης" topic_count: - one: δημιουÏγημένο θέμα - other: δημιουÏγημένα θέματα + one: "δημιουÏγημένο θέμα" + other: "δημιουÏγημένα θέματα" post_count: - one: δημιουÏγημένη ανάÏτηση - other: δημιουÏγημένες αναÏτήσεις + one: "δημιουÏγημένη ανάÏτηση" + other: "δημιουÏγημένες αναÏτήσεις" likes_given: - one: δόθηκε - other: δόθηκαν + one: "δόθηκε" + other: "δόθηκαν" likes_received: - one: ελήφθη - other: ελήφθησαν + one: "ελήφθη" + other: "ελήφθησαν" days_visited: - one: ημέÏα επίσκεψης - other: ημέÏες επίσκεψης + one: "ημέÏα επίσκεψης" + other: "ημέÏες επίσκεψης" topics_entered: - one: νήμα Ï€Ïοβλήθηκε - other: νήματα Ï€Ïοβλήθηκαν + one: "νήμα Ï€Ïοβλήθηκε" + other: "νήματα Ï€Ïοβλήθηκαν" posts_read: - one: διαβασμένη ανάÏτηση - other: διαβασμένες αναÏτήσεις + one: "διαβασμένη ανάÏτηση" + other: "διαβασμένες αναÏτήσεις" bookmark_count: - one: σελιδοδείκτης - other: σελιδοδείκτες + one: "σελιδοδείκτης" + other: "σελιδοδείκτες" top_replies: "ΚοÏυφαίες Απαντήσεις" no_replies: "Καμία απάντηση ακόμα." more_replies: "ΠεÏισσότεÏες Απαντήσεις" @@ -792,7 +788,6 @@ el: most_liked_users: "ΠεÏισσότεÏα \"Μου αÏέσει\"" most_replied_to_users: "ΠεÏισσότεÏες απαντήσεις Ï€Ïος" no_likes: "Κανένα μου αÏέσει ακόμα." - associated_accounts: "Συνδέσεις" ip_address: title: "Τελευταία διεÏθυνση IP" registration_ip_address: @@ -844,8 +839,8 @@ el: reached: "%{relativeAge} – %{rate} έχει φτάσει το ÏŒÏιο των Ïυθμίσεων της ιστοσελίδας το οποίο είναι %{siteSettingRate}." exceeded: "%{relativeAge} - %{rate} υπεÏβαίνει το ÏŒÏιο των Ïυθμίσεων της ιστοσελίδας το οποίο είναι %{siteSettingRate}." rate: - one: 1 σφάλματα/%{duration} - other: '%{count} σφάλματα/%{duration}' + one: "1 σφάλματα/%{duration}" + other: "%{count} σφάλματα/%{duration}" learn_more: "μάθε πεÏισσότεÏα..." all_time: 'σÏνολο' all_time_desc: 'συνολικά δημιουÏγημένα νήματα' @@ -873,8 +868,6 @@ el: hide_session: "ΥπενθÏμιση αÏÏιο" hide_forever: "όχι ευχαÏιστώ" hidden_for_session: "Εντάξει, θα σε Ïωτήσω αÏÏιο. ΜποÏείς πάντα να χÏησιμοποιείς τη \"ΣÏνδεση\" για να δημιουÏγήσεις ένα λογαÏιασμό." - intro: "Γεια σου! :heart_eyes: Φαίνεται να απολαμβάνεις τη συζήτηση, όμως δεν έχεις δημιουÏγήσει ακόμα δικό σου λογαÏιασμό." - value_prop: "Όταν δημιουÏγείς έναν λογαÏιασμό, θυμόμαστε ακÏιβώς τι έχεις διαβάσει, έτσι ώστε πάντα να επιστÏέφεις όπου είχες μείνει. Επίσης, λαμβάνεις ειδοποιήσεις, εδώ και μέσω email, κάθε φοÏά που δημιουÏγοÏνται καινοÏÏιες αναÏτήσεις. Επίσης μποÏείς να πατήσεις \"μου αÏέσει\" στις αναÏτήσεις για να μοιÏαστείς την αγάπη. :heartbeat:" summary: enabled_description: "Βλέπεις μια πεÏίληψη Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… νήματος: οι πιο ενδιαφέÏουσες αναÏτήσεις, όπως αυτές καθοÏίστηκαν από την κοινότητα." description: "ΥπάÏχουν {{replyCount}} απαντήσεις." @@ -888,7 +881,6 @@ el: disable: "Εμφάνισε τις σβησμένες αναÏτήσεις" private_message_info: title: "Μήνυμα" - invite: "ΠÏοσκάλεσε άλλους..." leave_message: "ΣίγουÏα θελετε να αφήσετε αυτό το μήνυμα;" remove_allowed_user: "Θέλεις σίγουÏα να αφαιÏέσεις τον/την {{name}} από αυτή τη συζήτηση;" remove_allowed_group: "Θέλεις σίγουÏα να αφαιÏέσεις τον/την {{name}} από αυτό το μήνυμα;" @@ -946,9 +938,6 @@ el: preferences: "ΠÏέπει να συνδεθείς για να αλλάξεις τις Ï€Ïοτιμήσεις χÏήστη." forgot: "Δεν θυμάμαι τις λεπτομέÏειες του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î¼Î¿Ï…" not_approved: "Ο λογαÏιασμός σας δεν έχει εγκÏιθεί ακόμα. Θα ειδοποιηθείτε με email όταν είστε έτοιμοι να συνδεθείτε." - google: - title: "μέσω της Google" - message: "Ταυτοποίηση μέσω της Google (βεβαιώσου πως δεν έχει ενεÏγοποιηθεί το μπλοκάÏισμα των αναδυόμενων παÏαθÏÏων)" google_oauth2: title: "μέσω της Google" message: "Ταυτοποίηση μέσω της Google (βεβαιώσου πως δεν έχει ενεÏγοποιηθεί το μπλοκάÏισμα των αναδυόμενων παÏαθÏÏων)" @@ -1034,8 +1023,8 @@ el: similar_topics: "Το νήμα σας είναι παÏόμοιο με ..." drafts_offline: "τοπικά Ï€ÏόχειÏα" group_mentioned: - one: ΑναφέÏοντας {{group}}, Ï€Ïόκειται να λάβει ειδοποίηση 1 άτομο - είσαι βέβαιος; - other: ΑναφέÏοντας το {{group}}, Ï€Ïόκειται να ειδοποίησεις {{count}} μέλη - είσαι σίγουÏος; + one: "ΑναφέÏοντας {{group}}, Ï€Ïόκειται να λάβει ειδοποίηση 1 άτομο - είσαι βέβαιος;" + other: "ΑναφέÏοντας το {{group}}, Ï€Ïόκειται να ειδοποίησεις {{count}} μέλη - είσαι σίγουÏος;" cannot_see_mention: category: "ΑνέφεÏες το {{username}} αλλά δε θα λάβουν ειδοποίηση, επειδή δεν έχουν Ï€Ïόσβαση σε αυτή την κατηγοÏία. Θα Ï€Ïέπει να τους Ï€Ïοσθέσεις σε μια ομάδα που έχει Ï€Ïόσβαση σε αυτή την κατηγοÏία." private: "ΑνέφεÏες {{username}} αλλά δεν θα λάβουν ειδοποίηση, επειδή δεν μποÏοÏν να δουν αυτό το Ï€Ïοσωπικό μήνυμα. ΠÏέπει να τους Ï€Ïοσκαλέσεις σε αυτό το ΠΜ." @@ -1116,8 +1105,8 @@ el: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} και 1 ακόμα {{description}} - other: {{username}}, {{username2}} και {{count}} ακόμα {{description}} + one: "{{username}}, {{username2}} και 1 ακόμα {{description}}" + other: "{{username}}, {{username2}} και {{count}} ακόμα {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1128,8 +1117,8 @@ el: topic_reminder: "{{username}} {{description}}" watching_first_post: "Îέο Îήμα {{description}}" group_message_summary: - one: '{{count}} μήνυμα στα εισεÏχόμενα της ομάδας {{group_name}}' - other: '{{count}} μηνÏματα στα εισεÏχόμενα της ομάδας {{group_name}} ' + one: "{{count}} μήνυμα στα εισεÏχόμενα της ομάδας {{group_name}}" + other: "{{count}} μηνÏματα στα εισεÏχόμενα της ομάδας {{group_name}} " popup: mentioned: '{{username}} σε ανέφεÏε στο "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} σε ανέφεÏε στο "{{topic}}" - {{site_title}}' @@ -1239,8 +1228,8 @@ el: notification_level: "Ειδοποιήσεις" choose_new_category: "Διάλεξε νέα κατηγοÏία για τα νήματα:" selected: - one: Έχεις διαλέξει 1 νήμα. - other: Έχεις διαλέξει {{count}} νήματα. + one: "Έχεις διαλέξει 1 νήμα." + other: "Έχεις διαλέξει {{count}} νήματα." change_tags: "Αντικατάσταση Ετικετών " append_tags: "ΠÏοσάÏτηση Ετικετών " choose_new_tags: "Επίλεξε καινοÏÏιες ετικέτες για αυτά τα νήματα:" @@ -1273,8 +1262,8 @@ el: search: "Δεν υπάÏχουν άλλα αποτελέσματα για αυτή την αναζήτηση." topic: filter_to: - one: 1 δημοσίευση σε νήματα - other: '{{count}} αναÏτήσεις σε νήματα' + one: "1 δημοσίευση σε νήματα" + other: "{{count}} αναÏτήσεις σε νήματα" create: 'Îέο Îήμα' create_long: 'ΔημιουÏγία νέου Îήματος' private_message: 'Στείλε ένα Ï€Ïοσωπικό μήνυμα' @@ -1288,10 +1277,10 @@ el: new: 'νέο νήμα' unread: 'αδιάβαστο' new_topics: - one: 1 νέο νήμα + one: '1 νέο νήμα' other: '{{count}} νέα νήματα' unread_topics: - one: 1 μη αναγνωσμένο νήμα + one: '1 μη αναγνωσμένο νήμα' other: '{{count}} αδιάβαστα νήματα' title: 'Îήμα' invalid_access: @@ -1305,17 +1294,17 @@ el: title: "Το νήμα δεν βÏέθηκε." description: "Συγνώμη, δεν μποÏέσαμε να βÏοÏμε αυτό το νήμα συζήτησης. Μήπως έχει αφαιÏεθεί από κάποιον συντονιστή;" total_unread_posts: - one: έχεις 1 αδιάβαστη ανάÏτηση σε αυτό το νήμα - other: έχεις {{count}} αδιάβαστες αναÏτήσεις σε αυτό το νήμα + one: "έχεις 1 αδιάβαστη ανάÏτηση σε αυτό το νήμα" + other: "έχεις {{count}} αδιάβαστες αναÏτήσεις σε αυτό το νήμα" unread_posts: - one: έχεις 1 αδιάβαστη παλιά ανάÏτηση σε αυτό το νήμα - other: έχεις {{count}} αδιάβαστες παλιές αναÏτήσεις σε αυτό το νήμα + one: "έχεις 1 αδιάβαστη παλιά ανάÏτηση σε αυτό το νήμα" + other: "έχεις {{count}} αδιάβαστες παλιές αναÏτήσεις σε αυτό το νήμα" new_posts: - one: υπάÏχει 1 νέα ανάÏτηση σε αυτό το νήμα από την τελευταία φοÏά που το διάβασες - other: υπάÏχουν {{count}} νέες αναÏτήσεις σε αυτό το νήμα από την τελευταία φοÏά που το διάβασες + one: "υπάÏχει 1 νέα ανάÏτηση σε αυτό το νήμα από την τελευταία φοÏά που το διάβασες" + other: "υπάÏχουν {{count}} νέες αναÏτήσεις σε αυτό το νήμα από την τελευταία φοÏά που το διάβασες" likes: - one: υπάÏχει 1 «Μου αÏέσει» σε αυτό το νήμα - other: υπάÏχουν {{count}} «μου αÏέσει» σε αυτό το νήμα + one: "υπάÏχει 1 «Μου αÏέσει» σε αυτό το νήμα" + other: "υπάÏχουν {{count}} «μου αÏέσει» σε αυτό το νήμα" back_to_list: "ΕπιστÏοφή στη Λίστα Îημάτων" options: "Ρυθμίσεις Îήματος" show_links: "εμφάνιση συνδέσμων εντός του νήματος" @@ -1379,8 +1368,8 @@ el: auto_reminder: "Θα λάβεις υπενθÏμιση σχετικά με αυτό το νήμα σε %{timeLeft}." auto_close_title: 'Ρυθμίσεις για το αυτόματο κλείσιμο' auto_close_immediate: - one: Η τελευταία δημοσίευση στο νήμα είναι ήδη 1 ÏŽÏα παλιό, έτσι το νήμα θα κλείσει αμέσως. - other: Η τελευταία ανάÏτηση είναι ήδη %{count} ÏŽÏες παλιά, έτσι το νήμα θα κλείσει αμέσως. + one: "Η τελευταία δημοσίευση στο νήμα είναι ήδη 1 ÏŽÏα παλιό, έτσι το νήμα θα κλείσει αμέσως." + other: "Η τελευταία ανάÏτηση είναι ήδη %{count} ÏŽÏες παλιά, έτσι το νήμα θα κλείσει αμέσως." timeline: back: "Πίσω" back_description: "Πήγαινε πίσω στην τελευταία μη αναγνωσμένη ανάÏτηση" @@ -1487,8 +1476,8 @@ el: pin_validation: "Απαιτείται ημεÏομηνία για να καÏφιτσώσεις το νήμα." not_pinned: "Δεν υπάÏχουν νήματα καÏφιτσωμένα σε {{categoryLink}}." already_pinned: - one: 'Îήμα καÏφιτσωμένο σε {{categoryLink}}: 1' - other: 'Îήματα καÏφιτσωμένα σε {{categoryLink}}: {{count}}' + one: "Îήμα καÏφιτσωμένο σε {{categoryLink}}: 1" + other: "Îήματα καÏφιτσωμένα σε {{categoryLink}}: {{count}}" pin_globally: "Εμφάνισε αυτό το νήμα στην κοÏυφή όλων των λιστών νημάτων μέχÏι" confirm_pin_globally: "ΥπάÏχουν ήδη {{count}} καθολικά καÏφιτσωμένα νήματα. Τόσα πολλά καÏφιτσωμένα νήματα μποÏεί να είναι υπεÏβολικός φόÏτος για νέους και ανώνυμους χÏήστες. Θες στ' αλήθεια να καÏφιτσώσεις καθολικά ακόμη ένα νήμα;" unpin_globally: "ΑφαίÏεσε αυτό το νήμα από την κοÏυφή όλων των λίστων νημάτων" @@ -1496,8 +1485,8 @@ el: global_pin_note: "Οι χÏήστες μποÏοÏν να ξεκαÏφιτσώσουν το νήμα ο καθένας για τον εαυτό του." not_pinned_globally: "Δεν υπάÏχουν καθολικά καÏφιτσωμένα νήματα." already_pinned_globally: - one: ΠÏόσφατα καθολικά καÏφιτσωμένα νήματα:1 - other: 'ΠÏόσφατα καθολικά καÏφιτσωμένα νήματα: {{count}}' + one: "ΠÏόσφατα καθολικά καÏφιτσωμένα νήματα:1" + other: "ΠÏόσφατα καθολικά καÏφιτσωμένα νήματα: {{count}}" make_banner: "Αυτό το νήμα να γίνει νήμα ανακοίνωσης και να εμφανίζεται στην κοÏυφή όλων των σελίδων." remove_banner: "ΑφαίÏεσε το νήμα ανακοίνωσης το οποίο εμφανίζεται στην κοÏυφή όλων των σελίδων." banner_note: "Οι χÏήστες μποÏοÏν να κλείσουν την ανακοίνωση έτσι ώστε να μην εμφανίζεται σε αυτοÏÏ‚. Ένα μόνο νήμα μποÏεί να είναι νήμα ανακοίνωσης κάθε φοÏά." @@ -1534,8 +1523,8 @@ el: login_reply: 'Συνδέσου για να απαντήσεις' filters: n_posts: - one: 1 ανάÏτηση - other: '{{count}} αναÏτήσεις' + one: "1 ανάÏτηση" + other: "{{count}} αναÏτήσεις" cancel: "ΑφαίÏεση φίλτÏου" split_topic: title: "ΜεταφοÏά σε Îέο Îήμα " @@ -1543,15 +1532,15 @@ el: topic_name: "Τίτλος Îέου Îήματος" error: "ΠαÏουσιάστηκε σφάλμα κατά τη μεταφοÏά των αναÏτήσεων στο νέο νήμα." instructions: - one: Ετοιμάζεσαι να δημιουÏγήσεις ένα νέο νήμα και να μεταφέÏεις σε αυτό την επιλεγμένη ανάÏτηση. - other: Ετοιμάζεσαι να δημιουÏγήσεις ένα νέο νήμα και να μεταφέÏεις σε αυτό τις {{count}} επιλεγμένες αναÏτήσεις. + one: "Ετοιμάζεσαι να δημιουÏγήσεις ένα νέο νήμα και να μεταφέÏεις σε αυτό την επιλεγμένη ανάÏτηση." + other: "Ετοιμάζεσαι να δημιουÏγήσεις ένα νέο νήμα και να μεταφέÏεις σε αυτό τις {{count}} επιλεγμένες αναÏτήσεις." merge_topic: title: "ΜεταφοÏά σε Υφιστάμενο Îήμα" action: "μεταφοÏά σε υφιστάμενο νήμα" error: "ΠαÏουσιάστηκε σφάλμα κατά τη μεταφοÏά των αναÏτήσεων σε αυτό το νήμα. " instructions: - one: ΠαÏακαλώ επίλεξε το νήμα στο οποίο θέλεις να μεταφέÏεις την ανάÏτηση. - other: ΠαÏακαλώ επίλεξε το νήμα στο οποίο θέλεις να μεταφέÏεις τις {{count}} αυτές αναÏτήσεις. + one: "ΠαÏακαλώ επίλεξε το νήμα στο οποίο θέλεις να μεταφέÏεις την ανάÏτηση." + other: "ΠαÏακαλώ επίλεξε το νήμα στο οποίο θέλεις να μεταφέÏεις τις {{count}} αυτές αναÏτήσεις." merge_posts: title: "Συγχώνευσε Επιλεγμένες ΑναÏτήσεις" action: "συγχώνευσε επιλεγμένες αναÏτήσεις" @@ -1563,8 +1552,8 @@ el: label: "Îέος Ιδιοκτήτης των ΑναÏτήσεων" placeholder: "όνομα χÏήστη του νέου ιδιοκτήτη" instructions: - one: ΠαÏακαλώ επίλεξε τον νέο ιδιοκτήτη της ανάÏτησης του {{old_user}}. - other: ΠαÏακαλώ επίλεξε τον νέο ιδιοκτήτη των {{count}} αναÏτήσεων του {{old_user}}. + one: "ΠαÏακαλώ επίλεξε τον νέο ιδιοκτήτη της ανάÏτησης του {{old_user}}." + other: "ΠαÏακαλώ επίλεξε τον νέο ιδιοκτήτη των {{count}} αναÏτήσεων του {{old_user}}." change_timestamp: title: "Αλλαγή ΧÏονοσήμανσης..." action: "αλλαγή χÏονοσήμανσης" @@ -1580,7 +1569,7 @@ el: deselect_all: απεπιλογή όλων description: one: Έχεις επιλέξει 1 ανάÏτηση. - other: Έχεις επιλέξει {{count}} αναÏτήσεις. + other: "Έχεις επιλέξει {{count}} αναÏτήσεις." post: quote_reply: "ΠαÏάθεση" edit_reason: "Αιτία:" @@ -1594,26 +1583,26 @@ el: show_full: "Δείξε ΠλήÏη ΑνάÏτηση " show_hidden: 'Δείξε το κÏυφό πεÏιεχόμενο.' deleted_by_author: - one: (η ανάÏτηση ανακλήθηκε από το συγγÏαφέα της και θα σβηστεί αυτόματα σε %{count} ÏŽÏα, εκτός και αν κάποιος την επισημάνει στους συντοντιστές) - other: (η ανάÏτηση ανακλήθηκε από το συγγÏαφέα της και θα σβηστεί αυτόματα σε %{count} ÏŽÏες, εκτός και αν κάποιος την επισημάνει στους συντοντιστές) + one: "(η ανάÏτηση ανακλήθηκε από το συγγÏαφέα της και θα σβηστεί αυτόματα σε %{count} ÏŽÏα, εκτός και αν κάποιος την επισημάνει στους συντοντιστές)" + other: "(η ανάÏτηση ανακλήθηκε από το συγγÏαφέα της και θα σβηστεί αυτόματα σε %{count} ÏŽÏες, εκτός και αν κάποιος την επισημάνει στους συντοντιστές)" expand_collapse: "επέκταση/σÏμπτυξη" gap: - one: δες 1 κÏυφή απάντηση - other: δες {{count}} κÏυφές απαντήσεις + one: "δες 1 κÏυφή απάντηση" + other: "δες {{count}} κÏυφές απαντήσεις" unread: "Η ανάÏτηση δεν έχει διαβαστεί" has_replies: - one: '{{count}} Απάντηση' - other: '{{count}} Απαντήσεις' + one: "{{count}} Απάντηση" + other: "{{count}} Απαντήσεις" has_likes: - one: '{{count}} "Μου αÏέσουν"' - other: '{{count}} "Μου αÏέσει"' + one: "{{count}} \"Μου αÏέσουν\"" + other: "{{count}} \"Μου αÏέσει\"" has_likes_title: - one: 1 άτομο πάτησε "μου αÏέσει" στη δημοσίευση - other: '{{count}} άτομα πάτησαν "Μου αÏέσει" στην ανάÏτηση' + one: "1 άτομο πάτησε \"μου αÏέσει\" στη δημοσίευση" + other: "{{count}} άτομα πάτησαν \"Μου αÏέσει\" στην ανάÏτηση" has_likes_title_only_you: "σου αÏέσει αυτή η ανάÏτηση" has_likes_title_you: - one: ÎµÏƒÏ ÎºÎ±Î¹ 1 άλλο άτομο πάτησε "Μου αÏέσει" στη δημοσίευση - other: ÎµÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα άτομα πατήσατε "Μου αÏέσει" στην ανάÏτηση + one: "ÎµÏƒÏ ÎºÎ±Î¹ 1 άλλο άτομο πάτησε \"Μου αÏέσει\" στη δημοσίευση" + other: "ÎµÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα άτομα πατήσατε \"Μου αÏέσει\" στην ανάÏτηση" errors: create: "ΛυποÏμαστε, παÏουσιάστηκε σφάλμα κατά την δημιουÏγία της ανάÏτησης. ΠÏοσπάθησε πάλι." edit: "ΛυποÏμαστε, παÏουσιάστηκε σφάλμα κατά την επεξεÏγασία της ανάÏτησης. ΠÏοσπάθησε πάλι." @@ -1661,15 +1650,14 @@ el: actions: flag: 'Επισήμανση' defer_flags: - one: Αγνόηση επισήμανσης - other: Αγνόηση επισημάνσεων + one: "Αγνόηση επισήμανσης" + other: "Αγνόηση επισημάνσεων" undo: off_topic: "ΑναίÏεση σήμανσης" spam: "ΑναίÏεση σήμανσης" inappropriate: "ΑναίÏεση σήμανσης" bookmark: "ΑφαίÏεση σελιδοδείκτη" like: "ΑναίÏεση «μου αÏέσει»" - vote: "ΑναίÏεση ψήφου" people: off_topic: "επισήμαναν ως εκτός θέματος" spam: "επισήμαναν ως ανεπιθÏμητη αλληλογÏαφία" @@ -1679,9 +1667,8 @@ el: bookmark: "έβαλαν σελιδοδείκτη" like: "άÏεσαν αυτό" like_capped: - one: 'και {{count}} άλλος το άÏεσε αυτό ' - other: 'και {{count}} άλλοι το άÏεσαν αυτό ' - vote: "ψήφισαν για αυτό" + one: "και {{count}} άλλος το άÏεσε αυτό " + other: "και {{count}} άλλοι το άÏεσαν αυτό " by_you: off_topic: "Το επισήμανες σαν εκτός θέματος" spam: "Το επισήμανες σαν ανεπιθÏμητο" @@ -1690,61 +1677,54 @@ el: notify_user: "Έστειλες ένα μήνυμα σε αυτόν τον χÏήστη" bookmark: "Τοποθέτησες σελιδοδείκτη στην ανάÏτηση" like: "Σου άÏεσε η ανάÏτηση" - vote: "Ψήφισες για αυτή την ανάÏτηση" by_you_and_others: off_topic: - one: 'Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε ως εκτός θέματος ' - other: 'Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε ως εκτός θέματος ' + one: "Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε ως εκτός θέματος " + other: "Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε ως εκτός θέματος " spam: - one: 'Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε ως ανεπιθÏμητο ' - other: 'Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε ως ανεπιθÏμητο ' + one: "Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε ως ανεπιθÏμητο " + other: "Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε ως ανεπιθÏμητο " inappropriate: - one: Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε ως ανάÏμοστο - other: Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε ως ανάÏμοστο + one: "Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε ως ανάÏμοστο" + other: "Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε ως ανάÏμοστο" notify_moderators: - one: Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε στους συντονιστές - other: Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε στους συντονιστές + one: "Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα το επισημάνατε στους συντονιστές" + other: "Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα το επισημάνατε στους συντονιστές" notify_user: - one: Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα στείλατε ένα μήνυμα σε αυτόν τον χÏήστη - other: Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα στείλατε ένα μήνυμα σε αυτόν τον χÏήστη + one: "Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα στείλατε ένα μήνυμα σε αυτόν τον χÏήστη" + other: "Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα στείλατε ένα μήνυμα σε αυτόν τον χÏήστη" bookmark: - one: Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα τοποθετήσατε σελιδοδείκτη στην ανάÏτηση - other: Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα τοποθετήσατε σελιδοδείκτη στην ανάÏτηση + one: "Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα τοποθετήσατε σελιδοδείκτη στην ανάÏτηση" + other: "Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα τοποθετήσατε σελιδοδείκτη στην ανάÏτηση" like: - one: Εσένα και 1 ακόμα σας άÏεσε - other: Εσένα και {{count}} ακόμα σας άÏεσε - vote: - one: Î•ÏƒÏ ÎºÎ±Î¹ 1 ακόμα ψηφίσατε για την ανάÏτηση - other: Î•ÏƒÏ ÎºÎ±Î¹ {{count}} ακόμα ψηφίσατε για την ανάÏτηση + one: "Εσένα και 1 ακόμα σας άÏεσε" + other: "Εσένα και {{count}} ακόμα σας άÏεσε" by_others: off_topic: - one: Ένα άτομο το επισήμανε ως εκτός θέματος - other: '{{count}} άτομα το επισημάνανε ως εκτός θέματος' + one: "Ένα άτομο το επισήμανε ως εκτός θέματος" + other: "{{count}} άτομα το επισημάνανε ως εκτός θέματος" spam: - one: Ένα άτομο το επισήμανε ως ανεπιθÏμητο - other: '{{count}} άτομα το επισημάνανε ως ανεπιθÏμητο' + one: "Ένα άτομο το επισήμανε ως ανεπιθÏμητο" + other: "{{count}} άτομα το επισημάνανε ως ανεπιθÏμητο" inappropriate: - one: Ένα άτομο το επισήμανε ως ανάÏμοστο - other: '{{count}} άτομα το επισημάνανε ως ανάÏμοστο' + one: "Ένα άτομο το επισήμανε ως ανάÏμοστο" + other: "{{count}} άτομα το επισημάνανε ως ανάÏμοστο" notify_moderators: - one: Ένα άτομο το επισήμανε στους συντονιστές - other: '{{count}} άτομα το επισημάνανε στους συντονιστές' + one: "Ένα άτομο το επισήμανε στους συντονιστές" + other: "{{count}} άτομα το επισημάνανε στους συντονιστές" notify_user: - one: 1 Ï€Ïόσωπο έστειλε ένα μήνυμα σε αυτόν τον χÏήστη - other: '{{count}} άτομα έστειλαν ένα μήνυμα σε αυτόν τον χÏήστη' + one: "1 Ï€Ïόσωπο έστειλε ένα μήνυμα σε αυτόν τον χÏήστη" + other: "{{count}} άτομα έστειλαν ένα μήνυμα σε αυτόν τον χÏήστη" bookmark: - one: Ένα άτομο τοποθέτησε σελιδοδείκτη στην ανάÏτηση - other: '{{count}} άτομα τοποθέτησαν σελιδοδείκτη στην ανάÏτηση' + one: "Ένα άτομο τοποθέτησε σελιδοδείκτη στην ανάÏτηση" + other: "{{count}} άτομα τοποθέτησαν σελιδοδείκτη στην ανάÏτηση" like: - one: Σε ένα άτομο άÏεσε η ανάÏτηση - other: Σε {{count}} άτομα άÏεσε η ανάÏτηση - vote: - one: Ένα άτομο ψήφισε για την ανάÏτηση - other: '{{count}} άτομα ψήφισαν για την ανάÏτηση' + one: "Σε ένα άτομο άÏεσε η ανάÏτηση" + other: "Σε {{count}} άτομα άÏεσε η ανάÏτηση" merge: confirm: - one: Είσαι σίγουÏος πως θέλεις να συγχωνεÏσεις αυτές τις δημοσιεÏσεις; - other: Είσαι σίγουÏος πως θέλεις να συγχωνεÏσεις αυτές τις {{count}} αναÏτήσεις; + one: "Είσαι σίγουÏος πως θέλεις να συγχωνεÏσεις αυτές τις δημοσιεÏσεις;" + other: "Είσαι σίγουÏος πως θέλεις να συγχωνεÏσεις αυτές τις {{count}} αναÏτήσεις;" revisions: controls: first: "ΠÏώτη αναθεώÏηση" @@ -1782,7 +1762,6 @@ el: can: 'μποÏεί… ' none: '(χωÏίς κατηγοÏία)' all: 'Όλες οι κατηγοÏίες' - choose: 'Επιλογή κατηγοÏίας…' edit: 'επεξεÏγασία' edit_long: "ΕπεξεÏγασία" view: 'ΠÏοβολή Îημάτων στην ΚατηγοÏία' @@ -1829,7 +1808,6 @@ el: show_subcategory_list: "ΠÏοβολή λίστας υποκατηγοÏιών πάνω απο τα νήματα αυτής της κατηγοÏίας " num_featured_topics: "ΑÏιθμός νημάτων που εμφανίζονται στην σελίδα κατηγοÏιών:" subcategory_num_featured_topics: "ΑÏιθμός Ï€Ïοτεινόμενων νημάτων στην σελίδα της γονικής κατηγοÏίας:" - all_topics_wiki: "Φτιάξε καινοÏÏια νήματα βίκι από Ï€Ïοεπιλογή. " subcategory_list_style: "ΜοÏφή Λίστας ΥποκατηγοÏίων:" sort_order: "Ταξινόμηση Λίστας Îημάτων Κατά:" default_view: "ΠÏοκαθοÏισμένη Λίστα Îημάτων:" @@ -1838,7 +1816,6 @@ el: edit_permissions: "ΕπεξεÏγασία Δικαιωμάτων" add_permission: "ΠÏοσθήκη Δικαιώματος" this_year: "φέτος" - position: "θέση" default_position: "ΠÏοκαθοÏισμένη Θέση" position_disabled: "Οι κατηγοÏίες εμφανίζονται ανάλογα με το πόσο ενεÏγές είναι. Για να αλλάξει η σειÏά εμφάνισης των κατηγοÏιών, " position_disabled_click: 'ενεÏγοποίησε τη ÏÏθμιση «σταθεÏές θεσεις κατηγοÏιών»' @@ -1899,14 +1876,14 @@ el: custom_placeholder_notify_moderators: "ΠαÏακαλοÏμε πες τι ακÏιβως είναι αυτό που σε ανησυχεί. Αν είναι δυνατό, παÏάπεμψε σε σχετικοÏÏ‚ συνδέσμους και παÏαδείγματα." custom_message: at_least: - one: βάλε τουλάχιστον 1 χαÏακτήÏα - other: γÏάψε τουλάχιστον {{count}} χαÏακτήÏες + one: "βάλε τουλάχιστον 1 χαÏακτήÏα" + other: "γÏάψε τουλάχιστον {{count}} χαÏακτήÏες" more: - one: 1 να πας... - other: '{{count}} ακόμα...' + one: "1 να πας..." + other: "{{count}} ακόμα..." left: - one: 1 απομένει - other: '{{count}} απομένουν' + one: "1 απομένει" + other: "{{count}} απομένουν" flagging_topic: title: "ΕυχαÏιστοÏμε για τη συνεισφÏοÏά σου..." action: "Επισήμανση Îήματος" @@ -1917,13 +1894,13 @@ el: links_title: "Δημοφιλείς ΣÏνδεσμοι" links_shown: "εμφάνισε πεÏισσότεÏους συνδέσμους..." clicks: - one: 1 κλικ - other: '%{count} κλικ' + one: "1 κλικ" + other: "%{count} κλικ" post_links: about: "ανάπτυξε πεÏισσότεÏους συνδέσμους για αυτή την ανάÏτηση" title: - one: 1 πεÏισσότεÏο - other: '%{count} πεÏισσότεÏα' + one: "1 πεÏισσότεÏο" + other: "%{count} πεÏισσότεÏα" topic_statuses: warning: help: "Αυτή είναι μια επίσημη Ï€Ïοειδοποίηση." @@ -1957,22 +1934,22 @@ el: original_post: "ΑÏχική ΑνάÏτηση" views: "ΠÏοβολές" views_lowercase: - one: Ï€Ïοβολή - other: Ï€Ïοβολές + one: "Ï€Ïοβολή" + other: "Ï€Ïοβολές" replies: "Απαντήσεις" views_long: - one: αυτό το νήμα έχει Ï€Ïοβληθεί 1 φοÏά - other: αυτό το νήμα έχει Ï€Ïοβληθεί {{number}} φοÏές + one: "αυτό το νήμα έχει Ï€Ïοβληθεί 1 φοÏά" + other: "αυτό το νήμα έχει Ï€Ïοβληθεί {{number}} φοÏές" activity: "ΔÏαστηÏιότητα" likes: "«Μου αÏέσει»" likes_lowercase: - one: μου αÏέσει - other: μου αÏέσει + one: "μου αÏέσει" + other: "μου αÏέσει" likes_long: "υπάÏχουν {{number}} «μου αÏέσει» σε αυτό το νήμα" users: "ΧÏήστες" users_lowercase: - one: χÏήστης - other: χÏήστες + one: "χÏήστης" + other: "χÏήστες" category_title: "ΚατηγοÏία" history: "ΙστοÏικό" changed_by: "του/της {{author}}" @@ -1986,8 +1963,8 @@ el: latest: title: "Τελευταία" title_with_count: - one: Τελευταία (1) - other: Τελευταία ({{count}}) + one: "Τελευταία (1)" + other: "Τελευταία ({{count}})" help: "νήματα με Ï€Ïόσφατες αναÏτήσεις" hot: title: "Δημοφιλή" @@ -2005,21 +1982,21 @@ el: unread: title: "Αδιάβαστα" title_with_count: - one: Μη αναγνωσμένα (1) - other: Αδιάβαστα ({{count}}) + one: "Μη αναγνωσμένα (1)" + other: "Αδιάβαστα ({{count}})" help: "νήματα που επιτηÏείς ή παÏακολουθείς και που έχουν αδιάβαστες αναÏτήσεις" lower_title_with_count: - one: 1 μη αναγνωσμένο - other: '{{count}} αδιάβαστα' + one: "1 μη αναγνωσμένο" + other: "{{count}} αδιάβαστα" new: lower_title_with_count: - one: 1 νέο - other: '{{count}} νέα' + one: "1 νέο" + other: "{{count}} νέα" lower_title: "νέα" title: "Îέα" title_with_count: - one: Îέα (1) - other: Îέα ({{count}}) + one: "Îέα (1)" + other: "Îέα ({{count}})" help: "νήματα που δημιουÏγήθηκαν τις Ï€ÏοηγοÏμενες μέÏες" posted: title: "Οι αναÏτήσεις μου" @@ -2030,8 +2007,8 @@ el: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "τελευταία νήματα στην κατηγοÏία {{categoryName}} " top: title: "ΚοÏυφαία" @@ -2116,22 +2093,22 @@ el: print: 'ctrl+p ΕκτÏπωση νήματος' badges: earned_n_times: - one: ΚέÏδισε αυτό το παÏάσημο 1 φοÏά - other: ΚέÏδισε αυτό το παÏάσημο %{count} φοÏές + one: "ΚέÏδισε αυτό το παÏάσημο 1 φοÏά" + other: "ΚέÏδισε αυτό το παÏάσημο %{count} φοÏές" granted_on: "ΧοÏηγήθηκε στις %{date}" others_count: "Άλλοι με αυτό το παÏάσημο (%{count})" title: ΠαÏάσημα allow_title: "ΜποÏείς να χÏησιμοποιήσεις αυτό το παÏάσημο σαν τίτλο" multiple_grant: "ΜποÏείς να το κεÏδίσεις πολλές φοÏές" badge_count: - one: 1 ΠαÏάσημο - other: '%{count} ΠαÏάσημα' + one: "1 ΠαÏάσημο" + other: "%{count} ΠαÏάσημα" more_badges: - one: +1 ΠεÏισσότεÏα - other: +%{count} ΠεÏισσότεÏα + one: "+1 ΠεÏισσότεÏα" + other: "+%{count} ΠεÏισσότεÏα" granted: - one: 1 χοÏηγήθηκε - other: '%{count} χοÏηγήθηκε' + one: "1 χοÏηγήθηκε" + other: "%{count} χοÏηγήθηκε" select_badge_for_title: Επίλεξε ένα παÏάσημο για να χÏησιμοποιήσεις ως τίτλο badge_grouping: getting_started: @@ -2161,8 +2138,8 @@ el: tags: "Ετικέτες" delete_tag: "ΑφαίÏεση Ετικέτας" delete_confirm: - one: Είσαι βέβαιος πως θέλεις να διαγÏάψεις αυτήν την ετικέτα και να την αφαιÏέσεις από το 1 νήμα στο οποίο είναι Ï€ÏοσαÏτημένη; - other: Είσαι βέβαιος πως θέλεις να διαγÏάψεις αυτήν την ετικέτα και να την αφαιÏέσεις από τα {{count}} νήματα στα οποία είναι Ï€ÏοσαÏτημένη; + one: "Είσαι βέβαιος πως θέλεις να διαγÏάψεις αυτήν την ετικέτα και να την αφαιÏέσεις από το 1 νήμα στο οποίο είναι Ï€ÏοσαÏτημένη;" + other: "Είσαι βέβαιος πως θέλεις να διαγÏάψεις αυτήν την ετικέτα και να την αφαιÏέσεις από τα {{count}} νήματα στα οποία είναι Ï€ÏοσαÏτημένη;" delete_confirm_no_topics: "Είσαι βέβαιος πως θέλεις να διαγÏάψεις αυτήν την ετικέτα;" rename_tag: "Μετονομασία Ετικέτας" rename_instructions: "Επίλεξε ένα καινοÏÏιο όνομα για την ετικέτα:" @@ -2423,11 +2400,11 @@ el: none: "Δεν υπάÏχουν σχετικά γεγονότα." redeliver: "Διανομή ξανά" incoming: - one: ΥπάÏχει μία καινοÏÏια εκδήλωση. - other: ΥπάÏχουν {{count}} καινοÏÏια γεγονότα. + one: "ΥπάÏχει μία καινοÏÏια εκδήλωση." + other: "ΥπάÏχουν {{count}} καινοÏÏια γεγονότα." completed_in: - one: ΟλοκληÏώνεται σε 1 δευτεÏόλεπτο. - other: ΟλοκληÏώθηκε σε {{count}} δευτεÏόλεπτα. + one: "ΟλοκληÏώνεται σε 1 δευτεÏόλεπτο." + other: "ΟλοκληÏώθηκε σε {{count}} δευτεÏόλεπτα." request: "Αίτημα" response: "Απάντηση" redeliver_confirm: "Είστε σιγουÏος/η ότι θέλετε να παÏαδώσετε εκ νέου το ίδιο payload;" @@ -2580,15 +2557,14 @@ el: import_file_tip: ".dcstyle.json αÏχείο που πεÏιέχει το θέμα" about_theme: "Σχετικά με το Θέμα" license: "Άδεια ΧÏήσης" - component_of: "Το θέμα είναι στοιχείο από:" update_to_latest: "ΕνημέÏωση στην τελευταία έκδοση" check_for_updates: "Έλεγχος για ενημεÏώσεις" updating: "ΕνημέÏωση..." up_to_date: "Το θέμα είναι ενημεÏωμένο, τελευταίος έλεγχος:" add: "ΠÏοσθήκη" commits_behind: - one: Το θέμα είναι 1 έκδοση πίσω! - other: Το θέμα είναι {{count}} εκδόσεις πίσω! + one: "Το θέμα είναι 1 έκδοση πίσω!" + other: "Το θέμα είναι {{count}} εκδόσεις πίσω!" scss: text: "CSS" title: "ΚαταχώÏησε custom CSS, γίνονται δεκτά όλα τα valid CSS και SCSS styles" @@ -2717,7 +2693,6 @@ el: address_placeholder: "name@example.com" type_placeholder: "σÏνοψη, εγγÏαφή..." reply_key_placeholder: "κλειδί απάντησης" - skipped_reason_placeholder: "λόγος" logs: title: "ΑÏχεία καταγÏαφής" action: "ΕνέÏγεια" @@ -2835,8 +2810,8 @@ el: clear_filter: "ΚαθαÏισμός" show_words: "Ï€Ïοβολή λέξεων" word_count: - one: 1 λέξη - other: '%{count} λέξεις' + one: "1 λέξη" + other: "%{count} λέξεις" actions: block: 'Αποκλεισμός' censor: 'ΛογοκÏισία' @@ -2878,11 +2853,11 @@ el: suspect: 'Ύποπτο' approved: "ΕγκεκÏιμένο;" approved_selected: - one: έγκÏιση χÏήστη - other: έγκÏιση χÏηστών ({{count}}) + one: "έγκÏιση χÏήστη" + other: "έγκÏιση χÏηστών ({{count}})" reject_selected: - one: απόÏÏιψη χÏήστη - other: απόÏÏιψη χÏηστών ({{count}}) + one: "απόÏÏιψη χÏήστη" + other: "απόÏÏιψη χÏηστών ({{count}})" titles: active: 'ΕνεÏγοί ΧÏήστες' new: 'Îέοι ΧÏήστες' @@ -2899,11 +2874,11 @@ el: suspended: 'Αποβλημένοι ΧÏήστες' suspect: 'Ύποπτοι χÏήστες' reject_successful: - one: Επιτυχώς αποÏÏίφθηκε 1 χÏήστης. - other: Επιτυχώς αποÏÏίφθησαν %{count} χÏήστες. + one: "Επιτυχώς αποÏÏίφθηκε 1 χÏήστης." + other: "Επιτυχώς αποÏÏίφθησαν %{count} χÏήστες." reject_failures: - one: Αποτυχία απόÏÏιψης 1 χÏήστη. - other: Αποτυχία απόÏÏιψης %{count}χÏήστες. + one: "Αποτυχία απόÏÏιψης 1 χÏήστη." + other: "Αποτυχία απόÏÏιψης %{count}χÏήστες." not_verified: "Μη επαληθευμένος" check_email: title: "Εμφάνισε το email Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… χÏήστη" @@ -2980,14 +2955,14 @@ el: delete_forbidden_because_staff: "Οι διαχειÏιστές και οι συντονιστές δεν μποÏοÏν να διαγÏαφοÏν." delete_posts_forbidden_because_staff: "Δεν μποÏείς να διαγÏάψεις όλες τις αναÏτήσεις διαχειÏιστών και συντονιστών." delete_forbidden: - one: Οι χÏήστες δεν γίνεται να διαγÏαφοÏν εάν έχουν αναÏτήσεις. Σβήσε όλες τις αναÏτήσεις του Ï€Ïιν διαγÏάψεις το χÏήστη. (Δεν γίνεται να σβηστοÏν αναÏτήσεις που είναι παλαιότεÏες από %{count} ημέÏα) - other: Οι χÏήστες δεν γίνεται να διαγÏαφοÏν εάν έχουν αναÏτήσεις. Σβήσε όλες τις αναÏτήσεις τους Ï€Ïιν τους διαγÏάψεις. (Δεν γίνεται να σβηστοÏν αναÏτήσεις που είναι παλαιότεÏες από %{count} ημέÏες) + one: "Οι χÏήστες δεν γίνεται να διαγÏαφοÏν εάν έχουν αναÏτήσεις. Σβήσε όλες τις αναÏτήσεις του Ï€Ïιν διαγÏάψεις το χÏήστη. (Δεν γίνεται να σβηστοÏν αναÏτήσεις που είναι παλαιότεÏες από %{count} ημέÏα)" + other: "Οι χÏήστες δεν γίνεται να διαγÏαφοÏν εάν έχουν αναÏτήσεις. Σβήσε όλες τις αναÏτήσεις τους Ï€Ïιν τους διαγÏάψεις. (Δεν γίνεται να σβηστοÏν αναÏτήσεις που είναι παλαιότεÏες από %{count} ημέÏες)" cant_delete_all_posts: - one: Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις. Κάποιες αναÏτήσεις είναι παλαιότεÏες από %{count} ημέÏα. (Η ÏÏθμιση «delete_user_max_post_age setting») - other: Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις. Κάποιες αναÏτήσεις είναι παλαιότεÏες από %{count} ημέÏες. (Η ÏÏθμιση «delete_user_max_post_age setting») + one: "Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις. Κάποιες αναÏτήσεις είναι παλαιότεÏες από %{count} ημέÏα. (Η ÏÏθμιση «delete_user_max_post_age setting»)" + other: "Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις. Κάποιες αναÏτήσεις είναι παλαιότεÏες από %{count} ημέÏες. (Η ÏÏθμιση «delete_user_max_post_age setting»)" cant_delete_all_too_many_posts: - one: Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις επειδή ο χÏήστης έχει πεÏισσότεÏες από %{count} αναÏτήσεις. (Η ÏÏθμιση «delete_all_posts_max») - other: Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις επειδή ο χÏήστης έχει πεÏισσότεÏες από %{count} αναÏτήσεις. (Η ÏÏθμιση «delete_all_posts_max») + one: "Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις επειδή ο χÏήστης έχει πεÏισσότεÏες από %{count} αναÏτήσεις. (Η ÏÏθμιση «delete_all_posts_max»)" + other: "Δεν γίνεται να σβήσεις όλες τις αναÏτήσεις επειδή ο χÏήστης έχει πεÏισσότεÏες από %{count} αναÏτήσεις. (Η ÏÏθμιση «delete_all_posts_max»)" delete_confirm: "Είσαι ΣΙΓΟΥΡΟΣ ότι θέλεις να διαγÏάψεις αυτό το χÏήστη; Αυτό δεν μποÏεί να αναιÏεθεί!" delete_and_block: "Σβήσε και απόκλεισε αυτή την διεÏθυνση email και τη διεÏθυνση IP " delete_dont_block: "Μόνο διαγÏαφή" @@ -3028,8 +3003,8 @@ el: tl3_requirements: title: "ΠÏοϋποθέσεις για το επίπεδο εμπιστοσÏνης 3" table_title: - one: 'Την τελευταία μέÏα:' - other: 'Τις τελευταίες %{count} μέÏες:' + one: "Την τελευταία μέÏα:" + other: "Τις τελευταίες %{count} μέÏες:" value_heading: "Τιμή" requirement_heading: "ΠÏοϋπόθεση" visits: "Επισκέψεις" @@ -3195,8 +3170,8 @@ el: text: "Λείπουν δεδομένα για το υπόδειγμα. Αυτό συμβαίνει όταν το εÏώτημα παÏασήμων επιστÏέφει δεδομένα για αναÏτήσεις ή χÏήστες που δεν υπάÏχουν. Αυτό μποÏεί να έχει ανεπιθÏμητα αποτελέσματα αÏγότεÏα. ΠαÏακαλοÏμε έλεγξε ξανά το εÏώτημά σου." no_grant_count: "Δεν θα αποδοθεί κανένα παÏάσημο" grant_count: - one: 1 παÏάσημο για να αποδοθεί - other: %{count} παÏάσημα για να αποδοθοÏν + one: "1 παÏάσημο για να αποδοθεί" + other: "%{count} παÏάσημα για να αποδοθοÏν" sample: "Δείγμα:" grant: with: "%{username}" @@ -3263,8 +3238,8 @@ el: uploading: "Ανεβαίνει..." quit: "Ίσως αÏγότεÏα" staff_count: - one: 'Η κοινότητα έχει 1 συνεÏγάτη (εσένα). ' - other: Η κοινότητά σας έχει %{count} συνεÏγάτες, μαζί με σένα. + one: "Η κοινότητα έχει 1 συνεÏγάτη (εσένα). " + other: "Η κοινότητά σας έχει %{count} συνεÏγάτες, μαζί με σένα." invites: add_user: "Ï€Ïοσθήκη" none_added: "Δεν έχεις Ï€Ïοσκαλέσει συνεÏγάτες. Είσαι βέβαιος πως θέλεις να συνεχίσεις;" diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index e433e46f12..3aa3cbe34a 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -152,6 +152,7 @@ en: user_left: "%{who} removed themselves from this message %{when}" removed_user: "removed %{who} %{when}" removed_group: "removed %{who} %{when}" + autobumped: "automatically bumped %{when}" autoclosed: enabled: 'closed %{when}' disabled: 'opened %{when}' @@ -196,6 +197,7 @@ en: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Ireland)" eu_west_2: "EU (London)" + eu_west_3: "EU (Paris)" sa_east_1: "South America (Sao Paulo)" us_east_1: "US East (N. Virginia)" us_east_2: "US East (Ohio)" @@ -226,7 +228,8 @@ en: guidelines: "Guidelines" privacy_policy: "Privacy Policy" privacy: "Privacy" - terms_of_service: "Terms of Service" + tos: "Terms of Service" + rules: "Rules" mobile_view: "Mobile View" desktop_view: "Desktop View" you: "You" @@ -285,6 +288,13 @@ en: remove: "Remove Bookmark" confirm_clear: "Are you sure you want to clear all the bookmarks from this topic?" + drafts: + resume: "Resume" + remove: "Remove" + new_topic: "New topic draft" + new_private_message: "New private message draft" + topic_reply: "Draft reply" + topic_count_latest: one: "See {{count}} new or updated topic" other: "See {{count}} new or updated topics" @@ -544,18 +554,17 @@ en: "12": "Sent Items" "13": "Inbox" "14": "Pending" + "15": "Drafts" categories: all: "all categories" - all_subcategories: "all in %{categoryName}" + all_subcategories: "all" no_subcategory: "none" category: "Category" category_list: "Display category list" reorder: title: "Reorder Categories" title_long: "Reorganize the category list" - fix_order: "Fix Positions" - fix_order_tooltip: "Not all categories have a unique position number, which may cause unexpected results." save: "Save Order" apply_all: "Apply" position: "Position" @@ -571,6 +580,7 @@ en: topic_stat_sentence: one: "%{count} new topic in the past %{unit}." other: "%{count} new topics in the past %{unit}." + more: " (%{count} more) ..." ip_lookup: title: IP Address Lookup @@ -588,6 +598,7 @@ en: post_count: "# posts" confirm_delete_other_accounts: "Are you sure you want to delete these accounts?" powered_by: "powered by ipinfo.io" + copied: "copied" user_fields: none: "(select an option)" @@ -695,6 +706,7 @@ en: revoke_access: "Revoke Access" undo_revoke_access: "Undo Revoke Access" api_approved: "Approved:" + api_last_used_at: "Last used at:" theme: "Theme" home: "Default Home Page" staged: "Staged" @@ -738,6 +750,20 @@ en: choose_new: "Choose a new password" choose: "Choose a password" + second_factor_backup: + title: "Two Factor Backup Codes" + regenerate: "Regenerate" + disable: "Disable" + enable: "Enable" + enable_long: "Enable backup codes" + manage: "Manage backup codes" + copied_to_clipboard: "Copied to Clipboard" + copy_to_clipboard_error: "Error copying data to Clipboard" + remaining_codes: "You have {{count}} backup codes remaining." + codes: + title: "Backup Codes Generated" + description: "Each of these backup codes can only be used once. Keep them somewhere safe but accessible." + second_factor: title: "Two Factor Authentication" disable: "Disable two factor authentication" @@ -758,7 +784,7 @@ en: change_username: title: "Change Username" - confirm: "If you change your username, all prior quotes of your posts and @name mentions will be broken. Are you absolutely sure you want to?" + confirm: "Are you absolutely sure you want to change your username?" taken: "Sorry, that username is taken." invalid: "That username is invalid. It must only include numbers and letters" @@ -781,7 +807,6 @@ en: upload_title: "Upload your picture" upload_picture: "Upload Picture" image_is_not_a_square: "Warning: we've cropped your image; width and height were not equal." - cache_notice: "You've successfully changed your profile picture but it might take some time to appear due to browser caching." change_profile_background: title: "Profile Background" @@ -793,6 +818,9 @@ en: email: title: "Email" + primary: "Primary Email" + secondary: "Secondary Emails" + no_secondary: "No secondary emails" instructions: "never shown to the public" ok: "We will email you to confirm" invalid: "Please enter a valid email address" @@ -802,6 +830,12 @@ en: one: "We'll only email you if we haven't seen you in the last minute." other: "We'll only email you if we haven't seen you in the last {{count}} minutes." + associated_accounts: + title: "Associated Accounts" + connect: "Connect" + revoke: "Revoke" + not_connected: "(not connected)" + name: title: "Name" instructions: "your full name (optional)" @@ -829,6 +863,19 @@ en: password_confirmation: title: "Password Again" + auth_tokens: + title: "Recently Used Devices" + title_logs: "Authentication Logs" + ip_address: "IP Address" + created: "Created" + first_seen: "First Seen" + last_seen: "Last Seen" + operating_system: "Operating System" + location: "Location" + action: "Action" + login: "Log in" + logout: "Log out everywhere" + last_posted: "Last Post" last_emailed: "Last Emailed" last_seen: "Seen" @@ -985,9 +1032,10 @@ en: most_liked_users: "Most Liked" most_replied_to_users: "Most Replied To" no_likes: "No likes yet." + top_categories: "Top Categories" + topics: "Topics" + replies: "Replies" - - associated_accounts: "Logins" ip_address: title: "Last IP Address" registration_ip_address: @@ -1076,8 +1124,8 @@ en: hide_session: "Remind me tomorrow" hide_forever: "no thanks" hidden_for_session: "OK, I'll ask you tomorrow. You can always use 'Log In' to create an account, too." - intro: "Hey there! :heart_eyes: Looks like you're enjoying the discussion, but you're not signed up for an account." - value_prop: "When you create an account, we remember exactly what you've read, so you always come right back where you left off. You also get notifications, here and via email, whenever new posts are made. And you can like posts to share the love. :heartbeat:" + intro: "Hello! Looks like you’re enjoying the discussion, but you haven’t signed up for an account yet." + value_prop: "When you create an account, we remember exactly what you’ve read, so you always come right back where you left off. You also get notifications, here and via email, whenever someone replies to you. And you can like posts to share the love. :heartpulse:" summary: enabled_description: "You're viewing a summary of this topic: the most interesting posts as determined by the community." @@ -1094,7 +1142,8 @@ en: private_message_info: title: "Message" - invite: "Invite Others..." + invite: "Invite Others ..." + edit: "Add or Remove ..." leave_message: "Do you really want to leave this message?" remove_allowed_user: "Do you really want to remove {{name}} from this message?" remove_allowed_group: "Do you really want to remove {{name}} from this message?" @@ -1144,9 +1193,14 @@ en: password: "Password" second_factor_title: "Two Factor Authentication" second_factor_description: "Please enter the authentication code from your app:" + second_factor_backup: "Log in using a backup code" + second_factor_backup_title: "Two Factor Backup" + second_factor_backup_description: "Please enter one of your backup codes:" + second_factor: "Log in using Authenticator app" email_placeholder: "email or username" caps_lock_warning: "Caps Lock is on" error: "Unknown error" + cookies_error: "Your browsers seems to have cookies disabled. You might not be able to log in without enabling them first." rate_limit: "Please wait before trying to log in again." blank_username: "Please enter your email or username." blank_username_or_password: "Please enter your email or username, and password." @@ -1173,25 +1227,28 @@ en: preferences: "You need to be logged in to change your user preferences." forgot: "I don't recall my account details" not_approved: "Your account hasn't been approved yet. You will be notified by email when you are ready to log in." - google: - title: "with Google" - message: "Authenticating with Google (make sure pop up blockers are not enabled)" google_oauth2: + name: "Google" title: "with Google" message: "Authenticating with Google (make sure pop up blockers are not enabled)" twitter: + name: "Twitter" title: "with Twitter" message: "Authenticating with Twitter (make sure pop up blockers are not enabled)" instagram: + name: "Instagram" title: "with Instagram" message: "Authenticating with Instagram (make sure pop up blockers are not enabled)" facebook: + name: "Facebook" title: "with Facebook" message: "Authenticating with Facebook (make sure pop up blockers are not enabled)" yahoo: + name: "Yahoo" title: "with Yahoo" message: "Authenticating with Yahoo (make sure pop up blockers are not enabled)" github: + name: "GitHub" title: "with GitHub" message: "Authenticating with GitHub (make sure pop up blockers are not enabled)" invites: @@ -1236,6 +1293,7 @@ en: default_header_text: Select... no_content: No matches found filter_placeholder: Search... + filter_placeholder_with_any: Search or create... create: "Create: '{{content}}'" max_content_reached: one: "You can only select {{count}} item." @@ -1373,6 +1431,9 @@ en: admin_options_title: "Optional staff settings for this topic" composer_actions: + reply: Reply + draft: Draft + edit: Edit reply_to_post: label: Reply to post %{postNumber} by %{postUsername} desc: Reply to a specific post @@ -1393,6 +1454,9 @@ en: shared_draft: label: "Shared Draft" desc: "Draft a topic that will only be visible to staff" + toggle_topic_bump: + label: "Toggle topic bump" + desc: "Reply without changing the topic's bump date" notifications: tooltip: @@ -1749,6 +1813,8 @@ en: jump_prompt_of: "of %{count} posts" jump_prompt_long: "What post would you like to jump to?" jump_bottom_with_number: "jump to post %{post_number}" + jump_prompt_to_date: "to date" + jump_prompt_or: "or" total: total posts current: current post @@ -1812,6 +1878,7 @@ en: reset_read: "Reset Read Data" make_public: "Make Public Topic" make_private: "Make Personal Message" + reset_bump_date: "Reset Bump Date" feature: pin: "Pin Topic" @@ -2076,6 +2143,8 @@ en: lock_post_description: "prevent the poster from editing this post" unlock_post: "Unlock Post" unlock_post_description: "allow the poster to edit this post" + delete_topic_disallowed_modal: "You don't have permission to delete this topic. If you really want it to be deleted, submit a flag for moderator attention together with reasoning." + delete_topic_disallowed: "you don't have permission to delete this topic" actions: flag: 'Flag' @@ -2088,7 +2157,6 @@ en: inappropriate: "Undo flag" bookmark: "Undo bookmark" like: "Undo like" - vote: "Undo vote" people: off_topic: "flagged this as off-topic" spam: "flagged this as spam" @@ -2100,7 +2168,6 @@ en: like_capped: one: "and {{count}} other liked this" other: "and {{count}} others liked this" - vote: "voted for this" by_you: off_topic: "You flagged this as off-topic" spam: "You flagged this as spam" @@ -2109,7 +2176,6 @@ en: notify_user: "You sent a message to this user" bookmark: "You bookmarked this post" like: "You liked this" - vote: "You voted for this post" by_you_and_others: off_topic: one: "You and 1 other flagged this as off-topic" @@ -2132,9 +2198,6 @@ en: like: one: "You and 1 other liked this" other: "You and {{count}} other people liked this" - vote: - one: "You and 1 other voted for this post" - other: "You and {{count}} other people voted for this post" by_others: off_topic: one: "1 person flagged this as off-topic" @@ -2157,9 +2220,6 @@ en: like: one: "1 person liked this" other: "{{count}} people liked this" - vote: - one: "1 person voted for this post" - other: "{{count}} people voted for this post" delete: confirm: @@ -2210,7 +2270,7 @@ en: can: 'can… ' none: '(no category)' all: 'All categories' - choose: 'Select a category…' + choose: 'category…' edit: 'edit' edit_long: "Edit" view: 'View Topics in Category' @@ -2259,7 +2319,7 @@ en: show_subcategory_list: "Show subcategory list above topics in this category." num_featured_topics: "Number of topics shown on the categories page:" subcategory_num_featured_topics: "Number of featured topics on parent category's page:" - all_topics_wiki: "Make new topics wikis by default." + all_topics_wiki: "Make new topics wikis by default" subcategory_list_style: "Subcategory List Style:" sort_order: "Topic List Sort By:" default_view: "Default Topic List:" @@ -2267,13 +2327,17 @@ en: allow_badges_label: "Allow badges to be awarded in this category" edit_permissions: "Edit Permissions" add_permission: "Add Permission" + require_topic_approval: "Require moderator approval of all new topics" + require_reply_approval: "Require moderator approval of all new replies" this_year: "this year" - position: "position" + position: "Position:" default_position: "Default Position" position_disabled: "Categories will be displayed in order of activity. To control the order of categories in lists, " position_disabled_click: 'enable the "fixed category positions" setting.' minimum_required_tags: 'Minimum number of tags required in a topic:' parent: "Parent Category" + num_auto_bump_daily: 'Number of open topics to automatically bump daily:' + navigate_to_first_post_after_read: 'Navigate to first post after topics are read' notifications: watching: title: "Watching" @@ -2522,6 +2586,7 @@ en: bookmarks: 'g, b Bookmarks' profile: 'g, p Profile' messages: 'g, m Messages' + drafts: 'g, d Drafts' navigation: title: 'Navigation' jump: '# Go to post #' @@ -2711,6 +2776,9 @@ en: title: 'Discourse Admin' moderator: 'Moderator' + reports: + title: "List of available reports" + dashboard: title: "Dashboard" last_updated: "Dashboard last updated:" @@ -2747,8 +2815,16 @@ en: page_views_short: "Pageviews" show_traffic_report: "Show Detailed Traffic Report" community_health: Community health + moderators_activity: Moderators activity whats_new_in_discourse: What’s new in Discourse? activity_metrics: Activity Metrics + all_reports: "All reports" + general_tab: "General" + moderation_tab: "Moderation" + disabled: Disabled + timeout_error: Sorry, query is taking too long, please pick a shorter interval + exception_error: Sorry, an error occurred while executing the query + too_many_requests: You’ve performed this action too many times. Please wait before trying again. reports: trend_title: "%{percent} change. Currently %{current}, was %{prev} in previous period." @@ -2767,6 +2843,9 @@ en: end_date: "End Date" groups: "All groups" disabled: "This report is disabled" + totals_for_sample: "Totals for sample" + total: "All time total" + no_data: "No data to display." trending_search: more: 'Search logs' disabled: 'Trending search report is disabled. Enable log search queries to collect data.' @@ -2983,6 +3062,9 @@ en: flag_event: name: "Flag Event" details: "When a flag is created, agreed, disagreed or ignored." + queued_post_event: + name: "Post Approval Event" + details: "When a new queued post is created, approved or rejected." delivery_status: title: "Delivery Status" inactive: "Inactive" @@ -3126,9 +3208,16 @@ en: revert_confirm: "Are you sure you want to revert your changes?" theme: + theme: "Theme" + component: "Component" + components: "Components" import_theme: "Import Theme" customize_desc: "Customize:" title: "Themes" + modal_title: "Create Theme" + create: "Create" + create_type: "Type:" + create_name: "Name:" long_title: "Amend colors, CSS and HTML contents of your site" edit: "Edit" edit_confirm: "This is a remote theme, if you edit CSS/HTML your changes will be erased next time you update the theme." @@ -3143,6 +3232,10 @@ en: color_scheme_select: "Select colors to be used by theme" custom_sections: "Custom sections:" theme_components: "Theme Components" + switch_component: "Make theme" + switch_component_alert: "Are you sure you want to convert this component to theme? This will make it an independant theme and it will be removed as a child from all themes." + switch_theme: "Make component" + switch_theme_alert: "Are you sure you want to convert this theme to component? It will be removed as a parent from all components." uploads: "Uploads" no_uploads: "You can upload assets associated with your theme such as fonts and images" add_upload: "Add Upload" @@ -3165,7 +3258,7 @@ en: public_key: "Grant the following public key access to the repo:" about_theme: "About Theme" license: "License" - component_of: "Theme is a component of:" + component_of: "Component of:" update_to_latest: "Update to Latest" check_for_updates: "Check for Updates" updating: "Updating..." @@ -3173,9 +3266,11 @@ en: add: "Add" theme_settings: "Theme Settings" no_settings: "This theme has no settings." + empty: "No items" commits_behind: one: "Theme is 1 commit behind!" other: "Theme is {{count}} commits behind!" + compare_commits: "(See new commits)" scss: text: "CSS" title: "Enter custom CSS, we accept all valid CSS and SCSS styles" @@ -3308,7 +3403,6 @@ en: address_placeholder: "name@example.com" type_placeholder: "digest, signup..." reply_key_placeholder: "reply key" - skipped_reason_placeholder: "reason" moderation_history: performed_by: "Performed By" @@ -3406,9 +3500,11 @@ en: disabled_second_factor: "disable Two Factor Authentication" topic_published: "topic published" post_approved: "post approved" + post_rejected: "post rejected" create_badge: "create badge" change_badge: "change badge" delete_badge: "delete badge" + merge_user: "merge user" screened_emails: title: "Screened Emails" description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed." @@ -3768,6 +3864,14 @@ en: clear_filter: "Clear" add_url: "add URL" add_host: "add host" + uploaded_image_list: + label: "Edit list" + empty: "There are no pictures yet. Please upload one." + upload: + label: "Upload" + title: "Upload image(s)" + selectable_avatars: + title: "List of avatars users can choose from" categories: all_results: 'All' required: 'Required' @@ -3928,6 +4032,7 @@ en: step: "%{current} of %{total}" upload: "Upload" uploading: "Uploading..." + upload_error: "Sorry, there was an error uploading that file. Please try again." quit: "Maybe Later" staff_count: @@ -3941,3 +4046,8 @@ en: admin: "Admin" moderator: "Moderator" regular: "Regular User" + + previews: + topic_title: "Discussion topic" + share_button: "Share" + reply_button: "Reply" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 3acb300d51..76e91ce598 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -43,68 +43,68 @@ es: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" x_months: - one: 1 mes - other: '%{count}meses' + one: "1 mes" + other: "%{count}meses" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 minuto - other: '%{count} mins' + one: "1 minuto" + other: "%{count} mins" x_hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" x_days: - one: 1 día - other: '%{count} días' + one: "1 día" + other: "%{count} días" date_year: "D MMM, 'YY" medium_with_ago: x_minutes: - one: hace 1 minuto - other: hace %{count} minutos + one: "hace 1 minuto" + other: "hace %{count} minutos" x_hours: - one: hace 1 hora - other: hace %{count} horas + one: "hace 1 hora" + other: "hace %{count} horas" x_days: - one: hace 1 día - other: hace %{count} días + one: "hace 1 día" + other: "hace %{count} días" later: x_days: - one: 1 día después - other: '%{count} días después' + one: "1 día después" + other: "%{count} días después" x_months: - one: '%{count} mes después' - other: '%{count} meses después' + one: "%{count} mes después" + other: "%{count} meses después" x_years: - one: '%{count} año después' - other: '%{count} años después' + one: "%{count} año después" + other: "%{count} años después" previous_month: 'Mes anterior' next_month: 'Próximo mes' placeholder: fecha @@ -125,6 +125,7 @@ es: user_left: "%{who} se eliminó a sí mismo de este mensaje %{when}" removed_user: "eliminó a %{who} %{when}" removed_group: "eliminó a %{who} %{when}" + autobumped: "bumped automáticamente %{when}" autoclosed: enabled: 'cerrado %{when}' disabled: 'abierto %{when}' @@ -164,6 +165,7 @@ es: eu_central_1: "UE (Frankfurt)" eu_west_1: "UE (Irlanda)" eu_west_2: "EU (Londres)" + eu_west_3: "EU (Paris)" sa_east_1: "Sudamérica (São Paulo)" us_east_1: "EEUU Este (Virginia del Norte)" us_east_2: "US East (Ohio)" @@ -187,13 +189,14 @@ es: show_help: "opciones" links: "Enlaces" links_lowercase: - one: enlace - other: enlaces + one: "enlace" + other: "enlaces" faq: "FAQ" guidelines: "Directrices" privacy_policy: "Política de Privacidad" privacy: "Privacidad" - terms_of_service: "Condiciones de uso" + tos: "Condiciones de uso" + rules: "Reglas" mobile_view: "Versión móvil" desktop_view: "Versión de escritorio" you: "Tú" @@ -212,8 +215,8 @@ es: max_of_count: "máximo de {{count}}" alternation: "o" character_count: - one: '{{count}} carácter' - other: '{{count}} caracteres' + one: "{{count}} carácter" + other: "{{count}} caracteres" suggested_topics: title: "Temas Sugeridos" pm_title: "Mensajes sugeridos" @@ -247,15 +250,21 @@ es: last_read: "este es el último post que has leído; haz clic para guardarlo en marcadores" remove: "Eliminar marcador" confirm_clear: "¿Seguro que deseas borrar todos los marcadores de este tema?" + drafts: + resume: "Resúmen" + remove: "Eliminar" + new_topic: "Nuevo tema borrador" + new_private_message: "Nuevo mensaje privado borrador" + topic_reply: "Respuesta borrador" topic_count_latest: - one: Ver {{count}} tema nuevo o actualizado - other: Ver {{count}} temas nuevos o actualizados + one: "Ver {{count}} tema nuevo o actualizado" + other: "Ver {{count}} temas nuevos o actualizados" topic_count_unread: - one: Ver {{count}} tema sin leer - other: Ver {{count}} temas sin leer + one: "Ver {{count}} tema sin leer" + other: "Ver {{count}} temas sin leer" topic_count_new: - one: Ver {{count}} tema nuevo - other: Ver {{count}} temas nuevos + one: "Ver {{count}} tema nuevo" + other: "Ver {{count}} temas nuevos" preview: "vista previa" cancel: "cancelar" save: "Guardar cambios" @@ -293,16 +302,16 @@ es: cancel: "Cancelar" view_pending: "ver posts pendientes" has_pending_posts: - one: Este tema tiene 1 post esperando aprobación - other: Este tema tiene {{count}} posts esperando aprobación + one: "Este tema tiene 1 post esperando aprobación" + other: "Este tema tiene {{count}} posts esperando aprobación" confirm: "Guardar cambios" delete_prompt: "¿Seguro que quieres eliminar a %{username}? Se eliminarán todos sus posts y se bloqueará su email y dirección IP." approval: title: "El post necesita aprobación" description: "Hemos recibido tu nuevo post pero necesita ser aprobado por un moderador antes de aparecer. Por favor, ten paciencia." pending_posts: - one: Tienes 1 post pendiente. - other: Tienes {{count}} posts pendientes. + one: "Tienes 1 post pendiente." + other: "Tienes {{count}} posts pendientes." ok: "OK" user_action: user_posted_topic: "{{user}} publicó el tema" @@ -336,8 +345,8 @@ es: posts_read: "Leídos" posts_read_long: "Posts leídos" total_rows: - one: 1 usuario - other: '%{count} usuarios' + one: "1 usuario" + other: "%{count} usuarios" group_histories: actions: change_group_setting: "Cambiar ajustes de grupo" @@ -422,8 +431,8 @@ es: is_group_user: "Miembro" is_group_owner: "Propietario" title: - one: Grupo - other: Grupos + one: "Grupo" + other: "Grupos" activity: "Actividad" members: title: "Miembros" @@ -486,17 +495,16 @@ es: "12": "Elementos Enviados" "13": "Bandeja de entrada" "14": "Pendiente" + "15": "Borradores" categories: all: "Categorías" - all_subcategories: "todo en %{categoryName}" + all_subcategories: "todas" no_subcategory: "ninguna" category: "Categoría" category_list: "Mostrar lista de categorías" reorder: title: "Reorganizar Categorías" title_long: "Reorganizar la lista de categorías" - fix_order: "Ordenar posiciones" - fix_order_tooltip: "No todas las categorías tienen un número de posición único, lo que puede causar resultados inesperados." save: "Guardar orden" apply_all: "Aplicar" position: "Posición" @@ -507,11 +515,12 @@ es: toggle_ordering: "activar orden" subcategories: "Subcategorías" topic_sentence: - one: 1 tema - other: '%{count} temas' + one: "1 tema" + other: "%{count} temas" topic_stat_sentence: - one: '%{count} tema nuevo en los últimos %{unit}.' - other: '%{count} temas nuevos en los últimos %{unit}.' + one: "%{count} tema nuevo en los últimos %{unit}." + other: "%{count} temas nuevos en los últimos %{unit}." + more: "(%{count} más) ..." ip_lookup: title: Búsqueda de Direcciones IP hostname: Nombre del host @@ -528,6 +537,7 @@ es: post_count: "# posts" confirm_delete_other_accounts: "¿Seguro que quieres eliminar estas cuentas?" powered_by: "powered by ipinfo.io" + copied: "copiado" user_fields: none: "(selecciona una opción)" user: @@ -630,6 +640,7 @@ es: revoke_access: "Revocar acceso" undo_revoke_access: "Deshacer revocación de acceso" api_approved: "Aprobado:" + api_last_used_at: "Fecha de último uso:" theme: "Theme" home: "Página de inicio por defecto" staged: "Temporal" @@ -668,6 +679,19 @@ es: set_password: "Establecer contraseña" choose_new: "Escoge una nueva contraseña" choose: "Escoge una contraseña" + second_factor_backup: + title: "Código de seguridad de verificación en dos pasos" + regenerate: "Regenerar" + disable: "Deshabilitar" + enable: "Habilitar" + enable_long: "Habilitar códigos de respaldo" + manage: "Gestionar códigos de respaldo" + copied_to_clipboard: "Copiado al portapapeles" + copy_to_clipboard_error: "Error copiando datos al portapapeles" + remaining_codes: "Tienes {{count}} códigos de respaldo restantes." + codes: + title: "Códigos de seguridad generados" + description: "Cada uno de estos códigos de respaldo puede ser usado una única vez. Mantén los códigos en un lugar seguro, pero accesible." second_factor: title: "Autenticación Dos Factores" disable: "Inhabilitar Autenticación Dos Factores" @@ -686,7 +710,7 @@ es: error: "Hubo un error al cambiar este valor." change_username: title: "Cambiar Nombre de Usuario" - confirm: "Si cambias tu nombre de usuario, todas las citas anteriores a tus posts y menciones a tu @nombre se romperán. ¿Seguro que quieres hacerlo?" + confirm: "¿Estás absolutamente seguro que quieres cambiar tu nombre de usuario?" taken: "Lo sentimos, ese nombre de usuario ya está siendo usado." invalid: "Este nombre de usuario no es válido. Debe incluir sólo números y letras" change_email: @@ -707,7 +731,6 @@ es: upload_title: "Sube tu foto" upload_picture: "Subir Imagen" image_is_not_a_square: "Advertencia: hemos recortado su imagen; la anchura y la altura no eran iguales." - cache_notice: "Has cambiado correctamente tu imagen de perfil pero podría tardar un poco en aparecer debido al caching del navegador." change_profile_background: title: "Fondo de perfil" instructions: "Fondos de perfil serán centrados y tendrán un ancho por default de 850px." @@ -716,14 +739,22 @@ es: instructions: "Imágenes de fondo serán centrados y tendrán un ancho por default de 590px." email: title: "E-mail" + primary: "Correo electrónico principal" + secondary: "Correos electrónicos secundarios" + no_secondary: "Sin correos electrónicos secundarios" instructions: "nunca se mostrará al público" ok: "Te enviaremos un email para confirmar" invalid: "Por favor, introduce una dirección de correo válida" authenticated: "Tu dirección de correo ha sido autenticada por {{provider}}" frequency_immediately: "Te enviaremos un email inmediatamente si no has leído aquello que vamos a enviarte." frequency: - one: Sólo te enviaremos emails si no te hemos visto en el último minuto. - other: Sólo te enviaremos si no te hemos visto en los últimos {{count}} minutos. + one: "Sólo te enviaremos emails si no te hemos visto en el último minuto." + other: "Sólo te enviaremos si no te hemos visto en los últimos {{count}} minutos." + associated_accounts: + title: "Cuentas asociadas" + connect: "Conectar" + revoke: "Revocar" + not_connected: "(no conectada)" name: title: "Nombre" instructions: "tu nombre completo (opcional)" @@ -748,6 +779,18 @@ es: any: "cualquiera" password_confirmation: title: "Introduce de nuevo la contraseña" + auth_tokens: + title: "Dispositivos utilizados recientemente" + title_logs: "Logs de Autenticación" + ip_address: "Dirección IP" + created: "Creado" + first_seen: "Primera vez" + last_seen: "Última vez" + operating_system: "Sistema operativo" + location: "Ubicación" + action: "Acción" + login: "Inicio de sesión" + logout: "Cierre de sesión en todos los dispositivos" last_posted: "Último post" last_emailed: "Último Enviado por email" last_seen: "Visto por última vez" @@ -809,8 +852,8 @@ es: sent: "Enviadas" none: "Sin invitaciones para mostrar." truncated: - one: Mostrando la primera invitación. - other: Mostrando las primeras {{count}} invitaciones. + one: "Mostrando la primera invitación." + other: "Mostrando las primeras {{count}} invitaciones." redeemed: "Invitaciones aceptadas" redeemed_tab: "Usado" redeemed_tab_with_count: "Aceptadas ({{count}})" @@ -857,29 +900,29 @@ es: time_read: "tiempo de lectura" recent_time_read: "tiempo de lectura reciente" topic_count: - one: tema creado - other: temas creados + one: "tema creado" + other: "temas creados" post_count: - one: post publicado - other: posts publicados + one: "post publicado" + other: "posts publicados" likes_given: - one: dado - other: dados + one: "dado" + other: "dados" likes_received: - one: recibido - other: recibidos + one: "recibido" + other: "recibidos" days_visited: - one: día visitado - other: días visitados + one: "día visitado" + other: "días visitados" topics_entered: - one: tema visto - other: temas vistos + one: "tema visto" + other: "temas vistos" posts_read: - one: post leído - other: posts leídos + one: "post leído" + other: "posts leídos" bookmark_count: - one: marcador - other: marcadores + one: "marcador" + other: "marcadores" top_replies: "Respuestas top" no_replies: "No hay respuestas aún." more_replies: "Más respuestas" @@ -895,7 +938,9 @@ es: most_liked_users: "Más gustado" most_replied_to_users: "A quienes más respondió" no_likes: "No hay me gusta aún." - associated_accounts: "Inicios de sesión" + top_categories: "Categorías top" + topics: "Temas" + replies: "Respuestas" ip_address: title: "Última dirección IP" registration_ip_address: @@ -948,8 +993,8 @@ es: reached: "%{relativeAge} – %{rate} alcanzó el límite establecido en las opciones del sitio del %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} excedió el límite establecido en las opciones del sitio del %{siteSettingRate}." rate: - one: 1 error/%{duration} - other: '%{count} errores/%{duration}' + one: "1 error/%{duration}" + other: "%{count} errores/%{duration}" learn_more: "saber más..." all_time: 'total' all_time_desc: 'temas creados total' @@ -977,8 +1022,8 @@ es: hide_session: "Recordar mañana" hide_forever: "no, gracias" hidden_for_session: "Vale, te preguntaremos mañana. Recuerda que también puedes usar el botón 'Iniciar sesión' para crear una cuenta en cualquier momento." - intro: "¡Hola! :heart_eyes: Parece que estás interesado en las cosas que nuestros usuarios publican, pero no tienes una cuenta registrada." - value_prop: "Cuando te registras, recordamos lo que has leído, para que puedas volver justo donde estabas leyendo. También recibes notificaciones, por aquí y por email, cuando se publican nuevos posts. ¡También puedes darle a Me gusta a los mensajes! :heartbeat:" + intro: "¡Hola! Parece que estás disfrutando del debate, pero no tienes una cuenta registrada aún." + value_prop: "Cuando registras una cuenta, recordamos exactamente lo que has leído, para que puedas volver justo donde estabas leyendo. También recibes notificaciones, por aquí y por email, cuando alguien responde a tus mensajes. ¡También puedes darle a \"Me gusta\" a los mensajes para compartir amor! :heartpulse:" summary: enabled_description: "Estás viendo un resumen de este tema: los posts más interesantes determinados por la comunidad." description: "Hay {{replyCount}} respuestas." @@ -992,7 +1037,8 @@ es: disable: "Mostrar Posts Eliminados" private_message_info: title: "Mensaje" - invite: "Invitar a Otros..." + invite: "Invitar a otros..." + edit: "Añadir o quitar..." leave_message: "¿Realmente quieres dejar este mensaje?" remove_allowed_user: "¿Seguro que quieres eliminar a {{name}} de este mensaje?" remove_allowed_group: "¿Seguro que quieres eliminar a {{name}} de este mensaje?" @@ -1036,9 +1082,14 @@ es: password: "Contraseña" second_factor_title: "Autenticación Dos Factores" second_factor_description: "Por favor ingrese el código de autenticación desde su aplicación:" + second_factor_backup: "Ingresar usando código de respaldo" + second_factor_backup_title: "Two Factor Backup" + second_factor_backup_description: "Por favor, introduce uno de los códigos de respaldo:" + second_factor: "Inicie sesión usando la app Authenticator" email_placeholder: "dirección de e-mail o nombre de usuario" caps_lock_warning: "Está activado Bloqueo de Mayúsculas" error: "Error desconocido" + cookies_error: "Tu navegador parece tener las cookies desactivadas. El inicio de sesión podría no funcionar hasta que las actives." rate_limit: "Por favor, espera un poco antes de volver a intentar iniciar sesión." blank_username: "Por favor ingresa tu email o nombre de usuario." blank_username_or_password: "Por favor, introducir tu e-mail o usuario, y tu contraseña." @@ -1058,30 +1109,33 @@ es: change_email: "Cambiar dirección de email" provide_new_email: "Poner un nuevo email, y te reenviaremos una confirmación de email." submit_new_email: "Actualizar Dirección de Email" - sent_activation_email_again: "Te hemos enviado otro e-mail de activación a {{currentemail}}. Podría tardar algunos minutos en llegar; asegúrate de revisar tu carpeta de spam." + sent_activation_email_again: "Te hemos enviado otro e-mail de activación a {{currentEmail}}. Podría tardar algunos minutos en llegar; asegúrate de revisar tu carpeta de spam." to_continue: "Por favor, inicia sesión" preferences: "Debes tener una sesión iniciada para cambiar tus preferencias de usuario." forgot: "No me acuerdo de los detalles de mi cuenta." not_approved: "Tu cuenta aún no ha sido aprobada. Se te notificará por email cuando todo esté listo para iniciar sesión." - google: - title: "con Google" - message: "Autenticando con Google (asegúrate de desactivar cualquier bloqueador de pop ups)" google_oauth2: + name: "Google" title: "con Google" message: "Autenticando con Google (asegúrate de no tener habilitados bloqueadores de pop-up)" twitter: + name: "Twitter" title: "con Twitter" message: "Autenticando con Twitter (asegúrate de desactivar cualquier bloqueador de pop ups)" instagram: + name: "Instagram" title: "con Instagram" message: "Autenticando con Instagram (asegúrate que los bloqueadores de pop up no están activados)" facebook: + name: "Facebook" title: "con Facebook" message: "Autenticando con Facebook (asegúrate de desactivar cualquier bloqueador de pop ups)" yahoo: + name: "Yahoo" title: "con Yahoo" message: "Autenticando con Yahoo (asegúrate de desactivar cualquier bloqueador de pop ups)" github: + name: "GitHub" title: "con GitHub" message: "Autenticando con GitHub (asegúrate de desactivar cualquier bloqueador de pop ups)" invites: @@ -1120,13 +1174,14 @@ es: default_header_text: Seleccionar... no_content: Ninguna coincidencia encontrada filter_placeholder: Buscar... + filter_placeholder_with_any: Buscar o crear... create: "Crear: '{{content}}'" max_content_reached: - one: Puedes seleccionar únicamente {{count}} item. - other: Puedes seleccionar únicamente {{count}} items. + one: "Puedes seleccionar únicamente {{count}} item." + other: "Puedes seleccionar únicamente {{count}} items." min_content_not_reached: - one: Seleccionar al menos {{count}} item. - other: Seleccionar al menos {{count}} items. + one: "Seleccionar al menos {{count}} item." + other: "Seleccionar al menos {{count}} items." emoji_picker: filter_placeholder: Buscar emoji people: Personas @@ -1169,8 +1224,8 @@ es: drafts_offline: "borradores offline" group_mentioned_limit: "¡Advertencia! Has mencionado {{group}}, sin embargo este grupo tiene más miembros que el límite máximo de {{max}} usuarios configurado por el administrador para hacer menciones. Nadie será notificado. " group_mentioned: - one: Al mencionar a {{group}}, estás a punto de notificar a 1 persona – ¿seguro que quieres hacerlo? - other: Al mencionar a {{group}}, estás a punto de notificar a {{count}} personas – ¿seguro que quieres hacerlo? + one: "Al mencionar a {{group}}, estás a punto de notificar a 1 persona – ¿seguro que quieres hacerlo?" + other: "Al mencionar a {{group}}, estás a punto de notificar a {{count}} personas – ¿seguro que quieres hacerlo?" cannot_see_mention: category: "Mencionaste a {{username}} pero no será notificado porque no tiene acceso a esta categoría. Necesitarás añadirlo a un grupo para que tenga acceso a esta categoría." private: "Mencionaste a {{username}} pero no se les notificará porque no pueden ver este mensaje personal. Necesitarás invitarlos a este MP." @@ -1246,6 +1301,9 @@ es: body: "¡Vas a enviarte este mensaje a ti mismo!" admin_options_title: "Opciones de moderación para este tema" composer_actions: + reply: Responder + draft: Borrador + edit: Editar reply_to_post: label: "Responder al post %{postNumber} de %{postUsername}" desc: Responder a un post específico @@ -1266,14 +1324,17 @@ es: shared_draft: label: "Borrador Compartido" desc: "Haz borrador al tema que será visible únicamente por el staff" + toggle_topic_bump: + label: "Alternar BUMP del tema" + desc: "Responder sin alterar la fecha dump del tema" notifications: tooltip: regular: - one: 1 notificación sin leer - other: '{{count}} notificaciones no leídas' + one: "1 notificación sin leer" + other: "{{count}} notificaciones no leídas" message: - one: 1 mensaje sin leer - other: '{{count}} mensajes sin leer' + one: "1 mensaje sin leer" + other: "{{count}} mensajes sin leer" title: "notificaciones por menciones a tu @nombre, respuestas a tus posts y temas, mensajes, etc" none: "No se han podido cargar las notificaciones." empty: "No se han encontrado notificaciones." @@ -1288,8 +1349,8 @@ es: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} and 1 mas {{description}} - other: {{username}}, {{username2}} y otros {{count}} {{description}} + one: "{{username}}, {{username2}} and 1 mas {{description}}" + other: "{{username}}, {{username2}} y otros {{count}} {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1300,8 +1361,8 @@ es: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nuevo Tema {{description}}" group_message_summary: - one: '{{count}} mensaje en tu bandeja de {{group_name}}' - other: '{{count}} mensajes en tu bandeja de {{group_name}} ' + one: "{{count}} mensaje en tu bandeja de {{group_name}}" + other: "{{count}} mensajes en tu bandeja de {{group_name}} " popup: mentioned: '{{username}} te mencionó en "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} te ha mencionado en "{{topic}}" - {{site_title}}' @@ -1338,8 +1399,8 @@ es: clear_all: "Limpiar todo" too_short: "El término de búsqueda es demasiado corto." result_count: - one: 1 resultado para{{term}} - other: {{count}}{{plus}} resultados para {{term}} + one: "1 resultado para{{term}}" + other: "{{count}}{{plus}} resultados para {{term}}" title: "buscar temas, posts, usuarios o categorías" full_page_title: "buscar temas o posts" no_results: "No se ha encontrado ningún resultado." @@ -1430,8 +1491,8 @@ es: notification_level: "Notificaciones" choose_new_category: "Elige una nueva categoría para los temas:" selected: - one: Has seleccionado 1 tema. - other: Has seleccionado {{count}} temas. + one: "Has seleccionado 1 tema." + other: "Has seleccionado {{count}} temas." change_tags: "Cambiar etiquetas" append_tags: "Agregar etiquetas" choose_new_tags: "Elige nuevas etiquetas para estos temas:" @@ -1464,8 +1525,8 @@ es: search: "No hay más resultados de búsqueda." topic: filter_to: - one: 1 post en el tema - other: '{{count}} posts en el tema' + one: "1 post en el tema" + other: "{{count}} posts en el tema" create: 'Crear tema' create_long: 'Crear un nuevo tema' open_draft: "Abrir Borrador" @@ -1483,10 +1544,10 @@ es: new: 'nuevo tema' unread: 'sin leer' new_topics: - one: 1 tema nuevo + one: '1 tema nuevo' other: '{{count}} temas nuevos' unread_topics: - one: 1 tema sin leer + one: '1 tema sin leer' other: '{{count}} temas sin leer' title: 'Tema' invalid_access: @@ -1500,17 +1561,17 @@ es: title: "Tema no encontrado" description: "Lo sentimos, no pudimos encontrar ese tema. ¿Tal vez fue eliminado por un moderador?" total_unread_posts: - one: tienes 1 publicación sin leer en este tema - other: tienes {{count}} publicaciones sin leer en este tema + one: "tienes 1 publicación sin leer en este tema" + other: "tienes {{count}} publicaciones sin leer en este tema" unread_posts: - one: tienes 1 post antiguo sin leer en este tema - other: tienes {{count}} posts antiguos sin leer en este tema + one: "tienes 1 post antiguo sin leer en este tema" + other: "tienes {{count}} posts antiguos sin leer en este tema" new_posts: - one: hay 1 nuevo post en este tema desde la última vez que lo leíste - other: hay {{count}} posts nuevos en este tema desde la última vez que lo leíste + one: "hay 1 nuevo post en este tema desde la última vez que lo leíste" + other: "hay {{count}} posts nuevos en este tema desde la última vez que lo leíste" likes: - one: este tema le gusta a 1 persona - other: este tema les gusta a {{count}} personas + one: "este tema le gusta a 1 persona" + other: "este tema les gusta a {{count}} personas" back_to_list: "Volver a la Lista de Temas" options: "Opciones del Tema" show_links: "mostrar enlaces dentro de este tema" @@ -1574,8 +1635,8 @@ es: auto_reminder: "Te recordaremos sobre este tema %{timeLeft}." auto_close_title: 'Configuración de auto-cerrado' auto_close_immediate: - one: El último post se publicó hace 1 hora, por lo que el tema se cerrará inmediatamente. - other: El último post se publicó hace %{count} horas, por lo que el tema se cerrará inmediatamente. + one: "El último post se publicó hace 1 hora, por lo que el tema se cerrará inmediatamente." + other: "El último post se publicó hace %{count} horas, por lo que el tema se cerrará inmediatamente." timeline: back: "Volver" back_description: "Volver al último post sin leer" @@ -1590,6 +1651,8 @@ es: jump_prompt_of: "de %{count} posts" jump_prompt_long: "¿Hacia qué post quieres saltar?" jump_bottom_with_number: "saltar al post %{post_number}" + jump_prompt_to_date: "hasta hoy" + jump_prompt_or: "o" total: posts totales current: post actual notifications: @@ -1651,6 +1714,7 @@ es: reset_read: "Restablecer datos de lectura" make_public: "Convertir en tema público" make_private: "Crear Mensaje Personal" + reset_bump_date: "Resetear fecha Bump" feature: pin: "Destacar tema" unpin: "Dejar de destacar tema" @@ -1683,8 +1747,8 @@ es: pin_validation: "Es obligatorio especificar una fecha para destacar este tema." not_pinned: "No hay temas destacados en {{categoryLink}}." already_pinned: - one: 'Hay un tema destacado actualmente en {{categoryLink}}. ' - other: 'Temas destacados actualmente en {{categoryLink}}: {{count}}' + one: "Hay un tema destacado actualmente en {{categoryLink}}. " + other: "Temas destacados actualmente en {{categoryLink}}: {{count}}" pin_globally: "Hacer que este tema aparezca en el top de todas las listas de temas hasta" confirm_pin_globally: "Hay ya {{count}} temas destacados globalmente. Que haya demasiados temas destacados puede resultar engorroso para los usuarios nuevos y anónimos. ¿Seguro que quieres destacar otro tema de forma global?" unpin_globally: "Eliminar este tema de la parte superior de todas las listas de temas." @@ -1692,8 +1756,8 @@ es: global_pin_note: "Los usuarios pueden desanclar el tema de forma individual por sí mismos." not_pinned_globally: "No hay temas destacados globalmente." already_pinned_globally: - one: Actualmente hay 1 tema destacado globalmente. - other: 'Temas destacados globalmente: {{count}}' + one: "Actualmente hay 1 tema destacado globalmente." + other: "Temas destacados globalmente: {{count}}" make_banner: "Hacer de este tema una pancarta que aparece en la parte superior de todas las páginas." remove_banner: "Retire la pancarta que aparece en la parte superior de todas las páginas." banner_note: "Los usuarios pueden descartar la pancarta cerrándola. Sólo un tema puede ser una pancarta en cualquier momento dado." @@ -1730,8 +1794,8 @@ es: login_reply: 'Inicia Sesión para Responder' filters: n_posts: - one: 1 post - other: '{{count}} posts' + one: "1 post" + other: "{{count}} posts" cancel: "Quitar filtro" split_topic: title: "Mover a un tema nuevo" @@ -1739,15 +1803,15 @@ es: topic_name: "Nombre del tema nuevo" error: "Hubo un error moviendo los posts al nuevo tema" instructions: - one: Estas a punto de crear un tema nuevo y rellenarlo con el post que has seleccionado. - other: Estas a punto de crear un tema nuevo y rellenarlo con los {{count}} posts que has seleccionado. + one: "Estas a punto de crear un tema nuevo y rellenarlo con el post que has seleccionado." + other: "Estas a punto de crear un tema nuevo y rellenarlo con los {{count}} posts que has seleccionado." merge_topic: title: "Mover a un tema existente" action: "mover a un tema existente" error: "Hubo un error moviendo los posts a ese tema" instructions: - one: Por favor escoge el tema al que quieres mover ese post. - other: Por favor escoge el tema al que quieres mover esos {{count}} posts. + one: "Por favor escoge el tema al que quieres mover ese post." + other: "Por favor escoge el tema al que quieres mover esos {{count}} posts." merge_posts: title: "Unir posts seleccionados" action: "unir posts seleccionados" @@ -1759,8 +1823,8 @@ es: label: "Nuevo dueño de los posts" placeholder: "nombre de usuario del nuevo dueño" instructions: - one: Por favor escoge el nuevo dueño del {{count}} post de {{old_user}}. - other: Por favor escoge el nuevo dueño de los {{count}} posts de {{old_user}}. + one: "Por favor escoge el nuevo dueño del {{count}} post de {{old_user}}." + other: "Por favor escoge el nuevo dueño de los {{count}} posts de {{old_user}}." instructions_warn: "Tenga en cuenta que cualquier notificación sobre esta publicación no se transferirá al nuevo usuario de forma retroactiva." change_timestamp: title: "Cambiar Timestamp..." @@ -1789,7 +1853,7 @@ es: deselect_all: deshacer selección description: one: Has seleccionado 1 post. - other: Has seleccionado {{count}} posts. + other: "Has seleccionado {{count}} posts." post: quote_reply: "Citar" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1804,28 +1868,28 @@ es: show_full: "Mostrar todo el post" show_hidden: 'Ver el contenido oculto.' deleted_by_author: - one: (post retirado por el autor. Será borrado automáticamente en %{count} hora si no es reportado) - other: (post retirado por el autor. Será borrado automáticamente en %{count} horas si no es reportado) + one: "(post retirado por el autor. Será borrado automáticamente en %{count} hora si no es reportado)" + other: "(post retirado por el autor. Será borrado automáticamente en %{count} horas si no es reportado)" collapse: "contraer" expand_collapse: "expandir/contraer" locked: "un miembro del personal ha bloqueado esta publicación para que no se edite" gap: - one: ver 1 post oculto - other: ver {{count}} posts ocultos + one: "ver 1 post oculto" + other: "ver {{count}} posts ocultos" unread: "Post sin leer" has_replies: - one: '{{count}} Respuesta' - other: '{{count}} Respuestas' + one: "{{count}} Respuesta" + other: "{{count}} Respuestas" has_likes: - one: '{{count}} Me gusta' - other: '{{count}} Me gusta' + one: "{{count}} Me gusta" + other: "{{count}} Me gusta" has_likes_title: - one: 1 persona le ha dado Me gusta a este post - other: '{{count}} personas le han dado Me gusta a este post' + one: "1 persona le ha dado Me gusta a este post" + other: "{{count}} personas le han dado Me gusta a este post" has_likes_title_only_you: "te ha gustado este mensaje" has_likes_title_you: - one: A tí y a una persona le ha gustado este mensaje - other: A tí y a otros {{count}} les han gustado este mensaje + one: "A tí y a una persona le ha gustado este mensaje" + other: "A tí y a otros {{count}} les han gustado este mensaje" errors: create: "Lo sentimos, hubo un error al crear tu post. Por favor, inténtalo de nuevo." edit: "Lo sentimos, hubo un error al editar tu post. Por favor, inténtalo de nuevo." @@ -1865,11 +1929,11 @@ es: delete_replies: confirm: "¿Quieres eliminar también las respuestas a este post?" direct_replies: - one: Si, y 1 respuesta directa - other: Si, y {{count}} respuestas directas + one: "Si, y 1 respuesta directa" + other: "Si, y {{count}} respuestas directas" all_replies: - one: Sí, y 1 respuesta - other: Sí, y todas las {{count}} respuestas + one: "Sí, y 1 respuesta" + other: "Sí, y todas las {{count}} respuestas" just_the_post: "No, solo este post" admin: "acciones de administrador para el post" wiki: "Formato wiki" @@ -1884,18 +1948,19 @@ es: lock_post_description: "evitar que el usuario que publicó edite esta publicación" unlock_post: "Desbloquear Post" unlock_post_description: "permitir al usuario que publicó, editar este post" + delete_topic_disallowed_modal: "No tienes permiso para borrar este tema. Si de verdad quieres que se elimine, repórtalo y explica los motivos en el propio reporte para que lo estudiemos." + delete_topic_disallowed: "no tienes permiso para borrar este tema" actions: flag: 'Reportar' defer_flags: - one: Ignorar reporte - other: Ignorar reportes + one: "Ignorar reporte" + other: "Ignorar reportes" undo: off_topic: "Deshacer reporte" spam: "Deshacer reporte" inappropriate: "Deshacer reporte" bookmark: "Deshacer marcador" like: "Deshacer Me gusta" - vote: "Deshacer voto" people: off_topic: "reportó esto como off-topic" spam: "reportó esto como spam" @@ -1905,9 +1970,8 @@ es: bookmark: "guardó esto en marcadores" like: "le gustó esto" like_capped: - one: y {{count}} otro le gustó esto - other: y {{count}} otros les gustó esto - vote: "votó por esto" + one: "y {{count}} otro le gustó esto" + other: "y {{count}} otros les gustó esto" by_you: off_topic: "Has reportado esto como off-topic" spam: "Has reportado esto como Spam" @@ -1916,65 +1980,58 @@ es: notify_user: "Has enviado un mensaje a este usuario" bookmark: "Has marcado este post" like: "Te ha gustado esto" - vote: "Has votado este post" by_you_and_others: off_topic: - one: Tú y otro usuarios habéis reportado esto como off-topic - other: Tú y otros {{count}} usuarios habéis reportado esto como off-topic + one: "Tú y otro usuarios habéis reportado esto como off-topic" + other: "Tú y otros {{count}} usuarios habéis reportado esto como off-topic" spam: - one: Tú y otro usuario habéis reportado esto como off-topic - other: Tú y otros {{count}} usuarios habéis reportado esto como spam + one: "Tú y otro usuario habéis reportado esto como off-topic" + other: "Tú y otros {{count}} usuarios habéis reportado esto como spam" inappropriate: - one: Tú y otro usuario habéis reportado esto como inapropiado - other: Tú y otros {{count}} usuarios habéis reportado esto como inapropiado + one: "Tú y otro usuario habéis reportado esto como inapropiado" + other: "Tú y otros {{count}} usuarios habéis reportado esto como inapropiado" notify_moderators: - one: Tú y otro usuario habéis reportado esto para moderar - other: Tú y otros {{count}} usuarios habéis reportado esto para moderar + one: "Tú y otro usuario habéis reportado esto para moderar" + other: "Tú y otros {{count}} usuarios habéis reportado esto para moderar" notify_user: - one: Tú y otra persona habéis enviado un mensaje a este usuario - other: Tú y otras {{count}} personas habéis enviado un mensaje a este usuario + one: "Tú y otra persona habéis enviado un mensaje a este usuario" + other: "Tú y otras {{count}} personas habéis enviado un mensaje a este usuario" bookmark: - one: Tú y otro usuario habéis marcado este post - other: Tú y otros {{count}} usuarios habéis marcado este post + one: "Tú y otro usuario habéis marcado este post" + other: "Tú y otros {{count}} usuarios habéis marcado este post" like: - one: A ti y a otro usuario os ha gustado esto - other: A ti y a otros {{count}} usuarios os ha gustado esto - vote: - one: Tú y otro usuario habéis votado este post - other: Tú y otros {{count}} habéis votado este post + one: "A ti y a otro usuario os ha gustado esto" + other: "A ti y a otros {{count}} usuarios os ha gustado esto" by_others: off_topic: - one: 1 usuario ha reportado esto como off-topic - other: '{{count}} usuarios han reportado esto como off-topic' + one: "1 usuario ha reportado esto como off-topic" + other: "{{count}} usuarios han reportado esto como off-topic" spam: - one: 1 usuario ha reportado esto como spam - other: '{{count}} usuarios han reportado esto como spam' + one: "1 usuario ha reportado esto como spam" + other: "{{count}} usuarios han reportado esto como spam" inappropriate: - one: 1 usuario ha reportado esto como inapropiado - other: '{{count}} usuarios han reportado esto como inapropiado' + one: "1 usuario ha reportado esto como inapropiado" + other: "{{count}} usuarios han reportado esto como inapropiado" notify_moderators: - one: 1 usuario ha reportado esto para que sea moderado - other: '{{count}} usuarios han reportado esto para que sea moderado' + one: "1 usuario ha reportado esto para que sea moderado" + other: "{{count}} usuarios han reportado esto para que sea moderado" notify_user: - one: 1 persona ha enviado un mensaje a este usuario - other: '{{count}} personas han enviado un mensaje a este usuario' + one: "1 persona ha enviado un mensaje a este usuario" + other: "{{count}} personas han enviado un mensaje a este usuario" bookmark: - one: Una persona ha marcado este post - other: '{{count}} han marcado este post' + one: "Una persona ha marcado este post" + other: "{{count}} han marcado este post" like: - one: A 1 persona le gusta esto - other: A {{count}} personas les gusta esto - vote: - one: Una persona ha votado este post - other: '{{count}} personas votaron este post' + one: "A 1 persona le gusta esto" + other: "A {{count}} personas les gusta esto" delete: confirm: - one: ¿Estás seguro que quieres eliminar ese post? - other: ¿Estás seguro que quieres eliminar esos {{count}} posts? + one: "¿Estás seguro que quieres eliminar ese post?" + other: "¿Estás seguro que quieres eliminar esos {{count}} posts?" merge: confirm: - one: Seguro que quieres unir esos posts? - other: Seguro que quieres unir esos {{count}} posts? + one: "Seguro que quieres unir esos posts?" + other: "Seguro que quieres unir esos {{count}} posts?" revisions: controls: first: "Primera revisión" @@ -2012,7 +2069,7 @@ es: can: 'puede… ' none: '(sin categoría)' all: 'Categorías' - choose: 'Seleccionar una categoría…' + choose: 'categoría…' edit: 'editar' edit_long: "Editar" view: 'Ver temas en la categoría' @@ -2061,7 +2118,7 @@ es: show_subcategory_list: "Mostrar la lista de subcategorías arriba de la lista de temas en esta categoría." num_featured_topics: "Número de temas a mostrar en la página de categorías:" subcategory_num_featured_topics: "Número de temas destacados a mostrar en la página superior de categorías:" - all_topics_wiki: "Hacer todos los temas wiki por defecto" + all_topics_wiki: "Hacer nuevos temas wikis por defecto" subcategory_list_style: "Estilo de lista de Subcategorías" sort_order: "Ordenar lista de temas:" default_view: "Orden por defecto:" @@ -2069,13 +2126,17 @@ es: allow_badges_label: "Permitir conceder distintivos en esta categoría" edit_permissions: "Editar permisos" add_permission: "Añadir permisos" + require_topic_approval: "Requiere aprobación del moderador para todos los temas nuevos" + require_reply_approval: "Requiere aprobación del moderador para todas las respuestas nuevas" this_year: "este año" - position: "posición" + position: "Posición:" default_position: "Posición predeterminada" position_disabled: "Las Categorías se mostrarán por orden de actividad. Para controlar el orden en que aparecen en las listas," position_disabled_click: 'activa la opción "fixed category positions".' minimum_required_tags: 'Número mínimo de etiquetas requeridas en un tema:' parent: "Categoría primaria" + num_auto_bump_daily: 'Número de temas abiertos a revivir diariamente:' + navigate_to_first_post_after_read: 'Ir al primer post después de que los temas sean leídos' notifications: watching: title: "Vigilar" @@ -2132,14 +2193,14 @@ es: custom_placeholder_notify_moderators: "Haznos saber qué te preocupa específicamente y, siempre que sea posible, añade enlaces y ejemplos relevantes." custom_message: at_least: - one: introduce al menos un carácter - other: introduce al menos {{count}} caracteres + one: "introduce al menos un carácter" + other: "introduce al menos {{count}} caracteres" more: - one: 1 más... - other: '{{count}} más...' + one: "1 más..." + other: "{{count}} más..." left: - one: 1 restante - other: '{{count}} restantes' + one: "1 restante" + other: "{{count}} restantes" flagging_topic: title: "¡Gracias por ayudar a mantener una comunidad civilizada!" action: "Reportar tema" @@ -2150,13 +2211,13 @@ es: links_title: "Enlaces populares" links_shown: "mostrar más enlaces..." clicks: - one: 1 clic - other: '%{count} clics' + one: "1 clic" + other: "%{count} clics" post_links: about: "expandir los demás enlaces de este post" title: - one: 1 más - other: '%{count} más' + one: "1 más" + other: "%{count} más" topic_statuses: warning: help: "Ésta es una advertencia oficial." @@ -2190,22 +2251,22 @@ es: original_post: "Post Original" views: "Visitas" views_lowercase: - one: visita - other: visitas + one: "visita" + other: "visitas" replies: "Respuestas" views_long: - one: este tema se ha visto 1 vez - other: este tema se ha visto {{number}} veces + one: "este tema se ha visto 1 vez" + other: "este tema se ha visto {{number}} veces" activity: "Actividad" likes: "Likes" likes_lowercase: - one: me gusta - other: me gusta + one: "me gusta" + other: "me gusta" likes_long: "este tema tiene {{number}} me gusta" users: "Usuarios" users_lowercase: - one: usuario - other: usuarios + one: "usuario" + other: "usuarios" category_title: "Categoría" history: "Historia" changed_by: "por {{author}}" @@ -2219,8 +2280,8 @@ es: latest: title: "Recientes" title_with_count: - one: Reciente (1) - other: Recientes ({{count}}) + one: "Reciente (1)" + other: "Recientes ({{count}})" help: "temas con posts recientes" hot: title: "Candente" @@ -2238,21 +2299,21 @@ es: unread: title: "Sin leer" title_with_count: - one: Sin leer (1) - other: Sin leer ({{count}}) + one: "Sin leer (1)" + other: "Sin leer ({{count}})" help: "temas que estás vigilando o siguiendo actualmente con posts no leídos" lower_title_with_count: - one: '{{count}} sin leer' - other: '{{count}} sin leer' + one: "{{count}} sin leer" + other: "{{count}} sin leer" new: lower_title_with_count: - one: 1 tema nuevo - other: '{{count}} temas nuevos' + one: "1 tema nuevo" + other: "{{count}} temas nuevos" lower_title: "nuevo" title: "Nuevo" title_with_count: - one: Nuevos ({{count}}) - other: Nuevos ({{count}}) + one: "Nuevos ({{count}})" + other: "Nuevos ({{count}})" help: "temas publicados en los últimos días" posted: title: "Mis posts" @@ -2263,8 +2324,8 @@ es: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "temas recientes en la categoría {{categoryName}}" top: title: "Top" @@ -2308,6 +2369,7 @@ es: bookmarks: 'g, b Marcadores' profile: 'g, p Perfil' messages: 'g, m Mensajes' + drafts: 'g, d Borradores' navigation: title: 'Navegación' jump: '# Ir al post #' @@ -2352,22 +2414,22 @@ es: print: 'ctrl+p Imprimir tema' badges: earned_n_times: - one: Ganó este distintivo 1 vez - other: Ganó este distintivo %{count} veces + one: "Ganó este distintivo 1 vez" + other: "Ganó este distintivo %{count} veces" granted_on: "Concedido hace: %{date}" others_count: "Otras personas con este distintivo (%{count})" title: Distintivos allow_title: "Puedes usar este distintivo como título" multiple_grant: "Puedes ganar esto varias veces" badge_count: - one: 1 Distintivo - other: '%{count} distintivos' + one: "1 Distintivo" + other: "%{count} distintivos" more_badges: - one: +1 Más - other: +%{count} Más + one: "+1 Más" + other: "+%{count} Más" granted: - one: 1 concedido - other: '%{count} concedidos' + one: "1 concedido" + other: "%{count} concedidos" select_badge_for_title: Seleccionar una distinción para utilizar como tu título none: "(ninguna)" successfully_granted: "Concedido exitosamente %{badge} a %{username}" @@ -2401,8 +2463,8 @@ es: choose_for_topic: "etiquetas opcionales" delete_tag: "Eliminar etiqueta" delete_confirm: - one: ¿Estás seguro de querer borrar esta etiqueta y eliminarla de 1 tema asignado? - other: ¿Estás seguro de querer borrar esta etiqueta y eliminarla de {{count}} temas asignados? + one: "¿Estás seguro de querer borrar esta etiqueta y eliminarla de 1 tema asignado?" + other: "¿Estás seguro de querer borrar esta etiqueta y eliminarla de {{count}} temas asignados?" delete_confirm_no_topics: "¿Estás seguro de querer borrar esta etiqueta?" rename_tag: "Renombrar etiqueta" rename_instructions: "Elige un nuevo nombre para la etiqueta:" @@ -2483,6 +2545,8 @@ es: admin: title: 'Administrador de Discourse' moderator: 'Moderador' + reports: + title: "Lista de reportes disponibles" dashboard: title: "Panel" last_updated: "Panel actualizado el:" @@ -2519,8 +2583,16 @@ es: page_views_short: "Páginas vistas" show_traffic_report: "Mostrar informe detallado del tráfico" community_health: Salud de la Comunidad + moderators_activity: Actividad de moderación whats_new_in_discourse: "¿Qué hay de nuevo en Discourse?" activity_metrics: Métricas de Actividad + all_reports: "Todos los reportes" + general_tab: "General" + moderation_tab: "Moderación" + disabled: Desactivado + timeout_error: "Lo sentimos, la solicitud está durando demasiado, por favor selecciona un periodo más corto" + exception_error: "Lo siento, ha ocurrido un error al ejecutar la consulta" + too_many_requests: "Has realizado esta acción demasiadas veces. Por favor, espera antes de intentarlo de nuevo." reports: trend_title: "%{percent} de cambio. Actualmente %{current}, era %{prev} en el periodo previo." today: "Hoy" @@ -2538,6 +2610,9 @@ es: end_date: "Hasta fecha" groups: "Todos los grupos" disabled: "Este reporte está inhabilitado" + totals_for_sample: "Total para la muestra" + total: "Total de siempre" + no_data: "Ningún dato a mostrar." trending_search: more: 'Buscar logs' disabled: 'El reporte de Tendencias de Búsquedas está inhabilitado. Habilita el log consultas de búsquedas para colectar datos.' @@ -2583,11 +2658,11 @@ es: suspend_user: "Suspender Usuario" suspend_user_title: "Suspender usuario de este post" replies: - one: '[1 respuesta]' - other: '[%{count} respuestas]' + one: "[1 respuesta]" + other: "[%{count} respuestas]" delete_replies: - one: ¿También borrar %{count} respuesta a este post? - other: ¿También borrar las %{count} respuestas a este post? + one: "¿También borrar %{count} respuesta a este post?" + other: "¿También borrar las %{count} respuestas a este post?" dispositions: agreed: "coincidió" disagreed: "no coincidió" @@ -2743,6 +2818,9 @@ es: flag_event: name: "Reportar Evento" details: "Cuando un reporte es creado, de acuerdo, en desacuerdo, o ignorado." + queued_post_event: + name: "Evento de aprobación de publicación" + details: "Cuando se crea, aprueba o rechaza una nueva publicación en cola." delivery_status: title: "Estado de entrega" inactive: "Inactivo" @@ -2752,11 +2830,11 @@ es: none: "No hay eventos relacionados." redeliver: "Reenviar" incoming: - one: Hay un nuevo evento. - other: Hay {{count}} nuevos eventos. + one: "Hay un nuevo evento." + other: "Hay {{count}} nuevos eventos." completed_in: - one: Completado en 1 segundo. - other: Completado en {{count}} segundos. + one: "Completado en 1 segundo." + other: "Completado en {{count}} segundos." request: "Petición" response: "Respuesta" redeliver_confirm: "¿Seguro que quieres reenviar el mismo payload?" @@ -2881,9 +2959,16 @@ es: revert: "Revertir los cambios" revert_confirm: "¿Estás seguro de querer revertir los cambios?" theme: + theme: "Tema" + component: "Componente" + components: "Componentes" import_theme: "Importar Theme" customize_desc: "Personalizar:" title: "Themes" + modal_title: "Crear tema" + create: "Crear" + create_type: "Tipo:" + create_name: "Nombre:" long_title: "Modifique los colores, los CSS y los contenidos HTML de su sitio" edit: "Editar" edit_confirm: "Este es un theme remoto, si editas CSS/HTML, los cambios serán borrados en la próxima actualización al theme." @@ -2898,6 +2983,10 @@ es: color_scheme_select: "Selecciona colores para ser usados en el theme" custom_sections: "Personalizaciones:" theme_components: "Componentes del Theme" + switch_component: "Convertir a tema" + switch_component_alert: "¿Seguro que quieres convertir este componente en theme? Esto lo convertirá en un theme independiente y se eliminará como un secundario de todos los themes." + switch_theme: "Hacer componente" + switch_theme_alert: "¿Seguro que quieres convertir este theme en componente? Se eliminará como principal de todos los componentes." uploads: "Subidos" no_uploads: "Puedes subir archivos asociados con tu theme como fuentes e imágenes " add_upload: "Agregar Subido" @@ -2920,7 +3009,7 @@ es: public_key: "Conceda la siguiente clave pública de acceso para el repositorio:" about_theme: "Acerca del Theme" license: "Licencia" - component_of: "Theme es un componente de:" + component_of: "Componente de:" update_to_latest: "Actualizar a lo último" check_for_updates: "Verificar por Actualizaciones" updating: "Actualizando..." @@ -2928,9 +3017,11 @@ es: add: "Agregar" theme_settings: "Ajustes del Theme" no_settings: "Este theme no tiene ajustes." + empty: "Sin items" commits_behind: - one: Theme está 1 commit detrás! - other: Theme está {{count}} commits detrás! + one: "Theme está 1 commit detrás!" + other: "Theme está {{count}} commits detrás!" + compare_commits: "(Ver nuevos commits)" scss: text: "CSS" title: "Ingresa tu CSS, aceptamos estilos válidos de CSS y SCSS" @@ -3062,7 +3153,6 @@ es: address_placeholder: "nombre@ejemplo.com" type_placeholder: "resumen, registro..." reply_key_placeholder: "clave de respuesta" - skipped_reason_placeholder: "motivo" moderation_history: performed_by: "Realizado por" no_results: "No hay historia de moderación disponible." @@ -3162,6 +3252,7 @@ es: create_badge: "crear distintivo" change_badge: "cambiar distintivo" delete_badge: "borrar distintivo" + merge_user: "unir usuario" screened_emails: title: "Correos bloqueados" description: "Cuando alguien trata de crear una cuenta nueva, los siguientes correos serán revisados y el registro será bloqueado, o alguna otra acción será realizada." @@ -3213,8 +3304,8 @@ es: clear_filter: "Limpiar" show_words: "mostrar palabras" word_count: - one: 1 palabra - other: '%{count} palabras' + one: "1 palabra" + other: "%{count} palabras" actions: block: 'Bloquear' censor: 'Censurar' @@ -3258,11 +3349,11 @@ es: staged: 'Temporal' approved: "Aprobado/s?" approved_selected: - one: aprobar usuario - other: aprobar ({{count}}) usuarios + one: "aprobar usuario" + other: "aprobar ({{count}}) usuarios" reject_selected: - one: rechazar usuario - other: rechazar ({{count}}) usuarios + one: "rechazar usuario" + other: "rechazar ({{count}}) usuarios" titles: active: 'Usuarios activos' new: 'Usuarios nuevos' @@ -3280,11 +3371,11 @@ es: suspect: 'Usuarios sospechados' staged: 'Usuarios Temporales' reject_successful: - one: 1 usuario rechazado con éxito. - other: '%{count} usuarios rechazados con éxito.' + one: "1 usuario rechazado con éxito." + other: "%{count} usuarios rechazados con éxito." reject_failures: - one: Error al rechazar 1 usuario. - other: Error al rechazar %{count} usuarios. + one: "Error al rechazar 1 usuario." + other: "Error al rechazar %{count} usuarios." not_verified: "No verificado" check_email: title: "Revelar la dirección de e-mail de este usuario" @@ -3373,14 +3464,14 @@ es: delete_forbidden_because_staff: "Administradores y moderadores no pueden ser eliminados" delete_posts_forbidden_because_staff: "No se pueden eliminar todos los posts de admins y moderadores." delete_forbidden: - one: Los usuarios no se pueden borrar si han sido registrados hace más de %{count} día, o si tienen publicaciones. Borra todas publicaciones antes de tratar de borrar un usuario. - other: Los usuarios no se pueden borrar si han sido registrados hace más de %{count} días, o si tienen publicaciones. Borra todas publicaciones antes de tratar de borrar un usuario. + one: "Los usuarios no se pueden borrar si han sido registrados hace más de %{count} día, o si tienen publicaciones. Borra todas publicaciones antes de tratar de borrar un usuario." + other: "Los usuarios no se pueden borrar si han sido registrados hace más de %{count} días, o si tienen publicaciones. Borra todas publicaciones antes de tratar de borrar un usuario." cant_delete_all_posts: - one: No se pueden eliminar todos los posts. Algunos tienen más de %{count} día de antigüedad. (Ver la opción delete_user_max_post_age ) - other: No se pueden eliminar todos los posts. Algunos tienen más de %{count} días de antigüedad. (Ver la opción delete_user_max_post_age ) + one: "No se pueden eliminar todos los posts. Algunos tienen más de %{count} día de antigüedad. (Ver la opción delete_user_max_post_age )" + other: "No se pueden eliminar todos los posts. Algunos tienen más de %{count} días de antigüedad. (Ver la opción delete_user_max_post_age )" cant_delete_all_too_many_posts: - one: No se pueden eliminar todos los posts porque el usuario tiene más de 1 post. (Ver la opción delete_all_posts_max) - other: No se pueden eliminar todos los posts porque el usuario tiene más de %{count} posts. (Ver la opción delete_all_posts_max) + one: "No se pueden eliminar todos los posts porque el usuario tiene más de 1 post. (Ver la opción delete_all_posts_max)" + other: "No se pueden eliminar todos los posts porque el usuario tiene más de %{count} posts. (Ver la opción delete_all_posts_max)" delete_confirm: "Estás SEGURO que quieres borrar este usuario? Esta acción es permanente!" delete_and_block: "Eliminar y bloquear este correo y esta dirección IP" delete_dont_block: "Eliminar solo." @@ -3422,8 +3513,8 @@ es: tl3_requirements: title: "Requerimientos para el nivel de confianza 3" table_title: - one: 'En el último día:' - other: 'En los últimos %{count} días:' + one: "En el último día:" + other: "En los últimos %{count} días:" value_heading: "Valor" requirement_heading: "Requerimiento" visits: "Visitas" @@ -3510,6 +3601,14 @@ es: clear_filter: "Limpiar filtro" add_url: "añadir URL" add_host: "añadir host" + uploaded_image_list: + label: "Editar lista" + empty: "No hay imágenes todavía. Por favor, sube una." + upload: + label: "Subir" + title: "Subir imagen(es)" + selectable_avatars: + title: "Lista de avatares de la que los usuarios pueden elegir" categories: all_results: 'Todo' required: 'Requerido' @@ -3598,8 +3697,8 @@ es: text: "Faltan algunas muestras a la hora de conceder el distintivo. Esto ocurre cuando la query del distintivo devuelve IDs de usuarios o de posts que no existen. Esto podría causar resultados inesperados más tarde - por favor, revisa de nuevo tu query." no_grant_count: "No hay distintivos para asignar." grant_count: - one: %{count} distintivos para conceder. - other: %{count} distintivos para conceder. + one: "%{count} distintivos para conceder." + other: "%{count} distintivos para conceder." sample: "Ejemplo:" grant: with: "%{username}" @@ -3664,10 +3763,11 @@ es: step: "%{current} de %{total}" upload: "Subir" uploading: "Subiendo..." + upload_error: "Lo sentimos, hubo un error subiendo ese archivo. Por favor, inténtalo de nuevo." quit: "Tal vez más tarde" staff_count: - one: 'Tu comunidad tiene 1 staff (tú). ' - other: Tu comunidad tiene %{count} staff, incluyéndote. + one: "Tu comunidad tiene 1 staff (tú). " + other: "Tu comunidad tiene %{count} staff, incluyéndote." invites: add_user: "añadir" none_added: "No has invitado a nadie como staff. ¿Seguro que quieres continuar?" @@ -3675,3 +3775,7 @@ es: admin: "Admin" moderator: "Moderador" regular: "Usuario habitual" + previews: + topic_title: "Tema" + share_button: "Compartir" + reply_button: "Responder" diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index 43241f1897..418fa53f63 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -43,68 +43,68 @@ et: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1p - other: '%{count}p' + one: "1p" + other: "%{count}p" x_months: - one: 1kuu - other: '%{count}kuud' + one: "1kuu" + other: "%{count}kuud" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "D. MMMM" date_year: "MMMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} min' + one: "1 min" + other: "%{count} min" x_hours: - one: 1 tund - other: '%{count} tundi' + one: "1 tund" + other: "%{count} tundi" x_days: - one: 1 päev - other: '%{count} päeva' + one: "1 päev" + other: "%{count} päeva" date_year: "D. MMMM, 'YY" medium_with_ago: x_minutes: - one: 1 min tagasi - other: '%{count} min tagasi' + one: "1 min tagasi" + other: "%{count} min tagasi" x_hours: - one: 1 tund tagasi - other: '%{count} tundi tagasi' + one: "1 tund tagasi" + other: "%{count} tundi tagasi" x_days: - one: 1 päev tagasi - other: '%{count} päeva tagasi' + one: "1 päev tagasi" + other: "%{count} päeva tagasi" later: x_days: - one: 1 päev hiljem - other: '%{count} päeva hiljem' + one: "1 päev hiljem" + other: "%{count} päeva hiljem" x_months: - one: 1 kuu hiljem - other: '%{count} kuud hiljem' + one: "1 kuu hiljem" + other: "%{count} kuud hiljem" x_years: - one: 1 aasta hiljem - other: '%{count} aastat hiljem' + one: "1 aasta hiljem" + other: "%{count} aastat hiljem" previous_month: 'Eelmine Kuu' next_month: 'Järgmine Kuu' placeholder: kuupäev @@ -179,13 +179,13 @@ et: show_help: "võimalused" links: "Viited" links_lowercase: - one: viide - other: viited + one: "viide" + other: "viited" faq: "KKK" guidelines: "Juhised" privacy_policy: "Privaatsuspoliitika" privacy: "Privaatsus" - terms_of_service: "Teenuse tingimused" + tos: "Teenuse tingimused" mobile_view: "Mobiilne vaade" desktop_view: "Täisvaade" you: "Sina" @@ -204,8 +204,8 @@ et: max_of_count: "maksimum {{count}}-st" alternation: "või" character_count: - one: '{{count}} sümbol' - other: '{{count}} sümbolit' + one: "{{count}} sümbol" + other: "{{count}} sümbolit" suggested_topics: title: "Soovitatud teemad" pm_title: "Soovitatud sõnumid" @@ -273,16 +273,16 @@ et: cancel: "Tühista" view_pending: "vaata kinnitamata postitusi" has_pending_posts: - one: 1 postitus selles teemas ootab kinnitamist - other: {{count}} postitust selles teemas ootavad kinnitamist + one: "1 postitus selles teemas ootab kinnitamist" + other: "{{count}} postitust selles teemas ootavad kinnitamist" confirm: "Salvesta muudatused" delete_prompt: "Oled kindel, et soovid %{username} kustutada? Sellega kaasneb tema kõigi postituste kustutamine ja meili- ning IP-aadresside blokeerimine." approval: title: "Postitus vajab kinnitust" description: "Oleme sinu uue postituse kätte saanud, kuid see vajab enne ilmumist moderaatori kinnitust. Palume veidi kannatust. " pending_posts: - one: Sul on 1 kinnitamata postitus. - other: Sul on {{count}} kinnitamata postitust. + one: "Sul on 1 kinnitamata postitus." + other: "Sul on {{count}} kinnitamata postitust." ok: "OK" user_action: user_posted_topic: "{{user}} postitas selle teema" @@ -316,8 +316,8 @@ et: posts_read: "Loetud" posts_read_long: "Positusi loetud" total_rows: - one: 1 kasutaja - other: '%{count} kasutajat' + one: "1 kasutaja" + other: "%{count} kasutajat" group_histories: actions: change_group_setting: "Muuda grupi sätteid" @@ -347,8 +347,8 @@ et: title: "Grupid" empty: "Ühtegi nähtavat gruppi pole." title: - one: Grupp - other: Grupid + one: "Grupp" + other: "Grupid" activity: "Tegevused" topics: "Teemat" posts: "Postitused" @@ -406,8 +406,6 @@ et: reorder: title: "Reasta foorumid ümber" title_long: "Reasta foorumid ümber" - fix_order: "Fikseeri asukohad" - fix_order_tooltip: "Osadel foorumitel puudub unikaalne asukoha number, mis võib anda ettearvamatuid tulemusi." save: "Salvesta järjestus" apply_all: "Rakenda" position: "Paiguta" @@ -418,11 +416,11 @@ et: toggle_ordering: "lülita järjestus" subcategories: "Alamfoorumid" topic_sentence: - one: 1 teema - other: '%{count} teemat' + one: "1 teema" + other: "%{count} teemat" topic_stat_sentence: - one: '%{count} uus teema viimase %{unit} jooksul.' - other: '%{count} uut teemat viimase %{unit} jooksul.' + one: "%{count} uus teema viimase %{unit} jooksul." + other: "%{count} uut teemat viimase %{unit} jooksul." ip_lookup: title: IP-aadressi Otsing hostname: Hostinimi @@ -576,7 +574,6 @@ et: error: "Välja muutmisel tekkis viga." change_username: title: "Muuda kasutajanime" - confirm: "Muutes oma kasutajanime, katkevad kõik varasemad viited sinu postitustele ja @name mainimised. Oled täiesti veendunud, et soovid seda?" taken: "Vabandust, see kasutajanimi on võetud." invalid: "Selline kasutajanimi ei ole lubatud. Kasutada tohib ainult numbreid ja tähti" change_email: @@ -595,7 +592,6 @@ et: upload_title: "Lae üles oma pilt" upload_picture: "Lae pilt üles" image_is_not_a_square: "Hoiatus: lõikasime pilti, kuna laius ja kõrgus ei olnud võrdsed." - cache_notice: "Oled edukalt muutnud oma profiilipildi kuid võib juhtuda, et näed seda alles mõne aja pärast." change_profile_background: title: "Profiili taustpilt" instructions: "Profiili taustad tsentreeritakse ja on vaikimisi 850 pikslit laiad." @@ -610,8 +606,8 @@ et: authenticated: "Sinu meil on autenditud {{provider}} poolt" frequency_immediately: "Saadame sulle kohe meili, kui sa ei ole seda lugenud, mille kohta meili saatsime." frequency: - one: Saadame meili vaid siis, kui pole sind viimase minuti jooksul näinud. - other: Saadame meili vaid siis, kui pole Sind viimase {{count}} minuti jooksul näinud. + one: "Saadame meili vaid siis, kui pole sind viimase minuti jooksul näinud." + other: "Saadame meili vaid siis, kui pole Sind viimase {{count}} minuti jooksul näinud." name: title: "Nimi" instructions: "sinu täisnimi (mittekohustuslik)" @@ -697,8 +693,8 @@ et: sent: "Saadetud" none: "Pole ühtegi kutset, mida näidata." truncated: - one: Näitan esimest kutset. - other: Näitan esimest {{count}} kutset. + one: "Näitan esimest kutset." + other: "Näitan esimest {{count}} kutset." redeemed: "Lunastatud kutsed" redeemed_tab: "Lunastatud" redeemed_tab_with_count: "Lunastatud ({{count}})" @@ -744,26 +740,26 @@ et: stats: "Statistika" time_read: "lugemise aeg" topic_count: - one: teema loodud - other: teemat loodud + one: "teema loodud" + other: "teemat loodud" post_count: - one: postitus loodud - other: postitust loodud + one: "postitus loodud" + other: "postitust loodud" likes_given: - one: antud - other: antud + one: "antud" + other: "antud" likes_received: - one: saadud - other: saadud + one: "saadud" + other: "saadud" days_visited: - one: päev külastatud - other: päevi külastatud + one: "päev külastatud" + other: "päevi külastatud" posts_read: - one: postitus loetud - other: postitust loetud + one: "postitus loetud" + other: "postitust loetud" bookmark_count: - one: järjehoidja - other: järjehoidjad + one: "järjehoidja" + other: "järjehoidjad" top_replies: "Parimad vastused" no_replies: "Veel ei ole vastuseid." more_replies: "Veel vastuseid" @@ -779,7 +775,6 @@ et: most_liked_users: "Enim meeldinud" most_replied_to_users: "Enim vastatud teemasse" no_likes: "Meeldimisi veel pole." - associated_accounts: "Sisselogimisi" ip_address: title: "Viimane IP-aadress" registration_ip_address: @@ -831,8 +826,8 @@ et: reached: "%{relativeAge} – %{rate} on saavutanud saidi sätetes kehtestatud limiidi %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} ületab saidi sätetes kehtestatud limiiti %{siteSettingRate}." rate: - one: 1 viga/%{duration} - other: '%{count} viga/%{duration}' + one: "1 viga/%{duration}" + other: "%{count} viga/%{duration}" learn_more: "uuri veel..." all_time: 'kokku' all_time_desc: 'kokku teemasid loodud' @@ -856,8 +851,6 @@ et: hide_session: "Tuleta mulle homme meelde" hide_forever: "tänan, ei" hidden_for_session: "OK, küsin homme uuesti. Samuti võid konto alati 'Logi sisse' lingi alt luua." - intro: "Hei! :heart_eyes: Näib, et sulle see vestlus meeldib, kuid sa pole endale veel kontot loonud." - value_prop: "Kui oled endale konto loonud, jätame me täpselt meelde, mida oled lugenud. Nii jätkad alati sealt, kus pooleli jätsid. Samuti tulevad sulle teavitused nii siia kui ka meilile, kui ilmuvad uued postitused. Ning võid postituste juurde märkida \"meeldib\", et näidata oma poolehoidu. :heartbeat:" summary: enabled_description: "Vaatad selle teema kokkuvõtet: kõige huvipakkuvamad postitused valib kogukond." description: "Kokku on {{replyCount}} vastust." @@ -871,7 +864,6 @@ et: disable: "Näita kustutatud postitusi" private_message_info: title: "Sõnum" - invite: "Kutsu teisi..." remove_allowed_user: "Kas soovid tõesti {{name}} sellest sõnumist eemaldada?" remove_allowed_group: "Kas soovid tõesti {{name}} sellest sõnumist eemaldada?" email: 'Meiliaadress' @@ -924,9 +916,6 @@ et: preferences: "Oma kasutajaeelistuste muutmiseks pead olema sisse logitud." forgot: "Ma ei mäleta oma konto üksikasju" not_approved: "Kontot pole veel kinnitatud. Teid teavitatakse e-post teel, kui sisselogimine on võimaldatud." - google: - title: "Google abil" - message: "Autentimine Google abil (veendu, et hüpikaknad oleks lubatud)" google_oauth2: title: "Google abil" message: "Autentimine Google abil (veendu, et hüpikaknad oleks lubatud)" @@ -1012,8 +1001,8 @@ et: similar_topics: "Sinu teema sarnaneb..." drafts_offline: "mustandid vallasrežiimis" group_mentioned: - one: Mainides {{group}}, oled teavitamas 1 inimest – oled selles kindel? - other: Mainides {{group}}, oled teavitamas {{count}} inimest – oled selles kindel? + one: "Mainides {{group}}, oled teavitamas 1 inimest – oled selles kindel?" + other: "Mainides {{group}}, oled teavitamas {{count}} inimest – oled selles kindel?" cannot_see_mention: category: "Mainisid kasutajat {{username}} kuid teda ei teavitata, kuna tal puudub juurdepääs siia foorumisse. Lisa ta gruppi, kellel on siia foorumisse ligipääs." private: "Mainisid kasutajat {{username}} kuid teda ei teavitata, kuna tal puudub juurdepääs käesoleva privaatsõnumi juurde. Kutsu ta seda privaatsõnumit vaatama." @@ -1082,11 +1071,11 @@ et: notifications: tooltip: regular: - one: 1 nägemata teavitus - other: '{{count}} nägemata teavitust' + one: "1 nägemata teavitus" + other: "{{count}} nägemata teavitust" message: - one: 1 lugemata sõnum - other: '{{count}} lugemata sõnumit' + one: "1 lugemata sõnum" + other: "{{count}} lugemata sõnumit" title: "teavitused @name mainimiste, oma postitustele ja teemadele vastamiste, sõnumite, jne kohta" none: "Hetkel ei saa teavitusi laadida." empty: "Teavitusi ei leitud." @@ -1219,8 +1208,8 @@ et: notification_level: "Teavitus" choose_new_category: "Vali teemadele uus foorum:" selected: - one: Märkisid ära 1 teema. - other: Märkisid ära {{count}} teemat. + one: "Märkisid ära 1 teema." + other: "Märkisid ära {{count}} teemat." change_tags: "Asenda sildid" append_tags: "Lisa sildid" choose_new_tags: "Vali teemadele uued sildid:" @@ -1253,8 +1242,8 @@ et: search: "Rohkem otsingutulemusi pole." topic: filter_to: - one: 1 postitus teemas - other: '{{count}} postitust teemas' + one: "1 postitus teemas" + other: "{{count}} postitust teemas" create: 'Uus teema' create_long: 'Loo uus teema' private_message: 'Alusta sõnumit' @@ -1268,10 +1257,10 @@ et: new: 'uus teema' unread: 'lugemata' new_topics: - one: 1 uus teema + one: '1 uus teema' other: '{{count}} uut teemat' unread_topics: - one: 1 lugemata teema + one: '1 lugemata teema' other: '{{count}} lugemata teemat' title: 'Teema' invalid_access: @@ -1285,17 +1274,17 @@ et: title: "Teemat ei leitud" description: "Vabanda, meil ei õnnestunud seda teemat leida. Võimalik, et moderaator eemaldas selle?" total_unread_posts: - one: Sul on selles teemas 1 lugemata postitus - other: Sul on selles teemas {{count}} lugemata postitust + one: "Sul on selles teemas 1 lugemata postitus" + other: "Sul on selles teemas {{count}} lugemata postitust" unread_posts: - one: Sul on selles teemas 1 lugemata vana postitus - other: Sul on selles teemas {{count}} lugemata vana postitust + one: "Sul on selles teemas 1 lugemata vana postitus" + other: "Sul on selles teemas {{count}} lugemata vana postitust" new_posts: - one: selles teemas on 1 uus postitus Sinu viimasest külastusest - other: selles teemas on {{count}} uut postitust Sinu viimasest külastusest + one: "selles teemas on 1 uus postitus Sinu viimasest külastusest" + other: "selles teemas on {{count}} uut postitust Sinu viimasest külastusest" likes: - one: selles teemas on 1 meeldimine - other: selles teemas on {{count}} meeldimist + one: "selles teemas on 1 meeldimine" + other: "selles teemas on {{count}} meeldimist" back_to_list: "Tagasi Teemade Loendisse" options: "Teema Suvandid" show_links: "näita viiteid selles teemas" @@ -1336,8 +1325,8 @@ et: title: "Tuleta mulle meelde" auto_close_title: 'Automaatse sulgumise sätted' auto_close_immediate: - one: Viimane postitus selles teemas on juba 1 tund aega vana, seega sulgub see teema nüüd. - other: Viimane postitus selles teemas on juba %{hours} tundi vana, seega sulgub see teema nüüd. + one: "Viimane postitus selles teemas on juba 1 tund aega vana, seega sulgub see teema nüüd." + other: "Viimane postitus selles teemas on juba %{hours} tundi vana, seega sulgub see teema nüüd." timeline: back: "Tagasi" back_description: "Mine tagasi oma viimase lugemata postituse juurde" @@ -1439,8 +1428,8 @@ et: pin_validation: "Selle teema esiletõstmiseks on kuupäev nõutav." not_pinned: "Liigis {{categoryLink}} ei ole ühtegi esiletõstetud teemat." already_pinned: - one: 'Liigis {{categoryLink}} hetkel kinnitatud teemad: 1' - other: 'Liigis {{categoryLink}} hetkel esiletõstetud teemad: {{count}}' + one: "Liigis {{categoryLink}} hetkel kinnitatud teemad: 1" + other: "Liigis {{categoryLink}} hetkel esiletõstetud teemad: {{count}}" pin_globally: "Lisa see teema kõikide teemaloetelude tippu kuni" confirm_pin_globally: "Sul on juba {{count}} igal pool esiletõstetud teemat. Liiga palju esiletõstetud teemasid võib olla uutele või anonüümsetele kasutajatele koormav. Kas soovid kindlasti selles foorumis veel ühe teema igal pool esile tõsta?" unpin_globally: "Eemalda see teema kõikide teemaloetelude tipust." @@ -1448,8 +1437,8 @@ et: global_pin_note: "Kasutajad saavad teema esiletõstmise enda jaoks individuaalselt eemaldada." not_pinned_globally: "Ühtegi igal pool esiletõstetud teemat pole." already_pinned_globally: - one: 'Hetkel globaalselt kinnitatud teemad: 1' - other: 'Igal pool esiletõstetud teemad hetkel: {{count}}' + one: "Hetkel globaalselt kinnitatud teemad: 1" + other: "Igal pool esiletõstetud teemad hetkel: {{count}}" make_banner: "Tee sellest teemast bänner mis on nähtav iga lehe päises." remove_banner: "Eemalda bänner kõikide lehtede päistest." banner_note: "Kasutajad saavad bänneri peita sulgemise teel. Korraga võib bänneriks olla ainult üks teema." @@ -1485,8 +1474,8 @@ et: login_reply: 'Vastamiseks logi sisse' filters: n_posts: - one: 1 postitus - other: '{{count}} postitust' + one: "1 postitus" + other: "{{count}} postitust" cancel: "Eemalda filter" split_topic: title: "Liiguta uue teema alla" @@ -1494,15 +1483,15 @@ et: topic_name: "Uue teema nimi" error: "Postituste uude teemasse liigutamisel tekkis viga." instructions: - one: Oled loomas uut teemat ja lisamas sinna just valitud postitust. - other: Oled loomas uut teemat ja lisamas sinna valitud {{count}} postitust. + one: "Oled loomas uut teemat ja lisamas sinna just valitud postitust." + other: "Oled loomas uut teemat ja lisamas sinna valitud {{count}} postitust." merge_topic: title: "Liiguta olemasolevasse teemasse" action: "liiguta olemasolevasse teemasse" error: "Postituste sellesse teemasse liigutamisel tekkis viga." instructions: - one: Vali teema, kuhu soovid selle postituse liigutada. - other: Vali teema, kuhu soovid need {{count}} postitust liigutada. + one: "Vali teema, kuhu soovid selle postituse liigutada." + other: "Vali teema, kuhu soovid need {{count}} postitust liigutada." merge_posts: title: "Ühenda valitud postitused" action: "ühenda valitud postitused" @@ -1514,8 +1503,8 @@ et: label: "Postituste uus omanik" placeholder: "uue omaniku kasutajanimi" instructions: - one: Palun vali {{old_user}} postitusele uus omanik. - other: Palun vali {{old_user}} {{count}} postitusele uus omanik. + one: "Palun vali {{old_user}} postitusele uus omanik." + other: "Palun vali {{old_user}} {{count}} postitusele uus omanik." change_timestamp: action: "muuda ajatemplit" invalid_timestamp: "Ajatempel ei saa olla tulevikus." @@ -1534,7 +1523,7 @@ et: deselect_all: eemalda valik kõigilt description: one: Oled valinud 1 postituse. - other: Oled valinud {{count}} postitust. + other: "Oled valinud {{count}} postitust." post: quote_reply: "Tsitaat" edit_reason: "Põhjus:" @@ -1548,26 +1537,26 @@ et: show_full: "Näita kogu postitust" show_hidden: 'Vaata peidetud vastust' deleted_by_author: - one: (autori poolt tagasivõetud postitus kustutatakse automaatselt %{count} tunni pärast, kui ei ole tähistatud) - other: (autori poolt tagasivõetud postitus kustutatakse automaatselt %{count} tunni pärast, kui ei ole tähistatud) + one: "(autori poolt tagasivõetud postitus kustutatakse automaatselt %{count} tunni pärast, kui ei ole tähistatud)" + other: "(autori poolt tagasivõetud postitus kustutatakse automaatselt %{count} tunni pärast, kui ei ole tähistatud)" expand_collapse: "laienda/ahenda" gap: - one: vaata 1 peidetud vastust - other: vaata {{count}} peidetud vastust + one: "vaata 1 peidetud vastust" + other: "vaata {{count}} peidetud vastust" unread: "Postitus on lugemata" has_replies: - one: '{{count}} vastus' - other: '{{count}} vastust' + one: "{{count}} vastus" + other: "{{count}} vastust" has_likes: - one: '{{count}} meeldimine' - other: '{{count}} meeldimist' + one: "{{count}} meeldimine" + other: "{{count}} meeldimist" has_likes_title: - one: Ühele meeldis see postitus - other: '{{count}}-le meeldis see postitus' + one: "Ühele meeldis see postitus" + other: "{{count}}-le meeldis see postitus" has_likes_title_only_you: "Sulle see postitus meeldis" has_likes_title_you: - one: Sulle ja veel ühele inimesele see postitus meeldis - other: Sulle ja veel {{count}} inimesele see postitus meeldis + one: "Sulle ja veel ühele inimesele see postitus meeldis" + other: "Sulle ja veel {{count}} inimesele see postitus meeldis" errors: create: "Vabandame, postituse loomisel tekkis viga. Palun proovi uuesti." edit: "Vabandame, postituse redigeerimisel tekkis viga. Palun proovi uuesti." @@ -1622,7 +1611,6 @@ et: inappropriate: "Tühista tähise andmine" bookmark: "Tühista järjehoidja lisamine" like: "Tühista meeldimise andmine" - vote: "Tühista hääle andmine" people: off_topic: "tähistasin selle kui teemavälise" spam: "tähistasin selle kui spämmi" @@ -1631,7 +1619,6 @@ et: notify_user: "saatsin sõnumi" bookmark: "lisasin sellele järjehoidja" like: "meeldis see" - vote: "hääletasin selle poolt" by_you: off_topic: "Tähistasid selle kui teemavälise" spam: "Tähistasid selle kui spämmi" @@ -1640,57 +1627,50 @@ et: notify_user: "Saatsid sellele kasutajale sõnumi" bookmark: "Lisasid sellele postitusele järjehoidja" like: "Märkisid selle kui meeldiva" - vote: "Hääletasid selle postituse poolt" by_you_and_others: off_topic: - one: Sina ja 1 teine kasutaja tähistasite selle kui teemavälise - other: Sina ja {{count}} teist kasutajat tähistasite selle kui teemavälise + one: "Sina ja 1 teine kasutaja tähistasite selle kui teemavälise" + other: "Sina ja {{count}} teist kasutajat tähistasite selle kui teemavälise" spam: - one: Sina ja 1 teine kasutaja tähistasite selle kui spämmi - other: Sina ja {{count}} teist kasutajat tähistasite selle kui spämmi + one: "Sina ja 1 teine kasutaja tähistasite selle kui spämmi" + other: "Sina ja {{count}} teist kasutajat tähistasite selle kui spämmi" inappropriate: - one: Sina ja 1 teine kasutaja tähistasite selle kui sobimatu - other: Sina ja {{count}} teist kasutajat tähistasite selle kui sobimatu + one: "Sina ja 1 teine kasutaja tähistasite selle kui sobimatu" + other: "Sina ja {{count}} teist kasutajat tähistasite selle kui sobimatu" notify_moderators: - one: Sina ja 1 teine kasutaja tähistasite selle modereerimiseks - other: Sina ja {{count}} teist kasutajat tähistasite selle modereerimiseks + one: "Sina ja 1 teine kasutaja tähistasite selle modereerimiseks" + other: "Sina ja {{count}} teist kasutajat tähistasite selle modereerimiseks" notify_user: - one: Sina ja 1 teine kasutaja saatsite sellele kasutajale sõnumi - other: Sina ja {{count}} teist kasutajat saatsite sellele kasutajale sõnumi + one: "Sina ja 1 teine kasutaja saatsite sellele kasutajale sõnumi" + other: "Sina ja {{count}} teist kasutajat saatsite sellele kasutajale sõnumi" bookmark: - one: Sina ja 1 teine kasutaja lisasite sellele postitusele järjehoidja - other: Sina ja {{count}} teist kasutajat lisasite sellele postitusele järjehoidja + one: "Sina ja 1 teine kasutaja lisasite sellele postitusele järjehoidja" + other: "Sina ja {{count}} teist kasutajat lisasite sellele postitusele järjehoidja" like: - one: Sina ja 1 teine kasutaja märkisite selle kui meeldiva - other: Sina ja {{count}} teist kasutajat märkisite selle kui meeldiva - vote: - one: Sina ja 1 teine kasutaja hääletasite selle postituse poolt - other: Sina ja {{count}} teist kasutajat hääletasite selle postituse poolt + one: "Sina ja 1 teine kasutaja märkisite selle kui meeldiva" + other: "Sina ja {{count}} teist kasutajat märkisite selle kui meeldiva" by_others: off_topic: - one: 1 kasutaja tähistas selle kui teemavälise - other: '{{count}} kasutajat tähistasid selle kui teemavälise' + one: "1 kasutaja tähistas selle kui teemavälise" + other: "{{count}} kasutajat tähistasid selle kui teemavälise" spam: - one: 1 kasutaja tähistas selle kui spämmi - other: '{{count}} kasutajat tähistas selle kui spämmi' + one: "1 kasutaja tähistas selle kui spämmi" + other: "{{count}} kasutajat tähistas selle kui spämmi" inappropriate: - one: 1 kasutaja tähistas selle kui sobimatu - other: '{{count}} kasutajat tähistas selle kui sobimatu' + one: "1 kasutaja tähistas selle kui sobimatu" + other: "{{count}} kasutajat tähistas selle kui sobimatu" notify_moderators: - one: 1 kasutaja tähistas selle modereerimiseks - other: '{{count}} kasutajat tähistasid selle modereerimiseks' + one: "1 kasutaja tähistas selle modereerimiseks" + other: "{{count}} kasutajat tähistasid selle modereerimiseks" notify_user: - one: 1 kasutaja saatis sellele kasutajale sõnumi - other: '{{count}} kasutajat saatsid sellele kasutajale sõnumi' + one: "1 kasutaja saatis sellele kasutajale sõnumi" + other: "{{count}} kasutajat saatsid sellele kasutajale sõnumi" bookmark: - one: 1 kasutaja lisas sellele postitusele järjehoidja - other: '{{count}} kasutajat lisasid sellele postitusele järjehoidja' + one: "1 kasutaja lisas sellele postitusele järjehoidja" + other: "{{count}} kasutajat lisasid sellele postitusele järjehoidja" like: - one: ühele see meeldis - other: '{{count}}-le see meeldis' - vote: - one: 1 kasutaja hääletas selle postituse poolt - other: '{{count}} kasutajat hääletasid selle postituse poolt' + one: "ühele see meeldis" + other: "{{count}}-le see meeldis" revisions: controls: first: "Esimene redaktsioon" @@ -1723,7 +1703,6 @@ et: can: 'saab… ' none: '(foorum puudub)' all: 'Kõik foorumid' - choose: 'Vali foorum…' edit: 'muuda' edit_long: "Muuda" view: 'Vaata teemasid foorumis' @@ -1766,12 +1745,10 @@ et: email_in_disabled: "Uute teemade avamine meili teel on saidi sätetes välja lülitatud. Avamiseks" email_in_disabled_click: 'aktiveeri säte "sissetulev meil".' show_subcategory_list: "Näita selles foorumis alamfoorumite nimekirja teemadest üleval pool." - all_topics_wiki: "Tee uued teemad vaikimisi wikideks." allow_badges_label: "Luba selles foorumis autasustamist märgistega" edit_permissions: "Muuda kasutusõigusi" add_permission: "Lisa kasutusõigus" this_year: "sel aastal" - position: "positsioon" default_position: "Vaikepositsioon" position_disabled: "Foorumid kuvatakse aktiivsuse järjekorras. Foorumite järjestuse seadistamiseks loeteludes," position_disabled_click: 'aktiveeri säte "foorumite positsioonid fikseeritud".' @@ -1827,14 +1804,14 @@ et: custom_placeholder_notify_moderators: "Anna meile teada, mis Sulle täpsemalt muret teeb ja võimalusel lisa asjassepuutuvaid viiteid ning näiteid." custom_message: at_least: - one: sisesta vähemalt 1 sümbol - other: sisesta vähemalt {{count}} sümbolit + one: "sisesta vähemalt 1 sümbol" + other: "sisesta vähemalt {{count}} sümbolit" more: - one: 1 veel - other: '{{count}} veel...' + one: "1 veel" + other: "{{count}} veel..." left: - one: 1 jäänud - other: '{{count}} jäänud' + one: "1 jäänud" + other: "{{count}} jäänud" flagging_topic: title: "Täname, et aitad meie kogukonna viisakust säilitada!" action: "Tähista teema" @@ -1845,13 +1822,13 @@ et: links_title: "Populaarsed viited" links_shown: "kuva veel viiteid..." clicks: - one: 1 klikk - other: '%{count} klikki' + one: "1 klikk" + other: "%{count} klikki" post_links: about: "laienda veel selles postuses olevaid viiteid" title: - one: 1 veel - other: '%{count} veel' + one: "1 veel" + other: "%{count} veel" topic_statuses: warning: help: "See on ametlik hoiatus." @@ -1885,22 +1862,22 @@ et: original_post: "Algne postitus" views: "Vaatamisi" views_lowercase: - one: vaatamine - other: vaatamisi + one: "vaatamine" + other: "vaatamisi" replies: "Vastuseid" views_long: - one: seda teemat on vaadatud 1 kord - other: seda teemat on vaadatud {{number}} korda + one: "seda teemat on vaadatud 1 kord" + other: "seda teemat on vaadatud {{number}} korda" activity: "Aktiivsus" likes: "Meeldimisi" likes_lowercase: - one: meeldimine - other: meeldimisi + one: "meeldimine" + other: "meeldimisi" likes_long: "selles teemas on {{number}} meeldimist" users: "Kasutajad" users_lowercase: - one: kasutaja - other: kasutajad + one: "kasutaja" + other: "kasutajad" category_title: "Foorum" history: "Ajalugu" changed_by: "autor {{author}}" @@ -1913,8 +1890,8 @@ et: latest: title: "Värskeimad" title_with_count: - one: Värskeim (1) - other: Värskeimad ({{count}}) + one: "Värskeim (1)" + other: "Värskeimad ({{count}})" help: "teemad hiljutiste postitustega" hot: title: "Kuum" @@ -1932,21 +1909,21 @@ et: unread: title: "Lugemata" title_with_count: - one: Lugemata (1) - other: Lugemata ({{count}}) + one: "Lugemata (1)" + other: "Lugemata ({{count}})" help: "teemad, mida vaatled või jälgid koos lugemata postitustega" lower_title_with_count: - one: 1 lugemata - other: '{{count}} lugemata' + one: "1 lugemata" + other: "{{count}} lugemata" new: lower_title_with_count: - one: 1 uus - other: '{{count}} uut' + one: "1 uus" + other: "{{count}} uut" lower_title: "uus" title: "Uus" title_with_count: - one: Uus (1) - other: Uusi ({{count}}) + one: "Uus (1)" + other: "Uusi ({{count}})" help: "viimase paari päeva jooksul loodud teemad" posted: title: "Minu" @@ -1957,8 +1934,8 @@ et: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "värskeimad teemad foorumis {{categoryName}}" top: title: "Juhtivad" @@ -2044,20 +2021,20 @@ et: print: 'ctrl+p Prindi teema' badges: earned_n_times: - one: Teenis selle märgise 1 kord - other: Teenis selle märgise %{count} korda + one: "Teenis selle märgise 1 kord" + other: "Teenis selle märgise %{count} korda" granted_on: "Märgistatud %{date}" others_count: "Teised selle märgisega (%{count})" title: Märgised badge_count: - one: 1 märgis - other: '%{count} märgist' + one: "1 märgis" + other: "%{count} märgist" more_badges: - one: +1 veel - other: +%{count} veel + one: "+1 veel" + other: "+%{count} veel" granted: - one: 1 lubatud - other: '%{count} lubatud' + one: "1 lubatud" + other: "%{count} lubatud" select_badge_for_title: "Vali märgis, mida kasutada oma pealkirjana" none: "(pole)" badge_grouping: @@ -2333,11 +2310,11 @@ et: none: "Ühtegi seotud sündmust pole." redeliver: "Saada uuesti" incoming: - one: On tekkinud uus sündmus. - other: On tekkinud {{count}} uut sündmust. + one: "On tekkinud uus sündmus." + other: "On tekkinud {{count}} uut sündmust." completed_in: - one: Lõpetatud 1 sekundiga. - other: Lõpetatud {{count}} sekundiga. + one: "Lõpetatud 1 sekundiga." + other: "Lõpetatud {{count}} sekundiga." request: "Päring" response: "Vastus" redeliver_confirm: "Oled kindel, et soovid sama kasulikku lasti uuesti saata?" @@ -2586,7 +2563,6 @@ et: address_placeholder: "nimi@domeen.ee" type_placeholder: "ülevaade, registreerimine..." reply_key_placeholder: "vastuse võti" - skipped_reason_placeholder: "põhjus" moderation_history: actions: delete_user: "Kasutaja on kustutatud" @@ -2745,11 +2721,11 @@ et: suspect: 'Kahtlane' approved: "Heakskiidetud?" approved_selected: - one: kiida heaks kasutaja - other: kiida heaks ({{count}}) kasutajat + one: "kiida heaks kasutaja" + other: "kiida heaks ({{count}}) kasutajat" reject_selected: - one: lükka tagasi kasutaja - other: lükka tagasi ({{count}}) kasutajat + one: "lükka tagasi kasutaja" + other: "lükka tagasi ({{count}}) kasutajat" titles: active: 'Aktiivsed kasutajad' new: 'Uued kasutajad' @@ -2766,11 +2742,11 @@ et: suspended: 'Peatatud kasutajad' suspect: 'Kahtlased kasutajad' reject_successful: - one: Tagasi lükatud 1 kasutaja. - other: Edukalt tagasi lükatud %{count} kasutajat. + one: "Tagasi lükatud 1 kasutaja." + other: "Edukalt tagasi lükatud %{count} kasutajat." reject_failures: - one: Ei õnnestunud tagasi lükata 1 kasutaja. - other: Ei õnnestunud tagasi lükata %{count} kasutajat. + one: "Ei õnnestunud tagasi lükata 1 kasutaja." + other: "Ei õnnestunud tagasi lükata %{count} kasutajat." not_verified: "Ei ole kontrollitud" check_email: title: "Näita selle kasutaja meiliaadressi" @@ -2837,14 +2813,14 @@ et: delete_forbidden_because_staff: "Admine ja moderaatoreid ei saa kustutada." delete_posts_forbidden_because_staff: "Ei saa kustutada adminide ja moderaatorite kõiki postitusi." delete_forbidden: - one: Kasutajaid ei saa kustutada, kui neil on postitusi. Kustuta kõik postitused enne kasutaja kustutamist. (Postitusi vanemaid, kui %{count} päev ei saa kustutada.) - other: Kasutajaid ei saa kustutada, kui neil on postitusi. Kustuta kõik postitused enne kasutaja kustutamist. (Postitusi vanemaid, kui %{count} päeva ei saa kustutada.) + one: "Kasutajaid ei saa kustutada, kui neil on postitusi. Kustuta kõik postitused enne kasutaja kustutamist. (Postitusi vanemaid, kui %{count} päev ei saa kustutada.)" + other: "Kasutajaid ei saa kustutada, kui neil on postitusi. Kustuta kõik postitused enne kasutaja kustutamist. (Postitusi vanemaid, kui %{count} päeva ei saa kustutada.)" cant_delete_all_posts: - one: 'Ei saa kustutada kõiki postitusi. Osa postitusi on vanemad, kui %{count} päev. (delete_user_max_post_age säte.) ' - other: 'Ei saa kustutada kõiki postitusi. Osa postitusi on vanemad, kui %{count} päeva. (delete_user_max_post_age säte.) ' + one: "Ei saa kustutada kõiki postitusi. Osa postitusi on vanemad, kui %{count} päev. (delete_user_max_post_age säte.) " + other: "Ei saa kustutada kõiki postitusi. Osa postitusi on vanemad, kui %{count} päeva. (delete_user_max_post_age säte.) " cant_delete_all_too_many_posts: - one: Ei saa kustutada kõiki postitusi, sest kasutajal on rohkem, kui 1 postitus. (delete_all_posts_max) - other: Ei saa kustutada kõiki postitusi, sest kasutajal on rohkem, kui %{count} postitust. (delete_all_posts_max) + one: "Ei saa kustutada kõiki postitusi, sest kasutajal on rohkem, kui 1 postitus. (delete_all_posts_max)" + other: "Ei saa kustutada kõiki postitusi, sest kasutajal on rohkem, kui %{count} postitust. (delete_all_posts_max)" delete_confirm: "Oled Sa KINDEL, et soovid kustutada seda kasutajat? See kustutamine on lõplik!" delete_and_block: "Kustuta ja blokeeri see meiliaadress ja IP-aadress" delete_dont_block: "Kustuta vaid" @@ -2879,8 +2855,8 @@ et: tl3_requirements: title: "Usaldustaseme 3 nõuded" table_title: - one: 'viimase päeva jooksul:' - other: 'viimase %{count} päeva jooksul:' + one: "viimase päeva jooksul:" + other: "viimase %{count} päeva jooksul:" value_heading: "Väärtus" requirement_heading: "Nõue" visits: "Külastusi" @@ -3046,8 +3022,8 @@ et: text: "Märgise andmise eksemplare on puudu. See juhtub, kui märgiste päring tagastab olematuid kasutaja või postisuse ID-sid. Sellega võivad hiljem kaasneda ettearvamatud tagajärjed - palun kontrolli oma päringut." no_grant_count: "Ei ole märgiseid, mida määrata." grant_count: - one: 1 märgis, mida määrata. - other: %{count} märgist, mida määrata. + one: "1 märgis, mida määrata." + other: "%{count} märgist, mida määrata." sample: "Näidis:" grant: with: "%{username}" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 9505eb5874..45f1dbedbd 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -43,68 +43,68 @@ fa_IR: tiny: half_a_minute: "< 1 دقیقه" less_than_x_seconds: - one: < %{count} ثانیه - other: < %{count} ثانیه + one: "< %{count} ثانیه" + other: "< %{count} ثانیه" x_seconds: - one: '%{count} ثانیه' - other: '%{count} ثانیه' + one: "%{count} ثانیه" + other: "%{count} ثانیه" less_than_x_minutes: - one: < %{count} دقیقه - other: < %{count} دقیقه + one: "< %{count} دقیقه" + other: "< %{count} دقیقه" x_minutes: - one: '%{count} دقیقه' - other: '%{count} دقیقه' + one: "%{count} دقیقه" + other: "%{count} دقیقه" about_x_hours: - one: '%{count} ساعت' - other: '%{count} ساعت' + one: "%{count} ساعت" + other: "%{count} ساعت" x_days: - one: '%{count} روز' - other: '%{count} روز' + one: "%{count} روز" + other: "%{count} روز" x_months: - one: '%{count} ماه' - other: '%{count} ماه' + one: "%{count} ماه" + other: "%{count} ماه" about_x_years: - one: '%{count} سال' - other: '%{count} سال' + one: "%{count} سال" + other: "%{count} سال" over_x_years: - one: '> %{count} سال' - other: '> %{count} سال' + one: "> %{count} سال" + other: "> %{count} سال" almost_x_years: - one: '%{count} سال' - other: '%{count} سال' + one: "%{count} سال" + other: "%{count} سال" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: '%{count} دقیقه' - other: '%{count} دقیقه' + one: "%{count} دقیقه" + other: "%{count} دقیقه" x_hours: - one: '%{count} ساعت' - other: '%{count} ساعت' + one: "%{count} ساعت" + other: "%{count} ساعت" x_days: - one: '%{count} روز' - other: '%{count} روز' + one: "%{count} روز" + other: "%{count} روز" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: '%{count} دقیقه پیش' - other: '%{count} دقیقه پیش' + one: "%{count} دقیقه پیش" + other: "%{count} دقیقه پیش" x_hours: - one: '%{count} ساعت پیش' - other: '%{count} ساعت پیش' + one: "%{count} ساعت پیش" + other: "%{count} ساعت پیش" x_days: - one: '%{count} روز پیش' - other: '%{count} روز پیش' + one: "%{count} روز پیش" + other: "%{count} روز پیش" later: x_days: - one: '%{count} روز بعد' - other: '%{count} روز بعد' + one: "%{count} روز بعد" + other: "%{count} روز بعد" x_months: - one: '%{count} ماه بعد' - other: '%{count} ماه بعد' + one: "%{count} ماه بعد" + other: "%{count} ماه بعد" x_years: - one: '%{count} سال بعد' - other: '%{count} سال بعد' + one: "%{count} سال بعد" + other: "%{count} سال بعد" previous_month: 'ماه قبل' next_month: 'ماه بعد' placeholder: تاریخ @@ -187,13 +187,13 @@ fa_IR: show_help: "گزینه‌ها" links: "پیوندها" links_lowercase: - one: پیوندها - other: پیوندها + one: "پیوندها" + other: "پیوندها" faq: "پرسش‌های متداول" guidelines: "راهنماها" privacy_policy: "سیاست Ø­ÙØ¸ حریم خصوصی" privacy: "حریم خصوصی" - terms_of_service: "شرایط Ø§Ø³ØªÙØ§Ø¯Ù‡ از خدمات" + tos: "شرایط Ø§Ø³ØªÙØ§Ø¯Ù‡ از خدمات" mobile_view: "نمایش برای موبایل " desktop_view: "نمایش برای کامپیوتر" you: "شما" @@ -212,8 +212,8 @@ fa_IR: max_of_count: "حداکثر {{count}}" alternation: "یا" character_count: - one: '{{count}} نویسه' - other: '{{count}} نویسه' + one: "{{count}} نویسه" + other: "{{count}} نویسه" suggested_topics: title: "موضوعات پیشنهادی" pm_title: "پیام‌های پیشنهادی" @@ -248,14 +248,14 @@ fa_IR: remove: "پاک کردن نشانک" confirm_clear: "آیا مطمئنید Ú©Ù‡ می‌خواهید همه نشانک ها را از این موضوع پاک کنید؟" topic_count_latest: - one: '{{count}} موضوع تازه یا به‌ روز شده.' - other: '{{count}} موضوع تازه یا به‌ روز شده.' + one: "{{count}} موضوع تازه یا به‌ روز شده." + other: "{{count}} موضوع تازه یا به‌ روز شده." topic_count_unread: - one: خواندن {{count}} موضوعات خوانده نشده - other: خواندن {{count}} موضوع خوانده نشده + one: "خواندن {{count}} موضوعات خوانده نشده" + other: "خواندن {{count}} موضوع خوانده نشده" topic_count_new: - one: مشاهده {{count}} موضوعات جدید - other: مشاهده {{count}} موضوع جدید + one: "مشاهده {{count}} موضوعات جدید" + other: "مشاهده {{count}} موضوع جدید" preview: "پیش‌نمایش" cancel: "لغو" save: "ذخیره سازی تغییرات" @@ -293,16 +293,16 @@ fa_IR: cancel: "لغو کردن" view_pending: "مشاهده نوشته‌های در انتظار " has_pending_posts: - one: این موضوع دارای {{count}} نوشته‌ی در انتظار تایید است - other: این موضوع دارای {{count}} نوشته‌ی در انتظار تایید است + one: "این موضوع دارای {{count}} نوشته‌ی در انتظار تایید است" + other: "این موضوع دارای {{count}} نوشته‌ی در انتظار تایید است" confirm: "ذخیره تغییرات" delete_prompt: "آیا از حذ٠%{username} اطمینان دارید؟ این عمل باعث حذ٠شدن تمامی نوشته های او Ùˆ همینطور باعث مسدود شدن IP Ùˆ ایمیل آن‌ها نیز Ù…ÛŒ شود." approval: title: "نوشته نیاز به تایید دارد" description: "ما نوشته شما را Ø¯Ø±ÛŒØ§ÙØª کرده ایم ولی قبل از نمایش نیاز به تایید آن توسط یکی از مدیران است. Ù„Ø·ÙØ§ صبر داشته باشید." pending_posts: - one: 'شما دارای {{count}} نوشته در انتظار هستید ' - other: 'شما دارای {{count}} نوشته در انتظار هستید ' + one: "شما دارای {{count}} نوشته در انتظار هستید " + other: "شما دارای {{count}} نوشته در انتظار هستید " ok: "باشه" user_action: user_posted_topic: "{{user}} یک موضوع ایجاد کرد" @@ -336,8 +336,8 @@ fa_IR: posts_read: "خواندن" posts_read_long: "نوشته‌های خوانده شده" total_rows: - one: '%{count} کاربر' - other: '%{count} کاربر' + one: "%{count} کاربر" + other: "%{count} کاربر" group_histories: actions: change_group_setting: "تغییر تنظیمات گروه" @@ -418,8 +418,8 @@ fa_IR: is_group_user: "عضو" is_group_owner: "مالک" title: - one: گروه ها - other: گروه ها + one: "گروه ها" + other: "گروه ها" activity: "ÙØ¹Ø§Ù„یت" members: title: "اعضاء" @@ -488,8 +488,6 @@ fa_IR: reorder: title: "دوباره مرتب کردن دسته بندی‌ها" title_long: "سازماندهی مجدد Ùهرست دسته بندی‌ها" - fix_order: "اصلاح موقعیت‌ها" - fix_order_tooltip: "همه دسته بندی ها یک شماره موقعیت مخصوص ندارند, Ú©Ù‡ ممکن است باعث نتایج غیر منتظره شود." save: "ذخیره‌ی ترتیب" apply_all: "اعمال کردن" position: "موقعیت" @@ -500,11 +498,11 @@ fa_IR: toggle_ordering: "ضامن کنترل مرتب سازی" subcategories: "دسته‌‌بندی‌های ÙØ±Ø²Ù†Ø¯" topic_sentence: - one: '%{count} موضوع' - other: '%{count} موضوع' + one: "%{count} موضوع" + other: "%{count} موضوع" topic_stat_sentence: - one: '%{count} موضوع تازه در %{unit} گذشته.' - other: '%{count} موضوع تازه در %{unit} گذشته.' + one: "%{count} موضوع تازه در %{unit} گذشته." + other: "%{count} موضوع تازه در %{unit} گذشته." ip_lookup: title: جستجوی نشانی IP hostname: نام میزبان @@ -662,7 +660,6 @@ fa_IR: error: "در ÙØ±Ø¢ÛŒÙ†Ø¯ تغییر این مقدار خطایی روی داد." change_username: title: "تغییر نام‌کاربری" - confirm: "در صورت تغییر نام‌کاربری تمامی نقل‌قول‌ها Ùˆ اشارات به @نام شما از بین خواهد Ø±ÙØª. از انجام این‌کار اطمینان دارید؟" taken: "متأسÙیم، آن نام کاربری قبلا Ú¯Ø±ÙØªÙ‡ شده است." invalid: "آن نام کاربری نامعتبر است. تنها باید عددها Ùˆ حرÙ‌ها را در بر بگیرد." change_email: @@ -681,7 +678,6 @@ fa_IR: upload_title: "تصویرتان را بارگذاری کنید" upload_picture: "بارگذاری تصویر" image_is_not_a_square: "اخطار: ما تصویر شما را بریدیم; طول Ùˆ عرض برابر نبود." - cache_notice: "شما با موÙقیت تصویر Ù¾Ø±ÙˆÙØ§ÛŒÙ„ خود را تغییر دادید اما به دلیل ذخیره در Ø­Ø§ÙØ¸Ù‡ نهان مرورگر ممکن است Ú©Ù…ÛŒ زمان ببرد." change_profile_background: title: "پس‌زمینه نمایه" instructions: "تصاویر پس‌زمینه نمایه‌ها در مرکز قرار میگیرند Ùˆ به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ عرض 850 پیکسل دارند." @@ -696,8 +692,8 @@ fa_IR: authenticated: "ایمیل شما توسط {{provider}} تصدیق شد" frequency_immediately: "اگر به سرعت چیزی را Ú©Ù‡ برایتان ارسال نکردیم نخوانده باشید، Ø¨Ù„Ø§ÙØ§ØµÙ„Ù‡ برایتان ایمیل ارسال می‌کنیم." frequency: - one: ما Ùقط در صورتی برای شما ایمیل Ù…ÛŒÙØ±Ø³ØªÛŒÙ… Ú©Ù‡ در {{count}} دقیقه آخر شما را ندیده باشیم. - other: ما Ùقط در صورتی برای شما ایمیل Ù…ÛŒÙØ±Ø³ØªÛŒÙ… Ú©Ù‡ در {{count}} دقیقه آخر شما را ندیده باشیم. + one: "ما Ùقط در صورتی برای شما ایمیل Ù…ÛŒÙØ±Ø³ØªÛŒÙ… Ú©Ù‡ در {{count}} دقیقه آخر شما را ندیده باشیم." + other: "ما Ùقط در صورتی برای شما ایمیل Ù…ÛŒÙØ±Ø³ØªÛŒÙ… Ú©Ù‡ در {{count}} دقیقه آخر شما را ندیده باشیم." name: title: "نام" instructions: "نام Ùˆ نام‌خانوادگی شما (اختیاری)" @@ -782,8 +778,8 @@ fa_IR: user: "کاربر دعوت شده" sent: "ارسال شده" truncated: - one: نمایش {{count}} دعوت اول. - other: نمایش {{count}} دعوت اول. + one: "نمایش {{count}} دعوت اول." + other: "نمایش {{count}} دعوت اول." redeemed: "دعوت‌نامه‌های Ø§Ø³ØªÙØ§Ø¯Ù‡ شده" redeemed_tab: "Ø§Ø³ØªÙØ§Ø¯Ù‡ شده" redeemed_tab_with_count: "({{count}}) Ø§Ø³ØªÙØ§Ø¯Ù‡ شده" @@ -829,20 +825,20 @@ fa_IR: stats: "آمار" time_read: " زمان خواندن" topic_count: - one: موضوعات ساخته شدند - other: موضوعات ساخته شدند + one: "موضوعات ساخته شدند" + other: "موضوعات ساخته شدند" post_count: - one: نوشته‌ها ساخته شدند - other: نوشته‌ها ساخته شدند + one: "نوشته‌ها ساخته شدند" + other: "نوشته‌ها ساخته شدند" days_visited: - one: روز‌هایی Ú©Ù‡ بازدید شده - other: روز‌هایی Ú©Ù‡ بازدید شده + one: "روز‌هایی Ú©Ù‡ بازدید شده" + other: "روز‌هایی Ú©Ù‡ بازدید شده" posts_read: - one: نوشته‌های خوانده شده - other: نوشته‌های خوانده شده + one: "نوشته‌های خوانده شده" + other: "نوشته‌های خوانده شده" bookmark_count: - one: نشانک‌ها - other: نشانک‌ها + one: "نشانک‌ها" + other: "نشانک‌ها" top_replies: "بالا‌ترین پاسخ‌ها" no_replies: "بدون پاسخ" more_replies: "پاسخ‌های بیشتر" @@ -858,7 +854,6 @@ fa_IR: most_liked_users: "بیشترین پسندیده شده" most_replied_to_users: "بیشترین پاسخ به" no_likes: "بدون پسندیده شدن." - associated_accounts: "ورود‌ها" ip_address: title: "آخرین نشانی IP" registration_ip_address: @@ -910,8 +905,8 @@ fa_IR: reached: "%{relativeAge} – %{rate} به حد مجاز از %{siteSettingRate} رسیده است." exceeded: "%{relativeAge} – %{rate} از حد مجاز %{siteSettingRate} ÙØ±Ø§ØªØ± Ø±ÙØªÙ‡ است" rate: - one: '%{count} خطا/%{duration}' - other: '%{count} خطا/%{duration}' + one: "%{count} خطا/%{duration}" + other: "%{count} خطا/%{duration}" learn_more: "بیشتر بدانید..." all_time: 'مجموع' all_time_desc: 'مجموع موضوعات ایجاد شده' @@ -934,8 +929,6 @@ fa_IR: hide_session: "ÙØ±Ø¯Ø§ به من یادآوری Ú©Ù†" hide_forever: "نه ممنون" hidden_for_session: "باشه, ÙØ±Ø¯Ø§ از شما سؤال میکنم. شما همیشه میتوانید از 'ورود' نیز برای ساخت حساب کاربری Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید." - intro: "سلام! :heart_eyes: به نظر میاد شما از بحث لذت می‌برید، اما هنوز برای یک حساب کاربری ثبت نام نکرده‌اید." - value_prop: "وقتی Ú©Ù‡ یک حساب کابری ایجاد میکنید, ما به خاطر میسپاریم Ú©Ù‡ شما دقیقا در حال خواندن Ú†Ù‡ چیزی بودید, بنابراین شما همیشه به همان جایی باز خواهید گشت. همچنین شما اینجا از طریق ایمیل، هر زمان Ú©Ù‡ ارسال جدیدی ÙØ±Ø³ØªØ§Ø¯Ù‡ شود، اعلان را Ø¯Ø±ÛŒØ§ÙØª میکنید. Ùˆ شما میتوانید ارسال ها را پسند کنید تا در علاقه را به اشتراک بگذارید. :heartbeat:" summary: enabled_description: "شما خلاصه ای از این موضوع را Ù…ÛŒ بینید: بالاترین‌ نوشته‌هایی Ú©Ù‡ توسط انجمن انتخاب شده." description: "{{replyCount}} پاسخ وجود دارد." @@ -949,7 +942,6 @@ fa_IR: disable: "نشان دادن نوشته‌های حذ٠شده" private_message_info: title: "پیام" - invite: "دعوت دیگران..." remove_allowed_user: "آیا واقعا Ù…ÛŒ خواهید اسم {{name}} از پیام برداشته شود ØŸ " remove_allowed_group: "آیا از حذ٠{{name}} از این پیام اطمینان دارید؟" email: 'ایمیل' @@ -1005,9 +997,6 @@ fa_IR: preferences: "شما باید وارد شوید تا بتوانید تنظیمات کاربری خود را تغییر بدهید." forgot: "من اطلاعات حساب کاربری خود را به یاد نمی‌آورم" not_approved: "حساب کاربری شما هنوز تایید نشده. بعد از تایید با ایمیل به شما اطلاع داده خواهد شد." - google: - title: "با Ú¯ÙˆÚ¯Ù„" - message: "احراز هویت با Ú¯ÙˆÚ¯Ù„ (مطمئن شوید Ú©Ù‡ بازدارنده‌های pop up ÙØ¹Ø§Ù„ نباشند)" google_oauth2: title: "با Ú¯ÙˆÚ¯Ù„" message: "احراز هویت با Ú¯ÙˆÚ¯Ù„ (مطمئن شوید Ú©Ù‡ بازدارنده‌های pop up ÙØ¹Ø§Ù„ نباشند)" @@ -1079,8 +1068,8 @@ fa_IR: similar_topics: "موضوع شما شبیه است به..." drafts_offline: "پیش نویس Ø¢Ùلاین" group_mentioned: - one: با اشاره به {{group}}ØŒ به {{count}} Ù†ÙØ± اطلاعیه ارسال می‌شود. مطمئن هستید؟ - other: با اشاره به {{group}}ØŒ به {{count}} Ù†ÙØ± اطلاعیه ارسال می‌شود. مطمئن هستید؟ + one: "با اشاره به {{group}}ØŒ به {{count}} Ù†ÙØ± اطلاعیه ارسال می‌شود. مطمئن هستید؟" + other: "با اشاره به {{group}}ØŒ به {{count}} Ù†ÙØ± اطلاعیه ارسال می‌شود. مطمئن هستید؟" cannot_see_mention: category: "شما به {{username}} اشاره کردید ولی ایشان به دلیل نداشتن دسترسی به این دسته‌بندی، مطلع نخواهند شد. برای دسترسی باید آن‌ها را به گروهی Ú©Ù‡ به این دسته‌بندی دسترسی دارند اضاÙÙ‡ کنید." private: "شما به {{username}} اشاره کردید ولی به دلیل نداشتن دسترسی به این پیام خصوصی مطلع نخواهند شد. برای دسترسی باید آن‌ها را به این پیام خصوصی دعوت کنید." @@ -1150,11 +1139,11 @@ fa_IR: notifications: tooltip: regular: - one: '{{count}} اعلان دیده نشده' - other: '{{count}} اعلان دیده نشده' + one: "{{count}} اعلان دیده نشده" + other: "{{count}} اعلان دیده نشده" message: - one: '{{count}} خوانده نشده' - other: '{{count}} خوانده نشده' + one: "{{count}} خوانده نشده" + other: "{{count}} خوانده نشده" title: "اطلاع رسانی با اشاره به @نام، پاسخ ها به نوشته‌های شما Ùˆ موضوعات شما، پیام‌های شما Ùˆ ..." none: "قادر به بارگیری اعلان‌ها در این زمان نیستیم." empty: "اعلانی پیدا نشد." @@ -1261,8 +1250,8 @@ fa_IR: notification_level: "اعلان‌ها" choose_new_category: "یک دسته‌بندی جدید برای موضوع انتخاب نمایید" selected: - one: شما {{count}} موضوع را انتخاب کرده اید. - other: شما {{count}} موضوع را انتخاب کرده اید. + one: "شما {{count}} موضوع را انتخاب کرده اید." + other: "شما {{count}} موضوع را انتخاب کرده اید." change_tags: "جایگزینی برچسب‌ها" append_tags: "Ø§ÙØ²ÙˆØ¯Ù† برچسب‌ها" choose_new_tags: "انتخاب برچسب‌های جدید برای این موضوعات:" @@ -1295,10 +1284,11 @@ fa_IR: search: "نتیجه‌ی جستجوی دیگری وجود ندارد" topic: filter_to: - one: '{{count}} نوشته در این موضوع وجود دارد' - other: '{{count}} نوشته در این موضوع وجود دارد' + one: "{{count}} نوشته در این موضوع وجود دارد" + other: "{{count}} نوشته در این موضوع وجود دارد" create: 'موضوع جدید' create_long: 'ساخت یک موضوع جدید' + open_draft: "بازکردن پیشنویس" private_message: 'شروع یک پیام' archive_message: help: 'انتقال پیام به بایگانی شما' @@ -1327,17 +1317,17 @@ fa_IR: title: "موضوع پیدا نشد" description: "متأسÙیم، نتوانستیم آن موضوع را پیدا کنیم. شاید یکی از همکاران آن را پاک کرده؟" total_unread_posts: - one: شما {{count}} نوشته‌ی خوانده نشده در این موضوع دارید - other: شما {{count}} نوشته‌ی خوانده نشده در این موضوع دارید + one: "شما {{count}} نوشته‌ی خوانده نشده در این موضوع دارید" + other: "شما {{count}} نوشته‌ی خوانده نشده در این موضوع دارید" unread_posts: - one: شما {{count}} نوشته‌ی خوانده نشده قدیمی در این موضوع دارید - other: شما {{count}} نوشته‌ی خوانده نشده قدیمی در این موضوع دارید + one: "شما {{count}} نوشته‌ی خوانده نشده قدیمی در این موضوع دارید" + other: "شما {{count}} نوشته‌ی خوانده نشده قدیمی در این موضوع دارید" new_posts: - one: '{{count}} نوشته‌ی جدید از آخرین خواندن شما در این موضوع وجود دارد' - other: '{{count}} نوشته‌ی جدید از آخرین خواندن شما در این موضوع وجود دارد' + one: "{{count}} نوشته‌ی جدید از آخرین خواندن شما در این موضوع وجود دارد" + other: "{{count}} نوشته‌ی جدید از آخرین خواندن شما در این موضوع وجود دارد" likes: - one: '{{count}} پسند به این موضوع داده شده است' - other: '{{count}} پسند به این موضوع داده شده است' + one: "{{count}} پسند به این موضوع داده شده است" + other: "{{count}} پسند به این موضوع داده شده است" back_to_list: "بازگشت به Ùهرست موضوعات" options: "گزینه‌های موضوع" show_links: "نمایش پیوندهای درون این موضوع" @@ -1392,8 +1382,8 @@ fa_IR: auto_reminder: "درباره این موضوع به شما یادآوری خواهد شد %{timeLeft}." auto_close_title: 'تنظیمات بستن خوکار' auto_close_immediate: - one: از آخرین نوشته این موضوع %{count} ساعت گذشته، بنابراین موضوع بسته می‌شود. - other: از آخرین نوشته این موضوع %{count} ساعت گذشته، بنابراین موضوع بسته می‌شود. + one: "از آخرین نوشته این موضوع %{count} ساعت گذشته، بنابراین موضوع بسته می‌شود." + other: "از آخرین نوشته این موضوع %{count} ساعت گذشته، بنابراین موضوع بسته می‌شود." timeline: back: "بازگشت" back_description: "بازگشت به اولین نوشته‌ی خوانده نشده" @@ -1500,8 +1490,8 @@ fa_IR: pin_validation: "برای سنجاق کردن این موضوع نیاز به یک تاریخ معین است." not_pinned: "هیچ موضوعی در {{categoryLink}} سنجاق نشده." already_pinned: - one: 'موضوعاتی Ú©Ù‡ در حال حاضر در {{categoryLink}} سنجاق شده اند: {{count}}' - other: 'موضوعاتی Ú©Ù‡ در حال حاضر در {{categoryLink}} سنجاق شده اند: {{count}}' + one: "موضوعاتی Ú©Ù‡ در حال حاضر در {{categoryLink}} سنجاق شده اند: {{count}}" + other: "موضوعاتی Ú©Ù‡ در حال حاضر در {{categoryLink}} سنجاق شده اند: {{count}}" pin_globally: "نمایش این موضوع در بالای Ùهرست همه موضوعات تا وقتی Ú©Ù‡" confirm_pin_globally: "شما قبلا این موضوع {{count}} را بصورت سراسری سنجاق زده‌اید. تعداد زیاد موضوع های سنجاق شده برای کاربران جدید Ùˆ ناشناس Ù…ÛŒ تواند سخت باشد. آیا از سنجاق کردن موضوعات به‌صورت سراری اطمینان دارید؟ " unpin_globally: "حذ٠این موضوع از بالای لیست همه‌ی موضوعات." @@ -1509,8 +1499,8 @@ fa_IR: global_pin_note: "کاربران Ù…ÛŒ توانند موضوع را بصورت جداگانه برای خود از سنجاق در بیاورند" not_pinned_globally: "هیچ موضوعی به صورت سراسری سنجاق نشده." already_pinned_globally: - one: 'موضوعاتی Ú©Ù‡ در حال حاضر به صورت سراسری سنجاق شده‌اند: {{count}}' - other: 'موضوعاتی Ú©Ù‡ در حال حاضر به صورت سراسری سنجاق شده‌اند: {{count}}' + one: "موضوعاتی Ú©Ù‡ در حال حاضر به صورت سراسری سنجاق شده‌اند: {{count}}" + other: "موضوعاتی Ú©Ù‡ در حال حاضر به صورت سراسری سنجاق شده‌اند: {{count}}" make_banner: "این موضوع را در وارد بنر Ú©Ù† Ú©Ù‡ در تمام ØµÙØ­Ø§Øª در بالای ØµÙØ­Ù‡ نشان داده شود" remove_banner: "حذ٠بنری Ú©Ù‡ از بالای تمام ØµÙØ­Ø§Øª نمایش داده Ù…ÛŒ شود. " banner_note: "کاربران Ù…ÛŒ توانند Ø³Ø±â€ŒØµÙØ­Ù‡ را با بستن آنها رد کنند. Ùقط یک موضوع را Ù…ÛŒ توان در یک زمان به Ø³Ø±â€ŒØµÙØ­Ù‡ تبدیل کرد." @@ -1546,8 +1536,8 @@ fa_IR: login_reply: 'برای پاسخ دادن وارد شوید' filters: n_posts: - one: '{{count}} نوشته' - other: '{{count}} نوشته' + one: "{{count}} نوشته" + other: "{{count}} نوشته" cancel: "حذ٠Ùیلتر" split_topic: title: "انتقال به موضوع جدید" @@ -1555,15 +1545,15 @@ fa_IR: topic_name: "نام موضوع جدید" error: "یک مشکل در انتقال نوشته‌ها به موضوع جدید پیش آمد." instructions: - one: شما در حال ایجاد موضوع جدید Ùˆ Ø§ÙØ²ÙˆØ¯Ù† {{count}} نوشته انتخاب شده به آن هستید. - other: شما در حال ایجاد موضوع جدید Ùˆ Ø§ÙØ²ÙˆØ¯Ù† {{count}} نوشته انتخاب شده به آن هستید. + one: "شما در حال ایجاد موضوع جدید Ùˆ Ø§ÙØ²ÙˆØ¯Ù† {{count}} نوشته انتخاب شده به آن هستید." + other: "شما در حال ایجاد موضوع جدید Ùˆ Ø§ÙØ²ÙˆØ¯Ù† {{count}} نوشته انتخاب شده به آن هستید." merge_topic: title: "انتقال به موضوع موجود" action: "انتقال به موضوع موجود" error: "یک خطا در انتقال نوشته‌ها به آن موضوع وجود داشت." instructions: - one: Ù„Ø·ÙØ§Ù‹ موضوعی را Ú©Ù‡ قصد دارید تا {{count}} نوشته‌ را به آن انتقال دهید، انتخاب نمایید. - other: Ù„Ø·ÙØ§Ù‹ موضوعی را Ú©Ù‡ قصد دارید تا {{count}} نوشته‌ را به آن انتقال دهید، انتخاب نمایید. + one: "Ù„Ø·ÙØ§Ù‹ موضوعی را Ú©Ù‡ قصد دارید تا {{count}} نوشته‌ را به آن انتقال دهید، انتخاب نمایید." + other: "Ù„Ø·ÙØ§Ù‹ موضوعی را Ú©Ù‡ قصد دارید تا {{count}} نوشته‌ را به آن انتقال دهید، انتخاب نمایید." merge_posts: title: "ادغام نوشته‌های انتخاب شده" action: "ادغام نوشته‌های انتخاب شده" @@ -1575,8 +1565,8 @@ fa_IR: label: "مالک جدید نوشته‌ها " placeholder: "نام‌کاربری مالک جدید" instructions: - one: Ù„Ø·ÙØ§ مالک جدید را برای این {{count}} نوشته‌ی {{old_user}} انتخاب کنید. - other: Ù„Ø·ÙØ§ مالک جدید را برای این {{count}} نوشته‌ی {{old_user}} انتخاب کنید. + one: "Ù„Ø·ÙØ§ مالک جدید را برای این {{count}} نوشته‌ی {{old_user}} انتخاب کنید." + other: "Ù„Ø·ÙØ§ مالک جدید را برای این {{count}} نوشته‌ی {{old_user}} انتخاب کنید." change_timestamp: title: "تغییر زمان" action: "تغییر زمان" @@ -1592,7 +1582,7 @@ fa_IR: deselect_all: عدم انتخاب همه description: one: شما {{count}} نوشته انتخاب کرده اید - other: شما {{count}} نوشته انتخاب کرده اید + other: "شما {{count}} نوشته انتخاب کرده اید" post: quote_reply: "نقل‌قول" edit_reason: "دلیل:" @@ -1606,26 +1596,26 @@ fa_IR: show_full: "نمایش کامل نوشته" show_hidden: 'نمایش محتوای پنهان' deleted_by_author: - one: (نوشته های ارسال شده توسط نویسنده،بصورت خودکار در %{count} ساعت حذ٠می شود مگر اینکه پرچم شود) - other: (نوشته های ارسال شده توسط نویسنده،بصورت خودکار در %{count} ساعت حذ٠می شود مگر اینکه پرچم شود) + one: "(نوشته های ارسال شده توسط نویسنده،بصورت خودکار در %{count} ساعت حذ٠می شود مگر اینکه پرچم شود)" + other: "(نوشته های ارسال شده توسط نویسنده،بصورت خودکار در %{count} ساعت حذ٠می شود مگر اینکه پرچم شود)" expand_collapse: "باز کردن/بستن" gap: - one: '{{count}} پاسخ پنهان را مشاهده کنید' - other: '{{count}} پاسخ پنهان را مشاهده کنید' + one: "{{count}} پاسخ پنهان را مشاهده کنید" + other: "{{count}} پاسخ پنهان را مشاهده کنید" unread: "نوشته‌ی خوانده نشده" has_replies: - one: '{{count}} پاسخ' - other: '{{count}} پاسخ' + one: "{{count}} پاسخ" + other: "{{count}} پاسخ" has_likes: - one: '{{count}} پسند' - other: '{{count}} پسند' + one: "{{count}} پسند" + other: "{{count}} پسند" has_likes_title: - one: '{{count}} کاربر این مورد را پسندیده‌اند' - other: '{{count}} کاربر این مورد را پسندیده‌اند' + one: "{{count}} کاربر این مورد را پسندیده‌اند" + other: "{{count}} کاربر این مورد را پسندیده‌اند" has_likes_title_only_you: "شما این نوشته را پسندیده‌اید" has_likes_title_you: - one: شما Ùˆ {{count}} شخص دیگر این نوشته را پسندیده‌اید - other: شما Ùˆ {{count}} شخص دیگر این نوشته را پسندیده‌اید + one: "شما Ùˆ {{count}} شخص دیگر این نوشته را پسندیده‌اید" + other: "شما Ùˆ {{count}} شخص دیگر این نوشته را پسندیده‌اید" errors: create: "متأسÙیم، در ایجاد نوشته‌ی شما خطایی روی داد. Ù„Ø·ÙØ§Ù‹ دوباره تلاش کنید." edit: "متأسÙیم، در ویرایش نوشته‌ی شما خطایی روی داد. Ù„Ø·ÙØ§Ù‹ دوباره تلاش کنید." @@ -1677,7 +1667,6 @@ fa_IR: inappropriate: "برگرداندن پرچم" bookmark: "برداشتن نشانک" like: "برداشتن پسند" - vote: "برداشتن رای" people: off_topic: "به عنوان خارج از بحث علامت‌گذاری شده" spam: "به عنوان هرزنامه نشانه گذاری شده" @@ -1686,7 +1675,6 @@ fa_IR: notify_user: "یک پیام ارسال شد" bookmark: "نشانه گذاری Ú©Ù†" like: "پسندیده شد" - vote: "رای دهید" by_you: off_topic: "شما برای این مورد پرچم خارج از بحث زدید" spam: "شما برای این مورد پرچم هرزنامه زدید" @@ -1695,57 +1683,50 @@ fa_IR: notify_user: "شما یک پیام به این کاربر ارسال کردید" bookmark: "شما روی این نوشته نشانک گذاشتید" like: "شما این نوشته را پسند کردید" - vote: "شما به این نوشته رأی دادید" by_you_and_others: off_topic: - one: شما Ùˆ {{count}} کاربر دیگر این مورد را خارج از بحث گزارش کردید - other: شما Ùˆ {{count}} کاربر دیگر این مورد را خارج از بحث گزارش کردید + one: "شما Ùˆ {{count}} کاربر دیگر این مورد را خارج از بحث گزارش کردید" + other: "شما Ùˆ {{count}} کاربر دیگر این مورد را خارج از بحث گزارش کردید" spam: - one: شما Ùˆ {{count}} کاربر دیگر این مورد را هرزنامه گزارش کردید - other: شما Ùˆ {{count}} کاربر دیگر این مورد را هرزنامه گزارش کردید + one: "شما Ùˆ {{count}} کاربر دیگر این مورد را هرزنامه گزارش کردید" + other: "شما Ùˆ {{count}} کاربر دیگر این مورد را هرزنامه گزارش کردید" inappropriate: - one: شما Ùˆ {{count}} کاربر دیگر این مورد را نامناسب گزارش کردید - other: شما Ùˆ {{count}} کاربر دیگر این مورد را نامناسب گزارش کردید + one: "شما Ùˆ {{count}} کاربر دیگر این مورد را نامناسب گزارش کردید" + other: "شما Ùˆ {{count}} کاربر دیگر این مورد را نامناسب گزارش کردید" notify_moderators: - one: شما Ùˆ {{count}} کاربر دیگر این مورد را برای بررسی گزارش کردید - other: شما Ùˆ {{count}} کاربر دیگر این مورد را برای بررسی گزارش کردید + one: "شما Ùˆ {{count}} کاربر دیگر این مورد را برای بررسی گزارش کردید" + other: "شما Ùˆ {{count}} کاربر دیگر این مورد را برای بررسی گزارش کردید" notify_user: - one: شما Ùˆ {{count}} Ø§ÙØ±Ø§Ø¯ دیگر به این کاربر پیام ÙØ±Ø³ØªØ§Ø¯Ù‡ اید - other: شما Ùˆ {{count}} Ø§ÙØ±Ø§Ø¯ دیگر به این کاربر پیام ÙØ±Ø³ØªØ§Ø¯Ù‡ اید + one: "شما Ùˆ {{count}} Ø§ÙØ±Ø§Ø¯ دیگر به این کاربر پیام ÙØ±Ø³ØªØ§Ø¯Ù‡ اید" + other: "شما Ùˆ {{count}} Ø§ÙØ±Ø§Ø¯ دیگر به این کاربر پیام ÙØ±Ø³ØªØ§Ø¯Ù‡ اید" bookmark: - one: شما Ùˆ {{count}} کاربر دیگر روی این نوشته نشانک گذاشتید - other: شما Ùˆ {{count}} کاربر دیگر روی این نوشته نشانک گذاشتید + one: "شما Ùˆ {{count}} کاربر دیگر روی این نوشته نشانک گذاشتید" + other: "شما Ùˆ {{count}} کاربر دیگر روی این نوشته نشانک گذاشتید" like: - one: شما Ùˆ {{count}} کاربر دیگر این مورد را پسند کردید - other: شما Ùˆ {{count}} کاربر دیگر این مورد را پسند کردید - vote: - one: شما Ùˆ {{count}} کاربر دیگر به این نوشته رأی دادید - other: شما Ùˆ {{count}} کاربر دیگر به این نوشته رأی دادید + one: "شما Ùˆ {{count}} کاربر دیگر این مورد را پسند کردید" + other: "شما Ùˆ {{count}} کاربر دیگر این مورد را پسند کردید" by_others: off_topic: - one: '{{count}} کاربر ین مورد را خارج از بحث گزارش کردند' - other: '{{count}} کاربر ین مورد را خارج از بحث گزارش کردند' + one: "{{count}} کاربر ین مورد را خارج از بحث گزارش کردند" + other: "{{count}} کاربر ین مورد را خارج از بحث گزارش کردند" spam: - one: '{{count}} کاربر ین مورد را هرزنامه گزارش کردند' - other: '{{count}} کاربر ین مورد را هرزنامه گزارش کردند' + one: "{{count}} کاربر ین مورد را هرزنامه گزارش کردند" + other: "{{count}} کاربر ین مورد را هرزنامه گزارش کردند" inappropriate: - one: '{{count}} کاربر این مورد را نامناسب گزارش کردند' - other: '{{count}} کاربر این مورد را نامناسب گزارش کردند' + one: "{{count}} کاربر این مورد را نامناسب گزارش کردند" + other: "{{count}} کاربر این مورد را نامناسب گزارش کردند" notify_moderators: - one: '{{count}} کاربر این مورد را برای بررسی گزارش کردند' - other: '{{count}} کاربر این مورد را برای بررسی گزارش کردند' + one: "{{count}} کاربر این مورد را برای بررسی گزارش کردند" + other: "{{count}} کاربر این مورد را برای بررسی گزارش کردند" notify_user: - one: '{{count}} ارسال پیام به این کاربر' - other: '{{count}} ارسال پیام به این کاربر' + one: "{{count}} ارسال پیام به این کاربر" + other: "{{count}} ارسال پیام به این کاربر" bookmark: - one: '{{count}} کاربر روی این نوشته نشانک گذاشتند' - other: '{{count}} کاربر روی این نوشته نشانک گذاشتند' + one: "{{count}} کاربر روی این نوشته نشانک گذاشتند" + other: "{{count}} کاربر روی این نوشته نشانک گذاشتند" like: - one: '{{count}} کاربر این مورد را پسند کردند' - other: '{{count}} کاربر این مورد را پسند کردند' - vote: - one: '{{count}} کاربر به این نوشته رأی دادند' - other: '{{count}} کاربر به این نوشته رأی دادند' + one: "{{count}} کاربر این مورد را پسند کردند" + other: "{{count}} کاربر این مورد را پسند کردند" revisions: controls: first: "بازبینی نخست" @@ -1783,7 +1764,6 @@ fa_IR: can: 'can… ' none: '(بدون دسته‌بندی)' all: 'همه‌ی دسته‌بندی‌ها' - choose: 'انتخاب یک دسته بندی…' edit: 'ویرایش' edit_long: "ویرایش" view: 'نمایش موضوعات در دسته‌بندی' @@ -1828,7 +1808,6 @@ fa_IR: show_subcategory_list: "تعداد دسته‌بندی‌های ÙØ±Ø²Ù†Ø¯ Ú©Ù‡ بالای موضوعات این دسته‌بندی نمایش داده می‌شوند." num_featured_topics: "تعداد موضوعاتی Ú©Ù‡ در ØµÙØ­Ù‡ دسته‌بندی نمایش داده می‌شوند:" subcategory_num_featured_topics: "تعداد موضوعات برجسته Ú©Ù‡ در دسته‌بندی مادر نمایش داده می‌شوند:" - all_topics_wiki: "موضوعات جدید را به صورت Ù¾ÛŒØ´ÙØ±Ø¶ دانشنامه Ú©Ù†." subcategory_list_style: "سبک Ùهرست دسته‌بندی‌های ÙØ±Ø²Ù†Ø¯" sort_order: "Ùهرست موضوعات مرتب شود با:" default_view: "لیست موضوعات Ù¾ÛŒØ´ÙØ±Ø¶:" @@ -1837,7 +1816,6 @@ fa_IR: edit_permissions: "ویرایش دسترسی‌ها" add_permission: "Ø§ÙØ²ÙˆØ¯Ù† مجوز" this_year: "امسال" - position: "موقعیت" default_position: "موقعیت Ù¾ÛŒØ´â€ŒÙØ±Ø¶" position_disabled: "دسته‌‌بندی‌ها به‌ترتیب ÙØ¹Ø§Ù„یت نمایش داده می‌شوند. برای کنترل ترتیب دسته‌بندی‌ها" position_disabled_click: 'در تنظیمات "مکان دسته‌بندی ثابت" را ÙØ¹Ø§Ù„ کنید.' @@ -1898,14 +1876,14 @@ fa_IR: custom_placeholder_notify_moderators: "به ما اجازه دهید بدانیم شما در مورد Ú†Ù‡ چیز آن نگران هستید، Ùˆ تا جای ممکن از پیوند‌ها Ùˆ مثال‌های مرتبط Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید." custom_message: at_least: - one: حداقل {{count}} نویسه وارد کنید - other: حداقل {{count}} نویسه وارد کنید + one: "حداقل {{count}} نویسه وارد کنید" + other: "حداقل {{count}} نویسه وارد کنید" more: - one: '{{count}} نیاز است...' - other: '{{count}} نیاز است...' + one: "{{count}} نیاز است..." + other: "{{count}} نیاز است..." left: - one: '{{count}} باقی مانده' - other: '{{count}} باقی مانده' + one: "{{count}} باقی مانده" + other: "{{count}} باقی مانده" flagging_topic: title: "تشکر برای Ú©Ù…Ú© به جامعه مدنی انجمن ما!" action: "پرچم‌گذاری موضوع" @@ -1916,13 +1894,13 @@ fa_IR: links_title: "لینک‌های محبوب" links_shown: "نمایش لینک‌های بیشتر..." clicks: - one: '%{count} کلیک' - other: '%{count} کلیک' + one: "%{count} کلیک" + other: "%{count} کلیک" post_links: about: "توسعه پیوند‌های بیشتر برای این نوشته" title: - one: '%{count} بیشتر' - other: '%{count} بیشتر' + one: "%{count} بیشتر" + other: "%{count} بیشتر" topic_statuses: warning: help: "این یک هشدار رسمی است." @@ -1956,22 +1934,22 @@ fa_IR: original_post: "نوشته اصلی" views: "نمایش‌ها" views_lowercase: - one: بازدیدها - other: بازدیدها + one: "بازدیدها" + other: "بازدیدها" replies: "پاسخ‌ها" views_long: - one: این موضوع {{number}} بار دیده شده - other: این موضوع {{number}} بار دیده شده + one: "این موضوع {{number}} بار دیده شده" + other: "این موضوع {{number}} بار دیده شده" activity: "ÙØ¹Ø§Ù„یت" likes: "پسندها" likes_lowercase: - one: پسند‌ها - other: پسند‌ها + one: "پسند‌ها" + other: "پسند‌ها" likes_long: "{{number}} پسند در این موضوع وجود دارد" users: "کاربران" users_lowercase: - one: کاربران - other: کاربران + one: "کاربران" + other: "کاربران" category_title: "دسته" history: "تاریخچه" changed_by: "توسط {{author}}" @@ -1985,8 +1963,8 @@ fa_IR: latest: title: "آخرین" title_with_count: - one: آخرین ({{count}}) - other: آخرین ({{count}}) + one: "آخرین ({{count}})" + other: "آخرین ({{count}})" help: "موضوعات با نوشته‌های تازه" hot: title: "داغ" @@ -2004,21 +1982,21 @@ fa_IR: unread: title: "خوانده‌ نشده‌" title_with_count: - one: ' ({{count}}) خوانده‌ نشده‌' - other: ' ({{count}}) خوانده‌ نشده‌' + one: " ({{count}}) خوانده‌ نشده‌" + other: " ({{count}}) خوانده‌ نشده‌" help: "موضوعاتی Ú©Ù‡ در حال حاضر مشاهده Ù…ÛŒ کنید یا دنبال Ù…ÛŒ کنید با نوشته های خوانده نشده" lower_title_with_count: - one: '{{count}} خوانده نشده' - other: '{{count}} خوانده نشده' + one: "{{count}} خوانده نشده" + other: "{{count}} خوانده نشده" new: lower_title_with_count: - one: '{{count}} تازه' - other: '{{count}} تازه' + one: "{{count}} تازه" + other: "{{count}} تازه" lower_title: "جدید" title: "جدید" title_with_count: - one: ({{count}}) جدید - other: ({{count}}) جدید + one: "({{count}}) جدید" + other: "({{count}}) جدید" help: "موضوعات ایجاد شده در چند روز گذشته" posted: title: "نوشته‌های من" @@ -2029,8 +2007,8 @@ fa_IR: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} ({{count}})' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "موضوعات تازه در دستهٔ {{categoryName}}" top: title: "برترین‌ها" @@ -2114,22 +2092,22 @@ fa_IR: print: 'ctrl+p چاپ موضوع' badges: earned_n_times: - one: این مدال را %{count} بار به دست آورده - other: این مدال را %{count} بار به دست آورده + one: "این مدال را %{count} بار به دست آورده" + other: "این مدال را %{count} بار به دست آورده" granted_on: "اعطا شده %{date}" others_count: "سایرین با این مدال (%{count})" title: نشان‌ها allow_title: "می‌توانید از این نشان برای عنوان کاربری Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید" multiple_grant: "می‌توانید این را چند بار به‌دست آورید" badge_count: - one: '%{count} نشان' - other: '%{count} نشان' + one: "%{count} نشان" + other: "%{count} نشان" more_badges: - one: +%{count} بیشتر - other: +%{count} بیشتر + one: "+%{count} بیشتر" + other: "+%{count} بیشتر" granted: - one: '%{count} اعطا شده' - other: '%{count} اعطا شده' + one: "%{count} اعطا شده" + other: "%{count} اعطا شده" select_badge_for_title: انتخاب یک نشان برای Ø§Ø³ØªÙØ§Ø¯Ù‡ در عنوان خود badge_grouping: getting_started: @@ -2389,11 +2367,11 @@ fa_IR: none: "رویداد مشابهی وجود ندارد" redeliver: "تحویل مجدد" incoming: - one: '{{count}} رویداد جدید جود دارد.' - other: '{{count}} رویداد جدید جود دارد.' + one: "{{count}} رویداد جدید جود دارد." + other: "{{count}} رویداد جدید جود دارد." completed_in: - one: در {{count}} ثانیه کامل شد. - other: در {{count}} ثانیه کامل شد. + one: "در {{count}} ثانیه کامل شد." + other: "در {{count}} ثانیه کامل شد." request: "درخواست" response: "پاسخ" redeliver_confirm: "آیا از تحویل مجدد payload اطمینان دارید؟" @@ -2546,7 +2524,6 @@ fa_IR: import_file_tip: "ÙØ§ÛŒÙ„ .dcstyle.json شامل قالب است" about_theme: "درباره قالب" license: "مجوز" - component_of: "قالب جزئی است از:" update_to_latest: "به‌روز‌رسانی به آخرین نسخه" check_for_updates: "برررسی به‌روز‌رسانی‌ها" updating: "در حال به‌روز‌رسانی" @@ -2680,7 +2657,6 @@ fa_IR: address_placeholder: "name@example.com" type_placeholder: "خلاصه، ثبت نام..." reply_key_placeholder: "کلید پاسخ" - skipped_reason_placeholder: "دلیل" logs: title: "گزارش‌ها" action: "عمل" @@ -2804,11 +2780,11 @@ fa_IR: suspect: 'مشکوک' approved: "تایید شده ØŸ" approved_selected: - one: ({{count}}) کاربر تایید شده - other: ({{count}}) کاربر تایید شده + one: "({{count}}) کاربر تایید شده" + other: "({{count}}) کاربر تایید شده" reject_selected: - one: ({{count}}) کاربر رد شده - other: ({{count}}) کاربر رد شده + one: "({{count}}) کاربر رد شده" + other: "({{count}}) کاربر رد شده" titles: active: 'کاربران ÙØ¹Ø§Ù„' new: 'کاربران تازه' @@ -2824,11 +2800,11 @@ fa_IR: suspended: 'کاربران تعلیق شده' suspect: 'کاربران مشکوک' reject_successful: - one: '%{count} کاربر با موÙقیت رد شدند' - other: '%{count} کاربر با موÙقیت رد شدند' + one: "%{count} کاربر با موÙقیت رد شدند" + other: "%{count} کاربر با موÙقیت رد شدند" reject_failures: - one: رد %{count} کاربر ناموÙÙ‚ بود - other: رد %{count} کاربر ناموÙÙ‚ بود + one: "رد %{count} کاربر ناموÙÙ‚ بود" + other: "رد %{count} کاربر ناموÙÙ‚ بود" not_verified: "تایید نشده" check_email: title: "ایمیل این کاربران را قابل رویت Ú©Ù†" @@ -2888,14 +2864,14 @@ fa_IR: delete_forbidden_because_staff: "مدیران ارشد Ùˆ مدیران را نمی‌توانید پاک کنید" delete_posts_forbidden_because_staff: "نمی توان همه‌ی نوشته‌های مدیران ارشد Ùˆ مدیران را حذ٠کرد" delete_forbidden: - one: کاربرانی را Ú©Ù‡ دارای موضوع هستند نمی‌توانید پاک کنید. پیش از تلاش برای پاک کردن کاربر، ابتدا همه‌ی موضوعاتش را پاک کنید. (موضوعات Ú©Ù‡ بیش از %{count} روز پیش ÙØ±Ø³ØªØ§Ø¯Ù‡ شده باشند، نمی‌توانند پاک شوند.) - other: کاربرانی را Ú©Ù‡ دارای موضوع هستند نمی‌توانید پاک کنید. پیش از تلاش برای پاک کردن کاربر، ابتدا همه‌ی موضوعاتش را پاک کنید. (موضوعات Ú©Ù‡ بیش از %{count} روز پیش ÙØ±Ø³ØªØ§Ø¯Ù‡ شده باشند، نمی‌توانند پاک شوند.) + one: "کاربرانی را Ú©Ù‡ دارای موضوع هستند نمی‌توانید پاک کنید. پیش از تلاش برای پاک کردن کاربر، ابتدا همه‌ی موضوعاتش را پاک کنید. (موضوعات Ú©Ù‡ بیش از %{count} روز پیش ÙØ±Ø³ØªØ§Ø¯Ù‡ شده باشند، نمی‌توانند پاک شوند.)" + other: "کاربرانی را Ú©Ù‡ دارای موضوع هستند نمی‌توانید پاک کنید. پیش از تلاش برای پاک کردن کاربر، ابتدا همه‌ی موضوعاتش را پاک کنید. (موضوعات Ú©Ù‡ بیش از %{count} روز پیش ÙØ±Ø³ØªØ§Ø¯Ù‡ شده باشند، نمی‌توانند پاک شوند.)" cant_delete_all_posts: - one: نمی توان همه‌ی نوشته‌ها را حذ٠کرد. برخی نوشته ها قدیمی‌تر از %{count} هستند. (در delete_user_max_post_age setting.) - other: نمی توان همه‌ی نوشته‌ها را حذ٠کرد. برخی نوشته ها قدیمی‌تر از %{count} هستند. (در delete_user_max_post_age setting.) + one: "نمی توان همه‌ی نوشته‌ها را حذ٠کرد. برخی نوشته ها قدیمی‌تر از %{count} هستند. (در delete_user_max_post_age setting.)" + other: "نمی توان همه‌ی نوشته‌ها را حذ٠کرد. برخی نوشته ها قدیمی‌تر از %{count} هستند. (در delete_user_max_post_age setting.)" cant_delete_all_too_many_posts: - one: نمی توان همه نوشته ها را خذ٠کرد. چون تعداد کاربران از %{count} تعداد نوشته ها بیشتر است.(delete_all_posts_max) - other: نمی توان همه نوشته ها را خذ٠کرد. چون تعداد کاربران از %{count} تعداد نوشته ها بیشتر است.(delete_all_posts_max) + one: "نمی توان همه نوشته ها را خذ٠کرد. چون تعداد کاربران از %{count} تعداد نوشته ها بیشتر است.(delete_all_posts_max)" + other: "نمی توان همه نوشته ها را خذ٠کرد. چون تعداد کاربران از %{count} تعداد نوشته ها بیشتر است.(delete_all_posts_max)" delete_confirm: "آیا مطمئن هستید Ú©Ù‡ Ù…ÛŒ خواهید این کاربر را حذ٠کنید ØŸ اثر این کار دائمی است." delete_and_block: "آدرس IP Ùˆ ایمیل را حذ٠و مسدودکن." delete_dont_block: "Ùقط حذÙ" @@ -2930,8 +2906,8 @@ fa_IR: tl3_requirements: title: "شرایط لازم برای سطح اعتماد 3." table_title: - one: در %{count} روز گذشته - other: در %{count} روز گذشته + one: "در %{count} روز گذشته" + other: "در %{count} روز گذشته" value_heading: "مقدار" requirement_heading: "نیازمندی‌ها" visits: "بازدیدها" @@ -3098,8 +3074,8 @@ fa_IR: text: "نمونه اعطای Ú¯Ù… شده وجود دارد. این Ø§ØªÙØ§Ù‚ زمانی Ù…ÛŒ Ø§ÙØªØ¯ Ú©Ù‡ پرس‌و‌جو شناسه کاربر یا شناسه نوشته Ú©Ù‡ وجود ندارد را برمی گرداند. این ممکن است باعث خیلی از نتایج غیر منتظره بعد از آن شود - Ù„Ø·ÙØ§ پرسش‌و‌پاسخ دوباره بررسی کنید." no_grant_count: "هیچ نشانی برای اختصاص دادن وجود ندارد." grant_count: - one: %{count} نشان‌هایی Ú©Ù‡ قرار است اختصاص داده شود. - other: %{count} نشان‌هایی Ú©Ù‡ قرار است اختصاص داده شود. + one: "%{count} نشان‌هایی Ú©Ù‡ قرار است اختصاص داده شود." + other: "%{count} نشان‌هایی Ú©Ù‡ قرار است اختصاص داده شود." sample: "نمونه:" grant: with: "%{username}" @@ -3166,8 +3142,8 @@ fa_IR: uploading: "در حال بار گذاری..." quit: "شاید بعدا" staff_count: - one: انجمن شما %{count} کارکن، شامل خودتان، دارد. - other: انجمن شما %{count} کارکن، شامل خودتان، دارد. + one: "انجمن شما %{count} کارکن، شامل خودتان، دارد." + other: "انجمن شما %{count} کارکن، شامل خودتان، دارد." invites: add_user: "اضاÙÙ‡ کردن" none_added: "هیچ کدام از همکاران را دعوت نکردید. ادامه می‌دهید؟" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 93afc7b6cc..287961cc3b 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -43,68 +43,68 @@ fi: tiny: half_a_minute: "< 1 min" less_than_x_seconds: - one: < 1 s - other: < %{count} s + one: "< 1 s" + other: "< %{count} s" x_seconds: - one: 1 s - other: '%{count} s' + one: "1 s" + other: "%{count} s" less_than_x_minutes: - one: < 1 min - other: < %{count}min + one: "< 1 min" + other: "< %{count}min" x_minutes: - one: 1 min - other: '%{count} min' + one: "1 min" + other: "%{count} min" about_x_hours: - one: 1 t - other: '%{count} t' + one: "1 t" + other: "%{count} t" x_days: - one: 1 pv - other: '%{count} pv' + one: "1 pv" + other: "%{count} pv" x_months: - one: 1 kk - other: '%{count} kk' + one: "1 kk" + other: "%{count} kk" about_x_years: - one: 1 v - other: '%{count} v' + one: "1 v" + other: "%{count} v" over_x_years: - one: '> 1 v' - other: '> %{count} v' + one: "> 1 v" + other: "> %{count} v" almost_x_years: - one: 1 v - other: '%{count} v' + one: "1 v" + other: "%{count} v" date_month: "D. MMM" date_year: "MMM -YY" medium: x_minutes: - one: 1 minuutti - other: '%{count} minuuttia' + one: "1 minuutti" + other: "%{count} minuuttia" x_hours: - one: tunti - other: '%{count} tuntia' + one: "tunti" + other: "%{count} tuntia" x_days: - one: 1 päivä - other: '%{count} päivää' + one: "1 päivä" + other: "%{count} päivää" date_year: "MMMM YYYY" medium_with_ago: x_minutes: - one: minuutti sitten - other: '%{count} minuuttia sitten' + one: "minuutti sitten" + other: "%{count} minuuttia sitten" x_hours: - one: tunti sitten - other: '%{count} tuntia sitten' + one: "tunti sitten" + other: "%{count} tuntia sitten" x_days: - one: 1 päivä sitten - other: '%{count} päivää sitten' + one: "1 päivä sitten" + other: "%{count} päivää sitten" later: x_days: - one: 1 päivä myöhemmin - other: '%{count} päivää myöhemmin' + one: "1 päivä myöhemmin" + other: "%{count} päivää myöhemmin" x_months: - one: 1 kuukausi myöhemmin - other: '%{count} kuukautta myöhemmin' + one: "1 kuukausi myöhemmin" + other: "%{count} kuukautta myöhemmin" x_years: - one: 1 vuosi myöhemmin - other: '%{count} vuotta myöhemmin' + one: "1 vuosi myöhemmin" + other: "%{count} vuotta myöhemmin" previous_month: 'Edellinen kuukausi' next_month: 'Seuraava kuukausi' placeholder: päivämäärä @@ -125,6 +125,7 @@ fi: user_left: "%{who} poisti itsensä tästä yksityiskeskustelusta %{when}" removed_user: "poisti käyttäjän %{who} %{when}" removed_group: "poisti käyttäjän %{who} %{when}" + autobumped: "nousi automaattisesti %{when}" autoclosed: enabled: 'sulki %{when}' disabled: 'avasi %{when}' @@ -149,7 +150,7 @@ fi: topic_admin_menu: "ketjun ylläpitotoimet" wizard_required: "Tervetuloa uuteen Discourseesi! Aloitetaan ohjattu asennus ✨" emails_are_disabled: "Ylläpitäjä on estänyt kaiken lähtevän sähköpostiliikenteen. Mitään sähköposti-ilmoituksia ei lähetetä." - bootstrap_mode_enabled: "Jotta uuden palstan vauhtiin saaminen olisi helpompaa, sivusto on aloitustilassa. Kaikki uudet käyttäjät saavat luottamustason 1 ja heille lähetetään sähköpostitiivistelmät päivittäin. Tila poistetaan automaattisesti, kun %{min_users}käyttäjää on liittynyt." + bootstrap_mode_enabled: "Jotta uuden palstan vauhtiin saaminen olisi helpompaa, sivusto on aloitustilassa. Kaikki uudet käyttäjät saavat luottamustason 1 ja heille lähetetään sähköpostitiivistelmät päivittäin. Tila poistetaan automaattisesti, kun %{min_users} käyttäjää on liittynyt." bootstrap_mode_disabled: "Aloitustila poistetaan seuraavan 24 tunnin aikana." themes: default_description: "Oletus" @@ -164,6 +165,7 @@ fi: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Irlanti)" eu_west_2: "EU (Lontoo)" + eu_west_3: "EU (Pariisi)" sa_east_1: "Etelä-Amerikka (Sao Paulo)" us_east_1: "itäinen USA (Pohjois-Virginia)" us_east_2: "Itäinen USA (Ohio)" @@ -187,13 +189,13 @@ fi: show_help: "valinnat" links: "Linkit" links_lowercase: - one: linkki - other: linkit + one: "linkki" + other: "linkit" faq: "UKK" guidelines: "Ohjeet" privacy_policy: "Tietosuojaseloste" privacy: "Tietosuoja" - terms_of_service: "Käyttöehdot" + tos: "Käyttöehdot" mobile_view: "Mobiilinäkymä" desktop_view: "Työpöytänäkymä" you: "Sinä" @@ -212,8 +214,8 @@ fi: max_of_count: "korkeintaan {{count}}" alternation: "tai" character_count: - one: '{{count}} merkki' - other: '{{count}} merkkiä' + one: "{{count}} merkki" + other: "{{count}} merkkiä" suggested_topics: title: "Ketjuehdotuksia" pm_title: "Keskusteluehdotuksia" @@ -247,15 +249,21 @@ fi: last_read: "tämä on viimeisin viesti jonka olet lukenut, klikkaa lisätäksesi sen kirjanmerkkeihisi" remove: "Poista kirjanmerkki" confirm_clear: "Oletko varma, että haluat poistaa kaikki kirjanmerkit tässä ketjussa?" + drafts: + resume: "Jatka" + remove: "Poista" + new_topic: "Uusi ketjuluonnos" + new_private_message: "Uusi yksityisviestiluonnos" + topic_reply: "Vastausluonnos" topic_count_latest: - one: Katso {{count}} uusi tai päivittynyt ketju - other: Katso {{count}} uutta tai päivittynyttä ketjua + one: "Katso {{count}} uusi tai päivittynyt ketju" + other: "Katso {{count}} uutta tai päivittynyttä ketjua" topic_count_unread: - one: Näytä {{count}} lukematon ketju - other: Näytä {{count}} lukematonta ketjua + one: "Näytä {{count}} lukematon ketju" + other: "Näytä {{count}} lukematonta ketjua" topic_count_new: - one: Näytä {{count}} uusi ketju - other: Näytä {{count}} uutta ketjua + one: "Näytä {{count}} uusi ketju" + other: "Näytä {{count}} uutta ketjua" preview: "esikatselu" cancel: "peruuta" save: "Tallenna muutokset" @@ -293,16 +301,16 @@ fi: cancel: "Peruuta" view_pending: "Tarkastele odottavia viestejä" has_pending_posts: - one: 1 viesti ketjussa odottaa hyväksyntää - other: {{count}} viestiä ketjussa odottaa hyväksyntää + one: "1 viesti ketjussa odottaa hyväksyntää" + other: "{{count}} viestiä ketjussa odottaa hyväksyntää" confirm: "Tallenna muutokset" delete_prompt: "Haluatko todella poistaa käyttäjän %{username}? Kaikki hänen kirjoittamansa viestit poistetaan. Lisäksi hänen sähköposti- ja IP-osoitteillensa laitetaan esto." approval: title: "Viesti odottaa hyväksyntää" description: "Viestisi saapui perille, mutta valvojan on vielä hyväksyttävä se, jotta se näkyy sivustolla. Ole kärsivällinen." pending_posts: - one: Sinulla on 1 odottava viesti. - other: Sinulla on {{count}} odottavaa viestiä. + one: "Sinulla on 1 odottava viesti." + other: "Sinulla on {{count}} odottavaa viestiä." ok: "OK" user_action: user_posted_topic: "{{user}} kirjoitti ketjuun" @@ -336,8 +344,8 @@ fi: posts_read: "Luetut" posts_read_long: "Luettuja viestejä" total_rows: - one: 1 käyttäjä - other: '%{count} käyttäjää' + one: "1 käyttäjä" + other: "%{count} käyttäjää" group_histories: actions: change_group_setting: "Muuta ryhmän asetusta" @@ -360,6 +368,11 @@ fi: title: Profiili interaction: title: Vuorovaikutus + posting: Kirjoittaminen + notification: Ilmoitus + membership: + title: Jäsenyys + access: Pääsy logs: title: "Lokit" when: "Milloin" @@ -417,8 +430,8 @@ fi: is_group_user: "Jäsen" is_group_owner: "Isäntä" title: - one: Ryhmä - other: Ryhmät + one: "Ryhmä" + other: "Ryhmät" activity: "Toiminta" members: title: "Jäsenet" @@ -481,17 +494,16 @@ fi: "12": "Lähetetyt" "13": "Postilaatikko" "14": "Odottaa" + "15": "Luonnokset" categories: all: "kaikki alueet" - all_subcategories: "koko %{categoryName} -alue" + all_subcategories: "kaikki" no_subcategory: "vain pääalue" category: "Alue" category_list: "Näytä alueet" reorder: title: "Järjestä alueet uudelleen" title_long: "Järjestä alueiden lista uudelleen" - fix_order: "Kiinteä järjestys" - fix_order_tooltip: "Kaikilla alueilla ei ole uniikkia järjestysnumeroa, joka voi aiheuttaa odottamattomia seurauksia." save: "Tallenna järjestys" apply_all: "Aseta" position: "Paikka" @@ -502,11 +514,12 @@ fi: toggle_ordering: "vaihda järjestystä" subcategories: "Tytäralueet" topic_sentence: - one: 1 ketju - other: '%{count} ketjua' + one: "1 ketju" + other: "%{count} ketjua" topic_stat_sentence: - one: '%{count} uusi ketju viimeisen %{unit} aikana.' - other: '%{count} uutta ketjua viimeisen %{unit} aikana.' + one: "%{count} uusi ketju viimeisen %{unit} aikana." + other: "%{count} uutta ketjua viimeisen %{unit} aikana." + more: "(vielä %{count})..." ip_lookup: title: IP-osoitteen haku hostname: Isäntänimi @@ -664,9 +677,23 @@ fi: set_password: "Aseta salasana" choose_new: "Valitse uusi salasana" choose: "Valitse salasana" + second_factor_backup: + title: "Kaksivaiheisen tunnistautumisen koodit" + regenerate: "Tee uusi" + disable: "Poista käytöstä" + enable: "Ota käyttöön" + enable_long: "Ota varakoodit käyttöön" + manage: "Hallinntoi varakoodeja" + copied_to_clipboard: "Kopioitiin leikepöydälle" + copy_to_clipboard_error: "Virhe kopioimisessa leikepöydälle" + remaining_codes: "Sinulla on {{count}} varakoodia jäljellä." + codes: + title: "Varakoodit luotiin" + description: "Jokaista näistä varakoodeista voi käyttää vain kerran. Säilö ne johonkin turvalliseen paikkaan, mistä kuitenkin löydät ne." second_factor: title: "Kaksivaiheinen tunnistautuminen" disable: "Poista kaksivaiheinen tunnistautuminen käytöstä" + enable: "Ota käyttöön kaksivaiheinen tunnistautuminen tietoturvan parantamiseksi" confirm_password_description: "Jatka vahvistamalla salasanasi" label: "Koodi" enable_description: | @@ -681,7 +708,7 @@ fi: error: "Arvon muuttamisessa tapahtui virhe." change_username: title: "Vaihda käyttäjätunnus" - confirm: "Jos vaihdat käyttäjätunnustasi, kaikki aiemmat lainaukset viesteistäsi ja @nimen maininnat menevät rikki. Oletko ehdottoman varma, että haluat tehdä näin?" + confirm: "Oletko aivan varma että haluat vaihtaa käyttäjänimesi?" taken: "Pahoittelut, tuo nimi on jo käytössä." invalid: "Käyttäjätunnus ei kelpaa. Siinä saa olla ainoastaan numeroita ja kirjaimia." change_email: @@ -702,7 +729,6 @@ fi: upload_title: "Lataa oma kuva" upload_picture: "Valitse kuva" image_is_not_a_square: "Varoitus: olemme rajanneet kuvaasti; korkeus ja leveys eivät olleet samoja" - cache_notice: "Olet onnistuneesti vaihtanut profiilikuvasi, mutta saattaa kestää jonkin aikaa, kunnes se tulee näkyviin" change_profile_background: title: "Profiilin taustakuva" instructions: "Profiilin taustakuvan leveys on 850 pikseliä." @@ -711,14 +737,22 @@ fi: instructions: "Taustakuvan leveys on 590 pikseliä." email: title: "Sähköposti" + primary: "Ensisijainen sähköpostiosoite" + secondary: "Toissijaiset sähköpostiosoitteet" + no_secondary: "Ei toissijaisia sähköpostiosoitteita" instructions: "ei näytetä julkisesti missään" ok: "Lähetämme sinulle sähköpostin varmistukseksi." invalid: "Sähköpostiosoite ei kelpaa." authenticated: "{{provider}} on todentanut sähköpostiosoitteesi" frequency_immediately: "Saat sähköpostia välittömästi, jollet ole jo lukenut asiaa, jota sähköpostiviesti koskee." frequency: - one: Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen minuutin aikana. - other: Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen {{count}} minuutin aikana. + one: "Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen minuutin aikana." + other: "Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen {{count}} minuutin aikana." + associated_accounts: + title: "Liitetyt käyttäjätilit" + connect: "Yhdistä" + revoke: "Kumoa yhdistäminen" + not_connected: "(ei liitetty)" name: title: "Nimi" instructions: "koko nimesi (valinnainen)" @@ -804,8 +838,8 @@ fi: sent: "Lähetetty" none: "Ei kutsuja, joita näyttää." truncated: - one: Näytetään ensimmäinen kutsu. - other: Näytetään ensimmäiset {{count}} kutsua. + one: "Näytetään ensimmäinen kutsu." + other: "Näytetään ensimmäiset {{count}} kutsua." redeemed: "Hyväksytyt kutsut" redeemed_tab: "Hyväksytyt" redeemed_tab_with_count: "Hyväksytyt ({{count}})" @@ -852,29 +886,29 @@ fi: time_read: "lukenut palstaa" recent_time_read: "lukenut hiljattain" topic_count: - one: avattu ketju - other: aloitettua ketjua + one: "avattu ketju" + other: "aloitettua ketjua" post_count: - one: kirjoitettu viesti - other: kirjoitettua viestiä + one: "kirjoitettu viesti" + other: "kirjoitettua viestiä" likes_given: - one: annettu - other: annettu + one: "annettu" + other: "annettu" likes_received: - one: saatu - other: saatu + one: "saatu" + other: "saatu" days_visited: - one: päivänä vieraillut - other: päivänä vieraillut + one: "päivänä vieraillut" + other: "päivänä vieraillut" topics_entered: - one: ketjua lukenut - other: ketjua lukenut + one: "ketjua lukenut" + other: "ketjua lukenut" posts_read: - one: luettu viesti - other: luettua viestiä + one: "luettu viesti" + other: "luettua viestiä" bookmark_count: - one: kirjanmerkki - other: kirjanmerkkiä + one: "kirjanmerkki" + other: "kirjanmerkkiä" top_replies: "Parhaat viestit" no_replies: "Ei vastauksia toistaiseksi." more_replies: "Lisää viestejä" @@ -890,7 +924,9 @@ fi: most_liked_users: "Eniten tykkäyksiä annettu" most_replied_to_users: "Useimmin vastannut" no_likes: "Ei tykkäyksiä toistaiseksi." - associated_accounts: "Kirjautumiset" + top_categories: "Suositut alueet" + topics: "Ketjut" + replies: "Vastaukset" ip_address: title: "Viimeinen IP-osoite" registration_ip_address: @@ -943,8 +979,8 @@ fi: reached: "%{relativeAge} – %{rate} saavutti sivuston asetuksissa määritellyn rajan %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} ylittää sivuston asetuksissa määritellyn rajan %{siteSettingRate}." rate: - one: 1 virhe/%{duration} - other: '%{count} virhettä/%{duration}' + one: "1 virhe/%{duration}" + other: "%{count} virhettä/%{duration}" learn_more: "opi lisää..." all_time: 'yhteensä' all_time_desc: 'ketjuja aloitettu yhteensä' @@ -972,8 +1008,6 @@ fi: hide_session: "Muistuta huomenna" hide_forever: "ei kiitos" hidden_for_session: "OK, kysyn huomenna uudestaan. Voit aina myös käyttää 'Kirjaudu sisään' -linkkiä luodaksesi tilin." - intro: "Hei siellä! :heart_eyes: Vaikuttaa siltä, että olet pitänyt keskusteluista, mutta et ole luonut omaa tiliä." - value_prop: "Kun luot tilin, muistamme mitä olet lukenut, jotta voit aina palata keskusteluissa takaisin oikeaan kohtaan. Saat myös ilmoituksia, täällä tai sähköpostilla, kun uusia viestejä kirjoitetaan. Voit myös tykätä viesteistä. :heartbeat:" summary: enabled_description: "Tarkastelet tiivistelmää tästä ketjusta, sen mielenkiintoisimpia viestejä käyttäjien toiminnan perusteella." description: "Vastauksia on {{replyCount}} kpl." @@ -987,7 +1021,6 @@ fi: disable: "Näytä poistetut viestit" private_message_info: title: "Viesti" - invite: "Kutsu muita..." leave_message: "Haluatko varmasti poistua yksityiskeskustelusta?" remove_allowed_user: "Haluatko varmasti poistaa käyttäjän {{name}} tästä keskustelusta?" remove_allowed_group: "Haluatko varmasti poistaa käyttäjän {{name}} tästä viestiketjusta?" @@ -1031,9 +1064,14 @@ fi: password: "Salasana" second_factor_title: "Kaksivaiheinen tunnistautuminen" second_factor_description: "Syötä sovelluksen antama todennuskoodi:" + second_factor_backup: "Kirjaudu varakoodilla" + second_factor_backup_title: "Varakoodit" + second_factor_backup_description: "Syötä yksi varakoodeistasi:" + second_factor: "Kirjaudu Authenticator-sovelluksella" email_placeholder: "sähköposti tai käyttäjätunnus" caps_lock_warning: "Caps Lock on päällä" error: "Tuntematon virhe" + cookies_error: "Vaikuttaa siltä, että selaimestasi on estetty evästeiden käyttö. Kirjautuminen ei ehkä onnistu, ellet salli evästeitä." rate_limit: "Odota hetki ennen kuin yrität kirjautua uudelleen." blank_username: "Syötä sähköpostiosoitteesi tai käyttäjänimesi." blank_username_or_password: "Kirjoita sähköpostiosoite tai käyttäjänimi ja salasana." @@ -1058,25 +1096,28 @@ fi: preferences: "Sinun täytyy olla kirjautuneena sisään muokataksesi tilisi asetuksia" forgot: "En muista käyttäjätilini tietoja" not_approved: "Tiliäsi ei ole vielä hyväksytty. Saat ilmoituksen sähköpostilla, kun voit kirjautua sisään." - google: - title: "Googlella" - message: "Todennetaan Googlen kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" google_oauth2: + name: "Google" title: "Googlella" message: "Todennetaan Googlen kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" twitter: + name: "Twitter" title: "Twitterillä" message: "Todennetaan Twitterin kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" instagram: + name: "Instagram" title: "Instagramilla" message: "Todennetaan Instagramin kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" facebook: + name: "Facebook" title: "Facebookilla" message: "Todennetaan Facebookin kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" yahoo: + name: "Yaho" title: "Yahoolla" message: "Todennetaan Yahoon kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" github: + name: "GitHub" title: "GitHubilla" message: "Todennetaan Githubin kautta (varmista, että ponnahdusikkunoiden esto ei ole päällä)" invites: @@ -1117,11 +1158,11 @@ fi: filter_placeholder: Hae... create: "Luo: '{{content}}'" max_content_reached: - one: Voit valita vain {{count}} kohteen. - other: Voit valita enintään {{count}} kohdetta. + one: "Voit valita vain {{count}} kohteen." + other: "Voit valita enintään {{count}} kohdetta." min_content_not_reached: - one: Valitse ainakin {{count}} kohde. - other: Valitse ainakin {{count}} kohdetta. + one: "Valitse ainakin {{count}} kohde." + other: "Valitse ainakin {{count}} kohdetta." emoji_picker: filter_placeholder: Etsi emojia people: Ihmiset @@ -1164,8 +1205,8 @@ fi: drafts_offline: "offline luonnokset" group_mentioned_limit: "Varoitus! Mainitsit ryhmän {{group}}, mutta ylläpitäjä on määrittänyt mainintojen enimmäismääräksi {{max}} käyttäjää, minkä tämän ryhmän jäsenmäärä ylittää. Kukaan ei saa ilmoitusta. " group_mentioned: - one: Jos mainitset ryhmän {{group}}, 1 käyttäjä saa ilmoituksen – oletko varma? - other: Jos mainitset ryhmän {{group}}, {{count}} käyttäjää saa ilmoituksen – oletko varma? + one: "Jos mainitset ryhmän {{group}}, 1 käyttäjä saa ilmoituksen – oletko varma?" + other: "Jos mainitset ryhmän {{group}}, {{count}} käyttäjää saa ilmoituksen – oletko varma?" cannot_see_mention: category: "Mainitsit käyttäjän {{username}} mutta hän ei saa ilmoitusta, koska hänellä ei ole pääsyä tälle alueelle. Hänet tulee lisätä ryhmään, jolla on pääsy alueelle." private: "Mainitsit käyttäjän {{username}} mutta hän ei saa ilmoitusta, koska hän ei näe tätä yksityiskeskustelua. Hänet tulee kutsua tähän yksityiskeskusteluun." @@ -1241,6 +1282,9 @@ fi: body: "Olet lähettämässä viestiä vain itsellesi!" admin_options_title: "Tämän ketjun vain henkilökunnalle näytettävät asetukset" composer_actions: + reply: Vastaa + draft: Luonnos + edit: Muokkaa reply_to_post: label: "Vastaus käyttäjän %{postUsername} viestiin %{postNumber}" desc: Vastaa tiettyyn viestiin @@ -1264,11 +1308,11 @@ fi: notifications: tooltip: regular: - one: Uusi ilmoitus - other: '{{count}} uutta ilmoitusta' + one: "Uusi ilmoitus" + other: "{{count}} uutta ilmoitusta" message: - one: Uusi yksityisviesti - other: '{{count}} uutta yksityisviestiä' + one: "Uusi yksityisviesti" + other: "{{count}} uutta yksityisviestiä" title: "ilmoitukset @nimeen viittauksista, vastauksista omiin viesteihin ja ketjuihin, viesteistä ym." none: "Ilmoitusten lataaminen ei onnistunut." empty: "Ilmoituksia ei löydetty." @@ -1283,8 +1327,8 @@ fi: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} ja 1 muu {{description}} - other: {{username}}, {{username2}} ja {{count}} muuta {{description}} + one: "{{username}}, {{username2}} ja 1 muu {{description}}" + other: "{{username}}, {{username2}} ja {{count}} muuta {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1295,8 +1339,8 @@ fi: topic_reminder: "{{username}} {{description}}" watching_first_post: "Uusi ketju {{description}}" group_message_summary: - one: '{{count}} viesti ryhmän {{group_name}} saapuneissa' - other: '{{count}} viestiä ryhmän {{group_name}} saapuneissa' + one: "{{count}} viesti ryhmän {{group_name}} saapuneissa" + other: "{{count}} viestiä ryhmän {{group_name}} saapuneissa" popup: mentioned: '{{username}} mainitsi sinut ketjussa "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} mainitsi sinut ketjussa "{{topic}}" - {{site_title}}' @@ -1333,8 +1377,8 @@ fi: clear_all: "Tyhjennä kaikki" too_short: "Hakusana on liian lyhyt." result_count: - one: 1 tulos haulle{{term}} - other: {{count}}{{plus}} tulosta haulle{{term}} + one: "1 tulos haulle{{term}}" + other: "{{count}}{{plus}} tulosta haulle{{term}}" title: "etsi ketjuja, viestejä, käyttäjiä tai alueita" full_page_title: "etsi ketjuja tai viestejä" no_results: "Ei tuloksia." @@ -1425,8 +1469,8 @@ fi: notification_level: "Ilmoitukset" choose_new_category: "Valitse uusi alue ketjuille:" selected: - one: Olet valinnut yhden ketjun. - other: Olet valinnut {{count}} ketjua. + one: "Olet valinnut yhden ketjun." + other: "Olet valinnut {{count}} ketjua." change_tags: "Korvaa tunnisteet" append_tags: "Lisää tunnisteita" choose_new_tags: "Valitse tunnisteet näille ketjuille:" @@ -1459,8 +1503,8 @@ fi: search: "Hakutuloksia ei ole enempää." topic: filter_to: - one: 1 viesti ketjussa - other: '{{count}} viestiä ketjussa' + one: "1 viesti ketjussa" + other: "{{count}} viestiä ketjussa" create: 'Uusi ketju' create_long: 'Aloita uusi ketju' open_draft: "Avaa luonnos" @@ -1478,10 +1522,10 @@ fi: new: 'uusi ketju' unread: 'lukematta' new_topics: - one: 1 uusi ketju + one: '1 uusi ketju' other: '{{count}} uutta ketjua' unread_topics: - one: 1 ketju lukematta + one: '1 ketju lukematta' other: '{{count}} ketjua lukematta' title: 'Aihe' invalid_access: @@ -1495,17 +1539,17 @@ fi: title: "Ketjua ei löytynyt" description: "Pahoittelut, ketjua ei löytynyt. Ehkäpä valvoja on siirtänyt sen muualle?" total_unread_posts: - one: sinulla on 1 lukematon viesti tässä ketjussa - other: sinulla on {{count}} lukematonta viestiä tässä ketjussa + one: "sinulla on 1 lukematon viesti tässä ketjussa" + other: "sinulla on {{count}} lukematonta viestiä tässä ketjussa" unread_posts: - one: yksi vanha viesti on lukematta tässä ketjussa - other: '{{count}} vanhaa viestiä on lukematta tässä ketjussa' + one: "yksi vanha viesti on lukematta tässä ketjussa" + other: "{{count}} vanhaa viestiä on lukematta tässä ketjussa" new_posts: - one: tähän ketjuun on tullut yksi uusi viesti sen jälkeen, kun edellisen kerran luit sen - other: tähän ketjuun on tullut {{count}} uutta viestiä sen jälkeen, kun edellisen kerran luit sen + one: "tähän ketjuun on tullut yksi uusi viesti sen jälkeen, kun edellisen kerran luit sen" + other: "tähän ketjuun on tullut {{count}} uutta viestiä sen jälkeen, kun edellisen kerran luit sen" likes: - one: tässä ketjussa on yksi tykkäys - other: tässä ketjussa on {{count}} tykkäystä + one: "tässä ketjussa on yksi tykkäys" + other: "tässä ketjussa on {{count}} tykkäystä" back_to_list: "Takaisin ketjulistaan" options: "Ketjun asetukset" show_links: "näytä tämän ketjun linkit" @@ -1569,8 +1613,8 @@ fi: auto_reminder: "Sinua muistutetaan tästä ketjusta %{timeLeft}." auto_close_title: 'Automaattisen sulkemisen asetukset' auto_close_immediate: - one: Ketjun viimeisin viesti on jo tunnin vanha, joten ketju suljetaan heti. - other: Ketjun viimeisin viesti on jo %{hours} tuntia vanha, joten ketju suljetaan heti. + one: "Ketjun viimeisin viesti on jo tunnin vanha, joten ketju suljetaan heti." + other: "Ketjun viimeisin viesti on jo %{hours} tuntia vanha, joten ketju suljetaan heti." timeline: back: "Takaisin" back_description: "Siirry takaisin ensimmäiseen lukemattomaan viestiin" @@ -1585,6 +1629,8 @@ fi: jump_prompt_of: "%{count} viestistä" jump_prompt_long: "Mihin viestiin haluat siirtyä?" jump_bottom_with_number: "hyppää viestiin %{post_number}" + jump_prompt_to_date: "päivämäärään" + jump_prompt_or: "tai" total: yhteensä viestejä current: tämänhetkinen viesti notifications: @@ -1678,8 +1724,8 @@ fi: pin_validation: "Päivämäärä vaaditaan kiinnittämään tämä ketju" not_pinned: "Alueella {{categoryLink}} ei ole kiinnitettyjä ketjuja." already_pinned: - one: 'Kiinnitettyjä ketjuja alueella {{categoryLink}}: 1' - other: 'Alueelle {{categoryLink}} kiinnitettyjä ketjuja: {{count}}' + one: "Kiinnitettyjä ketjuja alueella {{categoryLink}}: 1" + other: "Alueelle {{categoryLink}} kiinnitettyjä ketjuja: {{count}}" pin_globally: "Kiinnitä tämä ketju kaikkien alueiden ylimmäiseksi, kunnes" confirm_pin_globally: "Olet kiinnittänyt jo {{count}} ketjua kaikille alueille. Liian monta kiinnitettyä ketjua voi olla liian suuri taakka uusille ja kirjautumattomille käyttäjille. Oletko varma, että haluat kiinnittä vielä uuden ketjun kaikille alueille?" unpin_globally: "Älä enää pidä tätä ketjua kaikkien alueiden ylimmäisenä." @@ -1687,8 +1733,8 @@ fi: global_pin_note: "Käyttäjät voivat poistaa ketjun kiinnityksen itseltään." not_pinned_globally: "Yhtään ketjua ei ole kiinnitetty koko palstalle." already_pinned_globally: - one: 'Koko palstalle kiinnitettyjä ketjuja: 1' - other: 'Koko palstalle kiinnitettyjä ketjuja: {{count}}' + one: "Koko palstalle kiinnitettyjä ketjuja: 1" + other: "Koko palstalle kiinnitettyjä ketjuja: {{count}}" make_banner: "Tee tästä ketjusta banneri, joka näytetään kaikkien sivujen ylimmäisenä." remove_banner: "Poista banneri, joka näytetään kaikkien sivujen ylimmäisenä." banner_note: "Käyttäjät voivat piilottaa bannerin sulkemalla sen. Vain yksi ketju kerrallaan voi olla banneri." @@ -1725,8 +1771,8 @@ fi: login_reply: 'Kirjaudu sisään vastataksesi' filters: n_posts: - one: 1 viesti - other: '{{count}} viestiä' + one: "1 viesti" + other: "{{count}} viestiä" cancel: "Poista suodatin" split_topic: title: "Siirrä uuteen ketjuun" @@ -1734,15 +1780,15 @@ fi: topic_name: "Uuden ketjun otsikko" error: "Viestien siirtämisessä uuteen ketjuun tapahtui virhe." instructions: - one: Olet luomassa uutta ketjua valitsemastasi viestistä. - other: Olet aloittamassa uutta ketjua valitsemistasi {{count}} viestistä. + one: "Olet luomassa uutta ketjua valitsemastasi viestistä." + other: "Olet aloittamassa uutta ketjua valitsemistasi {{count}} viestistä." merge_topic: title: "Siirrä olemassa olevaan ketjuun" action: "siirrä olemassa olevaan ketjuun" error: "Viestien siirtämisessä ketjuun tapahtui virhe." instructions: - one: Valitse ketju, johon haluat siirtää valitun viestin. - other: Valitse ketju, johon haluat siirtää valitut {{count}} viestiä. + one: "Valitse ketju, johon haluat siirtää valitun viestin." + other: "Valitse ketju, johon haluat siirtää valitut {{count}} viestiä." merge_posts: title: "Yhdistä valitut viestit" action: "yhdistä valitut viestit" @@ -1754,8 +1800,8 @@ fi: label: "Viestin uusi omistaja" placeholder: "uuden omistajan käyttäjätunnus" instructions: - one: Valitse uusi omistaja viestille käyttäjältä {{old_user}}. - other: Valitse uusi omistaja {{count}} viestille käyttäjältä {{old_user}}. + one: "Valitse uusi omistaja viestille käyttäjältä {{old_user}}." + other: "Valitse uusi omistaja {{count}} viestille käyttäjältä {{old_user}}." instructions_warn: "Huomioi, ettei viestiin liittyviä ilmoituksia siirretä viestin uudelle omistajalle näin jälkikäteen." change_timestamp: title: "Muuta aikaleimaa..." @@ -1784,7 +1830,7 @@ fi: deselect_all: poista kaikkien valinta description: one: Olet valinnut yhden viestin. - other: Olet valinnut {{count}} viestiä. + other: "Olet valinnut {{count}} viestiä." post: quote_reply: "Lainaa" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1799,28 +1845,28 @@ fi: show_full: "Näytä koko viesti" show_hidden: 'Näytä piilotettu sisältö.' deleted_by_author: - one: (kirjoittaja on perunut viestin ja se poistetaan automaattisesti tunnin kuluttua, paitsi jos se liputetaan) - other: (kirjoittaja on perunut viestin ja se poistetaan automaattisesti %{count} tunnin kuluttua, paitsi jos se liputetaan) + one: "(kirjoittaja on perunut viestin ja se poistetaan automaattisesti tunnin kuluttua, paitsi jos se liputetaan)" + other: "(kirjoittaja on perunut viestin ja se poistetaan automaattisesti %{count} tunnin kuluttua, paitsi jos se liputetaan)" collapse: "kutista" expand_collapse: "laajenna/pienennä" locked: "henkilökunnan jäsen on estänyt tämän viestin muokkaamisen" gap: - one: näytä 1 piilotettu vastaus - other: näytä {{count}} piilotettua vastausta + one: "näytä 1 piilotettu vastaus" + other: "näytä {{count}} piilotettua vastausta" unread: "Viesti on lukematta" has_replies: - one: '{{count}} vastaus' - other: '{{count}} vastausta' + one: "{{count}} vastaus" + other: "{{count}} vastausta" has_likes: - one: '{{count}} tykkäys' - other: '{{count}} tykkäystä' + one: "{{count}} tykkäys" + other: "{{count}} tykkäystä" has_likes_title: - one: 1 käyttäjä tykkäsi tästä viestistä - other: '{{count}} käyttäjää tykkäsi tästä viestistä' + one: "1 käyttäjä tykkäsi tästä viestistä" + other: "{{count}} käyttäjää tykkäsi tästä viestistä" has_likes_title_only_you: "tykkäsit tästä viestistä" has_likes_title_you: - one: Sinä ja yksi toinen tykkäsi tästä viestistä - other: Sinä ja {{count}} muuta tykkäsi tästä viestistä + one: "Sinä ja yksi toinen tykkäsi tästä viestistä" + other: "Sinä ja {{count}} muuta tykkäsi tästä viestistä" errors: create: "Pahoittelut, viestin luonti ei onnistunut. Ole hyvä ja yritä uudelleen." edit: "Pahoittelut, viestin muokkaus ei onnistunut. Ole hyvä ja yritä uudelleen." @@ -1860,11 +1906,11 @@ fi: delete_replies: confirm: "Haluatko poistaa myös tähän viestiin liittyvät vastaukset?" direct_replies: - one: Kyllä, ja yksi suora vastaus - other: Kyllä, ja {{count}} suoraa vastausta + one: "Kyllä, ja yksi suora vastaus" + other: "Kyllä, ja {{count}} suoraa vastausta" all_replies: - one: Kyllä, ja yksi vastaus - other: Kyllä, ja kaikki {{count}} vastausta + one: "Kyllä, ja yksi vastaus" + other: "Kyllä, ja kaikki {{count}} vastausta" just_the_post: "Ei, vain tämä viesti" admin: "viestin ylläpitotoimet" wiki: "Tee wiki" @@ -1879,18 +1925,19 @@ fi: lock_post_description: "estä kirjoittajaa muokkaamasta tätä viestiä" unlock_post: "Vapauta viesti" unlock_post_description: "salli kirjoittajan muokata viestiä" + delete_topic_disallowed_modal: "Et saa poistaa tätä ketjua. Jos haluat sen poistetuksi, liputa se perustelujen kera, ja valvoja päättää poistamisesta." + delete_topic_disallowed: "et saa poistaa ketjua" actions: flag: 'Liputa' defer_flags: - one: Sivuuta lippu - other: Sivuuta liput + one: "Sivuuta lippu" + other: "Sivuuta liput" undo: off_topic: "Peru lippu" spam: "Peru lippu" inappropriate: "Peru lippu" bookmark: "Peru kirjanmerkki" like: "Peru tykkäys" - vote: "Peru ääni" people: off_topic: "liputti tämän eksyvän aiheesta" spam: "liputti tämän roskapostiksi" @@ -1900,9 +1947,8 @@ fi: bookmark: "lisäsi tämän kirjanmerkkeihin" like: "tykkäsi tästä" like_capped: - one: ja {{count}} muu tykkäsi tästä - other: ja {{count}} muuta tykkäsi tästä - vote: "äänesti tätä" + one: "ja {{count}} muu tykkäsi tästä" + other: "ja {{count}} muuta tykkäsi tästä" by_you: off_topic: "Liputit tämän eksyvän aiheesta" spam: "Liputit tämän roskapostiksi" @@ -1911,65 +1957,58 @@ fi: notify_user: "Lähetit viestin tälle käyttäjälle" bookmark: "Olet lisännyt viestin kirjainmerkkeihisi" like: "Tykkäsit tästä" - vote: "Olet äänestänyt tätä viestiä" by_you_and_others: off_topic: - one: Sinä ja toinen käyttäjä liputitte tämän eksyvän aiheesta - other: Sinä ja {{count}} muuta liputitte tämän eksyvän aiheesta + one: "Sinä ja toinen käyttäjä liputitte tämän eksyvän aiheesta" + other: "Sinä ja {{count}} muuta liputitte tämän eksyvän aiheesta" spam: - one: Sinä ja toinen käyttäjä liputitte tämän roskapostiksi - other: Sinä ja {{count}} muuta liputitte tämän roskapostiksi + one: "Sinä ja toinen käyttäjä liputitte tämän roskapostiksi" + other: "Sinä ja {{count}} muuta liputitte tämän roskapostiksi" inappropriate: - one: Sinä ja toinen käyttäjä liputitte tämän sopimattomaksi - other: Sinä ja {{count}} muuta liputitte tämän sopimattomaksi + one: "Sinä ja toinen käyttäjä liputitte tämän sopimattomaksi" + other: "Sinä ja {{count}} muuta liputitte tämän sopimattomaksi" notify_moderators: - one: Sinä ja toinen käyttäjä liputitte tämän valvojille tiedoksi - other: Sinä ja {{count}} muuta liputitte tämän valvojille tiedoksi + one: "Sinä ja toinen käyttäjä liputitte tämän valvojille tiedoksi" + other: "Sinä ja {{count}} muuta liputitte tämän valvojille tiedoksi" notify_user: - one: Sinä ja toinen käyttäjä lähetitte tälle käyttäjälle yksityisviestin - other: Sinä ja {{count}} muuta lähetitte tälle käyttäjälle viestin + one: "Sinä ja toinen käyttäjä lähetitte tälle käyttäjälle yksityisviestin" + other: "Sinä ja {{count}} muuta lähetitte tälle käyttäjälle viestin" bookmark: - one: Sinä ja toinen käyttäjä lisäsitte tämän kirjanmerkkeihinne - other: Sinä ja {{count}} muuta lisäsitte tämän kirjanmerkkeihinne + one: "Sinä ja toinen käyttäjä lisäsitte tämän kirjanmerkkeihinne" + other: "Sinä ja {{count}} muuta lisäsitte tämän kirjanmerkkeihinne" like: - one: Sinä ja toinen käyttäjä tykkäsitte tästä - other: Sinä ja {{count}} muuta tykkäsitte tästä - vote: - one: Sinä ja toinen käyttäjä äänestitte tätä viestiä - other: Sinä ja {{count}} muuta äänestitte tätä viestiä + one: "Sinä ja toinen käyttäjä tykkäsitte tästä" + other: "Sinä ja {{count}} muuta tykkäsitte tästä" by_others: off_topic: - one: Yksi liputti tämän eksyvän aiheesta - other: '{{count}} käyttäjää liputtivat tämän eksyvän aiheesta' + one: "Yksi liputti tämän eksyvän aiheesta" + other: "{{count}} käyttäjää liputtivat tämän eksyvän aiheesta" spam: - one: yksi käyttäjä liputti tämän roskapostiksi - other: '{{count}} käyttäjää liputti tämän roskapostiksi' + one: "yksi käyttäjä liputti tämän roskapostiksi" + other: "{{count}} käyttäjää liputti tämän roskapostiksi" inappropriate: - one: yksi liputti tämän sopimattomaksi - other: '{{count}} käyttäjää liputti tämän sopimattomaksi' + one: "yksi liputti tämän sopimattomaksi" + other: "{{count}} käyttäjää liputti tämän sopimattomaksi" notify_moderators: - one: yksi käyttäjä liputti tämän tiedoksi valvojalle - other: '{{count}} käyttäjää liputti tämän tiedoksi valvojalle' + one: "yksi käyttäjä liputti tämän tiedoksi valvojalle" + other: "{{count}} käyttäjää liputti tämän tiedoksi valvojalle" notify_user: - one: 1 henkilö lähetti tälle käyttäjälle yksityisviestin - other: '{{count}} henkilöä on lähettänyt tälle käyttäjälle yksityisviestin' + one: "1 henkilö lähetti tälle käyttäjälle yksityisviestin" + other: "{{count}} henkilöä on lähettänyt tälle käyttäjälle yksityisviestin" bookmark: - one: yksi käyttäjä lisäsi tämän viestin kirjanmerkkeihinsä - other: '{{count}} käyttäjää lisäsi tämän veistin kirjanmerkkeihinsä' + one: "yksi käyttäjä lisäsi tämän viestin kirjanmerkkeihinsä" + other: "{{count}} käyttäjää lisäsi tämän veistin kirjanmerkkeihinsä" like: - one: yksi käyttäjä tykkäsi tästä - other: '{{count}} käyttäjää tykkäsi tästä' - vote: - one: yksi käyttäjä äänesti tätä viestiä - other: '{{count}} käyttäjää äänesti tätä viestiä' + one: "yksi käyttäjä tykkäsi tästä" + other: "{{count}} käyttäjää tykkäsi tästä" delete: confirm: - one: Oletko varma, että haluat poistaa viestin? - other: Oletko varma, että haluat poistaa {{count}} viestiä? + one: "Oletko varma, että haluat poistaa viestin?" + other: "Oletko varma, että haluat poistaa {{count}} viestiä?" merge: confirm: - one: Oletko varma, että haluat yhdistää nämä viestit? - other: Oletko varma, että haluat yhdistää nämä {{count}} viestiä? + one: "Oletko varma, että haluat yhdistää nämä viestit?" + other: "Oletko varma, että haluat yhdistää nämä {{count}} viestiä?" revisions: controls: first: "Ensimmäinen revisio" @@ -2007,7 +2046,7 @@ fi: can: 'voivat… ' none: '(ei aluetta)' all: 'Kaikki alueet' - choose: 'Valitse alue…' + choose: 'alue…' edit: 'muokkaa' edit_long: "Muokkaa" view: 'Katsele alueen ketjuja' @@ -2064,13 +2103,17 @@ fi: allow_badges_label: "Salli ansiomerkkien myöntäminen tältä alueelta" edit_permissions: "Muokkaa oikeuksia" add_permission: "Lisää oikeus" + require_topic_approval: "Edellytä valvojan hyväksyntää kaikille uusille ketjuille" + require_reply_approval: "Edellytä valvojan hyväksyntää kaikille uusille vastauksille" this_year: "tänä vuonna" - position: "sijainti" + position: "Paikka:" default_position: "Oletuspaikka" position_disabled: "Alueet näytetään aktiivisuusjärjestyksessä. Muokataksesi järjestystä," position_disabled_click: 'ota käyttöön "pysyvä aluejärjestys" asetuksista.' minimum_required_tags: 'Kuinka monta tunnistetta ketjulla täytyy vähintään olla:' parent: "Emoalue" + num_auto_bump_daily: 'Kuinka monta avointa ketjua nostetaan automaattisesti päivittäin:' + navigate_to_first_post_after_read: 'Siirry ensimmäiseen viestiin, kun kaikki ketjut on luettu' notifications: watching: title: "Tarkkaile" @@ -2123,18 +2166,18 @@ fi: off_topic: "Se eksyy aiheesta" inappropriate: "Se on sopimaton" spam: "Se on roskapostia" - custom_placeholder_notify_user: "Esitä asiasi ymmärrettäväsi, ole rakentava ja kohtelias." + custom_placeholder_notify_user: "Esitä asiasi ymmärrettävästi, ole rakentava ja kohtelias." custom_placeholder_notify_moderators: "Kerro ymmärrettävästi ja selvästi, mistä olet huolestunut ja lisää viestiin oleelliset esimerkit ja linkit, jos mahdollista." custom_message: at_least: - one: syötä vähintään 1 merkki - other: syötä vähintään {{count}} merkkiä + one: "syötä vähintään 1 merkki" + other: "syötä vähintään {{count}} merkkiä" more: - one: Vielä 1... - other: Vielä {{count}}... + one: "Vielä 1..." + other: "Vielä {{count}}..." left: - one: 1 jäljellä - other: '{{count}} jäljellä' + one: "1 jäljellä" + other: "{{count}} jäljellä" flagging_topic: title: "Kiitos avustasi yhteisön hyväksi!" action: "Liputa ketju" @@ -2145,13 +2188,13 @@ fi: links_title: "Suositut linkit" links_shown: "näytä enemmän linkkejä..." clicks: - one: 1 klikkaus - other: '%{count} klikkausta' + one: "1 klikkaus" + other: "%{count} klikkausta" post_links: about: "laajenna lisää linkkejä tähän viestiin" title: - one: 1 lisää - other: '%{count} lisää' + one: "1 lisää" + other: "%{count} lisää" topic_statuses: warning: help: "Tämä on virallinen varoitus." @@ -2185,22 +2228,22 @@ fi: original_post: "Aloitusviesti" views: "Katseluita" views_lowercase: - one: katselu - other: katselut + one: "katselu" + other: "katselut" replies: "Vastauksia" views_long: - one: ketjua on katseltu yhden kerran - other: ketjua on katseltu {{number}} kertaa + one: "ketjua on katseltu yhden kerran" + other: "ketjua on katseltu {{number}} kertaa" activity: "Toiminta" likes: "Tykkäykset" likes_lowercase: - one: tykkäys - other: tykkäykset + one: "tykkäys" + other: "tykkäykset" likes_long: "tässä ketjussa on {{number}} tykkäystä" users: "Käyttäjät" users_lowercase: - one: käyttäjä - other: käyttäjät + one: "käyttäjä" + other: "käyttäjät" category_title: "Alue" history: "Historia" changed_by: "käyttäjältä {{author}}" @@ -2214,8 +2257,8 @@ fi: latest: title: "Tuoreimmat" title_with_count: - one: Tuoreimmat (1) - other: Tuoreimmat ({{count}}) + one: "Tuoreimmat (1)" + other: "Tuoreimmat ({{count}})" help: "ketjut, joissa on viimeaikaisia viestejä" hot: title: "Kuuma" @@ -2233,21 +2276,21 @@ fi: unread: title: "Lukematta" title_with_count: - one: Lukematta (1) - other: Lukematta ({{count}}) + one: "Lukematta (1)" + other: "Lukematta ({{count}})" help: "ketjut, joita seuraat tai tarkkailet tällä hetkellä ja joissa on lukemattomia viestejä" lower_title_with_count: - one: 1 lukematta - other: '{{count}} lukematta' + one: "1 lukematta" + other: "{{count}} lukematta" new: lower_title_with_count: - one: 1 uusi - other: '{{count}} uutta' + one: "1 uusi" + other: "{{count}} uutta" lower_title: "uusi" title: "Uudet" title_with_count: - one: Uudet (1) - other: Uudet ({{count}}) + one: "Uudet (1)" + other: "Uudet ({{count}})" help: "viime päivinä aloitetut ketjut" posted: title: "Viestini" @@ -2258,8 +2301,8 @@ fi: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "Tuoreimmat alueella {{categoryName}}" top: title: "Huiput" @@ -2303,6 +2346,7 @@ fi: bookmarks: 'g, b Kirjanmerkit' profile: 'g, p Käyttäjäprofiili' messages: 'g, m Viestit' + drafts: 'g, d Luonnokset' navigation: title: 'Navigointi' jump: '# Siirry viestiin #' @@ -2347,22 +2391,22 @@ fi: print: 'ctrl+p Tulosta ketju' badges: earned_n_times: - one: Ansaitsi tämän ansiomerkin yhden kerran - other: Ansaitsi tämän ansiomerkin %{count} kertaa + one: "Ansaitsi tämän ansiomerkin yhden kerran" + other: "Ansaitsi tämän ansiomerkin %{count} kertaa" granted_on: "Myönnetty %{date}" others_count: "Muita, joilla on tämä ansiomerkki (%{count})" title: Ansiomerkit allow_title: "Voit käyttää tätä ansiomerkkiä tittelinä" multiple_grant: "Voit ansaita tämän useasti" badge_count: - one: 1 ansiomerkki - other: '%{count} ansiomerkkiä' + one: "1 ansiomerkki" + other: "%{count} ansiomerkkiä" more_badges: - one: +1 Lisää - other: +%{count} Lisää + one: "+1 Lisää" + other: "+%{count} Lisää" granted: - one: 1 myönnetty - other: '%{count} myönnettyä' + one: "1 myönnetty" + other: "%{count} myönnettyä" select_badge_for_title: Valitse tittelisi ansiomerkeistä none: "(ei mitään)" successfully_granted: "Ansiomerkin %{badge} myöntäminen käyttäjälle %{username} onnistui" @@ -2396,8 +2440,8 @@ fi: choose_for_topic: "valinnaiset tunnisteet" delete_tag: "Poista tunniste" delete_confirm: - one: Haluatko varmasti poistaa tunnisteen, mikä poistaa sen myös yhdeltä ketjulta, jolla tunniste on? - other: Haluatko varmasti poistaa tunnisteen, mikä poistaa sen myös {{count}} ketjulta, joilla tunniste on? + one: "Haluatko varmasti poistaa tunnisteen, mikä poistaa sen myös yhdeltä ketjulta, jolla tunniste on?" + other: "Haluatko varmasti poistaa tunnisteen, mikä poistaa sen myös {{count}} ketjulta, joilla tunniste on?" delete_confirm_no_topics: "Haluatko varmasti poistaa tunnisteen?" rename_tag: "Uudelleennimeä tunniste" rename_instructions: "Valitse uusi nimi tälle tunnisteelle:" @@ -2478,6 +2522,8 @@ fi: admin: title: 'Discourse ylläpitäjä' moderator: 'Valvoja' + reports: + title: "Saatavilla olevat raportit" dashboard: title: "Hallintapaneeli" last_updated: "Hallintapaneeli on päivitetty viimeksi:" @@ -2514,8 +2560,15 @@ fi: page_views_short: "Sivunkatselut" show_traffic_report: "Näytä yksityiskohtainen liikenneraportti" community_health: Yhteisön elinvoima + moderators_activity: Valvojien toiminta whats_new_in_discourse: "Mitä uutta Discoursessa?" activity_metrics: Aktiivisuusmittareita + all_reports: "Kaikki raport" + general_tab: "Yleistä" + moderation_tab: "Valvonta" + disabled: Pois käytöstä + timeout_error: Kyselyssä kestää liian kauan. Valitse lyhyempi ajanjakso. + exception_error: "Pahoittelut, kyselyä tehtäessä tapahtui virhe" reports: trend_title: "%{percent} muutos. Nyt %{current}, viime jaksossa %{prev}." today: "Tänään" @@ -2533,6 +2586,9 @@ fi: end_date: "Loppupäivämäärä" groups: "Kaikki ryhmät" disabled: "Raportti ei ole käytössä" + totals_for_sample: "Summat otokselle" + total: "Kaikki yhteensä" + no_data: "Ei näytettäviä tietoja" trending_search: more: 'Hakulokit' disabled: 'Trendaavat haut eivät ole käytössä. Kerää dataa ottamalla käyttöön asetus log search queries.' @@ -2578,11 +2634,11 @@ fi: suspend_user: "Hyllytä käyttäjä" suspend_user_title: "Hyllytä käyttäjä tämän viestin vuoksi" replies: - one: '[1 vastaus]' - other: '[%{count} vastausta]' + one: "[1 vastaus]" + other: "[%{count} vastausta]" delete_replies: - one: Poista myös viestiin liittyvä %{count} vastaus? - other: Poista myös viestiin liittyvät %{count} vastausta? + one: "Poista myös viestiin liittyvä %{count} vastaus?" + other: "Poista myös viestiin liittyvät %{count} vastausta?" dispositions: agreed: "samaa mieltä" disagreed: "eri mieltä" @@ -2633,6 +2689,7 @@ fi: manage: interaction: email: Sähköposti + incoming_email: "Muokattu saapuvan sähköpostin osoite" incoming_email_placeholder: "syötä sähköpostiosoite" visibility: Näkyvyys visibility_levels: @@ -2737,6 +2794,9 @@ fi: flag_event: name: "Lipputapahtuma" details: "Kun lippu luodaan tai sen kanssa ollaan yhtä tai eri mieltä tai se sivuutetaan." + queued_post_event: + name: "Viestinhyväksymistapahtuma" + details: "Kun uusi viesti ilmaantuu jonoon tai sellainen hyväksytään tai hylätään." delivery_status: title: "Toimituksen tila" inactive: "Ei toiminnassa" @@ -2746,11 +2806,11 @@ fi: none: "Liittyviä tapahtumia ei ole." redeliver: "Toimita uudelleen" incoming: - one: Yksi uusi tapahtuma. - other: '{{count}} uutta tapahtumaa.' + one: "Yksi uusi tapahtuma." + other: "{{count}} uutta tapahtumaa." completed_in: - one: Suoritettiin 1 sekunnissa. - other: Suoritettiin {{count}} sekunnissa. + one: "Suoritettiin 1 sekunnissa." + other: "Suoritettiin {{count}} sekunnissa." request: "Pyyntö" response: "Vastaus" redeliver_confirm: "Oletko varma, että haluat toimittaa uudelleen saman tietosisällön?" @@ -2896,6 +2956,7 @@ fi: no_uploads: "Voit ladata teemaasi liitteitä kuten fontteja ja kuvia" add_upload: "Lisää tiedosto" upload_file_tip: "Valitse ladattava tiedosto (png, woff2 jne.)" + variable_name: "SCSS-muuttujannimi:" variable_name_invalid: "Muuttujan nimi ei kelpaa. Vain aakkosnumeeriset sallittu. Täytyy alkaa kirjaimella. Täytyy olla uniikki." variable_name_error: invalid_syntax: "Muuttujan nimi ei kelpaa - Vain aakkosnumeeriset sallittu. Täytyy alkaa kirjaimella." @@ -2910,9 +2971,9 @@ fi: import_web_tip: "Tietovarasto, jossa teema on" import_file_tip: ".dcstyle.json-tiedosto, jossa teema on" is_private: "Teema in yksityisessä git-tietovarastossa" + public_key: "Anna repositorioon pääsy seuraavalle julkiselle avaimelle:" about_theme: "Tietoa teemasta" license: "Lisenssi" - component_of: "Teema on osa teemaa:" update_to_latest: "Päivitä tuoreimpaan" check_for_updates: "Hae päivityksiä" updating: "Päivitetään..." @@ -2921,8 +2982,8 @@ fi: theme_settings: "Teeman asetukset" no_settings: "Teemalla ei ole asetuksia." commits_behind: - one: Teema on yhden muutoksen perässä! - other: Teema on {{count}} muutosta perässä! + one: "Teema on yhden muutoksen perässä!" + other: "Teema on {{count}} muutosta perässä!" scss: text: "CSS" title: "Lisää mukautettua CSS:ää, hyväksymme käyvät CSS- ja SCSS-tyylit" @@ -2937,6 +2998,7 @@ fi: title: "Lisää HTML:ää, joka näytetään sivuston footerissa" embedded_scss: text: "Upotettu CSS" + title: "CSS-tyylit, jotka välitetään sulautettujen kommenttien mukana" head_tag: text: "" title: "HTML, joka sijoitetaan ennen -symbolia" @@ -3053,7 +3115,6 @@ fi: address_placeholder: "nimi@esimerkki.fi" type_placeholder: "tiivistelmä, kirjautuminen..." reply_key_placeholder: "vastausavain" - skipped_reason_placeholder: "syy" moderation_history: performed_by: "Toimija" no_results: "Ei valvontahistoriaa" @@ -3107,6 +3168,8 @@ fi: change_site_text: "muutos sivuston teksteissä" suspend_user: "hyllytä käyttäjä" unsuspend_user: "poista hyllytys" + removed_suspend_user: "hyllytä käyttäjä (poistettu)" + removed_unsuspend_user: "poista hyllytys (poistettu)" grant_badge: "myönnä ansiomerkki" revoke_badge: "peru ansiomerkki" check_email: "tarkista sähköposti" @@ -3121,6 +3184,8 @@ fi: create_category: "luo alue" silence_user: "hiljennä käyttäjä" unsilence_user: "kumoa käyttäjän hiljennys" + removed_silence_user: "hiljennä käyttäjä (poistettu)" + removed_unsilence_user: "poista hiljennys (poistettu)" grant_admin: "myönnä ylläpitäjän oikeudet" revoke_admin: "peru ylläpitäjän oikeudet" grant_moderation: "myönnä valvojan oikeudet" @@ -3145,9 +3210,11 @@ fi: disabled_second_factor: "poista kaksivaiheinen tunnistautuminen" topic_published: "ketju julkaistu" post_approved: "viesti hyväksytty" + post_rejected: "viesti hylätty" create_badge: "luo ansiomerkki" change_badge: "muuta ansiomerkkiä" delete_badge: "poista ansiomerkki" + merge_user: "yhdistä käyttäjät" screened_emails: title: "Seulottavat sähköpostiosoitteet" description: "Uuden käyttäjätunnuksen luonnin yhteydessä annettua sähköpostiosoitetta verrataan alla olevaan listaan ja tarvittaessa tunnuksen luonti joko estetään tai suoritetaan muita toimenpiteitä." @@ -3189,6 +3256,8 @@ fi: all_search_types: "Kaikki hakutyypit" header: "Otsikko" full_page: "Koko sivu" + click_through_only: "Kaikki (vain klikkaussuhde)" + header_search_results: "Otsikkohaun tulokset" logster: title: "Virhelokit" watched_words: @@ -3197,8 +3266,8 @@ fi: clear_filter: "Tyhjennä" show_words: "näytä sanat" word_count: - one: 1 sana - other: '%{count} sanaa' + one: "1 sana" + other: "%{count} sanaa" actions: block: 'Estä' censor: 'Sensuroi' @@ -3215,6 +3284,7 @@ fi: placeholder_regexp: "säännöllinen lauseke" add: 'Lisää' success: 'Onnistui' + exists: 'On jo olemassa' upload: "Lataa" upload_successful: "Lataus onnistui. Sanoja lisättiin." impersonate: @@ -3238,13 +3308,14 @@ fi: suspended: 'Hyllytetyt' silenced: 'Hiljennetty' suspect: 'Epäilty' + staged: 'Esikäyttäjät' approved: "Hyväksytty?" approved_selected: - one: hyväksy käyttäjä - other: hyväksy käyttäjiä ({{count}}) + one: "hyväksy käyttäjä" + other: "hyväksy käyttäjiä ({{count}})" reject_selected: - one: torju käyttäjä - other: torju ({{count}}) käyttäjää + one: "torju käyttäjä" + other: "torju ({{count}}) käyttäjää" titles: active: 'Viimeksi aktiiviset käyttäjät' new: 'Uudet käyttäjät' @@ -3260,12 +3331,13 @@ fi: silenced: 'Hiljennetyt käyttäjät' suspended: 'Hyllytetyt käyttäjät' suspect: 'Epäillyt käyttäjät' + staged: 'Esikäyttäjät' reject_successful: - one: Yksi käyttäjä torjuttiin. - other: ({{count}}) käyttäjää torjuttiin. + one: "Yksi käyttäjä torjuttiin." + other: "({{count}}) käyttäjää torjuttiin." reject_failures: - one: Yhden käyttäjän torjuminen epäonnistui. - other: ({{count}}) käyttäjän torjuminen epäonnistui. + one: "Yhden käyttäjän torjuminen epäonnistui." + other: "({{count}}) käyttäjän torjuminen epäonnistui." not_verified: "Todentamaton" check_email: title: "Paljasta tämän käyttäjän sähköpostiosoite" @@ -3292,6 +3364,14 @@ fi: suspended_until: "(%{until} asti)" cant_suspend: "Käyttäjää ei voi hyllyttää." delete_all_posts: "Poista kaikki viestit" + penalty_post_actions: "Mitä haluat tehdä kyseiselle viestille?" + penalty_post_delete: "Poista viesti" + penalty_post_edit: "Muokkaa viestiä" + penalty_post_none: "Älä tee mitään" + penalty_count: "Rangaistusten määrä" + clear_penalty_history: + title: "Pyyhi rangaistushistoria" + description: "käyttäjä jota on rangaistu ei voi nousta lt3:lle" delete_all_posts_confirm_MF: "Olet poistamassa {POSTS, plural, one {1 viestin} other {# viestiä}} ja {TOPICS, plural, one {1 ketjun} other {# ketjua}}. Oletko varma?" silence: "Hiljennä" unsilence: "Kumoa hiljennys" @@ -3316,6 +3396,9 @@ fi: grant_moderation: 'Myönnä valvojan oikeudet' unsuspend: 'Poista hyllytys' suspend: 'Hyllytä' + show_flags_received: "Näytä saadut liput" + flags_received_by: "%{username}saamat liput" + flags_received_none: "Käyttäjän viestejä ei ole liputettu." reputation: Maine permissions: Oikeudet activity: Toiminta @@ -3324,6 +3407,7 @@ fi: private_topics_count: Yksityisviestit posts_read_count: Luettuja viestejä post_count: Kirjoitettuja viestejä + second_factor_enabled: Kaksivaiheinen tunnistautuminen käytössä topics_entered: Katseltuja ketjuja flags_given_count: Annettuja lippuja flags_received_count: Saatuja lippuja @@ -3342,17 +3426,18 @@ fi: delete_forbidden_because_staff: "Ylläpitäjiä ja valvojia ei voi poistaa." delete_posts_forbidden_because_staff: "Ylläpitäjien ja valvojien kaikkia viestejä ei voi poistaa." delete_forbidden: - one: Käyttäjiä ei voi poistaa jos heillä on kirjoitettuja viestejä. Poista ensin viestit ennen käyttäjätilin poistamista. (Vanhempia viestejä, kuin %{count} päivä ei voi poistaa) - other: Käyttäjää ei voi poistaa jos hänellä on kirjoitettuja viestejä. Poista viestit ennen käyttäjätilin poistamista. (Yli %{count} päivää vanhoja viestejä ei voi poistaa.) + one: "Käyttäjiä ei voi poistaa jos heillä on kirjoitettuja viestejä. Poista ensin viestit ennen käyttäjätilin poistamista. (Vanhempia viestejä, kuin %{count} päivä ei voi poistaa)" + other: "Käyttäjää ei voi poistaa jos hänellä on kirjoitettuja viestejä. Poista viestit ennen käyttäjätilin poistamista. (Yli %{count} päivää vanhoja viestejä ei voi poistaa.)" cant_delete_all_posts: - one: Kaikkia viestejä ei voi poistaa. Jotkin viestit ovat enemmän kuin %{count} päivän vanhoja. (Asetus delete_user_max_post_age) - other: Kaikkia viestejä ei voi poistaa. Jotkin viestit ovat enemmän kuin %{count} päivää vanhoja. (Asetus delete_user_max_post_age) + one: "Kaikkia viestejä ei voi poistaa. Jotkin viestit ovat enemmän kuin %{count} päivän vanhoja. (Asetus delete_user_max_post_age)" + other: "Kaikkia viestejä ei voi poistaa. Jotkin viestit ovat enemmän kuin %{count} päivää vanhoja. (Asetus delete_user_max_post_age)" cant_delete_all_too_many_posts: - one: Kaikkia viestejä ei voi poistaa, koska käyttäjällä on enemmän kuin 1 viesti. (delete_all_posts_max) - other: Kaikkia viestejä ei voi poistaa, koska käyttäjällä on enemmän kuin %{count} viestiä. (delete_all_posts_max) + one: "Kaikkia viestejä ei voi poistaa, koska käyttäjällä on enemmän kuin 1 viesti. (delete_all_posts_max)" + other: "Kaikkia viestejä ei voi poistaa, koska käyttäjällä on enemmän kuin %{count} viestiä. (delete_all_posts_max)" delete_confirm: "Oletko VARMA, että haluat poistaa tämän käyttäjän? Toiminto on lopullinen!" delete_and_block: "Poista ja estä tämä sähköposti ja IP-osoite." delete_dont_block: "Ainoastaan poista" + deleting_user: "Poistetaan käyttäjää..." deleted: "Käyttäjä poistettiin." delete_failed: "Käyttäjän poistanen ei onnistunut. Varmista, että kaikki käyttäjän viestit on poistettu." send_activation_email: "Lähetä vahvistussähköposti." @@ -3390,8 +3475,8 @@ fi: tl3_requirements: title: "Vaatimukset luottamustasolle 3." table_title: - one: Viimeisimmän päivän aikana - other: 'Viimeisimpien %{count} päivän aikana:' + one: "Viimeisimmän päivän aikana" + other: "Viimeisimpien %{count} päivän aikana:" value_heading: "Arvo" requirement_heading: "Vaatimus" visits: "Vierailua" @@ -3407,6 +3492,8 @@ fi: likes_received: "Saatuja tykkäyksiä" likes_received_days: "Saadut tykkäykset: uniikit päivät" likes_received_users: "Saadut tykkäykset: uniikit käyttäjät" + suspended: "Hyllytetty (kaikkina aikoina)" + silenced: "Hiljennetty (kaikkina aikoina)" qualifies: "Täyttää luottamustaso 3:n vaatimukset." does_not_qualify: "Ei täytä luottamustaso 3:n vaatimuksia." will_be_promoted: "Ylennetään piakkoin." @@ -3465,12 +3552,25 @@ fi: go_back: "Takaisin hakuun" recommended: "On suositeltavaa muokata seuraavaa tekstiä tarpeidesi mukaan:" show_overriden: 'Näytä vain muokatut' + settings: + show_overriden: 'Näytä vain muokatut' + reset: 'nollaa' + none: 'ei mitään' site_settings: title: 'Asetukset' no_results: "Ei tuloksia." + more_than_30_results: "Tuloksia on yli 30. Rajaa hakuasi tai valitse luokka." clear_filter: "Tyhjennä" add_url: "Lisää URL" add_host: "lisää host" + uploaded_image_list: + label: "Muokkaa luetteloa" + empty: "Kuvia ei vielä ole. Voit liittää ensimmäisen kuvan." + upload: + label: "Lähetä" + title: "Lähetä kuva(t)" + selectable_avatars: + title: "Luettelo käyttäjien valittavissa olevista profiilikuvista" categories: all_results: 'Kaikki' required: 'Pakolliset' @@ -3534,6 +3634,8 @@ fi: enabled: Ota ansiomerkki käyttöön icon: Ikoni image: Kuva + icon_help: "Käytä Font Awesome -luokkaa" + image_help: "Syötä kuvan URL (kumoaa ikonikentän, jos molemmat on asetettu)" query: Ansiomerkkien haku tietokannasta (SQL) target_posts: Tietokantakyselyn kohdeviestit auto_revoke: Aja kumoamis-ajo päivittäin @@ -3557,8 +3659,8 @@ fi: text: "Myöntöjen näytteitä puuttuu. Tämä tapahtuu, kun ansiomerkin kysely palauttaa käyttäjä-ID:n tai viesti-ID:n, jota ei ole olemassa. Tämä voi johtaa odottamattomiin seurauksiin myöhemmin - tarkista kysely uudestaan." no_grant_count: "Ei ansiomerkkejä myönnettäväksi" grant_count: - one: 1 ansiomerkki odottaa myöntämistä. - other: %{count} ansiomerkkiä odottaa myöntämistä. + one: "1 ansiomerkki odottaa myöntämistä." + other: "%{count} ansiomerkkiä odottaa myöntämistä." sample: "Esimerkki:" grant: with: "%{username}" @@ -3623,10 +3725,11 @@ fi: step: "%{current}/%{total}" upload: "Lataa" uploading: "Ladataan..." + upload_error: "Pahoittelut, tiedoston lähetys ei onnistunut. Ole hyvä ja yritä uudelleen." quit: "Ehkä myöhemmin" staff_count: - one: Henkilökuntalaisia on 1 (eli sinä) - other: Henkilökuntalaisia on %{count}, sinä mukaan lukien. + one: "Henkilökuntalaisia on 1 (eli sinä)" + other: "Henkilökuntalaisia on %{count}, sinä mukaan lukien." invites: add_user: "lisää" none_added: "Et ole kutsunut lainkaan henkilökuntaa. Haluatko todella jatkaa?" @@ -3634,3 +3737,7 @@ fi: admin: "Ylläpitäjä" moderator: "Valvoja" regular: "Tavallinen käyttäjä" + previews: + topic_title: "Keskusteluketju" + share_button: "Jaa" + reply_button: "Vastaa" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index b4281f937b..41e5800218 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -43,68 +43,68 @@ fr: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1j - other: '%{count}j' + one: "1j" + other: "%{count}j" x_months: - one: 1 mois - other: '%{count} mois' + one: "1 mois" + other: "%{count} mois" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} mins' + one: "1 min" + other: "%{count} mins" x_hours: - one: 1 heure - other: '%{count} heures' + one: "1 heure" + other: "%{count} heures" x_days: - one: 1 jour - other: '%{count} jours' + one: "1 jour" + other: "%{count} jours" date_year: "D MMM 'YY" medium_with_ago: x_minutes: - one: il y a 1 min - other: il y a %{count} mins + one: "il y a 1 min" + other: "il y a %{count} mins" x_hours: - one: il y a 1 heure - other: il y a %{count} heures + one: "il y a 1 heure" + other: "il y a %{count} heures" x_days: - one: il y a 1 jour - other: il y a %{count} jours + one: "il y a 1 jour" + other: "il y a %{count} jours" later: x_days: - one: 1 jour plus tard - other: '%{count} jours plus tard' + one: "1 jour plus tard" + other: "%{count} jours plus tard" x_months: - one: 1 mois plus tard - other: '%{count} mois plus tard' + one: "1 mois plus tard" + other: "%{count} mois plus tard" x_years: - one: 1 année plus tard - other: '%{count} années plus tard' + one: "1 année plus tard" + other: "%{count} années plus tard" previous_month: 'Mois précédent' next_month: 'Mois suivant' placeholder: date @@ -125,6 +125,7 @@ fr: user_left: "%{who}a quitté cette conversation %{when}" removed_user: "a retiré %{who} %{when}" removed_group: "a retiré %{who} %{when}" + autobumped: "remonté automatiquement dans la liste %{when}" autoclosed: enabled: 'fermé automatiquement %{when}' disabled: 'ouvert automatiquement %{when}' @@ -164,6 +165,7 @@ fr: eu_central_1: "UE (Francfort)" eu_west_1: "UE (Irlande)" eu_west_2: "UE (Londres)" + eu_west_3: "UE (Paris)" sa_east_1: "Amérique du Sud (Sao Paulo)" us_east_1: "États-Unis est (Virginie)" us_east_2: "États-Unis est (Ohio)" @@ -187,13 +189,14 @@ fr: show_help: "options" links: "Liens" links_lowercase: - one: lien - other: liens + one: "lien" + other: "liens" faq: "FAQ" guidelines: "Charte" privacy_policy: "Politique de confidentialité" privacy: "Confidentialité" - terms_of_service: "Conditions générales d'utilisation" + tos: "Conditions générales d'utilisation" + rules: "Règles" mobile_view: "Vue mobile" desktop_view: "Vue bureau" you: "Vous" @@ -212,8 +215,8 @@ fr: max_of_count: "maximum sur {{count}}" alternation: "ou" character_count: - one: '{{count}} caractère' - other: '{{count}} caractères' + one: "{{count}} caractère" + other: "{{count}} caractères" suggested_topics: title: "À lire ensuite" pm_title: "À lire ensuite" @@ -247,15 +250,21 @@ fr: last_read: "ceci est le dernier message que vous avez lu ; cliquez pour y mettre un signet" remove: "Retirer le signet" confirm_clear: "Êtes-vous sûr de vouloir retirer tous les signets de ce sujet ?" + drafts: + resume: "Reprendre" + remove: "Supprimer" + new_topic: "Nouveau brouillon de sujet" + new_private_message: "Nouveau brouillon de message privé" + topic_reply: "Créer un brouillon de réponse" topic_count_latest: - one: Voir {{count}} sujet récent ou mis à jour. - other: Voir {{count}} sujets récents ou mis à jour + one: "Voir {{count}} sujet récent ou mis à jour." + other: "Voir {{count}} sujets récents ou mis à jour" topic_count_unread: - one: Voir {{count}} sujet non lu - other: Voir {{count}} sujets non lus + one: "Voir {{count}} sujet non lu" + other: "Voir {{count}} sujets non lus" topic_count_new: - one: Voir {{count}} nouveau sujet - other: Voir {{count}} nouveaux sujets + one: "Voir {{count}} nouveau sujet" + other: "Voir {{count}} nouveaux sujets" preview: "prévisualiser" cancel: "annuler" save: "Sauvegarder" @@ -293,16 +302,16 @@ fr: cancel: "Annuler" view_pending: "voir les messages en attente" has_pending_posts: - one: Ce sujet a 1 message en attente de validation - other: Ce sujet a {{count}} messages en attente de validation + one: "Ce sujet a 1 message en attente de validation" + other: "Ce sujet a {{count}} messages en attente de validation" confirm: "Sauvegarder" delete_prompt: "Êtes-vous sûr de vouloir supprimer %{username} ? Cela supprimera tous ses messages et bloquera son courriel et son adresse IP." approval: title: "Ce message doit être approuvé" description: "Votre nouveau message a bien été envoyé, mais il doit être approuvé par un modérateur avant d'apparaître publiquement. Merci de votre patience." pending_posts: - one: Vous avez un message en attente. - other: Vous avez {{count}} messages en attente. + one: "Vous avez un message en attente." + other: "Vous avez {{count}} messages en attente." ok: "OK" user_action: user_posted_topic: "{{user}} a démarré le sujet" @@ -336,8 +345,8 @@ fr: posts_read: "Lus" posts_read_long: "Messages lus" total_rows: - one: 1 utilisateur - other: '%{count} utilisateurs' + one: "1 utilisateur" + other: "%{count} utilisateurs" group_histories: actions: change_group_setting: "Changer les paramètres du groupe" @@ -422,8 +431,8 @@ fr: is_group_user: "Membre" is_group_owner: "Propriétaire" title: - one: Groupe - other: Groupes + one: "Groupe" + other: "Groupes" activity: "Activité" members: title: "Membres" @@ -486,17 +495,16 @@ fr: "12": "Éléments envoyés" "13": "Boîte de réception" "14": "En attente" + "15": "Brouillons" categories: all: "toutes les catégories" - all_subcategories: "tout dans %{categoryName}" + all_subcategories: "toutes" no_subcategory: "aucune" category: "Catégorie" category_list: "Afficher la liste des catégories" reorder: title: "Réordonner les catégories" title_long: "Réorganiser la liste des catégories" - fix_order: "Corriger les positions" - fix_order_tooltip: "Toutes les catégories n'ont pas une position unique. Cela peut provoquer des résultats non souhaités." save: "Enregistrer l'ordre" apply_all: "Appliquer" position: "Position" @@ -507,11 +515,12 @@ fr: toggle_ordering: "modifier le mode du tri" subcategories: "Sous-catégories" topic_sentence: - one: 1 sujet - other: '%{count} sujets' + one: "1 sujet" + other: "%{count} sujets" topic_stat_sentence: - one: '%{count} nouveau sujet par %{unit}.' - other: '%{count} nouveaux sujets par %{unit}.' + one: "%{count} nouveau sujet par %{unit}." + other: "%{count} nouveaux sujets par %{unit}." + more: "(%{count} de plus)…" ip_lookup: title: Rechercher l'adresse IP hostname: Nom de l'hôte @@ -528,6 +537,7 @@ fr: post_count: "# messages" confirm_delete_other_accounts: "Êtes-vous sûr de vouloir supprimer tous ces comptes ?" powered_by: "propulsé par ipinfo.io" + copied: "copié" user_fields: none: "(choisir une option)" user: @@ -594,6 +604,7 @@ fr: individual_no_echo: "Envoyer un courriel pour chaque nouveau message sauf les miens" many_per_day: "M'envoyer un courriel pour chaque nouveau message (environ {{dailyEmailEstimate}} par jour)" few_per_day: "M'envoyer un courriel pour chaque nouveau message (environ 2 par jour)" + warning: "Mode liste de diffusion activé. Les paramètres de notification par e-mail sont remplacés." tag_settings: "Tags" watched_tags: "Surveillés" watched_tags_instructions: "Vous surveillerez automatiquement tous les sujets avec ces tags. Vous serez notifié de tous les nouveaux messages et sujets, et le nombre de nouveaux messages apparaîtra à coté du sujet." @@ -629,6 +640,7 @@ fr: revoke_access: "Révoquer l'accès" undo_revoke_access: "Annuler la révocation d'accès" api_approved: "Approuvé :" + api_last_used_at: "Dernièrement utilisé le :" theme: "Thème" home: "Page d'accueil par défaut" staged: "Distant" @@ -667,9 +679,23 @@ fr: set_password: "Définir le mot de passe" choose_new: "Choisissez un nouveau mot de passe" choose: "Choisissez un mot de passe" + second_factor_backup: + title: "Codes de secours de l'authentification à deux étapes" + regenerate: "Regénérer" + disable: "Désactiver" + enable: "Activer" + enable_long: "Activer les codes de secours" + manage: "Gérer les codes de secours" + copied_to_clipboard: "Copié dans le presse-papier" + copy_to_clipboard_error: "Erreur en copiant les données dans le presse-papier" + remaining_codes: "Vous avez {{count}} codes de secours restants." + codes: + title: "Codes de secours générés" + description: "Chaque code de secours ne peut être utilisé qu'une seule fois. Garder les dans un endroit sûr mais accessible." second_factor: - title: "Authentification à deux facteurs" - disable: "Désactiver l'authentification à deux facteurs" + title: "Authentification à deux étapes" + disable: "Désactiver l'authentification à deux étapes" + enable: "Activer l'authentification à deux étapes pour une sécurité accrue des comptes." confirm_password_description: "Merci de confirmer votre mot de passe pour continuer" label: "Code" enable_description: | @@ -677,15 +703,15 @@ fr: disable_description: "Veuillez saisir le code d'authentification de votre app" show_key_description: "Saisi manuel" extended_description: | - L'authentification à deux facteurs ajoute une sécurité supplémentaire à votre compte en exigeant un jeton unique en + L'authentification à deux étapes ajoute une sécurité supplémentaire à votre compte en exigeant un jeton unique en plus de votre mot de passe. Les jetons peuvent être générés sur les appareils Android, iOS, et Windows Phone. - oauth_enabled_warning: "Veuillez noter que les connexions sociales seront désactivées une fois que l'authentification à deux facteurs aura été activée sur votre compte." + oauth_enabled_warning: "Veuillez noter que les connexions sociales seront désactivées une fois que l'authentification à deux étapes aura été activée sur votre compte." change_about: title: "Modifier À propos de moi" error: "Il y a eu une erreur lors de la modification de cette valeur." change_username: title: "Modifier le pseudo" - confirm: "Si vous changez votre pseudonyme, toutes les citations existantes de vos messages et les mentions avec votre @pseudo seront cassées. Êtes-vous sûr de vouloir le changer ?" + confirm: "Êtes-vous sûr de vouloir modifier votre pseudo ?" taken: "Désolé, ce pseudo est déjà pris." invalid: "Ce pseudo est invalide. Il ne doit être composé que de lettres et de chiffres." change_email: @@ -706,7 +732,6 @@ fr: upload_title: "Envoyer votre avatar" upload_picture: "Envoyer une image" image_is_not_a_square: "Attention : nous avons découpé votre image ; la largeur et la hauteur n'étaient pas égales." - cache_notice: "Votre photo de profil a bien été modifié, mais il se peut qu'il mette un certain temps à apparaître à cause des caches de navigateur." change_profile_background: title: "Arrière-plan du profil" instructions: "L'arrière-plan du profil sera centré avec une largeur par défaut de 850 pixels." @@ -715,14 +740,22 @@ fr: instructions: "Les images d'arrière-plan seront centrées avec une taille par défaut de 590 pixels." email: title: "Courriel" + primary: "Adresse courriel principale" + secondary: "Adresses courriel secondaires" + no_secondary: "Aucune adresse courriel secondaire" instructions: "jamais visible publiquement" ok: "Nous vous enverrons un courriel de confirmation" invalid: "Merci d'entrer une adresse de courriel valide" authenticated: "Votre adresse de courriel a été authentifiée par {{provider}}" frequency_immediately: "Nous vous enverrons un courriel immédiatement si vous n'avez pas lu le contenu en question." frequency: - one: Nous vous enverrons des courriels seulement si nous ne vous avons pas vu sur le site dans la dernière minute. - other: Nous vous enverrons des courriels seulement si nous ne vous avons pas vu sur le site dans les dernières {{count}} minutes. + one: "Nous vous enverrons des courriels seulement si nous ne vous avons pas vu sur le site dans la dernière minute." + other: "Nous vous enverrons des courriels seulement si nous ne vous avons pas vu sur le site dans les dernières {{count}} minutes." + associated_accounts: + title: "Comptes associés" + connect: "Connecter" + revoke: "Révoquer" + not_connected: "(non connecté)" name: title: "Nom d'utilisateur" instructions: "votre nom complet (facultatif)" @@ -747,6 +780,18 @@ fr: any: "tous" password_confirmation: title: "Confirmation du mot de passe" + auth_tokens: + title: "Appareils utilisés récemment" + title_logs: "Journaux d'authentification" + ip_address: "Adresse IP" + created: "Créé" + first_seen: "Première utilisation" + last_seen: "Dernière utilisation" + operating_system: "Système d'exploitation" + location: "Localisation" + action: "Action" + login: "Connecter" + logout: "Déconnecter tout" last_posted: "Dernier message" last_emailed: "Dernier courriel" last_seen: "Vu" @@ -808,8 +853,8 @@ fr: sent: "Envoyé" none: "Il n'y a pas d'invitations en attente à afficher." truncated: - one: Afficher la première invitation. - other: Afficher les {{count}} premières invitations. + one: "Afficher la première invitation." + other: "Afficher les {{count}} premières invitations." redeemed: "Invitations acceptées" redeemed_tab: "Utilisées" redeemed_tab_with_count: "Invitations acceptées ({{count}})" @@ -856,29 +901,29 @@ fr: time_read: "de lecture" recent_time_read: "temps de lecture récent" topic_count: - one: sujets créés - other: sujets créés + one: "sujets créés" + other: "sujets créés" post_count: - one: message créé - other: messages créés + one: "message créé" + other: "messages créés" likes_given: - one: donné - other: donnés + one: "donné" + other: "donnés" likes_received: - one: reçu - other: reçus + one: "reçu" + other: "reçus" days_visited: - one: jour visité - other: jours visités + one: "jour visité" + other: "jours visités" topics_entered: - one: sujet vu - other: sujets vus + one: "sujet vu" + other: "sujets vus" posts_read: - one: message lu - other: messages lus + one: "message lu" + other: "messages lus" bookmark_count: - one: signet - other: signets + one: "signet" + other: "signets" top_replies: "Meilleures réponses" no_replies: "Pas encore de réponses." more_replies: "Plus de réponses" @@ -894,7 +939,9 @@ fr: most_liked_users: "A le plus aimé" most_replied_to_users: "A le plus répondu à" no_likes: "Pas encore de J'aime." - associated_accounts: "Identifiants" + top_categories: "Meilleures catégories" + topics: "Sujets" + replies: "Réponses" ip_address: title: "Dernières adresses IP" registration_ip_address: @@ -947,8 +994,8 @@ fr: reached: "%{relativeAge} – %{rate} a atteint la limite de %{siteSettingRate} définie dans les paramètres du site." exceeded: "%{relativeAge} – %{rate} a dépassé la limite de %{siteSettingRate} définie dans les paramètres du site." rate: - one: 1 erreur/%{duration} - other: '%{count} erreurs/%{duration}' + one: "1 erreur/%{duration}" + other: "%{count} erreurs/%{duration}" learn_more: "en savoir plus…" all_time: 'total' all_time_desc: 'nombre total de sujets créés' @@ -976,8 +1023,8 @@ fr: hide_session: "Me le rappeler demain" hide_forever: "non merci" hidden_for_session: "Très bien, je vous demanderai demain. Vous pouvez toujours cliquer sur « Se connecter » pour créer un compte." - intro: "Bonjour ! :heart_eyes: Vous semblez apprécier la discussion, mais n'avez pas encore créé de compte." - value_prop: "Quand vous créez votre compte, nous stockons ce que vous avez lu pour vous positionner systématiquement sur le bon emplacement à votre retour. Vous avez également des notifications, ici et par courriel, quand de nouveaux messages sont postés. Et vous pouvez aimer les messages pour partager vos coups de cÅ“urs. :heartbeat:" + intro: "Bonjour ! Vous semblez apprécier la discussion, mais n'avez pas encore créé de compte." + value_prop: "Quand vous créez votre compte, nous stockons ce que vous avez lu pour qu'à votre retour vous puissiez continuer là on vous vous êtes arrêtés. Vous recevez aussi des notifications, ici et par courriel, dès que quelqu'un vous répond. Et vous pouvez aimer les messages pour partager vos coups de cÅ“urs. :heartpulse:" summary: enabled_description: "Vous visualisez un résumé de ce sujet : les messages les plus intéressants choisis par la communauté." description: "Il y a {{replyCount}} réponses." @@ -992,6 +1039,7 @@ fr: private_message_info: title: "Message direct" invite: "Inviter d'autres utilisateurs…" + edit: "Ajouter ou supprimer…" leave_message: "Êtes-vous sûr de vouloir quitter cette conversation ?" remove_allowed_user: "Êtes-vous sûr de vouloir supprimer {{name}} de ce message direct ?" remove_allowed_group: "Êtes-vous sûr de vouloir supprimer {{name}} de ce message direct ?" @@ -1033,11 +1081,16 @@ fr: title: "Se connecter" username: "Utilisateur" password: "Mot de passe" - second_factor_title: "Authentification à deux facteurs" + second_factor_title: "Authentification à deux étapes" second_factor_description: "Veuillez saisir le code d'authentification de votre app :" + second_factor_backup: "Se connecter avec un code de secours" + second_factor_backup_title: "Authentification à deux étapes (code de secours)" + second_factor_backup_description: "Veuillez entrer un de vos codes de secours :" + second_factor: "Se connecter avec une application" email_placeholder: "courriel ou pseudo" caps_lock_warning: "Majuscules vérrouillées" error: "Erreur inconnue" + cookies_error: "Les cookies de votre navigateur semblent désactiver. Vous ne pourrez pas vous connecter sans les activer." rate_limit: "Merci de patienter avant de vous reconnecter." blank_username: "Merci de saisir votre courriel ou pseudo." blank_username_or_password: "Merci de saisir votre courriel ou pseudo, et mot de passe." @@ -1052,7 +1105,7 @@ fr: not_allowed_from_ip_address: "Vous ne pouvez pas vous connecter depuis cette adresse IP." admin_not_allowed_from_ip_address: "Vous ne pouvez pas vous connecter comme administrateur depuis cette adresse IP." resend_activation_email: "Cliquez ici pour envoyer à nouveau le courriel d'activation." - omniauth_disallow_totp: "L'authentification à deux facteurs est activée sur votre compte. Veuillez vous connecter avec votre mot de passe." + omniauth_disallow_totp: "L'authentification à deux étapes est activée sur votre compte. Veuillez vous connecter avec votre mot de passe." resend_title: "Renvoyer le courriel d'activation" change_email: "Changer l'adresse de courriel" provide_new_email: "Donnez une nouvelle adresse et nous allons renvoyer votre courriel de confirmation." @@ -1062,25 +1115,28 @@ fr: preferences: "Vous devez être connecté pour modifier vos préférences utilisateur." forgot: "J'ai oublié les détails de mon compte" not_approved: "Votre compte n'a pas encore été approuvé. Vous serez notifié par mail lorsque vous pourrez vous connecter." - google: - title: "via Google" - message: "Authentification via Google (assurez-vous que les popups ne soient pas bloquées)" google_oauth2: + name: "Google" title: "via Google" message: "Authentification via Google (assurez-vous que les popups ne soient pas bloquées)" twitter: + name: "Twitter" title: "via Twitter" message: "Authentification via Twitter (assurez-vous que les popups ne soient pas bloquées)" instagram: + name: "Instagram" title: "via Instagram" message: "Authentification via Instagtram (assurez-vous que les popups ne soient pas bloquées)" facebook: + name: "Facebook" title: "via Facebook" message: "Authentification via Facebook (assurez-vous que les popups ne soient pas bloquées)" yahoo: + name: "Yahoo" title: "via Yahoo" message: "Authentification via Yahoo (assurez-vous que les popups ne soient pas bloquées)" github: + name: "GitHub" title: "via GitHub" message: "Authentification via GitHub (assurez-vous que les popups ne soient pas bloquées)" invites: @@ -1119,13 +1175,14 @@ fr: default_header_text: Sélectionner… no_content: Aucune correspondance trouvée filter_placeholder: Rechercher... + filter_placeholder_with_any: Rechercher ou créer… create: "Créer : '{{content}}'" max_content_reached: - one: Vous ne pouvez séléctionner que {{count}} élément. - other: Vous ne pouvez séléctionner que {{count}} éléments. + one: "Vous ne pouvez séléctionner que {{count}} élément." + other: "Vous ne pouvez séléctionner que {{count}} éléments." min_content_not_reached: - one: Séléctionner au moins {{count}} élément. - other: Séléctionner au moins {{count}} éléments. + one: "Séléctionner au moins {{count}} élément." + other: "Séléctionner au moins {{count}} éléments." emoji_picker: filter_placeholder: Chercher un emoji people: Personnes @@ -1168,8 +1225,8 @@ fr: drafts_offline: "sauvegardé hors ligne" group_mentioned_limit: "Attention ! Vous avez mentionné {{group}}, cependant ce groupe a plus de membres que le nombre de mentions limite de {{max}} utilisateurs configuré par l'administrateur. Personne ne sera notifié." group_mentioned: - one: En mentionnant {{group}}, vous êtes sur le point de notifier 1 personne – êtes-vous sûr ? - other: En mentionnant {{group}}, vous êtes sur le point de notifier {{count}} personnes – êtes-vous sûr ? + one: "En mentionnant {{group}}, vous êtes sur le point de notifier 1 personne – êtes-vous sûr ?" + other: "En mentionnant {{group}}, vous êtes sur le point de notifier {{count}} personnes – êtes-vous sûr ?" cannot_see_mention: category: "Vous avez mentionné {{username}} mais il ne sera pas notifié car il n'a pas accès à cette catégorie. Vous devez ajouter cet utilisateur à un groupe ayant accès à cette catégorie." private: "Vous avez mentionné {{username}} mais il ne sera pas notifié car il ne peut pas voir ce message direct. Vous devez inviter cet utilisateur à la discussion." @@ -1245,6 +1302,9 @@ fr: body: "Pour le moment, ce message est uniquement envoyé à vous-même !" admin_options_title: "Paramètres optionnels pour ce sujet" composer_actions: + reply: Répondre + draft: Ebauche + edit: Modifier reply_to_post: label: "Réponse à message %{postNumber} par %{postUsername}" desc: Répondre à un message spécifique @@ -1265,14 +1325,17 @@ fr: shared_draft: label: "Ebauche partagée" desc: "Créer ébauche d'un sujet qui ne sera visible qu'aux responsables" + toggle_topic_bump: + label: "Basculer l'actualisation des sujets" + desc: "Répondre sans modifier la date d'actualisation du sujet" notifications: tooltip: regular: - one: 1 notification non vue - other: '{{count}} notifications non vues' + one: "1 notification non vue" + other: "{{count}} notifications non vues" message: - one: 1 message non lu - other: '{{count}} messages non lus' + one: "1 message non lu" + other: "{{count}} messages non lus" title: "notifications des mentions de votre @pseudo, des réponses à vos messages, à vos sujets, etc." none: "Impossible de charger les notifications pour le moment." empty: "Aucune notification trouvée." @@ -1287,8 +1350,8 @@ fr: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} et 1 autre {{description}} - other: {{username}}, {{username2}} et {{count}} autres {{description}} + one: "{{username}}, {{username2}} et 1 autre {{description}}" + other: "{{username}}, {{username2}} et {{count}} autres {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1299,8 +1362,8 @@ fr: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nouveau sujet {{description}}" group_message_summary: - one: '{{count}} message dans la boîte de réception de {{group_name}}' - other: '{{count}} messages dans la boîte de réception de {{group_name}}' + one: "{{count}} message dans la boîte de réception de {{group_name}}" + other: "{{count}} messages dans la boîte de réception de {{group_name}}" popup: mentioned: '{{username}} vous a mentionné dans « {{topic}} » - {{site_title}}' group_mentioned: '{{username}} vous a mentionné dans « {{topic}} » - {{site_title}}' @@ -1337,8 +1400,8 @@ fr: clear_all: "Tout désélectionner" too_short: "Votre terme de recherche est trop court." result_count: - one: 1 résultat pour{{term}} - other: {{count}}{{plus}} résultats pour{{term}} + one: "1 résultat pour{{term}}" + other: "{{count}}{{plus}} résultats pour{{term}}" title: "rechercher des sujets, messages, utilisateurs ou catégories" full_page_title: "rechercher des sujets ou messages" no_results: "Aucun résultat." @@ -1372,6 +1435,7 @@ fr: label: Avec les tags filters: label: Seulement retourner les sujets/messages... + title: Seuls les titres correspondent likes: que j'ai aimé posted: auxquels j'ai participé watching: que je surveille @@ -1428,8 +1492,8 @@ fr: notification_level: "Notifications" choose_new_category: "Choisissez la nouvelle catégorie pour les sujets :" selected: - one: Vous avez sélectionné 1 sujet. - other: Vous avez sélectionné {{count}} sujets. + one: "Vous avez sélectionné 1 sujet." + other: "Vous avez sélectionné {{count}} sujets." change_tags: "Changer les tags" append_tags: "Ajouter les tags" choose_new_tags: "Choisir les nouveaux tags pour ces sujets :" @@ -1462,8 +1526,8 @@ fr: search: "Il n'y a plus de résultats à votre recherche." topic: filter_to: - one: 1 message dans le sujet - other: '{{count}} messages dans le sujet' + one: "1 message dans le sujet" + other: "{{count}} messages dans le sujet" create: 'Créer un sujet' create_long: 'Créer un nouveau sujet' open_draft: "Ouvrir ébauche" @@ -1481,10 +1545,10 @@ fr: new: 'nouveau sujet' unread: 'non lus' new_topics: - one: 1 nouveau sujet + one: '1 nouveau sujet' other: '{{count}} nouveaux sujets' unread_topics: - one: 1 sujet non lu + one: '1 sujet non lu' other: '{{count}} sujets non lus' title: 'Sujet' invalid_access: @@ -1498,17 +1562,17 @@ fr: title: "Sujet non trouvé" description: "Désolé, nous n'avons pas trouvé ce sujet. Peut-être a t-il été retiré par un modérateur ?" total_unread_posts: - one: vous avez 1 message non lu dans ce sujet - other: vous avez {{count}} messages non lus dans ce sujet + one: "vous avez 1 message non lu dans ce sujet" + other: "vous avez {{count}} messages non lus dans ce sujet" unread_posts: - one: vous avez 1 message non lu sur ce sujet - other: vous avez {{count}} messages non lus sur ce sujet + one: "vous avez 1 message non lu sur ce sujet" + other: "vous avez {{count}} messages non lus sur ce sujet" new_posts: - one: il y a 1 nouveau message sur ce sujet depuis votre derniere lecture - other: il y a {{count}} nouveaux messages sur ce sujet depuis votre derniere lecture + one: "il y a 1 nouveau message sur ce sujet depuis votre derniere lecture" + other: "il y a {{count}} nouveaux messages sur ce sujet depuis votre derniere lecture" likes: - one: 1 personne a aimé ce sujet - other: '{{count}} personnes ont aimé ce sujet' + one: "1 personne a aimé ce sujet" + other: "{{count}} personnes ont aimé ce sujet" back_to_list: "Retour à la liste des sujets" options: "Options du sujet" show_links: "afficher les liens dans ce sujet" @@ -1572,8 +1636,8 @@ fr: auto_reminder: "Vous serez rappelé sur ce sujet %{timeLeft}." auto_close_title: 'Paramètres de fermeture automatique' auto_close_immediate: - one: Le dernier message dans ce sujet est déjà vieux de 1 heure donc le sujet sera immédiatement fermé. - other: Le dernier message dans ce sujet est déjà vieux de %{count} heures donc le sujet sera immédiatement fermé. + one: "Le dernier message dans ce sujet est déjà vieux de 1 heure donc le sujet sera immédiatement fermé." + other: "Le dernier message dans ce sujet est déjà vieux de %{count} heures donc le sujet sera immédiatement fermé." timeline: back: "Retour" back_description: "Revenir au dernier message non lu" @@ -1588,6 +1652,8 @@ fr: jump_prompt_of: "de %{count} messages" jump_prompt_long: "À quel message voulez-vous aller ?" jump_bottom_with_number: "aller au message %{post_number}" + jump_prompt_to_date: "à la date" + jump_prompt_or: "ou" total: total de messages current: message actuel notifications: @@ -1649,6 +1715,7 @@ fr: reset_read: "Réinitialiser les données de lecture" make_public: "Rendre le sujet public" make_private: "Transformer en message direct" + reset_bump_date: "Réinitialiser la date d'actualisation" feature: pin: "Épingler le sujet" unpin: "Désépingler le sujet" @@ -1681,8 +1748,8 @@ fr: pin_validation: "Une date est requise pour épingler ce sujet." not_pinned: "Il n'y a aucun sujet épinglé dans {{categoryLink}}." already_pinned: - one: 'Sujets actuellement épinglés dans {{categoryLink}} : 1' - other: 'Sujets actuellement épinglés dans {{categoryLink}} : {{count}}' + one: "Sujets actuellement épinglés dans {{categoryLink}} : 1" + other: "Sujets actuellement épinglés dans {{categoryLink}} : {{count}}" pin_globally: "Faire apparaître ce sujet en haut de toutes les listes de sujet jusqu'à " confirm_pin_globally: "Vous avez déjà {{count}} sujets épinglés. Trop de sujets épinglés peut être lourd pour les nouveaux utilisateurs et les visiteurs. Êtes-vous sûr de vouloir épingler globalement un autre sujet ?" unpin_globally: "Enlever ce sujet du haut de toutes les listes de sujets." @@ -1690,8 +1757,8 @@ fr: global_pin_note: "Les utilisateurs peuvent désépingler le sujet pour eux." not_pinned_globally: "Il n'y a aucun sujet épinglé globalement." already_pinned_globally: - one: 'Sujets actuellement épinglés globalement : 1' - other: 'Sujets actuellement épinglés globalement : {{count}}' + one: "Sujets actuellement épinglés globalement : 1" + other: "Sujets actuellement épinglés globalement : {{count}}" make_banner: "Mettre ce sujet à la une, il apparaîtra en haut de chaque page." remove_banner: "Enlever le sujet à la une qui apparaît en haut de chaque page." banner_note: "Les utilisateurs peuvent ignorer le sujet à la une. Seul un sujet peut être mis à la une à la fois." @@ -1728,8 +1795,8 @@ fr: login_reply: 'Se connecter pour répondre' filters: n_posts: - one: 1 message - other: '{{count}} messages' + one: "1 message" + other: "{{count}} messages" cancel: "Supprimer le filtre" split_topic: title: "Déplacer vers un nouveau sujet" @@ -1737,15 +1804,15 @@ fr: topic_name: "Titre du nouveau sujet" error: "Il y a eu une erreur en déplaçant les messages vers un nouveau sujet." instructions: - one: Vous êtes sur le point de créer un nouveau sujet avec le message que vous avez sélectionné. - other: Vous êtes sur le point de créer un nouveau sujet avec les {{count}} messages que vous avez sélectionné. + one: "Vous êtes sur le point de créer un nouveau sujet avec le message que vous avez sélectionné." + other: "Vous êtes sur le point de créer un nouveau sujet avec les {{count}} messages que vous avez sélectionné." merge_topic: title: "Déplacer vers un sujet existant" action: "déplacer vers un sujet existant" error: "Il y a eu une erreur en déplaçant les messages dans ce sujet." instructions: - one: Merci de sélectionner le sujet dans lequel vous souhaitez déplacer ce message. - other: Merci de sélectionner le sujet dans lequel vous souhaitez déplacer ces {{count}} messages. + one: "Merci de sélectionner le sujet dans lequel vous souhaitez déplacer ce message." + other: "Merci de sélectionner le sujet dans lequel vous souhaitez déplacer ces {{count}} messages." merge_posts: title: "Fusionner les messages sélectionnés" action: "fusionner les messages sélectionnés" @@ -1757,8 +1824,8 @@ fr: label: "Nouvel auteur des messages" placeholder: "pseudo du nouvel auteur" instructions: - one: Veuillez choisir un nouvel auteur pour le message de {{old_user}}. - other: Veuillez choisir un nouvel auteur pour les {{count}} messages de {{old_user}}. + one: "Veuillez choisir un nouvel auteur pour le message de {{old_user}}." + other: "Veuillez choisir un nouvel auteur pour les {{count}} messages de {{old_user}}." instructions_warn: "Notez que les notifications au sujet de ce message ne seront pas transferrés au nouvel utilisateur de façon rétroactive." change_timestamp: title: "Modifier la date/heure…" @@ -1787,7 +1854,7 @@ fr: deselect_all: tout désélectionner description: one: vous avez sélectionné 1 message. - other: Vous avez sélectionné {{count}} messages. + other: "Vous avez sélectionné {{count}} messages." post: quote_reply: "Citer" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1802,28 +1869,28 @@ fr: show_full: "Afficher le message complet" show_hidden: 'Afficher le contenu caché.' deleted_by_author: - one: (message supprimé par son auteur, sera supprimé automatiquement dans %{count} heure à moins qu'il ne soit signalé) - other: (message supprimé par son auteur, sera supprimé automatiquement dans %{count} heures à moins qu'il ne soit signalé) + one: "(message supprimé par son auteur, sera supprimé automatiquement dans %{count} heure à moins qu'il ne soit signalé)" + other: "(message supprimé par son auteur, sera supprimé automatiquement dans %{count} heures à moins qu'il ne soit signalé)" collapse: "réduire" expand_collapse: "étendre/réduire" locked: "un responsable a vérouillé ce message pour empêcher la modification" gap: - one: voir 1 réponse cachée - other: voir {{count}} réponses cachées + one: "voir 1 réponse cachée" + other: "voir {{count}} réponses cachées" unread: "Ce message est non lu" has_replies: - one: '{{count}} réponse' - other: '{{count}} réponses' + one: "{{count}} réponse" + other: "{{count}} réponses" has_likes: - one: '{{count}} J''aime' - other: '{{count}} J''aime' + one: "{{count}} J'aime" + other: "{{count}} J'aime" has_likes_title: - one: 1 personne a aimé ce message - other: '{{count}} personnes ont aimé ce message' + one: "1 personne a aimé ce message" + other: "{{count}} personnes ont aimé ce message" has_likes_title_only_you: "vous avez aimé ce message" has_likes_title_you: - one: vous et 1 autre personne ont aimé ce message - other: vous et {{count}} autres personnes ont aimé ce message + one: "vous et 1 autre personne ont aimé ce message" + other: "vous et {{count}} autres personnes ont aimé ce message" errors: create: "Désolé, il y a eu une erreur lors de la publication de votre message. Merci de réessayer." edit: "Désolé, il y a eu une erreur lors de la modification de votre message. Merci de réessayer." @@ -1863,11 +1930,11 @@ fr: delete_replies: confirm: "Voulez-vous aussi supprimer les réponses à ce message ?" direct_replies: - one: Oui et 1 réponse directe - other: Oui et {{count}} réponses directes + one: "Oui et 1 réponse directe" + other: "Oui et {{count}} réponses directes" all_replies: - one: Oui et la réponse - other: Oui et les {{count}} réponses + one: "Oui et la réponse" + other: "Oui et les {{count}} réponses" just_the_post: "Non, uniquement ce message" admin: "actions d'administration sur le message" wiki: "Basculer en mode Wiki" @@ -1882,18 +1949,19 @@ fr: lock_post_description: "empêcher l'utilisateur de modifier le message" unlock_post: "Déverrouiller message" unlock_post_description: "permettre l'utilisateur de modifier le message" + delete_topic_disallowed_modal: "Vous n'avez pas le permission de supprimer ce sujet. Si vous souhaitez vraiment le voir supprimé, signalez-le aux modérateurs avec une explication." + delete_topic_disallowed: "vous n'avez pas la permission de supprimer ce sujet" actions: flag: 'Signaler' defer_flags: - one: Ignorer le signalement - other: Ignorer les signalements + one: "Ignorer le signalement" + other: "Ignorer les signalements" undo: off_topic: "Annuler le signalement" spam: "Annuler le signalement" inappropriate: "Annuler le signalement" bookmark: "Retirer le signet" like: "Annuler le J'aime" - vote: "Retirer le vote" people: off_topic: "signalé comme hors-sujet" spam: "signalé comme spam" @@ -1903,9 +1971,8 @@ fr: bookmark: "signet ajouté" like: "a aimé ceci" like_capped: - one: et {{count}} autre a aimé ça - other: et {{count}} autres ont aimé ça - vote: "a voté pour ceci" + one: "et {{count}} autre a aimé ça" + other: "et {{count}} autres ont aimé ça" by_you: off_topic: "Vous l'avez signalé comme étant hors-sujet" spam: "Vous l'avez signalé comme étant du spam" @@ -1914,65 +1981,58 @@ fr: notify_user: "Vous avez envoyé un message à cet utilisateur" bookmark: "Vous avez mis un signet à ce message" like: "Vous l'avez aimé" - vote: "Vous avez voté pour ce message" by_you_and_others: off_topic: - one: Vous et 1 autre personne l'avez signalé comme étant hors-sujet - other: Vous et {{count}} autres personnes l'avez signalé comme étant hors-sujet + one: "Vous et 1 autre personne l'avez signalé comme étant hors-sujet" + other: "Vous et {{count}} autres personnes l'avez signalé comme étant hors-sujet" spam: - one: Vous et 1 autre personne l'avez signalé comme étant du spam - other: Vous et {{count}} autres personnes l'avez signalé comme étant du spam + one: "Vous et 1 autre personne l'avez signalé comme étant du spam" + other: "Vous et {{count}} autres personnes l'avez signalé comme étant du spam" inappropriate: - one: Vous et 1 autre personne l'ont signalé comme inapproprié - other: Vous et {{count}} autres personnes l'ont signalé comme inapproprié + one: "Vous et 1 autre personne l'ont signalé comme inapproprié" + other: "Vous et {{count}} autres personnes l'ont signalé comme inapproprié" notify_moderators: - one: Vous et 1 autre personne l'ont signalé pour modération - other: Vous et {{count}} autres personnes l'ont signalé pour modération + one: "Vous et 1 autre personne l'ont signalé pour modération" + other: "Vous et {{count}} autres personnes l'ont signalé pour modération" notify_user: - one: 1 autre personne et vous avez envoyé un message à cet utilisateur - other: '{{count}} autres personnes et vous avez envoyé un message à cet utilisateur' + one: "1 autre personne et vous avez envoyé un message à cet utilisateur" + other: "{{count}} autres personnes et vous avez envoyé un message à cet utilisateur" bookmark: - one: Vous et 1 autre personne ont mis un signet à ce message - other: Vous et {{count}} autres personnes ont mis un signet à ce message + one: "Vous et 1 autre personne ont mis un signet à ce message" + other: "Vous et {{count}} autres personnes ont mis un signet à ce message" like: - one: Vous et 1 autre personne l'ont aimé - other: Vous et {{count}} autres personnes l'ont aimé - vote: - one: Vous et 1 autre personne ont voté pour - other: Vous et {{count}} autres personnes ont voté pour + one: "Vous et 1 autre personne l'ont aimé" + other: "Vous et {{count}} autres personnes l'ont aimé" by_others: off_topic: - one: 1 personne l'a signalé comme étant hors-sujet - other: '{{count}} personnes l''ont signalé comme étant hors-sujet' + one: "1 personne l'a signalé comme étant hors-sujet" + other: "{{count}} personnes l'ont signalé comme étant hors-sujet" spam: - one: 1 personne a signalé ceci comme étant du spam - other: '{{count}} personnes ont signalé ceci comme étant du spam' + one: "1 personne a signalé ceci comme étant du spam" + other: "{{count}} personnes ont signalé ceci comme étant du spam" inappropriate: - one: 1 personne a signalé ceci comme étant inapproprié - other: '{{count}} personnes ont signalé ceci comme étant inapproprié' + one: "1 personne a signalé ceci comme étant inapproprié" + other: "{{count}} personnes ont signalé ceci comme étant inapproprié" notify_moderators: - one: 1 personne a signalé ceci pour modération - other: '{{count}} personnes ont signalé pour modération' + one: "1 personne a signalé ceci pour modération" + other: "{{count}} personnes ont signalé pour modération" notify_user: - one: 1 personne a envoyé un message à cet utilisateur - other: '{{count}} personnes ont envoyé un message à cet utilisateur' + one: "1 personne a envoyé un message à cet utilisateur" + other: "{{count}} personnes ont envoyé un message à cet utilisateur" bookmark: - one: 1 personne a mis un signet à ce message - other: '{{count}} personnes ont mis un signet à ce message' + one: "1 personne a mis un signet à ce message" + other: "{{count}} personnes ont mis un signet à ce message" like: - one: 1 personne a aimé ceci - other: '{{count}} personnes ont aimé ceci' - vote: - one: 1 personne a voté pour ce message - other: '{{count}} personnes ont voté pour ce message' + one: "1 personne a aimé ceci" + other: "{{count}} personnes ont aimé ceci" delete: confirm: - one: Êtes-vous sûr de vouloir supprimer ce message ? - other: Êtes-vous sûr de vouloir supprimer ces {{count}} messages ? + one: "Êtes-vous sûr de vouloir supprimer ce message ?" + other: "Êtes-vous sûr de vouloir supprimer ces {{count}} messages ?" merge: confirm: - one: Êtes-vous sûr de vouloir fusionner ces messages ? - other: Êtes-vous sûr de vouloir fusionner ces {{count}} messages ? + one: "Êtes-vous sûr de vouloir fusionner ces messages ?" + other: "Êtes-vous sûr de vouloir fusionner ces {{count}} messages ?" revisions: controls: first: "Première révision" @@ -2010,7 +2070,7 @@ fr: can: 'peut… ' none: '(aucune catégorie)' all: 'Toutes les catégories' - choose: 'Sélectionner une catégorie…' + choose: 'catégorie…' edit: 'modifier' edit_long: "Modifier" view: 'Voir les sujets dans la catégorie' @@ -2067,13 +2127,17 @@ fr: allow_badges_label: "Autoriser les badges à être accordé dans cette catégorie" edit_permissions: "Modifier les permissions" add_permission: "Ajouter la permission" + require_topic_approval: "Nécessiter l'approbation pour chaque nouveau sujet" + require_reply_approval: "Nécessiter l'approbation pour chaque nouvelle réponse" this_year: "cette année" - position: "position" + position: "Position :" default_position: "Position par défaut" position_disabled: "Les catégories seront affichées dans l'ordre d'activité. Pour contrôler l'ordre des catégories dans la liste," position_disabled_click: 'activer le paramètre "fixed category positions"' minimum_required_tags: 'Nombre minimum de tags requis dans un sujet :' parent: "Catégorie parente" + num_auto_bump_daily: 'Nombre de sujets ouverts à remonter dans la liste automatiquement et quotidiennement :' + navigate_to_first_post_after_read: 'Naviguer vers le premier message après que les sujets sont lus' notifications: watching: title: "Surveiller" @@ -2130,14 +2194,14 @@ fr: custom_placeholder_notify_moderators: "Dites-nous ce qui vous dérange spécifiquement, et fournissez des liens pertinents et exemples si possible." custom_message: at_least: - one: saisir au moins 1 caractère - other: saisir au moins {{count}} caractères + one: "saisir au moins 1 caractère" + other: "saisir au moins {{count}} caractères" more: - one: 1 restant… - other: '{{count}} restants…' + one: "1 restant…" + other: "{{count}} restants…" left: - one: 1 restant - other: '{{count}} restants' + one: "1 restant" + other: "{{count}} restants" flagging_topic: title: "Merci de nous aider à garder notre communauté civilisé !" action: "Signaler Sujet" @@ -2148,13 +2212,13 @@ fr: links_title: "Liens populaires" links_shown: "afficher plus de liens…" clicks: - one: 1 clic - other: '%{count} clics' + one: "1 clic" + other: "%{count} clics" post_links: about: "développer plus de liens pour ce message" title: - one: 1 autre - other: '%{count} autres ' + one: "1 autre" + other: "%{count} autres " topic_statuses: warning: help: "Ceci est un avertissement officiel." @@ -2188,22 +2252,22 @@ fr: original_post: "Message original" views: "Vues" views_lowercase: - one: vue - other: vues + one: "vue" + other: "vues" replies: "Réponses" views_long: - one: ce sujet a été vu 1 fois - other: ce sujet a été vu {{number}} fois + one: "ce sujet a été vu 1 fois" + other: "ce sujet a été vu {{number}} fois" activity: "Activité" likes: "J'aime" likes_lowercase: - one: J'aime - other: J'aime + one: "J'aime" + other: "J'aime" likes_long: "il y a {{number}} J'aime dans ce sujet" users: "Utilisateurs" users_lowercase: - one: utilisateur - other: utilisateurs + one: "utilisateur" + other: "utilisateurs" category_title: "Catégorie" history: "Historique" changed_by: "par {{author}}" @@ -2217,8 +2281,8 @@ fr: latest: title: "Récents" title_with_count: - one: Récent ({{count}}) - other: Récents ({{count}}) + one: "Récent ({{count}})" + other: "Récents ({{count}})" help: "sujets avec des messages récents" hot: title: "Populaires" @@ -2236,21 +2300,21 @@ fr: unread: title: "Non lus" title_with_count: - one: Non lu (1) - other: Non lus ({{count}}) + one: "Non lu (1)" + other: "Non lus ({{count}})" help: "sujets avec des messages non lus que vous suivez ou surveillez" lower_title_with_count: - one: 1 non lu - other: '{{count}} non lus' + one: "1 non lu" + other: "{{count}} non lus" new: lower_title_with_count: - one: 1 nouveau - other: '{{count}} nouveaux' + one: "1 nouveau" + other: "{{count}} nouveaux" lower_title: "nouveau" title: "Nouveaux" title_with_count: - one: Nouveau (1) - other: Nouveaux ({{count}}) + one: "Nouveau (1)" + other: "Nouveaux ({{count}})" help: "sujets créés dans les derniers jours" posted: title: "Mes Messages" @@ -2261,8 +2325,8 @@ fr: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "derniers sujets dans la catégorie {{categoryName}}" top: title: "Top" @@ -2306,6 +2370,7 @@ fr: bookmarks: 'g, b Signets' profile: 'g, p Profil' messages: 'g, m Messages' + drafts: 'g, d Brouillons' navigation: title: 'Navigation' jump: '# Aller au sujet #' @@ -2350,22 +2415,22 @@ fr: print: 'Ctrl+p Imprimer le sujet' badges: earned_n_times: - one: A reçu ce badge 1 fois - other: A reçu ce badge %{count} fois + one: "A reçu ce badge 1 fois" + other: "A reçu ce badge %{count} fois" granted_on: "Accordé le %{date}" others_count: "Autres utilisateurs avec ce badge (%{count})" title: Badges allow_title: "Vous pouvez utiliser ce badge comme titre" multiple_grant: "Vous pouvez le gagner de multiples fois" badge_count: - one: 1 badge - other: '%{count} badges' + one: "1 badge" + other: "%{count} badges" more_badges: - one: +1 autre - other: +%{count} autres + one: "+1 autre" + other: "+%{count} autres" granted: - one: 1 décerné - other: '%{count} décernés' + one: "1 décerné" + other: "%{count} décernés" select_badge_for_title: Sélectionner un badge comme titre none: "(aucun)" successfully_granted: "%{badge} accordé à %{username} avec succès" @@ -2399,8 +2464,8 @@ fr: choose_for_topic: "tags optionnels" delete_tag: "Supprimer le tag" delete_confirm: - one: Êtes-vous sûr de vouloir supprimer ce tag et l'enlever de 1 sujet auquel il est assigné ? - other: Êtes-vous sûr de vouloir supprimer ce tag et l'enlever de {{count}} sujets auxquels il est assigné ? + one: "Êtes-vous sûr de vouloir supprimer ce tag et l'enlever de 1 sujet auquel il est assigné ?" + other: "Êtes-vous sûr de vouloir supprimer ce tag et l'enlever de {{count}} sujets auxquels il est assigné ?" delete_confirm_no_topics: "Êtes-vous sûr de vouloir supprimer ce tag ?" rename_tag: "Renommer le tag" rename_instructions: "Choisir un nouveau nom pour ce tag :" @@ -2481,6 +2546,8 @@ fr: admin: title: 'Administrateur' moderator: 'Modérateur' + reports: + title: "Liste de rapports disponibles" dashboard: title: "Tableau de bord" last_updated: "Tableau de bord actualisé le :" @@ -2517,8 +2584,16 @@ fr: page_views_short: "Pages vues" show_traffic_report: "Afficher le rapport de trafic détaillé" community_health: Santé communautaire + moderators_activity: Activité des modérateurs whats_new_in_discourse: "Quoi de neuf dans Discourse ?" activity_metrics: Mesures d'activité + all_reports: "Tous les rapports" + general_tab: "Général" + moderation_tab: "Modération" + disabled: Désactivé + timeout_error: "Désolé, la requête prend trop de temps, veuillez sélectionner un intervalle plus court" + exception_error: "Désolé, une erreur s'est produite à l'exécution de la requête" + too_many_requests: Vous avez effectué cette action trop de fois. Merci d'attendre avant de ressayer. reports: trend_title: "%{percent} modifié. Actuellement %{current}, était %{prev} pour la période précédente." today: "Aujourd'hui" @@ -2536,6 +2611,9 @@ fr: end_date: "Date de fin" groups: "Tous les groupes" disabled: "Ce rapport est désactivé" + totals_for_sample: "Totaux pour l'échantillon" + total: "Total depuis toujours" + no_data: "Aucune donnée à afficher." trending_search: more: 'Journal des recherches' disabled: 'Rapport sur les tendances de recherche désactivé. Activé journalisation des recherches pour collectioner les données.' @@ -2581,11 +2659,11 @@ fr: suspend_user: "Suspendre l'utilisateur" suspend_user_title: "Suspendre l'utilisateur pour ce message" replies: - one: '[1 réponse]' - other: '[%{count} réponses]' + one: "[1 réponse]" + other: "[%{count} réponses]" delete_replies: - one: Supprimer aussi la %{count} réponse à ce message? - other: Supprimer aussi les %{count}réponses à ce message? + one: "Supprimer aussi la %{count} réponse à ce message?" + other: "Supprimer aussi les %{count}réponses à ce message?" dispositions: agreed: "accepté" disagreed: "refusé" @@ -2741,6 +2819,9 @@ fr: flag_event: name: "Evènement de signalement" details: "Quand un signalement est crée, approuvé, désapprouvé ou ignoré." + queued_post_event: + name: "Événement à l'approbation d'un message" + details: "Quand un nouveau message est créé, approuvé ou rejeté" delivery_status: title: "État de l'envoi" inactive: "Inactif" @@ -2750,11 +2831,11 @@ fr: none: "Il n'y aucun évènement lié." redeliver: "Redélivrer" incoming: - one: Il y a un nouvel événement. - other: Il y a {{count}} nouveaux événements. + one: "Il y a un nouvel événement." + other: "Il y a {{count}} nouveaux événements." completed_in: - one: Terminé en 1 seconde. - other: Terminé en {{count}} secondes. + one: "Terminé en 1 seconde." + other: "Terminé en {{count}} secondes." request: "Requête" response: "Réponse" redeliver_confirm: "Êtes-vous sûr de vouloir redélivrer les mêmes données ?" @@ -2879,9 +2960,16 @@ fr: revert: "Annuler les changements" revert_confirm: "Êtes-vous sûr de vouloir annuler vos changements ?" theme: + theme: "Thème" + component: "Composant" + components: "Composants" import_theme: "Importer un thème" customize_desc: "Personaliser :" title: "Thèmes" + modal_title: "Créer un thème" + create: "Créer" + create_type: "Type :" + create_name: "Nom :" long_title: "Modifier les couleurs, le CSS et le contenu HTML de votre site" edit: "Modifier" edit_confirm: "Ceci est un thème distant, si vous modifiez le CSS/HTML vos modifications seront écrasées la prochaine fois que vous le mettez à jour." @@ -2896,6 +2984,10 @@ fr: color_scheme_select: "Sélectionner les couleurs utilisées par le thème" custom_sections: "Sections personnalisées :" theme_components: "Composants du thème :" + switch_component: "Convertir en thème" + switch_component_alert: "Êtes-vous sûr de vouloir convertir ce composant en thème ? Cela va en faire un thème indépendant et sera supprimé des tous les thèmes l'utilisant." + switch_theme: "Convertir en composant" + switch_theme_alert: "Êtes-vous sûr de vouloir convertir ce thème en composant ? Il sera supprimé comme thème parent des composants utilisés." uploads: "Uploads" no_uploads: "Vous pouvez envoyer des ressources associées à votre thème comme des polices ou des images" add_upload: "Ajouter un fichier" @@ -2918,7 +3010,7 @@ fr: public_key: "Accorder un accès dépôt à la clef publique suivante :" about_theme: "À propos du thème" license: "Licence" - component_of: "Le thème est un composant de :" + component_of: "Composant de :" update_to_latest: "Mettre à jour" check_for_updates: "Vérifier les mises à jour" updating: "Mise à jour…" @@ -2926,9 +3018,11 @@ fr: add: "Ajouter" theme_settings: "Paramètres thème" no_settings: "Ce thème n'a pas de paramètres." + empty: "Aucun élément" commits_behind: - one: Le thème est en retard de 1 commit ! - other: Le thème est en retard de {{count}} commits ! + one: "Le thème est en retard de 1 commit !" + other: "Le thème est en retard de {{count}} commits !" + compare_commits: "(Voir les nouveaux changements)" scss: text: "CSS" title: "Entrez du CSS personnalisé, nous acceptons tous les styles CSS et SCSS valides." @@ -3060,7 +3154,6 @@ fr: address_placeholder: "nom@exemple.com" type_placeholder: "résumé, inscription…" reply_key_placeholder: "clé de réponse" - skipped_reason_placeholder: "raison" moderation_history: performed_by: "Réalisé par" no_results: "Il n'y a pas d'historique de modération disponible." @@ -3114,6 +3207,8 @@ fr: change_site_text: "modifier le texte du site" suspend_user: "suspendre l'utilisateur" unsuspend_user: "annuler la suspension de l'utilisateur" + removed_suspend_user: "suspendre l'utilisateur (enlevé)" + removed_unsuspend_user: "annuler la suspension de l'utilisateur (enlevé)" grant_badge: "décerner le badge" revoke_badge: "retirer le badge" check_email: "vérifier l'adresse courriel" @@ -3128,6 +3223,8 @@ fr: create_category: "créer une catégorie" silence_user: "mettre l'utilisateur sous silence" unsilence_user: "annuler la mise sous silence de l'utilisateur" + removed_silence_user: "mettre l'utilisateur sous silence (enlevé)" + removed_unsilence_user: "annuler la mise sous silence de l'utilisateur (enlevé)" grant_admin: "accorder les droits d'administration" revoke_admin: "révoquer les droits d'administration" grant_moderation: "Accorder les droits de modération" @@ -3149,12 +3246,14 @@ fr: post_edit: "message modifié" post_unlocked: "message dévérouillé" check_personal_message: "contrôler messages directs" - disabled_second_factor: "désactiver l'authentification à deux facteurs" + disabled_second_factor: "désactiver l'authentification à deux étapes" topic_published: "sujet publié" post_approved: "message approuvé" + post_rejected: "message rejeté" create_badge: "créer un badge" - change_badge: "Modifier un badge" + change_badge: "modifier un badge" delete_badge: "supprimer un badge" + merge_user: "fusionne utilisateur" screened_emails: title: "Courriels affichés" description: "Lorsque quelqu'un essaye de créer un nouveau compte, les adresses de courriel suivantes seront vérifiées et l'inscription sera bloquée, ou une autre action sera réalisée." @@ -3206,8 +3305,8 @@ fr: clear_filter: "Vider" show_words: "Afficher les mots" word_count: - one: 1 mot - other: '%{count} mots' + one: "1 mot" + other: "%{count} mots" actions: block: 'Bloquer' censor: 'Censurer' @@ -3251,11 +3350,11 @@ fr: staged: 'Distant' approved: "Approuvé ?" approved_selected: - one: approuver l'utilisateur - other: approuver les utilisateurs ({{count}}) + one: "approuver l'utilisateur" + other: "approuver les utilisateurs ({{count}})" reject_selected: - one: utilisateur rejeté - other: utilisateurs rejetés ({{count}}) + one: "utilisateur rejeté" + other: "utilisateurs rejetés ({{count}})" titles: active: 'Utilisateurs actifs' new: 'Nouveaux utilisateurs' @@ -3273,11 +3372,11 @@ fr: suspect: 'Utilisateurs suspects' staged: 'Utilisateurs distants' reject_successful: - one: Utilisateur rejeté avec succès. - other: '%{count} utilisateurs rejetés avec succès.' + one: "Utilisateur rejeté avec succès." + other: "%{count} utilisateurs rejetés avec succès." reject_failures: - one: Utilisateur dont le rejet a échoué. - other: '%{count} utilisateurs dont le rejet a échoué.' + one: "Utilisateur dont le rejet a échoué." + other: "%{count} utilisateurs dont le rejet a échoué." not_verified: "Non verifié" check_email: title: "Afficher l'adresse courriel de cet utilisateur" @@ -3308,6 +3407,10 @@ fr: penalty_post_delete: "Supprimer le message" penalty_post_edit: "Modifier le message" penalty_post_none: "Ne rien faire" + penalty_count: "Décompte pénalités" + clear_penalty_history: + title: "Effacer historique des pénalités" + description: "les utilisateurs ayant des pénalités ne peuvent pas atteindre le niveau de confiance 3" delete_all_posts_confirm_MF: "Vous êtes sur le point de supprimer {POSTS, plural, one {1 message} other {# messages}} et {TOPICS, plural, one {1 sujet} other {# sujets}}. Êtes-vous sûr ?" silence: "Mettre sous silence" unsilence: "Ne pas mettre sous silence" @@ -3343,7 +3446,7 @@ fr: private_topics_count: Sujets privés posts_read_count: Messages lus post_count: Messages créés - second_factor_enabled: Authentification à deux facteurs activée + second_factor_enabled: Authentification à deux étapes activée topics_entered: Sujets vus flags_given_count: Signalements effectués flags_received_count: Signalements reçus @@ -3362,14 +3465,14 @@ fr: delete_forbidden_because_staff: "Administrateurs et modérateurs ne peuvent pas être supprimés." delete_posts_forbidden_because_staff: "Vous ne pouvez pas supprimer tous les messages des administrateurs et des modérateurs." delete_forbidden: - one: Les utilisateurs ne peuvent pas être supprimés s'ils ont posté des messages Supprimer tous les messages avant d'essayer de supprimer un utilisateur. (Les messages plus vieux que %{count} jour ne peut pas être supprimé.) - other: Les utilisateurs ne peuvent pas être supprimés s'ils ont crée des messages. Supprimer tous les messages avant d'essayer de supprimer un utilisateur. (Les messages plus vieux que %{count} jours ne peuvent pas être supprimés.) + one: "Les utilisateurs ne peuvent pas être supprimés s'ils ont posté des messages Supprimer tous les messages avant d'essayer de supprimer un utilisateur. (Les messages plus vieux que %{count} jour ne peut pas être supprimé.)" + other: "Les utilisateurs ne peuvent pas être supprimés s'ils ont crée des messages. Supprimer tous les messages avant d'essayer de supprimer un utilisateur. (Les messages plus vieux que %{count} jours ne peuvent pas être supprimés.)" cant_delete_all_posts: - one: Impossible de supprimer tout les messages. Certains messages sont âgés de plus de %{count} jour. (voir l'option delete_user_max_post_age) - other: Impossible de supprimer tout les messages. Certains messages sont âgés de plus de %{count} jours. (voir l'option delete_user_max_post_age) + one: "Impossible de supprimer tout les messages. Certains messages sont âgés de plus de %{count} jour. (voir l'option delete_user_max_post_age)" + other: "Impossible de supprimer tout les messages. Certains messages sont âgés de plus de %{count} jours. (voir l'option delete_user_max_post_age)" cant_delete_all_too_many_posts: - one: Impossible de supprimer tous les messages parce que l'utilisateur a plus d'un message. (delete_all_posts_max) - other: Impossible de supprimer tous les messages parce que l'utilisateur a plus de %{count} messages. (delete_all_posts_max) + one: "Impossible de supprimer tous les messages parce que l'utilisateur a plus d'un message. (delete_all_posts_max)" + other: "Impossible de supprimer tous les messages parce que l'utilisateur a plus de %{count} messages. (delete_all_posts_max)" delete_confirm: "Êtes-vous SÛR de vouloir supprimer cet utilisateur ? Cette action est irréversible !" delete_and_block: "Supprimer et bloquer cette adresse de courriel et adresse IP." delete_dont_block: "Supprimer uniquement" @@ -3411,8 +3514,8 @@ fr: tl3_requirements: title: "Pré-requis pour le niveau de confiance 3" table_title: - one: 'Lors du dernier jour :' - other: 'Lors des %{count} derniers jours :' + one: "Lors du dernier jour :" + other: "Lors des %{count} derniers jours :" value_heading: "Valeur" requirement_heading: "Pré-requis" visits: "Visites" @@ -3499,6 +3602,14 @@ fr: clear_filter: "Effacer" add_url: "ajouter URL" add_host: "ajouter hôte" + uploaded_image_list: + label: "Modifier la liste" + empty: "Il n'y a aucune image pour le moment. Veuillez en envoyer une." + upload: + label: "Envoyer" + title: "Envoyer des images" + selectable_avatars: + title: "Liste d'avatars que les utilisateurs peuvent choisir" categories: all_results: 'Toutes' required: 'Requis' @@ -3587,8 +3698,8 @@ fr: text: "Certains badges n'ont pas été décernés. Ceci se produit lorsque la requête du badge retourne des identifiants d'utilisateurs ou de messages qui n’existent plus. Cela peut produire des résultats non attendus - veuillez vérifier votre requête." no_grant_count: "Aucun badge à assigner." grant_count: - one: 1 badge à assigner. - other: %{count} badges à assigner. + one: "1 badge à assigner." + other: "%{count} badges à assigner." sample: "Exemple :" grant: with: "%{username}" @@ -3653,10 +3764,11 @@ fr: step: "%{current} sur %{total}" upload: "Envoi" uploading: "Envoi en cours…" + upload_error: "Désolé, il y a eu une erreur à l'envoi de ce fichier. Veuillez réessayer." quit: "Peut-être plus tard" staff_count: - one: Votre communauté a 1 responsable (vous). - other: Votre communauté a %{count} responsables, dont vous. + one: "Votre communauté a 1 responsable (vous)." + other: "Votre communauté a %{count} responsables, dont vous." invites: add_user: "ajouter" none_added: "Vous n'avez invité aucun responsable. Êtes-vous sûr de vouloir continuer ?" @@ -3664,3 +3776,7 @@ fr: admin: "Administrateur" moderator: "Modérateur" regular: "Utilisateur" + previews: + topic_title: "Sujet de discussion" + share_button: "Partager" + reply_button: "Répondre" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 29828cac17..f18a124759 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -43,62 +43,62 @@ gl: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_years: - one: 1ano - other: '%{count}anos' + one: "1ano" + other: "%{count}anos" over_x_years: - one: '> 1ano' - other: '> %{count}anos' + one: "> 1ano" + other: "> %{count}anos" almost_x_years: - one: 1ano - other: '%{count}anos' + one: "1ano" + other: "%{count}anos" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} mins' + one: "1 min" + other: "%{count} mins" x_hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" x_days: - one: 1 día - other: '%{count} días' + one: "1 día" + other: "%{count} días" date_year: "D MMM, 'YY" medium_with_ago: x_minutes: - one: Hai 1 min. - other: Hai %{count} min. + one: "Hai 1 min." + other: "Hai %{count} min." x_hours: - one: Hai 1 hora - other: Hai %{count} horas + one: "Hai 1 hora" + other: "Hai %{count} horas" x_days: - one: Hai 1 día - other: Hai %{count} días + one: "Hai 1 día" + other: "Hai %{count} días" later: x_days: - one: 1 día despois - other: '%{count} días despois' + one: "1 día despois" + other: "%{count} días despois" x_months: - one: 1 mes despois - other: '%{count} meses despois' + one: "1 mes despois" + other: "%{count} meses despois" x_years: - one: 1 anos despois - other: '%{count} anos despois' + one: "1 anos despois" + other: "%{count} anos despois" previous_month: 'Mes anterior' next_month: 'Mes seguinte' placeholder: data @@ -172,13 +172,13 @@ gl: show_help: "opcións" links: "Ligazóns" links_lowercase: - one: ligazón - other: ligazóns + one: "ligazón" + other: "ligazóns" faq: "FAQ" guidelines: "Directrices" privacy_policy: "Normas de confidencialidade" privacy: "Confidencialidade" - terms_of_service: "Termos do servizo" + tos: "Termos do servizo" mobile_view: "Visualización móbil" desktop_view: "Visualización en escritorio" you: "Ti" @@ -197,8 +197,8 @@ gl: max_of_count: "máx. de {{count}}" alternation: "ou" character_count: - one: '{{count}} carácter' - other: '{{count}} caracteres' + one: "{{count}} carácter" + other: "{{count}} caracteres" suggested_topics: title: "Temas suxeridos" pm_title: "Mensaxes suxeridas" @@ -264,16 +264,16 @@ gl: cancel: "Cancelar" view_pending: "ver as publicacións pendentes" has_pending_posts: - one: Este tema ten {{count}} publicación agardando aprobación - other: Este tema ten {{count}} publicacións agardando aprobación. + one: "Este tema ten {{count}} publicación agardando aprobación" + other: "Este tema ten {{count}} publicacións agardando aprobación." confirm: "Gardar os cambios" delete_prompt: "Confirmas a eliminación de %{username}? Eliminaranse todas as súas publicacións e bloquearase o seu correo electrónico e enderezo IP." approval: title: "A publicación necesita aprobación" description: "Recibimos a túa nova publicación pero cómpre que sexa aprobada por un moderador antes de aparecer. Ten paciencia." pending_posts: - one: Tes {{count}} publicación pendente. - other: Tes {{count}} publicacións pendentes. + one: "Tes {{count}} publicación pendente." + other: "Tes {{count}} publicacións pendentes." ok: "De acordo" user_action: user_posted_topic: "{{user}} publicou o tema" @@ -305,8 +305,8 @@ gl: posts_read: "Lidas" posts_read_long: "Publicacións lidas" total_rows: - one: Un usuario - other: '%{count} usuarios' + one: "Un usuario" + other: "%{count} usuarios" groups: add: "Engadir" owner: "propietario" @@ -355,8 +355,6 @@ gl: reorder: title: "Reordenar as categorías" title_long: "Reorganizar a lista de categorías" - fix_order: "Fixar as posicións" - fix_order_tooltip: "Non todas as categorías teñen un número de posición único, e iso pode causar resultados inesperados." save: "Gardar orde" apply_all: "Aplicar" position: "Posición" @@ -367,8 +365,8 @@ gl: toggle_ordering: "trocar o control de ordenación" subcategories: "Subcategorías" topic_stat_sentence: - one: '%{count} tema novo no último %{unit}.' - other: '%{count} temas novos no último %{unit}.' + one: "%{count} tema novo no último %{unit}." + other: "%{count} temas novos no último %{unit}." ip_lookup: title: Busca do enderezo IP hostname: Nome do servidor @@ -483,7 +481,6 @@ gl: upload_title: "Envía a túa imaxe" upload_picture: "Enviar imaxe" image_is_not_a_square: "Aviso: recortamos a túa imaxe; a largura e a altura eran distintas." - cache_notice: "Cambiaches correctamente a túa imaxe do perfil pero quizais tarde un chisco en aparecer debido á xestión da caché do navegador." change_profile_background: title: "Fondo do perfil" instructions: "Os fondos dos perfís centraranse e terán unha largura predeterminada de 850px." @@ -497,8 +494,8 @@ gl: authenticated: "O teu enderezo de correo electrónico foi autenticado por {{provider}}" frequency_immediately: "Enviarémosche un correo-e axiña se non liches sobre o que che estamos a enviar." frequency: - one: Só che eviaremos un correo-e se non te vimos no último minuto. - other: Só che eviaremos un correo-e se non te vimos nos últimos {{count}} minutos. + one: "Só che eviaremos un correo-e se non te vimos no último minuto." + other: "Só che eviaremos un correo-e se non te vimos nos últimos {{count}} minutos." name: title: "Nome" instructions_required: "Nome completo" @@ -576,8 +573,8 @@ gl: user: "Usuario convidado" sent: "Enviado" truncated: - one: Amosando o primeiro convite. - other: Amosando os primeiros {{count}} convites. + one: "Amosando o primeiro convite." + other: "Amosando os primeiros {{count}} convites." redeemed: "Convites utilizados" redeemed_tab: "Utilizados" redeemed_tab_with_count: "Utilizados ({{count}})" @@ -616,7 +613,6 @@ gl: more_topics: "Máis temas" top_badges: "Insignias principais" more_badges: "Máis insignias" - associated_accounts: "Accesos" ip_address: title: "Último enderezo IP" registration_ip_address: @@ -684,8 +680,6 @@ gl: hide_session: "Lembrarmo mañá" hide_forever: "non grazas" hidden_for_session: "De acordo, preguntareicho mañá. Tamén podes usar «Iniciar sesión» para crear unha conta." - intro: "Ei! :heart_eyes: Semella que gozas coa discusión pero non abriches ningunha conta." - value_prop: "Cando creas unha conta, lembramos exactamente o que liches. Deste xeito sempre volves exactamente onde o deixaches. Podes recibir notificación aquí e vía correo electrónico sempre que se fagan publicacións. E podes darlle a Gústame nas publicacións para compartir o cariño. :heartbeat: " summary: enabled_description: "Estás vendo un resumo deste tema: as publicacións máis interesantes determinadas pola comunidade" description: "Hai {{replyCount}} respostas." @@ -699,7 +693,6 @@ gl: disable: "Amosar as publicacións eliminadas" private_message_info: title: "Mensaxe" - invite: "Convidar a outros..." remove_allowed_user: "Confirmas a eliminación de {{name}} desta mensaxe?" email: 'Correo electrónico' username: 'Nome do usuario' @@ -745,9 +738,6 @@ gl: to_continue: "Por favor, inicia sesión" preferences: "Precisas iniciar sesión para cambiar as túas preferencias de usuario." forgot: "Non lembro os detalles da miña conta" - google: - title: "co Google" - message: "Autenticación mediante Google (asegúrate de ter desactivado o bloqueador de xanelas emerxentes)" google_oauth2: title: "co Google" message: "Autenticación mediante Google (asegúrate de ter desactivado o bloqueador de xanelas emerxentes)" @@ -899,8 +889,8 @@ gl: archive_topics: "Arquivar temas" choose_new_category: "Seleccionar a nova categoría dos temas:" selected: - one: Seleccionaches un tema. - other: Seleccionaches {{count}} temas. + one: "Seleccionaches un tema." + other: "Seleccionaches {{count}} temas." none: unread: "Non tes temas sen ler." new: "Non tes novos temas." @@ -940,10 +930,10 @@ gl: new: 'novo tema' unread: 'sen ler' new_topics: - one: Un tema novo + one: 'Un tema novo' other: '{{count}} temas novos' unread_topics: - one: Un tema sen ler + one: 'Un tema sen ler' other: '{{count}} temas sen ler' title: 'Tema' invalid_access: @@ -957,17 +947,17 @@ gl: title: "Non foi posíbel atopar o tema" description: "Sentímolo pero non foi posíbel atopar este tema. Quizais foi eliminado por un moderador." total_unread_posts: - one: Tes unha publicación sen ler neste tema - other: Tes {{count}} publicacións sen ler neste tema + one: "Tes unha publicación sen ler neste tema" + other: "Tes {{count}} publicacións sen ler neste tema" unread_posts: - one: Tes unha publicación antiga sen ler neste tema - other: Tes {{count}} publicacións antigas sen ler neste tema + one: "Tes unha publicación antiga sen ler neste tema" + other: "Tes {{count}} publicacións antigas sen ler neste tema" new_posts: - one: hai unha nova publicación neste tema desde a túa última lectura - other: hai {{count}} novas publicacións neste tema desde a túa última lectura + one: "hai unha nova publicación neste tema desde a túa última lectura" + other: "hai {{count}} novas publicacións neste tema desde a túa última lectura" likes: - one: hai un gústame neste tema - other: hai {{count}} gústames neste tema + one: "hai un gústame neste tema" + other: "hai {{count}} gústames neste tema" back_to_list: "Volver á lista de temas" options: "Opcións de temas" show_links: "amosar as ligazóns cara este tema" @@ -1066,8 +1056,8 @@ gl: pin_validation: "Requírese unha data para pegar este tema." not_pinned: "Non hai temas pegados en {{categoryLink}}." already_pinned: - one: 'Temas pegados actualmente en {{categoryLink}}: 1' - other: 'Temas pegados actualmente en {{categoryLink}}: {{count}}' + one: "Temas pegados actualmente en {{categoryLink}}: 1" + other: "Temas pegados actualmente en {{categoryLink}}: {{count}}" pin_globally: "Facer que este tema apareza no alto de todas as listas de temas até" confirm_pin_globally: "Xa tes {{count}} temas pegados globalmente. Demasiados temas pegados pode resultar pesado para usuarios novos e anónimos. Confirmas que queres pegar outro tema globalmente?" unpin_globally: "Eliminar este tema da banda superior de todas as listas de temas." @@ -1075,8 +1065,8 @@ gl: global_pin_note: "Os usuarios poden despegar o tema por si mesmos." not_pinned_globally: "Non hai temas pegados globalmente." already_pinned_globally: - one: 'Temas pegados globalmente neste intre: 1' - other: 'Temas pegados globalmente neste intre: {{count}}' + one: "Temas pegados globalmente neste intre: 1" + other: "Temas pegados globalmente neste intre: {{count}}" make_banner: "Facer deste tema un báner que apareza na banda superior de todas as páxinas." remove_banner: "Eliminar o báner que aparece na banda superior de todas as páxinas." banner_note: "Os usuarios poden desbotar un báner se o pechan. Unicamente pode haber un tema que sexa un báner ao mesmo tempo." @@ -1110,8 +1100,8 @@ gl: login_reply: 'Inicia sesión para responder' filters: n_posts: - one: Unha publicación - other: '{{count}} publicacións' + one: "Unha publicación" + other: "{{count}} publicacións" cancel: "Eliminar filtro" split_topic: title: "Mover ao tema novo" @@ -1119,15 +1109,15 @@ gl: topic_name: "Nome do tema novo" error: "Produciuse un erro movendo as publicacións ao novo tema." instructions: - one: Vas crear un novo tema e enchelo coa publicación que seleccionaches. - other: Vas crear un novo tema e enchelo coas {{count}} publicacións que seleccionaches. + one: "Vas crear un novo tema e enchelo coa publicación que seleccionaches." + other: "Vas crear un novo tema e enchelo coas {{count}} publicacións que seleccionaches." merge_topic: title: "Mover a un tema existente" action: "mover a un tema existente" error: "Produciuse un erro movendo publicacións nese tema." instructions: - one: Selecciona o tema ao que queres mover esta publicación. - other: Selecciona o tema ao que queres mover estas {{count}} publicacións. + one: "Selecciona o tema ao que queres mover esta publicación." + other: "Selecciona o tema ao que queres mover estas {{count}} publicacións." change_owner: title: "Cambiar propietario das publicacións" action: "cambiar propiedade" @@ -1135,8 +1125,8 @@ gl: label: "Novo propietario das publicacións" placeholder: "nome do usuario do novo propietario" instructions: - one: Selecciona o novo propietario da publicación de {{old_user}}. - other: Selecciona o novo propietario das {{count}} publicacións de {{old_user}}. + one: "Selecciona o novo propietario da publicación de {{old_user}}." + other: "Selecciona o novo propietario das {{count}} publicacións de {{old_user}}." change_timestamp: action: "cambiar a marca data/hora" invalid_timestamp: "A marca data/hora non pode ser no futuro." @@ -1151,7 +1141,7 @@ gl: deselect_all: deseleccionar todo description: one: Seleccionaches unha publicación. - other: Seleccionaches {{count}} publicacións. + other: "Seleccionaches {{count}} publicacións." post: edit_reason: "Razón:" post_number: "publicación {{number}}" @@ -1162,26 +1152,26 @@ gl: show_full: "Amosar a publicación completa" show_hidden: 'Ver o contido oculto.' deleted_by_author: - one: (as publicacións retiradas polo autor serán automaticamente eliminadas en %{count} hora, excepto que fosen denunciadas) - other: (as publicacións retiradas polo autor serán automaticamente eliminadas en %{count} horas, excepto que fosen denunciadas) + one: "(as publicacións retiradas polo autor serán automaticamente eliminadas en %{count} hora, excepto que fosen denunciadas)" + other: "(as publicacións retiradas polo autor serán automaticamente eliminadas en %{count} horas, excepto que fosen denunciadas)" expand_collapse: "ampliar/reducir" gap: - one: ver unha resposta oculta - other: ver {{count}} respostas ocultas + one: "ver unha resposta oculta" + other: "ver {{count}} respostas ocultas" unread: "Publicación sen ler" has_replies: - one: '{{count}} resposta' - other: '{{count}} respostas' + one: "{{count}} resposta" + other: "{{count}} respostas" has_likes: - one: '{{count}} gústame' - other: '{{count}} gústames' + one: "{{count}} gústame" + other: "{{count}} gústames" has_likes_title: - one: A unha persoa gustoulle esta publicación - other: A {{count}} persoas gustoulles esta publicación + one: "A unha persoa gustoulle esta publicación" + other: "A {{count}} persoas gustoulles esta publicación" has_likes_title_only_you: "gustouche esta publicación" has_likes_title_you: - one: A ti e a outro máis gustouvos esta publicación - other: A ti e a {{count}} persoas máis gustouvos esta publicación + one: "A ti e a outro máis gustouvos esta publicación" + other: "A ti e a {{count}} persoas máis gustouvos esta publicación" errors: create: "Sentímolo pero produciuse un erro creando a publicación. Téntao de novo." edit: "Sentímolo pero produciuse un erro editando a publicación. Téntao de novo." @@ -1226,7 +1216,6 @@ gl: inappropriate: "Desfacer denuncia" bookmark: "Desfacer marcador" like: "Desfacer o gústame" - vote: "Desfacer voto" people: off_topic: "notificado como sen relación co tema" spam: "denunciou isto como spam" @@ -1235,7 +1224,6 @@ gl: notify_user: "enviou unha mensaxe" bookmark: "marcou isto" like: "gustou disto" - vote: "votou por isto" by_you: off_topic: "Informaches disto como non relacionado" spam: "Denunciaches isto como spam" @@ -1244,57 +1232,50 @@ gl: notify_user: "Enviaches unha mensaxe a este usuario" bookmark: "Marcaches esta publicación" like: "Gustouche isto" - vote: "Votaches esta publicación" by_you_and_others: off_topic: - one: Ti e outro máis informastes disto como non relacionado - other: Ti e {{count}} máis informastes disto como non relacionado + one: "Ti e outro máis informastes disto como non relacionado" + other: "Ti e {{count}} máis informastes disto como non relacionado" spam: - one: Ti e outro máis denunciastes isto como spam - other: Ti e {{count}} máis denunciastes isto com spam + one: "Ti e outro máis denunciastes isto como spam" + other: "Ti e {{count}} máis denunciastes isto com spam" inappropriate: - one: Ti e outro máis denunciastes isto como inapropiado - other: Ti e {{count}} máis denunciastes isto como inapropiado + one: "Ti e outro máis denunciastes isto como inapropiado" + other: "Ti e {{count}} máis denunciastes isto como inapropiado" notify_moderators: - one: Ti e outro máis denunciastes isto para moderación - other: Ti e {{count}} máis denunciastes isto para moderación + one: "Ti e outro máis denunciastes isto para moderación" + other: "Ti e {{count}} máis denunciastes isto para moderación" notify_user: - one: Ti e unha persoa máis enviastes unha mensaxe a este usuario - other: Ti e {{count}} persoas máis enviastes unha mensaxe a este usuario + one: "Ti e unha persoa máis enviastes unha mensaxe a este usuario" + other: "Ti e {{count}} persoas máis enviastes unha mensaxe a este usuario" bookmark: - one: Ti e outra persoa marcastes esta publicación - other: Ti e {{count}} persoas máis marcastes esta publicación + one: "Ti e outra persoa marcastes esta publicación" + other: "Ti e {{count}} persoas máis marcastes esta publicación" like: - one: A ti e a un máis gustouvos isto - other: A ti e a {{count}} máis gustouvos isto - vote: - one: Ti e outra persoa votastes esta publicación - other: Ti e {{count}} persoas máis votastes esta publicación + one: "A ti e a un máis gustouvos isto" + other: "A ti e a {{count}} máis gustouvos isto" by_others: off_topic: - one: Unha persoa marcou isto como non relacionado - other: '{{count}} persoas informaron disto como non relacionado' + one: "Unha persoa marcou isto como non relacionado" + other: "{{count}} persoas informaron disto como non relacionado" spam: - one: Unha persoa marcou isto como spam - other: '{{count}} persoas denunciaron isto como spam' + one: "Unha persoa marcou isto como spam" + other: "{{count}} persoas denunciaron isto como spam" inappropriate: - one: Unha persoa denunciou isto como inapropiado - other: '{{count}} persoas denunciaron isto como inapropiado' + one: "Unha persoa denunciou isto como inapropiado" + other: "{{count}} persoas denunciaron isto como inapropiado" notify_moderators: - one: Unha persoa denunciou isto para moderación - other: '{{count}} persoas denunciaron isto para moderación' + one: "Unha persoa denunciou isto para moderación" + other: "{{count}} persoas denunciaron isto para moderación" notify_user: - one: Unha persoa enviou unha mensaxe a este usuario - other: '{{count}} persoas enviaron unha mensaxe a este usuario' + one: "Unha persoa enviou unha mensaxe a este usuario" + other: "{{count}} persoas enviaron unha mensaxe a este usuario" bookmark: - one: Unha persoa marcou esta publicación - other: '{{count}} persoas marcaron esta publicación' + one: "Unha persoa marcou esta publicación" + other: "{{count}} persoas marcaron esta publicación" like: - one: A unha persoa gustoulle isto - other: A {{count}} persoas gustoulles isto - vote: - one: Unha persoa votou por esta publicación - other: '{{count}} persoas votaron por esta publicación' + one: "A unha persoa gustoulle isto" + other: "A {{count}} persoas gustoulles isto" revisions: controls: first: "Primeira revisión" @@ -1316,7 +1297,6 @@ gl: can: 'podes… ' none: '(sen categoría)' all: 'Todas as categorías' - choose: 'Seleccionar unha categoría…' edit: 'editar' edit_long: "Editar" view: 'Ver os Temas na Categoría' @@ -1358,7 +1338,6 @@ gl: edit_permissions: "Editar permisos" add_permission: "Engadir permisos" this_year: "este ano" - position: "posición" default_position: "Posición predeterminada" position_disabled: "As categorías amosaranse en orde de actividade. Para controlar a orde das categorías nas listas." position_disabled_click: 'activar o axuste «fixed category positions».' @@ -1402,8 +1381,8 @@ gl: participants_title: "Publicadores frecuentes" links_title: "Ligazóns populares" clicks: - one: Un clic - other: '%{count} clics' + one: "Un clic" + other: "%{count} clics" topic_statuses: warning: help: "Este é un aviso oficial." @@ -1437,19 +1416,19 @@ gl: original_post: "Publicación orixinal" views: "Vistas" views_lowercase: - one: vista - other: vistas + one: "vista" + other: "vistas" replies: "Respostas" activity: "Actividade" likes: "Gústames" likes_lowercase: - one: gústame - other: gústames + one: "gústame" + other: "gústames" likes_long: "hai {{number}} gústames neste tema" users: "Usuarios" users_lowercase: - one: usuario - other: usuarios + one: "usuario" + other: "usuarios" category_title: "Categoría" history: "Historial" changed_by: "por {{author}}" @@ -1462,8 +1441,8 @@ gl: latest: title: "Últimos" title_with_count: - one: Último (1) - other: ({{count}}) últimos + one: "Último (1)" + other: "({{count}}) últimos" help: "temas con publicacións recentes" hot: title: "Quentes" @@ -1481,21 +1460,21 @@ gl: unread: title: "Sen ler" title_with_count: - one: Un sen ler - other: ({{count}}) sen ler + one: "Un sen ler" + other: "({{count}}) sen ler" help: "temas con publicacións sen ler que estás vendo ou seguindo" lower_title_with_count: - one: Unha sen ler - other: '{{count}} sen ler' + one: "Unha sen ler" + other: "{{count}} sen ler" new: lower_title_with_count: - one: Un novo - other: '{{count}} novos' + one: "Un novo" + other: "{{count}} novos" lower_title: "novo" title: "Novo" title_with_count: - one: Un novo - other: ({{count}}) novos + one: "Un novo" + other: "({{count}}) novos" help: "temas creados nos últimos días" posted: title: "As miñas publicacións" @@ -1506,8 +1485,8 @@ gl: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "últimos temas na categoría {{categoryName}}" top: title: "Destacados" @@ -1832,7 +1811,6 @@ gl: address_placeholder: "nome@exemplo.com" type_placeholder: "compendio, rexistro..." reply_key_placeholder: "tecla para responder" - skipped_reason_placeholder: "razón" logs: title: "Rexistros" action: "Acción" @@ -1942,11 +1920,11 @@ gl: suspect: 'Sospeitoso' approved: "Aprobado?" approved_selected: - one: aprobar usuario - other: aprobar os ({{count}}) usuarios + one: "aprobar usuario" + other: "aprobar os ({{count}}) usuarios" reject_selected: - one: rexeitar usuario - other: rexeitar os ({{count}}) usuarios + one: "rexeitar usuario" + other: "rexeitar os ({{count}}) usuarios" titles: active: 'Usuarios activos' new: 'Novos usuarios' @@ -1962,11 +1940,11 @@ gl: suspended: 'Usuarios suspendidos' suspect: 'Usuarios sospeitosos' reject_successful: - one: Rexeitouse un usuario correctamente. - other: Rexeitáronse %{count} usuarios correctamente. + one: "Rexeitouse un usuario correctamente." + other: "Rexeitáronse %{count} usuarios correctamente." reject_failures: - one: Produciuse un fallo rexeitando o usuario. - other: Produciuse un fallo rexeitando os %{count} usuarios. + one: "Produciuse un fallo rexeitando o usuario." + other: "Produciuse un fallo rexeitando os %{count} usuarios." not_verified: "Sen verificar" check_email: title: "Amosar o enderezo de correo-e deste usuario" @@ -2023,14 +2001,14 @@ gl: delete_forbidden_because_staff: "Non é posíbel eliminiar os administradores e moderadores." delete_posts_forbidden_because_staff: "Non é posíbel eliminar todas as publicacións dos administradores ou moderadores." delete_forbidden: - one: Non é posíbel eliminar usuarios se teñen publicacións. Elimina as publicacións antes de eliminar o usuario (non é posíbel eliminar publicacións de máis de %{count} día) - other: Non é posíbel eliminar usuarios se teñen publicacións. Elimina as publicacións antes de eliminar o usuario (non é posíbel eliminar publicacións de máis de %{count} días) + one: "Non é posíbel eliminar usuarios se teñen publicacións. Elimina as publicacións antes de eliminar o usuario (non é posíbel eliminar publicacións de máis de %{count} día)" + other: "Non é posíbel eliminar usuarios se teñen publicacións. Elimina as publicacións antes de eliminar o usuario (non é posíbel eliminar publicacións de máis de %{count} días)" cant_delete_all_posts: - one: Non é posíbel eliminar todas as publicacións. Algunhas teñen máis de %{count} día. (o axuste delete_user_max_post_age.) - other: Non é posíbel eliminar todas as publicacións. Algunhas teñen máis de %{count} días. (o axuste delete_user_max_post_age.) + one: "Non é posíbel eliminar todas as publicacións. Algunhas teñen máis de %{count} día. (o axuste delete_user_max_post_age.)" + other: "Non é posíbel eliminar todas as publicacións. Algunhas teñen máis de %{count} días. (o axuste delete_user_max_post_age.)" cant_delete_all_too_many_posts: - one: Non é posíbel eliminar todas as publicacións porque o usuario ten máis dunha publicación. (delete_all_posts_max) - other: Non é posíbel eliminar todas as publicacións porque o usuario ten máis de %{count} publicacións. (delete_all_posts_max) + one: "Non é posíbel eliminar todas as publicacións porque o usuario ten máis dunha publicación. (delete_all_posts_max)" + other: "Non é posíbel eliminar todas as publicacións porque o usuario ten máis de %{count} publicacións. (delete_all_posts_max)" delete_confirm: "CONFIRMAS a eliminación deste usuario? Non se poderá desfacer!" delete_and_block: "Eliminar e bloquear este correo-e e enderezo IP" delete_dont_block: "Só eliminar" @@ -2209,8 +2187,8 @@ gl: text: "Faltan algunhas mostras para a concesión da insignia. Isto acontece cando a consulta sobre insignias devolve unha ID do usuario, ou de publicacións que non existen. Pode causar resultados inesperados posteriormente. Revisa outra vez a solicitude." no_grant_count: "Non hai insignias para asignar." grant_count: - one: 1 insignia para asignar. - other: %{count} insignias para asignar. + one: "1 insignia para asignar." + other: "%{count} insignias para asignar." sample: "Mostra:" grant: with: "%{username}" diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 70861d4ae9..e0c0003bf5 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -16,10 +16,10 @@ he: format: '%n %u' units: byte: - many: ×‘×ª×™× one: בית - other: ×‘×ª×™× two: ×‘×ª×™× + many: ×‘×ª×™× + other: ×‘×ª×™× gb: ג״ב kb: ק״ב mb: מ״ב @@ -45,98 +45,99 @@ he: tiny: half_a_minute: "פחות מדקה" less_than_x_seconds: - many: פחות מ־%{count} שניות - one: פחות משנייה - other: פחות מ־%{count} שניות - two: פחות מ־%{count} שניות + one: "פחות משנייה" + two: "פחות מ־%{count} שניות" + many: "פחות מ־%{count} שניות" + other: "פחות מ־%{count} שניות" x_seconds: - many: '%{count} שניות' - one: שנייה ×חת - other: '%{count} שניות' - two: '%{count} שניות' + one: "שנייה ×חת" + two: "%{count} שניות" + many: "%{count} שניות" + other: "%{count} שניות" x_minutes: - many: '%{count} דקות' - one: דקה ×חת - other: '%{count} דקות' - two: '%{count} דקות' + one: "דקה ×חת" + two: "%{count} דקות" + many: "%{count} דקות" + other: "%{count} דקות" about_x_hours: - many: '%{count} שעות' - one: שעה ×חת - other: '%{count} שעות' - two: '%{count} שעות' + one: "שעה ×חת" + two: "%{count} שעות" + many: "%{count} שעות" + other: "%{count} שעות" x_days: - many: '%{count} ימי×' - one: ×™×•× ×חד - other: '%{count} ימי×' - two: '%{count} ימי×' + one: "×™×•× ×חד" + two: "%{count} ימי×" + many: "%{count} ימי×" + other: "%{count} ימי×" about_x_years: - many: '%{count} שני×' - one: שנה ×חת - other: '%{count} שני×' - two: '%{count} שני×' + one: "שנה ×חת" + two: "%{count} שני×" + many: "%{count} שני×" + other: "%{count} שני×" over_x_years: - many: יותר מ־%{count} ×©× ×™× - one: יותר משנה - other: יותר מ־%{count} ×©× ×™× - two: יותר מ־%{count} ×©× ×™× + one: "יותר משנה" + two: "יותר מ־%{count} שני×" + many: "יותר מ־%{count} שני×" + other: "יותר מ־%{count} שני×" almost_x_years: - many: '%{count} שני×' - one: שנה ×חת - other: '%{count} שני×' - two: '%{count} שני×' + one: "שנה ×חת" + two: "%{count} שני×" + many: "%{count} שני×" + other: "%{count} שני×" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - many: '%{count} דקות' - one: דקה ×חת - other: '%{count} דקות' - two: '%{count} דקות' + one: "דקה ×חת" + two: "%{count} דקות" + many: "%{count} דקות" + other: "%{count} דקות" x_hours: - many: '%{count} שעות' - one: שעה ×חת - other: '%{count} שעות' - two: '%{count} שעות' + one: "שעה ×חת" + two: "%{count} שעות" + many: "%{count} שעות" + other: "%{count} שעות" x_days: - many: '%{count} ימי×' - one: ×™×•× ×חד - other: '%{count} ימי×' - two: '%{count} ימי×' + one: "×™×•× ×חד" + two: "%{count} ימי×" + many: "%{count} ימי×" + other: "%{count} ימי×" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - many: לפני %{count} דקות - one: לפני דקה ×חת - other: לפני %{count} דקות - two: לפני %{count} דקות + one: "לפני דקה ×חת" + two: "לפני %{count} דקות" + many: "לפני %{count} דקות" + other: "לפני %{count} דקות" x_hours: - many: לפני %{count} שעות - one: לפני שעה ×חת - other: לפני %{count} שעות - two: לפני %{count} שעות + one: "לפני שעה ×חת" + two: "לפני %{count} שעות" + many: "לפני %{count} שעות" + other: "לפני %{count} שעות" x_days: - many: לפני %{count} ×™×ž×™× - one: ×תמול - other: לפני %{count} ×™×ž×™× - two: לפני %{count} ×™×ž×™× + one: "×תמול" + two: "לפני %{count} ימי×" + many: "לפני %{count} ימי×" + other: "לפני %{count} ימי×" later: x_days: - many: ×חרי %{count} ×™×ž×™× - one: ×חרי ×™×•× ×חד - other: ×חרי %{count} ×™×ž×™× - two: ×חרי %{count} ×™×ž×™× + one: "×חרי ×™×•× ×חד" + two: "×חרי %{count} ימי×" + many: "×חרי %{count} ימי×" + other: "×חרי %{count} ימי×" x_months: - many: ×חרי %{count} ×—×•×“×©×™× - one: ×חרי חודש ×חד - other: ×חרי %{count} ×—×•×“×©×™× - two: ×חרי %{count} ×—×•×“×©×™× + one: "×חרי חודש ×חד" + two: "×חרי %{count} חודשי×" + many: "×חרי %{count} חודשי×" + other: "×חרי %{count} חודשי×" x_years: - many: ×חרי %{count} ×©× ×™× - one: ×חרי שנה ×חת - other: ×חרי %{count} ×©× ×™× - two: ×חרי %{count} ×©× ×™× + one: "×חרי שנה ×חת" + two: "×חרי %{count} שני×" + many: "×חרי %{count} שני×" + other: "×חרי %{count} שני×" previous_month: 'חודש קוד×' next_month: 'חודש הב×' + placeholder: ת×ריך share: topic: 'שתפו קישור ×œ× ×•×©× ×–×”' post: 'פוסט #%{postNumber}' @@ -176,6 +177,7 @@ he: topic_admin_menu: "פעולות ניהול לנוש×" wizard_required: "×‘×¨×•×›×™× ×”×‘××™× ×œ×“×™×¡×§×•×¨×¡ החדש שלכ×! בו×ו נתחיל ×¢× ×שף ההתקנה ✨" emails_are_disabled: "כל הדו×״ל ×”×™×•×¦× × ×•×˜×¨×œ ב×ופן גורף על ידי מנהל ×תר. ×©×•× ×”×•×“×¢×ª דו×״ל, מכל סוג שהו×, ×œ× ×ª×©×œ×—." + bootstrap_mode_disabled: "מצב Bootstrap יבוטל תוך 24 שעות." themes: default_description: "ברירת מחדל" s3: @@ -211,15 +213,15 @@ he: show_help: "×פשרויות" links: "קישורי×" links_lowercase: - many: ×§×™×©×•×¨×™× - one: קישור - other: ×§×™×©×•×¨×™× - two: ×§×™×©×•×¨×™× + one: "קישור" + two: "קישורי×" + many: "קישורי×" + other: "קישורי×" faq: "ש×לות נפוצות" guidelines: "הנחיות" privacy_policy: "מדיניות פרטיות" privacy: "פרטיות" - terms_of_service: "תנ××™ השירות" + tos: "תנ××™ השירות" mobile_view: "תצוגת נייד" desktop_view: "תצוגת מחשב" you: "×ת×" @@ -238,10 +240,10 @@ he: max_of_count: "×ž×§×¡×™×ž×•× ×©×œ {{count}}" alternation: "×ו" character_count: - many: '{{count}} תווי×' - one: תו ×חד - other: '{{count}} תווי×' - two: '{{count}} תווי×' + one: "תו ×חד" + two: "{{count}} תווי×" + many: "{{count}} תווי×" + other: "{{count}} תווי×" suggested_topics: title: "נוש××™× ×ž×•×¦×¢×™×" pm_title: "הודעות מוצעות" @@ -308,20 +310,20 @@ he: cancel: "ביטול" view_pending: "הצג ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×" has_pending_posts: - many: ×‘× ×•×©× ×–×” ×™×©× × {{count}} ×¤×•×¡×˜×™× ×”×ž×ž×ª×™× ×™× ×œ×ישור - one: ' ×‘× ×•×©× ×–×” ישנו פוסט ×חד הממתין ל×ישור' - other: ×‘× ×•×©× ×–×” ×™×©× × {{count}} ×¤×•×¡×˜×™× ×”×ž×ž×ª×™× ×™× ×œ×ישור - two: ×‘× ×•×©× ×–×” ×™×©× × {{count}} ×¤×•×¡×˜×™× ×”×ž×ž×ª×™× ×™× ×œ×ישור + one: " ×‘× ×•×©× ×–×” ישנו פוסט ×חד הממתין ל×ישור" + two: "×‘× ×•×©× ×–×” ×™×©× × {{count}} ×¤×•×¡×˜×™× ×”×ž×ž×ª×™× ×™× ×œ×ישור" + many: "×‘× ×•×©× ×–×” ×™×©× × {{count}} ×¤×•×¡×˜×™× ×”×ž×ž×ª×™× ×™× ×œ×ישור" + other: "×‘× ×•×©× ×–×” ×™×©× × {{count}} ×¤×•×¡×˜×™× ×”×ž×ž×ª×™× ×™× ×œ×ישור" confirm: "שמירת שינויי×" - delete_prompt: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×—×•×§ ×ת %{username}? ×–×” ימחוק ×ת כל ×”×¤×•×¡×˜×™× ×©×œ×”× ×•×™×—×¡×•× ×ת המייל וכתובת ×” IP שלה×." + delete_prompt: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×”×¡×™×¨ ×ת %{username}? ×–×” יסיר ×ת כל ×”×¤×•×¡×˜×™× ×©×œ×”× ×•×™×—×¡×•× ×ת המייל וכתובת ×” IP שלה×." approval: title: "הפוסט זקוק ל×ישור" description: "קיבלנו ×ת הפוסט ×ך נדרש ×ישור של מנחה לפני ×©×”×•× ×™×•×¦×’, ×× × ×”×ž×ª×™× ×• בסבלנות." pending_posts: - many: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×. - one: יש ×œ×›× ×¤×•×¡×˜ ×חד שממתין. - other: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×. - two: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×. + one: "יש ×œ×›× ×¤×•×¡×˜ ×חד שממתין." + two: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×." + many: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×." + other: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×ž×ž×ª×™× ×™×." ok: "×שר" user_action: user_posted_topic: "{{user}} ×¤×¨×¡× ×ת הנוש×" @@ -355,10 +357,10 @@ he: posts_read: "נקר×ו" posts_read_long: "×¤×•×¡×˜×™× ×©× ×§×¨×ו" total_rows: - many: '%{count} משתמשי×' - one: משתמש/ת 1 - other: '%{count} משתמשי×' - two: '%{count} משתמשי×' + one: "משתמש/ת 1" + two: "%{count} משתמשי×" + many: "%{count} משתמשי×" + other: "%{count} משתמשי×" group_histories: actions: change_group_setting: "שינוי הגדרות קבוצה" @@ -443,8 +445,6 @@ he: reorder: title: "שנה סדר קטגוריות" title_long: "×רגן מחדש ×ת רשימת הקטגוריות" - fix_order: "סדר מיקומי×" - fix_order_tooltip: "×œ× ×œ×›×œ הקטגוריות יש מספר סידורי יחודי, ×–×” עלול ×œ×’×¨×•× ×œ×‘×¢×™×•×ª." save: "שמור סדר" apply_all: "החל" position: "מיקו×" @@ -455,15 +455,15 @@ he: toggle_ordering: "שנה בקר סדר" subcategories: "תתי קטגוריות" topic_sentence: - many: '%{count} נוש××™×' - one: × ×•×©× ×חד - other: '%{count} נוש××™×' - two: '%{count} נוש××™×' + one: "× ×•×©× ×חד" + two: "%{count} נוש××™×" + many: "%{count} נוש××™×" + other: "%{count} נוש××™×" topic_stat_sentence: - many: '%{count} נוש××™× ×—×“×©×™× ×‘-%{unit}.' - one: × ×•×©× ×—×“×© ×חד ב-%{unit}. - other: '%{count} נוש××™× ×—×“×©×™× ×‘-%{unit}.' - two: '%{count} נוש××™× ×—×“×©×™× ×‘-%{unit}.' + one: "× ×•×©× ×—×“×© ×חד ב-%{unit}." + two: "%{count} נוש××™× ×—×“×©×™× ×‘-%{unit}." + many: "%{count} נוש××™× ×—×“×©×™× ×‘-%{unit}." + other: "%{count} נוש××™× ×—×“×©×™× ×‘-%{unit}." ip_lookup: title: חיפוש כתובת IP hostname: ×©× ×©×¨×ª @@ -478,7 +478,7 @@ he: read_time: "זמן צפייה" topics_entered: "כניסה לנוש××™×" post_count: "# פוסטי×" - confirm_delete_other_accounts: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×ž×—×•×§ חשבונות ×לו?" + confirm_delete_other_accounts: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ חשבונות ×לו?" user_fields: none: "(בחרו ×פשרות)" user: @@ -518,7 +518,7 @@ he: dynamic_favicon: "הצגת מספר נוש××™× ×—×“×©×™×/×ž×¢×•×“×›× ×™× ×¢×œ ×”×ייקון של הדפדפן" theme_default_on_all_devices: "הפכו תמה ×–×ת לברירת המחדל בכל ×”×ž×›×©×™×¨×™× ×©×œ×™" external_links_in_new_tab: "פתח ×ת כל ×”×§×™×©×•×¨×™× ×”×—×™×¦×•× ×™×™× ×‘×¢×ž×•×“ חדש" - enable_quoting: "×פשרו תגובת ציטוט לטקסט מסומן" + enable_quoting: "הפעלת תגובת ציטוט לטקסט מסומן" change: "שנה" moderator: "{{user}} ×”×•× ×ž× ×—×”" admin: "{{user}} ×”×•× ×ž× ×”×œ מערכת" @@ -557,7 +557,7 @@ he: muted_categories_instructions: "××ª× ×œ× ×ª×™×•×“×¢×• על ×©×•× ×“×‘×¨ לגבי נוש××™× ×—×“×©×™× ×‘×§×˜×’×•×¨×™×•×ª ×לו, ×•×”× ×œ× ×™×•×¤×™×¢×• ב״×חרוני××´." no_category_access: "בתור ×ž× ×—×™× ×™×© ×œ×›× ×’×™×©×” מוגבלת לקטגוריות, שמירה מנוטרלת." delete_account: "מחק ×ת החשבון שלי" - delete_account_confirm: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×ž×—×•×§ ×ת החשבון? ×œ× × ×™×ª×Ÿ לבטל פעולה זו!" + delete_account_confirm: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת החשבון? ×œ× × ×™×ª×Ÿ לבטל פעולה זו!" deleted_yourself: "חשבונך נמחק בהצלחה." unread_message_count: "הודעות" admin_delete: "מחק" @@ -612,7 +612,6 @@ he: error: "×רעה שגי××” בשינוי ערך ×–×”." change_username: title: "שנה ×©× ×ž×©×ª×ž×©" - confirm: "×× ×ª×©× ×• ×ת ×©× ×”×ž×©×ª×ž×© שלכ×, כל ×”×¦×™×˜×•×˜×™× ×”×§×•×“×ž×™× ×©×œ ×¤×•×¡×˜×™× ×©×œ×›× ×•×זכורי @שמות ישברו. ×”×× ××ª× ×‘×˜×•×—×™× ×œ×—×œ×•×˜×™×Ÿ שזה מה שתרצו לעשות?" taken: "סליחה, ×©× ×”×ž×©×ª×ž×© ×”×–×” תפוס." invalid: "×©× ×”×ž×©×ª×ž×© ×ינו תקין. עליו לכלול רק ×ותיות ב×נגלית ומספרי×." change_email: @@ -631,7 +630,6 @@ he: upload_title: "העלו ×ת התמונה שלכ×" upload_picture: "העל×ת תמונה" image_is_not_a_square: "×זהרה: קיצצנו ×ת התמונה שלך; ×”×ורך והרוחב ×œ× ×”×™×• שווי×." - cache_notice: "שינית ×ת תמונת הפרופיל שלך בהצלחה ×בל יכול לקחת קצת זמן עד שהתמונה תופיע." change_profile_background: title: "שינוי רקע פרופיל" instructions: "רקעי הפרופיל ימורכזו ויוצגו ברוחב ברירת מחדל של 850px." @@ -646,10 +644,10 @@ he: authenticated: "כתובת הדו×ר ×”×לקטרוני שלך ×ושרה על ידי {{provider}}" frequency_immediately: "נשלח ×œ×›× ×ž×™×™×œ מיידית ×× ×œ× ×§×¨××ª× ×ת מה ששלחנו ×œ×›× ×¢×œ×™×• מייל." frequency: - many: נשלח ××œ×™×›× ×“×•×"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘{{count}} הדקות ×”×חרונות. - one: נשלח ××œ×™×›× ×“×•×"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘×“×§×” ×”×חרונה. - other: נשלח ××œ×™×›× ×“×•×"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘{{count}} הדקות ×”×חרונות. - two: נשלח ××œ×™×›× ×“×•×"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘{{count}} הדקות ×”×חרונות. + one: "נשלח ××œ×™×›× ×“×•×\"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘×“×§×” ×”×חרונה." + two: "נשלח ××œ×™×›× ×“×•×\"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘{{count}} הדקות ×”×חרונות." + many: "נשלח ××œ×™×›× ×“×•×\"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘{{count}} הדקות ×”×חרונות." + other: "נשלח ××œ×™×›× ×“×•×\"ל רק ×× ×œ× ×¨×ינו ××ª×›× ×‘{{count}} הדקות ×”×חרונות." name: title: "ש×" instructions: "×©×ž×›× ×”×ž×œ× (×ופציונלי)" @@ -734,10 +732,10 @@ he: user: "×ž×©×ª×ž×©×™× ×©×”×•×–×ž× ×•" sent: "נשלח" truncated: - many: מר××” ×ת {{count}} ההזמנות הר×שונות. - one: מר××” ×ת ההזמנה הר×שונה. - other: מר××” ×ת {{count}} ההזמנות הר×שונות. - two: מר××” ×ת {{count}} ההזמנות הר×שונות. + one: "מר××” ×ת ההזמנה הר×שונה." + two: "מר××” ×ת {{count}} ההזמנות הר×שונות." + many: "מר××” ×ת {{count}} ההזמנות הר×שונות." + other: "מר××” ×ת {{count}} ההזמנות הר×שונות." redeemed: "הזמנות נוצלו" redeemed_tab: "נענו" redeemed_tab_with_count: "נוצלו ({{count}})" @@ -783,30 +781,30 @@ he: stats: "סטטיסטיקות" time_read: "זמן קרי××”" topic_count: - many: נוש××™× × ×•×¦×¨×• - one: × ×•×©× × ×•×¦×¨ - other: נוש××™× × ×•×¦×¨×• - two: נוש××™× × ×•×¦×¨×• + one: "× ×•×©× × ×•×¦×¨" + two: "נוש××™× × ×•×¦×¨×•" + many: "נוש××™× × ×•×¦×¨×•" + other: "נוש××™× × ×•×¦×¨×•" post_count: - many: ×¤×•×¡×˜×™× × ×•×¦×¨×• - one: פוסט נוצר - other: ×¤×•×¡×˜×™× × ×•×¦×¨×• - two: ×¤×•×¡×˜×™× × ×•×¦×¨×• + one: "פוסט נוצר" + two: "×¤×•×¡×˜×™× × ×•×¦×¨×•" + many: "×¤×•×¡×˜×™× × ×•×¦×¨×•" + other: "×¤×•×¡×˜×™× × ×•×¦×¨×•" days_visited: - many: ×™×ž×™× ×©×‘×•×§×¨×• - one: ×™×•× ×©×‘×•×§×¨ - other: ×™×ž×™× ×©×‘×•×§×¨×• - two: ×™×ž×™× ×©×‘×•×§×¨×• + one: "×™×•× ×©×‘×•×§×¨" + two: "×™×ž×™× ×©×‘×•×§×¨×•" + many: "×™×ž×™× ×©×‘×•×§×¨×•" + other: "×™×ž×™× ×©×‘×•×§×¨×•" posts_read: - many: ×¤×•×¡×˜×™× × ×§×¨×ו - one: פוסט × ×§×¨× - other: ×¤×•×¡×˜×™× × ×§×¨×ו - two: ×¤×•×¡×˜×™× × ×§×¨×ו + one: "פוסט נקר×" + two: "×¤×•×¡×˜×™× × ×§×¨×ו" + many: "×¤×•×¡×˜×™× × ×§×¨×ו" + other: "×¤×•×¡×˜×™× × ×§×¨×ו" bookmark_count: - many: סימניות - one: סימנייה - other: סימניות - two: סימניות + one: "סימנייה" + two: "סימניות" + many: "סימניות" + other: "סימניות" top_replies: "תגובות מובילות" no_replies: "עדיין ×ין תגובות." more_replies: "תגובות נוספות" @@ -822,7 +820,6 @@ he: most_liked_users: "× ×הב ביותר" most_replied_to_users: "×”×›×™ הרבה נענו" no_likes: "עדיין ×ין לייקי×." - associated_accounts: "התחברויות" ip_address: title: "כתובת IP ×חרונה" registration_ip_address: @@ -874,10 +871,10 @@ he: reached: "%{relativeAge} – %{rate}×”×’×™×¢ לגבול הגדרות ×”×תר של %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} עבר ×ת הגבול של הגדרות ×”×תר ב- %{siteSettingRate}." rate: - many: '%{count} שגי×ות\%{duration}' - one: שגי××” ל %{duration} - other: '%{count} שגי×ות\%{duration}' - two: '%{count} שגי×ות\%{duration}' + one: "שגי××” ל %{duration}" + two: "%{count} שגי×ות\\%{duration}" + many: "%{count} שגי×ות\\%{duration}" + other: "%{count} שגי×ות\\%{duration}" learn_more: "למד עוד..." all_time: 'סך הכל' all_time_desc: 'כל הנוש××™× ×©× ×•×¦×¨×•' @@ -893,17 +890,15 @@ he: unmute: בטל השתקה last_reply_lowercase: תגובה ×חרונה replies_lowercase: - many: תגובות one: תגובה - other: תגובות two: תגובות + many: תגובות + other: תגובות signup_cta: sign_up: "הרשמה" hide_session: "הזכר לי מחר" hide_forever: "×œ× ×ª×•×“×”" hidden_for_session: "×וקיי, ×ש×ל ××ª×›× ×ž×—×¨. ××ª× ×›× ×ª×ž×™×“ ×™×›×•×œ×™× ×œ×”×©×ª×ž×© ב'התחברו' כדי ליצור משתמשי×." - intro: "×©×œ×•× ×œ×š :heart_eyes: ×–×” נר××” ×›×ילו ××ª× × ×”× ×™× ×ž×§×¨×™××” ×בל ××ª× ×œ× ×¨×©×•×ž×™×." - value_prop: "כש××ª× × ×¨×©×ž×™×, ×נחנו ×–×•×›×¨×™× ×‘×“×™×•×§ מה קר××ª× ×›×š שכשתחזרו תמשיכו בדיוק ×יפה שהפסקת×. בנוסף תקבלו התר×ות דרך ×”×תר ודרך הדו×ר ×”×לקטרוני ×©×œ×›× ×›×©×¤×•×¡×˜×™× ×—×“×©×™× × ×•×¦×¨×™×. ו××ª× ×™×›×•×œ×™× ×œ×¢×©×•×ª לייק ×œ×¤×•×¡×˜×™× ×©×הבת×. :heartbeat:" summary: enabled_description: "××ª× ×¦×•×¤×™× ×‘×¡×™×›×•× × ×•×©× ×–×”: ×”×¤×•×¡×˜×™× ×”×ž×¢× ×™×™× ×™× ×‘×™×•×ª×¨ כפי שסומנו על ידי הקהילה." description: "ישנן {{replyCount}} תגובות." @@ -917,7 +912,6 @@ he: disable: "הצגת ×¤×•×¡×˜×™× ×©× ×ž×—×§×•" private_message_info: title: "הודעה" - invite: "הזמינו ×חרי×..." remove_allowed_user: "×”×× ××ª× ×‘×מת ×¨×•×¦×™× ×œ×”×¡×™×¨ ×ת {{name}} מהודעה זו?" remove_allowed_group: "×”×× ××ª× ×‘×מת ×ž×¢×•× ×™×™× ×™× ×œ×”×¡×™×¨ ×ת {{name}} מהודעה זו?" email: 'דו×"ל' @@ -973,9 +967,6 @@ he: preferences: "××ª× ×¦×¨×™×›×™× ×œ×”×™×•×ª ×ž×—×•×‘×¨×™× ×›×“×™ לשנות ×ת העדפות המשתמש שלכ×." forgot: "×ין לי ×ת פרטי החשבון שלי" not_approved: "החשבון ×©×œ×›× ×¢×“×™×™×Ÿ ×œ× ×ושר. ××ª× ×ª×™×•×“×¢×• במייל כשתוכלו להתחבר." - google: - title: "×¢× ×’×•×’×œ" - message: "התחברות ×¢× ×’×•×’×œ (יש ×œ×•×•×“× ×©×—×•×¡× ×—×œ×•× ×•×ª ×§×•×¤×¦×™× ×ינו פעיל)" google_oauth2: title: "בעזרת Google" message: "התחברות מ×ובטחת ב×מצעות גוגל (בדקו ×©×—×•×¡× ×”×—×œ×•× ×•×ª ×”×§×•×¤×¦×™× ×©×œ×›× ×ינו מופעל)" @@ -1051,10 +1042,10 @@ he: similar_topics: "×”× ×•×©× ×©×œ×š דומה ל..." drafts_offline: "טיוטות מנותקות" group_mentioned: - many: על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ {{count}} ×× ×©×™× â€“ ××ª× ×‘×˜×•×—×™×? - one: על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ ××“× ×חד – ××ª× ×‘×˜×•×—×™×? - other: על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ {{count}} ×× ×©×™× â€“ ××ª× ×‘×˜×•×—×™×? - two: על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ {{count}} ×× ×©×™× â€“ ××ª× ×‘×˜×•×—×™×? + one: "על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ ××“× ×חד – ××ª× ×‘×˜×•×—×™×?" + two: "על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ {{count}} ×× ×©×™× â€“ ××ª× ×‘×˜×•×—×™×?" + many: "על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ {{count}} ×× ×©×™× â€“ ××ª× ×‘×˜×•×—×™×?" + other: "על ידי ×זכור {{group}}, ××ª× ×¢×•×ž×“×™× ×œ×™×™×“×¢ {{count}} ×× ×©×™× â€“ ××ª× ×‘×˜×•×—×™×?" cannot_see_mention: category: "×”×–×›×¨×ª× ×ת {{username}} ×בל הו×/×”×™× ×œ× ×™×§×‘×œ×• התר××” כיוון ש×ין ×œ×”× ×’×™×©×” לקטגוריה זו. תצטרכו להוסיף ××•×ª× ×œ×§×‘×•×¦×” שיש לה גישה לקטגוריה הזו." private: "×”×–×›×¨×ª× ×ת {{username}} ×בל הו×/×”×™× ×œ× ×™×§×‘×œ×• התר××” כיוון ×©×”× ×œ× ×™×›×•×œ×™× ×œ×¨×ות ×ת ההודעה הפרטית הזו. תצטרכו להזמין ××•×ª× ×œ×”×•×“×¢×” פרטית זו." @@ -1124,6 +1115,7 @@ he: empty: "×œ× × ×ž×¦×ו התר×ות." more: "הצגת התר×ות ישנות יותר" total_flagged: "סך הכל ×¤×•×¡×˜×™× ×ž×“×•×’×œ×™×" + granted_badge: "הרווחת '{{description}}'" popup: mentioned: '{{username}} הזכיר/×” ×ותך ב{{topic}}" - {{site_title}}"' group_mentioned: '{{username}} הזכיר/×” ××ª×›× ×‘ "{{topic}}" - {{site_title}}' @@ -1225,10 +1217,10 @@ he: notification_level: "התר×ות" choose_new_category: "בחרו ×ת הקטגוריה עבור הנוש××™×:" selected: - many: ×‘×—×¨×ª× {{count}} נוש××™×. - one: ×‘×—×¨×ª× × ×•×©× ×חד. - other: ×‘×—×¨×ª× {{count}} נוש××™×. - two: ×‘×—×¨×ª× {{count}} נוש××™×. + one: "×‘×—×¨×ª× × ×•×©× ×חד." + two: "×‘×—×¨×ª× {{count}} נוש××™×." + many: "×‘×—×¨×ª× {{count}} נוש××™×." + other: "×‘×—×¨×ª× {{count}} נוש××™×." change_tags: "החלפת תגי×" append_tags: "הוספת תגי×" choose_new_tags: "בחרו בתגיות חדשות עבור נוש××™× ×לו:" @@ -1263,10 +1255,10 @@ he: search: "×ין עוד תוצ×ות חיפוש" topic: filter_to: - many: '{{count}} ×¤×•×¡×˜×™× ×‘× ×•×©×' - one: פוסט ×חד ×‘× ×•×©× - other: '{{count}} ×¤×•×¡×˜×™× ×‘× ×•×©×' - two: '{{count}} ×¤×•×¡×˜×™× ×‘× ×•×©×' + one: "פוסט ×חד בנוש×" + two: "{{count}} ×¤×•×¡×˜×™× ×‘× ×•×©×" + many: "{{count}} ×¤×•×¡×˜×™× ×‘× ×•×©×" + other: "{{count}} ×¤×•×¡×˜×™× ×‘× ×•×©×" create: '× ×•×©× ×—×“×©' create_long: 'יצירת × ×•×©× ×—×“×©' private_message: 'תחילת הודעה' @@ -1280,15 +1272,15 @@ he: new: '× ×•×©× ×—×“×©' unread: '×œ× × ×§×¨×ו' new_topics: - many: '{{count}} נוש××™× ×—×“×©×™×' - one: × ×•×©× ×—×“×© ×חד - other: '{{count}} נוש××™× ×—×“×©×™×' + one: '× ×•×©× ×—×“×© ×חד' two: '{{count}} נוש××™× ×—×“×©×™×' + many: '{{count}} נוש××™× ×—×“×©×™×' + other: '{{count}} נוש××™× ×—×“×©×™×' unread_topics: - many: '{{count}} נוש××™× ×©×œ× × ×§×¨×ו' - one: 1 ×©×œ× × ×§×¨× - other: '{{count}} נוש××™× ×©×œ× × ×§×¨×ו' + one: '1 ×©×œ× × ×§×¨×' two: '{{count}} נוש××™× ×©×œ× × ×§×¨×ו' + many: '{{count}} נוש××™× ×©×œ× × ×§×¨×ו' + other: '{{count}} נוש××™× ×©×œ× × ×§×¨×ו' title: 'נוש×' invalid_access: title: "×”× ×•×©× ×¤×¨×˜×™" @@ -1301,25 +1293,25 @@ he: title: "×”× ×•×©× ×œ× × ×ž×¦×" description: "סליחה, ×œ× ×™×›×•×œ× ×• ×œ×ž×¦×•× ×ת ×”× ×•×©× ×”×–×”. ×ולי ×”×•× ×”×•×¡×¨ על ידי מנחה?" total_unread_posts: - many: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×–×” - one: יש ×œ×›× ×¤×•×¡×˜ ×חד ×©×œ× × ×§×¨× ×‘× ×•×©× ×–×” - other: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×–×” - two: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×–×” + one: "יש ×œ×›× ×¤×•×¡×˜ ×חד ×©×œ× × ×§×¨× ×‘× ×•×©× ×–×”" + two: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×–×”" + many: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×–×”" + other: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×–×”" unread_posts: - many: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×™×©× ×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×”×–×” - one: יש ×œ×›× ×¤×•×¡×˜ ×חד ×©×œ× × ×§×¨× ×‘× ×•×©× ×”×–×” - other: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×™×©× ×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×”×–×” - two: יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×™×©× ×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×”×–×” + one: "יש ×œ×›× ×¤×•×¡×˜ ×חד ×©×œ× × ×§×¨× ×‘× ×•×©× ×”×–×”" + two: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×™×©× ×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×”×–×”" + many: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×™×©× ×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×”×–×”" + other: "יש ×œ×›× {{count}} ×¤×•×¡×˜×™× ×™×©× ×™× ×©×œ× × ×§×¨×ו ×‘× ×•×©× ×”×–×”" new_posts: - many: יש {{count}} ×¤×•×¡×˜×™× ×—×“×©×™× ×‘× ×•×©× ×–×” מ××– שקר××ª× ×ותו ל×חרונה - one: יש פוסט ×חד חדש ×‘× ×•×©× ×”×–×” מ××– שקר××ª× ×ותו ל×חרונה - other: יש {{count}} ×¤×•×¡×˜×™× ×—×“×©×™× ×‘× ×•×©× ×–×” מ××– שקר××ª× ×ותו ל×חרונה - two: יש {{count}} ×¤×•×¡×˜×™× ×—×“×©×™× ×‘× ×•×©× ×–×” מ××– שקר××ª× ×ותו ל×חרונה + one: "יש פוסט ×חד חדש ×‘× ×•×©× ×”×–×” מ××– שקר××ª× ×ותו ל×חרונה" + two: "יש {{count}} ×¤×•×¡×˜×™× ×—×“×©×™× ×‘× ×•×©× ×–×” מ××– שקר××ª× ×ותו ל×חרונה" + many: "יש {{count}} ×¤×•×¡×˜×™× ×—×“×©×™× ×‘× ×•×©× ×–×” מ××– שקר××ª× ×ותו ל×חרונה" + other: "יש {{count}} ×¤×•×¡×˜×™× ×—×“×©×™× ×‘× ×•×©× ×–×” מ××– שקר××ª× ×ותו ל×חרונה" likes: - many: יש {{count}} ×œ×™×™×§×™× ×‘× ×•×©× ×–×” - one: יש לייק ×חד ×‘× ×•×©× ×”×–×” - other: יש {{count}} ×œ×™×™×§×™× ×‘× ×•×©× ×–×” - two: יש {{count}} ×œ×™×™×§×™× ×‘× ×•×©× ×–×” + one: "יש לייק ×חד ×‘× ×•×©× ×”×–×”" + two: "יש {{count}} ×œ×™×™×§×™× ×‘× ×•×©× ×–×”" + many: "יש {{count}} ×œ×™×™×§×™× ×‘× ×•×©× ×–×”" + other: "יש {{count}} ×œ×™×™×§×™× ×‘× ×•×©× ×–×”" back_to_list: "חזרה לרשימת הנוש××™×" options: "×פשרויות נוש×" show_links: "הצג ×§×™×©×•×¨×™× ×‘×ª×•×š ×”× ×•×©× ×”×–×”" @@ -1374,10 +1366,10 @@ he: auto_reminder: "××ª× ×ª×ª×•×–×›×¨×• בנוגע ×œ× ×•×©× ×–×” %{timeLeft}." auto_close_title: 'הגדרות סגירה ×וטומטית' auto_close_immediate: - many: הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן %{count} שעות, ××– ×”× ×•×©× ×™×™×¡×’×¨ ×וטומטית. - one: הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן שעה, ××– ×”× ×•×©× ×™×™×¡×’×¨ מיידית. - other: הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן %{count} שעות, ××– ×”× ×•×©× ×™×™×¡×’×¨ ×וטומטית. - two: הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן %{count} שעות, ××– ×”× ×•×©× ×™×™×¡×’×¨ ×וטומטית. + one: "הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן שעה, ××– ×”× ×•×©× ×™×™×¡×’×¨ מיידית." + two: "הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן %{count} שעות, ××– ×”× ×•×©× ×™×™×¡×’×¨ ×וטומטית." + many: "הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן %{count} שעות, ××– ×”× ×•×©× ×™×™×¡×’×¨ ×וטומטית." + other: "הפוסט ×”×חרון ×‘× ×•×©× ×”×•× ×›×‘×¨ בן %{count} שעות, ××– ×”× ×•×©× ×™×™×¡×’×¨ ×וטומטית." timeline: back: "חזרה" back_description: "חיזרו לפוסט ×”×חרון של×-× ×§×¨× ×¢×œ-ידיכ×" @@ -1484,10 +1476,10 @@ he: pin_validation: "דרוש ת×ריך על מנת לנעוץ ×ת הנוש×." not_pinned: "×ין נוש××™× ×©× × ×¢×¦×• בקטגוריה {{categoryLink}}." already_pinned: - many: 'נוש××™× × × ×¢×¦×•, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}' - one: '× ×•×©× ×©× × ×¢×¦×•, נכון לעכשיו בקטגוריה {{categoryLink}}: 1' - other: 'נוש××™× × × ×¢×¦×•, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}' - two: 'נוש××™× × × ×¢×¦×•, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}' + one: "× ×•×©× ×©× × ×¢×¦×•, נכון לעכשיו בקטגוריה {{categoryLink}}: 1" + two: "נוש××™× × × ×¢×¦×•, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}" + many: "נוש××™× × × ×¢×¦×•, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}" + other: "נוש××™× × × ×¢×¦×•, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}" pin_globally: "גרמו ×œ× ×•×©× ×–×” להופיע בר×ש כל רשימות הנוש××™× ×¢×“" confirm_pin_globally: "יש לך כבר {{count}} נוש××™× ×”× ×¢×•×¦×™× ×‘×ופן גלוב×לי. עודף נוש××™× × ×¢×•×¦×™× ×¢×©×•×™ להכביד על ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ו ×נונימיי×. ×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ× ×¢×•×¥ × ×•×©× ×’×œ×•×‘×לי נוסף?" unpin_globally: "הסרת × ×•×©× ×–×” מר×ש כל רשימות הנוש××™×." @@ -1495,10 +1487,10 @@ he: global_pin_note: "×ž×©×ª×ž×©×™× ×™×›×•×œ×™× ×œ×”×¡×™×¨ ×ת הצמדת ×”× ×•×©× ×‘×ופן עצמ××™ לעצמ×." not_pinned_globally: "×ין נוש××™× × ×¢×•×¦×™× ×’×œ×•×‘×לית." already_pinned_globally: - many: 'נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: {{count}}' - one: 'נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: 1' - other: 'נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: {{count}}' - two: 'נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: {{count}}' + one: "נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: 1" + two: "נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: {{count}}" + many: "נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: {{count}}" + other: "נוש××™× ×©×›×¨×’×¢ × ×¢×•×¦×™× ×’×œ×•×‘×לית: {{count}}" make_banner: "הפכו × ×•×©× ×–×” לב×נר ×שר מופיע בר×ש כל העמודי×." remove_banner: "הסרת הב×נר שמופיע בר×ש כל העמודי×." banner_note: "×ž×©×ª×ž×©×™× ×™×›×•×œ×™× ×œ×‘×˜×œ ×ת הב×נר על ידי סגירתו. רק פוסט ×חד יכול לשמש כב×נר בזמן נתון." @@ -1534,10 +1526,10 @@ he: login_reply: 'התחברו כדי להשיב' filters: n_posts: - many: '{{count}} פוסטי×' - one: פוסט ×חד - other: '{{count}} פוסטי×' - two: '{{count}} פוסטי×' + one: "פוסט ×חד" + two: "{{count}} פוסטי×" + many: "{{count}} פוסטי×" + other: "{{count}} פוסטי×" cancel: "הסרת הסינון" split_topic: title: "העבר ×œ× ×•×©× ×—×“×©" @@ -1545,19 +1537,19 @@ he: topic_name: "×©× ×”× ×•×©× ×”×—×“×©" error: "הייתה שגי××” בהעברת ×”×¤×•×¡×˜×™× ×œ× ×•×©× ×”×—×“×©." instructions: - many: ××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× {{count}} ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×. - one: ××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×. - other: ××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× {{count}} ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×. - two: ××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× {{count}} ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×. + one: "××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×." + two: "××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× {{count}} ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×." + many: "××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× {{count}} ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×." + other: "××ª× ×¢×•×ž×“×™× ×œ×™×¦×•×¨ × ×•×©× ×—×“×© ×•×œ×ž×œ× ×ותו ×¢× {{count}} ×”×¤×•×¡×˜×™× ×©×‘×—×¨×ª×." merge_topic: title: "העבר ×œ× ×•×©× ×§×™×™×" action: "העבר ×œ× ×•×©× ×§×™×™×" error: "התרחשה שגי××” בהעברת ×”×¤×•×¡×˜×™× ×œ× ×•×©× ×”×–×”." instructions: - many: בבקשה בחרו ×ת ×”× ×•×©× ×ליו תרצה להעביר ×ת {{count}} הפוסטי×. - one: בבקשה בחרו × ×•×©× ×ליו ×”×™×™×ª× ×¨×•×¦×™× ×œ×”×¢×‘×™×¨ ×ת הפוסט. - other: בבקשה בחרו ×ת ×”× ×•×©× ×ליו תרצה להעביר ×ת {{count}} הפוסטי×. - two: בבקשה בחרו ×ת ×”× ×•×©× ×ליו תרצה להעביר ×ת {{count}} הפוסטי×. + one: "בבקשה בחרו × ×•×©× ×ליו ×”×™×™×ª× ×¨×•×¦×™× ×œ×”×¢×‘×™×¨ ×ת הפוסט." + two: "בבקשה בחרו ×ת ×”× ×•×©× ×ליו תרצה להעביר ×ת {{count}} הפוסטי×." + many: "בבקשה בחרו ×ת ×”× ×•×©× ×ליו תרצה להעביר ×ת {{count}} הפוסטי×." + other: "בבקשה בחרו ×ת ×”× ×•×©× ×ליו תרצה להעביר ×ת {{count}} הפוסטי×." merge_posts: title: "ניזוג ×¤×•×¡×˜×™× ×©× ×‘×—×¨×•" action: "מיזוג ×¤×•×¡×˜×™× ×©× ×‘×—×¨×•" @@ -1569,10 +1561,10 @@ he: label: "×‘×¢×œ×™× ×—×“×©×™× ×©×œ פוסטי×" placeholder: "×©× ×”×ž×©×ª×ž×© של ×”×‘×¢×œ×™× ×”×—×“×©" instructions: - many: ×× × ×‘×—×¨×• ×ת ×”×‘×¢×œ×™× ×”×—×“×© של {{count}} ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}. - one: ×× × ×‘×—×¨ ×ת ×”×‘×¢×œ×™× ×”×—×“×© של ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}. - other: ×× × ×‘×—×¨×• ×ת ×”×‘×¢×œ×™× ×”×—×“×© של {{count}} ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}. - two: ×× × ×‘×—×¨×• ×ת ×”×‘×¢×œ×™× ×”×—×“×© של {{count}} ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}. + one: "×× × ×‘×—×¨ ×ת ×”×‘×¢×œ×™× ×”×—×“×© של ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}." + two: "×× × ×‘×—×¨×• ×ת ×”×‘×¢×œ×™× ×”×—×“×© של {{count}} ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}." + many: "×× × ×‘×—×¨×• ×ת ×”×‘×¢×œ×™× ×”×—×“×© של {{count}} ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}." + other: "×× × ×‘×—×¨×• ×ת ×”×‘×¢×œ×™× ×”×—×“×© של {{count}} ×”×¤×•×¡×˜×™× ×ž×ת {{old_user}}." change_timestamp: title: "שינוי חותמת זמן..." action: "שינוי חותמת זמן" @@ -1587,10 +1579,10 @@ he: select_all: בחר הכל deselect_all: בחר ×›×œ×•× description: - many: ×‘×—×¨×ª× {{count}} פוסטי×. one: ×‘×—×¨×ª× ×¤×•×¡×˜ ×חד. - other: ×‘×—×¨×ª× {{count}} פוסטי×. - two: ×‘×—×¨×ª× {{count}} פוסטי×. + two: "×‘×—×¨×ª× {{count}} פוסטי×." + many: "×‘×—×¨×ª× {{count}} פוסטי×." + other: "×‘×—×¨×ª× {{count}} פוסטי×." post: quote_reply: "ציטוט" edit_reason: "סיבה: " @@ -1604,38 +1596,38 @@ he: show_full: "הצגת פוסט מל×" show_hidden: 'הצגת תוכן מוסתר.' deleted_by_author: - many: (הפוסט נלקח בחזרה על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×›×Ÿ ×”×•× ×™×“×•×’×œ) - one: (הפוסט בוטל על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×™×¡×•×ž×Ÿ בדגל) - other: (הפוסט נלקח בחזרה על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×›×Ÿ ×”×•× ×™×“×•×’×œ) - two: (הפוסט נלקח בחזרה על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×›×Ÿ ×”×•× ×™×“×•×’×œ) + one: "(הפוסט בוטל על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×™×¡×•×ž×Ÿ בדגל)" + two: "(הפוסט נלקח בחזרה על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×›×Ÿ ×”×•× ×™×“×•×’×œ)" + many: "(הפוסט נלקח בחזרה על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×›×Ÿ ×”×•× ×™×“×•×’×œ)" + other: "(הפוסט נלקח בחזרה על ידי הכותבי×, ×”×•× ×™×ž×—×§ ×וטומטית בעוד %{count} שעות ××œ× ×× ×›×Ÿ ×”×•× ×™×“×•×’×œ)" expand_collapse: "הרחב/צמצ×" gap: - many: הצגת {{count}} תגובות שהוסתרו - one: הצג תגובה ×חת שהוסתרה - other: הצגת {{count}} תגובות שהוסתרו - two: הצגת {{count}} תגובות שהוסתרו + one: "הצג תגובה ×חת שהוסתרה" + two: "הצגת {{count}} תגובות שהוסתרו" + many: "הצגת {{count}} תגובות שהוסתרו" + other: "הצגת {{count}} תגובות שהוסתרו" unread: "הפוסט ×˜×¨× × ×§×¨×" has_replies: - many: '{{count}} תגובות' - one: תגובה ×חת - other: '{{count}} תגובות' - two: '{{count}} תגובות' + one: "תגובה ×חת" + two: "{{count}} תגובות" + many: "{{count}} תגובות" + other: "{{count}} תגובות" has_likes: - many: '{{count}} ×œ×™×™×§×™× ' - one: לייק ×חד - other: '{{count}} ×œ×™×™×§×™× ' - two: '{{count}} ×œ×™×™×§×™× ' + one: "לייק ×חד" + two: "{{count}} ×œ×™×™×§×™× " + many: "{{count}} ×œ×™×™×§×™× " + other: "{{count}} ×œ×™×™×§×™× " has_likes_title: - many: '{{count}} ×× ×©×™× ×הבו ×ת התגובה הזו' - one: מישהו ×חד ×הב ×ת התגובה הזו - other: '{{count}} ×× ×©×™× ×הבו ×ת התגובה הזו' - two: '{{count}} ×× ×©×™× ×הבו ×ת התגובה הזו' + one: "מישהו ×חד ×הב ×ת התגובה הזו" + two: "{{count}} ×× ×©×™× ×הבו ×ת התגובה הזו" + many: "{{count}} ×× ×©×™× ×הבו ×ת התגובה הזו" + other: "{{count}} ×× ×©×™× ×הבו ×ת התגובה הזו" has_likes_title_only_you: "××ª× ××”×‘×ª× ×ת התגובה הזו" has_likes_title_you: - many: ××ª× ×• {{count}} ×× ×©×™× ××—×¨×™× ××”×‘×ª× ×ת הפוסט ×”×–×” - one: ××ª× ×•×¢×•×“ מישהו ××”×‘×ª× ×ת הפוסט ×”×–×” - other: ××ª× ×• {{count}} ×× ×©×™× ××—×¨×™× ××”×‘×ª× ×ת הפוסט ×”×–×” - two: ××ª× ×• {{count}} ×× ×©×™× ××—×¨×™× ××”×‘×ª× ×ת הפוסט ×”×–×” + one: "××ª× ×•×¢×•×“ מישהו ××”×‘×ª× ×ת הפוסט ×”×–×”" + two: "××ª× ×• {{count}} ×× ×©×™× ××—×¨×™× ××”×‘×ª× ×ת הפוסט ×”×–×”" + many: "××ª× ×• {{count}} ×× ×©×™× ××—×¨×™× ××”×‘×ª× ×ת הפוסט ×”×–×”" + other: "××ª× ×• {{count}} ×× ×©×™× ××—×¨×™× ××”×‘×ª× ×ת הפוסט ×”×–×”" errors: create: "סליחה, הייתה שגי××” ביצירת הפוסט שלכ×. ×× × × ×¡×• שנית." edit: "סליחה, הייתה שגי××” בעריכת הפוסט שלכ×. ×× × × ×¡×• שנית." @@ -1688,7 +1680,6 @@ he: inappropriate: "ביטול דיגול" bookmark: "בטל העדפה" like: "בטל לייק" - vote: "בטל הצבעה" people: off_topic: "דוגל ×›×וף-טופיק" spam: "דוגל כספ××" @@ -1697,7 +1688,6 @@ he: notify_user: "נשלחה הודעה" bookmark: "סומן" like: "×הבו ×ת ×–×”" - vote: "הצביעו לזה" by_you: off_topic: "×“×™×’×œ×ª× ×¤×¨×¡×•× ×–×” ×›×וף-טופיק" spam: "×“×™×’×œ×ª× ×ת ×–×” כספ××" @@ -1706,95 +1696,84 @@ he: notify_user: "×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×–×”" bookmark: "×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×”" like: "נתת לזה לייק" - vote: "×”×¦×‘×¢×ª× ×œ×¤×•×¡×˜ ×–×”" by_you_and_others: off_topic: - many: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק - one: ××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק - other: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק - two: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק + one: "××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק" + two: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק" + many: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק" + other: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×וף-טופיק" spam: - many: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” כספ×× - one: ××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” כספ×× - other: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” כספ×× - two: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” כספ×× + one: "××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” כספ××" + two: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” כספ××" + many: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” כספ××" + other: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” כספ××" inappropriate: - many: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי - one: ××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי - other: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי - two: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי + one: "××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי" + two: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי" + many: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי" + other: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×›×œ× ×¨×וי" notify_moderators: - many: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×œ×ž× ×—×™× - one: ××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” עבור ×”×ž× ×—×™× - other: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×œ×ž× ×—×™× - two: ××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” ×œ×ž× ×—×™× + one: "××ª× ×•×¢×•×“ ×חד ×“×™×’×œ×ª× ×ת ×–×” עבור המנחי×" + two: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” למנחי×" + many: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” למנחי×" + other: "××ª× ×•×¢×•×“ {{count}} ×× ×©×™× ××—×¨×™× ×“×™×’×œ×ª× ×ת ×–×” למנחי×" notify_user: - many: ××ª× ×•{{count}} ×× ×©×™× × ×•×¡×¤×™× ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×” - one: '××ª× ×•-1 נוסף ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×”. ' - other: ××ª× ×•{{count}} ×× ×©×™× × ×•×¡×¤×™× ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×” - two: ××ª× ×•{{count}} ×× ×©×™× × ×•×¡×¤×™× ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×” + one: "××ª× ×•-1 נוסף ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×”. " + two: "××ª× ×•{{count}} ×× ×©×™× × ×•×¡×¤×™× ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×”" + many: "××ª× ×•{{count}} ×× ×©×™× × ×•×¡×¤×™× ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×”" + other: "××ª× ×•{{count}} ×× ×©×™× × ×•×¡×¤×™× ×©×œ×—×ª× ×”×•×“×¢×” למשתמש ×”×–×”" bookmark: - many: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×” - one: ×תה ועוד ×חד ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×” - other: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×” - two: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×” + one: "×תה ועוד ×חד ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×”" + two: "×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×”" + many: "×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×”" + other: "××ª× ×•×¢×•×“ {{count}} ×ž×©×ª×ž×©×™× ××—×¨×™× ×¡×™×ž× ×ª× ×¤×•×¡×˜ ×–×” ×¢× ×¡×™×ž× ×™×™×”" like: - many: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× × ×ª×ª× ×œ×™×™×§ לזה - one: ×תה ועוד ×חד × ×ª×ª× ×œ×™×™×§ לזה - other: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× × ×ª×ª× ×œ×™×™×§ לזה - two: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× × ×ª×ª× ×œ×™×™×§ לזה - vote: - many: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×”×¦×‘×¢×ª× ×œ×¤×•×¡×˜ ×–×” - one: ×תה ועוד ×חד ×”×¦×‘×¢×ª× ×œ×¤×•×¡×˜ ×–×” - other: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×”×¦×‘×¢×ª× ×œ×¤×•×¡×˜ ×–×” - two: ×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× ×”×¦×‘×¢×ª× ×œ×¤×•×¡×˜ ×–×” + one: "×תה ועוד ×חד × ×ª×ª× ×œ×™×™×§ לזה" + two: "×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× × ×ª×ª× ×œ×™×™×§ לזה" + many: "×תה ועוד {{count}} ×× ×©×™× ××—×¨×™× × ×ª×ª× ×œ×™×™×§ לזה" + other: "××ª× ×•×¢×•×“ {{count}} ×ž×©×ª×ž×©×™× ××—×¨×™× × ×ª×ª× ×œ×™×™×§ לזה" by_others: off_topic: - many: '{{count}} ×× ×©×™× ×¡×ž× ×• ×ת ×–×” ×›×וף-טופיק' - one: ××“× ×חד דיגל ×ת ×–×” ×›×וף-טופיק - other: '{{count}} ×× ×©×™× ×¡×ž× ×• ×ת ×–×” ×›×וף-טופיק' - two: '{{count}} ×× ×©×™× ×¡×ž× ×• ×ת ×–×” ×›×וף-טופיק' + one: "××“× ×חד דיגל ×ת ×–×” ×›×וף-טופיק" + two: "{{count}} ×× ×©×™× ×¡×ž× ×• ×ת ×–×” ×›×וף-טופיק" + many: "{{count}} ×× ×©×™× ×¡×ž× ×• ×ת ×–×” ×›×וף-טופיק" + other: "{{count}} ×× ×©×™× ×¡×ž× ×• ×ת ×–×” ×›×וף-טופיק" spam: - many: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” כספ××' - one: ××“× ×חד דיגל ×ת ×–×” כספ×× - other: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” כספ××' - two: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” כספ××' + one: "××“× ×חד דיגל ×ת ×–×” כספ××" + two: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” כספ××" + many: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” כספ××" + other: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” כספ××" inappropriate: - many: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” ×›×œ× ×¨×וי' - one: ××“× ×חד דיגל ×ת ×–×” ×›×œ× ×¨×וי - other: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” ×›×œ× ×¨×וי' - two: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” ×›×œ× ×¨×וי' + one: "××“× ×חד דיגל ×ת ×–×” ×›×œ× ×¨×וי" + two: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” ×›×œ× ×¨×וי" + many: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” ×›×œ× ×¨×וי" + other: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” ×›×œ× ×¨×וי" notify_moderators: - many: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” למנחי×' - one: ××“× ×חד דיגל ×ת ×–×” ×œ×ž× ×—×™× - other: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” למנחי×' - two: '{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” למנחי×' + one: "××“× ×חד דיגל ×ת ×–×” למנחי×" + two: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” למנחי×" + many: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” למנחי×" + other: "{{count}} ×× ×©×™× ×“×™×’×œ×• ×ת ×–×” למנחי×" notify_user: - many: '{{count}} שלחו הודעה למשתמש ×–×”' - one: ××“× ×חד שלח הודעה למשתמש ×–×” - other: '{{count}} שלחו הודעה למשתמש ×–×”' - two: '{{count}} שלחו הודעה למשתמש ×–×”' + one: "××“× ×חד שלח הודעה למשתמש ×–×”" + two: "{{count}} שלחו הודעה למשתמש ×–×”" + many: "{{count}} שלחו הודעה למשתמש ×–×”" + other: "{{count}} שלחו הודעה למשתמש ×–×”" bookmark: - many: '{{count}} ×× ×©×™× ×¡×™×ž× ×• פוסט ×–×” כמועדף' - one: ××“× ×חד סימן פוסט ×–×” כמועדף - other: '{{count}} ×× ×©×™× ×¡×™×ž× ×• פוסט ×–×” כמועדף' - two: '{{count}} ×× ×©×™× ×¡×™×ž× ×• פוסט ×–×” כמועדף' + one: "××“× ×חד סימן פוסט ×–×” כמועדף" + two: "{{count}} ×× ×©×™× ×¡×™×ž× ×• פוסט ×–×” כמועדף" + many: "{{count}} ×× ×©×™× ×¡×™×ž× ×• פוסט ×–×” כמועדף" + other: "{{count}} ×× ×©×™× ×¡×™×ž× ×• פוסט ×–×” כמועדף" like: - many: '{{count}} ×× ×©×™× × ×ª× ×• לזה לייק' - one: ××“× ×חד נתן לזה לייק - other: '{{count}} ×× ×©×™× × ×ª× ×• לזה לייק' - two: '{{count}} ×× ×©×™× × ×ª× ×• לזה לייק' - vote: - many: '{{count}} ×× ×©×™× ×”×¦×‘×™×¢×• לפוסט ×–×”' - one: ××“× ×חד הצביע לפוסט ×–×” - other: '{{count}} ×× ×©×™× ×”×¦×‘×™×¢×• לפוסט ×–×”' - two: '{{count}} ×× ×©×™× ×”×¦×‘×™×¢×• לפוסט ×–×”' + one: "××“× ×חד נתן לזה לייק" + two: "{{count}} ×× ×©×™× × ×ª× ×• לזה לייק" + many: "{{count}} ×× ×©×™× × ×ª× ×• לזה לייק" + other: "{{count}} ×× ×©×™× × ×ª× ×• לזה לייק" merge: confirm: - many: ×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ {{count}}Â ×¤×•×¡×˜×™× ×לו? - one: ×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ ×¤×•×¡×˜×™× ×לו? - other: ×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ {{count}}Â ×¤×•×¡×˜×™× ×לו? - two: ×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ {{count}}Â ×¤×•×¡×˜×™× ×לו? + one: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ ×¤×•×¡×˜×™× ×לו?" + two: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ {{count}}Â ×¤×•×¡×˜×™× ×לו?" + many: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ {{count}}Â ×¤×•×¡×˜×™× ×לו?" + other: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×–×’ {{count}}Â ×¤×•×¡×˜×™× ×לו?" revisions: controls: first: "מהדורה ר×שונה" @@ -1832,7 +1811,6 @@ he: can: 'יכול… ' none: '(×œ×œ× ×§×˜×’×•×¨×™×”)' all: 'כל הקטגוריות' - choose: 'בחר קטגוריה…' edit: 'ערוך' edit_long: "עריכה" view: 'הצגת נוש××™× ×‘×§×˜×’×•×¨×™×”' @@ -1862,7 +1840,7 @@ he: foreground_color: "צבע קדמי" name_placeholder: "מילה ×ו ×©×ª×™×™× ×œ×›×œ היותר" color_placeholder: "כל צבע ×ינטרנטי" - delete_confirm: "×”×× ×תה בטוח שברצונך למחוק ×ת הקטגוריה הזו?" + delete_confirm: "×”×× ×©×‘×¨×¦×•× ×š להסיר ×ת הקטגוריה הזו?" delete_error: "×רעה שגי××” במחיקת הקטגוריה." list: "הצג קטגוריות" no_description: "×× × ×”×•×¡×™×¤×• תי×ור לקטגוריה זו." @@ -1878,7 +1856,6 @@ he: show_subcategory_list: "הצגת רשימת קטגוריות משנה מעל נוש××™× ×‘×§×˜×’×•×¨×™×” זו." num_featured_topics: "מספר הנוש××™× ×”×ž×•×¦×’×™× ×‘×“×£ הקטגוריות:" subcategory_num_featured_topics: "מספר הנוש××™× ×”×ž×•×ž×œ×¦×™× ×‘×“×£ קטגוריית ההורה:" - all_topics_wiki: "כברירת מחדל נוש××™× ×—×“×©×™× ×™×”×™×• וויקי." subcategory_list_style: "סגנון רשימות קטגוריות משנה:" sort_order: "סידור ברירת מחדל לנוש××™×:" default_view: "תצוגת ברירת מחדל לנוש××™×:" @@ -1887,7 +1864,6 @@ he: edit_permissions: "ערוך הרש×ות" add_permission: "הוסף הרש××”" this_year: "השנה" - position: "מיקו×" default_position: "×ž×™×§×•× ×‘×¨×™×¨×ª מחדל" position_disabled: "קטגוריות יוצגו על פס סדר הפעילות. כדי לשלוט בסדר הקטגורייות ברשימה," position_disabled_click: '×פשרו ×ת ההגדרה "סדר קטגוריות קבוע".' @@ -1932,7 +1908,7 @@ he: notify_action: 'הודעה' official_warning: '×זהרה רשמית' delete_spammer: "מחק ספ×מר" - delete_confirm_MF: "××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ {POSTS, plural, one {פוסט ×חד} other {# פוסטי×}} ו{TOPICS, plural, one {× ×•×©× ×חד} other {# נוש××™×}} ממשתמש ×–×”, להסיר ×ת החשבון שלו, ×œ×—×¡×•× ×”×¨×©×ž×” מכתובת ×” IP {ip_address}, ולהוסיף ×ת כתובת המייל שלו {email} לרשימה שחורה. ×”×× ××ª× ×‘×˜×•×—×™× ×©×ž×©×ª×ž×© ×–×” ×”×•× ×‘×מת ספ×מר?" + delete_confirm_MF: "××ª× ×¢×•×ž×“×™× ×œ×”×¡×™×¨ {POSTS, plural, one {פוסט ×חד} other {# פוסטי×}} ו{TOPICS, plural, one {× ×•×©× ×חד} other {# נוש××™×}} ממשתמש ×–×”, להסיר ×ת החשבון שלו, ×œ×—×¡×•× ×”×¨×©×ž×” מכתובת ×” IP {ip_address}, ולהוסיף ×ת כתובת המייל שלו {email} לרשימה שחורה. ×”×× ××ª× ×‘×˜×•×—×™× ×©×ž×©×ª×ž×© ×–×” ×”×•× ×‘×מת ספ×מר?" yes_delete_spammer: "כן, מחק ספ×מר" ip_address_missing: "(N/A)" hidden_email_address: "(מוסתר)" @@ -1948,20 +1924,20 @@ he: custom_placeholder_notify_moderators: "ספרו לנו מה בדיוק מטריד ××ª×›× ×•×¦×¨×¤×• ×§×™×©×•×¨×™× ×¨×œ×•×•× ×˜×™×™× ×•×“×•×’×ž×ות במידת ×”×פשר." custom_message: at_least: - many: הכניסו לפחות {{count}} ×ª×•×•×™× - one: הכניסו לפחות תו ×חד - other: הכניסו לפחות {{count}} ×ª×•×•×™× - two: הכניסו לפחות {{count}} ×ª×•×•×™× + one: "הכניסו לפחות תו ×חד" + two: "הכניסו לפחות {{count}} תווי×" + many: "הכניסו לפחות {{count}} תווי×" + other: "הכניסו לפחות {{count}} תווי×" more: - many: '{{count}} נש×רו...' - one: נש×ר ×חד - other: '{{count}} נש×רו...' - two: '{{count}} נש×רו...' + one: "נש×ר ×חד" + two: "{{count}} נש×רו..." + many: "{{count}} נש×רו..." + other: "{{count}} נש×רו..." left: - many: '{{count}} נותרו' - one: נותר ×חד - other: '{{count}} נותרו' - two: '{{count}} נותרו' + one: "נותר ×חד" + two: "{{count}} נותרו" + many: "{{count}} נותרו" + other: "{{count}} נותרו" flagging_topic: title: "תודה על עזרתך לשמירה על תרבות הקהילה שלנו!" action: "דגלו נוש×" @@ -1972,17 +1948,17 @@ he: links_title: "×œ×™× ×§×™× ×¤×•×¤×œ×רי×" links_shown: "הצגת ×§×™×©×•×¨×™× × ×•×¡×¤×™×..." clicks: - many: '%{count} לחיצות' - one: לחיצה ×חת - other: '%{count} לחיצות' - two: '%{count} לחיצות' + one: "לחיצה ×חת" + two: "%{count} לחיצות" + many: "%{count} לחיצות" + other: "%{count} לחיצות" post_links: about: "הרחיבו ×œ×™× ×§×™× × ×•×¡×¤×™× ×œ×¤×•×¡×˜ ×–×”" title: - many: עוד %{count} - one: עוד 1 - other: עוד %{count} - two: עוד %{count} + one: "עוד 1" + two: "עוד %{count}" + many: "עוד %{count}" + other: "עוד %{count}" topic_statuses: warning: help: "זוהי ×זהרה רשמית." @@ -2016,30 +1992,30 @@ he: original_post: "פוסט מקורי" views: "צפיות" views_lowercase: - many: צפיות - one: צפיה - other: צפיות - two: צפיות + one: "צפיה" + two: "צפיות" + many: "צפיות" + other: "צפיות" replies: "תגובות" views_long: - many: × ×•×©× ×–×” נצפה {{number}} ×¤×¢×ž×™× - one: × ×•×©× ×–×” נצפה ×¤×¢× 1 - other: × ×•×©× ×–×” נצפה {{number}} ×¤×¢×ž×™× - two: × ×•×©× ×–×” נצפה {{number}} ×¤×¢×ž×™× + one: "× ×•×©× ×–×” נצפה ×¤×¢× 1" + two: "× ×•×©× ×–×” נצפה {{number}} פעמי×" + many: "× ×•×©× ×–×” נצפה {{number}} פעמי×" + other: "× ×•×©× ×–×” נצפה {{number}} פעמי×" activity: "פעילות" likes: "לייקי×" likes_lowercase: - many: ×œ×™×™×§×™× - one: לייק - other: ×œ×™×™×§×™× - two: ×œ×™×™×§×™× + one: "לייק" + two: "לייקי×" + many: "לייקי×" + other: "לייקי×" likes_long: "יש {{number}} ×œ×™×™×§×™× ×œ× ×•×©× ×”×–×”" users: "משתמשי×" users_lowercase: - many: ×ž×©×ª×ž×©×™× - one: משתמש - other: ×ž×©×ª×ž×©×™× - two: ×ž×©×ª×ž×©×™× + one: "משתמש" + two: "משתמשי×" + many: "משתמשי×" + other: "משתמשי×" category_title: "קטגוריה" history: "היסטוריה" changed_by: "מ×ת {{author}}" @@ -2053,10 +2029,10 @@ he: latest: title: "פורסמו ל×חרונה" title_with_count: - many: ({{count}}) פורסמו ל×חרונה - one: ×”×חרון (1) - other: ({{count}}) פורסמו ל×חרונה - two: ({{count}}) פורסמו ל×חרונה + one: "×”×חרון (1)" + two: "({{count}}) פורסמו ל×חרונה" + many: "({{count}}) פורסמו ל×חרונה" + other: "({{count}}) פורסמו ל×חרונה" help: "נוש××™× ×¢× ×ª×’×•×‘×•×ª ל×חרונה" hot: title: "×—×" @@ -2074,29 +2050,29 @@ he: unread: title: "ל×-נקר×ו" title_with_count: - many: ל×-נקר×ו ({{count}}) - one: ×œ× × ×§×¨× (1) - other: ל×-נקר×ו ({{count}}) - two: ל×-נקר×ו ({{count}}) + one: "×œ× × ×§×¨× (1)" + two: "ל×-נקר×ו ({{count}})" + many: "ל×-נקר×ו ({{count}})" + other: "ל×-נקר×ו ({{count}})" help: "נוש××™× ×©××ª× ×›×¨×’×¢ ×¦×•×¤×™× ×ו ×¢×•×§×‘×™× ××—×¨×™×”× ×¢× ×¤×•×¡×˜×™× ×©×œ× × ×§×¨×ו" lower_title_with_count: - many: 'ל×-נקר×ו {{count}} ' - one: ×œ× × ×§×¨× (1) - other: 'ל×-נקר×ו {{count}} ' - two: 'ל×-נקר×ו {{count}} ' + one: "×œ× × ×§×¨× (1)" + two: "ל×-נקר×ו {{count}} " + many: "ל×-נקר×ו {{count}} " + other: "ל×-נקר×ו {{count}} " new: lower_title_with_count: - many: '{{count}} חדשי×' - one: חדש (1) - other: '{{count}} חדשי×' - two: '{{count}} חדשי×' + one: "חדש (1)" + two: "{{count}} חדשי×" + many: "{{count}} חדשי×" + other: "{{count}} חדשי×" lower_title: "חדש" title: "חדש" title_with_count: - many: ×—×“×©×™× ({{count}}) - one: חדש (1) - other: ×—×“×©×™× ({{count}}) - two: ×—×“×©×™× ({{count}}) + one: "חדש (1)" + two: "×—×“×©×™× ({{count}})" + many: "×—×“×©×™× ({{count}})" + other: "×—×“×©×™× ({{count}})" help: "נוש××™× ×©× ×•×¦×¨×• ×‘×™×ž×™× ×”×חרוני×" posted: title: "×”×¤×•×¡×˜×™× ×©×œ×™" @@ -2107,10 +2083,10 @@ he: category: title: "{{categoryName}}" title_with_count: - many: '{{categoryName}} ({{count}})' - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' - two: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + two: "{{categoryName}} ({{count}})" + many: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "נוש××™× ×ž×“×•×‘×¨×™× ×‘×§×˜×’×•×¨×™×” {{categoryName}}" top: title: "מובילי×" @@ -2194,30 +2170,30 @@ he: print: 'ctrl+p הדפסת נוש×' badges: earned_n_times: - many: הרוויחו עיטור ×–×” %{count} ×¤×¢×ž×™× - one: הרוויחו עיטור ×–×” ×¤×¢× ×חת - other: הרוויחו עיטור ×–×” %{count} ×¤×¢×ž×™× - two: הרוויחו עיטור ×–×” %{count} ×¤×¢×ž×™× + one: "הרוויחו עיטור ×–×” ×¤×¢× ×חת" + two: "הרוויחו עיטור ×–×” %{count} פעמי×" + many: "הרוויחו עיטור ×–×” %{count} פעמי×" + other: "הרוויחו עיטור ×–×” %{count} פעמי×" granted_on: "הוענק לפני %{date}" others_count: "××—×¨×™× ×¢× ×¢×™×˜×•×¨ ×–×” (%{count})" title: ×¢×™×˜×•×¨×™× allow_title: "××ª× ×™×›×•×œ×™× ×œ×”×©×ª×ž×© בעיטור ×–×” ככותרת" multiple_grant: "××ª× ×™×›×•×œ×™× ×œ×–×›×•×ª בז×ת מספר פעמי×" badge_count: - many: '%{count} עיטורי×' - one: 1 ×¢×™×˜×•×¨×™× - other: '%{count} עיטורי×' - two: '%{count} עיטורי×' + one: "1 עיטורי×" + two: "%{count} עיטורי×" + many: "%{count} עיטורי×" + other: "%{count} עיטורי×" more_badges: - many: +%{count} × ×•×¡×¤×™× - one: +1 נוסף - other: +%{count} × ×•×¡×¤×™× - two: +%{count} × ×•×¡×¤×™× + one: "+1 נוסף" + two: "+%{count} נוספי×" + many: "+%{count} נוספי×" + other: "+%{count} נוספי×" granted: - many: '%{count} הוענקו' - one: הוענק - other: '%{count} הוענקו' - two: '%{count} הוענקו' + one: "הוענק" + two: "%{count} הוענקו" + many: "%{count} הוענקו" + other: "%{count} הוענקו" select_badge_for_title: בחרו בעיטור לשימוש בכותרת ×©×œ×›× badge_grouping: getting_started: @@ -2282,7 +2258,7 @@ he: new_name: "קבוצת תגיות חדשה" save: "שמור" delete: "מחק" - confirm_delete: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×ž×—×•×§ ×ת קבוצת התגיות הזו?" + confirm_delete: "×”×× ×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת קבוצת התגיות הזו?" topics: none: unread: "×ין ×œ×›× × ×•×©××™× ×©×œ×-נקר×ו." @@ -2404,8 +2380,8 @@ he: about: "ערוך ×ת חברות הקבוצה שלך והשמות ×›×ן" group_members: "חברי הקבוצה" delete: "מחק" - delete_confirm: "למחוק קבוצה זו?" - delete_failed: "×œ× × ×™×ª×Ÿ למחוק קבוצה זו. ×× ×–×• קבוצה ×וטומטית, ×”×™× ×‘×œ×ª×™ ניתנת למחיקה." + delete_confirm: "להסיר קבוצה זו?" + delete_failed: "×œ× × ×™×ª×Ÿ להסיר קבוצה זו. ×× ×–×• קבוצה ×וטומטית, ×”×™× ×‘×œ×ª×™ ניתנת למחיקה." delete_owner_confirm: "הסרת הרש×ות מנהל עבור '%{username}'?" add: "הוספה" custom: "מות××" @@ -2423,7 +2399,7 @@ he: generate: "ייצר" regenerate: "ייצר מחדש" revoke: "שלול" - confirm_regen: "×תה בטוח שברצונך להחליף ×ת מפתח ×”-API ב×חד חדש?" + confirm_regen: "×”×× ×‘×¨×¦×•× ×š להחליף ×ת מפתח ×”-API ב×חד חדש?" confirm_revoke: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×©×œ×•×œ ×ת המפתח ×”×–×”?" info_html: "מפתח ×”API שלך ×™×פשר לך ליצור ולעדכן נוש××™× ×‘×¢×–×¨×ª קרי×ות JSON." all_users: "כל המשתמשי×" @@ -2459,7 +2435,7 @@ he: categories_filter: "קטגוריות מופעלות" groups_filter_instructions: "webhooks ×¨×œ×•×•× ×˜×™×™× ×™×•×¤×¢×œ×• רק ×× ×”×ירוע קשור לקבוצות שהוגדרו. הש×ירו ריק כדי להפעיל webhooks לכל הקבוצות." groups_filter: "קבוצות שהופעלו" - delete_confirm: "למחוק webhook ×–×”?" + delete_confirm: "להסיר webhook ×–×”?" topic_event: name: "×ירוע נוש×" details: "×›×שר יש × ×•×©× ×—×“×©, מעודכן, ששונה, ×ו נמחק." @@ -2477,15 +2453,15 @@ he: none: "×ין ××™×¨×•×¢×™× ×§×©×•×¨×™×." redeliver: "שליחה מחדש" incoming: - many: יש {{count}} ××¨×•×¢×™× ×—×“×©×™×. - one: יש ×ירוע חדש. - other: יש {{count}} ××¨×•×¢×™× ×—×“×©×™×. - two: יש {{count}} ××¨×•×¢×™× ×—×“×©×™×. + one: "יש ×ירוע חדש." + two: "יש {{count}} ××¨×•×¢×™× ×—×“×©×™×." + many: "יש {{count}} ××¨×•×¢×™× ×—×“×©×™×." + other: "יש {{count}} ××¨×•×¢×™× ×—×“×©×™×." completed_in: - many: הושלמו ב {{count}} שניות. - one: הושלמו בשנייה ×חת. - other: הושלמו ב {{count}} שניות. - two: הושלמו ב {{count}} שניות. + one: "הושלמו בשנייה ×חת." + two: "הושלמו ב {{count}} שניות." + many: "הושלמו ב {{count}} שניות." + other: "הושלמו ב {{count}} שניות." request: "בקשה" response: "תשובה" redeliver_confirm: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×¨×•×¦×™× ×œ×©×œ×•×— מחדש ×ת ×ותו התוכן?" @@ -2521,7 +2497,7 @@ he: none: "×ין ×’×™×‘×•×™×™× ×–×ž×™× ×™×." read_only: enable: - title: "×פשרו מצב קרי××”-בלבד" + title: "הפעלת מצב קרי××”-בלבד" label: "×פשר קרי××”-בלבד" confirm: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×פשר מצב של קרי××”-בלבד?" disable: @@ -2589,7 +2565,7 @@ he: new_style: "סגנון חדש" import: "יבו×" delete: "מחק" - delete_confirm: "למחוק תמה ×–×ת?" + delete_confirm: "להסיר ערכת × ×•×©× ×–×•?" about: "שינוי סגנונות CSS וכותרות HTML ב×תר. הוספת הת×מות כדי להתחיל לערוך." color: "צבע" opacity: "שקיפות" @@ -2633,22 +2609,21 @@ he: css_html: "CSS/HTML מות×מי×" edit_css_html: "עריכת CSS/HTML" edit_css_html_help: "×œ× ×¢×¨×›×ª× ××£ CSS ×ו HTML" - delete_upload_confirm: "למחוק העל××” זו? (תמת CSS עלולה להפסיק לעבוד!)" + delete_upload_confirm: "להסיר העל××” זו? (ערכת × ×•×©× CSS עלולה להפסיק לעבוד!)" import_web_tip: "מ×גר שמכיל תמה" import_file_tip: "קובץ .dcstyle.json שמכיל תמה" about_theme: "×ודות התמה" license: "רישיון" - component_of: "התמה ×”×™× ×¨×›×™×‘ של:" update_to_latest: "עדכון לגרסה ×חרונה" check_for_updates: "בדיקת עדכוני×" updating: "מעדכני×..." up_to_date: "התמה מעודכנת, נבדקה ל×חרונה ב:" add: "הוספה" commits_behind: - many: התמה נמצ×ת {{count}} ×§×•×ž×™×˜×™× ×ž×חור! - one: התמה נמצ×ת קומיט 1 מ×חור! - other: התמה נמצ×ת {{count}} ×§×•×ž×™×˜×™× ×ž×חור! - two: התמה נמצ×ת {{count}} ×§×•×ž×™×˜×™× ×ž×חור! + one: "התמה נמצ×ת קומיט 1 מ×חור!" + two: "התמה נמצ×ת {{count}} ×§×•×ž×™×˜×™× ×ž×חור!" + many: "התמה נמצ×ת {{count}} ×§×•×ž×™×˜×™× ×ž×חור!" + other: "התמה נמצ×ת {{count}} ×§×•×ž×™×˜×™× ×ž×חור!" scss: text: "CSS" title: "עריכת CSS מות××, ×נחנו ×ž×§×‘×œ×™× ×›×œ סגנון CSS ו SCSS תקני" @@ -2777,7 +2752,6 @@ he: address_placeholder: "name@example.com" type_placeholder: "תמצית, הרשמה..." reply_key_placeholder: "מפתח תגובה" - skipped_reason_placeholder: "סיבה" logs: title: "לוגי×" action: "פעולה" @@ -2863,7 +2837,7 @@ he: screened_ips: title: "כתובות IP מסוננות" description: 'כתובות IP שנצפות כרגע. השתמש בכפתור "×פשר" בשביל לבטל חסימת כתובת' - delete_confirm: "×תה בטוח שברצונך להסיר ×ת הכלל עבור הכתובת %{ip_address}?" + delete_confirm: "×”×× ×‘×¨×¦×•× ×š להסיר ×ת הכלל עבור הכתובת %{ip_address}?" roll_up_confirm: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×’×œ×’×œ למעלה (roll up) כתובות IP שבדרך-כלל מסוננות לכדי subnets?" rolled_up_some_subnets: "ערכי IP ××¡×•×¨×™× ×’×•×œ×’×œ×• בהצלחה לרשתות המשנה הב×ות: %{subnets}." rolled_up_no_subnet: "×œ× ×”×™×” ×©×•× ×“×‘×¨ לגלגל" @@ -2886,10 +2860,10 @@ he: clear_filter: "ניקוי" show_words: "הצגת מילי×" word_count: - many: '%{count} מילי×' - one: מילה 1 - other: '%{count} מילי×' - two: '%{count} מילי×' + one: "מילה 1" + two: "%{count} מילי×" + many: "%{count} מילי×" + other: "%{count} מילי×" actions: block: 'חסימה' censor: 'צינזור' @@ -2927,15 +2901,15 @@ he: suspect: 'חשודי×' approved: "מ×ושר?" approved_selected: - many: ×שרו ×ž×©×ª×ž×©×™× ({{count}}) - one: ×שר משתמש - other: ×שרו ×ž×©×ª×ž×©×™× ({{count}}) - two: ×שרו ×ž×©×ª×ž×©×™× ({{count}}) + one: "×שר משתמש" + two: "×שרו ×ž×©×ª×ž×©×™× ({{count}})" + many: "×שרו ×ž×©×ª×ž×©×™× ({{count}})" + other: "×שרו ×ž×©×ª×ž×©×™× ({{count}})" reject_selected: - many: דחו ×ž×©×ª×ž×©×™× ({{count}}) - one: דחו משתמש - other: דחו ×ž×©×ª×ž×©×™× ({{count}}) - two: דחו ×ž×©×ª×ž×©×™× ({{count}}) + one: "דחו משתמש" + two: "דחו ×ž×©×ª×ž×©×™× ({{count}})" + many: "דחו ×ž×©×ª×ž×©×™× ({{count}})" + other: "דחו ×ž×©×ª×ž×©×™× ({{count}})" titles: active: 'הפעל משתמשי×' new: '×ž×©×ª×ž×©×™× ×—×“×©×™×' @@ -2951,15 +2925,15 @@ he: suspended: '×ž×©×ª×ž×©×™× ×ž×•×©×¢×™×' suspect: '×ž×©×ª×ž×©×™× ×—×©×•×“×™×' reject_successful: - many: '%{count} ×ž×©×ª×ž×©×™× × ×“×—×• בהצלחה.' - one: משתמש ×חד נדחה בהצלחה. - other: '%{count} ×ž×©×ª×ž×©×™× × ×“×—×• בהצלחה.' - two: '%{count} ×ž×©×ª×ž×©×™× × ×“×—×• בהצלחה.' + one: "משתמש ×חד נדחה בהצלחה." + two: "%{count} ×ž×©×ª×ž×©×™× × ×“×—×• בהצלחה." + many: "%{count} ×ž×©×ª×ž×©×™× × ×“×—×• בהצלחה." + other: "%{count} ×ž×©×ª×ž×©×™× × ×“×—×• בהצלחה." reject_failures: - many: דחיית %{count} ×ž×©×ª×ž×©×™× × ×›×©×œ×”. - one: דחיית משתמש נכשלה. - other: דחיית %{count} ×ž×©×ª×ž×©×™× × ×›×©×œ×”. - two: דחיית %{count} ×ž×©×ª×ž×©×™× × ×›×©×œ×”. + one: "דחיית משתמש נכשלה." + two: "דחיית %{count} ×ž×©×ª×ž×©×™× × ×›×©×œ×”." + many: "דחיית %{count} ×ž×©×ª×ž×©×™× × ×›×©×œ×”." + other: "דחיית %{count} ×ž×©×ª×ž×©×™× × ×›×©×œ×”." not_verified: "×œ× ×ž×ומת" check_email: title: "חשיפת כתובת הדו×\"ל של המשתמש/ת" @@ -2972,7 +2946,7 @@ he: suspend_reason: "סיבה" suspended_by: "הושעה על ידי" delete_all_posts: "מחק ×ת כל הפוסטי×" - delete_all_posts_confirm_MF: "××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ {POSTS, plural, one {פוסט ×חד} other {# פסוטי×}} ו{TOPICS, plural, one {× ×•×©× ×חד} other {# נוש××™×}}. ×”×× ××ª× ×‘×˜×•×—×™×?" + delete_all_posts_confirm_MF: "××ª× ×¢×•×ž×“×™× ×œ×”×¡×™×¨ {POSTS, plural, one {פוסט ×חד} other {# פסוטי×}} ו{TOPICS, plural, one {× ×•×©× ×חד} other {# נוש××™×}}. ×”×× ××ª× ×‘×˜×•×—×™×?" moderator: "מנהל?" admin: "מנהל ר×שי?" suspended: "מושעה?" @@ -3016,28 +2990,28 @@ he: anonymize_yes: "כן, הפיכת חשבון ×–×” ל×נונימי" anonymize_failed: "התרחשה בעיה בהפיכת חשבון ×–×” ל×נונימי." delete: "מחק משתמש/ת" - delete_forbidden_because_staff: "×œ× × ×™×ª×Ÿ למחוק ×ž× ×”×œ×™× ×•×ž× ×—×™×." - delete_posts_forbidden_because_staff: "×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×¨×¡×•×ž×™× ×©×œ מנהלי מערכת ומפקחי×." + delete_forbidden_because_staff: "×œ× × ×™×ª×Ÿ להסיר ×ž× ×”×œ×™× ×•×ž× ×—×™×." + delete_posts_forbidden_because_staff: "×œ× × ×™×ª×Ÿ להסיר ×ת כל ×”×¤×¨×¡×•×ž×™× ×©×œ מנהלי מערכת ומפקחי×." delete_forbidden: - many: ×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×¤×•×¡×˜×™×. מחקו ×ת כל ×”×¤×•×¡×˜×™× ×œ×¤× ×™ ניסיון מחיקה של משתמש. (×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ×™×ž×™× ×œ× × ×™×ª×Ÿ למחוק.) - one: ×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×”×•×“×¢×•×ª. מחקו ×ת כל ההודעות לפני ניסיון מחיקה של משתמש. (הודעות ישנות יותר ×ž×™×•× ×חד ×œ× × ×™×ª×Ÿ למחוק.) - other: ×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×¤×•×¡×˜×™×. מחקו ×ת כל ×”×¤×•×¡×˜×™× ×œ×¤× ×™ ניסיון מחיקה של משתמש. (×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ×™×ž×™× ×œ× × ×™×ª×Ÿ למחוק.) - two: ×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×¤×•×¡×˜×™×. מחקו ×ת כל ×”×¤×•×¡×˜×™× ×œ×¤× ×™ ניסיון מחיקה של משתמש. (×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ×™×ž×™× ×œ× × ×™×ª×Ÿ למחוק.) + one: "×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×”×•×“×¢×•×ª. מחקו ×ת כל ההודעות לפני ניסיון מחיקה של משתמש. (הודעות ישנות יותר ×ž×™×•× ×חד ×œ× × ×™×ª×Ÿ למחוק.)" + two: "×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×¤×•×¡×˜×™×. מחקו ×ת כל ×”×¤×•×¡×˜×™× ×œ×¤× ×™ ניסיון מחיקה של משתמש. (×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ×™×ž×™× ×œ× × ×™×ª×Ÿ למחוק.)" + many: "×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×¤×•×¡×˜×™×. מחקו ×ת כל ×”×¤×•×¡×˜×™× ×œ×¤× ×™ ניסיון מחיקה של משתמש. (×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ×™×ž×™× ×œ× × ×™×ª×Ÿ למחוק.)" + other: "×œ× × ×™×ª×Ÿ למחוק ×ž×©×ª×ž×©×™× ×× ×™×© ×œ×”× ×¤×•×¡×˜×™×. מחקו ×ת כל ×”×¤×•×¡×˜×™× ×œ×¤× ×™ ניסיון מחיקה של משתמש. (×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ×™×ž×™× ×œ× × ×™×ª×Ÿ למחוק.)" cant_delete_all_posts: - many: ×œ× × ×™×ª×Ÿ למחוק ×ת כל הפוסטי×. חלק ×ž×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ימי×. (הגדרת delete_user_max_post_age.) - one: ×œ× × ×™×ª×Ÿ למחוק ×ת כל ההודעות. חלק מההודעות ישנות יותר מ-%{count} ימי×. (הגדרת delete_user_max_post_age.) - other: ×œ× × ×™×ª×Ÿ למחוק ×ת כל הפוסטי×. חלק ×ž×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ימי×. (הגדרת delete_user_max_post_age.) - two: ×œ× × ×™×ª×Ÿ למחוק ×ת כל הפוסטי×. חלק ×ž×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ימי×. (הגדרת delete_user_max_post_age.) + one: "×œ× × ×™×ª×Ÿ למחוק ×ת כל ההודעות. חלק מההודעות ישנות יותר מ-%{count} ימי×. (הגדרת delete_user_max_post_age.)" + two: "×œ× × ×™×ª×Ÿ למחוק ×ת כל הפוסטי×. חלק ×ž×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ימי×. (הגדרת delete_user_max_post_age.)" + many: "×œ× × ×™×ª×Ÿ למחוק ×ת כל הפוסטי×. חלק ×ž×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ימי×. (הגדרת delete_user_max_post_age.)" + other: "×œ× × ×™×ª×Ÿ להסיר ×ת כל הפוסטי×. חלק ×ž×¤×•×¡×˜×™× ×™×©× ×™× ×™×•×ª×¨ מ-%{count} ימי×. (הגדרת delete_user_max_post_age.)" cant_delete_all_too_many_posts: - many: ×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×‘×’×œ×œ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מ %{count} פוסטי×. (delete_all_posts_max) - one: ×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×ž×¤× ×™ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מפוסט ×חד. (delete_all_posts_max) - other: ×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×‘×’×œ×œ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מ %{count} פוסטי×. (delete_all_posts_max) - two: ×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×‘×’×œ×œ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מ %{count} פוסטי×. (delete_all_posts_max) - delete_confirm: "×”×× ××ª× ×‘-ט-ו-×—-×™-× ×©××ª× ×¨×•×¦×™× ×œ×ž×—×•×§ משתמש ×–×”? פעולה זו קבועה ובלתי הפיכה!" + one: "×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×ž×¤× ×™ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מפוסט ×חד. (delete_all_posts_max)" + two: "×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×‘×’×œ×œ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מ %{count} פוסטי×. (delete_all_posts_max)" + many: "×œ× × ×™×ª×Ÿ למחוק ×ת כל ×”×¤×•×¡×˜×™× ×‘×’×œ×œ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מ %{count} פוסטי×. (delete_all_posts_max)" + other: "×œ× × ×™×ª×Ÿ להסיר ×ת כל ×”×¤×•×¡×˜×™× ×‘×’×œ×œ ×©×œ×ž×©×ª×ž×©×™× ×™×•×ª×¨ מ %{count} פוסטי×. (delete_all_posts_max)" + delete_confirm: "×”×× ××ª× ×‘-ט-ו-×—-×™-× ×©××ª× ×¨×•×¦×™× ×œ×”×¡×™×¨ משתמש ×–×”? פעולה זו קבועה ובלתי הפיכה!" delete_and_block: "מחיקה וחסימת כתובת דו×\"ל וכתובת IP ×לה" delete_dont_block: "מחיקה בלבד" deleted: "המשתמש נמחק." - delete_failed: "הייתה שגי××” במחיקת המשתמש. יש ×œ×•×•×“× ×©×›×œ ×”×¤×•×¡×˜×™× × ×ž×—×§×• לפני ניסיון למחוק ×ת המשתמש." + delete_failed: "הייתה שגי××” במחיקת המשתמש. יש ×œ×•×•×“× ×©×›×œ ×”×¤×•×¡×˜×™× × ×ž×—×§×• לפני ניסיון להסיר ×ת המשתמש." send_activation_email: "שלח הודעת הפעלת חשבון" activation_email_sent: "נשלחה הודעת הפעלת חשבון" send_activation_email_failed: "הייתה בעיה בשליחת הודעת ×”×ישור. %{error}" @@ -3068,10 +3042,10 @@ he: tl3_requirements: title: "דרישות עבור רמת ×מון 3" table_title: - many: 'ב %{count} ×”×™×ž×™× ×”×חרוני×:' - one: '×‘×™×•× ×”×חרון:' - other: 'ב %{count} ×”×™×ž×™× ×”×חרוני×:' - two: 'ב %{count} ×”×™×ž×™× ×”×חרוני×:' + one: "×‘×™×•× ×”×חרון:" + two: "ב %{count} ×”×™×ž×™× ×”×חרוני×:" + many: "ב %{count} ×”×™×ž×™× ×”×חרוני×:" + other: "ב %{count} ×”×™×ž×™× ×”×חרוני×:" value_heading: "ערך" requirement_heading: "דרישה" visits: "ביקורי×" @@ -3113,7 +3087,7 @@ he: edit: "עריכה" delete: "מחיקה" cancel: "ביטול" - delete_confirm: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×¨×•×¦×™× ×œ×ž×—×•×§ ×ת שדה המשתמש ×”×–×”?" + delete_confirm: "×”×× ×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת שדה המשתמש ×”×–×”?" options: "×פשרויות" required: title: "נדרש בעת הרשמה?" @@ -3195,7 +3169,7 @@ he: reason_help: (קישור לפוסט ×ו לנוש×) save: שמור delete: מחק - delete_confirm: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×ž×—×•×§ ×ת העיטור ×”×–×”?" + delete_confirm: "××ª× ×©×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת העיטור ×”×–×”?" revoke: שלול reason: סיבה expand: הרחבה … @@ -3210,7 +3184,7 @@ he: allow_title: ×פשר לעיטור להיות בשימוש ככותרת. multiple_grant: ×™×›×•×œ×™× ×œ×”×™× ×ª×Ÿ מספר ×¤×¢×ž×™× listable: הצגת ×¢×™×˜×•×¨×™× ×‘×¢×ž×•×“ ×”×¢×™×˜×•×¨×™× ×”×¤×•×ž×‘×™ - enabled: ×פשרו עיטור + enabled: הפעלת ×¢×™×˜×•×¨×™× icon: סמליל image: תמונה query: ש×ילתת עיטור (SQL) @@ -3236,10 +3210,10 @@ he: text: "חסרות דוגמ×ות ×”×¢× ×§×”. ×–×” קורה כשחיפוש ×¢×™×˜×•×¨×™× ×ž×—×–×™×¨ מזהה משתמש ×ו מזהה פוסט ש××™× × ×§×™×™×ž×™×. ×–×” עלול ×œ×’×¨×•× ×œ×ª×•×¦×ות ×œ× ×¦×¤×•×™×•×ª מ×וחר יותר - ×× × ×‘×“×§×• שוב ×ת מחרוזת החיפוש שלכ×." no_grant_count: "×ין ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”." grant_count: - many: %{count} ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”. - one: עיטור ×חד להקצ××”. - other: %{count} ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”. - two: %{count} ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”. + one: "עיטור ×חד להקצ××”." + two: "%{count} ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”." + many: "%{count} ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”." + other: "%{count} ×¢×™×˜×•×¨×™× ×œ×”×§×¦××”." sample: "דוגמה:" grant: with: "%{username}" @@ -3252,11 +3226,11 @@ he: add: "הוספת ×מוג'×™ חדש" name: "ש×" image: "תמונה" - delete_confirm: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×¨×•×¦×™× ×œ×ž×—×•×§ ×ת ×”×מוג'×™ :%{name}:?" + delete_confirm: "×”×× ×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת ×”×מוג'×™ :%{name}:?" embedding: get_started: "×× ×‘×¨×¦×•× ×›× ×œ×©×œ×‘ ×ת דיסקורס ב×תר ×חר, התחילו בהוספת השרת שלו." - confirm_delete: "×”×× ××ª× ×‘×˜×•×—×™× ×©××ª× ×¨×•×¦×™× ×œ×ž×—×•×§ ×ת ×”host ×”×–×”? " - sample: "השתמש בקוד HTML ×”×‘× ×‘×תר שלך על מנת ליצור נוש××™ דיסקורס משולבי×. החלף REPLACE_ME ב URL ×”×§×נוני של העמוד שבו ×תה מכניס × ×•×©× ×ž×›×•× ×Ÿ. " + confirm_delete: "×”×× ×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת ×”host ×”×–×”? " + sample: "השתמש בקוד HTML ×”×‘× ×‘×תר שלך על מנת ליצור נוש××™ דיסקורס משולבי×. החלף REPLACE_ME ב URL ×”×§×נוני של העמוד שבו ××ª× ×›×•×ª×‘×™× × ×•×©× ×ž×›×•× ×Ÿ. " title: "שילוב (embedding)" host: "×©×¨×ª×™× ×ž×•×¨×©×™×" class_name: "×©× ×ž×—×œ×§×”" @@ -3291,7 +3265,7 @@ he: category_id: "מזהה לקטגוריה" category_title: "קטגוריה" external_url: "URL חיצוני" - delete_confirm: "××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×ž×—×•×§ ×ת הלינק הקבוע?" + delete_confirm: "×”×× ×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨ ×ת הקישור הקבוע?" form: label: "חדש:" add: "הוסף" diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml new file mode 100644 index 0000000000..69ecda0102 --- /dev/null +++ b/config/locales/client.hu.yml @@ -0,0 +1,2992 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + js: + number: + format: + separator: "." + delimiter: "," + human: + storage_units: + format: '%n %u' + units: + byte: + one: Bájt + other: Bájt + gb: GB + kb: KB + mb: MB + tb: TB + short: + thousands: "{{number}} ezer" + millions: "{{number}} millió" + dates: + time: "h:mm a" + timeline_date: "YYYY MMMM" + long_no_year: "MMM D h:mm a" + long_no_year_no_time: "MMM D" + full_no_year_no_time: "MMM DD" + long_with_year: "MMM D, YYYY h:mm a" + long_with_year_no_time: "MMM D, YYYY" + full_with_year_no_time: "YYYY MMMM dddd" + long_date_with_year: "MMM D, 'YY LT" + long_date_without_year: "MMM D, LT" + long_date_with_year_without_time: "MMM D, 'YY" + long_date_without_year_with_linebreak: "MMM D
LT" + long_date_with_year_with_linebreak: "MMM D, 'YY
LT" + wrap_ago: "%{date} ezelÅ‘tt" + tiny: + half_a_minute: "< 1p" + less_than_x_seconds: + one: "< 1mp" + other: "< %{count}mp" + x_seconds: + one: "1 mp" + other: "%{count} mp" + less_than_x_minutes: + one: "< 1 perc" + other: "< %{count}perc" + x_minutes: + one: "1p" + other: "%{count}p" + about_x_hours: + one: "1ó" + other: "%{count}ó" + x_days: + one: "1n" + other: "%{count}n" + x_months: + one: "hó" + other: "%{count} hónap" + about_x_years: + one: "1é" + other: "%{count}é" + over_x_years: + one: "> 1é" + other: "> %{count}é" + almost_x_years: + one: "1é" + other: "%{count}é" + date_month: "MMM D" + date_year: "MMM 'YY" + medium: + x_minutes: + one: "1 perc" + other: "%{count} perc" + x_hours: + one: "1 óra" + other: "%{count} óra" + x_days: + one: "1 nap" + other: "%{count} nap" + date_year: "MMM D, 'YY" + medium_with_ago: + x_minutes: + one: "1 perce" + other: "%{count} perce" + x_hours: + one: "1 órája" + other: "%{count} órája" + x_days: + one: "1 napja" + other: "%{count} napja" + later: + x_days: + one: "%{count} nappal késÅ‘bb" + other: "%{count} nappal késÅ‘bb" + x_months: + one: "%{count} hónappal késÅ‘bb" + other: "%{count} hónappal késÅ‘bb" + x_years: + one: "%{count} évvel késÅ‘bb" + other: "%{count} évvel késÅ‘bb" + previous_month: 'ElÅ‘zÅ‘ hónap' + next_month: 'KövetkezÅ‘ hónap' + placeholder: dátum + share: + topic: 'link megosztása ebbe a témába' + post: 'bejegyzés #%{postNumber}' + close: 'bezár' + twitter: 'a hivatkozás megosztása a Twitteren' + facebook: 'a hivatkozás megosztása a Facebookon' + google+: 'a hivatkozás megosztása a Google+ -on' + email: 'a hivatkozás elküldése e-mailben' + action_codes: + public_topic: "publikussá tette ezt a témát ekkor: %{when}" + private_topic: "ez a téma privát üzenetté téve ekkor: %{when}" + split_topic: "felosztotta a témát ekkor: %{when}" + invited_user: "meghívta %{who} %{when}" + invited_group: "meghívta %{who} %{when}" + user_left: "%{who}eltávolította magát %{when}-kor ebbÅ‘l az üzenetbÅ‘l" + removed_user: "törölve %{who} %{when}" + removed_group: "törölte %{who} %{when}" + autoclosed: + enabled: 'lezárva: %{when}' + disabled: 'megnyitva %{when}' + closed: + enabled: 'lezárva: %{when}' + disabled: 'megnyitva %{when}' + archived: + enabled: 'archiválva: %{when}' + disabled: 'visszahozva: %{when}' + pinned: + enabled: 'kitűzve: %{when}' + disabled: 'kitűzés megszűntetve: %{when}' + pinned_globally: + enabled: 'globálisan kitűzve: %{when}' + disabled: 'Kitűzés megszüntetve: %{when}' + visible: + enabled: 'listázva %{when}' + disabled: 'nem listázva: %{when}' + banner: + enabled: 'banner létrehozva %{when}-kor. Amíg a felhasználó nem törli, megjelenik minden oldal tetején.' + disabled: 'banner eltávolítva %{when}-kor. Nem jelenik meg többé minden oldal tetején.' + topic_admin_menu: "Téma admin lehetÅ‘ségek" + wizard_required: "Üdvözlünk az új Discourse-on! Kezdjük a beállításvarázslóval! ✨" + emails_are_disabled: "Egy adminisztrátor letilotta a kimenÅ‘ emaileket. Semmilyen értesítÅ‘ emailt nem küldünk." + bootstrap_mode_disabled: "A bootstrap mód 24 órán belül kikapcsol." + themes: + default_description: "Alapértelmezett" + s3: + regions: + ap_northeast_1: "Csendes-óceáni térség (Tokió)" + ap_northeast_2: "Csendes-óceáni térség (Szöul)" + ap_south_1: "Csendes-óceáni térség (Mumbai)" + ap_southeast_1: "Csendes-óceáni térség (Szingapúr)" + ap_southeast_2: "Csendes-óceáni térség (Sydney)" + cn_north_1: "Kína (Peking)" + eu_central_1: "EU (Frankfurt)" + eu_west_1: "EU (Ãrország)" + eu_west_2: "EU (London)" + eu_west_3: "EU (Párizs)" + sa_east_1: "Dél-Amerika (Sao Paolo)" + us_east_1: "US Kelet (N. Virginia)" + us_east_2: "US Kelet (Ohio)" + us_gov_west_1: "AWS GovCloud (US)" + us_west_1: "US Nyugat (N. California)" + us_west_2: "US Nyugat (Oregon)" + edit: 'a témakör címének és kategóriájának szerkesztése' + not_implemented: "Sajnáljuk, de még megvalósításra vár ez a funkció!" + no_value: "Nem" + yes_value: "Igen" + submit: "Beküldés" + generic_error: "Sajnos hiba történt." + generic_error_with_reason: "Hiba történt: %{error}" + sign_up: "Regisztráció" + log_in: "Bejelentkezés" + age: "Életkor" + joined: "Tagság kezdete" + admin_title: "Adminisztrátor" + flags_title: "JelzÅ‘" + show_more: "mutass többet" + show_help: "opciók" + links: "Hivatkozások" + links_lowercase: + one: "hivatkozás" + other: "hivatkozások" + faq: "GYIK" + guidelines: "Irányelvek" + privacy_policy: "Adatvédelmi szabályzat" + privacy: "Adatvédelem" + tos: "Szolgáltatási feltételek" + mobile_view: "Mobil nézet" + desktop_view: "Asztali nézet" + you: "Te" + or: "vagy" + now: "az imént" + read_more: 'olvass többet' + more: "Több" + less: "Kevesebb" + never: "soha" + every_30_minutes: "30 percenként" + every_hour: "óránként" + daily: "naponta" + weekly: "hetente" + every_two_weeks: "kéthetente" + every_three_days: "háromnaponta" + max_of_count: "maximum {{count}}" + alternation: "vagy" + character_count: + one: "{{count}} karakter" + other: "{{count}} karakter" + suggested_topics: + title: "Ajánlott témakörök" + pm_title: "Ajánlott üzenetek" + about: + simple_title: "A fórumról" + title: "A(z) %{title} fórumról" + stats: "Webhelystatisztika" + our_admins: "Adminisztrátoraink" + our_moderators: "Moderátoraink" + stat: + all_time: "Összes" + last_7_days: "Utolsó 7" + last_30_days: "Utolsó 30" + like_count: "Kedvelte" + topic_count: "Témák" + post_count: "Bejegyzések" + user_count: "Felhasználók" + active_user_count: "Aktív felhasználók" + contact: "Kapcsolat" + contact_info: "A webhellyel kapcsolatos sürgÅ‘s vagy kritikus probléma esetén lépj velünk kapcsolatba a következÅ‘ elérhetÅ‘ségen: %{contact_info}." + bookmarked: + title: "KönyvjelzÅ‘" + clear_bookmarks: "KönyvjelzÅ‘k Törlése" + help: + bookmark: "Kattints, hogy a témakör elsÅ‘ bejegyzését betedd a könyvjelzÅ‘k közé" + unbookmark: "Kattints a témakör valamennyi könyvjelzÅ‘jének törléséhez" + bookmarks: + not_logged_in: "sajnáljuk, de a bejegyzések könyvjelzÅ‘vel való ellátásához be kell jelentkezned" + created: "ezt a bejegyzést könyvjelzÅ‘vel láttad el" + not_bookmarked: "elolvastad ezt a bejegyzést, kattints ide a könyvjelzÅ‘vel való ellátásához" + last_read: "ez az utolsó bejegyzés, amit elolvastál, kattints ide a könyvjelzÅ‘vel való ellátásához" + remove: "KönyvjelzÅ‘ eltávolítása" + confirm_clear: "Biztosan törölni szeretnéd a könyvjelzÅ‘ket ebbÅ‘l a témakörbÅ‘l?" + drafts: + resume: "Folytatás" + remove: "Eltávolítás" + new_topic: "Új téma vázlat" + new_private_message: "Új személyes üzenet besorolása" + topic_reply: "Választervezet" + topic_count_latest: + one: "Megnézni {{count}} új vagy frissített témát" + other: "Megnézni {{count}} új vagy frissített témákat" + topic_count_unread: + one: "Megnézni {{count}} nemlátott témát" + other: "Megnézni {{count}} olvasatlan témákat" + topic_count_new: + one: "Megnézni {{count}} új témát" + other: "Megnézni {{count}} új témákat" + preview: "elÅ‘nézet" + cancel: "mégse" + save: "Módosítások mentése" + saving: "Mentés..." + saved: "Mentve!" + upload: "Feltöltés" + uploading: "Feltöltés..." + uploading_filename: "{{filename}} feltöltése..." + uploaded: "Feltöltve!" + pasting: "Beillesztés..." + enable: "Engedélyezés" + disable: "Letiltás" + continue: "Folytatás" + undo: "Visszavonás" + revert: "Visszaállítás" + failed: "Sikertelen" + switch_to_anon: "Belépés az anonim módba" + switch_from_anon: "Kilépés az anonim módból" + banner: + close: "Banner eltüntetése." + edit: "Banner szerkesztése" + choose_topic: + none_found: "Nem találhatók témák." + title: + search: "Témakör keresése név, URL-cím vagy azonosító alapján:" + placeholder: "ide írd be a témakör címét" + queue: + topic: "Téma:" + approve: 'Jóváhagy' + reject: 'Elutasít' + delete_user: 'Felhasználó Törlése' + title: "Jóváhagyásra vár" + none: "Nincs átnézésre váró bejegyzés" + edit: "Szerkesztés" + cancel: "Mégse" + view_pending: "függÅ‘ben lévÅ‘ bejegyzések megtekintése" + has_pending_posts: + one: "Ebben a témakörben {{count}} hozzászólás vár jóváhagyásra" + other: "Ebben a témakörben {{count}} hozzászólás vár jóváhagyásra" + confirm: "Módosítások mentése" + delete_prompt: "Biztos vagy benne, hogy törölni akarod %{username} felhasználót? Ezzel törlöd minden bejegyzését és blokkolod az e-mail és IP-címét." + approval: + title: "A bejegyzés jóváhagyásra vár." + description: "Megkaptuk a bejegyzésedet, de egy moderátornak jóvá kell hagynia, mielÅ‘tt megjelenne. Köszönjük a türelmedet." + pending_posts: + one: "1 függÅ‘ben lévÅ‘ bejegyzés" + other: "{{count}} függÅ‘ben lévÅ‘ bejegyzése" + ok: "Rendben" + user_action: + user_posted_topic: "{{user}} kitett egy témát" + you_posted_topic: "Te kitettél egy témát" + user_replied_to_post: "{{user}} válaszolt a következÅ‘ bejegyzésre: {{post_number}}" + you_replied_to_post: "Te válaszoltál a következÅ‘ bejegyzésre: {{post_number}}" + user_replied_to_topic: "{{user}} válaszolt a témára" + you_replied_to_topic: "Te válaszoltál a témára" + user_mentioned_user: "{{user}} megemlítette a következÅ‘ felhasználót: {{another_user}}" + user_mentioned_you: "{{user}} megemlített téged" + you_mentioned_user: "Te megemlítetted a következÅ‘ felhasználót: {{another_user}}" + posted_by_user: "{{user}} bejegyzése" + posted_by_you: "A te bejegyzésed" + sent_by_user: "{{user}} küldte" + sent_by_you: "Te küldted" + directory: + filter_name: "szűrés felhasználónév szerint" + title: "Felhasználók" + likes_given: "Adott" + likes_received: "Kapott" + topics_entered: "Megtekintve" + topics_entered_long: "Megtekintett témakörök" + time_read: "olvasással töltött idÅ‘" + topic_count: "Témák" + topic_count_long: "Létrehozott Témák" + post_count: "Válaszok" + post_count_long: "Elküldött Válaszok" + no_results: "Nincs találat." + days_visited: "Látogatások" + days_visited_long: "látogatott napok" + posts_read: "Olvasott" + posts_read_long: "Elolvasott bejegyzések" + total_rows: + one: "1 felhasználó" + other: "%{count} felhasználó" + group_histories: + actions: + change_group_setting: "Csoport beállítások megváltoztatása." + add_user_to_group: "Felhasználó hozzáadása" + remove_user_from_group: "Felhasználó eltávolítása" + make_user_group_owner: "Tulajdonos létrehozása" + remove_user_as_group_owner: "Tulajdonosi jog visszavonása" + groups: + add_members: + title: "Tagok hozzáadása" + description: "A csoport tagságának kezelése" + usernames: "Felhasználónevek" + manage: + title: 'Kezelés' + name: 'Név' + full_name: 'Teljes név' + add_members: "Tagok hozzáadása" + delete_member_confirm: "Eltávolítod %{username} felhasználót a %{group} csoportból?" + profile: + title: Profil + interaction: + title: Interakció + posting: Közzététel + notification: Értesítés + membership: + title: Tagság + access: Hozzáférés + logs: + title: "Naplók" + when: "Mikor" + action: "Művelet" + acting_user: "CselekvÅ‘ felhasználó" + target_user: "Célzott felhasználó" + subject: "Téma" + details: "Részletek" + from: "KitÅ‘l" + to: "Kinek" + public_admission: "Megengedi a felhasználóknak, hogy szabadon csatlakozzanak a csoporthoz (Szükséges, hogy a csoport publikusan látható legyen)" + public_exit: "Megengedi a felhasználóknak, hogy szabadon elhagyhassák a csoportot" + empty: + posts: "A csoport tagjai még nem írtak bejegyzést." + members: "Nincsenek tagok ebben a csoportban." + mentions: "Nincsenek említések errÅ‘l a csoportról." + messages: "Nincsenek üzenetek intézve ehhez a csoporthoz." + topics: "A csoport tagjai még nem hoztak létre témát." + logs: "Nincsenek ehhez a csoporthoz tartozó naplók." + add: "Hozzáadás" + join: "Belépés" + leave: "Elhagyás" + request: "Kérelmezés" + message: "Üzenet" + allow_membership_requests: "Megengedi a felhasználóknak, hogy tagsági kérelmeket küldjenek a csoporttulajdonosoknak" + membership_request_template: "A felhasználóknak megjelenítendÅ‘ egyéni sablon tagsági kérelmekhez." + membership_request: + submit: "Kérelem beküldése" + title: "Kérelem a(z) @%{group_name} nevű csoporthoz való csatlakozáshoz" + reason: "A csoport tulajdonosok tájékoztatása, hogy miért tartozol ebbe csoportba" + membership: "Tagság" + name: "Név" + group_name: "Csoport név" + user_count: "Felhasználók" + bio: "A csoportról" + selector_placeholder: "felhasználónév megadása" + owner: "tulajdonos" + index: + title: "Csoportok" + all: "Minden csoport" + empty: "Nincsenek látható csoportok." + filter: "Szűrés csoportnév alapján" + owner_groups: "Ezeknek a csoportoknak vagyok a tulajdonosa: " + close_groups: "Zárt csoportok" + automatic_groups: "Automatikus csoportok" + automatic: "Automatikus" + closed: "Lezárva" + public: "Nyilvános" + private: "Privát" + public_groups: "Nyilvános csoportok" + automatic_group: Automatikus csoport + close_group: Csoport lezárása + my_groups: "Csoportjaim" + group_type: "Csoport típus" + is_group_user: "Tag" + is_group_owner: "Tulajdonos" + title: + one: "Csoport" + other: "Csoportok" + activity: "Aktivitás" + members: + title: "Tagok" + filter_placeholder_admin: "felhasználónév vagy e-mail-cím" + filter_placeholder: "felhasználónév" + remove_member: "Tag eltávolítása" + remove_member_description: "%{username} eltávolítása a csoportból" + make_owner: "Tulajdonossá tétel" + make_owner_description: "%{username} csoporttulajdonossá tétele" + remove_owner: "Eltávolítás tulajdonosként" + remove_owner_description: "%{username} eltávolítása a csoportból csoporttulajdonoként" + owner: "Tulajdonos" + topics: "Témák" + posts: "Bejegyzések" + mentions: "Említések" + messages: "Üzenetek" + notification_level: "Csoport üzenetek alapértelmezett értesítési szintje" + alias_levels: + mentionable: "Ki @említheti meg ezt a csoportot?" + messageable: "Ki üzenhet ennek a csoportnak?" + nobody: "Senki" + only_admins: "Csak az adminisztrátorok" + mods_and_admins: "Csak a moderátorok és az adminisztrátorok" + members_mods_and_admins: "Csak a csoporttagok, a moderátorok és az adminisztrátorok" + everyone: "Mindenki" + notifications: + watching: + title: "Figyelés" + description: "Értesítést fogsz kapni minden üzenetben lévÅ‘ új bejegyzésrÅ‘l és megjelenik az olvasatlan válaszok száma is." + watching_first_post: + title: "ElsÅ‘ hozzászólások figyelése" + description: "Csak minden új téma elsÅ‘ hozzászólásáról kapsz értesítést ebben a csoportban." + tracking: + title: "Követés" + description: "Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked, és megjelenik az olvasatlan válaszok száma is." + regular: + title: "Normál" + description: "Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked." + muted: + title: "Némítás" + description: "Egyáltalán nem fogsz értesítést kapni az ebben a csoportban lévÅ‘ új témákról." + flair_url: "Avatar Flair kép" + flair_url_placeholder: "(Opcionális) Kép url címe vagy Font Awesome css osztálya" + flair_bg_color: "Avatar Flair háttér szín" + flair_bg_color_placeholder: "(Opcionális) Hex színkód érték" + flair_color: "Avatar Flair szín" + flair_color_placeholder: "(Opcionális) Hex színkód érték" + flair_preview_icon: "Ikon elÅ‘nézete" + flair_preview_image: "Kép elÅ‘nézete" + user_action_groups: + "1": "Adott tetszésnyilvánítások" + "2": "Kapott tetszésnyilvánítások" + "3": "KönyvjelzÅ‘k" + "4": "Témák" + "5": "Válaszok" + "6": "Válaszok" + "7": "Említések" + "9": "Idézések" + "11": "Szerkesztések" + "12": "Elküldött elemek" + "13": "Beérkezett üzenetek" + "14": "Folyamatban" + "15": "Vázlatok" + categories: + all: "minden kategória" + all_subcategories: "összes" + no_subcategory: "egyik sem" + category: "Kategória" + category_list: "Kategória lista mutatása" + reorder: + title: "Kategóriák átrendezése" + title_long: "a kategória lista újrarendezése." + save: "Sorrend mentése" + apply_all: "Elfogadás" + position: "Pozíció" + posts: "Bejegyzések" + topics: "Témák" + latest: "Legutóbbi" + latest_by: "legkésÅ‘bb" + toggle_ordering: "rendezés megfordítása" + subcategories: "Alkategóriák" + topic_sentence: + one: "1 téma" + other: "%{count} téma" + topic_stat_sentence: + one: "%{count} új témakör az elmúlt %{unit} során." + other: "%{count} új témakör az elmúlt %{unit} során." + more: "(még %{count}) ..." + ip_lookup: + title: IP-cím keresése + hostname: Gépnév + location: Hely + location_not_found: (ismeretlen) + organisation: Szervezet + phone: Telefon + other_accounts: "További fiókok ezzel az IP-címmel:" + delete_other_accounts: "%{count} törlése" + username: "felhasználónév" + trust_level: "BSZ" + read_time: "olvasási idÅ‘" + topics_entered: "témákba lépett" + post_count: "# bejegyzés" + confirm_delete_other_accounts: "Biztosan törölni szeretnéd ezeket a fiókokat?" + powered_by: "ipinfo.io által" + user_fields: + none: "(válassz egy lehetÅ‘séget)" + user: + said: "{{username}}:" + profile: "Profil" + mute: "Némítás" + edit: "Beállítások szerkesztése" + download_archive: + button_text: "Összes letöltése" + confirm: "Biztosan le szeretnéd tölteni a bejegyzéseidet?" + success: "A letöltés elkezdÅ‘dött. Értesítünk, amint befejezÅ‘dött." + rate_limit_error: "A bejegyzések naponta csak egyszer töltetÅ‘k le. Kérünk, próbáld újra holnap." + new_private_message: "Új Üzenet" + private_message: "Üzenet" + private_messages: "Üzenetek" + activity_stream: "Aktivitás" + preferences: "Beállítások" + expand_profile: "KibÅ‘vítés" + collapse_profile: "Összecsukás" + bookmarks: "KönyvjelzÅ‘k" + bio: "Rólam" + invited_by: "Meghívta" + trust_level: "Bizalmi szint" + notifications: "Értesítések" + statistics: "Statisztikák" + desktop_notifications: + label: "ElÅ‘ értesítések" + not_supported: "Az értesítések nem támogatottak ebben a böngészÅ‘ben. Sajnáljuk." + perm_default: "Értesítések bekapcsolása" + perm_denied_btn: "Hozzáférés megtagadva." + perm_denied_expl: "Letiltottad a figyelmeztetéseket. Engedélyezd Å‘ket a böngészÅ‘dben." + disable: "Értesítések kikapcsolása" + enable: "Értesítések bekapcsolása" + each_browser_note: "Megjegyzés: Minden böngészÅ‘ben be kell állítanod ezt a beállítást, amit használsz." + consent_prompt: "Szeretnél élÅ‘ értesítéseket kapni, amikor valaki visszaír a hozzászólásaidra?" + dismiss: 'Elvet' + dismiss_notifications: "Összes elvetése" + dismiss_notifications_tooltip: "Minden olvasatlan értesítés olvasottnak jelölése" + first_notification: "Az elsÅ‘ értesítésed! Válaszd ki a kezdéshez." + disable_jump_reply: "Ne ugorj a bejegyzésemre a válaszom után" + dynamic_favicon: "Mutasd az új / frissített témák számát a böngészÅ‘ ikonján" + theme_default_on_all_devices: "Ez a téma legyen az alapértelmezett minden eszközömön." + allow_private_messages: "Engedd a többi felhasználónak, hogy privát üzeneteket küldjenek nekem" + external_links_in_new_tab: "Minden külsÅ‘ hivatkozás új ablakban való megnyitása" + enable_quoting: "A kijelölt szöveg engedélyezése idézetként" + change: "megváltoztatás" + moderator: "{user}} egy moderátor" + admin: "{user}} egy adminisztrátor" + moderator_tooltip: "Ez a felhasználó egy moderátor" + admin_tooltip: "Ez a felhasználó egy adminisztrátor" + silenced_tooltip: "Ez a felhasználó némítva van" + suspended_notice: "Ez a felhasználó fel van függesztve eddig: {{date}}." + suspended_permanently: "Ez a felhasználó fel van függesztve." + suspended_reason: "Ok:" + github_profile: "Github" + email_activity_summary: "Aktivitás Összefoglaló" + mailing_list_mode: + label: "LevelezÅ‘lista mód" + enabled: "LevelezÅ‘lista mód bekapcsolása" + instructions: | + Ez a beállítás felülírja az aktivitás összefoglalót.
+ Némított témák és kategóriák nem lesznek benne ezekben az emailekben. + individual: "Küldjön e-mailt minden új hozzászólásról" + individual_no_echo: "Küldjön e-mailt minden új hozzászólásról kivéve a sajátokat" + many_per_day: "Küldjön e-mailt minden új hozzászólás után (naponta kb. {{dailyEmailEstimate}} db)" + few_per_day: "Küldjön e-mailt minden új hozzászólás után (naponta kb. 2 db)" + warning: "LevelezÅ‘lista üzemmód bekapcsolva. Az e-mail értesítések beállításai felülbírálva." + tag_settings: "Címkék" + watched_tags: "Figyelve" + watched_tags_instructions: "Automatikusan figyeltetni fogod az összes ezen a címkékkel ellátott témát. Értesítést fogsz kapni az összes új hozzászólásról és témáról, és az új hozzászólások száma megfog jelenni a téma mellett." + tracked_tags: "Követve" + tracked_tags_instructions: "Automatikusan követni fogsz minden ilyen címkéjű témakört. Az új hozzászólások száma megfog jelenni a téma mellett." + muted_tags: "Némítva" + muted_tags_instructions: "Egyáltalán nem fogsz kapni semmilyen értesítést ennek a kategóriának a témaköreirÅ‘l és legújabbak között sem fog megjelenni." + watched_categories: "Figyelve" + watched_categories_instructions: "Automatikusan figyelni fogod ezeket a kategóriákat. Értesítést fogsz kapni minden új témáról és bejegyzésrÅ‘l, a témakörök neve mellett meg fog jelenni az új bejegyzések számlálója is." + tracked_categories: "Követve" + tracked_categories_instructions: "Automatikusan nyomon fog követni minden új témát ezekben a kategóriákban " + watched_first_post_categories: "ElsÅ‘ bejegyzés megtekintése" + watched_first_post_categories_instructions: "Csak minden új témakör legelsÅ‘ hozzászólásáról fogsz értesítést kapni ezekben a kategóriákban." + watched_first_post_tags: "ElsÅ‘ bejegyzés megtekintése" + muted_categories: "Lenémítva" + no_category_access: "Moderátorként kategóriákra van limitálva a hozzáférésed, mentés le van tiltva." + delete_account: "Fiókom törlése" + delete_account_confirm: "Biztosan végleg törölni akarod a fiókodat? Ez a művelet nem vonható vissza!" + deleted_yourself: "A fiókod törlése sikerült." + delete_yourself_not_allowed: "Kérlek kozlultálj egy staff taggal, ha azt szeretnéd, hogy a fiók törlésre kerüljön." + unread_message_count: "Üzenetek" + admin_delete: "Törlés" + users: "Felhasználók" + muted_users: "Lenémítva" + muted_users_instructions: "Minden értesítés letiltása ezektÅ‘l a felhasználoktól" + muted_topics_link: "Némított témák mutatása" + watched_topics_link: "Figyelt témák mutatása" + tracked_topics_link: "Követett témák mutatása" + automatically_unpin_topics: "Automatikusan letűzi a témát amikor elérem az alját." + apps: "Alkalmazások" + revoke_access: "Hozzáférés visszavonása" + undo_revoke_access: "Hozzáférés visszaállítása" + api_approved: "Jóváhagyva:" + theme: "Stílus" + home: "Alap fÅ‘oldal" + staff_counters: + flags_given: "hasznos jelölések" + flagged_posts: "megjelölt bejegyzések" + deleted_posts: "törölt bejegyzések" + suspensions: "felfüggesztések" + warnings_received: "figyelmeztetések" + messages: + all: "Mind" + inbox: "BejövÅ‘" + sent: "Küldött" + archive: "Archívum" + groups: "Csoportjaim" + bulk_select: "Üzenetek kiválasztása" + move_to_inbox: "Ãthelyezés a bejövÅ‘ üzenetek közé" + move_to_archive: "Archívum" + failed_to_move: "Nem sikerült a kijelölt üzeneteket átmozgatni. (Valószínűleg nincs hálózat.)" + select_all: "Összes kijelölése" + tags: "Címkék" + preferences_nav: + account: "Fiók" + profile: "Profil" + emails: "Emailek" + notifications: "Értesítések" + categories: "Kategóriák" + tags: "Címkék" + interface: "Felület" + apps: "Alkalmazások" + change_password: + success: "(az e-mail elküldve)" + in_progress: "(az e-mail küldése folyamatban)" + error: "(hiba)" + action: "E-mail küldése új jelszó megadásáról" + set_password: "Jelszó megadása" + choose_new: "Új jelszó" + choose: "Új jelszó" + second_factor_backup: + regenerate: "Újragenerálás" + disable: "Kikapcsol" + enable: "Engedélyez" + manage: "VisszatérítÅ‘ kódok kezelése" + copied_to_clipboard: "Vágólapra másolva" + copy_to_clipboard_error: "Hiba az adat Vágólapra másolása során" + second_factor: + title: "Két-faktoros hitelesítés" + disable: "Két-faktoros azonosítás letiltása" + enable: "Engedélyezd a két-faktoros azonosítást, hogy biztonságosabbá tedd a fiókod." + confirm_password_description: "Kérlek erÅ‘sítsd meg a jelszavad a továbbhaladáshoz" + label: "Kód" + enable_description: | + Olvasd be ezt a QR-kódot egy támogatott alkalmazással (Android – iOS – Windows Phone) és add meg az azonosító kódodat. + disable_description: "Ãrd be az azonosító kódodat az alkalmazásból" + show_key_description: "Manuális beírás" + extended_description: | + A két-faktoros azonosítás plusz biztonságot a fiókhoz úgy, hogy egy extra tokent kér bejelentkezéskor a jelszó mellé. A tokenek generálhatóak Android, iOS vagy Windows Phone eszközökön. + oauth_enabled_warning: "A közösségi bejelentkezések nem lesznek elérhetÅ‘ek a fét-faktoros azonosítás aktiválása után a fiókhoz." + change_about: + title: "Rólam megváltoztatása" + error: "Hiba történt az adat módosításakor." + change_username: + title: "Felhasználónév módosítása" + confirm: "Biztosan meg szeretnéd változtatni a felhasználónevedet?" + taken: "Sajnos ez a felhasználónév már foglalt." + invalid: "Ez a felhasználónév érvénytelen. Csak számokat és betűket kell tartalmaznia." + change_email: + title: "E-mail cím módosítása" + taken: "Sajnos az e-mail cím nem érhetÅ‘ el." + error: "Hiba történt az email-ed módosítása közben. Talán már használod?" + success: "Emailt küldtünk a megadott címre. Kérjük, kövesd az ott leírtakat." + success_staff: "Küldtünk egy üzenetet az email címedre. Kérlek, kövesd az utasításokat fiókod érvényesítéséhez!" + change_avatar: + title: "Profilkép megváltoztatása" + gravatar: "Gravatar, alapján" + gravatar_title: "Az avatar megváltoztatása a Gravatar weboldalon" + refresh_gravatar_title: "Gravatar frissítése" + letter_based: "A rendszer által adott profilkép" + uploaded_avatar: "Egyéni kép" + uploaded_avatar_empty: "Egyéni kép hozzáadása" + upload_title: "Saját kép feltöltése" + upload_picture: "Kép feltöltése" + image_is_not_a_square: "Figyelmeztetés: átméreteztük a képét; szélesség és hosszúság nem volt egyforma" + change_profile_background: + title: "Profil háttérképe" + instructions: "A profil háttérképek középre lesznek helyezve, egy alapértelmezett 850px-es szélességgel." + change_card_background: + title: "Felhasználói kártya háttérképe" + instructions: "A háttérképek középre lesznek helyezve, egy alapértelmezett 590px-es szélességgel." + email: + title: "E-mail" + primary: "ElsÅ‘dleges Email" + secondary: "Másodlagos Emailek" + no_secondary: "Nincsenek másodlagos emailek" + instructions: "soha nem mutatjuk meg senkinek" + ok: " Jóváhagyás végett e-mailt fogunk küldeni" + invalid: "Kérünk adj meg egy érvényes e-mail címet" + authenticated: "Az email címedet {{provider}} azonosította" + frequency_immediately: "Azonnal e-mailt fogunk küldeni neked, ha nem olvastad el, amit neked küldtünk egy korábbi e-mailben." + associated_accounts: + title: "Társított fiókok" + connect: "Csatlakozás" + revoke: "Visszavonás" + not_connected: "(nincs csatlakoztatva)" + name: + title: "Név" + instructions: "a teljes neved (nem kötelezÅ‘)" + instructions_required: "Teljes neved" + too_short: "A neved túl rövid" + ok: "Megfelel a neved." + username: + title: "Felhasználónév" + instructions: "egyedi, szóközök nélkül, rövid" + short_instructions: "A következÅ‘ módon lehet téged megemlíteni: @{{username}}" + available: "A felhasználóneved elérhetÅ‘" + not_available: "Nem elérhetÅ‘. Esetleg {{suggestion}}?" + not_available_no_suggestion: "Nem elérhetÅ‘" + too_short: "Túl rövid a felhasználóneved" + too_long: "Túl hosszú a felhasználóneved" + checking: "A felhasználónév elérhetÅ‘ségének ellenÅ‘rzése..." + prefilled: "Az e-mail cím megfelel ennek a regisztrált felhasználónévnek" + locale: + title: "A felület nyelve" + instructions: "A felhasználói felület nyelve. A lap frissítése után fog módosulni." + default: "(alapértelmezett)" + any: "bármi" + password_confirmation: + title: "A jelszó ismét" + last_posted: "Utolsó hozzászólás" + last_emailed: "Utolsó email" + last_seen: "Utolsó látogatás" + created: "Tagság kezdete" + log_out: "Kijelentkezés" + location: "Hely" + website: "Weblap" + email_settings: "E-mail cím" + like_notification_frequency: + title: "Kedvelés esetén értesítsen" + always: "Mindig" + first_time: "ElsÅ‘ alkalommal like-olt egy postot" + never: "Soha" + email_previous_replies: + unless_emailed: "anélkül, hogy elÅ‘zÅ‘leg el lett volna küldve" + always: "mindig" + never: "soha" + email_digests: + title: "Ha nem látogatom az oldalt. küldjön kivonatos e-mailt az újdonságokról" + every_30_minutes: "minden 30 percben" + every_hour: "óránként" + daily: "naponta" + every_three_days: "minden három napban" + weekly: "hetente" + every_two_weeks: "kéthetente" + include_tl0_in_digests: "Új felhasználóktól származó tartalom mellékelése az emailekben" + email_direct: "Email küldése, ha valaki idéz, válaszol a bejegyzésemre, megemlíti a @felhasználónevem, vagy meghív egy témába" + email_private_messages: "Email küldése, ha valaki üzen nekem" + email_always: "Akkor is küldj e-mail értesítÅ‘t, ha az oldalon tartózkodom." + other_settings: "Egyéb" + categories_settings: "Kategóriák" + new_topic_duration: + label: "Témakörök friss-nek jelölése, amennyiben" + not_viewed: "Még nem láttam ezeket" + last_here: "A legutolsó bejelentkezésed óta lett létrehozva" + after_1_day: "ElÅ‘zÅ‘ nap létrehozva." + after_2_days: "Az elÅ‘zÅ‘ 2 napban létrezova" + after_1_week: "ElÅ‘zÅ‘ héten létrehozva" + after_2_weeks: "Az elÅ‘zÅ‘ 2 hétben létrehozva" + auto_track_topics: "Automatikusan nyomon követi a témát ahova belépek" + auto_track_options: + never: "soha" + immediately: "azonnal" + after_30_seconds: "30 másodperc elteltével" + after_1_minute: "1 perc elteltével" + after_2_minutes: "2 perc elteltével" + after_3_minutes: "3 perc elteltével" + after_4_minutes: "4 perc elteltével" + after_5_minutes: "5 perc elteltével" + after_10_minutes: "10 perc elteltével" + notification_level_when_replying: "Ha írok egy témába, állítsa be erre: " + invited: + search: "írd be a keresett meghívottak nevét…" + title: "Meghívók" + user: "Meghívott felhasználó" + sent: "Elküldve" + none: "Nincsenek meghívók." + redeemed: "Felhasznált meghívók" + redeemed_tab: "Felhasználva" + redeemed_tab_with_count: "Felhasználva ({{count}})" + redeemed_at: "Felhasznált" + pending: "FüggÅ‘ben levÅ‘ meghívások" + pending_tab: "Várakozik" + pending_tab_with_count: "Várakozik ({{count}})" + topics_entered: "Megtekintett témakörök" + posts_read_count: "Elolvasott bejegyzések" + expired: "Ez a meghívó lejárt!" + rescind: "Törlés" + rescinded: "Meghívó törölve" + rescind_all: "Összes meghívó törlése" + rescinded_all: "Összes meghívó törölve!" + rescind_all_confirm: "Biztosan törölni szeretnél minden meghívót?" + reinvite: "Meghívó újraküldése" + reinvite_all: "Összes meghívó újraküldése" + reinvite_all_confirm: "Biztosan szeretnél újraküldeni minden meghívót?" + reinvited: "Meghívó újraküldve" + reinvited_all: "Összes meghívó újraküldve!" + time_read: "Olvasási idÅ‘" + days_visited: "Látogatott napok" + account_age_days: "Fiók kora napokban" + create: "Egy meghívó küldése" + generate_link: "Meghívó link másolása" + link_generated: "Meghívó link elkészült!" + valid_for: "A meghívó-link csak ehhez az e-mail címhez érvényes: %{email}" + bulk_invite: + text: "Csoportos meghívás fájlból" + success: "A file sikeresen feltöltve, értesítést kapsz, ha a folyamat készen van." + error: "A feltöltött filenak CSV formátumúnak kell lennie." + password: + title: "Jelszó" + too_short: "Túl rövid a jelszavad." + common: "Túl gyakori a jelszavad." + same_as_username: "A jelszavad megegyezik a felhasználóneveddel." + same_as_email: "A jelszavad megegyezik az email-címeddel." + ok: "Megfelel a jelszavad." + instructions: "legalább %{count} karakter" + summary: + title: "Összefoglaló" + stats: "Statisztikák" + time_read: "olvasási idÅ‘" + recent_time_read: "olvasási idÅ‘" + topic_count: + one: "téma" + other: "témák" + post_count: + one: "Bejegyzés létrehozva" + other: "Bejegyzések létrehozva" + likes_given: + one: "adott" + other: "adott" + likes_received: + one: "kapott" + other: "kapott" + days_visited: + one: "Látogatott nap" + other: "Látogatott napok" + topics_entered: + one: "Megtekintett témakör" + other: "Megtekintett témakörök" + posts_read: + one: "Elolvasott bejegyzés" + other: "Elolvasott bejegyzések" + bookmark_count: + one: "KönyvjelzÅ‘" + other: "KönyvjelzÅ‘k" + top_replies: "Top Válaszok" + no_replies: "Még nincs hozzászólás." + more_replies: "Több válasz" + top_topics: "Top Témák" + no_topics: "Nincsenek témák még." + more_topics: "Több téma" + top_badges: "Top jelvények" + no_badges: "Még nincsenek jelvények." + more_badges: "Több Matrica" + top_links: "Népszerű Hivatkozások" + no_links: "Nincsenek hivatkozások még." + most_liked_by: "Legtöbbet kedvelt" + most_liked_users: "Legtöbbet Lájkolt" + most_replied_to_users: "Legtöbbet válaszolt" + no_likes: "Nincsenek kedvelések még." + top_categories: "Top kategóriák" + topics: "Témák" + replies: "Válaszok" + ip_address: + title: "Legutóbbi IP" + registration_ip_address: + title: "Regisztrációkor használt IP" + avatar: + title: "Profil kép" + header_title: "profil, üzenetek, könyvjelzÅ‘k és beállítások" + title: + title: "Cím" + none: "(egyik sem)" + filters: + all: "Mind" + stream: + posted_by: "SzerzÅ‘:" + sent_by: "SzerzÅ‘:" + private_message: "üzenet" + the_topic: "a témakör" + loading: "Töltés..." + errors: + prev_page: "amíg megpróbál betölteni" + reasons: + network: "Hálózati hiba" + server: "Szerveroldali hiba" + forbidden: "Hozzáférés megtagadva" + unknown: "Hiba" + not_found: "Oldal nem található" + desc: + network: "Kérünk ellenÅ‘rizd az internet kapcsolatodat!" + network_fixed: "Úgy néz ki, visszatért." + server: "Hibakód: {{status}}" + forbidden: "Nincs jogod megnézni ezt." + not_found: "Oops, az alkalmazás olyan URL-t próbált betölteni ami nem létezik." + unknown: "Valami félresikerült." + buttons: + back: "Visszalépés" + again: "Újrapróbál" + fixed: "Oldal betöltése" + close: "Bezárás" + assets_changed_confirm: "Az oldal frissítve lett. Frissíts a legújabb verzióért " + logout: "Kijelentkeztél." + refresh: "Frissítés" + read_only_mode: + enabled: "Az oldal \"csak olvasható\" módban van. Kérlek, folytasd tovább a böngészést, de a válaszolás, kedvelések és más tevékenységek egyelÅ‘re le vannak tiltva." + login_disabled: "A belépés le van tiltva, amíg az oldal \"csak olvasható\" módban van." + logout_disabled: "A kilépés le van tiltva, amíg az oldal \"csak olvasható\" módban van." + too_few_topics_and_posts_notice: "Kezdjük el a beszélgetést! Jelenleg %{currentTopics}/%{requiredTopics} téma és %{currentPosts}/%{requiredPosts} hozzászólás van. Az új látogatóknak kell valami, amihez hozzászólhatnak." + too_few_topics_notice: "Kezdjük el a beszélgetést! Jelenleg %{currentTopics}/%{requiredTopics} téma van. Az új látogatóknak kell valami, amihez hozzászólhatnak." + too_few_posts_notice: "Kezdjük el a beszélgetést! Jelenleg %{currentPosts}/%{requiredPosts} hozzászólás van. Az új látogatóknak kell valami, amihez hozzászólhatnak." + learn_more: "tovább..." + all_time: 'Összes' + all_time_desc: 'összes létrehozott téma' + year: 'év' + year_desc: 'az utóbbi 365 napban létrehozott témakörök' + month: 'hónap' + month_desc: 'az utóbbi 30 napban létrehozott témakörök' + week: 'hét' + week_desc: 'az utóbbi 7 napban létrehozott témakörök' + day: 'nap' + first_post: ElsÅ‘ bejegyzés + mute: Elnémít + unmute: Némítás feloldása + last_post: Közzétett + time_read: Olvasás + time_read_recently: '%{time_read}mostanában' + time_read_tooltip: '%{time_read}olvasva eltöltött idÅ‘' + last_reply_lowercase: utolsó válasz + replies_lowercase: + one: válasz + other: válaszok + signup_cta: + sign_up: "Regisztráció" + hide_session: "Holnap emlékeztess" + hide_forever: "nem, köszönöm" + hidden_for_session: "Rendben, holnap emlékeztetni foglak. Bármikor használhatod a 'Belépés' gombot, hogy csinálj magadnak egy fiókot." + summary: + enabled_description: "A téma összefoglalását látod: a legérdekesebb bejegyzéseket a közösség határozta meg." + description: "Összesen {{count}} válasz." + enable: 'Téma összefoglalása' + disable: 'Összes bejegyzés mutatása' + deleted_filter: + enabled_description: "Ez a témakör törölt bejegyzéseket is tartalmaz, amik el lettek rejtve." + disabled_description: "Jelenleg a törölt megjegyzések is megjelennek." + enable: "Törölt bejegyzések elrejtése" + disable: "Törölt bejegyzések mutatása" + private_message_info: + title: "Üzenet" + leave_message: "Valóban el akarod hagyni a beszélgetést?" + remove_allowed_user: "Biztosan kitörlöd {{name}}-t ebbÅ‘l az üzenetbÅ‘l?" + remove_allowed_group: "Valóban el akarod távolítani {{name}}-t ebbÅ‘l az üzenetbÅ‘l?" + email: 'E-mail' + username: 'Felhasználónév' + last_seen: 'Látva' + created: 'Létrehozva' + created_lowercase: 'létrehozva' + trust_level: 'Bizalmi szint' + search_hint: 'felhasználónév, e-mail vagy IP-cím' + create_account: + title: "Új fiók létrehozása" + failed: "Valami félresikerült! Lehetséges hogy ez az e-mail cím már regisztrálva van. Próbáltad már a jelszóemlékeztetÅ‘t?" + forgot_password: + title: "Jelszó-visszaállítás" + action: "Elfelejtettem a jelszavamat" + invite: "Add meg a felhasználónevedet vagy az e-mail címedet és küldünk neked egy jelszó visszaállító e-mailt." + reset: "Jelszó visszaállítása" + complete_username: "Amennyiben létezik fiók a %{username} felhasználónévvel, hamarosan kapni fogsz egy levelet, amiben megtalálhatod a további szükséges lépéseket a jelszavad visszaállításához." + complete_email: "Amennyiben létezik fiók a %{email} e-mail, hamarosan kapni fogsz egy levelet, amiben megtalálhatod a további szükséges lépéseket a jelszavad visszaállításához." + complete_username_found: "Létezik fiók %{username} felhasználónévvel. Hamarosan kapni fogsz egy levelet, amiben megtalálhatod a további szükséges lépéseket a jelszavad visszaállításához." + complete_email_found: "Létezik fiók %{email} e-mail címmel. Hamarosan kapni fogsz egy levelet, amiben megtalálhatod a további szükséges lépéseket a jelszavad visszaállításához." + complete_username_not_found: "Nincs fiók regisztrálva a következÅ‘ felhasználónévvel: %{username}" + complete_email_not_found: "Nincs fiók regisztrálva a következÅ‘ e-mail címmel: %{email}" + button_ok: "Rendben" + button_help: "Segítség" + email_login: + link_label: "Küldj el egy bejelentkezési linket" + button_label: "Emaillal" + complete_username_not_found: "Nem található egyezés a felhasználónévvel%{username}" + login: + title: "Bejelentkezés" + username: "Felhasználó" + password: "Jelszó" + second_factor_title: "KétlépcsÅ‘s azonosítás" + second_factor_description: "Kérlek írd be az azonosítási kódodat az alkalmazásodból" + second_factor_backup: "Jelentkezz be a biztonsági kód használatával" + second_factor_backup_description: "Kérlek írd be valamelyik biztonsági kódodat" + second_factor: "Jelentkezz be HitelesítÅ‘ alkalmazás használatával" + email_placeholder: "e-mail vagy felhasználónév" + caps_lock_warning: "A Caps Lock be van kapcsolva" + error: "Ismeretlen hiba" + cookies_error: "Úgytűnik hogy a böngészÅ‘dbe nincsenek engedélyezve a sütik. Lehet hogy nem bírsz bejelentkezni anélkül hogy engedélyeznéd Å‘ket." + rate_limit: "Kérlek várj a bejelentkezés megpróbálása elÅ‘tt." + blank_username: "Kérlek add meg az e-mail címedet vagy a felhasználónevedet" + blank_username_or_password: "Kérünk add meg az e-mail címedet vagy a felhasználónevedet és a jelszavadat!" + reset_password: 'Jelszó visszaállítása' + logging_in: "Bejelentkezés folyamatban..." + or: "Vagy" + authenticating: "Azonosítás folyamatban..." + awaiting_approval: "A felhasználói fiókod még nincs jóváhagyva. A jóváhagyásról elektronikus levélben kapsz értesítést." + requires_invite: "Sajnáljuk, de ehhez a fórumhoz csak meghívott személyek férhetnek hozzá." + not_activated: "Még nem tudsz bejelentkezni, mert a felhasználói fiókod még nincs aktiválva. A fiókodat szíveskedj aktiválni a korábban a(z) {{sentTo}} e-mail címre küldött elektronikus levélben található instrukciók szerint. " + not_allowed_from_ip_address: "Nem jelentkezhetsz be errÅ‘l az ip címrÅ‘l!" + admin_not_allowed_from_ip_address: "Nem léphetsz be errÅ‘l az ip címrÅ‘l adminisztrátorként." + resend_activation_email: "Kattints ide az aktivációs link újboli kiküldéséhez!" + omniauth_disallow_totp: "Be van kapcsolva a kétlépcsÅ‘s azonosítás a fiókodon. Kérlek jelentkezz be a jelszavaddal" + resend_title: "Aktiváló e-mail újraküldése" + change_email: "Változtasd meg az e-mail címedet" + provide_new_email: "Adj meg egy új címet és mi újraküldjük az aktivációs e-mailt" + submit_new_email: "Frissítsd az e-mail címedet" + sent_activation_email_again: "Küldtünk egy másik aktivációs emailt a {{currentEmail}} címedre. Néhány percen belül meg kell érkeznie, ha mégsem, kérjük, nézd meg a spam mappádat." + to_continue: "Kérlek jelentkezz be" + preferences: "Bejelentkezve kell lenned ahoz hogy megváltoztasd a felhasználói beállításokat" + forgot: "Nem emlékszem a fiók részleteire" + not_approved: "A felhasználót még nem aktiválták be. Értesítve leszel e-mailen keresztül hogyha bejelentkezhetsz" + google_oauth2: + name: "Google" + title: "a Google-lel" + message: "Azonosítás a Google-lel (ellenÅ‘rizd, hogy a felugró ablakok engedélyezve vannak)" + twitter: + name: "Twitter" + title: "a Twitter-rel" + message: "Azonosítás a Twitter-rel (ellenÅ‘rizd, hogy a felugró ablakok engedélyezve vannak)" + instagram: + name: "Instagram" + title: "az Instagram-mal" + message: "Azonosítás Instagrammal (gyÅ‘zÅ‘dj meg róla hogy a felugró ablakok nincsenek engedélyezve)" + facebook: + name: "Facebook" + title: "a Facebook-kal" + message: "Azonosítás a Facebook-kal (ellenÅ‘rizd, hogy a felugró ablakok engedélyezve vannak)" + yahoo: + name: "Yahoo" + title: "a Yahoo-val" + message: "Azonosítás a Yahoo-val (ellenÅ‘rizd, hogy a felugró ablakok engedélyezve vannak)" + github: + name: "GitHub" + title: "a GitHub-bal" + message: "Azonosítás a GitHub-bal (ellenÅ‘rizd, hogy a felugró ablakok engedélyezve vannak)" + invites: + accept_title: "Meghívás" + welcome_to: "Üdvözöllek a%{site_name}" + invited_by: "Meglettél hívva:" + your_email: "A fiók e-mail címed%{email}" + accept_invite: "Meghívás elfogadása" + success: "A fiók elkészült és mostmár be vagy jelentkezve" + name_label: "Név" + password_label: "Ãllíts be jelszót" + optional_description: "(opcionális)" + password_reset: + continue: "Tovább a%{site_name}" + emoji_set: + apple_international: "Apple/Nemzetközi" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + google_classic: "Google Classic" + facebook_messenger: "Facebook Messenger" + category_page_style: + categories_only: "Csak kategóriák szerint" + categories_with_featured_topics: "Kategóriák funkciók szerint" + categories_and_latest_topics: "Kategóriák és legutóbbi témák" + categories_and_top_topics: "Kategóriák és legfelsÅ‘ témák" + shortcut_modifier_key: + shift: 'Shift' + ctrl: 'Ctrl' + alt: 'Alt' + conditional_loading_section: + loading: Töltés... + select_kit: + default_header_text: Kiválasztás... + no_content: Nem található egyezés + filter_placeholder: Keresés... + create: "Létrehozás: '{{content}}'" + emoji_picker: + filter_placeholder: Emoyi keresése + people: Emberek + nature: Természet + food: Étel + activity: Aktivitás + travel: Utazás + objects: Tárgyak + celebration: Ünneplés + custom: Egyéni emojik + recent: Nemrég használt + default_tone: Nincs bÅ‘rszín + light_tone: Világos bÅ‘rszín + medium_light_tone: Közepesen világos bÅ‘rszín + medium_tone: Közepes bÅ‘rszín + medium_dark_tone: Közepesen sötét bÅ‘rszín + dark_tone: Sötét bÅ‘rszín + shared_drafts: + title: "Megosztott vázlatok" + notice: "Ez a téma azoknak látható akik látják a {{category}}kategóriát" + destination_category: "Cél kategória" + publish: "Közzétenni a megosztott vázlatot" + confirm_publish: "Biztosan közzé akarod tenni ezt a vázlatot?" + publishing: "Téma közzététele..." + composer: + emoji: "Emoji :)" + more_emoji: "több..." + options: "Beállítások" + whisper: "suttogás" + unlist: "nem listázott" + blockquote_text: "idézetblokk" + add_warning: "Ez egy hivatalos figyelmeztetés." + posting_not_on_topic: "Melyik témakörre szeretnél válaszolni?" + saving_draft_tip: "mentés..." + saved_draft_tip: "elmentve" + saved_local_draft_tip: "helyi mentés készült" + similar_topics: "A témaköröd hasonlít a..." + drafts_offline: "offline piszkozatok" + group_mentioned_limit: "Figyelem!Említetted {{group}}, azonban ennek a csoportnak több embere van mint amit az adminisztrátor által konfigurált említési határa a {{max}} felhasználóknak. Senki nem lesz értesítve." + group_mentioned: + one: "Megemlíteni a {{group}}, értesíteni fogsz 1 embert- biztos vagy benne?" + other: "Megemlíteni a {{group}}, értesíteni fogsz {{count}} embereket - biztos vagy benne?" + cannot_see_mention: + category: "Megemlítetted {{username}} de nem lesznek értesítve mivel nincsen hozzáférésük ehez a témához. Hozzá kell adnod Å‘ket egy csoporthoz hogy hozzáférjenek a témához" + private: "Említetted {{username}} de nem lesznek értesítve mivel képtelenek megnézni ezt a személyes üzenetet. Megkell hívnod Å‘ket ehez a személyes üzenethez" + error: + title_missing: "A címet kötelezÅ‘ megadni" + title_too_short: "A címnek legalább {{min}} karakter hosszúnak kell lennie" + title_too_long: "A cím nem lehet hosszabb, mint {{max}} katakter." + post_missing: "A bejegyzés nem lehet üres" + post_length: "A bejegyzésnek legalább {{min}} karakter hosszúnak kell lennie" + try_like: 'Próbáltad a gombot?' + category_missing: "Ki kéne választanod egy kategóriát" + tags_missing: "Kikell választanod legalább {{count}}  címkét" + save_edit: "Módosítások mentése" + reply_original: "Válasz az eredeti témakörre" + reply_here: "Válasz ide" + reply: "Válasz" + cancel: "Mégse" + create_topic: "Téma létrehozása" + create_pm: "Üzenet" + create_whisper: "Suttogás" + create_shared_draft: "Megosztott vázlat létrehozása" + edit_shared_draft: "Megosztott vázlat szerkesztése" + title: "Vagy nyomj Ctrl+Enter-t" + users_placeholder: "Felhasználó hozzáadása" + title_placeholder: "Mi lesz a témája ennek a beszélgetésnek, röviden?" + title_or_link_placeholder: "Adj címet vagy másolj idea egy linket" + edit_reason_placeholder: "miért szerkesztesz?" + show_edit_reason: "(szerkesztés okának hozzáadása)" + remove_featured_link: "Hivatkozás eltávolítása a témából." + reply_placeholder: "Ide írhatsz. A feltöltéshez húzz- vagy illessz be képet! A formázáshoz használhatsz Markdown-, BBCode- vagy HTML kódokat is." + reply_placeholder_no_images: "Ide írj. Használhatsz Markdown-t, BBCode-ot, vagy HTML-t a formázáshoz." + reply_placeholder_choose_category: "ElÅ‘ször ki kell választanod a kategóriát hogy ide írhass" + view_new_post: "Nézd meg az új bejegyzésedet!" + saving: "Mentés" + saved: "Elmentve!" + saved_draft: "A vázlat közzététele folyatban van. Válaszd ki hogy folytasd" + uploading: "Feltöltés..." + show_preview: 'elÅ‘nézet mutatása »' + hide_preview: '« elÅ‘nézet elrejtése' + quote_post_title: "Teljes bejegyzés idézése" + bold_label: "Félkövér" + bold_title: "Félkövér" + bold_text: "félkövár szöveg" + italic_label: "DÅ‘lt" + italic_title: "Kiemelt" + italic_text: "dÅ‘lt szöveg" + link_title: "Hiperhivatkozás" + link_description: "itt add meg a link leírását" + link_dialog_title: "Hiperhivatkozás beszúrása" + link_optional_text: "alternatív cím" + link_url_placeholder: "http://example.com" + quote_title: "Idézet" + quote_text: "Idézet" + code_title: "ElÅ‘formázott szöveg" + code_text: "az elÅ‘formázott szöveget 4 szóközzel beljebb kezdi" + paste_code_text: "Ãrd vagy másold be a kódot ide" + upload_title: "Feltöltés" + upload_description: "itt add meg a feltöltés leírását" + olist_title: "Számozott lista" + ulist_title: "Pontozott lista" + list_item: "Listaelem" + help: "Markdown szerkesztési segédlet" + modal_ok: "Rendben" + modal_cancel: "Mégse" + cant_send_pm: "Nemtudsz neki üzenetet küldeni %{username}" + yourself_confirm: + title: "Elfelejtettél címzettet hozzáadni?" + body: "Jelenleg ez az üzenet csak saját magadnak lett elküldve" + admin_options_title: "A témakör opcionális szervezÅ‘i beállításai" + composer_actions: + reply: Válasz + draft: Vázlat + edit: Szerkesztés + reply_to_post: + label: "Válasz a posztra%{postNumber}által%{postUsername}" + desc: Válasz egy adott bejegyzésre + reply_as_new_topic: + label: Válasz egy csatolt témaként + desc: Egy új téma létrehozása ezzel a témával kapcsolatban + reply_as_private_message: + label: Új üzenet + desc: Személyes üzenet létrehozása + reply_to_topic: + label: Válasz a témára + create_topic: + label: "Új téma" + shared_draft: + label: "Megsztott vázlat" + desc: "Csak olyan témákat soroljon be amik csak a személyzet által láthatóak" + notifications: + tooltip: + regular: + one: "1 nemlátott értesítés" + other: "{{count}} nemlátott értesíések" + message: + one: "1 olvasatlan üzenet" + other: "{{count}} olvasatlan üzenet" + title: "értesítések @felhasználónév hivatkozásokról, a hozzászólásaidra adott válaszokról, üzenetekrÅ‘l stb." + none: "Az értesítések betöltése sikertelen." + empty: "Nincs értesítés." + more: "régebbi értesítések megtekintése" + total_flagged: "összes megjelölt bejegyzés" + mentioned: "{{username}}{{description}}" + group_mentioned: "{{username}} {{description}}" + quoted: "{{username}} {{description}}" + replied: "{{username}} {{description}}" + posted: "{{username}} {{description}}" + edited: "{{username}} {{description}}" + liked: "{{username}} {{description}}" + liked_2: "{{username}}, {{username2}} {{description}}" + liked_many: + one: "{{username}}, {{username2}} 1 más {{description}}" + other: "{{username}}, {{username2}} és {{count}} mások {{description}}" + private_message: "{{username}} {{description}}" + invited_to_private_message: "

{{username}} {{description}}" + invited_to_topic: "{{username}} {{description}}" + invitee_accepted: "{{username}} elfogadta a meghívásodat" + linked: "{{username}} {{description}}" + granted_badge: "Megszerzett '{{description}}'" + topic_reminder: "{{username}} {{description}}" + watching_first_post: "Új téma{{description}} " + group_message_summary: + one: "{{count}} Üzenet a {{group_name}} postaládában" + other: "{{count}} Üzenetek a {{group_name}} postaládában" + popup: + mentioned: '{{username}} megemlített itt: "{{topic}}" - {{site_title}}' + group_mentioned: '{{username}} megemlített téged "{{topic}}" - {{site_title}} témakörben' + quoted: '{{username}} idézett itt: "{{topic}}" - {{site_title}}' + replied: '{{username}} válaszolt neked itt: "{{topic}}" - {{site_title}}' + posted: '{{username}} hozzászólt itt: "{{topic}}" - {{site_title}}' + private_message: '{{username}} küldött egy személyes üzenetet itt: "{{topic}}" - {{site_title}}' + confirm_title: 'Értesítések bekapcsolva - %{site_title}' + upload_selector: + title: "Kép hozzáadása" + title_with_attachments: "Kép vagy file hozzáadása" + from_my_computer: "Saját géprÅ‘l" + from_the_web: "Az internetrÅ‘l" + remote_tip: "kép linkje" + local_tip: "Kép kiválasztása a készülékrÅ‘l" + local_tip_with_attachments: "Képek vagy fájlok kiválasztása a készülékrÅ‘l {{authorized_extensions}}" + uploading: "Feltöltés" + select_file: "File kiválasztása." + image_link: "A csatolt képed oda fog mutatni" + default_image_alt_text: Kép + search: + sort_by: "Rendezés " + relevance: "Relevancia" + latest_post: "Utolsó bejegyzés" + latest_topic: "Legutóbbi téma" + most_viewed: "Legtöbbet Megtekintett" + most_liked: "Legtöbbet Lájkolt" + select_all: "Összes kijelölése" + clear_all: "Összes tisztítása" + too_short: "Keresési kifejezésed túl rövid." + title: "keresés témakörök, bejegyzések, felhasználók és kategóriák között" + full_page_title: "Témák vagy bejegyzések keresése" + no_results: "Nincs eredmény." + no_more_results: "Nincs több találat." + searching: "Keresés ..." + post_format: "#{{post_number}} általa: {{username}}" + start_new_topic: "Esetleg kezdj egy új témát?" + or_search_google: "Vagy helyette próbálj meg a Googlén keresni:" + search_google: "Helyette próbálj meg a Googlén keresni:" + search_google_button: "Google" + search_google_title: "Keresés az oldalon" + context: + user: "Keresés @{{username}} bejegyzései között" + topic: "Keresés ebben a témakörben" + private_messages: "Üzenetek keresése" + advanced: + title: Részletes keresÅ‘ + posted_by: + label: "SzerzÅ‘:" + in_category: + label: Kategorizált + with_tags: + label: Címke + filters: + likes: Kedveltem + watching: Figyelem + tracking: Követem + bookmarks: KönyvjelzÅ‘ztem + seen: Olvastam + statuses: + open: Megnyitva + closed: Bezárva + archived: Elért + noreplies: Nincsenek válaszok + post: + time: + label: Közzétett + before: elÅ‘tte + after: utánna + hamburger_menu: "Menj egy másik témára vagy kategóriára" + new_item: "új" + go_back: 'visszalépés' + not_logged_in_user: 'felhasználói oldal összesítéssel a jelenleg aktivitásokról és beállításokról' + current_user: 'a felhasználói oldalad meglátogatása' + topics: + new_messages_marker: "utoljára megtekintett" + bulk: + select_all: "Összes kijelölése" + clear_all: "Mindent törölni" + unlist_topics: "Nemlistázott témák" + relist_topics: "Újralistázott témák" + delete: "Témakörök törlése" + dismiss: "Elvetés" + dismiss_read: "Olvasatlan üzenetek elvetése" + dismiss_button: "Elvetés..." + actions: "Csoportos műveletek" + change_category: "Kategória beállítása" + close_topics: "Témakörök lezárása" + archive_topics: "Témakörök archíválása" + notification_level: "Értesítések" + none: + unread: "Nincsenek olvasatlan témakörök." + new: "Nincsenek új témakörök." + read: "Még egy témakört sem olvastál el." + posted: "Még egy témakörhöz sem szóltál hozzá." + latest: "Szomorú, de nem állnak rendelkezésre friss témakörök." + hot: "Nem állnak rendelkezésre népszerű témakörök." + bookmarks: "Még nem adtál hozzá témakört a könyvjelzÅ‘idhez." + category: "Nincsenek témakörök a {{category}} kategóriában." + search: "Nincsenek keresési találatok." + bottom: + latest: "Nincs több friss téma." + hot: "Nincs több népszerű téma." + read: "Nincs több olvasott téma." + new: "Nincs több új témakör." + unread: "Nincs több olvasatlan témakör." + category: "Nincs több {{category}} téma." + top: "Nincsenek több top témák" + bookmarks: "Nincs több témakör a könyvjelzÅ‘k között." + search: "Nincs több keresési találat." + topic: + create: 'Új téma' + create_long: 'Új téma létrehozása' + open_draft: "Vázlat megnyitása" + private_message: 'Üzenj ' + archive_message: + help: 'Az üzenet az archivumba adása' + title: 'Archívum' + move_to_inbox: + title: 'Ãthelyezés a bejövÅ‘ üzenetek közé' + edit_message: + title: 'Üzenet szerkesztése' + list: 'Témák' + new: 'új téma' + unread: 'olvasatlan' + new_topics: + one: '1 új téma' + other: '{{count}} új téma' + unread_topics: + one: '1 olvasatlan téma' + other: '{{count}} olvasatlan téma' + title: 'Témakör' + invalid_access: + title: "Privát témakör" + description: "Sajnáljuk, de nincs hozzáférésed ehhez a témához!" + login_required: "Be kell jelentkezned, hogy megtekinthesd ezt a témakört!" + server_error: + title: "Nem sikerült betölteni a témakört" + description: "Sajnos nem tudtuk betölteni a témát, valószínűleg kapcsolódási probléma miatt. Kérjük, próbáld újra. Ha a probléma továbbra is fennáll, értesíts minket." + not_found: + title: "Nem létezÅ‘ témakör" + description: "Sajnáljuk, de nem tudtuk megtalálni ezt a témakört. Talán egy moderátor kitörölte volna?" + total_unread_posts: + one: "1 hozzászólást nem olvastál a témában" + other: "{{count}} hozzászólást nem olvastál a témában" + unread_posts: + one: "1 nem olvasott bejegyzés van ebben a témában" + other: "{{count}} nem olvasott bejegyzés van ebben a témában" + new_posts: + one: "1 új bejegyzés van ebben a témában." + other: "{{count}} új bejegyzés van ebben a témában." + back_to_list: "Vissza a témakörök listájára" + options: "Témakör beállításai" + show_links: "linkek megjelenítése ebben a témakörben" + toggle_information: "témakör részleteinek megjelenítése vagy elrejtése" + read_more_in_category: "Szeretnél még többet olvasni? Nézz meg más témakat itt, {{catLink}} vagy itt: {{latestLink}}." + read_more: "Szeretnél mégtöbbet olvasni? {{catLink}} vagy {{latestLink}}." + read_more_MF: "{ UNREAD, plural, =0 {} one { is 1 unread } other { are # unread } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 new topic} other { {BOTH, select, true{and } false {are } other{}} # new topics} } remaining, or {CATEGORY, select, true {browse other topics in {catLink}} false {{latestLink}} other {}}" + browse_all_categories: Böngéssz a kategóriák között + view_latest_topics: legutóbbi témakörök megtekintése + suggest_create_topic: "Miért nem hozol létre egy témakört?" + jump_reply_up: ugrás régebbi válaszhoz + jump_reply_down: ugrás újabb válaszhoz + deleted: "Ez a témakör ki lett törölve" + topic_status_update: + title: "Téma idÅ‘zítése" + save: "IdÅ‘zítÅ‘ beállítása" + num_of_hours: "Órák száma:" + remove: "IdÅ‘zítÅ‘ eltávolítása" + publish_to: "Közzététel itt:" + when: "Mikor:" + auto_update_input: + later_today: "A mai nap folyamán" + tomorrow: "Holnap" + later_this_week: "A hét folyamán" + this_weekend: "Hétvégén" + next_week: "JövÅ‘ héten" + two_weeks: "Két hét" + next_month: "JövÅ‘ hónapban" + three_months: "Három hónap" + six_months: "Hat hónap" + one_year: "Egy év" + forever: "Örökre" + pick_date_and_time: "Dátum és idÅ‘ kiválasztása" + auto_reopen: + title: "Téma automatikus megynitása" + auto_close: + title: "Téma automatikus lezárása" + error: "Érvényes dátumot kérek!" + auto_delete: + title: "Téma automatikus törlése" + reminder: + title: "EmlékeztetÅ‘" + auto_close_title: 'Automatikus lezárási beállítások' + timeline: + back: "Vissza" + back_description: "Vissza az utolsó olvasatlan bejegyzéshez" + replies_short: "%{current} / %{total}" + progress: + title: téma állapota + go_top: "teteje" + go_bottom: "alja" + go: "ugrás" + jump_bottom: "Ugrás az utolsó bejegyzéshez" + jump_prompt: "ugrás..." + jump_prompt_of: "a %{count} bejegyzésbÅ‘l" + jump_prompt_long: "Hányadik bejegyzéshez szeretnél ugrani?" + jump_bottom_with_number: "ugrás a következÅ‘ bejegyzéshez: %{post_number}" + jump_prompt_to_date: "Mostanáig" + jump_prompt_or: "vagy" + total: összes bejegyzés + current: jelenlegi bejegyzés + notifications: + title: módosítsd a témakörrÅ‘l érkezÅ‘ értesítések gyakoriságát + reasons: + mailing_list_mode: "Engedélyezted a hírlevél módot, ezért emailben fogsz értesítést kapni a válaszokról." + "3_10": 'Értesítést fogsz kapni, mert figyeled a téma egyik címkéjét.' + "3_6": 'Értesítést fogsz kapni, mert figyeled ezt a kategóriát.' + "3_5": 'Értesítést fogsz kapni, mert automatikusan figyelni kezdted ezt a témát.' + "3_2": 'Értesítést fogsz kapni, mert figyeled ezt a témát.' + "3_1": 'Értesítést fogsz kapni, mert te hoztad létre ezt a témát.' + "3": 'Értesítést fogsz kapni, mert figyeled ezt a témát.' + "1_2": 'Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked.' + "1": 'Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked.' + "0_7": 'Nem kapsz értesítést errÅ‘l a kategóriáról.' + "0_2": 'Nem kapsz értesítést errÅ‘l a témáról.' + "0": 'Nem kapsz értesítést errÅ‘l a témáról.' + watching_pm: + title: "Figyelés" + description: "Értesítést kapsz minden erre az üzenetre érkezÅ‘ új válaszról és látni fogod az új válaszok számát." + watching: + title: "Figyelés" + description: "Értesítést kapsz minden új válaszról ebben a témakörben és látni fogod az új válaszok számát." + tracking_pm: + title: "Követés" + description: "Látni fogod az erre az üzenetre érkezÅ‘ válaszok számát. Értesítést fogsz kapni ha valaki említi a @nevedet vagy válaszol neked." + tracking: + title: "Követés" + description: "Látni fogod az ebbe a témakörbe érkezÅ‘ új hozzászólások számát. Értesítve leszel ha valaki megemlíti a @nevedet vagy válaszol neked." + regular: + title: "Normál" + description: "Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked." + regular_pm: + title: "Normál" + description: "Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked." + muted_pm: + title: "Némítás" + description: "Egyáltalán nem fogsz értesítést kapni errÅ‘l az üzenetrÅ‘l." + muted: + title: "Némítás" + description: "Egyáltalán nem fogsz semmilyen értesítést sem kapni errÅ‘l a témakörrÅ‘l és a legújabbak között sem nem fog szerepelni." + actions: + recover: "Témakör visszaállítása" + delete: "Témakör törlése" + open: "Nyitott téma" + close: "Zárt téma" + multi_select: "Bejegyzések Kiválasztása" + timed_update: "Téma idÅ‘zítÅ‘jének beállítása" + pin: "Témakör kiemelése..." + unpin: "Témakör kiemelésének megszüntetése..." + unarchive: "Témakör archiválásának megszüntetése" + archive: "Témakör archiválása" + invisible: "Listázás törlése" + visible: "Listázás" + reset_read: "Olvasási adatok visszaállítása" + make_public: "Nyílvános téma létrehozása" + make_private: "Személyes üzenet írása" + feature: + pin: "Témakör kiemelése" + unpin: "Témakör kiemelésének megszüntetése" + pin_globally: "Témakör globális kiemelése" + make_banner: "Kiemelt Téma" + remove_banner: "Kiemelt Téma eltávolítása" + reply: + title: 'Válasz' + clear_pin: + title: "Kiemelés törlése" + help: "A téma kiemelésének törlése, ezután nem jelenik meg a témaköreid legelején" + share: + title: 'Megosztás' + help: 'a témakör hivatkozásának megosztása' + print: + title: 'Nyomtatás' + flag_topic: + title: 'Megjelölés' + success_message: 'Sikeresen megjelölted ezt a témát.' + feature_topic: + confirm_pin: "Jelenleg {{count}} kiemelt témaköröd van. Túl sok kiemelt téma megzavarhatja az új vagy névtelen felhasználókat. Biztosan kiemelsz egy újabb témát ebben a kategóriában?" + unpin: "Téma eltávolítása a {{categoryLink}} kategória elejérÅ‘l." + inviting: "Meghívás..." + invite_private: + email_or_username: "A meghívott e-mail címe vagy felhasználóneve" + email_or_username_placeholder: "e-mail cím vagy felhasználónév" + action: "Meghívás" + error: "Sajnos hiba történt a felhasználó meghívásakor." + group_name: "csoport neve" + controls: "Témák kezelése" + invite_reply: + title: 'Meghívás' + username_placeholder: "felhasználónév" + action: 'Meghívó küldése' + help: 'hívj meg másokat ebbe a témakörbe emailben vagy értesítéssel' + sso_enabled: "Ãrd be annak a felhasználónevét, akit meg szeretnél hívni ebbe a témába." + to_topic_blank: "Ãrd be annak a felhasználónevét vagy email-címét, akit meg szeretnél hívni ebbe a témába." + to_username: "Ãrd be annak a felhasználónevét, akit meg szeretnél hívni. Értesítést fogunk neki küldeni, ennek a témának a linkjével." + email_placeholder: 'nev@pelda.hu' + login_reply: 'Jelentkezz be, hogy válaszolhass' + filters: + n_posts: + one: "1 bejegyzés" + other: "{{count}} bejegyzés" + cancel: "SzűrÅ‘ törlése" + split_topic: + title: "Ãthelyezés új témába" + action: "áthelyezés új témába" + topic_name: "Új témakör címe" + error: "Hiba lépett fel a bejegyzés új témakörbe való helyezése során!" + merge_topic: + title: "Ãthelyezés létezÅ‘ témába" + action: "áthelyezés létezÅ‘ témába" + error: "Hiba történt a bejegyzések áthelyezésekor ebben a témába." + change_owner: + title: "A bejegyzések átruházása" + action: "tulajdonjog módosítása" + error: "Hiba történt a bejegyzések átruházásakor." + label: "A bejegyzések új tulajdonosa" + placeholder: "az új tulajdonos felhasználóneve" + multi_select: + select: 'kiválasztás' + selected: 'kiválasztva ({{count}})' + select_post: + label: 'Kiválasztás' + selected_post: + label: 'Kiválasztott' + select_replies: + label: 'kiválaszt +válaszok' + select_below: + label: 'Kiválaszt +alatta' + delete: kiválasztottak törlése + cancel: kiválasztások visszavonása + select_all: mind kiválasztása + deselect_all: kijelölések törlése + description: + one: Kijelöltél 1 hozzászólást. + other: "Kijelöltél {{count}} hozzászólást." + post: + quote_reply: "Idézet" + edit: "{{link}} {{replyAvatar}} {{username}} " + edit_reason: "Ok:" + post_number: "bejegyzés {{number}}" + wiki_last_edited_on: "Wiki utoljára szerkesztve" + last_edited_on: "utoljára szerkesztve" + reply_as_new_topic: "Válasz csatolt üzenetként" + follow_quote: "ugrás az idézett bejegyzéshez" + show_full: "Teljes bejegyzés megtekintése" + show_hidden: 'Rejtett tartalom megtekintése.' + collapse: "Összeomlás" + expand_collapse: "kinyitás/bezárás" + gap: + one: "Megnézni 1 rejtett választ" + other: "Megnézni {{count}} rejtett válaszokat" + unread: "Olvasatlan bejegyzés" + has_replies: + one: "{{count}} Válasz" + other: "{{count}} Válaszok" + has_likes: + one: "{{count}} Tetszik" + other: "{{count}} Tetszések" + has_likes_title: + one: "1 ember likeolta a bejegyzést" + other: "{{count}} emberek likeolták ezt a bejegyzést" + has_likes_title_only_you: "kedvelted ezt a bejegyzést" + has_likes_title_you: + one: "te és 1 másik ember likeolták ezt a bejegyzést" + other: "te és {{count}} más emberek likeolták ezt a bejegyzést" + errors: + create: "Sajnáljuk, de a bejegyzésed létrehozása közben hiba lépett fel. Kérünk próbáld újra!" + edit: "Sajnáljuk, de a bejegyzésed szerkesztése közben hiba lépett fel. Kérünk próbáld újra!" + upload: "Sajnáljuk, de a fájl feltöltése közben hiba lépett fel. Kérünk próbáld újra!" + too_many_uploads: "Sajnáljuk, de egyszerre csak egy fájlt tölthetsz fel!" + image_upload_not_allowed_for_new_user: "Sajnáljuk, de az új felhasználók nem tölthetnek fel képeket!" + attachment_upload_not_allowed_for_new_user: "Sajnáljuk, de az új felhasználók nem tölthetnek fel csatolmányokat!" + attachment_download_requires_login: "Sajnáljuk, de be kell jelentkezned, hogy letölthess csatolmányokat!" + abandon: + no_value: "Nem, tartsd meg" + archetypes: + save: 'Mentési beállítások' + controls: + like: "bejegyzés kedvelése" + has_liked: "kedvelted ezt a bejegyzést" + undo_like: "kedvelés visszavonása" + edit: "bejegyzés szerkesztése" + edit_action: "Szerkesztés" + edit_anonymous: "Sajnáljuk, de be kell jelentkezned, hogy szerkeszthesd ezt a bejegyzést!" + delete: "bejegyzés törlése" + undelete: "bejegyzés visszaállítása" + share: "bejegyzés megosztása link-kel" + more: "Több" + delete_replies: + just_the_post: "Nem, csak ezt a bejegyzést" + wiki: "Wiki létrehozása" + unwiki: "Wiki eltávolítása" + convert_to_moderator: "Stáb szín hozzáadása" + revert_to_regular: "Stáb szín eltávolítása" + rebake: "HTML újjáépítése" + unhide: "Elrejtés visszavonása" + change_owner: "Tulajdonjog módosítása" + lock_post: "Bejegyzés zárolása" + unlock_post: "Bejegyzés zárolásának feloldása" + actions: + flag: 'Megjelölés' + undo: + off_topic: "Megjelölés visszavonása" + spam: "Megjelölés visszavonása" + inappropriate: "Megjelölés visszavonása" + bookmark: "KönyvjelzÅ‘ eltávolítása" + like: "Kedvelés visszavonása" + people: + notify_user: "üzenet küldése" + like: "Likeolták" + like_capped: + one: "és {{count}} ezt likeolták" + other: "és {{count}} mások ezeket likeolták" + by_you: + off_topic: "Nem a témába tartozónak jelölve" + spam: "Spam-ként jelölted" + notify_user: "Üzenetet küldtél ennek a felhasználónak" + bookmark: "A bejegyzést hozzáadtad a könyvjelzÅ‘khöz" + like: "Kedvelted ezt a bejegyzést" + by_you_and_others: + bookmark: + one: "Te és 1 másik felhasználó adta hozzá ezt a bejegyzést a könyvjelzÅ‘khÅ‘z" + other: "Te és {{count}} másik felhasználó adta hozzá ezt a bejegyzést a könyvjelzÅ‘khöz" + by_others: + bookmark: + one: "1 felhasználó adta hozzá ezt a bejegyzést a könyvjelzÅ‘khöz" + other: "{{count}} felhasználó adta hozzá ezt a bejegyzést a könyvjelzÅ‘khöz" + revisions: + controls: + edit_wiki: "Wiki szerkesztése" + edit_post: "Bejegyzés szerkesztése" + displays: + inline: + button: 'HTML' + side_by_side: + button: 'HTML' + side_by_side_markdown: + button: 'Raw' + raw_email: + displays: + raw: + button: 'Raw' + text_part: + button: 'Üzenet' + html_part: + title: "A html rész mutatása az e-mailnak" + button: 'HTML' + category: + none: '(nincs kategória)' + all: 'Minden kategória' + edit: 'szerkesztés' + edit_long: "Szerkesztés" + view: 'Témakörök megjelenítése a kategóriában' + general: 'Ãltalános' + settings: 'Beállítások' + topic_template: "Téma sablonja" + tags: "Címkék" + delete: 'Kategória törlése' + create: 'Új kategória' + save: 'Kategória mentése' + creation_error: Hiba lépett fel a kategória létrehozása során! + save_error: Hiba lépett fel a kategória mentése során! + name: "Kategória neve" + description: "Leírás" + topic: "Kategória témája" + logo: "Kategória képe" + background_image: "Kategória háttérképe" + badge_colors: "Jelvény színek" + background_color: "Háttér színe" + foreground_color: "ElÅ‘tér színe" + name_placeholder: "Maximum egy vagy két szó" + color_placeholder: "Akármelyik web-es szín" + delete_confirm: "Biztosan törölni szeretnéd ezt a kategóriát?" + delete_error: "Hiba lépett fel a kategória törlése során!" + list: "Kategóriák listázása" + no_description: "Kérünk adj meg egy leírást ennek a kategóriának!" + change_in_category_topic: "Leírás szerkesztése" + already_used: 'Ezt a színt már egy másik kategória is használja.' + security: "Biztonság" + images: "Képek" + email_in: "Egyéni bejövÅ‘ levelek email cím" + email_in_allow_strangers: "E-mail-ek elfogadása ismeretlen felhasználóktól, akik nem rendelkeznek fiókkal" + email_in_disabled: "Az új bejegyzések létrehozása e-mail-en keresztül ki van kapcsolva a Weblap Beállítások-ban. Hogy bekapcsold, " + email_in_disabled_click: 'engedélyezd az "e-mail be" beállítást.' + sort_order: "Témakörök csoportosítása:" + default_view: "Alapértelmezett témakörök" + allow_badges_label: "Kitűzök elnyerésének engedélyezése ebben a kategóriában" + edit_permissions: "Jogok szerkesztése" + add_permission: "Jogok hozzáadása" + this_year: "ez az év" + position: "Pozíció:" + default_position: "Alapértelmezett pozíció" + parent: "SzülÅ‘ kategória" + notifications: + watching: + title: "Figyelés" + description: "Automatikusan figyelni fogsz minden témakört ezekben a kategóriákban. Értesítést kapsz az összes témakör minden új hozzászólásáról és látni fogod az új hozzászólások számát." + watching_first_post: + title: "ElsÅ‘ hozzászólás figyelése" + description: "Csak minden új témakör legelsÅ‘ hozzászólásáról fogsz értesítést kapni ezekben a kategóriákban." + tracking: + title: "Követés" + description: "Automatikusan követni fogsz minden témakört ezekben a kategóriákban. Látni fogod az új hozzászólások számát és értesítve leszel ha valaki a megemlíti a @nevedet vagy válaszol neked." + regular: + title: "Normál" + description: "Csak akkor leszel értesítve, ha valaki megemlíti a @nevedet vagy válaszol neked." + muted: + title: "Némítás" + description: "Egyáltalán nem fogsz kapni semmilyen értesítést ennek a kategóriának a témaköreirÅ‘l és legújabbak között sem fog szerepelni." + sort_options: + default: "alapértelmezett" + likes: "Kedvelések" + views: "Megtekintések" + posts: "Bejegyzések" + activity: "Aktivitás" + category: "Kategória" + created: "Létrehozva" + sort_ascending: 'NövekvÅ‘' + sort_descending: 'CsökkenÅ‘' + subcategory_list_styles: + rows: "Sorok" + flagging: + action: 'Bejegyzés megjelölése' + take_action: "Művelet megkezdése" + notify_action: 'Üzenet' + official_warning: 'Hivatalos figyelmeztetés' + delete_spammer: "Spammer törlése" + yes_delete_spammer: "Igen, Spammer törlése" + ip_address_missing: "(ismeretlen)" + hidden_email_address: "(elrejtett)" + cant: "Sajnáljuk, most nem jelölheted meg ezt a bejegyzést." + formatted_name: + off_topic: "Ez nem tartozik a témakörbe" + inappropriate: "Ez nem megfelelÅ‘" + spam: "Ez szemét" + custom_placeholder_notify_user: "Légy célra törÅ‘, légy konstruktív és mindig legyél kedves másokhoz." + custom_message: + left: + one: "1 van hátra" + other: "{{count}} hátralévÅ‘" + flagging_topic: + action: "Téma jelölése" + notify_action: "Üzenet" + topic_map: + title: "Téma összegzése" + participants_title: "Gyakori SzerzÅ‘k" + links_title: "Népszerű Hivatkozások" + links_shown: "Több link mutatása" + clicks: + one: "1 kattintás" + other: "%{count} kattintás" + post_links: + title: + one: "még 1" + other: "%{count} még" + topic_statuses: + warning: + help: "Ez egy hivatalos figyelmeztetés." + bookmarked: + help: "A témakört hozzáadtad a könyvjelzÅ‘khöz" + locked: + help: "A témakör le van zárva; nem lehet válaszolni benne" + archived: + help: "Ez a témakör jelenleg archiválva van; be lett fagyasztva, szóval nem lehet megváltoztatni semmilyen módon." + locked_and_archived: + help: "Ez egy lezárt és archívált témakör ezért nem lehet bele írni vagy módosítani rajta." + unpinned: + title: "Nincs kiemelve" + help: "Ez a téma nincs kiemelve neked ezért a szokásos helyén lesz látható." + pinned_globally: + title: "Globálisan kiemelve" + help: "Ez egy globálisan kiemelt témakör ezért a legújabbak és a kategóriája elején lesz látható." + pinned: + title: "Kiemelt" + help: "Ez egy általad kiemelt témakör ezért a kategóriája elején lesz látható." + invisible: + help: "Ez egy nem listázandó témakör, ezért nem fog megjelenni a témakörök listájában és csak közvetlen hivatkozással érhetÅ‘ el." + posts: "Bejegyzések:" + posts_long: "{{number}} darab bejegyzés van a témában" + original_post: "Eredeti Bejegyzés" + views: "Megtekintések" + views_lowercase: + one: "megtekintés" + other: "megtekintés" + replies: "Válaszok" + activity: "Aktivitás" + likes: "Kedvelések" + likes_lowercase: + one: "kedvelés" + other: "kedvelés" + likes_long: "{{number}} darab kedvelés van a témában" + users: "Felhasználók" + users_lowercase: + one: "felhasználó" + other: "felhasználók" + category_title: "Kategória" + history: "ElÅ‘zmények" + changed_by: "szerzÅ‘ {{author}}" + raw_email: + title: "BejövÅ‘ email" + not_available: "Nem elérhetÅ‘!" + categories_list: "Kategóriák listája" + filters: + with_topics: "%{filter} témák" + latest: + title: "Legújabb" + title_with_count: + one: "Legutolsó (1)" + other: "Legutóbbi ({{count}})" + help: "a legfrissebb bejegyzések témakörei" + hot: + title: "Népszerű" + help: "a legnépszerűbb témakörök válogatása" + read: + title: "Olvasott" + help: "olvasott témakörök, az olvasás sorrendjének megfelelÅ‘en" + search: + title: "Keresés" + help: "keresés minden témában" + categories: + title: "Kategóriák" + title_in: "Kategória - {{categoryName}}" + help: "minden témakörök, kategóriákba csoportosítva" + unread: + title: "Olvasatlan" + title_with_count: + one: "Olvasatlan (1)" + other: "Olvasatlan ({{count}})" + help: "az általad figyelt vagy követett témák, melyekben olvasatlan bejegyzések vannak." + lower_title_with_count: + one: "1 olvasatlan" + other: "{{count}} olvasatlan" + new: + lower_title_with_count: + one: "1 új" + other: "{{count}} új" + lower_title: "új" + title: "Új" + title_with_count: + one: "Új (1)" + other: "Új ({{count}})" + help: "az elmúlt napokban létrehozott témakörök" + posted: + title: "Saját bejegyzéseim" + help: "témakörök, amikhez már hozzászóltál" + bookmarks: + title: "KönyvjelzÅ‘k" + help: "Témakörök, amiket könyvjelzÅ‘vel láttál el" + category: + title: "{{categoryName}}" + title_with_count: + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" + help: "legfrissebb témakörök a következÅ‘ kategóriában: {{categoryName}}" + top: + title: "Top" + help: "a legaktívabb témakörök az elmúlt évben, hónapban, hétben vagy napban" + all: + title: "Mindig" + yearly: + title: "Éves" + quarterly: + title: "Negyedévente" + monthly: + title: "Havi" + weekly: + title: "Heti" + daily: + title: "Napi" + all_time: "Mindig" + this_year: "év" + this_quarter: "Negyed" + this_month: "hónap" + this_week: "hét" + today: "Ma" + other_periods: "Lásd felül" + browser_update: 'Sajnos a böngészÅ‘d túl régi, hogy működjön ezzel az oldallal. Kérünk frissítsd azt!' + permission_types: + full: "Létrehozás / Válaszolás / Megtekintés" + create_post: "Válaszolás / Megtekintés" + readonly: "Megtekintés" + lightbox: + download: "letöltés" + keyboard_shortcuts_help: + title: 'Billentyűkombinációk' + jump_to: + title: 'Ugrás oda' + home: 'g, h Home' + latest: 'g, l Legutóbbi' + new: 'g, n Új' + unread: 'g, u Olvasatlan' + categories: 'g, c Kategóriák' + top: 'g, t FelsÅ‘' + bookmarks: 'g, b KönyvjelzÅ‘k' + profile: 'g, p Profil' + messages: 'g, m Üzenetek' + drafts: 'g, d Vázlatok' + navigation: + title: 'Navigáció' + jump: '# Ugrás a bejegyzésre #' + back: 'u Vissza' + application: + title: 'Alkalmazás' + create: 'c Új téma létrehozása' + notifications: 'nÉrtesítés megnyitása' + hamburger_menu: '=Hamburger menű megnyítása' + user_profile_menu: 'p Felhasználói menű megnyítása' + show_incoming_updated_topics: '.Frissített téma mutatása' + search: '/ vagy ctrl+alt+f Keresés' + help: '?Billentyűzet segítségek megnyitása' + dismiss_new_posts: 'x,rÚj/Témák elvetése' + dismiss_topics: 'x, t Témák elvetése' + log_out: 'shift+z shift+z Kijelentkezés' + composing: + title: 'Megfogalmaz' + actions: + title: 'Műveletek' + share_topic: 'shift+s Téma megosztása' + share_post: 's Bejegyzés megosztása' + reply_as_new_topic: 't Válasz csatolt témaként' + reply_topic: 'shift+rVálasz a témára' + reply_post: 'r Válasz a bejegyzésre' + quote_post: 'qBejegyzés idézése' + like: 'lBejegyzés likeolása' + edit: 'eBejegyzés szerkesztése' + delete: 'dBejegyzés törlése' + mark_muted: 'm,, Téma némítása' + badges: + title: Jelvények + none: "(semmi)" + badge_grouping: + getting_started: + name: Elkezdeni + community: + name: Közösség + trust_level: + name: Bizalmi szint + other: + name: Egyéb + posting: + name: Közzététel + google_search: | +

Keresés a Google-lel

+

+

+

+ tagging: + all_tags: "Összes címke" + other_tags: "Egyéb címkék" + selector_all_tags: "összes címke" + selector_no_tags: "nincs címke" + tags: "Címkék" + choose_for_topic: "Megadható címke" + delete_tag: "Címke törlése" + delete_confirm_no_topics: "Biztos vagy benne hogy elakarod távolítani ezt a címkét?" + rename_tag: "Címke átnevezése" + rename_instructions: "Válassz egy úgy nevet a címkének:" + sort_by: "Rendezés" + sort_by_count: "besorol" + sort_by_name: "név" + manage_groups: "Címke csoport kezelése" + filters: + without_category: "%{filter} %{tag} Témák" + with_category: "%{filter} %{tag} Témák a %{category}" + untagged_without_category: "%{filter}Címkézetlen témák" + untagged_with_category: "%{filter} Címkézetlen témák a %{category}" + notifications: + watching: + title: "Figyelés" + watching_first_post: + title: "ElsÅ‘ hozzászólások figyelése" + tracking: + title: "Követés" + regular: + title: "Ãtlagos" + muted: + title: "Némított" + groups: + title: "Címcsoportok" + new: "Új csoport" + tags_label: "Címkék ebben a csoportban" + parent_tag_label: "SzülÅ‘i címke" + parent_tag_placeholder: "Opcionális" + new_name: "Új csoport címke" + save: "Mentés" + delete: "Törlés" + visible_only_to_staff: "Címkék csak a személyzetnek láthatóak" + topics: + none: + unread: "Nincsenek olvasatlan témáid" + new: "Nincsenek új témáid" + read: "Egyetlen témát sem olvastál el eddig" + posted: "Nem tettél közzé egyetlen egy bejegyzést sem eddig" + latest: "Nincsenek legutóbbi témák" + hot: "Nincsenek forró témák" + top: "Nincsenek top témák" + search: "Nincs keresési találat" + bottom: + latest: "Nincsen több újabb téma" + hot: "Nincsen több hot témájú bejegyzés" + posted: "Nincsen több közzétett téma" + new: "Nincsen több új témájú bejegyzés" + unread: "Nincsen több olvasatlan témájú bejegyzés" + top: "Nincsen több top témájó bejegyzés" + bookmarks: "Nincs több témakör a könyvjelzÅ‘ben" + search: "Nincsen több keresési találat" + invite: + custom_message_link: "Privát üzenet" + custom_message_placeholder: "Add meg az egyéni üzenetedet" + custom_message_template_forum: "Hej, csatlakoznód kéne ehez a fórumhoz" + custom_message_template_topic: "Hej, úgygondoltam talán élveznéd ezt a témát" + safe_mode: + enabled: "A biztonságos mód be van kapcsolva, hogy kilépj a biztonságos módból lépj ki ebbÅ‘l a keresési lapból" + admin_js: + type_to_filter: "Ãrj ide a szűréshez.." + admin: + title: 'Discourse Admin' + moderator: 'Moderátor' + reports: + title: "Aktív bejelentések listája" + dashboard: + title: "VezérlÅ‘pult" + last_updated: "VezérlÅ‘pult utoljára frissítve:" + find_old: "A régi irányítópultot keresed?" + old_link: "Látogasd meg itt" + version: "Verzió" + up_to_date: "A rendszer naprakész!" + critical_available: "Egy fontos frissítés érhetÅ‘ el!" + updates_available: "Frissítések érhetÅ‘ek el!" + please_upgrade: "Kérünk frissíts!" + no_check_performed: "Nem volt ellenÅ‘rizve hogy van-e új frissítés. GyÅ‘zÅ‘djön meg arról hogy a sidekiq fut." + stale_data: "Rég nem volt ellenÅ‘rizve hogy van-e új frissítés. GyÅ‘zÅ‘djön meg arról hogy a sidekiq fut." + version_check_pending: "Úgy nézik nem rég frissítettél. Fantasztikus!" + installed_version: "Telepítve" + latest_version: "Legfrissebb" + problems_found: "Találtunk néhány problémát a Discourse installációdban:" + last_checked: "Utoljára ellenÅ‘rizve: " + refresh_problems: "Újratöltés" + no_problems: "Nem találtunk semmilyen problémát." + moderators: 'Moderátorok: ' + admins: 'Adminok: ' + silenced: 'Hangtalan:' + suspended: 'Felfüggesztettek: ' + private_messages_short: "Üzenetek" + private_messages_title: "Üzenetek" + mobile_title: "Mobiltelefon" + space_free: "{{size}} szabad" + uploads: "Feltöltések" + backups: "Biztonsági mentések" + lastest_backup: "Legutóbbi: %{date}" + traffic_short: "Forgalom" + page_views: "Oldal látogatások" + page_views_short: "Oldal látogatások" + show_traffic_report: "Részletes forgalom jelentés megtekintése" + community_health: Szociális egészség + moderators_activity: Moderátok aktivitása + whats_new_in_discourse: "Mi az új a Discourseban?" + activity_metrics: Aktivitás metrika + all_reports: "Összes bejelentés" + general_tab: "Ãltalános" + moderation_tab: "Mérsékelés" + disabled: Kikapcsolt + reports: + trend_title: "%{percent} megváltoztatni. Jelenlegi %{current}, volt %{prev} az elÅ‘zÅ‘ idÅ‘szakban" + today: "Ma" + yesterday: "Tegnap" + last_7_days: "Utolsó 7" + last_30_days: "Utolsó 30" + all_time: "Mindig" + 7_days_ago: "7 nappal ezelött" + 30_days_ago: "30 nappal ezelött" + all: "Mind" + view_table: "asztal" + view_graph: "Grafikon" + refresh_report: "Jelentés frissítése" + start_date: "KezdÅ‘ dátum" + end_date: "Vége dátum" + groups: "Összes csoport" + disabled: "Ez a bejelentés ki van kapcsolva" + total: "Mindenkori összes" + no_data: "Nincs adat amit ki tudna mutatni" + trending_search: + more: 'Keresési napló' + commits: + latest_changes: "Legutóbbi változtatások: kérünk frissíts gyakran!" + by: "általa: " + flags: + title: "Jelölések" + active_posts: "Megjelölt bejegyzés" + old_posts: "Rég megjelölt bejegyzések" + topics: "Megjelölt témák" + agree: "Elfogadás" + agree_flag_hide_post: "Bejegyzés elrejtése" + agree_flag_restore_post: "Elfogadott és visszaállított bejegyzés" + agree_flag_suspend: "Felhasználó felfüggesztése" + agree_flag_suspend_title: "Egyezz bele megjelöléssel, és függeszd fel a felhasználót" + agree_flag_silence: "Felhasználó elnémítása" + agree_flag: "Bejegyzés megtartása" + ignore_flag: "Ignorál" + delete: "Törlés" + delete_title: "A megjelölt bejegyzés törlése." + delete_post_defer_flag_title: "Bejegyzés törlése; fÅ‘ bejegyzés esetén témakör törlése" + delete_post_agree_flag_title: "Bejegyzés törlése; fÅ‘ bejegyzés esetén témakör törlése" + delete_flag_modal_title: "Törlés és..." + delete_spammer: "Spammer törlése" + delete_spammer_title: "Felhasználó törlése, valamennyi témakörével és bejegyzésével együtt." + disagree_flag_unhide_post: "Elutasítás (bejegyzés mutatása)" + disagree_flag_unhide_post_title: "A bejegyzés összes megjelölésének törlése és bejegyzés újra láthatóvá tétele" + disagree_flag: "Elutasítás" + disagree_flag_title: "Megjelölés törlése; érvénytelen vagy pontatlan" + clear_topic_flags: "Kész" + more: "(további válaszok...)" + suspend_user: "Felhasználó felfüggesztése" + suspend_user_title: "Felhasználó felfüggesztése a bejegyzés alól" + replies: + one: "[1 válasz]" + other: "[%{count} válaszok]" + dispositions: + agreed: "elfogadva" + disagreed: "elutasítva" + deferred: "Ignorált" + flagged_by: "Megjelölte" + resolved_by: "Megoldotta " + system: "Rendszer" + error: "Valami félresikerült" + reply_message: "Válaszolás" + no_results: "Nincsenek megjelölt bejegyzések" + topic_flagged: "Ez a téma meg lett jelölve." + show_full: "Teljes bejegyzés mutatása" + visit_topic: "Témakör meglátogatása a művelet végrehajtásához" + was_edited: "A bejegyzést szerkesztették az elsÅ‘ megjelölés után" + previous_flags_count: "Ezt a bejegyzést {{count}} alkalommal jelölték meg. " + details: "részletek" + flagged_topics: + topic: "Téma" + type: "fajta" + users: "Felhasználók" + last_flagged: "Utoljára megjelÅ‘lt" + no_results: "Nincsenek megjelÅ‘lt témák" + short_names: + off_topic: "Témán kívüli" + inappropriate: "helytelen" + spam: "spam" + notify_user: "Egyéni" + notify_moderators: "Egyéni" + groups: + new: + title: "Új csoport" + create: "Létrehoz" + name: + too_short: "A csoport neve túl rövid" + too_long: "A csoport neve túl hosszú" + checking: "A csoport elérhetÅ‘ségének ellenÅ‘rzése" + available: "A csoport neve elérhetÅ‘" + not_available: "A csoport neve nem elérhetÅ‘" + blank: "A csoport neve nem lehet hiányos" + manage: + interaction: + email: Email + incoming_email: "Egyéni bejövÅ‘ email cím" + incoming_email_placeholder: "Add meg az email címed" + visibility: Láthatóság + visibility_levels: + title: "Ki láthatja ezt a csoportot?" + public: "Mindenki" + members: "A csoport tulajdonosok, tagok és adminisztrátorok" + staff: "Csoport tulajdonosok és a stáb tagjai" + owners: "Csoport tulajdonosok és az adminisztrátorok" + membership: + automatic: Autómatikus + trust_level: Bizalmi szint + trust_levels_none: "Egyik sem" + primary: "ElsÅ‘dleges csoport" + no_primary: "(nincs elsÅ‘dleges csoport)" + title: "Csoportok" + edit: "Csoportok szerkesztése" + refresh: "Frissítés" + group_members: "A csoport tagjai" + delete: "Törlés" + delete_confirm: "Törlöd a csoportot?" + delete_failed: "A csoport törlése sikertelen. Ha ez egy automatikusan létrehozott csoport, akkor nem törölhetÅ‘." + add: "Új" + custom: "Egyéni" + automatic: "Automatikus" + default_title: "Alapértelmezett fejléc" + default_title_description: "Mindenki számára a csoportban alkalmazva lesz" + group_owners: tulajdonosok + add_owners: Tulajdonosok hozzáadása + none_selected: "Válasz ki egy csoportot hogy elkezdhesd" + no_custom_groups: "Új egyéni csoport létrehozása" + api: + generate_master: "Mester API-kulcs létrehozása" + none: "Jelenleg nincsenek elérhetÅ‘ API kulcsok." + user: "Felhasználó" + title: "API" + key: "API kulcs" + generate: "Generálás" + regenerate: "Regenerálás" + revoke: "Visszavonás" + confirm_regen: "Biztosan ki szeretnéd cserélni ezt az API kulcsot egy újra?" + confirm_revoke: "Biztosan vissza szeretnéd vonni ezt a kulcsot?" + info_html: "Az API kulcsod lehetÅ‘vé fogja tenni számodra, hogy JSON hívásokkal létrehozz és frissíts témaköröket." + all_users: "Minden felhasználó" + note_html: "Tartsd meg ezt a kulcsot titkos, minden felhasználó akinek megvan lehet hogy létrehoz egy korlátlan bejegyzést mint akármelyik felhasználó" + web_hooks: + title: "Webhooks" + create: "Létrehoz" + save: "Mentés" + destroy: "Törlés" + description: "Leírás" + controls: "Irányítás" + go_back: "Vissza a listára" + payload_url_placeholder: "https://example.com/postreceive" + secret_too_short: "A titoknak legalább 12 karakteresnek kell lennie" + content_type: "Tartalom típus" + secret: "Titok" + wildcard_event: "Küldj el mindent" + active: "Aktív" + categories_filter: "Elindított kategóriák" + groups_filter: "Elindított csoportok" + topic_event: + name: "Témakör" + post_event: + name: "Bejegyzés témája" + user_event: + name: "Felhasználói esemény" + details: "Amikor egy felhasználó bejelentkezik, kijelentkezik, jóváhagyásra kerül vagy módosul." + group_event: + name: "Csoport esemény" + details: "Amikor egy csoport létrejön, módosul vagy megsemmisül." + category_event: + name: "Kategória esemény" + details: "Amikor egy kategória létrejön, módosul vagy megsemmisül." + tag_event: + name: "Címke esemény" + details: "Amikor egy címke létrejön, módosul vagy megsemmisül." + delivery_status: + title: "Kiszállítás állapota" + inactive: "Inaktív" + failed: "Sikertelen" + successful: "Sikeres" + events: + redeliver: "Újra küldve" + request: "Kérés" + response: "Válasz" + headers: "Fejlécek" + body: "Törzs" + go_list: "Ugrás a listához" + ping: "Ping" + status: "Státusz kód" + event_id: "ID" + timestamp: "Létrehozott" + completion: "Elvégzési idÅ‘" + actions: "Műveletek" + plugins: + title: "Pluginok" + installed: "Telepített pluginek" + name: "Név" + none_installed: "Egy plugin sincs telepítve." + version: "Verzió" + enabled: "Engedélyezed?" + is_enabled: "Y" + not_enabled: "N" + change_settings: "Beállítások változtatása" + change_settings_short: "Beállítások" + howto: "Hogyan lehet plugin-eket telepíteni?" + official: "Hivatalos plugin" + backups: + title: "Biztonsági mentések" + menu: + backups: "Biztonsági mentések" + logs: "Naplók" + none: "Nincsenek elérhetÅ‘ biztonsági mentések." + read_only: + enable: + title: "Olvasásvédett mód bekapcsolása" + label: "Csak olvasás bekapcsolása" + confirm: "Biztos vagy benne hogy be szeretnéd kapcsolni az írásvédett módot" + disable: + title: "olvasásvédett mód kikapcsolása" + logs: + none: "Még nincsenek naplók..." + columns: + filename: "Fájlnév" + size: "Méret" + upload: + label: "Feltöltés" + uploading: "Feltültés..." + error: "Egy hiba lépett fel feltöltés közben '{{filename}}': {{message}}" + operations: + is_running: "Egy folyamat jelenleg fut már." + failed: "A {{operation}} meghiusúlt. Kérlek ellenÅ‘rízd a naplókat." + cancel: + label: "Mégse" + title: "Művelet visszavonása" + confirm: "Biztosan meg szeretnéd szakítani a jelenlegi folyamatot?" + backup: + label: "Biztonsági mentés" + title: "Mentés készítése" + confirm: "Új biztonsági mentést kívánsz indítani?" + without_uploads: "Igen (fájlok feltöltésének kihagyása)" + download: + label: "Letöltés" + title: "Küldj egy letöltési linket emailben" + alert: "Egy link a biztonsági mentésben el lett küldve neked emailben" + destroy: + title: "Biztonsági mentés törlése" + confirm: "Biztosan törölni szeretnéd ezt a biztonsági mentést?" + restore: + is_disabled: "A visszaállítás le van tiltva az oldal beállításaiban." + label: "Visszaállítás" + title: "Biztonsági mentés visszaállítása" + confirm: "Biztos vagy benne hogy vissza szeretnéd állítani a biztonsági mentést?" + rollback: + label: "Visszavonás" + title: "Adatbázis visszaállítása az elÅ‘zÅ‘ működÅ‘ állapotba" + export_csv: + success: "Az exportálás megkezdÅ‘dött, értesítést kapsz, ha a folyamat készen van." + failed: "Az exportálás sikertelen. Kérlek ellenÅ‘rizd a naplókat!" + button_text: "Exportálás" + button_title: + user: "Teljes felhasználói lista exportálása CSV formátumban." + staff_action: "Személyzeti tevékenységnapló exportálása CSV formátumban." + screened_email: "Teljes email lista exportálása CSV formátumban" + screened_ip: "Tejles IP lista exportálása CSV formátumban" + screened_url: "Teljes URL lista exportálása CSV formátumban" + export_json: + button_text: "Exportálás" + invite: + button_text: "Meghívók küldése" + button_title: "Meghívók küldése" + customize: + title: "Személyre szabás" + long_title: "Oldal testreszabása" + preview: "elÅ‘nézet" + explain_preview: "Az oldal megtekintése ezzel a témával" + save: "Mentés" + new: "Új" + new_style: "Új stílus" + import: "Importálás" + delete: "Törlés" + delete_confirm: "Töröljük ezt a témát?" + color: "Szín" + opacity: "ÃttetszÅ‘ség" + copy: "Másolás" + copy_to_clipboard: "Vágólapra másolás" + copied_to_clipboard: "Vágólapra másolva" + email_templates: + subject: "Tárgy" + body: "Test" + theme: + import_theme: "Téma importálása" + customize_desc: "Személyre szabás:" + title: "Témák" + edit: "Szerkesztés" + common: "Szokványos" + desktop: "Desktop" + mobile: "Mobil" + settings: "Beállítások" + preview: "ElÅ‘nézet" + is_default: "Ez a téma alapértelmezetten van bekapcsolva." + user_selectable: "A téma a felhasználók által választható" + color_scheme: "Szín sablon" + color_scheme_select: "Válassz színeket a témához" + custom_sections: "Egyéni részek:" + theme_components: "Téma elemek" + uploads: "Feltöltések" + add_upload: "Feltöltés hozzáadása" + variable_name: "SCSS var name:" + upload: "Feltöltés" + child_themes_check: "A téma más témákat is tartalmaz" + css_html: "Egyedi CSS/HTML" + edit_css_html: "CSS/HTML szerkesztése" + edit_css_html_help: "Nem szerkesztettél semmilyen CSS vagy HTML formátumot" + delete_upload_confirm: "Töröljük ezt a feltöltést? (A témához tartozó CSS működésképtelenné válhat!)" + import_file_tip: "témát tartalmazó .dcstyle.json fájl" + license: "Licenc" + update_to_latest: "Legutóbbi verzióra frissített" + check_for_updates: "Frissítések keresése" + updating: "Frissítés..." + up_to_date: "A téma naprakész, utoljára ellenÅ‘rizve:" + add: "Hozzáadás" + theme_settings: "Téma beállítások" + no_settings: "Ez a téma nem rendelkezik beállításokkal." + scss: + text: "CSS" + header: + text: "Fejléc" + footer: + text: "Lábléc" + head_tag: + text: "" + body_tag: + text: "" + yaml: + text: "YAML" + title: "Téma beállításainak megadása YAML formátumban" + colors: + select_base: + description: "Alap sablon:" + title: "Színek" + edit: "Szín sablon szerkesztése" + long_title: "Szín sémák" + about: "Módosítsd a témáid által használt színeket. Kezdésként készíts egy új színösszeállítást." + new_name: "Új szín séma" + copy_name_prefix: "másolata" + delete_confirm: "Törlöd ezt a szín sémát?" + undo: "Visszavonás" + revert: "Visszaállítás" + primary: + name: 'ElsÅ‘dleges' + description: 'valamenyi szövegek,ikonok és szegélyek' + secondary: + name: 'Másodlagos' + tertiary: + name: 'harmadlagos' + quaternary: + description: "Navigációs linkek" + header_background: + name: "Fejléc háttere" + description: "Az oldal fejlécének háttérszíne." + header_primary: + description: "Az oldal fejlécében lévÅ‘ szöveg és ikonok." + highlight: + name: 'kiemelés' + danger: + name: 'veszély' + success: + name: 'siker' + love: + name: 'szerelem' + description: "A kedvelés gomb színe." + email: + title: "Emailek" + settings: "Beállítások" + templates: "Sablonok" + sending_test: "Teszt Email küldése..." + error: "HIBA - %{server_error}" + sent: "Elküldve" + skipped: "Ãtlépve" + received: "Kapott" + rejected: "Elutasított" + sent_at: "Elküldve" + time: "IdÅ‘" + user: "Felhasználó" + email_type: "E-mail tips" + to_address: "Címzett" + test_email_address: "Email cím a teszteléshez" + send_test: "Teszt Email Küldése" + sent_test: "elküldve!" + delivery_method: "Szálítási módszer" + refresh: "Frissítés" + send_digest_label: "Eredmény elküldése:" + send_digest: "Küldés" + sending_email: "Email küldése..." + format: "Formátum" + html: "html" + text: "szöveges" + last_seen_user: "Legutóbb látott felhasználó:" + reply_key: "Válasz kulcs" + skipped_reason: "Ok kihagyása" + incoming_emails: + from_address: "From" + to_addresses: "To" + cc_addresses: "Cc" + subject: "Tárgy" + error: "Hiba" + modal: + error: "Hiba" + headers: "Fejlécek" + subject: "Téma" + body: "Test" + filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "Tárgy..." + error_placeholder: "Hiba" + logs: + none: "Nem találhatóak naplók." + filters: + title: "SzűrÅ‘" + user_placeholder: "felhasználónév" + address_placeholder: "name@example.com" + moderation_history: + actions: + delete_user: "Felhasználó törölve" + suspend_user: "Felhasználó felfüggesztve" + silence_user: "Felhasználó elnémítva" + delete_post: "Bejegyzés törölve" + delete_topic: "Téma törölve" + logs: + title: "Naplók" + action: "Művelet" + created_at: "Létrehozva" + last_match_at: "Utoljára párosított" + match_count: "ÖsszeillÅ‘" + ip_address: "IP" + topic_id: "Témakör azonosító" + post_id: "Bejegyzés azonosító" + category_id: "Kategória ID" + delete: 'Törlés' + edit: 'Szerkesztés' + save: 'Mentés' + screened_actions: + block: "letilt" + do_nothing: "ne csináljon semmit" + staff_actions: + all: "Összes" + filter: "SzűrÅ‘:" + title: "SzervezÅ‘i műveletek" + clear_filters: "Mind mutatása" + staff_user: "SzervezÅ‘ felhasználó" + target_user: "Célzott felhasználó" + subject: "Téma" + when: "Mikor" + context: "Kontextus" + details: "Részletek" + previous_value: "ElÅ‘zÅ‘" + new_value: "Új" + diff: "KülönbözÅ‘" + show: "Mutat" + modal_title: "Részletek" + no_previous: "Nincsen elÅ‘zÅ‘leges érték" + deleted: "Nincs új érték. A feljegyzés törölve lett" + actions: + delete_user: "felhasználó törlése" + change_trust_level: "bizalmi szint megváltoztatása" + change_username: "Felhasználónév módosítása" + change_site_setting: "oldal beállítások változtatása" + change_theme: "téma megváltoztatása" + delete_theme: "téma törlése" + change_site_text: "oldal szövegének változtatása" + suspend_user: "felhasználó felfüggesztése" + unsuspend_user: "felhasználó felfüggesztésének feloldása" + removed_suspend_user: "Felhaználó felfüggesztése (eltávolított)" + removed_unsuspend_user: "Felhasználó felfüggesztésének feloldása (eltávolított)" + grant_badge: "Jelvényt biztosít" + revoke_badge: "Jelvény visszavonása" + check_email: "Email ellenérzése" + delete_topic: "témakör törlése" + recover_topic: "Témakör visszahozása" + delete_post: "bejegyzés törlése" + impersonate: "Megszemélyesít" + anonymize_user: "Felhasználó névtelenítése" + change_category_settings: "Kategória beállítósok megváltoztatása" + delete_category: "Kategória törlése" + create_category: "Kategória létrehozása" + silence_user: "Felhasználó némítása" + unsilence_user: "Felhasználó visszanémítása" + removed_silence_user: "Felhasználó némítása (eltávolított)" + removed_unsilence_user: "Felhasználó visszanémítása (eltávolított)" + grant_admin: "Adminisztrátori jog adása" + revoke_admin: "Adminisztrátori jog visszavonása" + grant_moderation: "Moderátori jog adása" + revoke_moderation: "Moderátori jog visszavonása" + backup_create: "Biztonsági mentés készítése" + deleted_tag: "Címke törlése" + renamed_tag: "Címke átnevezése" + revoke_email: "Email visszavonása" + lock_trust_level: "Bizalmi szint zárolása" + unlock_trust_level: "Bizalmi szint feloldása" + activate_user: "Felhasználó aktiválása" + deactivate_user: "Felhasználó visszavonása" + change_readonly_mode: "Ãrásvédett mód megváltoztatása" + backup_download: "Biztonsági mentés letöltése" + backup_destroy: "Biztonsági mentés megsemmisítése" + reviewed_post: "Téma áttekintése" + custom_staff: "KiegészítÅ‘ egyedi eljárása" + post_locked: "Bejegyzés lezárva" + post_edit: "Bejegyzés szerkesztése" + check_personal_message: "Személyes üzenetek megnézése" + disabled_second_factor: "KétlépcsÅ‘s azonosítás kikapcsolása" + topic_published: "Téma közzétéve" + post_approved: "bejegyzés jóváhagyva" + post_rejected: "Bejegyzés elutasítva" + create_badge: "Jelvény létrehozása" + change_badge: "Jelvény megváltoztatása" + delete_badge: "Jelvény törlése" + merge_user: "Felhasználók eggyesíétse" + screened_emails: + email: "E-mail cím" + actions: + allow: "Engedélyez" + screened_urls: + url: "URL" + domain: "Domain" + screened_ips: + title: "Szkennelt IP-k" + actions: + block: "Letilt" + do_nothing: "Engedélyez" + form: + label: "Új:" + ip_address: "ip cím" + add: "Új" + filter: "Keresés" + search_logs: + term: "Kifejezés" + searches: "Keresések" + unique: "Egyedi" + types: + header: "Fejléc" + full_page: "Teljes oldal" + logster: + title: "Hiba-naplók" + watched_words: + search: "keresés" + clear_filter: "Törlés" + show_words: "Szöveg megjelenítése" + word_count: + one: "1 szó" + other: "%{count} szavak" + actions: + block: 'Blokkol' + censor: 'Cenzúra' + require_approval: 'Jóváhagyást igényel' + flag: 'Jelölés' + form: + label: 'Új szó:' + placeholder_regexp: "reguláris kifejezés" + add: 'Hozzáadás' + success: 'Siker' + exists: 'Már létezik' + upload: "Feltöltés" + impersonate: + title: "Megszemélyesít" + not_found: "A felhasználó nem található." + users: + title: 'Felhasználók' + create: 'Admin felhasználó hozzáadása' + last_emailed: "Utoljára emailelt" + not_found: "Sajnos ez a felhasználónév nem létezik." + id_not_found: "Sajnos ez a felhasználó id nem található a rendszerben." + active: "Aktív" + show_emails: "E-mailek mutatása" + nav: + new: "Új" + active: "Aktív" + pending: "Folyamatban" + staff: 'Személyzet' + suspended: 'Felfüggesztett' + silenced: 'Némított' + suspect: 'Meggyanúsítás' + staged: 'LépcsÅ‘zetes' + approved: "Jóváhagyott?" + approved_selected: + one: "Felhasználó jóváhagyva" + other: "Felhasználók jóváhagyása ({{count}})" + reject_selected: + one: "Felhasználó elutasítva" + other: "Felhasználók elutsítva ({{count}})" + titles: + active: 'Aktív felhasználók' + new: 'Új felhasználók' + newuser: 'A felhasználók bizalmi szintje 0 (Új felhasználó)' + basic: 'A felhasználók bizalmi szintje 1-es (Alapszintű Felhasználó)' + member: 'A felhasználók bizalmi szintje 2-es (Tag)' + regular: 'A felhasználók bizalmi szintje 3-as (Reguláris)' + leader: 'A felhasználók bizalmi szintje 4-es (VezetÅ‘)' + staff: "Személyzet" + admins: 'Adminisztrátorok' + moderators: 'Moderátorok' + silenced: 'Némított felhasználók' + suspended: 'Felfüggesztett felhasználok' + suspect: 'Megfigyelt felhasználok' + not_verified: "Nincs megerÅ‘sítve" + check_email: + title: "A felhasználó email címének megjelenítése" + text: "Mutat" + user: + suspend_reason: "oka" + suspend_message: "Email üzenet" + suspended_by: "Felfüggesztette" + silence_reason: "Indok" + silenced_by: "Némítva általa" + silence_modal_title: "Felhasználó elnémítása" + silence_duration: "Mennyi ideig lesz elnémítva a felhasználó?" + silence_reason_label: "Miért némítod el ezt a felhasználót?" + silence_reason_placeholder: "Némítás indoka" + silence_message_placeholder: "(Hagyd üresen hogy az alapértelmezett üzenetet küldje el)" + suspended_until: "(eddig %{until})" + cant_suspend: "Ez a felhasználó nem lett felfüggesztve" + delete_all_posts: "Összes hozzászólás törlése" + penalty_post_actions: "Mit szeretnél csinálni ezzel az összekapcsolt bejegyzéssel?" + penalty_post_delete: "Bejegyzés eltávolítása" + penalty_post_edit: "Bejegyzés szerkesztése" + penalty_post_none: "Ne csinálj semmit" + clear_penalty_history: + title: "Büntetési elÅ‘zmények törlése" + description: "Felhasználók akiknek van eltiltása nem érheti el a bizalmi szint 3-at" + silence: "Elnémítás" + silenced: "Elnémítás?" + moderator: "Moderátor?" + admin: "Adminisztrátor?" + suspended: "Felfüggesztett?" + show_admin_profile: "Adminisztrátor" + refresh_browsers: "ErÅ‘szakolt böngészÅ‘ frissítés" + refresh_browsers_message: "Üzenet elküldve minden ügyfélnek" + show_public_profile: "Publikus profil megjelenítése" + ip_lookup: "IP-cím keresés" + log_out: "Kijelentkezés" + revoke_admin: 'Admin jog visszavonása' + grant_admin: 'Admin jog adása' + revoke_moderation: 'Moderáció visszavonása' + unsuspend: 'Felfüggesztés feloldása' + suspend: 'Felfüggesztett' + reputation: Hírnév + permissions: Jogok + activity: Aktivitás + last_100_days: 'az elmúlt 100 napban' + private_topics_count: Privát témák + posts_read_count: Elolvasott bejegyzések + post_count: Létrehozott bejegyzések + second_factor_enabled: KétlépcsÅ‘s azonosítás aktiválva + topics_entered: Megtekintett témák + approve: 'Jóváhagy' + approved_by: "jóváhagyta:" + approve_success: "A felhasználó jóváhagyásra került és e-mailt küldtünk az aktiválási útmutatóval." + time_read: "Olvasási idÅ‘" + anonymize: "Felhasználó névtelenítése" + delete: "Felhasználó törlése" + delete_dont_block: "Csak törlés" + deleting_user: "Felhasználó törlése..." + deleted: "A felhasználó el lett távolítva" + send_activation_email: "Aktivációs email küldése" + activation_email_sent: "Egy aktivációs email elküldve" + activate: "Fiók aktiválása" + reset_bounce_score: + label: "Alaphelyzet" + suspend_modal_title: "Felhasználó felfüggesztése" + tl3_requirements: + value_heading: "Érték" + visits: "Látogatások" + days: "nap" + sso: + title: "Single Sign On" + external_id: "KülsÅ‘ ID" + external_username: "Felhasználónév" + external_name: "Név" + external_email: "Email" + external_avatar_url: "Profilkép URL-je" + user_fields: + title: "Felhasználói mezÅ‘k" + untitled: "Címtelen" + name: "MezÅ‘ neve" + type: "MezÅ‘ típusa" + description: "MezÅ‘ leírása" + save: "Mentés" + edit: "Szerkesztés" + delete: "Törlés" + cancel: "Mégse" + delete_confirm: "Biztosan törölni szeretnéd a felhasználói mezÅ‘t?" + options: "Beállítások" + required: + enabled: "kötelezÅ‘" + disabled: "nem kötelezÅ‘" + editable: + enabled: "szerkeszthetÅ‘" + disabled: "nem szerkeszthetÅ‘" + field_types: + text: 'Szöveges mezÅ‘' + confirm: 'MegerÅ‘sítés' + site_text: + search: "A módosítani kívánt szöveg keresése" + title: 'Szöveges tartalom' + edit: 'szerkesztés' + revert: "Változtatások visszavonása" + revert_confirm: "Biztosan vissza akarod vonni a változtatásaidat?" + go_back: "Vissza a kereséshez" + recommended: "Azt tanácsoljuk, hogy módosítsd a következÅ‘ szöveget az igényeidnek megfelelÅ‘en:" + show_overriden: 'Csak a felülírtak megjelenítése' + settings: + show_overriden: 'Csak a felülírtak megjelenítése' + reset: 'alaphelyzet' + none: 'egy sem' + site_settings: + title: 'Beállítások' + no_results: "Nincs találat." + clear_filter: "Törlés" + add_url: "URL hozzáadása" + uploaded_image_list: + label: "Lista szerkesztése" + empty: "Még nincs hozzárendelt kép. Kérlek, tölts fel egyet." + upload: + label: "Feltöltés" + title: "Kép(ek) feltöltése" + selectable_avatars: + title: "A felhasználó által választható avatarok listája" + categories: + all_results: 'Mind' + required: 'KötelezÅ‘' + basic: 'AlapvetÅ‘ beállítások' + users: 'Felhasználók' + email: 'Email' + files: 'Fájlok' + trust: 'Bizalmi szintek' + security: 'Biztonság' + seo: 'SEO' + spam: 'Spam' + developer: 'FejlesztÅ‘' + api: 'API' + user_api: 'Felhasználói API' + uncategorized: 'Egyéb' + backups: "Mentések" + login: "Bejelentkezés" + plugins: "Pluginek" + user_preferences: "Felhasználói beállítások" + tags: "Címkék" + search: "Keresés" + groups: "Csoportok" + badges: + title: Jelvények + new_badge: Új jelvény + new: Új + name: Név + badge: Jelvény + display_name: MegjelenítendÅ‘ név + description: Leírás + long_description: Hosszú leírás + badge_type: Jelvény típusa + badge_grouping: Csoport + save: Mentés + delete: Törlés + revoke: Visszavonás + reason: Indok + revoke_confirm: "Biztosan vissza akarod vonni ezt a jelvényt?" + edit_badges: Jelvények szerkesztése + enabled: Jelvény engedélyezése + icon: Ikon + image: Kép + preview: + bad_count_warning: + header: "FIGYELEM!" + sample: "Minta:" + grant: + with: "%{username}" + emoji: + title: "Emoji" + add: "Új emoji hozzáadása" + name: "Név" + image: "Kép" + embedding: + get_started: "Ha szeretnéd a Discourse-t egy másik weboldalba ágyazni, kezdd a hoszt megadásával." + title: "Beágyazás" + host: "Engedélyezett hosztok" + edit: "szerkesztés" + add_host: "Hoszt hozzáadása" + settings: "Beágyazás beállításai" + crawling_settings: "Crawler beállítások" + embed_by_username: "Felhasználónév téma létrehozáshoz" + embed_post_limit: "A bejegyzések maximális száma a beágyazásban" + embed_truncate: "Beágyazott bejegyzések rövidítése" + embed_classname_whitelist: "Engedélyezett CSS-osztálynevek" + save: "Beágyazás beállításainak mentése" + permalink: + title: "Közvetlen link" + url: "URL" + topic_id: "Téma ID" + topic_title: "Téma" + post_id: "Hozzászólás azonosító" + post_title: "Hozzászólás" + category_id: "Kategória azonosító" + category_title: "Kategória" + external_url: "KülsÅ‘ URL" + delete_confirm: "Biztosan törölni szeretnéd ezt a közvetlen linket?" + form: + label: "Új :" + add: "Hozzáadás" + filter: "Keresés (URL vagy KülsÅ‘ URL)" + wizard_js: + wizard: + done: "Kész" + back: "Vissza" + next: "Tovább" + step: "%{current} / %{total}" + upload: "Feltöltés" + uploading: "Feltöltés..." + upload_error: "Sajnáljuk, de hiba lépett fel a fájl feltöltése közben. Kérünk, próbáld újra!" + quit: "Talán KésÅ‘bb" + staff_count: + one: "A közösségedben 1 stábtag van (te)." + other: "A közösségedben veled együtt %{count} stábtag van." + invites: + add_user: "hozzáadás" + none_added: "Nem hívtál meg egy stábtagot sem. Biztos, hogy tovább lépsz?" + roles: + admin: "Adminisztrátor" + moderator: "Moderátor" + regular: "Felhasználó" + previews: + topic_title: "Vita téma" + share_button: "Megosztás" + reply_button: "Válasz" diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml index 0baadd6006..1c965750ff 100644 --- a/config/locales/client.id.yml +++ b/config/locales/client.id.yml @@ -42,49 +42,49 @@ id: tiny: half_a_minute: "< 1m" less_than_x_seconds: - other: < %{count}s + other: "< %{count}s" x_seconds: - other: '%{count}s' + other: "%{count}s" less_than_x_minutes: - other: '%{count}juta' + other: "%{count}juta" x_minutes: - other: '%{count}m' + other: "%{count}m" about_x_hours: - other: '%{count}h' + other: "%{count}h" x_days: - other: '%{count}d' + other: "%{count}d" x_months: - other: '%{count}senin' + other: "%{count}senin" about_x_years: - other: '%{count}y' + other: "%{count}y" over_x_years: - other: '> %{count}y' + other: "> %{count}y" almost_x_years: - other: '%{count}y' + other: "%{count}y" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - other: '%{count} menit' + other: "%{count} menit" x_hours: - other: '%{count} jam' + other: "%{count} jam" x_days: - other: '%{count} hari' + other: "%{count} hari" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - other: '%{count} menit yang lalu' + other: "%{count} menit yang lalu" x_hours: - other: '%{count} jam yang lalu' + other: "%{count} jam yang lalu" x_days: - other: '%{count} hari yang lalu' + other: "%{count} hari yang lalu" later: x_days: - other: '%{count} hari kemudian' + other: "%{count} hari kemudian" x_months: - other: '%{count} bulan kemudian' + other: "%{count} bulan kemudian" x_years: - other: '%{count} bulan kemudian' + other: "%{count} bulan kemudian" previous_month: 'Bulan Lalu' next_month: 'Bulan Depan' placeholder: tanggal @@ -160,12 +160,12 @@ id: show_help: "pilihan" links: "Tautan" links_lowercase: - other: tautan + other: "tautan" faq: "FAQ" guidelines: "Petunjuk" privacy_policy: "Kebijakan Privasi" privacy: "Privasi" - terms_of_service: "Ketentuan Layanan" + tos: "Ketentuan Layanan" mobile_view: "Tampilan Mobile" desktop_view: "Tampilan Desktop" you: "Anda" @@ -184,7 +184,7 @@ id: max_of_count: "maksimal dari {{count}}" alternation: "atau" character_count: - other: '{{count}} karakter' + other: "{{count}} karakter" suggested_topics: title: "Topik Yang Disarankan" pm_title: "Pesan Yang Disarankan" @@ -253,14 +253,14 @@ id: cancel: "Batal" view_pending: "lihat postingan tertunda" has_pending_posts: - other: Bahasan ini {{count}} pesan menunggu persetujuan + other: "Bahasan ini {{count}} pesan menunggu persetujuan" confirm: "Simpan perubahan" delete_prompt: "Apakah anda yakin akan menghapus %{username} ? Ini akan menghapus semua pesan dan memblokir email dan alamat IP. " approval: title: "Pesan Membutuhkan Persetujuan" description: "Kami telah menerima posting baru Anda, tetapi diperlukan persetujuan dari moderator sebelum posting tersebut tampil. Mohon kesabarannya. Terima kasih!" pending_posts: - other: Anda mempunyai {{count}} pesan tertunda. + other: "Anda mempunyai {{count}} pesan tertunda." ok: "Ya" user_action: user_posted_topic: "{{user}} memposting topik" @@ -293,7 +293,7 @@ id: days_visited_long: "Hari yang dikunjungi" posts_read: "baca" total_rows: - other: '%{count} pengguna' + other: "%{count} pengguna" group_histories: actions: add_user_to_group: "Tambahkan pengguna" @@ -350,7 +350,7 @@ id: is_group_user: "Anggota" is_group_owner: "Pemilik" title: - other: Grup + other: "Grup" activity: "Aktifitas" members: title: "Anggota" @@ -402,8 +402,6 @@ id: reorder: title: "memesan ulang kategori" title_long: "Mengatur ulang daftar kategori" - fix_order: "Posisi yang tepat" - fix_order_tooltip: "Tidak semua kategori mempunyai angka posisi yang unik, yang mana dapat menyebabkan hasil yang tidak diharapkan." save: "menyimpan pesanan" apply_all: "menerapkan" position: "Posisi" @@ -414,9 +412,9 @@ id: toggle_ordering: "beralih memesan kontrol" subcategories: "Subkategori" topic_sentence: - other: '%{count} topik' + other: "%{count} topik" topic_stat_sentence: - other: '%{count} topik baru dalam %{unit} terakhir.' + other: "%{count} topik baru dalam %{unit} terakhir." ip_lookup: title: Pencarian Alamat IP hostname: nama host @@ -558,7 +556,6 @@ id: upload_title: "Unggah gambar anda" upload_picture: "Unggah Gambar" image_is_not_a_square: "Peringatan: kami telah memotong gambar anda; lebar dan tinggi tidak sama." - cache_notice: "Anda telah sukses mengganti gambar profil, tetapi mungkin akan memerlukan waktu untuk tampil karena cache peramban" change_profile_background: title: "Latar Belakang Profil" instructions: "Latar belakang profil akan ditengahkan, dan mempunyai lebar standar 850px" @@ -572,7 +569,7 @@ id: invalid: "Silahkan masukkan alamat email yang valid" authenticated: "Email anda sudah dikonfirmasi oleh {{provider}}" frequency: - other: Kami akan mengirimkan email kepada anda jika kami tidak melihat anda selama {{count}} menit. + other: "Kami akan mengirimkan email kepada anda jika kami tidak melihat anda selama {{count}} menit." name: title: "Name" instructions: "Nama lengkap anda (opsional)" @@ -681,17 +678,17 @@ id: title: "Ringkasan" stats: "Statistik" topic_count: - other: topik dibuat + other: "topik dibuat" post_count: - other: tulisan dibuat + other: "tulisan dibuat" likes_given: - other: diberikan + other: "diberikan" likes_received: - other: diterima + other: "diterima" days_visited: - other: hari berkunjung + other: "hari berkunjung" topics_entered: - other: topik dilihat + other: "topik dilihat" top_replies: "Balasan Teratas" no_replies: "Belum ada balasan" more_replies: "Balasan lebih banyak" @@ -702,7 +699,6 @@ id: no_links: "Belum ada tautan." most_liked_by: "Banyak Disukai Oleh" most_liked_users: "Paling Disukai" - associated_accounts: "Masuk" ip_address: title: "Alamat IP terakhir" registration_ip_address: @@ -760,7 +756,6 @@ id: enable: "Sembunyikan Tulisan Terhapus" private_message_info: title: "Pesan" - invite: "Undang Lainnya..." email: 'Surel' username: 'Nama Pengguna' last_seen: 'Terlihat' @@ -787,9 +782,6 @@ id: reset_password: 'Atur Ulang Kata Sandi' or: "atau" submit_new_email: "Perbarui Alamat Email" - google: - title: "dengan Google" - message: "Autentikasi dengan Google (pastikan pop up blockers tidak dinyalakan)" google_oauth2: title: "dengan Google" message: "Autentikasi dengan Google (pastikan pop up blockers tidak dinyalakan)" @@ -895,7 +887,7 @@ id: not_found: title: "Tidak ada topik" new_posts: - other: ada {{count}} posting baru di topik ini sejak terakhir Anda mengunjunginya + other: "ada {{count}} posting baru di topik ini sejak terakhir Anda mengunjunginya" back_to_list: "Kembali ke Daftar Topik" options: "Opsi Topik" show_links: "tampilkan pranala dalam topik ini" @@ -933,11 +925,11 @@ id: filters: new: lower_title_with_count: - other: '{{count}} baru' + other: "{{count}} baru" lower_title: "baru" title: "Baru" title_with_count: - other: Baru ({{count}}) + other: "Baru ({{count}})" category: help: "topik terakhir di kategori {{categoryName}}" top: diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 33ee3fe0ce..154841f1c3 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -43,68 +43,68 @@ it: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}min + one: "< 1m" + other: "< %{count}min" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1ora - other: '%{count}ore' + one: "1ora" + other: "%{count}ore" x_days: - one: 1giorno - other: '%{count}giorni' + one: "1giorno" + other: "%{count}giorni" x_months: - one: 1 mese - other: '%{count}mesi' + one: "1 mese" + other: "%{count}mesi" about_x_years: - one: 1anno - other: '%{count}anni' + one: "1anno" + other: "%{count}anni" over_x_years: - one: '> 1anno' - other: '> %{count}anni' + one: "> 1anno" + other: "> %{count}anni" almost_x_years: - one: 1anno - other: '%{count}anni' + one: "1anno" + other: "%{count}anni" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count}min' + one: "1 min" + other: "%{count}min" x_hours: - one: 1 ora - other: '%{count} ore' + one: "1 ora" + other: "%{count} ore" x_days: - one: 1 giorno - other: '%{count} giorni' + one: "1 giorno" + other: "%{count} giorni" date_year: "D MMM 'YY" medium_with_ago: x_minutes: - one: 1 minuto fa - other: '%{count}minuti fa' + one: "1 minuto fa" + other: "%{count}minuti fa" x_hours: - one: 1 ora fa - other: '%{count}ore fa' + one: "1 ora fa" + other: "%{count}ore fa" x_days: - one: 1 giorno fa - other: '%{count}giorni fa' + one: "1 giorno fa" + other: "%{count}giorni fa" later: x_days: - one: 1 giorno dopo - other: '%{count}giorni dopo' + one: "1 giorno dopo" + other: "%{count}giorni dopo" x_months: - one: 1 mese dopo - other: '%{count}mesi dopo' + one: "1 mese dopo" + other: "%{count}mesi dopo" x_years: - one: 1 anno dopo - other: '%{count}anni dopo' + one: "1 anno dopo" + other: "%{count}anni dopo" previous_month: 'Mese Precedente' next_month: 'Mese Successivo' placeholder: data @@ -164,6 +164,7 @@ it: eu_central_1: "Europa (Francoforte)" eu_west_1: "Europa (Irlanda)" eu_west_2: "EU (Londra)" + eu_west_3: "UE (Parigi)" sa_east_1: "America del Sud (San Paolo)" us_east_1: "Stati Uniti Est (Virginia del Nord)" us_east_2: "USA Est (Ohio)" @@ -181,19 +182,19 @@ it: log_in: "Connetti" age: "Età" joined: "Iscritto" - admin_title: "Amministrazione" + admin_title: "Amministratore" flags_title: "Segnalazioni" show_more: "mostra altro" show_help: "opzioni" links: "Collegamenti" links_lowercase: - one: collegamento - other: collegamenti + one: "collegamento" + other: "collegamenti" faq: "FAQ" guidelines: "Linee Guida" privacy_policy: "Tutela Privacy" privacy: "Privacy" - terms_of_service: "Termini di Servizio" + tos: "Termini di Servizio" mobile_view: "Visualizzazione Mobile" desktop_view: "Visualizzazione Desktop" you: "Tu" @@ -205,22 +206,22 @@ it: never: "mai" every_30_minutes: "ogni 30 minuti" every_hour: "ogni ora" - daily: "giornaliero" - weekly: "settimanale" - every_two_weeks: "bisettimanale" + daily: "ogni giorno" + weekly: "ogni settimana" + every_two_weeks: "ogni due settimane" every_three_days: "ogni tre giorni" max_of_count: "massimo di {{count}}" alternation: "o" character_count: - one: '{{count}} carattere' - other: '{{count}} caratteri' + one: "{{count}} carattere" + other: "{{count}} caratteri" suggested_topics: - title: "Discussioni Suggerite" + title: "Argomenti Suggeriti" pm_title: "Messaggi Suggeriti" about: simple_title: "Informazioni" title: "Informazioni su %{title}" - stats: "Statistiche del Sito" + stats: "Statistiche Sito" our_admins: "I Nostri Amministratori" our_moderators: "I Nostri Moderatori" stat: @@ -242,23 +243,29 @@ it: unbookmark: "Clicca per rimuovere tutti i segnalibri a questo argomento" bookmarks: not_logged_in: "spiacenti, devi essere connesso per aggiungere segnalibri ai messaggi" - created: "hai inserito questo messaggio nei segnalibri." + created: "hai inserito questo messaggio nei segnalibri" not_bookmarked: "hai letto questo messaggio; clicca per inserirlo nei segnalibri" last_read: "questo è l'ultimo messaggio che hai letto; clicca per inserirlo nei segnalibri" remove: "Rimuovi Segnalibro" confirm_clear: "Sei sicuro di voler cancellare tutti segnalibri da questo argomento?" + drafts: + resume: "Riprendi" + remove: "Rimuovi" + new_topic: "Nuovo argomento in bozza" + new_private_message: "Nuovo messaggio privato in bozza" + topic_reply: "Risposta in bozza" topic_count_latest: - one: Visualizza {{count}} argomenti nuovi o aggiornati - other: Visualizza {{count}} argomenti nuovi o aggiornati. + one: "Visualizza {{count}} argomenti nuovi o aggiornati" + other: "Visualizza {{count}} argomenti nuovi o aggiornati." topic_count_unread: - one: V - other: 'Visualizza {{count}} argomenti non letti ' + one: "V" + other: "Visualizza {{count}} argomenti non letti " topic_count_new: - one: V - other: Visualizza {{count}} nuovi argomenti - preview: "Anteprima" + one: "V" + other: "Visualizza {{count}} nuovi argomenti" + preview: "anteprima" cancel: "annulla" - save: "Salva modifiche" + save: "Salva Modifiche" saving: "Salvataggio..." saved: "Salvato!" upload: "Carica" @@ -275,13 +282,13 @@ it: switch_to_anon: "Avvia Modalità Anonima" switch_from_anon: "Esci Modalità Anonima" banner: - close: "Nascondi questo banner." + close: "Nascondi questo annuncio." edit: "Modifica questo annuncio >>" choose_topic: none_found: "Nessun argomento trovato." title: - search: "Cerca conversazioni per nome, indirizzo o numero:" - placeholder: "digita il titolo della conversazione" + search: "Cerca un Argomento per nome, url o id:" + placeholder: "digita il titolo dell'argomento" queue: topic: "Argomento:" approve: 'Approva' @@ -293,16 +300,16 @@ it: cancel: "Annulla" view_pending: "vedi messaggi in attesa" has_pending_posts: - one: Questo argomento ha 1 messaggio in attesa di approvazione - other: Questo argomento ha {{count}} messaggi in attesa di approvazione + one: "Questo argomento ha 1 messaggio in attesa di approvazione" + other: "Questo argomento ha {{count}} messaggi in attesa di approvazione" confirm: "Salva Modifiche" delete_prompt: "Sei sicuro di voler eliminare %{username}? Ciò cancellerà tutti i suoi messaggi e bloccherà il suo indirizzo email e l'indirizzo IP." approval: - title: "Il messaggio è da approvare" + title: "Messaggio Da Approvare" description: "Abbiamo ricevuto il tuo messaggio ma prima che appaia è necessario che venga approvato da un moderatore. Per favore sii paziente." pending_posts: - one: Hai 1 messaggio in attesa. - other: Hai {{count}} messaggi in attesa. + one: "Hai 1 messaggio in attesa." + other: "Hai {{count}} messaggi in attesa." ok: "OK" user_action: user_posted_topic: "{{user}} ha pubblicato l'argomento" @@ -310,9 +317,9 @@ it: user_replied_to_post: "{{user}} ha risposto a {{post_number}}" you_replied_to_post: "Tu hai risposto a {{post_number}}" user_replied_to_topic: "{{user}} ha risposto all'argomento" - you_replied_to_topic: "You hai risposto all'argomento" - user_mentioned_user: "Tu hai menzionato {{another_user}}" - user_mentioned_you: "Tu hai menzionato {{another_user}}" + you_replied_to_topic: "Tu hai risposto all'argomento" + user_mentioned_user: "{{user}} ha menzionato {{another_user}}" + user_mentioned_you: "{{user}} ha menzionato te" you_mentioned_user: "Tu hai menzionato {{another_user}}" posted_by_user: "Pubblicato da {{user}}" posted_by_you: "Pubblicato da te" @@ -336,14 +343,14 @@ it: posts_read: "Letti" posts_read_long: "Messaggi Letti" total_rows: - one: 1 utente - other: '%{count} utenti' + one: "1 utente" + other: "%{count} utenti" group_histories: actions: change_group_setting: "Cambia le impostazioni del gruppo" add_user_to_group: "Aggiunti utente" remove_user_from_group: "Rimuovi utente" - make_user_group_owner: "Assegna proprietà" + make_user_group_owner: "Rendi proprietario" remove_user_as_group_owner: "Revoca proprietà" groups: add_members: @@ -369,13 +376,13 @@ it: title: "Log" when: "Quando" action: "Azione" - acting_user: "Utente attore" + acting_user: "Attante" target_user: "Utente destinatario" subject: "Oggetto" details: "Dettagli" from: "Da" to: "A" - public_admission: "Consenti agli utenti di unirsi al gruppo liberamente (Richiede che il gruppo sia visibile a tutti)" + public_admission: "Consenti agli utenti di unirsi al gruppo liberamente (richiede che il gruppo abbia visibilità pubblica)" public_exit: "Consenti agli utenti di lasciare il gruppo liberamente" empty: posts: "Non ci sono messaggi da membri di questo gruppo." @@ -390,11 +397,11 @@ it: request: "Richiesta" message: "Messaggio" allow_membership_requests: "Permetti agli utenti di richiedere l'invito ai proprietari del gruppo" - membership_request_template: "Template personalizzato da mostrare agli utenti quando inviano una richiesta di adesione" + membership_request_template: "Modello personalizzato da mostrare agli utenti quando inviano una richiesta di adesione" membership_request: submit: "Invia Richiesta" title: "Richiesta di adesione a @%{group_name}" - reason: "Spiega ai proprietari del gruppo perché vuoi entrare a far parte di questo gruppo" + reason: "Spiega ai proprietari del gruppo perché fai parte di questo gruppo" membership: "Iscrizione" name: "Nome" group_name: "Nome gruppo" @@ -422,8 +429,8 @@ it: is_group_user: "Membro" is_group_owner: "Proprietario" title: - one: Group - other: Gruppi + one: "Group" + other: "Gruppi" activity: "Attività" members: title: "Membri" @@ -448,11 +455,11 @@ it: only_admins: "Solo gli amministratori" mods_and_admins: "Solo i moderatori e gli amministratori" members_mods_and_admins: "Solo i membri del gruppo, i moderatori e gli amministratori" - everyone: "Tutti" + everyone: "Chiunque" notifications: watching: title: "In osservazione" - description: "Verrai avvertito per ogni nuovo messaggio, e verrà mostrato il conteggio delle nuove risposte." + description: "Verrai avvertito per ogni nuovo invio in qualsiasi messaggio, e verrà mostrato il conteggio delle nuove risposte." watching_first_post: title: "Osservando Primo Messaggio" description: "Sarai avvertito soltanto per il primo messaggio in ogni nuovo argomento in questo gruppo." @@ -483,20 +490,19 @@ it: "7": "Menzioni" "9": "Citazioni" "11": "Modifiche" - "12": "Inviati" + "12": "Elementi Inviati" "13": "Posta in arrivo" "14": "In Attesa" + "15": "Bozze" categories: all: "tutte le categorie" - all_subcategories: "tutto in %{categoryName}" + all_subcategories: "tutte" no_subcategory: "nessuno" category: "Categoria" category_list: "Visualizza l'elenco delle categorie" reorder: title: "Riordina Categorie" title_long: "Riorganizza l'elenco di categorie" - fix_order: "Posizioni Fisse" - fix_order_tooltip: "Non tutte le categorie hanno un numero di posizionamento univoco, ciò potrebbe causare risultati inattesi." save: "Salva Ordinamento" apply_all: "Applica" position: "Posizione" @@ -507,11 +513,12 @@ it: toggle_ordering: "inverti l'ordinamento" subcategories: "Sottocategorie" topic_sentence: - one: 1 argomento - other: '%{count} argomenti' + one: "1 argomento" + other: "%{count} argomenti" topic_stat_sentence: - one: '%{count} nuovo argomento nell''ultimo %{unit}.' - other: '%{count} nuovi argomenti nell''ultimo %{unit}.' + one: "%{count} nuovo argomento nell'ultimo %{unit}." + other: "%{count} nuovi argomenti nell'ultimo %{unit}." + more: " (altre %{count}) ..." ip_lookup: title: Ricerca Indirizzo IP hostname: Hostname @@ -523,11 +530,11 @@ it: delete_other_accounts: "Cancella %{count}" username: "nome utente" trust_level: "TL" - read_time: "durata lettura" + read_time: "tempo lettura" topics_entered: "argomenti visualizzati" post_count: "n° messaggi" confirm_delete_other_accounts: "Sicuro di voler cancellare questi account?" - powered_by: "powered by ipinfo.io" + powered_by: "fornito da ipinfo.io" user_fields: none: "(scegli un'opzione)" user: @@ -563,8 +570,8 @@ it: enable: "Abilita Notifiche" each_browser_note: "Nota: devi modificare questa impostazione per ogni browser che utilizzi." consent_prompt: "Desideri ricevere notifiche in tempo reale quando qualcuno risponde a un tuo messaggio?" - dismiss: 'Chiudi' - dismiss_notifications: "Chiudi Tutti" + dismiss: 'Nascondi' + dismiss_notifications: "Nascondi tutti" dismiss_notifications_tooltip: "Imposta tutte le notifiche non lette come lette " first_notification: "La tua prima notifica! Selezionala per iniziare." disable_jump_reply: "Non saltare al mio messaggio dopo la mia risposta" @@ -594,6 +601,7 @@ it: individual_no_echo: "Invia una email per ogni nuovo messaggio, eccetto per i miei" many_per_day: "Inviamo una email per ogni nuovo messaggio (circa {{dailyEmailEstimate}} al giorno)" few_per_day: "Inviami una email per ogni nuovo messaggio (circa 2 al giorno)" + warning: "Modalità Mailing List attiva. Le impostazioni per la notifica via email verranno ignorate." tag_settings: "Etichette" watched_tags: "Osservate" watched_tags_instructions: "Osserverai automaticamente tutti gli argomenti con queste etichette. Verrai notificato di tutti i nuovi messaggi e argomenti, e accanto all'argomento apparirà anche un conteggio dei nuovi messaggi." @@ -610,7 +618,7 @@ it: watched_first_post_tags: "Osservando Primo Messaggio" watched_first_post_tags_instructions: "Riceverai la notifica per il primo messaggio di ogni nuovo argomento con queste etichette." muted_categories: "Silenziate" - muted_categories_instructions: "Non ti verrà notificato nulla sui nuovi argomenti in queste categorie, e non compariranno nell'elenco Ultimi." + muted_categories_instructions: "Non ti verrà notificato nulla sui nuovi argomenti in queste categorie, e non compariranno nell'elenco Recenti." no_category_access: "Come moderatore hai accesso limitato alla categoria, il salvataggio è disabilitato." delete_account: "Cancella il mio account" delete_account_confirm: "Sei sicuro di voler cancellare il tuo account in modo permanente? Questa azione non può essere annullata!" @@ -667,6 +675,19 @@ it: set_password: "Imposta Password" choose_new: "Scegli una nuova password" choose: "Scegli una password" + second_factor_backup: + title: "Codici di backup Due Fattori" + regenerate: "Rigenera" + disable: "Disabilita" + enable: "Abilita" + enable_long: "Abilita codici di backup" + manage: "Gestisci codici di backup" + copied_to_clipboard: "Copiato nella Clipboard" + copy_to_clipboard_error: "Errore durante la copia nella Clipboard" + remaining_codes: "Ti sono rimasti {{count}} codici di backup." + codes: + title: "Codici di backup generati" + description: "Ciascuno di questi codici di backup può essere usato una sola volta. Conservali in un posto sicuro ma accessibile." second_factor: title: "Autenticazione a Due Fattori" disable: "Disabilita l'autenticazione a due fattori" @@ -685,7 +706,7 @@ it: error: "Si è verificato un errore durante la modifica del valore." change_username: title: "Cambia Utente" - confirm: "Se modifichi il nome utente, tutte le precedenti menzioni al tuo @nome non saranno più valide. Sei assolutamente sicuro di volerlo fare?" + confirm: "Sei assolutamente certo di voler cambiare il tuo nome utente?" taken: "Spiacenti, questo nome utente è già riservato." invalid: "Nome utente non valido: usa solo lettere e cifre" change_email: @@ -706,7 +727,6 @@ it: upload_title: "Carica la tua foto" upload_picture: "Carica Immagine" image_is_not_a_square: "Attenzione: abbiamo ritagliato l'immagine; la larghezza e l'altezza non erano uguali." - cache_notice: "Hai cambiato correttamente la tua immagine di profilo ma potrebbe volerci un po' prima di vederla apparire a causa della cache del browser." change_profile_background: title: "Sfondo Profilo" instructions: "Gli sfondi del profilo saranno centrati e avranno per difetto un'ampiezza di 850px." @@ -715,14 +735,22 @@ it: instructions: "Le immagini di sfondo saranno centrate e per difetto avranno un'ampiezza di 590px." email: title: "Email" + primary: "Email principale" + secondary: "Email secondaria" + no_secondary: "Nessuna email secondaria" instructions: "mai mostrato pubblicamente" ok: "Ti invieremo una email di conferma" invalid: "Inserisci un indirizzo email valido" authenticated: "{{provider}} ha autenticato la tua email" frequency_immediately: "Ti invieremo immediatamente una email se non hai letto ciò per cui ti stiamo scrivendo." frequency: - one: TI invieremo un email solo se non ti avremo visto nell'ultimo minuto. - other: Ti invieremo una email solo se non ti si vede da almeno {{count}} minuti. + one: "TI invieremo un email solo se non ti avremo visto nell'ultimo minuto." + other: "Ti invieremo una email solo se non ti si vede da almeno {{count}} minuti." + associated_accounts: + title: "Account associati" + connect: "Connetti" + revoke: "Revoca" + not_connected: "(non connesso)" name: title: "Nome" instructions: "il tuo nome completo (opzionale)" @@ -808,8 +836,8 @@ it: sent: "Spedito" none: "Nessun invito da visualizzare." truncated: - one: Mostro il primo invito. - other: Mostro i primi {{count}} inviti. + one: "Mostro il primo invito." + other: "Mostro i primi {{count}} inviti." redeemed: "Inviti Accettati" redeemed_tab: "Riscattato" redeemed_tab_with_count: "Riscattato ({{count}})" @@ -831,7 +859,7 @@ it: reinvited: "Invito rinviato" reinvited_all: "Tutti gli inviti sono stati rispediti!" time_read: "Ora di Lettura" - days_visited: "Presenza (giorni)" + days_visited: "Giorni Frequenza" account_age_days: "Età dell'utente in giorni" create: "Invia un Invito" generate_link: "Copia il collegamento di invito" @@ -856,29 +884,29 @@ it: time_read: "tempo di lettura" recent_time_read: "tempo di lettura recente" topic_count: - one: argomento creato - other: argomenti creati + one: "argomento creato" + other: "argomenti creati" post_count: - one: messaggio creato - other: messaggi creati + one: "messaggio creato" + other: "messaggi creati" likes_given: - one: assegnati - other: assegnati + one: "assegnati" + other: "assegnati" likes_received: - one: ricevuti - other: ricevuti + one: "ricevuti" + other: "ricevuti" days_visited: - one: giorno di frequenza - other: giorni di frequenza + one: "giorno di frequenza" + other: "giorni di frequenza" topics_entered: - one: argomenti visualizzati - other: argomenti visualizzati + one: "argomenti visualizzati" + other: "argomenti visualizzati" posts_read: - one: messaggio letto - other: messaggi letti + one: "messaggio letto" + other: "messaggi letti" bookmark_count: - one: segnalibro - other: segnalibri + one: "segnalibro" + other: "segnalibri" top_replies: "Migliori Risposte" no_replies: "Ancora nessuna risposta." more_replies: "Altre Risposte" @@ -894,7 +922,9 @@ it: most_liked_users: "Con più \"Mi Piace\"" most_replied_to_users: "Più Risposte A" no_likes: "Ancora nessun \"Mi piace\"." - associated_accounts: "Connessioni" + top_categories: "Categorie principali" + topics: "Argomenti" + replies: "Risposte" ip_address: title: "Ultimo indirizzo IP" registration_ip_address: @@ -947,8 +977,8 @@ it: reached: "%{relativeAge} – %{rate} ha raggiunto i limiti impostati di %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} ha ecceduto i limiti impostati di %{siteSettingRate}." rate: - one: 1 errore/%{duration} - other: '%{count} errori/%{duration}' + one: "1 errore/%{duration}" + other: "%{count} errori/%{duration}" learn_more: "per saperne di più..." all_time: 'totale' all_time_desc: 'totale argomenti creati' @@ -976,8 +1006,6 @@ it: hide_session: "Ricordamelo domani" hide_forever: "no grazie" hidden_for_session: "Ok, te lo chiederò domani. Puoi sempre usare \"Connetti\" per creare un account." - intro: "Ciao! :heart_eyes: A quanto pare ti sta piacendo la discussione, ma non sei ancora iscritto." - value_prop: "Quando hai un account ci ricordiamo esattamente cosa stavi leggendo, così potrai riprendere da dove ti eri fermato. Inoltre ricevi le notifiche, sia qui sia via email, ogni volta che ci saranno nuovi messaggi. Inoltre potrai metterei i \"Mi piace\" ai messaggi e condividerne l'apprezzamento. :heartbeat:" summary: enabled_description: "Stai visualizzando un riepilogo dell'argomento: è la comunità a determinare quali sono i messaggi più interessanti." description: "Ci sono {{replyCount}} risposte." @@ -991,7 +1019,6 @@ it: disable: "Mostra Messaggi Eliminati" private_message_info: title: "Messaggio" - invite: "Invita altri utenti..." leave_message: "Vuoi veramente abbandonare questo messaggio?" remove_allowed_user: "Davvero vuoi rimuovere {{name}} da questo messaggio?" remove_allowed_group: "Vuoi veramente rimuovere {{name}} da questo messaggio?" @@ -1026,6 +1053,7 @@ it: complete_username: "Se un account corrisponde al nome utente %{username} , a breve dovresti ricevere un'email con un link di accesso." complete_email: "Se un account corrisponde a %{email}, a breve dovresti ricevere un'email con un link di accesso. " complete_username_found: "Abbiamo trovato un account che corrisponde al nome utente %{username}, dovresti ricevere un'email con un link di accesso a breve." + complete_email_found: "Abbiamo trovato un account che corrisponde a %{email}. A breve dovresti ricevere una email con un link di login." complete_username_not_found: "Nessun account con nome utente %{username}" complete_email_not_found: "Nessun account con email %{email}" login: @@ -1034,9 +1062,14 @@ it: password: "Password" second_factor_title: "Autenticazione a due fattori" second_factor_description: "Per favore, inserisci il codice di autenticazione della tua app:" + second_factor_backup: "Connessione tramite codice di backup" + second_factor_backup_title: "Backup Due Fattori" + second_factor_backup_description: "Per favore, inserisci uno dei tuoi codici di backup:" + second_factor: "Connessione tramite l'app Authenticator" email_placeholder: "email o nome utente" caps_lock_warning: "Il Blocco Maiuscole è attivo" error: "Errore sconosciuto" + cookies_error: "Sembra che il tuo browser abbia i cookie disabilitati. Potresti non riuscire a connetterti senza abilitarli." rate_limit: "Per favore attendi prima di provare nuovamente la connessione." blank_username: "Per favore, inserisci la tua email o il tuo nome utente." blank_username_or_password: "Per favore inserisci la tua email o il tuo nome utente, e la password." @@ -1061,25 +1094,28 @@ it: preferences: "Devi essere connesso per cambiare le tue impostazioni." forgot: "Non ricordo i dettagli del mio account" not_approved: "Il tuo account non è ancora stato approvato. Verrai avvertito via email quando potrai collegarti." - google: - title: "con Google" - message: "Autenticazione tramite Google (assicurati che il blocco pop up non sia attivo)" google_oauth2: + name: "Google" title: "con Google" message: "Autenticazione tramite Google (assicurati che il blocco pop up non siano attivo)" twitter: + name: "Twitter" title: "con Twitter" message: "Autenticazione con Twitter (assicurati che il blocco pop up non sia attivo)" instagram: + name: "Instagram" title: "con Instagram" message: "Autenticazione con Instagram (assicurati che il blocco pop up non sia attivo)" facebook: + name: "Facebook" title: "con Facebook" message: "Autenticazione con Facebook (assicurati che il blocco pop up non sia attivo)" yahoo: + name: "Yahoo" title: "con Yahoo" message: "Autenticazione con Yahoo (assicurati che il blocco pop up non sia attivo)" github: + name: "GitHub" title: "con GitHub" message: "Autenticazione con GitHub (assicurati che il blocco pop up non sia attivo)" invites: @@ -1106,7 +1142,7 @@ it: category_page_style: categories_only: "Solo Categorie" categories_with_featured_topics: "Categorie con argomenti in evidenza" - categories_and_latest_topics: "Categorie e ultimi argomenti" + categories_and_latest_topics: "Categorie e argomenti recenti" categories_and_top_topics: "Categorie e argomenti più popolari" shortcut_modifier_key: shift: 'Maiusc' @@ -1118,13 +1154,13 @@ it: default_header_text: Selezione... no_content: Nessun risultato trovato filter_placeholder: Ricerca... - create: "Creato: '{{content}}'" + create: "Crea: '{{content}}'" max_content_reached: - one: Puoi selezionare solo {{count}} elemento. - other: Puoi selezionare solo {{count}} elementi. + one: "Puoi selezionare solo {{count}} elemento." + other: "Puoi selezionare solo {{count}} elementi." min_content_not_reached: - one: Seleziona almeno {{count}} elemento. - other: Seleziona almeno {{count}} elementi. + one: "Seleziona almeno {{count}} elemento." + other: "Seleziona almeno {{count}} elementi." emoji_picker: filter_placeholder: Ricerca per emoji people: Persone @@ -1167,8 +1203,8 @@ it: drafts_offline: "bozze offline" group_mentioned_limit: "Attenzione! Hai menzionato {{group}}, tuttavia questo gruppo ha più membri del limite per le menzioni configurato dagli amministratori di {{max}} utenti. Nessuna notifica verrà inviata. " group_mentioned: - one: Menzionando {{group}}, verrà notificata 1 persona – sei sicuro? - other: Menzionando {{group}}, verranno notificate {{count}} persone – sei sicuro? + one: "Menzionando {{group}}, verrà notificata 1 persona – sei sicuro?" + other: "Menzionando {{group}}, verranno notificate {{count}} persone – sei sicuro?" cannot_see_mention: category: "Hai menzionato {{username}} ma non verranno notificati perché non hanno accesso a questa categoria. Dovrai aggiungerli ad un gruppo che ha accesso a questa categoria." private: "Hai menzionato {{username}} ma non verranno notificati perché non hanno accesso a questo messaggio personale. Dovrai invitarli a questo MP." @@ -1201,6 +1237,8 @@ it: topic_featured_link_placeholder: "Inserisci il collegamento mostrato con il titolo." remove_featured_link: "Rimuovi il collegamento dall'argomento." reply_placeholder: "Scrivi qui. Per formattare il testo usa Markdown, BBCode o HTML. Trascina o incolla le immagini." + reply_placeholder_no_images: "Scrivi qui. Usa Markdown, BBcode o HTML per formattare." + reply_placeholder_choose_category: "Devi selezionare una Categoria prima di scrivere qui." view_new_post: "Visualizza il tuo nuovo messaggio." saving: "Salvataggio" saved: "Salvato!" @@ -1230,6 +1268,7 @@ it: olist_title: "Elenco Numerato" ulist_title: "Elenco Puntato" list_item: "Elemento lista" + toggle_direction: "Cambia direzione" help: "Aiuto Inserimento Markdown" collapse: "minimizza il pannello del composer" abandon: "chiudi il composer e scarta la bozza" @@ -1241,7 +1280,11 @@ it: body: "Per ora il messaggio sarà inviato solo a te stesso!" admin_options_title: "Impostazioni dello staff opzionali per l'argomento" composer_actions: + reply: Rispondi + draft: Bozza + edit: Modifica reply_to_post: + label: "Rispondi al messaggio %{postNumber} di %{postUsername}" desc: Rispondi a uno specifico messaggio reply_as_new_topic: label: Rispondi come Argomento correlato @@ -1260,11 +1303,11 @@ it: notifications: tooltip: regular: - one: 1 notifica non visualizzata - other: '{{count}} notifiche non visualizzate' + one: "1 notifica non visualizzata" + other: "{{count}} notifiche non visualizzate" message: - one: 1 messaggio non letto - other: '{{count}} messaggi non letti' + one: "1 messaggio non letto" + other: "{{count}} messaggi non letti" title: "notifiche di menzioni @nome, risposte ai tuoi messaggi e argomenti ecc." none: "Impossibile caricare le notifiche al momento." empty: "Nessuna notifica trovata." @@ -1279,8 +1322,8 @@ it: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} e {{count}} altri {{description}} - other: {{username}}, {{username2}} e {{count}} altri {{description}} + one: "{{username}}, {{username2}} e {{count}} altri {{description}}" + other: "{{username}}, {{username2}} e {{count}} altri {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1291,8 +1334,8 @@ it: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nuovo Argomento {{description}}" group_message_summary: - one: '{{count}} messaggi in arrivo nella casella {{group_name}}' - other: '{{count}} messaggi in arrivo nella casella {{group_name}}' + one: "{{count}} messaggi in arrivo nella casella {{group_name}}" + other: "{{count}} messaggi in arrivo nella casella {{group_name}}" popup: mentioned: '{{username}} ti ha menzionato in "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} ti ha menzionato in "{{topic}}" - {{site_title}}' @@ -1361,17 +1404,17 @@ it: label: Con etichetta filters: label: Mostra solamente argomenti/messaggi... - title: Corrispondenze solo nel titolo + title: cerca solo nel titolo likes: su cui ho messo "Mi Piace" posted: ho pubblicato in watching: sto osservando tracking: sto seguendo - private: Nei miei messaggi privati + private: nei miei messaggi privati bookmarks: Aggiunti ai segnalibri first: sono il primissimo post pinned: sono appuntati unpinned: non sono appuntati - seen: Che ho letto + seen: messaggi che ho letto unseen: non ho letto wiki: sono wiki images: che includono immagini @@ -1400,26 +1443,26 @@ it: bulk: select_all: "Seleziona Tutti" clear_all: "Deseleziona Tutto" - unlist_topics: "Deselezione Topics" + unlist_topics: "Rendi invisibili" relist_topics: "Ripubblica Argomenti" - reset_read: "Reimposta Lettura" - delete: "Elimina Argomenti" - dismiss: "Chiudi" - dismiss_read: "Chiudi tutti i non letti" - dismiss_button: "Chiudi..." - dismiss_tooltip: "Chiudi solo gli ultimi messaggi o smetti di seguire gli argomenti" + reset_read: "Reimposta stato lettura" + delete: "Elimina argomenti" + dismiss: "Nascondi" + dismiss_read: "Marca tutti come già letti" + dismiss_button: "Nascondi..." + dismiss_tooltip: "Nascondi solo i Nuovi messaggi o smetti di seguire gli Argomenti" also_dismiss_topics: "Smetti di seguire questi argomenti così che non compariranno più come non letti per me" - dismiss_new: "Chiudi Nuovo" + dismiss_new: "Nascondi i Nuovi" toggle: "commuta la selezione multipla degli argomenti" actions: "Azioni Multiple" - change_category: "Impostare Categoria" - close_topics: "Chiudi Argomenti" - archive_topics: "Archivia Argomenti" + change_category: "Imposta categoria" + close_topics: "Chiudi argomenti" + archive_topics: "Archivia argomenti" notification_level: "Notifiche" choose_new_category: "Scegli la nuova categoria per gli argomenti:" selected: - one: Hai selezionato 1 argomento. - other: Hai selezionato {{count}} argomenti. + one: "Hai selezionato 1 argomento." + other: "Hai selezionato {{count}} argomenti." change_tags: "Sostituire Etichette" append_tags: "Aggiungi Etichette" choose_new_tags: "Scegli nuove etichette per i seguenti argomenti:" @@ -1452,8 +1495,8 @@ it: search: "Non ci sono altri risultati di ricerca." topic: filter_to: - one: 1 messaggio in questo argomento - other: '{{count}} messaggi in questo argomento' + one: "1 messaggio in questo argomento" + other: "{{count}} messaggi in questo argomento" create: 'Nuovo Argomento' create_long: 'Crea un nuovo Argomento' open_draft: "Apri Bozza" @@ -1471,10 +1514,10 @@ it: new: 'nuovo argomento' unread: 'non letto' new_topics: - one: 1 nuovo argomento + one: '1 nuovo argomento' other: '{{count}} nuovi argomenti' unread_topics: - one: 1 argomento non letto + one: '1 argomento non letto' other: '{{count}} argomenti non letti' title: 'Argomento' invalid_access: @@ -1488,17 +1531,17 @@ it: title: "Argomento non trovato" description: "Spiacenti, non abbiamo trovato l'argomento. Forse è stato rimosso da un moderatore?" total_unread_posts: - one: c'è un post non letto in questa discussione - other: hai {{count}} messagi non letti in questo argomento + one: "c'è un post non letto in questa discussione" + other: "hai {{count}} messagi non letti in questo argomento" unread_posts: - one: Hai 1 vecchio messaggio non letto in questo argomento - other: hai {{count}} vecchi messaggi non letti in questo argomento + one: "Hai 1 vecchio messaggio non letto in questo argomento" + other: "hai {{count}} vecchi messaggi non letti in questo argomento" new_posts: - one: c'è 1 nuovo messaggio in questo argomento dalla tua ultima lettura - other: ci sono {{count}} nuovi messaggi in questo argomento dalla tua ultima lettura + one: "c'è 1 nuovo messaggio in questo argomento dalla tua ultima lettura" + other: "ci sono {{count}} nuovi messaggi in questo argomento dalla tua ultima lettura" likes: - one: c'è 1 "Mi piace" in questo argomento - other: ci sono {{count}} "Mi piace" in questo argomento + one: "c'è 1 \"Mi piace\" in questo argomento" + other: "ci sono {{count}} \"Mi piace\" in questo argomento" back_to_list: "Torna alla Lista Argomenti" options: "Opzioni Argomento" show_links: "mostra i collegamenti in questo argomento" @@ -1511,7 +1554,7 @@ it: suggest_create_topic: "Perché non crei un argomento?" jump_reply_up: passa a una risposta precedente jump_reply_down: passa a una risposta successiva - deleted: "L'argomento è stato cancellato" + deleted: "L'argomento è stato eliminato" topic_status_update: title: "Timer Argomento" save: "Imposta Timer" @@ -1562,8 +1605,8 @@ it: auto_reminder: "Questo argomento ti verrà ricordato %{timeLeft}." auto_close_title: 'Impostazioni di auto-chiusura' auto_close_immediate: - one: L'ultimo messaggio nell'argomento ha già 1 ora, per cui l'argomento verrà chiuso immediatamente. - other: L'ultimo messaggio nell'argomento ha già %{count} ore, per cui l'argomento verrà chiuso immediatamente. + one: "L'ultimo messaggio nell'argomento ha già 1 ora, per cui l'argomento verrà chiuso immediatamente." + other: "L'ultimo messaggio nell'argomento ha già %{count} ore, per cui l'argomento verrà chiuso immediatamente." timeline: back: "Indietro" back_description: "Torna indietro al tuo ultimo messaggio non letto" @@ -1622,7 +1665,7 @@ it: description: "Non ti verrà notificato nulla per questo messaggio." muted: title: "Silenziato" - description: "Non riceverai mai notifiche o altro circa questo argomento e non apparirà nella sezione Ultimi." + description: "Non riceverai mai notifiche o altro circa questo argomento e non apparirà nella sezione Recenti." actions: recover: "Ripristina Argomento" delete: "Cancella Argomento" @@ -1671,8 +1714,8 @@ it: pin_validation: "È richiesta una data per appuntare questo argomento." not_pinned: "Non ci sono argomenti appuntati in {{categoryLink}}." already_pinned: - one: 'Argomenti attualmente appuntati in {{categoryLink}}: 1' - other: 'Argomenti attualmente appuntati in {{categoryLink}}: {{count}}' + one: "Argomenti attualmente appuntati in {{categoryLink}}: 1" + other: "Argomenti attualmente appuntati in {{categoryLink}}: {{count}}" pin_globally: "Poni questo argomento in cima a tutte le liste di argomenti fino a" confirm_pin_globally: "Hai già {{count}} argomenti puntati globalmente. Troppi argomenti puntati potrebbero essere un peso per gli utenti nuovi o anonimi. Sicuro di voler puntare un altro argomento globalmente?" unpin_globally: "Togli questo argomento dalla cima degli altri argomenti." @@ -1680,11 +1723,11 @@ it: global_pin_note: "Gli utenti possono spuntare gli argomenti autonomamente per loro stessi." not_pinned_globally: "Non ci sono argomenti appuntati globalmente." already_pinned_globally: - one: 'Argomenti attualmente appuntati globalmente in {{categoryLink}}: 1' - other: 'Argomenti attualmente appuntati globalmente {{categoryLink}}: {{count}}' + one: "Argomenti attualmente appuntati globalmente in {{categoryLink}}: 1" + other: "Argomenti attualmente appuntati globalmente {{categoryLink}}: {{count}}" make_banner: "Rendi questo argomento uno striscione che apparirà in cima a tutte le pagine." remove_banner: "Rimuovi lo striscione che appare in cima a tutte le pagine." - banner_note: "Gli utenti possono rimuovere lo striscione chiudendolo. Solo un argomento alla volta può diventare uno striscione." + banner_note: "Gli utenti possono rimuovere lo striscione nascondendolo. Solo un argomento per volta può diventare un Annuncio." no_banner_exists: "Non c'è alcun argomento annuncio." banner_exists: "C'è attualmente un argomento annuncio." inviting: "Sto invitando..." @@ -1718,8 +1761,8 @@ it: login_reply: 'Connettiti per Rispondere' filters: n_posts: - one: 1 post - other: '{{count}} messaggi' + one: "1 post" + other: "{{count}} messaggi" cancel: "Rimuovi filtro" split_topic: title: "Sposta in un nuovo argomento" @@ -1727,15 +1770,15 @@ it: topic_name: "Nome Nuovo Argomento" error: "Si è verificato un errore spostando il messaggio nel nuovo argomento." instructions: - one: Stai per creare un nuovo argomento riempiendolo con il messaggio che hai selezionato. - other: Stai per creare un nuovo argomento riempiendolo con i {{count}} messaggi che hai selezionato. + one: "Stai per creare un nuovo argomento riempiendolo con il messaggio che hai selezionato." + other: "Stai per creare un nuovo argomento riempiendolo con i {{count}} messaggi che hai selezionato." merge_topic: title: "Sposta in Argomento Esistente" action: "sposta in un argomento esistente" error: "Si è verificato un errore nello spostare i messaggi nell'argomento." instructions: - one: Per favore scegli l'argomento dove spostare il messaggio. - other: Per favore scegli l'argomento di destinazione dove spostare i {{count}} messaggi. + one: "Per favore scegli l'argomento dove spostare il messaggio." + other: "Per favore scegli l'argomento di destinazione dove spostare i {{count}} messaggi." merge_posts: title: "Unisci Messaggi Selezionati" action: "unisci messaggi selezionati" @@ -1747,8 +1790,8 @@ it: label: "Nuovo Proprietario dei Messaggi" placeholder: "nome utente del nuovo proprietario" instructions: - one: Seleziona il nuovo proprietario del messaggio di {{old_user}}. - other: Seleziona il nuovo proprietario dei {{count}} messaggi di {{old_user}}. + one: "Seleziona il nuovo proprietario del messaggio di {{old_user}}." + other: "Seleziona il nuovo proprietario dei {{count}} messaggi di {{old_user}}." change_timestamp: title: "Cambia Marca Temporale..." action: "cambia marca temporale" @@ -1776,9 +1819,10 @@ it: deselect_all: deseleziona tutto description: one: Hai selezionato 1 messaggio. - other: Hai selezionato {{count}} messaggi. + other: "Hai selezionato {{count}} messaggi." post: quote_reply: "Cita" + edit: " {{link}} {{replyAvatar}} {{username}}" edit_reason: "Motivo:" post_number: "messaggio {{number}}" wiki_last_edited_on: "ultima modifica alla wiki" @@ -1790,28 +1834,28 @@ it: show_full: "Mostra Messaggio Completo" show_hidden: 'Visualizza contenuto nascosto.' deleted_by_author: - one: (post eliminato dall'autore, sarà automaticamente cancellato in %{count} ore se non contrassegnato) - other: (messaggio eliminato dall'autore, verrà automaticamente cancellato in %{count} ore se non segnalato) + one: "(post eliminato dall'autore, sarà automaticamente cancellato in %{count} ore se non contrassegnato)" + other: "(messaggio eliminato dall'autore, verrà automaticamente cancellato in %{count} ore se non segnalato)" collapse: "collassa" expand_collapse: "espandi/raggruppa" locked: "un membro dello Staff ha bloccato le modifiche a questo messaggio" gap: - one: visualizza 1 risposta nascosta - other: visualizza {{count}} riposte nascoste + one: "visualizza 1 risposta nascosta" + other: "visualizza {{count}} riposte nascoste" unread: "Messaggio non letto" has_replies: - one: '{{count}} Risposta' - other: '{{count}} Risposte' + one: "{{count}} Risposta" + other: "{{count}} Risposte" has_likes: - one: '{{count}} "Mi piace"' - other: '{{count}} "Mi piace"' + one: "{{count}} \"Mi piace\"" + other: "{{count}} \"Mi piace\"" has_likes_title: - one: Una persona ha messo "Mi piace" a questo messaggio - other: '{{count}} persone hanno messo "Mi piace" a questo messaggio' + one: "Una persona ha messo \"Mi piace\" a questo messaggio" + other: "{{count}} persone hanno messo \"Mi piace\" a questo messaggio" has_likes_title_only_you: "hai messo \"Mi piace\" a questo messaggio" has_likes_title_you: - one: tu e un'altra persona avete messo "Mi piace" a questo messaggio - other: tu e altre {{count}} persone avete messo "Mi piace" a questo messaggio + one: "tu e un'altra persona avete messo \"Mi piace\" a questo messaggio" + other: "tu e altre {{count}} persone avete messo \"Mi piace\" a questo messaggio" errors: create: "Spiacenti, si è verificato un errore nel creare il tuo messaggio. Prova di nuovo." edit: "Spiacenti, si è verificato un errore nel modificare il tuo messaggio. Prova di nuovo." @@ -1850,6 +1894,12 @@ it: more: "Di più" delete_replies: confirm: "Vuoi eliminare anche le risposte a questo messaggio?" + direct_replies: + one: "Sì, e 1 risposta diretta" + other: "Sì, e le {{count}} risposte dirette" + all_replies: + one: "Sì, e 1 risposta." + other: "Sì, e tutte le {{count}} risposte" just_the_post: "No, solo questo messaggio" admin: "azioni post-amministrazione" wiki: "Rendi Wiki" @@ -1864,18 +1914,18 @@ it: lock_post_description: "impedisci all'autore di modificare questo messaggio" unlock_post: "Sblocca messaggio" unlock_post_description: "consenti all'autore di modificare questo messaggio" + delete_topic_disallowed: "non hai il permesso di eliminare questo argomento" actions: flag: 'Segnala' defer_flags: - one: Ignore flag - other: Ignora le segnalazioni + one: "Ignore flag" + other: "Ignora le segnalazioni" undo: off_topic: "Rimuovi segnalazione" spam: "Rimuovi segnalazione" inappropriate: "Rimuovi segnalazione" bookmark: "Annulla segnalibro" like: "Annulla il \"Mi piace\"" - vote: "Rimuovi voto" people: off_topic: "l'hanno segnalato come fuori tema" spam: "l'hanno segnalato come spam" @@ -1885,9 +1935,8 @@ it: bookmark: "l'hanno aggiunto ai segnalibri" like: "hanno messo \"Mi piace\"" like_capped: - one: e a {{count}} persona è piaciuto - other: e ad altre {{count}} persone è piaciuto - vote: "hanno votato" + one: "e a {{count}} persona è piaciuto" + other: "e ad altre {{count}} persone è piaciuto" by_you: off_topic: "L'hai segnalato come fuori tema" spam: "L'hai segnalato come spam" @@ -1896,61 +1945,58 @@ it: notify_user: "Hai inviato un messaggio a questo utente" bookmark: "Hai inserito questo messaggio nei segnalibri" like: "Ti piace" - vote: "Hai votato per questo messaggio" by_you_and_others: off_topic: - one: Tu e un'altra persona lo avete contrassegnato come fuori tema - other: Tu e {{count}} altre persone lo avete contrassegnato come fuori tema + one: "Tu e un'altra persona lo avete contrassegnato come fuori tema" + other: "Tu e {{count}} altre persone lo avete contrassegnato come fuori tema" spam: - one: Tu e un'altra persona lo avete contrassegnato come spam - other: Tu e {{count}} altre persona lo avete contrassegnato come spam + one: "Tu e un'altra persona lo avete contrassegnato come spam" + other: "Tu e {{count}} altre persona lo avete contrassegnato come spam" inappropriate: - one: Tu e un'altra persona lo avete contrassegnato come non appropriato - other: Tu e {{count}} altre persone lo avete contrassegnato come non appropriato + one: "Tu e un'altra persona lo avete contrassegnato come non appropriato" + other: "Tu e {{count}} altre persone lo avete contrassegnato come non appropriato" notify_moderators: - one: Tu e un'altra persona lo avete contrassegnato per la moderazione - other: Tu e {{count}} altre persone lo avete contrassegnato per la moderazione + one: "Tu e un'altra persona lo avete contrassegnato per la moderazione" + other: "Tu e {{count}} altre persone lo avete contrassegnato per la moderazione" notify_user: - one: Tu e un'altra persona avete inviato un messaggio a questo utente - other: Tu e {{count}} altre persone avete inviato un messaggio a questo utente + one: "Tu e un'altra persona avete inviato un messaggio a questo utente" + other: "Tu e {{count}} altre persone avete inviato un messaggio a questo utente" bookmark: - one: Tu e un'altra persona avete inserito questo messaggio nei segnalibri - other: Tu e {{count}} altre persone avete inserito questo messaggio nei segnalibri + one: "Tu e un'altra persona avete inserito questo messaggio nei segnalibri" + other: "Tu e {{count}} altre persone avete inserito questo messaggio nei segnalibri" like: - one: A te e a un'altra persona è piaciuto - other: A te e a {{count}} altre persone è piaciuto - vote: - one: Tu e un'altra persona avete votato per questo messaggio - other: Tu e {{count}} altre persone avete votato per questo messaggio + one: "A te e a un'altra persona è piaciuto" + other: "A te e a {{count}} altre persone è piaciuto" by_others: off_topic: - one: Una persona lo ha contrassegnato come fuori tema - other: '{{count}} persone lo hanno contrassegnato come fuori tema' + one: "Una persona lo ha contrassegnato come fuori tema" + other: "{{count}} persone lo hanno contrassegnato come fuori tema" spam: - one: Una persona lo ha contrassegnato come spam - other: '{{count}} persone lo hanno contrassegnato come spam' + one: "Una persona lo ha contrassegnato come spam" + other: "{{count}} persone lo hanno contrassegnato come spam" inappropriate: - one: Una persona lo ha contrassegnato come non appropriato - other: '{{count}} persone lo hanno contrassegnato come non appropriato' + one: "Una persona lo ha contrassegnato come non appropriato" + other: "{{count}} persone lo hanno contrassegnato come non appropriato" notify_moderators: - one: Una persona lo ha contrassegnato per la moderazione - other: '{{count}} persone lo hanno contrassegnato per la moderazione' + one: "Una persona lo ha contrassegnato per la moderazione" + other: "{{count}} persone lo hanno contrassegnato per la moderazione" notify_user: - one: Una persona ha inviato un messaggio a questo utente - other: '{{count}} persone hanno inviato un messaggio a questo utente' + one: "Una persona ha inviato un messaggio a questo utente" + other: "{{count}} persone hanno inviato un messaggio a questo utente" bookmark: - one: Una persona ha inserito un segnalibro a questo post - other: '{{count}} persone hanno inserito un segnalibro a questo post' + one: "Una persona ha inserito un segnalibro a questo post" + other: "{{count}} persone hanno inserito un segnalibro a questo post" like: - one: A una persona è piaciuto - other: A {{count}} persone è piaciuto - vote: - one: Una persona ha votato per questo post - other: '{{count}} persone hanno votato per questo post' + one: "A una persona è piaciuto" + other: "A {{count}} persone è piaciuto" + delete: + confirm: + one: "Vuoi davvero eliminare quel messaggio?" + other: "Vuoi davvero eliminare questi {{count}} messaggi?" merge: confirm: - one: Sicuro di voler unire questi messaggi? - other: Sicuro di voler unire questi {{count}} messaggi? + one: "Sicuro di voler unire questi messaggi?" + other: "Sicuro di voler unire questi {{count}} messaggi?" revisions: controls: first: "Prima revisione" @@ -1988,7 +2034,7 @@ it: can: 'può…' none: '(nessuna categoria)' all: 'Tutte le categorie' - choose: 'Seleziona una categoria…' + choose: 'categoria…' edit: 'modifica' edit_long: "Modifica" view: 'Visualizza Argomenti della Categoria' @@ -2032,10 +2078,11 @@ it: email_in_allow_strangers: "Accetta email da utenti anonimi senza alcun account" email_in_disabled: "Le Impostazioni Sito non permettono di creare nuovi argomenti via email. Per abilitare la creazione di argomenti via email," email_in_disabled_click: 'abilita l''impostazione "email entrante".' + mailinglist_mirror: "La categoria si comporta come una mailing list" + suppress_from_latest: "Nascondi la categoria dagli Argomenti Recenti." show_subcategory_list: "Mostra la lista delle sottocategorie sopra agli argomenti in questa categoria." num_featured_topics: "Numero degli argomenti mostrati nella pagina categorie:" subcategory_num_featured_topics: "Numero degli argomenti in evidenza nella pagina della categoria superiore" - all_topics_wiki: "Rendi i nuovi argomenti wiki di default." subcategory_list_style: "Stile Lista Sottocategorie:" sort_order: "Lista Argomenti Ordinata Per:" default_view: "Lista Argomenti Predefinita:" @@ -2043,12 +2090,16 @@ it: allow_badges_label: "Permetti l'assegnazione di distintivi in questa categoria" edit_permissions: "Modifica Permessi" add_permission: "Aggiungi Permesso" + require_topic_approval: "Richiedi l'approvazione di un moderatore per tutti i nuovi argomenti" + require_reply_approval: "Richiedi l'approvazione di un moderatore per tutti i nuovi argomenti" this_year: "quest'anno" - position: "posizione" + position: "Posizione:" default_position: "Posizione di default" position_disabled: "Le categorie verranno mostrate in ordine d'attività. Per modificare l'ordinamento delle categorie nelle liste," position_disabled_click: 'attiva l''impostazione "posizione fissa delle categorie".' + minimum_required_tags: 'Numero minimo di Etichette per Argomento:' parent: "Categoria Superiore" + navigate_to_first_post_after_read: 'Vai al primo messaggio dopo che gli argomenti vengono letti' notifications: watching: title: "In osservazione" @@ -2105,14 +2156,14 @@ it: custom_placeholder_notify_moderators: "Facci sapere esattamente cosa ti preoccupa, fornendo collegamenti pertinenti ed esempi ove possibile." custom_message: at_least: - one: inserisci almeno 1 carattere - other: inserisci almeno {{n}} caratteri + one: "inserisci almeno 1 carattere" + other: "inserisci almeno {{n}} caratteri" more: - one: 1 mancante... - other: '{{count}} mancanti...' + one: "1 mancante..." + other: "{{count}} mancanti..." left: - one: 1 mancante - other: '{{count}} mancanti...' + one: "1 mancante" + other: "{{count}} mancanti..." flagging_topic: title: "Grazie per aiutarci a mantenere la nostra comunità civile!" action: "Segnala Argomento" @@ -2123,13 +2174,13 @@ it: links_title: "Collegamenti Di Successo" links_shown: "mostra altri collegamenti..." clicks: - one: 1 click - other: '%{count} click' + one: "1 click" + other: "%{count} click" post_links: about: "espandi altri collegamenti per questo messaggio" title: - one: un altro - other: altri %{count} + one: "un altro" + other: "altri %{count}" topic_statuses: warning: help: "Questo è un avvertimento ufficiale." @@ -2146,7 +2197,7 @@ it: help: "Questo argomento è per te spuntato; verrà mostrato con l'ordinamento di default" pinned_globally: title: "Appuntato Globalmente" - help: "Questo argomento è appuntato globalmente; verrà mostrato in cima all'elenco Ultimi e nella sua categoria." + help: "Questo argomento è appuntato globalmente; verrà mostrato in cima all'elenco Recenti e nella sua categoria." pinned: title: "Appuntato" help: "Questo argomento è per te appuntato; verrà mostrato con l'ordinamento di default" @@ -2159,22 +2210,22 @@ it: original_post: "Messaggio Originale" views: "Visite" views_lowercase: - one: visita - other: visite + one: "visita" + other: "visite" replies: "Risposte" views_long: - one: questo argomento è stato visto una volta - other: questo argomento è stato visto {{number}} volte + one: "questo argomento è stato visto una volta" + other: "questo argomento è stato visto {{number}} volte" activity: "Attività" likes: "Mi piace" likes_lowercase: - one: mi piace - other: mi piace + one: "mi piace" + other: "mi piace" likes_long: "ci sono {{number}} \"Mi piace\" in questo argomento" users: "Utenti" users_lowercase: - one: utente - other: utenti + one: "utente" + other: "utenti" category_title: "Categoria" history: "Storia" changed_by: "da {{author}}" @@ -2186,10 +2237,10 @@ it: with_topics: "%{filter} argomenti" with_category: "%{filter} %{category} argomenti" latest: - title: "Ultimi" + title: "Recenti" title_with_count: - one: Ultimo (1) - other: Ultimi ({{count}}) + one: "Ultimo (1)" + other: "Recenti ({{count}})" help: "argomenti con messaggi recenti" hot: title: "Caldo" @@ -2207,21 +2258,21 @@ it: unread: title: "Non letti" title_with_count: - one: Non letto (1) - other: Non letti ({{count}}) + one: "Non letto (1)" + other: "Non letti ({{count}})" help: "argomenti che stai osservando o seguendo contenenti messaggi non letti" lower_title_with_count: - one: 1 non letto - other: '{{count}} non letti' + one: "1 non letto" + other: "{{count}} non letti" new: lower_title_with_count: - one: 1 nuovo - other: '{{count}} nuovi' + one: "1 nuovo" + other: "{{count}} nuovi" lower_title: "nuovo" title: "Nuovi" title_with_count: - one: Nuovo (1) - other: Nuovi ({{count}}) + one: "Nuovo (1)" + other: "Nuovi ({{count}})" help: "argomenti creati negli ultimi giorni" posted: title: "I miei Messaggi" @@ -2232,9 +2283,9 @@ it: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' - help: "ultimi argomenti nella categoria {{categoryName}}" + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" + help: "argomenti recenti nella categoria {{categoryName}}" top: title: "Popolari" help: "gli argomenti più attivi nell'ultimo anno, mese, settimana o giorno" @@ -2269,7 +2320,7 @@ it: jump_to: title: 'Salta A' home: 'g, h Home' - latest: 'g, l Ultimi' + latest: 'g, l Recenti' new: 'g, n Nuovi' unread: 'g, u Non letti' categories: 'g, c Categorie' @@ -2293,8 +2344,8 @@ it: show_incoming_updated_topics: '. Mostra argomenti aggiornati' search: '/ o ctrl+alt+f Cerca' help: '? Apri la legenda tasti' - dismiss_new_posts: 'x, r Chiudi Nuovi Messaggi' - dismiss_topics: 'x, t Chiudi Argomenti' + dismiss_new_posts: 'x, r Marca i Nuovi messaggi come letti' + dismiss_topics: 'x, t Marca gli Argomenti come letti' log_out: 'shift+z shift+z Disconnetti' composing: title: 'Scrivendo' @@ -2320,22 +2371,22 @@ it: print: 'ctrl+p Stampa argomento' badges: earned_n_times: - one: Guadagnato questo distintivo 1 volta - other: Guadagnato questo distintivo %{count} volte + one: "Guadagnato questo distintivo 1 volta" + other: "Guadagnato questo distintivo %{count} volte" granted_on: "Assegnata %{date}" others_count: "Altri utenti con questo distintivo (%{count})" title: Distintivi allow_title: "Puoi usare questo distintivo come qualifica" multiple_grant: "Puoi guadagnarlo più volte" badge_count: - one: 1 Distintivo - other: '%{count} Distintivi' + one: "1 Distintivo" + other: "%{count} Distintivi" more_badges: - one: +1 altro - other: + altri %{count} + one: "+1 altro" + other: "+ altri %{count}" granted: - one: 1 assegnato - other: '%{count} assegnati' + one: "1 assegnato" + other: "%{count} assegnati" select_badge_for_title: Seleziona un distintivo da usare come tuo titolo none: "(nessuno)" badge_grouping: @@ -2368,8 +2419,8 @@ it: choose_for_topic: "tag facoltativi" delete_tag: "Cancella Etichetta" delete_confirm: - one: Sei sicuro di voler eliminare questa etichetta e rimuoverla da 1 argomento a cui è assegnata? - other: Sei sicuro di voler eliminare questa etichetta e rimuoverla da {{count}} argomenti a cui è assegnata? + one: "Sei sicuro di voler eliminare questa etichetta e rimuoverla da 1 argomento a cui è assegnata?" + other: "Sei sicuro di voler eliminare questa etichetta e rimuoverla da {{count}} argomenti a cui è assegnata?" delete_confirm_no_topics: "Sei sicuro di voler eliminare questa etichetta?" rename_tag: "Rinomina Etichetta" rename_instructions: "Scegli un altro nome per l'etichetta:" @@ -2445,10 +2496,13 @@ it: admin: title: 'Amministratore Discourse' moderator: 'Moderatore' + reports: + title: "Lista dei rapporti disponibili" dashboard: title: "Cruscotto" last_updated: "Ultimo aggiornamento cruscotto:" find_old: "Stai cercando il vecchio cruscotto?" + old_link: "Lo trovi qui" version: "Versione" up_to_date: "Sei aggiornato!" critical_available: "È disponibile un aggiornamento essenziale." @@ -2473,12 +2527,21 @@ it: space_free: "{{size}} liberi" uploads: "caricamenti" backups: "backup" + lastest_backup: "Recenti: %{date}" traffic_short: "Traffico" traffic: "Richieste web dell'applicazione" page_views: "Pagine Viste" page_views_short: "Pagine Viste" show_traffic_report: "Mostra rapporto di traffico dettagliato" - activity_metrics: Metrica Attività + community_health: Stato di salute + moderators_activity: Attività dei Moderatori + whats_new_in_discourse: "Novità in Discourse?" + activity_metrics: Metriche Attività + all_reports: "Tutti i rapporti" + general_tab: "Generale" + moderation_tab: "Moderazione" + disabled: Disabilitato + timeout_error: "Spiacenti, la ricerca sta impiegando troppo tempo, per favore scegli un intervallo più breve" reports: today: "Oggi" yesterday: "Ieri" @@ -2495,6 +2558,10 @@ it: end_date: "Data Fine" groups: "Tutti i gruppi" disabled: "Il rapporto è disabilitato" + no_data: "Non ci sono dati da mostrare." + trending_search: + more: 'Cerca nei log' + disabled: 'Il rapporto sulle ricerche di tendenza è disabilitato. Attiva l''opzionelog search queriesper iniziare a raccogliere i dati.' commits: latest_changes: "Ultime modifiche: per favore aggiorna spesso!" by: "da" @@ -2511,9 +2578,12 @@ it: agree_flag_restore_post: "Accetta e Ripristina il Messaggio" agree_flag_restore_post_title: "Ripristina il messaggio in modo che tutti gli utenti possano vederlo." agree_flag_suspend: "Sospendi Utente" + agree_flag_suspend_title: "Accetta la segnalazione e sospendi l'utente." agree_flag_silence: "Silenzia Utente" + agree_flag_silence_title: "Accetta la segnalazione e silenzia l'utente." agree_flag_title: "Accetta la segnalazione e mantieni invariato il messaggio." ignore_flag: "Ignora" + ignore_flag_title: "Rimuovi questa segnalazione; nessuna azione per ora." delete: "Cancella" delete_title: "Cancella il messaggio a cui si riferisce la segnalazione." delete_post_defer_flag: "Elimina il Messaggio e Ignora la segnalazione" @@ -2532,6 +2602,12 @@ it: more: "(altre risposte...)" suspend_user: "Sospendi Utente" suspend_user_title: "Sospendi l'utente per questo messaggio" + replies: + one: "[1 risposta]" + other: "[%{count} risposte]" + delete_replies: + one: "Eliminare anche la risposta a questo Messaggio?" + other: "Eliminare anche le %{count} risposte a questo Messaggio?" dispositions: agreed: "accettate" disagreed: "non accettate" @@ -2555,6 +2631,7 @@ it: type: "Tipo" users: "Utenti" last_flagged: "Ultima Segnalazione" + no_results: "Non ci sono messaggi segnalati." short_names: off_topic: "fuori tema" inappropriate: "inappropriato" @@ -2565,17 +2642,36 @@ it: new: title: "Nuovo Gruppo" create: "Crea" + name: + too_short: "Il nome del Gruppo è troppo corto" + too_long: "Il nome del Gruppo è troppo lungo" + checking: "Controllo disponibilità del nome del Gruppo..." + available: "Il nome del Gruppo è disponibile." + not_available: "Il nome del Gruppo non è disponibile." + blank: "Il nome del Gruppo non può essere vuoto" bulk_add: title: "Aggiungi in blocco al Gruppo" + complete_users_not_added: "Questi utenti non sono stati aggiunti (assicurati che abbiano un account():" + paste: "Incolla un elenco di username ed email, uno per riga:" + add_members: + as_owner: "Imposta l'utente(i) come proprietario di questo gruppo" manage: interaction: email: Email + incoming_email_placeholder: "inserisci indirizzo email" visibility: Visibilità visibility_levels: + title: "Chi può vedere questo Gruppo?" public: "Chiunque" members: "Proprietari del Gruppo, membri e amministratori" + staff: "Proprietari del gruppo e staff" + owners: "Proprietari del gruppo e amministratori" membership: automatic: Automatico + trust_level: Livello Esperienza + trust_levels_title: "Livello Esperienza assegnato agli Utenti quando vengono aggiunti:" + trust_levels_none: "Nessuno" + primary_group: "Imposta automaticamente come gruppo primario" primary: "Gruppo Primario" no_primary: "(nessun gruppo primario)" title: "Gruppi" @@ -2658,11 +2754,11 @@ it: none: "Non ci sono eventi correlati." redeliver: "Riconsegna " incoming: - one: C'è un nuovo evento. - other: Ci sono {{count}} nuovi eventi. + one: "C'è un nuovo evento." + other: "Ci sono {{count}} nuovi eventi." completed_in: - one: Compleato in 1 secondo. - other: Completato in {{count}} secondi. + one: "Compleato in 1 secondo." + other: "Completato in {{count}} secondi." request: "Richiesta" response: "Risposta" redeliver_confirm: "Sicuro di voler rispedire lo stesso payload?" @@ -2726,6 +2822,7 @@ it: label: "Backup" title: "Crea un backup" confirm: "Vuoi creare un nuovo backup?" + without_uploads: "Sì (non includere i caricamenti)" download: label: "Scarica" title: "Invia una email con il collegamento per il download" @@ -2785,9 +2882,16 @@ it: revert: "Annulla Cambiamenti" revert_confirm: "Sei sicuro di voler annullare i cambiamenti?" theme: + theme: "Tema" + component: "Componente" + components: "Componenti" import_theme: "Importa Tema" customize_desc: "Personalizza:" title: "Temi" + modal_title: "Crea Tema" + create: "Crea" + create_type: "Tipo:" + create_name: "Nome:" long_title: "Modifica i colori, i CSS e il contenuto HTML del tuo sito" edit: "Modifica" edit_confirm: "Questo è un tema remoto, se modifichi il CSS o l'HTML i cambiamenti verranno cancellati la prossima volta che aggiorni il tema." @@ -2802,6 +2906,10 @@ it: color_scheme_select: "Seleziona i colori da usare nel tema" custom_sections: "Sezioni personalizzate:" theme_components: "Componenti Tema" + switch_component: "Rendi tema" + switch_component_alert: "Sicuro di voler convertire questo componente in tema? Ciò lo renderà un tema indipendente e verrà rimosso come figlio da tutti i temi. " + switch_theme: "Rendi componente" + switch_theme_alert: "Sicuro di voler convertire questo tema in componente? Verrà rimosso come genitore da tutti i componenti. " uploads: "Carica" no_uploads: "Puoi caricare le risorse associate al tuo tema come il tipo di carattere e le immagini" add_upload: "Aggiungi Caricamento" @@ -2817,16 +2925,18 @@ it: import_file_tip: "Il file .dcstyle.json contenente il tema" about_theme: "About Tema" license: "Licenza" - component_of: "Il tema è un componente di:" + component_of: "Componente di:" update_to_latest: "Aggiorna all'ultima versione" check_for_updates: "Controllo Aggiornamenti" updating: "Aggiornamento..." up_to_date: "Il tema è aggiornato, ultima verifica:" add: "Aggiungi" theme_settings: "Impostazioni Tema" + no_settings: "Questo tema non ha impostazioni." + empty: "Nessun elemento" commits_behind: - one: Il tema è indietro di 1 aggiornamento! - other: Il tema è indietro di {{count}} aggiornamenti! + one: "Il tema è indietro di 1 aggiornamento!" + other: "Il tema è indietro di {{count}} aggiornamenti!" scss: text: "CSS" title: "Inserire il CSS personalizzato, accettiamo tutti gli stili validi di CSS e SCSSpersonalizzato" @@ -2848,6 +2958,9 @@ it: body_tag: text: "" title: "HTML che deve essere inserito prima del tag " + yaml: + text: "YAML" + title: "Definisci le impostazioni del tema in formato YAML" colors: select_base: title: "Seleziona combinazione colori di base" @@ -2955,7 +3068,6 @@ it: address_placeholder: "nome@esempio.com" type_placeholder: "riepilogo, iscrizione..." reply_key_placeholder: "chiave di risposta" - skipped_reason_placeholder: "motivo" moderation_history: actions: delete_user: "Utente Eliminato" @@ -3096,8 +3208,8 @@ it: clear_filter: "Pulisci" show_words: "mostra le parole" word_count: - one: 1 word - other: '%{count} parole' + one: "1 word" + other: "%{count} parole" actions: block: 'Blocca' censor: 'Censura' @@ -3138,13 +3250,14 @@ it: suspended: 'Sospesi' silenced: 'Silenziato' suspect: 'Sospetti' + staged: 'Da approvare' approved: "Approvato?" approved_selected: - one: approva l'utente - other: approva gli utenti ({{count}}) + one: "approva l'utente" + other: "approva gli utenti ({{count}})" reject_selected: - one: rifiuta l'utente - other: rifiuta utenti ({{count}}) + one: "rifiuta l'utente" + other: "rifiuta utenti ({{count}})" titles: active: 'Utenti Attivi' new: 'Nuovi Utenti' @@ -3160,12 +3273,13 @@ it: silenced: 'Utenti Silenziati' suspended: 'Utenti Sospesi' suspect: 'Utenti Sospetti' + staged: 'Utenti da approvare' reject_successful: - one: 1 utente rifiutato. - other: '%{count} utenti rifiutati.' + one: "1 utente rifiutato." + other: "%{count} utenti rifiutati." reject_failures: - one: Impossibile rifiutare 1 utente - other: Impossibile rifiutare %{count} utenti. + one: "Impossibile rifiutare 1 utente" + other: "Impossibile rifiutare %{count} utenti." not_verified: "Non verificato" check_email: title: "Mostra l'indirizzo email di questo utente" @@ -3192,6 +3306,10 @@ it: suspended_until: "(fino %{until})" cant_suspend: "Questo utente non può essere sospeso." delete_all_posts: "Cancella tutti i messaggi" + penalty_post_delete: "Elimina il messaggio" + penalty_post_edit: "Modifica il messaggio" + penalty_post_none: "Non fare nulla" + penalty_count: "Conteggio Penalità" delete_all_posts_confirm_MF: "Stai per cancellare {POSTS, plural, one {1 messaggio} other {# messaggi}} e {TOPICS, plural, one {1 argomento} other {# argomenti}}. Sei sicuro?" silence: "Silenzio" unsilence: "Non in silenzio" @@ -3224,6 +3342,7 @@ it: private_topics_count: Argomenti Privati posts_read_count: Messaggi Letti post_count: Messaggi Creati + second_factor_enabled: Autenticazione a Due Fattori abilitata topics_entered: Argomenti Visti flags_given_count: Segnalazioni Fatte flags_received_count: Segnalazioni Ricevute @@ -3242,14 +3361,14 @@ it: delete_forbidden_because_staff: "Amministratori e moderatori non possono essere cancellati." delete_posts_forbidden_because_staff: "Impossibile cancellare tutti i messaggi degli amministratori e dei moderatori." delete_forbidden: - one: Non è possibile cancellare utenti se hanno post attivi. Elimina tutti i posti prima di cancellare un utente (post più vecchi di %{count} giorni non possono essere cancellati). - other: Non è possibile cancellare utenti se hanno messaggi. Elimina tutti i messaggi prima di cancellare un utente (i messaggi più vecchi di %{count} giorni non possono essere cancellati). + one: "Non è possibile cancellare utenti se hanno post attivi. Elimina tutti i posti prima di cancellare un utente (post più vecchi di %{count} giorni non possono essere cancellati)." + other: "Non è possibile cancellare utenti se hanno messaggi. Elimina tutti i messaggi prima di cancellare un utente (i messaggi più vecchi di %{count} giorni non possono essere cancellati)." cant_delete_all_posts: - one: Non posso cancellare tutti i post. Alcuni sono più vecchi di %{count} giorno. (L'impostazione delete_user_max_post_age.) - other: Impossibile cancellare tutti i messaggi. Alcuni sono più vecchi di %{count} giorni. (L'impostazione delete_user_max_post_age.) + one: "Non posso cancellare tutti i post. Alcuni sono più vecchi di %{count} giorno. (L'impostazione delete_user_max_post_age.)" + other: "Impossibile cancellare tutti i messaggi. Alcuni sono più vecchi di %{count} giorni. (L'impostazione delete_user_max_post_age.)" cant_delete_all_too_many_posts: - one: Non posso cancellare tutti i post perché l'utente ha più di 1 post. (delete_all_posts_max.) - other: Impossibile cancellare tutti i messaggi perché l'utente ha più di %{count} messaggi. (delete_all_posts_max.) + one: "Non posso cancellare tutti i post perché l'utente ha più di 1 post. (delete_all_posts_max.)" + other: "Impossibile cancellare tutti i messaggi perché l'utente ha più di %{count} messaggi. (delete_all_posts_max.)" delete_confirm: "Sei SICURO di voler eliminare questo utente? Non è possibile annullare!" delete_and_block: "Elimina e blocca questa email e indirizzo IP" delete_dont_block: "Elimina soltanto" @@ -3291,8 +3410,8 @@ it: tl3_requirements: title: "Requisiti per Livello Esperienza 3" table_title: - one: 'Nell''ultimo giorno:' - other: 'Negli ultimi %{count} giorni:' + one: "Nell'ultimo giorno:" + other: "Negli ultimi %{count} giorni:" value_heading: "Valore" requirement_heading: "Requisito" visits: "Visite" @@ -3366,16 +3485,29 @@ it: go_back: "Torna alla Ricerca" recommended: "Consigliamo di personalizzare il seguente testo per tue adattarlo alle necessità:" show_overriden: 'Mostra solo le opzioni sovrascritte' + settings: + show_overriden: 'Mostra solo i sovrascritti' + reset: 'reimposta' + none: 'nessuno' site_settings: title: 'Impostazioni' no_results: "Nessun risultato trovato." + more_than_30_results: "Ci sono più di 30 risultati. Per favore, raffina la tua ricerca o seleziona una Categoria." clear_filter: "Pulisci" add_url: "aggiungi URL" add_host: "aggiungi host" + uploaded_image_list: + label: "Modifica lista" + empty: "Ancora non ci sono immagini. Per favore, caricane una." + upload: + label: "Carica" + title: "Carica immagine(i)" + selectable_avatars: + title: "Lista degli Avatar da cui l'utente può scegliere" categories: all_results: 'Tutti' required: 'Obbligatorie' - basic: 'Di Base' + basic: 'Impostazioni di base' users: 'Utenti' posting: 'Pubblicazione' email: 'Email' @@ -3459,8 +3591,8 @@ it: text: "Ci sono esempi di grant mancanti. Ciò accade quando la query dei distintivi ritorna ID utenti o ID messaggi inesistenti. Successivamente ciò può causare risultati inattesi - controlla bene la tua query." no_grant_count: "Nessun distintivo da assegnare." grant_count: - one: 1 distintivo da assegnare. - other: %{count} distintivi da assegnare. + one: "1 distintivo da assegnare." + other: "%{count} distintivi da assegnare." sample: "Esempio:" grant: with: "%{username}" @@ -3525,10 +3657,11 @@ it: step: "%{current} di %{total}" upload: "Carica" uploading: "Caricamento..." + upload_error: "Spiacenti, c'è stato un errore caricando il file. Per favore, prova di nuovo." quit: "Forse Dopo" staff_count: - one: 'Your community has 1 staff (you). ' - other: La tua comunità ha %{count} membri dello staff, te incluso. + one: "Your community has 1 staff (you). " + other: "La tua comunità ha %{count} membri dello staff, te incluso." invites: add_user: "aggiungi" none_added: "Non hai invitato nessuno dello staff. Sicuro di voler proseguire?" @@ -3536,3 +3669,6 @@ it: admin: "Amministratore" moderator: "Moderatore" regular: "Utente Normale" + previews: + share_button: "Condividi" + reply_button: "Rispondi" diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 741bf325cb..ed42e9d634 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -42,49 +42,49 @@ ja: tiny: half_a_minute: "1分未満" less_than_x_seconds: - other: '%{count}秒未満' + other: "%{count}秒未満" x_seconds: - other: '%{count}ç§’' + other: "%{count}ç§’" less_than_x_minutes: - other: '%{count}分未満' + other: "%{count}分未満" x_minutes: - other: '%{count}分' + other: "%{count}分" about_x_hours: - other: '%{count}時間' + other: "%{count}時間" x_days: - other: '%{count}æ—¥' + other: "%{count}æ—¥" x_months: - other: '%{count}ヶ月' + other: "%{count}ヶ月" about_x_years: - other: '%{count}å¹´' + other: "%{count}å¹´" over_x_years: - other: '%{count}年以上' + other: "%{count}年以上" almost_x_years: - other: ç´„%{count}å¹´ + other: "ç´„%{count}å¹´" date_month: "M月Dæ—¥" date_year: "'YYå¹´M月" medium: x_minutes: - other: '%{count}分' + other: "%{count}分" x_hours: - other: '%{count}時間' + other: "%{count}時間" x_days: - other: '%{count}æ—¥' + other: "%{count}æ—¥" date_year: "'YYå¹´M月Dæ—¥" medium_with_ago: x_minutes: - other: '%{count}分å‰' + other: "%{count}分å‰" x_hours: - other: '%{count}時間å‰' + other: "%{count}時間å‰" x_days: - other: '%{count}æ—¥å‰' + other: "%{count}æ—¥å‰" later: x_days: - other: '%{count}日後' + other: "%{count}日後" x_months: - other: '%{count}ã‹æœˆå¾Œ' + other: "%{count}ã‹æœˆå¾Œ" x_years: - other: '%{count}年後' + other: "%{count}年後" previous_month: '剿œˆ' next_month: '翌月' placeholder: 日付 @@ -164,7 +164,7 @@ ja: show_help: "オプション" links: "リンク" links_lowercase: - other: リンク + other: "リンク" faq: "FAQ" guidelines: "ガイドライン" privacy_policy: "プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼" @@ -188,7 +188,7 @@ ja: max_of_count: "最大 {{count}}" alternation: "ã¾ãŸã¯" character_count: - other: '{{count}}文字' + other: "{{count}}文字" suggested_topics: title: "関連トピック" pm_title: "ä»–ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" @@ -221,11 +221,11 @@ ja: remove: "ブックマークを削除" confirm_clear: "ã“ã®ãƒˆãƒ”ックã®å…¨ã¦ã®ãƒ–ックマークを削除ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ" topic_count_latest: - other: '{{count}}ä»¶ã®æ–°è¦/更新トピックãŒã‚りã¾ã™ã€‚' + other: "{{count}}ä»¶ã®æ–°è¦/更新トピックãŒã‚りã¾ã™ã€‚" topic_count_unread: - other: '{{count}} ä»¶ã®æœªèª­ãƒˆãƒ”ックãŒã‚りã¾ã™ã€‚' + other: "{{count}} ä»¶ã®æœªèª­ãƒˆãƒ”ックãŒã‚りã¾ã™ã€‚" topic_count_new: - other: '{{count}} ä»¶ã®æ–°è¦ãƒˆãƒ”ックãŒã‚りã¾ã™ã€‚' + other: "{{count}} ä»¶ã®æ–°è¦ãƒˆãƒ”ックãŒã‚りã¾ã™ã€‚" preview: "プレビュー" cancel: "キャンセル" save: "変更をä¿å­˜" @@ -262,14 +262,14 @@ ja: cancel: "キャンセル" view_pending: "ä¿ç•™ã«ãªã£ã¦ã„る投稿を見る" has_pending_posts: - other: ã“ã®ãƒˆãƒ”ックã§{{count}}ä»¶ã®æŠ•ç¨¿ãŒæ‰¿èªå¾…ã¡ã§ã™ + other: "ã“ã®ãƒˆãƒ”ックã§{{count}}ä»¶ã®æŠ•ç¨¿ãŒæ‰¿èªå¾…ã¡ã§ã™" confirm: "変更をä¿å­˜" delete_prompt: "%{username} を削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? ã“れã¯ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æŠ•稿をã™ã¹ã¦å‰Šé™¤ã—ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨IPアドレスをブロックã—ã¾ã™ã€‚" approval: title: "ã“ã®æŠ•ç¨¿ã¯æ‰¿èªãŒå¿…è¦ã§ã™" description: "æ–°ã—ã„æŠ•ç¨¿ã¯ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã«ã‚ˆã‚‹æ‰¿èªãŒå¿…è¦ã§ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ä¸‹ã•ã„。" pending_posts: - other: {{count}}ä»¶ã®æŠ•ç¨¿ãŒä¿ç•™ä¸­ã§ã™ã€‚ + other: "{{count}}ä»¶ã®æŠ•ç¨¿ãŒä¿ç•™ä¸­ã§ã™ã€‚" ok: "OK" user_action: user_posted_topic: "{{user}} ㌠トピック を作æˆ" @@ -303,7 +303,7 @@ ja: posts_read: "既読" posts_read_long: "投稿ã®é–²è¦§æ•°" total_rows: - other: '%{count}人ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼' + other: "%{count}人ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼" group_histories: actions: change_group_setting: "グループã®è¨­å®šã‚’変更" @@ -350,7 +350,7 @@ ja: title: "グループ" empty: "表示ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã‚りã¾ã›ã‚“。" title: - other: グループ + other: "グループ" activity: "アクティビティ" topics: "トピック" posts: "投稿" @@ -422,9 +422,9 @@ ja: toggle_ordering: "カテゴリã®ä¸¦ã³æ›¿ãˆãƒ¢ãƒ¼ãƒ‰ã‚’切り替ãˆ" subcategories: "サブカテゴリ:" topic_sentence: - other: '%{count}トピック群' + other: "%{count}トピック群" topic_stat_sentence: - other: éŽåŽ» %{unit} é–“ %{count} å€‹ã®æ–°ç€ãƒˆãƒ”ック。 + other: "éŽåŽ» %{unit} é–“ %{count} å€‹ã®æ–°ç€ãƒˆãƒ”ック。" ip_lookup: title: IPアドレスを検索 hostname: ホストå @@ -579,7 +579,6 @@ ja: error: "変更中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" change_username: title: "ユーザーåを変更" - confirm: "ユーザーåを変更ã™ã‚‹ã¨ã€å…¨ã¦ã®æŠ•稿内容ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ç™ºè¨€ã«æ”¯éšœãŒå‡ºã¾ã™ã€‚本当ã«å®Ÿè¡Œã—ãŸã„ã§ã™ã‹?" taken: "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¯æ—¢ã«ä½¿ã‚れã¦ã„ã¾ã™ã€‚" invalid: "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¯ç„¡åйã§ã™ã€‚英数字ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™ã€‚" change_email: @@ -614,7 +613,7 @@ ja: authenticated: "ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ {{provider}} ã«ã‚ˆã£ã¦èªè¨¼ã•れã¦ã„ã¾ã™" frequency_immediately: "ã‚ãªãŸãŒã¾ã èª­ã‚“ã§ã„ãªã„未é€ä¿¡åˆ†ã®å†…容ã«ã¤ã„ã¦ä»Šã™ãメールをé€ã‚Šã¾ã™ã€‚" frequency: - other: 最後ã«åˆ©ç”¨ã•れã¦ã‹ã‚‰{{count}}分以上経éŽã—ãŸå ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚Šã¾ã™ã€‚ + other: "最後ã«åˆ©ç”¨ã•れã¦ã‹ã‚‰{{count}}分以上経éŽã—ãŸå ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚Šã¾ã™ã€‚" name: title: "åå‰" instructions: "æ°å(ä»»æ„)" @@ -699,7 +698,7 @@ ja: user: "招待ã—ãŸãƒ¦ãƒ¼ã‚¶" sent: "é€ä¿¡æ¸ˆã¿" truncated: - other: '{{count}} ä»¶ã®æ‹›å¾…を表示ã—ã¦ã„ã¾ã™ã€‚' + other: "{{count}} ä»¶ã®æ‹›å¾…を表示ã—ã¦ã„ã¾ã™ã€‚" redeemed: "招待を確èªã™ã‚‹" redeemed_tab: "ç¢ºèªæ¸ˆã¿" redeemed_tab_with_count: "ç¢ºèªæ¸ˆã¿ ({{count}})" @@ -746,15 +745,15 @@ ja: time_read: "èª­ã‚“ã æ™‚é–“" recent_time_read: "ç¾åœ¨ã®ãƒªãƒ¼ãƒ‰ã‚¿ã‚¤ãƒ " topic_count: - other: ã¤ã®ãƒˆãƒ”ãƒƒã‚¯ã‚’ä½œæˆ + other: "ã¤ã®ãƒˆãƒ”ックを作æˆ" post_count: - other: ã¤ã®æŠ•稿 + other: "ã¤ã®æŠ•稿" days_visited: - other: è¨ªå•æ—¥æ•° + other: "è¨ªå•æ—¥æ•°" posts_read: - other: èª­ã‚“ã æŠ•ç¨¿ + other: "èª­ã‚“ã æŠ•ç¨¿" bookmark_count: - other: ã¤ã®ãƒ–ックマーク + other: "ã¤ã®ãƒ–ックマーク" top_replies: "返信上ä½" no_replies: "ã¾ã è¿”ä¿¡ã¯ã‚りã¾ã›ã‚“。" more_replies: "ãã®ä»–ã®è¿”ä¿¡" @@ -822,7 +821,7 @@ ja: reached: "%{relativeAge} – %{rate} ã¯ã‚µã‚¤ãƒˆè¨­å®šåˆ¶é™ %{siteSettingRate} ã«åˆ°é”ã—ã¦ã„ã¾ã™ã€‚" exceeded: "%{relativeAge} – %{rate} ã¯ã‚µã‚¤ãƒˆè¨­å®šåˆ¶é™ %{siteSettingRate} ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚" rate: - other: '%{count} エラー/%{duration}' + other: "%{count} エラー/%{duration}" learn_more: "より詳ã—ã..." all_time: 'åˆè¨ˆ' all_time_desc: '作æˆã•れãŸãƒˆãƒ”ックã®ç·æ•°' @@ -1008,7 +1007,7 @@ ja: similar_topics: "ã“ã®ãƒˆãƒ”ックã«ä¼¼ã¦ã„ã‚‹ã‚‚ã®ã¯..." drafts_offline: "オフラインã®ä¸‹æ›¸ã" group_mentioned: - other: '{{group}}ã¸ã®ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã§ã€ ç´„{{count}} 人 ã¸é€šçŸ¥ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ' + other: "{{group}}ã¸ã®ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã§ã€ ç´„{{count}} 人 ã¸é€šçŸ¥ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" cannot_see_mention: category: "{{username}}ã«ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã—ã¾ã—ãŸãŒã€ã“ã®ã‚«ãƒ†ã‚´ãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒãªã„ãŸã‚通知ã•れã¾ã›ã‚“。ã“ã®ã‚«ãƒ†ã‚´ãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒã‚るグループã«ãƒ¡ãƒ³ãƒãƒ¼è¿½åŠ ã—ã¦ãã ã•ã„。" private: "{{username}}ã«ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã—ã¾ã—ãŸãŒã€ã“ã®ãƒ‘ーソナルメッセージを見るã“ã¨ãŒã§ããªã„ãŸã‚通知ã•れã¾ã›ã‚“。ã“ã®ãƒ‘ãƒ¼ã‚½ãƒŠãƒ«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ‹›å¾…ã—ã¦ãã ã•ã„。" @@ -1089,7 +1088,7 @@ ja: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - other: {{username}}, {{username2}} ã€ä»– {{count}} 人 {{description}} + other: "{{username}}, {{username2}} ã€ä»– {{count}} 人 {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1100,7 +1099,7 @@ ja: topic_reminder: "{{username}} {{description}}" watching_first_post: "æ–°ã—ã„トピック {{description}}" group_message_summary: - other: '{{group_name}} å®›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ {{count}} 通ã‚りã¾ã™' + other: "{{group_name}} å®›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ {{count}} 通ã‚りã¾ã™" popup: mentioned: '"{{topic}}"ã§{{username}} ã«ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã•れã¾ã—㟠- {{site_title}}' group_mentioned: '"{{topic}}"ã§{{username}} ã«ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã•れã¾ã—㟠- {{site_title}}' @@ -1207,7 +1206,7 @@ ja: notification_level: "通知" choose_new_category: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã®æ–°ã—ã„ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„" selected: - other: ã‚ãªãŸã¯ {{count}} ãƒˆãƒ”ãƒƒã‚¯ã‚’é¸æŠžã—ã¾ã—ãŸã€‚ + other: "ã‚ãªãŸã¯ {{count}} ãƒˆãƒ”ãƒƒã‚¯ã‚’é¸æŠžã—ã¾ã—ãŸã€‚" change_tags: "ã‚¿ã‚°ã‚’ä»˜ã‘æ›¿ãˆã‚‹" append_tags: "タグを追加ã™ã‚‹" choose_new_tags: "ã“れらã®ãƒˆãƒ”ãƒƒã‚¯ã®æ–°ã—ã„ã‚¿ã‚°ã‚’é¸æŠžã—ã¦ãã ã•ã„" @@ -1240,7 +1239,7 @@ ja: search: "æ¤œç´¢çµæžœã¯ä»¥ä¸Šã§ã™ã€‚" topic: filter_to: - other: トピック内㮠{{count}} 件を表示 + other: "トピック内㮠{{count}} 件を表示" create: 'æ–°è¦ãƒˆãƒ”ック' create_long: 'æ–°ã—ã„トピックã®ä½œæˆ' private_message: 'メッセージを書ã' @@ -1269,13 +1268,13 @@ ja: title: "トピックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" description: "申ã—訳ã‚りã¾ã›ã‚“ãŒãƒˆãƒ”ックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚モデレータã«ã‚ˆã£ã¦å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" total_unread_posts: - other: ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã«æœªèª­ã®ãƒã‚¹ãƒˆãŒ{{count}}ã¤ã‚りã¾ã™ã€‚ + other: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã«æœªèª­ã®ãƒã‚¹ãƒˆãŒ{{count}}ã¤ã‚りã¾ã™ã€‚" unread_posts: - other: ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã«æœªèª­ã®ãƒã‚¹ãƒˆãŒ{{count}}ã¤ã‚りã¾ã™ã€‚ + other: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã«æœªèª­ã®ãƒã‚¹ãƒˆãŒ{{count}}ã¤ã‚りã¾ã™ã€‚" new_posts: - other: å‰å›žé–²è¦§æ™‚よりã€ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã«æ–°ã—ã„ãƒã‚¹ãƒˆãŒ{{count}}個投稿ã•れã¦ã„ã¾ã™ + other: "å‰å›žé–²è¦§æ™‚よりã€ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã«æ–°ã—ã„ãƒã‚¹ãƒˆãŒ{{count}}個投稿ã•れã¦ã„ã¾ã™" likes: - other: ã“ã®ãƒˆãƒ”ックã«ã¯{{count}}個「ã„ã„ã­ï¼ã€ãŒã¤ã„ã¦ã„ã¾ã™ + other: "ã“ã®ãƒˆãƒ”ックã«ã¯{{count}}個「ã„ã„ã­ï¼ã€ãŒã¤ã„ã¦ã„ã¾ã™" back_to_list: "ãƒˆãƒ”ãƒƒã‚¯ãƒªã‚¹ãƒˆã«æˆ»ã‚‹" options: "トピックオプション" show_links: "ã“ã®ãƒˆãƒ”ック内ã®ãƒªãƒ³ã‚¯ã‚’表示" @@ -1330,7 +1329,7 @@ ja: auto_reminder: "ã“ã®ãƒˆãƒ”ックã«ã¤ã„ã¦ã€%{timeLeft} 後ã«ãƒªãƒžã‚¤ãƒ³ãƒ‰ã—ã¾ã™ã€‚" auto_close_title: 'オートクローズã®è¨­å®š' auto_close_immediate: - other: ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€çµ‚投稿ã‹ã‚‰ã™ã§ã«%{count}時間経éŽã—ã¦ã„ã‚‹ãŸã‚ã€ã™ãã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã™ã€‚ + other: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€çµ‚投稿ã‹ã‚‰ã™ã§ã«%{count}時間経éŽã—ã¦ã„ã‚‹ãŸã‚ã€ã™ãã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã™ã€‚" timeline: back: "戻る" back_description: "æœªèª­ã®æœ€çµ‚æŠ•ç¨¿ã¸æˆ»ã‚‹" @@ -1435,7 +1434,7 @@ ja: pin_validation: "ã“ã®ãƒˆãƒ”ックを固定表示ã™ã‚‹ãŸã‚ã«ã¯æ—¥ä»˜ã‚’指定ã—ã¦ãã ã•ã„。" not_pinned: "{{categoryLink}}ã§å›ºå®šè¡¨ç¤ºã•れã¦ã„るトピックã¯ã‚りã¾ã›ã‚“。" already_pinned: - other: '{{categoryLink}}ã§å›ºå®šè¡¨ç¤ºã•れã¦ã„るトピック: {{count}}' + other: "{{categoryLink}}ã§å›ºå®šè¡¨ç¤ºã•れã¦ã„るトピック: {{count}}" pin_globally: "ã“ã®ãƒˆãƒ”ックをã™ã¹ã¦ã®ãƒˆãƒ”ックリストã®ãƒˆãƒƒãƒ—ã«è¡¨ç¤ºã™ã‚‹" confirm_pin_globally: "å…¨ä½“ã§æ—¢ã« {{count}} トピックを固定表示ã—ã¦ã„ã¾ã™ã€‚固定表示ãŒå¤šã™ãŽã‚‹ã¨ã€æ–°è¦ã‚ã‚‹ã„ã¯åŒ¿åユーザã®è² æ‹…ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ã“ã®ã‚«ãƒ†ã‚´ãƒªã«ãŠã„ã¦ã•らã«å›ºå®šè¡¨ç¤ºè¨­å®šã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ" unpin_globally: "トピック一覧ã®ãƒˆãƒƒãƒ—ã‹ã‚‰ã“ã®ãƒˆãƒ”ックを削除ã—ã¾ã™" @@ -1443,7 +1442,7 @@ ja: global_pin_note: "ユーザã¯ãƒˆãƒ”ックを個別ã«å›ºå®šè¡¨ç¤ºè§£é™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" not_pinned_globally: "全体ã§å›ºå®šè¡¨ç¤ºã•れã¦ã„るトピックã¯ã‚りã¾ã›ã‚“。" already_pinned_globally: - other: '全体ã§å›ºå®šè¡¨ç¤ºã•れã¦ã„るトピック: {{count}}' + other: "全体ã§å›ºå®šè¡¨ç¤ºã•れã¦ã„るトピック: {{count}}" make_banner: "ã“ã®ãƒˆãƒ”ックを全ã¦ã®ãƒšãƒ¼ã‚¸ã®ãƒãƒŠãƒ¼ã«è¡¨ç¤ºã—ã¾ã™" remove_banner: "å…¨ã¦ã®ãƒšãƒ¼ã‚¸ã®ãƒãƒŠãƒ¼ã‚’削除ã—ã¾ã™" banner_note: "ユーザã¯ãƒãƒŠãƒ¼ã‚’é–‰ã˜ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚常ã«ï¼‘ã¤ã®ãƒˆãƒ”ックã ã‘ãŒãƒãƒŠãƒ¼è¡¨ç¤ºã•れã¾ã™" @@ -1480,7 +1479,7 @@ ja: login_reply: 'ログインã—ã¦è¿”ä¿¡' filters: n_posts: - other: '{{count}} ä»¶' + other: "{{count}} ä»¶" cancel: "フィルター削除" split_topic: title: "æ–°è¦ãƒˆãƒ”ックã«ç§»å‹•" @@ -1488,13 +1487,13 @@ ja: topic_name: "æ–°è¦ãƒˆãƒ”ックå:" error: "æŠ•ç¨¿ã®æ–°è¦ãƒˆãƒ”ックã¸ã®ç§»å‹•中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" instructions: - other: æ–°ãŸã«ãƒˆãƒ”ックを作æˆã—ã€é¸æŠžã—ãŸ{{count}}å€‹ã®æŠ•ç¨¿ã‚’ã“ã®ãƒˆãƒ”ックã«ç§»å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + other: "æ–°ãŸã«ãƒˆãƒ”ックを作æˆã—ã€é¸æŠžã—ãŸ{{count}}å€‹ã®æŠ•ç¨¿ã‚’ã“ã®ãƒˆãƒ”ックã«ç§»å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚" merge_topic: title: "既存トピックã«ç§»å‹•" action: "既存トピックã«ç§»å‹•" error: "指定ã•れãŸãƒˆãƒ”ックã¸ã®æŠ•稿移動中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" instructions: - other: {{count}}å€‹ã®æŠ•ç¨¿ã‚’ã©ã®ãƒˆãƒ”ックã«ç§»å‹•ã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„。 + other: "{{count}}å€‹ã®æŠ•ç¨¿ã‚’ã©ã®ãƒˆãƒ”ックã«ç§»å‹•ã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„。" merge_posts: title: "é¸æŠžã—ãŸæŠ•ç¨¿ã‚’çµ±åˆ" action: "é¸æŠžã—ãŸæŠ•ç¨¿ã‚’çµ±åˆ" @@ -1506,7 +1505,7 @@ ja: label: "æŠ•ç¨¿ã®æ–°ã—ã„オーナー" placeholder: "æ–°ã—ã„æ‰€æœ‰è€…ã®ãƒ¦ãƒ¼ã‚¶å" instructions: - other: ã“ã® {{count}} ã¤ã®æŠ•ç¨¿ã®æ–°ã—ã„ã‚ªãƒ¼ãƒŠãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。(å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š{{old_user}}) + other: "ã“ã® {{count}} ã¤ã®æŠ•ç¨¿ã®æ–°ã—ã„ã‚ªãƒ¼ãƒŠãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。(å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š{{old_user}})" change_timestamp: title: "タイムスタンプを変更ã—ã¦ãã ã•ã„。" action: "タイムスタンプを変更" @@ -1521,7 +1520,7 @@ ja: select_all: ã™ã¹ã¦é¸æŠžã™ã‚‹ deselect_all: ã™ã¹ã¦é¸æŠžã‚’外㙠description: - other: {{count}}å€‹ã®æŠ•ç¨¿ã‚’é¸æŠžä¸­ã€‚ + other: "{{count}}å€‹ã®æŠ•ç¨¿ã‚’é¸æŠžä¸­ã€‚" post: quote_reply: "引用" edit_reason: "ç†ç”±: " @@ -1535,20 +1534,20 @@ ja: show_full: "å…¨ã¦è¡¨ç¤º" show_hidden: 'éš ã•れãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã™ã‚‹' deleted_by_author: - other: (æŠ•ç¨¿ã¯æŠ•ç¨¿è€…ã«ã‚ˆã‚Šå‰Šé™¤ã•れã¾ã—ãŸã€‚何らã‹ã®é€šå ±ãŒã•れã¦ã„ãªã„é™ã‚Šã€%{count}時間後ã«è‡ªå‹•çš„ã«å‰Šé™¤ã•れã¾ã™) + other: "(æŠ•ç¨¿ã¯æŠ•ç¨¿è€…ã«ã‚ˆã‚Šå‰Šé™¤ã•れã¾ã—ãŸã€‚何らã‹ã®é€šå ±ãŒã•れã¦ã„ãªã„é™ã‚Šã€%{count}時間後ã«è‡ªå‹•çš„ã«å‰Šé™¤ã•れã¾ã™)" expand_collapse: "é–‹ã/折りãŸãŸã¿" gap: - other: '{{count}}個ã®è¿”ä¿¡ã‚’ã™ã¹ã¦è¡¨ç¤ºã™ã‚‹' + other: "{{count}}個ã®è¿”ä¿¡ã‚’ã™ã¹ã¦è¡¨ç¤ºã™ã‚‹" unread: "æœªèª­ã®æŠ•ç¨¿" has_replies: - other: '{{count}} ä»¶ã®è¿”ä¿¡' + other: "{{count}} ä»¶ã®è¿”ä¿¡" has_likes: - other: '{{count}} 個ã®ã„ã„ã­ï¼' + other: "{{count}} 個ã®ã„ã„ã­ï¼" has_likes_title: - other: '{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®è¿”ä¿¡ã«ã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸ' + other: "{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®è¿”ä¿¡ã«ã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸ" has_likes_title_only_you: "ã‚ãªãŸãŒã„ã„ã­ã—ãŸæŠ•ç¨¿" has_likes_title_you: - other: ã‚ãªãŸã¨{{count}} 人ã®äººãŒã“ã®æŠ•ç¨¿ã«ã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸã€‚ + other: "ã‚ãªãŸã¨{{count}} 人ã®äººãŒã“ã®æŠ•ç¨¿ã«ã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸã€‚" errors: create: "申ã—訳ã‚りã¾ã›ã‚“ãŒã€æŠ•稿中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。" edit: "申ã—訳ã‚りã¾ã›ã‚“ãŒã€æŠ•稿ã®ç·¨é›†ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。" @@ -1620,41 +1619,41 @@ ja: vote: "ã“ã®æŠ•ç¨¿ã«æŠ•ç¥¨ã—ã¾ã—ãŸ" by_you_and_others: off_topic: - other: ã‚ãªãŸã¨ä»–{{count}}åãŒé–¢ä¿‚ç„¡ã„話題ã¨ã—ã¦é€šå ±ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}åãŒé–¢ä¿‚ç„¡ã„話題ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" spam: - other: ã‚ãªãŸã¨ä»–{{count}}åãŒã‚¹ãƒ‘ム報告ã¨ã—ã¦é€šå ±ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}åãŒã‚¹ãƒ‘ム報告ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" inappropriate: - other: ã‚ãªãŸã¨ä»–{{count}}åãŒä¸é©åˆ‡ãªç™ºè¨€ã¨ã—ã¦é€šå ±ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}åãŒä¸é©åˆ‡ãªç™ºè¨€ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" notify_moderators: - other: ã‚ãªãŸã¨ä»–{{count}}åãŒã‚¹ã‚¿ãƒƒãƒ•ã®ç¢ºèªãŒå¿…è¦ã¨ã—ã¦é€šå ±ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}åãŒã‚¹ã‚¿ãƒƒãƒ•ã®ç¢ºèªãŒå¿…è¦ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" notify_user: - other: ã‚ãªãŸã¨ä»–{{count}}人ãŒã“ã®ãƒ¦ãƒ¼ã‚¶ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}人ãŒã“ã®ãƒ¦ãƒ¼ã‚¶ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã—ãŸ" bookmark: - other: ã‚ãªãŸã¨ä»–{{count}}人ãŒã“ã®æŠ•ç¨¿ã‚’ãƒ–ãƒƒã‚¯ãƒžãƒ¼ã‚¯ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}人ãŒã“ã®æŠ•ç¨¿ã‚’ãƒ–ãƒƒã‚¯ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸ" like: - other: ã‚ãªãŸã¨ä»–{{count}}人ãŒã€Œã„ã„ã­ï¼ã€ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}人ãŒã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸ" vote: - other: ã‚ãªãŸã¨ä»–{{count}}人ãŒã“ã®æŠ•ç¨¿ã«æŠ•ç¥¨ã—ã¾ã—㟠+ other: "ã‚ãªãŸã¨ä»–{{count}}人ãŒã“ã®æŠ•ç¨¿ã«æŠ•ç¥¨ã—ã¾ã—ãŸ" by_others: off_topic: - other: '{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒé–¢ä¿‚ç„¡ã„話題ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ' + other: "{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒé–¢ä¿‚ç„¡ã„話題ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" spam: - other: '{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¹ãƒ‘ム報告ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ' + other: "{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¹ãƒ‘ム報告ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" inappropriate: - other: '{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒä¸é©åˆ‡ãªç™ºè¨€ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ' + other: "{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒä¸é©åˆ‡ãªç™ºè¨€ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" notify_moderators: - other: '{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¹ã‚¿ãƒƒãƒ•ã®ç¢ºèªãŒå¿…è¦ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ' + other: "{{count}}åã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¹ã‚¿ãƒƒãƒ•ã®ç¢ºèªãŒå¿…è¦ã¨ã—ã¦é€šå ±ã—ã¾ã—ãŸ" notify_user: - other: '{{count}} 人ãŒã“ã®ãƒ¦ãƒ¼ã‚¶ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã—ãŸ' + other: "{{count}} 人ãŒã“ã®ãƒ¦ãƒ¼ã‚¶ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã—ãŸ" bookmark: - other: '{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®æŠ•ç¨¿ã‚’ãƒ–ãƒƒã‚¯ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸ' + other: "{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®æŠ•ç¨¿ã‚’ãƒ–ãƒƒã‚¯ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸ" like: - other: '{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸ' + other: "{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã€Œã„ã„ã­ï¼ã€ã—ã¾ã—ãŸ" vote: - other: '{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®ãƒã‚¹ãƒˆã«æŠ•票ã—ã¾ã—ãŸ' + other: "{{count}}人ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®ãƒã‚¹ãƒˆã«æŠ•票ã—ã¾ã—ãŸ" merge: confirm: - other: ã“れらã®{{count}}ã®æŠ•ç¨¿ã‚’çµ±åˆã—ãŸã„ã§ã™ã‹? + other: "ã“れらã®{{count}}ã®æŠ•ç¨¿ã‚’çµ±åˆã—ãŸã„ã§ã™ã‹?" revisions: controls: first: "最åˆã®ãƒªãƒ“ジョン" @@ -1785,11 +1784,11 @@ ja: custom_placeholder_notify_moderators: "特ã«ã©ã®ã‚ˆã†ãªå•題ãŒç™ºç”Ÿã—ã¦ã„ã‚‹ã‹è¨˜å…¥ã—ã¦ä¸‹ã•ã„。å¯èƒ½ãªã‚‰ã€é–¢é€£ã™ã‚‹ãƒªãƒ³ã‚¯ãªã©ã‚’æ•™ãˆã¦ä¸‹ã•ã„。" custom_message: at_least: - other: å°‘ãªãã¨ã‚‚{{count}}文字入力ã—ã¦ãã ã•ã„ + other: "å°‘ãªãã¨ã‚‚{{count}}文字入力ã—ã¦ãã ã•ã„" more: - other: ã‚ã¨{{count}}文字... + other: "ã‚ã¨{{count}}文字..." left: - other: 残り{{count}}文字 + other: "残り{{count}}文字" flagging_topic: title: "報告ã—ã¦ã„ãŸã ãã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚" action: "トピックを通報" @@ -1800,11 +1799,11 @@ ja: links_title: "人気ã®ãƒªãƒ³ã‚¯" links_shown: "ã•らã«ãƒªãƒ³ã‚¯ã‚’表示ã™ã‚‹" clicks: - other: '%{count} クリック' + other: "%{count} クリック" post_links: about: "ã“ã®æŠ•ç¨¿ã®ãƒªãƒ³ã‚¯ã‚’ã‚‚ã£ã¨è¦‹ã‚‹" title: - other: '%{count} リンク' + other: "%{count} リンク" topic_statuses: warning: help: "ã“れã¯é‹å–¶ã‚¹ã‚¿ãƒƒãƒ•ã‹ã‚‰ã®è­¦å‘Šã§ã™ã€‚" @@ -1838,18 +1837,18 @@ ja: original_post: "ã‚ªãƒªã‚¸ãƒŠãƒ«ã®æŠ•ç¨¿" views: "閲覧" views_lowercase: - other: ' 閲覧' + other: " 閲覧" replies: "返信" views_long: - other: ã“ã®ãƒˆãƒ”ックã¯{{number}}回閲覧ã•れã¾ã—㟠+ other: "ã“ã®ãƒˆãƒ”ックã¯{{number}}回閲覧ã•れã¾ã—ãŸ" activity: "アクティビティ" likes: "ã„ã„ã­ï¼" likes_lowercase: - other: ã„ã„ã­ï¼ + other: "ã„ã„ã­ï¼" likes_long: "ã“ã®ãƒˆãƒ”ックã«ã¯{{number}}ã¤ã€Œã„ã„ã­ï¼ã€ãŒã¤ã„ã¦ã„ã¾ã™" users: "ユーザ" users_lowercase: - other: ユーザ + other: "ユーザ" category_title: "カテゴリ" history: "History" changed_by: "by {{author}}" @@ -1863,7 +1862,7 @@ ja: latest: title: "最新" title_with_count: - other: æœ€æ–°ã®æŠ•ç¨¿ ({{count}}) + other: "æœ€æ–°ã®æŠ•ç¨¿ ({{count}})" help: "最新ã®ãƒˆãƒ”ック" hot: title: "ホット" @@ -1881,17 +1880,17 @@ ja: unread: title: "未読" title_with_count: - other: 未読 ({{count}}) + other: "未読 ({{count}})" help: "未読投稿ã®ã‚るトピック" lower_title_with_count: - other: '{{count}} 未読' + other: "{{count}} 未読" new: lower_title_with_count: - other: '{{count}}ä»¶' + other: "{{count}}ä»¶" lower_title: "NEW" title: "æ–°ç€" title_with_count: - other: 最新 ({{count}}) + other: "最新 ({{count}})" help: "最近投稿ã•れãŸãƒˆãƒ”ック" posted: title: "è‡ªåˆ†ã®æŠ•ç¨¿" @@ -1902,7 +1901,7 @@ ja: category: title: "{{categoryName}}" title_with_count: - other: '{{categoryName}} ({{count}})' + other: "{{categoryName}} ({{count}})" help: "{{categoryName}} ã‚«ãƒ†ã‚´ãƒªã®æœ€æ–°ãƒˆãƒ”ック" top: title: "トップ" @@ -1989,7 +1988,7 @@ ja: others_count: "ãã®ä»–ã®ãƒãƒƒã‚¸æ‰€æœ‰è€…(%{count})" title: ãƒãƒƒã‚¸ badge_count: - other: '%{count}個ã®ãƒãƒƒã‚¸' + other: "%{count}個ã®ãƒãƒƒã‚¸" google_search: |

Googleã§æ¤œç´¢

@@ -2501,9 +2500,9 @@ ja: suspect: 'マーク中' approved: "承èª?" approved_selected: - other: 承èªãƒ¦ãƒ¼ã‚¶ ({{count}}) + other: "承èªãƒ¦ãƒ¼ã‚¶ ({{count}})" reject_selected: - other: æ‹’å¦ãƒ¦ãƒ¼ã‚¶ ({{count}}) + other: "æ‹’å¦ãƒ¦ãƒ¼ã‚¶ ({{count}})" titles: active: 'アクティブユーザ' new: 'æ–°ã—ã„ユーザ' @@ -2519,9 +2518,9 @@ ja: suspended: 'å‡çµä¸­ã®ãƒ¦ãƒ¼ã‚¶' suspect: 'マーク中ã®ãƒ¦ãƒ¼ã‚¶' reject_successful: - other: '%{count}人ã®ãƒ¦ãƒ¼ã‚¶ã®æ‹’å¦ã«æˆåŠŸã—ã¾ã—ãŸã€‚' + other: "%{count}人ã®ãƒ¦ãƒ¼ã‚¶ã®æ‹’å¦ã«æˆåŠŸã—ã¾ã—ãŸã€‚" reject_failures: - other: '%{count}人ã®ãƒ¦ãƒ¼ã‚¶ã®æ‹’å¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚' + other: "%{count}人ã®ãƒ¦ãƒ¼ã‚¶ã®æ‹’å¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" not_verified: "検証ã•れã¦ã„ã¾ã›ã‚“" check_email: title: "メールアドレスを表示ã™ã‚‹" @@ -2589,11 +2588,11 @@ ja: delete_forbidden_because_staff: "管ç†è€…ãŠã‚ˆã³ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯å‰Šé™¤ã§ãã¾ã›ã‚“。" delete_posts_forbidden_because_staff: "管ç†è€…ã€ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã®å…¨ã¦ã®æŠ•稿ã¯å‰Šé™¤ã§ãã¾ã›ã‚“" delete_forbidden: - other: 投稿済ã®ãƒ¦ãƒ¼ã‚¶ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。ユーザを削除ã™ã‚‹å‰ã«å…¨ã¦ã®æŠ•稿を削除ã—ã¦ãã ã•ã„。(%{count}日以上経éŽã—ãŸæŠ•ç¨¿ã¯å‰Šé™¤ã§ãã¾ã›ã‚“ ) + other: "投稿済ã®ãƒ¦ãƒ¼ã‚¶ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。ユーザを削除ã™ã‚‹å‰ã«å…¨ã¦ã®æŠ•稿を削除ã—ã¦ãã ã•ã„。(%{count}日以上経éŽã—ãŸæŠ•ç¨¿ã¯å‰Šé™¤ã§ãã¾ã›ã‚“ )" cant_delete_all_posts: - other: 'å…¨ã¦ã®æŠ•稿を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚%{count}日以上経éŽã—ãŸæŠ•ç¨¿ãŒã‚りã¾ã™ã€‚(設定: delete_user_max_post_age)' + other: "å…¨ã¦ã®æŠ•稿を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚%{count}日以上経éŽã—ãŸæŠ•ç¨¿ãŒã‚りã¾ã™ã€‚(設定: delete_user_max_post_age)" cant_delete_all_too_many_posts: - other: å…¨ã¦ã®æŠ•稿を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ユーザã¯%{count} 件以上投稿ã—ã¦ã„ã¾ã™ã€‚(delete_all_posts_max) + other: "å…¨ã¦ã®æŠ•稿を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ユーザã¯%{count} 件以上投稿ã—ã¦ã„ã¾ã™ã€‚(delete_all_posts_max)" delete_confirm: "ã“ã®ãƒ¦ãƒ¼ã‚¶ã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" delete_and_block: "アカウントを削除ã—ã€åŒä¸€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹åŠã³IPアドレスã‹ã‚‰ã®ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—をブロックã—ã¾ã™" delete_dont_block: "削除ã™ã‚‹" @@ -2792,7 +2791,7 @@ ja: 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: "付与ã•れãŸãƒãƒƒã‚¸ã¯ã‚りã¾ã›ã‚“" grant_count: - other: %{count}個ã®ãƒãƒƒã‚¸ãŒä»˜ä¸Žã•れã¦ã„ã¾ã™ + other: "%{count}個ã®ãƒãƒƒã‚¸ãŒä»˜ä¸Žã•れã¦ã„ã¾ã™" sample: "サンプル:" grant: with: "%{username}" @@ -2848,7 +2847,7 @@ ja: uploading: "アップロード中..." quit: "後ã§" staff_count: - other: ã‚ãªãŸã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã«ã¯ã€ã‚ãªãŸã‚’å«ã‚㦠%{count} åã®ã‚¹ã‚¿ãƒƒãƒ•ãŒã„ã¾ã™ã€‚ + other: "ã‚ãªãŸã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã«ã¯ã€ã‚ãªãŸã‚’å«ã‚㦠%{count} åã®ã‚¹ã‚¿ãƒƒãƒ•ãŒã„ã¾ã™ã€‚" invites: add_user: "追加" none_added: "ã‚ãªãŸã¯ã‚¹ã‚¿ãƒƒãƒ•を招待ã—ã¦ã„ã¾ã›ã‚“。 続行ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 94e7cda596..420a0a3ffe 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -42,49 +42,49 @@ ko: tiny: half_a_minute: "< 1ë¶„" less_than_x_seconds: - other: < %{count}ì´ˆ + other: "< %{count}ì´ˆ" x_seconds: - other: '%{count}ì´ˆ ì „' + other: "%{count}ì´ˆ ì „" less_than_x_minutes: - other: < %{count}ë¶„ + other: "< %{count}ë¶„" x_minutes: - other: '%{count}ë¶„ ì „' + other: "%{count}ë¶„ ì „" about_x_hours: - other: '%{count}시간' + other: "%{count}시간" x_days: - other: '%{count}ì¼ ì „' + other: "%{count}ì¼ ì „" x_months: - other: '%{count}달' + other: "%{count}달" about_x_years: - other: '%{count}ë…„' + other: "%{count}ë…„" over_x_years: - other: '> %{count}ë…„' + other: "> %{count}ë…„" almost_x_years: - other: '%{count}ë…„' + other: "%{count}ë…„" date_month: "MMM D" date_year: "'YY MMM" medium: x_minutes: - other: '%{count}ë¶„' + other: "%{count}ë¶„" x_hours: - other: '%{count}시간' + other: "%{count}시간" x_days: - other: '%{count}ì¼' + other: "%{count}ì¼" date_year: "'YY MMM D" medium_with_ago: x_minutes: - other: '%{count}ë¶„ ì „' + other: "%{count}ë¶„ ì „" x_hours: - other: '%{count}시간 ì „' + other: "%{count}시간 ì „" x_days: - other: '%{count}ì¼ ì „' + other: "%{count}ì¼ ì „" later: x_days: - other: '%{count}ì¼ í›„' + other: "%{count}ì¼ í›„" x_months: - other: '%{count}달 후' + other: "%{count}달 후" x_years: - other: '%{count}ë…„ 후' + other: "%{count}ë…„ 후" previous_month: '지난 달' next_month: 'ë‹¤ìŒ ë‹¬' share: @@ -126,6 +126,8 @@ ko: topic_admin_menu: "토픽 관리" wizard_required: "새로운 Discourseì— ì˜¤ì‹ ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤! 설치 마법사 로 시작해봅시다✨" emails_are_disabled: "관리ìžê°€ ì´ë©”ì¼ ì†¡ì‹ ì„ ì „ì²´ 비활성화 했습니다. ì–´ë–¤ ì¢…ë¥˜ì˜ ì´ë©”ì¼ ì•Œë¦¼ë„ ë³´ë‚´ì§€ì§€ 않습니다." + bootstrap_mode_enabled: "쉬운 ì‹œìž‘ì„ ìœ„í•´ 부트스트랩 모드로 êµ¬ë™ ë˜ì—ˆìŠµë‹ˆë‹¤. 모든 새로운 사용ìžì—게 신뢰 수준 1ì´ ë¶€ì—¬ë˜ê³  ë§¤ì¼ ì´ë©”ì¼ ë‹¤ì´ì œìŠ¤íŠ¸ê°€ 보내집니다. ì´ ê¸°ëŠ¥ì€ ì´ ì‚¬ìš©ìž ìˆ˜ê°€ %{min_users}를 초과 í•  때 ìžë™ìœ¼ë¡œ 꺼집니다." + bootstrap_mode_disabled: "Bootstrap 모드가 24시간 ì´ë‚´ì— í•´ì œë©ë‹ˆë‹¤." themes: default_description: "기본값" s3: @@ -139,6 +141,7 @@ ko: eu_central_1: "유럽연합 (프랑í¬í‘¸ë¥´íЏ)" eu_west_1: "유럽연합 (ì•„ì¼ëžœë“œ)" eu_west_2: "EU (런ë˜)" + eu_west_3: "EU (파리)" sa_east_1: "남 아메리카 (ìƒíŒŒìš¸ë¡œ)" us_east_1: "미국 ë™ë¶€ (N. 버지니아)" us_east_2: "미국 ë™ë¶€ (오하ì´ì˜¤)" @@ -149,6 +152,7 @@ ko: not_implemented: "죄송합니다. ì•„ì§ ì‚¬ìš©í•  수 없는 기능입니다." no_value: "아니오" yes_value: "예" + submit: "제출" generic_error: "죄송합니다. 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤." generic_error_with_reason: "오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤: %{error}" sign_up: "회ì›ê°€ìž…" @@ -161,19 +165,19 @@ ko: show_help: "옵션" links: "ë§í¬" links_lowercase: - other: ë§í¬ + other: "ë§í¬" faq: "FAQ" guidelines: "ê°€ì´ë“œë¼ì¸" privacy_policy: "ê°œì¸ë³´í˜¸ ì •ì±…" privacy: "ê°œì¸ì •보처리방침" - terms_of_service: "서비스 ì´ìš©ì•½ê´€" + tos: "서비스 ì´ìš©ì•½ê´€" mobile_view: "모바ì¼ë¡œ 보기" desktop_view: "PC로 보기" you: "당신" or: "ë˜ëŠ”" now: "방금 ì „" read_more: 'ë” ì½ê¸°' - more: "ë”" + more: "ë” ë³´ê¸°" less: "ëœ" never: "전혀" every_30_minutes: "매 30ë¶„ 마다" @@ -185,7 +189,7 @@ ko: max_of_count: "최대 {{count}}" alternation: "ë˜ëŠ”" character_count: - other: '{{count}} ìž' + other: "{{count}} ìž" suggested_topics: title: "추천 토픽" pm_title: "추천 메세지" @@ -217,6 +221,8 @@ ko: last_read: "마지막으로 ì½ìœ¼ì‹  게시물입니다. ì¦ê²¨ì°¾ê¸°ì— 추가하려면 í´ë¦­í•˜ì„¸ìš”." remove: "ë¶ë§ˆí¬ ì‚­ì œ" confirm_clear: "ì •ë§ë¡œ ì´ í† í”½ì˜ ëª¨ë“  ë¶ë§ˆí¬ë¥¼ 제거할까요?" + drafts: + remove: "ì‚­ì œ" preview: "미리보기" cancel: "취소" save: "변경사항 저장" @@ -226,8 +232,10 @@ ko: uploading: "업로드 중..." uploading_filename: "{{filename}} 업로드 중..." uploaded: "업로드 완료!" + pasting: "붙혀넣는중..." enable: "활성화" disable: "비활성화" + continue: "계ì†" undo: "실행 취소" revert: "ë˜ëŒë¦¬ê¸°" failed: "실패" @@ -252,14 +260,14 @@ ko: cancel: "취소" view_pending: "ëŒ€ê¸°ì¤‘ì¸ ê²Œì‹œê¸€" has_pending_posts: - other: ì´ í† í”½ì—는 {{count}}ê°œì˜ ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ì¸ í¬ìŠ¤íŠ¸ê°€ 있습니다 + other: "ì´ í† í”½ì—는 {{count}}ê°œì˜ ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ì¸ í¬ìŠ¤íŠ¸ê°€ 있습니다" confirm: "변경사항 저장" delete_prompt: "ì •ë§ë¡œ %{username}; 회ì›ì„ 삭제하시겠습니까? ê²Œì‹œê¸€ì´ ëª¨ë‘ ì‚­ì œë˜ê³  IP와 ì´ë©”ì¼ì´ 차단ë©ë‹ˆë‹¤." approval: title: "게시글 ìŠ¹ì¸ í•„ìš”" description: "새로운 ê²Œì‹œê¸€ì´ ìžˆìŠµë‹ˆë‹¤. 그러나 ì´ ê²Œì‹œê¸€ì´ ë³´ì—¬ì§€ë ¤ë©´ ìš´ì˜ìžì˜ 승ì¸ì´ 필요합니다." pending_posts: - other: ëŒ€ê¸°ì¤‘ì¸ ê²Œì‹œê¸€ì´ {{count}}ê°œ 있습니다. + other: "ëŒ€ê¸°ì¤‘ì¸ ê²Œì‹œê¸€ì´ {{count}}ê°œ 있습니다." ok: "확ì¸" user_action: user_posted_topic: "{{user}}ë‹˜ì´ í† í”½ì„ ê²Œì‹œí–ˆìŠµë‹ˆë‹¤" @@ -293,7 +301,7 @@ ko: posts_read: "ì½ìŒ" posts_read_long: "게시글 ì½ìŒ" total_rows: - other: '%{count} 사용ìž' + other: "%{count} 사용ìž" group_histories: actions: change_group_setting: "그룹 설정 변경" @@ -302,6 +310,21 @@ ko: make_user_group_owner: "소유ìžë¡œ 지정하기" remove_user_as_group_owner: "ì†Œìœ ìž ì§€ì • 취소하기" groups: + manage: + title: '관리' + name: 'ì´ë¦„' + add_members: "멤버 추가" + profile: + title: 프로필 + interaction: + posting: í¬ìŠ¤íŒ… + notification: 알림 + membership: + title: 멤버십 + access: ì ‘ê·¼ + logs: + title: "로그" + target_user: "타겟 사용ìž" public_admission: "사용ìžê°€ ê·¸ë£¹ì— ìžìœ ë¡­ê²Œ 가입할 수 있ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤. (ê·¸ë£¹ì´ ê³µê°œë˜ì–´ì•¼ 함)" public_exit: "사용ìžê°€ ê·¸ë£¹ì„ ìžìœ ë¡­ê²Œ 탈퇴할 수 있ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤." empty: @@ -326,9 +349,14 @@ ko: index: title: "그룹" empty: "ë³´ì´ëŠ” ê·¸ë£¹ì´ ì—†ìŠµë‹ˆë‹¤." + automatic_groups: "ìžë™ 그룹" + automatic: "ìžë™" title: - other: 그룹 + other: "그룹" activity: "활ë™" + members: + remove_member_description: "ì´ ê·¸ë£¹ì—서 %{username}(ì„)를 삭제합니다." + make_owner_description: "ì´ ê·¸ë£¹ì—서 %{username}(ì„)를 소유ìžë¡œ 설정합니다." topics: "토픽" posts: "게시글" mentions: "멘션" @@ -387,8 +415,6 @@ ko: reorder: title: "카테고리 순서변경" title_long: "카테고리 ëª©ë¡ ìž¬êµ¬ì„±" - fix_order: "위치 ê³ ì •" - fix_order_tooltip: "ì¹´ë°ê³ ë¦¬ì— 고유 위치가 표시ë˜ì§€ ì•Šì€ ê²Œ 있습니다. ì´ ê²½ìš° 예기치 ì•Šì€ ë¬¸ì œë¥¼ ì¼ìœ¼í‚¬ 수 있습니다." save: "순서 저장" apply_all: "ì ìš©" position: "위치" @@ -399,9 +425,9 @@ ko: toggle_ordering: "ì •ë ¬ 컨트롤 토글" subcategories: "하위 카테고리" topic_sentence: - other: '%{count}ê°œì˜ í† í”½' + other: "%{count}ê°œì˜ í† í”½" topic_stat_sentence: - other: 지난 %{unit} ë™ì•ˆ %{count}ê°œì˜ ìƒˆë¡œìš´ í† í”½ì´ ìƒê²¼ìŠµë‹ˆë‹¤. + other: "지난 %{unit} ë™ì•ˆ %{count}ê°œì˜ ìƒˆë¡œìš´ í† í”½ì´ ìƒê²¼ìŠµë‹ˆë‹¤." ip_lookup: title: IP 주소 Lookup hostname: Hostname @@ -450,6 +476,7 @@ ko: disable: "알림 비활성화" enable: "알림 활성화" each_browser_note: "노트: 사용하시는 모든 브ë¼ìš°ì €ì—서 ì´ ì„¤ì •ì„ ë³€ê²½í•´ì•¼í•©ë‹ˆë‹¤." + consent_prompt: "í¬ìŠ¤íŠ¸ì— ëŒ“ê¸€ì´ ë‹¬ë ¸ì„때 실시간 ì•Œë¦¼ì„ ë°›ê² ìŠµë‹ˆê¹Œ?" dismiss: 'í•´ì§€' dismiss_notifications: "ëª¨ë‘ í•´ì§€" dismiss_notifications_tooltip: "ì½ì§€ ì•Šì€ ì•Œë¦¼ì„ ëª¨ë‘ ì½ìŒìœ¼ë¡œ 표시" @@ -551,12 +578,25 @@ ko: set_password: "비밀번호 설정" choose_new: "새로운 비밀번호를 ì ì–´ì£¼ì„¸ìš”" choose: "비밀번호를 ì ì–´ì£¼ì„¸ìš”" + second_factor_backup: + regenerate: "재ìƒì„±" + disable: "í•´ì œ" + enable: "설정" + copied_to_clipboard: "í´ë¦½ë³´ë“œì— 복사ë¨" + copy_to_clipboard_error: "ë°ì´í„°ë¥¼ í´ë¦½ë³´ë“œì— ë³µì‚¬í•˜ëŠ”ë° ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤." + codes: + title: "백업 코드가 재ìƒì„±ë¨" + second_factor: + title: "ì´ì¤‘ ì¸ì¦" + disable: "ì´ì¤‘ ì¸ì¦ í•´ì œ" + enable: "보다 í–¥ìƒëœ 계정 ë³´ì•ˆì„ ìœ„í•´ ì´ì¤‘ ì¸ì¦ì„ 활성화 하세요." + confirm_password_description: "비밀번호를 확ì¸í•´ì£¼ì„¸ìš”." + label: "코드" change_about: title: "ë‚´ 소개 변경" error: "ê°’ì„ ë°”ê¾¸ëŠ” 중 ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." change_username: title: "ì•„ì´ë”” 변경" - confirm: "ì•„ì´ë””를 변경하면, ì´ì „ì— ìž…ë ¥í•œ 답글들과 @ì´ë¦„으로 걸린 ë©˜ì…˜ë“¤ì´ ëª¨ë‘ ê¹¨ì§€ê²Œ ë©ë‹ˆë‹¤. ê·¸ëž˜ë„ ì‚¬ìš©ìž ì´ë¦„ì„ ë°”ê¿€ê¹Œìš”?" taken: "죄송합니다. ì´ë¯¸ 사용 ì¤‘ì¸ ì•„ì´ë””입니다." invalid: "ì•„ì´ë””ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. 숫ìžì™€ 문ìžë¥¼ í¬í•¨í•´ì•¼í•©ë‹ˆë‹¤." change_email: @@ -576,7 +616,6 @@ ko: upload_title: "프로필 사진 업로드" upload_picture: "사진 업로드" image_is_not_a_square: "경고: 정사ê°í˜• ì´ë¯¸ì§€ê°€ 아니기 ë•Œë¬¸ì— ì‚¬ì§„ì„ ìˆ˜ì •í•˜ì˜€ìŠµë‹ˆë‹¤." - cache_notice: "프로필 ì‚¬ì§„ì„ ë°”ê¾¸ëŠ”ë° ì„±ê³µí–ˆìŠµë‹ˆë‹¤ë§Œ 브ë¼ìš°ì ¸ ìºì‰¬ë¡œ ì¸í•´ 보여지기까지 ì‹œê°„ì´ ì¡°ê¸ˆ 걸립니다." change_profile_background: title: "프로필 ë°°ê²½" instructions: "프로필 ë°°ê²½ì€ ê°€ìš´ë°ë¥¼ 기준으로 표시ë˜ë©° 850pxì´ ê¸°ë³¸ 가로 사ì´ì¦ˆ 입니다." @@ -591,7 +630,7 @@ ko: authenticated: "ë‚´ ì´ë©”ì¼ì´ {{provider}}ì— ì˜í•´ ì¸ì¦ë˜ì—ˆìŠµë‹ˆë‹¤." frequency_immediately: "만약 ì „ì†¡ëœ ë©”ì¼ì„ ì½ì§€ ì•Šì•˜ì„ ê²½ìš°, 즉시 ë©”ì¼ì„ 다시 보내드립니다." frequency: - other: 최근 {{count}}ë¶„ ë™ì•ˆì ‘ì†í•˜ì§€ ì•Šì„ ê²½ìš°ì—ë§Œ ë©”ì¼ì´ 전송ë©ë‹ˆë‹¤. + other: "최근 {{count}}ë¶„ ë™ì•ˆì ‘ì†í•˜ì§€ ì•Šì„ ê²½ìš°ì—ë§Œ ë©”ì¼ì´ 전송ë©ë‹ˆë‹¤." name: title: "ì´ë¦„" instructions: "ì´ë¦„ (ì„ íƒì‚¬í•­)" @@ -676,7 +715,7 @@ ko: user: "ì‚¬ìš©ìž ì´ˆëŒ€" sent: "보냄" truncated: - other: 앞 {{count}}ê°œì˜ ì´ˆëŒ€ë¥¼ ë³´ì—¬ì¤ë‹ˆë‹¤. + other: "앞 {{count}}ê°œì˜ ì´ˆëŒ€ë¥¼ ë³´ì—¬ì¤ë‹ˆë‹¤." redeemed: "초대를 받았습니다." redeemed_tab: "Redeemed" redeemed_tab_with_count: "êµí™˜ëœ ({{count}})" @@ -723,21 +762,21 @@ ko: time_read: "ì½ì€ 시간" recent_time_read: "최근 ì½ì€ 시간" topic_count: - other: 작성 시간 + other: "작성 시간" post_count: - other: 작성 시간 + other: "작성 시간" likes_given: - other: 누름 + other: "누름" likes_received: - other: ë°›ìŒ + other: "ë°›ìŒ" days_visited: - other: 방문ì¼ìˆ˜ + other: "방문ì¼ìˆ˜" topics_entered: - other: í† í”½ì´ í‘œì‹œë¨ + other: "í† í”½ì´ í‘œì‹œë¨" posts_read: - other: ì½ì€ 글 갯수 + other: "ì½ì€ 글 갯수" bookmark_count: - other: ë¶ë§ˆí¬ë“¤ + other: "ë¶ë§ˆí¬ë“¤" top_replies: "ì¸ê¸° 댓글" no_replies: "ì•„ì§ ë‹µê¸€ì´ ì—†ìŠµë‹ˆë‹¤." more_replies: "답글 ë” ë³´ê¸°" @@ -753,7 +792,6 @@ ko: most_liked_users: "가장 ë§Žì´ ì¢‹ì•„ìš”ë¥¼ ë°›ì€" most_replied_to_users: "ëŒ“ê¸€ì„ ê°€ìž¥ ë§Žì´ ë‹¨ 사람" no_likes: "ì•„ì§ ì¢‹ì•„ìš”ê°€ 없습니다." - associated_accounts: "로그ì¸" ip_address: title: "마지막 IP 주소" registration_ip_address: @@ -805,7 +843,7 @@ ko: reached: "%{relativeAge} – %{rate} ê°€ 사ì´íЏ 제한값 %{siteSettingRate}ì— ë„달했습니다." exceeded: "%{relativeAge} – %{rate} ê°€ 사ì´íЏ 제한값 %{siteSettingRate}ì„ ì´ˆê³¼í•˜ì˜€ìŠµë‹ˆë‹¤." rate: - other: '%{count} ì—러/%{duration}' + other: "%{count} ì—러/%{duration}" learn_more: "ë” ë°°ìš°ê¸°" all_time: 'ì´' all_time_desc: 'ì´ í† í”½' @@ -829,8 +867,6 @@ ko: hide_session: "ë‚´ì¼ ë‹¤ì‹œ 알려주기" hide_forever: "사양합니다." hidden_for_session: "알겠습니다. ë‚´ì¼ ë‹¤ì‹œ 물어볼께요. 언제든지 '로그ì¸'ì„ í†µí•´ì„œë„ ê³„ì •ì„ ë§Œë“¤ 수 있습니다." - intro: "안녕하세요! :heart_eyes: 글ì½ê¸°ëŠ” ì¢‹ì•„í•˜ì‹œëŠ”ë° ì•„ì§ íšŒì›ê°€ìž…ì€ ì•ˆí•˜ì‹  것 같네요." - value_prop: "회ì›ê°€ìž… 하시면 ê¸€ì„ ì–´ë””ê¹Œì§€ ì½ìœ¼ì…¨ëŠ”ì§€ ì €í¬ê°€ 기억하기 때문ì—, 언제든지 마지막 ì½ì€ 위치로 바로 ëŒì•„ê°ˆ 수 있답니다. 그리고 ìƒˆê¸€ì´ ëœ°ë•Œë§ˆë‹¤ ì´ í™”ë©´ê³¼ ì´ë©”ì¼ë¡œ ì•Œë¦¼ì„ ë°›ì„ìˆ˜ë„ ìžˆê³ , 좋아요를 í´ë¦­í•´ì„œ ê¸€ì— ëŒ€í•œ ì• ì •ì„ í‘œí˜„í•˜ì‹¤ ìˆ˜ë„ ìžˆì–´ìš”. :heartbeat:" summary: enabled_description: "현재 커뮤니티ì—서 가장 ì¸ê¸°ìžˆëŠ” ì£¼ì œì˜ ìš”ì•½ë³¸ì„ ë³´ê³  있습니다:" description: "ëŒ“ê¸€ì´ {{replyCount}}ê°œ 있습니다." @@ -844,7 +880,6 @@ ko: disable: "ì‚­ì œëœ ê¸€ 보기" private_message_info: title: "메시지" - invite: "다른 사람 초대" leave_message: "ì •ë§ë¡œ ì´ ë©”ì‹œì§€ë¥¼ 남길까요?" remove_allowed_user: "{{name}}ì—게서 온 메시지를 삭제할까요?" remove_allowed_group: "{{name}}ì—게서 온 메시지를 삭제할까요?" @@ -902,9 +937,6 @@ ko: preferences: "ì‚¬ìš©ìž í™˜ê²½ì„ ë³€ê²½í•˜ë ¤ë©´ 로그ì¸ì´ 필요합니다." forgot: "ë‚´ ê³„ì •ì˜ ìƒì„¸ë‚´ì—­ 기억하지 않는다." not_approved: "ë‹¹ì‹ ì˜ ê³„ì •ì€ ì•„ì§ í™œì„±í™”ë˜ì§€ 않았습니다. ì´ë©”ì¼ì„ 확ì¸í•˜ì‹œê³  ë¡œê·¸ì¸ í•´ì£¼ì„¸ìš”." - google: - title: "Google" - message: "Google ì¸ì¦ 중(íŒì—… ì°¨ë‹¨ì„ í•´ì œ 하세요)" google_oauth2: title: "with Google" message: "êµ¬ê¸€ì„ í†µí•´ ì¸ì¦ 중 (íŒŒì—…ì´ í—ˆìš©ë˜ì–´ 있는지 확ì¸í•´ì£¼ì„¸ìš”.)" @@ -986,7 +1018,7 @@ ko: similar_topics: "작성하려는 내용과 비슷한 주제들..." drafts_offline: "초안" group_mentioned: - other: '{{group}}ì„ ì–¸ê¸‰í•˜ë©´, {{count}} ëª…ì˜ íšŒì›ì—게 ì•Œë¦¼ì´ ê°‘ë‹ˆë‹¤. 그렇게 할까요?' + other: "{{group}}ì„ ì–¸ê¸‰í•˜ë©´, {{count}} ëª…ì˜ íšŒì›ì—게 ì•Œë¦¼ì´ ê°‘ë‹ˆë‹¤. 그렇게 할까요?" cannot_see_mention: category: "{{username}}ì—게 ë©˜ì…˜ì„ ì¼ì§€ë§Œ, 해당 사용ìžê°€ ì´ ì¹´í…Œê³ ë¦¬ì— ì ‘ê·¼í•  수 없기 ë•Œë¬¸ì— ì•Œë¦¼ì´ ê°€ì§€ 않습니다. ì´ ì¹´í…Œê³ ë¦¬ì— ì ‘ê·¼í•  수 있는 ê·¸ë£¹ì— í•´ë‹¹ 멤버가 추가ë˜ì–´ì•¼ 합니다." private: "{{username}}ì—게 ë©˜ì…˜ì„ ì¼ì§€ë§Œ, 해당 사용ìžê°€ ê°œì¸ ë©”ì‹œì§€ë¥¼ ë³¼ 수 없기 ë•Œë¬¸ì— ì•Œë¦¼ì´ ê°€ì§€ 않습니다. ì´ ê°œì¸ ë©”ì‹œì§€ì— í•´ë‹¹ 사용ìžë¥¼ 초대해야 합니다." @@ -1066,7 +1098,7 @@ ko: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - other: {{username}}, {{username2}} 외 {{count}} ëª…ì˜ ì‚¬ìš©ìžê°€ {{description}} + other: "{{username}}, {{username2}} 외 {{count}} ëª…ì˜ ì‚¬ìš©ìžê°€ {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1077,7 +1109,7 @@ ko: topic_reminder: "{{username}} {{description}}" watching_first_post: "새 토픽 {{description}}" group_message_summary: - other:  {{group_name}} ì‚¬ì„œí•¨ì— {{count}} ê°œì˜ ë©”ì‹œì§€ê°€ 있습니다 + other: " {{group_name}} ì‚¬ì„œí•¨ì— {{count}} ê°œì˜ ë©”ì‹œì§€ê°€ 있습니다" popup: mentioned: '"{{topic}}" - {{site_title}}ì—서 {{username}} ë‹˜ì´ ë‚˜ë¥¼ 멘션했습니다' group_mentioned: '"{{topic}}" - {{site_title}}ì—서 {{username}} ë‹˜ì´ ë‹¹ì‹ ì„ ì–¸ê¸‰í–ˆìŠµë‹ˆë‹¤' @@ -1186,7 +1218,7 @@ ko: notification_level: "알림" choose_new_category: "ì£¼ì œì˜ ìƒˆë¡œìš´ 카테고리를 ì„ íƒ" selected: - other: {{count}}ê°œì˜ ì£¼ì œê°€ ì„ íƒë˜ì—ˆìŠµë‹ˆë‹¤. + other: "{{count}}ê°œì˜ ì£¼ì œê°€ ì„ íƒë˜ì—ˆìŠµë‹ˆë‹¤." change_tags: "태그 êµì²´" append_tags: "태그 ë§ë¶™ì´ê¸°" choose_new_tags: "ì´ í† í”½ì˜ íƒœê·¸ë¥¼ 입력하세요:" @@ -1219,7 +1251,7 @@ ko: search: "ë”ì´ìƒ 검색 결과가 없습니다." topic: filter_to: - other: ì´ í† í”½ì— {{count}}ê°œ 게시글 + other: "ì´ í† í”½ì— {{count}}ê°œ 게시글" create: '새 주제 만들기' create_long: '새로운 주제 만들기' private_message: '메시지 시작' @@ -1248,13 +1280,13 @@ ko: title: "주제를 ì°¾ì„ ìˆ˜ 없습니다" description: "죄송합니다. 주제를 ì°¾ì„ ìˆ˜ 없습니다. ì•„ë§ˆë„ ìš´ì˜ìžì— ì˜í•´ ì‚­ì œëœ ê²ƒ 같습니다." total_unread_posts: - other: ì´ ì£¼ì œì— {{count}}ê°œì˜ ì½ì§€ ì•Šì„ ê²Œì‹œ ê¸€ì´ ìžˆìŠµë‹ˆë‹¤. + other: "ì´ ì£¼ì œì— {{count}}ê°œì˜ ì½ì§€ ì•Šì„ ê²Œì‹œ ê¸€ì´ ìžˆìŠµë‹ˆë‹¤." unread_posts: - other: ì´ ì£¼ì œì— {{count}}ê°œì˜ ì½ì§€ ì•Šì„ ê²Œì‹œ ê¸€ì´ ìžˆìŠµë‹ˆë‹¤. + other: "ì´ ì£¼ì œì— {{count}}ê°œì˜ ì½ì§€ ì•Šì„ ê²Œì‹œ ê¸€ì´ ìžˆìŠµë‹ˆë‹¤." new_posts: - other: 최근 ì½ì€ ì´í›„ {{count}}ê°œ ê¸€ì´ ì´ ì£¼ì œì— ìž‘ì„±ë˜ì—ˆìŠµë‹ˆë‹¤. + other: "최근 ì½ì€ ì´í›„ {{count}}ê°œ ê¸€ì´ ì´ ì£¼ì œì— ìž‘ì„±ë˜ì—ˆìŠµë‹ˆë‹¤." likes: - other: ì´ ì£¼ì œì— {{count}}ê°œì˜ '좋아요'ê°€ 있습니다. + other: "ì´ ì£¼ì œì— {{count}}ê°œì˜ '좋아요'ê°€ 있습니다." back_to_list: "주제 리스트로 ëŒì•„갑니다." options: "주제 옵션" show_links: "ì´ ì£¼ì œì—서 ë§í¬ë¥¼ 표시합니다." @@ -1315,7 +1347,7 @@ ko: auto_reminder: "%{timeLeft}í›„ì— ì´ í† í”½ì„ ë‹¤ì‹œ 알려드리겠습니다." auto_close_title: 'ìžë™ìœ¼ë¡œ 닫기 설정' auto_close_immediate: - other: ì£¼ì œì— ë§ˆì§€ë§‰ ê²Œì‹œê¸€ì´ ì˜¬ë¼ì˜¨ ì§€ %{hours} ì‹œê°„ì´ ì§€ë‚¬ê¸° ë•Œë¬¸ì— ì´ ì£¼ì œëŠ” ê³§ ë‹«íž ì˜ˆì •ìž…ë‹ˆë‹¤. + other: "ì£¼ì œì— ë§ˆì§€ë§‰ ê²Œì‹œê¸€ì´ ì˜¬ë¼ì˜¨ ì§€ %{hours} ì‹œê°„ì´ ì§€ë‚¬ê¸° ë•Œë¬¸ì— ì´ ì£¼ì œëŠ” ê³§ ë‹«íž ì˜ˆì •ìž…ë‹ˆë‹¤." timeline: back: "ì´ì „" back_description: "마지막으로 안ì½ì€ 게시글로 ëŒì•„가기" @@ -1422,7 +1454,7 @@ ko: pin_validation: "주제를 고정하려면 날짜를 지정해야 합니다." not_pinned: " {{categoryLink}} ì¹´í…Œê³ ë¦¬ì— ê³ ì •ëœ ì£¼ì œê°€ 없습니다." already_pinned: - other: '{{categoryLink}}ì— ê³ ì •ëœ ì£¼ì œ 개수: {{count}}' + other: "{{categoryLink}}ì— ê³ ì •ëœ ì£¼ì œ 개수: {{count}}" pin_globally: "모든 주제 ëª©ë¡ ìƒë‹¨ ê³ ì • until" confirm_pin_globally: "ì´ë¯¸ {{count}}ê°œì˜ ì£¼ì œê°€ ì „ì²´ 공지로 ê³ ì •ë˜ì–´ 있습니다. 너무 ë§Žì€ ì£¼ì œê°€ ê³ ì •ë˜ì–´ 있으면 새로운 사용ìžë‚˜ ìµëª…사용ìžì—게 ë¶€ë‹´ì´ ë  ìˆ˜ 있습니다. ì •ë§ë¡œ ì´ ì£¼ì œë¥¼ ì „ì²´ 공지로 고정하겠습니까?" unpin_globally: "모든 주제 ëª©ë¡ ìƒë‹¨ì—서 ì´ ì£¼ì œë¥¼ 제거" @@ -1430,7 +1462,7 @@ ko: global_pin_note: "개별ì ìœ¼ë¡œ 사용ìžê°€ 주제 ê³ ì •ì„ ì·¨ì†Œí•  수 있습니다." not_pinned_globally: "ì „ì²´ ê³µì§€ëœ ì£¼ì œê°€ 없습니다." already_pinned_globally: - other: 'ì „ì²´ ê³µì§€ëœ ì£¼ì œ 개수: {{count}}' + other: "ì „ì²´ ê³µì§€ëœ ì£¼ì œ 개수: {{count}}" make_banner: "ì´ ì£¼ì œë¥¼ 모든 페ì´ì§€ì˜ ìƒë‹¨ì— 나타나는 배너로 만들기" remove_banner: "모든 페ì´ì§€ì—서 나타나는 배너ì—서 제거" banner_note: "사용ìžëŠ” 배너를 ë‹«ìŒìœ¼ë¡œì¨ 배너를 나타나지 않게 í•  수 있습니다. 단지 ì–´ë–¤ 기간ë™ì•ˆ ë”± í•˜ë‚˜ì˜ ì£¼ì œë§Œì´ ë°°ë„ˆë¡œ 지정 가능합니다." @@ -1467,7 +1499,7 @@ ko: login_reply: '로그ì¸í•˜ê³  답글 쓰기' filters: n_posts: - other: '{{count}} 글' + other: "{{count}} 글" cancel: "í•„í„° 제거" split_topic: title: "새로운 주제로 ì´ë™" @@ -1475,13 +1507,13 @@ ko: topic_name: "새로운 주제 ì´ë¦„" error: "새로운 주제로 ì´ë™ì‹œí‚¤ëŠ”ë° ë¬¸ì œê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤." instructions: - other: 새로운 주제를 ìƒì„±í•˜ì—¬, ì„ íƒí•œ {{count}}ê°œì˜ ê¸€ë¡œ 채우려고 합니다. + other: "새로운 주제를 ìƒì„±í•˜ì—¬, ì„ íƒí•œ {{count}}ê°œì˜ ê¸€ë¡œ 채우려고 합니다." merge_topic: title: "ì´ë¯¸ 있는 주제로 옮기기" action: "ì´ë¯¸ 있는 주제로 옮기기" error: "ì´ ì£¼ì œë¥¼ ì´ë™ì‹œí‚¤ëŠ”ë° ë¬¸ì œê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤." instructions: - other: ' {{count}}ê°œì˜ ê¸€ì„ ì˜®ê¸¸ 주제를 ì„ íƒí•´ì£¼ì„¸ìš”.' + other: " {{count}}ê°œì˜ ê¸€ì„ ì˜®ê¸¸ 주제를 ì„ íƒí•´ì£¼ì„¸ìš”." merge_posts: title: "ì„ íƒí•œ 게시글 합치기" action: "ì„ íƒí•œ 게시글 합치기" @@ -1493,7 +1525,7 @@ ko: label: "ê¸€ì˜ ìƒˆë¡œìš´ 작성ìž" placeholder: "새로운 작성ìžì˜ ì•„ì´ë””" instructions: - other: {{old_user}}(ì´)ê°€ 작성한 ê¸€ì˜ ìƒˆë¡œìš´ 작성ìžë¥¼ ì„ íƒí•´ì£¼ì„¸ìš”. + other: "{{old_user}}(ì´)ê°€ 작성한 ê¸€ì˜ ìƒˆë¡œìš´ 작성ìžë¥¼ ì„ íƒí•´ì£¼ì„¸ìš”." change_timestamp: title: "타임스탬프 변경하기..." action: "타임스탬프 변경" @@ -1508,7 +1540,7 @@ ko: select_all: ì „ì²´ ì„ íƒ deselect_all: ì „ì²´ ì„ íƒ í•´ì œ description: - other: {{count}}ê°œì˜ ê°œì‹œê¸€ì„ ì„ íƒí•˜ì…¨ì–´ìš”. + other: "{{count}}ê°œì˜ ê°œì‹œê¸€ì„ ì„ íƒí•˜ì…¨ì–´ìš”." post: quote_reply: "ì¸ìš©í•˜ê¸°" edit_reason: "Reason: " @@ -1522,20 +1554,20 @@ ko: show_full: "ì „ì²´ 글 보기" show_hidden: '숨겨진 ë‚´ìš©ì„ í‘œì‹œ' deleted_by_author: - other: (작성ìžì— ì˜í•´ ì·¨ì†Œëœ ê¸€ìž…ë‹ˆë‹¤. ê¸€ì´ ì‹ ê³ ëœ ê²ƒì´ ì•„ë‹Œ 한 %{count} 시간 ë’¤ì— ìžë™ìœ¼ë¡œ ì‚­ì œë©ë‹ˆë‹¤) + other: "(작성ìžì— ì˜í•´ ì·¨ì†Œëœ ê¸€ìž…ë‹ˆë‹¤. ê¸€ì´ ì‹ ê³ ëœ ê²ƒì´ ì•„ë‹Œ 한 %{count} 시간 ë’¤ì— ìžë™ìœ¼ë¡œ ì‚­ì œë©ë‹ˆë‹¤)" expand_collapse: "확장/축소" gap: - other: '{{count}}ê°œì˜ ìˆ¨ê²¨ì§„ 답글 보기' + other: "{{count}}ê°œì˜ ìˆ¨ê²¨ì§„ 답글 보기" unread: "ì½ì§€ ì•Šì€ í¬ìŠ¤íŠ¸" has_replies: - other: '{{count}} 답글' + other: "{{count}} 답글" has_likes: - other: '{{count}} 좋아요' + other: "{{count}} 좋아요" has_likes_title: - other: '{{count}}ëª…ì´ ì´ ê¸€ì„ ì¢‹ì•„í•©ë‹ˆë‹¤' + other: "{{count}}ëª…ì´ ì´ ê¸€ì„ ì¢‹ì•„í•©ë‹ˆë‹¤" has_likes_title_only_you: "ë‹¹ì‹ ì´ ì´ ê¸€ì„ ì¢‹ì•„í•©ë‹ˆë‹¤." has_likes_title_you: - other: 당신 외 {{count}}ëª…ì´ ì´ ê¸€ì„ ì¢‹ì•„í•©ë‹ˆë‹¤ + other: "당신 외 {{count}}ëª…ì´ ì´ ê¸€ì„ ì¢‹ì•„í•©ë‹ˆë‹¤" errors: create: "죄송합니다. ê¸€ì„ ë§Œë“œëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 시ë„하십시오." edit: "죄송합니다. ê¸€ì„ ìˆ˜ì •í•˜ëŠ” ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 시ë„하십시오." @@ -1588,7 +1620,6 @@ ko: inappropriate: "ì‹ ê³  취소" bookmark: "ë¶ë§ˆí¬ 취소" like: "좋아요 취소" - vote: "투표 취소" people: off_topic: "주제ì—서 벗어났다고 신고했습니다" spam: "스팸으로 신고했습니다" @@ -1597,7 +1628,6 @@ ko: notify_user: "글쓴ì´ì—게 메시지를 보냈습니다" bookmark: "ë¶ë§ˆí¬ 했습니다" like: "좋아해요" - vote: "ì´ê³³ì— 투표했습니다" by_you: off_topic: "ì´ê¸€ì„ 주제ì—서 벗어났다고 신고했습니다" spam: "ì´ê¸€ì„ 스팸으로 신고했습니다" @@ -1606,44 +1636,39 @@ ko: notify_user: "글쓴ì´ì—게 메시지를 보냈습니다" bookmark: "ì´ ê¸€ì„ ë¶ë§ˆí¬í–ˆìŠµë‹ˆë‹¤" like: "좋아해요" - vote: "ì´ ê¸€ì— íˆ¬í‘œí–ˆìŠµë‹ˆë‹¤" by_you_and_others: off_topic: - other: 당신 외 {{count}}ëª…ì´ ì£¼ì œì—서 벗어났다고 신고했습니다 + other: "당신 외 {{count}}ëª…ì´ ì£¼ì œì—서 벗어났다고 신고했습니다" spam: - other: 당신 외 {{count}}ëª…ì´ ìŠ¤íŒ¸ì´ë¼ê³  신고했습니다 + other: "당신 외 {{count}}ëª…ì´ ìŠ¤íŒ¸ì´ë¼ê³  신고했습니다" inappropriate: - other: 당신 외 {{count}}ëª…ì´ ë¶€ì ì ˆí•œ 컨í…츠ë¼ê³  신고했습니다 + other: "당신 외 {{count}}ëª…ì´ ë¶€ì ì ˆí•œ 컨í…츠ë¼ê³  신고했습니다" notify_moderators: - other: 당신 외 {{count}}ëª…ì´ ìš´ì˜ìžì—게 알렸습니다 + other: "당신 외 {{count}}ëª…ì´ ìš´ì˜ìžì—게 알렸습니다" notify_user: - other: 당신 외 {{count}}ëª…ì´ ê¸€ì“´ì´ì—게 메시지를 보냈습니다 + other: "당신 외 {{count}}ëª…ì´ ê¸€ì“´ì´ì—게 메시지를 보냈습니다" bookmark: - other: 당신 외 {{count}}ëª…ì´ ë¶ë§ˆí¬ 했습니다 + other: "당신 외 {{count}}ëª…ì´ ë¶ë§ˆí¬ 했습니다" like: - other: 당신 외 {{count}}ëª…ì´ ì¢‹ì•„í•©ë‹ˆë‹¤ - vote: - other: 당신 외 {{count}}ëª…ì´ ì´ ê¸€ì— íˆ¬í‘œí–ˆìŠµë‹ˆë‹¤ + other: "당신 외 {{count}}ëª…ì´ ì¢‹ì•„í•©ë‹ˆë‹¤" by_others: off_topic: - other: '{{count}}ëª…ì´ ì£¼ì œì—서 벗어났다고 신고했습니다' + other: "{{count}}ëª…ì´ ì£¼ì œì—서 벗어났다고 신고했습니다" spam: - other: '{{count}}ëª…ì˜ ìŠ¤íŒ¸ì´ë¼ê³  신고했습니다' + other: "{{count}}ëª…ì˜ ìŠ¤íŒ¸ì´ë¼ê³  신고했습니다" inappropriate: - other: '{{count}}ëª…ì´ ë¶€ì ì ˆí•œ 컨í…츠ë¼ê³  신고했습니다' + other: "{{count}}ëª…ì´ ë¶€ì ì ˆí•œ 컨í…츠ë¼ê³  신고했습니다" notify_moderators: - other: '{{count}}ëª…ì´ ìš´ì˜ìžì—게 알렸습니다' + other: "{{count}}ëª…ì´ ìš´ì˜ìžì—게 알렸습니다" notify_user: - other: '{{count}}ëª…ì´ ê¸€ì“´ì´ì—게 메시지를 보냈습니다' + other: "{{count}}ëª…ì´ ê¸€ì“´ì´ì—게 메시지를 보냈습니다" bookmark: - other: '{{count}}ëª…ì´ ë¶ë§ˆí¬í–ˆìŠµë‹ˆë‹¤' + other: "{{count}}ëª…ì´ ë¶ë§ˆí¬í–ˆìŠµë‹ˆë‹¤" like: - other: '{{count}}ëª…ì´ ì¢‹ì•„í•©ë‹ˆë‹¤' - vote: - other: '{{count}}ëª…ì´ ì´ ê¸€ì— íˆ¬í‘œí–ˆìŠµë‹ˆë‹¤' + other: "{{count}}ëª…ì´ ì¢‹ì•„í•©ë‹ˆë‹¤" merge: confirm: - other: ì •ë§ë¡œ ì´ {{count}}ê°œì˜ ê²Œì‹œê¸€ì„ í•©ì¹ ê¹Œìš”? + other: "ì •ë§ë¡œ ì´ {{count}}ê°œì˜ ê²Œì‹œê¸€ì„ í•©ì¹ ê¹Œìš”?" revisions: controls: first: "ì´ˆíŒ" @@ -1681,7 +1706,6 @@ ko: can: '허용' none: '(카테고리 ì—†ìŒ)' all: '모든 카테고리' - choose: '카테고리를 ì„ íƒí•˜ì„¸ìš”…' edit: '편집' edit_long: "카테고리 편집" view: '카테고리 ì•ˆì˜ ì£¼ì œ 보기' @@ -1728,7 +1752,6 @@ ko: show_subcategory_list: "하위 카테고리 목ë¡ì„ í† í”½ìœ„ì— í‘œì‹œí•˜ê¸°." num_featured_topics: "ì´ ì¹´í…Œê³ ë¦¬ 페ì´ì§€ì— 표시ë˜ëŠ” í† í”½ì˜ ìˆ˜:" subcategory_num_featured_topics: "부모 카테고리 페ì´ì§€ì— 표시ë˜ëŠ” 주요 í† í”½ì˜ ìˆ˜:" - all_topics_wiki: "새로운 토픽 ìƒì„±ì‹œ 위키로 기본설정" subcategory_list_style: "하위 카테고리 ëª©ë¡ ìŠ¤íƒ€ì¼:" sort_order: "ë‹¤ìŒ ê¸°ì¤€ìœ¼ë¡œ 토픽 ëª©ë¡ ì •ë ¬:" default_view: "기본 토픽 목ë¡:" @@ -1737,7 +1760,6 @@ ko: edit_permissions: "권한 수정" add_permission: "권한 추가" this_year: "올해" - position: "위치" default_position: "기본 위치" position_disabled: "카테고리는 활ë™ëŸ‰ì— ë”°ë¼ì„œ 표시ë©ë‹ˆë‹¤. ëª©ë¡ ë‚´ì˜ ì¹´í…Œê³ ë¦¬ 순서를 지정하하려면" position_disabled_click: '"카테고리 위치 ê³ ì •" ì„¤ì •ì„ í™œì„±í™” 시키십시요.' @@ -1798,11 +1820,11 @@ ko: custom_placeholder_notify_moderators: "구체ì ìœ¼ë¡œ 회ì›ë‹˜ì´ 걱정하는 내용과 가능한 모든 ê´€ë ¨ëœ ë§í¬ë¥¼ 제공해주세요." custom_message: at_least: - other: 최소 {{count}}ìž ì´ìƒ 입력하세요 + other: "최소 {{count}}ìž ì´ìƒ 입력하세요" more: - other: '{{count}} 남았습니다' + other: "{{count}} 남았습니다" left: - other: '{{count}} 남았습니다' + other: "{{count}} 남았습니다" flagging_topic: title: "우리 커뮤니티 질서를 ì§€í‚¤ëŠ”ë° ë„와주셔서 ê°ì‚¬í•©ë‹ˆë‹¤!" action: "주제 신고하기" @@ -1813,11 +1835,11 @@ ko: links_title: "ì¸ê¸° ë§í¬" links_shown: "ë” ë§Žì€ ë§í¬ë³´ê¸°..." clicks: - other: '%{count}번 í´ë¦­' + other: "%{count}번 í´ë¦­" post_links: about: "ì´ ê²Œì‹œê¸€ì˜ ë§í¬ ë” ë³´ê¸°" title: - other: '%{count} more' + other: "%{count} more" topic_statuses: warning: help: "ê³µì‹ì ì¸ 주ì˜ìž…니다." @@ -1851,18 +1873,18 @@ ko: original_post: "ì›ë³¸ 글" views: "조회수" views_lowercase: - other: 조회 + other: "조회" replies: "답변" views_long: - other: ì´ í† í”½ì€ {{number}}번 조회ë˜ì—ˆìŠµë‹ˆë‹¤. + other: "ì´ í† í”½ì€ {{number}}번 조회ë˜ì—ˆìŠµë‹ˆë‹¤." activity: "활ë™" likes: "좋아요" likes_lowercase: - other: 좋아요 + other: "좋아요" likes_long: "ì´ ì£¼ì œì— {{number}}ê°œì˜ '좋아요'ê°€ 있습니다." users: "사용ìž" users_lowercase: - other: ì‚¬ìš©ìž + other: "사용ìž" category_title: "카테고리" history: "기ë¡" changed_by: "{{author}}ì— ì˜í•´" @@ -1876,7 +1898,7 @@ ko: latest: title: "최근글" title_with_count: - other: 최근글 ({{count}}) + other: "최근글 ({{count}})" help: "가장 최근 주제" hot: title: "ì¸ê¸° 있는 글" @@ -1894,17 +1916,17 @@ ko: unread: title: "ì½ì§€ ì•Šì€ ê¸€" title_with_count: - other: ì½ì§€ ì•Šì€ ê¸€ ({{count}}) + other: "ì½ì§€ ì•Šì€ ê¸€ ({{count}})" help: "지켜보거나 ì¶”ì  ì¤‘ì¸ ì½ì§€ ì•Šì€ ì£¼ì œ" lower_title_with_count: - other: '{{count}} unread' + other: "{{count}} unread" new: lower_title_with_count: - other: '{{count}} new' + other: "{{count}} new" lower_title: "new" title: "새글" title_with_count: - other: 새글 ({{count}}) + other: "새글 ({{count}})" help: "ë©°ì¹  ë‚´ì— ë§Œë“¤ì–´ì§„ 주제" posted: title: "ë‚´ 글" @@ -1915,7 +1937,7 @@ ko: category: title: "{{categoryName}}" title_with_count: - other: '{{categoryName}} ({{count}})' + other: "{{categoryName}} ({{count}})" help: "{{categoryName}}ì¹´í…Œê³ ë¦¬ì˜ ìµœì‹  주제" top: title: "ì¸ê¸°ê¸€" @@ -2000,18 +2022,18 @@ ko: print: 'ctrl+p 토픽 ì¸ì‡„하기' badges: earned_n_times: - other: ì´ ë°°ì§€ë¥¼ %{count}번 받았습니다 + other: "ì´ ë°°ì§€ë¥¼ %{count}번 받았습니다" granted_on: "%{date} ì— ìˆ˜ì—¬í•¨" others_count: "(%{count})ëª…ì˜ ì‚¬ìš©ìžê°€ ì´ ë°°ì§€ë¥¼ 가지고 있습니다" title: ë°°ì§€ allow_title: "ì´ ë°°ì§€ëŠ” 타ì´í‹€ë¡œ 사용할 수 있습니다" multiple_grant: "ì´ ë°°ì§€ëŠ” 중복해서 ì·¨ë“í•  수 있습니다" badge_count: - other: '%{count}ê°œì˜ ë°°ì§€' + other: "%{count}ê°œì˜ ë°°ì§€" more_badges: - other: +%{count}ê°œ ì´ìƒ + other: "+%{count}ê°œ ì´ìƒ" granted: - other: '%{count}ê°œ 수여ë¨' + other: "%{count}ê°œ 수여ë¨" select_badge_for_title: 타ì´í‹€ë¡œ 사용할 ë°°ì§€ ì„ íƒí•˜ê¸° badge_grouping: getting_started: @@ -2041,7 +2063,7 @@ ko: tags: "태그" delete_tag: "태그 ì‚­ì œ" delete_confirm: - other: ì •ë§ë¡œ ì´ íƒœê·¸ë¥¼ 삭제하고 ì´ íƒœê·¸ê°€ ë¶™ì€ {{count}} ê°œì˜ í† í”½ì—서 태그를 제거할까요? + other: "ì •ë§ë¡œ ì´ íƒœê·¸ë¥¼ 삭제하고 ì´ íƒœê·¸ê°€ ë¶™ì€ {{count}} ê°œì˜ í† í”½ì—서 태그를 제거할까요?" delete_confirm_no_topics: "ì •ë§ë¡œ ì´ íƒœê·¸ë¥¼ 삭제할까요?" rename_tag: "태그 ì´ë¦„변경" rename_instructions: "새로운 íƒœê·¸ì˜ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”:" @@ -2158,6 +2180,7 @@ ko: start_date: "시작ì¼" end_date: "종료ì¼" groups: "모든 그룹" + no_data: "표시할 ì •ë³´ê°€ 없습니다." commits: latest_changes: "최근 변경 사항: ìžì£¼ ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤!" by: "ì— ì˜í•´" @@ -2168,6 +2191,8 @@ ko: topics: "ì‹ ê³ ëœ í† í”½" agree: "ë™ì˜" agree_title: "ì´ ì‹ ê³ ê°€ 올바르고 íƒ€ë‹¹í•¨ì„ í™•ì¸í•©ë‹ˆë‹¤" + agree_flag_hide_post: "í¬ìŠ¤íŠ¸ 숨기기" + ignore_flag: "무시" delete: "ì‚­ì œ" delete_title: "ì‹ ê³ ì—서 ë©˜ì…˜ëœ ê¸€ 삭제하기" delete_post_defer_flag_title: "ê¸€ì„ ì‚­ì œí•˜ê³  첫번째 글ì´ë©´ 주제 삭제하기" @@ -2187,6 +2212,7 @@ ko: dispositions: agreed: "ë™ì˜" disagreed: "반대" + deferred: "무시ë¨" flagged_by: "ì‹ ê³  한 사람" resolved_by: "í•´ê²° by" took_action: "처리하기" @@ -2200,6 +2226,7 @@ ko: was_edited: "첫 ì‹ ê³  ì´í›„ì— ê¸€ì´ ìˆ˜ì •ë˜ì—ˆìŒ" previous_flags_count: "ì´ ê¸€ì€ ì´ë¯¸ {{count}}번 ì´ìƒ ì‹ ê³  ë˜ì—ˆìŠµë‹ˆë‹¤." show_details: "ì‹ ê³ ë‚´ìš© ìžì„¸ížˆ 보기" + details: "ìžì„¸ížˆ" flagged_topics: topic: "토픽" type: "타입" @@ -2212,6 +2239,21 @@ ko: notify_user: "커스텀" notify_moderators: "커스텀" groups: + new: + title: "새 그룹" + create: "ìƒì„±" + name: + too_short: "그룹 ì´ë¦„ì´ ë„ˆë¬´ 짧습니다" + too_long: "그룹 ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤" + available: "사용가능한 그룹 ì´ë¦„" + not_available: "사용 불가능한 그룹 ì´ë¦„" + blank: "그룹 ì´ë¦„ì€ ê³µë°±ì´ ë  ìˆ˜ 없습니다" + manage: + interaction: + email: ì´ë©”ì¼ + membership: + automatic: ìžë™ + trust_level: ì‹ ë¢°ë„ primary: "주 그룹" no_primary: "(주 ê·¸ë£¹ì´ ì—†ìŠµë‹ˆë‹¤.)" title: "그룹" @@ -2226,6 +2268,7 @@ ko: add: "추가" custom: "Custom" automatic: "ìžë™í™”" + default_title: "기본 타ì´í‹€" group_owners: ì†Œìœ ìž add_owners: ì†Œìœ ìž ì¶”ê°€í•˜ê¸° none_selected: "시작할 ê·¸ë£¹ì„ ì„ íƒí•˜ì„¸ìš”" @@ -2293,9 +2336,9 @@ ko: none: "ì—°ê´€ëœ ì´ë²¤íŠ¸ê°€ 없습니다" redeliver: "재발송" incoming: - other: '{{count}}ê°œì˜ ìƒˆë¡œìš´ ì´ë²¤íŠ¸ê°€ 있습니다.' + other: "{{count}}ê°œì˜ ìƒˆë¡œìš´ ì´ë²¤íŠ¸ê°€ 있습니다." completed_in: - other: '{{count}}ì´ˆ í›„ì— ì™„ë£Œë©ë‹ˆë‹¤.' + other: "{{count}}ì´ˆ í›„ì— ì™„ë£Œë©ë‹ˆë‹¤." request: "요청" response: "ì‘답" redeliver_confirm: "ì •ë§ë¡œ ë™ì¼í•œ payload를 재발송하기를 ì›í•˜ì‹­ë‹ˆê¹Œ?" @@ -2346,6 +2389,7 @@ ko: label: "업로드" title: "ë°±ì—…ì„ ì—…ë¡œë“œ" uploading: "업로드 중..." + success: "'{{filename}}'ì´(ê°€) 성공ì ìœ¼ë¡œ 업로드 ë˜ì—ˆìŠµë‹ˆë‹¤. 파ì¼ì€ 처리중ì´ë©° ëª‡ë¶„í›„ì— ë¦¬ìŠ¤íŠ¸ì— ë³´ì—¬ì§‘ë‹ˆë‹¤." error: "'{{filename}}' íŒŒì¼ ì—…ë¡œë“œì¤‘ ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. ({{message}})" operations: is_running: "실행 중입니다." @@ -2438,6 +2482,10 @@ ko: add_upload: "업로드할 íŒŒì¼ ì¶”ê°€í•˜ê¸°" upload_file_tip: "업로드할 íŒŒì¼ ì„ íƒí•˜ê¸°(png, woff2, 기타..)" variable_name: "SCSS 변수 ì´ë¦„:" + variable_name_invalid: "불가능한 변수명입니다. 알파벳만 허용ë˜ë©°, 문ìžë¡œ 시작해야 하며, 반드시 고유해야 합니다." + variable_name_error: + invalid_syntax: "불가능한 변수명입니다. 알파벳만 허용ë˜ë©°, 문ìžë¡œ 시작해야 합니다." + must_be_unique: "불가능한 변수명입니다. 반드시 고유해야 합니다." upload: "업로드" child_themes_check: "다른 ì°¨ì¼ë“œ 테마를 í¬í•¨í•œ 테마" css_html: "커스텀 CSS/HTML" @@ -2448,14 +2496,13 @@ ko: import_file_tip: "테마정보가 있는 .dcstyle.json 파ì¼" about_theme: "테마 ì •ë³´" license: "ë¼ì´ì„¼ìФ ì •ë³´" - component_of: "ì´ í…Œë§ˆëŠ” 다ìŒì— ì†í•œ ì»´í¬ë„ŒíŠ¸ìž…ë‹ˆë‹¤:" update_to_latest: "최신버전으로 ì—…ë°ì´íŠ¸í•˜ê¸°" check_for_updates: "ì—…ë°ì´íЏ ì²´í¬í•˜ê¸°" updating: "ì—…ë°ì´íЏ 중..." up_to_date: "테마가 최신입니다, 마지막으로 ì²´í¬í•œ ì¼ì‹œ:" add: "추가" commits_behind: - other: 테마가 {{count}} ê°œ 커밋 ë’¤ì³ì¡ŒìŠµë‹ˆë‹¤! + other: "테마가 {{count}} ê°œ 커밋 ë’¤ì³ì¡ŒìŠµë‹ˆë‹¤!" scss: text: "CSS" title: "커스텀 CSS를 입력하세요. 형ì‹ì— 맞는 CSS 와 SCSS 스타ì¼ì„ ì§€ì›í•©ë‹ˆë‹¤." @@ -2477,6 +2524,8 @@ ko: body_tag: text: "" title: " 태그 ì „ì— ë“¤ì–´ê°ˆ HTML" + yaml: + text: "YAML" colors: select_base: title: "기본 컬러 schemeì„ ì„ íƒí•˜ì„¸ìš”" @@ -2584,7 +2633,9 @@ ko: address_placeholder: "name@example.com" type_placeholder: "다ì´ì œìŠ¤íŠ¸, 가입..." reply_key_placeholder: "답글 키" - skipped_reason_placeholder: "ì´ìœ " + moderation_history: + actions: + delete_user: "ì‚¬ìš©ìž ì‚­ì œë¨" logs: title: "로그" action: "허용여부" @@ -2695,7 +2746,7 @@ ko: clear_filter: "지우기" show_words: "단어 ë³´ì´ê¸°" word_count: - other: '%{count}ê°œ 단어' + other: "%{count}ê°œ 단어" actions: block: '차단' censor: '가리기' @@ -2736,9 +2787,9 @@ ko: suspect: 'ì˜ì‹¬ìŠ¤ëŸ¬ìš´ 사용ìž' approved: "승ì¸?" approved_selected: - other: 승ì¸í•œ ì‚¬ìš©ìž ({{count}}명) + other: "승ì¸í•œ ì‚¬ìš©ìž ({{count}}명)" reject_selected: - other: 거부한 ì‚¬ìš©ìž ({{count}}명) + other: "거부한 ì‚¬ìš©ìž ({{count}}명)" titles: active: '활ë™ì ì¸ 회ì›' new: '신규회ì›' @@ -2754,9 +2805,9 @@ ko: suspended: 'ì ‘ê·¼ ê¸ˆì§€ëœ ì‚¬ìš©ìžë“¤' suspect: 'ì˜ì‹¬ìŠ¤ëŸ¬ìš´ 사용ìžë“¤' reject_successful: - other: 성공ì ìœ¼ë¡œ ${count}ëª…ì˜ ì‚¬ìš©ìžë¥¼ 거절하였습니다. + other: "성공ì ìœ¼ë¡œ ${count}ëª…ì˜ ì‚¬ìš©ìžë¥¼ 거절하였습니다." reject_failures: - other: '%{count}ëª…ì˜ ì‚¬ìš©ìžë¥¼ ê±°ë¶€í•˜ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤.' + other: "%{count}ëª…ì˜ ì‚¬ìš©ìžë¥¼ ê±°ë¶€í•˜ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." not_verified: "확ì¸ë˜ì§€ 않ì€" check_email: title: "사용ìžì˜ ì´ë©”ì¼ ì£¼ì†Œ 표시" @@ -2822,11 +2873,11 @@ ko: delete_forbidden_because_staff: "ê´€ë¦¬ìž ë° ìš´ì˜ìž ê³„ì •ì€ ì‚­ì œí•  수 없습니다." delete_posts_forbidden_because_staff: "관리ìžì™€ ìš´ì˜ìžì˜ ê¸€ì€ ì‚­ì œí•  수 없습니다." delete_forbidden: - other: 사용ìžê°€ 작성한 ê¸€ì´ ìžˆìœ¼ë©´ 사용ìžë¥¼ ì‚­ì œ í•  수 없습니다. 사용ìžë¥¼ ì‚­ì œ 하기 ì „ì— ì‚¬ìš©ìžê°€ 작성한 ê¸€ì„ ëª¨ë‘ ì‚­ì œí•´ì•¼ 합니다. (%{count}ì¼ ì´ì „ì— ìž‘ì„±í•œ ê¸€ì€ ì‚­ì œí•  수 없습니다.) + other: "사용ìžê°€ 작성한 ê¸€ì´ ìžˆìœ¼ë©´ 사용ìžë¥¼ ì‚­ì œ í•  수 없습니다. 사용ìžë¥¼ ì‚­ì œ 하기 ì „ì— ì‚¬ìš©ìžê°€ 작성한 ê¸€ì„ ëª¨ë‘ ì‚­ì œí•´ì•¼ 합니다. (%{count}ì¼ ì´ì „ì— ìž‘ì„±í•œ ê¸€ì€ ì‚­ì œí•  수 없습니다.)" cant_delete_all_posts: - other: ì „ì²´ê¸€ì„ ì‚­ì œí•  수 없습니다. ëª‡ê°œì˜ ê¸€ì€ %{count}ì¼ ì´ì „ì— ìž‘ì„±ë˜ì—ˆìŠµë‹ˆë‹¤. (The delete_user_max_post_age setting.) + other: "ì „ì²´ê¸€ì„ ì‚­ì œí•  수 없습니다. ëª‡ê°œì˜ ê¸€ì€ %{count}ì¼ ì´ì „ì— ìž‘ì„±ë˜ì—ˆìŠµë‹ˆë‹¤. (The delete_user_max_post_age setting.)" cant_delete_all_too_many_posts: - other: ì´ ì‚¬ìš©ìžëŠ” %{count}ê°œ ì´ìƒ ê¸€ì„ ìž‘ì„±í•˜ì˜€ê¸° ë•Œë¬¸ì— ëª¨ë“  ê¸€ì„ ì‚­ì œ í•  수 없습니다. (delete_all_posts_max 설정참고) + other: "ì´ ì‚¬ìš©ìžëŠ” %{count}ê°œ ì´ìƒ ê¸€ì„ ìž‘ì„±í•˜ì˜€ê¸° ë•Œë¬¸ì— ëª¨ë“  ê¸€ì„ ì‚­ì œ í•  수 없습니다. (delete_all_posts_max 설정참고)" delete_confirm: "ì •ë§ ì´ ì‚¬ìš©ìžë¥¼ 삭제하시겠습니다? 삭제하면 복구 í•  수 없습니다." delete_and_block: "ì´ ì´ë©”ì¼ê³¼ IP주소를 삭제하고 차단하기" delete_dont_block: "삭제만 하기" @@ -2862,7 +2913,7 @@ ko: tl3_requirements: title: "3등급 회ì›ì´ ë˜ê¸° 위한 ìžê²©" table_title: - other: '최근 %{count} ì¼ ê°„:' + other: "최근 %{count} ì¼ ê°„:" value_heading: "ê°’" requirement_heading: "ìžê²©ìš”ê±´" visits: "방문횟수" @@ -3027,7 +3078,7 @@ ko: text: "사ë¼ì§„ ë°°ì§€ ìƒ˜í”Œì´ ìžˆìŠµë‹ˆë‹¤. ë°°ì§€ queryê°€ 존재하지 않는 user ID나 post ID를 반환할 경우 ë°œìƒí•©ë‹ˆë‹¤. 예ìƒí•˜ì§€ 못한 결과를 ì¼ìœ¼í‚¬ 수 있으니 query를 다시 한번 확ì¸í•˜ì„¸ìš”." no_grant_count: "í• ë‹¹ëœ ë°°ì§€ê°€ 없습니다." grant_count: - other: %{count}ê°œì˜ ë°°ì§€ê°€ 할당ë¨. + other: "%{count}ê°œì˜ ë°°ì§€ê°€ 할당ë¨." sample: "샘플:" grant: with: "%{username}" @@ -3094,7 +3145,7 @@ ko: uploading: "업로드 중..." quit: "ì•„ë§ˆë„ ë‹¤ìŒì—" staff_count: - other: 커뮤니티ì—는 ë‹¹ì‹ ì„ í¬í•¨í•œ %{count}ëª…ì˜ ìŠ¤íƒ­ì´ ìžˆìŠµë‹ˆë‹¤. + other: "커뮤니티ì—는 ë‹¹ì‹ ì„ í¬í•¨í•œ %{count}ëª…ì˜ ìŠ¤íƒ­ì´ ìžˆìŠµë‹ˆë‹¤." invites: add_user: "추가" none_added: "관리ìžì—게 초대ë˜ì§€ 않았습니다. 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" diff --git a/config/locales/client.lv.yml b/config/locales/client.lv.yml index a08b942a20..5c0bcf1ab7 100644 --- a/config/locales/client.lv.yml +++ b/config/locales/client.lv.yml @@ -16,9 +16,9 @@ lv: format: '%n %u' units: byte: + zero: baiti one: baits other: baiti - zero: baiti gb: GB kb: KB mb: MB @@ -44,79 +44,79 @@ lv: tiny: half_a_minute: "< 1 m" less_than_x_seconds: - one: < 1 s - other: < %{count} s - zero: < 0 s + zero: "< 0 s" + one: "< 1 s" + other: "< %{count} s" x_seconds: - one: 1 s - other: '%{count} s' - zero: 0 s + zero: "0 s" + one: "1 s" + other: "%{count} s" x_minutes: - one: 1 m - other: '%{count} m' - zero: 0 m + zero: "0 m" + one: "1 m" + other: "%{count} m" about_x_hours: - one: 1 h - other: '%{count} h' - zero: 0 h + zero: "0 h" + one: "1 h" + other: "%{count} h" x_days: - one: 1 d - other: '%{count} d' - zero: 0 d + zero: "0 d" + one: "1 d" + other: "%{count} d" about_x_years: - one: 1 g - other: '%{count} g' - zero: 0 g + zero: "0 g" + one: "1 g" + other: "%{count} g" over_x_years: - one: '> 1 g' - other: '> %{count} g' - zero: '> 0 g' + zero: "> 0 g" + one: "> 1 g" + other: "> %{count} g" almost_x_years: - one: 1 g - other: '%{count} g' - zero: 0 g + zero: "0 g" + one: "1 g" + other: "%{count} g" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 minÅ«tes - other: '%{count} minÅ«tes' - zero: 0 minÅ«tes + zero: "0 minÅ«tes" + one: "1 minÅ«tes" + other: "%{count} minÅ«tes" x_hours: - one: 1 stunda - other: '%{count} stundas' - zero: 0 stundas + zero: "0 stundas" + one: "1 stunda" + other: "%{count} stundas" x_days: - one: 1 diena - other: '%{count} dienas' - zero: 0 dienas + zero: "0 dienas" + one: "1 diena" + other: "%{count} dienas" date_year: "D MMM, YYYY" medium_with_ago: x_minutes: - one: pirms 1 minÅ«tes - other: pirms %{count} minÅ«tÄ“m - zero: pirms 0 minÅ«tÄ“m + zero: "pirms 0 minÅ«tÄ“m" + one: "pirms 1 minÅ«tes" + other: "pirms %{count} minÅ«tÄ“m" x_hours: - one: pirms 1 stundas - other: pirms %{count} stundÄm - zero: pirms 0 stundÄm + zero: "pirms 0 stundÄm" + one: "pirms 1 stundas" + other: "pirms %{count} stundÄm" x_days: - one: pirms 1 dienas - other: pirms %{count} dienÄm - zero: pirms 0 dienÄm + zero: "pirms 0 dienÄm" + one: "pirms 1 dienas" + other: "pirms %{count} dienÄm" later: x_days: - one: pÄ“c 1 dienas - other: pÄ“c %{count} dienÄm - zero: pÄ“c 0 dienÄm + zero: "pÄ“c 0 dienÄm" + one: "pÄ“c 1 dienas" + other: "pÄ“c %{count} dienÄm" x_months: - one: pÄ“c 1 mÄ“neÅ¡a - other: pÄ“c %{count} mÄ“neÅ¡iem - zero: pÄ“c 0 mÄ“neÅ¡iem + zero: "pÄ“c 0 mÄ“neÅ¡iem" + one: "pÄ“c 1 mÄ“neÅ¡a" + other: "pÄ“c %{count} mÄ“neÅ¡iem" x_years: - one: pÄ“c 1 gada - other: pÄ“c %{count} gadiem - zero: pÄ“c 0 gadiem + zero: "pÄ“c 0 gadiem" + one: "pÄ“c 1 gada" + other: "pÄ“c %{count} gadiem" previous_month: 'Iepriekšējais mÄ“nesis' next_month: 'NÄkamais mÄ“nesis' placeholder: datums @@ -195,14 +195,14 @@ lv: show_help: "iespÄ“jas" links: "Saites" links_lowercase: - one: saite - other: saites - zero: saite + zero: "saite" + one: "saite" + other: "saites" faq: "BUJ" guidelines: "VadlÄ«nijas" privacy_policy: "PrivÄtuma politika" privacy: "PrivÄtums" - terms_of_service: "Pakalpojuma noteikumi" + tos: "Pakalpojuma noteikumi" mobile_view: "Mobilais skats" desktop_view: "Datora skats" you: "Tu" @@ -221,9 +221,9 @@ lv: max_of_count: "ne vairÄk kÄ {{count}}" alternation: "vai" character_count: - one: '{{count}} zÄ«me' - other: '{{count}} zÄ«mes' - zero: '{{count}} zÄ«mes' + zero: "{{count}} zÄ«mes" + one: "{{count}} zÄ«me" + other: "{{count}} zÄ«mes" suggested_topics: title: "IeteiktÄs tÄ“mas" pm_title: "IeteiktÄs ziņas" @@ -290,18 +290,18 @@ lv: cancel: "Atcelt" view_pending: "aplÅ«kot vÄ“l nepÄrbaudÄ«tos ierakstus" has_pending_posts: - one: Å ai tÄ“mÄ ir {{count}} ieraksts, kurÅ¡ gaida apstiprinÄjumu - other: Å ai tÄ“mÄ ir {{count}} ieraksti, kuri gaida apstiprinÄjumu - zero: Å ai tÄ“mÄ nav ierakstu, kuri gaida apstiprinÄjumu + zero: "Å ai tÄ“mÄ nav ierakstu, kuri gaida apstiprinÄjumu" + one: "Å ai tÄ“mÄ ir {{count}} ieraksts, kurÅ¡ gaida apstiprinÄjumu" + other: "Å ai tÄ“mÄ ir {{count}} ieraksti, kuri gaida apstiprinÄjumu" confirm: "SaglabÄt izmaiņas" delete_prompt: "Vai tieÅ¡Äm vÄ“laties dzÄ“st %{username}? Tas izdzÄ“sÄ«s visus lietotÄja ierakstus un bloÄ·Ä“s e-pastu un IP adresi." approval: title: "Ieraksts gaida apstiprinÄjumu" description: "MÄ“s saņēmÄm jÅ«su ierakstu, taÄu vispirms to jÄapstiprina moderatoram. LÅ«dzu, esiet pacietÄ«gi." pending_posts: - one: Å ai tÄ“mÄ ir 1 ieraksts, kurÅ¡ gaida apstiprinÄjumu. - other: Å ai temÄ ir {{count}} ieraksti, kuri gaida apstiprinÄjumu. - zero: Å ai tÄ“mÄ nav ierakstu, kuri gaida gaida apstiprinÄjumu. + zero: "Å ai tÄ“mÄ nav ierakstu, kuri gaida gaida apstiprinÄjumu." + one: "Å ai tÄ“mÄ ir 1 ieraksts, kurÅ¡ gaida apstiprinÄjumu." + other: "Å ai temÄ ir {{count}} ieraksti, kuri gaida apstiprinÄjumu." ok: "OK" user_action: user_posted_topic: "{{user}} pievienoja ierakstus tÄ“mai" @@ -335,9 +335,9 @@ lv: posts_read: "LasÄ«ts" posts_read_long: "LasÄ«tie ieraksti" total_rows: - one: 1 lietotÄjs - other: '%{count} lietotÄji' - zero: Nav lietotÄju + zero: "Nav lietotÄju" + one: "1 lietotÄjs" + other: "%{count} lietotÄji" group_histories: actions: change_group_setting: "MainÄ«t grupas iestatÄ«jumus" @@ -422,8 +422,6 @@ lv: reorder: title: "PÄrkÄrtot sadaļas" title_long: "PÄrkÄrtot sadaļu sarakstu" - fix_order: "NofiksÄ“t pozÄ«cijas" - fix_order_tooltip: "Ne visÄm kategorijÄm ir unikÄls pozÄ«cijas numurs, un tas var izraisÄ«t negaidÄ«tus rezultÄtus." save: "SaglabÄt kÄrtÄ«bu" apply_all: "Pielietot" position: "PozÄ«cija" @@ -434,13 +432,13 @@ lv: toggle_ordering: "mainÄ«t secÄ«bas kontroli" subcategories: "ApakÅ¡sadaļas" topic_sentence: - one: 1 tÄ“ma - other: '%{count} tÄ“mas' - zero: Nav tÄ“mu + zero: "Nav tÄ“mu" + one: "1 tÄ“ma" + other: "%{count} tÄ“mas" topic_stat_sentence: - one: '%{count} jauna tÄ“ma pÄ“dÄ“jÄ %{unit}.' - other: '%{count} jaunas tÄ“mas pÄ“dÄ“jÄ %{unit}.' - zero: Nav jaunu tÄ“mu. + zero: "Nav jaunu tÄ“mu." + one: "%{count} jauna tÄ“ma pÄ“dÄ“jÄ %{unit}." + other: "%{count} jaunas tÄ“mas pÄ“dÄ“jÄ %{unit}." ip_lookup: title: IP adreses meklēšana hostname: Resursdatora nosaukums @@ -589,7 +587,6 @@ lv: error: "Mainot Å¡o vÄ“rtÄ«bu, notika kļūda." change_username: title: "MainÄ«t lietotÄjvÄrdu" - confirm: "Ja jÅ«s nomainÄ«siet jÅ«su lietotÄjvÄrdu, visi iepriekšējie ierakstu citÄti un jÅ«su @vÄrda pieminēšanas vairs nedarbosies. Vai esat pavisam droÅ¡i, ka to vÄ“laties?" taken: "Atvainojiet, Å¡is lietotÄjvÄrds ir aizņemts." invalid: "Å is lietotÄjvÄrds ir nederÄ«gs. Izmantojiet tikai ciparus un burtus" change_email: @@ -608,7 +605,6 @@ lv: upload_title: "AugÅ¡upielÄdÄ“t savu attÄ“lu" upload_picture: "AugÅ¡upielÄdÄ“t attÄ“lu" image_is_not_a_square: "UzmanÄ«bu: mÄ“s apgriezÄm jÅ«su attÄ“lu; platums un augstums nebija vienÄdi." - cache_notice: "JÅ«s veiksmÄ«gi nomainÄ«jÄt savu profila attÄ“lu, bet var paiet kÄds laiks, lÄ«dz tas parÄdÄ«sies, pÄrlÅ«kprogrammas keÅ¡oÅ¡anas dēļ." change_profile_background: title: "Profila fons" instructions: "Profila fons bÅ«s centrÄ“ts un ar noklusÄ“juma platumu 850px." @@ -623,9 +619,9 @@ lv: authenticated: "JÅ«su e-pastu autentificÄ“ja {{provider}}" frequency_immediately: "MÄ“s nekavÄ“joties sÅ«tÄ«sim jums epastu par jaunÄm neizlasÄ«tÄm ziņÄm." frequency: - one: MÄ“s sÅ«tÄ«sim jums e-pastu tikai tad, ja nebÅ«sim jÅ«s redzÄ“juÅ¡i pÄ“dÄ“jÄs minÅ«tes laikÄ. - other: MÄ“s sÅ«tÄ«sim jums e-pastu tikai tad, ja nebÅ«sim jÅ«s redzÄ“juÅ¡i pÄ“dÄ“jo {{count}} minūšu laikÄ. - zero: MÄ“s sÅ«tÄ«sim jums e-pastu tikai tad, ja nebÅ«sim jÅ«s redzÄ“juÅ¡i pÄ“dÄ“jo {{count}} minūšu laikÄ. + zero: "MÄ“s sÅ«tÄ«sim jums e-pastu tikai tad, ja nebÅ«sim jÅ«s redzÄ“juÅ¡i pÄ“dÄ“jo {{count}} minūšu laikÄ." + one: "MÄ“s sÅ«tÄ«sim jums e-pastu tikai tad, ja nebÅ«sim jÅ«s redzÄ“juÅ¡i pÄ“dÄ“jÄs minÅ«tes laikÄ." + other: "MÄ“s sÅ«tÄ«sim jums e-pastu tikai tad, ja nebÅ«sim jÅ«s redzÄ“juÅ¡i pÄ“dÄ“jo {{count}} minūšu laikÄ." name: title: "VÄrds" instructions: "jÅ«su pilnais vÄrds (neobligÄti)" @@ -710,9 +706,9 @@ lv: user: "IelÅ«gtie lietotÄji" sent: "NosÅ«tÄ«ts" truncated: - one: Pirmais ielÅ«gums. - other: Pirmie {{count}} ielÅ«gumi. - zero: Nav ielÅ«gumu. + zero: "Nav ielÅ«gumu." + one: "Pirmais ielÅ«gums." + other: "Pirmie {{count}} ielÅ«gumi." redeemed: "Pieņemtie ielÅ«gumi" redeemed_tab: "Pieņemti" redeemed_tab_with_count: "Pieņemti ({{count}})" @@ -758,25 +754,25 @@ lv: stats: "Statistika" time_read: "lasīšanas laiks" topic_count: - one: viena tÄ“ma izveidota - other: izveidotÄs tÄ“mas - zero: nav izveidotu tÄ“mu + zero: "nav izveidotu tÄ“mu" + one: "viena tÄ“ma izveidota" + other: "izveidotÄs tÄ“mas" post_count: - one: ieraksts izveidots - other: izveidotie ieraksti - zero: ierakstu izveidoti + zero: "ierakstu izveidoti" + one: "ieraksts izveidots" + other: "izveidotie ieraksti" days_visited: - one: ' apmeklÄ“ta diena' - other: apmeklÄ“juma dienas - zero: apmeklÄ“tas dienas + zero: "apmeklÄ“tas dienas" + one: " apmeklÄ“ta diena" + other: "apmeklÄ“juma dienas" posts_read: - one: ieraksts izlasÄ«ts - other: izlasÄ«tie ieraksti - zero: ierakstu izlasÄ«ti + zero: "ierakstu izlasÄ«ti" + one: "ieraksts izlasÄ«ts" + other: "izlasÄ«tie ieraksti" bookmark_count: - one: atzÄ«me - other: grÄmatzÄ«mes - zero: atzÄ«mes + zero: "atzÄ«mes" + one: "atzÄ«me" + other: "grÄmatzÄ«mes" top_replies: "LabÄkÄs atbildes" no_replies: "VÄ“l nav atbilžu." more_replies: "VairÄk atbilžu" @@ -792,7 +788,6 @@ lv: most_liked_users: "VisvairÄk atzinÄ«bu" most_replied_to_users: "VisvairÄk atbildÄ“ja" no_likes: "PagaidÄm atzinÄ«bu nav." - associated_accounts: "PieslÄ“gÅ¡anÄs" ip_address: title: "PÄ“dÄ“jÄ IP adrese" registration_ip_address: @@ -844,9 +839,9 @@ lv: reached: "%{relativeAge} – %{rate} sasniegts vietnes limits %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} pÄrsniegts vietnes limits %{siteSettingRate}." rate: - one: '%{count} kļūda/%{duration}' - other: '%{count} kļūdas/%{duration}' - zero: nav kļūdu + zero: "nav kļūdu" + one: "%{count} kļūda/%{duration}" + other: "%{count} kļūdas/%{duration}" learn_more: "uzzinÄt vairÄk..." all_time: 'kopÄ' all_time_desc: 'pavisam izveidotas tÄ“mas' @@ -862,16 +857,14 @@ lv: unmute: PÄrtraukt klusinÄÅ¡anu last_reply_lowercase: pÄ“dÄ“jÄ atbilde replies_lowercase: + zero: atbildes one: atbilde other: atbildes - zero: atbildes signup_cta: sign_up: "PierakstÄ«ties" hide_session: "AtgÄdinÄt man rÄ«t" hide_forever: "nÄ“, paldies" hidden_for_session: "Labi, pajautÄÅ¡u jums rÄ«t. Starp citu, vienmÄ“r var piereÄ£istrÄ“ties, spiežot \"Ieiet sistÄ“mÄ\"." - intro: "Hei! :heart_eyes: Å Ä·iet, jums patÄ«k diskusija, bet jums vÄ“l nav profila." - value_prop: "Kad esat izveidojuÅ¡i profilu, mÄ“s precÄ«zi atceramies, cik tÄlu esat lasÄ«juÅ¡i, tÄpÄ“c jÅ«s vienmÄ“r varat turpinÄt no turienes, kur pÄrtraucÄt. JÅ«s arÄ« saņemsiet paziņojumus Å¡eit un e-pastÄ, kad tiks izveidoti jauni ieraksti. Un jÅ«s varat izteikt atzinÄ«bu ierakstiem, lai atbalstÄ«tu autoru. :heartbeat:" summary: enabled_description: "JÅ«s skatÄties šīs tÄ“mas kopsavilkumu: paÅ¡us interesantÄkos ierakstus, pÄ“c kopienas domÄm." description: "Ir {{replyCount}} atbildes." @@ -885,7 +878,6 @@ lv: disable: "RÄdÄ«t dzÄ“stos ierakstus" private_message_info: title: "Ziņa" - invite: "IelÅ«gt citus..." remove_allowed_user: "Vai jÅ«s tieÅ¡Äm gribat dzÄ“st {{name}} no šīs ziņas?" remove_allowed_group: "Vai jÅ«s tieÅ¡Äm gribat dzÄ“st {{name}} no šīs ziņas?" email: 'E-pasts' @@ -942,9 +934,6 @@ lv: preferences: "Jums ir jÄieiet, lai izmainÄ«tu savus iestatÄ«jumus." forgot: "Es nevaru atcerÄ“ties sava konta informÄciju." not_approved: "JÅ«su konts vÄ“l nav apstiprinÄts. Jums tiks paziņots e-pastÄ, kad varÄ“siet pieslÄ“gties." - google: - title: "ar Google." - message: "AutorizēšanÄs ar Google (pÄrliecinieties, ka nav bloÄ·Ä“ti uznirstoÅ¡ie logi)" google_oauth2: title: "ar Google" message: "AutorizēšanÄs ar Google (pÄrliecinieties, ka nav bloÄ·Ä“ti uznirstoÅ¡ie logi)" @@ -1026,9 +1015,9 @@ lv: similar_topics: "JÅ«su tÄ“ma ir lÄ«dzÄ«ga..." drafts_offline: "lokÄls melnraksts" group_mentioned: - one: Pieminot {{group}}, Å¡is cilvÄ“ks saņems paziņojumu – esat pÄrliecinÄti? - other: Pieminot {{group}}, Å¡iem {{count}} cilvÄ“ki saņems paziņojumu – esat pÄrliecinÄti? - zero: Pieminot {{group}}, neviens nesaņems paziņojumu, jo grupa ir tukÅ¡a. + zero: "Pieminot {{group}}, neviens nesaņems paziņojumu, jo grupa ir tukÅ¡a." + one: "Pieminot {{group}}, Å¡is cilvÄ“ks saņems paziņojumu – esat pÄrliecinÄti?" + other: "Pieminot {{group}}, Å¡iem {{count}} cilvÄ“ki saņems paziņojumu – esat pÄrliecinÄti?" cannot_see_mention: category: "JÅ«s pieminÄ“jÄt {{username}}, kas ir bez piekļuves Å¡ai sadaļai un tÄpÄ“c nesaņems nekÄdu paziņojumu. Lai to izlabotu, pievieno viņus grupai ar pieeju Å¡ai sadaļai." private: "JÅ«su pieminÄ“jÄt {{username}}, kas neredzÄ“s Å¡o privÄto ziņu un tÄpÄ“c nesaņems nekÄdu paziņojumu. Lai to izlabotu, pievieno viņus Å¡ai ziņai." @@ -1201,9 +1190,9 @@ lv: notification_level: "Paziņojumi" choose_new_category: "IzvÄ“lÄ“ties jaunu sadaļu šīm tÄ“mÄm:" selected: - one: JÅ«s izvÄ“lÄ“jÄties 1. tÄ“mu. - other: JÅ«s izvÄ“lÄ“jÄties {{count}} tÄ“mas. - zero: JÅ«s izvÄ“lÄ“jÄties 0. tÄ“mas. + zero: "JÅ«s izvÄ“lÄ“jÄties 0. tÄ“mas." + one: "JÅ«s izvÄ“lÄ“jÄties 1. tÄ“mu." + other: "JÅ«s izvÄ“lÄ“jÄties {{count}} tÄ“mas." change_tags: "Aizvietot tagus" append_tags: "Pievienot tagus" choose_new_tags: "IzvÄ“lÄ“ties jaunus tagus šīm tÄ“mÄm:" @@ -1236,9 +1225,9 @@ lv: search: "Nekas netika atrasts." topic: filter_to: - one: 1 ziņa tÄ“mÄ - other: '{{count}} ziņas tÄ“mÄ' - zero: tÄ“mÄ ziņu nav + zero: "tÄ“mÄ ziņu nav" + one: "1 ziņa tÄ“mÄ" + other: "{{count}} ziņas tÄ“mÄ" create: 'Jauna tÄ“ma' create_long: 'Izveidot jaunu tÄ“mu ' private_message: 'RakstÄ«t ziņu ' @@ -1252,13 +1241,13 @@ lv: new: 'Jauna tÄ“ma' unread: 'nelasÄ«ti' new_topics: - one: 1 jauna tÄ“ma + zero: 'Jaunu tÄ“mu nav' + one: '1 jauna tÄ“ma' other: '{{count}} jaunas tÄ“mas ' - zero: Jaunu tÄ“mu nav unread_topics: - one: 1 nelasÄ«ta tÄ“ma + zero: 'NelasÄ«tu tÄ“mu nav' + one: '1 nelasÄ«ta tÄ“ma' other: '{{count}} nelasÄ«tas tÄ“mas' - zero: NelasÄ«tu tÄ“mu nav title: 'TÄ“ma' invalid_access: title: "Å Ä« tÄ“ma ir privÄta " @@ -1271,21 +1260,21 @@ lv: title: "TÄ“ma nav atrasta " description: "Atvainojiet, Å¡o tÄ“mu neatradÄm. VarbÅ«t to noņēma moderators? " total_unread_posts: - one: Tev Å¡ajÄ tÄ“mÄ ir 1 neizlasÄ«ts ziņojums - other: 'Tev Å¡ajÄ tÄ“mÄ ir {{count}} neizlasÄ«tu ziņojumu ' - zero: Tev Å¡ajÄ tÄ“mÄ nav neizlasÄ«tu ziņojumu + zero: "Tev Å¡ajÄ tÄ“mÄ nav neizlasÄ«tu ziņojumu" + one: "Tev Å¡ajÄ tÄ“mÄ ir 1 neizlasÄ«ts ziņojums" + other: "Tev Å¡ajÄ tÄ“mÄ ir {{count}} neizlasÄ«tu ziņojumu " unread_posts: - one: Tev Å¡ajÄ tÄ“mÄ ir 1 vecs neizlasÄ«ts ziņojums - other: 'Tev Å¡ajÄ tÄ“mÄ ir {{count}} vecu neizlasÄ«tu ziņojumu. ' - zero: Tev Å¡ajÄ tÄ“mÄ nav vecu neizlasÄ«tu ziņojumu + zero: "Tev Å¡ajÄ tÄ“mÄ nav vecu neizlasÄ«tu ziņojumu" + one: "Tev Å¡ajÄ tÄ“mÄ ir 1 vecs neizlasÄ«ts ziņojums" + other: "Tev Å¡ajÄ tÄ“mÄ ir {{count}} vecu neizlasÄ«tu ziņojumu. " new_posts: - one: Å ajÄ tÄ“mÄ ir 1 jauns nelasÄ«ts ziņojums - other: Å ajÄ tÄ“mÄ ir {{count}} jauni nelasÄ«ti ziņojumi - zero: Å ajÄ tÄ“mÄ nav jaunu nelasÄ«tu ziņojumu + zero: "Å ajÄ tÄ“mÄ nav jaunu nelasÄ«tu ziņojumu" + one: "Å ajÄ tÄ“mÄ ir 1 jauns nelasÄ«ts ziņojums" + other: "Å ajÄ tÄ“mÄ ir {{count}} jauni nelasÄ«ti ziņojumi" likes: - one: Å ai tÄ“mai ir viens "patÄ«k" - other: Å ai tÄ“mÄ ir {{count}} atzinÄ«bas - zero: Å ai tÄ“mai nav "patÄ«k" + zero: "Å ai tÄ“mai nav \"patÄ«k\"" + one: "Å ai tÄ“mai ir viens \"patÄ«k\"" + other: "Å ai tÄ“mÄ ir {{count}} atzinÄ«bas" back_to_list: "Atpakaļ pie tÄ“mu saraksta " options: "TÄ“mas iestatÄ«jumi " show_links: "rÄdÄ«t saites Å¡ajÄ tÄ“mÄ" @@ -1340,9 +1329,9 @@ lv: auto_reminder: "Jums atgÄdinÄs par Å¡o tÄ“mu pÄ“c %{timeLeft}." auto_close_title: 'AutomÄtiskÄs slÄ“gÅ¡anas iestatÄ«jumi' auto_close_immediate: - one: PÄ“dÄ“jais ieraksts tÄ“mÄ ir 1 stundu vecs, tÄpÄ“c tÄ“ma tiks slÄ“gta nekavÄ“joties. - other: PÄ“dÄ“jais ieraksts tÄ“mÄ ir %{count} stundas vecs, tÄpÄ“c tÄ“ma tiks slÄ“gta nekavÄ“joties. - zero: PÄ“dÄ“jais ieraksts tÄ“mÄ ir %{count} stundas vecs, tÄpÄ“c tÄ“ma tiks slÄ“gta nekavÄ“joties. + zero: "PÄ“dÄ“jais ieraksts tÄ“mÄ ir %{count} stundas vecs, tÄpÄ“c tÄ“ma tiks slÄ“gta nekavÄ“joties." + one: "PÄ“dÄ“jais ieraksts tÄ“mÄ ir 1 stundu vecs, tÄpÄ“c tÄ“ma tiks slÄ“gta nekavÄ“joties." + other: "PÄ“dÄ“jais ieraksts tÄ“mÄ ir %{count} stundas vecs, tÄpÄ“c tÄ“ma tiks slÄ“gta nekavÄ“joties." timeline: back: "Atpakaļ" back_description: "Atgriezties pie pÄ“dÄ“jÄ nelasÄ«tÄ ieraksta" @@ -1449,9 +1438,9 @@ lv: pin_validation: "Lai piespraustu Å¡o tÄ“mu, ir nepiecieÅ¡ams datums." not_pinned: "SadaÄ¼Ä {{categoryLink}} nav piespraustu tÄ“mu." already_pinned: - one: SadaÄ¼Ä {{categoryLink}} Å¡obrÄ«d piesprausta {{count}} tÄ“ma - other: SadaÄ¼Ä {{categoryLink}} Å¡obrÄ«d piespraustas {{count}} tÄ“mas - zero: SadaÄ¼Ä {{categoryLink}} Å¡obrÄ«d nav piespraustu tÄ“mu + zero: "SadaÄ¼Ä {{categoryLink}} Å¡obrÄ«d nav piespraustu tÄ“mu" + one: "SadaÄ¼Ä {{categoryLink}} Å¡obrÄ«d piesprausta {{count}} tÄ“ma" + other: "SadaÄ¼Ä {{categoryLink}} Å¡obrÄ«d piespraustas {{count}} tÄ“mas" pin_globally: "Likt Å¡ai tÄ“mai parÄdÄ«ties visu tÄ“mu sarakstu augÅ¡galos lÄ«dz" confirm_pin_globally: "Jums jau ir {{count}} globÄli piespraustas tÄ“mas. PÄrÄk daudz piespraustu tÄ“mu ir apgrÅ«tinÄjums jauniem un anonÄ«miem lietotÄjiem. Vai jÅ«s esat droÅ¡s, ka vÄ“laties globÄli piespraust vÄ“l vienu tÄ“mu." unpin_globally: "Noņemt Å¡o tÄ“mu no visu tÄ“mu sarakstu augÅ¡galiem." @@ -1459,9 +1448,9 @@ lv: global_pin_note: "LietotÄji var atspraust tÄ“mu, katrs sev personÄ«gi." not_pinned_globally: "Nav nevienas globÄli piespraustas tÄ“mas." already_pinned_globally: - one: Å obrÄ«d globÄli piesprausta 1 tÄ“ma - other: Å obrÄ«d globÄli piespraustas {{count}} tÄ“mas - zero: Å obrÄ«d globÄli piespraustas {{count}} tÄ“mas + zero: "Å obrÄ«d globÄli piespraustas {{count}} tÄ“mas" + one: "Å obrÄ«d globÄli piesprausta 1 tÄ“ma" + other: "Å obrÄ«d globÄli piespraustas {{count}} tÄ“mas" make_banner: "PÄrveidot Å¡o tÄ“mu par baneri, kas parÄdÄ«sies visu lapu augÅ¡pusÄ“." remove_banner: "Noņemt baneri, kas parÄdÄs visu lapu augÅ¡pusÄ“." banner_note: "LietotÄji var noņemt baneri, aizverot to. JebkurÄ brÄ«dÄ« tikai viena tÄ“ma var bÅ«t par baneri." @@ -1498,9 +1487,9 @@ lv: login_reply: 'Lai atbildÄ“tu, ienÄc forumÄ' filters: n_posts: - one: 1 ieraksts - other: '{{count}} ieraksti' - zero: '{{count}} ieraksti' + zero: "{{count}} ieraksti" + one: "1 ieraksts" + other: "{{count}} ieraksti" cancel: "Noņemt filtru" split_topic: title: "PÄrvietot uz jaunu tÄ“mu" @@ -1508,17 +1497,17 @@ lv: topic_name: "JaunÄs tÄ“mas nosaukums" error: "PÄrvietojot ierakstus uz jauno tÄ“mu, notika kļūda." instructions: - one: JÅ«s tÅ«lÄ«t izveidosiet jaunu tÄ“mu ar izvÄ“lÄ“to ierakstu. - other: JÅ«s tÅ«lÄ«t izveidosiet jaunu tÄ“mu un aizpildÄ«siet to ar {{count}} izvÄ“lÄ“tajiem ierakstiem. - zero: JÅ«s tÅ«lÄ«t izveidosiet jaunu tÄ“mu bez ierakstiem. + zero: "JÅ«s tÅ«lÄ«t izveidosiet jaunu tÄ“mu bez ierakstiem." + one: "JÅ«s tÅ«lÄ«t izveidosiet jaunu tÄ“mu ar izvÄ“lÄ“to ierakstu." + other: "JÅ«s tÅ«lÄ«t izveidosiet jaunu tÄ“mu un aizpildÄ«siet to ar {{count}} izvÄ“lÄ“tajiem ierakstiem." merge_topic: title: "PÄrvietot uz esoÅ¡u tÄ“mu" action: "pÄrvietot uz esoÅ¡u tÄ“mu" error: "PÄrvietojot ierakstus uz Å¡o tÄ“mu, notika kļūda." instructions: - one: LÅ«dzu izvÄ“lieties tÄ“mu, uz kuru vÄ“laties pÄrvietot Å¡o ierakstu. - other: LÅ«dzu izvÄ“lieties tÄ“mu, uz kuru vÄ“laties pÄrvietot Å¡os {{count}} ierakstus. - zero: LÅ«dzu izvÄ“lieties tÄ“mu, uz kuru vÄ“laties pÄrvietot Å¡os ierakstus. + zero: "LÅ«dzu izvÄ“lieties tÄ“mu, uz kuru vÄ“laties pÄrvietot Å¡os ierakstus." + one: "LÅ«dzu izvÄ“lieties tÄ“mu, uz kuru vÄ“laties pÄrvietot Å¡o ierakstu." + other: "LÅ«dzu izvÄ“lieties tÄ“mu, uz kuru vÄ“laties pÄrvietot Å¡os {{count}} ierakstus." merge_posts: title: "Apvienot izvÄ“lÄ“tos ierakstus" action: "apvienot izvÄ“lÄ“tos ierakstus" @@ -1530,9 +1519,9 @@ lv: label: "Jaunais ierakstu Ä«paÅ¡nieks" placeholder: "jaunÄ Ä«paÅ¡nieka lietotÄjvÄrds" instructions: - one: LÅ«dzu, izvÄ“lieties jauno Ä«paÅ¡nieku {{old_user}} ierakstam. - other: LÅ«dzu, izvÄ“lieties jauno Ä«paÅ¡nieku {{count}} {{old_user}} ierakstiem. - zero: LÅ«dzu, izvÄ“lieties jauno Ä«paÅ¡nieku {{old_user}} ierakstiem. + zero: "LÅ«dzu, izvÄ“lieties jauno Ä«paÅ¡nieku {{old_user}} ierakstiem." + one: "LÅ«dzu, izvÄ“lieties jauno Ä«paÅ¡nieku {{old_user}} ierakstam." + other: "LÅ«dzu, izvÄ“lieties jauno Ä«paÅ¡nieku {{count}} {{old_user}} ierakstiem." change_timestamp: title: "NomainÄ«t laika zÄ«mogu..." action: "nomainÄ«t laika zÄ«mogu" @@ -1547,9 +1536,9 @@ lv: select_all: izvÄ“lÄ“ties visu deselect_all: visiem noņemt izvÄ“li description: + zero: "JÅ«s esat izvÄ“lÄ“jies 0 ierakstu." one: JÅ«s esat izvÄ“lÄ“jies 1 ierakstu. - other: JÅ«s esat izvÄ“lÄ“jies {{count}} ierakstus. - zero: JÅ«s esat izvÄ“lÄ“jies 0 ierakstu. + other: "JÅ«s esat izvÄ“lÄ“jies {{count}} ierakstus." post: quote_reply: "CitÄts" edit_reason: "Iemesls:" @@ -1563,32 +1552,32 @@ lv: show_full: "ParÄdÄ«t visu ierakstu" show_hidden: 'SkatÄ«t slÄ“pto saturu.' deleted_by_author: - one: (autors atcÄ“lis ierakstu, tas tiks automÄtiski dzÄ“sts pÄ“c %{count} stundas, ja neviens nav ziņojis par to) - other: (autors atcÄ“lis ierakstu, tas tiks automÄtiski dzÄ“sts pÄ“c %{count} stundÄm, ja neviens nav ziņojis par to) - zero: (autors atcÄ“lis ierakstu, tas tiks automÄtiski dzÄ“sts pÄ“c %{count} stundÄm, ja neviens nav ziņojis par to) + zero: "(autors atcÄ“lis ierakstu, tas tiks automÄtiski dzÄ“sts pÄ“c %{count} stundÄm, ja neviens nav ziņojis par to)" + one: "(autors atcÄ“lis ierakstu, tas tiks automÄtiski dzÄ“sts pÄ“c %{count} stundas, ja neviens nav ziņojis par to)" + other: "(autors atcÄ“lis ierakstu, tas tiks automÄtiski dzÄ“sts pÄ“c %{count} stundÄm, ja neviens nav ziņojis par to)" expand_collapse: "paplaÅ¡inÄt/minimizÄ“t" gap: - one: aplÅ«jot 1 slÄ“pto atbildi - other: aplÅ«kot {{count}} slÄ“ptÄs atbildes - zero: apslÄ“pt {{count}} slÄ“ptÄs atbildes + zero: "apslÄ“pt {{count}} slÄ“ptÄs atbildes" + one: "aplÅ«jot 1 slÄ“pto atbildi" + other: "aplÅ«kot {{count}} slÄ“ptÄs atbildes" unread: "Ieraksts nav lasÄ«ts" has_replies: - one: '{{count}} atbilde' - other: '{{count}} atbildes' - zero: '{{count}} atbildes' + zero: "{{count}} atbildes" + one: "{{count}} atbilde" + other: "{{count}} atbildes" has_likes: - one: '{{count}} atzinÄ«ba' - other: '{{count}} atzinÄ«bas' - zero: '{{count}} atzinÄ«bas' + zero: "{{count}} atzinÄ«bas" + one: "{{count}} atzinÄ«ba" + other: "{{count}} atzinÄ«bas" has_likes_title: - one: 1 cilvÄ“kam patika Å¡is ieraksts - other: '{{count}} cilvÄ“kiem patika Å¡is ieraksts' - zero: '{{count}} cilvÄ“kiem patika Å¡is ieraksts' + zero: "{{count}} cilvÄ“kiem patika Å¡is ieraksts" + one: "1 cilvÄ“kam patika Å¡is ieraksts" + other: "{{count}} cilvÄ“kiem patika Å¡is ieraksts" has_likes_title_only_you: "jums patika Å¡is ieraksts" has_likes_title_you: - one: jums un 1 citam cilvÄ“kam patika Å¡is ieraksts - other: jums un {{count}} citiem cilvÄ“kiem patika Å¡is ieraksts - zero: jums patika Å¡is ieraksts + zero: "jums patika Å¡is ieraksts" + one: "jums un 1 citam cilvÄ“kam patika Å¡is ieraksts" + other: "jums un {{count}} citiem cilvÄ“kiem patika Å¡is ieraksts" errors: create: "Atvainojiet, izveidojot jÅ«su ierakstu, notika kļūda. LÅ«dzu, mēģiniet vÄ“lreiz." edit: "Atvainojiet, rediģējot jÅ«su ierakstu, notika kļūda. LÅ«dzu, mēģiniet vÄ“lreiz." @@ -1641,7 +1630,6 @@ lv: inappropriate: "Atcelt ziņoÅ¡anu" bookmark: "Atcelt grÄmatzÄ«mi" like: "Atcelt atzinÄ«bu" - vote: "Atcelt nobalsoÅ¡anu" people: off_topic: "ziņot par Å¡o kÄ novirzīšanos no tÄ“mas" spam: "ziņot par Å¡o kÄ spamu" @@ -1650,7 +1638,6 @@ lv: notify_user: "nosÅ«tÄ«ja ziņu" bookmark: "pievienoja grÄmatzÄ«mÄ“m" like: "izteica atzinÄ«bu par Å¡o" - vote: "nobalsoja par Å¡o" by_you: off_topic: "JÅ«s ziņojÄt par Å¡o kÄ novirzīšanos no tÄ“mas" spam: "JÅ«s ziņojÄt par Å¡o kÄ spamu" @@ -1659,78 +1646,69 @@ lv: notify_user: "JÅ«s nosÅ«tÄ«jÄt ziņu Å¡im lietotÄjam" bookmark: "JÅ«s pievienojÄt Å¡o ierakstu grÄmatzÄ«mÄ“m" like: "JÅ«s izteicÄt atzinÄ«bu Å¡im" - vote: "JÅ«s nobalsojÄt par Å¡o ierakstu" by_you_and_others: off_topic: - one: JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas - other: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas - zero: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas + zero: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas" + one: "JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas" + other: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas" spam: - one: JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o kÄ spamu - other: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ spamu - zero: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ spamu + zero: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ spamu" + one: "JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o kÄ spamu" + other: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ spamu" inappropriate: - one: JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o kÄ nepiedienÄ«gu - other: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu - zero: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu + zero: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu" + one: "JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o kÄ nepiedienÄ«gu" + other: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu" notify_moderators: - one: JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o moderÄcijai - other: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o moderÄcijai - zero: JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o moderÄcijai + zero: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o moderÄcijai" + one: "JÅ«s un 1 cits cilvÄ“ks ziņoja par Å¡o moderÄcijai" + other: "JÅ«s un {{count}} citi cilvÄ“ki ziņoja par Å¡o moderÄcijai" notify_user: - one: JÅ«s un 1 cits cilvÄ“ks nosÅ«tÄ«ja ziņu Å¡im lietotÄjam - other: JÅ«s un {{count}} citi cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam - zero: JÅ«s un {{count}} citi cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam + zero: "JÅ«s un {{count}} citi cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam" + one: "JÅ«s un 1 cits cilvÄ“ks nosÅ«tÄ«ja ziņu Å¡im lietotÄjam" + other: "JÅ«s un {{count}} citi cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam" bookmark: - one: JÅ«s un 1 cits cilvÄ“ks pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m - other: JÅ«s un {{count}} citi cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m - zero: JÅ«s un {{count}} citi cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m + zero: "JÅ«s un {{count}} citi cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m" + one: "JÅ«s un 1 cits cilvÄ“ks pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m" + other: "JÅ«s un {{count}} citi cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m" like: - one: JÅ«s un 1 citam cilvÄ“kam patika Å¡is - other: JÅ«s un {{count}} citiem cilvÄ“kiem patika Å¡is - zero: JÅ«s un {{count}} citiem cilvÄ“kiem patika Å¡is - vote: - one: JÅ«s un 1 cits cilvÄ“ks nobalsoja par Å¡o ierakstu - other: JÅ«s un {{count}} citi cilvÄ“ki nobalsoja par Å¡o ierakstu - zero: JÅ«s un {{count}} citi cilvÄ“ki nobalsoja par Å¡o ierakstu + zero: "JÅ«s un {{count}} citiem cilvÄ“kiem patika Å¡is" + one: "JÅ«s un 1 citam cilvÄ“kam patika Å¡is" + other: "JÅ«s un {{count}} citiem cilvÄ“kiem patika Å¡is" by_others: off_topic: - one: 1 cilvÄ“ks ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas - other: '{{count}} cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas' - zero: '{{count}} cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas' + zero: "{{count}} cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas" + one: "1 cilvÄ“ks ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas" + other: "{{count}} cilvÄ“ki ziņoja par Å¡o kÄ novirzīšanos no tÄ“mas" spam: - one: 1 cilvÄ“ks ziņoja par Å¡o kÄ spamu - other: '{{count}} cilvÄ“ki ziņoja par Å¡o kÄ spamu' - zero: '{{count}} cilvÄ“ki ziņoja par Å¡o kÄ spamu' + zero: "{{count}} cilvÄ“ki ziņoja par Å¡o kÄ spamu" + one: "1 cilvÄ“ks ziņoja par Å¡o kÄ spamu" + other: "{{count}} cilvÄ“ki ziņoja par Å¡o kÄ spamu" inappropriate: - one: 1 cilvÄ“ks ziņoja par Å¡o kÄ nepiedienÄ«gu - other: '{{count}} cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu' - zero: '{{count}} cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu' + zero: "{{count}} cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu" + one: "1 cilvÄ“ks ziņoja par Å¡o kÄ nepiedienÄ«gu" + other: "{{count}} cilvÄ“ki ziņoja par Å¡o kÄ nepiedienÄ«gu" notify_moderators: - one: 1 cilvÄ“ks ziņoja par Å¡o moderÄcijai - other: '{{count}} cilvÄ“ki ziņoja par Å¡o moderÄcijai' - zero: '{{count}} cilvÄ“ki ziņoja par Å¡o moderÄcijai' + zero: "{{count}} cilvÄ“ki ziņoja par Å¡o moderÄcijai" + one: "1 cilvÄ“ks ziņoja par Å¡o moderÄcijai" + other: "{{count}} cilvÄ“ki ziņoja par Å¡o moderÄcijai" notify_user: - one: 1 cilvÄ“ks nosÅ«tÄ«ja ziņu Å¡im lietotÄjam - other: '{{count}} cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam' - zero: '{{count}} cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam' + zero: "{{count}} cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam" + one: "1 cilvÄ“ks nosÅ«tÄ«ja ziņu Å¡im lietotÄjam" + other: "{{count}} cilvÄ“ki nosÅ«tÄ«ja ziņu Å¡im lietotÄjam" bookmark: - one: 1 cilvÄ“ks pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m - other: '{{count}} cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m' - zero: '{{count}} cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m' + zero: "{{count}} cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m" + one: "1 cilvÄ“ks pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m" + other: "{{count}} cilvÄ“ki pievienoja Å¡o ierakstu grÄmatzÄ«mÄ“m" like: - one: 1 cilvÄ“kam patika Å¡is - other: '{{count}} cilvÄ“kiem patika Å¡is' - zero: '{{count}} cilvÄ“kiem patika Å¡is' - vote: - one: 1 cilvÄ“ks balsoja par Å¡o ierakstu - other: '{{count}} cilvÄ“ki balsoja par Å¡o ierakstu' - zero: '{{count}} cilvÄ“ki balsoja par Å¡o ierakstu' + zero: "{{count}} cilvÄ“kiem patika Å¡is" + one: "1 cilvÄ“kam patika Å¡is" + other: "{{count}} cilvÄ“kiem patika Å¡is" merge: confirm: - one: Vai jÅ«s esat droÅ¡s, ka vÄ“laties apvienot Å¡os ierakstus? - other: Vai jÅ«s esat droÅ¡s, ka vÄ“laties apvienot Å¡os {{count}} ierakstus? - zero: Vai jÅ«s esat droÅ¡s, ka vÄ“laties apvienot Å¡os {{count}} ierakstus? + zero: "Vai jÅ«s esat droÅ¡s, ka vÄ“laties apvienot Å¡os {{count}} ierakstus?" + one: "Vai jÅ«s esat droÅ¡s, ka vÄ“laties apvienot Å¡os ierakstus?" + other: "Vai jÅ«s esat droÅ¡s, ka vÄ“laties apvienot Å¡os {{count}} ierakstus?" revisions: controls: first: "PirmÄ versija" @@ -1762,7 +1740,6 @@ lv: can: 'var…' none: '(nav sadaļas)' all: 'Visas sadaļas' - choose: 'IzvÄ“lÄ“ties sadaļu…' edit: 'rediģēt' edit_long: "Rediģēt" view: 'AplÅ«kot sadaļas ierakstus' @@ -1803,7 +1780,6 @@ lv: email_in_disabled: "Jaunu tÄ“mu ievietoÅ¡ana, izmantojot e-pastu, ir atcelta foruma iestatÄ«jumos. Lai atļautu ievietot jaunas tÄ“mas, izmantojot e-pastu," show_subcategory_list: "RÄdÄ«t apakÅ¡sadaļu sarakstu virs tÄ“mÄm Å¡ai sadaļÄ." num_featured_topics: "Sadaļu lapÄ parÄdÄ«to tÄ“mu skaits:" - all_topics_wiki: "PÄrveidot jaunÄs tÄ“mas par wiki pÄ“c noklusÄ“juma." subcategory_list_style: "ApakÅ¡sadaļu saraksta stils:" sort_order: "KÄrtot tÄ“mu sarakstu pÄ“c:" default_view: "NoklusÄ“juma tÄ“mu saraksts:" @@ -1812,7 +1788,6 @@ lv: edit_permissions: "MainÄ«t atļaujas" add_permission: "Pievienot atļauju" this_year: "Å¡ogad" - position: "pozÄ«cija" default_position: "NoklusÄ“tÄ pozÄ«cija" position_disabled: "Sadaļas tiks sakÄrtotas pÄ“c aktivitÄtes. Lai kontrolÄ“tu sadaļu secÄ«bu sarakstos," position_disabled_click: 'ieslÄ“gt iestatÄ«jumu "fiksÄ“tas sadaļu pozÄ«cijas".' @@ -1872,17 +1847,17 @@ lv: custom_placeholder_notify_moderators: "Ä»aujiet mums uzzinÄt, kÄdu problÄ“mu saredzat, un sniedziet bÅ«tiskÄs saites un piemÄ“rus, ja iespÄ“jams." custom_message: at_least: - one: ievadiet vismaz 1 simbolu - other: ievadiet vismaz {{count}} simbolus - zero: ievadiet vismaz {{count}} simbolus + zero: "ievadiet vismaz {{count}} simbolus" + one: "ievadiet vismaz 1 simbolu" + other: "ievadiet vismaz {{count}} simbolus" more: - one: vÄ“l 1 - other: vÄ“l {{count}}... - zero: vÄ“l {{count}}... + zero: "vÄ“l {{count}}..." + one: "vÄ“l 1" + other: "vÄ“l {{count}}..." left: - one: palicis 1 - other: palikuÅ¡i {{count}} - zero: palikuÅ¡i {{count}} + zero: "palikuÅ¡i {{count}}" + one: "palicis 1" + other: "palikuÅ¡i {{count}}" flagging_topic: title: "Paldies, ka palÄ«dzat uzturÄ“t mÅ«su forumu civilizÄ“tu!" action: "Ziņot par tÄ“mu" @@ -1893,14 +1868,14 @@ lv: links_title: "PopulÄras saites" links_shown: "parÄdÄ«t papildus saites..." clicks: - one: 1 klikšķis - other: '%{count} klikšķi' - zero: '%{count} klikšķi' + zero: "%{count} klikšķi" + one: "1 klikšķis" + other: "%{count} klikšķi" post_links: title: - one: vÄ“l 1 - other: vÄ“l %{count} - zero: vÄ“l %{count} + zero: "vÄ“l %{count}" + one: "vÄ“l 1" + other: "vÄ“l %{count}" topic_statuses: warning: help: "Å is ir oficiÄls brÄ«dinÄjums." @@ -1934,26 +1909,26 @@ lv: original_post: "OriÄ£inÄlais ieraksts" views: "SkatÄ«jumi" views_lowercase: - one: skatÄ«jums - other: skatÄ«jumi - zero: skatÄ«jumi + zero: "skatÄ«jumi" + one: "skatÄ«jums" + other: "skatÄ«jumi" replies: "Atbildes" views_long: - one: Å¡o tÄ“mu ir apskatÄ«juÅ¡i 1 reizi - other: Å¡o tÄ“mu ir apskatÄ«juÅ¡i {{number}} reizes - zero: Å¡o tÄ“mu ir apskatÄ«juÅ¡i {{number}} reizes + zero: "Å¡o tÄ“mu ir apskatÄ«juÅ¡i {{number}} reizes" + one: "Å¡o tÄ“mu ir apskatÄ«juÅ¡i 1 reizi" + other: "Å¡o tÄ“mu ir apskatÄ«juÅ¡i {{number}} reizes" activity: "AktivitÄte" likes: "PatÄ«k" likes_lowercase: - one: atzinÄ«ba - other: atzinÄ«bas - zero: atzinÄ«bas + zero: "atzinÄ«bas" + one: "atzinÄ«ba" + other: "atzinÄ«bas" likes_long: "Å¡ajÄ tÄ“mÄ ir {{number}} atzinÄ«bas" users: "LietotÄji" users_lowercase: - one: lietotÄjs - other: lietotÄji - zero: lietotÄji + zero: "lietotÄji" + one: "lietotÄjs" + other: "lietotÄji" category_title: "Sadaļa" history: "VÄ“sture" changed_by: "{{author}}" @@ -1967,9 +1942,9 @@ lv: latest: title: "PÄ“dÄ“jie" title_with_count: - one: PÄ“dÄ“jais (1) - other: PÄ“dÄ“jie ({{count}}) - zero: PÄ“dÄ“jie ({{count}}) + zero: "PÄ“dÄ“jie ({{count}})" + one: "PÄ“dÄ“jais (1)" + other: "PÄ“dÄ“jie ({{count}})" help: "tÄ“mas ar neseniem ierakstiem" hot: title: "PopulÄrs" @@ -1987,25 +1962,25 @@ lv: unread: title: "NelasÄ«ts" title_with_count: - one: NelasÄ«ts (1) - other: NelasÄ«ti ({{count}}) - zero: NelasÄ«ti ({{count}}) + zero: "NelasÄ«ti ({{count}})" + one: "NelasÄ«ts (1)" + other: "NelasÄ«ti ({{count}})" help: "tÄ“mas, kuras novÄ“rojat vai kurÄm sekojat, ar nelasÄ«tiem ierakstiem" lower_title_with_count: - one: 1 nelasÄ«ta - other: '{{count}} nelasÄ«tas' - zero: '{{count}} nelasÄ«tas' + zero: "{{count}} nelasÄ«tas" + one: "1 nelasÄ«ta" + other: "{{count}} nelasÄ«tas" new: lower_title_with_count: - one: 1 jauna - other: '{{count}} jaunas' - zero: '{{count}} jaunas' + zero: "{{count}} jaunas" + one: "1 jauna" + other: "{{count}} jaunas" lower_title: "jaunie" title: "Jaunie" title_with_count: - one: Jauns (1) - other: Jaunie ({{count}}) - zero: Jaunie ({{count}}) + zero: "Jaunie ({{count}})" + one: "Jauns (1)" + other: "Jaunie ({{count}})" help: "pÄ“dÄ“jÄs dažÄs dienÄs izveidotÄs tÄ“mas" posted: title: "Mani ieraksti" @@ -2016,9 +1991,9 @@ lv: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' - zero: '{{categoryName}} ({{count}})' + zero: "{{categoryName}} ({{count}})" + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "pÄ“dÄ“jÄs tÄ“mas sadaÄ¼Ä {{categoryName}}" top: title: "PopulÄrÄkÄs" @@ -2101,22 +2076,22 @@ lv: print: 'ctrl+p DrukÄt tÄ“mu' badges: earned_n_times: - one: NopelnÄ«ja Å¡o žetonu 1 reizi - other: NopelnÄ«ja Å¡o žetonu %{count} reizes - zero: NopelnÄ«ja Å¡o žetonu %{count} reizes + zero: "NopelnÄ«ja Å¡o žetonu %{count} reizes" + one: "NopelnÄ«ja Å¡o žetonu 1 reizi" + other: "NopelnÄ«ja Å¡o žetonu %{count} reizes" granted_on: "Piešķirts %{date}" others_count: "Citi ar Å¡o žetonu (%{count})" title: Žetoni allow_title: "JÅ«s varat izmantot Å¡o žetonu kÄ titulu" multiple_grant: "JÅ«s esat nopelnÄ«jis Å¡o vairÄkkÄrt" badge_count: - one: 1 žetons - other: '%{count} žetoni' - zero: '%{count} žetoni' + zero: "%{count} žetoni" + one: "1 žetons" + other: "%{count} žetoni" granted: - one: 1 piešķirts - other: '%{count} piešķirti' - zero: '%{count} piešķirti' + zero: "%{count} piešķirti" + one: "1 piešķirts" + other: "%{count} piešķirti" select_badge_for_title: "IzvÄ“lieties žetonu, ko lietot kÄ jÅ«su titulu" badge_grouping: getting_started: @@ -2360,13 +2335,13 @@ lv: none: "Nav saistÄ«tu notikumu." redeliver: "AtkÄrtot piegÄdi" incoming: - one: Ir viens jauns notikums. - other: Ir {{count}} notikumi. - zero: Ir {{count}} jauni notikumi. + zero: "Ir {{count}} jauni notikumi." + one: "Ir viens jauns notikums." + other: "Ir {{count}} notikumi." completed_in: - one: Pabeigts 1 sekundÄ“. - other: Pabeigts {{count}} sekundÄ“s. - zero: Pabeigts {{count}} sekundÄ“s. + zero: "Pabeigts {{count}} sekundÄ“s." + one: "Pabeigts 1 sekundÄ“." + other: "Pabeigts {{count}} sekundÄ“s." request: "PieprasÄ«jums" response: "Atbilde" body: "Ķermenis" @@ -2504,7 +2479,6 @@ lv: import_file_tip: ".dcstyle.json fails, kas satur dizainu" about_theme: "Par dizainu" license: "Licence" - component_of: "TÄ“ma ir sastÄvdaļa:" update_to_latest: "AtjauninÄt uz pÄ“dÄ“jo" check_for_updates: "PÄrbaudÄ«t, vai nav atjauninÄjumi" updating: "Atjaunina..." @@ -2576,7 +2550,6 @@ lv: address_placeholder: "VÄrds@epasts.lv" type_placeholder: "apkopojums, reÄ£istrÄcija ..." reply_key_placeholder: "atbildes atslÄ“ga" - skipped_reason_placeholder: "iemesls" logs: title: "ŽurnÄls" action: "DarbÄ«ba" @@ -2687,9 +2660,9 @@ lv: clear_filter: "NotÄ«rÄ«t" show_words: "parÄdÄ«t vÄrdus" word_count: - one: 1 vÄrds - other: '%{count} vÄrdi' - zero: '%{count} vÄrdi' + zero: "%{count} vÄrdi" + one: "1 vÄrds" + other: "%{count} vÄrdi" actions: block: 'BloÄ·Ä“t' censor: 'CenzÄ“t' @@ -2728,13 +2701,13 @@ lv: suspect: 'NovÄ“rot' approved: "ApstiprinÄt?" approved_selected: - one: ApstiprinÄt lietotÄju - other: ApstiprinÄt lietotÄjus ({{count}}) - zero: ApstiprinÄt lietotÄju + zero: "ApstiprinÄt lietotÄju" + one: "ApstiprinÄt lietotÄju" + other: "ApstiprinÄt lietotÄjus ({{count}})" reject_selected: - one: Atteikt lietotÄju - other: Atteikt lietotÄjus ({{count}}) - zero: Atteikt lietotÄju + zero: "Atteikt lietotÄju" + one: "Atteikt lietotÄju" + other: "Atteikt lietotÄjus ({{count}})" titles: active: 'AktÄ«vi lietotÄji' new: 'Jauni lietotÄji' @@ -2750,13 +2723,13 @@ lv: suspended: 'Atceltie lietotÄji' suspect: 'NovÄ“roti (suspect) lietotÄji' reject_successful: - one: VeiksmÄ«gi atteikts 1 lietotÄjs. - other: VeiksmÄ«gi atteikts %{count} lietotÄjs. - zero: VeiksmÄ«gi atteikts 1 lietotÄjs. + zero: "VeiksmÄ«gi atteikts 1 lietotÄjs." + one: "VeiksmÄ«gi atteikts 1 lietotÄjs." + other: "VeiksmÄ«gi atteikts %{count} lietotÄjs." reject_failures: - one: NeizdevÄs atteikt 1 lietotÄju. - other: NeizdevÄs atteikt %{count} lietotÄjus. - zero: NeizdevÄs atteikt 1 lietotÄju. + zero: "NeizdevÄs atteikt 1 lietotÄju." + one: "NeizdevÄs atteikt 1 lietotÄju." + other: "NeizdevÄs atteikt %{count} lietotÄjus." not_verified: "Nav apstiprinÄts" check_email: title: "AtklÄt šī lietotÄja e-pasta adresi" @@ -2816,17 +2789,17 @@ lv: delete_forbidden_because_staff: "Administratori un moderatori nevar tikt dzÄ“sti." delete_posts_forbidden_because_staff: "Nevar izdzÄ“st visus administratoru un moderatoru ierakstus." delete_forbidden: - one: LietotÄji nevar tikt dzÄ“sti ja viņiem ir ieraksti. IzdzÄ“s visus ierakstus pirms dzÄ“s lietotÄju. (ieraksti vecÄki kÄ %{count} dienas nevar tikt izdzÄ“sti.) - other: LietotÄji nevar tikt dzÄ“sti ja viņiem ir ieraksti. IzdzÄ“s visus ierakstus pirms dzÄ“s lietotÄju. (ieraksti vecÄki kÄ %{count} dienas nevar tikt izdzÄ“sti.) - zero: LietotÄji nevar tikt dzÄ“sti ja viņiem ir ieraksti. IzdzÄ“s visus ierakstus pirms dzÄ“s lietotÄju. (ieraksti vecÄki kÄ %{count} dienas nevar tikt izdzÄ“sti.) + zero: "LietotÄji nevar tikt dzÄ“sti ja viņiem ir ieraksti. IzdzÄ“s visus ierakstus pirms dzÄ“s lietotÄju. (ieraksti vecÄki kÄ %{count} dienas nevar tikt izdzÄ“sti.)" + one: "LietotÄji nevar tikt dzÄ“sti ja viņiem ir ieraksti. IzdzÄ“s visus ierakstus pirms dzÄ“s lietotÄju. (ieraksti vecÄki kÄ %{count} dienas nevar tikt izdzÄ“sti.)" + other: "LietotÄji nevar tikt dzÄ“sti ja viņiem ir ieraksti. IzdzÄ“s visus ierakstus pirms dzÄ“s lietotÄju. (ieraksti vecÄki kÄ %{count} dienas nevar tikt izdzÄ“sti.)" cant_delete_all_posts: - one: Nevar izdzÄ“st visus ierakstus. Daži ieraksti ir vecÄki kÄ %{count} dienas. (The delete_user_max_post_age setting.) - other: Nevar izdzÄ“st visus ierakstus. Daži ieraksti ir vecÄki kÄ %{count} dienas. (The delete_user_max_post_age setting.) - zero: Nevar izdzÄ“st visus ierakstus. Daži ieraksti ir vecÄki kÄ %{count} dienas. (The delete_user_max_post_age setting.) + zero: "Nevar izdzÄ“st visus ierakstus. Daži ieraksti ir vecÄki kÄ %{count} dienas. (The delete_user_max_post_age setting.)" + one: "Nevar izdzÄ“st visus ierakstus. Daži ieraksti ir vecÄki kÄ %{count} dienas. (The delete_user_max_post_age setting.)" + other: "Nevar izdzÄ“st visus ierakstus. Daži ieraksti ir vecÄki kÄ %{count} dienas. (The delete_user_max_post_age setting.)" cant_delete_all_too_many_posts: - one: Nevar dzÄ“st visus ierakstus jo lietotÄjam ir vairÄk kÄ 1 ieraksts. (delete_all_posts_max) - other: Nevar dzÄ“st visus ierakstus jo lietotÄjam ir vairÄk kÄ %{count} ieraksti. (delete_all_posts_max) - zero: Nevar dzÄ“st visus ierakstus jo lietotÄjam ir vairÄk kÄ 1 ieraksts. (delete_all_posts_max) + zero: "Nevar dzÄ“st visus ierakstus jo lietotÄjam ir vairÄk kÄ 1 ieraksts. (delete_all_posts_max)" + one: "Nevar dzÄ“st visus ierakstus jo lietotÄjam ir vairÄk kÄ 1 ieraksts. (delete_all_posts_max)" + other: "Nevar dzÄ“st visus ierakstus jo lietotÄjam ir vairÄk kÄ %{count} ieraksti. (delete_all_posts_max)" delete_confirm: "Vai esi droÅ¡s, ka vÄ“lies dzÄ“st Å¡o lietotÄju? Å is ir neatgriezeniski." delete_and_block: "DzÄ“st un bloÄ·Ä“t e-pastu un IP adresi" delete_dont_block: "Tikai DzÄ“st" @@ -2862,9 +2835,9 @@ lv: tl3_requirements: title: "PrasÄ«bas uzticÄ«bas 3. lÄ«menim" table_title: - one: 'PÄ“dÄ“jÄ dienÄ:' - other: 'PÄ“dÄ“jÄs %{count} dienÄs:' - zero: 'PÄ“dÄ“jÄ dienÄ:' + zero: "PÄ“dÄ“jÄ dienÄ:" + one: "PÄ“dÄ“jÄ dienÄ:" + other: "PÄ“dÄ“jÄs %{count} dienÄs:" value_heading: "VÄ“rtÄ«ba" requirement_heading: "PrasÄ«bas" visits: "ApmeklÄ“jumi" @@ -3029,9 +3002,9 @@ lv: 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: "Nav peišķiramu žetonu." grant_count: - one: %{count} Žetons nav piešķirts. - other: %{count} Žetoni nav piešķirti. - zero: %{count} Žetons nav piešķirts. + zero: "%{count} Žetons nav piešķirts." + one: "%{count} Žetons nav piešķirts." + other: "%{count} Žetoni nav piešķirti." sample: "Paraugs:" grant: with: "%{username}" diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index 2b2fc3e3be..a4022d3794 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -43,68 +43,68 @@ nb_NO: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1t - other: '%{count}t' + one: "1t" + other: "%{count}t" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" x_months: - one: 1mnd - other: '%{count}mnd' + one: "1mnd" + other: "%{count}mnd" about_x_years: - one: 1Ã¥r - other: '%{count}Ã¥r' + one: "1Ã¥r" + other: "%{count}Ã¥r" over_x_years: - one: '> 1Ã¥r' - other: '> %{count}Ã¥r' + one: "> 1Ã¥r" + other: "> %{count}Ã¥r" almost_x_years: - one: 1Ã¥r - other: '%{count}Ã¥r' + one: "1Ã¥r" + other: "%{count}Ã¥r" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 minutt - other: '%{count} minutter' + one: "1 minutt" + other: "%{count} minutter" x_hours: - one: 1 time - other: '%{count} timer' + one: "1 time" + other: "%{count} timer" x_days: - one: 1 dag - other: '%{count} dager' + one: "1 dag" + other: "%{count} dager" date_year: "D. MMM, 'YY" medium_with_ago: x_minutes: - one: 1 minutt siden - other: '%{count} minutter siden' + one: "1 minutt siden" + other: "%{count} minutter siden" x_hours: - one: 1 time siden - other: '%{count} timer siden' + one: "1 time siden" + other: "%{count} timer siden" x_days: - one: 1 dag siden - other: '%{count} dager siden' + one: "1 dag siden" + other: "%{count} dager siden" later: x_days: - one: 1 dag senere - other: '%{count} dager senere' + one: "1 dag senere" + other: "%{count} dager senere" x_months: - one: 1 mÃ¥ned senere - other: '%{count} mÃ¥neder senere' + one: "1 mÃ¥ned senere" + other: "%{count} mÃ¥neder senere" x_years: - one: 1 Ã¥r senere - other: '%{count} Ã¥r senere' + one: "1 Ã¥r senere" + other: "%{count} Ã¥r senere" previous_month: 'Forrige mÃ¥ned' next_month: 'Neste mÃ¥ned' placeholder: dato @@ -125,6 +125,7 @@ nb_NO: user_left: "%{who} fjernet seg selv fra denne meldingen %{when}" removed_user: "fjernet %{who} %{when}" removed_group: "fjernet %{who} %{when}" + autobumped: "automatisk løftet %{when}" autoclosed: enabled: 'lukket %{when}' disabled: 'Ã¥pnet %{when}' @@ -164,6 +165,7 @@ nb_NO: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Irland)" eu_west_2: "EU (London)" + eu_west_3: "EU (Paris)" sa_east_1: "Asia/Stillehavsregionen (Sao Paulo)" us_east_1: "USA øst (N. Virginia)" us_east_2: "USA øst (Ohio)" @@ -187,13 +189,13 @@ nb_NO: show_help: "alternativer" links: "Lenker" links_lowercase: - one: link - other: lenker + one: "link" + other: "lenker" faq: "O-S-S" guidelines: "Retningslinjer" privacy_policy: "Personvernerklæring" privacy: "Personvern" - terms_of_service: "BruksvilkÃ¥r" + tos: "BruksvilkÃ¥r" mobile_view: "Mobilvisning" desktop_view: "Skrivebordsvisning" you: "Du" @@ -212,8 +214,8 @@ nb_NO: max_of_count: "maksimum av {{count}}" alternation: "eller" character_count: - one: '{{count}} tegn' - other: '{{count}} tegn' + one: "{{count}} tegn" + other: "{{count}} tegn" suggested_topics: title: "Anbefalte emner" pm_title: "Anbefalte meldinger" @@ -247,15 +249,21 @@ nb_NO: last_read: "dette er det siste innlegget du har lest; klikk for Ã¥ bokmerke det" remove: "Fjern bokmerke" confirm_clear: "Er du sikker pÃ¥ at du vil fjerne alle bokmerkene fra dette emnet?" + drafts: + resume: "Fortsett" + remove: "Fjern" + new_topic: "Nytt emneutkast" + new_private_message: "Nytt privat emneutkast" + topic_reply: "Svarutkast" topic_count_latest: - one: Se {{count}} nytt eller oppdatert emne - other: Se {{count}} nye eller oppdaterte emner + one: "Se {{count}} nytt eller oppdatert emne" + other: "Se {{count}} nye eller oppdaterte emner" topic_count_unread: - one: Se {{count}} ulest emne - other: Se {{count}} uleste emner + one: "Se {{count}} ulest emne" + other: "Se {{count}} uleste emner" topic_count_new: - one: Se {{count}} nytt emne - other: Se {{count}} nye emner + one: "Se {{count}} nytt emne" + other: "Se {{count}} nye emner" preview: "forhÃ¥ndsvisning" cancel: "avbryt" save: "Lagre endringer" @@ -293,16 +301,16 @@ nb_NO: cancel: "Avbryt" view_pending: "vis ventende innlegg" has_pending_posts: - one: Dette emnet har 1 innlegg som venter pÃ¥ godkjenning - other: Dette emnet har {{count}} innlegg som venter pÃ¥ godkjenning + one: "Dette emnet har 1 innlegg som venter pÃ¥ godkjenning" + other: "Dette emnet har {{count}} innlegg som venter pÃ¥ godkjenning" confirm: "Lagre endringer" delete_prompt: "Er du sikker pÃ¥ at du ønsker Ã¥ slette %{username}? Dette vil fjerne alle innlegg og blokkere e-post- og IP-addressen til vedkommende." approval: title: "Innlegg trenger godkjenning" description: "Vi har mottatt ditt nye innlegg men det krever godkjenning av en moderator før det vises. Ha tÃ¥lmod." pending_posts: - one: Du har 1 innlegg som venter pÃ¥ godkjenning. - other: Du har {{count}} innlegg som venter pÃ¥ godkjenning. + one: "Du har 1 innlegg som venter pÃ¥ godkjenning." + other: "Du har {{count}} innlegg som venter pÃ¥ godkjenning." ok: "OK" user_action: user_posted_topic: "{{user}} opprettet emnet" @@ -336,8 +344,8 @@ nb_NO: posts_read: "Lest" posts_read_long: "Innlegg lest" total_rows: - one: 1 bruker - other: '%{count} brukere' + one: "1 bruker" + other: "%{count} brukere" group_histories: actions: change_group_setting: "Endre gruppeinnstillinger" @@ -422,8 +430,8 @@ nb_NO: is_group_user: "Medlem" is_group_owner: "Eier" title: - one: Gruppe - other: Grupper + one: "Gruppe" + other: "Grupper" activity: "Aktivitet" members: title: "Medlemmer" @@ -486,17 +494,16 @@ nb_NO: "12": "Sendte elementer" "13": "Innboks" "14": "Venter" + "15": "Utkast" categories: all: "Alle" - all_subcategories: "alle i %{categoryName}" + all_subcategories: "alle" no_subcategory: "ingen" category: "Kategori" category_list: "Vis kategoriliste" reorder: title: "Endre rekkefølge pÃ¥ kategorier" title_long: "Reorganiser kategorilisten" - fix_order: "LÃ¥s posisjoner" - fix_order_tooltip: "Ikke alle kategoriene har et unikt posisjonsnummer. Det kan gi uventede resultater." save: "Lagre Rekkefølge" apply_all: "Bruk" position: "Posisjon" @@ -507,11 +514,12 @@ nb_NO: toggle_ordering: "SlÃ¥ pÃ¥/av styring av sortering" subcategories: "Underkategorier" topic_sentence: - one: 1 emne - other: '%{count} emner' + one: "1 emne" + other: "%{count} emner" topic_stat_sentence: - one: '%{count} nytt emne de siste %{unit}.' - other: '%{count} nye emner de siste %{unit}.' + one: "%{count} nytt emne de siste %{unit}." + other: "%{count} nye emner de siste %{unit}." + more: "(%{count} til) ..." ip_lookup: title: SlÃ¥ opp IP-adresse hostname: Vertsnavn @@ -668,9 +676,23 @@ nb_NO: set_password: "Sett passord" choose_new: "Velg et nytt passord" choose: "Velg et passord" + second_factor_backup: + title: "Tofaktor Nødkoder" + regenerate: "Regenerer" + disable: "Deaktiver" + enable: "Aktiver" + enable_long: "Aktiver nødkoder" + manage: "Behandle nødkoder" + copied_to_clipboard: "Kopiert til Utklippstavlen" + copy_to_clipboard_error: "Feil ved kopiering til Utklippstavlen" + remaining_codes: "Du har {{count}} nødkoder igjen." + codes: + title: "Nødkoder Opprettet" + description: "Hver av nødkodene kan kun brukes en gang. Oppbevar dem et trygt men tilgjengelig sted." second_factor: title: "Totrinnsverifisering" disable: "Skru av totrinnsverifisering" + enable: "Aktiver tofaktorautentisering for Ã¥ øke kontosikkerheten" confirm_password_description: "Bekreft passordet ditt for Ã¥ fortsette" label: "Kode" enable_description: | @@ -685,7 +707,7 @@ nb_NO: error: "Det oppstod en feil ved endring av denne verdien." change_username: title: "Endre brukernavn" - confirm: "Hvis du endrer brukernavnet ditt, vil alle gamle sitater av dine innlegg og @navn-nevninger feile. Er du helt sikker pÃ¥ at du vil bytte brukernavn?" + confirm: "Er du helt sikker pÃ¥ at du ønsker Ã¥ endre brukernavnet ditt?" taken: "Beklager, det brukernavnet er tatt." invalid: "Det brukernavnet er ugyldig. Det kan bare inneholde nummer og bokstaver." change_email: @@ -706,7 +728,6 @@ nb_NO: upload_title: "Last opp bilde" upload_picture: "Last opp bilde" image_is_not_a_square: "Vi har beskÃ¥ret bildet ditt, høyde og bredde er ikke lik" - cache_notice: "Profilbildet ditt er oppdatert, men pÃ¥ grunn av mellomlagring i nettlesere kan det ta litt tid før det synes." change_profile_background: title: "Profilbakgrunn" instructions: "Profilbakgrunner vil bli sentrert med en forvalgt bredde pÃ¥ 850 piksler." @@ -715,14 +736,22 @@ nb_NO: instructions: "Bakgrunnsbilder vil bli sentrert og ha en forvalgt bredde pÃ¥ 590 piksler." email: title: "E-post" + primary: "Primær e-post" + secondary: "Sekundære e-poster" + no_secondary: "Ingen sekundære e-poster" instructions: "aldri vist til offentligheten" ok: "Vi sender deg en e-post for Ã¥ bekrefte" invalid: "Oppgi en gyldig e-postadresse" authenticated: "Din e-post har blitt autentisert av {{provider}}" frequency_immediately: "Vi sender deg umiddelbart en e-post hvis du ikke har lest det vi sender e-post om." frequency: - one: Vi sender deg bare e-post hvis vi ikke har sett deg deg det siste minuttet. - other: Vi sender deg bare e-post hvis vi ikke har sett deg de siste {{count}} minuttene. + one: "Vi sender deg bare e-post hvis vi ikke har sett deg deg det siste minuttet." + other: "Vi sender deg bare e-post hvis vi ikke har sett deg de siste {{count}} minuttene." + associated_accounts: + title: "Tilknyttede Kontoer" + connect: "Koble til" + revoke: "Trekk tilbake" + not_connected: "(ikke tilkoblet)" name: title: "Navn" instructions: "ditt fulle navn (valgfritt)" @@ -808,8 +837,8 @@ nb_NO: sent: "Sendt" none: "Ingen invitasjoner Ã¥ vise." truncated: - one: Viser den første invitasjonen. - other: Viser de {{count}} første invitisajonene. + one: "Viser den første invitasjonen." + other: "Viser de {{count}} første invitisajonene." redeemed: "Løs inn invitasjoner" redeemed_tab: "Brukt" redeemed_tab_with_count: "Innløste ({{count}})" @@ -856,29 +885,29 @@ nb_NO: time_read: "lesetid" recent_time_read: "nylig lesetid" topic_count: - one: emne opprettet - other: emner opprettet + one: "emne opprettet" + other: "emner opprettet" post_count: - one: innlegg skrevet - other: innlegg skrevet + one: "innlegg skrevet" + other: "innlegg skrevet" likes_given: - one: gitt - other: gitt + one: "gitt" + other: "gitt" likes_received: - one: mottatt - other: mottatt + one: "mottatt" + other: "mottatt" days_visited: - one: dag besøkt - other: dager besøkt + one: "dag besøkt" + other: "dager besøkt" topics_entered: - one: emne vist - other: emner vist + one: "emne vist" + other: "emner vist" posts_read: - one: innlegg lest - other: innlegg lest + one: "innlegg lest" + other: "innlegg lest" bookmark_count: - one: bokmerke - other: bokmerker + one: "bokmerke" + other: "bokmerker" top_replies: "Mest Populære Svar" no_replies: "Ingen svar ennÃ¥." more_replies: "Flere svar" @@ -894,7 +923,9 @@ nb_NO: most_liked_users: "Mest likt" most_replied_to_users: "Mest besvart" no_likes: "Ingen likes her ennÃ¥." - associated_accounts: "Innloggingsforsøk" + top_categories: "Toppkategorier" + topics: "Emner" + replies: "Svar" ip_address: title: "Siste IP-adresse" registration_ip_address: @@ -947,8 +978,8 @@ nb_NO: reached: "%{relativeAge} – %{rate} nÃ¥dde innstillingsgrensen satt i %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} overstiger innstillingsgrensen satt i %{siteSettingRate}." rate: - one: 1 feil/%{duration} - other: '%{count} feil/%{duration}' + one: "1 feil/%{duration}" + other: "%{count} feil/%{duration}" learn_more: "lær mer…" all_time: 'totalt' all_time_desc: 'totalt antall emner opprettet' @@ -976,8 +1007,6 @@ nb_NO: hide_session: "Spør meg igjen i morgen" hide_forever: "nei takk" hidden_for_session: "OK, jeg spør igjen i morgen. Du kan ogsÃ¥ registrere en konto nÃ¥r du vil!" - intro: "Hei du! :heart_eyes: Det ser ut som du følger diskusjonen, men ikke har registrert deg ennÃ¥." - value_prop: "NÃ¥r du registrerer deg husker vi hvor langt du har lest, sÃ¥ du starter pÃ¥ riktig sted neste gang du Ã¥pner en trÃ¥d. Du fÃ¥r ogsÃ¥ varsler, her og pÃ¥ e-post nÃ¥r det skjer ting i diskusjonene du vil følge. I tillegg kan du like innlegg :heartbeat:" summary: enabled_description: "Du ser for øyeblikket en oppsummering av dette emnet: de mest interessante innleggene ifølge brukerne." description: "Det finnes {{replyCount}} svar." @@ -991,7 +1020,6 @@ nb_NO: disable: "Vis slettede innlegg" private_message_info: title: "Send" - invite: "Inviter andre…" leave_message: "Ønsker du virkelig Ã¥ legge igjen denne meldingen?" remove_allowed_user: "Er du sikker pÃ¥ at du vil fjerne {{name}} fra denne meldingen?" remove_allowed_group: "Vil du virkelig fjerne {{name}} fra denne meldingen?" @@ -1035,9 +1063,14 @@ nb_NO: password: "Passord" second_factor_title: "Totrinnsverifisering" second_factor_description: "Skriv inn verifiseringskoden fra din app:" + second_factor_backup: "Logg inn med en nødkode" + second_factor_backup_title: "Tofaktor Nødkode" + second_factor_backup_description: "Vennligst skriv en nødkodene dine:" + second_factor: "Logg inn med Authenticator app" email_placeholder: "e-postadresse eller brukernavn" caps_lock_warning: "Caps Lock er pÃ¥" error: "Ukjent feil" + cookies_error: "Nettleseren din ser ut til Ã¥ ha deaktivert informasjonskapsler (cookies). Det er mulig du ikke vil kunne logge inn uten Ã¥ aktivere dem først." rate_limit: "Vent litt før du logger inn igjen." blank_username: "Vennligst oppgi din e-post eller brukernavn." blank_username_or_password: "Oppgi din e-postadresse eller brukernavn og ditt passord." @@ -1062,25 +1095,28 @@ nb_NO: preferences: "Du mÃ¥ være innlogget for Ã¥ endre brukerinnstillinger." forgot: "I husker ikke mine kontodetaljer" not_approved: "Kontoen din har ikke blitt godkjent ennÃ¥. Du vil fÃ¥ beskjed via e-post nÃ¥r du er klar til Ã¥ logge inn." - google: - title: "med Google" - message: "Autentiserer med Google (sørg for at du tillater oppsprettsvindu)" google_oauth2: + name: "Google" title: "med Google" message: "Autentiserer med Google (sørg for at du tillater pop-up vindu)" twitter: + name: "Twitter" title: "med Twitter" message: "Autentiserer med Twitter (sørg for at du tillater oppsprettsvindu)" instagram: + name: "Instagram" title: "med Instagram" message: "Logger inn med Instagram. Sørg for at du ikke har programvare som blokkerer forgrunnsvinduer." facebook: + name: "Facebook" title: "med Facebook" message: "Autentiserer med Facebook (sørg for at du tillater oppsprettsvindu)" yahoo: + name: "Yahoo" title: "med Yahoo" message: "Autentiserer med Yahoo (sørg for at du tillater oppsprettsvindu)" github: + name: "GitHub" title: "med GitHub" message: "Autentiserer med GitHub (sørg for at du tillater oppsprettsvindu)" invites: @@ -1121,11 +1157,11 @@ nb_NO: filter_placeholder: Søk… create: "Opprett: {{content}}" max_content_reached: - one: Du kan kun velge {{count}} gjenstand. - other: Du kan kun velge {{count}} gjenstander. + one: "Du kan kun velge {{count}} gjenstand." + other: "Du kan kun velge {{count}} gjenstander." min_content_not_reached: - one: Velg minst {{count}} element. - other: Velg minst {{count}} elementer. + one: "Velg minst {{count}} element." + other: "Velg minst {{count}} elementer." emoji_picker: filter_placeholder: Søk etter emoji people: Folk @@ -1168,8 +1204,8 @@ nb_NO: drafts_offline: "utkast offline" group_mentioned_limit: "Warning! Du varslet {{group}}, dog har denne gruppen flere medlemmer en administratoren har satt opp som grense for varseling, {{max}} brukere. Ingen vil bli varslet." group_mentioned: - one: Ved Ã¥ nevne {{group}}, er du i ferd med Ã¥ henvende deg til {{count}} én person – er du sikker? - other: Ved Ã¥ nevne {{group}}, er du i ferd med Ã¥ henvende deg til {{count}} folk – er du sikker? + one: "Ved Ã¥ nevne {{group}}, er du i ferd med Ã¥ henvende deg til {{count}} én person – er du sikker?" + other: "Ved Ã¥ nevne {{group}}, er du i ferd med Ã¥ henvende deg til {{count}} folk – er du sikker?" cannot_see_mention: category: "Du nevnte {{username}}, men de vil ikke ikke bli varslet fordi de ikke har tilgang til denne kategorien. Du mÃ¥ legge dem til en gruppe som har tilgang til denne kategorien." private: "Du nevnte {{username}}, men de vil ikke bli varslet fordi de ikke kan se denne samtalen. Du mÃ¥ invitere dem til denne private samtalen." @@ -1245,6 +1281,9 @@ nb_NO: body: "NÃ¥ sender du denne meldingen bare til deg selv!" admin_options_title: "Valgfrie emne-instillinger for stab" composer_actions: + reply: Svar + draft: Utkast + edit: Rediger reply_to_post: label: "Svar pÃ¥ innlegg %{postNumber} av %{postUsername}" desc: Svar pÃ¥ et spesifikt innlegg @@ -1268,11 +1307,11 @@ nb_NO: notifications: tooltip: regular: - one: Én usett merknad - other: '{{count}} usette merknader' + one: "Én usett merknad" + other: "{{count}} usette merknader" message: - one: Én ulest melding - other: '{{count}} uleste meldinger' + one: "Én ulest melding" + other: "{{count}} uleste meldinger" title: "varsler om at @navnet ditt blir nevnt, svar pÃ¥ dine innlegg og emner, meldinger, osv" none: "Notifikasjoner er ikke tilgjengelig for øyeblikket." empty: "Ingen varsler funnet." @@ -1287,8 +1326,8 @@ nb_NO: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} og én annen {{description}} - other: {{username}}, {{username2}} og {{count}} andre {{description}} + one: "{{username}}, {{username2}} og én annen {{description}}" + other: "{{username}}, {{username2}} og {{count}} andre {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1299,8 +1338,8 @@ nb_NO: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nytt Emne {{description}}" group_message_summary: - one: '{{count}} melding i din {{group_name}} innboks' - other: '{{count}} meldinger i din innboks for {{group_name}}' + one: "{{count}} melding i din {{group_name}} innboks" + other: "{{count}} meldinger i din innboks for {{group_name}}" popup: mentioned: '{{username}} nevnte deg i "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} nevnte deg i "{{topic}}" - {{site_title}}' @@ -1337,8 +1376,8 @@ nb_NO: clear_all: "Fjern Alle" too_short: "Din søketekst er for kort." result_count: - one: 1 resultat for{{term}} - other: {{count}}{{plus}} resultater for{{term}} + one: "1 resultat for{{term}}" + other: "{{count}}{{plus}} resultater for{{term}}" title: "søk etter emner, innlegg, brukere eller kategorier" full_page_title: "søk etter emner eller innlegg" no_results: "Ingen resultater funnet." @@ -1429,8 +1468,8 @@ nb_NO: notification_level: "Varsler" choose_new_category: "Velg den nye kategorien for emnene:" selected: - one: Du har valgt 1 emne. - other: Du har valgt {{count}} emner. + one: "Du har valgt 1 emne." + other: "Du har valgt {{count}} emner." change_tags: "Erstatt stikkord" append_tags: "Legg til stikkord" choose_new_tags: "Velg nye stikkord for følgende emner:" @@ -1463,8 +1502,8 @@ nb_NO: search: "Det finnes ingen flere søkeresultater" topic: filter_to: - one: 1 innlegg i emnet - other: '{{count}} innlegg i emnet' + one: "1 innlegg i emnet" + other: "{{count}} innlegg i emnet" create: 'Nytt Emne' create_long: 'Opprett et nytt Emne' open_draft: "Ã…pne Utkast" @@ -1482,10 +1521,10 @@ nb_NO: new: 'nytt emne' unread: 'ulest' new_topics: - one: Ett nytt emne + one: 'Ett nytt emne' other: '{{count}} nye emner' unread_topics: - one: Ett ulest emne + one: 'Ett ulest emne' other: '{{count}} uleste emner' title: 'Emne' invalid_access: @@ -1499,17 +1538,17 @@ nb_NO: title: "Fant ikke emnet" description: "Beklager, vi kunne ikke finne det emnet. Kanskje det ble fjernet av en moderator?" total_unread_posts: - one: du har 1 ulest innlegg i dette emnet - other: du har {{count}} uleste innlegg i dette emnet + one: "du har 1 ulest innlegg i dette emnet" + other: "du har {{count}} uleste innlegg i dette emnet" unread_posts: - one: du har 1 ulest gammelt innlegg i dette emnet - other: du har {{count}} uleste gamle innlegg i dette emnet + one: "du har 1 ulest gammelt innlegg i dette emnet" + other: "du har {{count}} uleste gamle innlegg i dette emnet" new_posts: - one: det er 1 nytt innlegg i dette emnet siden sist du leste det - other: det er {{count}} nye innlegg i dette emnet siden sist du leste det + one: "det er 1 nytt innlegg i dette emnet siden sist du leste det" + other: "det er {{count}} nye innlegg i dette emnet siden sist du leste det" likes: - one: det er én like i dette emnet - other: det er {{number}} likes i dette emnet + one: "det er én like i dette emnet" + other: "det er {{number}} likes i dette emnet" back_to_list: "Tilbake til Listen over Emner" options: "Valg for Emner" show_links: "vis lenker i dette emnet" @@ -1573,8 +1612,8 @@ nb_NO: auto_reminder: "Du vil bli pÃ¥minnet om dette emnet %{timeLeft}." auto_close_title: 'Auto-lukk innstillinger' auto_close_immediate: - one: Det siste innlegget i emnet er allerede en time gammelt, sÃ¥ emnet vil stenges umiddelbart. - other: Det siste innlegget i emnet er allerede %{count} timer gammelt, sÃ¥ emnet vil stenges umiddelbart. + one: "Det siste innlegget i emnet er allerede en time gammelt, sÃ¥ emnet vil stenges umiddelbart." + other: "Det siste innlegget i emnet er allerede %{count} timer gammelt, sÃ¥ emnet vil stenges umiddelbart." timeline: back: "Tilbake" back_description: "GÃ¥ tilbake til forrige uleste innlegg" @@ -1589,6 +1628,8 @@ nb_NO: jump_prompt_of: "av %{count} innlegg" jump_prompt_long: "Hvilket innlegg vil du gÃ¥ til?" jump_bottom_with_number: "hopp til innlegg %{post_number}" + jump_prompt_to_date: "til dato" + jump_prompt_or: "eller" total: innlegg totalt current: gjeldende innlegg notifications: @@ -1682,8 +1723,8 @@ nb_NO: pin_validation: "En dato kreves for Ã¥ feste dette emnet." not_pinned: "Det finnes ingen festede emner i {{categoryLink}}." already_pinned: - one: 'Emner som er festet i {{categoryLink}} for øyeblikket: 1' - other: 'Emner som er festet i {{categoryLink}} for øyeblikket: {{count}}' + one: "Emner som er festet i {{categoryLink}} for øyeblikket: 1" + other: "Emner som er festet i {{categoryLink}} for øyeblikket: {{count}}" pin_globally: "La dette emnet vises øverst i alle listene over emner inntil" confirm_pin_globally: "Du har allerede {{count}} globalt festede emner. For mange festede emner kan være slitsomt for nye og anonyme brukere. Er du sikker pÃ¥ at du vil feste enda et emne globalt? " unpin_globally: "Fjern dette emnet fra toppen av alle lister over emner." @@ -1691,8 +1732,8 @@ nb_NO: global_pin_note: "Brukere kan fjerne festet for emnet individuelt for seg selv." not_pinned_globally: "Det finnes ingen globalt festede emner." already_pinned_globally: - one: 'Emner som er festet globalt for øyeblikket: 1' - other: 'Emner som er festet globalt for øyeblikket: {{count}}' + one: "Emner som er festet globalt for øyeblikket: 1" + other: "Emner som er festet globalt for øyeblikket: {{count}}" make_banner: "Gjør dette emnet til et banner som vises øverst pÃ¥ alle sider." remove_banner: "Fjern banneret som vises øverst alle sider. " banner_note: "Brukere kan fjerne banneret ved Ã¥ lukke det. Kun ett emne kan være valgt som banner av gangen." @@ -1729,8 +1770,8 @@ nb_NO: login_reply: 'Logg Inn for Ã¥ svare' filters: n_posts: - one: 1 innlegg - other: '{{count}} innlegg' + one: "1 innlegg" + other: "{{count}} innlegg" cancel: "Fjern filter" split_topic: title: "Flytt til Nytt Emne" @@ -1738,15 +1779,15 @@ nb_NO: topic_name: "Nytt Navn pÃ¥ Emne" error: "Det oppstod en feil ved flytting av innlegg til det nye emnet." instructions: - one: Du er i ferd med Ã¥ opprette et nytt emne basert pÃ¥ innlegget du har valgt.. - other: Du er i ferd med Ã¥ opprette et nytt emne og fylle det med de {{count}} innleggene du har valgt. + one: "Du er i ferd med Ã¥ opprette et nytt emne basert pÃ¥ innlegget du har valgt.." + other: "Du er i ferd med Ã¥ opprette et nytt emne og fylle det med de {{count}} innleggene du har valgt." merge_topic: title: "Flytt til Eksisterende Emne" action: "flytt til eksisterende emne" error: "Det oppstod en feil ved flytting av innlegg til det valgte emnet." instructions: - one: Velg emnet du vil flytte dette innlegget til. - other: Velg emnet du vil flytte de {{count}} innleggene til. + one: "Velg emnet du vil flytte dette innlegget til." + other: "Velg emnet du vil flytte de {{count}} innleggene til." merge_posts: title: "SlÃ¥ sammen valgte innlegg" action: "slÃ¥ sammen valgte innlegg" @@ -1758,8 +1799,8 @@ nb_NO: label: "Innleggenes nye eier" placeholder: "den nye eierens brukernavn" instructions: - one: Velg den nye eieren til innlegget av {{old_user}}. - other: Velg den nye eieren til {{count}} innlegg av {{old_user}}. + one: "Velg den nye eieren til innlegget av {{old_user}}." + other: "Velg den nye eieren til {{count}} innlegg av {{old_user}}." instructions_warn: "Merk at varslinger bakover i tid for dette innlegget ikke vil bli overført til den nye brukeren." change_timestamp: title: "Endre tidsstempel…" @@ -1788,7 +1829,7 @@ nb_NO: deselect_all: fjern alle description: one: Du har valgt 1 innlegg. - other: Du har valgt {{count}} innlegg. + other: "Du har valgt {{count}} innlegg." post: quote_reply: "Sitat" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1803,28 +1844,28 @@ nb_NO: show_full: "Vis hele innlegget" show_hidden: 'Se skjult innhold' deleted_by_author: - one: (innlegg som er trukket tilbake av forfatter, blir automatisk slettet etter % {count} time, med mindre de blir flagget) - other: (innlegg trukket tilbake av forfatter, blir automatisk slettet etter %{count} timer, med mindre det blir rapportert) + one: "(innlegg som er trukket tilbake av forfatter, blir automatisk slettet etter % {count} time, med mindre de blir flagget)" + other: "(innlegg trukket tilbake av forfatter, blir automatisk slettet etter %{count} timer, med mindre det blir rapportert)" collapse: "fold sammen" expand_collapse: "utvid/vis" locked: "et stabsmedlem har lÃ¥st dette innlegget fra Ã¥ bli endret" gap: - one: vis 1 skjult svar - other: vis {{count}} skjulte svar + one: "vis 1 skjult svar" + other: "vis {{count}} skjulte svar" unread: "Innlegget er ulest" has_replies: - one: '{{count}} svar' - other: '{{count}} svar' + one: "{{count}} svar" + other: "{{count}} svar" has_likes: - one: '{{count}} like' - other: '{{count}} likes' + one: "{{count}} like" + other: "{{count}} likes" has_likes_title: - one: '{{count}} bruker likte dette innlegget' - other: '{{count}} brukere likte dette innlegget' + one: "{{count}} bruker likte dette innlegget" + other: "{{count}} brukere likte dette innlegget" has_likes_title_only_you: "du likte dette innlegget" has_likes_title_you: - one: du og 1 annen bruker likte dette innlegget - other: du og {{count}} andre likte dette innlegget + one: "du og 1 annen bruker likte dette innlegget" + other: "du og {{count}} andre likte dette innlegget" errors: create: "Beklager, det oppstod en feil ved Ã¥ publisere ditt innlegg. Prøv igjen." edit: "Det oppstod en feil ved redigeringen av ditt innlegg. Prøv igjen." @@ -1864,11 +1905,11 @@ nb_NO: delete_replies: confirm: "Ønsker du Ã¥ slette svarene pÃ¥ dette innlegget?" direct_replies: - one: Ja, og ett direkte svar - other: Ja, og {{count}} direkte svar + one: "Ja, og ett direkte svar" + other: "Ja, og {{count}} direkte svar" all_replies: - one: Ja, og ett svar - other: Ja, og alle {{count}} svar + one: "Ja, og ett svar" + other: "Ja, og alle {{count}} svar" just_the_post: "Nei, kun dette innlegget" admin: "Innleggsadministrasjon" wiki: "Opprett wiki" @@ -1883,18 +1924,19 @@ nb_NO: lock_post_description: "forhindre innleggsskriveren fra Ã¥ redigere dette innlegget" unlock_post: "LÃ¥s opp innlegg" unlock_post_description: "tillat innleggsskriveren Ã¥ redigere dette innlegget" + delete_topic_disallowed_modal: "Du har ikke rettigheter til Ã¥ slette dette emnet. Hvis du virkelig vil at det skal slettes, flagg emnet og skriv en begrunnelse slik at en moderator kan vurdere forespørselen din." + delete_topic_disallowed: "du har ikke rettigheter til Ã¥ slette dette emnet" actions: flag: 'Rapportering' defer_flags: - one: Ignorer flagg - other: Ignorer flagg + one: "Ignorer flagg" + other: "Ignorer flagg" undo: off_topic: "Angre rapportering" spam: "Angre rapportering" inappropriate: "Angre rapportering" bookmark: "Angre bokmerking" like: "Angre liker" - vote: "Angre stemme" people: off_topic: "markerte dette som utenfor temaet" spam: "flagget dette som søppelpost" @@ -1904,9 +1946,8 @@ nb_NO: bookmark: "bokmerket dette" like: "likte dette" like_capped: - one: og {{count}} annen likte dette - other: og {{count}} andre likte dette - vote: "stemte for dette" + one: "og {{count}} annen likte dette" + other: "og {{count}} andre likte dette" by_you: off_topic: "Du rapporterte dette som utenfor temaet" spam: "Du rapporterte dette som spam" @@ -1915,65 +1956,58 @@ nb_NO: notify_user: "Du sendte en melding til denne brukeren" bookmark: "Du bokmerket dette innlegget" like: "Du likte dette" - vote: "Du stemte for dette innlegget" by_you_and_others: off_topic: - one: Du og 1 annen markerte dette som irrelevant - other: Du og {{count}} andre rapporterte dette som utenfor temaet + one: "Du og 1 annen markerte dette som irrelevant" + other: "Du og {{count}} andre rapporterte dette som utenfor temaet" spam: - one: Du og 1 annen markerte dette som spam - other: Du og {{count}} andre rapporterte dette som spam + one: "Du og 1 annen markerte dette som spam" + other: "Du og {{count}} andre rapporterte dette som spam" inappropriate: - one: Du og 1 annen markerte dette som upassende - other: Du og {{count}} andre rapporterte dette som upassende + one: "Du og 1 annen markerte dette som upassende" + other: "Du og {{count}} andre rapporterte dette som upassende" notify_moderators: - one: Du og 1 annen markerte dette for moderering - other: Du og {{count}} andre rapporterte dette for moderering + one: "Du og 1 annen markerte dette for moderering" + other: "Du og {{count}} andre rapporterte dette for moderering" notify_user: - one: Du og 1 annen bruker sendte en melding til denne brukeren - other: Du og {{count}} andre brukere har sendt en melding til denne brukeren + one: "Du og 1 annen bruker sendte en melding til denne brukeren" + other: "Du og {{count}} andre brukere har sendt en melding til denne brukeren" bookmark: - one: Du og 1 annen bokmerket dette innlegget - other: Du og {{count}} andre bokmerket dette innlegget + one: "Du og 1 annen bokmerket dette innlegget" + other: "Du og {{count}} andre bokmerket dette innlegget" like: - one: Du og 1 annen likte dette - other: Du og {{count}} andre likte dette - vote: - one: Du og 1 annen stemte pÃ¥ dette innlegget - other: Du og {{count}} andre stemte pÃ¥ dette innlegget + one: "Du og 1 annen likte dette" + other: "Du og {{count}} andre likte dette" by_others: off_topic: - one: 1 bruker markerte dette som irrelevant - other: '{{count}} brukere rapporterte dette som irrelevant' + one: "1 bruker markerte dette som irrelevant" + other: "{{count}} brukere rapporterte dette som irrelevant" spam: - one: 1 bruker markerte dette som spam - other: '{{count}} brukere rapporterte dette som spam' + one: "1 bruker markerte dette som spam" + other: "{{count}} brukere rapporterte dette som spam" inappropriate: - one: 1 bruker markerte dette som upassende - other: '{{count}} brukere rapporterte dette som upassende' + one: "1 bruker markerte dette som upassende" + other: "{{count}} brukere rapporterte dette som upassende" notify_moderators: - one: 1 bruker markerte dette for moderering - other: '{{count}} brukere rapporterte dette for moderering' + one: "1 bruker markerte dette for moderering" + other: "{{count}} brukere rapporterte dette for moderering" notify_user: - one: 1 person har sendt en melding til denne brukeren - other: '{{count}} har sendt en melding til denne brukeren' + one: "1 person har sendt en melding til denne brukeren" + other: "{{count}} har sendt en melding til denne brukeren" bookmark: - one: 1 bruker bokmerket dette innlegget - other: '{{count}} brukere bokmerket dette innlegget' + one: "1 bruker bokmerket dette innlegget" + other: "{{count}} brukere bokmerket dette innlegget" like: - one: 1 bruker likte dette - other: '{{count}} brukere likte dette' - vote: - one: 1 bruker stemte pÃ¥ dette innlegget - other: '{{count}} brukere stemte pÃ¥ dette innlegget' + one: "1 bruker likte dette" + other: "{{count}} brukere likte dette" delete: confirm: - one: Er du sikker pÃ¥ at du ønsker Ã¥ slette dette innlegget? - other: Er du sikker pÃ¥ at du ønsker Ã¥ slette de {{count}} innleggene? + one: "Er du sikker pÃ¥ at du ønsker Ã¥ slette dette innlegget?" + other: "Er du sikker pÃ¥ at du ønsker Ã¥ slette de {{count}} innleggene?" merge: confirm: - one: Er du sikker pÃ¥ at du vil flette disse postene? - other: Er du sikker pÃ¥ at du vil flette de {{count}} innleggene? + one: "Er du sikker pÃ¥ at du vil flette disse postene?" + other: "Er du sikker pÃ¥ at du vil flette de {{count}} innleggene?" revisions: controls: first: "Første versjon" @@ -2011,7 +2045,7 @@ nb_NO: can: 'kan…' none: '(no category)' all: 'Alle kategorier' - choose: 'Velg en katekori…' + choose: 'kategori…' edit: 'rediger' edit_long: "Rediger" view: 'Se Emner i Kategori' @@ -2060,7 +2094,7 @@ nb_NO: show_subcategory_list: "Plasser listen over underkategorien i toppen av emner i denne kategorien." num_featured_topics: "Antall emner som skal vises pÃ¥ kategori-siden:" subcategory_num_featured_topics: "Antall fremhevede emner pÃ¥ hovedkategoriens side:" - all_topics_wiki: "Gjør nye emner til wiki-er som standard." + all_topics_wiki: "Gjør nye emner til wikier som standard" subcategory_list_style: "Listestil for underkategorier:" sort_order: "Emneliste Sorteres Etter:" default_view: "Forvalgt Emneliste:" @@ -2068,13 +2102,17 @@ nb_NO: allow_badges_label: "Tillat merker Ã¥ bli tildelt i denne kategorien" edit_permissions: "Rediger tillatelser" add_permission: "Legg til tillatelser" + require_topic_approval: "Krev godkjennelse fra moderator for alle nye emner" + require_reply_approval: "Krev godkjennelse fra moderator for alle nye svar" this_year: "dette Ã¥ret" - position: "posisjon" + position: "Posisjon:" default_position: "Forvalgt posisjon" position_disabled: "Kategorier vil bli vist i henhold til aktivitet. For Ã¥ styre rekkefølgen av kategorier i listen" position_disabled_click: 'aktiver innstillingen "faste kategoriposisjoner".' minimum_required_tags: 'Minste antall stikkord som kreves for et emne:' parent: "Foreldrekategori" + num_auto_bump_daily: 'Antall Ã¥pne emner som vil løftes automatisk per dag:' + navigate_to_first_post_after_read: 'Naviger til første innlegg etter at emner er lest' notifications: watching: title: "Følger" @@ -2131,14 +2169,14 @@ nb_NO: custom_placeholder_notify_moderators: "La oss vite nøyaktig hva problemet er, og del relevante lenker og eksempler hvorvidt det er mulig." custom_message: at_least: - one: skriv inn minst ett tegn - other: skriv inn minst {{count}} tegn + one: "skriv inn minst ett tegn" + other: "skriv inn minst {{count}} tegn" more: - one: Én igjen… - other: '{{count}} igjen…' + one: "Én igjen…" + other: "{{count}} igjen…" left: - one: ett gjenstÃ¥ende - other: '{{count}} gjenstÃ¥ende' + one: "ett gjenstÃ¥ende" + other: "{{count}} gjenstÃ¥ende" flagging_topic: title: "Takk for at du hjelper med Ã¥ vedlikeholde god skikk i samfundet vÃ¥rt!" action: "Rapporter Emne" @@ -2149,13 +2187,13 @@ nb_NO: links_title: "Populære Lenker" links_shown: "vis flere lenker…" clicks: - one: 1 klikk - other: '%{count} klikk' + one: "1 klikk" + other: "%{count} klikk" post_links: about: "utvid flere lenker for dette innlegget" title: - one: Én til - other: '%{count} flere' + one: "Én til" + other: "%{count} flere" topic_statuses: warning: help: "Dette er en offisiell advarsel." @@ -2189,22 +2227,22 @@ nb_NO: original_post: "Originalt innlegg" views: "Visninger" views_lowercase: - one: visninger - other: visninger + one: "visninger" + other: "visninger" replies: "Svar" views_long: - one: dette emnet er lest 1 gang - other: dette emnet er lest {{number}} ganger + one: "dette emnet er lest 1 gang" + other: "dette emnet er lest {{number}} ganger" activity: "Aktivitet" likes: "Likes" likes_lowercase: - one: like - other: likes + one: "like" + other: "likes" likes_long: "det finnes {{number}} likes i dette emnet" users: "Deltakere" users_lowercase: - one: bruker - other: brukere + one: "bruker" + other: "brukere" category_title: "Kategori" history: "Historie" changed_by: "av {{author}}" @@ -2218,8 +2256,8 @@ nb_NO: latest: title: "Siste" title_with_count: - one: Siste (1) - other: Siste ({{count}}) + one: "Siste (1)" + other: "Siste ({{count}})" help: "emner med nylige innlegg" hot: title: "Populær" @@ -2237,21 +2275,21 @@ nb_NO: unread: title: "Uleste" title_with_count: - one: Ulest (1) - other: Ulest ({{count}}) + one: "Ulest (1)" + other: "Ulest ({{count}})" help: "emner du følger eller overvÃ¥ker for øyeblikket, med uleste innlegg" lower_title_with_count: - one: 1 ulest - other: '{{count}} uleste' + one: "1 ulest" + other: "{{count}} uleste" new: lower_title_with_count: - one: 1 ny - other: '{{count}} nye' + one: "1 ny" + other: "{{count}} nye" lower_title: "ny" title: "Nye" title_with_count: - one: Nye (1) - other: Nye ({{count}}) + one: "Nye (1)" + other: "Nye ({{count}})" help: "emner opprettet de siste dagene" posted: title: "Mine innlegg" @@ -2262,8 +2300,8 @@ nb_NO: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "siste emner i {{categoryName}}-kategorien" top: title: "Aktive" @@ -2307,6 +2345,7 @@ nb_NO: bookmarks: 'g, b Bokmerker' profile: 'g, p Profil' messages: 'g, m Meldinger' + drafts: 'g, d Utkast' navigation: title: 'Navigasjon' jump: '# GÃ¥ til innlegg #' @@ -2351,22 +2390,22 @@ nb_NO: print: 'ctrl+p Skriv ut emne' badges: earned_n_times: - one: Har gjort seg fortjent til dette merket - other: Har gjort seg fortjent til dette merket %{count} ganger + one: "Har gjort seg fortjent til dette merket" + other: "Har gjort seg fortjent til dette merket %{count} ganger" granted_on: "Tildelt %{date}" others_count: "(%{count}) andre har dette merket" title: Merker allow_title: "Du kan bruke dette merket som tittel" multiple_grant: "Du kan oppnÃ¥ dette flere ganger" badge_count: - one: 1 merke - other: '%{count} merker' + one: "1 merke" + other: "%{count} merker" more_badges: - one: +1 mer - other: +%{count} Flere + one: "+1 mer" + other: "+%{count} Flere" granted: - one: ett tildelt - other: '%{count} tildelt' + one: "ett tildelt" + other: "%{count} tildelt" select_badge_for_title: Velg et merke Ã¥ bruke som din tittel none: "(intet)" successfully_granted: "Tildelte %{badge} til %{username}" @@ -2400,8 +2439,8 @@ nb_NO: choose_for_topic: "valgfrie stikkord" delete_tag: "Slett stikkord" delete_confirm: - one: Er du sikker pÃ¥ at du ønsker Ã¥ slette dette stikkordet og fjerne det fra emnet det er tilknyttet? - other: Er du sikker pÃ¥ at du ønsker Ã¥ slette dette stikkordet og fjerne det fra {{count}} emner som er tilknyttet det? + one: "Er du sikker pÃ¥ at du ønsker Ã¥ slette dette stikkordet og fjerne det fra emnet det er tilknyttet?" + other: "Er du sikker pÃ¥ at du ønsker Ã¥ slette dette stikkordet og fjerne det fra {{count}} emner som er tilknyttet det?" delete_confirm_no_topics: "Er du sikker pÃ¥ at du ønsker Ã¥ slette dette stikkordet?" rename_tag: "Gi stikkord nytt navn" rename_instructions: "Velg et nytt navn for dette stikkordet:" @@ -2482,6 +2521,8 @@ nb_NO: admin: title: 'Discourse-admin' moderator: 'Moderator' + reports: + title: "Liste over tilgjengelige rapporter" dashboard: title: "Dashbord" last_updated: "Dashboardet var sist oppdatert:" @@ -2518,8 +2559,15 @@ nb_NO: page_views_short: "Sidevisninger" show_traffic_report: "Vis detaljert trafikkrapport" community_health: Samfunnshelse + moderators_activity: Moderatoraktivitet whats_new_in_discourse: "Hva er nytt i Discourse?" activity_metrics: AktivitetsmÃ¥ling + all_reports: "Alle rapporter" + general_tab: "Generelt" + moderation_tab: "Moderering" + disabled: Deaktivert + timeout_error: "Beklager, spørringen tar for lang tid, vennligst velg et kortere tidsrom" + exception_error: "Beklager, en feil oppstod under kjøringen av denne spørringen" reports: trend_title: "%{percent} endring. NÃ¥værende %{current}, var %{prev} i forrige periode." today: "I dag" @@ -2537,6 +2585,9 @@ nb_NO: end_date: "Sluttdato" groups: "Alle grupper" disabled: "Denne rapporten er deaktivert" + totals_for_sample: "Totalt for tidsrom" + total: "Totalt siden starten" + no_data: "Ingen data Ã¥ vise." trending_search: more: 'Logg for søk' disabled: 'Rapporten for trending av søk er deaktivert. Aktiver logging av søkeord for Ã¥ samle inn data.' @@ -2582,11 +2633,11 @@ nb_NO: suspend_user: "Steng ute bruker" suspend_user_title: "Steng ute bruker for dette innlegget" replies: - one: '[1 svar]' - other: '[%{count} svar]' + one: "[1 svar]" + other: "[%{count} svar]" delete_replies: - one: Fjern %{count} svar i tillegg til dette innlegget? - other: Fjern de %{count} svarene i tillegg til dette innlegget? + one: "Fjern %{count} svar i tillegg til dette innlegget?" + other: "Fjern de %{count} svarene i tillegg til dette innlegget?" dispositions: agreed: "enig" disagreed: "uenig" @@ -2742,6 +2793,9 @@ nb_NO: flag_event: name: "Flagghandling" details: "NÃ¥r et flagg settes, aksepteres, avvises eller ignoreres." + queued_post_event: + name: "Hendelse for godkjent innlegg" + details: "NÃ¥r et køet innlegg opprettes, godkjennes eller avvises." delivery_status: title: "Sendingsstatus" inactive: "Inaktiv" @@ -2751,11 +2805,11 @@ nb_NO: none: "Det finnes ingen relaterte hendelser." redeliver: "Send pÃ¥ nytt" incoming: - one: Det finnes en ny hendelse. - other: Det finnes {{count}} nye hendelser. + one: "Det finnes en ny hendelse." + other: "Det finnes {{count}} nye hendelser." completed_in: - one: Ferdig pÃ¥ 1 sekund. - other: Ferdig pÃ¥ {{count}} sekunder. + one: "Ferdig pÃ¥ 1 sekund." + other: "Ferdig pÃ¥ {{count}} sekunder." request: "Forespørsel" response: "Svar" redeliver_confirm: "Er du sikker pÃ¥ at du vil sende samme payload pÃ¥ nytt?" @@ -2919,7 +2973,6 @@ nb_NO: public_key: "Gi den følgende public keyen tilgang til repoet:" about_theme: "Om drakt" license: "Lisens" - component_of: "Drakten er en del av:" update_to_latest: "Oppdater til seneste" check_for_updates: "Se etter oppdateringer" updating: "Oppdaterer…" @@ -2928,8 +2981,8 @@ nb_NO: theme_settings: "Draktinnstillinger" no_settings: "Denne drakten har ingen innstillinger." commits_behind: - one: Drakten er én utgave foreldet! - other: Drakten er {{count}} utgaver foreldet! + one: "Drakten er én utgave foreldet!" + other: "Drakten er {{count}} utgaver foreldet!" scss: text: "CSS" title: "Skriv inn egendefinert CSS, alle gyldige CSS- og SCSS-stiler godtas" @@ -3061,7 +3114,6 @@ nb_NO: address_placeholder: "navn@eksempel.no" type_placeholder: "oppsummering, registrering…" reply_key_placeholder: "svarnøkkel" - skipped_reason_placeholder: "grunn" moderation_history: performed_by: "Utført av" no_results: "Ingen moderatorhistorikk tilgjengelig." @@ -3115,6 +3167,8 @@ nb_NO: change_site_text: "endre sidens tekst" suspend_user: "steng ute bruker" unsuspend_user: "Opphev utestenging av bruker" + removed_suspend_user: "utesteng bruker (fjernet)" + removed_unsuspend_user: "opphev utestenging av bruker (fjernet)" grant_badge: "tildel merke" revoke_badge: "trekk tilbake merke" check_email: "sjekk e-post" @@ -3129,6 +3183,8 @@ nb_NO: create_category: "opprett kategori" silence_user: "demp bruker" unsilence_user: "opphev demping av bruker" + removed_silence_user: "demp bruker (fjernet)" + removed_unsilence_user: "opphev demping av bruker (fjernet)" grant_admin: "innvilg admin" revoke_admin: "trekk tilbake administrering" grant_moderation: "innvilg moderering" @@ -3153,9 +3209,11 @@ nb_NO: disabled_second_factor: "deaktiver totrinnsverifisering" topic_published: "emne publisert" post_approved: "innlegg godkjent" + post_rejected: "innlegg avvist" create_badge: "lag merke" change_badge: "endre merke" delete_badge: "slett merke" + merge_user: "slÃ¥ sammen bruker" screened_emails: title: "Kontrollerte e-poster" description: "NÃ¥r noen forsøker Ã¥ lage en ny konto, vil de følgende e-postadressene bli sjekket, og registreringen vil bli blokkert, eller en annen handling vil bli utført." @@ -3207,8 +3265,8 @@ nb_NO: clear_filter: "Tøm" show_words: "vis ord" word_count: - one: ett ord - other: '%{count} ord' + one: "ett ord" + other: "%{count} ord" actions: block: 'Blokker' censor: 'Sensurer' @@ -3252,11 +3310,11 @@ nb_NO: staged: 'Arrangert' approved: "Godkjent?" approved_selected: - one: godkjenn bruker - other: godkjenn brukere ({{count}}) + one: "godkjenn bruker" + other: "godkjenn brukere ({{count}})" reject_selected: - one: avvis bruker - other: avvis brukere ({{count}}) + one: "avvis bruker" + other: "avvis brukere ({{count}})" titles: active: 'Aktive brukere' new: 'Nye brukere' @@ -3274,11 +3332,11 @@ nb_NO: suspect: 'Mistenkte brukere' staged: 'Arrangerte Brukere' reject_successful: - one: Avvist 1 bruker. - other: Avviste %{count} brukere. + one: "Avvist 1 bruker." + other: "Avviste %{count} brukere." reject_failures: - one: Kunne ikke avvise 1 bruker. - other: Kunne ikke avvise %{count} brukere. + one: "Kunne ikke avvise 1 bruker." + other: "Kunne ikke avvise %{count} brukere." not_verified: "Uverifisert" check_email: title: "Vis denne brukerens e-postadresse" @@ -3309,6 +3367,10 @@ nb_NO: penalty_post_delete: "Slett innlegget" penalty_post_edit: "Rediger innlegget" penalty_post_none: "ikke gjør noe" + penalty_count: "Antall Straffer" + clear_penalty_history: + title: "Fjern Straffehistorikk" + description: "brukere med straffer kan ikke nÃ¥ TL3" delete_all_posts_confirm_MF: "Du er i ferd med Ã¥ slette {POSTS, plural, one {1 innlegg} other {# innlegg}} og {TOPICS, plural, one {1 emne} other {# emner}}. Er du sikker?" silence: "Demp" unsilence: "Opphev demping" @@ -3363,14 +3425,14 @@ nb_NO: delete_forbidden_because_staff: "Administratorer og moderatorer kan ikke slettes." delete_posts_forbidden_because_staff: "Kan ikke slette alle innlegg av administratorer og moderatorer." delete_forbidden: - one: Brukere kan ikke slettes om de har innlegg. Slett alle brukerens innlegg før bruker kan slettes. (Innlegg eldre enn %{count} dag kan ikke slettes.) - other: Brukere kan ikke slettes om de har innlegg. Slett alle innlegg før du forsøker Ã¥ slette en bruker. (Innlegg eldre enn %{count} dager kan ikke slettes.) + one: "Brukere kan ikke slettes om de har innlegg. Slett alle brukerens innlegg før bruker kan slettes. (Innlegg eldre enn %{count} dag kan ikke slettes.)" + other: "Brukere kan ikke slettes om de har innlegg. Slett alle innlegg før du forsøker Ã¥ slette en bruker. (Innlegg eldre enn %{count} dager kan ikke slettes.)" cant_delete_all_posts: - one: Kan ikke slette alle innlegg. Noen innlegg er eldre enn %{count} dag gammel. (Innstillingen delete_user_max_post_age.) - other: Kan ikke slette alle innlegg. Noen innlegg er eldre enn %{count} dager gamle. (Innstillingen delete_user_max_post_age.) + one: "Kan ikke slette alle innlegg. Noen innlegg er eldre enn %{count} dag gammel. (Innstillingen delete_user_max_post_age.)" + other: "Kan ikke slette alle innlegg. Noen innlegg er eldre enn %{count} dager gamle. (Innstillingen delete_user_max_post_age.)" cant_delete_all_too_many_posts: - one: Kan ikke slette alle innlegg fordi brukeren har mer enn 1 innlegg. (delete_all_posts_max) - other: Kan ikke slette alle innlegg fordi brukeren har mer enn %{count} innlegg. (delete_all_posts_max) + one: "Kan ikke slette alle innlegg fordi brukeren har mer enn 1 innlegg. (delete_all_posts_max)" + other: "Kan ikke slette alle innlegg fordi brukeren har mer enn %{count} innlegg. (delete_all_posts_max)" delete_confirm: "Er du HELT SIKKER pÃ¥ at du vil slette denne brukeren? Denne handlingen er permanent!" delete_and_block: "Slett og blokker denne e-post- og IP-adressen" delete_dont_block: "Bare slett" @@ -3412,8 +3474,8 @@ nb_NO: tl3_requirements: title: "Krav til tillitsnivÃ¥ 3" table_title: - one: 'Den siste dagen:' - other: 'De siste %{count} dagene:' + one: "Den siste dagen:" + other: "De siste %{count} dagene:" value_heading: "Verdi" requirement_heading: "Krav" visits: "Besøk" @@ -3500,6 +3562,14 @@ nb_NO: clear_filter: "Tøm" add_url: "legg til URL" add_host: "legg til vert" + uploaded_image_list: + label: "Rediger liste" + empty: "Det finnes ingen bilder enda. Vennligst last opp ett." + upload: + label: "Last opp" + title: "Last opp bilde(r)" + selectable_avatars: + title: "Liste over avatarer brukere kan velge mellom" categories: all_results: 'Alle' required: 'PÃ¥krevd' @@ -3588,8 +3658,8 @@ nb_NO: text: "Det finnes manglende grant samples. Dette skjer nÃ¥r merke-søket returnerer bruker-IDer eller innleggs-ID-er som ikke eksisterer. Dette kan føre til uventede resultater senere - dobbeltsjekk søket ditt." no_grant_count: "Ingen merker Ã¥ tildele." grant_count: - one: Ett merke Ã¥ tildele. - other: %{count} merker Ã¥ tildele. + one: "Ett merke Ã¥ tildele." + other: "%{count} merker Ã¥ tildele." sample: "Eksempel:" grant: with: "%{username}" @@ -3654,10 +3724,11 @@ nb_NO: step: "%{current} av %{total}" upload: "Last opp" uploading: "Laster opp…" + upload_error: "Beklager, det skjedde en feil ved opplastingen av den filen. Vennligst prøv igjen." quit: "Kanskje senere" staff_count: - one: Din gemenskap har ett stabsmedlem (deg). - other: ' Ditt fellesskap har %{count} stab, inkludert deg selv.' + one: "Din gemenskap har ett stabsmedlem (deg)." + other: " Ditt fellesskap har %{count} stab, inkludert deg selv." invites: add_user: "legg til" none_added: "Du har ikke invitert noen til staben. Er du sikker pÃ¥ at du vil fortsette?" @@ -3665,3 +3736,7 @@ nb_NO: admin: "Administrator" moderator: "Moderator" regular: "Aktivt medlem" + previews: + topic_title: "Diskusjonsemne" + share_button: "Del" + reply_button: "Svar" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 22e43611a4..24f674bdfc 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -43,62 +43,62 @@ nl: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1u - other: '%{count}u' + one: "1u" + other: "%{count}u" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_years: - one: 1j - other: '%{count}j' + one: "1j" + other: "%{count}j" over_x_years: - one: '> 1j' - other: '> %{count}j' + one: "> 1j" + other: "> %{count}j" almost_x_years: - one: 1j - other: '%{count}j' + one: "1j" + other: "%{count}j" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} min' + one: "1 min" + other: "%{count} min" x_hours: - one: 1 uur - other: '%{count} uur' + one: "1 uur" + other: "%{count} uur" x_days: - one: 1 dag - other: '%{count} dagen' + one: "1 dag" + other: "%{count} dagen" date_year: "D MMM 'YY" medium_with_ago: x_minutes: - one: 1 min geleden - other: '%{count} min geleden' + one: "1 min geleden" + other: "%{count} min geleden" x_hours: - one: 1 uur geleden - other: '%{count} uur geleden' + one: "1 uur geleden" + other: "%{count} uur geleden" x_days: - one: 1 dag geleden - other: '%{count} dagen geleden' + one: "1 dag geleden" + other: "%{count} dagen geleden" later: x_days: - one: 1 dag later - other: '%{count} dagen later' + one: "1 dag later" + other: "%{count} dagen later" x_months: - one: 1 maand later - other: '%{count} maanden later' + one: "1 maand later" + other: "%{count} maanden later" x_years: - one: 1 jaar later - other: '%{count} jaar later' + one: "1 jaar later" + other: "%{count} jaar later" previous_month: 'Vorige maand' next_month: 'Volgende maand' placeholder: datum @@ -177,13 +177,13 @@ nl: show_help: "opties" links: "Koppelingen" links_lowercase: - one: koppeling - other: koppelingen + one: "koppeling" + other: "koppelingen" faq: "FAQ" guidelines: "Richtlijnen" privacy_policy: "Privacybeleid" privacy: "Privacy" - terms_of_service: "Algemene Voorwaarden" + tos: "Algemene Voorwaarden" mobile_view: "Mobiele weergave" desktop_view: "Desktopweergave" you: "Jij" @@ -202,8 +202,8 @@ nl: max_of_count: "maximaal {{count}}" alternation: "of" character_count: - one: '{{count}} teken' - other: '{{count}} tekens' + one: "{{count}} teken" + other: "{{count}} tekens" suggested_topics: title: "Aanbevolen topics" pm_title: "Voorgestelde berichten" @@ -271,16 +271,16 @@ nl: cancel: "Annuleren" view_pending: "wachtende berichten bekijken" has_pending_posts: - one: Dit topic bevat 1 bericht dat op goedkeuring wacht - other: Dit topic bevat {{count}} berichten die op goedkeuring wachten + one: "Dit topic bevat 1 bericht dat op goedkeuring wacht" + other: "Dit topic bevat {{count}} berichten die op goedkeuring wachten" confirm: "Wijzigingen opslaan" delete_prompt: "Weet u zeker dat u %{username} wilt verwijderen? Dit verwijdert alle berichten en blokkeert het e-mailadres en IP-nummer van de gebruiker." approval: title: "Bericht heeft goedkeuring nodig" description: "We hebben uw nieuwe bericht ontvangen, maar dit moet eerst door een moderator worden goedgekeurd voordat het zichtbaar wordt. Heb geduld." pending_posts: - one: U hebt 1 wachtend bericht. - other: U hebt {{count}} wachtende berichten. + one: "U hebt 1 wachtend bericht." + other: "U hebt {{count}} wachtende berichten." ok: "OK" user_action: user_posted_topic: "{{user}} heeft het topic geplaatst" @@ -314,8 +314,8 @@ nl: posts_read: "Gelezen" posts_read_long: "Berichten gelezen" total_rows: - one: 1 gebruiker - other: '%{count} gebruikers' + one: "1 gebruiker" + other: "%{count} gebruikers" group_histories: actions: change_group_setting: "Groepsinstelling wijzigen" @@ -368,8 +368,8 @@ nl: is_group_user: "Lid" is_group_owner: "Eigenaar" title: - one: Groep - other: Groepen + one: "Groep" + other: "Groepen" activity: "Activiteit" members: filter_placeholder_admin: "gebruikersnaam of e-mail, e-mailadres" @@ -432,8 +432,6 @@ nl: reorder: title: "Categorieën herschikken " title_long: "De categorielijst opnieuw ordenen" - fix_order: "Posities corrigeren" - fix_order_tooltip: "Niet alle categorieën hebben een uniek positienummer. Dit kan tot onverwachte resultaten leiden." save: "Volgorde opslaan" apply_all: "Toepassen" position: "Positie" @@ -444,11 +442,11 @@ nl: toggle_ordering: "sorteermethode omschakelen" subcategories: "Subcategorieën" topic_sentence: - one: 1 topic - other: '%{count} topics' + one: "1 topic" + other: "%{count} topics" topic_stat_sentence: - one: '%{count} nieuw topic in de afgelopen %{unit}.' - other: '%{count} nieuwe topics in de afgelopen %{unit}.' + one: "%{count} nieuw topic in de afgelopen %{unit}." + other: "%{count} nieuwe topics in de afgelopen %{unit}." ip_lookup: title: IP-adres zoeken hostname: Hostnaam @@ -603,7 +601,6 @@ nl: error: "Er is een fout opgetreden bij het wijzigen van deze waarde." change_username: title: "Gebruikersnaam wijzigen" - confirm: "Als u uw gebruikersnaam wijzigt, kloppen alle eerdere citaten van uw berichten en vermeldingen van uw @naam niet meer. Weet u dit echt zeker?" taken: "Sorry, maar die gebruikersnaam is al in gebruik." invalid: "Die gebruikersnaam is ongeldig. Hij mag alleen cijfers en letters bevatten." change_email: @@ -623,7 +620,6 @@ nl: upload_title: "Uw afbeelding uploaden" upload_picture: "Afbeelding uploaden" image_is_not_a_square: "Waarschuwing: we hebben uw afbeelding bijgesneden; breedte en hoogte waren niet gelijk." - cache_notice: "U hebt uw profielafbeelding met succes gewijzigd, maar door bufferwerking van uw browser kan het even duren voordat deze overal zichtbaar is." change_profile_background: title: "Profielachtergrond" instructions: "Profielachtergronden worden gecentreerd en hebben een standaardbreedte van 850px." @@ -638,8 +634,8 @@ nl: authenticated: "Uw e-mailadres is geauthenticeerd door {{provider}}" frequency_immediately: "Als u de inhoud in kwestie nog niet hebt gelezen, sturen we u direct een e-mail." frequency: - one: We sturen alleen een e-mail als we u de laatste minuut niet hebben gezien. - other: We sturen alleen een e-mail als we u de laatste {{count}} minuten niet hebben gezien. + one: "We sturen alleen een e-mail als we u de laatste minuut niet hebben gezien." + other: "We sturen alleen een e-mail als we u de laatste {{count}} minuten niet hebben gezien." name: title: "Naam" instructions: "uw volledige naam (optioneel)" @@ -724,8 +720,8 @@ nl: user: "Uitgenodigde gebruiker" sent: "Verzonden" truncated: - one: De eerste uitnodiging wordt getoond. - other: De eerste {{count}} uitnodigingen worden getoond. + one: "De eerste uitnodiging wordt getoond." + other: "De eerste {{count}} uitnodigingen worden getoond." redeemed: "Verzilverde uitnodigingen" redeemed_tab: "Verzilverd" redeemed_tab_with_count: "Verzilverd ({{count}})" @@ -771,26 +767,26 @@ nl: stats: "Statistieken " time_read: "leestijd" topic_count: - one: Onderwerp gemaakt - other: topics gemaakt + one: "Onderwerp gemaakt" + other: "topics gemaakt" post_count: - one: bericht gemaakt - other: berichten gemaakt + one: "bericht gemaakt" + other: "berichten gemaakt" likes_given: - one: gegeven - other: gegeven + one: "gegeven" + other: "gegeven" likes_received: - one: ontvangen - other: ontvangen + one: "ontvangen" + other: "ontvangen" days_visited: - one: dag bezocht - other: dagen bezocht + one: "dag bezocht" + other: "dagen bezocht" posts_read: - one: bericht gelezen - other: berichten gelezen + one: "bericht gelezen" + other: "berichten gelezen" bookmark_count: - one: favoriet - other: bladwijzers + one: "favoriet" + other: "bladwijzers" top_replies: "Topantwoorden" no_replies: "Nog geen antwoorden." more_replies: "Meer antwoorden" @@ -806,7 +802,6 @@ nl: most_liked_users: "Meest geliket" most_replied_to_users: "Meest geantwoord op" no_likes: "Nog geen likes." - associated_accounts: "Aanmeldingen" ip_address: title: "Laatste IP-adres" registration_ip_address: @@ -858,8 +853,8 @@ nl: reached: "%{relativeAge} – %{rate} heeft de limiet voor de website-instelling van %{siteSettingRate} bereikt." exceeded: "%{relativeAge} – %{rate} heeft de limiet voor de website-instelling van %{siteSettingRate} overschreden." rate: - one: 1 fout/%{duration} - other: '%{count} fouten/%{duration}' + one: "1 fout/%{duration}" + other: "%{count} fouten/%{duration}" learn_more: "meer info..." all_time: 'totaal' all_time_desc: 'aantal aangemaakte topics' @@ -883,8 +878,6 @@ nl: hide_session: "Mij morgen herinneren" hide_forever: "nee, bedankt" hidden_for_session: "OK, ik vraag het u morgen. U kunt ook altijd 'Aanmelden' gebruiken om een account aan te maken." - intro: "Hallo! :heart_eyes: Zo te zien beleeft u plezier aan de discussie, maar hebt u zich niet voor een account geregistreerd." - value_prop: "Als u een account aanmaakt, houden we precies bij wat u hebt gelezen, zodat u direct kunt verdergaan waar u was gebleven. U ontvangt dan ook meldingen bij nieuwe berichten, hier en via e-mail, en u kunt ook nog berichten liken. :heartbeat:" summary: enabled_description: "U bekijkt een samenvatting van dit topic: de meeste interessante berichten zoals bepaald door de gemeenschap." description: "Er zijn {{replyCount}} antwoorden." @@ -898,7 +891,6 @@ nl: disable: "Verwijderde berichten tonen" private_message_info: title: "Bericht" - invite: "Anderen uitnodigen..." remove_allowed_user: "Wilt u {{naam}} echt uit dit bericht verwijderen?" remove_allowed_group: "Wilt u {{name}} echt uit dit bericht verwijderen?" email: 'E-mailadres' @@ -955,9 +947,6 @@ nl: preferences: "U dient aangemeld te zijn om uw gebruikersvoorkeuren te wijzigen." forgot: "Ik kan me de details van mijn gebruikersaccount niet herinneren." not_approved: "Uw account is nog niet goedgekeurd. U ontvangt een melding via e-mail zodra u zich kunt aanmelden." - google: - title: "met Google" - message: "Authenticeren met Google (zorg ervoor dat pop-upblokkeringen zijn uitgeschakeld)" google_oauth2: title: "met Google" message: "Authenticeren met Google (zorg ervoor dat pop-upblokkeringen zijn uitgeschakeld)" @@ -1039,8 +1028,8 @@ nl: similar_topics: "Uw topic lijkt op..." drafts_offline: "concepten offline" group_mentioned: - one: Door {{group}} te vermelden, gaat u 1 persoon op de hoogte brengen – weet u dit zeker? - other: Door {{group}} te vermelden, gaat u {{count}} personen op de hoogte brengen – weet u dit zeker? + one: "Door {{group}} te vermelden, gaat u 1 persoon op de hoogte brengen – weet u dit zeker?" + other: "Door {{group}} te vermelden, gaat u {{count}} personen op de hoogte brengen – weet u dit zeker?" cannot_see_mention: category: "U hebt {{username}} genoemd, maar de gebruiker ontvangt geen melding, omdat hij of zij geen toegang heeft tot deze categorie. U dient de gebruiker toe te voegen aan een groep die toegang heeft tot deze categorie." private: "U hebt {{username}} genoemd, maar de gebruiker ontvangt geen melding, omdat hij of zij dit persoonlijke bericht niet kan zien. U dient de gebruiker voor dit PB uit te nodigen." @@ -1120,8 +1109,8 @@ nl: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} en 1 anderen {{description}} - other: {{username}}, {{username2}} en {{count}} anderen {{description}} + one: "{{username}}, {{username2}} en 1 anderen {{description}}" + other: "{{username}}, {{username2}} en {{count}} anderen {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1132,8 +1121,8 @@ nl: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nieuw Topic {{description}}" group_message_summary: - one: '{{count}} bericht in je Postvak IN voor {{group_name}}' - other: '{{count}} berichten in je Postvak IN voor {{group_name}}' + one: "{{count}} bericht in je Postvak IN voor {{group_name}}" + other: "{{count}} berichten in je Postvak IN voor {{group_name}}" popup: mentioned: '{{username}} heeft u genoemd in ''{{topic}}'' - {{site_title}}' group_mentioned: '{{username}} heeft u genoemd in ''{{topic}}'' - {{site_title}}' @@ -1242,8 +1231,8 @@ nl: notification_level: "Meldingen" choose_new_category: "Kies de nieuwe categorie voor de topics:" selected: - one: U hebt 1 topic geselecteerd. - other: U hebt {{count}} topics geselecteerd. + one: "U hebt 1 topic geselecteerd." + other: "U hebt {{count}} topics geselecteerd." change_tags: "Tags vervangen" append_tags: "Tags toevoegen" choose_new_tags: "Kies nieuwe tags voor deze topics:" @@ -1276,8 +1265,8 @@ nl: search: "Er zijn geen zoekresultaten meer." topic: filter_to: - one: 1 bericht in topic - other: '{{count}} berichten in topic' + one: "1 bericht in topic" + other: "{{count}} berichten in topic" create: 'Nieuw topic' create_long: 'Een nieuw topic maken' private_message: 'Een bericht sturen' @@ -1291,10 +1280,10 @@ nl: new: 'nieuw topic' unread: 'ongelezen' new_topics: - one: 1 nieuw topic + one: '1 nieuw topic' other: '{{count}} nieuwe topics' unread_topics: - one: 1 ongelezen topic + one: '1 ongelezen topic' other: '{{count}} ongelezen topics' title: 'Topic' invalid_access: @@ -1308,17 +1297,17 @@ nl: title: "Topic niet gevonden" description: "Sorry, we konden het opgevraagde topic niet vinden. Misschien is het verwijderd door een moderator?" total_unread_posts: - one: u hebt 1 ongelezen bericht in dit topic - other: u hebt {{count}} ongelezen berichten in dit topic + one: "u hebt 1 ongelezen bericht in dit topic" + other: "u hebt {{count}} ongelezen berichten in dit topic" unread_posts: - one: u hebt 1 ongelezen bericht in dit topic - other: u hebt {{count}} ongelezen berichten in dit topic + one: "u hebt 1 ongelezen bericht in dit topic" + other: "u hebt {{count}} ongelezen berichten in dit topic" new_posts: - one: er is 1 nieuw bericht in dit topic sinds u het voor het laatst hebt gelezen - other: er zijn {{count}} nieuwe berichten in dit topic sinds u het voor het laatst hebt gelezen + one: "er is 1 nieuw bericht in dit topic sinds u het voor het laatst hebt gelezen" + other: "er zijn {{count}} nieuwe berichten in dit topic sinds u het voor het laatst hebt gelezen" likes: - one: er is 1 like in dit topic - other: er zijn {{likes}} likes in dit topic + one: "er is 1 like in dit topic" + other: "er zijn {{likes}} likes in dit topic" back_to_list: "Terug naar topiclijst" options: "Topic-opties" show_links: "koppelingen binnen dit topic tonen" @@ -1378,8 +1367,8 @@ nl: auto_reminder: "U zult %{timeLeft} aan dit topic herinnerd worden." auto_close_title: 'Instellingen voor automatisch sluiten' auto_close_immediate: - one: Het laatste bericht in dit topic is al 1 uur oud, dus het topic zal meteen worden gesloten. - other: Het laatste bericht in dit topic is al %{count} uur oud, dus het topic zal meteen worden gesloten. + one: "Het laatste bericht in dit topic is al 1 uur oud, dus het topic zal meteen worden gesloten." + other: "Het laatste bericht in dit topic is al %{count} uur oud, dus het topic zal meteen worden gesloten." timeline: back: "Terug" back_description: "Terug naar uw laatste ongelezen bericht" @@ -1486,8 +1475,8 @@ nl: pin_validation: "Er is een datum vereist om dit topic vast te maken." not_pinned: "Er zijn geen topics vastgemaakt in {{categoryLink}}." already_pinned: - one: 'Momenteel vastgemaakte topics in {{categoryLink}}: 1' - other: 'Momenteel vastgemaakte topics in {{categoryLink}}: {{count}}.' + one: "Momenteel vastgemaakte topics in {{categoryLink}}: 1" + other: "Momenteel vastgemaakte topics in {{categoryLink}}: {{count}}." pin_globally: "Dit topic bovenaan in alle topiclijsten laten verschijnen tot" confirm_pin_globally: "U hebt al {{count}} globaal vastgemaakte topics. Te veel vastgemaakte topics kunnen storend zijn voor nieuwe en anonieme gebruikers. Weet u zeker dat u nog een topic globaal wilt vastmaken?" unpin_globally: "Verwijder dit topic uit de bovenkant van alle topiclijsten." @@ -1495,8 +1484,8 @@ nl: global_pin_note: "Gebruikers kunnen het topic individueel voor zichzelf losmaken." not_pinned_globally: "Er zijn geen globaal vastgemaakte topics." already_pinned_globally: - one: 'Momenteel globaal vastgemaakte topics: 1' - other: 'Momenteel globaal vastgemaakte topics: {{count}}.' + one: "Momenteel globaal vastgemaakte topics: 1" + other: "Momenteel globaal vastgemaakte topics: {{count}}." make_banner: "Dit topic omzetten naar een banner die bovenaan alle pagina's verschijnt" remove_banner: "De banner die bovenaan alle pagina's verschijnt verwijderen" banner_note: "Gebruikers kunnen de banner negeren door deze te sluiten. Er kan maar één bannertopic tegelijk bestaan." @@ -1533,8 +1522,8 @@ nl: login_reply: 'Meld u aan om te antwoorden' filters: n_posts: - one: 1 bericht - other: '{{count}} berichten' + one: "1 bericht" + other: "{{count}} berichten" cancel: "Filter verwijderen" split_topic: title: "Verplaatsen naar nieuw topic" @@ -1542,15 +1531,15 @@ nl: topic_name: "Naam van nieuw topic" error: "Er is een fout opgetreden bij het verplaatsen van berichten naar het nieuwe topic." instructions: - one: U gaat een nieuw topic aanmaken en met het geselecteerde bericht vullen. - other: U gaat een nieuw topic aanmaken en met de {{count}} geselecteerde berichten vullen. + one: "U gaat een nieuw topic aanmaken en met het geselecteerde bericht vullen." + other: "U gaat een nieuw topic aanmaken en met de {{count}} geselecteerde berichten vullen." merge_topic: title: "Verplaatsen naar bestaand topic" action: "verplaatsen naar bestaand topic" error: "Er is een fout opgetreden bij het verplaatsen van berichten naar dat topic." instructions: - one: Selecteer het topic waarnaar u dat bericht wilt verplaatsen. - other: Selecteer het topic waarnaar u de {{count}} berichten wilt verplaatsen. + one: "Selecteer het topic waarnaar u dat bericht wilt verplaatsen." + other: "Selecteer het topic waarnaar u de {{count}} berichten wilt verplaatsen." merge_posts: title: "Geselecteerde berichten samenvoegen" action: "geselecteerde berichten samenvoegen" @@ -1562,8 +1551,8 @@ nl: label: "Nieuwe eigenaar van berichten" placeholder: "gebruikersnaam van nieuwe eigenaar" instructions: - one: Kies de nieuwe eigenaar van het bericht door {{old_user}}. - other: Kies de nieuwe eigenaar van de {{count}} berichten door {{old_user}}. + one: "Kies de nieuwe eigenaar van het bericht door {{old_user}}." + other: "Kies de nieuwe eigenaar van de {{count}} berichten door {{old_user}}." change_timestamp: title: "Tijdstempel wijzigen..." action: "tijdstempel wijzigen" @@ -1579,7 +1568,7 @@ nl: deselect_all: alles deselecteren description: one: U hebt 1 bericht geselecteerd. - other: U hebt {{count}} berichten geselecteerd. + other: "U hebt {{count}} berichten geselecteerd." post: quote_reply: "Citeren" edit_reason: "Reden: " @@ -1593,27 +1582,27 @@ nl: show_full: "Volledige bericht tonen" show_hidden: 'Verborgen inhoud bekijken' deleted_by_author: - one: (bericht ingetrokken door de schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd) - other: (bericht ingetrokken door de schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd) + one: "(bericht ingetrokken door de schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd)" + other: "(bericht ingetrokken door de schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd)" collapse: "samenvouwen" expand_collapse: "uitvouwen/samenvouwen" gap: - one: 1 verborgen antwoord weergeven - other: '{{count}} verborgen antwoorden weergeven' + one: "1 verborgen antwoord weergeven" + other: "{{count}} verborgen antwoorden weergeven" unread: "Bericht is ongelezen" has_replies: - one: '{{count}} antwoord' - other: '{{count}} antwoorden' + one: "{{count}} antwoord" + other: "{{count}} antwoorden" has_likes: - one: '{{count}} like' - other: '{{count}} likes' + one: "{{count}} like" + other: "{{count}} likes" has_likes_title: - one: 1 persoon heeft dit bericht geliket - other: '{{count}} personen hebben dit bericht geliket' + one: "1 persoon heeft dit bericht geliket" + other: "{{count}} personen hebben dit bericht geliket" has_likes_title_only_you: "u hebt dit bericht geliket" has_likes_title_you: - one: u en 1 andere persoon hebben dit bericht geliket - other: u en {{count}} andere personen hebben dit bericht geliket + one: "u en 1 andere persoon hebben dit bericht geliket" + other: "u en {{count}} andere personen hebben dit bericht geliket" errors: create: "Sorry, er is een fout opgetreden bij het plaatsen van uw bericht. Probeer het opnieuw." edit: "Sorry, er is een fout opgetreden bij het bewerken van uw bericht. Probeer het opnieuw." @@ -1666,7 +1655,6 @@ nl: inappropriate: "Markering verwijderen" bookmark: "Bladwijzer verwijderen" like: "Like ongedaan maken" - vote: "Stem ongedaan maken" people: off_topic: "heeft dit als off-topic gemarkeerd" spam: "heeft dit als spam gemarkeerd" @@ -1675,7 +1663,6 @@ nl: notify_user: "heeft een bericht gestuurd" bookmark: "heeft dit aan bladwijzers toegevoegd" like: "heeft dit geliket" - vote: "heeft hiervoor gestemd" by_you: off_topic: "U hebt dit als off-topic gemarkeerd" spam: "U hebt dit als spam gemarkeerd" @@ -1684,61 +1671,54 @@ nl: notify_user: "U hebt een bericht naar deze gebruiker gestuurd" bookmark: "U hebt een bladwijzer voor dit bericht gemaakt" like: "U hebt dit geliket" - vote: "U hebt op dit bericht gestemd" by_you_and_others: off_topic: - one: U en 1 andere persoon hebben dit als off-topic gemarkeerd - other: U en {{count}} andere personen hebben dit als off-topic gemarkeerd + one: "U en 1 andere persoon hebben dit als off-topic gemarkeerd" + other: "U en {{count}} andere personen hebben dit als off-topic gemarkeerd" spam: - one: U en 1 andere persoon hebben dit als spam gemarkeerd - other: U en {{count}} andere personen hebben dit als spam gemarkeerd + one: "U en 1 andere persoon hebben dit als spam gemarkeerd" + other: "U en {{count}} andere personen hebben dit als spam gemarkeerd" inappropriate: - one: U en 1 andere persoon hebben dit als ongepast gemarkeerd - other: U en {{count}} andere personen hebben dit als ongepast gemarkeerd + one: "U en 1 andere persoon hebben dit als ongepast gemarkeerd" + other: "U en {{count}} andere personen hebben dit als ongepast gemarkeerd" notify_moderators: - one: U en 1 andere persoon hebben dit voor moderatie gemarkeerd - other: U en {{count}} andere personen hebben dit voor moderatie gemarkeerd + one: "U en 1 andere persoon hebben dit voor moderatie gemarkeerd" + other: "U en {{count}} andere personen hebben dit voor moderatie gemarkeerd" notify_user: - one: U en 1 andere persoon hebben een bericht naar deze gebruiker gestuurd - other: U en {{count}} andere personen hebben een bericht naar deze gebruiker gestuurd + one: "U en 1 andere persoon hebben een bericht naar deze gebruiker gestuurd" + other: "U en {{count}} andere personen hebben een bericht naar deze gebruiker gestuurd" bookmark: - one: U en 1 andere persoon hebben een bladwijzer voor dit bericht gemaakt - other: U en {{count}} andere personen hebben een bladwijzer voor dit bericht gemaakt + one: "U en 1 andere persoon hebben een bladwijzer voor dit bericht gemaakt" + other: "U en {{count}} andere personen hebben een bladwijzer voor dit bericht gemaakt" like: - one: U en 1 andere persoon hebben dit geliket - other: U en {{count}} andere personen hebben dit geliket - vote: - one: U en 1 andere persoon hebben op dit bericht gestemd - other: U en {{count}} andere personen hebben op dit bericht gestemd + one: "U en 1 andere persoon hebben dit geliket" + other: "U en {{count}} andere personen hebben dit geliket" by_others: off_topic: - one: 1 persoon heeft dit als off-topic gemarkeerd - other: '{{count}} personen hebben dit als off-topic gemarkeerd' + one: "1 persoon heeft dit als off-topic gemarkeerd" + other: "{{count}} personen hebben dit als off-topic gemarkeerd" spam: - one: 1 persoon heeft dit als spam gemarkeerd - other: '{{count}} personen hebben dit als spam gemarkeerd' + one: "1 persoon heeft dit als spam gemarkeerd" + other: "{{count}} personen hebben dit als spam gemarkeerd" inappropriate: - one: 1 persoon heeft dit als ongepast gemarkeerd - other: '{{count}} personen hebben dit als ongepast gemarkeerd' + one: "1 persoon heeft dit als ongepast gemarkeerd" + other: "{{count}} personen hebben dit als ongepast gemarkeerd" notify_moderators: - one: 1 persoon heeft dit voor moderatie gemarkeerd - other: '{{count}} personen hebben dit voor moderatie gemarkeerd' + one: "1 persoon heeft dit voor moderatie gemarkeerd" + other: "{{count}} personen hebben dit voor moderatie gemarkeerd" notify_user: - one: 1 persoon stuurde een bericht naar deze gebruiker - other: '{{count}} stuurden een bericht naar deze gebruiker' + one: "1 persoon stuurde een bericht naar deze gebruiker" + other: "{{count}} stuurden een bericht naar deze gebruiker" bookmark: - one: 1 persoon heeft een bladwijzer voor dit bericht gemaakt - other: '{{count}} personen hebben een bladwijzer voor dit bericht gemaakt' + one: "1 persoon heeft een bladwijzer voor dit bericht gemaakt" + other: "{{count}} personen hebben een bladwijzer voor dit bericht gemaakt" like: - one: 1 persoon heeft dit geliket - other: '{{count}} personen hebben dit geliket' - vote: - one: 1 persoon heeft op dit bericht gestemd - other: '{{count}} personen hebben op dit bericht gestemd' + one: "1 persoon heeft dit geliket" + other: "{{count}} personen hebben dit geliket" merge: confirm: - one: Weet je zeker dat je die berichten wilt samenvoegen? - other: Weet je zeker dat je die {{count}} berichten wilt samenvoegen? + one: "Weet je zeker dat je die berichten wilt samenvoegen?" + other: "Weet je zeker dat je die {{count}} berichten wilt samenvoegen?" revisions: controls: first: "Eerste revisie" @@ -1776,7 +1756,6 @@ nl: can: 'kan...' none: '(geen categorie)' all: 'Alle categorieën' - choose: 'Selecteer een categorie…' edit: 'bewerken' edit_long: "Bewerken" view: 'Topics in categorie weergeven' @@ -1823,7 +1802,6 @@ nl: show_subcategory_list: "Subcategorielijsten boven topics tonen in deze categorie" num_featured_topics: "Aantal getoonde topics op de categoriepagina:" subcategory_num_featured_topics: "Aantal aanbevolen topics op pagina van bovenliggende categorie:" - all_topics_wiki: "Standaard wiki's van nieuwe topics maken" subcategory_list_style: "Stijl van subcategorielijst:" sort_order: "Topiclijst sorteren op:" default_view: "Standaard topiclijst:" @@ -1832,7 +1810,6 @@ nl: edit_permissions: "Toestemmingen wijzigen" add_permission: "Toestemming toevoegen" this_year: "dit jaar" - position: "positie" default_position: "Standaardpositie" position_disabled: "Categorieën worden op volgorde van activiteit weergegeven. Om de volgorde van categorieën in lijsten aan te passen, " position_disabled_click: 'schakelt u de instelling ''vaste categorieposities'' in.' @@ -1893,14 +1870,14 @@ nl: custom_placeholder_notify_moderators: "Laat ons met name weten waar u zich zorgen om maakt, en stuur relevante koppelingen en voorbeelden mee waar mogelijk." custom_message: at_least: - one: voer minstens 1 teken in - other: voer minstens {{count}} tekens in + one: "voer minstens 1 teken in" + other: "voer minstens {{count}} tekens in" more: - one: 1 teken te gaan... - other: '{{count}} tekens te gaan...' + one: "1 teken te gaan..." + other: "{{count}} tekens te gaan..." left: - one: 1 resterend - other: '{{count}} resterend' + one: "1 resterend" + other: "{{count}} resterend" flagging_topic: title: "Bedankt voor het beleefd houden van onze gemeenschap!" action: "Topic markeren" @@ -1911,13 +1888,13 @@ nl: links_title: "Populaire koppelingen" links_shown: "meer koppelingen tonen..." clicks: - one: 1 klik - other: '%{count} klikken' + one: "1 klik" + other: "%{count} klikken" post_links: about: "meer koppelingen voor dit bericht uitvouwen" title: - one: nog 1 - other: nog %{count} + one: "nog 1" + other: "nog %{count}" topic_statuses: warning: help: "Dit is een officiële waarschuwing." @@ -1951,22 +1928,22 @@ nl: original_post: "Oorspronkelijke bericht" views: "Weergaven" views_lowercase: - one: weergave - other: weergaven + one: "weergave" + other: "weergaven" replies: "Antwoorden" views_long: - one: dit topic is 1 keer bekeken - other: dit topic is {{number}} keer bekeken + one: "dit topic is 1 keer bekeken" + other: "dit topic is {{number}} keer bekeken" activity: "Activiteit" likes: "Likes" likes_lowercase: - one: like - other: likes + one: "like" + other: "likes" likes_long: "er zijn {{count}} likes in dit topic" users: "Gebruikers" users_lowercase: - one: gebruiker - other: gebruikers + one: "gebruiker" + other: "gebruikers" category_title: "Categorie" history: "Geschiedenis" changed_by: "door {{author}}" @@ -1980,8 +1957,8 @@ nl: latest: title: "Nieuwste" title_with_count: - one: Nieuwste (1) - other: Nieuwste ({{count}}) + one: "Nieuwste (1)" + other: "Nieuwste ({{count}})" help: "topics met recente berichten" hot: title: "Populair" @@ -1999,21 +1976,21 @@ nl: unread: title: "Ongelezen" title_with_count: - one: Ongelezen (1) - other: Ongelezen ({{count}}) + one: "Ongelezen (1)" + other: "Ongelezen ({{count}})" help: "topics die u momenteel in de gaten houdt of volgt met ongelezen berichten" lower_title_with_count: - one: 1 ongelezen - other: '{{count}} ongelezen' + one: "1 ongelezen" + other: "{{count}} ongelezen" new: lower_title_with_count: - one: 1 nieuw - other: '{{count}} nieuw' + one: "1 nieuw" + other: "{{count}} nieuw" lower_title: "nieuw" title: "Nieuw" title_with_count: - one: Nieuw (1) - other: Nieuw ({{count}}) + one: "Nieuw (1)" + other: "Nieuw ({{count}})" help: "in de afgelopen paar dagen aangemaakte topics" posted: title: "Mijn berichten" @@ -2024,8 +2001,8 @@ nl: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "nieuwste topics in de categorie {{categoryName}}" top: title: "Top" @@ -2109,22 +2086,22 @@ nl: print: 'ctrl+p Topic afdrukken' badges: earned_n_times: - one: Deze badge is 1 keer verdiend - other: Deze badge is %{count} keer verdiend + one: "Deze badge is 1 keer verdiend" + other: "Deze badge is %{count} keer verdiend" granted_on: "Toegekend op %{date}" others_count: "Anderen met deze badge (%{count})" title: Badges allow_title: "U kunt deze badge als een titel gebruiken" multiple_grant: "U kunt dit meerdere keren verdienen" badge_count: - one: 1 badge - other: '%{count} badges' + one: "1 badge" + other: "%{count} badges" more_badges: - one: +nog 1 - other: +nog %{count} + one: "+nog 1" + other: "+nog %{count}" granted: - one: 1 toegekend - other: '%{count} toegekend' + one: "1 toegekend" + other: "%{count} toegekend" select_badge_for_title: Kies een badge om als uw titel te gebruiken badge_grouping: getting_started: @@ -2154,8 +2131,8 @@ nl: tags: "Tags" delete_tag: "Tag verwijderen" delete_confirm: - one: Weet je zeker dat je deze tag wilt verwijderen en loskoppelen van 1 topic waar het aan toegewezen is? - other: Weet je zeker dat je deze tag wilt verwijderen en loskoppelen van {{count}} topics waar het aan toegewezen is? + one: "Weet je zeker dat je deze tag wilt verwijderen en loskoppelen van 1 topic waar het aan toegewezen is?" + other: "Weet je zeker dat je deze tag wilt verwijderen en loskoppelen van {{count}} topics waar het aan toegewezen is?" delete_confirm_no_topics: "Weet je zeker dat je deze tag wilt verwijderen?" rename_tag: "Tag hernoemen" rename_instructions: "Kies een nieuwe naam voor de tag:" @@ -2401,11 +2378,11 @@ nl: none: "Er zijn geen verwante gebeurtenissen." redeliver: "Opnieuw afleveren" incoming: - one: Er is een nieuwe gebeurtenis. - other: Er zijn {{count}} nieuwe gebeurtenissen. + one: "Er is een nieuwe gebeurtenis." + other: "Er zijn {{count}} nieuwe gebeurtenissen." completed_in: - one: Voltooid in 1 seconde. - other: Voltooid in {{count}} seconden. + one: "Voltooid in 1 seconde." + other: "Voltooid in {{count}} seconden." request: "Aanvraag" response: "Antwoord" redeliver_confirm: "Weet u zeker dat u dezelfde payload opnieuw wilt afleveren?" @@ -2558,15 +2535,14 @@ nl: import_file_tip: ".dcstyle.json-bestand dat thema bevat" about_theme: "Over thema" license: "Licentie" - component_of: "Thema is een onderdeel van:" update_to_latest: "Bijwerken naar nieuwste" check_for_updates: "Controleren op updates" updating: "Bijwerken..." up_to_date: "Thema is up-to-date, laatst gecontroleerd:" add: "Toevoegen" commits_behind: - one: Thema loopt 1 commit achter! - other: Thema loopt {{count}} commits achter! + one: "Thema loopt 1 commit achter!" + other: "Thema loopt {{count}} commits achter!" scss: text: "CSS" title: "Voer aangepaste CSS in; we accepteren alle geldige CSS- en SCSS-stijlen" @@ -2695,7 +2671,6 @@ nl: address_placeholder: "naam@example.com" type_placeholder: "samenvatting, registratie" reply_key_placeholder: "antwoordtoets" - skipped_reason_placeholder: "reden" logs: title: "Logboeken" action: "Actie" @@ -2805,8 +2780,8 @@ nl: clear_filter: "Wis" show_words: "laat woorden zien" word_count: - one: 1 woord - other: '%{count} woorden' + one: "1 woord" + other: "%{count} woorden" actions: block: 'Blokkeren' censor: 'Censuur' @@ -2847,11 +2822,11 @@ nl: suspect: 'Verdacht' approved: "Goedgekeurd?" approved_selected: - one: gebruiker goedkeuren - other: gebruikers goedkeuren ({{count}}) + one: "gebruiker goedkeuren" + other: "gebruikers goedkeuren ({{count}})" reject_selected: - one: gebruiker weigeren - other: gebruikers weigeren ({{count}}) + one: "gebruiker weigeren" + other: "gebruikers weigeren ({{count}})" titles: active: 'Actieve gebruikers' new: 'Nieuwe gebruikers' @@ -2867,11 +2842,11 @@ nl: suspended: 'Geschorste gebruikers' suspect: 'Verdachte gebruikers' reject_successful: - one: Er is 1 gebruiker geweigerd. - other: Er zijn %{count} gebruikers geweigerd. + one: "Er is 1 gebruiker geweigerd." + other: "Er zijn %{count} gebruikers geweigerd." reject_failures: - one: Het weigeren van 1 gebruiker is niet gelukt. - other: Het weigeren van %{count} gebruikers is niet gelukt. + one: "Het weigeren van 1 gebruiker is niet gelukt." + other: "Het weigeren van %{count} gebruikers is niet gelukt." not_verified: "Niet geverifieerd" check_email: title: "E-mailadres van deze gebruiker tonen" @@ -2937,14 +2912,14 @@ nl: delete_forbidden_because_staff: "Beheerders en moderators kunnen niet worden verwijderd." delete_posts_forbidden_because_staff: "Kan niet alle berichten van beheerders en moderators verwijderen." delete_forbidden: - one: Gebruikers kunnen niet worden verwijderd als ze berichten hebben geplaatst. Verwijder alle berichten voordat u een gebruiker probeert te verwijderen. (Berichten ouder dan %{count} dag kunnen niet worden verwijderd.) - other: Gebruikers kunnen niet worden verwijderd als ze berichten hebben geplaatst. Verwijder alle berichten voordat u een gebruiker probeert te verwijderen. (Berichten ouder dan %{count} dagen kunnen niet worden verwijderd.) + one: "Gebruikers kunnen niet worden verwijderd als ze berichten hebben geplaatst. Verwijder alle berichten voordat u een gebruiker probeert te verwijderen. (Berichten ouder dan %{count} dag kunnen niet worden verwijderd.)" + other: "Gebruikers kunnen niet worden verwijderd als ze berichten hebben geplaatst. Verwijder alle berichten voordat u een gebruiker probeert te verwijderen. (Berichten ouder dan %{count} dagen kunnen niet worden verwijderd.)" cant_delete_all_posts: - one: Kan niet alle berichten verwijderen. Sommige berichten zijn ouder dan %{count} dag. (De instelling delete_user_max_post_age.) - other: Kan niet alle berichten verwijderen. Sommige berichten zijn ouder dan %{count} dagen. (De instelling delete_user_max_post_age.) + one: "Kan niet alle berichten verwijderen. Sommige berichten zijn ouder dan %{count} dag. (De instelling delete_user_max_post_age.)" + other: "Kan niet alle berichten verwijderen. Sommige berichten zijn ouder dan %{count} dagen. (De instelling delete_user_max_post_age.)" cant_delete_all_too_many_posts: - one: Kan niet alle berichten verwijderen, omdat de gebruiker meer dan 1 bericht heeft geplaatst. (delete_all_posts_max) - other: Kan niet alle berichten verwijderen, omdat de gebruiker meer dan %{count} berichten heeft geplaatst. (delete_all_posts_max) + one: "Kan niet alle berichten verwijderen, omdat de gebruiker meer dan 1 bericht heeft geplaatst. (delete_all_posts_max)" + other: "Kan niet alle berichten verwijderen, omdat de gebruiker meer dan %{count} berichten heeft geplaatst. (delete_all_posts_max)" delete_confirm: "Weet je ZEKER dat je deze gebruiker wil verwijderen? Dit is definitief!" delete_and_block: "Dit e-mail- en IP-adres verwijderen en blokkeren" delete_dont_block: "Alleen verwijderen" @@ -2980,8 +2955,8 @@ nl: tl3_requirements: title: "Vereisten voor vertrouwensniveau 3" table_title: - one: 'De afgelopen dag:' - other: 'In de afgelopen %{count} dagen:' + one: "De afgelopen dag:" + other: "In de afgelopen %{count} dagen:" value_heading: "Waarde" requirement_heading: "Vereiste" visits: "Bezoeken" @@ -3147,8 +3122,8 @@ nl: text: "Er ontbreken toekenningsvoorbeelden. Dit gebeurt als de badgequery gebruikers- of bericht-ID's retourneert die niet bestaan. Dit kan later tot onverwachte resultaten leiden - controleer uw query." no_grant_count: "Geen badges om toe te wijzen." grant_count: - one: Er is 1 badge om toe te wijzen. - other: Er zijn %{count} badges om toe te wijzen. + one: "Er is 1 badge om toe te wijzen." + other: "Er zijn %{count} badges om toe te wijzen." sample: "Voorbeeld:" grant: with: "%{username}" @@ -3215,8 +3190,8 @@ nl: uploading: "Uploaden..." quit: "Misschien later" staff_count: - one: Jouw community heeft 1 personeelslids (jij). - other: Jouw community heeft %{count} personeelsleden, inclusief jij. + one: "Jouw community heeft 1 personeelslids (jij)." + other: "Jouw community heeft %{count} personeelsleden, inclusief jij." invites: add_user: "toevoegen" none_added: "Je hebt geen stafleden uitgenodigd. Weet je zeker dat je verder wilt gaan?" diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 9b2f402efc..bd231ab53b 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -16,9 +16,9 @@ pl_PL: format: '%n %u' units: byte: + one: bajt few: bajty many: bajtów - one: bajt other: bajtów gb: GB kb: KB @@ -45,106 +45,106 @@ pl_PL: tiny: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - many: < %{count}s - one: < 1s - other: < %{count}s + one: "< 1s" + few: "< %{count}s" + many: "< %{count}s" + other: "< %{count}s" x_seconds: - few: '%{count}s' - many: '%{count}s' - one: 1s - other: '%{count}s' + one: "1s" + few: "%{count}s" + many: "%{count}s" + other: "%{count}s" less_than_x_minutes: - few: < %{count} min - many: '< %{count} min ' - one: < 1 min - other: '< %{count} min ' + one: "< 1 min" + few: "< %{count} min" + many: "< %{count} min " + other: "< %{count} min " x_minutes: - few: '%{count}m' - many: '%{count}m' - one: 1m - other: '%{count}m' + one: "1m" + few: "%{count}m" + many: "%{count}m" + other: "%{count}m" about_x_hours: - few: '%{count}h' - many: '%{count}h' - one: 1h - other: '%{count}h' + one: "1h" + few: "%{count}h" + many: "%{count}h" + other: "%{count}h" x_days: - few: '%{count}d' - many: '%{count}d' - one: 1d - other: '%{count}d' + one: "1d" + few: "%{count}d" + many: "%{count}d" + other: "%{count}d" x_months: - few: '%{count}mies' - many: '%{count}mies' - one: 1mies - other: '%{count}mies' + one: "1mies" + few: "%{count}mies" + many: "%{count}mies" + other: "%{count}mies" about_x_years: - few: '%{count}r' - many: '%{count}r' - one: 1r - other: '%{count}r' + one: "1r" + few: "%{count}r" + many: "%{count}r" + other: "%{count}r" over_x_years: - few: '> %{count}r' - many: '> %{count}r' - one: '> 1r' - other: '> %{count}r' + one: "> 1r" + few: "> %{count}r" + many: "> %{count}r" + other: "> %{count}r" almost_x_years: - few: '%{count}r' - many: '%{count}r' - one: 1r - other: '%{count}r' + one: "1r" + few: "%{count}r" + many: "%{count}r" + other: "%{count}r" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - few: '%{count} minuty' - many: '%{count} minut' - one: 1 minuta - other: '%{count} minut' + one: "1 minuta" + few: "%{count} minuty" + many: "%{count} minut" + other: "%{count} minut" x_hours: - few: '%{count} godziny' - many: '%{count} godzin' - one: 1 godzina - other: '%{count} godzin' + one: "1 godzina" + few: "%{count} godziny" + many: "%{count} godzin" + other: "%{count} godzin" x_days: - few: '%{count} dni' - many: '%{count} dni' - one: 1 dzieÅ„ - other: '%{count} dni' + one: "1 dzieÅ„" + few: "%{count} dni" + many: "%{count} dni" + other: "%{count} dni" date_year: "D MMM 'YY" medium_with_ago: x_minutes: - few: '%{count} minuty temu' - many: '%{count} minut temu' - one: minutÄ™ temu - other: '%{count} minut temu' + one: "minutÄ™ temu" + few: "%{count} minuty temu" + many: "%{count} minut temu" + other: "%{count} minut temu" x_hours: - few: '%{count} godziny temu' - many: '%{count} godzin temu' - one: godzinÄ™ temu - other: '%{count} godzin temu' + one: "godzinÄ™ temu" + few: "%{count} godziny temu" + many: "%{count} godzin temu" + other: "%{count} godzin temu" x_days: - few: '%{count} dni temu' - many: '%{count} dni temu' - one: wczoraj - other: '%{count} dni temu' + one: "wczoraj" + few: "%{count} dni temu" + many: "%{count} dni temu" + other: "%{count} dni temu" later: x_days: - few: '%{count} dni później' - many: '%{count} dni później' - one: 1 dzieÅ„ później - other: '%{count} dni później' + one: "1 dzieÅ„ później" + few: "%{count} dni później" + many: "%{count} dni później" + other: "%{count} dni później" x_months: - few: '%{count} miesiÄ…ce później' - many: '%{count} miesiÄ™cy później' - one: 1 miesiÄ…c później - other: '%{count} miesiÄ™cy później' + one: "1 miesiÄ…c później" + few: "%{count} miesiÄ…ce później" + many: "%{count} miesiÄ™cy później" + other: "%{count} miesiÄ™cy później" x_years: - few: '%{count} lata później' - many: '%{count} lat później' - one: 1 rok później - other: '%{count} lat później' + one: "1 rok później" + few: "%{count} lata później" + many: "%{count} lat później" + other: "%{count} lat później" previous_month: 'Poprzedni miesiÄ…c' next_month: 'NastÄ™pny miesiÄ…c' placeholder: data @@ -183,11 +183,13 @@ pl_PL: enabled: 'wylistowanie %{when}' disabled: 'odlistowanie %{when}' banner: - enabled: 'Ten temat zostaÅ‚ ustawiony jako baner . BÄ™dzie widoczny na górze każdej strony, póki nie zostanie ukryty przez użytkownika.' + enabled: 'ustawiÅ‚ ten baner %{when}. BÄ™dzie widoczny na górze każdej strony, póki nie zostanie ukryty przez użytkownika.' disabled: 'Ten temat nie jest już banerem. Nie bÄ™dzie dalej wyÅ›wietlany na górze każdej strony.' topic_admin_menu: "akcje administratora" wizard_required: "Witaj na Twoim na nowym forum Discourse! Zacznijmy od kreatora ustawieÅ„ ✨" emails_are_disabled: "WysyÅ‚anie e-maili zostaÅ‚o globalnie wyłączone przez administracjÄ™. Powiadomienia e-mail nie bÄ™dÄ… dostarczane." + bootstrap_mode_enabled: "Aby uÅ‚atwić uruchomienie Twojej strony, jesteÅ› w trybie bootstrap. Wszyscy nowi użytkownicy otrzymajÄ… poziom zaufania 1 i bÄ™dÄ… otrzymywać codzienne wiadomoÅ›ci e-mail. To zostanie automatyczonie wyłączone, kiedy %{min_users}osób dołączy." + bootstrap_mode_disabled: "Tryb bootstrap zostanie wyłączony w ciÄ…gu 24 godzin." themes: default_description: "DomyÅ›lny" s3: @@ -224,15 +226,16 @@ pl_PL: show_help: "opcje" links: "OdnoÅ›niki" links_lowercase: - few: linki - many: linków - one: link - other: linków + one: "link" + few: "linki" + many: "linków" + other: "linków" faq: "FAQ" guidelines: "Przewodnik" privacy_policy: "Polityka prywatnoÅ›ci" privacy: "Prywatność" - terms_of_service: "Warunki użytkowania serwisu" + tos: "Warunki użytkowania serwisu" + rules: "Zasady" mobile_view: "Wersja mobilna" desktop_view: "Wersja komputerowa" you: "Ty" @@ -251,10 +254,10 @@ pl_PL: max_of_count: "max z {{count}}" alternation: "lub" character_count: - few: '{{count}} znaki' - many: '{{count}} znaków' - one: 1 znak - other: '{{count}} znaków' + one: "1 znak" + few: "{{count}} znaki" + many: "{{count}} znaków" + other: "{{count}} znaków" suggested_topics: title: "Sugerowane tematy" pm_title: "sugerowane wiadomoÅ›ci" @@ -288,21 +291,23 @@ pl_PL: last_read: "to ostatni przeczytany przez ciebie wpis: kliknij, aby dodać zakÅ‚adkÄ™" remove: "UsuÅ„ zakÅ‚adkÄ™" confirm_clear: "Czy na pewno chcesz usunąć wszystkie zakÅ‚adki ustawione w tym temacie?" + drafts: + remove: "UsuÅ„" topic_count_latest: - few: Zobacz {{count}} nowe albo zaktualizowane tematy - many: Zobacz {{count}} nowych albo zaktualizowanych tematów - one: Zobacz {{count}} nowy albo zaktualizowany temat - other: Zobacz {{count}} nowych albo zaktualizowanych tematów + one: "Zobacz {{count}} nowy albo zaktualizowany temat" + few: "Zobacz {{count}} nowe albo zaktualizowane tematy" + many: "Zobacz {{count}} nowych albo zaktualizowanych tematów" + other: "Zobacz {{count}} nowych albo zaktualizowanych tematów" topic_count_unread: - few: Zobacz {{count}} nieprzeczytane tematy - many: Zobacz {{count}} nieprzeczytanych tematów - one: Zobacz {{count}} nieprzeczytany temat - other: Zobacz {{count}} nieprzeczytanych tematów + one: "Zobacz {{count}} nieprzeczytany temat" + few: "Zobacz {{count}} nieprzeczytane tematy" + many: "Zobacz {{count}} nieprzeczytanych tematów" + other: "Zobacz {{count}} nieprzeczytanych tematów" topic_count_new: - few: Zobacz {{count}} nowe tematy - many: Zobacz {{count}} nowych tematów - one: Zobacz {{count}} nowy temat - other: Zobacz {{count}} nowych tematów + one: "Zobacz {{count}} nowy temat" + few: "Zobacz {{count}} nowe tematy" + many: "Zobacz {{count}} nowych tematów" + other: "Zobacz {{count}} nowych tematów" preview: "podglÄ…d" cancel: "anuluj" save: "Zapisz zmiany" @@ -340,20 +345,20 @@ pl_PL: cancel: "Anuluj" view_pending: "wyÅ›wietl oczekujÄ…ce wpisy" has_pending_posts: - few: Ten temat posiada {{count}} wpisy oczekujÄ…ce na akceptacjÄ™ - many: Ten temat posiada {{count}} wpisów oczekujÄ…cych na akceptacjÄ™ - one: Ten temat posiada 1 wpis oczekujÄ…cy na akceptacjÄ™ - other: Ten temat posiada {{count}} wpisów oczekujÄ…cych na akceptacjÄ™ + one: "Ten temat posiada 1 wpis oczekujÄ…cy na akceptacjÄ™" + few: "Ten temat posiada {{count}} wpisy oczekujÄ…ce na akceptacjÄ™" + many: "Ten temat posiada {{count}} wpisów oczekujÄ…cych na akceptacjÄ™" + other: "Ten temat posiada {{count}} wpisów oczekujÄ…cych na akceptacjÄ™" confirm: "Zapisz zmiany" delete_prompt: "Czy na pewno chcesz usunąć %{username}? To spowoduje usuniÄ™cie wszystkich wiadomoÅ›ci, zablokowanie adresu e-mail i adresu IP tego użytkownika." approval: title: "Wpis wymaga zatwierdzenia" description: "Twój nowy wpis zostaÅ‚ umieszczony w kolejce i pojawi siÄ™ po zatwierdzeniu przez moderatora. Prosimy o cierpliwość." pending_posts: - few: Posiadasz {{count}} oczekujÄ…ce wpisy. - many: Posiadasz {{count}} oczekujÄ…cych wpisów. - one: Posiadasz 1 oczekujÄ…cy wpis. - other: Posiadasz {{count}} oczekujÄ…cych wpisów. + one: "Posiadasz 1 oczekujÄ…cy wpis." + few: "Posiadasz {{count}} oczekujÄ…ce wpisy." + many: "Posiadasz {{count}} oczekujÄ…cych wpisów." + other: "Posiadasz {{count}} oczekujÄ…cych wpisów." ok: "OK" user_action: user_posted_topic: "{{user}} tworzy temat" @@ -387,10 +392,10 @@ pl_PL: posts_read: "Przeczytane" posts_read_long: "Przeczytane wpisy" total_rows: - few: '%{count} użytkownicy' - many: '%{count} użytkowników' - one: 1 użytkownik - other: '%{count} użytkowników' + one: "1 użytkownik" + few: "%{count} użytkownicy" + many: "%{count} użytkowników" + other: "%{count} użytkowników" group_histories: actions: change_group_setting: "ZmieÅ„ ustawienia grupy" @@ -466,10 +471,10 @@ pl_PL: is_group_user: "CzÅ‚onek" is_group_owner: "WÅ‚aÅ›ciciel" title: - few: Grupy - many: Grup - one: Grupa - other: Grup + one: "Grupa" + few: "Grupy" + many: "Grup" + other: "Grup" activity: "Aktywność" members: title: "CzÅ‚onkowie" @@ -534,15 +539,12 @@ pl_PL: "14": "OczekujÄ…ce" categories: all: "wszystkie kategorie" - all_subcategories: "wszystkie w %{categoryName}" no_subcategory: "żadne" category: "Kategoria" category_list: "WyÅ›wietl listÄ™ kategorii" reorder: title: "ZmieÅ„ kolejność kategorii" title_long: "ZmieÅ„ kolejność listy kategorii" - fix_order: "Popraw pozycje" - fix_order_tooltip: "Nie wszystkie kategorie posiadajÄ… unikalny numer porzÄ…dkowy, co może wygenerować nieoczekiwane wyniki." save: "Zapisz kolejność" apply_all: "Zastosuj" position: "Pozycja" @@ -553,15 +555,15 @@ pl_PL: toggle_ordering: "przełącz kolejność kontroli" subcategories: "Podkategorie" topic_sentence: - few: Kilka tematów - many: '%{count} tematów' - one: 1 temat - other: '%{count} tematów' + one: "1 temat" + few: "Kilka tematów" + many: "%{count} tematów" + other: "%{count} tematów" topic_stat_sentence: - few: 'ostatni %{unit}: %{count} nowe tematy.' - many: 'ostatni %{unit}: %{count} nowych tematów.' - one: 'ostatni %{unit}: %{count} nowy temat.' - other: 'ostatni %{unit}: %{count} nowych tematów.' + one: "ostatni %{unit}: %{count} nowy temat." + few: "ostatni %{unit}: %{count} nowe tematy." + many: "ostatni %{unit}: %{count} nowych tematów." + other: "ostatni %{unit}: %{count} nowych tematów." ip_lookup: title: Wyszukiwanie adresu IP hostname: Nazwa hosta @@ -678,6 +680,7 @@ pl_PL: revoke_access: "Zablokuj dostÄ™p" undo_revoke_access: "Cofnij zablokowanie dostÄ™pu" api_approved: "Zatwierdzony:" + api_last_used_at: "Ostatnio użyto:" theme: "Motyw" home: "DomyÅ›lna strona domowa" staff_counters: @@ -731,7 +734,6 @@ pl_PL: error: "WystÄ…piÅ‚ błąd podczas zmiany tej wartoÅ›ci." change_username: title: "ZmieÅ„ nazwÄ™ użytkownika" - confirm: "Jeżeli zmienisz swojÄ… nazwÄ™ użytkownika, wszystkie wczeÅ›niejsze cytaty twoich wpisów oraz wzmianki przez @nazwa przestanÄ… dziaÅ‚ać. Czy jesteÅ› absolutnie pewny że tego chcesz?" taken: "Przykro nam, ale ta nazwa jest zajÄ™ta." invalid: "Ta nazwa jest niepoprawna. Powinna zawierać jedynie liczby i litery." change_email: @@ -751,7 +753,6 @@ pl_PL: upload_title: "WyÅ›lij swojÄ… grafikÄ™" upload_picture: "WyÅ›lij grafikÄ™" image_is_not_a_square: "Uwaga: grafika zostaÅ‚a przyciÄ™ta ponieważ jej wysokość i szerokość nie byÅ‚y równe. " - cache_notice: "Twój awatar zostaÅ‚ pomyÅ›lnie zmieniony, ale z uwagi na cache przeglÄ…darki nowa wersja może pojawić siÄ™ dopiero za jakiÅ› czas." change_profile_background: title: "TÅ‚o profilu" instructions: "TÅ‚a w profilach sÄ… wycentrowane i posiadajÄ… domyÅ›lnÄ… szerokość 850px." @@ -766,10 +767,12 @@ pl_PL: authenticated: "Twój email zostaÅ‚ potwierdzony przez {{provider}}" frequency_immediately: "WyÅ›lemy powiadomienie jeÅ›li wskazana rzecz nie zostaÅ‚a jeszcze przez Ciebie przeczytana." frequency: - few: Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatnich {{count}} minut. - many: Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatnich {{count}} minut. - one: Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatniej minuty. - other: Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatnich {{count}} minut. + one: "Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatniej minuty." + few: "Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatnich {{count}} minut." + many: "Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatnich {{count}} minut." + other: "Otrzymasz e-mail tylko jeÅ›li nie widzieliÅ›my CiÄ™ w ciÄ…gu ostatnich {{count}} minut." + associated_accounts: + connect: "Połącz" name: title: "PeÅ‚na nazwa" instructions: "twoja peÅ‚na nazwa (opcjonalnie)" @@ -855,10 +858,10 @@ pl_PL: sent: "WysÅ‚ane" none: "Brak zaproszeÅ„ do wyÅ›wietlenia." truncated: - few: WyÅ›wietlanie {{count}} pierwszych zaproszeÅ„. - many: WyÅ›wietlanie {{count}} pierwszych zaproszeÅ„. - one: WyÅ›wietlanie pierwszego zaproszenia. - other: WyÅ›wietlanie {{count}} pierwszych zaproszeÅ„. + one: "WyÅ›wietlanie pierwszego zaproszenia." + few: "WyÅ›wietlanie {{count}} pierwszych zaproszeÅ„." + many: "WyÅ›wietlanie {{count}} pierwszych zaproszeÅ„." + other: "WyÅ›wietlanie {{count}} pierwszych zaproszeÅ„." redeemed: "CofniÄ™te zaproszenia" redeemed_tab: "PrzyjÄ™te" redeemed_tab_with_count: "Zrealizowane ({{count}})" @@ -904,45 +907,45 @@ pl_PL: stats: "Statystyki" time_read: "czas odczytu" topic_count: - few: utworzono tematów - many: utworzono tematy - one: utworzono temat - other: utworzono tematy + one: "utworzono temat" + few: "utworzono tematów" + many: "utworzono tematy" + other: "utworzono tematy" post_count: - few: utworzonych postów - many: utworzono posty - one: utworzono post - other: utworzono posty + one: "utworzono post" + few: "utworzonych postów" + many: "utworzono posty" + other: "utworzono posty" likes_given: - few: dano - many: dano - one: dano - other: dano + one: "dano" + few: "dano" + many: "dano" + other: "dano" likes_received: - few: otrzymano - many: otrzymano - one: otrzymano - other: otrzymano + one: "otrzymano" + few: "otrzymano" + many: "otrzymano" + other: "otrzymano" days_visited: - few: dni odwiedzin - many: dni odwiedzin - one: dzieÅ„ odwiedzin - other: dni odwiedzin + one: "dzieÅ„ odwiedzin" + few: "dni odwiedzin" + many: "dni odwiedzin" + other: "dni odwiedzin" topics_entered: - few: przeczytane tematy - many: przeczytane tematy - one: przeczytany temat - other: przeczytane tematy + one: "przeczytany temat" + few: "przeczytane tematy" + many: "przeczytane tematy" + other: "przeczytane tematy" posts_read: - few: przeczytanych postów - many: przeczytane posty - one: przeczytany post - other: przeczytane posty + one: "przeczytany post" + few: "przeczytanych postów" + many: "przeczytane posty" + other: "przeczytane posty" bookmark_count: - few: zakÅ‚adki - many: zakÅ‚adki - one: zakÅ‚adka - other: zakÅ‚adki + one: "zakÅ‚adka" + few: "zakÅ‚adki" + many: "zakÅ‚adki" + other: "zakÅ‚adki" top_replies: "Najlepsze odpowiedzi" no_replies: "Póki co brak odpowiedzi." more_replies: "WiÄ™cej odpowiedzi" @@ -958,7 +961,7 @@ pl_PL: most_liked_users: "Najbardziej lajkowane" most_replied_to_users: "NajwiÄ™cej odpowiedzi do" no_likes: "Brak lajków." - associated_accounts: "PowiÄ…zane konta" + replies: "Odpowiedzi" ip_address: title: "Ostatni adres IP" registration_ip_address: @@ -1011,10 +1014,10 @@ pl_PL: reached: "%{relativeAge} – %{rate} osiÄ…gnÄ…Å‚ ustawiony limit %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} przekroczyÅ‚ ustawiony limit %{siteSettingRate}." rate: - few: '%{count} błędy/%{duration}' - many: '%{count} błędów/%{duration}' - one: 1 błąd/%{duration} - other: '%{count} błędów/%{duration}' + one: "1 błąd/%{duration}" + few: "%{count} błędy/%{duration}" + many: "%{count} błędów/%{duration}" + other: "%{count} błędów/%{duration}" learn_more: "dowiedz siÄ™ wiÄ™cej…" all_time: 'łącznie' all_time_desc: 'łącznie utworzonych tematów' @@ -1032,17 +1035,15 @@ pl_PL: time_read: Przeczytane last_reply_lowercase: ostatnia odpowiedź replies_lowercase: + one: odpowiedź few: odpowiedzi many: odpowiedzi - one: odpowiedź other: odpowiedzi signup_cta: sign_up: "Rejestracja" hide_session: "Przypomnij mi jutro" hide_forever: "nie, dziÄ™kujÄ™" hidden_for_session: "Ok, zapytamy jutro. PamiÄ™taj, że konto możesz w każdej chwili zaÅ‚ożyć klikajÄ…c na 'Logowanie'." - intro: "Hej! :heart_eyes: WyglÄ…da na to, że zainteresowaÅ‚a CiÄ™ dyskusja, ale nie posiadasz jeszcze konta." - value_prop: "JeÅ›li stworzysz konto, zapamiÄ™tamy przeczytane przez Ciebie wpisy i tematy, dziÄ™ki czemu zawsze powrócisz do odpowiedniego miejsca. Otrzymasz też powiadomienia o nowych wpisach. Dodatkowo możliwe bÄ™dzie polubienie ciekawych wpisów :heartbeat:" summary: enabled_description: "PrzeglÄ…dasz podsumowanie tego tematu: widoczne sÄ… jedynie najbardziej wartoÅ›ciowe wpisy zdaniem uczestników. " description: "Jest {{replyCount}} odpowiedzi." @@ -1056,7 +1057,6 @@ pl_PL: disable: "Pokaż usuniÄ™te wpisy." private_message_info: title: "Wiadomość" - invite: "ZaproÅ› innych" remove_allowed_user: "Czy naprawdÄ™ chcesz usunąć {{name}} z tej dyskusji?" remove_allowed_group: "Czy naprawdÄ™ chcesz usunąć {{name}} z tej wiadomoÅ›ci?" email: 'Email' @@ -1116,25 +1116,28 @@ pl_PL: preferences: "Musisz siÄ™ zalogować, aby zmieniać swoje ustawienia." forgot: "Nie pamiÄ™tam konta" not_approved: "Twoje konto nie zostaÅ‚o jeszcze aktywowane. Zostaniesz powiadomiony emailem gdy bÄ™dziesz mógÅ‚ się zalogować." - google: - title: "przez Google" - message: "Uwierzytelnianie przy pomocy konta Google (upewnij siÄ™, że blokada wyskakujÄ…cych okienek nie jest włączona)" google_oauth2: + name: "Google" title: "przez Google" message: "Uwierzytelniam przy pomocy Google (upewnij siÄ™ wyskakujÄ…ce okienka nie sÄ… blokowane)" twitter: + name: "Twitter" title: "przez Twitter" message: "Uwierzytelnianie przy pomocy konta na Twitterze (upewnij siÄ™, że blokada wyskakujÄ…cych okienek nie jest włączona)" instagram: + name: "Instagram" title: "z Instagram" message: "Uwierzytelnianie przy pomocy konta na Instagramie (upewnij siÄ™, że blokada wyskakujÄ…cych okienek nie jest włączona)" facebook: + name: "Facebook" title: "przez Facebook" message: "Uwierzytelnianie przy pomocy konta Facebook (upewnij siÄ™, że blokada wyskakujÄ…cych okienek nie jest włączona)" yahoo: + name: "Yahoo" title: "przez Yahoo" message: "Uwierzytelnianie przy pomocy konta Yahoo (upewnij siÄ™, że blokada wyskakujÄ…cych okienek nie jest włączona)" github: + name: "GitHub" title: "przez GitHub" message: "Uwierzytelnianie przez GitHub (upewnij siÄ™, że blokada wyskakujÄ…cych okienek nie jest włączona)" invites: @@ -1175,15 +1178,15 @@ pl_PL: filter_placeholder: Wyszukiwanie... create: "Stwórz: '{{content}}'" max_content_reached: - few: Może wybrać tylko {{count}} elementy. - many: Możesz wybrać tylko {{count}} elementów. - one: Możesz wybrać tylko jeden element. - other: Możesz wybrać tylko {{count}} elementów. + one: "Możesz wybrać tylko jeden element." + few: "Może wybrać tylko {{count}} elementy." + many: "Możesz wybrać tylko {{count}} elementów." + other: "Możesz wybrać tylko {{count}} elementów." min_content_not_reached: - few: Wybierz co najmniej {{count}} elementy. - many: Wybierz co najmniej {{count}} elementów. - one: Wybierz co najmniej jeden element. - other: Wybierz co najmniej {{count}} elementów. + one: "Wybierz co najmniej jeden element." + few: "Wybierz co najmniej {{count}} elementy." + many: "Wybierz co najmniej {{count}} elementów." + other: "Wybierz co najmniej {{count}} elementów." emoji_picker: filter_placeholder: Szukaj emoji people: Ludzie @@ -1222,10 +1225,10 @@ pl_PL: similar_topics: "Twój temat jest podobny do…" drafts_offline: "szkice offline" group_mentioned: - few: WspominajÄ…c {{group}}, powiadomisz {{count}} osoby – czy jesteÅ› pewien? - many: WspominajÄ…c {{group}}, powiadomisz {{count}} osób – czy jesteÅ› pewien? - one: WspominajÄ…c {{group}}, powiadomisz 1 osobÄ™ – czy jesteÅ› pewien? - other: WspominajÄ…c {{group}}, powiadomisz {{count}} osób –czy jesteÅ› pewien? + one: "WspominajÄ…c {{group}}, powiadomisz 1 osobÄ™ – czy jesteÅ› pewien?" + few: "WspominajÄ…c {{group}}, powiadomisz {{count}} osoby – czy jesteÅ› pewien?" + many: "WspominajÄ…c {{group}}, powiadomisz {{count}} osób – czy jesteÅ› pewien?" + other: "WspominajÄ…c {{group}}, powiadomisz {{count}} osób –czy jesteÅ› pewien?" cannot_see_mention: category: "WspomniaÅ‚eÅ› o {{username}} lecz nie zostanÄ… oni powiadomieni ponieważ nie majÄ… dostÄ™pu do tej kategorii. Dodaj ich do grupy która ma dostÄ™p do tej kategorii." private: "WspomniaÅ‚eÅ› o {{username}} lecz nie zostanÄ… powiadomieni ponieważ nie mogÄ… odczytać tej wiadomoÅ›ci . BÄ™dziesz musiaÅ‚ ich zaprosić do odczytania tej wiadomoÅ›ci " @@ -1295,15 +1298,15 @@ pl_PL: notifications: tooltip: regular: - few: 'Nieprzeczytanych powiadomieÅ„: {{count}}' - many: 'Nieprzeczytanych powiadomieÅ„: {{count}}' - one: 1 nieprzeczytane powiadomienie - other: 'Nieprzeczytanych powiadomieÅ„: {{count}}' + one: "1 nieprzeczytane powiadomienie" + few: "Nieprzeczytanych powiadomieÅ„: {{count}}" + many: "Nieprzeczytanych powiadomieÅ„: {{count}}" + other: "Nieprzeczytanych powiadomieÅ„: {{count}}" message: - few: 'Nieodczytane wiadomoÅ›ci: {{count}}' - many: 'Nieodczytane wiadomoÅ›ci: {{count}}' - one: 'Nieodczytane wiadomoÅ›ci: {{count}}' - other: 'Nieodczytane wiadomoÅ›ci: 1' + one: "Nieodczytane wiadomoÅ›ci: {{count}}" + few: "Nieodczytane wiadomoÅ›ci: {{count}}" + many: "Nieodczytane wiadomoÅ›ci: {{count}}" + other: "Nieodczytane wiadomoÅ›ci: 1" title: "powiadomienia o wywoÅ‚anej @nazwie, odpowiedzi do twoich wpisów i tematów, prywatne wiadomoÅ›ci, itp" none: "Nie udaÅ‚o siÄ™ zaÅ‚adować listy powiadomieÅ„." empty: "Nie znaleziono powiadomieÅ„." @@ -1318,10 +1321,10 @@ pl_PL: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - few: {{username}}, {{username2}} i {{count}} inne osoby {{description}} - many: {{username}}, {{username2}} i {{count}} innych osób {{description}} - one: {{username}}, {{username2}} i 1 inna osoba {{description}} - other: {{username}}, {{username2}} i {{count}} innych osób {{description}} + one: "{{username}}, {{username2}} i 1 inna osoba {{description}}" + few: "{{username}}, {{username2}} i {{count}} inne osoby {{description}}" + many: "{{username}}, {{username2}} i {{count}} innych osób {{description}}" + other: "{{username}}, {{username2}} i {{count}} innych osób {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1332,10 +1335,10 @@ pl_PL: topic_reminder: "{{username}} {{description}}" watching_first_post: "Nowy temat {{description}}" group_message_summary: - few: masz {{count}} wiadomoÅ›ci w skrzynce odbiorczej {{group_name}} - many: masz {{count}} wiadomoÅ›ci w skrzynce odbiorczej {{group_name}} - one: masz {{count}} wiadomość w skrzynce odbiorczej {{group_name}} - other: masz {{count}} wiadomoÅ›ci w skrzynce odbiorczej {{group_name}} + one: "masz {{count}} wiadomość w skrzynce odbiorczej {{group_name}}" + few: "masz {{count}} wiadomoÅ›ci w skrzynce odbiorczej {{group_name}}" + many: "masz {{count}} wiadomoÅ›ci w skrzynce odbiorczej {{group_name}}" + other: "masz {{count}} wiadomoÅ›ci w skrzynce odbiorczej {{group_name}}" popup: mentioned: '{{username}} wspomina o tobie w "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} wspomniaÅ‚ o Tobie w "{{topic}}" - {{site_title}}' @@ -1453,10 +1456,10 @@ pl_PL: notification_level: "Powiadomienia" choose_new_category: "Wybierz nowÄ… kategoriÄ™ dla tematów:" selected: - few: Zaznaczono {{count}} tematy. - many: Zaznaczono {{count}} tematów. - one: Zaznaczono 1 temat. - other: Zaznaczono {{count}} tematów. + one: "Zaznaczono 1 temat." + few: "Zaznaczono {{count}} tematy." + many: "Zaznaczono {{count}} tematów." + other: "Zaznaczono {{count}} tematów." change_tags: "ZmieÅ„ tagi" append_tags: "Dodaj tagi" choose_new_tags: "Wybierz nowe tagi dla tych tematów:" @@ -1489,10 +1492,10 @@ pl_PL: search: "Nie znaleziono wiÄ™cej wyników." topic: filter_to: - few: '{{count}} posty w temacie' - many: '{{count}} postów w temacie' - one: 1 post w temacie - other: '{{count}} postów w temacie' + one: "1 post w temacie" + few: "{{count}} posty w temacie" + many: "{{count}} postów w temacie" + other: "{{count}} postów w temacie" create: 'Nowy temat' create_long: 'Utwórz nowy temat' private_message: 'Napisz wiadomość' @@ -1506,14 +1509,14 @@ pl_PL: new: 'nowy temat' unread: 'nieprzeczytane' new_topics: + one: '1 nowy temat' few: '{{count}} nowe tematy' many: '{{count}} nowych tematów' - one: 1 nowy temat other: '{{count}} nowych tematów' unread_topics: + one: '1 nieprzeczytany temat' few: '{{count}} nieprzeczytane tematy' many: '{{count}} nieprzeczytanych tematów' - one: 1 nieprzeczytany temat other: '{{count}} nieprzeczytanych tematów' title: 'Temat' invalid_access: @@ -1527,25 +1530,25 @@ pl_PL: title: "Temat nie zostaÅ‚ znaleziony" description: "Przepraszamy, ale temat nie zostaÅ‚ znaleziony. Możliwe, że zostaÅ‚ usuniÄ™ty przez moderatora?" total_unread_posts: - few: masz {{count}} nieprzeczytane wpisy w tym temacie - many: masz {{count}} nieprzeczytanych wpisów w tym temacie - one: masz 1 nieprzeczytany wpis w tym temacie - other: masz {{count}} nieprzeczytanych wpisów w tym temacie + one: "masz 1 nieprzeczytany wpis w tym temacie" + few: "masz {{count}} nieprzeczytane wpisy w tym temacie" + many: "masz {{count}} nieprzeczytanych wpisów w tym temacie" + other: "masz {{count}} nieprzeczytanych wpisów w tym temacie" unread_posts: - few: masz {{count}} nieprzeczytane wpisy w tym temacie - many: masz {{count}} nieprzeczytanych wpisów w tym temacie - one: masz 1 nieprzeczytany wpis w tym temacie - other: masz {{count}} nieprzeczytanych wpisów w tym temacie + one: "masz 1 nieprzeczytany wpis w tym temacie" + few: "masz {{count}} nieprzeczytane wpisy w tym temacie" + many: "masz {{count}} nieprzeczytanych wpisów w tym temacie" + other: "masz {{count}} nieprzeczytanych wpisów w tym temacie" new_posts: - few: od Twoich ostatnich odwiedzin pojawiÅ‚y siÄ™ {{count}} nowe wpisy - many: od Twoich ostatnich odwiedzin pojawiÅ‚o siÄ™ {{count}} nowych wpisów - one: od Twoich ostatnich odwiedzin pojawiÅ‚ siÄ™ 1 nowy wpis - other: od Twoich ostatnich odwiedzin pojawiÅ‚o siÄ™ {{count}} nowych wpisów + one: "od Twoich ostatnich odwiedzin pojawiÅ‚ siÄ™ 1 nowy wpis" + few: "od Twoich ostatnich odwiedzin pojawiÅ‚y siÄ™ {{count}} nowe wpisy" + many: "od Twoich ostatnich odwiedzin pojawiÅ‚o siÄ™ {{count}} nowych wpisów" + other: "od Twoich ostatnich odwiedzin pojawiÅ‚o siÄ™ {{count}} nowych wpisów" likes: - few: temat zawiera {{count}} lajki - many: temat zawiera {{count}} lajków - one: temat zawiera 1 lajk - other: temat zawiera {{count}} lajków + one: "temat zawiera 1 lajk" + few: "temat zawiera {{count}} lajki" + many: "temat zawiera {{count}} lajków" + other: "temat zawiera {{count}} lajków" back_to_list: "Wróć do Listy Tematów" options: "Opcje tematu" show_links: "pokaż odnoÅ›niki z tego tematu" @@ -1606,10 +1609,10 @@ pl_PL: auto_reminder: "Otrzymasz przypomnienie o tym temacie %{timeLeft}." auto_close_title: 'Ustawienia automatycznego zamykania' auto_close_immediate: - few: Ostatni wpis w tym temacie zostaÅ‚ zamieszczony %{hours} godziny temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty. - many: Ostatni wpis w tym temacie zostaÅ‚ zamieszczony %{count} godzin temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty. - one: Ostatni wpis w tym temacie zostaÅ‚ zamieszczony 1 godzinÄ™ temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty. - other: Ostatni wpis w tym temacie zostaÅ‚ zamieszczony %{hours} godzin temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty. + one: "Ostatni wpis w tym temacie zostaÅ‚ zamieszczony 1 godzinÄ™ temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty." + few: "Ostatni wpis w tym temacie zostaÅ‚ zamieszczony %{hours} godziny temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty." + many: "Ostatni wpis w tym temacie zostaÅ‚ zamieszczony %{count} godzin temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty." + other: "Ostatni wpis w tym temacie zostaÅ‚ zamieszczony %{hours} godzin temu, wiÄ™c zostanie on natychmiastowo zamkniÄ™ty." timeline: back: "Wstecz" back_description: "Wróć do ostatniego nieprzeczytanego postu" @@ -1716,10 +1719,10 @@ pl_PL: pin_validation: "PrzypiÄ™cie tego tematu wymaga podania daty." not_pinned: "Brak przypiÄ™tych tematów w {{categoryLink}}." already_pinned: - few: 'Tematy przypiÄ™te w {{categoryLink}}: {{count}}' - many: 'Tematy przypiÄ™te w {{categoryLink}}: {{count}}' - one: 'Tematy przypiÄ™te w {{categoryLink}}: 1' - other: 'Tematy przypiÄ™te w {{categoryLink}}: {{count}}' + one: "Tematy przypiÄ™te w {{categoryLink}}: 1" + few: "Tematy przypiÄ™te w {{categoryLink}}: {{count}}" + many: "Tematy przypiÄ™te w {{categoryLink}}: {{count}}" + other: "Tematy przypiÄ™te w {{categoryLink}}: {{count}}" pin_globally: "Wyróżnij ten temat przypinajÄ…c go na górze wszystkich list do" confirm_pin_globally: "Czy na pewno chcesz globalnie przypiąć kolejny temat? Masz już {{count}} przypiÄ™tych tematów -- zbyt wiele może obniżyć czytelność innych aktywnych tematów." unpin_globally: "UsuÅ„ wyróżnienie dla tego tematu odpinajÄ…c go z poczÄ…tku wszystkich list." @@ -1727,10 +1730,10 @@ pl_PL: global_pin_note: "Każdy użytkownik może samodzielnie usunąć przypiÄ™cie dla samego siebie." not_pinned_globally: "Brak przypiÄ™tych globalnie tematów." already_pinned_globally: - few: 'Tematy przypiÄ™te globalnie: {{count}}.' - many: 'Tematy przypiÄ™te globalnie: {{count}}.' - one: 'Tematy przypiÄ™te globalnie: 1.' - other: 'Tematy przypiÄ™te globalnie: {{count}}.' + one: "Tematy przypiÄ™te globalnie: 1." + few: "Tematy przypiÄ™te globalnie: {{count}}." + many: "Tematy przypiÄ™te globalnie: {{count}}." + other: "Tematy przypiÄ™te globalnie: {{count}}." make_banner: "Ustaw ten temat jako baner wyÅ›wietlany na górze każdej strony." remove_banner: "UsuÅ„ ten temat jako baner wyÅ›wietlany na górze każdej strony." banner_note: "Użytkownicy mogÄ… usunąć baner zamykajÄ…c go przyciskiem. Tylko jeden temat może być banerem w danej chwili." @@ -1767,10 +1770,10 @@ pl_PL: login_reply: 'Zaloguj siÄ™, aby odpowiedzieć' filters: n_posts: - few: '{{count}} wpisy' - many: '{{count}} wpisów' - one: 1 wpis - other: '{{count}} wpisów' + one: "1 wpis" + few: "{{count}} wpisy" + many: "{{count}} wpisów" + other: "{{count}} wpisów" cancel: "UsuÅ„ filtr" split_topic: title: "PrzenieÅ› do nowego tematu" @@ -1778,19 +1781,19 @@ pl_PL: topic_name: "Nazwa Nowego Tematu" error: "WystÄ…piÅ‚ błąd podczas przenoszenia wpisów do nowego tematu." instructions: - few: Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z {{count}} wybranych przez ciebie wpisów. - many: Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z {{count}} wybranych przez ciebie wpisów. - one: Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z wybranego przez ciebie wpisu. - other: Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z {{count}} wybranych przez ciebie wpisów. + one: "Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z wybranego przez ciebie wpisu." + few: "Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z {{count}} wybranych przez ciebie wpisów." + many: "Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z {{count}} wybranych przez ciebie wpisów." + other: "Masz zamiar utworzyć nowy temat, skÅ‚adajÄ…cy siÄ™ z {{count}} wybranych przez ciebie wpisów." merge_topic: title: "PrzenieÅ› do IstniejÄ…cego Tematu" action: "przenieÅ› do istniejÄ…cego tematu" error: "WystÄ…piÅ‚ błąd podczas przenoszenia wpisów do danego tematu." instructions: - few: Wybierz temat, do którego chcesz przenieść wybrane {{count}} wpisy. - many: Wybierz temat, do którego chcesz przenieść {{count}} wybranych wpisów. - one: Wybierz temat, do którego chcesz przenieÅ› ten wpis. - other: Wybierz temat, do którego chcesz przenieść {{count}} wybranych wpisów. + one: "Wybierz temat, do którego chcesz przenieÅ› ten wpis." + few: "Wybierz temat, do którego chcesz przenieść wybrane {{count}} wpisy." + many: "Wybierz temat, do którego chcesz przenieść {{count}} wybranych wpisów." + other: "Wybierz temat, do którego chcesz przenieść {{count}} wybranych wpisów." merge_posts: title: "Scal wybrane posty" action: "scal wybrane posty" @@ -1802,10 +1805,10 @@ pl_PL: label: "Nowy wÅ‚aÅ›ciciel wpisów" placeholder: "nazwa nowego wÅ‚aÅ›ciciela" instructions: - few: Wybierz nowego wÅ‚aÅ›ciciela dla {{count}} wpisów autorstwa {{old_user}}. - many: Wybierz nowego wÅ‚aÅ›ciciela dla {{count}} wpisów autorstwa {{old_user}}. - one: Wybierz nowego wÅ‚aÅ›ciciela wpisu autorstwa {{old_user}}. - other: Wybierz nowego wÅ‚aÅ›ciciela dla {{count}} wpisów autorstwa {{old_user}}. + one: "Wybierz nowego wÅ‚aÅ›ciciela wpisu autorstwa {{old_user}}." + few: "Wybierz nowego wÅ‚aÅ›ciciela dla {{count}} wpisów autorstwa {{old_user}}." + many: "Wybierz nowego wÅ‚aÅ›ciciela dla {{count}} wpisów autorstwa {{old_user}}." + other: "Wybierz nowego wÅ‚aÅ›ciciela dla {{count}} wpisów autorstwa {{old_user}}." change_timestamp: title: "zmieÅ„ znacznik czasu" action: "zmieÅ„ znacznik czasu" @@ -1826,10 +1829,10 @@ pl_PL: select_all: zaznacz wszystkie deselect_all: odznacz wszystkie description: - few: Wybrano {{count}} wpisy. - many: Wybrano {{count}} wpisów. one: Wybrano 1 wpis. - other: Wybrano {{count}} wpisów. + few: "Wybrano {{count}} wpisy." + many: "Wybrano {{count}} wpisów." + other: "Wybrano {{count}} wpisów." post: quote_reply: "Cytuj" edit_reason: "Powód" @@ -1843,38 +1846,38 @@ pl_PL: show_full: "Pokaż peÅ‚ny wpis" show_hidden: 'Zobacz ukrytÄ… zawartość.' deleted_by_author: - few: '(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godziny, chyba że zostanie oflagowany) ' - many: '(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godzin, chyba że zostanie oflagowany) ' - one: '(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godzinÄ™, chyba że zostanie oflagowany) ' - other: '(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godzin, chyba że zostanie oflagowany) ' + one: "(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godzinÄ™, chyba że zostanie oflagowany) " + few: "(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godziny, chyba że zostanie oflagowany) " + many: "(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godzin, chyba że zostanie oflagowany) " + other: "(wpis wycofany przez autora, zostanie automatycznie usuniÄ™ty za %{count} godzin, chyba że zostanie oflagowany) " expand_collapse: "rozwiÅ„/zwiÅ„" gap: - few: pokaż {{count}} ukryte odpowiedzi - many: pokaż {{count}} ukrytych odpowiedzi - one: pokaż 1 ukrytÄ… odpowiedź - other: pokaż {{count}} ukrytych odpowiedzi + one: "pokaż 1 ukrytÄ… odpowiedź" + few: "pokaż {{count}} ukryte odpowiedzi" + many: "pokaż {{count}} ukrytych odpowiedzi" + other: "pokaż {{count}} ukrytych odpowiedzi" unread: "Nieprzeczytany wpis" has_replies: - few: '{{count}} odpowiedzi' - many: '{{count}} odpowiedzi' - one: '{{count}} odpowiedź' - other: '{{count}} odpowiedzi' + one: "{{count}} odpowiedź" + few: "{{count}} odpowiedzi" + many: "{{count}} odpowiedzi" + other: "{{count}} odpowiedzi" has_likes: - few: '{{count}} lajki' - many: '{{count}} lajków' - one: '{{count}} lajk' - other: '{{count}} lajków' + one: "{{count}} lajk" + few: "{{count}} lajki" + many: "{{count}} lajków" + other: "{{count}} lajków" has_likes_title: - few: '{{count}} osoby lajkujÄ… ten wpis' - many: '{{count}} osób lajkuje ten wpis' - one: 1 osoba lajkuje ten wpis - other: '{{count}} osób lajkuje ten wpis' + one: "1 osoba lajkuje ten wpis" + few: "{{count}} osoby lajkujÄ… ten wpis" + many: "{{count}} osób lajkuje ten wpis" + other: "{{count}} osób lajkuje ten wpis" has_likes_title_only_you: "lajkowany wpis" has_likes_title_you: - few: ty i {{count}} inne osoby lajkujÄ… ten wpis - many: ty i {{count}} innych osób lajkuje ten wpis - one: ty i 1 inna osoba lajkuje ten wpis - other: ty i {{count}} innych osób lajkuje ten wpis + one: "ty i 1 inna osoba lajkuje ten wpis" + few: "ty i {{count}} inne osoby lajkujÄ… ten wpis" + many: "ty i {{count}} innych osób lajkuje ten wpis" + other: "ty i {{count}} innych osób lajkuje ten wpis" errors: create: "Przepraszamy, podczas tworzenia twojego wpisu wystÄ…piÅ‚ błąd. Spróbuj ponownie." edit: "Przepraszamy, podczas edytowania twojego wpisu wystÄ…piÅ‚ błąd. Spróbuj ponownie." @@ -1924,17 +1927,16 @@ pl_PL: actions: flag: 'Oflaguj' defer_flags: - few: Ignoruj oflagowanie - many: Ignoruj flagi - one: Ignoruj flagÄ™ - other: Ignoruj flagi + one: "Ignoruj flagÄ™" + few: "Ignoruj oflagowanie" + many: "Ignoruj flagi" + other: "Ignoruj flagi" undo: off_topic: "Cofnij flagÄ™" spam: "Cofnij flagÄ™" inappropriate: "Cofnij flagÄ™" bookmark: "Cofnij zakÅ‚adkÄ™" like: "Cofnij" - vote: "Cofnij gÅ‚os" people: off_topic: "Oflagowano jako nie-na-temat" spam: "oznacz jako spam" @@ -1943,7 +1945,6 @@ pl_PL: notify_user: "WysÅ‚ano wiadomość" bookmark: "dodaj do zakÅ‚adek" like: "lajkuje to" - vote: "zagÅ‚osowaÅ‚o" by_you: off_topic: "Oznaczono jako nie-na-temat" spam: "Oflagowano jako spam" @@ -1952,95 +1953,84 @@ pl_PL: notify_user: "WysÅ‚ano wiadomość do tego użytkownika" bookmark: "Dodano zakÅ‚adkÄ™ w tym wpisie" like: "Lajkujesz ten wpis" - vote: "ZagÅ‚osowano na ten wpis" by_you_and_others: off_topic: - few: Ty i {{count}} inne osoby oznaczyliÅ›cie to jako nie-na-temat. - many: Ty i {{count}} innych osób oznaczyliÅ›cie to jako nie-na-temat. - one: Ty i 1 inna osoba oznaczyliÅ›cie to jako nie-na-temat. - other: Ty i {{count}} innych osób oznaczyliÅ›cie to jako nie-na-temat. + one: "Ty i 1 inna osoba oznaczyliÅ›cie to jako nie-na-temat." + few: "Ty i {{count}} inne osoby oznaczyliÅ›cie to jako nie-na-temat." + many: "Ty i {{count}} innych osób oznaczyliÅ›cie to jako nie-na-temat." + other: "Ty i {{count}} innych osób oznaczyliÅ›cie to jako nie-na-temat." spam: - few: Ty i {{count}} inne osoby oflagowaliÅ›cie to jako spam. - many: Ty i {{count}} innych osób oflagowaliÅ›cie to jako spam. - one: Ty i 1 inna osoba oflagowaliÅ›cie to jako spam. - other: Ty i {{count}} innych osób oflagowaliÅ›cie to jako spam. + one: "Ty i 1 inna osoba oflagowaliÅ›cie to jako spam." + few: "Ty i {{count}} inne osoby oflagowaliÅ›cie to jako spam." + many: "Ty i {{count}} innych osób oflagowaliÅ›cie to jako spam." + other: "Ty i {{count}} innych osób oflagowaliÅ›cie to jako spam." inappropriate: - few: Ty i {{count}} inne osoby oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe. - many: Ty i {{count}} innych osób oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe. - one: Ty i 1 inna osoba oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe. - other: Ty i {{count}} innych osób oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe. + one: "Ty i 1 inna osoba oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe." + few: "Ty i {{count}} inne osoby oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe." + many: "Ty i {{count}} innych osób oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe." + other: "Ty i {{count}} innych osób oflagowaliÅ›cie to jako niewÅ‚aÅ›ciwe." notify_moderators: - few: Ty i {{count}} inne osoby oflagowaliÅ›cie to do moderacji. - many: Ty i {{count}} innych osób oflagowaliÅ›cie to do moderacji. - one: Ty i 1 inna osoba oflagowaliÅ›cie to do moderacji. - other: Ty i {{count}} innych osób oflagowaliÅ›cie to do moderacji. + one: "Ty i 1 inna osoba oflagowaliÅ›cie to do moderacji." + few: "Ty i {{count}} inne osoby oflagowaliÅ›cie to do moderacji." + many: "Ty i {{count}} innych osób oflagowaliÅ›cie to do moderacji." + other: "Ty i {{count}} innych osób oflagowaliÅ›cie to do moderacji." notify_user: - few: Ty i {{count}} inne osoby wysÅ‚aliÅ›cie wiadomość do tego użytkownika - many: Ty i {{count}} innych osób wysÅ‚aliÅ›cie wiadomość do tego użytkownika - one: Ty i 1 inna osoba wysÅ‚aliÅ›cie wiadomość do tego użytkownika - other: Ty i {{count}} innych osób wysÅ‚aliÅ›cie wiadomość do tego użytkownika + one: "Ty i 1 inna osoba wysÅ‚aliÅ›cie wiadomość do tego użytkownika" + few: "Ty i {{count}} inne osoby wysÅ‚aliÅ›cie wiadomość do tego użytkownika" + many: "Ty i {{count}} innych osób wysÅ‚aliÅ›cie wiadomość do tego użytkownika" + other: "Ty i {{count}} innych osób wysÅ‚aliÅ›cie wiadomość do tego użytkownika" bookmark: - few: Ty i {{count}} inne osoby dodaliÅ›cie ten wpis do zakÅ‚adek. - many: Ty i {{count}} innych osób dodaliÅ›cie ten wpis do zakÅ‚adek. - one: Ty i 1 inna osoba dodaliÅ›cie ten wpis do zakÅ‚adek. - other: Ty i {{count}} innych osób dodaliÅ›cie ten wpis do zakÅ‚adek. + one: "Ty i 1 inna osoba dodaliÅ›cie ten wpis do zakÅ‚adek." + few: "Ty i {{count}} inne osoby dodaliÅ›cie ten wpis do zakÅ‚adek." + many: "Ty i {{count}} innych osób dodaliÅ›cie ten wpis do zakÅ‚adek." + other: "Ty i {{count}} innych osób dodaliÅ›cie ten wpis do zakÅ‚adek." like: - few: Ty i {{count}} inne osoby lajkujÄ… to. - many: Ty i {{count}} innych osób lajkuje to. - one: Ty i 1 inna osoba lajkujecie to. - other: Ty i {{count}} innych osób lajkuje to. - vote: - few: Ty i {{count}} inne osoby zagÅ‚osowaliÅ›cie za tym wpisem - many: Ty i {{count}} innych osób zagÅ‚osowaliÅ›cie za tym wpisem - one: Ty i 1 inna osoba zagÅ‚osowaliÅ›cie za tym wpisem - other: Ty i {{count}} innych osób zagÅ‚osowaliÅ›cie za tym wpisem + one: "Ty i 1 inna osoba lajkujecie to." + few: "Ty i {{count}} inne osoby lajkujÄ… to." + many: "Ty i {{count}} innych osób lajkuje to." + other: "Ty i {{count}} innych osób lajkuje to." by_others: off_topic: - few: '{{count}} osoby oflagowaÅ‚y to jako nie-na-temat' - many: '{{count}} osób oflagowaÅ‚o to jako nie-na-temat' - one: 1 osoba oflagowaÅ‚a to jako nie-na-temat - other: '{{count}} osób oflagowaÅ‚o to jako nie-na-temat' + one: "1 osoba oflagowaÅ‚a to jako nie-na-temat" + few: "{{count}} osoby oflagowaÅ‚y to jako nie-na-temat" + many: "{{count}} osób oflagowaÅ‚o to jako nie-na-temat" + other: "{{count}} osób oflagowaÅ‚o to jako nie-na-temat" spam: - few: '{{count}} osoby oflagowaÅ‚y to jako spam' - many: '{{count}} osób oflagowaÅ‚o to jako spam' - one: 1 osoba oflagowaÅ‚a to jako spam - other: '{{count}} osób oflagowaÅ‚o to jako spam' + one: "1 osoba oflagowaÅ‚a to jako spam" + few: "{{count}} osoby oflagowaÅ‚y to jako spam" + many: "{{count}} osób oflagowaÅ‚o to jako spam" + other: "{{count}} osób oflagowaÅ‚o to jako spam" inappropriate: - few: '{{count}} osoby oflagowaÅ‚y to jako niewÅ‚aÅ›ciwe' - many: '{{count}} osób oflagowaÅ‚o to jako niewÅ‚aÅ›ciwe' - one: 1 osoba oflagowaÅ‚a to jako niewÅ‚aÅ›ciwe - other: '{{count}} osób oflagowaÅ‚o to jako niewÅ‚aÅ›ciwe' + one: "1 osoba oflagowaÅ‚a to jako niewÅ‚aÅ›ciwe" + few: "{{count}} osoby oflagowaÅ‚y to jako niewÅ‚aÅ›ciwe" + many: "{{count}} osób oflagowaÅ‚o to jako niewÅ‚aÅ›ciwe" + other: "{{count}} osób oflagowaÅ‚o to jako niewÅ‚aÅ›ciwe" notify_moderators: - few: '{{count}} osoby oflagowaÅ‚y to do moderacji' - many: '{{count}} osób oflagowaÅ‚o to do moderacji' - one: 1 osoba oflagowaÅ‚a to do moderacji - other: '{{count}} osób oflagowaÅ‚o to do moderacji' + one: "1 osoba oflagowaÅ‚a to do moderacji" + few: "{{count}} osoby oflagowaÅ‚y to do moderacji" + many: "{{count}} osób oflagowaÅ‚o to do moderacji" + other: "{{count}} osób oflagowaÅ‚o to do moderacji" notify_user: - few: '{{count}} osoby wysÅ‚aÅ‚y wiadomość do tego użytkownika' - many: '{{count}} osób wysÅ‚aÅ‚o wiadomość do tego użytkownika' - one: 1 osoba wysÅ‚aÅ‚a wiadomość do tego użytkownika - other: '{{count}} osób wysÅ‚aÅ‚o wiadomość do tego użytkownika' + one: "1 osoba wysÅ‚aÅ‚a wiadomość do tego użytkownika" + few: "{{count}} osoby wysÅ‚aÅ‚y wiadomość do tego użytkownika" + many: "{{count}} osób wysÅ‚aÅ‚o wiadomość do tego użytkownika" + other: "{{count}} osób wysÅ‚aÅ‚o wiadomość do tego użytkownika" bookmark: - few: '{{count}} osoby dodaÅ‚y ten wpis do zakÅ‚adek' - many: '{{count}} osób dodaÅ‚o ten wpis do zakÅ‚adek' - one: 1 osoba dodaÅ‚a ten wpis do zakÅ‚adek - other: '{{count}} osób dodaÅ‚o ten wpis do zakÅ‚adek' + one: "1 osoba dodaÅ‚a ten wpis do zakÅ‚adek" + few: "{{count}} osoby dodaÅ‚y ten wpis do zakÅ‚adek" + many: "{{count}} osób dodaÅ‚o ten wpis do zakÅ‚adek" + other: "{{count}} osób dodaÅ‚o ten wpis do zakÅ‚adek" like: - few: '{{count}} osoby lajkujÄ… to' - many: '{{count}} osób lajkuje to' - one: 1 osoba lajkuje to - other: '{{count}} osób lajkuje to' - vote: - few: '{{count}} osoby zagÅ‚osowaÅ‚y za tym wpisem' - many: '{{count}} osób zagÅ‚osowaÅ‚o za tym wpisem' - one: 1 osoba zagÅ‚osowaÅ‚a za tym wpisem - other: '{{count}} osób zagÅ‚osowaÅ‚o za tym wpisem' + one: "1 osoba lajkuje to" + few: "{{count}} osoby lajkujÄ… to" + many: "{{count}} osób lajkuje to" + other: "{{count}} osób lajkuje to" merge: confirm: - few: Czy na pewno chcesz połączyć te {{count}} postów? - many: Czy na pewno chcesz połączyć te {{count}} postów? - one: Czy na pewno chcesz połączyć te posty? - other: Czy na pewno chcesz połączyć te {{count}} postów? + one: "Czy na pewno chcesz połączyć te posty?" + few: "Czy na pewno chcesz połączyć te {{count}} postów?" + many: "Czy na pewno chcesz połączyć te {{count}} postów?" + other: "Czy na pewno chcesz połączyć te {{count}} postów?" revisions: controls: first: "Pierwsza wersja" @@ -2078,7 +2068,6 @@ pl_PL: can: 'może… ' none: '(brak kategorii)' all: 'Wszystkie kategorie' - choose: 'Wybierz kategoriÄ™…' edit: 'edytuj' edit_long: "Edytuj" view: 'Pokaż Tematy w Kategorii' @@ -2125,7 +2114,6 @@ pl_PL: show_subcategory_list: "Pokaż listÄ™ subkategorii powyżej tematów w tej kategorii." num_featured_topics: "Liczba wÄ…tków do wyÅ›wietlenia na stronie kategorii:" subcategory_num_featured_topics: "Liczba wÄ…tków do wyÅ›wietlenia na stronie kategorii:" - all_topics_wiki: "Stwórz nowe tematy domyÅ›lnie jako wiki" subcategory_list_style: "Styl listy podkategorii:" sort_order: "Sortuj listÄ™ wÄ…tków po:" default_view: "DomyÅ›lna lista wÄ…tków:" @@ -2134,7 +2122,6 @@ pl_PL: edit_permissions: "Edytuj uprawnienia" add_permission: "Dodaj uprawnienie" this_year: "ten rok" - position: "pozycja" default_position: "DomyÅ›lna pozycja" position_disabled: "Kolejność kategorii bÄ™dzie uzależniona od aktywnoÅ›ci. Aby kontrolować ich kolejność," position_disabled_click: 'włącz statycznÄ… kolejność kategorii' @@ -2195,20 +2182,20 @@ pl_PL: custom_placeholder_notify_moderators: "Dlaczego ten wpis wymaga uwagi moderatora? Opisz co konkretnie CiÄ™ zaniepokoiÅ‚o i jeÅ›li to możliwe umieść odpowiednie odnoÅ›niki." custom_message: at_least: - few: wprowadź co najmniej {{count}} znaki - many: wprowadź co najmniej {{count}} znaków - one: wprowadź co najmniej 1 znak - other: wprowadź co najmniej {{count}} znaków + one: "wprowadź co najmniej 1 znak" + few: "wprowadź co najmniej {{count}} znaki" + many: "wprowadź co najmniej {{count}} znaków" + other: "wprowadź co najmniej {{count}} znaków" more: - few: pozostaÅ‚y {{count}} - many: pozostaÅ‚o {{count}} - one: ' pozostaÅ‚ 1' - other: 'pozostaÅ‚o {{count}} ' + one: " pozostaÅ‚ 1" + few: "pozostaÅ‚y {{count}}" + many: "pozostaÅ‚o {{count}}" + other: "pozostaÅ‚o {{count}} " left: - few: '{{count}} pozostaÅ‚o' - many: '{{count}} pozostaÅ‚o' - one: 1 pozostaÅ‚ - other: '{{count}} pozostaÅ‚o' + one: "1 pozostaÅ‚" + few: "{{count}} pozostaÅ‚o" + many: "{{count}} pozostaÅ‚o" + other: "{{count}} pozostaÅ‚o" flagging_topic: title: "DziÄ™kujemy za pomoc w utrzymaniu porzÄ…dku w naszej spoÅ‚ecznoÅ›ci!" action: "ZgÅ‚oÅ› temat" @@ -2219,17 +2206,17 @@ pl_PL: links_title: "Popularne linki" links_shown: "pokaż wiÄ™cej linków..." clicks: - few: '%{count} kliknięć' - many: '%{count} kliknięć' - one: 1 klikniÄ™cie - other: '%{count} kliknięć' + one: "1 klikniÄ™cie" + few: "%{count} kliknięć" + many: "%{count} kliknięć" + other: "%{count} kliknięć" post_links: about: "rozwiÅ„ wiÄ™cej linków dla tego wpisu" title: - few: '%{count} jeszcze' - many: '%{count} jeszcze' - one: jeszcze 1 - other: '%{count} jeszcze' + one: "jeszcze 1" + few: "%{count} jeszcze" + many: "%{count} jeszcze" + other: "%{count} jeszcze" topic_statuses: warning: help: "To jest oficjalne ostrzeżenie." @@ -2263,30 +2250,30 @@ pl_PL: original_post: "Oryginalny wpis" views: "OdsÅ‚ony" views_lowercase: - few: odsÅ‚ony - many: odsÅ‚on - one: odsÅ‚ona - other: odsÅ‚on + one: "odsÅ‚ona" + few: "odsÅ‚ony" + many: "odsÅ‚on" + other: "odsÅ‚on" replies: "Odpowiedzi" views_long: - few: ten temat byÅ‚ przeglÄ…dany {{number}} razy - many: ten temat byÅ‚ przeglÄ…dany {{number}} razy - one: ten temat byÅ‚ przeglÄ…dany 1 raz - other: ten temat byÅ‚ przeglÄ…dany {{number}} razy + one: "ten temat byÅ‚ przeglÄ…dany 1 raz" + few: "ten temat byÅ‚ przeglÄ…dany {{number}} razy" + many: "ten temat byÅ‚ przeglÄ…dany {{number}} razy" + other: "ten temat byÅ‚ przeglÄ…dany {{number}} razy" activity: "Aktywność" likes: "Lajki" likes_lowercase: - few: lajki - many: lajków - one: lajk - other: lajków + one: "lajk" + few: "lajki" + many: "lajków" + other: "lajków" likes_long: "jest {{number}} lajków w tym temacie" users: "Użytkownicy" users_lowercase: - few: użytkownicy - many: użytkowników - one: użytkownik - other: użytkowników + one: "użytkownik" + few: "użytkownicy" + many: "użytkowników" + other: "użytkowników" category_title: "Kategoria" history: "Historia" changed_by: "przez {{author}}" @@ -2300,10 +2287,10 @@ pl_PL: latest: title: "Aktualne" title_with_count: - few: Aktualne ({{count}}) - many: Aktualne ({{count}}) - one: Aktualne (1) - other: Aktualne ({{count}}) + one: "Aktualne (1)" + few: "Aktualne ({{count}})" + many: "Aktualne ({{count}})" + other: "Aktualne ({{count}})" help: "tematy z ostatnimi wpisami" hot: title: "GorÄ…ce" @@ -2321,29 +2308,29 @@ pl_PL: unread: title: "Nieprzeczytane" title_with_count: - few: Nieprzeczytane ({{count}}) - many: Nieprzeczytane ({{count}}) - one: Nieprzeczytane (1) - other: Nieprzeczytane ({{count}}) + one: "Nieprzeczytane (1)" + few: "Nieprzeczytane ({{count}})" + many: "Nieprzeczytane ({{count}})" + other: "Nieprzeczytane ({{count}})" help: "obserwowane lub Å›ledzone tematy z nieprzeczytanymi wpisami" lower_title_with_count: - few: '{{count}} nieprzeczytane' - many: '{{count}} nieprzeczytanych' - one: 1 nieprzeczytany - other: '{{count}} nieprzeczytanych' + one: "1 nieprzeczytany" + few: "{{count}} nieprzeczytane" + many: "{{count}} nieprzeczytanych" + other: "{{count}} nieprzeczytanych" new: lower_title_with_count: - few: '{{count}} nowe' - many: '{{count}} nowych' - one: 1 nowa - other: '{{count}} nowych' + one: "1 nowa" + few: "{{count}} nowe" + many: "{{count}} nowych" + other: "{{count}} nowych" lower_title: "nowe" title: "Nowe" title_with_count: - few: Nowe ({{count}}) - many: Nowe ({{count}}) - one: Nowe (1) - other: Nowe ({{count}}) + one: "Nowe (1)" + few: "Nowe ({{count}})" + many: "Nowe ({{count}})" + other: "Nowe ({{count}})" help: "tematy dodane w ciÄ…gu ostatnich kilku dni" posted: title: "WysÅ‚ane" @@ -2354,10 +2341,10 @@ pl_PL: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - many: '{{categoryName}} ({{count}})' - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + few: "{{categoryName}} ({{count}})" + many: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "najnowsze tematy w kategorii {{categoryName}}" top: title: "Popularne" @@ -2442,30 +2429,30 @@ pl_PL: print: 'ctrl+p Drukuj temat' badges: earned_n_times: - few: Otrzymano tÄ… odznakÄ™ %{count} razy - many: Otrzymano tÄ… odznakÄ™ %{count} razy - one: Otrzymano tÄ… odznakÄ™ 1 raz - other: Otrzymano tÄ… odznakÄ™ %{count} razy + one: "Otrzymano tÄ… odznakÄ™ 1 raz" + few: "Otrzymano tÄ… odznakÄ™ %{count} razy" + many: "Otrzymano tÄ… odznakÄ™ %{count} razy" + other: "Otrzymano tÄ… odznakÄ™ %{count} razy" granted_on: "Przyznano %{date}" others_count: "Inni użytkownicy z tÄ… odznakÄ… (%{count})" title: Odznaki allow_title: "Możesz użyc tej odznaki jako tytuÅ‚u" multiple_grant: "Możesz zdobyć tÄ… odznakÄ™ wiele razy" badge_count: - few: '%{count} odznak' - many: '%{count} odznak' - one: 1 odznaka - other: '%{count} odznak' + one: "1 odznaka" + few: "%{count} odznak" + many: "%{count} odznak" + other: "%{count} odznak" more_badges: - few: +%{count} wiÄ™cej - many: +%{count} wiÄ™cej - one: +1 wiÄ™cej - other: +%{count} wiÄ™cej + one: "+1 wiÄ™cej" + few: "+%{count} wiÄ™cej" + many: "+%{count} wiÄ™cej" + other: "+%{count} wiÄ™cej" granted: - few: '%{count} przyznanych' - many: '%{count} przyznanych' - one: 1 przyznany - other: '%{count} przyznanych' + one: "1 przyznany" + few: "%{count} przyznanych" + many: "%{count} przyznanych" + other: "%{count} przyznanych" select_badge_for_title: Wybierz odznakÄ™ do użycia jako twój tytuÅ‚ badge_grouping: getting_started: @@ -2597,6 +2584,7 @@ pl_PL: page_views: "WyÅ›wietlenia strony" page_views_short: "WyÅ›wietlenia strony" show_traffic_report: "Pokaż szczegółowy raport ruchu" + activity_metrics: Metryka aktywnoÅ›ci reports: today: "Dzisiaj" yesterday: "Wczoraj" @@ -2749,15 +2737,15 @@ pl_PL: none: "Brak powiÄ…zanych wydarzeÅ„." redeliver: "Dostarcz ponownie" incoming: - few: 'IstniejÄ… {{count}} nowe wydarzenia. ' - many: Istnieje {{count}} nowych wydarzeÅ„. - one: 'Istnieje nowe wydarzenie ' - other: 'Istnieje {{count}} nowych wydarzeÅ„. ' + one: "Istnieje nowe wydarzenie " + few: "IstniejÄ… {{count}} nowe wydarzenia. " + many: "Istnieje {{count}} nowych wydarzeÅ„." + other: "Istnieje {{count}} nowych wydarzeÅ„. " completed_in: - few: UkoÅ„czono w {{count}} sekundy. - many: UkoÅ„czono w {{count}} sekund. - one: UkoÅ„czono w 1 sekundÄ™. - other: UkoÅ„czono w {{count}} sekund. + one: "UkoÅ„czono w 1 sekundÄ™." + few: "UkoÅ„czono w {{count}} sekundy." + many: "UkoÅ„czono w {{count}} sekund." + other: "UkoÅ„czono w {{count}} sekund." request: "Żądanie" response: "Odpowiedź" redeliver_confirm: "Czy jesteÅ› pewien, że chcesz dostarczyć ponownie tÄ… samÄ… zawartość?" @@ -2910,17 +2898,16 @@ pl_PL: import_file_tip: "Plik .dcstyle.json zawierajÄ…cy motyw" about_theme: "O motywie" license: "Licencja" - component_of: "Motyw jest częściÄ…:" update_to_latest: "Aktualizuj do najnowszego" check_for_updates: "Sprawdź dostÄ™pność aktualizacji" updating: "Trwa proces aktualizacji..." up_to_date: "Motyw jest aktualny. Ostatnio sprawdzano:" add: "Dodaj" commits_behind: - few: Motyw jest {{count}} aktualizacji w tyle! - many: Motyw jest {{count}} aktualizacji w tyle! - one: Motyw jest 1 aktualizacjÄ™ w tyle! - other: Motyw jest {{count}} aktualizacji w tyle! + one: "Motyw jest 1 aktualizacjÄ™ w tyle!" + few: "Motyw jest {{count}} aktualizacji w tyle!" + many: "Motyw jest {{count}} aktualizacji w tyle!" + other: "Motyw jest {{count}} aktualizacji w tyle!" scss: text: "CSS" title: "Wstaw wÅ‚asny CSS, przyjmujemy wszystkie prawidÅ‚owe style CSS i SCSS" @@ -3049,7 +3036,6 @@ pl_PL: address_placeholder: "nazwa@example.com" type_placeholder: "streszczenie, rejestracja…" reply_key_placeholder: "klucz odpowiedzi" - skipped_reason_placeholder: "powód" moderation_history: performed_by: "Wykonane przez" no_results: "Brak dostÄ™pnej historii moderacji." @@ -3180,10 +3166,10 @@ pl_PL: clear_filter: "Wyczyść" show_words: "pokaż sÅ‚owa" word_count: - few: '%{count} słówa' - many: '%{count} słów' - one: 1 sÅ‚owo - other: '%{count} słów' + one: "1 sÅ‚owo" + few: "%{count} słówa" + many: "%{count} słów" + other: "%{count} słów" actions: block: 'Zablokuj' censor: 'Cenzuruj' @@ -3225,15 +3211,15 @@ pl_PL: suspect: 'Podejrzani' approved: "Zatwierdzam?" approved_selected: - few: zatwierdź użytkowników ({{count}}) - many: zatwierdź użytkowników ({{count}}) - one: zatwierdź użytkownika - other: zatwierdź użytkowników ({{count}}) + one: "zatwierdź użytkownika" + few: "zatwierdź użytkowników ({{count}})" + many: "zatwierdź użytkowników ({{count}})" + other: "zatwierdź użytkowników ({{count}})" reject_selected: - few: odrzuć użytkowników ({{count}}) - many: odrzuć użytkowników ({{count}}) - one: odrzuć użytkownika(-czkÄ™) - other: odrzuć użytkowników ({{count}}) + one: "odrzuć użytkownika(-czkÄ™)" + few: "odrzuć użytkowników ({{count}})" + many: "odrzuć użytkowników ({{count}})" + other: "odrzuć użytkowników ({{count}})" titles: active: 'Aktywni użytkownicy' new: 'Nowi użytkownicy' @@ -3250,15 +3236,15 @@ pl_PL: suspended: 'Zawieszone konta' suspect: 'Podejrzani użytkownicy' reject_successful: - few: Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™. - many: Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™. - one: Odrzucenie 1 użytkownika(-czki) powiodÅ‚o siÄ™. - other: Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™. + one: "Odrzucenie 1 użytkownika(-czki) powiodÅ‚o siÄ™." + few: "Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™." + many: "Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™." + other: "Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™." reject_failures: - few: Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™. - many: Odrzucenie %{count} użytkowników nie powiodÅ‚o siÄ™. - one: Odrzucenie 1 użytkownika(-czki) nie powiodÅ‚o siÄ™. - other: Odrzucenie %{count} użytkowników nie powiodÅ‚o siÄ™. + one: "Odrzucenie 1 użytkownika(-czki) nie powiodÅ‚o siÄ™." + few: "Odrzucenie %{count} użytkowników powiodÅ‚o siÄ™." + many: "Odrzucenie %{count} użytkowników nie powiodÅ‚o siÄ™." + other: "Odrzucenie %{count} użytkowników nie powiodÅ‚o siÄ™." not_verified: "Niezweryfikowany" check_email: title: "WyÅ›wietl adres email tego użytkownika" @@ -3334,20 +3320,20 @@ pl_PL: delete_forbidden_because_staff: "Administratorzy i moderatorzy nie mogÄ… zostać usuniÄ™ci." delete_posts_forbidden_because_staff: "Nie można usunąć wszystkich wpisów administratorów i moderatorów." delete_forbidden: - few: Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dni.) - many: Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dni.) - one: Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dzieÅ„.) - other: Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dni.) + one: "Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dzieÅ„.)" + few: "Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dni.)" + many: "Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dni.)" + other: "Użytkownik nie może zostać usuniÄ™ty jeÅ›li posiada wpisy. UsuÅ„ wszystkie jego wpisy przed usuniÄ™ciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dni.)" cant_delete_all_posts: - few: Nie można usunąć wszystkich postów. Część z nich ma wiÄ™cej niż %{count} dni. (Ustawienie delete_user_max_post_age) - many: Nie można usunąć wszystkich wpisów. Część z nich ma wiÄ™cej niż %{count} dni. (Ustawienie delete_user_max_post_age.) - one: Nie można usunąć wszystkich postów. Część z nich ma wiÄ™cej niż 1 dzieÅ„. (Ustawienie delete_user_max_post_age) - other: Nie można usunąć wszystkich wpisów. Część z nich ma wiÄ™cej niż %{count} dni. (Ustawienie delete_user_max_post_age.) + one: "Nie można usunąć wszystkich postów. Część z nich ma wiÄ™cej niż 1 dzieÅ„. (Ustawienie delete_user_max_post_age)" + few: "Nie można usunąć wszystkich postów. Część z nich ma wiÄ™cej niż %{count} dni. (Ustawienie delete_user_max_post_age)" + many: "Nie można usunąć wszystkich wpisów. Część z nich ma wiÄ™cej niż %{count} dni. (Ustawienie delete_user_max_post_age.)" + other: "Nie można usunąć wszystkich wpisów. Część z nich ma wiÄ™cej niż %{count} dni. (Ustawienie delete_user_max_post_age.)" cant_delete_all_too_many_posts: - few: Nie można usunąć wszystkich postów, ponieważ użytkownik ma ich wiÄ™cej niż %{count}. (delete_all_posts_max) - many: Nie można usunąć wszystkich wpisów, ponieważ użytkownik ma ich wiÄ™cej niż %{count}. (delete_all_posts_max) - one: Nie można usunąć wszystkich postów, ponieważ użytkownik ma wiÄ™cej niż 1 post. (delete_all_posts_max) - other: Nie można usunąć wszystkich wpisów, ponieważ użytkownik ma ich wiÄ™cej niż %{count}. (delete_all_posts_max) + one: "Nie można usunąć wszystkich postów, ponieważ użytkownik ma wiÄ™cej niż 1 post. (delete_all_posts_max)" + few: "Nie można usunąć wszystkich postów, ponieważ użytkownik ma ich wiÄ™cej niż %{count}. (delete_all_posts_max)" + many: "Nie można usunąć wszystkich wpisów, ponieważ użytkownik ma ich wiÄ™cej niż %{count}. (delete_all_posts_max)" + other: "Nie można usunąć wszystkich wpisów, ponieważ użytkownik ma ich wiÄ™cej niż %{count}. (delete_all_posts_max)" delete_confirm: "Czy NA PEWNO chcesz usunąć tego użytkownika? BÄ™dzie to nieodwracalne!" delete_and_block: "UsuÅ„ i zablokuj ten email oraz adres IP" delete_dont_block: "Tylko usuÅ„" @@ -3386,10 +3372,10 @@ pl_PL: tl3_requirements: title: "Wymagania dla osiÄ…gniÄ™cia 3. poziomu zaufania" table_title: - few: 'W ciÄ…gu ostatnich %{count} dni:' - many: 'W ciÄ…gu ostatnich %{count} dni:' - one: 'W ciÄ…gu ostatniego dnia:' - other: 'W ciÄ…gu ostatnich %{count} dni:' + one: "W ciÄ…gu ostatniego dnia:" + few: "W ciÄ…gu ostatnich %{count} dni:" + many: "W ciÄ…gu ostatnich %{count} dni:" + other: "W ciÄ…gu ostatnich %{count} dni:" value_heading: "Wartość" requirement_heading: "Wymaganie" visits: "Odwiedziny" @@ -3555,10 +3541,10 @@ pl_PL: text: "Brakuje przykÅ‚adowych wyników. Zapytanie odznaki zwraca nieistniejÄ…ce ID użytkowników lub wpisów. Może to spowodować nieoczekiwane rezultaty w przyszÅ‚oÅ›ci – sprawdź ponownie swoje zapytanie. " no_grant_count: "Brak odznak do przyznania." grant_count: - few: %{count} odznaki do przyznania. - many: %{count} odznak do przyznania. - one: 1 odznaka do przyznania. - other: %{count} odznak do przyznania. + one: "1 odznaka do przyznania." + few: "%{count} odznaki do przyznania." + many: "%{count} odznak do przyznania." + other: "%{count} odznak do przyznania." sample: "PodglÄ…d:" grant: with: "%{username}" @@ -3625,10 +3611,10 @@ pl_PL: uploading: "WysyÅ‚anie…" quit: "Może później" staff_count: - few: W twojej spoÅ‚ecznoÅ›ci jest %{count} czÅ‚onków zaÅ‚ogi, w tym Ty. - many: W twojej spoÅ‚ecznoÅ›ci jest %{count} czÅ‚onków zaÅ‚ogi, w tym Ty. - one: W twojej spoÅ‚ecznoÅ›ci jest 1 czÅ‚onek zaÅ‚ogi (Ty). - other: W twojej spoÅ‚ecznoÅ›ci jest %{count}czÅ‚onków zaÅ‚ogi, w tym Ty. + one: "W twojej spoÅ‚ecznoÅ›ci jest 1 czÅ‚onek zaÅ‚ogi (Ty)." + few: "W twojej spoÅ‚ecznoÅ›ci jest %{count} czÅ‚onków zaÅ‚ogi, w tym Ty." + many: "W twojej spoÅ‚ecznoÅ›ci jest %{count} czÅ‚onków zaÅ‚ogi, w tym Ty." + other: "W twojej spoÅ‚ecznoÅ›ci jest %{count}czÅ‚onków zaÅ‚ogi, w tym Ty." invites: add_user: "dodaj" none_added: "Nie zaprosiÅ‚eÅ› nikogo. Czy na pewno chcesz kontynuować?" diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 0ba161c9c9..b406a30004 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -43,62 +43,68 @@ pt: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" + less_than_x_minutes: + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" + x_months: + one: "1 mês" + other: "%{count}meses" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "DD MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 minuto - other: '%{count} minutos' + one: "1 minuto" + other: "%{count} minutos" x_hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" x_days: - one: 1 dia - other: '%{count} dias' + one: "1 dia" + other: "%{count} dias" date_year: "DD MMM, 'YY" medium_with_ago: x_minutes: - one: 1 minuto atrás - other: '%{count} minutos atrás' + one: "1 minuto atrás" + other: "%{count} minutos atrás" x_hours: - one: 1 hora atrás - other: '%{count} horas atrás' + one: "1 hora atrás" + other: "%{count} horas atrás" x_days: - one: 1 dia atrás - other: '%{count} dias atrás' + one: "1 dia atrás" + other: "%{count} dias atrás" later: x_days: - one: 1 dia mais tarde - other: '%{count} dias mais tarde' + one: "1 dia mais tarde" + other: "%{count} dias mais tarde" x_months: - one: 1 mês mais tarde - other: '%{count} meses mais tarde' + one: "1 mês mais tarde" + other: "%{count} meses mais tarde" x_years: - one: 1 ano mais tarde - other: '%{count} anos mais tarde' + one: "1 ano mais tarde" + other: "%{count} anos mais tarde" previous_month: 'Mês Anterior' next_month: 'Mês Seguinte' placeholder: data @@ -119,6 +125,7 @@ pt: user_left: "%{who} removeram-se desta mensagem %{when}" removed_user: "removeu %{who} %{when}" removed_group: "removeu %{who} %{when}" + autobumped: "automaticamente colidido %{when}" autoclosed: enabled: 'fechado %{when}' disabled: 'aberto %{when}' @@ -143,6 +150,8 @@ pt: topic_admin_menu: "Ações administrativas dos Tópicos" wizard_required: "Bem-vindo ao seu novo Discourse! Vamos começar com o assistente de configuração ✨" emails_are_disabled: "Todos os envios de e-mail foram globalmente desativados por um administrador. Nenhum e-mail de notificação será enviado." + bootstrap_mode_enabled: "Para que o inicio do teu Site seja o mais simples possivél, estás agora em modo de inicialização simples. A todos os novos utilizadores será concedido o Nível de Confiança 1 e o resumo por e-mail enviado diariamente estará ativado. Isto será automaticamente desligado quando %{min_users}utilizadores se tiverem juntado ao fórum." + bootstrap_mode_disabled: "O modo de inicialização simples será desactivado em 24 horas." themes: default_description: "Predefinição" s3: @@ -177,13 +186,13 @@ pt: show_help: "opções" links: "Hiperligações" links_lowercase: - one: ligação - other: hiperligações + one: "ligação" + other: "hiperligações" faq: "FAQ" guidelines: "Orientações" privacy_policy: "Política de Privacidade" privacy: "Privacidade" - terms_of_service: "Termos de Serviço" + tos: "Termos de Serviço" mobile_view: "Visualização Mobile" desktop_view: "Visualização Desktop" you: "Você" @@ -202,8 +211,8 @@ pt: max_of_count: "máximo de {{count}}" alternation: "ou" character_count: - one: '{{count}} caracter' - other: '{{count}} caracteres' + one: "{{count}} caracter" + other: "{{count}} caracteres" suggested_topics: title: "Tópicos Sugeridos" pm_title: "Mensagens Sugeridas" @@ -270,16 +279,16 @@ pt: cancel: "Cancelar" view_pending: "ver publicações pendentes" has_pending_posts: - one: Este tópico tem 1 publicação à espera de aprovação - other: Este tópico tem {{count}} publicações à espera de aprovação + one: "Este tópico tem 1 publicação à espera de aprovação" + other: "Este tópico tem {{count}} publicações à espera de aprovação" confirm: "Guardar Alterações" delete_prompt: "Tem a certeza que pretende eliminar %{username}? Isto irá remover todas as publicações, bloquear os e-mails e endereços de IP deste utilizador." approval: title: "A Publicação Necessita de Aprovação" description: "Recebemos a sua nova publicação mas necessita de ser aprovada pelo moderador antes de aparecer. Por favor seja paciente." pending_posts: - one: Tem 1 publicação pendente. - other: Tem {{count}} publicações pendentes. + one: "Tem 1 publicação pendente." + other: "Tem {{count}} publicações pendentes." ok: "OK" user_action: user_posted_topic: "{{user}} publicou o tópico" @@ -313,8 +322,8 @@ pt: posts_read: "Ler" posts_read_long: "Publicações Lidas" total_rows: - one: 1 utilizador - other: '%{count} utilizadores' + one: "1 utilizador" + other: "%{count} utilizadores" group_histories: actions: change_group_setting: "Mudar configuração do grupo" @@ -401,8 +410,6 @@ pt: reorder: title: "Re-organizar Categorias" title_long: "Re-organizar a lista de categorias" - fix_order: "Fixar Posições" - fix_order_tooltip: "Nem todas as categorias têm um número único de posição, o que pode causar resultados inesperados." save: "Guardar Ordem" apply_all: "Aplicar" position: "Posição" @@ -413,11 +420,11 @@ pt: toggle_ordering: "alternar o controlo de ordenação" subcategories: "Subcategorias" topic_sentence: - one: 1 tópico - other: '%{count} tópicos' + one: "1 tópico" + other: "%{count} tópicos" topic_stat_sentence: - one: '%{count} novo tópico no passado %{unit}.' - other: '%{count} novos tópicos no passado %{unit}.' + one: "%{count} novo tópico no passado %{unit}." + other: "%{count} novos tópicos no passado %{unit}." ip_lookup: title: Pesquisa de Endereço IP hostname: Nome do Servidor @@ -565,7 +572,6 @@ pt: error: "Ocorreu um erro ao modificar este valor." change_username: title: "Alterar Nome de Utilizador" - confirm: "Se mudar o seu nome de utilizador, todas as citações das suas publicações e menções @nome serão quebradas. Tem a certeza absoluta de que o quer fazer?" taken: "Pedimos desculpa, esse nome de utilizador já está a ser utilizado." invalid: "Esse nome de utilizador é inválido. Deve conter apenas números e letras." change_email: @@ -585,7 +591,6 @@ pt: upload_title: "Carregar a sua foto" upload_picture: "Carregar Imagem" image_is_not_a_square: "Alerta: cortámos a sua imagem; o comprimento e a altura não eram iguais." - cache_notice: "Alterou a sua fotografia de perfil com sucesso mas poderá demorar algum tempo até esta aparecer devido à cache do navegador de internet." change_profile_background: title: "Fundo de Perfil" instructions: "O fundo do perfil será centrado e terá por defeito uma largura de 850px." @@ -600,8 +605,8 @@ pt: authenticated: "O seu email foi autenticado por {{provider}}" frequency_immediately: "Enviar-lhe-emos um email imediatamente caso não leia o que lhe estamos a enviar." frequency: - one: Só iremos enviar-lhe um email se não o tivermos visto no último minuto. - other: Só iremos enviar-lhe um email se não o tivermos visto nos últimos {{count}} minutos. + one: "Só iremos enviar-lhe um email se não o tivermos visto no último minuto." + other: "Só iremos enviar-lhe um email se não o tivermos visto nos últimos {{count}} minutos." name: title: "Nome" instructions: "o seu nome completo (opcional)" @@ -687,8 +692,8 @@ pt: sent: "Enviado" none: "Sem convites para exibir." truncated: - one: A exibir o primeiro convite. - other: A exibir os primeiros {{count}} convites. + one: "A exibir o primeiro convite." + other: "A exibir os primeiros {{count}} convites." redeemed: "Convites Resgatados" redeemed_tab: "Resgatado" redeemed_tab_with_count: "Resgatados ({{count}})" @@ -735,29 +740,29 @@ pt: time_read: "tempo de leitura" recent_time_read: "tempo de leitura recente" topic_count: - one: Tópico criado - other: tópicos criados + one: "Tópico criado" + other: "tópicos criados" post_count: - one: publicação criada - other: publicações criadas + one: "publicação criada" + other: "publicações criadas" likes_given: - one: dado - other: dados + one: "dado" + other: "dados" likes_received: - one: recebido - other: recebidos + one: "recebido" + other: "recebidos" days_visited: - one: dia visitado - other: dias visitados + one: "dia visitado" + other: "dias visitados" topics_entered: - one: tópico visualizado - other: tópicos visualizados + one: "tópico visualizado" + other: "tópicos visualizados" posts_read: - one: publicação lida - other: publicações lidas + one: "publicação lida" + other: "publicações lidas" bookmark_count: - one: marcador - other: marcadores + one: "marcador" + other: "marcadores" top_replies: "Melhores Respostas" no_replies: "Ainda sem respostas." more_replies: "Mais Respostas" @@ -773,7 +778,6 @@ pt: most_liked_users: "Mais Gostados" most_replied_to_users: "Mais Respondidos" no_likes: "Ainda sem gostos." - associated_accounts: "Sessões" ip_address: title: "Último Endereço de IP" registration_ip_address: @@ -825,8 +829,8 @@ pt: reached: "%{relativeAge} – %{rate} atingiu o limite definido nas configurações do site de %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} excede o limite definido nas configurações do site de %{siteSettingRate}." rate: - one: 1 erro/%{duration} - other: '%{count} erros/%{duration}' + one: "1 erro/%{duration}" + other: "%{count} erros/%{duration}" learn_more: "saber mais..." all_time: 'total' all_time_desc: 'total de tópicos criados' @@ -854,8 +858,6 @@ pt: hide_session: "Lembrar-me amanhã" hide_forever: "não, obrigado" hidden_for_session: "Está bem, eu irei perguntar-lhe amanhã. Pode utilizar sempre 'Iniciar a Sessão' para também criar uma conta." - intro: "Olá! :heart_eyes: parece que está a gostar da discussão, mas não está inscrito para uma conta." - value_prop: "Quando cria uma conta, nós lembramos exatamente o que leu, por isso, volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou via e-mail, sempre que são criadas novas publicações. E pode gostar de publicações para partilhar o amor. :heartbeat:" summary: enabled_description: "Está a ver um resumo deste tópico: as respostas mais interessantes são determinadas pela comunidade." description: "Existem {{replyCount}} respostas." @@ -869,7 +871,6 @@ pt: disable: "Mostrar Publicações Eliminadas" private_message_info: title: "Mensagem" - invite: "Convidar Outros..." leave_message: "Quer mesmo deixar esta mensagem?" remove_allowed_user: "Deseja mesmo remover {{name}} desta mensagem?" remove_allowed_group: "Deseja mesmo remover {{name}} desta mensagem?" @@ -932,9 +933,6 @@ pt: preferences: "Necessita de ter a sessão iniciada para alterar as suas preferências de utilizador." forgot: "Eu não me lembro dos detalhes da minha conta" not_approved: "A sua conta ainda não foi aprovada. Será notificado por mensagem quando estiver pronto para iniciar a sessão." - google: - title: "com Google" - message: "A autenticar com Google (certifique-se de que os bloqueadores de janela estão desativados)" google_oauth2: title: "com Google" message: "A autenticar com Google (certifique-se de que os bloqueadores de janela estão desativados)" @@ -1016,8 +1014,8 @@ pt: similar_topics: "O seu tópico é similar a..." drafts_offline: "rascunhos off-line" group_mentioned: - one: Ao usar {{group}}, estará a notificar 1 pessoa – tem a certeza? - other: Ao mencionar {{group}}, estará a notificar {{count}} pessoas – tem a certeza? + one: "Ao usar {{group}}, estará a notificar 1 pessoa – tem a certeza?" + other: "Ao mencionar {{group}}, estará a notificar {{count}} pessoas – tem a certeza?" cannot_see_mention: category: "Mencionou {{username}} , mas este não será notificado porque não têm acesso a esta categoria. Terá de os adicionar a um grupo que tenha acesso a esta categoria." private: "Mencionou {{username}}, mas este não será notificado porque não consegue ver esta mensagem privada. Terá de o convidar para esta MP." @@ -1109,11 +1107,11 @@ pt: notifications: tooltip: regular: - one: Uma notificação não visualizada - other: '{{count}} notificações não visualizadas' + one: "Uma notificação não visualizada" + other: "{{count}} notificações não visualizadas" message: - one: Uma mensagem não lida - other: '{{count}} mensagens não lidas' + one: "Uma mensagem não lida" + other: "{{count}} mensagens não lidas" title: "notificações de menções de @name, respostas às suas publicações e tópicos, mensagens, etc" none: "De momento, não é possível carregar as notificações." empty: "Não foram encontradas notificações." @@ -1128,8 +1126,8 @@ pt: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} e 1 outro {{description}} - other: {{username}}, {{username2}} e {{count}} outros {{description}} + one: "{{username}}, {{username2}} e 1 outro {{description}}" + other: "{{username}}, {{username2}} e {{count}} outros {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1241,8 +1239,8 @@ pt: notification_level: "Notificações" choose_new_category: "Escolha a nova categoria para os tópicos:" selected: - one: Selecionou 1 tópico. - other: Selecionou {{count}} tópicos. + one: "Selecionou 1 tópico." + other: "Selecionou {{count}} tópicos." change_tags: "Substituir Etiquetas" append_tags: "Anexar Etiquetas" choose_new_tags: "Escolha novas etiquetas para estes tópicos:" @@ -1274,8 +1272,8 @@ pt: search: "Não há mais resultados na pesquisa." topic: filter_to: - one: 1 publicação no tópico - other: '{{count}} publicações no tópico' + one: "1 publicação no tópico" + other: "{{count}} publicações no tópico" create: 'Novo Tópico' create_long: 'Criar um novo Tópico' private_message: 'Iniciar uma mensagem' @@ -1289,10 +1287,10 @@ pt: new: 'novo tópico' unread: 'não lido' new_topics: - one: 1 novo tópico + one: '1 novo tópico' other: '{{count}} novos tópicos.' unread_topics: - one: 1 tópico não lido + one: '1 tópico não lido' other: '{{count}} tópicos não lidos' title: 'Tópico' invalid_access: @@ -1306,17 +1304,17 @@ pt: title: "Tópico não encontrado" description: "Pedimos desculpa, não foi possível encontrar esse tópico. Talvez tenha sido removido por um moderador?" total_unread_posts: - one: tem 1 publicação não lida neste tópico - other: tem {{count}} publicações não lidas neste tópico + one: "tem 1 publicação não lida neste tópico" + other: "tem {{count}} publicações não lidas neste tópico" unread_posts: - one: tem 1 publicação antiga não lida neste tópico - other: tem {{count}} publicações antigas não lidas neste tópico + one: "tem 1 publicação antiga não lida neste tópico" + other: "tem {{count}} publicações antigas não lidas neste tópico" new_posts: - one: existe 1 nova publicação neste tópico desde a sua última leitura - other: existem {{count}} novas publicações neste tópico desde a sua última leitura + one: "existe 1 nova publicação neste tópico desde a sua última leitura" + other: "existem {{count}} novas publicações neste tópico desde a sua última leitura" likes: - one: existe 1 gosto neste tópico - other: existem {{count}} gostos neste tópico + one: "existe 1 gosto neste tópico" + other: "existem {{count}} gostos neste tópico" back_to_list: "Voltar à lista de Tópicos" options: "Opções do Tópico" show_links: "mostrar hiperligações dentro deste tópico" @@ -1344,8 +1342,8 @@ pt: title: "Lembrar-me" auto_close_title: 'Configurações para Fechar Automaticamente' auto_close_immediate: - one: A última publicação neste tópico já tem 1 hora, por isso o tópico será fechado imediatamente. - other: A última publicação neste tópico já tem %{count} horas, por isso o tópico será fechado imediatamente. + one: "A última publicação neste tópico já tem 1 hora, por isso o tópico será fechado imediatamente." + other: "A última publicação neste tópico já tem %{count} horas, por isso o tópico será fechado imediatamente." timeline: back: "Retroceder" back_description: "Voltar à última publicação não lida" @@ -1446,8 +1444,8 @@ pt: pin_validation: "É necessária uma data para fixar este tópico." not_pinned: "Não há tópicos fixados em {{categoryLink}}." already_pinned: - one: 'Tópicos atualmente afixados em {{categoryLink}}: 1' - other: 'Tópicos atualmente afixados em {{categoryLink}}: {{count}}' + one: "Tópicos atualmente afixados em {{categoryLink}}: 1" + other: "Tópicos atualmente afixados em {{categoryLink}}: {{count}}" pin_globally: "Fazer com que este tópico apareça no topo da lista de todos os tópicos até" confirm_pin_globally: "Já tem {{count}} tópicos fixados globalmente. Demasiados tópicos fixados podem ser um fardo para utilizadores novos e anónimos. Tem a certeza que deseja fixar outro tópico globalmente?" unpin_globally: "Remover este tópico do topo de todas as listas de tópicos." @@ -1455,8 +1453,8 @@ pt: global_pin_note: "Os utilizadores podem desafixar individualmente o tópico por si próprios." not_pinned_globally: "Não existem tópicos fixados globalmente." already_pinned_globally: - one: 'Tópicos atualmente afixados globalmente: 1' - other: 'Tópicos atualmente afixados globalmente: {{count}}' + one: "Tópicos atualmente afixados globalmente: 1" + other: "Tópicos atualmente afixados globalmente: {{count}}" make_banner: "Tornar este tópico numa faixa que apareça no topo de todas as páginas." remove_banner: "Remover a faixa que aparece no topo de todas as páginas." banner_note: "Os utilizadores podem marcar vista a faixa por fecharem-na. Apenas um tópico pode ser posto como faixa em qualquer momento." @@ -1492,8 +1490,8 @@ pt: login_reply: 'Iniciar sessão para Responder' filters: n_posts: - one: 1 publicação - other: '{{count}} publicações' + one: "1 publicação" + other: "{{count}} publicações" cancel: "Remover filtro" split_topic: title: "Mover para um Novo Tópico" @@ -1501,15 +1499,15 @@ pt: topic_name: "Nome do Novo Tópico" error: "Ocorreu um erro ao mover as publicações para um novo tópico." instructions: - one: Está prestes a criar um novo tópico e populá-lo com a publicação que selecionou. - other: Está prestes a criar um novo tópico e populá-lo com as {{count}} publicações que selecionou. + one: "Está prestes a criar um novo tópico e populá-lo com a publicação que selecionou." + other: "Está prestes a criar um novo tópico e populá-lo com as {{count}} publicações que selecionou." merge_topic: title: "Mover para Tópico Existente" action: "mover para tópico existente" error: "Ocorreu um erro ao mover as publicações para esse tópico." instructions: - one: Por favor selecione o tópico para o qual gostaria de mover esta publicação. - other: Por favor selecione o tópico para o qual gostaria de mover estas {{count}} publicações. + one: "Por favor selecione o tópico para o qual gostaria de mover esta publicação." + other: "Por favor selecione o tópico para o qual gostaria de mover estas {{count}} publicações." merge_posts: title: "Juntar Publicações Selecionadas" action: "juntar publicações selecionadas" @@ -1521,8 +1519,8 @@ pt: label: "Novo Dono das Publicações" placeholder: "nome de utilizador do novo proprietário" instructions: - one: Por favor seleccione o novo dono da publicação de {{old_user}}. - other: Por favor selecione o novo dono das {{count}} publicações de {{old_user}}. + one: "Por favor seleccione o novo dono da publicação de {{old_user}}." + other: "Por favor selecione o novo dono das {{count}} publicações de {{old_user}}." change_timestamp: action: "alterar selo temporal" invalid_timestamp: "O selo temporal não pode ser no futuro." @@ -1537,7 +1535,7 @@ pt: deselect_all: desmarcar tudo description: one: Selecionou 1 publicação. - other: Selecionou {{count}} publicações. + other: "Selecionou {{count}} publicações." post: quote_reply: "Citar" edit_reason: "Motivo:" @@ -1549,26 +1547,26 @@ pt: show_full: "Mostrar Publicação Completa" show_hidden: 'Ver conteúdo ocultado.' deleted_by_author: - one: (publicação retraída pelo autor, será removida automaticamente em %{count} hora a não ser que esteja denunciada) - other: (publicação retraída pelo autor, será eliminada automaticamente em %{count} horas a não ser que esteja denunciada) + one: "(publicação retraída pelo autor, será removida automaticamente em %{count} hora a não ser que esteja denunciada)" + other: "(publicação retraída pelo autor, será eliminada automaticamente em %{count} horas a não ser que esteja denunciada)" expand_collapse: "expandir/colapsar" gap: - one: ver 1 resposta oculta - other: ver {{count}} respostas ocultas + one: "ver 1 resposta oculta" + other: "ver {{count}} respostas ocultas" unread: "Publicação não lida" has_replies: - one: '{{count}} Resposta' - other: '{{count}} Respostas' + one: "{{count}} Resposta" + other: "{{count}} Respostas" has_likes: - one: '{{count}} Gosto' - other: '{{count}} Gostos' + one: "{{count}} Gosto" + other: "{{count}} Gostos" has_likes_title: - one: 1 pessoa gostou desta publicação - other: '{{count}} pessoas gostaram desta publicação' + one: "1 pessoa gostou desta publicação" + other: "{{count}} pessoas gostaram desta publicação" has_likes_title_only_you: "você gostou desta publicação" has_likes_title_you: - one: você e 1 outra pessoa gostaram desta publicação - other: você e {{count}} outras pessoas gostaram desta publicação + one: "você e 1 outra pessoa gostaram desta publicação" + other: "você e {{count}} outras pessoas gostaram desta publicação" errors: create: "Pedimos desculpa, ocorreu um erro ao criar a sua publicação. Por favor, tente novamente." edit: "Pedimos desculpa, ocorreu um erro ao editar a sua publicação. Por favor, tente novamente." @@ -1617,7 +1615,6 @@ pt: inappropriate: "Retirar denúncia" bookmark: "Remover marcador" like: "Retirar gosto" - vote: "Retirar voto" people: off_topic: "denunciou isto como fora de contexto" spam: "denunciou isto como spam" @@ -1626,7 +1623,6 @@ pt: notify_user: "enviou uma mensagem" bookmark: "adicionou um marcador disto" like: "gostou disto" - vote: "votou nisto" by_you: off_topic: "Denunciou isto como fora de contexto" spam: "Denunciou isto como spam" @@ -1635,57 +1631,50 @@ pt: notify_user: "Enviou uma mensagem a este utilizador" bookmark: "Adicionou um marcador a esta publicação" like: "Gostou disto" - vote: "Votou nesta publicação" by_you_and_others: off_topic: - one: Para além de si, 1 pessoa denunciou isto como fora de contexto - other: Para além de si, {{count}} pessoas denunciaram isto como fora de contexto + one: "Para além de si, 1 pessoa denunciou isto como fora de contexto" + other: "Para além de si, {{count}} pessoas denunciaram isto como fora de contexto" spam: - one: Para além de si, 1 pessoa denunciou isto como spam - other: Para além de si, {{count}} pessoas denunciaram isto como spam + one: "Para além de si, 1 pessoa denunciou isto como spam" + other: "Para além de si, {{count}} pessoas denunciaram isto como spam" inappropriate: - one: Para além de si, 1 pessoa denunciou isto como inapropriado - other: Para além de si, {{count}} pessoas denunciaram isto como inapropriado + one: "Para além de si, 1 pessoa denunciou isto como inapropriado" + other: "Para além de si, {{count}} pessoas denunciaram isto como inapropriado" notify_moderators: - one: Para além de si, 1 pessoa denunciou isto para moderação - other: Para além de si, {{count}} pessoas denunciaram isto para moderação + one: "Para além de si, 1 pessoa denunciou isto para moderação" + other: "Para além de si, {{count}} pessoas denunciaram isto para moderação" notify_user: - one: Para além de si, 1 outro utilizador enviaram uma mensagem a este utilizador - other: Para além de si, {{count}} outros utilizadores enviaram uma mensagem a este utilizador + one: "Para além de si, 1 outro utilizador enviaram uma mensagem a este utilizador" + other: "Para além de si, {{count}} outros utilizadores enviaram uma mensagem a este utilizador" bookmark: - one: Para além de si, 1 pessoa adicionou um marcador a esta publicação - other: Para além de si, {{count}} adicionaram um marcador a esta publicação + one: "Para além de si, 1 pessoa adicionou um marcador a esta publicação" + other: "Para além de si, {{count}} adicionaram um marcador a esta publicação" like: - one: Para além de si, 1 pessoa gostou disto - other: Para além de si, {{count}} pessoas gostaram disto - vote: - one: Para além de si, 1 pessoa votou nesta publicação - other: Para além de si, {{count}} pessoas votaram nesta publicação + one: "Para além de si, 1 pessoa gostou disto" + other: "Para além de si, {{count}} pessoas gostaram disto" by_others: off_topic: - one: 1 pessoa denunciou isto como fora de contexto - other: '{{count}} pessoas denunciaram isto como fora de contexto' + one: "1 pessoa denunciou isto como fora de contexto" + other: "{{count}} pessoas denunciaram isto como fora de contexto" spam: - one: 1 pessoa denunciou isto como spam - other: '{{count}} pessoas denunciaram isto como spam' + one: "1 pessoa denunciou isto como spam" + other: "{{count}} pessoas denunciaram isto como spam" inappropriate: - one: 1 pessoa denunciou isto como impróprio - other: '{{count}} pessoas denunciaram isto como inapropriado' + one: "1 pessoa denunciou isto como impróprio" + other: "{{count}} pessoas denunciaram isto como inapropriado" notify_moderators: - one: 1 pessoa denunciou isto para moderação - other: '{{count}} pessoas denunciaram isto para moderação' + one: "1 pessoa denunciou isto para moderação" + other: "{{count}} pessoas denunciaram isto para moderação" notify_user: - one: 1 pessoa enviou uma mensagem a este utilizador - other: '{{count}} enviaram uma mensagem a este utilizador' + one: "1 pessoa enviou uma mensagem a este utilizador" + other: "{{count}} enviaram uma mensagem a este utilizador" bookmark: - one: 1 pessoa adicionou um marcador a esta publicação - other: '{{count}} pessoas adicionaram um marcador a esta publicação' + one: "1 pessoa adicionou um marcador a esta publicação" + other: "{{count}} pessoas adicionaram um marcador a esta publicação" like: - one: 1 pessoa gostou disto - other: '{{count}} pessoas gostaram disto' - vote: - one: 1 pessoa votou nesta publicação - other: '{{count}} pessoas votaram nesta publicação' + one: "1 pessoa gostou disto" + other: "{{count}} pessoas gostaram disto" revisions: controls: first: "Primeira revisão" @@ -1712,7 +1701,6 @@ pt: can: 'pode… ' none: '(sem categoria)' all: 'Todas as categorias' - choose: 'Selecione uma category…' edit: 'editar' edit_long: "Editar" view: 'Visualizar Tópicos na Categoria' @@ -1757,7 +1745,6 @@ pt: edit_permissions: "Editar Permissões" add_permission: "Adicionar Permissões" this_year: "este ano" - position: "posição" default_position: "Posição Padrão" position_disabled: "As categorias serão exibidas por ordem de actividade. Para controlar a ordenação das categorias nas listas," position_disabled_click: 'ative a definição "categoria em posição fixa".' @@ -1813,14 +1800,14 @@ pt: custom_placeholder_notify_moderators: "Diga-nos especificamente quais são as suas preocupações, e forneça-nos hiperligações relevantes e exemplo se possível." custom_message: at_least: - one: insira pelo menos 1 caráter - other: insira pelo menos {{count}} carateres + one: "insira pelo menos 1 caráter" + other: "insira pelo menos {{count}} carateres" more: - one: 1 a seguir... - other: '{{count}} a seguir...' + one: "1 a seguir..." + other: "{{count}} a seguir..." left: - one: 1 restante - other: '{{count}} restantes' + one: "1 restante" + other: "{{count}} restantes" flagging_topic: title: "Obrigado por ajudar a manter a nossa comunidade cívica!" action: "Denunciar Tópico" @@ -1831,13 +1818,13 @@ pt: links_title: "Hiperligações Populares" links_shown: "mostrar mais ligações..." clicks: - one: 1 clique - other: '%{count} cliques' + one: "1 clique" + other: "%{count} cliques" post_links: about: "expandir mais ligações para esta publicação" title: - one: 1 mais - other: '%{count} mais' + one: "1 mais" + other: "%{count} mais" topic_statuses: warning: help: "Este é um aviso oficial." @@ -1871,19 +1858,19 @@ pt: original_post: "Publicação Original" views: "Vistas" views_lowercase: - one: vista - other: vistas + one: "vista" + other: "vistas" replies: "Respostas" activity: "Atividade" likes: "Gostos" likes_lowercase: - one: gosto - other: gostos + one: "gosto" + other: "gostos" likes_long: "existem {{number}} gostos neste tópico" users: "Utilizadores" users_lowercase: - one: utilizador - other: utilizadores + one: "utilizador" + other: "utilizadores" category_title: "Categoria" history: "Histórico" changed_by: "por {{author}}" @@ -1896,8 +1883,8 @@ pt: latest: title: "Recente" title_with_count: - one: Recente (1) - other: Recentes ({{count}}) + one: "Recente (1)" + other: "Recentes ({{count}})" help: "tópicos com publicações recentes" hot: title: "Quente" @@ -1915,21 +1902,21 @@ pt: unread: title: "Não Lido" title_with_count: - one: Não Lido (1) - other: Não Lidos ({{count}}) + one: "Não Lido (1)" + other: "Não Lidos ({{count}})" help: "tópicos que está atualmente a vigiar ou a seguir com publicações não lidas" lower_title_with_count: - one: 1 não lido - other: '{{count}} não lidos' + one: "1 não lido" + other: "{{count}} não lidos" new: lower_title_with_count: - one: 1 novo - other: '{{count}} novos' + one: "1 novo" + other: "{{count}} novos" lower_title: "novo" title: "Novo" title_with_count: - one: Novo (1) - other: Novos ({{count}}) + one: "Novo (1)" + other: "Novos ({{count}})" help: "tópicos criados nos últimos dias" posted: title: "As Minhas publicações" @@ -1940,8 +1927,8 @@ pt: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "tópicos recentes na categoria {{categoryName}}" top: title: "Os Melhores" @@ -2025,20 +2012,20 @@ pt: print: 'ctrl+p Imprimir tópico' badges: earned_n_times: - one: Ganhou este distintivo 1 vez - other: Ganhou este distintivo %{count} vezes + one: "Ganhou este distintivo 1 vez" + other: "Ganhou este distintivo %{count} vezes" granted_on: "Concedido %{date}" others_count: "Outros com este distintivo (%{count})" title: Distintivos badge_count: - one: 1 Distintivo - other: '%{count} Distintivos' + one: "1 Distintivo" + other: "%{count} Distintivos" more_badges: - one: +1 Mais - other: +%{count} Mais + one: "+1 Mais" + other: "+%{count} Mais" granted: - one: 1 concedido - other: '%{count} concedidos' + one: "1 concedido" + other: "%{count} concedidos" select_badge_for_title: Selecionar um distintivo para usar como seu título badge_grouping: getting_started: @@ -2292,11 +2279,11 @@ pt: none: "Não há eventos relacionados." redeliver: "Re-entregar." incoming: - one: Existe 1 evento novo. - other: Existem {{count}} eventos novos. + one: "Existe 1 evento novo." + other: "Existem {{count}} eventos novos." completed_in: - one: Completado em 1 segundos. - other: Completado em {{count}} segundo. + one: "Completado em 1 segundos." + other: "Completado em {{count}} segundo." request: "Pedido" response: "Resposta" redeliver_confirm: "Tem a certeza de que quer re-entregar a mesma carga?" @@ -2513,7 +2500,6 @@ pt: address_placeholder: "nome@exemplo.com" type_placeholder: "resumo, subscrever..." reply_key_placeholder: "chave de resposta" - skipped_reason_placeholder: "motivo" logs: title: "Logs" action: "Ação" @@ -2631,11 +2617,11 @@ pt: suspect: 'Suspeito' approved: "Aprovado?" approved_selected: - one: aprovar utilizador - other: aprovar utilizadores ({{count}}) + one: "aprovar utilizador" + other: "aprovar utilizadores ({{count}})" reject_selected: - one: rejeitar utilizador - other: rejeitar utilizadores ({{count}}) + one: "rejeitar utilizador" + other: "rejeitar utilizadores ({{count}})" titles: active: 'Utilizadores Ativos' new: 'Utilizadores Novos' @@ -2651,11 +2637,11 @@ pt: suspended: 'Utilizadores Suspensos' suspect: 'Utilizadores Suspeitos' reject_successful: - one: 1 utilizador foi rejeitado com sucesso. - other: '%{count} utilizadores foram rejeitados com sucesso.' + one: "1 utilizador foi rejeitado com sucesso." + other: "%{count} utilizadores foram rejeitados com sucesso." reject_failures: - one: Falha ao rejeitar 1 utilizador. - other: Falha ao rejeitar %{count} utilizadores. + one: "Falha ao rejeitar 1 utilizador." + other: "Falha ao rejeitar %{count} utilizadores." not_verified: "Não verificado" check_email: title: "Revelar o endereço de email deste utilizador" @@ -2713,14 +2699,14 @@ pt: delete_forbidden_because_staff: "Administradores e moderadores não podem ser eliminados." delete_posts_forbidden_because_staff: "Não é possível eliminar todas as publicações dos administradores e moderadores." delete_forbidden: - one: Utilizadores não podem ser eliminados se tiverem publicações. Apague todas as publicações antes de eliminar o utilizador. (Publicações com mais de %{count} dia de existência não podem ser eliminadas.) - other: Utilizadores não podem ser eliminados se tiverem publicações. Apague todas as publicações antes de eliminar o utilizador. (Publicações com mais de %{count} dias de existência não podem ser eliminadas.) + one: "Utilizadores não podem ser eliminados se tiverem publicações. Apague todas as publicações antes de eliminar o utilizador. (Publicações com mais de %{count} dia de existência não podem ser eliminadas.)" + other: "Utilizadores não podem ser eliminados se tiverem publicações. Apague todas as publicações antes de eliminar o utilizador. (Publicações com mais de %{count} dias de existência não podem ser eliminadas.)" cant_delete_all_posts: - one: Não é possível eliminar todas as publicações. Algumas publicações existem há mais de %{count} dia. (A configuração delete_user_max_post_age.) - other: Não é possível eliminar todas as publicações. Algumas publicações existem há mais de %{count} dias. (A configuração delete_user_max_post_age.) + one: "Não é possível eliminar todas as publicações. Algumas publicações existem há mais de %{count} dia. (A configuração delete_user_max_post_age.)" + other: "Não é possível eliminar todas as publicações. Algumas publicações existem há mais de %{count} dias. (A configuração delete_user_max_post_age.)" cant_delete_all_too_many_posts: - one: Não é possível eliminar todas as publicações porque o utilizador tem mais de 1 publicações. (delete_all_posts_max) - other: Não é possível eliminar todas as publicações porque o utilizador tem mais de %{count} publicações. (delete_all_posts_max) + one: "Não é possível eliminar todas as publicações porque o utilizador tem mais de 1 publicações. (delete_all_posts_max)" + other: "Não é possível eliminar todas as publicações porque o utilizador tem mais de %{count} publicações. (delete_all_posts_max)" delete_confirm: "Tem a CERTEZA que deseja eliminar este utilizador? Esta ação é permanente!" delete_and_block: "Eliminar e bloquear este e-mail e endereço de IP" delete_dont_block: "Apenas eliminar" @@ -2755,8 +2741,8 @@ pt: tl3_requirements: title: "Requisitos para o Nível de Confiança 3" table_title: - one: 'Nos último dia:' - other: 'Nos últimos %{count} dias:' + one: "Nos último dia:" + other: "Nos últimos %{count} dias:" value_heading: "Valor" requirement_heading: "Requisito" visits: "Visitas" @@ -2920,8 +2906,8 @@ pt: text: "Estão em falta amostras de concessão. Isto acontece quando a \"query\" do sistema de distintivos devolve IDs de nomes de utilizador ou IDs de publicações que não existem. Isto pode causar resultados inesperados futuramente, sendo que deverá rever a sua \"query\"." no_grant_count: "Nenhuns distintivos a atribuir." grant_count: - one: 1 distintivo a atribuir. - other: %{count} distintivos a atribuir. + one: "1 distintivo a atribuir." + other: "%{count} distintivos a atribuir." sample: "Amostra:" grant: with: "%{username}" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index f2a47859d6..ab04416aeb 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -43,64 +43,71 @@ pt_BR: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" + less_than_x_minutes: + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" + x_months: + one: "1seg" + other: "%{count}seg" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 minuto - other: '%{count} minutos' + one: "1 minuto" + other: "%{count} minutos" x_hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" x_days: - one: 1 dia - other: '%{count} dias' + one: "1 dia" + other: "%{count} dias" date_year: "MMM D, YY" medium_with_ago: x_minutes: - one: 1 minuto atrás - other: '%{count} minutos atrás' + one: "1 minuto atrás" + other: "%{count} minutos atrás" x_hours: - one: 1 hora atrás - other: '%{count} horas atrás' + one: "1 hora atrás" + other: "%{count} horas atrás" x_days: - one: 1 dia atrás - other: '%{count} dias atrás' + one: "1 dia atrás" + other: "%{count} dias atrás" later: x_days: - one: 1 dia depois - other: '%{count} dias depois' + one: "1 dia depois" + other: "%{count} dias depois" x_months: - one: 1 mês depois - other: '%{count} meses depois' + one: "1 mês depois" + other: "%{count} meses depois" x_years: - one: 1 ano depois - other: '%{count} anos depois' + one: "1 ano depois" + other: "%{count} anos depois" previous_month: 'Mês Anterior' next_month: 'Mês Seguinte' + placeholder: data share: topic: 'compartilhe o link desse tópico' post: 'mensagem #%{postNumber}' @@ -111,11 +118,14 @@ pt_BR: email: 'enviar esse link para um email' action_codes: public_topic: "tornou este tópico público em %{when}" + private_topic: "transformar esse tópico em uma mensagem pessoal %{when}" split_topic: "dividiu este tópico %{when}" invited_user: "convidou %{who} %{when}" invited_group: "convidou %{who} %{when}" + user_left: "%{who} se removeram desta mensagem %{when}" removed_user: "removido %{who} %{when}" removed_group: "removido %{who} %{when}" + autobumped: "automaticamente colidido %{when}" autoclosed: enabled: 'fechou %{when}' disabled: 'abriu %{when}' @@ -140,6 +150,8 @@ pt_BR: topic_admin_menu: "ações administrativas do tópico" wizard_required: "Bem vindo ao seu novo Discourse! Vamos começar com o assistente de configuração ✨" emails_are_disabled: "Todo o envio de email foi globalmente desabilitado por algum administrador. Nenhum email de notificações de qualquer tipo será enviado." + bootstrap_mode_enabled: "Para tornar o lançamento do seu novo site mais fácil, você está no modo de bootstrap. Todos os novos usuários receberão o nível de confiança 1 e terão as atualizações diárias de resumos de e-mail ativadas. Isso será desativado automaticamente quando %{min_users} dos usuários entrarem." + bootstrap_mode_disabled: "O modo Bootstrap será desativado em 24 horas." themes: default_description: "Padrão" s3: @@ -153,6 +165,7 @@ pt_BR: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Irlanda)" eu_west_2: "UE (Londres)" + eu_west_3: "EU (Paris)" sa_east_1: "América do Sul (São Paulo)" us_east_1: "Leste dos EUA (N. da Virgínia)" us_east_2: "Leste dos EUA (Ohio)" @@ -163,6 +176,7 @@ pt_BR: not_implemented: "Esse recurso ainda não foi implementado, desculpe!" no_value: "Não" yes_value: "Sim" + submit: "Enviar" generic_error: "Pedimos desculpa, ocorreu um erro." generic_error_with_reason: "Ocorreu um erro: %{error}" sign_up: "Registrar" @@ -175,13 +189,13 @@ pt_BR: show_help: "opções" links: "Links" links_lowercase: - one: link - other: links + one: "link" + other: "links" faq: "FAQ" guidelines: "Orientações" privacy_policy: "Política de Privacidade" privacy: "Privacidade" - terms_of_service: "Termos do Serviço" + tos: "Termos do Serviço" mobile_view: "VIsualização Mobile" desktop_view: "Visualização Desktop" you: "Você" @@ -200,8 +214,8 @@ pt_BR: max_of_count: "max de {{count}}" alternation: "ou" character_count: - one: '{{count}} caracter' - other: '{{count}} caracteres' + one: "{{count}} caracter" + other: "{{count}} caracteres" suggested_topics: title: "Tópicos sugeridos" pm_title: "Mensagens Sugeridas" @@ -213,6 +227,8 @@ pt_BR: our_moderators: "Nossos moderadores" stat: all_time: "Desde o começo" + last_7_days: "Últimos 7" + last_30_days: "Últimos 30" like_count: "Curtidas" topic_count: "Tópicos" post_count: "Mensagens" @@ -233,6 +249,21 @@ pt_BR: last_read: "este é a última resposta que você leu; clique para favoritar." remove: "Remover favorito" confirm_clear: "Tem certeza que deseja apagar todos os atalhos deste tópico?" + drafts: + resume: "Resuma" + remove: "Remova" + new_topic: "Novo rascunho de tópico" + new_private_message: "Novo rascunho de mensagem privada" + topic_reply: "Resposta preliminar" + topic_count_latest: + one: "Veja {{conta}} tópicos novos ou atualizados" + other: "Veja {{conta}} tópicos novos ou atualizados" + topic_count_unread: + one: "Veja {{conta}} tópicos não lidos." + other: "Veja {{conta}} tópicos não lidos." + topic_count_new: + one: "Veja {{conta}} novos tópicos." + other: "Veja {{conta}} novos tópicos." preview: "pré-visualização" cancel: "cancelar" save: "Salvar mudanças" @@ -245,6 +276,7 @@ pt_BR: pasting: "Colando..." enable: "Habilitar" disable: "Desabilitar" + continue: "Continue" undo: "Desfazer" revert: "Reverter" failed: "Falhou" @@ -269,16 +301,16 @@ pt_BR: cancel: "Cancelar" view_pending: "ver mensagens pendentes" has_pending_posts: - one: Este tópico tem 1 mensagem aguardando aprovação - other: Este tópico tem {{count}} mensagens aguardando aprovação + one: "Este tópico tem 1 mensagem aguardando aprovação" + other: "Este tópico tem {{count}} mensagens aguardando aprovação" confirm: "Salvar Mudanças" delete_prompt: "Você tem certeza que quer deletar %{username}? Esta ação irá remover todas as suas postagens e bloquear seu email e endereço IP." approval: title: "Aprovação Necessária da Mensagem" description: "Nós recebemos sua nova postagem mas é necessário que seja aprovada por um moderador antes de ser exibida. Por favor tenha paciência." pending_posts: - one: Você tem 1 mensagem pendente. - other: Você tem {{count}} mensagens pendentes. + one: "Você tem 1 mensagem pendente." + other: "Você tem {{count}} mensagens pendentes." ok: "OK" user_action: user_posted_topic: "{{user}} postou o tópico" @@ -312,8 +344,8 @@ pt_BR: posts_read: "Lidos" posts_read_long: "Postagens Lidas" total_rows: - one: 1 usuário - other: '%{count} usuários' + one: "1 usuário" + other: "%{count} usuários" group_histories: actions: change_group_setting: "Alterar configurações do grupo" @@ -322,6 +354,35 @@ pt_BR: make_user_group_owner: "Tornar proprietário" remove_user_as_group_owner: "Revogar proprietário" groups: + add_members: + title: "Adicionar membros" + description: "Administrar a associação desse grupo" + usernames: "Nomes de usuários" + manage: + title: 'Administrar' + name: 'Nome' + full_name: 'Nome Completo' + add_members: "Adicionar membros" + delete_member_confirm: "Remover '%{username}' do '%{group}' grupo?" + profile: + title: Perfil + interaction: + title: Interação + posting: Postagem + notification: Notificação + membership: + title: Associação + access: Acesso + logs: + title: "Registros" + when: "Quando" + action: "Ação" + acting_user: "Usuário agindo" + target_user: "Usuário alvo" + subject: "Sujeito" + details: "Detalhes" + from: "De" + to: "Para" public_admission: "Permitir que os usuários se juntem ao grupo livremente (Requer grupo visível ao público)" public_exit: "Permitir que os usuários deixem o grupo livremente" empty: @@ -332,19 +393,57 @@ pt_BR: topics: "Não há tópicos de membros deste grupo." logs: "Não há registros para este grupo." add: "Adicionar" + join: "Juntar-se" + leave: "Sair" + request: "Pedido" message: "Mensagem" allow_membership_requests: "Permitir usuários enviar pedidos de adesão a proprietários de grupos" + membership_request_template: "Modelo personalizado para exibir aos usuários ao enviar uma solicitação de associação" membership_request: submit: "Enviar Pedido" title: "Pedir para entrar no grupo @%{group_name}" + reason: "Permita que os proprietários do grupo saibam por que você pertence a este grupo" membership: "Adesão" - name: "Nom" + name: "Nome" + group_name: "Nome do Grupo" + user_count: "Usuários" bio: "Sobre o Grupo" + selector_placeholder: "Insira nome de usuário" owner: "proprietário" index: title: "Grupos" + all: "Todos os grupos" empty: "Não há grupos visíveis." + filter: "Filtrar por tipo de grupo" + owner_groups: "Grupos em que sou administrador" + close_groups: "Grupos fechados" + automatic_groups: "Grupos Automáticos" + automatic: "Automático" + closed: "Fechado" + public: "Público" + private: "Privado" + public_groups: "Grupos Públicos" + automatic_group: Grupo Automático + close_group: Fechar Grupo + my_groups: "Meus Grupos" + group_type: "Tipo de Grupo" + is_group_user: "Membro" + is_group_owner: "Administrador" + title: + one: "Grupos " + other: "Grupos" activity: "Atividade" + members: + title: "Membros" + filter_placeholder_admin: "Nome de usuário ou e-mail" + filter_placeholder: "Nome de usuário" + remove_member: "Remover Membro" + remove_member_description: "Remover %{username} desse grupo" + make_owner: "Tornar administrador" + make_owner_description: "Tornar %{username} um administrador desse grupo" + remove_owner: "Remover como administrador" + remove_owner_description: "Remover %{username} como um administrador desse grupo" + owner: "Administrador" topics: "Tópicos" posts: "Mensagens" mentions: "Menções" @@ -395,16 +494,16 @@ pt_BR: "12": "Itens enviados" "13": "Caixa de Entrada" "14": "Pendente" + "15": "Rascunhos" categories: all: "todas as categorias" + all_subcategories: "todos" no_subcategory: "nenhum" category: "Categoria" category_list: "Exibir lista de categorias." reorder: title: "Reordenar Categorias" title_long: "Reorganizar a lista de categorias" - fix_order: "Fixar Posições" - fix_order_tooltip: "Algumas categorias não possuem um número de posição único, o que pode causar resultados inesperados." save: "Salvar Ordem" apply_all: "Aplicar" position: "Posição" @@ -415,11 +514,12 @@ pt_BR: toggle_ordering: "alternar controle de ordenação" subcategories: "Subcategorias" topic_sentence: - one: 1 tópico - other: '%{count} tópicos' + one: "1 tópico" + other: "%{count} tópicos" topic_stat_sentence: - one: '%{count} novo tópico nos últimos %{unit}.' - other: '%{count} novos tópicos nos últimos %{unit}.' + one: "%{count} novo tópico nos últimos %{unit}." + other: "%{count} novos tópicos nos últimos %{unit}." + more: " (%{count} mais) ..." ip_lookup: title: Pesquisa do endereço de IP hostname: Nome do host @@ -435,6 +535,7 @@ pt_BR: topics_entered: "tópicos em que entrou" post_count: "# mensagens" confirm_delete_other_accounts: "Você tem certeza que deseja apagar essas contas?" + powered_by: "distribuído por ipinfo.io" user_fields: none: "(selecione uma opção)" user: @@ -453,6 +554,7 @@ pt_BR: activity_stream: "Atividade" preferences: "Preferências" expand_profile: "Expandir" + collapse_profile: "Colapso" bookmarks: "Favoritos" bio: "Sobre mim" invited_by: "Convidado por" @@ -460,6 +562,7 @@ pt_BR: notifications: "Notificações" statistics: "Estatísticas" desktop_notifications: + label: "Notificações ao vivo" not_supported: "Notificações não são suportadas nesse browser. Desculpe-nos." perm_default: "Habilitar Notificações" perm_denied_btn: "Permissão Negada" @@ -467,6 +570,7 @@ pt_BR: disable: "Desativar Notificações" enable: "Ativar Notificações" each_browser_note: "Nota: Você deve modificar essa configuração em todos navegadores que você usa." + consent_prompt: "Você quer notificações ao vivo quando as pessoas respondem às suas postagens?" dismiss: 'Descartar' dismiss_notifications: "Descartar tudo" dismiss_notifications_tooltip: "Marcar todas as notificações não lidas como lidos" @@ -474,6 +578,7 @@ pt_BR: disable_jump_reply: "Não pular para o meu tópico depois que eu respondo" dynamic_favicon: "Exibir ícone no navegador de tópicos novos / atualizados." theme_default_on_all_devices: "Definir este tema como padrão em todos os meus dispositivos" + allow_private_messages: "Permitir que outros usuários me enviem mensagens pessoais" external_links_in_new_tab: "Abrir todos os links externos em uma nova aba" enable_quoting: "Ativar resposta citando o texto destacado" change: "alterar" @@ -483,6 +588,7 @@ pt_BR: admin_tooltip: "Esse usuário é da administração" silenced_tooltip: "Este usuário está silenciado" suspended_notice: "Esse usuário está suspenso até {{date}}." + suspended_permanently: "Esse usuário está suspenso." suspended_reason: "Motivo:" github_profile: "Github" email_activity_summary: "Sumário de Atividades" @@ -496,6 +602,7 @@ pt_BR: individual_no_echo: "Mande um email para todas as novas publicações, exceto as minhas" many_per_day: "Me envie um email para cada nova postagem (aproximadamente {{dailyEmailEstimate}} por dia)" few_per_day: "Me envie um email para cada nova postagem (aproximadamente 2 por dia)" + warning: "Modo de lista de discussão ativado. As configurações de notificação por e-mail são substituídas." tag_settings: "Etiquetas" watched_tags: "Observadas" watched_tags_instructions: "Você vai observar automaticamente todos os tópicos com estas etiquetas. Você será notificado de todas as novas mensagens e tópicos. Além disso, a contagem de mensagens novas também aparecerá ao lado do tópico." @@ -513,9 +620,11 @@ pt_BR: watched_first_post_tags_instructions: "Você será notificado sobre a primeira postagem em cada novo tópico com estas etiquetas." muted_categories: "Silenciado" muted_categories_instructions: "Você não será notificado sobre novos tópicos nessas categorias, e não aparecerão no Recentes" + no_category_access: "Como moderador, você tem acesso limitado à categoria, a economia está desativada." delete_account: "Excluir Minha Conta" delete_account_confirm: "Tem certeza de que deseja excluir permanentemente a sua conta? Essa ação não pode ser desfeita!" deleted_yourself: "Sua conta foi excluída com sucesso." + delete_yourself_not_allowed: "Entre em contato com um membro da equipe se desejar que sua conta seja excluída." unread_message_count: "Mensagens" admin_delete: "Apagar" users: "Usuários" @@ -523,6 +632,7 @@ pt_BR: muted_users_instructions: "Suprimir todas as notificações destes usuários." muted_topics_link: "Mostrar tópicos silenciados" watched_topics_link: "Mostrar tópicos observados" + tracked_topics_link: "Mostrar tópicos rastreados" automatically_unpin_topics: "Desafixar automaticamente os tópicos quando eu chegar ao fundo." apps: "Aplicativos" revoke_access: "Revogar Acesso" @@ -530,6 +640,7 @@ pt_BR: api_approved: "Aprovada:" theme: "Tema" home: "Página Inicial Padrão" + staged: "Encenado" staff_counters: flags_given: "sinalizadas úteis" flagged_posts: "posts sinalizados" @@ -547,6 +658,7 @@ pt_BR: move_to_archive: "Arquivar" failed_to_move: "Falha ao mover as mensagens selecionadas (talvez você esteja sem conexão com a rede)" select_all: "Selecionar Tudo" + tags: "Etiquetas" preferences_nav: account: "Conta" profile: "Perfil" @@ -564,12 +676,38 @@ pt_BR: set_password: "Definir Senha" choose_new: "Escolha uma nova senha" choose: "Escolha uma senha" + second_factor_backup: + title: "Códigos de backup de dois fatores" + regenerate: "Regenerado" + disable: "Desabilitar" + enable: "habilitar" + enable_long: "Habilitar códigos de backup" + manage: "Gerenciar códigos de backup" + copied_to_clipboard: "Copiado para a área de transferência" + copy_to_clipboard_error: "Erro ao copiar dados para a área de transferência" + remaining_codes: "Você tem {{count}}códigos de backup restantes." + codes: + title: "Códigos de backup gerados" + description: "Cada um desses códigos de backup só pode ser usado uma vez. Mantenha-os em algum lugar seguro, mas acessível." + second_factor: + title: "Autenticação de dois fatores" + disable: "Desabilitar autenticação de dois fatores" + enable: "Habilitar autenticação de dois fatores para segurança avançada da conta" + confirm_password_description: "Por favor, confirme sua senha para continuar" + label: "Código" + enable_description: | + Digitalize este código QR em um aplicativo compatível (Android – iOS – Windows Phone) e insira seu código de autenticação. + disable_description: "Por favor, insira o código de autenticação do seu aplicativo" + show_key_description: "Entre manualmente" + extended_description: | + A autenticação de dois fatores adiciona segurança extra à sua conta, exigindo um token único além da sua senha. Os tokens podem ser gerados em Android, iOS, e Windows Phone dispositivos. + oauth_enabled_warning: "Tenha em atenção que os logins sociais serão desativados quando a autenticação de dois fatores estiver ativada na sua conta." change_about: title: "Modificar Sobre Mim" error: "Houve um erro ao alterar esse valor." change_username: title: "Alterar Nome de Usuário" - confirm: "Se você mudar seu Nome de Usuário, todas as citações das suas respostas e as menções ao seu @nome serão desfeitas. Você tem certeza?" + confirm: "Tem certeza absoluta de que deseja alterar seu nome de usuário?" taken: "Desculpe, esse Nome de Usuário já está sendo usado." invalid: "Esse Nome de Usuário é inválido. Deve conter apenas números e letras." change_email: @@ -582,6 +720,7 @@ pt_BR: title: "Alterar sua imagem de perfil" gravatar: "Gravatar, baseado em" gravatar_title: "Alterar seu avatar no site do Gravatar" + gravatar_failed: "Não foi possível buscar o Gravatar. Existe um associado a esse endereço de e-mail?" refresh_gravatar_title: "Atualize seu Gravatar" letter_based: "Sistema concedeu imagem de perfil." uploaded_avatar: "Foto pessoal" @@ -589,7 +728,6 @@ pt_BR: upload_title: "Enviar sua foto" upload_picture: "Enviar imagem" image_is_not_a_square: "Aviso: nós cortamos sua imagem; largura e altura não eram iguais." - cache_notice: "Você alterou sua foto de perfil com sucesso, porém pode levar algum tempo para que a mesma apareça devido ao cachê do navegador." change_profile_background: title: "Fundo do perfil" instructions: "Fundos do perfil será centralizado e tera uma largura padrão de 850px." @@ -598,14 +736,22 @@ pt_BR: instructions: "As Imagens de fundo serão centralizadas e deverão ter largura de 590px" email: title: "Email" + primary: "E-mail primário" + secondary: "E-mails secundários" + no_secondary: "Nenhum e-mail secundário" instructions: "nunca é exibido publicamente" ok: "Nós vamos pedir confirmação por email" invalid: "Insira um endereço de email" authenticated: "Seu email foi autenticado por {{provider}}" frequency_immediately: "Não se preocupe, caso você não leia uma mensagem, enviaremos um email para você." frequency: - one: Nós apenas te enviaremos email se não o tivermos visto no último minuto. - other: Nós apenas te enviaremos email se não o tivermos visto nos últimos {{count}} minutos. + one: "Nós apenas te enviaremos email se não o tivermos visto no último minuto." + other: "Nós apenas te enviaremos email se não o tivermos visto nos últimos {{count}} minutos." + associated_accounts: + title: "Contas Associadas" + connect: "Conectar" + revoke: "Revogar" + not_connected: "(não conectado)" name: title: "Nome" instructions: "seu nome completo (opcional)" @@ -692,9 +838,10 @@ pt_BR: title: "Convites" user: "Usuários convidados" sent: "Enviado" + none: "Não há convites para exibir." truncated: - one: Mostrando os primeiro convite. - other: Mostrando os primeiros {{count}} convites. + one: "Mostrando os primeiro convite." + other: "Mostrando os primeiros {{count}} convites." redeemed: "Convites usados" redeemed_tab: "Resgatado" redeemed_tab_with_count: "Resgatado ({{count}})" @@ -739,21 +886,31 @@ pt_BR: title: "Resumo" stats: "Estatísticas" time_read: "tempo de leitura" + recent_time_read: "tempo de leitura recente" topic_count: - one: tópico criado - other: tópicos criados + one: "tópico criado" + other: "tópicos criados" post_count: - one: post criado - other: posts criados + one: "post criado" + other: "posts criados" + likes_given: + one: "dado" + other: "dado" + likes_received: + one: "recebido" + other: "Recebido" days_visited: - one: dia visitado - other: dias visitados + one: "dia visitado" + other: "dias visitados" + topics_entered: + one: "tópico visto" + other: "tópicos vistos" posts_read: - one: post lido - other: posts lidos + one: "post lido" + other: "posts lidos" bookmark_count: - one: favorito - other: favoritos + one: "favorito" + other: "favoritos" top_replies: "Mais Respondidos" no_replies: "Nenhuma resposta ainda." more_replies: "Mais Respostas" @@ -769,7 +926,9 @@ pt_BR: most_liked_users: "Mais Curtidos" most_replied_to_users: "Mais Respondidos" no_likes: "Ainda sem nenhuma curtida." - associated_accounts: "Logins" + top_categories: " Categorias do Topo" + topics: "Tópicos" + replies: "Respostas" ip_address: title: "Último endereço IP" registration_ip_address: @@ -779,6 +938,7 @@ pt_BR: header_title: "perfil, mensagens, favoritos e preferências" title: title: "Título" + none: "(nenhum)" filters: all: "Todos" stream: @@ -821,8 +981,8 @@ pt_BR: reached: "%{relativeAge} – %{rate} alcançou a configuração limite do site de %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} excedeu a configuração limite do site de %{siteSettingRate}." rate: - one: 1 erro/%{duration} - other: '%{count} erros/%{duration}' + one: "1 erro/%{duration}" + other: "%{count} erros/%{duration}" learn_more: "aprenda mais..." all_time: 'total' all_time_desc: 'total de tópicos criados' @@ -836,7 +996,11 @@ pt_BR: first_post: Primeira resposta mute: Silenciar unmute: Reativar + last_post: Publicado time_read: Lido + time_read_recently: '%{time_read} recentememte' + time_read_tooltip: '%{time_read} tempo total lido' + time_read_recently_tooltip: '%{time_read} tempo total lido (%{recent_time_read} nos últimos 60 dias)' last_reply_lowercase: última resposta replies_lowercase: one: resposta @@ -846,8 +1010,6 @@ pt_BR: hide_session: "Lembre-me amanhã" hide_forever: "não obrigado" hidden_for_session: "OK, Eu vou perguntar amanhã. Você pode também sempre usar o 'Registre-se' para criar uma conta." - intro: "Ei você! :heart_eyes: Parece que você está gostando da discussão, mas ainda não criou uma conta." - value_prop: "Quando você cria uma conta, nós lembramos exatamente o que você leu, assim você sempre volta exatamente aonde estava. Você também recebe notificações, aqui e por e-mail, quando novas mensagens são feitas. E você pode curtir tópicos para compartilhar o amor. :heartbeat:" summary: enabled_description: "Você está vendo um sumário deste tópico: os posts mais interessantes conforme determinados pela comunidade." description: "Existem {{replyCount}} respostas." @@ -861,7 +1023,6 @@ pt_BR: disable: "Mostrar Posts Deletados" private_message_info: title: "Mensagem" - invite: "Convidar outros..." leave_message: "Você quer mesmo deixar esta mensagem?" remove_allowed_user: "Tem a certeza que deseja remover {{name}} desta mensagem?" remove_allowed_group: "Tem a certeza que deseja remover {{name}} desta mensagem?" @@ -887,16 +1048,34 @@ pt_BR: complete_email_found: "Encontramos uma conta com %{email}, você deve receber um email com instruções em como resetar sua senha em breve." complete_username_not_found: "Nenhuma conta com usuário %{username}" complete_email_not_found: "Nenhuma conta com %{email}" + help: "E-mail não chegando? Certifique-se de verificar sua pasta de spam primeiro.

Não tem certeza de qual endereço de e-mail você usou? Digite um endereço de e-mail e informaremos se ele existe aqui.

Se você não tiver mais acesso ao endereço de e-mail da sua conta, entre em contato com nossa equipe prestativa.

" button_ok: "OK" button_help: "Ajuda" + email_login: + link_label: "Envie-me um link de login" + button_label: "com e-mail" + complete_username: "Se uma conta corresponder ao nome de usuário %{username}, você deve receber um e-mail com um link de login em breve." + complete_email: "Se uma conta corresponder %{email}, você deve receber um e-mail com um link de login em breve." + complete_username_found: "Encontramos uma conta que corresponde ao nome de usuário %{username}, você deve receber um e-mail com um link de login em breve." + complete_email_found: "Encontramos uma conta que corresponde%{email}, você deve receber um e-mail com um link de login em breve." + complete_username_not_found: "Nenhuma conta corresponde ao nome de usuário %{username}" + complete_email_not_found: "Nenhuma conta corresponde%{email}" login: title: "Log In" username: "Usuário" password: "Senha" + second_factor_title: "Autenticação de dois fatores" + second_factor_description: "Digite o código de autenticação do seu aplicativo:" + second_factor_backup: "Faça o login usando um código de backup" + second_factor_backup_title: "Backup de dois fatores" + second_factor_backup_description: "Por favor, insira um dos seus códigos de backup:" + second_factor: "Faça o login usando o aplicativo Authenticator" email_placeholder: "e-mail ou Nome de Usuário" caps_lock_warning: "CAIXA ALTA está ligado" error: "Erro desconhecido" + cookies_error: "Seu navegador parece ter cookies desativados. Você pode não conseguir efetuar login sem ativá-los primeiro." rate_limit: "Por favor aguarde antes de tentar logar novamente." + blank_username: "Por favor, digite seu e-mail ou nome de usuário." blank_username_or_password: "Por favor, coloque seu email ou Nome de Usuário, e senha." reset_password: 'Recuperar senha' logging_in: "Entrando..." @@ -909,6 +1088,7 @@ pt_BR: not_allowed_from_ip_address: "Você não pode logar deste endereço IP." admin_not_allowed_from_ip_address: "Você não pode entrar como administrador a partir deste endereço IP." resend_activation_email: "Clique aqui para enviar o email de ativação novamente." + omniauth_disallow_totp: "Sua conta tem dois fatores de autenticação ativados. Por favor faça o login com sua senha." resend_title: "Reenviar E-mail de Ativação" change_email: "Trocar Endereço de E-mail" provide_new_email: "Digite um novo e-mail e nós re-enviaremos seu e-mail de confirmação" @@ -918,25 +1098,28 @@ pt_BR: preferences: "Você precisa estar logado para mudar suas preferências de usuário." forgot: "Não me recordo dos detalhes da minha conta." not_approved: "Sua conta ainda não foi aprovada. Você será notificado por email quando estiver tudo pronto para realizar seu login." - google: - title: "Entrar com Google" - message: "Autenticando com Google (certifique-se de que os bloqueadores de popup estejam desativados)" google_oauth2: + name: "Google" title: "com Google" message: "Autenticação com o Google (tenha certeza que bloqueadores de popup não estão ligados)" twitter: + name: "Twitter" title: "Entrar com Twitter" message: "Autenticando com Twitter (certifique-se de que os bloqueadores de popup estejam desativados)" instagram: + name: "Instagram" title: "Entrar com Instagram" message: "Autenticando com o Instagram (tenha certeza de que bloqueadores de pop up não estejam ativados)" facebook: + name: "Facebook" title: "Entrar com Facebook" message: "Autenticando com Facebook (certifique-se de que os bloqueadores de popup estejam desativados)" yahoo: + name: "Yahoo" title: "Entrar com Yahoo" message: "Autenticando com Yahoo (certifique-se de que os bloqueadores de popup estejam desativados)" github: + name: "GitHub" title: "com GitHub" message: "Autenticando com GitHub (certifique-se de que os bloqueadores de popup estejam desativados)" invites: @@ -964,27 +1147,55 @@ pt_BR: categories_only: "Categorias Apenas" categories_with_featured_topics: "Categorias com Tópicos em Destaque" categories_and_latest_topics: "Categorias e Últimos Tópicos" + categories_and_top_topics: "Categorias e tópicos principais" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' alt: 'Alt' + conditional_loading_section: + loading: Carregando... select_kit: default_header_text: Selecionar... + no_content: Nenhuma equivalência encontrada filter_placeholder: Buscar... + create: "Crie: '{{content}}'" + max_content_reached: + one: "Você só pode selecionar o item {{count}}." + other: "Você só pode selecionar {{count}} itens." + min_content_not_reached: + one: "Selecione pelo menos {{count}} itens." + other: "Selecione pelo menos {{count}} itens." emoji_picker: + filter_placeholder: Pesquisar por emoji people: Pessoas nature: Natureza food: Comida activity: Atividade travel: Viagem objects: Objetos + celebration: Celebração custom: Emojis personalizados + recent: Usado recentemente + default_tone: Sem tom de pele + light_tone: Tom de pele claro + medium_light_tone: Tom de pele leve médio + medium_tone: Tom de pele médio + medium_dark_tone: Tom de pele escuro e médio + dark_tone: Tom de pele escura + shared_drafts: + title: "Rascunhos compartilhados" + notice: "Este tópico só é visível para aqueles que podem ver o {{category}} categoria." + destination_category: "Categoria de Destino" + publish: "Publicar rascunho compartilhado" + confirm_publish: "Tem certeza de que deseja publicar este rascunho?" + publishing: "Publicando tópico..." composer: emoji: "Emoji :)" more_emoji: "mais..." options: "Opções" whisper: "sussuro" unlist: "Não listado" + blockquote_text: "Bloco de citação" add_warning: "Este é um aviso oficial." toggle_whisper: "Habilitar Sussuro" toggle_unlisted: "Alterar não listado" @@ -994,12 +1205,14 @@ pt_BR: saved_local_draft_tip: "salvo localmente" similar_topics: "Seu tópico é parecido com..." drafts_offline: "rascunhos offline" + group_mentioned_limit: "Cuidado! Você mencionou {{group}}, no entanto, esse grupo tem mais membros do que o limite de menção configurado pelo administrador de {{max}} usuários. Ninguém será notificado." group_mentioned: - one: Ao mencionar {{group}}, você está prester a notifcar 1 pessoa – tem certeza? - other: Ao mencionar {{group}}, você está prestes a notificar {{count}} pessoas – tem certeza? + one: "Ao mencionar {{group}}, você está prester a notifcar 1 pessoa – tem certeza?" + other: "Ao mencionar {{group}}, você está prestes a notificar {{count}} pessoas – tem certeza?" cannot_see_mention: category: "Você mencionou {{username}}, porém ele(a) não será notificado(a), pois não tem acesso a essa categoria. Você deverá adicioná-lo(a) ao grupo que tem acesso à categoria." private: "Você mencionou {{username}}, porém ele(a) não será notificado(a), pois não pode ver essa mensagem pessoal. Você deverá convidá-lo(a) para essa MP." + duplicate_link: "Parece que o seu link para {{domain}} já foi postado no tópico por@{{username}} emuma resposta {{atrás}} – tem certeza de que deseja postá-lo novamente?" error: title_missing: "Título é obrigatório" title_too_short: "O título tem que ter no mínimo {{min}} caracteres" @@ -1008,6 +1221,7 @@ pt_BR: post_length: "A resposta tem que ter no mínimo {{min}} caracteres" try_like: 'Já tentou o botão ?' category_missing: "Você precisa escolher uma categoria" + tags_missing: "Você deve escolher pelo menos {{count}} tags" save_edit: "Salvar alterações" reply_original: "Responder em um Tópico Novo" reply_here: "Responda aqui" @@ -1016,6 +1230,8 @@ pt_BR: create_topic: "Criar Tópico" create_pm: "Mensagem" create_whisper: "Sussurrar" + create_shared_draft: "Criar rascunho compartilhado" + edit_shared_draft: "Editar rascunho compartilhado" title: "Ou pressione Ctrl+Enter" users_placeholder: "Adicionar um usuário" title_placeholder: "Sobre o que é esta discussão em uma pequena frase?" @@ -1025,6 +1241,8 @@ pt_BR: topic_featured_link_placeholder: "Entre com o link mostrado no título." remove_featured_link: "Remover link do tópico." reply_placeholder: "Escreva aqui. Use Markdown, BBCode ou HTML para formatar. Arraste ou cole uma imagens." + reply_placeholder_no_images: "Digite aqui. Use Markdown, BBCode ou HTML para formatar." + reply_placeholder_choose_category: "Você deve selecionar uma categoria antes de digitar aqui." view_new_post: "Ver sua nova resposta." saving: "Salvando" saved: "Salvo!" @@ -1054,7 +1272,10 @@ pt_BR: olist_title: "Lista numerada" ulist_title: "Lista de itens" list_item: "Item da lista" + toggle_direction: "Alternar Direção" help: "Ajuda da edição Markdown" + collapse: "minimizar o painel do compositor" + abandon: "compositor próximo e rascunho de descarte" modal_ok: "OK" modal_cancel: "Cancelar" cant_send_pm: "Desculpe, você não pode enviar uma mensagem para %{username}." @@ -1062,7 +1283,38 @@ pt_BR: title: "Você se esqueceu de adicionar destinatários?" body: "No momento esta mensagem está sendo enviada apenas para si mesmo!" admin_options_title: "Configurações opcionais da equipe para este tópico" + composer_actions: + reply: Resposta + draft: "Esboço, projeto" + edit: Editar + reply_to_post: + label: "Resposta a publicação%{postNumber}por %{postUsername}" + desc: Responder a uma postagem específica + reply_as_new_topic: + label: Responder como tópico vinculado + desc: Crie um novo tópico vinculado a este tópico + reply_as_private_message: + label: Nova mensagem + desc: Crie uma nova mensagem pessoal + reply_to_topic: + label: Responder ao tópico + desc: "Responder ao tópico, não é uma postagem específica" + toggle_whisper: + label: Alternar sussurro + desc: Sussurros são visíveis apenas para membros da equipe + create_topic: + label: "Novo tópico" + shared_draft: + label: "Rascunho compartilhado" + desc: "Elabore um tópico que só será visível para o pessoal" notifications: + tooltip: + regular: + one: "1 notificação sem aviso" + other: "{{count}} notificações invisíveis" + message: + one: "1 mensagem não lida" + other: "{{count}} mensagens não lidas" title: "notificações de menção de @name, respostas às suas postagens, tópicos, mensagens, etc" none: "Não foi possível carregar notificações no momento." empty: "Não foi encontrada nenhuma notificação." @@ -1076,6 +1328,9 @@ pt_BR: edited: "{{username}} {{description}}" liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" + liked_many: + one: "{{username}}, {{username2}} e 1 outro {{description}}" + other: "{{username}}, {{username2}} e {{count}} outros {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1085,13 +1340,19 @@ pt_BR: granted_badge: "Adquiriu '{{description}}'" topic_reminder: "{{username}} {{description}}" watching_first_post: "Novo Tópico {{description}}" + group_message_summary: + one: "{{count}} mensagem em seu {{group_name}} caixa de entrada" + other: "{{count}} mensagens em seu {{group_name}} caixa de entrada" popup: mentioned: '{{username}} mencionou você em "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} mencionou você em "{{topic}}" - {{site_title}}' quoted: '{{username}} citou você em "{{topic}}" - {{site_title}}' replied: '{{username}} respondeu para você em "{{topic}}" - {{site_title}}' posted: '{{username}} postou em "{{topic}}" - {{site_title}}' + private_message: '{{username}} enviou-lhe uma mensagem pessoal em "{{topic}}" - {{site_title}}' linked: '{{username}} linkou o seu post de "{{topic}}" - {{site_title}}' + confirm_title: 'Notificações ativadas - %{site_title}' + confirm_body: 'Sucesso! Notificações foram ativadas.' upload_selector: title: "Adicionar uma imagem" title_with_attachments: "Adicionar uma imagem ou arquivo" @@ -1117,13 +1378,21 @@ pt_BR: select_all: "Selecionar Todos" clear_all: "Limpar Todos" too_short: "Seu termo de pesquisa é muito curto." + result_count: + one: "1 resultado para{{term}}" + other: "{{count}}{{plus}} resultados para{{term}}" title: "procurar em tópicos, respostas, usuários ou categorias" + full_page_title: "pesquisar tópicos ou postagens" no_results: "Nenhum resultado encontrado." no_more_results: "Sem mais resultados encontrados." searching: "Procurando..." post_format: "#{{post_number}} por {{username}}" + results_page: "Buscar resultados para '{{term}}'" + more_results: "Existem mais resultados. Por favor, restrinja os seus critérios de pesquisa." cant_find: "Não está conseguindo achar o que você quer?" start_new_topic: "Que tal começar um novo tópico?" + or_search_google: "Ou tente pesquisar com o Google:" + search_google: "Tente pesquisar com o Google:" search_google_button: "Google" search_google_title: "Buscar neste site" context: @@ -1135,20 +1404,31 @@ pt_BR: title: Busca avançada posted_by: label: Postado por + in_category: + label: Categorizado in_group: label: Em Grupo with_badge: label: Com Emblema + with_tags: + label: Tagged filters: + label: Apenas retorne tópicos / posts ... + title: Correspondência apenas no título likes: Eu gostei posted: Eu publiquei em watching: Eu estou assistindo tracking: Eu estou rastreando + private: Nas minhas mensagens + bookmarks: Eu marquei first: são a primeira publicação pinned: está fixado unpinned: não está fixado + seen: Eu leio unseen: Eu não li wiki: é uma wiki + images: incluir imagem (s) + all_tags: Todas as tags acima statuses: label: Onde os tópicos open: está aberto @@ -1174,6 +1454,7 @@ pt_BR: select_all: "Selecionar Tudo" clear_all: "Limpar Tudo" unlist_topics: "Tópicos Não Listados" + relist_topics: "Tópicos Relist" reset_read: "Redefinir Lido" delete: "Apagar Tópicos" dismiss: "Marcar como lida" @@ -1184,13 +1465,14 @@ pt_BR: dismiss_new: "Dispensar Nova" toggle: "alternar a seleção em massa de tópicos" actions: "Ações em Massa" + change_category: "Definir categoria" close_topics: "Fechar Tópicos" archive_topics: "Arquivar Tópicos" notification_level: "Notificações" choose_new_category: "Escolha a nova categoria para os tópicos:" selected: - one: Você selecionou 1 tópico. - other: Você selecionou {{count}} tópicos. + one: "Você selecionou 1 tópico." + other: "Você selecionou {{count}} tópicos." change_tags: "Substituir marcadores" append_tags: "Adicionar Etiquetas" choose_new_tags: "Escolha novas tags para esses tópicos:" @@ -1223,10 +1505,11 @@ pt_BR: search: "Não existem mais resultados." topic: filter_to: - one: 1 publicação no tópico - other: '{{count}} publicações no tópico' + one: "1 publicação no tópico" + other: "{{count}} publicações no tópico" create: 'Novo tópico' create_long: 'Criar um novo tópico' + open_draft: "Rascunho aberto" private_message: 'Iniciar uma mensagem' archive_message: help: 'Mover mensagens para o seu arquivo' @@ -1234,14 +1517,17 @@ pt_BR: move_to_inbox: title: 'Mover para caixa de entrada' help: 'Mover mensagem para Caixa de Entrada' + edit_message: + help: 'Editar primeiro post da mensagem' + title: 'Editar Mensagem' list: 'Tópicos' new: 'novo tópico' unread: 'não lido' new_topics: - one: 1 tópico novo + one: '1 tópico novo' other: '{{count}} novos tópicos' unread_topics: - one: 1 tópico não lido + one: '1 tópico não lido' other: '{{count}} tópicos não lidos' title: 'Tópico' invalid_access: @@ -1255,17 +1541,17 @@ pt_BR: title: "Tópico não encontrado" description: "Desculpe, não foi possível encontrar esse tópico. Talvez ele tenha sido apagado?" total_unread_posts: - one: você tem {{count}} post não lido neste tópico - other: você tem {{count}} posts não lidos neste tópico + one: "você tem {{count}} post não lido neste tópico" + other: "você tem {{count}} posts não lidos neste tópico" unread_posts: - one: você possui 1 resposta antiga que não foi lida neste tópico - other: você possui {{count}} respostas antigas que não foram lidas neste tópico + one: "você possui 1 resposta antiga que não foi lida neste tópico" + other: "você possui {{count}} respostas antigas que não foram lidas neste tópico" new_posts: - one: há 1 nova resposta neste tópico desde a sua última leitura - other: há {{count}} novas respostas neste tópico desde a sua última leitura + one: "há 1 nova resposta neste tópico desde a sua última leitura" + other: "há {{count}} novas respostas neste tópico desde a sua última leitura" likes: - one: há 1 curtida neste tópico - other: há {{count}} curtidas neste tópico + one: "há 1 curtida neste tópico" + other: "há {{count}} curtidas neste tópico" back_to_list: "Voltar a lista dos tópicos" options: "Opções do tópico" show_links: "mostrar links dentro desse tópico" @@ -1280,11 +1566,16 @@ pt_BR: jump_reply_down: pular para a resposta mais antiga deleted: "Este tópico foi apagado" topic_status_update: + title: "Temporizador de Tópico" + save: "Definir temporizador" num_of_hours: "Número de horas:" remove: "Remover contador" publish_to: "Publicar para:" when: "Quando:" + public_timer_types: Temporizadores de Tópicos + private_timer_types: Temporizadores de tópicos do usuário auto_update_input: + none: "Selecione um período de tempo" later_today: "Mais tarde hoje" tomorrow: "Amanhã" later_this_week: "Mais tarde esta semana" @@ -1310,17 +1601,22 @@ pt_BR: title: "Fechar tópico automaticamente" label: "Horas para fechar tópico automaticamente:" error: "Por favor insira um valor válido." + based_on_last_post: "Não feche até que o último post do tópico seja pelo menos antigo." + auto_delete: + title: "Auto-excluir o tópico" reminder: title: "Lembrar-me" status_update_notice: auto_open: "Este tópico irá abrir automaticamente em %{timeLeft}" auto_close: "Este tópico irá fechar automaticamente em %{timeLeft}" auto_publish_to_category: "Este tópico será publicado em #%{categoryName} %{timeLeft}." + auto_close_based_on_last_post: "Este tópico fechará %{duration} após a última resposta." auto_delete: "Este tópico será automaticamente apagado %{timeLeft}." + auto_reminder: "Você será lembrado sobre esse tópico%{timeLeft}." auto_close_title: 'Configurações para fechar automaticamente' auto_close_immediate: - one: A última publicação no tópico já tem 1 hora, portanto ele será fechado imediatamente. - other: A última publicação no tópico já tem %{count} horas, portanto ele será fechado imediatamente. + one: "A última publicação no tópico já tem 1 hora, portanto ele será fechado imediatamente." + other: "A última publicação no tópico já tem %{count} horas, portanto ele será fechado imediatamente." timeline: back: "Voltar" back_description: "Volte para a sua última postagem não lida" @@ -1335,6 +1631,8 @@ pt_BR: jump_prompt_of: "de %{count} publicações" jump_prompt_long: "Gostaria de ir para qual mensagem?" jump_bottom_with_number: "ir para a mensagem %{post_number}" + jump_prompt_to_date: "Até a presente data" + jump_prompt_or: "ou" total: total de mensagens current: resposta atual notifications: @@ -1347,6 +1645,10 @@ pt_BR: "3_2": 'Você receberá notificações porque está observando este tópico.' "3_1": 'Você receberá notificações porque criou este tópico.' "3": 'Você receberá notificações porque você está observando este tópico.' + "2_8": 'Você verá uma contagem de novas respostas porque está acompanhando essa categoria.' + "2_4": 'Você verá uma contagem de novas respostas porque postou uma resposta a este tópico.' + "2_2": 'Você verá uma contagem de novas respostas porque está acompanhando este tópico.' + "2": 'Você verá uma contagem de novas respostas porqueleia este tópico.' "1_2": 'Você será notificado se alguém mencionar o seu @nome ou responder à sua mensagem.' "1": 'Você será notificado se alguém mencionar o seu @nome ou responder à sua mensagem.' "0_7": 'Você está ignorando todas as notificações nessa categoria.' @@ -1382,6 +1684,7 @@ pt_BR: open: "Abrir tópico" close: "Fechar tópico" multi_select: "Selecionar Mensagens..." + timed_update: "Definir o temporizador do tópico ..." pin: "Fixar Tópico..." unpin: "Desafixar Tópico..." unarchive: "Desarquivar tópico" @@ -1390,6 +1693,7 @@ pt_BR: visible: "Tornar Visível" reset_read: "Repor data de leitura" make_public: "Transformar em Tópico Público" + make_private: "Faça uma mensagem pessoal" feature: pin: "Fixar Tópico" unpin: "Desafixar Tópico" @@ -1422,8 +1726,8 @@ pt_BR: pin_validation: "Uma data é necessária para fixar este tópico." not_pinned: "Não existem tópicos fixados em {{categoryLink}}." already_pinned: - one: 'Tópicos fixados em {{categoryLink}}: 1' - other: 'Tópicos fixados em {{categoryLink}}: {{count}}' + one: "Tópicos fixados em {{categoryLink}}: 1" + other: "Tópicos fixados em {{categoryLink}}: {{count}}" pin_globally: "Fazer com que este tópico apareça no topo de todas listas de tópicos até" confirm_pin_globally: "Você já tem {{count}} tópicos fixados globalmente. Muitos tópicos fixados podem prejudicar usuários novos e anônimos. Tem certeza que quer fixar outro tópico globalmente?" unpin_globally: "Remover este tópico do inicio de todas as listas de tópicos." @@ -1431,8 +1735,8 @@ pt_BR: global_pin_note: "Usuários podem desafixar o tópico individualmente para si." not_pinned_globally: "Não existem tópicos fixados globalmente." already_pinned_globally: - one: 'Tópicos atualmente fixados globalmente: {{count}}.' - other: 'Tópicos atualmente fixados globalmente: {{count}}' + one: "Tópicos atualmente fixados globalmente: {{count}}." + other: "Tópicos atualmente fixados globalmente: {{count}}" make_banner: "Tornar este tópico em um banner que apareça no inicio de todas as páginas." remove_banner: "Remover o banner que aparece no inicio de todas as páginas." banner_note: "Usuários podem dispensar o banner fechando-o. Apenas um tópico pode ser colocado como banner a cada momento." @@ -1465,11 +1769,12 @@ pt_BR: success_email: "Enviamos um convite para {{emailOrUsername}}. Nós notificaremos você quando este convite for resgatado. Verifique a aba de convites na página de seu usuário para acompanhar seus convites." success_username: "Nós convidamos o usuário para participar neste tópico." error: "Desculpe, nós não pudemos convidar esta pessoa. Talvez já seja usuário? (convites têm taxa limitada)" + success_existing_email: "Um usuário com e-mail {{emailOrUsername}} já existe. Convidamos esse usuário a participar deste tópico." login_reply: 'Logar para Responder' filters: n_posts: - one: 1 mensagem - other: '{{count}} mensagens' + one: "1 mensagem" + other: "{{count}} mensagens" cancel: "Remover filtro" split_topic: title: "Mover para novo tópico" @@ -1477,15 +1782,15 @@ pt_BR: topic_name: "Nome do tópico novo" error: "Houve um erro ao mover as mensagens para o novo tópico." instructions: - one: Você está prestes a criar um novo tópico e populá-lo com a resposta que você selecionou. - other: Você está prestes a criar um novo tópico e populá-lo com as {{count}} respostas que você selecionou. + one: "Você está prestes a criar um novo tópico e populá-lo com a resposta que você selecionou." + other: "Você está prestes a criar um novo tópico e populá-lo com as {{count}} respostas que você selecionou." merge_topic: title: "Mover para tópico já existente" action: "mover para tópico já existente" error: "Houve um erro ao mover as mensagens para aquele tópico." instructions: - one: Por favor selecione o tópico para o qual você gostaria de mover esta resposta. - other: Por favor selecione o tópico para o qual você gostaria de mover estas {{count}} respostas. + one: "Por favor selecione o tópico para o qual você gostaria de mover esta resposta." + other: "Por favor selecione o tópico para o qual você gostaria de mover estas {{count}} respostas." merge_posts: title: "Unificar as Mensagens Selecionadas" action: "unificar as mensagens selecionadas" @@ -1497,9 +1802,11 @@ pt_BR: label: "Novo Autor das Mensagens" placeholder: "novo autor" instructions: - one: Por favor, escolha o novo dono do post por {{old_user}}. - other: Por favor, escolha o novo autor dessas {{count}} mensagens que eram de {{old_user}}. + one: "Por favor, escolha o novo dono do post por {{old_user}}." + other: "Por favor, escolha o novo autor dessas {{count}} mensagens que eram de {{old_user}}." + instructions_warn: "Observe que quaisquer notificações sobre essa postagem não serão transferidas para o novo usuário retroativamente." change_timestamp: + title: "Alterar o timestamp ..." action: "alterar horário" invalid_timestamp: "Horário não pode ser no futuro." error: "Ocorreu um erro alterando o horário do tópico." @@ -1507,15 +1814,28 @@ pt_BR: multi_select: select: 'selecionar' selected: '({{count}}) selecionados' + select_post: + label: 'selecione' + title: 'Adicionar postagem à seleção' + selected_post: + label: 'selecionado' + title: 'Clique para remover a postagem da seleção' + select_replies: + label: 'selecionar + respostas' + title: 'Adicionar post e todas as suas respostas à seleção' + select_below: + label: 'selecione + abaixo' + title: 'Adicionar post e tudo depois dele para seleção' delete: apagar selecionados cancel: cancelar seleção select_all: selecionar tudo deselect_all: deselecionar tudo description: one: 1 resposta selecionada. - other: {{count}} respostas selecionadas. + other: "{{count}} respostas selecionadas." post: quote_reply: "Citação" + edit: " {{link}} {{replyAvatar}} {{username}}" edit_reason: "Motivo:" post_number: "resposta {{number}}" wiki_last_edited_on: "wiki última vez editada em" @@ -1527,26 +1847,28 @@ pt_BR: show_full: "Exibir mensagem completa" show_hidden: 'Ver conteúdo escondido' deleted_by_author: - one: (respostas abandonadas pelo autor, serão removidas automaticamente em %{count} hora a exceto se forem sinalizadas) - other: (respostas abandonadas pelo autor, serão removidas automaticamente em %{count} horas a exceto se forem sinalizadas) + one: "(respostas abandonadas pelo autor, serão removidas automaticamente em %{count} hora a exceto se forem sinalizadas)" + other: "(respostas abandonadas pelo autor, serão removidas automaticamente em %{count} horas a exceto se forem sinalizadas)" + collapse: "colapso" expand_collapse: "expandir/encolher" + locked: "um membro da equipe bloqueou este post de ser editado" gap: - one: ver 1 resposta oculta - other: ver {{count}} respostas ocultas + one: "ver 1 resposta oculta" + other: "ver {{count}} respostas ocultas" unread: "Resposta não lida" has_replies: - one: '{{count}} Resposta' - other: '{{count}} Respostas' + one: "{{count}} Resposta" + other: "{{count}} Respostas" has_likes: - one: '{{count}} Curtida' - other: '{{count}} Curtidas' + one: "{{count}} Curtida" + other: "{{count}} Curtidas" has_likes_title: - one: '{{count}} pessoa curtiu esta mensagem' - other: '{{count}} pessoas curtiram esta mensagem' + one: "{{count}} pessoa curtiu esta mensagem" + other: "{{count}} pessoas curtiram esta mensagem" has_likes_title_only_you: "você curtiu esta postagem" has_likes_title_you: - one: você e mais 1 pessoa gostaram dessa postagem - other: você e mais {{count}} outras pessoas gostaram dessa postagem + one: "você e mais 1 pessoa gostaram dessa postagem" + other: "você e mais {{count}} outras pessoas gostaram dessa postagem" errors: create: "Desculpe, houve um erro ao criar sua resposta. Por favor, tente outra vez." edit: "Desculpe, houve um erro ao editar sua resposta. Por favor, tente outra vez." @@ -1583,6 +1905,15 @@ pt_BR: undelete: "recuperar esta resposta" share: "compartilhar o link desta resposta" more: "Mais" + delete_replies: + confirm: "Você também deseja excluir as respostas desta postagem?" + direct_replies: + one: "Sim e 1 resposta direta" + other: "Sim e {{count}} respostas diretas" + all_replies: + one: "Sim e 1 resposta" + other: "Sim, e todas as {{count}} respostas" + just_the_post: "Não, apenas este post" admin: "ações de mensagens do admin" wiki: "Tornar Wiki" unwiki: "Remover Wiki" @@ -1591,15 +1922,24 @@ pt_BR: rebake: "Reconstruir HTML" unhide: "Revelar" change_owner: "Trocar autor" + grant_badge: "Grant Badge" + lock_post: "Bloquear Post" + lock_post_description: "impedir que o pôster edite este post" + unlock_post: "Desbloquear postagem" + unlock_post_description: "permitir que o cartaz edite esta postagem" + delete_topic_disallowed_modal: "Você não tem permissão para apagar este tópico. Se você realmente quiser que ele seja excluído, envie um sinalizador para a atenção do moderador juntamente com o raciocínio." + delete_topic_disallowed: "você não tem permissão para apagar este tópico" actions: flag: 'Sinalização' + defer_flags: + one: "Ignorar sinalizações" + other: "Ignorar sinalizações" undo: off_topic: "Desfazer sinalização" spam: "Desfazer sinalização" inappropriate: "Desfazer sinalização" bookmark: "Remover favorito" like: "Descurtir" - vote: "Desfazer voto" people: off_topic: "marcado como off-topic" spam: "marcado como spam" @@ -1608,7 +1948,9 @@ pt_BR: notify_user: "enviou uma mensagem" bookmark: "favoritaram isto" like: "curtiu isto" - vote: "votaram nisto" + like_capped: + one: "e {{count}} outro gostou disto" + other: "e {{count}} outros gostaram disto" by_you: off_topic: "Você sinalizou isto como off-topic" spam: "Você sinalizou isto como spam" @@ -1617,57 +1959,58 @@ pt_BR: notify_user: "Você enviou uma mensagem particular para este usuário" bookmark: "Você favoritou esta resposta" like: "Você curtiu" - vote: "Você votou nesta resposta" by_you_and_others: off_topic: - one: Você e mais 1 pessoa sinalizaram isto como off-topic - other: Você e mais {{count}} pessoas sinalizaram isto como off-topic + one: "Você e mais 1 pessoa sinalizaram isto como off-topic" + other: "Você e mais {{count}} pessoas sinalizaram isto como off-topic" spam: - one: Você e mais 1 pessoa sinalizaram isto como spam - other: Você e mais {{count}} pessoas sinalizaram isto como spam + one: "Você e mais 1 pessoa sinalizaram isto como spam" + other: "Você e mais {{count}} pessoas sinalizaram isto como spam" inappropriate: - one: Você e mais 1 pessoa sinalizaram isto como inapropriado - other: Você e mais {{count}} pessoas sinalizaram isto como inapropriado + one: "Você e mais 1 pessoa sinalizaram isto como inapropriado" + other: "Você e mais {{count}} pessoas sinalizaram isto como inapropriado" notify_moderators: - one: Você e mais 1 pessoa sinalizaram isto para moderação - other: Você e mais {{count}} pessoas sinalizaram isto para moderação + one: "Você e mais 1 pessoa sinalizaram isto para moderação" + other: "Você e mais {{count}} pessoas sinalizaram isto para moderação" notify_user: - one: Você e 1 outro usuário enviaram mensagens particulares para este usuário - other: Você e mais {{count}} usuários enviaram mensagens particulares para este usuário + one: "Você e 1 outro usuário enviaram mensagens particulares para este usuário" + other: "Você e mais {{count}} usuários enviaram mensagens particulares para este usuário" bookmark: - one: Você e mais 1 pessoa favoritaram esta resposta - other: Você e mais {{count}} favoritaram esta resposta + one: "Você e mais 1 pessoa favoritaram esta resposta" + other: "Você e mais {{count}} favoritaram esta resposta" like: - one: Você e mais 1 pessoa curtiu isto - other: Você e mais {{count}} pessoas curtiram isto - vote: - one: Você e mais 1 pessoa votaram nesta resposta - other: Você e mais {{count}} pessoas votaram nesta resposta + one: "Você e mais 1 pessoa curtiu isto" + other: "Você e mais {{count}} pessoas curtiram isto" by_others: off_topic: - one: 1 pessoa sinalizou isto como off-topic - other: '{{count}} pessoas sinalizaram isto como off-topic' + one: "1 pessoa sinalizou isto como off-topic" + other: "{{count}} pessoas sinalizaram isto como off-topic" spam: - one: 1 pessoa sinalizou isto como spam - other: '{{count}} pessoas sinalizaram isto como spam' + one: "1 pessoa sinalizou isto como spam" + other: "{{count}} pessoas sinalizaram isto como spam" inappropriate: - one: 1 pessoa sinalizou isto como inapropriado - other: '{{count}} pessoas sinalizaram isto como inapropriado' + one: "1 pessoa sinalizou isto como inapropriado" + other: "{{count}} pessoas sinalizaram isto como inapropriado" notify_moderators: - one: 1 pessoa sinalizou isto para moderação - other: '{{count}} pessoas sinalizaram isto para moderação' + one: "1 pessoa sinalizou isto para moderação" + other: "{{count}} pessoas sinalizaram isto para moderação" notify_user: - one: 1 usuário enviou mensagem particular para este usuário - other: '{{count}} enviaram mensagem particular para este usuário' + one: "1 usuário enviou mensagem particular para este usuário" + other: "{{count}} enviaram mensagem particular para este usuário" bookmark: - one: 1 pessoa favoritou esta resposta - other: '{{count}} pessoas favoritaram esta resposta' + one: "1 pessoa favoritou esta resposta" + other: "{{count}} pessoas favoritaram esta resposta" like: - one: 1 pessoa curtiu - other: '{{count}} pessoas curtiram' - vote: - one: 1 pessoa votou nesta resposta - other: '{{count}} pessoas votaram nesta resposta' + one: "1 pessoa curtiu" + other: "{{count}} pessoas curtiram" + delete: + confirm: + one: "Tem certeza de que deseja excluir essa postagem?" + other: "Tem certeza de que deseja excluir as postagens de {{count}}?" + merge: + confirm: + one: "Tem certeza de que deseja mesclar essas postagens?" + other: "Tem certeza de que deseja mesclar essas postagens de {{count}}?" revisions: controls: first: "Primeira revisão" @@ -1705,7 +2048,7 @@ pt_BR: can: 'pode… ' none: '(sem categoria)' all: 'Todas as categorias' - choose: 'Selecionar categoria…' + choose: 'category…' edit: 'editar' edit_long: "Editar" view: 'Ver tópicos na categoria' @@ -1713,6 +2056,8 @@ pt_BR: settings: 'Configurações' topic_template: "Modelo de Tópico" tags: "Etiquetas" + tags_allowed_tags: "Apenas permita que essas tags sejam usadas nesta categoria:" + tags_allowed_tag_groups: "Permitir que apenas tags desses grupos sejam usadas nessa categoria:" tags_placeholder: "(Opcional) lista de etiquetas permitidas" tag_groups_placeholder: "(Opcional) lista de grupos de etiquetas permitidos" topic_featured_link_allowed: "Permitir links em destaque nesta categoria" @@ -1747,22 +2092,30 @@ pt_BR: email_in_allow_strangers: "Aceitar emails de usuários anônimos sem cont" email_in_disabled: "Postar novos tópicos via email está desabilitado nas Configurações do Site. Para habilitar respostas em novos tópicos via email," email_in_disabled_click: 'habilitar a configuração de "email em".' + mailinglist_mirror: "Categoria espelha uma lista de discussão" + suppress_from_latest: "Suprimir categoria dos tópicos mais recentes." show_subcategory_list: "Exibir lista de subcategorias acima dos tópicos nesta categoria." num_featured_topics: "Número de tópicos exibidos na página de Categorias:" subcategory_num_featured_topics: "Número de tópicos em destaque na página da categoria pai:" - all_topics_wiki: "Tornar novos tópicos wikis por padrão." + all_topics_wiki: "Faça novos tópicos wikis por padrão" subcategory_list_style: "Estilo da lista de subcategorias" sort_order: "Classificar lista de tópicos:" default_view: "Lista padrão de tópicos" + default_top_period: "Período Superior Padrão:" allow_badges_label: "Permitir a concessão de emblemas nessa categoria" edit_permissions: "Editar Permissões" add_permission: "Adicionar Permissões" + require_topic_approval: "Requer aprovação do moderador de todos os novos tópicos" + require_reply_approval: "Requer aprovação do moderador de todas as novas respostas" this_year: "este ano" - position: "posição" + position: "Posição:" default_position: "Posição Padrão" position_disabled: "Categorias serão mostradas em ordem de atividade. Para controlar a ordem das categorias em listas," position_disabled_click: 'habilitar a configuração de "posição de categoria fixa".' + minimum_required_tags: 'Número mínimo de tags requeridas em um tópico:' parent: "Categoria Principal" + num_auto_bump_daily: 'Número de tópicos em aberto para dar um bump diário automaticamente:' + navigate_to_first_post_after_read: 'Navegue até a primeira postagem depois que os tópicos forem lidos' notifications: watching: title: "Observar" @@ -1819,14 +2172,14 @@ pt_BR: custom_placeholder_notify_moderators: "Deixe-nos saber especificamente com o que você está preocupado, e nos forneça links relevantes e exemplos quando possível." custom_message: at_least: - one: insira pelo menos 1 caractere - other: insira pelo menos {{count}} caracteres + one: "insira pelo menos 1 caractere" + other: "insira pelo menos {{count}} caracteres" more: - one: Falta apenas 1... - other: Faltam {{count}}... + one: "Falta apenas 1..." + other: "Faltam {{count}}..." left: - one: 1 restante - other: '{{count}} restantes' + one: "1 restante" + other: "{{count}} restantes" flagging_topic: title: "Obrigado por ajudar a manter a civilidade da nossa comunidade!" action: "Sinalizar Tópico" @@ -1837,13 +2190,13 @@ pt_BR: links_title: "Links Populares" links_shown: "mostrar mais links..." clicks: - one: 1 clique - other: '%{count} cliques' + one: "1 clique" + other: "%{count} cliques" post_links: about: "expandir mais links para esta mensagem" title: - one: mais 1 - other: mais %{count} + one: "mais 1" + other: "mais %{count}" topic_statuses: warning: help: "Este é um aviso oficial." @@ -1877,22 +2230,22 @@ pt_BR: original_post: "Resposta original" views: "Visualizações" views_lowercase: - one: visualizar - other: visualizações + one: "visualizar" + other: "visualizações" replies: "Respostas" views_long: - one: este tópico foi visto uma vez - other: este tópico foi visto {{number}} vezes + one: "este tópico foi visto uma vez" + other: "este tópico foi visto {{number}} vezes" activity: "Atividade" likes: "Curtidas" likes_lowercase: - one: like - other: likes + one: "like" + other: "likes" likes_long: "há {{number}} curtidas neste tópico" users: "Usuários" users_lowercase: - one: usuário - other: usuários + one: "usuário" + other: "usuários" category_title: "Categoria" history: "Histórico" changed_by: "por {{author}}" @@ -1906,8 +2259,8 @@ pt_BR: latest: title: "Recente" title_with_count: - one: Recente (1) - other: Recentes ({{count}}) + one: "Recente (1)" + other: "Recentes ({{count}})" help: "tópicos com mensagens recentes" hot: title: "Quente" @@ -1925,21 +2278,21 @@ pt_BR: unread: title: "Não lidas" title_with_count: - one: Não lido (1) - other: Não lidos ({{count}}) + one: "Não lido (1)" + other: "Não lidos ({{count}})" help: "tópicos que você está observando ou monitorando com mensagens não lidas" lower_title_with_count: - one: 1 não lido - other: '{{count}} não lidos' + one: "1 não lido" + other: "{{count}} não lidos" new: lower_title_with_count: - one: 1 nova - other: '{{count}} novas' + one: "1 nova" + other: "{{count}} novas" lower_title: "nova" title: "Novo" title_with_count: - one: Novo (1) - other: Novos ({{count}}) + one: "Novo (1)" + other: "Novos ({{count}})" help: "tópicos criados nos últimos dias" posted: title: "Minhas mensagens" @@ -1950,8 +2303,8 @@ pt_BR: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "tópicos recentes na categoria {{categoryName}}" top: title: "Melhores" @@ -1995,6 +2348,7 @@ pt_BR: bookmarks: 'g, b Favoritos' profile: 'g, p Perfil' messages: 'g, m Mensagens' + drafts: 'g, d Rascunhos' navigation: title: 'Navegação' jump: '# Ir para a mensagem #' @@ -2009,10 +2363,14 @@ pt_BR: hamburger_menu: '= Abrir o menu hambúrguer' user_profile_menu: 'p Abrir menu do usuário' show_incoming_updated_topics: '. Exibir tópicos atualizados' + search: '/ ou ctrl+alt+f Procurar' help: '? Abrir ajuda de teclado' dismiss_new_posts: 'x, r Descartar Novas Postagens' dismiss_topics: 'x, t Descartar Tópicos' log_out: 'shift+z shift+z Deslogar' + composing: + title: 'Composição' + return: 'shift+c Retornar ao compositor' actions: title: 'Ações' bookmark_topic: 'f Favoritar o tópico' @@ -2035,21 +2393,25 @@ pt_BR: print: 'ctrl+p Imprimir tópico' badges: earned_n_times: - one: Emblema adquirido 1 vez - other: Emblema adquirido %{count} vezes + one: "Emblema adquirido 1 vez" + other: "Emblema adquirido %{count} vezes" granted_on: "Concedido em %{date}" others_count: "Outros com esse emblema (%{count})" title: Emblemas + allow_title: "Você pode usar esse selo como um título" + multiple_grant: "Você pode ganhar isso várias vezes" badge_count: - one: 1 Emblema - other: '%{count} Emblemas' + one: "1 Emblema" + other: "%{count} Emblemas" more_badges: - one: +1 Mais - other: +%{count} Mais + one: "+1 Mais" + other: "+%{count} Mais" granted: - one: 1 concedido - other: '%{count} concedidos' + one: "1 concedido" + other: "%{count} concedidos" select_badge_for_title: Selecione um emblema para usar como o seu título + none: "(nenhum)" + successfully_granted: "Concedido com sucesso %{badge} to %{username}" badge_grouping: getting_started: name: Primeiros Passos @@ -2072,11 +2434,17 @@ pt_BR:

tagging: all_tags: "Todas as Etiquetas" + other_tags: "Outras tags" selector_all_tags: "todas as etiquetas" selector_no_tags: "sem etiquetas" changed: "etiquetas alteradas:" tags: "Etiquetas" + choose_for_topic: "tags opcionais" delete_tag: "Apagar marcação" + delete_confirm: + one: "Tem certeza de que deseja excluir esta tag e removê-la de um tópico para o qual ela está atribuída?" + other: "Tem certeza de que deseja excluir esta tag e removê-la de {{count}} tópicos aos quais ela está atribuída?" + delete_confirm_no_topics: "Tem certeza de que deseja excluir esta tag?" rename_tag: "Renomear marcador" rename_instructions: "Escolha um novo nome para o marcador" sort_by: "Ordenar por" @@ -2092,15 +2460,19 @@ pt_BR: notifications: watching: title: "Observando" + description: "Você assistirá automaticamente todos os tópicos com esta tag. Você será notificado sobre todas as novas postagens e tópicos, além da contagem de postagens não lidas e novas também serão exibidas ao lado do tópico." watching_first_post: title: "Observando o primeiro post" + description: "Você só será notificado da primeira postagem em cada novo tópico com essa tag." tracking: title: "Monitorando" + description: "Você acompanhará automaticamente todos os tópicos com essa tag. Uma contagem de postagens não lidas e novas será exibida ao lado do tópico." regular: title: "Normal" description: "Você será notificado se alguém mencionar o seu @nome ou responder à sua mensagem." muted: title: "Silenciado" + description: "Você não será notificado de nada sobre novos tópicos com essa tag e eles não aparecerão na guia não lida." groups: title: "Grupos de Etiquetas" about: "Adicione marcadores aos grupos para gerenciá-los mais facilmente" @@ -2114,6 +2486,9 @@ pt_BR: save: "Salvar" delete: "Apagar" confirm_delete: "Tem certeza de que deseja remover este grupo de etiquetas?" + everyone_can_use: "Tags podem ser usadas por todos" + usable_only_by_staff: "As tags são visíveis para todos, mas apenas a equipe pode usá-las" + visible_only_to_staff: "As tags são visíveis apenas para a equipe" topics: none: unread: "Não há nenhum tópico não lido." @@ -2141,6 +2516,7 @@ pt_BR: custom_message_placeholder: "Insira a sua mensagem personalizada" custom_message_template_forum: "Ei, você devia entrar neste fórum!" custom_message_template_topic: "Ei, eu acho que você vai gostar deste tópico!" + forced_anonymous: "Devido à carga extrema, isso está sendo exibido temporariamente para todos, visto que um usuário desconectado o veria." safe_mode: enabled: "O modo seguro está habilitado. Para sair do modo seguro feche esta janela do navegador" admin_js: @@ -2148,9 +2524,13 @@ pt_BR: admin: title: 'Discourse Admin' moderator: 'Moderador' + reports: + title: "Lista de relatórios disponíveis" dashboard: title: "Painel Administrativo" last_updated: "Painel atualizado em:" + find_old: "Procurando pelo painel antigo?" + old_link: "visite aqui" version: "Versão" up_to_date: "Você está atualizado!" critical_available: "Uma atualização crítica está disponível." @@ -2175,14 +2555,28 @@ pt_BR: space_free: "{{size}} livre" uploads: "uploads" backups: "backups" + lastest_backup: "Mais recentes: %{date}" traffic_short: "Tráfego" traffic: "Solicitações do aplicativo pela web" page_views: "Visualizações" page_views_short: "Visualizações" show_traffic_report: "Mostrar Relatório de Tráfego Detalhado" + community_health: Saúde da comunidade + moderators_activity: Atividade de moderadores + whats_new_in_discourse: "O que há de novo no discurso?" + activity_metrics: Métricas de atividade + all_reports: "Todos os relatórios" + general_tab: "Geral" + moderation_tab: "Moderação" + disabled: Desativado + timeout_error: "Desculpe, a consulta está demorando muito, por favor, escolha um intervalo menor" + exception_error: "Desculpe, ocorreu um erro ao executar a consulta" reports: + trend_title: "%{percent} mudança. Atualmente %{current}, estava%{prev} no período anterior." today: "Hoje" yesterday: "Ontem" + last_7_days: "Últimos 7" + last_30_days: "30 últimos" all_time: "Todo Tempo" 7_days_ago: "7 Dias Atrás" 30_days_ago: "30 Dias Atrás" @@ -2193,16 +2587,41 @@ pt_BR: start_date: "Data de Início" end_date: "Data do Final" groups: "Todos os grupos" + disabled: "Este relatório está desativado" + totals_for_sample: "Totais para amostra" + total: "Todo o tempo total" + no_data: "Nenhum dado para exibir." + trending_search: + more: 'Registros de pesquisa' + disabled: 'O relatório de pesquisa em alta está desativado. Habilitarconsultas de pesquisa de registro para coletar dados.' commits: latest_changes: "Últimas atualizações: atualize com frequência!" by: "por" flags: title: "Sinalizações" + active_posts: "Posts sinalizados" + old_posts: "Posts antigos sinalizados" + topics: "Tópicos sinalizados" + moderation_history: "Moderação Histórico" agree: "Concordo" agree_title: "Confirmar esta marcação como válida e correta" + agree_flag_hide_post: "Esconder publicação" + agree_flag_hide_post_title: "Esconder esta publicação e enviar automaticamente ao usuário uma mensagem pedindo-lhe para editá-lo." + agree_flag_restore_post: "Concordar e restaurar post" + agree_flag_restore_post_title: "Restaure a postagem para que todos os usuários possam vê-la." + agree_flag_suspend: "Suspender usuário" + agree_flag_suspend_title: "Concordar com o sinalizador e suspender o usuário." + agree_flag_silence: "Silenciar usuário" + agree_flag_silence_title: "Concorde com a bandeira e silencie o usuário." + agree_flag: "Manter Post" + agree_flag_title: "Concorde com o sinalizador e mantenha a postagem inalterada." + ignore_flag: "Ignorar" + ignore_flag_title: "Remova este sinalizador; não requer nenhuma ação neste momento." delete: "Apagar" delete_title: "Apagar o post ao qual a marcação se refere." + delete_post_defer_flag: "Excluir marcador de postagem e ignorar" delete_post_defer_flag_title: "Apaga a resposta; se for a primeira, apagar o tópico" + delete_post_agree_flag: "Excluir postagem e concordar com sinalizador" delete_post_agree_flag_title: "Apagar resposta; se for a primeira, deletar o tópico" delete_flag_modal_title: "Apagar e ..." delete_spammer: "Deletar Spammer" @@ -2214,29 +2633,82 @@ pt_BR: clear_topic_flags: "Concluído" clear_topic_flags_title: "O tópico foi investigado e as questões foram resolvidas. Clique em Concluído para remover as sinalizações." more: "(mais respostas...)" + suspend_user: "Suspender usuário" + suspend_user_title: "Suspender usuário para esta postagem" + replies: + one: "[1 resposta]" + other: "[%{count} respostas]" + delete_replies: + one: "Excluir também a %{count} resposta a esta postagem?" + other: "Excluir também a %{count} resposta a esta postagem??" dispositions: agreed: "concordar" disagreed: "discordar" + deferred: "ignorado" flagged_by: "Sinalizado por" resolved_by: "Resolvido por" took_action: "Tomar ação" system: "Sistema" error: "Algo deu errado" reply_message: "Responder" + no_results: "Não há mensagens sinalizadas." topic_flagged: "Este tópico foi sinalizado." + show_full: "mostrar post completo" visit_topic: "Visitar o tópico para tomar ações" was_edited: "Resposta foi editada após uma primeira sinalização" previous_flags_count: "Este post já foi marcado {{count}} vezes." + show_details: "Mostrar detalhes da bandeira" details: "detalhes" flagged_topics: topic: "Tópico" + type: "Tipo" users: "Usuários" + last_flagged: "Última mensagem sinalizada" + no_results: "Não há tópicos sinalizados." short_names: + off_topic: "fora do assunto" inappropriate: "impróprio" spam: "spam" notify_user: "personalizado" notify_moderators: "personalizado" groups: + new: + title: "Novo grupo" + create: "Criar" + name: + too_short: "O nome do grupo é muito curto" + too_long: "O nome do grupo é muito longo" + checking: "Verificando a disponibilidade do nome do grupo ..." + available: "O nome do grupo está disponível" + not_available: "O nome do grupo não está disponível" + blank: "O nome do grupo não pode ficar em branco" + bulk_add: + title: "Adicionar em massa ao grupo" + complete_users_not_added: "Esses usuários não foram adicionados (verifique se eles têm uma conta):" + paste: "Cole uma lista de nomes de usuários ou e-mails, um por linha:" + add_members: + as_owner: "Definir usuário (s) como proprietário (s) deste grupo" + manage: + interaction: + email: E-mail + incoming_email: "Endereço de e-mail de entrada personalizado" + incoming_email_placeholder: "insira o endereço de e-mail" + visibility: Visibilidade + visibility_levels: + title: "Quem pode ver esse grupo?" + public: "Todos" + members: "Proprietários, membros e administradores do grupo" + staff: "Proprietários e funcionários do grupo" + owners: "Proprietários e administradores do grupo" + membership: + automatic: Automático + trust_level: nível de confiança + trust_levels_title: "Nível de confiança concedido automaticamente aos membros quando eles são adicionados:" + trust_levels_none: "Nenhum" + automatic_membership_email_domains: "Os usuários que se registrarem em um domínio de e-mail que corresponda exatamente a um nesta lista serão adicionados automaticamente a este grupo:" + automatic_membership_retroactive: "Aplicar a mesma regra de domínio de email para adicionar usuários registrados existentes" + primary_group: "Definir automaticamente como grupo principal" + name_placeholder: "Nome do grupo, sem espaços, igual à regra de nome de usuário" primary: "Grupo Primário" no_primary: "(sem grupo primário)" title: "Grupos" @@ -2251,6 +2723,8 @@ pt_BR: add: "Adicionar" custom: "Definidos" automatic: "Automático" + default_title: "Título padrão" + default_title_description: "será aplicado a todos os usuários do grupo" group_owners: Prorietários add_owners: Adicionar proprietários none_selected: "Selecione um grupo para começar" @@ -2290,6 +2764,7 @@ pt_BR: event_type_missing: "Você deve configurar apenas um tipo de evento." content_type: "Tipo de Conteúdo" secret: "Segredo" + event_chooser: "Quais eventos devem acionar esse webhook?" wildcard_event: "Envie-me tudo." individual_event: "Selecionar eventos individuais." verify_certificate: "Verificar o certificado TLS da URL do payload" @@ -2308,6 +2783,22 @@ pt_BR: details: "Quando existir uma nova resposta, edição, deleção ou recuperação." user_event: name: "Evento de Usuário" + details: "Quando um usuário efetua login, efetua logout, é criado, aprovado ou atualizado." + group_event: + name: "Evento de Grupo" + details: "Quando um grupo é criado, atualizado ou destruído." + category_event: + name: "Categoria Evento" + details: "Quando uma categoria é criada, atualizada ou destruída." + tag_event: + name: "Tag Evento" + details: "Quando uma tag é criada, atualizada ou destruída." + flag_event: + name: "Evento de sinalização" + details: "Quando uma bandeira é criada, aceita, discordada ou ignorada." + queued_post_event: + name: "Postar evento de aprovação" + details: "Quando uma nova postagem na fila é criada, aprovada ou rejeitada." delivery_status: title: "Status de Entrega" inactive: "Inativo" @@ -2317,11 +2808,11 @@ pt_BR: none: "Não existem eventos relacionados." redeliver: "Entregar novamente" incoming: - one: Existe um novo evento. - other: Existem {{count}} novos eventos. + one: "Existe um novo evento." + other: "Existem {{count}} novos eventos." completed_in: - one: Completado em 1 segundo. - other: Completado em {{count}} segundos. + one: "Completado em 1 segundo." + other: "Completado em {{count}} segundos." request: "Requisição" response: "Resposta" redeliver_confirm: "Tem certeza que deseja enviar o mesmo payload novamente?" @@ -2349,6 +2840,7 @@ pt_BR: change_settings: "Alterar Configurações" change_settings_short: "Configurações" howto: "Como eu instalo plugins?" + official: "Plugin Oficial" backups: title: "Backups" menu: @@ -2372,6 +2864,7 @@ pt_BR: label: "Enviar" title: "Carregar um backup para esta instância" uploading: "Subindo..." + success: "'{{filename}} foi enviado com sucesso. O arquivo está sendo processado e levará até um minuto para aparecer na lista." error: "Houve um erro ao carregar '{{filename}}': {{message}}" operations: is_running: "Uma operação está sendo executada..." @@ -2384,6 +2877,7 @@ pt_BR: label: "Backup" title: "Cria um backup" confirm: "Você quer iniciar um novo backup?" + without_uploads: "Sim (não inclui uploads)" download: label: "Download" title: "Enviar email com link para download" @@ -2419,6 +2913,7 @@ pt_BR: title: "Personalizar" long_title: "Personalizações do Site" preview: "pré-visualização" + explain_preview: "Veja o site com este tema ativado" save: "Guardar" new: "Novo" new_style: "Novo Estilo" @@ -2431,6 +2926,8 @@ pt_BR: copy: "Copiar" copy_to_clipboard: "Copiar para área de transferência" copied_to_clipboard: "Copiado para área de transferência" + copy_to_clipboard_error: "Erro ao copiar dados para a área de transferência" + theme_owner: "Não editável, pertencente a:" email_templates: title: "Modelos de E-mail" subject: "Assunto" @@ -2443,23 +2940,84 @@ pt_BR: import_theme: "Importar Tema" customize_desc: "Personalizar:" title: "Temas" + long_title: "Alterar cores, CSS e conteúdo HTML do seu site" edit: "Editar" + edit_confirm: "Este é um tema remoto, se você editar CSS / HTML, suas alterações serão apagadas da próxima vez que você atualizar o tema." + common: "Comum" desktop: "Desktop" mobile: "Mobile" + settings: "Configurações" preview: "Prévia" + is_default: "O tema está ativado por padrão" + user_selectable: "O tema pode ser selecionado pelos usuários" + color_scheme: "Esquema de cores" color_scheme_select: "Selecione as cores a serem usadas pelo tema" custom_sections: "Seções personalizadas:" + theme_components: "Componentes do Tema" + uploads: "Uploads" + no_uploads: "Você pode fazer upload de recursos associados ao seu tema, como fontes e imagens" + add_upload: "Adicionar upload" + upload_file_tip: "Escolha um recurso para carregar (png, woff2, etc ...)" + variable_name: "Nome do SCSS var:" + variable_name_invalid: "Nome da variável inválido. Somente alfanumérico permitido. Deve começar com uma carta. Deve ser único." + variable_name_error: + invalid_syntax: "Nome da variável inválido. Somente alfanumérico permitido. Deve começar com uma carta." + no_overwrite: "Nome da variável inválido. Não deve sobrescrever uma variável existente." + must_be_unique: "Nome da variável inválido. Deve ser único." + upload: "Upload" + child_themes_check: "O tema inclui outros temas infantis" + css_html: "CSS / HTML personalizado" edit_css_html: "Editar CSS/HTML" + edit_css_html_help: "Você não editou nenhum CSS ou HTML" + delete_upload_confirm: "Excluir este upload? (CSS tema pode parar de funcionar!)" + import_web_tip: "Repositório contendo tema" + import_file_tip: "Arquivo .dcstyle.json contendo tema" + is_private: "O tema está em um repositório git privado" + public_key: "Conceda o seguinte acesso de chave pública ao repo:" about_theme: "Sobre o Tema" license: "Licença" + update_to_latest: "Atualize para o mais recente" check_for_updates: "Verificar Atualizações" updating: "Atualizando..." + up_to_date: "O tema está atualizado, foi verificado pela última vez:" add: "Adicionar" + theme_settings: "Configurações de tema" + no_settings: "Este tema não tem configurações." + commits_behind: + one: "O tema é 1 commit por trás!" + other: "o tema é {{count}} confirmado por trás" scss: text: "CSS" + title: "Digite CSS personalizado, aceitamos todos os estilos CSS e SCSS válidos" + header: + text: "Cabeçalho" + title: "Digite HTML para exibir o cabeçalho do site acima" + after_header: + text: "Depois do cabeçalho" + title: "Digite HTML para exibir em todas as páginas após o cabeçalho" + footer: + text: "Rodapé" + title: "Digite HTML para exibir no rodapé da página" + embedded_scss: + text: "CSS incorporado" + title: "Insira o CSS personalizado para entregar com a versão incorporada dos comentários" + head_tag: + text: "" + title: "HTML que será inserido antes da tag" + body_tag: + text: "" + title: "HTML que será inserido antes da tag" + yaml: + text: "YAML" + title: "Definir configurações de tema no formato YAML" colors: + select_base: + title: "Selecione o esquema de cores base" + description: "Esquema base:" title: "Cores" + edit: "Editar esquemas de cores" long_title: "Esquema de Cores" + about: "Modifique as cores usadas pelos seus temas. Crie um novo esquema de cores para começar." new_name: "Novo Esquema de Cor" copy_name_prefix: "Copiar de" delete_confirm: "Apagar esse esquema de cor?" @@ -2559,7 +3117,15 @@ pt_BR: address_placeholder: "nome@exemplo.com" type_placeholder: "resenha, cadastro..." reply_key_placeholder: "tecla de resposta" - skipped_reason_placeholder: "motivo" + moderation_history: + performed_by: "Executado por" + no_results: "Não há histórico de moderação disponível." + actions: + delete_user: "Usuário excluído" + suspend_user: "Usuário suspenso" + silence_user: "Usuário Silenciado" + delete_post: "Postar excluído" + delete_topic: "Tópico excluído" logs: title: "Logs" action: "Ação" @@ -2577,6 +3143,8 @@ pt_BR: block: "bloquear" do_nothing: "não fazer nada" staff_actions: + all: "todos" + filter: "Filtro:" title: "Ações do Staff" clear_filters: "Mostrar Tudo" staff_user: "Usuário do Staff" @@ -2602,10 +3170,13 @@ pt_BR: change_site_text: "alterar texto do site" suspend_user: "suspender usuário" unsuspend_user: "readmitir usuário" + removed_suspend_user: "suspender usuário (removido)" + removed_unsuspend_user: "suspender o usuário (removido)" grant_badge: "conceder emblema" revoke_badge: "revogar emblema" check_email: "checar email" delete_topic: "apagar tópico" + recover_topic: "remover o tópico de exclusão" delete_post: "apagar mensagem" impersonate: "personificar" anonymize_user: "tornar usuário anônimo" @@ -2613,6 +3184,10 @@ pt_BR: change_category_settings: "mudas configurações da categoria" delete_category: "apagar a categoria" create_category: "criar uma categoria" + silence_user: "Silenciar usuário" + unsilence_user: "não silenciar usuário" + removed_silence_user: "Silenciar usuário (removido)" + removed_unsilence_user: "não silenciar usuário (removido)" grant_admin: "conceder admin" revoke_admin: "revogar admin" grant_moderation: "conceder moderação" @@ -2628,6 +3203,20 @@ pt_BR: change_readonly_mode: "alterar modo \"somente leitura\"" backup_download: "Fazer download do backup" backup_destroy: "destruir backup" + reviewed_post: "postagem revisada" + custom_staff: "ação personalizada de plug-in" + post_locked: "post bloqueado" + post_edit: "edição de publicação" + post_unlocked: "pós desbloqueado" + check_personal_message: "verificar mensagem pessoal" + disabled_second_factor: "desativar a autenticação de dois fatores" + topic_published: "tópico publicado" + post_approved: "publicação aprovada" + post_rejected: "publicação rejeitada" + create_badge: "criar emblema" + change_badge: "mudar emblema" + delete_badge: "Apagar emblema" + merge_user: "mesclar usuário" screened_emails: title: "Emails Filtrados" description: "Quando alguém tenta cria uma nova conta, os seguintes endereços de email serão verificados e o registro será bloqueado, ou outra ação será executada." @@ -2658,12 +3247,48 @@ pt_BR: roll_up: text: "Combinar" title: "Cria novas entradas de banimento por subnet caso existam no mínimo 'min_ban_entries_for_roll_up' entradas." + search_logs: + title: "Logs de pesquisa" + term: "Termo" + searches: "Pesquisas" + click_through: "Clique através" + unique: "único" + unique_title: "usuários únicos realizando a pesquisa" + types: + all_search_types: "Todos os tipos de pesquisa" + header: "Cabeçalho" + full_page: "Página inteira" + click_through_only: "Tudo (somente através de clique)" + header_search_results: "Resultados da pesquisa de cabeçalho" logster: title: "Registro de erros" watched_words: + title: "Palavras assistidas" + search: "pesquisa" + clear_filter: "Limpo" + show_words: "mostrar palavras" + word_count: + one: "1 palavra" + other: "%{count} palavras" + actions: + block: 'Bloqueado' + censor: 'Censor' + require_approval: 'Requerer aprovação' + flag: 'Bandeira,Sinalização' + action_descriptions: + block: 'Impedir que postagens contendo essas palavras sejam postadas. O usuário verá uma mensagem de erro quando tentar enviar a postagem.' + censor: 'Permitir postagens contendo essas palavras, mas substituí-las por caracteres que ocultem as palavras censuradas.' + require_approval: 'As postagens contendo essas palavras exigirão aprovação da equipe antes que elas possam ser vistas.' + flag: 'Permita postagens contendo essas palavras, mas sinalize-as como impróprias para que os moderadores possam analisá-las.' form: + label: 'Nova Palavra:' + placeholder: 'palavra completa ou * como curinga' + placeholder_regexp: "expressão regular" add: 'Adicionar' success: 'Sucesso' + exists: 'Já existe' + upload: "Upload" + upload_successful: "Upload successful. Words have been added." impersonate: title: "Personificar" help: "Utilize esta ferramenta para personificar uma conta de usuário para efeitos de depuração. Você terá que sair dela assim que terminar." @@ -2683,14 +3308,16 @@ pt_BR: pending: "Pendentes" staff: 'Equipe' suspended: 'Suspenso' + silenced: 'Silenciado' suspect: 'Suspeito' + staged: 'Encenado' approved: "Aprovado?" approved_selected: - one: aprovar usuário - other: aprovar usuários ({{count}}) + one: "aprovar usuário" + other: "aprovar usuários ({{count}})" reject_selected: - one: rejeitar usuário - other: rejeitar usuários ({{count}}) + one: "rejeitar usuário" + other: "rejeitar usuários ({{count}})" titles: active: 'Usuários Ativos' new: 'Usuários Novos' @@ -2706,12 +3333,13 @@ pt_BR: silenced: 'Usuários Silenciados' suspended: 'Usuários Suspensos' suspect: 'Usuários suspeitos' + staged: 'Usuários em etapas' reject_successful: - one: 1 usuário foi rejeitado com sucesso. - other: '%{count} usuários foram rejeitados com sucesso.' + one: "1 usuário foi rejeitado com sucesso." + other: "%{count} usuários foram rejeitados com sucesso." reject_failures: - one: Falha ao rejeitar 1 usuário. - other: Falha ao rejeitar %{count} usuários. + one: "Falha ao rejeitar 1 usuário." + other: "Falha ao rejeitar %{count} usuários." not_verified: "Não verificado" check_email: title: "Mostrar endereço de email deste usuário" @@ -2721,12 +3349,35 @@ pt_BR: unsuspend_failed: "Algo deu errado reativando este usuário {{error}}" suspend_duration: "Por quanto tempo o usuário deverá ser suspenso?" suspend_reason_label: "Por que você está suspendendo? Esse texto será visível para todos na página de perfil desse usuário, e será mostrado ao usuário quando ele tentar se logar. Seja breve." + suspend_reason_hidden_label: "Por que você está suspendendo? Este texto será exibido para o usuário quando ele tentar efetuar login. Mantenha-o curto." suspend_reason: "Motivo" + suspend_reason_placeholder: "Razão de Suspensão" + suspend_message: "Mensagem de e-mail" + suspend_message_placeholder: "Opcionalmente, forneça mais informações sobre a suspensão e ela será enviada para o usuário por e-mail." suspended_by: "Suspenso por" silence_reason: "Motivo" + silenced_by: "Silenciado por" + silence_modal_title: "Silenciar Usuário" + silence_duration: "Por quanto tempo o usuário será silenciado?" + silence_reason_label: "Por que você está silenciando esse usuário?" + silence_reason_placeholder: "Razão do Silêncio" + silence_message: "Mensagem de e-mail" + silence_message_placeholder: "(deixe em branco para enviar mensagem padrão)" + suspended_until: "(até %{until})" + cant_suspend: "Este usuário não pode ser suspenso." delete_all_posts: "Apagar todas mensagens" + penalty_post_actions: "O que você gostaria de fazer com o post associado?" + penalty_post_delete: "Excluir a postagem" + penalty_post_edit: "editar a publicação" + penalty_post_none: "Fazer nada" + penalty_count: "Contagem de penalidade" + clear_penalty_history: + title: "Limpar Histórico de Penalidades" + description: "usuários com penalidades não podem alcançar TL3" delete_all_posts_confirm_MF: "Você está prestes a apagar {POSTS, plural, one {1 publicação} other {# publicações}} and {TOPICS, plural, one {1 tópico} other {# tópicos}}. Você tem certeza?" silence: "Silenciar" + unsilence: "Não silenciar" + silenced: "Silenciado?" moderator: "Moderador?" admin: "Admin?" suspended: "Suspenso?" @@ -2747,6 +3398,9 @@ pt_BR: grant_moderation: 'Conceder Moderação' unsuspend: 'Readmitir' suspend: 'Suspender' + show_flags_received: "Mostrar sinalizações recebidas" + flags_received_by: "sinalizações recebidas por %{username}" + flags_received_none: "Este usuário não recebeu nenhum sinalizador." reputation: Reputação permissions: Permissões activity: Atividade @@ -2755,6 +3409,7 @@ pt_BR: private_topics_count: Tópicos Privados posts_read_count: Mensagens lidas post_count: Mensagens criadas + second_factor_enabled: Autenticação de dois fatores ativada topics_entered: Tópicos Vistos flags_given_count: Sinalizações dadas flags_received_count: Sinalizações recebidas @@ -2773,17 +3428,18 @@ pt_BR: delete_forbidden_because_staff: "Administradores e moderadores não podem ser excluidos." delete_posts_forbidden_because_staff: "Não posso deletar todas as mensagens de administradores e moderadores." delete_forbidden: - one: Usuários não podem ser excluídos se eles têm mensagens. Excluir todas as mensagens antes de tentar excluir um usuário. (Mensagens mais antigas que %{count} dia não podem ser excluídas.) - other: Usuários não podem ser excluídos se eles têm mensagens. Remova todas as mensagens antes de tentar excluir um usuário. (Mensagens mais antigas que %{count} dias não podem ser excluídas.) + one: "Usuários não podem ser excluídos se eles têm mensagens. Excluir todas as mensagens antes de tentar excluir um usuário. (Mensagens mais antigas que %{count} dia não podem ser excluídas.)" + other: "Usuários não podem ser excluídos se eles têm mensagens. Remova todas as mensagens antes de tentar excluir um usuário. (Mensagens mais antigas que %{count} dias não podem ser excluídas.)" cant_delete_all_posts: - one: Não é possível excluir todas as mensagens. Algumas mensagens são mais antigas do que %{count} dia. (Configuração delete_user_max_post_age.) - other: Não é possível remover todas as mensagens. Algumas mensagens são mais antigas do que %{count} dias. (Configuração delete_user_max_post_age.) + one: "Não é possível excluir todas as mensagens. Algumas mensagens são mais antigas do que %{count} dia. (Configuração delete_user_max_post_age.)" + other: "Não é possível remover todas as mensagens. Algumas mensagens são mais antigas do que %{count} dias. (Configuração delete_user_max_post_age.)" cant_delete_all_too_many_posts: - one: Não pode remover porque o usuário tem mais de uma mensagem (delete_all_posts_max) - other: Não pode remover porque o usuário tem mais de %{count} mensagens. (delete_all_posts_max) + one: "Não pode remover porque o usuário tem mais de uma mensagem (delete_all_posts_max)" + other: "Não pode remover porque o usuário tem mais de %{count} mensagens. (delete_all_posts_max)" delete_confirm: "Você tem CERTEZA de que quer deletar este usuário? Isto é permanente!" delete_and_block: "Deletar e bloquear este email e endereço IP" delete_dont_block: "Apagar apenas" + deleting_user: "Excluindo usuário ..." deleted: "O usuário foi apagado." delete_failed: "Houve um erro ao apagar o usuário. Certifique-se de que todas mensagens dele foram apagadas antes de tentar apagá-lo." send_activation_email: "Enviar Email de Ativação" @@ -2793,13 +3449,18 @@ pt_BR: activate_failed: "Houve um problema ao tornar o usuário ativo." deactivate_account: "Desativar Conta" deactivate_failed: "Houve um problema ao desativar o usuário." + unsilence_failed: 'Houve um problema ao anular o usuário.' + silence_failed: 'Houve um problema ao silenciar o usuário.' + silence_confirm: 'Tem certeza de que deseja silenciar esse usuário? Eles não poderão criar novos tópicos ou postagens.' silence_accept: 'Sim, silenciar este usuário' bounce_score: "Pontuação de Devolução" reset_bounce_score: label: "Redefinir" title: "Redefinir pontuação de devolução para 0" + visit_profile: "Visitar página de preferências deste usuário para editar seu perfil." deactivate_explanation: "Um usuário desativado deve revalidar seu email." suspended_explanation: "Um usuário suspenso não pode entrar." + silence_explanation: "Um usuário silenciado não pode postar ou iniciar tópicos." staged_explanation: "Um usuário de teste só pode postar por email em tópicos específicos." bounce_score_explanation: none: "Nenhuma devolução foi recebida recentemente daquele email." @@ -2816,8 +3477,8 @@ pt_BR: tl3_requirements: title: "Requisitos para o Nível de Confiança 3" table_title: - one: 'No último dia:' - other: 'Nos últimos %{count} dias:' + one: "No último dia:" + other: "Nos últimos %{count} dias:" value_heading: "Valor" requirement_heading: "Requisito" visits: "Visitas" @@ -2833,6 +3494,8 @@ pt_BR: likes_received: "Curtidas recebidos" likes_received_days: "Curtidas recebidas: dias únicos" likes_received_users: "Curtidas recebidas: usuários únicos" + suspended: "Suspenso (todos os tempos)" + silenced: "Silenciado (todos os tempos)" qualifies: "Qualificado para o nível 3 de confiança." does_not_qualify: "Não qualificado para o nível 3 de confiança." will_be_promoted: "Será promovido em breve." @@ -2891,12 +3554,25 @@ pt_BR: go_back: "Voltar para pesquisa" recommended: "Recomendamos a personalização do seguinte texto para se adequar as suas necessidades:" show_overriden: 'Apenas mostrar valores alterados' + settings: + show_overriden: 'Mostrar apenas substituído' + reset: 'resetar' + none: 'nenhum' site_settings: title: 'Configurações' no_results: "Nenhum resultado encontrado." + more_than_30_results: "Existem mais de 30 resultados. Por favor, refine sua pesquisa ou selecione uma categoria." clear_filter: "Limpar" add_url: "adicionar URL" add_host: "adicionar host" + uploaded_image_list: + label: "Lista de edição" + empty: "Não há fotos ainda. Por favor, faça o upload de uma." + upload: + label: "Upload" + title: "Enviar Imagem(s)" + selectable_avatars: + title: "Lista de usuários avatares podem escolher" categories: all_results: 'Todas' required: 'Requerido' @@ -2960,6 +3636,8 @@ pt_BR: enabled: Habilitar emblema icon: Ãcone image: Imagem + icon_help: "Use uma classe Font Awesome" + image_help: "Digite o URL da imagem (substitui o campo de ícone se ambos estiverem configurados)" query: Badge Query (SQL) target_posts: Consultar respostas selecionadas auto_revoke: Rodar revocation query todo dia @@ -2983,8 +3661,8 @@ pt_BR: text: "Faltam amostras de concessão. Isso acontece quando a consulta de emblemas retorna IDs de usuários ou IDs de postagens que não existem. Isso pode causar resultados inesperados futuramente - por favor verifique novamente a sua consulta." no_grant_count: "Sem emblemas para serem atribuídos." grant_count: - one: 1 emblema para ser atribuído. - other: %{count} emblemas para serem atribuídos. + one: "1 emblema para ser atribuído." + other: "%{count} emblemas para serem atribuídos." sample: "Exemplo:" grant: with: "%{username}" @@ -3004,6 +3682,7 @@ pt_BR: sample: "Use o seguinte código HTML no seu site para criar e incorporar tópicos do Discourse. Troque REPLACE_ME com a URL canônica da página na qual você está incorporando." title: "Incorporar" host: "Hosts Permitidos" + class_name: "Nome da classe" path_whitelist: "Lista de Caminhos Permitidos " edit: "editar" category: "Postar na Categoria" @@ -3023,6 +3702,7 @@ pt_BR: embed_classname_whitelist: "Nomes de classes CSS permitidas" feed_polling_enabled: "Importar postagens via RSS/ATOM" feed_polling_url: "URL do feed RSS/ATOM para pesquisar" + feed_polling_frequency_mins: "Frequência de pesquisa de feeds (em minutos)" save: "Salvar Configurações de Incorporação" permalink: title: "Links permanentes" @@ -3047,7 +3727,11 @@ pt_BR: step: "%{current} de %{total}" upload: "Enviar" uploading: "Enviando..." + upload_error: "Desculpe, houve um erro ao fazer o upload desse arquivo. Por favor, tente novamente." quit: "Talvez Depois" + staff_count: + one: "Sua comunidade tem 1 pessoa (você). " + other: "Sua comunidade tem%{count} pessoas, incluindo você." invites: add_user: "adicionar" none_added: "Você ainda não convidou ninguém para a equipe. Tem certeza que deseja continuar?" @@ -3055,3 +3739,7 @@ pt_BR: admin: "Admin" moderator: "Moderador" regular: "Usuário Regular" + previews: + topic_title: "Tópico de Discussão" + share_button: "Compartilhar" + reply_button: "Responder" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 8b495e558f..660e21cd1f 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -16,8 +16,8 @@ ro: format: '%n %u' units: byte: - few: Bytes one: Byte + few: Bytes other: Bytes gb: GB kb: KB @@ -44,87 +44,87 @@ ro: tiny: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - one: < 1s - other: < %{count} s + one: "< 1s" + few: "< %{count}s" + other: "< %{count} s" x_seconds: - few: '%{count} s' - one: 1s - other: '%{count} s' + one: "1s" + few: "%{count} s" + other: "%{count} s" less_than_x_minutes: - few: < 1m - one: < 1m - other: < %{count}m + one: "< 1m" + few: "< 1m" + other: "< %{count}m" x_minutes: - few: '%{count} m' - one: 1m - other: '%{count} m' + one: "1m" + few: "%{count} m" + other: "%{count} m" about_x_hours: - few: '%{count} h' - one: 1h - other: '%{count} h' + one: "1h" + few: "%{count} h" + other: "%{count} h" x_days: - few: '%{count} z' - one: 1z - other: '%{count} z' + one: "1z" + few: "%{count} z" + other: "%{count} z" x_months: - few: 1mon - one: 1mon - other: '%{count}mon' + one: "1mon" + few: "1mon" + other: "%{count}mon" about_x_years: - few: '%{count} a' - one: 1a - other: '%{count} a' + one: "1a" + few: "%{count} a" + other: "%{count} a" over_x_years: - few: '> %{count} a' - one: '> 1a' - other: '> %{count} a' + one: "> 1a" + few: "> %{count} a" + other: "> %{count} a" almost_x_years: - few: '%{count} a' - one: 1a - other: '%{count} de a' + one: "1a" + few: "%{count} a" + other: "%{count} de a" date_month: "DD MMMM" date_year: "MMM 'YY" medium: x_minutes: - few: '%{count} min' - one: 1 min - other: '%{count} de min' + one: "1 min" + few: "%{count} min" + other: "%{count} de min" x_hours: - few: '%{count} ore' - one: 1 oră - other: '%{count} de ore' + one: "1 oră" + few: "%{count} ore" + other: "%{count} de ore" x_days: - few: '%{count} zile' - one: 1 zi - other: '%{count} de zile' + one: "1 zi" + few: "%{count} zile" + other: "%{count} de zile" date_year: "D MM YYYY" medium_with_ago: x_minutes: - few: acum %{count} min - one: acum un min - other: acum %{count} de min + one: "acum un min" + few: "acum %{count} min" + other: "acum %{count} de min" x_hours: - few: acum %{count} ore - one: acum o oră - other: acum %{count} de ore + one: "acum o oră" + few: "acum %{count} ore" + other: "acum %{count} de ore" x_days: - few: acum %{count} zile - one: acum o zi - other: acum %{count} de zile + one: "acum o zi" + few: "acum %{count} zile" + other: "acum %{count} de zile" later: x_days: - few: După %{count} zile - one: După o zi - other: După %{count} de zile + one: "După o zi" + few: "După %{count} zile" + other: "După %{count} de zile" x_months: - few: '%{count} luni mai târziu' - one: O lună mai târziu - other: '%{count} de luni mai târziu' + one: "O lună mai târziu" + few: "%{count} luni mai târziu" + other: "%{count} de luni mai târziu" x_years: - few: După %{count} ani - one: După un an - other: După %{count} de ani + one: "După un an" + few: "După %{count} ani" + other: "După %{count} de ani" previous_month: 'Luna anterioară' next_month: 'Luna următoare' placeholder: dată @@ -205,14 +205,14 @@ ro: show_help: "OpÈ›iuni" links: "Adrese web" links_lowercase: - few: link-uri - one: link - other: de link-uri + one: "link" + few: "link-uri" + other: "de link-uri" faq: "ÃŽntrebări frecvente" guidelines: "IndicaÈ›ii" privacy_policy: "Politică de confidenÈ›ialitate" privacy: "ConfidenÈ›ialitate" - terms_of_service: "Termenii serviciului" + tos: "Termenii serviciului" mobile_view: "Vedere pentru mobil" desktop_view: "Vedere pentru desktop" you: "Tu" @@ -231,9 +231,9 @@ ro: max_of_count: "max din {{count}}" alternation: "sau" character_count: - few: '{{count}} caractere' - one: Un caracter - other: '{{count}} de caractere' + one: "Un caracter" + few: "{{count}} caractere" + other: "{{count}} de caractere" suggested_topics: title: "Subiecte sugerate" pm_title: "Mesaje sugerate" @@ -266,9 +266,9 @@ ro: remove: "Șterge semn de carte" confirm_clear: "EÈ™ti sigur că doreÈ™ti să È™tergi toate semnele de carte din acest subiect?" topic_count_latest: - few: '{{count}} subiecte noi sau actualizate.' - one: Un subiect nou sau actualizat. - other: '{{count}} de subiecte noi sau actualizate.' + one: "Un subiect nou sau actualizat." + few: "{{count}} subiecte noi sau actualizate." + other: "{{count}} de subiecte noi sau actualizate." preview: "Previzualizează" cancel: "Anulează" save: "Salvează schimbările" @@ -306,18 +306,18 @@ ro: cancel: "Anulează" view_pending: "Vezi postările în aÅŸteptare" has_pending_posts: - few: Acest subiect are {{count}} postări în aÈ™teptare. - one: Acest subiect are o postare în aÈ™teptare - other: Acest subiect are {{count}} de postări în aÈ™teptare. + one: "Acest subiect are o postare în aÈ™teptare" + few: "Acest subiect are {{count}} postări în aÈ™teptare." + other: "Acest subiect are {{count}} de postări în aÈ™teptare." confirm: "Salvează schimbările" delete_prompt: "EÈ™ti sigur că vrei să È™tergi utilizatorul %{username}? Vor fi È™terse toate postările lui iar email-ul È™i IP-ul vor fi blocate." approval: title: "Necesită aprobare" description: "Am primit noua postare dar trebuie să fie aprobată de un moderator înainte că ea să apară pe site. Te rugăm să ai răbdare." pending_posts: - few: AveÅ£i {{count}} postări în aÅŸteptare. - one: AveÅ£i 1 postare în aÅŸteptare. - other: AveÅ£i {{count}} (de) postări în aÈ™teptare. + one: "AveÅ£i 1 postare în aÅŸteptare." + few: "AveÅ£i {{count}} postări în aÅŸteptare." + other: "AveÅ£i {{count}} (de) postări în aÈ™teptare." ok: "OK" user_action: user_posted_topic: "{{user}} a postat discuÈ›ia" @@ -351,9 +351,9 @@ ro: posts_read: "Citite" posts_read_long: "Postări citite" total_rows: - few: '%{count} utilizatori' - one: 1 utilizator - other: '%{count} de utilizatori' + one: "1 utilizator" + few: "%{count} utilizatori" + other: "%{count} de utilizatori" group_histories: actions: change_group_setting: "Schimbă setarea grupului" @@ -435,9 +435,9 @@ ro: is_group_user: "Membru" is_group_owner: "DeÈ›inător" title: - few: Grupuri - one: Grup - other: Grupuri + one: "Grup" + few: "Grupuri" + other: "Grupuri" activity: "Activitate" members: title: "Membrii" @@ -502,15 +502,12 @@ ro: "14": "ÃŽn aÈ™teptare" categories: all: "Toate categoriile" - all_subcategories: "toate în %{categoryName}" no_subcategory: "Niciuna" category: "Categorie" category_list: "AfiÈ™ează lista de categorii" reorder: title: "Rearanjează categoriile" title_long: "Rearanjeaza lista de categorii" - fix_order: "Fixează poziÈ›ii" - fix_order_tooltip: "Nu toate categoriile au un numar de poziÈ›ie unic, asta poate cauza rezultate neaÈ™teptate." save: "Salvează ordinea" apply_all: "Aplică" position: "PoziÈ›ie" @@ -521,13 +518,13 @@ ro: toggle_ordering: "Comută criteriu de aranjare" subcategories: "Subcategorii" topic_sentence: - few: '%{count} subiecte' - one: Un subiect - other: '%{count} de subiecte' + one: "Un subiect" + few: "%{count} subiecte" + other: "%{count} de subiecte" topic_stat_sentence: - few: '%{count} subiecte noi în %{unit}.' - one: '%{count} subiect nou în %{unit}.' - other: '%{count} de subiecte noi în %{unit}.' + one: "%{count} subiect nou în %{unit}." + few: "%{count} subiecte noi în %{unit}." + other: "%{count} de subiecte noi în %{unit}." ip_lookup: title: Căutare adresă IP hostname: Nume gazdă @@ -685,7 +682,6 @@ ro: error: "A apărut o eroare la schimbarea acestei valori." change_username: title: "Schimbă numele utilizatorului" - confirm: "Dacă îți schimbi numele de utilizator, toate citările anterioare ale posturilor tale È™i toate menÈ›iunile @numelui se vor pierde. EÈ™ti absolut sigur că vrei asta?" taken: "Acest nume de utilizator este deja folosit." invalid: "Acest nume de utilizator este invalid. Trebuie să includă doar cifre È™i litere." change_email: @@ -706,7 +702,6 @@ ro: upload_title: "ÃŽncarcă poza preferată" upload_picture: "ÃŽncarcă poza" image_is_not_a_square: "AtenÅ£ie: poza este decupată, înălÈ›imea È™i lățimea nu erau egale." - cache_notice: "Poza de profil a fost schimbată cu succes, dar poate dura ceva timp până să fie afiÈ™ată din cauza caching-ului din browser." change_profile_background: title: "Fundal pentru pagina de profil" instructions: "Fundalul profilului va fi centrat ÅŸi va avea o dimensiune standard de 850px." @@ -721,9 +716,9 @@ ro: authenticated: "Emailul a fost autentificat de către {{provider}}." frequency_immediately: "Vom trimite imediat un email dacă nu ai citit deja despre ce este vorba. " frequency: - few: Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} minute. - one: Vom trimite un email doar dacă nu te-am văzut în ultimul minut. - other: Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} de minute. + one: "Vom trimite un email doar dacă nu te-am văzut în ultimul minut." + few: "Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} minute." + other: "Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} de minute." name: title: "Nume" instructions: "Numele tău complet (opÈ›ional)" @@ -750,7 +745,7 @@ ro: title: "Confirmă parola" last_posted: "Ultima postare" last_emailed: "Ultimul email" - last_seen: "Văzut acum" + last_seen: "Văzut " created: "ÃŽnscris" log_out: "IeÈ™ire" location: "LocaÈ›ie" @@ -809,9 +804,9 @@ ro: sent: "Trimis(e)" none: "Nu există invitaÈ›ii." truncated: - few: Se afiÈ™ează primele {{count}} invitaÈ›ii. - one: Se afiÈ™ează prima invitaÈ›ie. - other: Se afiÈ™ează primele {{count}} de invitaÈ›ii. + one: "Se afiÈ™ează prima invitaÈ›ie." + few: "Se afiÈ™ează primele {{count}} invitaÈ›ii." + other: "Se afiÈ™ează primele {{count}} de invitaÈ›ii." redeemed: "InvitaÈ›ii acceptate" redeemed_tab: "Acceptate" redeemed_tab_with_count: "({{count}}) Acceptate" @@ -857,37 +852,37 @@ ro: stats: "Statistici" time_read: "Timp petrecut pe site" topic_count: - few: subiecte create - one: un subiect creat - other: de subiecte create + one: "un subiect creat" + few: "subiecte create" + other: "de subiecte create" post_count: - few: postări create - one: o postare creată - other: de postări create + one: "o postare creată" + few: "postări create" + other: "de postări create" likes_given: - few: oferite - one: oferit - other: oferite + one: "oferit" + few: "oferite" + other: "oferite" likes_received: - few: primite - one: primit - other: primite + one: "primit" + few: "primite" + other: "primite" days_visited: - few: vizite - one: vizită - other: de vizite + one: "vizită" + few: "vizite" + other: "de vizite" topics_entered: - few: subiecte vizualizate - one: subiect vizualizat - other: subiecte vizualizate + one: "subiect vizualizat" + few: "subiecte vizualizate" + other: "subiecte vizualizate" posts_read: - few: postări citite - one: postare citită - other: de postări citite + one: "postare citită" + few: "postări citite" + other: "de postări citite" bookmark_count: - few: semne de carte - one: semn de carte - other: de semne de carte + one: "semn de carte" + few: "semne de carte" + other: "de semne de carte" top_replies: "Top răspunsuri" no_replies: "Nici un răspuns încă." more_replies: "Mai multe răspunsuri" @@ -903,7 +898,6 @@ ro: most_liked_users: "Cele mai apreciate" most_replied_to_users: "Cele mai multe răspunsuri pentru" no_likes: "Nicio apreciere încă." - associated_accounts: "Conectări" ip_address: title: "Ultima adresă IP" registration_ip_address: @@ -955,9 +949,9 @@ ro: reached: "%{relativeAge} – %{rate} a atins limita admisă de %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} a depășit limita admisă de %{siteSettingRate}." rate: - few: '%{count} erori/%{duration}' - one: o eroare/%{duration} - other: '%{count} de erori/%{duration}' + one: "o eroare/%{duration}" + few: "%{count} erori/%{duration}" + other: "%{count} de erori/%{duration}" learn_more: "află mai multe..." all_time: 'total' all_time_desc: 'total subiecte create' @@ -978,16 +972,14 @@ ro: time_read_recently_tooltip: '%{time_read} total citit (%{recent_time_read} în ultimele 60 de zile)' last_reply_lowercase: Ultimul răspuns replies_lowercase: - few: răspunsuri one: răspuns + few: răspunsuri other: de răspunsuri signup_cta: sign_up: "ÃŽnregistrare" hide_session: "AminteÈ™te-mi mai târziu." hide_forever: "Nu, mulÈ›umesc" hidden_for_session: "OK, vom reveni. PoÈ›i oricând folosi secÈ›iunea de 'Autentificare' pentru a crea un cont." - intro: "Salutare! :heart_eyes: Se pare că îți place subiectul, dar nu È›i-ai făcut cont pe site." - value_prop: "Când creezi un cont nou, noi reÈ›inem exact ce citeÈ™ti, astfel încât întotdeauna poÈ›i să te întorci exact unde ai rămas. Vei primi de asemenea È™i notificări, aici sau prin email, de câte ori apare o nouă postare. Și tu vei putea să apreciezi postări pentru a-È›i arăta aprecierea. :heartbeat:" summary: enabled_description: "Vizualizezi un rezumat al acestui subiect: cea mai interesantă postare, aÈ™a cum a fost desemnată de comunitate. " description: "Există {{replyCount}} răspunsuri." @@ -1001,7 +993,6 @@ ro: disable: "Arată postările È™terse" private_message_info: title: "Mesaj" - invite: "Invită alte persoane..." leave_message: "Sigur părăseÈ™ti acest mesaj?" remove_allowed_user: "Chiar doreÈ™ti să îl elimini pe {{name}} din acest mesaj privat?" remove_allowed_group: "EÈ™ti sigur că vrei să îl scoÈ›i pe {{name}} din acest mesaj?" @@ -1059,9 +1050,6 @@ ro: preferences: "Trebuie să fii autentificat pentru a schimba preferinÈ›ele." forgot: "Nu îmi amintesc detaliile contului meu." not_approved: "Contul tău încă nu a fost aprobat. Vei primi notificarea prin email când eÈ™ti gata de logare." - google: - title: "Google" - message: "Autentificare cu Google (Verifică browserul să nu blocheze ferestrele pop-up)" google_oauth2: title: "Google" message: "Autentificare cu Google (Verifică browserul să nu blocheze ferestrele pop-up)" @@ -1142,9 +1130,9 @@ ro: drafts_offline: "schiță offline" group_mentioned_limit: "1AtenÈ›ie!1 Ai menÈ›ionat 2{{group}}2, dar acest grup are mai mulÈ›i membri decât limita de {{max}} utilizatori configurată de către administrator. Nimeni nu va fi notificat." group_mentioned: - few: Prin menÈ›ionarea {{group}}, urmează să notifici {{count}} persoane – eÈ™ti sigur? - one: Prin menÈ›ionarea {{group}}, urmează să notifici o persoană – eÈ™ti sigur? - other: Prin menÈ›ionarea {{group}}, urmează să notifici {{count}} de persoane – eÈ™ti sigur? + one: "Prin menÈ›ionarea {{group}}, urmează să notifici o persoană – eÈ™ti sigur?" + few: "Prin menÈ›ionarea {{group}}, urmează să notifici {{count}} persoane – eÈ™ti sigur?" + other: "Prin menÈ›ionarea {{group}}, urmează să notifici {{count}} de persoane – eÈ™ti sigur?" cannot_see_mention: category: "Ai menÈ›ionat utilizatorii: {{username}}. ÃŽnsă ei nu vor notificaÈ›i pentru că nu au acces la această categorie. Va trebui să îi adaugi la într-un grup care are acces la aceasta categorie." private: "Ai menÈ›ionat utilizatorii: {{username}}. ÃŽnsă ei nu vor fi notificaÈ›i pentru că nu au posibilitatea să vadă acest mesaj personal. Va trebui să îi inviÈ›i la acest MP. " @@ -1220,9 +1208,9 @@ ro: notifications: tooltip: message: - few: '{{count}} mesaje necitite' - one: 1 mesaj necitit - other: '{{count}} mesaje necitite' + one: "1 mesaj necitit" + few: "{{count}} mesaje necitite" + other: "{{count}} mesaje necitite" title: "notificări la menÈ›ionările @numelui tău, răspunsuri la postările sau subiectele tale, mesaje, etc." none: "Nu pot încărca notificările în acest moment." empty: "Nu au fost găsite notificări." @@ -1237,9 +1225,9 @@ ro: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - few: {{username}}, {{username2}} È™i încă o persoană {{description}} - one: {{username}}, {{username2}} È™i încă o persoană {{description}} - other: {{username}}, {{username2}} È™i alÈ›i {{count}} {{description}} + one: "{{username}}, {{username2}} È™i încă o persoană {{description}}" + few: "{{username}}, {{username2}} È™i încă o persoană {{description}}" + other: "{{username}}, {{username2}} È™i alÈ›i {{count}} {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1362,9 +1350,9 @@ ro: notification_level: "Notificări" choose_new_category: "Alege o nouă categorie pentru acest subiect" selected: - few: Ai selectat {{count}} subiecte. - one: Ai selectat un subiect. - other: Ai selectat {{count}} de subiecte. + one: "Ai selectat un subiect." + few: "Ai selectat {{count}} subiecte." + other: "Ai selectat {{count}} de subiecte." change_tags: "ÃŽnlocuieÈ™te etichete" append_tags: "Adaugă etichete" choose_new_tags: "Alege etichete noi pentru aceste subiecte:" @@ -1397,9 +1385,9 @@ ro: search: "Nu mai sunt rezultate." topic: filter_to: - few: '{{count}} postări în subiect' - one: O postare în subiect - other: '{{count}} de postări în subiect' + one: "O postare în subiect" + few: "{{count}} postări în subiect" + other: "{{count}} de postări în subiect" create: 'Subiect nou' create_long: 'Creează un subiect nou' private_message: 'Scrie un mesaj.' @@ -1413,12 +1401,12 @@ ro: new: 'subiect nou' unread: 'necitit' new_topics: + one: 'Un subiect nou' few: '{{count}} subiecte noi' - one: Un subiect nou other: '{{count}} de subiecte noi' unread_topics: + one: 'Un subiect necitit' few: '{{count}} subiecte necitite' - one: Un subiect necitit other: '{{count}} de subiecte necitite' title: 'Subiect' invalid_access: @@ -1432,21 +1420,21 @@ ro: title: "Subiectul nu a fost găsit" description: "Ne pare rău, Nu am putut găsi subiectul. Poate a fost È™ters de un moderator?" total_unread_posts: - few: ai {{count}} mesaje necitite în această discuÅ£ie. - one: ai un mesaj necitit în această discuÅ£ie. - other: ai {{count}} de mesaje necitite în această discuÅ£ie. + one: "ai un mesaj necitit în această discuÅ£ie." + few: "ai {{count}} mesaje necitite în această discuÅ£ie." + other: "ai {{count}} de mesaje necitite în această discuÅ£ie." unread_posts: - few: ai {{count}} mesaje vechi necitite în această discuÅ£ie. - one: ai un mesaj vechi necitit în această discuÅ£ie. - other: ai {{count}} de mesaje vechi necitite în această discuÅ£ie. + one: "ai un mesaj vechi necitit în această discuÅ£ie." + few: "ai {{count}} mesaje vechi necitite în această discuÅ£ie." + other: "ai {{count}} de mesaje vechi necitite în această discuÅ£ie." new_posts: - few: sunt {{count}} mesaje noi în această discuÅ£ie de la ultima citire - one: este un mesaj nou în această discuÅ£ie de la ultima citire - other: sunt {{count}} de mesaje noi în această discuÅ£ie de la ultima citire + one: "este un mesaj nou în această discuÅ£ie de la ultima citire" + few: "sunt {{count}} mesaje noi în această discuÅ£ie de la ultima citire" + other: "sunt {{count}} de mesaje noi în această discuÅ£ie de la ultima citire" likes: - few: sunt {{count}} aprecieri pentru această discuÅ£ie - one: există o apreciere pentru această discuÅ£ie - other: sunt {{count}} de aprecieri pentru această discuÅ£ie + one: "există o apreciere pentru această discuÅ£ie" + few: "sunt {{count}} aprecieri pentru această discuÅ£ie" + other: "sunt {{count}} de aprecieri pentru această discuÅ£ie" back_to_list: "ÃŽnapoi la lista de subiecte" options: "OpÈ›iuni pentru subiect" show_links: "arată link-urile din acest subiect" @@ -1506,9 +1494,9 @@ ro: auto_close_based_on_last_post: "Acest subiect va fi automat închis după %{duration} de la ultimul răspuns." auto_close_title: 'Setări de închidere automată' auto_close_immediate: - few: Ultima postare din subiect este deja veche de %{count} ore, aÈ™a că subiectul va fi închis imediat. - one: Ultima postare din subiect este deja veche de o oră, aÈ™a că subiectul va fi închis imediat. - other: Ultima postare din subiect este deja veche de %{count} de ore, aÈ™a că subiectul va fi închis imediat. + one: "Ultima postare din subiect este deja veche de o oră, aÈ™a că subiectul va fi închis imediat." + few: "Ultima postare din subiect este deja veche de %{count} ore, aÈ™a că subiectul va fi închis imediat." + other: "Ultima postare din subiect este deja veche de %{count} de ore, aÈ™a că subiectul va fi închis imediat." timeline: back: "ÃŽnapoi" back_description: "ÃŽntoarce-te la ultima ta postare necitită" @@ -1613,9 +1601,9 @@ ro: pin_validation: "Este necesară o dată pentru a putea fixa acest subiect." not_pinned: "Nu sunt subiecte fixate în {{categoryLink}}." already_pinned: - few: 'Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}' - one: 'Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}' - other: 'Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}' + one: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}" + few: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}" + other: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}" pin_globally: "Pune acest subiect în vârful listei tuturor subiectelor până" confirm_pin_globally: "Sunt {{count}} subiecte fixate la nivel global. Prea multe subiecte fixate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. EÈ™ti sigur că vrei să fixezi un nou subiect la nivel global?" unpin_globally: "Elimină acest subiect din partea de sus a tuturor listelor de discuÅ£ii." @@ -1623,9 +1611,9 @@ ro: global_pin_note: "Utilizatorii pot anula un subiect fixat doar de ei pentru ei înÈ™iÈ™i." not_pinned_globally: "Nu există subiecte fixate global." already_pinned_globally: - few: 'Număr de subiecte fixate la nivel global: {{count}}' - one: 'Număr de subiecte fixate la nivel global: {{count}}' - other: 'Număr de subiecte fixate la nivel global: {{count}}' + one: "Număr de subiecte fixate la nivel global: {{count}}" + few: "Număr de subiecte fixate la nivel global: {{count}}" + other: "Număr de subiecte fixate la nivel global: {{count}}" make_banner: "Transformă acest subiect într-un banner care apare în partea de sus a tuturor paginilor." remove_banner: "Elimină mesajul banner care apare în partea de sus a fiecărei pagini." banner_note: "Utilizatorii pot îndepărta baner-ul închizându-l. Doar un singur mesaj poate fi folosit ca baner într-un moment dat." @@ -1661,9 +1649,9 @@ ro: login_reply: 'Autentifică-te pentru a răspunde.' filters: n_posts: - few: '{{count}} postări' - one: O postare - other: '{{count}} de postări' + one: "O postare" + few: "{{count}} postări" + other: "{{count}} de postări" cancel: "Șterge filtre" split_topic: title: "Mutare în subiect nou." @@ -1671,17 +1659,17 @@ ro: topic_name: "Numele subiectului nou" error: "A apărut o eroare la mutarea postărilor în subiectul nou." instructions: - few: Vei crea o nouă discuÅ£ie care va fi populată cu cele {{count}} postări selectate. - one: Vei crea o nouă discuÅ£ie care va fi populată cu postarea selectată. - other: Vei crea o nouă discuÅ£ie care va fi populată cu cele {{count}} de postări selectate. + one: "Vei crea o nouă discuÅ£ie care va fi populată cu postarea selectată." + few: "Vei crea o nouă discuÅ£ie care va fi populată cu cele {{count}} postări selectate." + other: "Vei crea o nouă discuÅ£ie care va fi populată cu cele {{count}} de postări selectate." merge_topic: title: "Mută în subiect deja existent" action: "mută în subiect deja existent" error: "A apărut o eroare la mutarea postărilor în acel subiect." instructions: - few: Te rugăm să alegi subiectul unde doreÈ™ti să muÈ›i aceste {{count}} mesaje. - one: Te rugăm să alegi subiectul unde doreÈ™ti să muÈ›i acest mesaj. - other: Te rugăm să alegi subiectul unde doreÈ™ti să muÈ›i aceste {{count}} de mesaje. + one: "Te rugăm să alegi subiectul unde doreÈ™ti să muÈ›i acest mesaj." + few: "Te rugăm să alegi subiectul unde doreÈ™ti să muÈ›i aceste {{count}} mesaje." + other: "Te rugăm să alegi subiectul unde doreÈ™ti să muÈ›i aceste {{count}} de mesaje." merge_posts: title: "Comasează postările selectate" action: "comasează postările selectate" @@ -1693,9 +1681,9 @@ ro: label: "Noul autor al postărilor" placeholder: "numele de utilizator al autorului" instructions: - few: Alege noul autor pentru cele {{count}} mesaje postate de {{old_user}}. - one: Alege noul autor pentru mesajul postat de {{old_user}}. - other: Alege noul autor pentru cele {{count}} de mesaje postate de {{old_user}}. + one: "Alege noul autor pentru mesajul postat de {{old_user}}." + few: "Alege noul autor pentru cele {{count}} mesaje postate de {{old_user}}." + other: "Alege noul autor pentru cele {{count}} de mesaje postate de {{old_user}}." change_timestamp: action: "schimbă data publicării" invalid_timestamp: "Marcajul de timp nu poate fi în viitor." @@ -1713,14 +1701,16 @@ ro: select_replies: label: 'selectează +răspunsuri' title: 'Adaugă postarea È™i toate răspunsurile la selecÈ›ie' + select_below: + label: 'selectează +tot ce urmează' delete: È™terge selecÈ›ia cancel: anulare selecÈ›ie select_all: selectează tot deselect_all: deselectează tot description: - few: Ai selectat {{count}} mesaje. one: Ai selectat un mesaj. - other: Ai selectat {{count}} de mesaje. + few: "Ai selectat {{count}} mesaje." + other: "Ai selectat {{count}} de mesaje." post: quote_reply: "Citează" edit_reason: "Motivul edit[rii: " @@ -1733,33 +1723,33 @@ ro: show_full: "Arată postarea în întregime" show_hidden: 'Arată conÈ›inut ascuns.' deleted_by_author: - few: (postări retrase de autor, vor fi ÅŸterse automat în %{count} ore, cu excepÅ£ia cazului în care mesajele sunt marcate) - one: (post retras de autor, va fi ÅŸters automat într-o oră, cu excepÅ£ia cazului în care mesajul este marcat) - other: (postări retrase de autor, vor fi ÅŸterse automat în %{count} de ore, cu excepÅ£ia cazului în care mesajele sunt marcate) + one: "(post retras de autor, va fi ÅŸters automat într-o oră, cu excepÅ£ia cazului în care mesajul este marcat)" + few: "(postări retrase de autor, vor fi ÅŸterse automat în %{count} ore, cu excepÅ£ia cazului în care mesajele sunt marcate)" + other: "(postări retrase de autor, vor fi ÅŸterse automat în %{count} de ore, cu excepÅ£ia cazului în care mesajele sunt marcate)" collapse: "restrânge" expand_collapse: "extinde/restrânge" gap: - few: vezi {{count}} răspunsuri ascunse - one: vezi un răspuns ascuns - other: vezi {{count}} de răspunsuri ascunse + one: "vezi un răspuns ascuns" + few: "vezi {{count}} răspunsuri ascunse" + other: "vezi {{count}} de răspunsuri ascunse" unread: "postarea nu a fost citită" has_replies: - few: '{{count}} răspunsuri' - one: Un răspuns - other: '{{count}} de răspunsuri' + one: "Un răspuns" + few: "{{count}} răspunsuri" + other: "{{count}} de răspunsuri" has_likes: - few: '{{count}} aprecieri' - one: O apreciere - other: '{{count}} de aprecieri' + one: "O apreciere" + few: "{{count}} aprecieri" + other: "{{count}} de aprecieri" has_likes_title: - few: '{{count}} persoane au apreciat această postare.' - one: O persoană a apreciat această postare. - other: '{{count}} de persoane au apreciat această postare.' + one: "O persoană a apreciat această postare." + few: "{{count}} persoane au apreciat această postare." + other: "{{count}} de persoane au apreciat această postare." has_likes_title_only_you: "Ai apreciat această postare." has_likes_title_you: - few: Ai apreciat această postare împreună cu alÈ›i {{count}} utilizatori. - one: Ai apreciat această postare împreună cu un alt utilizator. - other: Ai apreciat această postare împreună cu alÈ›i {{count}} de utilizatori. + one: "Ai apreciat această postare împreună cu un alt utilizator." + few: "Ai apreciat această postare împreună cu alÈ›i {{count}} utilizatori." + other: "Ai apreciat această postare împreună cu alÈ›i {{count}} de utilizatori." errors: create: "Ne pare rău, a apărut o eroare la creerea postării. Te rugăm să încerci iar." edit: "Ne pare rău, a apărut o eroare la editarea postării. Te rugăm să încerci iar." @@ -1796,13 +1786,13 @@ ro: delete_replies: confirm: "DoreÈ™ti să È™tergi È™i răspunsurile la această postare?" direct_replies: - few: Da, È™i {{count}} răspunsuri directe - one: Da, È™i {{count}} răspuns direct - other: Da, È™i {{count}} răspunsuri directe + one: "Da, È™i {{count}} răspuns direct" + few: "Da, È™i {{count}} răspunsuri directe" + other: "Da, È™i {{count}} răspunsuri directe" all_replies: - few: Da, È™i toate {{count}} răspunsurile - one: Da, È™i 1 răspuns - other: Da, È™i toate {{count}} răspunsurile + one: "Da, È™i 1 răspuns" + few: "Da, È™i toate {{count}} răspunsurile" + other: "Da, È™i toate {{count}} răspunsurile" just_the_post: "Nu, doare această postare" admin: "acÈ›iuni administrative pentru postare" wiki: "Fă postarea Wiki" @@ -1823,7 +1813,6 @@ ro: inappropriate: "Retrage marcaj de avertizare" bookmark: "Șterge semn de carte" like: "Retrage apreciere" - vote: "Retrage vot" people: off_topic: "marcat cu marcaj de avertizare \"în afara subiectului\"" spam: "marcat cu marcaj de avertizare \"spam\"" @@ -1833,10 +1822,9 @@ ro: bookmark: "a pus semn de carte la asta" like: "a apreciat asta" like_capped: - few: È™i {{count}} alÈ›ii au apreciat asta - one: È™i {{count}} altul au apreciat asta - other: È™i {{count}} alÈ›ii au apreciat asta - vote: "a votat la asta" + one: "È™i {{count}} altul au apreciat asta" + few: "È™i {{count}} alÈ›ii au apreciat asta" + other: "È™i {{count}} alÈ›ii au apreciat asta" by_you: off_topic: "Ai marcat asta cu mesaj de avertizare, ca fiind în afara subiectului" spam: "Ai marcat asta cu mesaj de avertizare, ca fiind spam" @@ -1845,83 +1833,74 @@ ro: notify_user: "Ai trimis un mesaj către acest utilizator" bookmark: "Ai marcat ca semn de carte această postare" like: "Ai apreciat" - vote: "Ai votat aceasta postare" by_you_and_others: off_topic: - few: Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj ca fiind în afara subiectului. - one: Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj ca fiind în afară subiectului - other: Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj ca fiind în afara subiectului. + one: "Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj ca fiind în afară subiectului" + few: "Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj ca fiind în afara subiectului." + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj ca fiind în afara subiectului." spam: - few: 'Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj ca spam. ' - one: 'Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj ca spam. ' - other: 'Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj ca spam. ' + one: "Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj ca spam. " + few: "Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj ca spam. " + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj ca spam. " inappropriate: - few: 'Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj ca inadecvat. ' - one: 'Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj ca inadecvat. ' - other: 'Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj ca inadecvat. ' + one: "Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj ca inadecvat. " + few: "Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj ca inadecvat. " + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj ca inadecvat. " notify_moderators: - few: Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj pentru moderare. - one: Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj pentru moderare. - other: Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj pentru moderare. + one: "Tu ÅŸi încă o persoană aÅ£i marcat acest mesaj pentru moderare." + few: "Tu ÅŸi alte {{count}} persoane aÅ£i marcat acest mesaj pentru moderare." + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i marcat acest mesaj pentru moderare." notify_user: - few: Tu ÅŸi alte {{count}} persoane aÅ£i trimis un mesaj către acest utilizator. - one: Tu ÅŸi încă o persoană aÅ£i trimis un mesaj către acest utilizator. - other: Tu ÅŸi alte {{count}} de persoane aÅ£i trimis un mesaj către acest utilizator. + one: "Tu ÅŸi încă o persoană aÅ£i trimis un mesaj către acest utilizator." + few: "Tu ÅŸi alte {{count}} persoane aÅ£i trimis un mesaj către acest utilizator." + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i trimis un mesaj către acest utilizator." bookmark: - few: Tu ÅŸi alte {{count}} persoane aÅ£i pus un semn de carte pentru această postare. - one: Tu ÅŸi încă o persoană aÅ£i pus un semn de carte pentru această postare. - other: Tu ÅŸi alte {{count}} de persoane aÅ£i pus un semn de carte pentru această postare. + one: "Tu ÅŸi încă o persoană aÅ£i pus un semn de carte pentru această postare." + few: "Tu ÅŸi alte {{count}} persoane aÅ£i pus un semn de carte pentru această postare." + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i pus un semn de carte pentru această postare." like: - few: Tu ÅŸi alte {{count}} persoane aÅ£i apreciat asta. - one: Tu ÅŸi încă o persoană aÅ£i apreciat aceasta. - other: Tu ÅŸi alte {{count}} de persoane aÅ£i apreciat asta. - vote: - few: Tu ÅŸi alte {{count}} persoane aÅ£i votat la această postare. - one: Tu ÅŸi încă o persoană aÅ£i votat la această postare. - other: Tu ÅŸi alte {{count}} de persoane aÅ£i votat la această postare. + one: "Tu ÅŸi încă o persoană aÅ£i apreciat aceasta." + few: "Tu ÅŸi alte {{count}} persoane aÅ£i apreciat asta." + other: "Tu ÅŸi alte {{count}} de persoane aÅ£i apreciat asta." by_others: off_topic: - few: '{{count}} persoane au marcat acesta ca fiind în afară discuÅ£iei' - one: O persoană a marcat acesta ca fiind în afară discuÅ£iei - other: '{{count}} de persoane au marcat acesta ca fiind în afară discuÅ£iei' + one: "O persoană a marcat acesta ca fiind în afară discuÅ£iei" + few: "{{count}} persoane au marcat acesta ca fiind în afară discuÅ£iei" + other: "{{count}} de persoane au marcat acesta ca fiind în afară discuÅ£iei" spam: - few: '{{count}} persoane au marcat acesta ca spam' - one: O persoană a marcat acesta ca spam - other: '{{count}} de persoane au marcat acesta ca spam' + one: "O persoană a marcat acesta ca spam" + few: "{{count}} persoane au marcat acesta ca spam" + other: "{{count}} de persoane au marcat acesta ca spam" inappropriate: - few: '{{count}} persoane au marcat acesta ca inadecvat' - one: o persoană a marcat acesta ca inadecvat - other: '{{count}} de persoane au marcat acesta ca inadecvat' + one: "o persoană a marcat acesta ca inadecvat" + few: "{{count}} persoane au marcat acesta ca inadecvat" + other: "{{count}} de persoane au marcat acesta ca inadecvat" notify_moderators: - few: '{{count}} persoane au marcat acest mesaj pentru moderare' - one: O persoană a marcat acest mesaj pentru moderare - other: '{{count}} de persoane au marcat acest mesaj pentru moderare' + one: "O persoană a marcat acest mesaj pentru moderare" + few: "{{count}} persoane au marcat acest mesaj pentru moderare" + other: "{{count}} de persoane au marcat acest mesaj pentru moderare" notify_user: - few: '{{count}} persoane au trimis un mesaj către acest utilizator' - one: o persoană a trimis un mesaj către acest utilizator - other: '{{count}} de persoane au trimis un mesaj către acest utilizator' + one: "o persoană a trimis un mesaj către acest utilizator" + few: "{{count}} persoane au trimis un mesaj către acest utilizator" + other: "{{count}} de persoane au trimis un mesaj către acest utilizator" bookmark: - few: '{{count}} persoane au pus un semn de carte la acest mesaj' - one: O persoană a pus un semn de carte la acest mesaj - other: '{{count}} de persoane au pus un semn de carte la acest mesaj' + one: "O persoană a pus un semn de carte la acest mesaj" + few: "{{count}} persoane au pus un semn de carte la acest mesaj" + other: "{{count}} de persoane au pus un semn de carte la acest mesaj" like: - few: '{{count}} persoane au apreciat aceasta' - one: o persoană a apreciat aceasta - other: '{{count}} de persoane au apreciat aceasta' - vote: - few: '{{count}} persoane au votat pentru acest mesaj' - one: O persoană a votat pentru acest mesaj - other: '{{count}} de persoane au votat pentru acest mesaj' + one: "o persoană a apreciat aceasta" + few: "{{count}} persoane au apreciat aceasta" + other: "{{count}} de persoane au apreciat aceasta" delete: confirm: - few: EÈ™ti sigur că vrei să È™tergi acele {{count}} postări? - one: EÈ™ti sigur că vrei să È™tergi aca postare? - other: EÈ™ti sigur că vrei să È™tergi acele {{count}} postări? + one: "EÈ™ti sigur că vrei să È™tergi aca postare?" + few: "EÈ™ti sigur că vrei să È™tergi acele {{count}} postări?" + other: "EÈ™ti sigur că vrei să È™tergi acele {{count}} postări?" merge: confirm: - few: EÈ™ti sigur că vrei să comasezi acele {{count}} postări? - one: EÈ™ti sigur că vrei să comasezi acele postări? - other: EÈ™ti sigur că vrei să comasezi acele {{count}} postări? + one: "EÈ™ti sigur că vrei să comasezi acele postări?" + few: "EÈ™ti sigur că vrei să comasezi acele {{count}} postări?" + other: "EÈ™ti sigur că vrei să comasezi acele {{count}} postări?" revisions: controls: first: "Prima revizie" @@ -1954,7 +1933,6 @@ ro: can: 'can… ' none: '(nicio categorie)' all: 'Toate categoriile' - choose: 'Selectează o categorie…' edit: 'editează' edit_long: "Editează" view: 'Arată subiectele din categorie' @@ -1998,14 +1976,12 @@ ro: email_in_allow_strangers: "Acceptă emailuri de la utilizatori anonimi fără cont" email_in_disabled: "Postarea subiectelor noi prin email este dezactivată din setările siteului. Pentru a activa postarea subiectelor noi prin email," email_in_disabled_click: 'activează opÈ›iunea "primire email ".' - all_topics_wiki: "Transformă subiectele noi în wiki-uri, implicit." sort_order: "Sortează lista de subiecte după:" default_view: "Listă implicită de subiecte:" allow_badges_label: "Permite acordarea de ecusoane în această categorie" edit_permissions: "Editează permisiuni" add_permission: "Adaugă permisiune" this_year: "anul acesta" - position: "poziÈ›ie" default_position: "PoziÈ›ie iniÈ›ială" position_disabled: "Categoriile vor fi afiÈ™ate în ordinea activității. Pentru a controla ordinea categoriilor în listă, " position_disabled_click: 'activează setarea "poziÈ›ia fixă a categoriei".' @@ -2064,36 +2040,36 @@ ro: custom_placeholder_notify_moderators: "Spune-ne exact ceea ce te preocupă, È™i dă-ne È™i link-uri relevante de câte ori e posibil." custom_message: at_least: - few: introdu cel puÈ›in {{count}} caractere - one: introdu cel puÈ›in un caracter - other: introdu cel puÈ›in {{count}} de caractere + one: "introdu cel puÈ›in un caracter" + few: "introdu cel puÈ›in {{count}} caractere" + other: "introdu cel puÈ›in {{count}} de caractere" more: - few: încă {{count}} ... - one: încă {{count}} ... - other: încă {{count}} ... + one: "încă {{count}} ..." + few: "încă {{count}} ..." + other: "încă {{count}} ..." left: - few: au mai rămas {{count}} ... - one: a mai rămas {{count}} ... - other: au mai rămas {{count}} ... + one: "a mai rămas {{count}} ..." + few: "au mai rămas {{count}} ..." + other: "au mai rămas {{count}} ..." flagging_topic: title: "ÃŽÈ›i mulÈ›umim că ne ajuÈ›i să păstrăm o comunitate civilizată!" action: "Marchează subiectul cu marcaj de avertizare" notify_action: "Mesaj" topic_map: title: "Rezumatul subiectului" - participants_title: "Postaci frecvenÅ£i" + participants_title: "Comentatori frecvenÅ£i" links_title: "Legături populare" links_shown: "arată mai multe link-uri..." clicks: - few: '%{count} click-uri' - one: 1 click - other: '%{count} de click-uri' + one: "1 click" + few: "%{count} click-uri" + other: "%{count} de click-uri" post_links: about: "afiÈ™ează mai multe link-uri din această postare" title: - few: mai sunt %{count} - one: mai e %{count} - other: mai sunt %{count} + one: "mai e %{count}" + few: "mai sunt %{count}" + other: "mai sunt %{count}" topic_statuses: warning: help: "Aceasta este o avertizare oficială." @@ -2120,29 +2096,29 @@ ro: posts_long: "sunt {{number}} (de) postări în acest subiect" posts_likes_MF: | Acest subiect are {count, plural, one {1 răspuns} other {# răspunsuri}} {ratio, select, - jos {cu o rată înaltă de aprecieri pe postare} + low {cu o rată înaltă de aprecieri pe postare} med {cu o foarte înaltă de aprecieri pe postare} - înalt {cu o rată extrem de înaltă de aprecieri pe postare} + high {cu o rată extrem de înaltă de aprecieri pe postare} other {}} original_post: "Postare iniÈ›ială" views: "Vizualizări" views_lowercase: - few: vizualizări - one: vizualizare - other: de vizualizări + one: "vizualizare" + few: "vizualizări" + other: "de vizualizări" replies: "Răspunsuri" activity: "Activitate" likes: "Aprecieri" likes_lowercase: - few: aprecieri - one: apreciere - other: aprecieri + one: "apreciere" + few: "aprecieri" + other: "aprecieri" likes_long: "sunt {{number}} (de) aprecieri în acest subiect" users: "Utilizatori" users_lowercase: - few: utilizatori - one: utilizator - other: de utilizatori + one: "utilizator" + few: "utilizatori" + other: "de utilizatori" category_title: "Categorie" history: "Istoric" changed_by: "de {{author}}" @@ -2155,9 +2131,9 @@ ro: latest: title: "Cele mai recente" title_with_count: - few: Cele mai recente ({{count}}) - one: Cel mai recent (1) - other: Cele mai recente ({{count}}) + one: "Cel mai recent (1)" + few: "Cele mai recente ({{count}})" + other: "Cele mai recente ({{count}})" help: "subiecte cu postări recente" hot: title: "Interesant" @@ -2175,25 +2151,25 @@ ro: unread: title: "Necitite" title_with_count: - few: Necitite ({{count}}) - one: Necitit (1) - other: Necitite ({{count}}) + one: "Necitit (1)" + few: "Necitite ({{count}})" + other: "Necitite ({{count}})" help: "subiecte pe care le urmăreÈ™ti activ sau cele pe care le urmăreÈ™ti È™i care includ postări necitite" lower_title_with_count: - few: '{{count}} necitite' - one: '{{count}} necitit' - other: '{{count}} necitite' + one: "{{count}} necitit" + few: "{{count}} necitite" + other: "{{count}} necitite" new: lower_title_with_count: - few: '{{count}} noi' - one: '{{count}} nou' - other: '{{count}} noi' + one: "{{count}} nou" + few: "{{count}} noi" + other: "{{count}} noi" lower_title: "nou" title: "Noi" title_with_count: - few: Noi ({{count}}) - one: Nou (1) - other: Noi ({{count}}) + one: "Nou (1)" + few: "Noi ({{count}})" + other: "Noi ({{count}})" help: "subiecte create în ultimele zile" posted: title: "Postările mele" @@ -2204,9 +2180,9 @@ ro: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + few: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "subiecte recente din categoria {{categoryName}}" top: title: "Top" @@ -2290,25 +2266,25 @@ ro: print: 'ctrl+p Tipărire subiect' badges: earned_n_times: - few: A primit acest ecuson de %{count} ori - one: A primit acest ecuson o dată - other: A primit acest ecuson de %{count} de ori + one: "A primit acest ecuson o dată" + few: "A primit acest ecuson de %{count} ori" + other: "A primit acest ecuson de %{count} de ori" granted_on: "Acordat %{date}" others_count: "AlÈ›ii cu acest ecuson (%{count})" title: Ecusoane multiple_grant: "PoÈ›i primi asta de mai multe ori" badge_count: - few: '%{count} ecusoane' - one: '%{count} ecuson' - other: '%{count} de ecusoane' + one: "%{count} ecuson" + few: "%{count} ecusoane" + other: "%{count} de ecusoane" more_badges: - few: ' Alte %{count}' - one: ÃŽncă una - other: ' Alte %{count}' + one: "ÃŽncă una" + few: " Alte %{count}" + other: " Alte %{count}" granted: - few: '%{count} acordate' - one: '%{count} acordat' - other: '%{count} acordate' + one: "%{count} acordat" + few: "%{count} acordate" + other: "%{count} acordate" select_badge_for_title: SelectaÈ›i un ecuson pentru a-l folosi ca titlu none: "(nimic)" badge_grouping: @@ -2341,9 +2317,9 @@ ro: choose_for_topic: "etichete opÈ›ionale" delete_tag: "Șterge etichetă" delete_confirm: - few: EÈ™ti sigur că vrei să È™tergi această etichetă È™i să o scoÈ›i din {{count}} subiecte care o folosesc? - one: EÈ™ti sigur că vrei să È™tergi această etichetă È™i să o scoÈ›i dintr-un subiect care o foloseÈ™te? - other: EÈ™ti sigur că vrei să È™tergi această etichetă È™i să o scoÈ›i din {{count}} subiecte care o folosesc? + one: "EÈ™ti sigur că vrei să È™tergi această etichetă È™i să o scoÈ›i dintr-un subiect care o foloseÈ™te?" + few: "EÈ™ti sigur că vrei să È™tergi această etichetă È™i să o scoÈ›i din {{count}} subiecte care o folosesc?" + other: "EÈ™ti sigur că vrei să È™tergi această etichetă È™i să o scoÈ›i din {{count}} subiecte care o folosesc?" delete_confirm_no_topics: "EÈ™ti sigur că vrei să È™tergi această etichetă?" rename_tag: "Redenumire etichetă" rename_instructions: "Alege un nume nou pentru etichetă:" @@ -2600,13 +2576,13 @@ ro: none: "Nu există evenimente înrudite." redeliver: "Livrează din nou" incoming: - few: Există {{count}} noi evenimente. - one: 'Există un nou eveniment ' - other: Există {{count}} de noi evenimente. + one: "Există un nou eveniment " + few: "Există {{count}} noi evenimente." + other: "Există {{count}} de noi evenimente." completed_in: - few: Terminat în {{count}} secunde. - one: Terminat într-o secundă. - other: Terminat în {{count}} de secunde. + one: "Terminat într-o secundă." + few: "Terminat în {{count}} secunde." + other: "Terminat în {{count}} de secunde." request: "Cerere" response: "Răspuns" redeliver_confirm: "EÈ™ti sigur ca vrei să livrezi din nou aceeaÈ™i încărcătură?" @@ -2752,7 +2728,6 @@ ro: import_file_tip: "FiÈ™ier .dcstyle.json care conÈ›ine tema" about_theme: "Despre temă" license: "Licență" - component_of: "Tema este o componentă a:" update_to_latest: "Actualizat la ultima" check_for_updates: "Caută actualizări" updating: "Actualizare în curs..." @@ -2879,7 +2854,6 @@ ro: address_placeholder: "nume@exemplu.com" type_placeholder: "rezumat, înregistrare..." reply_key_placeholder: "cheie de răspuns" - skipped_reason_placeholder: "motivul" moderation_history: no_results: "Niciun istoric de moderare nu e disponibil." actions: @@ -3034,13 +3008,13 @@ ro: suspect: 'SuspecÈ›i' approved: "AprobaÈ›i?" approved_selected: - few: aprobă utilizatorii ({{count}}) - one: aprobă utilizatorul - other: aprobă utilizatorii ({{count}}) + one: "aprobă utilizatorul" + few: "aprobă utilizatorii ({{count}})" + other: "aprobă utilizatorii ({{count}})" reject_selected: - few: refuză utilizatorii ({{count}}) - one: refuză utilizatorul - other: refuză utilizatorii ({{count}}) + one: "refuză utilizatorul" + few: "refuză utilizatorii ({{count}})" + other: "refuză utilizatorii ({{count}})" titles: active: 'Utilizatori activi' new: 'Utilizatori noi' @@ -3056,13 +3030,13 @@ ro: suspended: 'Utilizatori suspendaÈ›i' suspect: 'Utilizatori suspecÅ£i' reject_successful: - few: '%{count} utilizatori au fost respinÈ™i cu succes.' - one: 1 utilizator a fost respins cu succes. - other: '%{count} de utilizatori au fost respinÈ™i cu succes.' + one: "1 utilizator a fost respins cu succes." + few: "%{count} utilizatori au fost respinÈ™i cu succes." + other: "%{count} de utilizatori au fost respinÈ™i cu succes." reject_failures: - few: ' %{count} utilizatori nu au putut fi respinÈ™i.' - one: Un utilizator nu a putut fi respins. - other: '%{count} de utilizatori nu au putut fi respinÈ™i.' + one: "Un utilizator nu a putut fi respins." + few: " %{count} utilizatori nu au putut fi respinÈ™i." + other: "%{count} de utilizatori nu au putut fi respinÈ™i." not_verified: "Neverificat" check_email: title: "Arată adresa de email a acestui utilizator" @@ -3131,17 +3105,17 @@ ro: delete_forbidden_because_staff: "Adminii È™i moderatorii nu pot fi sterÈ™i." delete_posts_forbidden_because_staff: "Nu poÈ›i È™terge mesajele administratorilor È™i moderatorilor." delete_forbidden: - few: Utilizatorii nu pot fi È™terÈ™i dacă au postări. Åžterge toate postările înainte de a încerca È™tergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi È™terse) - one: Utilizatorii nu pot fi È™terÈ™i dacă au postări. Șterge toate postările înainte de a încerca È™tergerea unui utilizator. (Postările mai vechi de 1 zi nu pot fi È™terse) - other: Utilizatorii nu pot fi È™terÈ™i dacă au postări. Șterge toate postările înainte de a încerca È™tergerea unui utilizator. (Postările mai vechi de %{count} de zile nu pot fi È™terse) + one: "Utilizatorii nu pot fi È™terÈ™i dacă au postări. Șterge toate postările înainte de a încerca È™tergerea unui utilizator. (Postările mai vechi de 1 zi nu pot fi È™terse)" + few: "Utilizatorii nu pot fi È™terÈ™i dacă au postări. Åžterge toate postările înainte de a încerca È™tergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi È™terse)" + other: "Utilizatorii nu pot fi È™terÈ™i dacă au postări. Șterge toate postările înainte de a încerca È™tergerea unui utilizator. (Postările mai vechi de %{count} de zile nu pot fi È™terse)" cant_delete_all_posts: - few: Nu pot fi ÅŸterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age) - one: Nu pot fi ÅŸterse toate postările. Unele postări sunt mai vechi de 1 zi. (Setarea delete_user_max_post_age) - other: Nu pot fi È™terse toate postările. Unele postări sunt mai vechi de %{count} de zile. (Setarea delete_user_max_post_age) + one: "Nu pot fi ÅŸterse toate postările. Unele postări sunt mai vechi de 1 zi. (Setarea delete_user_max_post_age)" + few: "Nu pot fi ÅŸterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)" + other: "Nu pot fi È™terse toate postările. Unele postări sunt mai vechi de %{count} de zile. (Setarea delete_user_max_post_age)" cant_delete_all_too_many_posts: - few: Nu pot fi ÅŸterse toate postările deoarece utilizatorul are mai mult de %{count} postări. (Setarea delete_all_posts_max) - one: Nu pot fi ÅŸterse toate postările deoarece utilizatorul are mai mult de 1 postare. (Setarea delete_all_posts_max) - other: Nu pot fi ÅŸterse toate postările deoarece utilizatorul are mai mult de %{count} de postări. (Setarea delete_all_posts_max) + one: "Nu pot fi ÅŸterse toate postările deoarece utilizatorul are mai mult de 1 postare. (Setarea delete_all_posts_max)" + few: "Nu pot fi ÅŸterse toate postările deoarece utilizatorul are mai mult de %{count} postări. (Setarea delete_all_posts_max)" + other: "Nu pot fi ÅŸterse toate postările deoarece utilizatorul are mai mult de %{count} de postări. (Setarea delete_all_posts_max)" delete_confirm: "EÈ™ti SIGUR că vrei È™tergerea acestui utilizator? AcÈ›iunea este ireversibilă!" delete_and_block: "Da, È™i blochează viitoarele autentificări cu acest email È™i această adresă IP" delete_dont_block: "Da, È™terge doar utilizatorul" @@ -3176,9 +3150,9 @@ ro: tl3_requirements: title: "CerinÈ›e pentru nivelul 3 de încredere" table_title: - few: 'ÃŽn ultimele %{count} zile:' - one: 'ÃŽn ultima zi:' - other: 'ÃŽn ultimele %{count} de zile:' + one: "ÃŽn ultima zi:" + few: "ÃŽn ultimele %{count} zile:" + other: "ÃŽn ultimele %{count} de zile:" value_heading: "Valoare" requirement_heading: "Cerință" visits: "Vizite" @@ -3344,9 +3318,9 @@ ro: text: "Unele È™abloane lipsesc. Asta se întâmplă atunci când o interogare de ecusoane returnează user IDs sau post IDs care nu există. Asta ar putea da naÈ™tere la rezultate neaÈ™teptate mai târziu - te rugăm să verifici din nou interogarea." no_grant_count: "Nu există ecusoane pentru atribuire." grant_count: - few: %{count} ecusoane pentru atribuire. - one: Un ecuson pentru atribuire. - other: %{count} de ecusoane pentru atribuire. + one: "Un ecuson pentru atribuire." + few: "%{count} ecusoane pentru atribuire." + other: "%{count} de ecusoane pentru atribuire." sample: "Exemplu:" grant: with: "%{username}" @@ -3412,9 +3386,9 @@ ro: uploading: "Se încarcă..." quit: "Poate mai târziu" staff_count: - few: Comunitatea ta are %{count} membri cu tot cu tine. - one: Comunitatea ta are 1 membru (tu). - other: Comunitatea ta are %{count} membri cu tot cu tine. + one: "Comunitatea ta are 1 membru (tu)." + few: "Comunitatea ta are %{count} membri cu tot cu tine." + other: "Comunitatea ta are %{count} membri cu tot cu tine." invites: add_user: "adaugă" none_added: "Nu aÈ›i invitat nici un membru al echipei. EÈ™ti sigur că vrei să continui?" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index a661e95b88..a24745583b 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -16,9 +16,9 @@ ru: format: '%n %u' units: byte: + one: Байт few: Байта many: Байт - one: Байт other: Байты gb: ГБ kb: КБ @@ -45,106 +45,106 @@ ru: tiny: half_a_minute: "< 1мин" less_than_x_seconds: - few: < %{count}Ñек - many: < %{count}Ñек - one: < 1Ñек - other: < %{count}Ñек + one: "< 1Ñек" + few: "< %{count}Ñек" + many: "< %{count}Ñек" + other: "< %{count}Ñек" x_seconds: - few: '%{count}Ñ' - many: '%{count}Ñ' - one: 1Ñ - other: '%{count}Ñ' + one: "1Ñ" + few: "%{count}Ñ" + many: "%{count}Ñ" + other: "%{count}Ñ" less_than_x_minutes: - few: ~ 1m - many: '> 1m' - one: < 1мин - other: < %{count}мин + one: "< 1мин" + few: "~ 1m" + many: "> 1m" + other: "< %{count}мин" x_minutes: - few: '%{count}мин' - many: '%{count}мин' - one: 1мин - other: '%{count}мин' + one: "1мин" + few: "%{count}мин" + many: "%{count}мин" + other: "%{count}мин" about_x_hours: - few: '%{count}ч' - many: '%{count}ч' - one: 1ч - other: '%{count}ч' + one: "1ч" + few: "%{count}ч" + many: "%{count}ч" + other: "%{count}ч" x_days: - few: '%{count}д' - many: '%{count}д' - one: 1д - other: '%{count}д' + one: "1д" + few: "%{count}д" + many: "%{count}д" + other: "%{count}д" x_months: - few: '%{count}меÑ' - many: '%{count}меÑ' - one: 1 Ð¼ÐµÑ - other: '%{count}меÑ' + one: "1 меÑ" + few: "%{count}меÑ" + many: "%{count}меÑ" + other: "%{count}меÑ" about_x_years: - few: '%{count}года' - many: '%{count}лет' - one: 1год - other: '%{count}лет' + one: "1год" + few: "%{count}года" + many: "%{count}лет" + other: "%{count}лет" over_x_years: - few: '> %{count} лет' - many: '> %{count} лет' - one: '> 1 года' - other: '> %{count} лет' + one: "> 1 года" + few: "> %{count} лет" + many: "> %{count} лет" + other: "> %{count} лет" almost_x_years: - few: '%{count} года' - many: '%{count} лет' - one: 1 год - other: '%{count} лет' + one: "1 год" + few: "%{count} года" + many: "%{count} лет" + other: "%{count} лет" date_month: "D MMM" date_year: "MMM YYYY" medium: x_minutes: - few: '%{count} минуты' - many: '%{count} минут' - one: 1 минута - other: '%{count} минут' + one: "1 минута" + few: "%{count} минуты" + many: "%{count} минут" + other: "%{count} минут" x_hours: - few: '%{count} чаÑа' - many: '%{count} чаÑов' - one: 1 Ñ‡Ð°Ñ - other: '%{count} чаÑов' + one: "1 чаÑ" + few: "%{count} чаÑа" + many: "%{count} чаÑов" + other: "%{count} чаÑов" x_days: - few: '%{count} днÑ' - many: '%{count} дней' - one: 1 день - other: '%{count} дней' + one: "1 день" + few: "%{count} днÑ" + many: "%{count} дней" + other: "%{count} дней" date_year: "D MMM, YYYY" medium_with_ago: x_minutes: - few: '%{count} минуты назад' - many: '%{count} минут назад' - one: 1 минуту назад - other: '%{count} минут назад' + one: "1 минуту назад" + few: "%{count} минуты назад" + many: "%{count} минут назад" + other: "%{count} минут назад" x_hours: - few: '%{count} чаÑа назад' - many: '%{count} чаÑов назад' - one: 1 Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´ - other: '%{count} чаÑов назад' + one: "1 Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´" + few: "%{count} чаÑа назад" + many: "%{count} чаÑов назад" + other: "%{count} чаÑов назад" x_days: - few: '%{count} Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´' - many: '%{count} дней назад' - one: 1 день назад - other: '%{count} дней назад' + one: "1 день назад" + few: "%{count} Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´" + many: "%{count} дней назад" + other: "%{count} дней назад" later: x_days: - few: '%{count} Ð´Ð½Ñ ÑпуÑÑ‚Ñ' - many: '%{count} дней ÑпуÑÑ‚Ñ' - one: 1 день ÑпуÑÑ‚Ñ - other: '%{count} дней ÑпуÑÑ‚Ñ' + one: "1 день ÑпуÑÑ‚Ñ" + few: "%{count} Ð´Ð½Ñ ÑпуÑÑ‚Ñ" + many: "%{count} дней ÑпуÑÑ‚Ñ" + other: "%{count} дней ÑпуÑÑ‚Ñ" x_months: - few: '%{count} меÑÑца ÑпуÑÑ‚Ñ' - many: '%{count} меÑÑцев ÑпуÑÑ‚Ñ' - one: 1 меÑÑц ÑпуÑÑ‚Ñ - other: '%{count} меÑÑцев ÑпуÑÑ‚Ñ' + one: "1 меÑÑц ÑпуÑÑ‚Ñ" + few: "%{count} меÑÑца ÑпуÑÑ‚Ñ" + many: "%{count} меÑÑцев ÑпуÑÑ‚Ñ" + other: "%{count} меÑÑцев ÑпуÑÑ‚Ñ" x_years: - few: '%{count} года ÑпуÑÑ‚Ñ' - many: '%{count} лет ÑпуÑÑ‚Ñ' - one: 1 год ÑпуÑÑ‚Ñ - other: '%{count} лет ÑпуÑÑ‚Ñ' + one: "1 год ÑпуÑÑ‚Ñ" + few: "%{count} года ÑпуÑÑ‚Ñ" + many: "%{count} лет ÑпуÑÑ‚Ñ" + other: "%{count} лет ÑпуÑÑ‚Ñ" previous_month: 'Предыдущий меÑÑц' next_month: 'Следующий меÑÑц' share: @@ -202,6 +202,7 @@ ru: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Ireland)" eu_west_2: "EU (London)" + eu_west_3: "EU (Paris)" sa_east_1: "South America (Sao Paulo)" us_east_1: "US East (N. Virginia)" us_east_2: "US East (Ohio)" @@ -225,15 +226,15 @@ ru: show_help: "РаÑширенный поиÑк" links: "СÑылки" links_lowercase: - few: ÑÑылки - many: ÑÑылок - one: ÑÑылка - other: ÑÑылок + one: "ÑÑылка" + few: "ÑÑылки" + many: "ÑÑылок" + other: "ÑÑылок" faq: "ВопроÑ-ответ" guidelines: "РуководÑтво" privacy_policy: "Политика конфиденциальноÑти" privacy: "Политика конфиденциальноÑти" - terms_of_service: "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑлуг" + tos: "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑлуг" mobile_view: "Ð”Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв" desktop_view: "Ð”Ð»Ñ Ð½Ð°Ñтольных уÑтройÑтв" you: "Ð’Ñ‹" @@ -252,10 +253,10 @@ ru: max_of_count: "{{count}} макÑ." alternation: "или" character_count: - few: '{{count}} буквы' - many: '{{count}} букв' - one: '{{count}} буква' - other: '{{count}} букв' + one: "{{count}} буква" + few: "{{count}} буквы" + many: "{{count}} букв" + other: "{{count}} букв" suggested_topics: title: "Похожие темы" pm_title: "Похожие ÑообщениÑ" @@ -287,21 +288,25 @@ ru: last_read: "Ñто поÑледнее прочитанное вами Ñообщение; нажмите, чтобы добавить его в закладки" remove: "Удалить закладку" confirm_clear: "Ð’Ñ‹ уверены, что хотите удалить вÑе Ñти темы из Избранного?" + drafts: + resume: "Продолжить" + remove: "Удалить" + new_private_message: "Черновик Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ личного ÑообщениÑ" topic_count_latest: - few: ЕÑть {{count}} новых или обновленных тем - many: ЕÑть {{count}} новых или обновленных тем - one: ЕÑть {{count}} Ð½Ð¾Ð²Ð°Ñ Ð¸Ð»Ð¸ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° - other: ЕÑть {{count}} новых или обновленных тем + one: "ЕÑть {{count}} Ð½Ð¾Ð²Ð°Ñ Ð¸Ð»Ð¸ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°" + few: "ЕÑть {{count}} новых или обновленных тем" + many: "ЕÑть {{count}} новых или обновленных тем" + other: "ЕÑть {{count}} новых или обновленных тем" topic_count_unread: - few: ПоÑмотреть {{count}} непрочитанных тем - many: ПоÑмотреть {{count}} непрочитанных тем - one: ПоÑмотреть {{count}} непрочитанную тему - other: ПоÑмотреть {{count}} непрочитанных тем + one: "ПоÑмотреть {{count}} непрочитанную тему" + few: "ПоÑмотреть {{count}} непрочитанных тем" + many: "ПоÑмотреть {{count}} непрочитанных тем" + other: "ПоÑмотреть {{count}} непрочитанных тем" topic_count_new: - few: ПоÑмотреть {{count}} новые темы - many: ПоÑмотреть {{count}} новые темы - one: ПоÑмотреть {{count}} новую тему - other: ПоÑмотреть {{count}} новые темы + one: "ПоÑмотреть {{count}} новую тему" + few: "ПоÑмотреть {{count}} новые темы" + many: "ПоÑмотреть {{count}} новые темы" + other: "ПоÑмотреть {{count}} новые темы" preview: "предпроÑмотр" cancel: "отмена" save: "Сохранить" @@ -339,20 +344,20 @@ ru: cancel: "Отменить" view_pending: "ПроÑмотреть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² очереди" has_pending_posts: - few: Ð’ Ñтой теме {{count}} ÑообщениÑ, ожидающих проверки - many: Ð’ Ñтой теме {{count}} Ñообщений, ожидающих проверки - one: Ð’ Ñтой теме 1 Ñообщение, ожидающее проверки - other: Ð’ Ñтой теме {{count}} Ñообщений, ожидающих проверки + one: "Ð’ Ñтой теме 1 Ñообщение, ожидающее проверки" + few: "Ð’ Ñтой теме {{count}} ÑообщениÑ, ожидающих проверки" + many: "Ð’ Ñтой теме {{count}} Ñообщений, ожидающих проверки" + other: "Ð’ Ñтой теме {{count}} Ñообщений, ожидающих проверки" confirm: "Сохранить" delete_prompt: "Ð’Ñ‹ уверены, что хотите удалить %{username}? Это также удалит вÑе его ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ заблокирует его email и IP-адреÑ." approval: title: "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸" description: "Ваше Ñообщение отправлено, но требует проверки и ÑƒÑ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼. ПожалуйÑта, будьте терпеливы." pending_posts: - few: {{count}} Ñообщений ожидают одобрениÑ. - many: {{count}} Ñообщений ожидают одобрениÑ. - one: {{count}} Ñообщение ожидает одобрениÑ. - other: {{count}} Ñообщений ожидают одобрениÑ. + one: "{{count}} Ñообщение ожидает одобрениÑ." + few: "{{count}} Ñообщений ожидают одобрениÑ." + many: "{{count}} Ñообщений ожидают одобрениÑ." + other: "{{count}} Ñообщений ожидают одобрениÑ." ok: "ОК" user_action: user_posted_topic: "{{user}} Ñоздал тему" @@ -386,10 +391,10 @@ ru: posts_read: "Прочитано Ñообщений" posts_read_long: "Прочитано Ñообщений" total_rows: - few: '%{count} пользователÑ' - many: '%{count} пользователей' - one: '%{count} пользователь' - other: '%{count} пользователей' + one: "%{count} пользователь" + few: "%{count} пользователÑ" + many: "%{count} пользователей" + other: "%{count} пользователей" group_histories: actions: change_group_setting: "ÐаÑтроить группу" @@ -400,6 +405,7 @@ ru: groups: add_members: title: "Добавить УчаÑтников" + description: "Редактирование учаÑтников группы" usernames: "ПÑевдоним" manage: name: 'ИмÑ' @@ -409,6 +415,7 @@ ru: profile: title: Профиль interaction: + title: ВзаимодейÑтвие notification: Уведомление membership: title: УчаÑтник @@ -417,6 +424,8 @@ ru: title: "Логи" when: "Когда" details: "ПодробноÑти" + from: "От" + to: "Кому" public_admission: "Разрешить пользователÑм Ñвободно приÑоединÑтьÑÑ Ðº группе (требуетÑÑ Ð¾Ð±Ñ‰ÐµÐ´Ð¾ÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°)" public_exit: "Разрешить пользователÑм Ñвободно покидать группу" empty: @@ -462,10 +471,10 @@ ru: is_group_user: "УчаÑтник" is_group_owner: "Владелец" title: - few: Группы - many: Группы - one: Группа - other: Группы + one: "Группа" + few: "Группы" + many: "Группы" + other: "Группы" activity: "ДеÑтельноÑть" members: title: "УчаÑтники" @@ -536,8 +545,6 @@ ru: reorder: title: "УпорÑдочивание разделов" title_long: "Ð ÐµÐ¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÑпиÑка разделов" - fix_order: "ЗафикÑировать порÑдковые номера" - fix_order_tooltip: "Ðе вÑем разделам назначен уникальный порÑдковый номер. Это может привеÑти к непредÑказуемому порÑдку разделов." save: "Сохранить порÑдок" apply_all: "Применить" position: "ПорÑдковый номер" @@ -548,15 +555,15 @@ ru: toggle_ordering: "изменить Ñортировку" subcategories: "Подразделы" topic_sentence: - few: '%{count} тем' - many: '%{count} тем' - one: 1 тема - other: '%{count} тем' + one: "1 тема" + few: "%{count} тем" + many: "%{count} тем" + other: "%{count} тем" topic_stat_sentence: - few: '%{count} новые темы за предыдущий %{unit}.' - many: '%{count} новых тем за предыдущий %{unit}.' - one: '%{count} Ð½Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð° за предыдущий %{unit}.' - other: '%{count} новых тем за предыдущий %{unit}.' + one: "%{count} Ð½Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð° за предыдущий %{unit}." + few: "%{count} новые темы за предыдущий %{unit}." + many: "%{count} новых тем за предыдущий %{unit}." + other: "%{count} новых тем за предыдущий %{unit}." ip_lookup: title: ПоиÑк IP адреÑа hostname: Ðазвание хоÑта @@ -590,6 +597,7 @@ ru: activity_stream: "ÐктивноÑть" preferences: "ÐаÑтройки" expand_profile: "Развернуть" + collapse_profile: "Свернуть" bookmarks: "Закладки" bio: "Обо мне" invited_by: "ПриглаÑил" @@ -708,6 +716,9 @@ ru: set_password: "УÑтановить пароль" choose_new: "Выберите новый пароль" choose: "Выберите пароль" + second_factor_backup: + disable: "Отключить" + enable: "Включить" second_factor: title: "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ" disable: "Отключить двухфакторную аутентификацию" @@ -717,7 +728,6 @@ ru: error: "При изменении Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐ»Ð° ошибка." change_username: title: "Изменить пÑевдоним" - confirm: "ЕÑли вы измените Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, то вÑе предыдущие Ñ†Ð¸Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ @name Ñтанут неработоÑпоÑобными. Ð’Ñ‹ уверены, что вы хотите Ñто Ñделать?" taken: "Этот пÑевдоним уже занÑÑ‚." invalid: "ПÑевдоним должен ÑоÑтоÑть только из цифр и латинÑких букв" change_email: @@ -736,7 +746,6 @@ ru: upload_title: "Загрузка ÑобÑтвенного аватара" upload_picture: "Загрузить изображение" image_is_not_a_square: "Внимание: мы обрезали ваше изображение; ширина и выÑота не равны друг другу." - cache_notice: "Ð’Ñ‹ изменили аватар. Ðватар поменÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· некоторое Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·-за ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°." change_profile_background: title: "Фон профилÑ" instructions: "Картинки фона профилей будут отцентрированы и по-умолчанию имеют ширину 850 пикÑелей." @@ -745,16 +754,24 @@ ru: instructions: "Картинки фона будут отцентрированы и по-умолчанию имеют ширину 590 пикÑелей." email: title: "E-mail" + primary: "ОÑновной Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + secondary: "Дополнительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + no_secondary: "Ðет дополнительного адреÑа Ñлектронной почты" instructions: "Ðе показывать" ok: "Мы вышлем вам пиÑьмо Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ" invalid: "Введите дейÑтвующий Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" authenticated: "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтвержден {{provider}}" frequency_immediately: "Получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ новых непрочитанных ÑообщениÑÑ… незамедлительно." frequency: - few: Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы не были онлайн поÑледние {{count}} минуты. - many: Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы не были онлайн поÑледние {{count}} минут. - one: Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы более {{count}} минуты находитеÑÑŒ оффлайн. - other: Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы не были онлайн поÑледние {{count}} минyÑ‚. + one: "Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы более {{count}} минуты находитеÑÑŒ оффлайн." + few: "Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы не были онлайн поÑледние {{count}} минуты." + many: "Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы не были онлайн поÑледние {{count}} минут." + other: "Мы отправим вам пиÑьмо только в том Ñлучае, еÑли вы не были онлайн поÑледние {{count}} минyÑ‚." + associated_accounts: + title: "СвÑзанные Учетные ЗапиÑи" + connect: "СвÑзать" + revoke: "Отозвать" + not_connected: "(не ÑвÑзанный)" name: title: "ИмÑ" instructions: "ваше полное Ð¸Ð¼Ñ (опционально)" @@ -839,10 +856,10 @@ ru: user: "Кто приглашен" sent: "Когда" truncated: - few: Первые {{count}} Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ - many: Первые {{count}} приглашений - one: Первое приглашение - other: Первые {{count}} приглашений + one: "Первое приглашение" + few: "Первые {{count}} приглашениÑ" + many: "Первые {{count}} приглашений" + other: "Первые {{count}} приглашений" redeemed: "ПринÑтые приглашениÑ" redeemed_tab: "ПринÑтые" redeemed_tab_with_count: "ПринÑтые ({{count}})" @@ -889,45 +906,45 @@ ru: time_read: "Ð²Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" recent_time_read: "недавнее Ð²Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" topic_count: - few: темы Ñоздал - many: тем Ñоздал - one: тему Ñоздал - other: тем Ñоздал + one: "тему Ñоздал" + few: "темы Ñоздал" + many: "тем Ñоздал" + other: "тем Ñоздал" post_count: - few: ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð°Ð¿Ð¸Ñал - many: Ñообщений напиÑал - one: Ñообщение напиÑал - other: Ñообщений напиÑал + one: "Ñообщение напиÑал" + few: "ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð°Ð¿Ð¸Ñал" + many: "Ñообщений напиÑал" + other: "Ñообщений напиÑал" likes_given: - few: данных - many: данных - one: данный - other: данные + one: "данный" + few: "данных" + many: "данных" + other: "данные" likes_received: - few: получил - many: получил - one: получил - other: получил + one: "получил" + few: "получил" + many: "получил" + other: "получил" days_visited: - few: Ð´Ð½Ñ Ð·Ð°Ñ…Ð¾Ð´Ð¸Ð» - many: дней заходил - one: день заходил - other: дней заходил + one: "день заходил" + few: "Ð´Ð½Ñ Ð·Ð°Ñ…Ð¾Ð´Ð¸Ð»" + many: "дней заходил" + other: "дней заходил" topics_entered: - few: поÑмотрел тем - many: проÑмотрено тем - one: поÑмотрел тему - other: проÑмотрено тем + one: "поÑмотрел тему" + few: "поÑмотрел тем" + many: "проÑмотрено тем" + other: "проÑмотрено тем" posts_read: - few: ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÐ» - many: Ñообщений прочел - one: Ñообщение прочел - other: Ñообщений прочел + one: "Ñообщение прочел" + few: "ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÐ»" + many: "Ñообщений прочел" + other: "Ñообщений прочел" bookmark_count: - few: закладки - many: закладок - one: закладка - other: закладок + one: "закладка" + few: "закладки" + many: "закладок" + other: "закладок" top_replies: "Лучшие ÑообщениÑ" no_replies: "Пока не напиÑал ни одного ÑообщениÑ." more_replies: "... другие ÑообщениÑ" @@ -943,7 +960,6 @@ ru: most_liked_users: "Фавориты" most_replied_to_users: "Самые активные ÑобеÑедники" no_likes: "Пока ни одной Ñимпатии." - associated_accounts: "СвÑзанные аккаунты" ip_address: title: "ПоÑледний IP адреÑ" registration_ip_address: @@ -996,10 +1012,10 @@ ru: reached: "%{relativeAge} – %{rate} доÑтигнут уÑтановленный Ð´Ð»Ñ Ñайта предел %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} превышен уÑтановленный Ð´Ð»Ñ Ñайта предел %{siteSettingRate}." rate: - few: '%{count} ошибок/%{duration}' - many: '%{count} ошибок/%{duration}' - one: 1 ошибка/%{duration} - other: '%{count} ошибок/%{duration}' + one: "1 ошибка/%{duration}" + few: "%{count} ошибок/%{duration}" + many: "%{count} ошибок/%{duration}" + other: "%{count} ошибок/%{duration}" learn_more: "подробнее..." all_time: 'вÑего' all_time_desc: 'вÑего Ñоздано тем' @@ -1020,17 +1036,15 @@ ru: time_read_recently_tooltip: '%{time_read} общее Ð²Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ (%{recent_time_read}за поÑледние 60 дней)' last_reply_lowercase: поÑледний ответ replies_lowercase: + one: ответ few: ответа many: ответов - one: ответ other: ответ signup_cta: sign_up: "ЗарегиÑтрироватьÑÑ" hide_session: "Ðапомнить мне завтра" hide_forever: "Ðет, ÑпаÑибо" hidden_for_session: "Хорошо, напомню завтра. КÑтати, зарегиÑтрироватьÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ также и Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки \"Войти\"." - intro: "Привет! :heart_eyes: КажетÑÑ, форум пришелÑÑ Ð²Ð°Ð¼ по душе, но вы вÑе еще не зарегиÑтрировалиÑÑŒ." - value_prop: "ПоÑле региÑтрации мы Ñможем запоминать, где вы закончили чтение, а когда вы заглÑнете в ту или иную тему Ñнова, мы откроем ее там, где вы оÑтановилиÑÑŒ в прошлый раз. Мы также Ñможем уведомлÑть Ð²Ð°Ñ Ð¾ новых ответах в любимых темах в вашем личном кабинете или по Ñлектронной почте. Ð Ñамое приÑтное - поÑле региÑтрации можно Ñтавить Ñердечки, тем Ñамым Ð²Ñ‹Ñ€Ð°Ð¶Ð°Ñ Ñвою Ñимпатию автору. :heartbeat:" summary: enabled_description: "Ð’Ñ‹ проÑматриваете выдержку из темы - только Ñамые интереÑные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ мнению ÑообщеÑтва." description: "ЕÑть {{replyCount}} ответов." @@ -1044,7 +1058,6 @@ ru: disable: "Показать удаленные ÑообщениÑ" private_message_info: title: "Сообщение" - invite: "ПриглаÑить других..." leave_message: "Ð’Ñ‹ дейÑтвительно хотите оÑтавить Ñто Ñообщение?" remove_allowed_user: "Ð’Ñ‹ дейÑтвительно хотите удалить {{name}} из данного ÑообщениÑ?" remove_allowed_group: "Ð’Ñ‹ дейÑтвительно хотите удалить {{name}} из данного ÑообщениÑ?" @@ -1108,9 +1121,6 @@ ru: preferences: "Ðеобходимо войти на Ñайт Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ñтроек профилÑ." forgot: "Я не помню данные моей учетной запиÑи" not_approved: "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ еще не прошла проверку. ПоÑле уÑпешной проверки мы отправим вам пиÑьмо Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸ÐµÐ¼, и вы Ñможете входить в Ñвою учетную запиÑÑŒ." - google: - title: "Через Google" - message: "Вход Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ учетной запиÑи Google (убедитеÑÑŒ, что блокировщик вÑплывающих окон отключен)" google_oauth2: title: "Через Google" message: "Вход Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ учетной запиÑи Google (убедитеÑÑŒ, что блокировщик вÑплывающих окон отключен)" @@ -1163,6 +1173,16 @@ ru: no_content: Совпадений не найдено filter_placeholder: ПоиÑк... create: "Создать: '{{content}}'" + max_content_reached: + one: "Можно выбрать только {{count}} Ñлемент." + few: "Можно выбрать только {{count}} Ñлементов." + many: "Можно выбрать только {{count}} Ñлементов." + other: "Можно выбрать только {{count}} Ñлемент." + min_content_not_reached: + one: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñлемент." + few: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñлементов." + many: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñлементов." + other: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñлемент." emoji_picker: filter_placeholder: ИÑкать emoji people: People @@ -1175,6 +1195,8 @@ ru: recent: Ðедавно иÑпользованные shared_drafts: title: "Общие Черновики" + confirm_publish: "Ð’Ñ‹ уверены, что хотите опубликовать Ñтот черновик?" + publishing: "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹..." composer: emoji: "Смайлики :)" more_emoji: "еще..." @@ -1193,10 +1215,10 @@ ru: drafts_offline: "Черновики, Ñохраненные в офлайн" group_mentioned_limit: "Внимание! Ð’Ñ‹ упомÑнули {{group}}, в которой больше учаÑтников, чем уÑтановленный админиÑтратором лимит упоминаний на {{max}} пользователей. Ðикто не получит оповещение." group_mentioned: - few: Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление {{count}} пользователÑм – вы уверены? - many: Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление {{count}} пользователÑм – вы уверены? - one: Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление 1му пользователю – вы уверены? - other: Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление {{count}} пользователÑм – вы уверены? + one: "Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление 1му пользователю – вы уверены?" + few: "Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление {{count}} пользователÑм – вы уверены?" + many: "Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление {{count}} пользователÑм – вы уверены?" + other: "Ð£Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ {{group}}, вы тем Ñамым отправите уведомление {{count}} пользователÑм – вы уверены?" cannot_see_mention: category: "Ð’Ñ‹ упомÑнули {{username}}, но они не будут уведомлены, потому что у них нет доÑтупа к Ñтому разделу. Вам нужно добавить их в группу, имеющую доÑтуп к Ñтому разделу." private: "Ð’Ñ‹ упомÑнули {{username}}, но они не будут уведомлены, потому что они не могут видеть Ñто личное Ñообщение. Вам нужно приглаÑить их в Ñто ЛС." @@ -1219,6 +1241,7 @@ ru: create_pm: "Отправить личное Ñообщение" create_whisper: "Внутреннее Ñообщение" create_shared_draft: "Создать Общий Проект" + edit_shared_draft: "Редактировать общий черновик" title: "Или нажмите Ctrl+Enter" users_placeholder: "Добавить пользователÑ" title_placeholder: "Ðазвание: Ñуть темы коротким предложением" @@ -1227,6 +1250,7 @@ ru: show_edit_reason: "(добавить причину редактированиÑ)" topic_featured_link_placeholder: "Введите ÑÑылку, отображаемую Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼." reply_placeholder: "Поддерживаемые форматы: Markdown, BBCode и HTML. Чтобы вÑтавить картинку, перетащите ее Ñюда или вÑтавьте Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ctrl+V, Command-V, или нажмите правой кнопкой мыши и выберите меню \"вÑтавить\"." + reply_placeholder_choose_category: "Перед вводом текÑта необходимо выбрать категорию." view_new_post: "ПоÑмотреть Ñозданное вами Ñообщение." saving: "Сохранение..." saved: "Сохранено!" @@ -1265,6 +1289,8 @@ ru: body: "Ð’ ÑпиÑке получателей ÑÐµÐ¹Ñ‡Ð°Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ вы Ñами!" admin_options_title: "Дополнительные наÑтройки темы Ð´Ð»Ñ Ð¿ÐµÑ€Ñонала" composer_actions: + draft: Черновик + edit: Редактировать reply_to_post: label: "Ответить на Ñообщение %{postNumber} от %{postUsername}" desc: Ответ на конкретный поÑÑ‚ @@ -1282,15 +1308,15 @@ ru: notifications: tooltip: regular: - few: '{{count}} невидимые уведомлениÑ' - many: '{{count}} невидимых уведомлений' - one: 1 невидимое уведомление - other: '{{count}} невидимые уведомлениÑ' + one: "1 невидимое уведомление" + few: "{{count}} невидимые уведомлениÑ" + many: "{{count}} невидимых уведомлений" + other: "{{count}} невидимые уведомлениÑ" message: - few: '{{count}} непрочитанных Ñообщений' - many: '{{count}} непрочитанных Ñообщений' - one: 1 непрочитанное Ñообщение - other: '{{count}} непрочитанных Ñообщений' + one: "1 непрочитанное Ñообщение" + few: "{{count}} непрочитанных Ñообщений" + many: "{{count}} непрочитанных Ñообщений" + other: "{{count}} непрочитанных Ñообщений" title: "ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± упоминании @пÑевдонима, ответах на ваши поÑты и темы, ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ Ñ‚.д." none: "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ могут быть загружены." empty: "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ найдены." @@ -1298,17 +1324,17 @@ ru: total_flagged: "вÑего Ñообщений Ñ Ð¶Ð°Ð»Ð¾Ð±Ð°Ð¼Ð¸" mentioned: "{{username}} {{description}}" liked_many: - few: {{username}}, {{username2}} и {{count}} другие {{description}} - many: {{username}}, {{username2}} и {{count}} другие {{description}} - one: {{username}}, {{username2}} и 1 другой {{description}} - other: {{username}}, {{username2}} и {{count}} другие {{description}} + one: "{{username}}, {{username2}} и 1 другой {{description}}" + few: "{{username}}, {{username2}} и {{count}} другие {{description}}" + many: "{{username}}, {{username2}} и {{count}} другие {{description}}" + other: "{{username}}, {{username2}} и {{count}} другие {{description}}" granted_badge: "ЗаÑлужил(а) '{{description}}'" watching_first_post: "ÐÐ¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð° {{description}}" group_message_summary: - few: '{{count}} Ñообщений в вашей группе: {{group_name}} ' - many: '{{count}} Ñообщений в вашей группе: {{group_name}} ' - one: '{{count}} Ñообщение в вашей группе: {{group_name}} ' - other: '{{count}} Ñообщений в вашей группе: {{group_name}} ' + one: "{{count}} Ñообщение в вашей группе: {{group_name}} " + few: "{{count}} Ñообщений в вашей группе: {{group_name}} " + many: "{{count}} Ñообщений в вашей группе: {{group_name}} " + other: "{{count}} Ñообщений в вашей группе: {{group_name}} " popup: mentioned: '{{username}} упомÑнул Ð²Ð°Ñ Ð² "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} упомÑнул Ð²Ð°Ñ Ð² "{{topic}}" - {{site_title}}' @@ -1331,6 +1357,7 @@ ru: uploading: "Загрузка" select_file: "Выбрать файл" image_link: "ÑÑылка, на которую будет указывать ваше изображение" + default_image_alt_text: изображение search: sort_by: "Сортировка" relevance: "По ÑмыÑлу" @@ -1342,11 +1369,12 @@ ru: clear_all: "СброÑить вÑе" too_short: "Слишком короткое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка." result_count: - few: {{count}}{{plus}} результатов Ð´Ð»Ñ {{term}} - many: {{count}}{{plus}} результат Ð´Ð»Ñ {{term}} - one: 1 результат Ð´Ð»Ñ {{term}} - other: {{count}}{{plus}} результатов Ð´Ð»Ñ {{term}} + one: "1 результат Ð´Ð»Ñ {{term}}" + few: "{{count}}{{plus}} результатов Ð´Ð»Ñ {{term}}" + many: "{{count}}{{plus}} результат Ð´Ð»Ñ {{term}}" + other: "{{count}}{{plus}} результатов Ð´Ð»Ñ {{term}}" title: "ПоиÑк по темам, ÑообщениÑм, пÑевдонимам и разделам" + full_page_title: "поиÑк тем или Ñообщений" no_results: "Ðичего не найдено." no_more_results: "Больше ничего не найдено." searching: "ПоиÑк ..." @@ -1425,10 +1453,10 @@ ru: notification_level: "УведомлениÑ" choose_new_category: "Выберите новый раздел Ð´Ð»Ñ Ñтих тем:" selected: - few: Ð’Ñ‹ выбрали {{count}} темы. - many: Ð’Ñ‹ выбрали {{count}} тем. - one: Ð’Ñ‹ выбрали {{count}} тему. - other: Ð’Ñ‹ выбрали {{count}} тем. + one: "Ð’Ñ‹ выбрали {{count}} тему." + few: "Ð’Ñ‹ выбрали {{count}} темы." + many: "Ð’Ñ‹ выбрали {{count}} тем." + other: "Ð’Ñ‹ выбрали {{count}} тем." change_tags: "Заменить теги" append_tags: "Добавить теги" choose_new_tags: "Выберите новые Ñ‚Ñги Ð´Ð»Ñ Ñтих тем:" @@ -1461,12 +1489,13 @@ ru: search: "Больше ничего не найдено." topic: filter_to: - few: '{{count}} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² теме' - many: '{{count}} Ñообщений в теме' - one: 1 Ñообщение в теме - other: '{{count}} Ñообщений в теме' + one: "1 Ñообщение в теме" + few: "{{count}} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² теме" + many: "{{count}} Ñообщений в теме" + other: "{{count}} Ñообщений в теме" create: 'Создать Тему' create_long: 'Создать новую тему' + open_draft: "Открыть черновик" private_message: 'Ðовое личное Ñоощение' archive_message: help: 'ПеремеÑтить Ñообщение в архив' @@ -1480,14 +1509,14 @@ ru: new: 'Ð½Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð°' unread: 'непрочитанно' new_topics: + one: '{{count}} Ð½Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð°' few: '{{count}} новых темы' many: '{{count}} новых тем' - one: '{{count}} Ð½Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð°' other: '{{count}} новых тем' unread_topics: + one: '{{count}} Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°' few: '{{count}} непрочитанные темы' many: '{{count}} непрочитанных тем' - one: '{{count}} Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°' other: '{{count}} непрочитанных тем' title: 'Тема' invalid_access: @@ -1501,25 +1530,25 @@ ru: title: "Тема не найдена" description: "К Ñожалению, Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° не найдена. Возможно, она была удалена модератором." total_unread_posts: - few: у Ð²Ð°Ñ {{count}} непрочитанных ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме - many: у Ð²Ð°Ñ {{count}} непрочитанных ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме - one: у Ð²Ð°Ñ {{count}} непрочитанное Ñообщение в Ñтой теме - other: у Ð²Ð°Ñ {{count}} непрочитанных ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме + one: "у Ð²Ð°Ñ {{count}} непрочитанное Ñообщение в Ñтой теме" + few: "у Ð²Ð°Ñ {{count}} непрочитанных ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме" + many: "у Ð²Ð°Ñ {{count}} непрочитанных ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме" + other: "у Ð²Ð°Ñ {{count}} непрочитанных ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме" unread_posts: - few: у Ð²Ð°Ñ {{count}} непрочитанных Ñтарых ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме - many: у Ð²Ð°Ñ {{count}} непрочитанных Ñтарых Ñообщений в Ñтой теме - one: у Ð²Ð°Ñ {{count}} непрочитанное Ñтарое Ñообщение в Ñтой теме - other: у Ð²Ð°Ñ {{count}} непрочитанных Ñтарых Ñообщений в Ñтой теме + one: "у Ð²Ð°Ñ {{count}} непрочитанное Ñтарое Ñообщение в Ñтой теме" + few: "у Ð²Ð°Ñ {{count}} непрочитанных Ñтарых ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñтой теме" + many: "у Ð²Ð°Ñ {{count}} непрочитанных Ñтарых Ñообщений в Ñтой теме" + other: "у Ð²Ð°Ñ {{count}} непрочитанных Ñтарых Ñообщений в Ñтой теме" new_posts: - few: в Ñтой теме {{count}} новых ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ ÐµÑ‘ поÑледнего проÑмотра вами - many: в Ñтой теме {{count}} новых Ñообщений Ñ ÐµÑ‘ поÑледнего проÑмотра вами - one: в Ñтой теме {{count}} новое Ñообщение Ñ ÐµÑ‘ поÑледнего проÑмотра вами - other: в Ñтой теме {{count}} новых Ñообщений Ñ ÐµÑ‘ поÑледнего проÑмотра вами + one: "в Ñтой теме {{count}} новое Ñообщение Ñ ÐµÑ‘ поÑледнего проÑмотра вами" + few: "в Ñтой теме {{count}} новых ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ ÐµÑ‘ поÑледнего проÑмотра вами" + many: "в Ñтой теме {{count}} новых Ñообщений Ñ ÐµÑ‘ поÑледнего проÑмотра вами" + other: "в Ñтой теме {{count}} новых Ñообщений Ñ ÐµÑ‘ поÑледнего проÑмотра вами" likes: - few: в теме {{count}} лайка - many: в теме {{count}} лайков - one: в теме {{count}} лайк - other: в теме {{count}} лайков + one: "в теме {{count}} лайк" + few: "в теме {{count}} лайка" + many: "в теме {{count}} лайков" + other: "в теме {{count}} лайков" back_to_list: "ВернутьÑÑ Ðº ÑпиÑку тем" options: "Опции темы" show_links: "показать ÑÑылки в теме" @@ -1534,6 +1563,7 @@ ru: jump_reply_down: перейти к более поздним ответам deleted: "Тема удалена" auto_update_input: + none: "Выбор таймфрейма" tomorrow: "Завтра" later_this_week: "Позже на Ñтой неделе" this_weekend: "Ð’ Ñти выходные" @@ -1568,10 +1598,10 @@ ru: auto_reminder: "Вам придёт напоминание об Ñтой теме через %{timeLeft}." auto_close_title: 'ÐаÑтройки Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹' auto_close_immediate: - few: ПоÑледнее Ñообщение в Ñтой теме отправлено %{count} чаÑа назад, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно. - many: ПоÑледнее Ñообщение в Ñтой теме отправлено %{count} чаÑов назад, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно. - one: ПоÑледнее Ñообщение в Ñтой теме отправлено 1 Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно. - other: ПоÑледнее Ñообщение в Ñтой теме отправлено %{count} чаÑов назад, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно. + one: "ПоÑледнее Ñообщение в Ñтой теме отправлено 1 Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно." + few: "ПоÑледнее Ñообщение в Ñтой теме отправлено %{count} чаÑа назад, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно." + many: "ПоÑледнее Ñообщение в Ñтой теме отправлено %{count} чаÑов назад, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно." + other: "ПоÑледнее Ñообщение в Ñтой теме отправлено %{count} чаÑов назад, поÑтому Ð´Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° будет закрыта незамедлительно." timeline: back: "ВернутьÑÑ" back_description: "Перейти к поÑледнему непрочитанному Ñообщению" @@ -1586,6 +1616,7 @@ ru: jump_prompt_of: "из %{count} Ñообщений" jump_prompt_long: "К какому Ñообщению вы хотите перейти?" jump_bottom_with_number: "перейти к Ñообщению %{post_number}" + jump_prompt_or: "или" total: вÑего Ñообщений current: текущее Ñообщение notifications: @@ -1646,6 +1677,7 @@ ru: visible: "Включить в ÑпиÑки" reset_read: "СброÑить Ñчетчики" make_public: "Сделать тему публичной" + make_private: "ÐапиÑать личное Ñообщение" feature: pin: "Закрепить тему" unpin: "Открепить тему" @@ -1678,10 +1710,10 @@ ru: pin_validation: "Чтобы закрепить Ñту тему, требуетÑÑ Ð´Ð°Ñ‚Ð°." not_pinned: "Ð’ разделе {{categoryLink}} нет закрепленных тем." already_pinned: - few: 'Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}' - many: 'Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}' - one: 'Глобально закрепленных тем в разделе {{categoryLink}}: 1' - other: 'Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}' + one: "Глобально закрепленных тем в разделе {{categoryLink}}: 1" + few: "Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}" + many: "Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}" + other: "Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}" pin_globally: "Закрепить Ñту тему вверху вÑех разделов и ÑпиÑков тем до" confirm_pin_globally: "У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть глобально закрепленные темы ({{count}}). Перебор таких тем может оказатьÑÑ Ð½ÐµÐ¿Ñ€Ð¸Ñтным неудобÑтвом Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð² и анонимных читателей. Ð’Ñ‹ уверены, что хотите глобально закрепить еще одну тему?" unpin_globally: "Отменить прикрепление Ñтой темы вверху вÑех разделов и ÑпиÑков тем." @@ -1689,10 +1721,10 @@ ru: global_pin_note: "Пользователи могут открепить тему, каждый Ñам Ð´Ð»Ñ ÑебÑ." not_pinned_globally: "Ðет глобально закрепленных тем." already_pinned_globally: - few: 'Глобально закрепленных тем: {{count}}' - many: 'Глобально закрепленных тем: {{count}}' - one: 'Глобально закрепленных тем: 1' - other: 'Глобально закрепленных тем: {{count}}' + one: "Глобально закрепленных тем: 1" + few: "Глобально закрепленных тем: {{count}}" + many: "Глобально закрепленных тем: {{count}}" + other: "Глобально закрепленных тем: {{count}}" make_banner: "Превратить Ñту тему в объÑвление, которое будет отображатьÑÑ Ð²Ð²ÐµÑ€Ñ…Ñƒ вÑех Ñтраниц." remove_banner: "Убрать тему-объÑвление, которое отображаетÑÑ Ð²Ð²ÐµÑ€Ñ…Ñƒ вÑех Ñтраниц." banner_note: "Пользователи могут закрывать объÑвление, каждый Ñам Ð´Ð»Ñ ÑебÑ, поÑле чего оно больше не будет Ð´Ð»Ñ Ð½Ð¸Ñ… покыватьÑÑ. Только одна тема может быть Ñделана активным объÑвлением в любой момент времени." @@ -1728,10 +1760,10 @@ ru: login_reply: 'Войти и ответить' filters: n_posts: - few: '{{count}} ÑообщениÑ' - many: '{{count}} Ñообщений' - one: '{{count}} Ñообщение' - other: '{{count}} Ñообщений' + one: "{{count}} Ñообщение" + few: "{{count}} ÑообщениÑ" + many: "{{count}} Ñообщений" + other: "{{count}} Ñообщений" cancel: "Отменить фильтр" split_topic: title: "ПеремеÑтить в новую тему" @@ -1739,19 +1771,19 @@ ru: topic_name: "Ðазвание новой темы" error: "Во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñообщений в новую тему возникла ошибка." instructions: - few: Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑÑ‚ÑÑ‚ÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ðµ вами {{count}} ÑообщениÑ. - many: Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑÑ‚ÑÑ‚ÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ðµ вами {{count}} Ñообщений. - one: Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑтитÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ðµ вами {{count}} Ñообщение. - other: Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑÑ‚ÑÑ‚ÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ðµ вами {{count}} Ñообщений. + one: "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑтитÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ðµ вами {{count}} Ñообщение." + few: "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑÑ‚ÑÑ‚ÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ðµ вами {{count}} ÑообщениÑ." + many: "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑÑ‚ÑÑ‚ÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ðµ вами {{count}} Ñообщений." + other: "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ Ñоздадите новую тему и в неё перемеÑÑ‚ÑÑ‚ÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ðµ вами {{count}} Ñообщений." merge_topic: title: "ПеремеÑтить в ÑущеÑтвующую тему" action: "перемеÑтить в ÑущеÑтвующую тему" error: "Во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñообщений в тему возникла ошибка." instructions: - few: ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñти {{count}} ÑообщениÑ. - many: ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñти {{count}} Ñообщений. - one: ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñто {{count}} Ñообщение. - other: ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñти {{count}} Ñообщений. + one: "ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñто {{count}} Ñообщение." + few: "ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñти {{count}} ÑообщениÑ." + many: "ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñти {{count}} Ñообщений." + other: "ПожалуйÑта, выберите тему, в которую вы хотели бы перемеÑтить Ñти {{count}} Ñообщений." merge_posts: title: "Соединить выделенные ÑообщениÑ" action: "Соединить выделенные ÑообщениÑ" @@ -1763,10 +1795,10 @@ ru: label: "Ðовый владелец Ñообщений" placeholder: "пÑевдоним нового владельца" instructions: - few: ПожалуйÑта, выберите нового владельца {{count}} Ñообщений от {{old_user}}. - many: ПожалуйÑта, выберите нового владельца {{count}} Ñообщений от {{old_user}}. - one: ПожалуйÑта, выберите нового владельца {{count}} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ {{old_user}}. - other: ПожалуйÑта, выберите нового владельца {{count}} Ñообщений от {{old_user}}. + one: "ПожалуйÑта, выберите нового владельца {{count}} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ {{old_user}}." + few: "ПожалуйÑта, выберите нового владельца {{count}} Ñообщений от {{old_user}}." + many: "ПожалуйÑта, выберите нового владельца {{count}} Ñообщений от {{old_user}}." + other: "ПожалуйÑта, выберите нового владельца {{count}} Ñообщений от {{old_user}}." change_timestamp: title: "Изменить временную метку..." action: "изменить временную метку" @@ -1778,8 +1810,10 @@ ru: selected: 'выбрано ({{count}})' select_post: label: 'выбрать' + title: 'Добавить Ñообщение в выделение' selected_post: label: 'выбранный' + title: 'Ðажмите, чтобы удалить Ñообщение из выборки' select_replies: label: 'выбрать + ответы' title: 'Добавить запиÑÑŒ и вÑе ответы Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð°' @@ -1791,10 +1825,10 @@ ru: select_all: выбрать вÑе deselect_all: ÑнÑть веÑÑŒ выбор description: - few: Ð’Ñ‹ выбрали {{count}} ÑообщениÑ. - many: Ð’Ñ‹ выбрали {{count}} Ñообщений. one: Ð’Ñ‹ выбрали {{count}} Ñообщение. - other: Ð’Ñ‹ выбрали {{count}} Ñообщений. + few: "Ð’Ñ‹ выбрали {{count}} ÑообщениÑ." + many: "Ð’Ñ‹ выбрали {{count}} Ñообщений." + other: "Ð’Ñ‹ выбрали {{count}} Ñообщений." post: quote_reply: "Цитата" edit_reason: "Причина:" @@ -1808,38 +1842,39 @@ ru: show_full: "Показать полный текÑÑ‚" show_hidden: 'Отобразить Ñкрытое Ñодержимое.' deleted_by_author: - few: (Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑов, еÑли только на Ñообщение не поÑтупит жалоба) - many: (Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑов, еÑли только на Ñообщение не поÑтупит жалоба) - one: (Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑа, еÑли только на Ñообщение не поÑтупит жалоба) - other: (Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑов, еÑли только на Ñообщение не поÑтупит жалоба) + one: "(Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑа, еÑли только на Ñообщение не поÑтупит жалоба)" + few: "(Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑов, еÑли только на Ñообщение не поÑтупит жалоба)" + many: "(Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑов, еÑли только на Ñообщение не поÑтупит жалоба)" + other: "(Ñообщение отозвано автором и будет автоматичеÑки удалено в течение %{count} чаÑов, еÑли только на Ñообщение не поÑтупит жалоба)" + collapse: "Ñвернуть" expand_collapse: "развернуть/Ñвернуть" gap: - few: проÑмотреть {{count}} Ñкрытых ответов - many: проÑмотреть {{count}} Ñкрытых ответов - one: проÑмотреть {{count}} Ñкрытый ответ - other: проÑмотреть {{count}} Ñкрытых ответов + one: "проÑмотреть {{count}} Ñкрытый ответ" + few: "проÑмотреть {{count}} Ñкрытых ответов" + many: "проÑмотреть {{count}} Ñкрытых ответов" + other: "проÑмотреть {{count}} Ñкрытых ответов" unread: "Сообщение не прочитано" has_replies: - few: '{{count}} Ответа' - many: '{{count}} Ответов' - one: '{{count}} Ответ' - other: '{{count}} Ответов' + one: "{{count}} Ответ" + few: "{{count}} Ответа" + many: "{{count}} Ответов" + other: "{{count}} Ответов" has_likes: - few: '{{count}} Ñимпатии' - many: '{{count}} Ñимпатий' - one: '{{count}} ÑимпатиÑ' - other: '{{count}} Ñимпатий' + one: "{{count}} ÑимпатиÑ" + few: "{{count}} Ñимпатии" + many: "{{count}} Ñимпатий" + other: "{{count}} Ñимпатий" has_likes_title: - few: Это Ñообщение понравилоÑÑŒ {{count}} людÑм - many: Это Ñообщение понравилоÑÑŒ {{count}} людÑм - one: Это Ñообщение понравилоÑÑŒ {{count}} человеку - other: Это Ñообщение понравилоÑÑŒ {{count}} людÑм + one: "Это Ñообщение понравилоÑÑŒ {{count}} человеку" + few: "Это Ñообщение понравилоÑÑŒ {{count}} людÑм" + many: "Это Ñообщение понравилоÑÑŒ {{count}} людÑм" + other: "Это Ñообщение понравилоÑÑŒ {{count}} людÑм" has_likes_title_only_you: "Вам понравилоÑÑŒ Ñто Ñообщение" has_likes_title_you: - few: Вам и ещё {{count}} людÑм понравилоÑÑŒ Ñто Ñообщение - many: Вам и ещё {{count}} людÑм понравилоÑÑŒ Ñто Ñообщение - one: Вам и ещё 1 человеку понравилоÑÑŒ Ñто Ñообщение - other: Вам и ещё {{count}} людÑм понравилоÑÑŒ Ñто Ñообщение + one: "Вам и ещё 1 человеку понравилоÑÑŒ Ñто Ñообщение" + few: "Вам и ещё {{count}} людÑм понравилоÑÑŒ Ñто Ñообщение" + many: "Вам и ещё {{count}} людÑм понравилоÑÑŒ Ñто Ñообщение" + other: "Вам и ещё {{count}} людÑм понравилоÑÑŒ Ñто Ñообщение" errors: create: "К Ñожалению, не удалоÑÑŒ Ñоздать Ñообщение из-за ошибки. Попробуйте ещё раз." edit: "К Ñожалению, не удалоÑÑŒ изменить Ñообщение. Попробуйте ещё раз." @@ -1879,15 +1914,15 @@ ru: delete_replies: confirm: "Ð’Ñ‹ также хотите удалить ответы на Ñтот поÑÑ‚?" direct_replies: - few: Да, и {{count}} прÑмых ответов - many: Да, и {{count}} прÑмых ответов - one: Да, и 1 прÑмой ответ - other: Да, и {{count}} прÑмой ответ + one: "Да, и 1 прÑмой ответ" + few: "Да, и {{count}} прÑмых ответов" + many: "Да, и {{count}} прÑмых ответов" + other: "Да, и {{count}} прÑмой ответ" all_replies: - few: Да, и вÑе {{count}} ответа - many: Да, и вÑе {{count}} ответы - one: Да, и 1 ответ - other: Да, и вÑе {{count}} ответы + one: "Да, и 1 ответ" + few: "Да, и вÑе {{count}} ответа" + many: "Да, и вÑе {{count}} ответы" + other: "Да, и вÑе {{count}} ответы" admin: "дейÑÑ‚Ð²Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора над Ñообщением" wiki: "Сделать вики-Ñообщением" unwiki: "Отменить вики-Ñообщение" @@ -1896,6 +1931,7 @@ ru: rebake: "Обработать Ñообщение заново - HTML" unhide: "Снова Ñделать видимым" change_owner: "Изменить владельца" + grant_badge: "Выдать награду" actions: flag: 'Жалоба' undo: @@ -1904,7 +1940,6 @@ ru: inappropriate: "Отозвать жалобу" bookmark: "Удалить из закладок" like: "Больше не нравитÑÑ" - vote: "Отозвать голоÑ" people: off_topic: "отметили Ñто как \"не по теме\"" spam: "отмечено как Ñпам" @@ -1914,11 +1949,10 @@ ru: bookmark: "добавить закладку" like: "понравилоÑÑŒ Ñто" like_capped: - few: и {{count}} другим понравилоÑÑŒ - many: и {{count}} другим понравилоÑÑŒ - one: и {{count}} понравилоÑÑŒ - other: и {{count}} другим понравилоÑÑŒ - vote: "проголоÑовал за Ñто" + one: "и {{count}} понравилоÑÑŒ" + few: "и {{count}} другим понравилоÑÑŒ" + many: "и {{count}} другим понравилоÑÑŒ" + other: "и {{count}} другим понравилоÑÑŒ" by_you: off_topic: "Помечена вами как оффтопик" spam: "Помечена вами как Ñпам" @@ -1927,84 +1961,73 @@ ru: notify_user: "Ð’Ñ‹ отправили Ñообщение Ñтому пользователю" bookmark: "Ð’Ñ‹ добавили Ñообщение в закладки" like: "Вам нравитÑÑ" - vote: "Ð’Ñ‹ проголоÑовали за данное Ñообщение" by_you_and_others: off_topic: - few: Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как не отноÑÑщееÑÑ Ðº теме - many: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме - one: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме - other: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме + one: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме" + few: "Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как не отноÑÑщееÑÑ Ðº теме" + many: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме" + other: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме" spam: - few: Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как Ñпам - many: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как Ñпам - one: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как Ñпам - other: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как Ñпам + one: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как Ñпам" + few: "Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как Ñпам" + many: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как Ñпам" + other: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как Ñпам" inappropriate: - few: Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как неумеÑтное - many: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как неумеÑтное - one: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как неумеÑтное - other: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как неумеÑтное + one: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как неумеÑтное" + few: "Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как неумеÑтное" + many: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как неумеÑтное" + other: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как неумеÑтное" notify_moderators: - few: Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как требующее модерации - many: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как требующее модерации - one: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как требующее модерации - other: Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как требующее модерации + one: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как требующее модерации" + few: "Ð’Ñ‹ и ещё {{count}} человека отметили Ñто как требующее модерации" + many: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как требующее модерации" + other: "Ð’Ñ‹ и ещё {{count}} человек отметили Ñто как требующее модерации" notify_user: - few: Ð’Ñ‹ и {{count}} другие люди отправили Ñообщение Ñтому пользователю - many: Ð’Ñ‹ и {{count}} другие люди отправили Ñообщение Ñтому пользователю - one: Ð’Ñ‹ и 1 пользователь отправили Ñообщение Ñтому пользователю - other: Ð’Ñ‹ и {{count}} другие люди отправили Ñообщение Ñтому пользователю + one: "Ð’Ñ‹ и 1 пользователь отправили Ñообщение Ñтому пользователю" + few: "Ð’Ñ‹ и {{count}} другие люди отправили Ñообщение Ñтому пользователю" + many: "Ð’Ñ‹ и {{count}} другие люди отправили Ñообщение Ñтому пользователю" + other: "Ð’Ñ‹ и {{count}} другие люди отправили Ñообщение Ñтому пользователю" bookmark: - few: Ð’Ñ‹ и ещё {{count}} человека добавили Ñто Ñообщение в закладки - many: Ð’Ñ‹ и ещё {{count}} человек добавили Ñто Ñообщение в закладки - one: Ð’Ñ‹ и ещё {{count}} человек добавили Ñто Ñообщение в закладки - other: Ð’Ñ‹ и ещё {{count}} человек добавили Ñто Ñообщение в закладки + one: "Ð’Ñ‹ и ещё {{count}} человек добавили Ñто Ñообщение в закладки" + few: "Ð’Ñ‹ и ещё {{count}} человека добавили Ñто Ñообщение в закладки" + many: "Ð’Ñ‹ и ещё {{count}} человек добавили Ñто Ñообщение в закладки" + other: "Ð’Ñ‹ и ещё {{count}} человек добавили Ñто Ñообщение в закладки" like: - few: Вам и ещё {{count}} людÑм понравилоÑÑŒ - many: Вам и ещё {{count}} людÑм понравилоÑÑŒ - one: Вам и ещё {{count}} человеку понравилоÑÑŒ - other: Вам и ещё {{count}} людÑм понравилоÑÑŒ - vote: - few: Ð’Ñ‹ и ещё {{count}} человека проголоÑовали за Ñто Ñообщение - many: Ð’Ñ‹ и ещё {{count}} человек проголоÑовали за Ñто Ñообщение - one: Ð’Ñ‹ и ещё {{count}} человек проголоÑовали за Ñто Ñообщение - other: Ð’Ñ‹ и ещё {{count}} человек проголоÑовали за Ñто Ñообщение + one: "Вам и ещё {{count}} человеку понравилоÑÑŒ" + few: "Вам и ещё {{count}} людÑм понравилоÑÑŒ" + many: "Вам и ещё {{count}} людÑм понравилоÑÑŒ" + other: "Вам и ещё {{count}} людÑм понравилоÑÑŒ" by_others: off_topic: - few: '{{count}} человека отметили Ñто как не отноÑÑщееÑÑ Ðº теме' - many: '{{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме' - one: '{{count}} человек отметил Ñто как не отноÑÑщееÑÑ Ðº теме' - other: '{{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме' + one: "{{count}} человек отметил Ñто как не отноÑÑщееÑÑ Ðº теме" + few: "{{count}} человека отметили Ñто как не отноÑÑщееÑÑ Ðº теме" + many: "{{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме" + other: "{{count}} человек отметили Ñто как не отноÑÑщееÑÑ Ðº теме" spam: - few: '{{count}} человека отметили Ñто как Ñпам' - many: '{{count}} человек отметили Ñто как Ñпам' - one: '{{count}} человек отметил Ñто как Ñпам' - other: '{{count}} человек отметили Ñто как Ñпам' + one: "{{count}} человек отметил Ñто как Ñпам" + few: "{{count}} человека отметили Ñто как Ñпам" + many: "{{count}} человек отметили Ñто как Ñпам" + other: "{{count}} человек отметили Ñто как Ñпам" inappropriate: - few: '{{count}} человек отметили Ñто как неумеÑтное' - many: '{{count}} человек отметили Ñто как неумеÑтное' - one: '{{count}} человек отметил Ñто как неумеÑтное' - other: '{{count}} человек отметили Ñто как неумеÑтное' + one: "{{count}} человек отметил Ñто как неумеÑтное" + few: "{{count}} человек отметили Ñто как неумеÑтное" + many: "{{count}} человек отметили Ñто как неумеÑтное" + other: "{{count}} человек отметили Ñто как неумеÑтное" notify_moderators: - few: '{{count}} человека отметили Ñто как требующее модерации' - many: '{{count}} человек отметили Ñто как требующее модерации' - one: '{{count}} человек отметил Ñто как требующее модерации' - other: '{{count}} человек отметили Ñто как требующее модерации' + one: "{{count}} человек отметил Ñто как требующее модерации" + few: "{{count}} человека отметили Ñто как требующее модерации" + many: "{{count}} человек отметили Ñто как требующее модерации" + other: "{{count}} человек отметили Ñто как требующее модерации" bookmark: - few: '{{count}} человека добавили Ñто Ñообщение в закладки' - many: '{{count}} человек добавили Ñто Ñообщение в закладки' - one: '{{count}} человек добавил Ñто Ñообщение в закладки' - other: '{{count}} человек добавили Ñто Ñообщение в закладки' + one: "{{count}} человек добавил Ñто Ñообщение в закладки" + few: "{{count}} человека добавили Ñто Ñообщение в закладки" + many: "{{count}} человек добавили Ñто Ñообщение в закладки" + other: "{{count}} человек добавили Ñто Ñообщение в закладки" like: - few: '{{count}} людÑм понравилоÑÑŒ' - many: '{{count}} людÑм понравилоÑÑŒ' - one: '{{count}} человеку понравилоÑÑŒ' - other: '{{count}} людÑм понравилоÑÑŒ' - vote: - few: '{{count}} человека проголоÑовали за Ñто Ñообщение' - many: '{{count}} человек проголоÑовали за Ñто Ñообщение' - one: '{{count}} человек проголоÑовал за Ñто Ñообщение' - other: '{{count}} человек проголоÑовали за Ñто Ñообщение' + one: "{{count}} человеку понравилоÑÑŒ" + few: "{{count}} людÑм понравилоÑÑŒ" + many: "{{count}} людÑм понравилоÑÑŒ" + other: "{{count}} людÑм понравилоÑÑŒ" revisions: controls: first: "ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ" @@ -2042,7 +2065,6 @@ ru: can: 'может… ' none: '(вне раздела)' all: 'Ð’Ñе разделы' - choose: 'Выберете раздел…' edit: 'изменить' edit_long: "Изменить" view: 'ПроÑмотр тем по разделам' @@ -2088,7 +2110,6 @@ ru: email_in_disabled_click: 'активируйте наÑтройку "email in".' show_subcategory_list: "Показывать ÑпиÑок подразделов над ÑпиÑком тем в Ñтом разделе." num_featured_topics: "КоличеÑтво тем на Ñтранице разделов" - all_topics_wiki: "Создавать новые темы в вики-формате по умолчанию." subcategory_list_style: "Стиль ÑпиÑка подразделов:" sort_order: "ПорÑдок Ñортировки тем:" default_view: "Вид ÑпиÑка тем по умолчанию:" @@ -2096,7 +2117,6 @@ ru: edit_permissions: "Изменить права доÑтупа" add_permission: "Добавить права" this_year: "за год" - position: "меÑтоположение" default_position: "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿Ð¾ умолчанию" position_disabled: "Разделы будут показаны в порÑдке активноÑти. Чтобы наÑтроить порÑдок разделов," position_disabled_click: 'включите наÑтройку "fixed category positions".' @@ -2158,20 +2178,20 @@ ru: custom_placeholder_notify_moderators: "ПоÑÑните Ñуть проблемы: на что нам Ñледует обратить внимание. ПредоÑтавьте ÑоответÑтвующие ÑÑылки, еÑли Ñто возможно." custom_message: at_least: - few: Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимвола - many: Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов - one: Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ 1 Ñимвол - other: Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов + one: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ 1 Ñимвол" + few: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимвола" + many: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов" + other: "Введите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов" more: - few: Еще Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимвола... - many: Еще Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов... - one: Еще 1 Ñимвол... - other: Еще Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов... + one: "Еще 1 Ñимвол..." + few: "Еще Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимвола..." + many: "Еще Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов..." + other: "Еще Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{count}} Ñимволов..." left: - few: ОÑталоÑÑŒ не более {{count}} Ñимволов - many: ОÑталоÑÑŒ не более {{count}} Ñимволов - one: ОÑталоÑÑŒ не более 1 Ñимвола - other: ОÑталоÑÑŒ не более {{count}} Ñимволов + one: "ОÑталоÑÑŒ не более 1 Ñимвола" + few: "ОÑталоÑÑŒ не более {{count}} Ñимволов" + many: "ОÑталоÑÑŒ не более {{count}} Ñимволов" + other: "ОÑталоÑÑŒ не более {{count}} Ñимволов" flagging_topic: title: "СпаÑибо за помощь в поддержании порÑдка!" action: "ПожаловатьÑÑ Ð½Ð° тему" @@ -2182,17 +2202,17 @@ ru: links_title: "ПопулÑрные ÑÑылки" links_shown: "показать больше ÑÑылок..." clicks: - few: '%{count} клика' - many: '%{count} кликов' - one: 1 клик - other: '%{count} кликов' + one: "1 клик" + few: "%{count} клика" + many: "%{count} кликов" + other: "%{count} кликов" post_links: about: "gjrfpf" title: - few: ещё %{count} - many: ещё %{count} - one: ещё 1 - other: ещё %{count} + one: "ещё 1" + few: "ещё %{count}" + many: "ещё %{count}" + other: "ещё %{count}" topic_statuses: warning: help: "Это официальное предупреждение." @@ -2226,30 +2246,30 @@ ru: original_post: "Ðачальное Ñообщение" views: "ПроÑм." views_lowercase: - few: проÑмотров - many: проÑмотров - one: проÑмотр - other: проÑмотров + one: "проÑмотр" + few: "проÑмотров" + many: "проÑмотров" + other: "проÑмотров" replies: "Ответов" views_long: - few: тема проÑмотрена {{number}} раза - many: тема проÑмотрена {{number}} раз - one: тема проÑмотрена 1 раз - other: тема проÑмотрена {{number}} раз + one: "тема проÑмотрена 1 раз" + few: "тема проÑмотрена {{number}} раза" + many: "тема проÑмотрена {{number}} раз" + other: "тема проÑмотрена {{number}} раз" activity: "ÐктивноÑть" likes: "Ðрав." likes_lowercase: - few: Ñимпатий - many: Ñимпатий - one: ÑÐ¸Ð¼Ð¿Ð°Ñ‚Ð¸Ñ - other: Ñимпатий + one: "ÑимпатиÑ" + few: "Ñимпатий" + many: "Ñимпатий" + other: "Ñимпатий" likes_long: "{{number}} лайков в теме" users: "Пользователи" users_lowercase: - few: Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - many: Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - one: пользователь - other: Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ + one: "пользователь" + few: "пользователÑ" + many: "пользователÑ" + other: "пользователÑ" category_title: "Раздел" history: "ИÑториÑ" changed_by: "автором {{author}}" @@ -2263,10 +2283,10 @@ ru: latest: title: "ПоÑледние" title_with_count: - few: ПоÑледние ({{count}}) - many: ПоÑледние ({{count}}) - one: ПоÑледние (1) - other: ПоÑледние ({{count}}) + one: "ПоÑледние (1)" + few: "ПоÑледние ({{count}})" + many: "ПоÑледние ({{count}})" + other: "ПоÑледние ({{count}})" help: "темы Ñ Ð½ÐµÐ´Ð°Ð²Ð½Ð¸Ð¼Ð¸ ÑообщениÑми" hot: title: "ПопулÑрные" @@ -2284,29 +2304,29 @@ ru: unread: title: "Ðепрочитанные" title_with_count: - few: Ðепрочитанные ({{count}}) - many: Ðепрочитанные ({{count}}) - one: Ðепрочитанные ({{count}}) - other: Ðепрочитанные ({{count}}) + one: "Ðепрочитанные ({{count}})" + few: "Ðепрочитанные ({{count}})" + many: "Ðепрочитанные ({{count}})" + other: "Ðепрочитанные ({{count}})" help: "наблюдаемые или отÑлеживаемые темы Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ‹Ð¼Ð¸ ÑообщениÑми" lower_title_with_count: - few: '{{count}} непрочитанных' - many: '{{count}} непрочитанных' - one: '{{count}} непрочитаннаÑ' - other: '{{count}} непрочитанных' + one: "{{count}} непрочитаннаÑ" + few: "{{count}} непрочитанных" + many: "{{count}} непрочитанных" + other: "{{count}} непрочитанных" new: lower_title_with_count: - few: '{{count}} новых' - many: '{{count}} новых' - one: '{{count}} новаÑ' - other: '{{count}} новых' + one: "{{count}} новаÑ" + few: "{{count}} новых" + many: "{{count}} новых" + other: "{{count}} новых" lower_title: "новые" title: "Ðовые" title_with_count: - few: Ðовые ({{count}}) - many: Ðовые ({{count}}) - one: Ðовые ({{count}}) - other: Ðовые ({{count}}) + one: "Ðовые ({{count}})" + few: "Ðовые ({{count}})" + many: "Ðовые ({{count}})" + other: "Ðовые ({{count}})" help: "темы, Ñозданные за поÑледние неÑколько дней" posted: title: "Мои" @@ -2317,10 +2337,10 @@ ru: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - many: '{{categoryName}} ({{count}})' - one: '{{categoryName}} ({{count}})' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} ({{count}})" + few: "{{categoryName}} ({{count}})" + many: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "поÑледние темы в разделе {{categoryName}}" top: title: "ОбÑуждаемые" @@ -2408,30 +2428,30 @@ ru: print: 'ctrl+p Печатать тему' badges: earned_n_times: - few: Заработали Ñту награду %{count} раз - many: Заработали Ñту награду %{count} раз - one: Заработал Ñту награду 1 раз - other: Заработали Ñту награду %{count} раз + one: "Заработал Ñту награду 1 раз" + few: "Заработали Ñту награду %{count} раз" + many: "Заработали Ñту награду %{count} раз" + other: "Заработали Ñту награду %{count} раз" granted_on: "Выдана %{date}" others_count: "Другие Ñ Ñтой наградой (%{count})" title: Ðаграды allow_title: "Ð’Ñ‹ можете иÑпользовать Ñту награду в качеÑтве титула." multiple_grant: "Ð’Ñ‹ можете получить её неÑколько раз" badge_count: - few: '%{count} наград' - many: '%{count} наград' - one: 1 награда - other: '%{count} наград' + one: "1 награда" + few: "%{count} наград" + many: "%{count} наград" + other: "%{count} наград" more_badges: - few: + ещё %{count} - many: + ещё %{count} - one: ещё +1 - other: + ещё %{count} + one: "ещё +1" + few: "+ ещё %{count}" + many: "+ ещё %{count}" + other: "+ ещё %{count}" granted: - few: выдано %{count} - many: выдано %{count} - one: выдано 1 - other: выдано %{count} + one: "выдано 1" + few: "выдано %{count}" + many: "выдано %{count}" + other: "выдано %{count}" select_badge_for_title: ИÑпользовать награду в качеÑтве Вашего титула none: "(нет)" successfully_granted: "Ðаграда %{badge} уÑпешно приÑвоена %{username}" @@ -2465,10 +2485,10 @@ ru: choose_for_topic: "Выберите теги Ð´Ð»Ñ Ñтой темы (опционально)" delete_tag: "Удалить тег" delete_confirm: - few: Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из {{count}} топиков, которым он приÑвоен? - many: Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из {{count}} топиков, которым он приÑвоен? - one: Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из 1 топика, которому он приÑвоен? - other: Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из {{count}} топиков, которым он приÑвоен? + one: "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из 1 топика, которому он приÑвоен?" + few: "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из {{count}} топиков, которым он приÑвоен?" + many: "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из {{count}} топиков, которым он приÑвоен?" + other: "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг и удалить его из {{count}} топиков, которым он приÑвоен?" delete_confirm_no_topics: "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот Ñ‚Ñг?" rename_tag: "Редактировать тег" rename_instructions: "Выберите новое название тега:" @@ -2507,6 +2527,7 @@ ru: save: "Сохранить" delete: "Удалить" confirm_delete: "Ð’Ñ‹ уверены, что хотите удалить Ñту группу тегов?" + everyone_can_use: "Ð’Ñе могут иÑпользовать теги" visible_only_to_staff: "Теги видны только перÑоналу" topics: none: @@ -2542,6 +2563,8 @@ ru: admin: title: 'Discourse Admin' moderator: 'Модератор' + reports: + title: "СпиÑок доÑтупных отчетов" dashboard: title: "Ðдминка" last_updated: "ПоÑледнее обновление ÑтатиÑтики:" @@ -2574,6 +2597,9 @@ ru: page_views: "ПроÑмотров Страниц" page_views_short: "ПроÑмотров" show_traffic_report: "Раширенный отчет по трафику" + all_reports: "Ð’Ñе отчеты" + general_tab: "ОÑновные" + disabled: Отключено reports: today: "СегоднÑ" yesterday: "Вчера" @@ -2629,15 +2655,15 @@ ru: suspend_user: "Заблокировать пользователÑ" suspend_user_title: "Заблокировать Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð·Ð° Ñто Ñообщение" replies: - few: '[%{count} ответов]' - many: '[%{count} ответов]' - one: '[1 ответ]' - other: '[%{count} ответов]' + one: "[1 ответ]" + few: "[%{count} ответов]" + many: "[%{count} ответов]" + other: "[%{count} ответов]" delete_replies: - few: Также удалите %{count} ответов на Ñтот поÑÑ‚? - many: Также удалите %{count} ответов на Ñтот поÑÑ‚? - one: Также удалите %{count} ответ на Ñтот поÑÑ‚? - other: Также удалите %{count} ответов на Ñтот поÑÑ‚? + one: "Также удалите %{count} ответ на Ñтот поÑÑ‚?" + few: "Также удалите %{count} ответов на Ñтот поÑÑ‚?" + many: "Также удалите %{count} ответов на Ñтот поÑÑ‚?" + other: "Также удалите %{count} ответов на Ñтот поÑÑ‚?" dispositions: agreed: "принÑто" disagreed: "отклонено" @@ -2668,8 +2694,16 @@ ru: notify_user: "перÑональный" notify_moderators: "перÑональный" groups: + new: + title: "ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" manage: + interaction: + visibility: ВидимоÑть + visibility_levels: + public: "Ð’Ñе" + members: "Владельцы группы, учаÑтники и админиÑтраторы" membership: + trust_level: Уровень Ð”Ð¾Ð²ÐµÑ€Ð¸Ñ automatic_membership_email_domains: "Пользователи, зарегиÑтрированные c адреÑом Ñлектронной почты, который точно Ñовпадает Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼ в Ñтом ÑпиÑке, будут автоматичеÑки добавлены в Ñту группу: " primary: "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" no_primary: "(нет оÑновной группы)" @@ -2753,15 +2787,15 @@ ru: none: "Ðет ÑвÑзанных Ñобытий." redeliver: "Возврат" incoming: - few: '{{count}} новых ÑобытиÑ.' - many: '{{count}} новых Ñобытий.' - one: ЕÑть новое Ñобытие. - other: '{{count}} новых Ñобытий.' + one: "ЕÑть новое Ñобытие." + few: "{{count}} новых ÑобытиÑ." + many: "{{count}} новых Ñобытий." + other: "{{count}} новых Ñобытий." completed_in: - few: ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· {{count}} Ñекунд. - many: ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· {{count}} Ñекунд. - one: ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· 1 Ñекунду. - other: ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· {{count}} Ñекунд. + one: "ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· 1 Ñекунду." + few: "ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· {{count}} Ñекунд." + many: "ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· {{count}} Ñекунд." + other: "ЗавершитÑÑ Ñ‡ÐµÑ€ÐµÐ· {{count}} Ñекунд." request: "ЗапроÑ" response: "Ответ" redeliver_confirm: "Ð’Ñ‹ уверены, что хотите повторно отправить теже Ñамые данные?" @@ -2789,6 +2823,7 @@ ru: change_settings: "ÐаÑтроить" change_settings_short: "ÐаÑтройки" howto: "Как уÑтановить плагин?" + official: "Официальный плагин" backups: title: "Резервные копии" menu: @@ -2916,18 +2951,18 @@ ru: import_file_tip: "файл ÑÑ‚Ð¸Ð»Ñ .dcstyle.json" about_theme: "О Ñтиле" license: "ЛицензиÑ" - component_of: "Стиль Ñлужит компонентом длÑ:" update_to_latest: "Обновить" check_for_updates: "Проверить обновлениÑ" updating: "ОбновлÑÑŽ..." up_to_date: "Стиль текущей верÑии, поÑледнÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°:" add: "Добавить" theme_settings: "ÐаÑтройки темы" + no_settings: "Эта тема не имеет наÑтроек." commits_behind: - few: Тема находитÑÑ Ð½Ð° {{count}} коммитов Ñзади! - many: Тема находитÑÑ Ð½Ð° {{count}} коммитов Ñзади! - one: Тема находитÑÑ Ð½Ð° 1 коммит Ñзади! - other: Тема находитÑÑ Ð½Ð° {{count}} коммитов Ñзади! + one: "Тема находитÑÑ Ð½Ð° 1 коммит Ñзади!" + few: "Тема находитÑÑ Ð½Ð° {{count}} коммитов Ñзади!" + many: "Тема находитÑÑ Ð½Ð° {{count}} коммитов Ñзади!" + other: "Тема находитÑÑ Ð½Ð° {{count}} коммитов Ñзади!" scss: text: "CSS" title: "Введите CSS; допуÑкаютÑÑ Ð²Ñе Ñтили CSS и SCSS" @@ -3056,7 +3091,6 @@ ru: address_placeholder: "e-mail адреÑ" type_placeholder: "дайджеÑÑ‚, подпиÑка..." reply_key_placeholder: "Ключ ответа" - skipped_reason_placeholder: "Причина" moderation_history: performed_by: "Выполнено пользователем " no_results: "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ð¸ недоÑтупна." @@ -3194,10 +3228,10 @@ ru: clear_filter: "ОчиÑтить" show_words: "показать Ñлова" word_count: - few: '%{count}Ñлова' - many: '%{count}Ñлов' - one: 1 Ñлово - other: '%{count}Ñлов' + one: "1 Ñлово" + few: "%{count}Ñлова" + many: "%{count}Ñлов" + other: "%{count}Ñлов" actions: block: 'Заблокировать' censor: 'Цензура' @@ -3239,15 +3273,15 @@ ru: suspect: 'Подозрительные' approved: "Подтвердить?" approved_selected: - few: подтвердить пользователей ({{count}}) - many: одобрить пользователей ({{count}}) - one: подтвердить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - other: одобрить пользователей ({{count}}) + one: "подтвердить пользователÑ" + few: "подтвердить пользователей ({{count}})" + many: "одобрить пользователей ({{count}})" + other: "одобрить пользователей ({{count}})" reject_selected: - few: отклонить пользователей ({{count}}) - many: отклонить пользователей ({{count}}) - one: отклонить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - other: отклонить пользователей ({{count}}) + one: "отклонить пользователÑ" + few: "отклонить пользователей ({{count}})" + many: "отклонить пользователей ({{count}})" + other: "отклонить пользователей ({{count}})" titles: active: 'Ðктивные пользователи' new: 'Ðовые пользователи' @@ -3264,15 +3298,15 @@ ru: suspended: 'Замороженные пользователи' suspect: 'Подозрительные пользователи' reject_successful: - few: УÑпешно отклонены %{count} пользователÑ. - many: УÑпешно отклонены %{count} пользователей. - one: УÑпешно отклонён %{count} пользователь. - other: УÑпешно отклонены %{count} пользователей. + one: "УÑпешно отклонён %{count} пользователь." + few: "УÑпешно отклонены %{count} пользователÑ." + many: "УÑпешно отклонены %{count} пользователей." + other: "УÑпешно отклонены %{count} пользователей." reject_failures: - few: Ðе удалоÑÑŒ отклонить %{count} пользователей. - many: Ðе удалоÑÑŒ отклонить %{count} пользователей. - one: Ðе удалоÑÑŒ отклонить %{count} пользователÑ. - other: Ðе удалоÑÑŒ отклонить %{count} пользователей. + one: "Ðе удалоÑÑŒ отклонить %{count} пользователÑ." + few: "Ðе удалоÑÑŒ отклонить %{count} пользователей." + many: "Ðе удалоÑÑŒ отклонить %{count} пользователей." + other: "Ðе удалоÑÑŒ отклонить %{count} пользователей." not_verified: "Ðе проверенные" check_email: title: "Открыть e-mail Ñтого пользователÑ" @@ -3357,20 +3391,20 @@ ru: delete_forbidden_because_staff: "ÐдминиÑтраторы и модераторы не могут быть удалены" delete_posts_forbidden_because_staff: "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов и модераторов." delete_forbidden: - few: Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней не могут быть удалены.) - many: Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней не могут быть удалены.) - one: Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} Ð´Ð½Ñ Ð½Ðµ могут быть удалены.) - other: Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней не могут быть удалены.) + one: "Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} Ð´Ð½Ñ Ð½Ðµ могут быть удалены.)" + few: "Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней не могут быть удалены.)" + many: "Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней не могут быть удалены.)" + other: "Пользователи не могут быть удалены, еÑли у них еÑть ÑообщениÑ. Перед удалением Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ вÑе его ÑообщениÑ. (Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней не могут быть удалены.)" cant_delete_all_posts: - few: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней. (ÐаÑтройка delete_user_max_post_age.) - many: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней. (ÐаÑтройка delete_user_max_post_age.) - one: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} днÑ. (ÐаÑтройка delete_user_max_post_age.) - other: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней. (ÐаÑтройка delete_user_max_post_age.) + one: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} днÑ. (ÐаÑтройка delete_user_max_post_age.)" + few: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней. (ÐаÑтройка delete_user_max_post_age.)" + many: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней. (ÐаÑтройка delete_user_max_post_age.)" + other: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ. Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтарше %{count} дней. (ÐаÑтройка delete_user_max_post_age.)" cant_delete_all_too_many_posts: - few: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} Ñообщений. (ÐаÑтройка delete_all_posts_max.) - many: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} Ñообщений. (ÐаÑтройка delete_all_posts_max.) - one: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} ÑообщениÑ. (ÐаÑтройка delete_all_posts_max.) - other: Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} Ñообщений. (ÐаÑтройка delete_all_posts_max.) + one: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} ÑообщениÑ. (ÐаÑтройка delete_all_posts_max.)" + few: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} Ñообщений. (ÐаÑтройка delete_all_posts_max.)" + many: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} Ñообщений. (ÐаÑтройка delete_all_posts_max.)" + other: "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе ÑообщениÑ, потому что у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÐµÐµ %{count} Ñообщений. (ÐаÑтройка delete_all_posts_max.)" delete_confirm: "Ð’Ñ‹ УВЕРЕÐЫ, что хотите удалить Ñтого пользователÑ? Это дейÑтвие необратимо!" delete_and_block: "Удалить и заблокировать Ñтот e-mail и IP адреÑ" delete_dont_block: "Только удалить" @@ -3411,10 +3445,10 @@ ru: tl3_requirements: title: "Ð¢Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ 3 ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ" table_title: - few: 'За поÑледние %{count} дней:' - many: 'За поÑледние %{count} дней:' - one: 'За поÑледний день:' - other: 'За поÑледние %{count} дней:' + one: "За поÑледний день:" + few: "За поÑледние %{count} дней:" + many: "За поÑледние %{count} дней:" + other: "За поÑледние %{count} дней:" value_heading: "Значение" requirement_heading: "Требование" visits: "ПоÑещений" @@ -3491,6 +3525,7 @@ ru: site_settings: title: 'ÐаÑтройки' no_results: "Ðичего не найдено." + more_than_30_results: "ЕÑть более чем 30 результатов. Уточните параметры поиÑка или выберите категорию." clear_filter: "ОчиÑтить" add_url: "Добавить URL" add_host: "добавить хоÑÑ‚" @@ -3580,10 +3615,10 @@ ru: text: "Обнаружены неÑущеÑтвующие примеры выдачи наград. Это может произойти, когда Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ неÑущеÑтвующие идентификаторы ID пользователей или Ñообщений. Это может привеÑти к неожиданным проблемам Ñо временем, поÑтому внимательно проверьте ваш запроÑ." no_grant_count: "Ðет наград Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ñ‡Ð¸." grant_count: - few: %{count} наград будут выданы. - many: %{count} наград будут выданы. - one: Будет выдана %{count} награда. - other: %{count} наград будут выданы. + one: "Будет выдана %{count} награда." + few: "%{count} наград будут выданы." + many: "%{count} наград будут выданы." + other: "%{count} наград будут выданы." sample: "Пример:" grant: with: "%{username}" @@ -3650,10 +3685,10 @@ ru: uploading: "Загрузка..." quit: "Может быть позже" staff_count: - few: Ð’ вашем ÑообщеÑтве %{count} Ñотрудника, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ. - many: Ð’ вашем ÑообщеÑтве %{count} Ñотрудников, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ. - one: Ð’ вашем ÑообщеÑтве 1 Ñотрудник (Ñто вы). - other: Ð’ вашем ÑообщеÑтве %{count} Ñотрудников, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ. + one: "Ð’ вашем ÑообщеÑтве 1 Ñотрудник (Ñто вы)." + few: "Ð’ вашем ÑообщеÑтве %{count} Ñотрудника, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ." + many: "Ð’ вашем ÑообщеÑтве %{count} Ñотрудников, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ." + other: "Ð’ вашем ÑообщеÑтве %{count} Ñотрудников, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ." invites: add_user: "добавить" none_added: "Ð’Ñ‹ ещё не приглаÑили Ñотрудников. Ð’Ñ‹ уверены, что хотите продолжить?" @@ -3661,3 +3696,6 @@ ru: admin: "ÐдминиÑтратор" moderator: "Модератор" regular: "ПоÑтоÑнный Пользователь" + previews: + share_button: "ПоделитьÑÑ" + reply_button: "Ответить" diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index 960e214035..32473a83db 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -16,9 +16,9 @@ sk: format: '%n %u' units: byte: + one: bajt few: bajtov many: bajtov - one: bajt other: bajtov gb: GB kb: KB @@ -45,106 +45,106 @@ sk: tiny: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - many: < %{count}s - one: < 1s - other: < %{count}s + one: "< 1s" + few: "< %{count}s" + many: "< %{count}s" + other: "< %{count}s" x_seconds: - few: 1s - many: '%{count}s' - one: 1s - other: '%{count}s' + one: "1s" + few: "1s" + many: "%{count}s" + other: "%{count}s" less_than_x_minutes: - few: < 1m - many: < %{count}m - one: < 1m - other: < %{count}m + one: "< 1m" + few: "< 1m" + many: "< %{count}m" + other: "< %{count}m" x_minutes: - few: '%{count}m' - many: '%{count}m' - one: 1m - other: '%{count}m' + one: "1m" + few: "%{count}m" + many: "%{count}m" + other: "%{count}m" about_x_hours: - few: '%{count}h' - many: '%{count}h' - one: 1h - other: '%{count}h' + one: "1h" + few: "%{count}h" + many: "%{count}h" + other: "%{count}h" x_days: - few: '%{count}d' - many: '%{count}d' - one: 1d - other: '%{count}d' + one: "1d" + few: "%{count}d" + many: "%{count}d" + other: "%{count}d" x_months: - few: '%{count} mesiace' - many: '%{count} mesiace' - one: '%{count} mesiac' - other: '%{count} mesiace' + one: "%{count} mesiac" + few: "%{count} mesiace" + many: "%{count} mesiace" + other: "%{count} mesiace" about_x_years: - few: '%{count}r' - many: '%{count}r' - one: 1r - other: '%{count}r' + one: "1r" + few: "%{count}r" + many: "%{count}r" + other: "%{count}r" over_x_years: - few: '> %{count}r' - many: '> %{count}r' - one: '> 1r' - other: '> %{count}r' + one: "> 1r" + few: "> %{count}r" + many: "> %{count}r" + other: "> %{count}r" almost_x_years: - few: '%{count}r' - many: '%{count}r' - one: 1r - other: '%{count}r' + one: "1r" + few: "%{count}r" + many: "%{count}r" + other: "%{count}r" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - few: '%{count} minúty' - many: '%{count} minút' - one: 1 minúta - other: '%{count} minút' + one: "1 minúta" + few: "%{count} minúty" + many: "%{count} minút" + other: "%{count} minút" x_hours: - few: '%{count} hodiny' - many: '%{count} hodín' - one: 1 hodina - other: '%{count} hodín' + one: "1 hodina" + few: "%{count} hodiny" + many: "%{count} hodín" + other: "%{count} hodín" x_days: - few: '%{count} dni' - many: '%{count} dní' - one: 1 deň - other: '%{count} dní' + one: "1 deň" + few: "%{count} dni" + many: "%{count} dní" + other: "%{count} dní" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - few: pred %{count} minútami - many: pred %{count} minútami - one: pred 1 minútou - other: pred %{count} minútami + one: "pred 1 minútou" + few: "pred %{count} minútami" + many: "pred %{count} minútami" + other: "pred %{count} minútami" x_hours: - few: pred %{count} hodinami - many: pred %{count} hodinami - one: pred 1 hodinou - other: pred %{count} hodinami + one: "pred 1 hodinou" + few: "pred %{count} hodinami" + many: "pred %{count} hodinami" + other: "pred %{count} hodinami" x_days: - few: pred %{count} dňami - many: pred %{count} dňami - one: pred 1 dňom - other: pred %{count} dňami + one: "pred 1 dňom" + few: "pred %{count} dňami" + many: "pred %{count} dňami" + other: "pred %{count} dňami" later: x_days: - few: '%{count} dni neskôr' - many: '%{count} dní neskôr' - one: 1 deň neskôr - other: '%{count} dní neskôr' + one: "1 deň neskôr" + few: "%{count} dni neskôr" + many: "%{count} dní neskôr" + other: "%{count} dní neskôr" x_months: - few: '%{count} mesiace neskôr' - many: '%{count} mesiacov neskôr' - one: 1 mesiac neskôr - other: '%{count} mesiacov neskôr' + one: "1 mesiac neskôr" + few: "%{count} mesiace neskôr" + many: "%{count} mesiacov neskôr" + other: "%{count} mesiacov neskôr" x_years: - few: '%{count} roky neskôr' - many: '%{count} rokov neskôr' - one: 1 rok neskôr - other: '%{count} rokov neskôr' + one: "1 rok neskôr" + few: "%{count} roky neskôr" + many: "%{count} rokov neskôr" + other: "%{count} rokov neskôr" previous_month: 'Predchádzajúci mesiac' next_month: 'Nasledujúci mesiac' placeholder: Dátum @@ -158,12 +158,14 @@ sk: email: 'poÅ¡li odkaz emailom' action_codes: public_topic: "téma je verejná%{when}" + private_topic: "urobil(a) z témy osobnú správu%{when}" split_topic: "rozdeľ tému %{when}" invited_user: "pozvaný %{who} %{when}" invited_group: "pozvaný %{who} %{when}" user_left: "%{who}ktorí sa odobrali z tejto správy %{when}" removed_user: "odstránený %{who} %{when}" removed_group: "odstránený %{who} %{when}" + autobumped: "automaticky obnovené %{when}" autoclosed: enabled: 'uzavreté %{when}' disabled: 'otvorené %{when}' @@ -184,8 +186,12 @@ sk: disabled: 'stiahnuté %{when}' banner: enabled: 'Téma je odteraz baner %{when} Bude sa zobrazovaÅ¥ navrchu každej stránky, pokiaľ ju používateľ nezavrie.' + disabled: 'odstránil(a) tento oznam %{when}. Už sa viac nebude zobrazovaÅ¥ navrchu každej stránky.' topic_admin_menu: "akcie administrátora témy" + wizard_required: "Vitajte vo vaÅ¡om novom Discourse! ZaÄnime so sprievodcom nastavením✨ " emails_are_disabled: "Odosielanie emailov bolo globálne vypnuté administrátorom. Žiadne emailové notifikácie nebudú odoslané." + bootstrap_mode_enabled: "Pre zjednoduÅ¡enie spustenia VaÅ¡ej novej stránky sa nachádzate v zavádzacom režime. VÅ¡etci noví používatelia budú maÅ¥ pridelený stupeň dôvery 1 a budú maÅ¥ zapnutý denný emailový výber aktualít. Toto bude automaticky vypnuté keÄ celkový poÄet používateľov presiahne %{min_users}." + bootstrap_mode_disabled: "Zavádzací režim bude zruÅ¡ený v priebehu nasledujúcich 24 hodín." themes: default_description: "Predvolené" s3: @@ -199,6 +205,7 @@ sk: eu_central_1: "EU (Frankfurt)" eu_west_1: "EU (Ãrsko)" eu_west_2: "EU (Londýn)" + eu_west_3: "EU (Paríž)" sa_east_1: "Južná Amerika (Sao Paulo)" us_east_1: "USA Východ (S. Virginia)" us_east_2: "USA Východ (Ohio)" @@ -222,15 +229,15 @@ sk: show_help: "možnosti" links: "Odkazy" links_lowercase: - few: odkazy - many: odkazy - one: odkaz - other: odkazy + one: "odkaz" + few: "odkazy" + many: "odkazy" + other: "odkazy" faq: "ÄŒasté otázky" guidelines: "Pokyny" privacy_policy: "Ochrana súkromia" privacy: "Súkromie" - terms_of_service: "Podmienky používania" + tos: "Podmienky používania" mobile_view: "Mobilná verzia" desktop_view: "Zobrazenie pre poÄítaÄ" you: "Vy" @@ -249,10 +256,10 @@ sk: max_of_count: "najviac {{count}}" alternation: "alebo" character_count: - few: '{{count}} znakov' - many: '{{count}} znakov' - one: 1 znak - other: '{{count}} znakov' + one: "1 znak" + few: "{{count}} znakov" + many: "{{count}} znakov" + other: "{{count}} znakov" suggested_topics: title: "OdporúÄané témy" pm_title: "OdporúÄané správy" @@ -264,6 +271,8 @@ sk: our_moderators: "NaÅ¡i moderátori" stat: all_time: "Za celú dobu" + last_7_days: "Posledných 7" + last_30_days: "Posledných 30" like_count: "PáÄi sa mi" topic_count: "Témy" post_count: "Príspevky" @@ -284,6 +293,21 @@ sk: last_read: "toto je posledný preÄítaný príspevok, kliknite pre pridanie záložky" remove: "OdstrániÅ¥ záložku" confirm_clear: "Ste si istý že chcete odstrániÅ¥ vÅ¡etky záložky z tejto témy?" + topic_count_latest: + one: "Pozri si {{count}} novú alebo upravenú tému." + few: "Pozri si {{count}} nových alebo upravených tém." + many: "Pozri si {{count}} nových alebo upravených tém." + other: "Pozri si {{count}} nových alebo upravených tém." + topic_count_unread: + one: "PozrieÅ¥ {{count}} nepreÄítanú tému." + few: "PozrieÅ¥ {{count}} nepreÄítaných tém." + many: "PozrieÅ¥ {{count}} nepreÄítaných tém." + other: "PozrieÅ¥ {{count}} nepreÄítaných tém." + topic_count_new: + one: "PozrieÅ¥ {{count}} novú tému." + few: "PozrieÅ¥ {{count}} nových tém." + many: "PozrieÅ¥ {{count}} nových tém." + other: "PozrieÅ¥ {{count}} nových tém." preview: "náhľad" cancel: "zruÅ¡iÅ¥" save: "UložiÅ¥ zmeny" @@ -321,20 +345,20 @@ sk: cancel: "ZruÅ¡iÅ¥" view_pending: "zobraziÅ¥ príspevky Äakajúce na schválenie" has_pending_posts: - few: Téma má {{count}} príspevky Äakajúce na schválenie - many: Téma má {{count}} príspevkov Äakajúcich na schválenie - one: Téma má {{count}} príspevkov Äakajúci na schválenie - other: Téma má {{count}} príspevkov Äakajúcich na schválenie + one: "Téma má {{count}} príspevkov Äakajúci na schválenie" + few: "Téma má {{count}} príspevky Äakajúce na schválenie" + many: "Téma má {{count}} príspevkov Äakajúcich na schválenie" + other: "Téma má {{count}} príspevkov Äakajúcich na schválenie" confirm: "UložiÅ¥ zmeny" delete_prompt: "Táto akcia zmaže vÅ¡etky príspevky, zablokuje e-mail a IP adresu používateľa %{username}. Ste si istý, že chcete zmazaÅ¥ tohto používateľa? " approval: title: "Príspevok vyžaduje schválenie" description: "Váš príspevok sme obdžali, ale skôr než bude zverejnený musí byÅ¥ schválený moderátorom. Prosíme o trpezlivosÅ¥." pending_posts: - few: Máte {{count}} nepreÄítané príspevky. - many: Máte {{count}} nepreÄítaných príspevkov. - one: Máte 1 nepreÄítaný príspevok. - other: Máte {{count}} nepreÄítaných príspevkov. + one: "Máte 1 nepreÄítaný príspevok." + few: "Máte {{count}} nepreÄítané príspevky." + many: "Máte {{count}} nepreÄítaných príspevkov." + other: "Máte {{count}} nepreÄítaných príspevkov." ok: "OK" user_action: user_posted_topic: "{{user}} založil tému" @@ -368,10 +392,10 @@ sk: posts_read: "PreÄítané" posts_read_long: "PreÄítaných príspevkov" total_rows: - few: '%{count} používatelia' - many: '%{count} používateľov' - one: 1 používateľ - other: '%{count} používateľov' + one: "1 používateľ" + few: "%{count} používatelia" + many: "%{count} používateľov" + other: "%{count} používateľov" group_histories: actions: change_group_setting: "ZmeniÅ¥ nastavenia skupiny" @@ -380,6 +404,10 @@ sk: make_user_group_owner: "NastaviÅ¥ ako vlastníka" remove_user_as_group_owner: "OdobraÅ¥ vlastníka" groups: + add_members: + title: "PridaÅ¥ používateľov" + description: "SpravovaÅ¥ Älenstvo v tejto skupine" + usernames: "Používateľské mená" manage: title: 'SpravovaÅ¥' name: 'Názov' @@ -388,10 +416,18 @@ sk: delete_member_confirm: "OdstrániÅ¥ '%{username}' zo skupiny '%{group}'?" profile: title: Profil + interaction: + title: Interakcia + posting: Prispievanie + notification: Notifikácia + membership: + title: ÄŒlenstvo + access: Prístup logs: title: "Záznamy" when: "Kedy" action: "Akcia" + acting_user: "Konajúci používateľ" target_user: "Cieľový používateľ" subject: "Predmet" details: "Detaily" @@ -412,6 +448,7 @@ sk: request: "Požiadavka" message: "Správa" allow_membership_requests: "Používatelia môžu posielaÅ¥ žiadosti o Älenstvo vlastníkom skupiny" + membership_request_template: "Vlastná Å¡ablóna, ktorá sa zobrazí používateľom pri posielaní žiadosti o Älenstvo" membership_request: submit: "OdoÅ¡li požiadavku" title: "Požiadavka o Älenstvo v %{group_name}" @@ -427,6 +464,7 @@ sk: title: "Skupiny" all: "VÅ¡etky skupiny" empty: "NenaÅ¡li sa viditeľné skupiny." + filter: "FiltrovaÅ¥ podľa typu skupiny" owner_groups: "Skupiny, ktorých som vlastníkom" close_groups: "Uzavreté skupina" automatic_groups: "Automatické skupiny" @@ -442,10 +480,10 @@ sk: is_group_user: "ÄŒlen" is_group_owner: "Vlastník" title: - few: Skupiny - many: Skupiny - one: Skupina - other: Skupiny + one: "Skupina" + few: "Skupiny" + many: "Skupiny" + other: "Skupiny" activity: "Aktivita" members: title: "ÄŒlenovia" @@ -462,7 +500,9 @@ sk: posts: "Príspevky" mentions: "Zmienky" messages: "Správy" + notification_level: "Predvolená úroveň notifikácií pre skupinové správy" alias_levels: + mentionable: "Kto môže @zmieniÅ¥ túto skupinu?" messageable: "Kto môže poslaÅ¥ správu tejto skupine?" nobody: "Nikto" only_admins: "Iba administrátori" @@ -485,6 +525,12 @@ sk: muted: title: "Ignorované" description: "Nikdy nebudete upozornení na niÄ ohľadom nových tém v tejto skupine." + flair_url: "Obrázok pre Å¡títok avataru" + flair_url_placeholder: "(Voliteľné) URL obrázka alebo typ Awesome Fontu" + flair_bg_color: "Farba pozadia Å¡títku avataru" + flair_bg_color_placeholder: "(Voliteľné) Hexadecimálna hodnota farby" + flair_color: "Farba Å¡títku avataru" + flair_color_placeholder: "(Voliteľné) Hexadecimálna hodnota farby" flair_preview_icon: "Ikona náhľadu" flair_preview_image: "Náhľad obrázku" user_action_groups: @@ -502,14 +548,13 @@ sk: "14": "ÄŒakajúce správy" categories: all: "vÅ¡etky kategórie" + all_subcategories: "vÅ¡etko" no_subcategory: "žiadne" category: "Kategória" category_list: "ZobraziÅ¥ zoznam kategórií" reorder: title: "UsporiadaÅ¥ Kategórie" title_long: "UsporiadaÅ¥ zoznam kategórií" - fix_order: "Pevné pozície" - fix_order_tooltip: "Nie vÅ¡etky kategórie majú unikátne Äíslo pozície, Äo môže zpôsobovaÅ¥ neoÄakávané výsledky." save: "Ulož poradie" apply_all: "Použi" position: "Pozícia" @@ -520,15 +565,16 @@ sk: toggle_ordering: "zmeniÅ¥ radenie" subcategories: "Podkategórie" topic_sentence: - few: '%{count} témy' - many: '%{count} tém' - one: 1 téma - other: '%{count} tém' + one: "1 téma" + few: "%{count} témy" + many: "%{count} tém" + other: "%{count} tém" topic_stat_sentence: - few: '%{count} nové témy za posledných %{unit}.' - many: '%{count} nových tém za posledných %{unit}.' - one: '%{count} nová téma za posledných %{unit}.' - other: '%{count} nových tém za posledných %{unit}.' + one: "%{count} nová téma za posledných %{unit}." + few: "%{count} nové témy za posledných %{unit}." + many: "%{count} nových tém za posledných %{unit}." + other: "%{count} nových tém za posledných %{unit}." + more: "(%{count} viac) ..." ip_lookup: title: Vyhľadávanie podľa IP adresy hostname: Hostname @@ -544,6 +590,7 @@ sk: topics_entered: "založených tém" post_count: "# príspevkov" confirm_delete_other_accounts: "Ste si istý že chcete zmazaÅ¥ tieto úÄty?" + powered_by: "Beží cez ipinfo.io" user_fields: none: "(vyberte možnosÅ¥)" user: @@ -562,6 +609,7 @@ sk: activity_stream: "Aktivita" preferences: "Nastavenia" expand_profile: "Rozbaľ" + collapse_profile: "ZbaliÅ¥" bookmarks: "Záložky" bio: "O mne" invited_by: "Pozvaný od" @@ -569,6 +617,7 @@ sk: notifications: "Upozornenia" statistics: "Å tatistiky" desktop_notifications: + label: "Upozornenia na pracovnej ploche" not_supported: "Ľutujeme, tento prehliadaÄ nepodporuje upozornenia." perm_default: "Zapnúť upozornenia" perm_denied_btn: "Prístup zamietnutý" @@ -576,12 +625,14 @@ sk: disable: "ZakázaÅ¥ upozornenia" enable: "PovoliÅ¥ upozornenia" each_browser_note: "Poznámka: Toto nastavenie musíte zmeniÅ¥ v každom používanom prehliadaÄi." + consent_prompt: "Prajete si dostávaÅ¥ upozornenia na pracovnej ploche hneÄ keÄ niekto odpovie na váš príspevok?" dismiss: 'ZahodiÅ¥' dismiss_notifications: "ZahodiÅ¥ vÅ¡etko" dismiss_notifications_tooltip: "OznaÄiÅ¥ vÅ¡etky nepreÄítané upozornenia ako preÄítané" first_notification: "VaÅ¡a prvé upozornenie! Vyberte ho ak chcete zaÄaÅ¥." disable_jump_reply: "NeskoÄiÅ¥ na môj príspevok po odpovedi" dynamic_favicon: "ZobraziÅ¥ poÄet nových/upravených tém na ikone prehliadaÄa" + theme_default_on_all_devices: "UrobiÅ¥ z tohto predvolenú tému na vÅ¡etkých mojich zariadeniach" allow_private_messages: "UmožniÅ¥ iným používateľom, aby mi posielali osobné správy" external_links_in_new_tab: "OtváraÅ¥ vÅ¡ekty externé odkazy na novej karte" enable_quoting: "UmožniÅ¥ odpoveÄ s citáciou z oznaÄeného textu" @@ -606,6 +657,7 @@ sk: individual_no_echo: "PoÅ¡li email pri každom novom príspevku okrem vlastných." many_per_day: "PoÅ¡li mi email pri každom novom príspevku (cca {{dailyEmailEstimate}} denne)" few_per_day: "PoÅ¡li mi email pri každom novom príspevku (cca 2 denne)" + warning: "Režim mailing listu zapnutý. Nastavenia emailových notifikácií sú ignorované." tag_settings: "Å títky" watched_tags: "Sledované" watched_tags_instructions: "Budete automaticky sledovaÅ¥ vÅ¡etky témy s týmito Å¡títkami. Budete upozornený na vÅ¡etky nové príspevky a témy, a zároveň bude vedľa témy zobrazený poÄet nových príspevkov." @@ -623,9 +675,11 @@ sk: watched_first_post_tags_instructions: "Budete upozornený na prvý príspevok v každej novej téme s týmito Å¡títkami." muted_categories: "Ignorované" muted_categories_instructions: "Nebudete informovaný o udalostiach v nových témach týchto kategórií. Tieto témy sa zároveň nebudú zobrazovaÅ¥ v zozname posledných udalostí." + no_category_access: "Ako moderátor máte obmedzený prístup ku kategóriám. Ukladanie nie je povolené." delete_account: "VymazaÅ¥ môj úÄet" delete_account_confirm: "Ste si istý, že chcete permanentne vymazaÅ¥ váš úÄet? Táto akcia je nenávratná." deleted_yourself: "Váš úÄet bol úspeÅ¡ne vymazaný." + delete_yourself_not_allowed: "Ak si prajete, aby bol váš úÄet vymazaný, kontaktujte prosím jedného zo správcov tohto fóra." unread_message_count: "Správy" admin_delete: "VymazaÅ¥" users: "Používatelia" @@ -634,11 +688,13 @@ sk: muted_topics_link: "ZobraziÅ¥ stíšené témy" watched_topics_link: "ZobraziÅ¥ sledované témy" tracked_topics_link: "ZobraziÅ¥ sledované témy" + automatically_unpin_topics: "Automaticky zruÅ¡iÅ¥ pripnutie témy ak sa doÄítam na koniec." apps: "Appky" revoke_access: "OdvolaÅ¥ prístup" undo_revoke_access: "ZruÅ¡iÅ¥ odvolanie prístupu" api_approved: "Schválený:" theme: "Téma" + home: "Predvolená domovská stránka" staged: "DoÄasný" staff_counters: flags_given: "nápomocné znaÄky" @@ -675,17 +731,31 @@ sk: set_password: "NastaviÅ¥ heslo" choose_new: "Vyberte si nové heslo" choose: "Vyberte si heslo" + second_factor_backup: + regenerate: "Znovu vygenerovaÅ¥" + disable: "ZakázaÅ¥" + enable: "PovoliÅ¥" + enable_long: "PovoliÅ¥ kódy zálohy" + manage: "SpravovaÅ¥ kódy zálohy" + copied_to_clipboard: "Skopírované do schránky" + copy_to_clipboard_error: "Chyba pri kopírovaní dát do schránky" + remaining_codes: "Zostáva vám {{count}} kódov zálohy." second_factor: title: "Dvojfaktorová autentifikácia" disable: "Vypnúť dvojfaktorovú autentifikáciu" + enable: "Zapnúť dvojfaktorovú autentifikáciu pre vylepÅ¡ené zabezpeÄenie úÄtu" + confirm_password_description: "Pre pokraÄovanie potvrÄte svoje heslo prosím" label: "Kód" + enable_description: | + Oskentujte tento QR kód v podporovanej aplikácii (Android – iOS – Windows Phone) a zadajte váš overovací kód. + disable_description: "Prosím zadajte autentifikaÄný kód z vaÅ¡ej aplikácie" show_key_description: "VložiÅ¥ ruÄne" change_about: title: "UpraviÅ¥ O mne" error: "Nastala chyba pri zmene tejto hodnoty." change_username: title: "ZmeniÅ¥ používateľské meno" - confirm: "Ak zmeníte svoje používateľské meno, vÅ¡etky predchádzajúce citácie VaÅ¡ich príspevkov a vÅ¡etky @zmienky búdú poruÅ¡ené. Ste si absolútne istý, že to chcete?" + confirm: "Ste si naozaj istý(á), že si chcete zmeniÅ¥ vaÅ¡e užívateľské meno?" taken: "Ľutujeme, toto používateľské meno je obsadené." invalid: "Toto používateľské meno nie je platné. Musí obsahovaÅ¥ iba znaky a Äísla." change_email: @@ -693,6 +763,7 @@ sk: taken: "Ľutujeme, tento email nie je k dispozícii." error: "Pri zmene emailu nastala chyba. Je možné, že je email už použitý?" success: "Na email sme odoslali správu. Nasledujte prosím inÅ¡trukcie pre potvrdenie." + success_staff: "Na váš aktuálny email sme odoslali správu. Nasledujte prosím inÅ¡trukcie pre potvrdenie." change_avatar: title: "ZmeniÅ¥ váš profilový obrázok" gravatar: "Gravatar, podľa" @@ -704,7 +775,6 @@ sk: upload_title: "NahraÅ¥ váš obrázok" upload_picture: "NahraÅ¥ obrázok" image_is_not_a_square: "Upozornenie: váš obrázok sme orezali; mal rozdielnu šírku a výšku" - cache_notice: "Váš profilový obrázok bol úspeÅ¡ne zmenený, ale jeho zobrazenie môže chvíľu trvaÅ¥ kvôli vyrovnávacej pamäti prehliadaÄa." change_profile_background: title: "Pozadie profilu" instructions: "Pozadie profilu bude vystredené a s predvolenou šírkou 850px." @@ -719,10 +789,10 @@ sk: authenticated: "Váš email bude autentifikovaný pomocou {{provider}}" frequency_immediately: "OdoÅ¡leme vám email ak ste nepreÄítali to, Äo vám posielame emailom." frequency: - few: OdoÅ¡leme vám email iba ak sme vás nevideli posledné {{count}} minúty. - many: OdoÅ¡leme vám email iba ak sme vás nevideli posledných {{count}} minút - one: OdoÅ¡leme vám email iba ak sme vás nevideli poslednú minútu - other: OdoÅ¡leme vám email iba ak sme vás nevideli posledných {{count}} minút + one: "OdoÅ¡leme vám email iba ak sme vás nevideli poslednú minútu" + few: "OdoÅ¡leme vám email iba ak sme vás nevideli posledné {{count}} minúty." + many: "OdoÅ¡leme vám email iba ak sme vás nevideli posledných {{count}} minút" + other: "OdoÅ¡leme vám email iba ak sme vás nevideli posledných {{count}} minút" name: title: "Meno" instructions: "vaÅ¡e celé meno (nepovinné)" @@ -731,6 +801,7 @@ sk: ok: "VaÅ¡e meno je v poriadku" username: title: "Používateľské meno" + instructions: "unikátne, bez medzier, krátke" short_instructions: "Ostatní vás môžu zmieniÅ¥ ako @{{username}}" available: "VaÅ¡e používateľské meno je voľné" not_available: "Nie je k dispozícii. Skúste {{suggestion}}?" @@ -772,6 +843,7 @@ sk: every_three_days: "každé tri dni" weekly: "týždenne" every_two_weeks: "každé dva týždne" + include_tl0_in_digests: "Zahrnúť obsah od nových používateľov do súhrnných emailov" email_in_reply_to: "Zahrnúť úryvok príspevku, na ktorý používateľ reagoval, v emailoch" email_direct: "PoÅ¡lite mi email ak ma niekto cituje, odpovie na môj príspevok, zmieni moje @meno alebo ma pozve do témy." email_private_messages: "PoÅ¡lite mi email keÄ mi niekto poÅ¡le správu" @@ -805,10 +877,10 @@ sk: sent: "Odoslané" none: "Nemáte žiadne pozvánky na zobrazenie." truncated: - few: Zobrazujú sa prvé {{count}} pozvánky. - many: Zobrazuje sa prvých {{count}} pozvánok. - one: Zobrazuje sa prvá pozvánka. - other: Zobrazuje sa prvých {{count}} pozvánok. + one: "Zobrazuje sa prvá pozvánka." + few: "Zobrazujú sa prvé {{count}} pozvánky." + many: "Zobrazuje sa prvých {{count}} pozvánok." + other: "Zobrazuje sa prvých {{count}} pozvánok." redeemed: "Využité pozvánky" redeemed_tab: "Využité" redeemed_tab_with_count: "Využité ({{count}})" @@ -823,8 +895,10 @@ sk: rescinded: "Pozvánka odstránená" rescind_all: "OdstrániÅ¥ vÅ¡etky pozvánky" rescinded_all: "VÅ¡etky pozvánky odstránené!" + rescind_all_confirm: "Naozaj chcete odstrániÅ¥ vÅ¡etky pozvánky?" reinvite: "PoslaÅ¥ pozvánku znovu" reinvite_all: "PoslaÅ¥ vÅ¡etky pozvánky znovu" + reinvite_all_confirm: "Naozaj chcete poslaÅ¥ vÅ¡etky pozvánky znovu?" reinvited: "PoslaÅ¥ pozvánku znovu" reinvited_all: "VÅ¡etky pozvánky boli znovu poslané!" time_read: "Doba Äítania" @@ -832,6 +906,8 @@ sk: account_age_days: "Vek úÄtu v dňoch" create: "PoslaÅ¥ pozvánku" generate_link: "KopírovaÅ¥ Odkaz Pozvánky" + link_generated: "Pozývací link bol úspeÅ¡ne vygenerovaný!" + valid_for: "Pozývací link je platný len pre túto emailovú adresu: %{email}" bulk_invite: text: "Hromadná pozvánka zo súboru" success: "Súbor bol úspeÅ¡ne odoslaný. KeÄ sa nahrávanie dokonÄí, budete na to upozornený cez správu." @@ -843,35 +919,36 @@ sk: same_as_username: "VaÅ¡e heslo je rovnaké ako používateľské meno." same_as_email: "VaÅ¡e heslo je rovnaké ako e-mail." ok: "VaÅ¡e heslo je v poriadku." + instructions: "aspoň %{count} znakov" summary: title: "Zhrnutie" stats: "Å tatistiky" time_read: "doba Äítania" topic_count: - few: vytvorené témy - many: vytvorených tém - one: vytvorená téma - other: vytvorených tém + one: "vytvorená téma" + few: "vytvorené témy" + many: "vytvorených tém" + other: "vytvorených tém" post_count: - few: vytvorené príspevky - many: vytvorených príspevkov - one: vytvorený príspevok - other: vytvorených príspevkov + one: "vytvorený príspevok" + few: "vytvorené príspevky" + many: "vytvorených príspevkov" + other: "vytvorených príspevkov" days_visited: - few: dni na stránke - many: dní na stránke - one: deň na stránke - other: dní na stránke + one: "deň na stránke" + few: "dni na stránke" + many: "dní na stránke" + other: "dní na stránke" posts_read: - few: preÄítané príspevky - many: preÄítaných príspevkov - one: preÄítaný príspevok - other: preÄítaných príspevkov + one: "preÄítaný príspevok" + few: "preÄítané príspevky" + many: "preÄítaných príspevkov" + other: "preÄítaných príspevkov" bookmark_count: - few: záložky - many: záložiek - one: záložka - other: záložiek + one: "záložka" + few: "záložky" + many: "záložiek" + other: "záložiek" top_replies: "Top odpovede" no_replies: "Zatiaľ žiadne odpovede." more_replies: "Viac odpovedí" @@ -887,7 +964,6 @@ sk: most_liked_users: "Najviac lajkované" most_replied_to_users: "Najviac reakcií na" no_likes: "Zatiaľ žiadne lajky." - associated_accounts: "Prihlásenia" ip_address: title: "Posledná IP adresa" registration_ip_address: @@ -951,17 +1027,15 @@ sk: last_post: Odoslané last_reply_lowercase: posledná odpoveÄ replies_lowercase: + one: odpoveÄ few: odpovede many: odpovedí - one: odpoveÄ other: odpovedí signup_cta: sign_up: "RegistrovaÅ¥ sa" hide_session: "Pripomenúť zajtra" hide_forever: "nie, Äakujem" hidden_for_session: "Fajn, opýtam sa vás to zajtra. Stále môžete na vytvorenie úÄtu použiÅ¥ aj možnosÅ¥ 'Prihlásenie'." - intro: "Zdravím! :heart_eyes: Vyzerá, že sa vám diskusia páÄi, ale stále nie ste prihlásený na svojom úÄte." - value_prop: "KeÄ si vytvoríte úÄet, zapamätáme si Äo ste Äítali, takže sa môžete vrátiÅ¥ presne tam, kde ste prestali. Okrem toho dostanete upozornenie tu, aj na váš e-mail, vždy keÄ pribudnú nové príspevky. A môžete oznaÄiÅ¥ príspevky ktoré sa vám páÄia. :heartbeat:" summary: enabled_description: "Pozeráte sa na zhrnutie tejto témy: najzaujímavejÅ¡ie príspevky podľa výberu komunity." description: "{{replyCount}} odpovedí." @@ -975,7 +1049,6 @@ sk: disable: "ZobraziÅ¥ zmazané príspevky" private_message_info: title: "Správa" - invite: "PozvaÅ¥ ostatných..." remove_allowed_user: "SkutoÄne chcete odstrániÅ¥ {{name}} z tejto správy?" email: 'Email' username: 'Používateľské meno' @@ -1028,9 +1101,6 @@ sk: to_continue: "Prosím, prihláste sa" preferences: "Na zmenu používateľských nastavení musíte byÅ¥ prihlásený." forgot: "Nepamätám si detaily môjho úÄtu" - google: - title: "pomocou Google" - message: "Prihlásenie pomocou Google úÄtu (prosím uistite sa, že vyskakovacie okná sú povolené)" google_oauth2: title: "pomocou Google" message: "Prihlásenie pomocou Google úÄtu (prosím uistite sa, že vyskakovacie okná sú povolené)" @@ -1092,10 +1162,10 @@ sk: similar_topics: "VaÅ¡a téma je podobná..." drafts_offline: "offline koncepty" group_mentioned: - few: Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý? - many: Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý? - one: Zmienením {{group}}, upozorníte 1 Äloveka – ste si istý? - other: Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý? + one: "Zmienením {{group}}, upozorníte 1 Äloveka – ste si istý?" + few: "Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý?" + many: "Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý?" + other: "Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý?" error: title_missing: "Názov je povinný" title_too_short: "Názov musí maÅ¥ minimálne {{min}} znakov" @@ -1262,10 +1332,10 @@ sk: notification_level: "Upozornenia" choose_new_category: "Vyberte pre tému novú kategóriu:" selected: - few: OznaÄíli ste {{count}} tém.y - many: OznaÄíli ste {{count}} tém. - one: OznaÄíli ste 1 tému. - other: OznaÄíli ste {{count}} tém. + one: "OznaÄíli ste 1 tému." + few: "OznaÄíli ste {{count}} tém.y" + many: "OznaÄíli ste {{count}} tém." + other: "OznaÄíli ste {{count}} tém." choose_new_tags: "Vyberte pre tému nové Å¡títky:" changed_tags: "Å títky tém boli zmenené." none: @@ -1295,10 +1365,10 @@ sk: search: "NenaÅ¡lo sa viac výsledkov." topic: filter_to: - few: '{{count}} príspevky k téme' - many: '{{count}} príspevkov k téme' - one: 1 príspevok k téme - other: '{{count}} príspevkov k téme' + one: "1 príspevok k téme" + few: "{{count}} príspevky k téme" + many: "{{count}} príspevkov k téme" + other: "{{count}} príspevkov k téme" create: 'Nová téma' create_long: 'VytvoriÅ¥ novú tému' private_message: 'Vytvoríť správu' @@ -1312,14 +1382,14 @@ sk: new: 'nová téma' unread: 'nepreÄítané' new_topics: + one: '1 nová téma' few: '{{count}} nové témy' many: '{{count}} nových tém' - one: 1 nová téma other: '{{count}} nových tém' unread_topics: + one: '1 nepreÄítaná téma' few: '{{count}} nepreÄítané témy' many: '{{count}} nepreÄítaných tém' - one: 1 nepreÄítaná téma other: '{{count}} nepreÄítaných tém' title: 'Témy' invalid_access: @@ -1333,25 +1403,25 @@ sk: title: "Téma sa nenaÅ¡la" description: "Ľutujeme, hľadaná téma nebola nájdená. Možno bola odstránená moderátorom?" total_unread_posts: - few: máte {{count}} nepreÄítanépríspevky k tejto téme - many: máte {{count}} nepreÄítaných príspevkov k tejto téme - one: máte 1 nepreÄítaný príspevok k tejto téme - other: máte {{count}} nepreÄítaných príspevkov k tejto téme + one: "máte 1 nepreÄítaný príspevok k tejto téme" + few: "máte {{count}} nepreÄítanépríspevky k tejto téme" + many: "máte {{count}} nepreÄítaných príspevkov k tejto téme" + other: "máte {{count}} nepreÄítaných príspevkov k tejto téme" unread_posts: - few: máte {{count}} starÅ¡ie nepreÄítané príspevky k tejto téme - many: máte {{count}} starších nepreÄítaných príspevkov k tejto téme - one: máte 1 starší nepreÄítaný príspevok k tejto téme - other: máte {{count}} starších nepreÄítaných príspevkov k tejto téme + one: "máte 1 starší nepreÄítaný príspevok k tejto téme" + few: "máte {{count}} starÅ¡ie nepreÄítané príspevky k tejto téme" + many: "máte {{count}} starších nepreÄítaných príspevkov k tejto téme" + other: "máte {{count}} starších nepreÄítaných príspevkov k tejto téme" new_posts: - few: 'pribudlo {{count}} nové príspevky odkedy ste Äítali túto tému naposledy ' - many: 'pribudlo {{count}} nových príspevkov odkedy ste Äítali túto tému naposledy ' - one: 'pribudol 1 nový príspevok odkedy ste Äítali túto tému naposledy ' - other: 'pribudlo {{count}} nových príspevkov odkedy ste Äítali túto tému naposledy ' + one: "pribudol 1 nový príspevok odkedy ste Äítali túto tému naposledy " + few: "pribudlo {{count}} nové príspevky odkedy ste Äítali túto tému naposledy " + many: "pribudlo {{count}} nových príspevkov odkedy ste Äítali túto tému naposledy " + other: "pribudlo {{count}} nových príspevkov odkedy ste Äítali túto tému naposledy " likes: - few: v tejto téme je {{count}} "PáÄi sa" - many: v tejto téme je {{count}} "PáÄi sa" - one: v tejto téme je jedo "PáÄi sa" - other: v tejto téme je {{count}} "PáÄi sa" + one: "v tejto téme je jedo \"PáÄi sa\"" + few: "v tejto téme je {{count}} \"PáÄi sa\"" + many: "v tejto téme je {{count}} \"PáÄi sa\"" + other: "v tejto téme je {{count}} \"PáÄi sa\"" back_to_list: "Naspäť na zoznam tém" options: "Možnosti tém" show_links: "zobrazovaÅ¥ odkazy v tejto téme" @@ -1385,10 +1455,10 @@ sk: title: "Upozorni ma" auto_close_title: 'Nastavenia automatického zatvárania' auto_close_immediate: - few: 'Posledný príspevok k téme je starý už %{hours} hodiny, takže téma bude okamžite uzavretá. ' - many: 'Posledný príspevok k téme je starý už %{hours} hodín, takže téma bude okamžite uzavretá. ' - one: 'Posledný príspevok k téme je starý už 1 hodinu, takže téma bude okamžite uzavretá. ' - other: 'Posledný príspevok k téme je starý už %{hours} hodín, takže téma bude okamžite uzavretá. ' + one: "Posledný príspevok k téme je starý už 1 hodinu, takže téma bude okamžite uzavretá. " + few: "Posledný príspevok k téme je starý už %{hours} hodiny, takže téma bude okamžite uzavretá. " + many: "Posledný príspevok k téme je starý už %{hours} hodín, takže téma bude okamžite uzavretá. " + other: "Posledný príspevok k téme je starý už %{hours} hodín, takže téma bude okamžite uzavretá. " timeline: back: "Späť" progress: @@ -1484,10 +1554,10 @@ sk: pin_validation: "Dátum je vyžadovaný k pripnutiu tejto témy." not_pinned: "V {{categoryLink}} nie sú pripnuté žiadne témy." already_pinned: - few: 'Témy pripnuté ku {{categoryLink}}: {{count}}' - many: 'Tém pripnutých k {{categoryLink}}: {{count}}' - one: 'Téma pripnutá k {{categoryLink}}: 1' - other: 'Tém pripnutých k {{categoryLink}}: {{count}}' + one: "Téma pripnutá k {{categoryLink}}: 1" + few: "Témy pripnuté ku {{categoryLink}}: {{count}}" + many: "Tém pripnutých k {{categoryLink}}: {{count}}" + other: "Tém pripnutých k {{categoryLink}}: {{count}}" pin_globally: "Zobrazuj túto tému na vrchu vÅ¡etkých zoznamov tém do" confirm_pin_globally: "Máte už {{count}} globálne pripnutých tém. PríliÅ¡ veľa pripnutých tém môže byÅ¥ na príťaž pre nových a anonymných používateľov. Ste si istý že chcete pripnúť ÄalÅ¡iu globálnu tému?" unpin_globally: "ZruÅ¡ túto tému z vrcholu vÅ¡etkých zoznamov tém. " @@ -1495,10 +1565,10 @@ sk: global_pin_note: "Užívatelia si môžu sami odopnúť tému." not_pinned_globally: "Nie sú pripnuté žiadne globálne témy." already_pinned_globally: - few: 'Globálne pripnuté témy : {{count}}' - many: 'Globálne pripnutých tém : {{count}}' - one: 'Globálne pripnutá téma : 1' - other: 'Globálne pripnutých tém : {{count}}' + one: "Globálne pripnutá téma : 1" + few: "Globálne pripnuté témy : {{count}}" + many: "Globálne pripnutých tém : {{count}}" + other: "Globálne pripnutých tém : {{count}}" make_banner: "SpraviÅ¥ z tejto témy baner, ktorý sa zobrazí navrchu každej stránky." remove_banner: "OdstrániÅ¥ baner, ktorý sa zobrazuje navrchu každej stránky." banner_note: "Užívatelia môžu banner kedykoľvek zruÅ¡iÅ¥. Bannerom môže byÅ¥ v jednom momente len jedna téma." @@ -1533,10 +1603,10 @@ sk: login_reply: 'Príhláste sa ak chcete odpovedaÅ¥' filters: n_posts: - few: '{{count}} príspevky' - many: '{{count}} príspevkov' - one: 1 príspevok - other: '{{count}} príspevkov' + one: "1 príspevok" + few: "{{count}} príspevky" + many: "{{count}} príspevkov" + other: "{{count}} príspevkov" cancel: "ZruÅ¡ filter" split_topic: title: "Presuň na novú tému" @@ -1544,19 +1614,19 @@ sk: topic_name: "Názov novej témy" error: "Nastala chyba pri presune príspevku na novú tému." instructions: - few: 'Vytvárate novú tému do ktorej bude vložených {{count}} príspevkov, ktoré ste oznaÄili. ' - many: 'Vytvárate novú tému do ktorej budú vložené {{count}} príspevky, ktoré ste oznaÄili. ' - one: 'Vytvárate novú tému do ktorej bude vložený príspevok, ktorý ste oznaÄili. ' - other: 'Vytvárate novú tému do ktorej budú vložené {{count}} príspevky, ktoré ste oznaÄili. ' + one: "Vytvárate novú tému do ktorej bude vložený príspevok, ktorý ste oznaÄili. " + few: "Vytvárate novú tému do ktorej bude vložených {{count}} príspevkov, ktoré ste oznaÄili. " + many: "Vytvárate novú tému do ktorej budú vložené {{count}} príspevky, ktoré ste oznaÄili. " + other: "Vytvárate novú tému do ktorej budú vložené {{count}} príspevky, ktoré ste oznaÄili. " merge_topic: title: "Presuň do existujúcej témy." action: "presuň do existujúcej témy" error: "Nastala chyba pri presune príspevku do tejto témy." instructions: - few: Prosím vyberte tému do ktorej chcete presunúť tieto {{count}} príspevky. - many: Prosím vyberte tému do ktorej chcete presunúť týchto {{count}} príspevkov. - one: Prosím vyberte tému do ktorej chcete presunúť tento príspevok. - other: Prosím vyberte tému do ktorej chcete presunúť týchto {{count}} príspevkov. + one: "Prosím vyberte tému do ktorej chcete presunúť tento príspevok." + few: "Prosím vyberte tému do ktorej chcete presunúť tieto {{count}} príspevky." + many: "Prosím vyberte tému do ktorej chcete presunúť týchto {{count}} príspevkov." + other: "Prosím vyberte tému do ktorej chcete presunúť týchto {{count}} príspevkov." merge_posts: title: "SpojiÅ¥ oznaÄené príspevky" action: "spojiÅ¥ oznaÄené príspevky" @@ -1567,10 +1637,10 @@ sk: label: "Príspevky nového vlastníka" placeholder: "používateľske meno nového vlastnika" instructions: - few: Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}. - many: Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}. - one: Prosím vyberte nového vlastníka príspevku vytvoreného {{old_user}}. - other: Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}. + one: "Prosím vyberte nového vlastníka príspevku vytvoreného {{old_user}}." + few: "Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}." + many: "Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}." + other: "Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}." change_timestamp: action: "nastavte Äasovú znaÄku" invalid_timestamp: "ÄŒasová znaÄka nemôže byÅ¥ v budúcnosti. " @@ -1588,10 +1658,10 @@ sk: select_all: oznaÄ vÅ¡etko deselect_all: odznaÄ vÅ¡etko description: - few: OznaÄili ste {{count}} príspevky - many: OznaÄili ste {{count}} príspevkov one: OznaÄili ste 1 príspevok - other: OznaÄili ste {{count}} príspevkov + few: "OznaÄili ste {{count}} príspevky" + many: "OznaÄili ste {{count}} príspevkov" + other: "OznaÄili ste {{count}} príspevkov" post: quote_reply: "Citácia" edit_reason: "Dôvod:" @@ -1603,38 +1673,38 @@ sk: show_full: "ZobraziÅ¥ celý príspevok" show_hidden: 'ZobraziÅ¥ skrytý obsah.' deleted_by_author: - few: (príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodiny pokiaľ nie sú oznaÄené) - many: (príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú oznaÄené) - one: (príspevky stiahnuté autorom budú automaticky zmazané za jednu hodinu pokiaľ nie sú oznaÄené) - other: (príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú oznaÄené) + one: "(príspevky stiahnuté autorom budú automaticky zmazané za jednu hodinu pokiaľ nie sú oznaÄené)" + few: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodiny pokiaľ nie sú oznaÄené)" + many: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú oznaÄené)" + other: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú oznaÄené)" expand_collapse: "rozbaliÅ¥/zbaliÅ¥" gap: - few: zobraziÅ¥ {{count}} skryté odpovede - many: zobraziÅ¥ {{count}} skrytých odpovedí - one: zobraziÅ¥ skrytú odpoveÄ - other: zobraziÅ¥ {{count}} skrytých odpovedí + one: "zobraziÅ¥ skrytú odpoveÄ" + few: "zobraziÅ¥ {{count}} skryté odpovede" + many: "zobraziÅ¥ {{count}} skrytých odpovedí" + other: "zobraziÅ¥ {{count}} skrytých odpovedí" unread: "Príspevok je nepreÄítaný." has_replies: - few: '{{count}} Odpovede' - many: '{{count}} Odpovedí' - one: '{{count}} OdpoveÄ' - other: '{{count}} Odpovedí' + one: "{{count}} OdpoveÄ" + few: "{{count}} Odpovede" + many: "{{count}} Odpovedí" + other: "{{count}} Odpovedí" has_likes: - few: '{{count}} "PáÄi sa"' - many: '{{count}} "PáÄi sa"' - one: '{{count}} "PáÄi sa"' - other: '{{count}} "PáÄi sa"' + one: "{{count}} \"PáÄi sa\"" + few: "{{count}} \"PáÄi sa\"" + many: "{{count}} \"PáÄi sa\"" + other: "{{count}} \"PáÄi sa\"" has_likes_title: - few: Tento príspevok sa páÄil {{count}} ľuÄom - many: Tento príspevok sa páÄil {{count}} ľuÄom - one: Tento príspevok sa páÄil jedej osobe - other: Tento príspevok sa páÄil {{count}} ľuÄom + one: "Tento príspevok sa páÄil jedej osobe" + few: "Tento príspevok sa páÄil {{count}} ľuÄom" + many: "Tento príspevok sa páÄil {{count}} ľuÄom" + other: "Tento príspevok sa páÄil {{count}} ľuÄom" has_likes_title_only_you: "tento príspevok sa Vám páÄi" has_likes_title_you: - few: Tento príspevok sa páÄil Vám a Äalším {{count}} ľuÄom - many: Tento príspevok sa páÄil Vám a Äalším {{count}} ľuÄom - one: Tento príspevok sa páÄil Vám a jednej ÄalÅ¡ej osobe - other: Tento príspevok sa páÄil Vám a Äalším {{count}} ľuÄom + one: "Tento príspevok sa páÄil Vám a jednej ÄalÅ¡ej osobe" + few: "Tento príspevok sa páÄil Vám a Äalším {{count}} ľuÄom" + many: "Tento príspevok sa páÄil Vám a Äalším {{count}} ľuÄom" + other: "Tento príspevok sa páÄil Vám a Äalším {{count}} ľuÄom" errors: create: "Ľutujeme, pri vytváraní príspevku nastala chyba. Prosím, skúste znovu." edit: "Ľutujeme, pri úprave príspevku nastala chyba. Prosím, skúste znovu." @@ -1681,9 +1751,6 @@ sk: inappropriate: "ZruÅ¡ oznaÄenie" bookmark: "VrátiÅ¥ záložku späť" like: "ZruÅ¡ \"PáÄi sa\"" - vote: "ZruÅ¡ hlasovanie" - people: - vote: "hlasoval za tento príspevok" by_you: off_topic: "OznaÄíli ste to ako mimo tému" spam: "OznaÄíli ste to ako spam" @@ -1692,89 +1759,78 @@ sk: notify_user: "Poslali ste správu používateľovi " bookmark: "Vytvorili ste si záložku na tento príspevok" like: "PáÄi sa Vám to" - vote: "Hlasoval si za tento príspevok" by_you_and_others: off_topic: - few: Vy a ÄalÅ¡ie {{count}} osoby to oznaÄíli ako mimo tému - many: Vy a Äalších {{count}} osôb to oznaÄílo ako mimo tému - one: Vy a 1 ÄalÅ¡ia osoba to oznaÄílo ako mimo tému - other: Vy a Äalších {{count}} osôb to oznaÄílo ako mimo tému + one: "Vy a 1 ÄalÅ¡ia osoba to oznaÄílo ako mimo tému" + few: "Vy a ÄalÅ¡ie {{count}} osoby to oznaÄíli ako mimo tému" + many: "Vy a Äalších {{count}} osôb to oznaÄílo ako mimo tému" + other: "Vy a Äalších {{count}} osôb to oznaÄílo ako mimo tému" spam: - few: Vy a ÄalÅ¡ie {{count}} osoby to oznaÄíli ako spam - many: Vy a Äalších {{count}} osôb to oznaÄílo ako spam - one: Vy a 1 ÄalÅ¡ia osoba to oznaÄíla ako spam - other: Vy a Äalších {{count}} osôb to oznaÄílo ako spam + one: "Vy a 1 ÄalÅ¡ia osoba to oznaÄíla ako spam" + few: "Vy a ÄalÅ¡ie {{count}} osoby to oznaÄíli ako spam" + many: "Vy a Äalších {{count}} osôb to oznaÄílo ako spam" + other: "Vy a Äalších {{count}} osôb to oznaÄílo ako spam" inappropriate: - few: Vy a ÄalÅ¡ie {{count}} osoby to oznaÄili ako nevhodné - many: Vy a Äalších {{count}} osôb to oznaÄilo ako nevhodné - one: Vy a jedna ÄalÅ¡ia osoba to oznaÄila ako nevhodné - other: Vy a Äalších {{count}} osôb to oznaÄilo ako nevhodné + one: "Vy a jedna ÄalÅ¡ia osoba to oznaÄila ako nevhodné" + few: "Vy a ÄalÅ¡ie {{count}} osoby to oznaÄili ako nevhodné" + many: "Vy a Äalších {{count}} osôb to oznaÄilo ako nevhodné" + other: "Vy a Äalších {{count}} osôb to oznaÄilo ako nevhodné" notify_moderators: - few: Vy a ÄalÅ¡ie {{count}} osoby to oznaÄili na moderovanie - many: Vy a Äalších {{count}} osôb to oznaÄilo na moderovanie - one: Vy a jedna ÄalÅ¡ia osoba to oznaÄila na moderovanie - other: Vy a Äalších {{count}} osôb to oznaÄilo na moderovanie + one: "Vy a jedna ÄalÅ¡ia osoba to oznaÄila na moderovanie" + few: "Vy a ÄalÅ¡ie {{count}} osoby to oznaÄili na moderovanie" + many: "Vy a Äalších {{count}} osôb to oznaÄilo na moderovanie" + other: "Vy a Äalších {{count}} osôb to oznaÄilo na moderovanie" notify_user: - few: Vy a ÄalÅ¡ie {{count}} osoby poslali správu tomuto užívateľovi - many: Vy a Äalších {{count}} osôb poslalo správu tomuto používateľovi - one: Vy a jedna ÄalÅ¡ia osoba poslala správu tomuto užívateľovi - other: Vy a Äalších {{count}} osôb poslalo správu tomuto používateľovi + one: "Vy a jedna ÄalÅ¡ia osoba poslala správu tomuto užívateľovi" + few: "Vy a ÄalÅ¡ie {{count}} osoby poslali správu tomuto užívateľovi" + many: "Vy a Äalších {{count}} osôb poslalo správu tomuto používateľovi" + other: "Vy a Äalších {{count}} osôb poslalo správu tomuto používateľovi" bookmark: - few: Vy a ÄalÅ¡ie {{count}} osoby si vytvorili záložku na tento príspevok - many: Vy a Äalších {{count}} osôb si vytvorilo záložku na tento príspevok - one: Vy a jedna ÄalÅ¡ia osoba si vytvorilo záložku na tento príspevok - other: Vy a Äalších {{count}} osôb si vytvorilo záložku na tento príspevok + one: "Vy a jedna ÄalÅ¡ia osoba si vytvorilo záložku na tento príspevok" + few: "Vy a ÄalÅ¡ie {{count}} osoby si vytvorili záložku na tento príspevok" + many: "Vy a Äalších {{count}} osôb si vytvorilo záložku na tento príspevok" + other: "Vy a Äalších {{count}} osôb si vytvorilo záložku na tento príspevok" like: - few: PáÄi sa to Vám a Äalším {{count}} osobám - many: PáÄi sa to Vám a Äalším {{count}} osobám - one: PáÄi sa to Vám a jendej ÄalÅ¡ej osobe - other: PáÄi sa to Vám a Äalším {{count}} osobám - vote: - few: Vy a ÄalÅ¡ie {{count}} osoby hlasovalo za tento príspevok - many: Vy a Äalších {{count}} osôb hlasovalo za tento príspevok - one: Vy a jenda ÄalÅ¡ia osoba hlasovala za tento príspevok - other: Vy a Äalších {{count}} osôb hlasovalo za tento príspevok + one: "PáÄi sa to Vám a jendej ÄalÅ¡ej osobe" + few: "PáÄi sa to Vám a Äalším {{count}} osobám" + many: "PáÄi sa to Vám a Äalším {{count}} osobám" + other: "PáÄi sa to Vám a Äalším {{count}} osobám" by_others: off_topic: - few: '{{count}} osoby to oznaÄíli ako mimo tému' - many: '{{count}} osôb to oznaÄílo ako mimo tému' - one: 1 osoba to oznaÄíla ako mimo tému - other: '{{count}} osôb to oznaÄílo ako mimo tému' + one: "1 osoba to oznaÄíla ako mimo tému" + few: "{{count}} osoby to oznaÄíli ako mimo tému" + many: "{{count}} osôb to oznaÄílo ako mimo tému" + other: "{{count}} osôb to oznaÄílo ako mimo tému" spam: - few: '{{count}} osoby to oznaÄíli ako spam' - many: '{{count}} osôb to oznaÄílo ako spam' - one: 1 osoba to oznaÄíla ako spam - other: '{{count}} osôb to oznaÄílo ako spam' + one: "1 osoba to oznaÄíla ako spam" + few: "{{count}} osoby to oznaÄíli ako spam" + many: "{{count}} osôb to oznaÄílo ako spam" + other: "{{count}} osôb to oznaÄílo ako spam" inappropriate: - few: '{{count}} osoby to oznaÄili ako nevhodné' - many: '{{count}} osôb to oznaÄilo ako nevhodné' - one: 1 osoba to oznaÄila ako nevhodné - other: '{{count}} osôb to oznaÄilo ako nevhodné' + one: "1 osoba to oznaÄila ako nevhodné" + few: "{{count}} osoby to oznaÄili ako nevhodné" + many: "{{count}} osôb to oznaÄilo ako nevhodné" + other: "{{count}} osôb to oznaÄilo ako nevhodné" notify_moderators: - few: '{{count}} osoby to oznaÄili na moderovanie' - many: '{{count}} osôb to oznaÄilo na moderovanie' - one: 1 osoba to oznaÄila na moderovanie - other: '{{count}} osôb to oznaÄilo na moderovanie' + one: "1 osoba to oznaÄila na moderovanie" + few: "{{count}} osoby to oznaÄili na moderovanie" + many: "{{count}} osôb to oznaÄilo na moderovanie" + other: "{{count}} osôb to oznaÄilo na moderovanie" notify_user: - few: '{{count}} osoby poslali správu tomuto používateľovi' - many: '{{count}} osôb poslalo správu tomuto používateľovi' - one: 1 osoba poslala správu tomuto používateľovi - other: '{{count}} osôb poslalo správu tomuto používateľovi' + one: "1 osoba poslala správu tomuto používateľovi" + few: "{{count}} osoby poslali správu tomuto používateľovi" + many: "{{count}} osôb poslalo správu tomuto používateľovi" + other: "{{count}} osôb poslalo správu tomuto používateľovi" bookmark: - few: '{{count}} osoby si vytvorili záložku na tento príspevok' - many: '{{count}} osôb si vytvorilo záložku na tento príspevok' - one: 1 osoba si vytvorila záložku na tento príspevok - other: '{{count}} osôb si vytvorilo záložku na tento príspevok' + one: "1 osoba si vytvorila záložku na tento príspevok" + few: "{{count}} osoby si vytvorili záložku na tento príspevok" + many: "{{count}} osôb si vytvorilo záložku na tento príspevok" + other: "{{count}} osôb si vytvorilo záložku na tento príspevok" like: - few: ' {{count}} osobám sa to páÄilo' - many: ' {{count}} osobám sa to páÄilo' - one: ' {{count}} osobe sa to páÄilo' - other: ' {{count}} osobám sa to páÄilo' - vote: - few: '{{count}} osoby hlasovali za tento príspevok' - many: '{{count}} osôb hlasovalo za tento príspevok' - one: 1 osoba hlasovala za tento príspevok - other: '{{count}} osôb hlasovalo za tento príspevok' + one: " {{count}} osobe sa to páÄilo" + few: " {{count}} osobám sa to páÄilo" + many: " {{count}} osobám sa to páÄilo" + other: " {{count}} osobám sa to páÄilo" revisions: controls: first: "Prvá revízia" @@ -1799,7 +1855,6 @@ sk: can: 'môže … ' none: '(Bez kategórie)' all: 'VÅ¡etky kategórie' - choose: 'Vyber kategóriu…' edit: 'uprav' edit_long: "UpraviÅ¥" view: 'PrezeraÅ¥ témy v kategórii' @@ -1844,7 +1899,6 @@ sk: edit_permissions: "UpraviÅ¥ práva" add_permission: "PridaÅ¥ práva" this_year: "tento rok" - position: "pozícia" default_position: "Predvolená pozícia" position_disabled: "Kategórie budú zobrazené podľa aktivity. Pre možnosÅ¥ ovládania poradia kategórií v zozname," position_disabled_click: 'povoľte možnosÅ¥ "pevné poradie kategórií"' @@ -1888,15 +1942,15 @@ sk: custom_placeholder_notify_moderators: "Dajte nám vedieÅ¥, z Äoho konkrétne máte obavy, a priložte prísluÅ¡né odkazy a príklady, ak je to možné." custom_message: more: - few: eÅ¡te {{count}} ... - many: eÅ¡te {{count}} ... - one: eÅ¡te 1 ... - other: eÅ¡te {{count}} ... + one: "eÅ¡te 1 ..." + few: "eÅ¡te {{count}} ..." + many: "eÅ¡te {{count}} ..." + other: "eÅ¡te {{count}} ..." left: - few: '{{count}} zostávajú' - many: '{{count}} zostáva' - one: 1 zostáva - other: '{{count}} zostáva' + one: "1 zostáva" + few: "{{count}} zostávajú" + many: "{{count}} zostáva" + other: "{{count}} zostáva" flagging_topic: title: "ÄŽakujeme, že pomáhate udržiavaÅ¥ sluÅ¡nosÅ¥ v naÅ¡ej komunite!" action: "OznaÄ príspevok" @@ -1907,16 +1961,16 @@ sk: links_title: "Populárne odkazy" links_shown: "zobraz viac odkazov..." clicks: - few: '%{count} kliky' - many: '%{count} klikov' - one: '%{count} kilk' - other: '%{count} klikov' + one: "%{count} kilk" + few: "%{count} kliky" + many: "%{count} klikov" + other: "%{count} klikov" post_links: title: - few: '%{count} ÄalÅ¡ie' - many: '%{count} Äalších' - one: 1 Äalší - other: '%{count} Äalších' + one: "1 Äalší" + few: "%{count} ÄalÅ¡ie" + many: "%{count} Äalších" + other: "%{count} Äalších" topic_statuses: warning: help: "Toto je oficiálne varovanie." @@ -1950,25 +2004,25 @@ sk: original_post: "Pôvodný príspevok" views: "Zobrazenia" views_lowercase: - few: zobrazenia - many: zobrazení - one: zobrazenie - other: zobrazení + one: "zobrazenie" + few: "zobrazenia" + many: "zobrazení" + other: "zobrazení" replies: "Odpovede" activity: "Aktivita" likes: "PáÄi sa mi" likes_lowercase: - few: '"PáÄi sa"' - many: '"PáÄi sa"' - one: '"PáÄi sa"' - other: '"PáÄi sa"' + one: "\"PáÄi sa\"" + few: "\"PáÄi sa\"" + many: "\"PáÄi sa\"" + other: "\"PáÄi sa\"" likes_long: "v tejto téme je {{number}} \"PáÄi sa\"" users: "Používatelia" users_lowercase: - few: používatelia - many: používateľov - one: používateľ - other: používateľov + one: "používateľ" + few: "používatelia" + many: "používateľov" + other: "používateľov" category_title: "Kategória" history: "História" changed_by: "od {{author}}" @@ -1981,10 +2035,10 @@ sk: latest: title: "NajnovÅ¡ie" title_with_count: - few: Posledné ({{count}}) - many: Posledných ({{count}}) - one: Posledný (1) - other: Posledných ({{count}}) + one: "Posledný (1)" + few: "Posledné ({{count}})" + many: "Posledných ({{count}})" + other: "Posledných ({{count}})" help: "témy s nedávnymi príspevkami" hot: title: "Horúca" @@ -2002,29 +2056,29 @@ sk: unread: title: "NepreÄítané" title_with_count: - few: NepreÄítané ({{count}}) - many: NepreÄítaných ({{count}}) - one: NepreÄítaná (1) - other: NepreÄítaných ({{count}}) + one: "NepreÄítaná (1)" + few: "NepreÄítané ({{count}})" + many: "NepreÄítaných ({{count}})" + other: "NepreÄítaných ({{count}})" help: "témy ktorých nepreÄítané príspevky v súÄastnosti sledujete alebo pozorujete " lower_title_with_count: - few: '{{count}} nepreÄítané' - many: '{{count}} nepreÄítaných' - one: 1 nepreÄítaná - other: '{{count}} nepreÄítaných' + one: "1 nepreÄítaná" + few: "{{count}} nepreÄítané" + many: "{{count}} nepreÄítaných" + other: "{{count}} nepreÄítaných" new: lower_title_with_count: - few: '{{count}} nové' - many: '{{count}} nových' - one: 1 nová - other: '{{count}} nových' + one: "1 nová" + few: "{{count}} nové" + many: "{{count}} nových" + other: "{{count}} nových" lower_title: "nový" title: "Nové" title_with_count: - few: Nové ({{count}}) - many: Nových ({{count}}) - one: Nová (1) - other: Nových ({{count}}) + one: "Nová (1)" + few: "Nové ({{count}})" + many: "Nových ({{count}})" + other: "Nových ({{count}})" help: "témy vytvorené za posledných pár dní" posted: title: "Moje príspevky" @@ -2035,10 +2089,10 @@ sk: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - many: '{{categoryName}} ({{count}})' - one: '{{categoryName}} ({{count}})' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} ({{count}})" + few: "{{categoryName}} ({{count}})" + many: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "najnovÅ¡ie témy v kategórii {{categoryName}}" top: title: "Top" @@ -2121,18 +2175,18 @@ sk: mark_watching: 'm, w PozorovaÅ¥ tému' badges: earned_n_times: - few: Získal tento odkaz %{count}-krát - many: Získal tento odkaz %{count}-krát - one: Získal tento odkaz 1-krát - other: Získal tento odkaz %{count}-krát + one: "Získal tento odkaz 1-krát" + few: "Získal tento odkaz %{count}-krát" + many: "Získal tento odkaz %{count}-krát" + other: "Získal tento odkaz %{count}-krát" granted_on: "Udelený dňa %{date}" others_count: "Ostatní s týmto odznakom (%{count})" title: Odznaky granted: - few: '%{count} udelené' - many: '%{count} udelených' - one: 1 udelený - other: '%{count} udelených' + one: "1 udelený" + few: "%{count} udelené" + many: "%{count} udelených" + other: "%{count} udelených" badge_grouping: getting_started: name: ZaÄíname @@ -2528,7 +2582,6 @@ sk: address_placeholder: "meno@príklad.com" type_placeholder: "súhrn, registácia..." reply_key_placeholder: "tlaÄidlo odpovedaÅ¥" - skipped_reason_placeholder: "dôvod" logs: title: "Logy" action: "Akcia" @@ -2640,15 +2693,15 @@ sk: suspect: 'Podozrivý' approved: "Schválený?" approved_selected: - few: 'schváliÅ¥ ({{count}}) používateľov ' - many: 'schváliÅ¥ ({{count}}) používateľov ' - one: schváliÅ¥ používateľa - other: 'schváliÅ¥ ({{count}}) používateľov ' + one: "schváliÅ¥ používateľa" + few: "schváliÅ¥ ({{count}}) používateľov " + many: "schváliÅ¥ ({{count}}) používateľov " + other: "schváliÅ¥ ({{count}}) používateľov " reject_selected: - few: 'zamietnuÅ¥ ({{count}}) používateľov ' - many: 'zamietnuÅ¥ ({{count}}) používateľov ' - one: zamietnuÅ¥ používateľa - other: 'zamietnuÅ¥ ({{count}}) používateľov ' + one: "zamietnuÅ¥ používateľa" + few: "zamietnuÅ¥ ({{count}}) používateľov " + many: "zamietnuÅ¥ ({{count}}) používateľov " + other: "zamietnuÅ¥ ({{count}}) používateľov " titles: active: 'Aktívni používatelia' new: 'Noví používatelia' @@ -2664,15 +2717,15 @@ sk: suspended: 'Užívatelia s odobratými právami' suspect: 'Podozriví užívatelia' reject_successful: - few: ÚspeÅ¡ne zamietnutí %{count} používatelia - many: ÚspeÅ¡ne zamietnutých %{count} používateľov - one: ÚspeÅ¡ne zamietnutý používateľ - other: ÚspeÅ¡ne zamietnutých %{count} používateľov + one: "ÚspeÅ¡ne zamietnutý používateľ" + few: "ÚspeÅ¡ne zamietnutí %{count} používatelia" + many: "ÚspeÅ¡ne zamietnutých %{count} používateľov" + other: "ÚspeÅ¡ne zamietnutých %{count} používateľov" reject_failures: - few: Nepodarilo sa zamietnuÅ¥ %{count} používateľov - many: Nepodarilo sa zamietnuÅ¥ %{count} používateľov - one: Nepodarilo sa zamietnuÅ¥ 1 používateľa - other: Nepodarilo sa zamietnuÅ¥ %{count} používateľov + one: "Nepodarilo sa zamietnuÅ¥ 1 používateľa" + few: "Nepodarilo sa zamietnuÅ¥ %{count} používateľov" + many: "Nepodarilo sa zamietnuÅ¥ %{count} používateľov" + other: "Nepodarilo sa zamietnuÅ¥ %{count} používateľov" not_verified: "Neoverený" check_email: title: "OdhaliÅ¥ emailovú adresu tohto používateľa" @@ -2729,20 +2782,20 @@ sk: delete_forbidden_because_staff: "Správcovia a moderátori nemôžu byÅ¥ vymazaní." delete_posts_forbidden_because_staff: "Nedá sa zmazaÅ¥ príspevky správcov a moderátorov." delete_forbidden: - few: Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky starÅ¡ie ako %{count} dni nemožno zmazaÅ¥) - many: Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom používateľa. (Príspevky starÅ¡ie ako %{count} dní nemožno zmazaÅ¥) - one: Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky starÅ¡ie ako %{count} deň nemožno zmazaÅ¥) - other: Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom používateľa. (Príspevky starÅ¡ie ako %{count} dní nemožno zmazaÅ¥) + one: "Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky starÅ¡ie ako %{count} deň nemožno zmazaÅ¥)" + few: "Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky starÅ¡ie ako %{count} dni nemožno zmazaÅ¥)" + many: "Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom používateľa. (Príspevky starÅ¡ie ako %{count} dní nemožno zmazaÅ¥)" + other: "Užívatelia nemôžu byÅ¥ vymazaní ak majú príspevky. Najprv zmažte príspevky až potom používateľa. (Príspevky starÅ¡ie ako %{count} dní nemožno zmazaÅ¥)" cant_delete_all_posts: - few: Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} dni. (Nastavenie delete_user_max_post_age ) - many: Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} dní. (Nastavenie delete_user_max_post_age ) - one: Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} deň. (Nastavenie delete_user_max_post_age ) - other: Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} dní. (Nastavenie delete_user_max_post_age ) + one: "Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} deň. (Nastavenie delete_user_max_post_age )" + few: "Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} dni. (Nastavenie delete_user_max_post_age )" + many: "Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} dní. (Nastavenie delete_user_max_post_age )" + other: "Nepodarilo sa zmazaÅ¥ vÅ¡etky príspevky. Niektoré príspevky sú starÅ¡ie ako %{count} dní. (Nastavenie delete_user_max_post_age )" cant_delete_all_too_many_posts: - few: Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako %{count} príspevky. (delete_all_posts_max) - many: Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako %{count} príspevkov. (delete_all_posts_max) - one: Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako 1 príspevok. (delete_all_posts_max) - other: Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako %{count} príspevkov. (delete_all_posts_max) + one: "Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako 1 príspevok. (delete_all_posts_max)" + few: "Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako %{count} príspevky. (delete_all_posts_max)" + many: "Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako %{count} príspevkov. (delete_all_posts_max)" + other: "Nedá sa zmazaÅ¥ vÅ¡etky píspevky, pretože používateľ má viac ako %{count} príspevkov. (delete_all_posts_max)" delete_confirm: "Ste si ISTÃ, že chcete zmazaÅ¥ tohoto používateľa? Už sa to nedá obnoviÅ¥!" delete_and_block: "ZazaÅ¥ a zablokovaÅ¥ tento email a IP adresu" delete_dont_block: "Iba vymazaÅ¥" @@ -2866,6 +2919,7 @@ sk: plugins: "Pluginy" user_preferences: "Používateľské Nastavenia" tags: "Å títky" + search: "HľadaÅ¥" groups: "Skupiny" badges: title: Odznaky @@ -2924,10 +2978,10 @@ sk: text: "Chýbajú ukážky práv. Toto sa stane, ak dotaz na odznak vráti ID používateľa alebo príspevku, ktorý neexistuje. Toto môže zapríÄiniÅ¥ neskorÅ¡ie neoÄakávané výsledky - prosíme znovu overte Váš dotaz." no_grant_count: "Žiadne odznaky na pridelenie." grant_count: - few: %{count} odznaky na pridelenie - many: %{count} odznakov na pridelenie - one: 1 odznak na pridelenie - other: %{count} odznakov na pridelenie + one: "1 odznak na pridelenie" + few: "%{count} odznaky na pridelenie" + many: "%{count} odznakov na pridelenie" + other: "%{count} odznakov na pridelenie" sample: "Vzor:" grant: with: "%{username}" @@ -2996,3 +3050,7 @@ sk: admin: "Administrátor" moderator: "Moderátor" regular: "Bežný používateľ" + previews: + topic_title: "Diskusná téma" + share_button: "ZdieľaÅ¥" + reply_button: "OdpoveÄ" diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index 8abdeb97e9..b7157c879a 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -40,96 +40,96 @@ sl: tiny: half_a_minute: "< 1 min" less_than_x_seconds: - few: < %{count} s - one: < %{count} s - other: < %{count} s - two: < %{count} s + one: "< %{count} s" + two: "< %{count} s" + few: "< %{count} s" + other: "< %{count} s" x_seconds: - few: '%{count} s' - one: '%{count} s' - other: '%{count} s' - two: '%{count} s' + one: "%{count} s" + two: "%{count} s" + few: "%{count} s" + other: "%{count} s" x_minutes: - few: '%{count} min' - one: '%{count} min' - other: '%{count} min' - two: '%{count} min' + one: "%{count} min" + two: "%{count} min" + few: "%{count} min" + other: "%{count} min" about_x_hours: - few: '%{count} h' - one: '%{count} h' - other: '%{count} h' - two: '%{count} h' + one: "%{count} h" + two: "%{count} h" + few: "%{count} h" + other: "%{count} h" x_days: - few: '%{count} d' - one: '%{count} d' - other: '%{count} d' - two: '%{count} d' + one: "%{count} d" + two: "%{count} d" + few: "%{count} d" + other: "%{count} d" about_x_years: - few: '%{count} l' - one: '%{count} l' - other: '%{count} l' - two: '%{count} l' + one: "%{count} l" + two: "%{count} l" + few: "%{count} l" + other: "%{count} l" over_x_years: - few: '> %{count} l' - one: '> %{count} l' - other: '> %{count} l' - two: '> %{count} l' + one: "> %{count} l" + two: "> %{count} l" + few: "> %{count} l" + other: "> %{count} l" almost_x_years: - few: '%{count} l' - one: '%{count} l' - other: '%{count} l' - two: '%{count} l' + one: "%{count} l" + two: "%{count} l" + few: "%{count} l" + other: "%{count} l" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - few: '%{count} minute' - one: '%{count} minuto' - other: '%{count} minut' - two: '%{count} minuti' + one: "%{count} minuto" + two: "%{count} minuti" + few: "%{count} minute" + other: "%{count} minut" x_hours: - few: '%{count} ure' - one: '%{count} uro' - other: '%{count} ur' - two: '%{count} uri' + one: "%{count} uro" + two: "%{count} uri" + few: "%{count} ure" + other: "%{count} ur" x_days: - few: '%{count} dnevi' - one: '%{count} dan' - other: '%{count} dni' - two: '%{count} dneva' + one: "%{count} dan" + two: "%{count} dneva" + few: "%{count} dnevi" + other: "%{count} dni" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - few: pred %{count} minutami - one: pred %{count} minuto - other: pred %{count} minutami - two: pred %{count} minutama + one: "pred %{count} minuto" + two: "pred %{count} minutama" + few: "pred %{count} minutami" + other: "pred %{count} minutami" x_hours: - few: pred %{count} urami - one: pred %{count} uro - other: pred %{count} urami - two: pred %{count} urama + one: "pred %{count} uro" + two: "pred %{count} urama" + few: "pred %{count} urami" + other: "pred %{count} urami" x_days: - few: pred %{count} dnevi - one: pred %{count} dnevom - other: pred %{count} dnevi - two: pred %{count} dnevoma + one: "pred %{count} dnevom" + two: "pred %{count} dnevoma" + few: "pred %{count} dnevi" + other: "pred %{count} dnevi" later: x_days: - few: Äez %{count} dneve - one: Äez %{count} dan - other: Äez %{count} dni - two: Äez %{count} dneva + one: "Äez %{count} dan" + two: "Äez %{count} dneva" + few: "Äez %{count} dneve" + other: "Äez %{count} dni" x_months: - few: Äez %{count} mesece - one: Äez %{count} mesec - other: Äez %{count} mesecev - two: Äez %{count} meseca + one: "Äez %{count} mesec" + two: "Äez %{count} meseca" + few: "Äez %{count} mesece" + other: "Äez %{count} mesecev" x_years: - few: Äez %{count} leta - one: Äez %{count} leto - other: Äez %{count} let - two: Äez %{count} leti + one: "Äez %{count} leto" + two: "Äez %{count} leti" + few: "Äez %{count} leta" + other: "Äez %{count} let" previous_month: 'PrejÅ¡nji mesec' next_month: 'Naslednji mesec' placeholder: datum @@ -208,15 +208,15 @@ sl: show_help: "možnosti" links: "Povezave" links_lowercase: - few: povezave - one: povezava - other: povezave - two: povezavi + one: "povezava" + two: "povezavi" + few: "povezave" + other: "povezave" faq: "FAQ" guidelines: "Navodila" privacy_policy: "Politika zasebnost" privacy: "Zasebnost" - terms_of_service: "Pogoji storitve" + tos: "Pogoji storitve" mobile_view: "Mobilni pogled" desktop_view: "Namizni pogled" you: "Ti" @@ -235,10 +235,10 @@ sl: max_of_count: "najveÄ od {{count}}" alternation: "ali" character_count: - few: '{{count}} znakov' - one: '{{count}} znak' - other: '{{count}} znakov' - two: '{{count}} znaka' + one: "{{count}} znak" + two: "{{count}} znaka" + few: "{{count}} znakov" + other: "{{count}} znakov" suggested_topics: title: "Predlagane Teme" pm_title: "Predlagana SporoÄila" @@ -306,20 +306,20 @@ sl: cancel: "PrekliÄi" view_pending: "ogled ÄakajoÄih objav" has_pending_posts: - few: Ta tema ima {{count}} objav, ki Äakajo odobritev - one: Ta tema ima 1 objavo, ki Äaka odobritev - other: Ta tema ima {{count}} objavo, ki Äakajo odobritev - two: Ta tema ima 2 objavi, ki Äakata odobritev + one: "Ta tema ima 1 objavo, ki Äaka odobritev" + two: "Ta tema ima 2 objavi, ki Äakata odobritev" + few: "Ta tema ima {{count}} objav, ki Äakajo odobritev" + other: "Ta tema ima {{count}} objavo, ki Äakajo odobritev" confirm: "Shrani Spremembe" delete_prompt: "Ali ste prepriÄani, da želite izbrisati %{username}? To bo odstranilo vse njihove objave ter blokiralo njihov e-poÅ¡tni naslov in IP naslov." approval: title: "Objava Potrebuje Odobritev." description: "Prejeli smo vaÅ¡o novo objavo vendar potrebuje odobritev iz strani moderatorja preden bo objavljena. Prosimo za potrpežljivost." pending_posts: - few: Imate {{count}} ÄakajoÄih objav. - one: Imate 1 ÄakajoÄo objavo. - other: Imate {{count}} ÄakajoÄih objav. - two: Imate {{count}} ÄakajoÄe objave. + one: "Imate 1 ÄakajoÄo objavo." + two: "Imate {{count}} ÄakajoÄe objave." + few: "Imate {{count}} ÄakajoÄih objav." + other: "Imate {{count}} ÄakajoÄih objav." ok: "V redu" user_action: user_posted_topic: "{{user}} je objavil temo" @@ -353,10 +353,10 @@ sl: posts_read: "Prebrano" posts_read_long: "Objave Prebrane" total_rows: - few: '%{count} uporabniki' - one: 1 uporabnik - other: '%{count} uporabnikov' - two: '%{count} uporabnika' + one: "1 uporabnik" + two: "%{count} uporabnika" + few: "%{count} uporabniki" + other: "%{count} uporabnikov" group_histories: actions: change_group_setting: "Spremeni nastavitve za skupino" @@ -391,10 +391,10 @@ sl: title: "Skupine" empty: "Ni javnih skupin." title: - few: Skupin - one: Skupina - other: Skupin - two: Skupini + one: "Skupina" + two: "Skupini" + few: "Skupin" + other: "Skupin" activity: "Aktivnost" topics: "Teme" posts: "Objave" @@ -443,15 +443,12 @@ sl: "14": "ÄŒaka odobritev" categories: all: "vse kategorije" - all_subcategories: "vse v %{categoryName}" no_subcategory: "niÄ" category: "Kategorija" category_list: "Prikaži seznam kategorij" reorder: title: "Razvrsti Kategorije" title_long: "Reorganiziraj seznam kategorij" - fix_order: "Fiksiraj pozicije" - fix_order_tooltip: "Nimajo vse kategorije unikatne Å¡tevilke pozicije kar lahko pripelje do nepriÄakovanih rezultatov." save: "Shrani vrstni red" apply_all: "Uporabi" position: "Pozicija" @@ -462,15 +459,15 @@ sl: toggle_ordering: "preklop nadzora razvrÅ¡Äanja" subcategories: "Pod Kategorija" topic_sentence: - few: '%{count} tem' - one: 1 tema - other: '%{count} tem' - two: 1 tema + one: "1 tema" + two: "1 tema" + few: "%{count} tem" + other: "%{count} tem" topic_stat_sentence: - few: '%{count} nove teme v preteklih %{unit}.' - one: '%{count} nova tema v preteklih %{unit}.' - other: '%{count} novih tem v preteklih %{unit}.' - two: '%{count} novi temi v preteklih %{unit}.' + one: "%{count} nova tema v preteklih %{unit}." + two: "%{count} novi temi v preteklih %{unit}." + few: "%{count} nove teme v preteklih %{unit}." + other: "%{count} novih tem v preteklih %{unit}." ip_lookup: title: Poizvedba IP naslova hostname: Ime gostitelja @@ -594,7 +591,6 @@ sl: title: "Spremeni O meni" change_username: title: "Spremeni uporabniÅ¡ko ime" - confirm: "ÄŒe spremenite uporabniÅ¡ko ime, vaÅ¡i obstojeÄi citati in omembe @imena ne bodo veÄ delovali. Ali ste prepriÄani da to želite?" taken: "Oprosti, to uporabniÅ¡ko ime je zasedeno." invalid: "UporabniÅ¡ko ime ni pravilno. Vsebuje lahko samo Ärke in Å¡tevilke. Preslednica in posebni znaki niso dovoljeni." change_email: @@ -611,7 +607,6 @@ sl: upload_title: "Prenesi svojo sliko" upload_picture: "Prenesi sliko" image_is_not_a_square: "Opozorilo: obrezali smo vaÅ¡o sliko; Å¡irina in viÅ¡ina nista bili enaki." - cache_notice: "UspeÅ¡no ste menjali profilno sliko, vendar utegne zaradi brskalnikovega predpomnilnika trajati nekaj Äasa, da se pojavi na strani." change_profile_background: title: "Ozadje profila" instructions: "Ozadje profila bo centrirano in imelo Å¡irino 850px." @@ -722,20 +717,20 @@ sl: time_read: "Äas branja" recent_time_read: "nedaven Äas branja" post_count: - few: ustvarjenih objav - one: ustvarjena objava - other: ustvarjenih objav - two: ustvarjeni objavi + one: "ustvarjena objava" + two: "ustvarjeni objavi" + few: "ustvarjenih objav" + other: "ustvarjenih objav" topics_entered: - few: ogledanih tem - one: ogledana tema - other: ogledanih tem - two: ogledani temi + one: "ogledana tema" + two: "ogledani temi" + few: "ogledanih tem" + other: "ogledanih tem" posts_read: - few: prebranih objav - one: prebrana objava - other: prebranih objav - two: prebrani objavi + one: "prebrana objava" + two: "prebrani objavi" + few: "prebranih objav" + other: "prebranih objav" top_replies: "NajboljÅ¡i odgovori" top_topics: "NajboljÅ¡e teme" no_topics: "Ni tem." @@ -768,10 +763,10 @@ sl: first_post: Prva objava last_post: Objavljeno replies_lowercase: - few: odgovorov one: odgovor - other: odgovorov two: odgovora + few: odgovorov + other: odgovorov summary: enabled_description: "Ogledujete si povzetek teme: najbolj zanimive objave, kot jih je doloÄila skupnost." enable: 'Pripravi povzetek teme' @@ -802,8 +797,6 @@ sl: provide_new_email: "VpiÅ¡ite nov naslov in ponovno vam bomo poslali potrditveno sporoÄilo." to_continue: "Prosimo Äe se prijavite" preferences: "Za spremembo nastavitev morate biti prijavljeni." - google: - message: "Overjanje z Googlom (pazi, da pojavno okno ne bo prepreÄeno)" google_oauth2: message: "Overjanje z Googlom (pazi, da pojavno okno ne bo prepreÄeno)" twitter: @@ -852,10 +845,10 @@ sl: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - few: {{username}}, {{username2}} in {{count}} drugih {{description}} - one: {{username}}, {{username2}} in Å¡e 1 {{description}} - other: {{username}}, {{username2}} in {{count}} drugih {{description}} - two: {{username}}, {{username2}} in 2 druga {{description}} + one: "{{username}}, {{username2}} in Å¡e 1 {{description}}" + two: "{{username}}, {{username2}} in 2 druga {{description}}" + few: "{{username}}, {{username2}} in {{count}} drugih {{description}}" + other: "{{username}}, {{username2}} in {{count}} drugih {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -974,10 +967,10 @@ sl: create_long: 'Ustvari novo temo' new: 'nova tema' new_topics: + one: '1 nova tema' + two: '2 novi temi' few: '{{count}} novih tem' - one: 1 nova tema other: '{{count}} novih tem' - two: 2 novi temi title: 'Tema' invalid_access: title: "Tema je zasebna" @@ -1076,20 +1069,20 @@ sl: pin_validation: "Datum je zahtevan, Äe želite pripeti to temo." not_pinned: "Ni pripetih tem v {{categoryLink}}." already_pinned: - few: 'Trenutno pripete teme v {{categoryLink}}: {{count}}' - one: 'Trenutno pripeta tema v {{categoryLink}}: {{count}}' - other: 'Trenutno pripete teme v {{categoryLink}}: {{count}}' - two: 'Trenutno pripeti temi v {{categoryLink}}: {{count}}' + one: "Trenutno pripeta tema v {{categoryLink}}: {{count}}" + two: "Trenutno pripeti temi v {{categoryLink}}: {{count}}" + few: "Trenutno pripete teme v {{categoryLink}}: {{count}}" + other: "Trenutno pripete teme v {{categoryLink}}: {{count}}" pin_globally: "Ta tema naj se pojavi na vrhu vseh seznamov tem do" confirm_pin_globally: "Trenutno imate {{count}} globalno pripetih tem. PreveÄ pripetih tem je lahko breme za nove in anonimne uporabnike. Ali ste prepriÄani da želite pripeti Å¡e eno globalno temo?" unpin_globally: "Odstrani to temo z vrha vseh seznamov tem." global_pin_note: "Uporabniki lahko sami zase odpnejo temo." not_pinned_globally: "Ni globalno pripetih tem." already_pinned_globally: - few: 'Trenutno globalno pripete teme: {{count}}' - one: 'Trenutno globalno pripeta tema: 1' - other: 'Trenutno globalno pripete teme: {{count}}' - two: 'Trenutno globalno pripeti temi: 2' + one: "Trenutno globalno pripeta tema: 1" + two: "Trenutno globalno pripeti temi: 2" + few: "Trenutno globalno pripete teme: {{count}}" + other: "Trenutno globalno pripete teme: {{count}}" invite_private: title: 'Povabi k sporoÄilu' email_or_username: "Email ali uporabniÅ¡ko ime vabljenega" @@ -1140,7 +1133,6 @@ sl: category: none: '(brez kategorije)' all: 'Vse kategorije' - choose: 'Izberi kategorijo…' edit: 'uredi' edit_long: "Uredi" view: 'Poglej teme v kategoriji' @@ -1219,24 +1211,24 @@ sl: original_post: "Izvirna objava" views: "Ogledi" views_lowercase: - few: ogledov - one: ogleda - other: ogledov - two: ogleda + one: "ogleda" + two: "ogleda" + few: "ogledov" + other: "ogledov" replies: "Odgovori" activity: "Aktivnost" likes: "VÅ¡eÄki" likes_lowercase: - few: vÅ¡eÄki - one: vÅ¡eÄek - other: vÅ¡eÄki - two: vÅ¡eÄka + one: "vÅ¡eÄek" + two: "vÅ¡eÄka" + few: "vÅ¡eÄki" + other: "vÅ¡eÄki" users: "Uporabniki" users_lowercase: - few: uporabnikov - one: uporabnik - other: uporabnikov - two: uporabnika + one: "uporabnik" + two: "uporabnika" + few: "uporabnikov" + other: "uporabnikov" category_title: "Kategorija" filters: with_topics: "%{filter} tem" @@ -1244,10 +1236,10 @@ sl: latest: title: "NajnovejÅ¡e" title_with_count: - few: Zadnjih ({{count}}) - one: Zadnji (1) - other: Zadnjih ({{count}}) - two: Zadnja ({{count}}) + one: "Zadnji (1)" + two: "Zadnja ({{count}})" + few: "Zadnjih ({{count}})" + other: "Zadnjih ({{count}})" help: "teme z nedavnimi objavami" hot: title: "VroÄe" @@ -1265,29 +1257,29 @@ sl: unread: title: "Neprebrano" title_with_count: - few: Neprebrani ({{count}}) - one: Neprebrani (1) - other: Neprebranih ({{count}}) - two: Neprebrani (2) + one: "Neprebrani (1)" + two: "Neprebrani (2)" + few: "Neprebrani ({{count}})" + other: "Neprebranih ({{count}})" help: "teme, ki jih spremljate ali jim sledite z neprebranimi sporoÄili" lower_title_with_count: - few: '{{count}} neprebranih' - one: 1 neprebran - other: '{{count}} neprebranih' - two: '{{count}} neprebrana' + one: "1 neprebran" + two: "{{count}} neprebrana" + few: "{{count}} neprebranih" + other: "{{count}} neprebranih" new: lower_title_with_count: - few: '{{count}} novih' - one: 1 nov - other: '{{count}} novih' - two: 2 novi + one: "1 nov" + two: "2 novi" + few: "{{count}} novih" + other: "{{count}} novih" lower_title: "novo" title: "Novo" title_with_count: - few: Novi (1) - one: Novi (1) - other: Novi ({{count}}) - two: Novi (1) + one: "Novi (1)" + two: "Novi (1)" + few: "Novi (1)" + other: "Novi ({{count}})" help: "teme ustvarjene v zadnjih dneh" posted: help: "teme v katerih ste objavljali" @@ -1297,10 +1289,10 @@ sl: category: title: "{{categoryName}}" title_with_count: - few: '{{categoryName}} ({{count}})' - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' - two: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + two: "{{categoryName}} ({{count}})" + few: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "zadnje teme v kategoriji {{categoryName}}" top: title: "NajboljÅ¡e" @@ -1631,10 +1623,10 @@ sl: clear_filter: "PoÄisti" show_words: "pokaži besede" word_count: - few: '%{count} besed' - one: 1 beseda - other: '%{count} besed' - two: 2 besedi + one: "1 beseda" + two: "2 besedi" + few: "%{count} besed" + other: "%{count} besed" actions: block: 'Blokiraj' censor: 'Cenzuriraj' diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index 901adcdefb..68f61577f1 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -43,62 +43,62 @@ sq: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1o - other: '%{count}o' + one: "1o" + other: "%{count}o" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_years: - one: 1v - other: '%{count}v' + one: "1v" + other: "%{count}v" over_x_years: - one: '> 1v' - other: '> %{count}v' + one: "> 1v" + other: "> %{count}v" almost_x_years: - one: 1v - other: '%{count}v' + one: "1v" + other: "%{count}v" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} mins' + one: "1 min" + other: "%{count} mins" x_hours: - one: 1 orë - other: '%{count} orë' + one: "1 orë" + other: "%{count} orë" x_days: - one: 1 ditë - other: '%{count} ditë' + one: "1 ditë" + other: "%{count} ditë" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: 1 min më parë - other: '%{count} min më parë' + one: "1 min më parë" + other: "%{count} min më parë" x_hours: - one: 1 orë më parë - other: '%{count} orë më parë' + one: "1 orë më parë" + other: "%{count} orë më parë" x_days: - one: 1 ditë më parë - other: '%{count} ditë më parë' + one: "1 ditë më parë" + other: "%{count} ditë më parë" later: x_days: - one: 1 ditë më vonë - other: '%{count} ditë më vonë' + one: "1 ditë më vonë" + other: "%{count} ditë më vonë" x_months: - one: 1 muaj më vonë - other: '%{count} muaj më vonë' + one: "1 muaj më vonë" + other: "%{count} muaj më vonë" x_years: - one: 1 vit më vonë - other: '%{count} vjet më vonë' + one: "1 vit më vonë" + other: "%{count} vjet më vonë" previous_month: 'Muaji i kaluar' next_month: 'Muaji i ardhshëm' share: @@ -172,13 +172,13 @@ sq: show_help: "ndihmë dhe kërko me Google" links: "Lidhjet" links_lowercase: - one: lidhje - other: lidhje + one: "lidhje" + other: "lidhje" faq: "Pyetje të shpeshta" guidelines: "Udhëzimet" privacy_policy: "Politika e Privatësisë" privacy: "Privatësia" - terms_of_service: "Kushtet e shërbimit" + tos: "Kushtet e shërbimit" mobile_view: "Pamja për celular" desktop_view: "Pamja për desktop" you: "Ju" @@ -197,8 +197,8 @@ sq: max_of_count: "max i {{count}}" alternation: "ose" character_count: - one: '{{count}} shkronjë' - other: '{{count}} shkronja' + one: "{{count}} shkronjë" + other: "{{count}} shkronja" suggested_topics: title: "Temat e sugjeruara" pm_title: "Mesazhet e sugjeruara" @@ -265,16 +265,16 @@ sq: cancel: "Anulo" view_pending: "shiko postimet në pritje" has_pending_posts: - one: This topic has 1 post awaiting approval - other: Kjo temë ka {{count}} postime që presin aprovimin + one: "This topic has 1 post awaiting approval" + other: "Kjo temë ka {{count}} postime që presin aprovimin" confirm: "Ruaj ndryshimet" delete_prompt: "Vertet doni ta fshini %{username}? Ky veprim do të fshijë çdo postim të tyrin dhe do të bllokojë email-in dhe adresën e tyre IP." approval: title: "Postimi ka nevojë për aprovim" description: "Postimi juaj u morr, por duhet të aprovohet nga një moderator para se të shfaqet në faqe. Kini pak durim. " pending_posts: - one: Ju keni 1 postim në pritje. - other: Ju keni {{count}} postime në pritje. + one: "Ju keni 1 postim në pritje." + other: "Ju keni {{count}} postime në pritje." ok: "OK" user_action: user_posted_topic: "{{user}} postoi temën" @@ -308,8 +308,8 @@ sq: posts_read: "Lexuar" posts_read_long: "Postimet e lexuara" total_rows: - one: 1 anëtar - other: '%{count} anëtarë' + one: "1 anëtar" + other: "%{count} anëtarë" group_histories: actions: change_group_setting: "Ndrysho parametrin e grupit" @@ -379,8 +379,6 @@ sq: reorder: title: "Rendit kategoritë" title_long: "Ri-organizo listën e kategorive" - fix_order: "Rregullo pozicionet" - fix_order_tooltip: "Jo të gjitha kategoritë kanë një numër pozicioni unik, kjo mund të shkaktojë rezultate të paparashikuara." save: "Ruaje renditjen" apply_all: "Apliko" position: "Pozicioni" @@ -390,11 +388,11 @@ sq: latest_by: "e fundit nga" subcategories: "Nënkategori" topic_sentence: - one: 1 temë - other: '%{count} tema' + one: "1 temë" + other: "%{count} tema" topic_stat_sentence: - one: '%{count} temë e re gjatë %{unit} të fundit.' - other: '%{count} tema të reja gjatë %{unit} të fundit.' + one: "%{count} temë e re gjatë %{unit} të fundit." + other: "%{count} tema të reja gjatë %{unit} të fundit." ip_lookup: title: Shiko adresën IP hostname: Hostname @@ -533,7 +531,6 @@ sq: error: "Pati një gabim gjatë ndryshimit të kësaj të dhëne." change_username: title: "Ndrysho emrin e përdoruesit" - confirm: "Nëse ndryshoni emrin e përdoruesit të gjitha citimet e mëparshme dhe përmendjet @emër do të prishen. A jeni 100% të sigurtë që doni të ndryshoni emrin?" taken: "Na vjen keq, por ky emër është i zënë." invalid: "Emri i përdoruesit nuk është i vlefshëm. Duhet të përmbaje vetëm shkronja ose numra" change_email: @@ -553,7 +550,6 @@ sq: upload_title: "Ngarkoni foton tuaj" upload_picture: "Ngarko Foto" image_is_not_a_square: "Vini re: fotoja juaj është përshtatur, pasi nuk ishte katrore." - cache_notice: "Fotografia e profilit tuaj u ndryshua por paraqitja në faqe mund të vonohet, për shkak të ruajtjes në memorjen \"cache\" të shfletuesit tuaj. " change_profile_background: title: "Sfondi i profilit" instructions: "Sfondi i profilit do të vendoset në qendër dhe do të ketë një gjerësi prej 850px." @@ -568,8 +564,8 @@ sq: authenticated: "Emaili juaj është verifikuar nga {{provider}}" frequency_immediately: "Do t'ju dërgojmë një email menjëherë nëse nuk e keni lexuar temën për të cilën po ju dërgojmë email." frequency: - one: Do t'ju dërgojmë një email vetëm nëse nuk të kemi parë në faqe në minutën e fundit. - other: Do t'ju dërgojmë një email vetëm nëse nuk të kemi parë në faqe në {{count}} minutat e fundit. + one: "Do t'ju dërgojmë një email vetëm nëse nuk të kemi parë në faqe në minutën e fundit." + other: "Do t'ju dërgojmë një email vetëm nëse nuk të kemi parë në faqe në {{count}} minutat e fundit." name: title: "Emri juaj" instructions: "emri i plotë (opsional)" @@ -653,8 +649,8 @@ sq: user: "Anëtari i ftuar" sent: "Dërguar" truncated: - one: Po afishohet ftesa e parë. - other: Po afishohen {{count}} ftesat e para. + one: "Po afishohet ftesa e parë." + other: "Po afishohen {{count}} ftesat e para." redeemed: "Ftesa të Shlyera" redeemed_tab: "Shlyer" redeemed_tab_with_count: "Shlyer ({{count}})" @@ -693,20 +689,20 @@ sq: stats: "Statistikat" time_read: "koha e leximit" topic_count: - one: temë e krijuar - other: tema të krijuara + one: "temë e krijuar" + other: "tema të krijuara" post_count: - one: postim i krijuar - other: postime të krijuara + one: "postim i krijuar" + other: "postime të krijuara" days_visited: - one: ditë që viziton faqen - other: ditë që viziton faqen + one: "ditë që viziton faqen" + other: "ditë që viziton faqen" posts_read: - one: postim i lexuar - other: postime të lexuar + one: "postim i lexuar" + other: "postime të lexuar" bookmark_count: - one: temë e preferuar - other: tema të preferuara + one: "temë e preferuar" + other: "tema të preferuara" top_replies: "Përgjigjet popullore" no_replies: "Nuk ka ende përgjigje." more_replies: "Më shumë përgjigje" @@ -722,7 +718,6 @@ sq: most_liked_users: "Më të pëlqyer" most_replied_to_users: "Me më shumë përgjigje" no_likes: "Nuk ka ende asnjë pëlqim." - associated_accounts: "Identifikime" ip_address: title: "Adresa IP e fundit" registration_ip_address: @@ -772,8 +767,8 @@ sq: too_few_posts_notice: "Hajt ta nisim mbarë diskutimin! Keni krijuar %{currentPosts} / %{requiredPosts} postime në faqe. Vizitorët e rinj të faqes kanë nevojë për diskutime në faqe. " logs_error_rate_notice: rate: - one: 1 gabim/%{duration} - other: '%{count} gabime/%{duration}' + one: "1 gabim/%{duration}" + other: "%{count} gabime/%{duration}" learn_more: "mëso më shumë..." all_time: 'total' all_time_desc: 'totali i temave të krijuara' @@ -796,8 +791,6 @@ sq: hide_session: "Më rikujto nesër" hide_forever: "jo faleminderit" hidden_for_session: "OK, do t'ju rikujtojmë nesër. Sidoqoftë, ju mund të përdorni butonin 'Identifikohu' për të hapur një llogari. " - intro: "Njatjeta! :heart_eyes: Sikur po ju pëlqen diskutimi... po s'jeni anëtarësuar akoma në faqe. " - value_prop: "Kur krijoni një llogari në faqe, sistemi mban mend se çfarë keni lexuar, që të mund të riktheheni aty ku e latë. Ju ofrojmë gjithashtu njoftime në shfletues ose me email, sa herë që ka postime të reja. :heartbeat:" summary: enabled_description: "Po lexoni një përmbledhje të kësaj teme: postimet më interesante sipas vlerësimit të komunitetit." description: "Ka {{replyCount}} përgjigje." @@ -811,7 +804,6 @@ sq: disable: "Shfaq postimet e fshira" private_message_info: title: "Mesazh" - invite: "Fto të tjerë..." remove_allowed_user: "A doni vërtet të hiqni {{name}} nga ky mesazh?" remove_allowed_group: "Doni me të vërtetë të hiqni {{name}} nga ky mesazh? " email: 'Email' @@ -864,9 +856,6 @@ sq: preferences: "Duhet të identifikoheni për të ndryshuar preferencat e profilit." forgot: "Nuk i mbaj mend detajet e llogarisë" not_approved: "Llogaria juaj nuk është aprovuar ende. Do t'ju dërgojmë një email kur të aprovohet. " - google: - title: "me Google" - message: "Duke u identifikuar me Google (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" google_oauth2: title: "me Google" message: "Duke u identifikuar me Google (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" @@ -925,8 +914,8 @@ sq: similar_topics: "Tema juaj është e ngjashme me..." drafts_offline: "draftet offline" group_mentioned: - one: By mentioning {{group}}, you are about to notify 1 person – are you sure? - other: By mentioning {{group}}, you are about to notify {{count}} people – are you sure? + one: "By mentioning {{group}}, you are about to notify 1 person – are you sure?" + other: "By mentioning {{group}}, you are about to notify {{count}} people – are you sure?" cannot_see_mention: private: "Ju përmendët {{username}} , por ky anëtar nuk do të njoftohet sepse nuk kanë akses në këtë mesazh privat. Do t'ju duhet t'a ftoni anëtarin në këtë mesazh. " error: @@ -1066,8 +1055,8 @@ sq: archive_topics: "Arkivo temat" choose_new_category: "Zgjidhni kategorinë e re për temat: " selected: - one: Keni zgjedhur 1 temë. - other: Keni zgjedhur {{count}} tema. + one: "Keni zgjedhur 1 temë." + other: "Keni zgjedhur {{count}} tema." choose_new_tags: "Zgjidh etiketa të reja për këto tema:" changed_tags: "Etiketat e temave u ndryshuan. " none: @@ -1097,8 +1086,8 @@ sq: search: "Nuk ka më rezultate nga kërkimi. " topic: filter_to: - one: 1 postim në temë - other: '{{count}} postime në temë' + one: "1 postim në temë" + other: "{{count}} postime në temë" create: 'Temë e re' create_long: 'Hap një temë të re' private_message: 'Fillo një mesazh' @@ -1112,10 +1101,10 @@ sq: new: 'temë e re' unread: 'palexuar' new_topics: - one: 1 temë e re + one: '1 temë e re' other: '{{count}} tema të reja' unread_topics: - one: 1 temë e palexuar + one: '1 temë e palexuar' other: '{{count}} tema të palexuara' title: 'Tema' invalid_access: @@ -1129,17 +1118,17 @@ sq: title: "Tema nuk u gjet" description: "Na vjen keq, nuk e gjetëm dot temën. Mund të jetë fshirë nga një moderator... " total_unread_posts: - one: ju keni 1 postim të palexuar në këtë temë - other: ju keni {{count}} postime të palexuara në këtë temë + one: "ju keni 1 postim të palexuar në këtë temë" + other: "ju keni {{count}} postime të palexuara në këtë temë" unread_posts: - one: ju keni 1 postim të vjetër të palexuar në këtë temë - other: ju keni {{count}} postime të vjetra të palexuara në këtë temë + one: "ju keni 1 postim të vjetër të palexuar në këtë temë" + other: "ju keni {{count}} postime të vjetra të palexuara në këtë temë" new_posts: - one: ka 1 postim të ri në këtë temë që nga hera e fundit që ishit këtu - other: ka {{count}} postime të reja në këtë temë që nga hera e fundit që ishit këtu + one: "ka 1 postim të ri në këtë temë që nga hera e fundit që ishit këtu" + other: "ka {{count}} postime të reja në këtë temë që nga hera e fundit që ishit këtu" likes: - one: ka 1 pëlqim në këtë temë - other: ka {{count}} pëlqime në këtë temë + one: "ka 1 pëlqim në këtë temë" + other: "ka {{count}} pëlqime në këtë temë" back_to_list: "Kthehu tek lista e temave" options: "Opsionet e temës" show_links: "trego lidhjet në këtë temë" @@ -1252,15 +1241,15 @@ sq: pin_validation: "Kërkohet data për ta ngjitur këtë temë në krye." not_pinned: "Nuk ka tema të përzgjedhura në {{categoryLink}}." already_pinned: - one: 'Temat kryesore të momentit në {{categoryLink}}: 1' - other: 'Temat kryesore të momentit në {{categoryLink}}: {{count}}' + one: "Temat kryesore të momentit në {{categoryLink}}: 1" + other: "Temat kryesore të momentit në {{categoryLink}}: {{count}}" pin_globally: "Shfaqe këtë temë në krye të listës së të gjitha temave deri më" confirm_pin_globally: "Ju tashmë keni {{count}} tema të përzgjedhura. Shumë tema të përzgjedhura mund të bëhen barrë për përdorues të rinj dhe anonimë. A jeni i sigurtë që dëshironi ta përzgjidhni një temë tjetër të gjithanëshme?" global_pin_note: "Përdoruesit mund ta çngjitin këtë temë veçan sipas dëshirës." not_pinned_globally: "Nuk ka tema të përzgjedhura kudo." already_pinned_globally: - one: 'Të gjitha temat kryesore të momentit: 1' - other: 'Të gjitha temat kryesore të momentit: {{count}}' + one: "Të gjitha temat kryesore të momentit: 1" + other: "Të gjitha temat kryesore të momentit: {{count}}" make_banner: "Ktheje këtë temë në një temë parrullë që shfaqet në krye të të gjitha faqeve." banner_note: "Përdoruesit mund ta heqin temën parrullë duke e mbyllur atë. Vetëm një temë mund të kthehet në parrullë në një moment të caktuar." no_banner_exists: "Nuk ka temë parrullë." @@ -1292,8 +1281,8 @@ sq: login_reply: 'Identifikohu për t''u Përgjigjur' filters: n_posts: - one: 1 postim - other: '{{count}} postime' + one: "1 postim" + other: "{{count}} postime" cancel: "Hiq filtrin" split_topic: title: "Ktheje në një temë të re" @@ -1301,15 +1290,15 @@ sq: topic_name: "Titulli i temës së re" error: "Pati një gabim gjatë transfertës drejt një teme të re." instructions: - one: Jeni duke krijuar një temë të re dhe duke e populluar atë me postimin që keni përzgjedhur. - other: Jeni duke krijuar një temë të re dhe duke e populluar atë me {{count}} postimet që keni përzgjedhur. + one: "Jeni duke krijuar një temë të re dhe duke e populluar atë me postimin që keni përzgjedhur." + other: "Jeni duke krijuar një temë të re dhe duke e populluar atë me {{count}} postimet që keni përzgjedhur." merge_topic: title: "Transfero tek një Temë tjetër" action: "transfero tek një temë tjetër" error: "Pati një gabim gjatë transfertës drejt një teme tjetër." instructions: - one: Ju lutem zgjidhni një temë ku do dëshironit ta zhvendosni këtë postim. - other: Ju lutem, zgjidhni një temë ku do të dëshironit të zhvendosni këto {{count}} postime. + one: "Ju lutem zgjidhni një temë ku do dëshironit ta zhvendosni këtë postim." + other: "Ju lutem, zgjidhni një temë ku do të dëshironit të zhvendosni këto {{count}} postime." merge_posts: title: "Bashkoni Postimet e Përzgjedhura" action: "bashkoni postimet e përzgjedhura" @@ -1334,7 +1323,7 @@ sq: deselect_all: pastro zgjedhjen description: one: Keni përzgjedhur 1 postim. - other: Keni përzgjedhur {{count}} postime. + other: "Keni përzgjedhur {{count}} postime." post: edit_reason: "Arsyeja:" post_number: "postimi {{number}}" @@ -1345,26 +1334,26 @@ sq: show_full: "Shfaq postimin e plotë" show_hidden: 'Shfaq materialin e fshehur.' deleted_by_author: - one: (post withdrawn by author, will be automatically deleted in %{count} hour unless flagged) - other: (postim i tërhequr nga autori, do të fshihet automatikisht në %{count} orë nëse nuk sinjalizohet) + one: "(post withdrawn by author, will be automatically deleted in %{count} hour unless flagged)" + other: "(postim i tërhequr nga autori, do të fshihet automatikisht në %{count} orë nëse nuk sinjalizohet)" expand_collapse: "zgjero/shkurto" gap: - one: shiko 1 përgjigje të fshehur - other: shiko {{count}} përgjigje të fshehura + one: "shiko 1 përgjigje të fshehur" + other: "shiko {{count}} përgjigje të fshehura" unread: "Postimi është i palexuar" has_replies: - one: '{{count}} Përgjigje' - other: '{{count}} përgjigje' + one: "{{count}} Përgjigje" + other: "{{count}} përgjigje" has_likes: - one: '{{count}} Pëlqim' - other: '{{count}} Pëlqime' + one: "{{count}} Pëlqim" + other: "{{count}} Pëlqime" has_likes_title: - one: 1 person pëlqeu këtë postim - other: '{{count}} vetë pëlqyen këtë postim' + one: "1 person pëlqeu këtë postim" + other: "{{count}} vetë pëlqyen këtë postim" has_likes_title_only_you: "ju pëlqeni këtë postim" has_likes_title_you: - one: ju dhe 1 person tjetër pëlqyet këtë postim - other: ju dhe {{count}} të tjerë pëlqyen këtë postim + one: "ju dhe 1 person tjetër pëlqyet këtë postim" + other: "ju dhe {{count}} të tjerë pëlqyen këtë postim" errors: create: "Na vjen keq, por ndodhi një gabim gjatë hapjes së temës. Provojeni përsëri." edit: "Na vjen keq, ndodhi një gabim gjatë redaktimit të temës. Provojeni përsëri." @@ -1413,7 +1402,6 @@ sq: inappropriate: "Anulo sinjalizimin" bookmark: "Hiqe nga të preferuarat" like: "Anulo pëlqimin" - vote: "Rikthe votën" people: off_topic: "sinjalizoi këtë postim si jashtë teme" spam: "sinjalizoi këtë postim si spam" @@ -1422,7 +1410,6 @@ sq: notify_user: "dërgoi një mesazh" bookmark: "e shtoi këtë tek të preferuarat" like: "pëlqeu këtë" - vote: "votoi për këtë" by_you: off_topic: "Ti sinjalizove këtë postim si jashtë teme" spam: "Ti sinjalizove këtë postim si spam" @@ -1431,57 +1418,50 @@ sq: notify_user: "Ju i dërguat një mesazh këtij përdoruesi" bookmark: "E ruajte këtë temë tek të preferuarat e tua" like: "Ju e pëlqyet këtë" - vote: "Votove për këtë postim" by_you_and_others: off_topic: - one: Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si jashtë teme - other: Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si jashtë teme + one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si jashtë teme" + other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si jashtë teme" spam: - one: Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si spam - other: Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si spam + one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si spam" + other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si spam" inappropriate: - one: Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si të papërshtatshëm - other: Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si të papërshtatshëm + one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si të papërshtatshëm" + other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si të papërshtatshëm" notify_moderators: - one: Ti dhe 1 anëtar tjetër sinjalizuat këtë postim për moderim - other: Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim për moderim + one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim për moderim" + other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim për moderim" notify_user: - one: Ju dhe 1 person tjetër i dërguat një mesazh këtij përdoruesi. - other: Ju dhe {{count}} persona të tjerë i dërguat një mesazh këtij përdoruesi. + one: "Ju dhe 1 person tjetër i dërguat një mesazh këtij përdoruesi." + other: "Ju dhe {{count}} persona të tjerë i dërguat një mesazh këtij përdoruesi." bookmark: - one: Ti dhe 1 anëtar tjetër shtuat këtë postim tek të preferuarat tuaja - other: Ti dhe {{count}} anëtarë të tjerë shtuat këtë postim tek të preferuarat tuaja + one: "Ti dhe 1 anëtar tjetër shtuat këtë postim tek të preferuarat tuaja" + other: "Ti dhe {{count}} anëtarë të tjerë shtuat këtë postim tek të preferuarat tuaja" like: - one: 'Ju dhe 1 person tjetër pëlqyet këtë ' - other: Ju dhe {{count}} të tjerë pëlqyen këtë postim - vote: - one: Ti dhe 1 anëtar tjetër votuat për këtë postim - other: Ti dhe {{count}} anëtarë të tjerë votuat për këtë postim + one: "Ju dhe 1 person tjetër pëlqyet këtë " + other: "Ju dhe {{count}} të tjerë pëlqyen këtë postim" by_others: off_topic: - one: 1 anëtar sinjalizoi këtë postim si jashtë teme - other: '{{count}} anëtarë sinjalizuan këtë postim si jashtë teme' + one: "1 anëtar sinjalizoi këtë postim si jashtë teme" + other: "{{count}} anëtarë sinjalizuan këtë postim si jashtë teme" spam: - one: 1 anëtar sinjalizoi këtë postim si spam - other: '{{count}} anëtarë sinjalizuan këtë postim si spam' + one: "1 anëtar sinjalizoi këtë postim si spam" + other: "{{count}} anëtarë sinjalizuan këtë postim si spam" inappropriate: - one: 1 anëtar sinjalizoi këtë postim si të papërshtatshëm - other: '{{count}} anëtarë sinjalizuan këtë postim si të papërshtatshëm' + one: "1 anëtar sinjalizoi këtë postim si të papërshtatshëm" + other: "{{count}} anëtarë sinjalizuan këtë postim si të papërshtatshëm" notify_moderators: - one: 1 anëtar sinjalizoi këtë postim për moderim - other: '{{count}} anëtarë sinjalizuan këtë postim për moderim' + one: "1 anëtar sinjalizoi këtë postim për moderim" + other: "{{count}} anëtarë sinjalizuan këtë postim për moderim" notify_user: - one: 1 person i dërgoi një mesazh këtij përdoruesi - other: '{{count}} i dërguan një mesazh këtij përdoruesi' + one: "1 person i dërgoi një mesazh këtij përdoruesi" + other: "{{count}} i dërguan një mesazh këtij përdoruesi" bookmark: - one: 1 anëtar shtoi këtë postim tek të preferuarat - other: '{{count}} anëtarë shtuan këtë postim tek të preferuarat' + one: "1 anëtar shtoi këtë postim tek të preferuarat" + other: "{{count}} anëtarë shtuan këtë postim tek të preferuarat" like: - one: 1 person pëlqeu këtë postim - other: '{{count}} vetë pëlqyen këtë postim' - vote: - one: 1 anëtar votoi për këtë postim - other: '{{count}} anëtarë votuan për këtë postim' + one: "1 person pëlqeu këtë postim" + other: "{{count}} vetë pëlqyen këtë postim" revisions: controls: first: "Revizioni i parë" @@ -1511,7 +1491,6 @@ sq: can: 'mund… ' none: '(pa kategori)' all: 'Të gjitha kategoritë' - choose: 'Zgjidhni një kategori…' edit: 'redakto' edit_long: "Redakto" view: 'Shiko temat në kategorinë' @@ -1558,7 +1537,6 @@ sq: edit_permissions: "Ndryshoni autorizimet" add_permission: "Shtoni autorizim" this_year: "këtë vit" - position: "pozicion" default_position: "Default Position" position_disabled: "Kategoritue do të renditen sipas aktivitetit. Për të kontrolluar renditjen e kategorive nëpër lista, " position_disabled_click: 'aktivizoni rregullimin "pozicione fikse për kategoritë".' @@ -1599,14 +1577,14 @@ sq: custom_placeholder_notify_moderators: "Na thoni specifikisht se çfarë ju shqetëson dhe na jepni lidhje dhe shembuj konkretë brenda mundësive. " custom_message: at_least: - one: futni së paku 1 gërmë - other: futni së paku {{count}} gërma + one: "futni së paku 1 gërmë" + other: "futni së paku {{count}} gërma" more: - one: edhe 1 për të vazhduar... - other: edhe {{count}} për të vazhduar... + one: "edhe 1 për të vazhduar..." + other: "edhe {{count}} për të vazhduar..." left: - one: edhe 1 gërmë - other: edhe {{count}} gërma + one: "edhe 1 gërmë" + other: "edhe {{count}} gërma" flagging_topic: title: "Faleminderit për ndihmën që i jepni këtij komuniteti!" action: "Raporto Temën" @@ -1617,13 +1595,13 @@ sq: links_title: "Lidhje Aktive" links_shown: "trego më shumë lidhje..." clicks: - one: 1 klik - other: '%{count} klikime' + one: "1 klik" + other: "%{count} klikime" post_links: about: "trego më shumë lidhje për këtë postim" title: - one: edhe 1 - other: edhe %{count} + one: "edhe 1" + other: "edhe %{count}" topic_statuses: warning: help: "Ky është një paralajmërim zyrtar." @@ -1651,19 +1629,19 @@ sq: original_post: "Postimi Origjinal" views: "Shikimet" views_lowercase: - one: shikim - other: shikime + one: "shikim" + other: "shikime" replies: "Përgjigjet" activity: "Aktiviteti" likes: "Pëlqimet" likes_lowercase: - one: pëlqim - other: pëlqime + one: "pëlqim" + other: "pëlqime" likes_long: "ka {{number}} pëlqime në këtë temë" users: "Përdoruesit" users_lowercase: - one: përdorues - other: përdorues + one: "përdorues" + other: "përdorues" category_title: "Kategoria" history: "Historia" changed_by: "nga {{author}}" @@ -1674,8 +1652,8 @@ sq: latest: title: "Më të fundit" title_with_count: - one: 'Më të fundit (1) ' - other: 'Më të fundit ({{count}}) ' + one: "Më të fundit (1) " + other: "Më të fundit ({{count}}) " help: "temat me postime të fundit" hot: title: "Të nxehta" @@ -1693,21 +1671,21 @@ sq: unread: title: "Të palexuara" title_with_count: - one: Të palexuara (1) - other: Të palexuara ({{count}}) + one: "Të palexuara (1)" + other: "Të palexuara ({{count}})" help: "topics you are currently watching or tracking with unread posts" lower_title_with_count: - one: 1 e palexuar - other: '{{count}} të palexuara' + one: "1 e palexuar" + other: "{{count}} të palexuara" new: lower_title_with_count: - one: 1 e re - other: '{{count}} të reja' + one: "1 e re" + other: "{{count}} të reja" lower_title: "e re" title: "Të reja" title_with_count: - one: Të reja (1) - other: Të reja ({{count}}) + one: "Të reja (1)" + other: "Të reja ({{count}})" help: "temat e krijuar gjatë ditëve të fundit" posted: title: "Postimet e mia" @@ -1718,8 +1696,8 @@ sq: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "temat e fundit në kategorinë {{categoryName}}" top: title: "Popullore" @@ -1802,22 +1780,22 @@ sq: print: 'ctrl+p Printo temën' badges: earned_n_times: - one: Kjo stemë është fituar 1 herë - other: Kjo stemë është fituar %{count} herë + one: "Kjo stemë është fituar 1 herë" + other: "Kjo stemë është fituar %{count} herë" granted_on: "Atribuar më %{date}" others_count: "Të tjerë me këtë stemë (%{count})" title: Stemat allow_title: "Mund t'a përdorësh këtë stemë si titull" multiple_grant: "Kjo stemë mund të fitohet disa herë" badge_count: - one: 1 stemë - other: '%{count} stema' + one: "1 stemë" + other: "%{count} stema" more_badges: - one: +1 tjetër - other: +%{count} të tjera + one: "+1 tjetër" + other: "+%{count} të tjera" granted: - one: 1 e akorduar - other: '%{count} të akorduara' + one: "1 e akorduar" + other: "%{count} të akorduara" select_badge_for_title: Zgjidhni një stemë për ta përdorur si titullin tuaj badge_grouping: getting_started: @@ -2175,7 +2153,6 @@ sq: title: "Filtro" user_placeholder: "username" address_placeholder: "emri@shembull.com" - skipped_reason_placeholder: "arsye" logs: title: "Ditari" action: "Veprimi" @@ -2277,11 +2254,11 @@ sq: suspect: 'Të dyshimtë' approved: "Aprovuar?" approved_selected: - one: aprovo përdoruesin - other: aprovo përdoruesit ({{count}}) + one: "aprovo përdoruesin" + other: "aprovo përdoruesit ({{count}})" reject_selected: - one: refuzo përdoruesin - other: refuzo përdoruesit ({{count}}) + one: "refuzo përdoruesin" + other: "refuzo përdoruesit ({{count}})" titles: active: 'Përdorues Aktivë' new: 'Përdorues të Rinj' @@ -2297,11 +2274,11 @@ sq: suspended: 'Përdorues të Pezulluar' suspect: 'Përdorues të Dyshimtë' reject_successful: - one: 'Ju refuzuat %{count} përdorues me sukses. ' - other: 'Ju refuzuat %{count} përdoruesë me sukses. ' + one: "Ju refuzuat %{count} përdorues me sukses. " + other: "Ju refuzuat %{count} përdoruesë me sukses. " reject_failures: - one: Nuk arritëm të refuzojmë 1 përdorues. - other: 'Nuk arritëm të refuzojmë %{count} përdoruesë. ' + one: "Nuk arritëm të refuzojmë 1 përdorues." + other: "Nuk arritëm të refuzojmë %{count} përdoruesë. " not_verified: "I pa verifikuar" check_email: title: "Shfaq adresën email të këtij përdoruesi." @@ -2385,8 +2362,8 @@ sq: tl3_requirements: title: "Kërkesat për përdorues me Nivel Besimi 3" table_title: - one: 'gjatë ditës së fundit:' - other: 'Në %{count} ditët e fundit:' + one: "gjatë ditës së fundit:" + other: "Në %{count} ditët e fundit:" value_heading: "Vlera" requirement_heading: "Kërkesë" visits: "Vizita" @@ -2533,8 +2510,8 @@ sq: header: "KUJDES!" no_grant_count: "Asnjë stemë për t'u dhënë." grant_count: - one: 1 stemë për t'u dhënë. - other: %{count} stema për t'u dhënë. + one: "1 stemë për t'u dhënë." + other: "%{count} stema për t'u dhënë." sample: "Shëmbull:" grant: with: "%{username}" diff --git a/config/locales/client.sr.yml b/config/locales/client.sr.yml index 9587e80bf3..cdb2b19529 100644 --- a/config/locales/client.sr.yml +++ b/config/locales/client.sr.yml @@ -16,8 +16,8 @@ sr: format: '%n %u' units: byte: - few: Bajta one: Bajt + few: Bajta other: Bajta gb: GB kb: KB @@ -44,87 +44,87 @@ sr: tiny: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count} s - one: < %{count} s - other: < %{count} s + one: "< %{count} s" + few: "< %{count} s" + other: "< %{count} s" x_seconds: - few: '%{count} sek.' - one: '%{count} sek.' - other: '%{count} sek.' + one: "%{count} sek." + few: "%{count} sek." + other: "%{count} sek." less_than_x_minutes: - few: < %{count}m - one: < %{count}m - other: < %{count}m + one: "< %{count}m" + few: "< %{count}m" + other: "< %{count}m" x_minutes: - few: '%{count} min' - one: '%{count} min' - other: '%{count} min' + one: "%{count} min" + few: "%{count} min" + other: "%{count} min" about_x_hours: - few: '%{count} sata' - one: '%{count} sat' - other: '%{count} sati' + one: "%{count} sat" + few: "%{count} sata" + other: "%{count} sati" x_days: - few: '%{count} dana' - one: '%{count} dan' - other: '%{count} dana' + one: "%{count} dan" + few: "%{count} dana" + other: "%{count} dana" x_months: - few: '%{count}mes' - one: '%{count} mes' - other: '%{count}mes' + one: "%{count} mes" + few: "%{count}mes" + other: "%{count}mes" about_x_years: - few: '%{count} godine' - one: '%{count} godina' - other: '%{count} godina' + one: "%{count} godina" + few: "%{count} godine" + other: "%{count} godina" over_x_years: - few: '> %{count} godine' - one: '> %{count} godina' - other: '> %{count} godina' + one: "> %{count} godina" + few: "> %{count} godine" + other: "> %{count} godina" almost_x_years: - few: '%{count} godine' - one: '%{count} godina' - other: '%{count} godina' + one: "%{count} godina" + few: "%{count} godine" + other: "%{count} godina" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - few: '%{count} min' - one: '%{count} min' - other: '%{count} min' + one: "%{count} min" + few: "%{count} min" + other: "%{count} min" x_hours: - few: '%{count} sata' - one: '%{count} sat' - other: '%{count} sati' + one: "%{count} sat" + few: "%{count} sata" + other: "%{count} sati" x_days: - few: '%{count} dana' - one: '%{count} dan' - other: '%{count} dana' + one: "%{count} dan" + few: "%{count} dana" + other: "%{count} dana" date_year: "D MMM 'YY" medium_with_ago: x_minutes: - few: pre %{count} minuta - one: pre %{count} minut - other: pre %{count} minuta + one: "pre %{count} minut" + few: "pre %{count} minuta" + other: "pre %{count} minuta" x_hours: - few: pre %{count} sata - one: pre %{count} sat - other: pre %{count} sati + one: "pre %{count} sat" + few: "pre %{count} sata" + other: "pre %{count} sati" x_days: - few: pre %{count} dana - one: pre %{count} dan - other: pre %{count} dana + one: "pre %{count} dan" + few: "pre %{count} dana" + other: "pre %{count} dana" later: x_days: - few: '%{count} dana kasnije' - one: '%{count} dan kasnije' - other: '%{count} dana kasnije' + one: "%{count} dan kasnije" + few: "%{count} dana kasnije" + other: "%{count} dana kasnije" x_months: - few: '%{count} meseca kasnije' - one: '%{count} mesec kasnije' - other: '%{count} meseci kasnije' + one: "%{count} mesec kasnije" + few: "%{count} meseca kasnije" + other: "%{count} meseci kasnije" x_years: - few: '%{count} godine kasnije' - one: '%{count} godina kasnije' - other: '%{count} godina kasnije' + one: "%{count} godina kasnije" + few: "%{count} godine kasnije" + other: "%{count} godina kasnije" previous_month: 'Prethodni mesec' next_month: 'Sledeći mesec' placeholder: datum @@ -203,14 +203,14 @@ sr: show_help: "opcije" links: "Linkovi" links_lowercase: - few: linkovi - one: link - other: linkovi + one: "link" + few: "linkovi" + other: "linkovi" faq: "FAQ (Äesto postavljana pitanja)" guidelines: "Smernice" privacy_policy: "Politika Privatnosti" privacy: "Privatnost" - terms_of_service: "Uslovi Korišćenja" + tos: "Uslovi Korišćenja" mobile_view: "Mobilni pogled" desktop_view: "RaÄunarski pogled" you: "Ti" @@ -229,9 +229,9 @@ sr: max_of_count: "maksimalno od {{count}}" alternation: "ili" character_count: - few: '{{count}} karaktera' - one: '{{count}} karakter' - other: '{{count}} karaktera' + one: "{{count}} karakter" + few: "{{count}} karaktera" + other: "{{count}} karaktera" suggested_topics: title: "Predložene Teme" pm_title: "Predložene poruke" @@ -299,9 +299,9 @@ sr: cancel: "Otkaži" view_pending: "vidi poruke na Äekanju" has_pending_posts: - few: Ova tema ima {{count}} poruke koje Äekaju na odobrenje - one: Ova tema ima {{count}} poruku koje Äekaju na odobrenje - other: Ova tema ima {{count}} poruka koje Äekaju na odobrenje + one: "Ova tema ima {{count}} poruku koje Äekaju na odobrenje" + few: "Ova tema ima {{count}} poruke koje Äekaju na odobrenje" + other: "Ova tema ima {{count}} poruka koje Äekaju na odobrenje" confirm: "SaÄuvaj izmene" delete_prompt: "Da li si siguran da želiÅ¡ obrisati %{username}? Ovim ćeÅ¡ obrisati sve njegove postove i blokirati njegov email i IP adresu." approval: @@ -340,9 +340,9 @@ sr: posts_read: "ProÄitano" posts_read_long: "Postova proÄitano" total_rows: - few: '%{count} korisnika' - one: '{count} korisnik' - other: '%{count} korisnika' + one: "{count} korisnik" + few: "%{count} korisnika" + other: "%{count} korisnika" groups: owner: "vlasnik" index: @@ -386,9 +386,9 @@ sr: toggle_ordering: "odredi kontrolu smera" subcategories: "Podkategorije" topic_stat_sentence: - few: '%{count} novih tema u poslednjih %{unit}.' - one: '%{count} nova tema u poslednjih %{unit}.' - other: '%{count} novih tema u poslednjih %{unit}.' + one: "%{count} nova tema u poslednjih %{unit}." + few: "%{count} novih tema u poslednjih %{unit}." + other: "%{count} novih tema u poslednjih %{unit}." ip_lookup: title: Pretraga po IP adresi hostname: Ime raÄunara @@ -591,37 +591,37 @@ sr: time_read: "vreme Äitanja" recent_time_read: "vreme nedavnih Äitanja" topic_count: - few: kreirane teme - one: kreirana tema - other: kreiranih tema + one: "kreirana tema" + few: "kreirane teme" + other: "kreiranih tema" post_count: - few: kreirana posta - one: kreiran post - other: kreiranih postova + one: "kreiran post" + few: "kreirana posta" + other: "kreiranih postova" likes_given: - few: dato - one: dato - other: dato + one: "dato" + few: "dato" + other: "dato" likes_received: - few: primljeno - one: primljeno - other: primljeno + one: "primljeno" + few: "primljeno" + other: "primljeno" days_visited: - few: dana posećivao - one: dan posećivao - other: dana posećivao + one: "dan posećivao" + few: "dana posećivao" + other: "dana posećivao" topics_entered: - few: tema pregledao - one: temu pregledao - other: tema pregledao + one: "temu pregledao" + few: "tema pregledao" + other: "tema pregledao" posts_read: - few: postova proÄitao - one: postova proÄitao - other: postova proÄitao + one: "postova proÄitao" + few: "postova proÄitao" + other: "postova proÄitao" bookmark_count: - few: oznaÄene - one: oznaÄena - other: oznaÄenih + one: "oznaÄena" + few: "oznaÄene" + other: "oznaÄenih" top_replies: "Top odgovori" no_replies: "Bez odgovora, joÅ¡ uvek." more_replies: "JoÅ¡ odgovora" @@ -637,7 +637,6 @@ sr: most_liked_users: "NajviÅ¡e sviÄ‘anja" most_replied_to_users: "NajviÅ¡e odgovora ka" no_likes: "Bez sviÄ‘anja, joÅ¡ uvek" - associated_accounts: "Logovanja" ip_address: title: "Posljednja IP adresa" registration_ip_address: @@ -701,8 +700,6 @@ sr: disabled_description: "Obrisane poruke u temi su prikazane." enable: "Sakrij Obrisane Poruke" disable: "Prikaži Obrisane Poruke" - private_message_info: - invite: "Pozovi Druge..." email: 'E-mail' username: 'KorisniÄko Ime' last_seen: 'ViÄ‘en' @@ -744,9 +741,6 @@ sr: admin_not_allowed_from_ip_address: "Ne možete se prijaviti kao admin sa te IP adrese." resend_activation_email: "Pritisnite ovde da ponovno poÅ¡aljemo aktivacijski e-mail." sent_activation_email_again: "Poslali smo vam drugi aktivacijski e-mail na: {{currentEmail}}. Možda zatreba par minuta da stigne; svakako proverite nepoželjnu poÅ¡tu." - google: - title: "pomoću Google-a" - message: "Autentifikacija pomoću Google-a (iskljuÄite pop-up blokere)" google_oauth2: title: "pomoću Google-a" message: "Autentifikacija pomoću Googlea (iskljuÄite pop-up blokere)" @@ -884,9 +878,9 @@ sr: archive_topics: "Arhiviraj teme" choose_new_category: "Izaberite novu kategoriju za vaÅ¡u temu." selected: - few: Odabrali ste {{count}} tema. - one: Odabrali ste {{count}} temu. - other: Odabrali ste {{count}} tema. + one: "Odabrali ste {{count}} temu." + few: "Odabrali ste {{count}} tema." + other: "Odabrali ste {{count}} tema." none: unread: "Nemate neproÄitanih tema." new: "Nemate novih tema." @@ -916,12 +910,12 @@ sr: new: 'nova tema' unread: 'neproÄitano' new_topics: + one: '1 nova tema' few: '{{count}} nove teme' - one: 1 nova tema other: '{{count}} nove teme' unread_topics: - few: '{{count}} neproÄitane tema' one: '{{count}} neproÄitana tema' + few: '{{count}} neproÄitane tema' other: '{{count}} neproÄitanih teme' title: 'Tema' invalid_access: @@ -935,21 +929,21 @@ sr: title: "Tema nije pronaÄ‘ena" description: "Žao nam je, nismo mogli pronaći temu. Možda ju je moderator uklonio?" total_unread_posts: - few: Imate {{count}} neproÄitanih poruka u ovoj temi - one: Imate {{count}} neproÄitanu poruku u ovoj temi - other: Imate {{count}} neproÄitanih poruka u ovoj temi + one: "Imate {{count}} neproÄitanu poruku u ovoj temi" + few: "Imate {{count}} neproÄitanih poruka u ovoj temi" + other: "Imate {{count}} neproÄitanih poruka u ovoj temi" unread_posts: - few: Imate {{count}} starih neproÄitanih poruka u ovoj temi - one: Imate {{count}} staru neproÄitanu poruku u ovoj temi - other: Imate {{count}} starih neproÄitanih poruka u ovoj temi + one: "Imate {{count}} staru neproÄitanu poruku u ovoj temi" + few: "Imate {{count}} starih neproÄitanih poruka u ovoj temi" + other: "Imate {{count}} starih neproÄitanih poruka u ovoj temi" new_posts: - few: Ima {{count}} novih poruka u temi od kad ste je zadnji put proÄitali - one: Ima {{count}} novih poruka u temi od kad ste je zadnji put proÄitali - other: Ima {{count}} novih poruka u temi od kad ste je zadnji put proÄitali + one: "Ima {{count}} novih poruka u temi od kad ste je zadnji put proÄitali" + few: "Ima {{count}} novih poruka u temi od kad ste je zadnji put proÄitali" + other: "Ima {{count}} novih poruka u temi od kad ste je zadnji put proÄitali" likes: - few: Ima {{count}} sviÄ‘anja u temi - one: Ima {{count}} sviÄ‘anja u temi - other: Ima {{count}} sviÄ‘anja u temi + one: "Ima {{count}} sviÄ‘anja u temi" + few: "Ima {{count}} sviÄ‘anja u temi" + other: "Ima {{count}} sviÄ‘anja u temi" back_to_list: "Nazad na listu tema" options: "Opcije Teme" show_links: "Prikaži linkove u ovoj temi" @@ -1044,9 +1038,9 @@ sr: login_reply: 'Prijavi se da bi odgovorio' filters: n_posts: - few: '{{count}} poruka' - one: 1 poruka - other: '{{count}} poruka' + one: "1 poruka" + few: "{{count}} poruka" + other: "{{count}} poruka" cancel: "Uklonite filter" split_topic: title: "Prebaci u Novu Temu" @@ -1054,17 +1048,17 @@ sr: topic_name: "Ime Nove Teme" error: "Dogodila se greÅ¡ka pri prebacivanju poruka u novu temu." instructions: - few: Otvorićete novu temu popunjenu s {{count}} poruka koje ste izabrali. - one: Otvorićete novu temu popunjenu s {{count}} poruka koje ste izabrali. - other: Otvorićete novu temu popunjenu s {{count}} poruka koje ste izabrali. + one: "Otvorićete novu temu popunjenu s {{count}} poruka koje ste izabrali." + few: "Otvorićete novu temu popunjenu s {{count}} poruka koje ste izabrali." + other: "Otvorićete novu temu popunjenu s {{count}} poruka koje ste izabrali." merge_topic: title: "Prebaci u Postojeću Temu" action: "prebaci u postojeću temu" error: "Dogodili se greÅ¡ka prilikom prebacivanju poruka u tu temu." instructions: - few: Molimo odaberite temu u koju želite prebaciti {{count}} poruka. - one: Molimo odaberite temu u koju želite prebaciti {{count}} poruka. - other: Molimo odaberite temu u koju želite prebaciti {{count}} poruka. + one: "Molimo odaberite temu u koju želite prebaciti {{count}} poruka." + few: "Molimo odaberite temu u koju želite prebaciti {{count}} poruka." + other: "Molimo odaberite temu u koju želite prebaciti {{count}} poruka." change_owner: title: "promena vlasnika poruke" action: "promena vlasniÅ¡tva" @@ -1072,9 +1066,9 @@ sr: label: "Novi vlasnik poruke" placeholder: "korisniÄko ime novog vlasnika" instructions: - few: Molimo vas odaberete novog vlasnika {{count}} poruka od {{old_user}}. - one: Molimo vas odaberete novog vlasnika {{count}} poruka od {{old_user}}. - other: Molimo vas odaberete novog vlasnika {{count}} poruka od {{old_user}}. + one: "Molimo vas odaberete novog vlasnika {{count}} poruka od {{old_user}}." + few: "Molimo vas odaberete novog vlasnika {{count}} poruka od {{old_user}}." + other: "Molimo vas odaberete novog vlasnika {{count}} poruka od {{old_user}}." multi_select: select: 'odaberi' selected: 'odabrano ({{count}})' @@ -1083,9 +1077,9 @@ sr: select_all: odaberi sve deselect_all: odustani od odabira description: - few: Odabrali ste {{count}} poruka. one: Odabrali ste {{count}} poruka. - other: Odabrali ste {{count}} poruka. + few: "Odabrali ste {{count}} poruka." + other: "Odabrali ste {{count}} poruka." post: edit_reason: "Razlog:" post_number: "poruka {{number}}" @@ -1096,9 +1090,9 @@ sr: show_full: "Prikaži Celu Poruku" show_hidden: 'Vidi skriven sadržaj.' deleted_by_author: - few: (autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude oznaÄena zastavicom) - one: (autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude oznaÄena zastavicom) - other: (autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude oznaÄena zastavicom) + one: "(autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude oznaÄena zastavicom)" + few: "(autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude oznaÄena zastavicom)" + other: "(autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude oznaÄena zastavicom)" expand_collapse: "proÅ¡iri/sruÅ¡i" unread: "Poruka je neproÄitana" errors: @@ -1143,7 +1137,6 @@ sr: inappropriate: "PoniÅ¡ti oznaku zastavom" bookmark: "PoniÅ¡ti Marker" like: "PoniÅ¡ti Lajk" - vote: "PoniÅ¡ti Glas" by_you: off_topic: "OznaÄili ste ovo kao van teme" spam: "OznaÄili ste ovo kao nepoželjno." @@ -1151,65 +1144,56 @@ sr: notify_moderators: "OznaÄili ste ovo za moderatore" bookmark: "Markirali ste ovu poruku" like: "SviÄ‘a vam se ovo" - vote: "Glasali ste za ovu poruku" by_you_and_others: off_topic: - few: Ti i {{count}} drugih korisnika oznaÄili ste ovo kao van teme - one: Ti i {{count}} drugi korisnik oznaÄili ste ovo kao van teme - other: Ti i {{count}} drugih korisnika oznaÄili ste ovo kao van teme + one: "Ti i {{count}} drugi korisnik oznaÄili ste ovo kao van teme" + few: "Ti i {{count}} drugih korisnika oznaÄili ste ovo kao van teme" + other: "Ti i {{count}} drugih korisnika oznaÄili ste ovo kao van teme" spam: - few: Ti i {{count}} drugih korisnika oznaÄili ste ovo kao nepoželjno. - one: Ti i {{count}} drugi korisnik oznaÄili ste ovo kao nepoželjno. - other: Ti i {{count}} drugih korisnika oznaÄili ste ovo kao nepoželjno. + one: "Ti i {{count}} drugi korisnik oznaÄili ste ovo kao nepoželjno." + few: "Ti i {{count}} drugih korisnika oznaÄili ste ovo kao nepoželjno." + other: "Ti i {{count}} drugih korisnika oznaÄili ste ovo kao nepoželjno." inappropriate: - few: Ti i {{count}} drugih korisnika oznaÄili ste ovo kao neprikladno - one: Ti i {{count}} drugi korisnik oznaÄili ste ovo kao neprikladno - other: Ti i {{count}} drugih korisnika oznaÄili ste ovo kao neprikladno + one: "Ti i {{count}} drugi korisnik oznaÄili ste ovo kao neprikladno" + few: "Ti i {{count}} drugih korisnika oznaÄili ste ovo kao neprikladno" + other: "Ti i {{count}} drugih korisnika oznaÄili ste ovo kao neprikladno" notify_moderators: - few: Ti i {{count}} druga korisnika oznaÄili ste ovo za moderatore. - one: Ti i {{count}} drugi korisnik oznaÄili ste ovo za moderatore. - other: Ti i {{count}} druga korisnika oznaÄili ste ovo za moderatore. + one: "Ti i {{count}} drugi korisnik oznaÄili ste ovo za moderatore." + few: "Ti i {{count}} druga korisnika oznaÄili ste ovo za moderatore." + other: "Ti i {{count}} druga korisnika oznaÄili ste ovo za moderatore." bookmark: - few: Ti i {{count}} drugih korisnika ste markirali ovu objavu - one: Ti i {{count}} drugi korisnik ste markirali ovu objavu - other: Ti i {{count}} drugih korisnika ste markirali ovu objavu + one: "Ti i {{count}} drugi korisnik ste markirali ovu objavu" + few: "Ti i {{count}} drugih korisnika ste markirali ovu objavu" + other: "Ti i {{count}} drugih korisnika ste markirali ovu objavu" like: - few: Tebi i {{count}} drugih korisnika se ovo sviÄ‘a. - one: Tebi i {{count}} drugom korisniku se ovo sviÄ‘a. - other: Tebi i {{count}} drugih korisnika se ovo sviÄ‘a. - vote: - few: Ti i {{count}} drugih korisnika ste glasali za ovu poruku - one: Ti i {{count}} drugi korisnik ste glasali za ovu poruku - other: Ti i {{count}} drugih korisnika ste glasali za ovu poruku + one: "Tebi i {{count}} drugom korisniku se ovo sviÄ‘a." + few: "Tebi i {{count}} drugih korisnika se ovo sviÄ‘a." + other: "Tebi i {{count}} drugih korisnika se ovo sviÄ‘a." by_others: off_topic: - few: '{{count}} korisnika oznaÄilo je ovo kao van teme' - one: '{{count}} korisnika oznaÄilo je ovo kao van teme' - other: '{{count}} korisnika oznaÄilo je ovo kao van teme' + one: "{{count}} korisnika oznaÄilo je ovo kao van teme" + few: "{{count}} korisnika oznaÄilo je ovo kao van teme" + other: "{{count}} korisnika oznaÄilo je ovo kao van teme" spam: - few: '{{count}} korisnika oznaÄilo je ovo kao nepoželjno' - one: '{{count}} korisnik oznaÄilo je ovo kao nepoželjno' - other: '{{count}} korisnika oznaÄilo je ovo kao nepoželjno' + one: "{{count}} korisnik oznaÄilo je ovo kao nepoželjno" + few: "{{count}} korisnika oznaÄilo je ovo kao nepoželjno" + other: "{{count}} korisnika oznaÄilo je ovo kao nepoželjno" inappropriate: - few: '{count}} korisnika oznaÄilo je ovo kao neprikladno' - one: '{count}} korisnik oznaÄilo je ovo kao neprikladno' - other: '{{count}} korisnika oznaÄilo je ovo kao neprikladno' + one: "{count}} korisnik oznaÄilo je ovo kao neprikladno" + few: "{count}} korisnika oznaÄilo je ovo kao neprikladno" + other: "{{count}} korisnika oznaÄilo je ovo kao neprikladno" notify_moderators: - few: '{{count}} korisnika oznaÄilo je ovo za moderatora' - one: '{{count}} korisnik oznaÄilo je ovo za moderatora' - other: '{{count}} korisnika oznaÄilo je ovo za moderatora' + one: "{{count}} korisnik oznaÄilo je ovo za moderatora" + few: "{{count}} korisnika oznaÄilo je ovo za moderatora" + other: "{{count}} korisnika oznaÄilo je ovo za moderatora" bookmark: - few: '{{count}} korisnika je markiralo ovu objavu' - one: '{{count}} korisnik je markiralo ovu objavu' - other: '{{count}} korisnika je markiralo ovu objavu' + one: "{{count}} korisnik je markiralo ovu objavu" + few: "{{count}} korisnika je markiralo ovu objavu" + other: "{{count}} korisnika je markiralo ovu objavu" like: - few: '{{count}} korisnika se ovo sviÄ‘a' - one: '{{count}} korisnik se ovo sviÄ‘a' - other: '{{count}} korisnika se ovo sviÄ‘a' - vote: - few: '{{count}} korisnika je glasalo za ovu poruku' - one: '{{count}} korisnik je glasalo za ovu poruku' - other: '{{count}} korisnika je glasalo za ovu poruku' + one: "{{count}} korisnik se ovo sviÄ‘a" + few: "{{count}} korisnika se ovo sviÄ‘a" + other: "{{count}} korisnika se ovo sviÄ‘a" revisions: controls: first: "Prva revizija" @@ -1228,7 +1212,6 @@ sr: category: can: 'može&hellip' none: '(nema kategorije)' - choose: 'Odaberi kategoriju…' edit: 'izmeni' edit_long: "Izmeni" view: 'Prikaži Teme u Kategoriji' @@ -1267,7 +1250,6 @@ sr: edit_permissions: "Izmeni dozvole" add_permission: "Dodaj dozvole" this_year: "ove godine" - position: "pozicija" default_position: "Zadana pozicija" position_disabled: "Kategorije će u nizu biti prikazivane po nivou aktivnosti. Za kontrolu redosleda kategorija u listi," position_disabled_click: 'omogućite postavku "fiksiranje pozicija kategorija" u podeÅ¡avanjima.' @@ -1305,9 +1287,9 @@ sr: topic_map: title: "Sažetak teme" clicks: - few: '%{count} klikova' - one: '%{count} klik' - other: '%{count} klikova' + one: "%{count} klik" + few: "%{count} klikova" + other: "%{count} klikova" topic_statuses: warning: help: "Ovo je službeno upozorenje." @@ -1348,9 +1330,9 @@ sr: latest: title: "Poslednje" title_with_count: - few: Poslednje ({{count}}) - one: Poslednje ({{count}}) - other: Poslednje ({{count}}) + one: "Poslednje ({{count}})" + few: "Poslednje ({{count}})" + other: "Poslednje ({{count}})" help: "teme sa nedavnim porukama" hot: title: "Vruće" @@ -1365,25 +1347,25 @@ sr: unread: title: "NeproÄitano" title_with_count: - few: NeproÄitane ({{count}}) - one: NeproÄitane ({{count}}) - other: NeproÄitane ({{count}}) + one: "NeproÄitane ({{count}})" + few: "NeproÄitane ({{count}})" + other: "NeproÄitane ({{count}})" help: "teme koje trenutno posmatrate ili pratite s neproÄitanim porukama" lower_title_with_count: - few: '{{count}} neproÄitanih' - one: 1 neproÄitana - other: '{{count}} neproÄitanih' + one: "1 neproÄitana" + few: "{{count}} neproÄitanih" + other: "{{count}} neproÄitanih" new: lower_title_with_count: - few: '{{count}} novih' - one: 1 nova - other: '{{count}} novih' + one: "1 nova" + few: "{{count}} novih" + other: "{{count}} novih" lower_title: "novo" title: "Novo" title_with_count: - few: Nove ({{count}}) - one: Nove (1) - other: Nove ({{count}}) + one: "Nove (1)" + few: "Nove ({{count}})" + other: "Nove ({{count}})" help: "teme otvorene u zadnjih par dana" posted: title: "Moje poruke" @@ -1642,7 +1624,6 @@ sr: address_placeholder: "name@example.com" type_placeholder: "sažetak, prijava..." reply_key_placeholder: "kljuÄ odgovora" - skipped_reason_placeholder: "razlog" logs: title: "Logovi" action: "Akcije" @@ -1738,13 +1719,13 @@ sr: suspect: 'Sumnjivi' approved: "PotvrÄ‘enji?" approved_selected: - few: Potvrdi korisnike ({{count}}) - one: Potvrdi korisnika - other: Potvrdi korisnike ({{count}}) + one: "Potvrdi korisnika" + few: "Potvrdi korisnike ({{count}})" + other: "Potvrdi korisnike ({{count}})" reject_selected: - few: odbij korisnike ({{count}}) - one: odbij korisnika - other: odbij korisnike ({{count}}) + one: "odbij korisnika" + few: "odbij korisnike ({{count}})" + other: "odbij korisnike ({{count}})" titles: active: 'Aktivni Korisnici' new: 'Novi Korisnici' @@ -1757,13 +1738,13 @@ sr: suspended: 'Suspendovani Korisnici' suspect: 'Sumnjivi korisnici' reject_successful: - few: UspeÅ¡no odbio %{count} koriniska. - one: UspeÅ¡no odbio %{count} koriniska. - other: UspeÅ¡no odbio %{count} koriniska. + one: "UspeÅ¡no odbio %{count} koriniska." + few: "UspeÅ¡no odbio %{count} koriniska." + other: "UspeÅ¡no odbio %{count} koriniska." reject_failures: - few: NeuspeÅ¡no odbio %{count} korisnika. - one: NeuspeÅ¡no odbio %{count} korisnika. - other: NeuspeÅ¡no odbio %{count} korisnika. + one: "NeuspeÅ¡no odbio %{count} korisnika." + few: "NeuspeÅ¡no odbio %{count} korisnika." + other: "NeuspeÅ¡no odbio %{count} korisnika." not_verified: "Nije verifikovano" check_email: title: "Otkrij korisnikovu email adresu" @@ -1814,17 +1795,17 @@ sr: delete: "ObriÅ¡i Korisnika" delete_forbidden_because_staff: "Admini i moderatori ne mogu biti obrisani." delete_forbidden: - few: Korisnici ne mogu biti obrisani ako imaju poruka. ObriÅ¡ite sve njihove poruke pre nego pokuÅ¡ate obrisati korisnika. (Poruke starije od %{dana} ne mogu biti obrisane.) - one: Korisnici ne mogu biti obrisani ako imaju poruka. ObriÅ¡ite sve njihove poruke pre nego pokuÅ¡ate obrisati korisnika. (Poruke starije od %{dana} ne mogu biti obrisane.) - other: Korisnici ne mogu biti obrisani ako imaju poruka. ObriÅ¡ite sve njihove poruke pre nego pokuÅ¡ate obrisati korisnika. (Poruke starije od %{dana} ne mogu biti obrisane.) + one: "Korisnici ne mogu biti obrisani ako imaju poruka. ObriÅ¡ite sve njihove poruke pre nego pokuÅ¡ate obrisati korisnika. (Poruke starije od %{dana} ne mogu biti obrisane.)" + few: "Korisnici ne mogu biti obrisani ako imaju poruka. ObriÅ¡ite sve njihove poruke pre nego pokuÅ¡ate obrisati korisnika. (Poruke starije od %{dana} ne mogu biti obrisane.)" + other: "Korisnici ne mogu biti obrisani ako imaju poruka. ObriÅ¡ite sve njihove poruke pre nego pokuÅ¡ate obrisati korisnika. (Poruke starije od %{dana} ne mogu biti obrisane.)" cant_delete_all_posts: - few: Ne možete obrisati sve poruke. Neke su starije od %{count} dana. ( delete_user_max_post_age podeÅ¡avanja.) - one: Ne možete obrisati sve poruke. Neke su starije od %{count} dana. ( delete_user_max_post_age podeÅ¡avanja.) - other: Ne možete obrisati sve poruke. Neke su starije od %{count} dana. ( delete_user_max_post_age podeÅ¡avanja.) + one: "Ne možete obrisati sve poruke. Neke su starije od %{count} dana. ( delete_user_max_post_age podeÅ¡avanja.)" + few: "Ne možete obrisati sve poruke. Neke su starije od %{count} dana. ( delete_user_max_post_age podeÅ¡avanja.)" + other: "Ne možete obrisati sve poruke. Neke su starije od %{count} dana. ( delete_user_max_post_age podeÅ¡avanja.)" cant_delete_all_too_many_posts: - few: Ne možete obrisati sve objave jer korisnik ima viÅ¡e od %{count} poruka. (delete_all_posts_max) - one: Ne možete obrisati sve objave jer korisnik ima viÅ¡e od %{count} poruka. (delete_all_posts_max) - other: Ne možete obrisati sve objave jer korisnik ima viÅ¡e od %{count} poruka. (delete_all_posts_max) + one: "Ne možete obrisati sve objave jer korisnik ima viÅ¡e od %{count} poruka. (delete_all_posts_max)" + few: "Ne možete obrisati sve objave jer korisnik ima viÅ¡e od %{count} poruka. (delete_all_posts_max)" + other: "Ne možete obrisati sve objave jer korisnik ima viÅ¡e od %{count} poruka. (delete_all_posts_max)" delete_confirm: "Jeste li SIGURNI da želite obrisati ovog korisnika? Ovo je trajno!" delete_and_block: "ObriÅ¡i i block ovaj email i IP adresu" delete_dont_block: "Samo obriÅ¡i" @@ -2007,9 +1988,9 @@ sr: uploading: "Uploading..." quit: "Možda kasnije" staff_count: - few: VaÅ¡a zajednica ima %{count} Älanova tima, ukljuÄujući i vas. - one: 'Tvoja zajednica ima 1 Älana tima (tebe). ' - other: VaÅ¡a zajednica ima %{count} Älanova tima, ukljuÄujući i vas. + one: "Tvoja zajednica ima 1 Älana tima (tebe). " + few: "VaÅ¡a zajednica ima %{count} Älanova tima, ukljuÄujući i vas." + other: "VaÅ¡a zajednica ima %{count} Älanova tima, ukljuÄujući i vas." invites: add_user: "dodaj" none_added: "Nikoga joÅ¡ niste pozvali za Älana tima. Jesi li siguran da želiÅ¡ da nastaviÅ¡ dalje?" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index fa96845726..942d7fbac6 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -43,62 +43,62 @@ sv: tiny: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_years: - one: 1Ã¥ - other: '%{count}Ã¥' + one: "1Ã¥" + other: "%{count}Ã¥" over_x_years: - one: '> 1Ã¥' - other: '> %{count}Ã¥' + one: "> 1Ã¥" + other: "> %{count}Ã¥" almost_x_years: - one: 1Ã¥ - other: '%{count}Ã¥' + one: "1Ã¥" + other: "%{count}Ã¥" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: 1 min - other: '%{count} min' + one: "1 min" + other: "%{count} min" x_hours: - one: 1 timme - other: '%{count} timmar' + one: "1 timme" + other: "%{count} timmar" x_days: - one: 1 dag - other: '%{count} dagar' + one: "1 dag" + other: "%{count} dagar" date_year: "D MMM, 'YY" medium_with_ago: x_minutes: - one: 1 min sedan - other: '%{count} minuter sedan' + one: "1 min sedan" + other: "%{count} minuter sedan" x_hours: - one: 1 timme sedan - other: '%{count} timmar sedan' + one: "1 timme sedan" + other: "%{count} timmar sedan" x_days: - one: 1 dag sedan - other: '%{count} dagar sedan' + one: "1 dag sedan" + other: "%{count} dagar sedan" later: x_days: - one: 1 dag senare - other: '%{count} dagar senare' + one: "1 dag senare" + other: "%{count} dagar senare" x_months: - one: 1 mÃ¥nad senare - other: '%{count} mÃ¥nader senare' + one: "1 mÃ¥nad senare" + other: "%{count} mÃ¥nader senare" x_years: - one: 1 Ã¥r senare - other: '%{count} Ã¥r senare' + one: "1 Ã¥r senare" + other: "%{count} Ã¥r senare" previous_month: 'FöregÃ¥ende mÃ¥nad' next_month: 'Nästkommande mÃ¥nad' placeholder: datum @@ -181,13 +181,13 @@ sv: show_help: "alternativ" links: "Länkar" links_lowercase: - one: länk - other: länkar + one: "länk" + other: "länkar" faq: "FAQ" guidelines: "Riktlinjer" privacy_policy: "Integritetspolicy" privacy: "Integritet" - terms_of_service: "Användarvillkor" + tos: "Användarvillkor" mobile_view: "Mobilvy" desktop_view: "Desktop-vy" you: "Du" @@ -206,8 +206,8 @@ sv: max_of_count: "max av {{count}}" alternation: "eller" character_count: - one: '{{count}} tecken' - other: '{{count}} tecken' + one: "{{count}} tecken" + other: "{{count}} tecken" suggested_topics: title: "Föreslagna ämnen" pm_title: "Föreslagna meddelanden" @@ -242,8 +242,8 @@ sv: remove: "Ta bort bokmärke" confirm_clear: "Är du säker pÃ¥ att du vill radera alla bokmärken frÃ¥n ämnet?" topic_count_latest: - one: Visa {{count}} nytt eller uppdaterat ämne - other: Visa {{count}} nya eller uppdaterade ämnen + one: "Visa {{count}} nytt eller uppdaterat ämne" + other: "Visa {{count}} nya eller uppdaterade ämnen" preview: "förhandsgranska" cancel: "avbryt" save: "Spara ändringar" @@ -281,16 +281,16 @@ sv: cancel: "Avbryt" view_pending: "visa väntande inlägg" has_pending_posts: - one: Detta ämne har 1 ämne som inväntar godkännande - other: Detta ämne har {{count}} inlägg som inväntar godkännande + one: "Detta ämne har 1 ämne som inväntar godkännande" + other: "Detta ämne har {{count}} inlägg som inväntar godkännande" confirm: "Spara ändringar" delete_prompt: "Vill du verkligen ta bort %{username}? Dennes alla poster kommer att tas bort samt e-post och IP-adress kommer blockeras." approval: title: "Inlägget behöver godkännande" description: "Vi har mottagit ditt nya inlägg men det behöver bli godkänt av en moderator innan det kan visas. Ha tÃ¥lamod." pending_posts: - one: Du har 1 väntande inlägg. - other: Du har {{count}} väntande inlägg. + one: "Du har 1 väntande inlägg." + other: "Du har {{count}} väntande inlägg." ok: "OK" user_action: user_posted_topic: "{{user}} skrev ämnet" @@ -324,8 +324,8 @@ sv: posts_read: "Läst" posts_read_long: "Lästa inlägg" total_rows: - one: 1 användare - other: '%{count} användare' + one: "1 användare" + other: "%{count} användare" group_histories: actions: change_group_setting: "Ändra gruppinställningar" @@ -424,8 +424,6 @@ sv: reorder: title: "Sortera kategorier" title_long: "Sortera listan av katergorier" - fix_order: "Fixera positioner" - fix_order_tooltip: "Inte alla kategorier har ett unikt positionsnummer, vilket kan fÃ¥ oväntade resultat." save: "Spara order" apply_all: "Tillämpa" position: "Position" @@ -436,11 +434,11 @@ sv: toggle_ordering: "slÃ¥ av/pÃ¥ sorteringskontroll" subcategories: "Underkategorier" topic_sentence: - one: 1 ämne - other: '%{count} ämnen' + one: "1 ämne" + other: "%{count} ämnen" topic_stat_sentence: - one: '%{count} nytt ämne under den senaste %{unit}.' - other: '%{count} nya ämnen under den senaste %{unit}.' + one: "%{count} nytt ämne under den senaste %{unit}." + other: "%{count} nya ämnen under den senaste %{unit}." ip_lookup: title: Kolla upp IP-adress hostname: Värdnamn @@ -576,7 +574,6 @@ sv: error: "Ett fel inträffade vid ändringen av det här värdet." change_username: title: "Byt användarnamn" - confirm: "Om du byter ditt användarnamn kommer alla tidigare citeringar av dina inlägg och @namn-omnämningar att bli trasiga. Är du helt säker pÃ¥ att du vill?" taken: "Tyvärr, det användarnamnet är taget." invalid: "Det användarnamnet är ogiltigt. Det fÃ¥r bara innehÃ¥lla siffror och bokstäver" change_email: @@ -595,7 +592,6 @@ sv: upload_title: "Ladda upp din bild" upload_picture: "Ladda upp bild" image_is_not_a_square: "Varning: vi beskar din bild; bredden och höjden var inte samma." - cache_notice: "Du har nu bytt profilbild men det kan ta lite tid innan den visas pÃ¥ grund av webbläsarens s.k. cache." change_profile_background: title: "Profilbakgrund" instructions: "Bakgrunderna är centrerade och har en förinställd bredd pÃ¥ 850px" @@ -610,8 +606,8 @@ sv: authenticated: "Din e-postadress har blivit verifierad av {{provider}}" frequency_immediately: "Vi kommer att skicka e-post till dig omedelbart om du inte har läst det som vi skickar e-post till dig om." frequency: - one: Vi skickar bara e-post om du inte synts till den senaste minuten. - other: Vi skickar bara e-post om du inte synts till de senaste {{count}} minuterna. + one: "Vi skickar bara e-post om du inte synts till den senaste minuten." + other: "Vi skickar bara e-post om du inte synts till de senaste {{count}} minuterna." name: title: "Namn" instructions: "ditt fullständiga namn (tillval)" @@ -696,8 +692,8 @@ sv: user: "Inbjuden Användare" sent: "Skickat" truncated: - one: Visar den första inbjudningen. - other: Visar de första {{count}} inbjudningarna. + one: "Visar den första inbjudningen." + other: "Visar de första {{count}} inbjudningarna." redeemed: "Inlösta inbjudningar" redeemed_tab: "Inlöst" redeemed_tab_with_count: "Inlöst ({{count}})" @@ -739,20 +735,20 @@ sv: stats: "Statistik" time_read: "lästid" topic_count: - one: ämnet skapades - other: ämnen skapades + one: "ämnet skapades" + other: "ämnen skapades" post_count: - one: inlägg skapat - other: inlägg skapade + one: "inlägg skapat" + other: "inlägg skapade" days_visited: - one: dag besökt - other: dagar besökta + one: "dag besökt" + other: "dagar besökta" posts_read: - one: inlägg läst - other: inlägg lästa + one: "inlägg läst" + other: "inlägg lästa" bookmark_count: - one: bokmärke - other: bokmärken + one: "bokmärke" + other: "bokmärken" top_replies: "Toppinlägg" no_replies: "Inga svar ännu." more_replies: "Fler svar" @@ -768,7 +764,6 @@ sv: most_liked_users: "Mest gillad" most_replied_to_users: "Mest svarad till" no_likes: "Inga gillningar ännu." - associated_accounts: "Inloggningar" ip_address: title: "Senaste IP-adress" registration_ip_address: @@ -820,8 +815,8 @@ sv: reached: "%{relativeAge} – %{rate} har uppnÃ¥tt webbplatsinställningarnas gräns pÃ¥ %{siteSettingRate}." exceeded: "%{relativeAge} – %{rate} har överträffat webbplatsinställningarnas gräns pÃ¥ %{siteSettingRate}." rate: - one: 1 fel/%{duration} - other: '%{count} fel/%{duration}' + one: "1 fel/%{duration}" + other: "%{count} fel/%{duration}" learn_more: "lär dig mer..." all_time: 'totalt' all_time_desc: 'totalt antal ämnen skapade' @@ -844,8 +839,6 @@ sv: hide_session: "PÃ¥minn mig imorgon" hide_forever: "nej tack" hidden_for_session: "Ok, jag frÃ¥gar dig imorgon. Du kan alltid använda 'Logga in' för att skapa ett konto, ocksÃ¥. " - intro: "Hejsan! :heart_eyes: Det verkar som att du uppskattar ämnet, men du har inte registrerat dig för ett konto. " - value_prop: "När du skapar ett konto sÃ¥ kommer vi ihÃ¥g precis vad du har läst, sÃ¥ att du alltid kan komma tillbaka precis där du lämnade oss. Du kan ocksÃ¥ fÃ¥ notifieringar, här och via e-post, närhelst nya inlägg skapas. Du kan ocksÃ¥ gilla inlägg för att sprida kärlek. :heartbeat:" summary: enabled_description: "Sammanfattning över de inlägg som användarna tycker är mest intressanta." description: "Det finns {{replyCount}} svar." @@ -859,7 +852,6 @@ sv: disable: "Visa raderade inlägg" private_message_info: title: "Meddelande" - invite: "Bjud In Andra..." remove_allowed_user: "Vill du verkligen ta bort {{name}} frÃ¥n det här meddelandet?" remove_allowed_group: "Vill du verkligen ta bort {{name}} frÃ¥n det här meddelandet?" email: 'E-post' @@ -914,9 +906,6 @@ sv: preferences: "Du behöver logga in för att ändra dina användarpreferenser." forgot: "Jag kommer inte ihÃ¥g mina kontouppgifter" not_approved: "Ert konto har inte blivit godkänt än. Du kommer att meddelas via email när det är klart att logga in." - google: - title: "med Google" - message: "Autentiserar med Google (kolla sÃ¥ att pop up-blockare inte är aktiverade)" google_oauth2: title: "med Google" message: "Autentiserar med Google (kolla sÃ¥ att pop up-blockare inte är aktiverade)" @@ -975,8 +964,8 @@ sv: similar_topics: "Ditt ämne liknar..." drafts_offline: "utkast offline" group_mentioned: - one: Genom att nämna {{group}}, sÃ¥ kommer du att notifiera 1 person – är du säker? - other: Genom att nämna {{group}}, sÃ¥ kommer du att notifiera {{count}} medlemmar – är du säker? + one: "Genom att nämna {{group}}, sÃ¥ kommer du att notifiera 1 person – är du säker?" + other: "Genom att nämna {{group}}, sÃ¥ kommer du att notifiera {{count}} medlemmar – är du säker?" cannot_see_mention: category: "Du nämnde {{username}} men hen kommer inte fÃ¥ nÃ¥gon notifikation för hen har inte tillgÃ¥ng till denna kategori. Du behöver lägga till hen till en grupp som har tillgÃ¥ng till den här kategorin." private: "Du nämnde {{username}} men hen kommer inte fÃ¥ nÃ¥gon notifikation eftersom hen inte kan se detta personliga meddelande. Du behöver bjuda in hen till detta PM." @@ -1145,8 +1134,8 @@ sv: archive_topics: "Arkivera ämnen" choose_new_category: "Välj den nya kategorin för ämnena:" selected: - one: Du har markerat 1 ämne. - other: Du har markerat {{count}} ämnen. + one: "Du har markerat 1 ämne." + other: "Du har markerat {{count}} ämnen." change_tags: "Ersätt taggar" append_tags: "Lägg till taggar" choose_new_tags: "Välj nya taggar för de här ämnena:" @@ -1179,8 +1168,8 @@ sv: search: "Inga fler sökresultat hittades." topic: filter_to: - one: 1 inlägg i ämnet - other: '{{count}} inlägg i ämnet' + one: "1 inlägg i ämnet" + other: "{{count}} inlägg i ämnet" create: 'Nytt ämne' create_long: 'Skapa ett nytt ämne' private_message: 'Skriv meddelande' @@ -1194,10 +1183,10 @@ sv: new: 'nytt ämne' unread: 'oläst' new_topics: - one: 1 nytt ämne + one: '1 nytt ämne' other: '{{count}} nya ämnen' unread_topics: - one: 1 oläst ämne + one: '1 oläst ämne' other: '{{count}} olästa ämnen' title: 'Ämne' invalid_access: @@ -1211,17 +1200,17 @@ sv: title: "Ämnet hittades inte" description: "Tyvärr, vi kunde inte hitta det ämnet. Kanske har den tagits bort av en moderator?" total_unread_posts: - one: du har 1 oläst inlägg i det här ämnet - other: du har {{count}} olästa inlägg i det här ämnet + one: "du har 1 oläst inlägg i det här ämnet" + other: "du har {{count}} olästa inlägg i det här ämnet" unread_posts: - one: du har 1 oläst gammalt inlägg i det här ämnet - other: du har {{count}} olästa gamla inlägg i det här ämnet + one: "du har 1 oläst gammalt inlägg i det här ämnet" + other: "du har {{count}} olästa gamla inlägg i det här ämnet" new_posts: - one: det finns 1 nytt inlägg i det här ämnet sedan du senast läste den - other: det finns {{count}} nya inlägg i det här ämnet sedan du senast läste det + one: "det finns 1 nytt inlägg i det här ämnet sedan du senast läste den" + other: "det finns {{count}} nya inlägg i det här ämnet sedan du senast läste det" likes: - one: det finns 1 gillning i det här ämnet - other: det finns {{count}} gillningar i det här ämnet + one: "det finns 1 gillning i det här ämnet" + other: "det finns {{count}} gillningar i det här ämnet" back_to_list: "Tillbaka till ämneslistan" options: "Ämnesinställningar" show_links: "visa länkar som finns i det här ämnet" @@ -1258,8 +1247,8 @@ sv: auto_close_based_on_last_post: "Detta ämne stängs %{duration} efter sista svaret." auto_close_title: 'Inställningar för automatisk stängning' auto_close_immediate: - one: 'Senaste inlägget i det här ämnet är redan 1 timme gammalt, sÃ¥ ämnet kommer att stängas omedelbart. ' - other: 'Senaste inlägget i det här ämnet är redan %{count} timmar gammal, sÃ¥ ämnet kommer att stängas omedelbart. ' + one: "Senaste inlägget i det här ämnet är redan 1 timme gammalt, sÃ¥ ämnet kommer att stängas omedelbart. " + other: "Senaste inlägget i det här ämnet är redan %{count} timmar gammal, sÃ¥ ämnet kommer att stängas omedelbart. " timeline: back: "Tillbaka" back_description: "GÃ¥ tillbaka till det senaste olästa meddelandet" @@ -1361,8 +1350,8 @@ sv: pin_validation: "Ett datum krävs för att klistra fast det här ämnet." not_pinned: "Det finns inga klistrade ämnen i {{categoryLink}}." already_pinned: - one: 'Nuvarande antal ämnen som är klistrade i {{categoryLink}}: 1' - other: 'Nuvarande antal ämnen som är klistrade i {{categoryLink}}: {{count}}' + one: "Nuvarande antal ämnen som är klistrade i {{categoryLink}}: 1" + other: "Nuvarande antal ämnen som är klistrade i {{categoryLink}}: {{count}}" pin_globally: "Gör det här ämnet synligt i toppen av alla ämneslistor tills " confirm_pin_globally: "Du har redan {{count}} globalt klistrade ämnen. För mÃ¥nga klistrade ämnen kan vara störande för nya och anonyma användare. Är du säker pÃ¥ att du vill klistra ytterligare ett ämne globalt?" unpin_globally: "Ta bort detta ämne frÃ¥n toppen av alla ämneslistor." @@ -1370,8 +1359,8 @@ sv: global_pin_note: "Användare kan avklistra ämnet individuellt för sig själva." not_pinned_globally: "Det finns inga globalt klistrade ämnen." already_pinned_globally: - one: 'Nuvarande antal ämnen som klistrats globalt: 1' - other: 'Nuvarande antal ämnen som klistrats globalt: {{count}}' + one: "Nuvarande antal ämnen som klistrats globalt: 1" + other: "Nuvarande antal ämnen som klistrats globalt: {{count}}" make_banner: "Gör detta ämne till en banderoll som dyker upp i toppen av alla sidor." remove_banner: "Ta bort banderollen som dyker upp i toppen av alla sidor." banner_note: "Användare kan avfärda banderollen genom att stänga den. Endast ett ämne kan agera banderoll Ã¥t gÃ¥ngen." @@ -1407,8 +1396,8 @@ sv: login_reply: 'Logga in för att svara' filters: n_posts: - one: 1 inlägg - other: '{{count}} inlägg' + one: "1 inlägg" + other: "{{count}} inlägg" cancel: "Ta bort filter" split_topic: title: "Flytta till nytt ämne" @@ -1416,15 +1405,15 @@ sv: topic_name: "Nytt ämnesnamn" error: "Ett fel inträffade dÃ¥ inläggen skulle flyttas till det nya ämnet." instructions: - one: Du är pÃ¥väg att skapa ett nytt ämne och lägga inlägget du har valt i den. - other: Du är pÃ¥väg att skapa en nytt ämne och lägga de {{count}} inlägg du har valt i den. + one: "Du är pÃ¥väg att skapa ett nytt ämne och lägga inlägget du har valt i den." + other: "Du är pÃ¥väg att skapa en nytt ämne och lägga de {{count}} inlägg du har valt i den." merge_topic: title: "Flytta till befintligt ämne" action: "flytta till befintligt ämne" error: "Ett fel inträffade dÃ¥ inlägg skulle flyttas till det ämnet." instructions: - one: Välj vilket ämne du vill flytta det inlägget till. - other: Välj vilket ämne du vill flytta de
{{count}}
inläggen till. + one: "Välj vilket ämne du vill flytta det inlägget till." + other: "Välj vilket ämne du vill flytta de
{{count}}
inläggen till." merge_posts: title: "Sammanfoga markerade inlägg" action: "sammanfoga markerade inlägg" @@ -1436,8 +1425,8 @@ sv: label: "Ny ägare av inlägg" placeholder: "användarnamn pÃ¥ den nya ägaren" instructions: - one: Vänligen välj ny ägare till inlägget av {{old_user}}. - other: Vänligen välj ny ägare till de {{count}} inläggen av {{old_user}}. + one: "Vänligen välj ny ägare till inlägget av {{old_user}}." + other: "Vänligen välj ny ägare till de {{count}} inläggen av {{old_user}}." change_timestamp: action: "ändra tidsstämpeln" invalid_timestamp: "Tidsstämpeln kan inte sättas till ett framtida datum." @@ -1452,7 +1441,7 @@ sv: deselect_all: avmarkera alla description: one: Du har markerat 1 inlägg. - other: Du har markerat {{count}} inlägg. + other: "Du har markerat {{count}} inlägg." post: quote_reply: "Citat" edit_reason: "Anledning:" @@ -1466,26 +1455,26 @@ sv: show_full: "Visa hela inlägget" show_hidden: 'Visa dolt innehÃ¥ll.' deleted_by_author: - one: (inlägg tillbakadraget av skaparen, kommer att raderas automatiskt om 1 timme om det inte flaggas) - other: (inlägg tillbakadraget av skaparen, kommer att raderas automatiskt om %{count} timmar om det inte flaggas) + one: "(inlägg tillbakadraget av skaparen, kommer att raderas automatiskt om 1 timme om det inte flaggas)" + other: "(inlägg tillbakadraget av skaparen, kommer att raderas automatiskt om %{count} timmar om det inte flaggas)" expand_collapse: "utvidga/förminska" gap: - one: visa 1 dolt svar - other: visa {{count}} dolda svar + one: "visa 1 dolt svar" + other: "visa {{count}} dolda svar" unread: "Inlägget är oläst" has_replies: - one: '{{count}} svar' - other: '{{count}} svar' + one: "{{count}} svar" + other: "{{count}} svar" has_likes: - one: '{{count}} gillning' - other: '{{count}} gillningar' + one: "{{count}} gillning" + other: "{{count}} gillningar" has_likes_title: - one: 1 person gillade detta inlägg - other: '{{count}} personer gillade detta inlägg' + one: "1 person gillade detta inlägg" + other: "{{count}} personer gillade detta inlägg" has_likes_title_only_you: "du gillade det här inlägget" has_likes_title_you: - one: du och 1 annan person gillade det här inlägget - other: du och {{count}} andra personer gillade det här inlägget + one: "du och 1 annan person gillade det här inlägget" + other: "du och {{count}} andra personer gillade det här inlägget" errors: create: "Tyvärr, det uppstod ett fel under skapandet av ditt inlägg. Var god försök igen." edit: "Tyvärr, det uppstod ett fel under ändringen av ditt inlägg. Var god försök igen." @@ -1537,7 +1526,6 @@ sv: inappropriate: "Ã…ngra flaggning" bookmark: "Ã…ngra bokmärkning" like: "Ã…ngra gillning" - vote: "Ã…ngra röstning" people: off_topic: "flaggade det här som orelevant." spam: "flaggade det här som spam" @@ -1546,7 +1534,6 @@ sv: notify_user: "skickade ett meddelande" bookmark: "bokmärkte det här" like: "gillade det här" - vote: "röstade för det här" by_you: off_topic: "Du flaggade detta som orelevant" spam: "Du flaggade detta som spam" @@ -1555,57 +1542,50 @@ sv: notify_user: "Du skickade ett meddelande till denna användare" bookmark: "Du bokmärkte detta inlägg" like: "Du gillade detta" - vote: "Du röstade för detta inlägg" by_you_and_others: off_topic: - one: Du och 1 annan flaggade detta som orelevant - other: Du och {{count}} andra personer flaggade detta som orelevant + one: "Du och 1 annan flaggade detta som orelevant" + other: "Du och {{count}} andra personer flaggade detta som orelevant" spam: - one: Du och 1 annan flaggade detta som spam - other: Du och {{count}} andra personer flaggade detta som spam + one: "Du och 1 annan flaggade detta som spam" + other: "Du och {{count}} andra personer flaggade detta som spam" inappropriate: - one: Du och 1 annan flaggade detta som olämpligt - other: Du och {{count}} andra personer flaggade detta som olämpligt + one: "Du och 1 annan flaggade detta som olämpligt" + other: "Du och {{count}} andra personer flaggade detta som olämpligt" notify_moderators: - one: Du och 1 annan person har flaggat detta för moderation - other: Du och {{count}} andra personer har flaggat detta för moderation + one: "Du och 1 annan person har flaggat detta för moderation" + other: "Du och {{count}} andra personer har flaggat detta för moderation" notify_user: - one: Du och 1 person till skickade ett meddelande till denna användare - other: Du och {{count}} andra personer skickade ett meddelande till denna användare + one: "Du och 1 person till skickade ett meddelande till denna användare" + other: "Du och {{count}} andra personer skickade ett meddelande till denna användare" bookmark: - one: Du och 1 annan bokmärkte detta inlägg - other: Du och {{count}} andra personer bokmärkte detta inlägg + one: "Du och 1 annan bokmärkte detta inlägg" + other: "Du och {{count}} andra personer bokmärkte detta inlägg" like: - one: Du och 1 annan gillade detta - other: Du och {{count}} andra personer gillade detta - vote: - one: Du och 1 annan röstade för detta inlägg - other: Du och {{count}} andra personer röstade för detta inlägg + one: "Du och 1 annan gillade detta" + other: "Du och {{count}} andra personer gillade detta" by_others: off_topic: - one: 1 person flaggade detta som orelevant - other: '{{count}} personer flaggade detta som orelevant' + one: "1 person flaggade detta som orelevant" + other: "{{count}} personer flaggade detta som orelevant" spam: - one: 1 person flaggade detta som spam - other: '{{count}} personer flaggade detta som spam' + one: "1 person flaggade detta som spam" + other: "{{count}} personer flaggade detta som spam" inappropriate: - one: 1 person flaggade detta som olämpligt - other: '{{count}} personer flaggade detta som olämpligt' + one: "1 person flaggade detta som olämpligt" + other: "{{count}} personer flaggade detta som olämpligt" notify_moderators: - one: 1 person flaggade detta för granskning - other: '{{count}} personer flaggade detta för granskning' + one: "1 person flaggade detta för granskning" + other: "{{count}} personer flaggade detta för granskning" notify_user: - one: 1 person skickade ett meddelande till denna användare - other: '{{count}} skickade ett meddelande till denna användare' + one: "1 person skickade ett meddelande till denna användare" + other: "{{count}} skickade ett meddelande till denna användare" bookmark: - one: 1 person bokmärkte detta inlägg - other: '{{count}} personer bokmärkte detta inlägg' + one: "1 person bokmärkte detta inlägg" + other: "{{count}} personer bokmärkte detta inlägg" like: - one: 1 person gillade detta - other: '{{count}} personer gillade detta' - vote: - one: 1 person röstade för detta inlägg - other: '{{count}} personer röstade för detta inlägg' + one: "1 person gillade detta" + other: "{{count}} personer gillade detta" revisions: controls: first: "Första revision" @@ -1640,7 +1620,6 @@ sv: can: 'can… ' none: '(ingen kategori)' all: 'Alla kategorier' - choose: 'Välj en kategori…' edit: 'redigera' edit_long: "Redigera" view: 'Visa ämnen i kategori' @@ -1684,7 +1663,6 @@ sv: email_in_disabled_click: 'aktivera "inkommande e-post" inställningen.' show_subcategory_list: "Visa listan med underkategorier ovanför ämnen i denna kategori." num_featured_topics: "Antal ämnen som visas pÃ¥ sidan kategorier:" - all_topics_wiki: "Gör nya inlägg till wikis som standard" subcategory_list_style: "Liststil pÃ¥ underkategori:" sort_order: "Sortera ämneslista enligt:" default_view: "Förvald ämneslista" @@ -1692,7 +1670,6 @@ sv: edit_permissions: "Redigera behörigheter" add_permission: "Lägg till behörighet" this_year: "i Ã¥r" - position: "position" default_position: "Standardposition" position_disabled: "Kategorier kommer att sorteras efter deras aktivitet. För att ställa in sorteringen av kategorier i den här listan," position_disabled_click: 'aktivera "fasta kategoripositioner" inställningen.' @@ -1751,14 +1728,14 @@ sv: custom_placeholder_notify_moderators: "LÃ¥t oss veta i detalj vad du är bekymrad över, och skicka med relevanta länkar och exempel om möjligt." custom_message: at_least: - one: skriv Ã¥tminstone 1 tecken - other: skriv Ã¥tminstone {{count}} tecken + one: "skriv Ã¥tminstone 1 tecken" + other: "skriv Ã¥tminstone {{count}} tecken" more: - one: 1 till... - other: '{{count}} till...' + one: "1 till..." + other: "{{count}} till..." left: - one: 1 kvar - other: '{{count}} kvar' + one: "1 kvar" + other: "{{count}} kvar" flagging_topic: title: "Tack för att du hjälper oss hÃ¥lla forumet civiliserat!" action: "Flagga ämne" @@ -1769,13 +1746,13 @@ sv: links_title: "Populära länkar" links_shown: "visa fler länkar..." clicks: - one: 1 klick - other: '%{count} klick' + one: "1 klick" + other: "%{count} klick" post_links: about: "utvidga fler länkar för det här inlägget" title: - one: 1 mer - other: '%{count} mer' + one: "1 mer" + other: "%{count} mer" topic_statuses: warning: help: "Det här är en officiell varning." @@ -1809,22 +1786,22 @@ sv: original_post: "Originalinlägg" views: "Visningar" views_lowercase: - one: visning - other: visningar + one: "visning" + other: "visningar" replies: "Svar" views_long: - one: detta ämnet har visats 1 gÃ¥ng - other: detta ämne har visats {{number}} gÃ¥nger + one: "detta ämnet har visats 1 gÃ¥ng" + other: "detta ämne har visats {{number}} gÃ¥nger" activity: "Aktivitet" likes: "Gillningar" likes_lowercase: - one: gillar - other: gillar + one: "gillar" + other: "gillar" likes_long: "det finns {{number}} gillningar i detta ämne" users: "Användare" users_lowercase: - one: användare - other: användare + one: "användare" + other: "användare" category_title: "Kategori" history: "Historik" changed_by: "av {{author}}" @@ -1838,8 +1815,8 @@ sv: latest: title: "Senaste" title_with_count: - one: Senaste (1) - other: Senaste ({{count}}) + one: "Senaste (1)" + other: "Senaste ({{count}})" help: "ämnen med nya inlägg" hot: title: "Hett" @@ -1857,21 +1834,21 @@ sv: unread: title: "Olästa" title_with_count: - one: Oläst - other: Olästa ({{count}}) + one: "Oläst" + other: "Olästa ({{count}})" help: "ämnen som du bevakar eller följer med olästa inlägg" lower_title_with_count: - one: 1 oläst - other: '{{count}} olästa' + one: "1 oläst" + other: "{{count}} olästa" new: lower_title_with_count: - one: 1 ny - other: '{{count}} nya' + one: "1 ny" + other: "{{count}} nya" lower_title: "ny" title: "Nya" title_with_count: - one: Ny (1) - other: Nya ({{count}}) + one: "Ny (1)" + other: "Nya ({{count}})" help: "ämnen skapade de senaste dagarna" posted: title: "Mina Inlägg" @@ -1882,8 +1859,8 @@ sv: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "senaste ämnena i kategorin {{categoryName}}" top: title: "Topp" @@ -1967,20 +1944,20 @@ sv: print: 'ctrl+p Skriv ut ämne' badges: earned_n_times: - one: Förtjänade den här utmärkelsen 1 gÃ¥ng - other: Förtjänade den här utmärkelsen %{count} gÃ¥nger + one: "Förtjänade den här utmärkelsen 1 gÃ¥ng" + other: "Förtjänade den här utmärkelsen %{count} gÃ¥nger" granted_on: "Utfärdad %{date}" others_count: "Andra med den här utmärkelsen (%{count})" title: Utmärkelser badge_count: - one: 1 Utmärkelse - other: '%{count} Utmärkelser' + one: "1 Utmärkelse" + other: "%{count} Utmärkelser" more_badges: - one: +1 Till - other: +%{count} Till + one: "+1 Till" + other: "+%{count} Till" granted: - one: 1 utfärdad - other: '%{count} utfärdade' + one: "1 utfärdad" + other: "%{count} utfärdade" select_badge_for_title: Välj en utmärkelse att använda som din titel badge_grouping: getting_started: @@ -2238,11 +2215,11 @@ sv: none: "Det finns inga relaterade event." redeliver: "Leverera igen" incoming: - one: Det finns ett nytt event. - other: Det finns {{count}} nya event. + one: "Det finns ett nytt event." + other: "Det finns {{count}} nya event." completed_in: - one: Färdigställd pÃ¥ 1 sekund. - other: Färdigställd pÃ¥ {{count}} sekunder. + one: "Färdigställd pÃ¥ 1 sekund." + other: "Färdigställd pÃ¥ {{count}} sekunder." request: "FörfrÃ¥gning" response: "Svar" redeliver_confirm: "Är du säker pÃ¥ att du vill leverera samma nyttolast igen?" @@ -2459,7 +2436,6 @@ sv: address_placeholder: "namn@exempel.se" type_placeholder: "sammanfattning, registrering..." reply_key_placeholder: "svarsnyckel" - skipped_reason_placeholder: "anledning" logs: title: "Loggar" action: "Ã…tgärd" @@ -2580,11 +2556,11 @@ sv: suspect: 'Misstänkt' approved: "Godkänd?" approved_selected: - one: godkänd användare - other: godkänd användare ({{count}}) + one: "godkänd användare" + other: "godkänd användare ({{count}})" reject_selected: - one: avvisad användare - other: avvisade användare ({{count}}) + one: "avvisad användare" + other: "avvisade användare ({{count}})" titles: active: 'Aktiva användare' new: 'Nya användare' @@ -2600,11 +2576,11 @@ sv: suspended: 'Avstängda användare' suspect: 'Misstänkta användare' reject_successful: - one: 1 användare har avvisats. - other: '%{count} användare har avvisats.' + one: "1 användare har avvisats." + other: "%{count} användare har avvisats." reject_failures: - one: Avvisning av användaren misslyckades. - other: Avvisning av %{count} användare misslyckades. + one: "Avvisning av användaren misslyckades." + other: "Avvisning av %{count} användare misslyckades." not_verified: "Ej verifierad" check_email: title: "Visa den här användarens e-postadress" @@ -2664,14 +2640,14 @@ sv: delete_forbidden_because_staff: "Administratörer och moderatorer kan inte tas bort." delete_posts_forbidden_because_staff: "Kan inte ta bort alla inlägg av administratörer och moderatorer." delete_forbidden: - one: Användare kan inte tas bort om de har inlägg. Radera alla inlägg innan du försöker ta bort en användare. (Inlägg som är äldre än %{count} dag kan ej raderas.) - other: Användare kan inte tas bort om de har inlägg. Radera alla inlägg innan du försöker ta bort en användare. (Inlägg som är äldre än %{count} dagar kan ej raderas.) + one: "Användare kan inte tas bort om de har inlägg. Radera alla inlägg innan du försöker ta bort en användare. (Inlägg som är äldre än %{count} dag kan ej raderas.)" + other: "Användare kan inte tas bort om de har inlägg. Radera alla inlägg innan du försöker ta bort en användare. (Inlägg som är äldre än %{count} dagar kan ej raderas.)" cant_delete_all_posts: - one: Kan inte radera alla inlägg. NÃ¥gra inlägg är äldre än %{count} dag gammal. (Inställningen delete_user_max_post_age) - other: Kan inte radera alla inlägg. NÃ¥gra inlägg är äldre än %{count} dagar gamla. (Inställningen delete_user_max_post_age) + one: "Kan inte radera alla inlägg. NÃ¥gra inlägg är äldre än %{count} dag gammal. (Inställningen delete_user_max_post_age)" + other: "Kan inte radera alla inlägg. NÃ¥gra inlägg är äldre än %{count} dagar gamla. (Inställningen delete_user_max_post_age)" cant_delete_all_too_many_posts: - one: Kan inte radera alla inlägg, dÃ¥ användaren har fler än 1 inlägg. (delete_all_posts_max) - other: Kan inte radera alla inlägg, dÃ¥ användaren har fler än %{count} inlägg. (delete_all_posts_max) + one: "Kan inte radera alla inlägg, dÃ¥ användaren har fler än 1 inlägg. (delete_all_posts_max)" + other: "Kan inte radera alla inlägg, dÃ¥ användaren har fler än %{count} inlägg. (delete_all_posts_max)" delete_confirm: "Är du SÄKER pÃ¥ att du vill radera den användaren? Detta är permanent!" delete_and_block: "Radera och blockera denna e-post och IP-adress" delete_dont_block: "Radera enbart" @@ -2706,8 +2682,8 @@ sv: tl3_requirements: title: "Krav för förtroendenivÃ¥ 3" table_title: - one: 'Den senaste dagen:' - other: 'De senaste %{count} dagarna:' + one: "Den senaste dagen:" + other: "De senaste %{count} dagarna:" value_heading: "Värde" requirement_heading: "Krav" visits: "Besök" @@ -2872,8 +2848,8 @@ sv: text: "Det saknas urval av beviljningar. Det händer när utmärkelsesökningen returnerar ett användar-ID eller ett inläggs-ID som inte existerar. Det kan fÃ¥ oväntade resultat i ett senare skede, dubblekontrollera gärna din sökning." no_grant_count: "Inga utmärkelser att tilldelas." grant_count: - one: 1 utmärkelse att tilldelas. - other: '%{count} utmärkelser att tilldelas. ' + one: "1 utmärkelse att tilldelas." + other: "%{count} utmärkelser att tilldelas. " sample: "Exempel:" grant: with: "%{username}" diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml new file mode 100644 index 0000000000..9f1fdf70b8 --- /dev/null +++ b/config/locales/client.sw.yml @@ -0,0 +1,3461 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + js: + number: + format: + separator: "." + delimiter: "," + human: + storage_units: + format: '%n%u' + units: + byte: + one: Byte + other: Bytes + gb: GB + kb: KB + mb: MB + tb: TB + short: + thousands: "{{number}}k" + millions: "{{number}}M" + dates: + time: "h:mm a" + timeline_date: "MMM YYYY" + long_no_year: "MMM D h:mm a" + long_no_year_no_time: "MMM D" + full_no_year_no_time: "MMMM Do" + long_with_year: "MMM D, YYYY h:mm a" + long_with_year_no_time: "MMM S, MMMM" + full_with_year_no_time: "MMMM Do, YYYY" + long_date_with_year: "MMM D, 'YY LT" + long_date_without_year: "MMM D, LT" + long_date_with_year_without_time: "MMM D, 'YY" + long_date_without_year_with_linebreak: "MMM D
LT" + long_date_with_year_with_linebreak: "MMM D, 'YY
LT" + wrap_ago: "%{date} iliyopita" + tiny: + half_a_minute: "< dakika 1" + less_than_x_seconds: + one: "< 1s" + other: "< %{count}s" + x_seconds: + one: "1s" + other: "%{count}s" + less_than_x_minutes: + one: "< dakika moja" + other: "< %{count} dakika" + x_minutes: + one: "1m" + other: "%{count}m" + about_x_hours: + one: "1h" + other: "%{count}h" + x_days: + one: "1d" + other: "%{count}d" + x_months: + one: "Mwezi mmoja" + other: "%{count} miezi" + about_x_years: + one: "1y" + other: "%{count}y" + over_x_years: + one: "> 1y" + other: "> %{count}y" + almost_x_years: + one: "1y" + other: "%{count}y" + date_month: "MMM D" + date_year: "MMM 'YY" + medium: + x_minutes: + one: "dakika 1" + other: "dakika %{count} " + x_hours: + one: "saa 1" + other: "masaa %{count}" + x_days: + one: "siku 1" + other: "siku %{count}" + date_year: "MMM D, 'YY" + medium_with_ago: + x_minutes: + one: "dakika 1 iliyopita" + other: "dakika %{count} zilizopita" + x_hours: + one: "saa 1 iliyopita" + other: "masaa%{count} yaliyopita" + x_days: + one: "siku 1 iliyopita" + other: "siku %{count} zilizopita" + later: + x_days: + one: "siku 1 baadae" + other: "siku %{count} baadae" + x_months: + one: "mwezi 1 baadae" + other: "miezi %{count} baadae" + x_years: + one: "mwaka 1 baadae" + other: "miaka %{count} baadae" + previous_month: 'Mwezi Uliopita' + next_month: 'Mwezi Ujao' + placeholder: tarehe + share: + topic: 'Andika kiungo shiriki cha mada hii' + post: 'taarifa #%{postNumber}' + close: 'funga' + twitter: 'Shiriki hiki kiungo kwenye Twitter' + facebook: 'Shiriki hiki kiungo kwenye Facebook' + google+: 'Kishiriki hiki kiungo kwenye Google+, mtandao wa kijamii' + email: 'tuma kiungo hiki kwenye barua pepe' + action_codes: + public_topic: "ameifanya hii mada isiwe ya siri %{when}" + private_topic: "ameifanya hii mada ujumbe binafsi %{when}" + split_topic: "Gawanya hii mada %{when}" + invited_user: "amekaribisha %{who}%{when}" + invited_group: "amekaribisha %{who}%{when}" + user_left: "%{who}amejitoa kwenye ujumbe%{when}" + removed_user: "amemtoa %{who} %{when}" + removed_group: "amemtoa %{who}%{when}" + autoclosed: + enabled: 'Imefungwa %{when}' + disabled: 'Imefunguliwa %{when}' + closed: + enabled: 'Ilifungwa %{when}' + disabled: 'Imefunguliwa %{when}' + archived: + enabled: 'Hifadhiwa%{when}' + disabled: 'Imeondolewa kwenye hifadhi %{when}' + pinned: + enabled: 'imebandikwa%{when}' + disabled: 'imetolewa %{when}' + pinned_globally: + enabled: 'imebadikwa na itaonwa na umma %{when}' + disabled: 'imetolewa %{when}' + visible: + enabled: 'Orodheshwa %{when}' + disabled: 'Ondolewa katika orodha %{when}' + banner: + enabled: 'aligeuza hili kuwa bango %{when}. Itaonekana juu ya kila ukurasa mpaka itakapo ondolewa na mtumiaji.' + disabled: 'aliondoa hili bango %{when}. Halitaonekana tena juu ya kila ukurasa.' + topic_admin_menu: "vitendo vya viongozi wa mada" + wizard_required: "Karibu Discourse! Tuanze na the setup wizard ✨" + emails_are_disabled: "Utumaji wa barua pepe umezuiliwa na msimamizi. Hakuna taarifa za utumwaji wa barua pepe zitakazotumwa." + bootstrap_mode_enabled: "Kurahisisha kuweka tovuti yako hewani, upo kwenye halitumizi ya bootsrap. Watumiaji wapya watapewa kiwango cha 1 cha uaminifu na kuwezeshwa kupata barua pepe mara kwa mara. Hii itazimwa kipindi watumiaji %{min_users} wakijiunga." + bootstrap_mode_disabled: "Halitumizi ya Bootstrap itasitishwa baada ya masaa 24." + themes: + default_description: "Halisi" + s3: + regions: + ap_northeast_1: "Asia Pacific (Tokyo)" + ap_northeast_2: "Asia Pacific (Seoul)" + ap_south_1: "Asia Pacific (Mumbai)" + ap_southeast_1: "Asia Pacific (Singapore)" + ap_southeast_2: "Asia Pacific (Sydney)" + cn_north_1: "China (Beijing)" + eu_central_1: "Umoja wa Ulaya (Frankfurt)" + eu_west_1: "Umoja wa Ulaya (Ireland)" + eu_west_2: "Umoja wa Ulaya (London)" + eu_west_3: "EU (Parisi)" + sa_east_1: "Amerika ya Kusini (Sao Paulo)" + us_east_1: "Mashariki ya Marekani (Virginia Kaskazini)" + us_east_2: "Mashariki ya Marekani (Ohio)" + us_gov_west_1: "AWS GovCloud (Marekani)" + us_west_1: "Magharibi ya Marekani (California Kaskazini)" + us_west_2: "Magharibi ya Marekani (Oregon)" + edit: 'hariri kichwa na kikundi cha mada hii' + not_implemented: "Samahani, kipengele hicho hakijatekelezwa bado." + no_value: "Hapana" + yes_value: "Ndiyo" + submit: "Wasilisha" + generic_error: "Samahani, hitilafu imetokea." + generic_error_with_reason: "Hitilafu imetokea: %{error}" + sign_up: "Jiunge" + log_in: "Ingia" + age: "Umri" + joined: "Alijiunga" + admin_title: "Kiongozi" + flags_title: "Bendera" + show_more: "onyesha zaidi" + show_help: "chaguo" + links: "Viungo" + links_lowercase: + one: "Linki" + other: "Linki" + faq: "FAQ" + guidelines: "Miongozo" + privacy_policy: "Sera ya Faragha" + privacy: "Faragha" + tos: "Masharti ya Huduma" + mobile_view: "Mtazamo wa Simu" + desktop_view: "Muonekano wa Eneo Kazi" + you: "Wewe" + or: "au" + now: "sasa hivi" + read_more: 'soma zaidi' + more: "Zaidi" + less: "Punguza" + never: "kamwe" + every_30_minutes: "kila dakika 30" + every_hour: "kila saa" + daily: "kila siku" + weekly: "kila wiki" + every_two_weeks: "kila wiki mbili" + every_three_days: "kila siku tatu" + max_of_count: "kiwango cha juu cha {{count}}" + alternation: "au" + character_count: + one: "Herufi {{count}}" + other: "Herufi {{count}}" + suggested_topics: + title: "Mada Zilizopendekezwa" + pm_title: "Ujumbe Uliopendekezwa" + about: + simple_title: "Kuhusu " + title: "Kuhusu %{title}" + stats: "Takwimu za tovuti." + our_admins: "Viongozi Wetu" + our_moderators: "Wasimamizi Wetu" + stat: + all_time: "Mda Wote" + last_7_days: "7 za Mwisho" + last_30_days: "30 za Mwisho" + like_count: "Upendo" + topic_count: "Mada" + post_count: "Machapisho" + user_count: "Watumiaji" + active_user_count: "Watumiaji wa Mara kwa Mara" + contact: "Wasiliana Nasi" + contact_info: "Iwapo kuna suala la muhimu au haraka linalohusiana na mtandao huu, tafadhali wasiliana nasi kupitia %{contact_info}." + bookmarked: + title: "Alamisho" + clear_bookmarks: "Futa Maalamisho" + help: + bookmark: "Bonyeza kualamisha chapisho la kwanza kwenye mada hii" + unbookmark: "Bofya kuondoa mialamisho yote kwenye mada hii" + bookmarks: + not_logged_in: "samahani, lazima uwe umeingia kuhifadhi machapisho" + created: "umealamisha chapisho hili" + not_bookmarked: "umesoma chapisho hilim bonyeza kuialamisha" + last_read: "hili ni chapisho la mwisho ulilosoma; bofya kualamisha" + remove: "Ondoa Alamisho" + confirm_clear: "una uhakika unataka kuondoa mialamisho ya mada hii?" + drafts: + new_topic: "Mswadajaribio wa mada mpya" + new_private_message: "Mswadajaribio wa ujumbe binafsi mpya" + topic_count_latest: + one: "Angalia Topiki Mpya au Masahisho {{count}}" + other: "Angalia Topiki Mpya au Masahisho {{count}}" + topic_count_unread: + one: "Angalia Topiki {{count}} Zisizosomwa" + other: "Angalia Topiki {{count}} Zisizosomwa" + topic_count_new: + one: "Angalia Topiki {{count}} Mpya" + other: "Angalia Topiki {{count}} Mpya" + preview: "kihakiki" + cancel: "ghairi" + save: "Hifadhi Mabadiliko" + saving: "Inahifadhi..." + saved: "Imehifadhiwa!" + upload: "Pakia" + uploading: "Inapakiwa..." + uploading_filename: "Inapakiwa {{jina la file}}..." + uploaded: "Imepakiwa!" + pasting: "Inabandika..." + enable: "Ruhusu" + disable: "Zuia" + continue: "Endelea" + undo: "Tendua" + revert: "Rudisha Nyuma" + failed: "Imeshindikana" + switch_to_anon: "Ingia Hali-tumizi Isiyojulikana" + switch_from_anon: "Ondoka kwenye Hali-tumizi Isiyojulikana" + banner: + close: "Puuzia bango hili." + edit: "Hariri bango hili >>" + choose_topic: + none_found: "Hakuna mada zilizopatikana." + title: + search: "Tafuta Mada kwa jina, anwani au utambulisho:" + placeholder: "andika kichwa cha mada hapa" + queue: + topic: "Mada:" + approve: 'Toa Kibali' + reject: 'Kataa' + delete_user: 'Futa Mtumiaji' + title: "Inahitaji Uthibitisho" + none: "Hakuna machapisho ya kukagua." + edit: "Hariri" + cancel: "Ghairi" + view_pending: "angalia machapisho ambayo hayajapitishwa" + has_pending_posts: + one: "Topiki hii in posti 1 inayosubiri uhakiki" + other: "Topiki hii ina posti {{count}} inayosubiria uhakiki" + confirm: "Hifadhi Mabadiliko" + delete_prompt: "Una uhakika unataka kumfuta%{username}? Kitendo hicho kitaondoa machapisho yake yote na kuzuia barua pepe na anwani yake ya mtandao." + approval: + title: "Chapisho Linahitaji Kibali" + description: "Tumepokea chapisho lako jipya, lakini linahitaji kupata kibali kutoka kwa kiongozi kabla ya kuonyeshwa. Tafadhali kuwa na subira." + pending_posts: + one: "Una posti 1 inayosubiri." + other: "Una posti {{count}} zinazosubiri." + ok: "SAWA" + user_action: + user_posted_topic: "{{mtumiaji}} amechapisha mada" + you_posted_topic: "Ume chapisha mada" + user_replied_to_post: "{{mtumiaji}} amejibu {{post_number}}" + you_replied_to_post: "Ume jibu{{post_number}}" + user_replied_to_topic: "{{mtumiaji}} amejibu mada" + you_replied_to_topic: "Ume jibumada" + user_mentioned_user: "{{mtumiaji}} amemtaja {{mtumiaji_mwingine}}" + user_mentioned_you: "{{mtumiaji}} amekutaja wewe" + you_mentioned_user: "Ume mtaja {{mtumiaji_mwingine}}" + posted_by_user: "Imechapishwa na {{mtumiaji}}" + posted_by_you: "Imechapishwa na wewe" + sent_by_user: "Imetumwa na {{mtumiaji}}" + sent_by_you: "Imetumwa na wewe" + directory: + filter_name: "chuja kwa jina la mtumiaji" + title: "Watumiaji" + likes_given: "Imetolewa" + likes_received: "Imepokelewa" + topics_entered: "Imeonwa" + topics_entered_long: "Mada Zilizoonwa" + time_read: "Mda wa Kusoma" + topic_count: "Mada" + topic_count_long: "Mada Zilizotengenezwa" + post_count: "Majibu" + post_count_long: "Majibu Yaliyochapishwa" + no_results: "Hakuna majibu yaliyopatikana." + days_visited: "Matembezi" + days_visited_long: "Siku Zilizotembelewa" + posts_read: "Soma" + posts_read_long: "Machapisho Yaliyosomwa" + total_rows: + one: "Mtumiaji mmoja" + other: "%{count} watumiaji" + group_histories: + actions: + change_group_setting: "Badilisha mipangilio ya kikundi" + add_user_to_group: "Ongeza mtumiaji" + remove_user_from_group: "Ondoa mtumiaji" + make_user_group_owner: "Mfanye awe mmiliki" + remove_user_as_group_owner: "Ondoa mmiliki" + groups: + add_members: + title: "Ongeza Wanachama" + description: "Simamia uanachama wa kikundi hiki" + usernames: "Majina la watumiaji" + manage: + title: 'Simamia' + name: 'Jina' + full_name: 'Jina Lote' + add_members: "Ongeza Wanachama" + delete_member_confirm: "Ondoa '%{username}' kwenye kikundi '%{group}'?" + profile: + title: Umbo + interaction: + title: Kushirikiana + posting: Inachapishwa + notification: Taarifa + membership: + title: Uanachama + access: Ufikivu + logs: + title: "Batli" + when: "Lini" + action: "Kitendo" + acting_user: "Makamu Mtumiaji" + target_user: "Mtumiaji aliyelengwa" + subject: "Maudhui" + details: "Maelezo" + from: "Kutoka kwa" + to: "Kwenda" + public_admission: "ruhusu watumiaji wajiunge kwenye kikundi bure (kikundi kinabidi kionwe na umma)" + public_exit: "ruhusu watumiaji waache kikundi bure" + empty: + posts: "Hakuna machapisho ya wanachama wa kikundi hiki." + members: "Hakuna wanachama kwenye kikundi hiki." + mentions: "Hakuna waliotajwa kwenye kikundi hiki." + messages: "Hakuna ujumbe kwenye kikundi hiki." + topics: "Hakuna mada za wanachama wa kikundi hiki." + logs: "Hakuna batli za kikundi hiki." + add: "Ongeza" + join: "Jiunge" + leave: "Ondoka" + request: "Ombi" + message: "Ujumbe" + allow_membership_requests: "Waruhusu watumiaji waombe uanachama kwa wamiliki wa vikundi." + membership_request_template: "Muundo wa kuonyesha watumiaji wakati wa maombi ya uanachama." + membership_request: + submit: "Wasilisha Ombi" + title: "Omba kujiunga @%{group_name}" + reason: "Wajulishe wamiliki wa vikundi kwa nini upo kwenye kikundi hiki" + membership: "Uanachama" + name: "Jina" + group_name: "Jina la kikundi" + user_count: "Watumiaji" + bio: "Kuhusu Kikundi" + selector_placeholder: "andika jina la mtumiaji" + owner: "mmiliki" + index: + title: "Vikundi" + all: "Vikundi Vyote" + empty: "Hakuna vikundi vya kuonwa." + filter: "Chuja kulingana na aina ya kikundi" + owner_groups: "Vikundi ninavyovimiliki" + close_groups: "Vikundi Vilivyofungwa" + automatic_groups: "Vikundi Otomatiki" + automatic: "Otomatiki" + closed: "Imefungwa" + public: "Umma" + private: "Binafsi" + public_groups: "Vikundi vya Umma" + automatic_group: Kikundi Otomatiki + close_group: Funga Kikundi + my_groups: "Vikundi Vyangu" + group_type: "Aina ya kikundi" + is_group_user: "Mwanachama" + is_group_owner: "Mmiliki" + title: + one: "Kundi" + other: "Makundi" + activity: "Shughuli" + members: + title: "Wanachama" + filter_placeholder_admin: "jina la mtumiaji au barua pepe" + filter_placeholder: "jina la mtumiaji" + remove_member: "Mtoe Mwanachama" + remove_member_description: "Mtoe %{username} kwenye hiki kikundi" + make_owner: "Mpe Umiliki" + make_owner_description: "Mpe %{username}umiliki wa kikundi hiki" + remove_owner: "Muondoe kama Mmiliki" + remove_owner_description: "Muondoe %{username}asiwe mmiliki wa kikundi hiki" + owner: "Mmiliki" + topics: "Mada" + posts: "Machapisho" + mentions: "Kutajwa" + messages: "Ujumbe" + notification_level: "Kiwango cha taarifa cha chaguo-msingi kwa ajili ya ujumbe wa kikundi" + alias_levels: + mentionable: "Nani anaweza @kutaja kikundi hiki?" + messageable: "Nani anaweza kutuma ujumbe kwenye kikundi hiki?" + nobody: "Hakuna Mtu" + only_admins: "Viongozi tu" + mods_and_admins: "Wasimamizi na Viongozi tu." + members_mods_and_admins: "Wanachama wa kikundi, wasimamizi na viongozi tu" + everyone: "Kila Mtu" + notifications: + watching: + title: "Inaangaliwa" + description: "Utajulishwa kuhusu kila chapisho jipya kwenye kila ujumbe, na idadi ya majibu mapya itaonyeshwa." + watching_first_post: + title: "Chapisho la Kwanza Linaangaliwa" + description: "Utajulishwa kuhusu chapisho la kwanza kwenye kila mada ndani ya kikundi hichi." + tracking: + title: "Inafuatiliwa" + description: "Utajulishwa kama mtu akitaja @jina lako au akikujibu, na idadi ya majibu mapya itaonyeshwa." + regular: + title: "Kawaida" + description: "Utajulishwa kama mtu akitaja @jina lako au akikujibu." + muted: + title: "Imenyamazishwa" + description: "Hautajulishwa chochote kuhusu mada mpya kwenye kikundi hichi." + flair_url: "Picha ya mtumiaji" + flair_url_placeholder: "(Hiari) URL ya Picha au Font Awesome class" + flair_bg_color: "Rangi ya nyuma kwenye picha ya mtumiaji" + flair_bg_color_placeholder: "(Hiari) Thamani ya Rangi kwa Hex" + flair_color: "Rangi ya picha ya mtumiaji" + flair_color_placeholder: "(Hiari) Thamani ya Rangi kwa Hex" + flair_preview_icon: "Kihakiki Ikoni" + flair_preview_image: "Kihakiki Picha" + user_action_groups: + "1": "Upendo Uliotolewa" + "2": "Upendo Uliopokea" + "3": "Alamisho" + "4": "Mada" + "5": "Majibu" + "6": "Majibu" + "7": "Kutajwa" + "9": "Nukulu" + "11": "hariri" + "12": "Vilivyotumwa" + "13": "kisanduku pokezi" + "14": "Inasubiri" + categories: + all: "kategoria zote" + all_subcategories: "Zote" + no_subcategory: "hakuna" + category: "Kategoria" + category_list: "Onyesha orodha ya kategoria" + reorder: + title: "Panga tena Kategoria" + title_long: "Panga tena orodha ya kategoria" + save: "Hifadhi Oda" + apply_all: "Tumia" + position: "Nafasi" + posts: "Machapisho" + topics: "Mada" + latest: "Hivi Karibuni" + latest_by: "hivi karibuni na" + toggle_ordering: "swichi udhibiti wa oda" + subcategories: "Kategoria mtoto" + topic_sentence: + one: "1 topiki" + other: "%{count} Topiki" + topic_stat_sentence: + one: "%{count} Topiki Mpya katika %{unit} zilizopita." + other: "%{count} Topiki Mpya katika %{unit} zilizopita." + ip_lookup: + title: Utafutaji wa Anwani ya Mtandao + hostname: Hostname + location: Sehemu + location_not_found: (haijulikani) + organisation: Shirika + phone: Simu + other_accounts: "Akaunti nyingine zenye anuani moja" + delete_other_accounts: "Futa %{count}" + username: "jinalamtumiaji" + trust_level: "Kiwango cha Uaminifu" + read_time: "mda wa kusoma" + topics_entered: "mada zilizoingizwa" + post_count: "# machapisho" + confirm_delete_other_accounts: "Una uhakika unataka kufuta hizi akaunti?" + powered_by: "inasimamiwa na ipinfo.io" + user_fields: + none: "(Chagua chaguo moja)" + user: + said: "{{jinalamtumiaji}}:" + profile: "Maelezo Mafupi " + mute: "Nyamazisha" + edit: "Hariri Mapendekezo" + download_archive: + button_text: "Pakua Zote" + confirm: "Una uhakika unataka kupakua machapisho yako?" + success: "Upakuaji umeanza, utajulishwa kwa njia ya ujumbe mfumo ukimaliza." + rate_limit_error: "Machapisho yanaweza kupakuliwa mara moja kwa siku, tafadhali jaribu tena kesho." + new_private_message: "Ujumbe Mpya" + private_message: "Ujumbe" + private_messages: "Ujumbe" + activity_stream: "Shughuli" + preferences: "Mapendekezo" + expand_profile: "Panua" + collapse_profile: "Kunja" + bookmarks: "Mialamisho" + bio: "Kuhusu mimi" + invited_by: "Amekaribishwa Na" + trust_level: "Kiwango cha Uaminifu" + notifications: "Taarifa" + statistics: "Takwimu" + desktop_notifications: + label: "Taarifa Mbashara" + not_supported: "Taarifa hazionyeshwi kwenye kivinjari hiki. Samahani." + perm_default: "Ruhusu Taarifa" + perm_denied_btn: "Kibali Kimekataliwa" + perm_denied_expl: "Umekataza kibali cha taarifa. Ruhusu taarifa kupitia mipangilio ya kivinjari." + disable: "Sitisha Taarifa" + enable: "Ruhusu Taarifa" + each_browser_note: "Ilani: Unaweza kubadilisha mpangilio huu kwenye kila kivinjari utakachotumia." + consent_prompt: "Je, unataka taarifa mubashara watu wakijibu kwenye posti zako?" + dismiss: 'Ondosha' + dismiss_notifications: "Puuzia Zote" + dismiss_notifications_tooltip: "Weka alama kuwa taarifa zote ambazo hazijasomwa kuwa zimesomwa" + first_notification: "Umepata taarifa ya kwanza! Ichague kuanza." + disable_jump_reply: "Usifikie chapisho langu baada ya kujibu" + dynamic_favicon: "Onyesha idadi ya mada mpya / sasishwa kwenye ikoni ya kivinjari" + theme_default_on_all_devices: "Fanya mandhari hii iwe chaguo-msingi kwenye vifaa vyangu vyote" + allow_private_messages: "Ruhusu watumiaji wengine wanitumie ujumbe binafsi" + external_links_in_new_tab: "Fungua viungo vingine kwenye kichupo kingine" + enable_quoting: "Ruhusu jibu nukulu kwenye neno lenye angaza" + change: "badilisha" + moderator: "{{mtumiaji}} ni msimamizi" + admin: "{{mtumiaji}} ni kiongozi" + moderator_tooltip: "Mtumiaji huyu ni msimamizi" + admin_tooltip: "Mtumiaji huyu ni kiongozi" + silenced_tooltip: "Mtumiaji amenyamazishwa" + suspended_notice: "Akaunti imesitishwa mpaka {{tarehe}}." + suspended_permanently: "Mtumiaji amesitishwa." + suspended_reason: "Sababu:" + github_profile: "Github" + email_activity_summary: "Muhtasari wa Shughuli" + mailing_list_mode: + label: "Mfumo wa kutuma barua pepe" + enabled: "Wezesha mfumo wa kutuma barua pepe" + instructions: | + Mpangilio huu utapewa kipaumbele juu ya muhtasari wa shughuli. + Mada na Kategoria zilizonyamazishwa hazitawekwa ndani kwenye barua pepe hizi. + individual: "Tuma barua pepe kwa ajili ya kila chapisho jipya" + individual_no_echo: "Tuma barua pepe kwa ajili ya kila chapisho jipya ila zangu" + many_per_day: "Nitumie barua pepe kwa ajili ya kila chapisho jipya (kuhusu {{KadiriaBaruapepezakilasiku}} kila siku)" + few_per_day: "Nitumie barua pepe kwa ajili ya kila chapisho jipya (kwa kukadiria 2 kwa siku)" + warning: "Mfumo wa kutuma barua pepe umewezeshwa. Taarifa za barua pepe zimeongezeka" + tag_settings: "Lebo" + watched_tags: "Imeangaliwa" + watched_tags_instructions: "Utaangalia mada zote zenye lebo hizi. Utajulishwa kuhusiana na mada na machapisho mapya, namba za machapisho pia zitatokea pembeni ya mada." + tracked_tags: "Imefuatiliwa" + tracked_tags_instructions: "Utafuatilia mada zote zenye lebo hizi. Namba za machapisho mapya zitatokea pembeni ya mada." + muted_tags: "Imenyamazishwa" + muted_tags_instructions: "Hautajulishwa kuhusu mada mpya zenye lebo hizi, na hazitatokea kwenye sehemu ya hivi karibuni." + watched_categories: "Imeangaliwa" + watched_categories_instructions: "Utaangalia mada zote kwenye kategoria hizi. Utajulishwa kuhusiana na mada na machapisho mapya, namba za machapisho pia zitatokea pembeni ya mada." + tracked_categories: "Imefuatiliwa" + tracked_categories_instructions: "Utafuatilia mada zote kwenye kategoria hizi. Namba za machapisho mapya zitatokea pembeni ya mada." + watched_first_post_categories: "Chapisho la Kwanza Linaangaliwa" + watched_first_post_categories_instructions: "Utajulishwa kuhusu chapisho la kwanza tu kwenye kila mada mpya ndani ya kategoria hizi." + watched_first_post_tags: "Chapisho la Kwanza Linaangaliwa" + watched_first_post_tags_instructions: "Utajulishwa kuhusu chapisho la kwanza kwenye kila mada mpya yenye lebo hizi." + muted_categories: "Imenyamazishwa" + muted_categories_instructions: "Hautajulishwa kuhusu mada mpya kwenye kategoria hizi, na hazitatokea kama taarifa za hivi karibuni." + no_category_access: "Kama msimamizi una ufikivu kidogo wa kategoria, hifadhi imesitishwa." + delete_account: "Futa Akaunti Yangu" + delete_account_confirm: "Una uhakika unataka kufuta akaunti yako? Kitendo hiki hakiwezi kufanyika tena!" + deleted_yourself: "Akaunti yako imefutwa kwa mafanikio." + delete_yourself_not_allowed: "Tafadhali wasiliana na msaidizi kama unataka kufuta akaunti yako." + unread_message_count: "Ujumbe" + admin_delete: "Futa" + users: "Watumiaji" + muted_users: "Kunyamazisha" + muted_users_instructions: "Sitisha taarifa zote kutoka kwa watumiaji hawa." + muted_topics_link: "Onyesha mada zilizonyamazishwa" + watched_topics_link: "Onyesha mada zilizoangaliwa" + tracked_topics_link: "Onyesha mada zinazofuatiliwa" + automatically_unpin_topics: "Otomatikali ondoa mada zilizobandikwa nikifika mwisho wa ukurasa." + apps: "Programu-tumizi" + revoke_access: "Tengua ufikivu" + undo_revoke_access: "Ondoa Utenguaji Fikivu" + api_approved: "Imeidhinishwa" + theme: "Mandhari" + home: "Chaguo-msingi mwanzo" + staged: "Sehemu ya kujaribu" + staff_counters: + flags_given: "bendera za usaidizi" + flagged_posts: "Machapisho yenye bendera." + deleted_posts: "Machapisho yaliyofutwa" + suspensions: "masitisho" + warnings_received: "maonyo" + messages: + all: "Vyote" + inbox: "Kisanduku-pokezi" + sent: "Imetumwa" + archive: "Hifadhi" + groups: "Makundi yangu" + bulk_select: "Chagua jumbe" + move_to_inbox: "Hamishia kwenye kisanduku-pokezi" + move_to_archive: "Hifadhi" + failed_to_move: "Uhamishaji wa ujumbe uliochaguliwa umeshindikana (laba hauna mtandao wa intaneti uko chini)" + select_all: "Chagua vyote" + tags: "Lebo" + preferences_nav: + account: "Akaunti" + profile: "Maelezo mafupi" + emails: "Barua pepe" + notifications: "Taarifa" + categories: "Vikundi" + tags: "Lebo" + interface: "Kiolesura" + apps: "Apps" + change_password: + success: "(barua pepe imetumwa)" + in_progress: "(barua pepe inatumwa)" + error: "(hitilafu)" + action: "Tuma barua pepe ya kuweza kutengeneza nywila mpya" + set_password: "Tengeneza Nywila" + choose_new: "Chagua nywila mpya" + choose: "Chagua nywila" + second_factor_backup: + regenerate: "Tengeneza Upya" + disable: "Sitisha" + enable: "Wezesha" + enable_long: "Wezesha kodi za backup" + manage: "Fanya menejimenti ya kodi za backup" + copied_to_clipboard: "Nakili" + copy_to_clipboard_error: "Makosa kwenye Kunakili" + remaining_codes: "Una kodi {{count}} za backup zimebaki." + second_factor: + title: "Uhalalalishaji wa Viwango Viwili" + disable: "Zuia uhalalalishaji wa Viwango Viwili" + enable: "Wezesha two factor authentication Kuongeza ulinzi katika akaunti" + confirm_password_description: "Thibitisha nywila yako kuendelea" + label: "Kodi" + enable_description: | + Skani hii QR Code kwa kutumia application inayoweza kuskani (Android – iOS – Windows Phone) na andika kodi ya uthibitisho. + disable_description: "Tafadhali andika kodi ya uthibitisho kutoka kwenye app yako" + show_key_description: "Andika kwa mkono" + extended_description: | + Viwango viwili vya uthibitisho vinaweka ulinzi mkubwa kwenye akaaunti yako kwa sababu kitu nyongeza zaidi ya nywila kitahitajika kuingia kwenye akaunti. Vitu hivyo vinaweza kutengenezwa kwa ajili ya vifaa vya Android,iOS, na Windows Phone. + oauth_enabled_warning: "Tafadhali jua kuwa kuingia kupitia mitandao itasitishwa kama uthibitisho wa kiwango cha pili umewezeshwa kwenye akaunti yako." + change_about: + title: "Badilisha Taarifa Zangu" + error: "Hitilafu imetokea wakati wa kubadilisha namba hii." + change_username: + title: "Badilisha Jina la Mtumiaji" + confirm: "Je, una uhakika unataka kuabadili jina la mtumiaji?" + taken: "Samahani, hilo jina limechukuliwa." + invalid: "Hilo jina ni batili. Jina lazima liwe na namba au herufi au vyote viwili" + change_email: + title: "Badilisha Barua Pepe" + taken: "Samahani, hiyo barua pepe haipo hewani." + error: "Hitilafu imetokea wakati wa kubadilisha barua pepe. Labda hiyo barua pepe imeshatumika?" + success: "Tumekutumia barua kwenye barua pepe uliyotumia. Tafadhali fuata maelezo tuliyokutumia." + success_staff: "Tumekutumia barua kwenye barua pepe uliyotumia. Tafadhali fuata maelezo tuliyokutumia." + change_avatar: + title: "Badilisha Picha yako" + gravatar: "imetoka kwa Ishara" + gravatar_title: "Badilisha Ishara kwenye Mtandao wa Ishara" + gravatar_failed: "Tumeshindwa kupata ishara. Je una ishara ambayo inatumika kwenye barua pepe yako ?" + refresh_gravatar_title: "Onesha Upya Ishara Yako" + letter_based: "Mfumo imekabidhi Picha" + uploaded_avatar: "Picha Binafsi" + uploaded_avatar_empty: "Ongeza picha yako binafsi" + upload_title: "Pakia picha yako" + upload_picture: "Pakia Picha" + image_is_not_a_square: "Onyo: tumepogoa picha yako; upana na urefu hauko sawa." + change_profile_background: + title: "Mandharinyuma ya Umbo" + instructions: "Mandharinyuma ya Umbo yatakuwa katikati na upana wa 850px." + change_card_background: + title: "Upande wa nyuma wa Kadi ya mtumiaji" + instructions: "Picha za nyuma zitawekwa katikati na zitakuwa na upana wa 590px." + email: + title: "Barua pepe" + primary: "Barua pepe ya awali" + secondary: "Barua pepe" + instructions: "haitoonyeshwa kwa umma" + ok: "Tutakutumia barua pepe kuthibitisha" + invalid: "Andika barua pepe iliyo sahihi" + authenticated: "Barua pepe yako imethibitishwa na {{mkimu}}" + frequency_immediately: "Tutakutumia barua pepe sasa hivi kama haujasoma kitu ambacho tunaendea kukutumia." + frequency: + one: "Tutakutumia barua pepe endapo tu hatujakuona mtanadaoni dakika {{count}} iliyopita." + other: "Tutakutumia barua pepe endapo tu hatujakuona mtanadaoni dakika {{count}} zilizopita." + associated_accounts: + title: "Akaunti inayohusiana" + connect: "Unganisha" + not_connected: "(haijaunganishwa)" + name: + title: "Jina" + instructions: "jina lako lote (sio lazima)" + instructions_required: "Jina lako lote" + too_short: "Jina lako ni fupi" + ok: "Jina lako liko vizuri" + username: + title: "Jina la mtumiaji" + instructions: "kipekee, hakuna nafasi, fupi" + short_instructions: "Watu wanaweza kukutaja kwa jina la @{{jina la mtumiaji}}" + available: "Jina la mtumiaji limepatikana" + not_available: "Haijapatikana. Jaribu {{dokezo}}?" + not_available_no_suggestion: "Haijapatikana" + too_short: "Jina lako la mtumiaji ni fupi sana" + too_long: "Jina la mtumiaji ni refu sana" + checking: "Tunaangalia kama jina la mtumiaji lipo..." + prefilled: "Barua pepe inalingana na jina la mtumiaji lililosajiliwa" + locale: + title: "lugha ya kiolesura" + instructions: "Lugha ya kiolesura ya mtumiaji. Itabadilika ukirudisha tena ukurasa." + default: "(chaguo-msingi)" + any: "yoyote" + password_confirmation: + title: "nywila upya" + last_posted: "chapisho la mwisho" + last_emailed: "Mara ya Mwisho Amepokea Barua Pepe" + last_seen: "Imeonwa" + created: "Amejiunga" + log_out: "Ondoka" + location: "Sehemu" + website: "Tovuti" + email_settings: "Barua Pepe" + like_notification_frequency: + title: "Julisha ikipendwa" + always: "Mara kwa mara" + first_time_and_daily: "Mara ya kwanza chapisho likipendwa na kila siku" + first_time: "Mara ya kwanza chapisho limependwa" + never: "Kamwe" + email_previous_replies: + title: "Weka ndani majibu ya kabla chini ya barua pepe" + unless_emailed: "isipokuwa ilitumwa kabla" + always: "mara kwa mara" + never: "kamwe" + email_digests: + title: "Nisipotembelea hapa, nitumie muhtasari wa barua pepe ulio na mada na majibu maarufu" + every_30_minutes: "kila baada ya dakika 30" + every_hour: "kila saa" + daily: "kila siku" + every_three_days: "kila siku tatu" + weekly: "kila wiki" + every_two_weeks: "kila wiki mbili" + include_tl0_in_digests: "Tia ndani maandishi kutoka kwa watumiaji wapya kwenye muhtasari wa barua pepe" + email_in_reply_to: "Jumuisha dhana ya majibu ya posti kwenye barua pepe" + email_direct: "Tuma barua pepe mtu akinukulu, akijibu chapisho langu, akitaja @jina langu, au akinialika kwenye mada." + email_private_messages: "Nitumie barua pepe mtu akinitumia ujumbe" + email_always: "Nitumie taarifa kupitia barua pepe nikiwa amilifu kwenye mtandao" + other_settings: "Zingine" + categories_settings: "Kategoria" + new_topic_duration: + label: "Mada ni mpya kama" + not_viewed: "Bado sijazipitia" + last_here: "ilitengenezwa mara ya mwisho nilivyokuwa hapa" + after_1_day: "imetengenezwa siku chache zilizopita" + after_2_days: "imetengenezwa siku 2 zilizopita" + after_1_week: "imetengenezwa wiki iliyopita" + after_2_weeks: "imetengenezwa wiki 2 zilizopita" + auto_track_topics: "Fuatilia mada ninazo andika." + auto_track_options: + never: "kamwe" + immediately: "mara moja" + after_30_seconds: "baada ya sekunde 30" + after_1_minute: "baada ya dakika 1" + after_2_minutes: "baada ya dakika 2" + after_3_minutes: "baada ya dakika 3" + after_4_minutes: "baada ya dakika 4" + after_5_minutes: "baada ya dakika 5" + after_10_minutes: "baada ya dakika 10" + notification_level_when_replying: "Nikiandika ndani ya mada, mada itawekwa kwenye" + invited: + search: "andika kutafuta mualiko..." + title: "Waliokaribishwa" + user: "Mtumiaji Aliyekaribishwa" + sent: "Imetumwa" + none: "Hakuna mialiko ya kuonyeshwa." + truncated: + one: "Onyesha mwaliko wa kwanza." + other: "Onyesha mialiko ya kwanza {{count}}." + redeemed: "Mialiko Iliyopatikana" + redeemed_tab: "Imepatikana" + redeemed_tab_with_count: "({{count}}) zimepatikana" + redeemed_at: "Imepatikana" + pending: "Mialiko Inayosubiria" + pending_tab: "subiria" + pending_tab_with_count: "({{count}}) zinasubiria" + topics_entered: "mada zilizotazamwa" + posts_read_count: "Machapisho yaliyosomwa" + expired: "Mda wa mualiko huu umeisha." + rescind: "Ondoa" + rescinded: "Mualiko umeondolewa" + rescind_all: "Ondoa Mialiko yote" + rescinded_all: "Mialiko yote imeondolewa!" + rescind_all_confirm: "Una uhakika unataka kuondoa mialiko yote?" + reinvite: "Tuma tena Mualiko" + reinvite_all: "Tuma tena Mialiko yote" + reinvite_all_confirm: "Una uhakika unataka kutuma tena mialiko yote?" + reinvited: "Mualiko umetumwa tena" + reinvited_all: "Mialiko yote imetumwa tena!" + time_read: "Mda wa kusoma" + days_visited: "Siku Iliyotembelewa" + account_age_days: "Akaunti ina umri wa siku" + create: "Tuma Mualiko" + generate_link: "Nakili Kiungo cha Mualiko" + link_generated: "Kiungo cha Mualiko kimetengenezwa kwa mafanikio!" + valid_for: "Kiungo cha Mwaliko kitatumiwa na barua pepe hii tu:%{email}" + bulk_invite: + none: "Haujamwalika mtu yoyote hapa. Tuma mwaliko mmoja mmoja kwa watu, au tuma mialiko kwa watu wengi kwa kupakia faili la CSV ." + text: "Alika Wengi kutoka kwenye Faili" + success: "Faili limepakiwa kwa mafanikio, utapewa taarifa kwa kupitia Meseji mchakato utakapo kamilika" + error: "Samahani, faili hili inabidi liwe na umbizo faili la CSV" + password: + title: "Nywila" + too_short: "Nywila yako ni fupi sana." + common: "Nywila yako imeshatumika sana." + same_as_username: "Nywila yako ni sawa na jina lako la utumiaji." + same_as_email: "Nywila yako ni sawa na jina lako la utumiaji." + ok: "Nywila yako iko sawa." + instructions: "herufi %{count} au zaidi" + summary: + title: "Muhtasari" + stats: "Takwimu" + time_read: "mda wa kusoma" + recent_time_read: "mda wa kusoma wa hivi karibuni" + topic_count: + one: "Topiki imetengenezwa" + other: "Topiki zimetengenezwa" + post_count: + one: "Posti imetengenezwa" + other: "Posti zimetengenezwa" + likes_given: + one: "Imepewa" + other: "Zimepewa" + likes_received: + one: "Imepokelewa" + other: "Zimepokelewa" + days_visited: + one: "Siku uliyotembelea" + other: "Siku ulizotembelea" + topics_entered: + one: "Topic iliyoangaliwa" + other: "Topiki zilizoangaliwa" + posts_read: + one: "Posti iliyosomwa" + other: "Posti zilizosomwa" + bookmark_count: + one: "Alama" + other: "Alama" + top_replies: "Majibu ya Juu" + no_replies: "Bado hakuna majibu." + more_replies: "Majibu Mengine" + top_topics: "Mada za Juu" + no_topics: "Bado hakuna mada." + more_topics: "Mada Zingine" + top_badges: "Beji za Juu" + no_badges: "Bado hakuna beji." + more_badges: "Beji Zingine" + top_links: "Viungo vya Juu" + no_links: "Bado hakuna viungo." + most_liked_by: "Imependwa Zaidi Na" + most_liked_users: "Iliyopendwa Zaidi" + most_replied_to_users: "Iliyojibiwa zaidi" + no_likes: "Bado hakuna upendo." + top_categories: "Makundi ya juu" + topics: "Mada" + replies: "Majibu" + ip_address: + title: "Anwani ya Mwisho ya Mtandao" + registration_ip_address: + title: "Usajili wa Anwani ya Mtandao" + avatar: + title: "Picha ya mtumiaji" + header_title: "maelezo mafupi, ujumbe, mialamisho na mapendekezo" + title: + title: "Kichwa cha Habari" + none: "(hakuna)" + filters: + all: "Zote" + stream: + posted_by: "Imechapishwa na" + sent_by: "Imetumwa na" + private_message: "ujumbe" + the_topic: "mada" + loading: "Inapakia..." + errors: + prev_page: "ikiwa inajaribu kupakia" + reasons: + network: "Hitilafu ya Mtandao" + server: "Hitilafu ya Seva" + forbidden: "Ufikivu Umekataliwa" + unknown: "Hitilafu" + not_found: "Ukurasa Haujapatikana" + desc: + network: "Tafadhali angalia muunganisho wako." + network_fixed: "Inaonekana kuwa imerudi." + server: "Kodi ya hitilafu: {{hali}}" + forbidden: "Hauruhusiwi kuona hivyo." + not_found: "Samahani, programu-tumizi imejaribu kupakia anwani ya mtandao ambayo haipo." + unknown: "Kitu kimeenda vibaya." + buttons: + back: "Rudi Nyuma" + again: "Jaribu Tena" + fixed: "Pakua Ukurasa" + close: "Funga" + assets_changed_confirm: "Tovuti hii imesasishwa hivi karibuni. Rudisha tena kupata toleo la hivi karibuni?" + logout: "Ulitolewa." + refresh: "Rudisha Tena" + read_only_mode: + enabled: "Tovuti hii ipo kwenye hali-tumizi ya usomaji tu. Tafadhali endelea kuperuzi, lakini kujibu, kupenda na vitendo vingine vimesitishwa kwa sasa." + login_disabled: "Kuingia kumesitishwa kipindi tovuti ipo kwenye hali-tumizi ya kusoma tu." + logout_disabled: "Kutoka kumesitishwa kipindi tovuti ipo kwenye hali-tumizi ya kusoma tu." + too_few_topics_and_posts_notice: "Tuanzishe majadiliano haya! Kuna mada %{currentTopics} /%{requiredTopics}. na machapisho %{currentPosts} / %{requiredPosts}. Wageni wapya wanahitaji mazungumzo ya kusoma na kujibu." + too_few_topics_notice: "Tuanzishe majadiliano haya! Kuna mada %{currentPosts}/%{requiredPosts}. Wageni wapya wanahitaji mazungumzo ya kusoma na kujibu." + too_few_posts_notice: "Tuanzishe majadiliano haya! Kuna machapisho %{currentPosts}/%{requiredPosts}. Wageni wapya wanahitaji mazungumzo ya kusoma na kujibu." + logs_error_rate_notice: + reached: "%{relativeAge} – %{rate} imefika kipeo cha mpangilio cha %{siteSettingRate}." + exceeded: "%{relativeAge} – %{rate} imepita kiwango cha mpangilio cha tovuti %{siteSettingRate}." + rate: + one: "1 kosa/%{duration}" + other: "%{count} makosa/%{duration}" + learn_more: "jifunze zaidi..." + all_time: 'jumla' + all_time_desc: 'jumla ya mada zilizotengenezwa' + year: 'mwaka' + year_desc: 'mada zilizotengenezwa ndani ya siku 365 ' + month: 'mwezi' + month_desc: 'mada zilizotengenezwa ndani ya siku 30 zilizopita' + week: 'wiki' + week_desc: 'mada zilizotengenezwa ndani ya siku 7' + day: 'siku' + first_post: Chapisho la kwanza + mute: Nyamazisha + unmute: Toa kwenye Ukimya + last_post: Alichapisha + time_read: Soma + time_read_recently: '%{time_read} hivi karubini' + time_read_tooltip: '%{time_read} jumla wa mda wa kusoma' + time_read_recently_tooltip: 'mda wote wa kusoma %{time_read} (ndani ya siku 60 zilizopita %{recent_time_read})' + last_reply_lowercase: jibu la mwisho + replies_lowercase: + one: Jibu + other: Majibu + signup_cta: + sign_up: "Jiunge" + hide_session: "Nikumbushe kesho" + hide_forever: "hapana asante" + hidden_for_session: "OK, Nitakuuliza tena kesho. Unaweza kutumia 'Ingia' kutengeneza akaunti pia." + summary: + enabled_description: "Unaangalia muhtasari wa hii mada; machapisho yote yanayovutia yanachaguliwa na jukwaa." + description: "Kuna majibu {{replyCount}}. " + description_time: "Kuna majibu {{replyCount}} yenye mda wa kusoma wa dakika {{readingTime}} ." + enable: 'Tengeneza Muhtasari wa Hii Mada.' + disable: 'Onyesha Machapisho Yote' + deleted_filter: + enabled_description: "Mada hii ina machapisho yaliyofutwa, ambayo yamefichwa." + disabled_description: "Machapisho yaliyofutwa kwenye mada yanaonyeshwa." + enable: "Ficha Machapisho Yaliyofutwa" + disable: "Onyesha Machapisho Yaliyofutwa" + private_message_info: + title: "Ujumbe" + leave_message: "Je, ni unataka kuiacha huu ujumbe?" + remove_allowed_user: "Je, unataka kuondoa {{name}} kutoka kwenye huu ujumbe?" + remove_allowed_group: "Je, unataka kuondoa {{name}} kutoka kwenye huu ujumbe?" + email: 'Barua pepe' + username: 'Jina la mtumiaji' + last_seen: 'Imetazamwa' + created: 'Imeundwa' + created_lowercase: 'Imeundwa' + trust_level: 'Kipimo cha uaminifu' + search_hint: 'jina la mtumiaji, barua pepe au Anwani ya Mtandao' + create_account: + disclaimer: "Kwa kujisajii, unakubaliana na vigezona masharti." + title: "Unda akaunti mpya" + failed: "Tatizo limetokea, labda barua pepe imesajiliwa tayari, jaribu kiungo cha kusahau nywila." + forgot_password: + title: "Weka upa nywila" + action: "Nimesahau nywila yangu" + invite: "Weka jina la mtumiaji au barua pepe, tutakutumia barua pepe kuweka upya nywila yako." + reset: "Weka upya nywila yako" + complete_username: "Kama akaunti inalingana na jina la mtumiaji %{username} , utapokea barua pepe yenye mwelezo wa jinsi ya kuweka upya nywila yako hivi punde." + complete_email: "Kama akaunti inalingana %{email},utapokea barua pepe yenye mwelezo wa jinsi ya kuweka upya nywila yako hivi punde." + complete_username_found: "Tumepata akaunti inayolingana na jina la mtumiaji %{username}, utapokea barua pepe yenye mwelekezo wa jinsa ya kuweka upya nywila yako hivi punde." + complete_email_found: "Tumegundua akaunti inayolingana na %{email},utapokea barua pepe yenye maelezo ya jinsi ya kuweka upya nywila yako hivi punde." + complete_username_not_found: "hakuna akaunti inayowiana na mtumiaji %{username}" + complete_email_not_found: "Hakuna akaunti inawiana %{email}" + help: "Barua pepe haijafika? Hakikisha kuangalia folda la barua taka.

Hauna uhakika barua pepe uliyotumia? Andika barua pepe yako na tutakujulisha kama ipo kwetu.

Kama hauwezi kufikia barua pepe ya akaunti yako, tafadhali wasiliana na wasaidizi wetu.

" + button_ok: "Vema" + button_help: "Msaada" + email_login: + link_label: "Nitumie barua pepe ya kiunganishi cha kuingia" + button_label: "na barua pepe" + complete_username: "Kama akaunti inalingana na jina la mtumiaji %{username} , utapokea barua pepe yenye kiungo cha kuingia hivi punde." + complete_email: "Kama akaunti inalingana na %{email} , utapokea barua pepe yenye kiungo cha kuingia hivi punde." + complete_username_found: "Tumeona akaunti inayolingana na jina la mtumiaji %{username} , utapokea barua pepe yenye kiungo cha kuingia hivi punde." + complete_email_found: "Tumeona akaunti inayolingana na %{email} , utapokea barua pepe yenye kiungo cha kuingia hivi punde." + complete_username_not_found: "Hakuna akaunti inayolingana na jina la mtumiaji %{username}" + complete_email_not_found: "Hakuna akaunti inayolingana na %{email}" + login: + title: "Ingia" + username: "Mtumiaji" + password: "Nywila" + second_factor_title: "Uhalalalishaji wa Viwango Viwili" + second_factor_description: "Tafadhali andika kodi ya uthibitisho kutoka kwenye app yako:" + second_factor_backup: "Ingia kutumia kodi ya backup " + second_factor_backup_title: "Backup kutumia steji mbili" + second_factor_backup_description: "Samahani, Ingiza mojawapo ya kodi yako ya backup" + second_factor: "Ingia kutumia App ya Uthibitisho " + email_placeholder: "barua pepe au jina la mtumiaji" + caps_lock_warning: "Caps Lock imewashwa" + error: "Tatizo lilisojulikana" + rate_limit: "Tafadhali jaribu tena kabla ya kujaribu kuingia tena." + blank_username: "Tafadhali andika barua pepe au jina la mtumiaji." + blank_username_or_password: "Tafadhali andika barua pepe au jina la mtumiaji, na nywila." + reset_password: 'Weka upya Nywila' + logging_in: "Unaingia..." + or: "Au" + authenticating: "Inathibitishwa..." + awaiting_activation: "Akaunti yako inasubiria kuanzishwa, tumia kiungo cha nimesahau nywila kupata barua pepe nyingine ya kuanzisha akaunti." + awaiting_approval: "Akaunti yako bado haijathibitishwa na msaidizi. Utapata ujumbe kwa barua pepe ikipata kibali." + requires_invite: "Samahani, jumuia hii ni kwa walioalikwa tu." + not_activated: "Bado hauwezi kuingia. Tumekutumia barua pepe ya uanzisho kwenye {{sentTo}}. Tafadhali fuatilia maelezo kwenye barua pepe kuanzisha akaunti yako." + not_allowed_from_ip_address: "Hauwezi kuingia kupitia anwani hiyo ya mtandao." + admin_not_allowed_from_ip_address: "Hauwezi kuingia kama kiongozi kupitia anwani hiyo ya mtandao." + resend_activation_email: "Bofya hapa kutuma barua pepe ya uanzishaji tena." + omniauth_disallow_totp: "Steji mbili za uthibitisho zimewezeshwa kwenye akaunti yako. Samahani ingia kwa kutumia password/nywila yako" + resend_title: "Tuma Tena Barua Pepe ya Uanzisho" + change_email: "Badilisha Barua Pepe" + provide_new_email: "Andika anwani mpya na tutakutumia tena barua pepe ya uthibitisho." + submit_new_email: "Sasisha Barua Pepe" + sent_activation_email_again: "Tumekutumia barua pepe nyingine ya uanzishaji kwenye {{currentEmail}}. Inaweza kuchukua dakika chache kufika; angalia pia folda la barua taka." + to_continue: "Tafadhali Ingia" + preferences: "Unahitaji uwe umeingia kubadilisha mapendekezo ya mtumiaji." + forgot: "Sikumbuki taarifa zangu za akaunti" + not_approved: "Akaunti yako bado haijathibitishwa. Utapata ujumbe kwa barua pepe ukiwa tayari kuingia." + google_oauth2: + name: "Google" + title: "na Google" + message: "uthibitisho na Google (hakikisha vizuizi vya pop-up havijaruhusiwa)" + twitter: + name: "Twitter" + title: "na Twitter" + message: "uthibitisho na Twitter (hakikisha vizuizi vya pop-up havijaruhusiwa)" + instagram: + name: "Instagram" + title: "na Instagram" + message: "uthibitisho na Instagram (hakikisha vizuizi vya pop-up havijaruhusiwa)" + facebook: + name: "Facebook" + title: "na Facebook" + message: "uthibitisho na Facebook (hakikisha vizuizi vya pop-up havijaruhusiwa)" + yahoo: + name: "Yahoo" + title: "na Yahoo" + message: "uthibitisho na Yahoo (hakikisha vizuizi vya pop-up havijaruhusiwa)" + github: + name: "GitHub" + title: "na Github" + message: "uthibitisho na Github (hakikisha vizuizi vya pop-up havijaruhusiwa)" + invites: + accept_title: "Mialiko" + welcome_to: "Karibu %{site_name}" + invited_by: "Ulialikwa/Mlialikwa na:" + social_login_available: "Utaweza kuingia kupitia mtandao wowote wa kijamii kupitia barua pepe hiyo." + your_email: "Akaunti ya anwani ya barua pepe yako ni %{email}" + accept_invite: "Kubali mwaliko" + success: "Akaunti yako imetengenezwa na sasa unaweza kuingia." + name_label: "Jina" + password_label: "Andika Neno la siri" + optional_description: "(sio muhimu)" + password_reset: + continue: "endelea kwenye %{site_name}" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Ishara ya Kwanza" + win10: "Win10" + google_classic: "Google Classic" + facebook_messenger: "Facebook Messenger" + category_page_style: + categories_only: "Kategoria Pekee" + categories_with_featured_topics: "Makundi yenye post shilikishi" + categories_and_latest_topics: "Kategoria na Mada za Hivi Karibuni" + categories_and_top_topics: "Kategoria na Mada za Juu" + shortcut_modifier_key: + shift: 'Shift' + ctrl: 'Ctrl' + alt: 'Alt' + conditional_loading_section: + loading: Inaandaa.... + select_kit: + default_header_text: Chagua + no_content: Hakuna uwiano uliopatikana + filter_placeholder: Tafuta + create: "Tengeneza: '{{maandishi}}'" + max_content_reached: + one: "Unaweza tu kuchagua kitu {{count}}." + other: "Unaweza tu kuchagua vitu {{count}}." + min_content_not_reached: + one: " Chagua japo kitu {{count}}." + other: " Chagua japo vitu {{count}}." + emoji_picker: + filter_placeholder: Tafuta picha-hisia + people: Watu + nature: Uasilia + food: Chakula + activity: utendaji + travel: Safiri + objects: Vitu + celebration: Sherehekea + custom: Ishara binafsi + recent: Imetumika hivi karibuni + default_tone: Mwonekano usio na toni + light_tone: Mwonekano wenye toni nyepesi + medium_light_tone: Mwonekano mwepesi wenye toni ya katikati + medium_tone: Mwonekano wenye toni ya katikati + medium_dark_tone: Mwonekano mweusi wenye toni ya katikati + dark_tone: Mwonekano wenye toni nyeusi + shared_drafts: + title: "Maswadajaribio Gawiza" + notice: "Mada hii inapatikana kwa watu wanaoweza kuona kategoria {{category}}." + destination_category: "Kategoria Pokezi" + publish: "Chapisha Mswadajaribio Gawiza" + confirm_publish: "Unauhakika unataka kuchapisha mswadajaribio huu?" + publishing: "Mada Inachapishwa..." + composer: + emoji: "Ishara :)" + more_emoji: "zaidi" + options: "Chaguo" + whisper: "nong'ona" + unlist: "ondoa kwenye orodha" + blockquote_text: "Zuianukulu" + add_warning: "Hii ni onyo rasmi." + toggle_whisper: "Badilisha Nong'ono" + toggle_unlisted: "Badilisha Ondoa kwenye Orodha" + posting_not_on_topic: "Mada zipi unazotaka kuzijibu?" + saving_draft_tip: "inahifadhiwa..." + saved_draft_tip: "ilihifadhiwa" + saved_local_draft_tip: "Imehifadhiwa kwenye mazingira yako" + similar_topics: "Mada yako inafanana na..." + drafts_offline: "Miswadajaribio Nje ya Mtandao" + group_mentioned_limit: "Onyo!Umetaja{{kikundi}}, lakini kikundi hiki kina watu wengi kuzidi usanidi uliyofanywa na msimamizi ambao una {{kikomo}} cha kutaja watumiaji. Hakuna mtu atakayepewa taarifa." + group_mentioned: + one: "Kwa kutaja {{group}}, utamjulisha mtu mmoja – una uhakika?" + other: "Kwa kutaja {{group}}, utawajulisha {{count}} watu – una uhakika?" + cannot_see_mention: + category: "Umetaja {{username}} ila hawatajulishwa kwa kuwa hawapo kwenye kundi hili. Itabidi waongezwe kwenye kundi ambalo lina fursa ya kusoma maudhui ya kundi hili." + private: "Umetaja {{username}} lakini hawatajulishwa kwa sababu hawana uwezo wa kuona hii meseji binafsi. Unahitaji kuwaalika kuona hii mesaji binafsi." + duplicate_link: "Inaonekana linki yako {{domain}} imechapishwa tayari kwenye topiki na @{{username}} kwenye jibu la {{ago}} – una uhakina unataka kuchapisha tena?" + error: + title_missing: "Kichwa cha habari ni muhimu" + title_too_short: "Kichwa kinatakiwa kuwa na tarakimu japo {{min}}" + title_too_long: "Kichwa hakitakiwi kuwa na tarakimu zaidi ya {{max}}" + post_missing: "Chapisho haliwezi kuwa tupu" + post_length: "Posti/Chapisho linatakiwa kuwa na tarakimu japo {{min}}" + try_like: 'Je umejaribu kitufe ?' + category_missing: "Ni sharti uchague kategoria" + tags_missing: "Unatakiwa kuchagua japo vitambulisho {{count}}" + save_edit: "Hifadhi Uhariri" + reply_original: "Jibu kwenye Mada ya Kwanza" + reply_here: "Jibu hapa" + reply: "Jibu" + cancel: "Ghairi" + create_topic: "Unda mada" + create_pm: "Ujumbe" + create_whisper: "Mluzi" + create_shared_draft: "Unda mgawanyo wa mswadajaribio" + edit_shared_draft: "Hariri mgawanyo wa mswadajaribio" + title: "Au bonyeza Ctrl+Enter" + users_placeholder: "Ongeza mtumiaji" + title_placeholder: "Kwa kifupi majadiliano haya yanahusu nini?" + title_or_link_placeholder: "Andika kichwa cha habari, au bandika kiungo hapa" + edit_reason_placeholder: "kwa nini unahariri?" + show_edit_reason: "(ongeza sababu ya kuhariri)" + topic_featured_link_placeholder: "Ingiza linki inayoonyeshwa na kichwa" + remove_featured_link: "Ondoa kiungo kwenye mada." + reply_placeholder: "Andika hapa. tumia Markdown, BBCode au HTML kuweka kwenye muundo mzuri. Vuta na kuweka picha" + reply_placeholder_no_images: "Andika hapa. Tumia Markdown, BBCode, au HTML kuumbiza." + reply_placeholder_choose_category: "Unatakiwa kuchagua kundi kabla ya kuanza kuandika hapa" + view_new_post: "Angalia chapisho lako jipya" + saving: "Inahifadhiwa" + saved: "Imehifadhiwa!" + saved_draft: "Posti rasimu ipo katika mwendelezo. Chagua kuendelea" + uploading: "Inapakia..." + show_preview: 'Onyesha hakikisho »' + hide_preview: '« ficha hakikisho' + quote_post_title: "Nukulu chapisho lote" + bold_label: "B" + bold_title: "koleza" + bold_text: "Maneno yaliyokolezwa" + italic_label: "I" + italic_title: "Mkazo" + italic_text: "Maneno yaliyo tiliwa mkazo" + link_title: "Kiungo-wavuti" + link_description: "andika maelezo ya kiungo hapa" + link_dialog_title: "Ingiza kiungo-wavuti" + link_optional_text: "kichwa cha habari kisichokuwa cha muhimu" + link_url_placeholder: "http://mfano.com" + quote_title: "Zuianukulu" + quote_text: "Zuianukulu" + code_title: "Maneno yaliyowekwa muundo" + code_text: "Maneno yaliyowekwa muundo kwa kuacha nafasi 4 kuingia ndani" + paste_code_text: "andika au bandika kodi hapa" + upload_title: "Pakia" + upload_description: "Ingiza maelezo kuhusu upakiaji hapa" + olist_title: "Listi yenye namba" + ulist_title: "Listi yenye vitufe" + list_item: "Listi kitu" + toggle_direction: "Badilisha uwelekeo" + help: "Msaada kwenye kuhariri MarkDown" + collapse: "Shusha chini paneli ya Composer" + abandon: "Funga Composer na acha rasimu" + modal_ok: "Sawa" + modal_cancel: "Ghairi" + cant_send_pm: "Samahani, hauwezi kutuma ujumbe kwenda kwa %{username}." + yourself_confirm: + title: "Ulisahau kuongeza wapokeaji?" + body: "Kwa sasa hii meseji inatumwa kwako tu" + admin_options_title: "Mipangilio ya wasaidizi isiyo muhimu kwa ajili ya mada hii" + composer_actions: + reply: Jibu + draft: Rasimu + edit: Hariri + reply_to_post: + label: "Jibu chapisho %{postNumber} la %{postUsername}" + desc: Jibu chapisho mahsusi + reply_as_new_topic: + label: Jibu kama mada iliyounganishwa + desc: Tengeneza mada mpya itakayoungwa na hii mada + reply_as_private_message: + label: Ujumbe mpya + desc: Tengeneza ujumbe binafsi mpya + reply_to_topic: + label: Jibu mada + desc: "Jibu mada, sio chapisho lolote tu" + toggle_whisper: + desc: Minong'ono inapatikana kwa wasaidizi tu + create_topic: + label: "Mada Mpya" + shared_draft: + label: "Mswadajaribio Gawiza" + desc: "Mswadajaribio wa mada utakao onekana kwa wasaidizi tu" + notifications: + tooltip: + regular: + one: "1 taarifa ambayo haijaonwa" + other: "{{count}} taarifa ambazo hazijaonwa" + message: + one: "1 meseji ambayo haijasomwa" + other: "{{count}} meseji ambazo hazijasomwa" + title: "taarifa za @jina lililotajwa, majibu ya machapisho na mada, ujumbe, na zingine" + none: "Imeshindwa kupakia taarifa kwa mda huu." + empty: "Hakuna taarifa zilizopatikana." + more: "angalia taarifa za mda zaidi" + total_flagged: "machapisho yenye bendera" + mentioned: "{{jina la mtumiaji}} {{maelezo}}" + group_mentioned: "{{jina la mtumiaji}} {{maelezo}}" + quoted: "{{jina la mtumiaji}} {{maelezo}}" + replied: "{{jina la mtumiaji}} {{maelezo}}" + posted: "{{jina la mtumiaji}} {{maelezo}}" + edited: "{{jina la mtumiaji}} {{maelezo}}" + liked: "{{jina la mtumiaji}} {{maelezo}}" + liked_2: "{{username}}, {{username2}} {{description}}" + liked_many: + one: "{{username}}, {{username2}} na 1 mwingine {{description}}" + other: "{{username}}, {{username2}} na {{count}} wengine {{description}}" + private_message: "{{jina la mtumiaji}} {{maelezo}}" + invited_to_private_message: "

{{jina la mtumiaji}} {{maelezo}}" + invited_to_topic: "{{jina la mtumiaji}} {{maelezo}}" + invitee_accepted: "{{jina la mtumiaji}} amekubali mwaliko wako" + moved_post: "{{jina la mtumiaji}} amehama {{maelezo}}" + linked: "{{jina la mtumiaji}} {{maelezo}}" + granted_badge: "Umepata '{{maelezo}}'" + topic_reminder: "{{jina la mtumiaji}} {{maelezo}}" + watching_first_post: "Mada Mpya {{maelezo}}" + group_message_summary: + one: "Kuna meseji {{count}} kwenye {{group_name}} inbox" + other: "kuna meseji {{count}} kwenye {{group_name}} inbox" + popup: + mentioned: '{{jina la mtumiaji}} amekutaja kwenye "{{mada}}" - {{jina la_tovuti}}' + group_mentioned: '{{jina la mtumiaji}} amekutaja kwenye "{{mada}}" - {{jina la_tovuti}}' + quoted: '{{jina la mtumiaji}} amekunukulu kwenye "{{mada}}" - {{jina la_tovuti}}' + replied: '{{jina la mtumiaji}} amekujibu kwenye "{{mada}}" - {{jina la_tovuti}}' + posted: '{{jina la mtumiaji}} amechapisha kwenye "{{mada}}" - {{jina la_tovuti}}' + private_message: '{{jina la mtumiaji}} amekutumia ujumbe binafsi kwenye "{{mada}}" - {{jina la_tovuti}}' + linked: '{{jina la mtumiaji}} ametengeneza kiungo kutoka kwenye "{{mada}}" - {{jina la_tovuti}}' + confirm_title: 'Taarifa mubashara zimewezeshwa - %{site_title}' + confirm_body: 'Taarifa mubashara zimewezeshwa kikamilifu' + upload_selector: + title: "Ongeza picha au faili" + title_with_attachments: "Ongeza picha au faili" + from_my_computer: "Kutoka kwenye kifaa changu" + from_the_web: "Kutoka kwenye mtandao" + remote_tip: "kiungo cha picha" + remote_tip_with_attachments: "kiungo cha picha au faili {{authorized_extensions}}" + local_tip: "chagua picha kwenye kifaa chako" + local_tip_with_attachments: "Chagua picha au mafile kutoka kwenye kifaa chako {{authorized_extensions}}" + hint: "(Unaweza pia kuvuta na kudondosha kwenye kihariri ili kuzipakia)" + hint_for_supported_browsers: "Unaweza pia kuvuta na kudondosha kwenye kihariri" + uploading: "Inapakiwa" + select_file: "Chagua Faili" + image_link: "Linki ya picha yako itaonyesha" + default_image_alt_text: picha + search: + sort_by: "Panga kwa" + relevance: "Umuhimu" + latest_post: "Mada ya hivi karubuni" + latest_topic: "Mada ya hivi karubuni" + most_viewed: "Iliyoangaliwa Zaidi" + most_liked: "Iliyopendwa Zaidi" + select_all: "Chagua Zote" + clear_all: "Futa Zote" + too_short: "Neno la utafiti ni fupi." + result_count: + one: "jibu kwa{{term}}" + other: "{{count}}{{plus}} majibu kwa{{term}}" + title: "Tafuta mada, machapisho, watumiaji, au kategoria" + full_page_title: "tafuta mada au machapisho" + no_results: "Hakuna Majibu Yaliyopatikana." + no_more_results: "Hakuna majibu zaidi yaliyopatikana." + searching: "Inatafuta ..." + post_format: "#{{post_number}} za {{username}}" + results_page: "Majibu ya utafiti ya'{{term}}'" + more_results: "Kuna majibu zaidi. Samahani punguza vigezo vya kutafuta" + cant_find: "Umeshindwa kupata ulichokuwa unakitafuta?" + start_new_topic: "Au anzisha mada mpya?" + or_search_google: "Au jaribu kutafuta kwa kutumia Google kama njia mbadala:" + search_google: "Jaribu kutafuta kwa kutumia Google kama njia mbadala:" + search_google_button: "Google" + search_google_title: "Tafuta tovuti hii" + context: + user: "Tafuta machapisho kwa kutumia @{{jina la mtumiaji}}" + category: "Tafuta kategoria #{{category}} " + topic: "Tafuta hii mada" + private_messages: "Tafuta ujumbe" + advanced: + title: Utafiti wa Hali ya juu + posted_by: + label: Imechapishwa na + in_category: + label: Zimepangwa kulingana na Kategoria + in_group: + label: Ndani ya kikundi + with_badge: + label: Na Beji + with_tags: + label: Ametajwa + filters: + label: Onyesha tu mada/machapisho... + title: Mlingano upo kwenye kichwa tu + likes: Nilipenda + posted: Nilichapisha ndani ya + watching: Ninaangalia + tracking: Ninafuatilia + private: Ndani ya ujumbe wangu + bookmarks: Nimejibu + first: ni chapisho la kwanza + pinned: zimebadikwa + unpinned: hazijabadikwa + seen: Nilisoma + unseen: Sijasoma + wiki: ni wiki + images: Tia ndani picha + all_tags: Lebo zote zilizo juu + statuses: + label: Mada za wapi + open: ziko wazi + closed: zimefungwa + archived: yamehifadhiwa + noreplies: haina majibu + single_user: ina mtumiaji mmoja + post: + count: + label: Namba ya Chini ya Chapisho + time: + label: Chapishwa + before: kabla + after: baada + hamburger_menu: "nenda kwenye orodha ya mada au kategoria nyingine" + new_item: "mpya" + go_back: 'rudi nyuma' + not_logged_in_user: 'karatasi ya kwanza yenye muhtasari wa shughuli na mapendekezo ya sasa' + current_user: 'nenda kwenye ukurasa wako' + topics: + new_messages_marker: "Mara ya mwisho imetembelewa" + bulk: + select_all: "Chagua Zote" + clear_all: "Ondoa Zote" + unlist_topics: "Ondoa Mada kwenye listi" + relist_topics: "Orodhesha Upya Mada" + reset_read: "Anzisha Upya Usomaji" + delete: "Futa Mada" + dismiss: "Ondosha..." + dismiss_read: "Ondosha zote ambazo hazijasomwa" + dismiss_button: "Ondosha..." + dismiss_tooltip: "Ondosha machapisho mapya au acha kufuatilia mada" + also_dismiss_topics: "Simamisha kufuatilia topiki hizi ili zisionekane kama hazijasomwa kwako" + dismiss_new: "Ondosha Mpya" + toggle: "Badili kwa wingi chaguo la topiki" + actions: "Vitendo za Jumla" + change_category: "Seti Kategoria" + close_topics: "Funga Mada" + archive_topics: "Hifadhi Mada kwenye nyaraka" + notification_level: "Taarifa" + choose_new_category: "Chagua kategoria mpya kwa ajili ya mada:" + selected: + one: "Umechagua mada 1." + other: "Umechagua mada {{count}}." + change_tags: "Badilisha Lebo" + append_tags: "Jumlisha Lebo" + choose_new_tags: "Chagua lebo mpya kwa ajili ya hizi mada:" + choose_append_tags: "Chagua lebo mpya kuweka kwenye mada hizi:" + changed_tags: "lebo za hizo mada zilibadilishwa." + none: + unread: "Hauna mada ambazo hazijasomwa." + new: "Hauna mada mpya." + read: "Haujasoma mada yoyote." + posted: "Bado haujachapisha kwenye mada yoyote." + latest: "Hakuna mada mpya. Hii ni huzuni." + hot: "Hakuna mada nzuri." + bookmarks: "Hauja alamisha mada yoyote." + category: "Hakuna {{category}} mada." + top: "Hakuna mada za juu." + search: "Hakuna majibu ya utafiti." + educate: + new: '

Mada zako mpya zitatokea hapa.

Kwa chaguo-msingi, mada ni mpya na zitakuwa na indiketa mpyakama zilitengenezwa ndani ya siku 2 zilizopita.

Tembeleamipangilioyako kubadilisha hizi.

' + unread: '

Mada ambazo haujasoma zitatokea hapa.

Kwa chaguo-msingi, mada zote zinakuwa hazijasomwa na zitaonyesha jumla ya hizo namba1Kama uli:

  • Tengeneza mada
  • Alijibu mada
  • Amesoma mada zaidi ya dakika 4

Au kama uliseti mada iwe inafuatiliwa au kuangaliwa kwa kupitia udhibiti wa taarifa chini ya kila mada.

Tembelea mapendekezoyako kubadilisha hii.

' + bottom: + latest: "Hakuna mada mpya zingine." + hot: "Hakuna mada mpya zingine." + posted: "Hakuna mada mpya zilizochapishwa." + read: "Hakuna mada zingine zilizosomwa." + new: "Hakuna mada mpya zingine." + unread: "Hakuna mada zingine ambazo hazijasomwa." + category: "Hakuna {{category}} mada zingine." + top: "Hakuna mada za juu zingine." + bookmarks: "Hakuna mada zingine zilizoalamishwa." + search: "Hakuna majibu mapya mengine ya utafiti." + topic: + filter_to: + one: "1 chapisho kwenye mada" + other: "{{count}} machapisho kwenye mada" + create: 'Mada Mpya' + create_long: 'Tengeneza Mada mpya' + open_draft: "Fungua Mswadajaribio" + private_message: 'Anzisha ujumbe' + archive_message: + help: 'Hamisha ujumbe kwenye nyaraka zako' + title: 'Nyaraka' + move_to_inbox: + title: 'Hamisha kwenda Kisanduku pokezi' + help: 'Hamisha kwenda Kisanduku pokezi' + edit_message: + help: 'Hariri chapisho la kwanza la ujumbe' + title: 'Hariri Ujumbe' + list: 'Mada' + new: 'mada mpya' + unread: 'haijasomwa' + new_topics: + one: '1 mada mpya' + other: '{{count}} mada mpya' + unread_topics: + one: '1 mada haijasomwa' + other: '{{count}} mada zisizosomwa' + title: 'Mada' + invalid_access: + title: "Mada ni binafsi" + description: "Samahani hauruhusiwi kuona mada hiyo!" + login_required: "Unahitaji kuingia au kujiunga kuona mada hiyo." + server_error: + title: "Mada imeshindwa kupakuliwa" + description: "Samahani, tumeshindwa kupakua mada hiyo, labda ni tatizo la mtandao. Tafadhali jaribu tena. Kama tatizo likiendelea kuwepo, tujulishe." + not_found: + title: "Mada haijapatikana" + description: "Samahani, tumeshindwa kupata hiyo mada. Labda iliondolewa na msimamizi?" + total_unread_posts: + one: "Una chapisho {{count}} halijasomwa kwenye mada hii" + other: "Una machapisho {{count}} hayajasomwa kwenye mada hii" + unread_posts: + one: "Una chapisho {{count}} kwenye mada hii ambayo halijasomwa" + other: "Una machapisho {{count}} kwenye mada hii ambayo hayajasomwa" + new_posts: + one: "Kuna chapisho jipya {{count}} kwenye mada hii tangu mara ya mwisho usome" + other: "Kuna mchapisho mapya {{count}} kwenye mada hii tangu mara ya mwisho usome" + likes: + one: "Kuna pendwa {{count}} kwenye mada hii" + other: "Kuna pendwa {{count}} kwenye mada hii" + back_to_list: "Rudi tena kwenye Orodha ya Mada" + options: "Machaguo ya Mada" + show_links: "onyesha viungo ndani ya hii mada" + toggle_information: "badilisha taarifa za mada" + read_more_in_category: "Unataka kusoma zaidi? Vinjari mada zingine ndani ya {{catLink}} au {{latestLink}}." + read_more: "Unataka kusoma zaidi? {{catLink}} au {{latestLink}}." + read_more_MF: "Kuna { UNREAD, plural, =0 {} one { ni haijasomwa 1 } other { ni haijasomwa # } } { NEW, plural, =0 {} one { {BOTH, select, true{na } false {ni } other {}} madampya 1} other { {BOTH, select, true{na } false {ni } other{}} mada mpya #} } zilizobaki, au {CATEGORY, select, true {vinjari mada zingine ndani ya {catLink}} hapana {{latestLink}} other {}}" + browse_all_categories: Vinjari kategoria zote + view_latest_topics: tembelea mada mpya + suggest_create_topic: "Kwa nini usitengeneze mada?" + jump_reply_up: fikia jibu la awali + jump_reply_down: fikia jibu la baadaye + deleted: "Mada imefutwa" + topic_status_update: + title: "Kipima Mda cha Mada" + save: "Seti Kipima Mda" + num_of_hours: "Namba ya masaa:" + remove: "Ondoa Kipima Mda" + publish_to: "Chapisha kwenda Kwa:" + when: "Lini:" + public_timer_types: Vipima Mda vya Mada + private_timer_types: Vipima Mda vya Mada za Mtumiaji + auto_update_input: + none: "Chagua fremu ya mda" + later_today: "Baada ya mda leo" + tomorrow: "Kesho" + later_this_week: "Baada ya mda ndani ya wiki hii" + this_weekend: "Wikiendi hii" + next_week: "Wiki Ijayo" + two_weeks: "Wiki Mbili" + next_month: "Mwezi ujao" + three_months: "Miezi Mitatu" + six_months: "Miezi Sita" + one_year: "Mwaka Mmoja" + forever: "Milele" + pick_date_and_time: "Chagua tarehe na mda" + set_based_on_last_post: "Funga kulingana na chapisho la mwisho" + publish_to_category: + title: "Panga Uchapishaji" + temp_open: + title: "Fungua kwa Mda Mfupi" + auto_reopen: + title: "Fungua Mada otomatikali" + temp_close: + title: "Funga kwa Sasa" + auto_close: + title: "Funga Mada otomatikali" + label: "Mda wa kufunga mada otomatikali:" + error: "Tafadhali andika thamani sahihi." + based_on_last_post: "Usifunge mpaka chapisho la mwisho kwenye mada liwe lina umri huu." + auto_delete: + title: "Futa Mada Otomatikali" + reminder: + title: "Nikumbushe" + status_update_notice: + auto_open: "Mada hii itafunguliwa otomatikali baada ya %{timeLeft}." + auto_close: "Mada hii itafungwa otomatikali baada ya %{timeLeft}." + auto_publish_to_category: "Mada hii itachapishwa kwenye #%{categoryName}%{timeLeft}." + auto_close_based_on_last_post: "Mada hii itafungwa baada ya jibu la mwisho %{duration}." + auto_delete: "Mada hii itafutwa otomatikali %{timeLeft}." + auto_reminder: "Utakumbushwa kuhusu mada hii %{timeLeft}." + auto_close_title: 'Funga Mada Otomatikali' + timeline: + back: "Nyuma" + back_description: "Rudi kwenye chapisho la mwisho ambalo haujalisoma" + replies_short: "%{current} / %{total}" + progress: + title: maendeleo ya mada + go_top: "juu" + go_bottom: "chini" + go: "nenda" + jump_bottom: "fikia chapisho la mwisho" + jump_prompt: "ruka kwenda..." + jump_prompt_of: "machapisho %{count} ya" + jump_prompt_long: "Ungependa ufikie chapisho gani?" + jump_bottom_with_number: "fikia chapisho %{post_number}" + jump_prompt_or: "au" + total: jumla ya machapisho + current: chapisho la hivi karibuni + notifications: + title: badilisha mara ngapi utapata taarifa kuhusu mada hii + reasons: + "3_10": 'Unapata taarifa kwa sababu unaangalia lebo kwenye mada hii.' + "3_6": 'Unapata taarifa kwa sababu unaangalia kategoria hii.' + "3_5": 'Utapata taarifa kwa sababu umeanza kuangalia mada hii otomatikali.' + "3_2": 'Unapata taarifa kwa sababu unaangalia mada hii.' + "3_1": 'Unapata taarifa kwa sababu ulitengeneza mada hii.' + "3": 'Unapata taarifa kwa sababu unaangalia mada hii.' + "2_8": 'Utaona jumla ya majibu mapya kwa sababu unafuatilia kategoria hii.' + "2_4": 'Utaweza kuona jumla ya majibu mapya kwa sababu ulichapisha jibu kwenye mada hii.' + "2_2": 'Utaweza kuona jumla ya majibu mapya kwa sababu unafuatilia mada hii.' + "2": 'Utaweza kuona jumla ya majibu mapya kwa sababu ulisoma mada hii.' + "1_2": 'Utajulishwa kama mtu akitaja @jina lako au akikujibu.' + "1": 'Utajulishwa kama mtu akitaja @jina lako au akikujibu.' + "0_7": 'Unapuuzia taarifa za kategoria hii.' + "0_2": 'Unapuuzia taarifa za mada hii.' + "0": 'Unapuuzia taarifa za mada hii.' + watching_pm: + title: "Angalia" + description: "Utajulishwa kuhusu kila jibu jipya kwenye ujumbe huu, na idadi ya majibu mapya itaonyeshwa." + watching: + title: "Angalia" + description: "Utajulishwa kuhusu kila jibu jipya kwenye mada hii, na idadi ya majibu mapya itaonyeshwa." + tracking_pm: + title: "Inafuatiliwa" + description: "Idadi ya majibu mapya itaonyeshwa kwa ajili ya ujumbe huu. Utajulishwa kama mtu akitaja @jina lako au akikujibu." + tracking: + title: "Inafuatiliwa" + description: "Idadi ya majibu mapya itaonyeshwa kwa ajili ya mada hii. Utajulishwa kama mtu akitaja @jina lako au akikujibu." + regular: + title: "Kawaida" + description: "Utajulishwa mtu akitaja @jina lako au akikujibu." + regular_pm: + title: "Kawaida" + description: "Utajulishwa kama mtu akitaja @jina lako au akikujibu." + muted_pm: + title: "Imenyamazishwa" + description: "Hautapata ujumbe wowote kuhusu ujumbe huu." + muted: + title: "Imenyamazishwa" + description: "Hautakaa utajulishwe kuhusu mada hii, na haitatokea kama taarifa za hivi karibuni." + actions: + recover: "Rudisha Mada" + delete: "Futa Mada" + open: "Fungua Mada" + close: "Funga Mada" + multi_select: "Chagua Machapisho..." + timed_update: "Seti Kipima Mda cha Mada..." + pin: "Bandika Mada..." + unpin: "Ondoa Mada..." + unarchive: "Ondoa Mada kwenye Nyaraka" + archive: "Weka Mada kwenye Nyaraka" + invisible: "Ondoa Orodha" + visible: "Tengeneza Orodha" + reset_read: "Anzisha Upya Usomaji wa Taarifa" + make_public: "Fanya Mada iwe ya Umma" + make_private: "Tengeneza Ujumbe Binafsi" + feature: + pin: "Bandika Mada" + unpin: "Ondoa Mada" + pin_globally: "Bandika Mada kwa ajili ya Umma" + make_banner: "Mada ya Bango" + remove_banner: "Ondoa Bango la Mada" + reply: + title: 'Jibu' + help: 'anza kuandika jibu lako kwenye mada hii' + clear_pin: + title: "Futa pini" + help: "Futa hali ya ubandikaji wa mada hii ili isitokee tena juu ya orodha ya mada yako." + share: + title: 'Gawiza' + help: 'gawiza kiungo kwenye mada hii' + print: + title: 'Chapa' + flag_topic: + title: 'Bendera' + help: 'ripoti kwa siri mada hili liangaliwe au tuma ujumbe binafsi wa taarifa kuhusiana na hii' + success_message: 'Umeripoti mada hii kwa mafanikio.' + feature_topic: + pin: "Fanya mada hii ionekane juu ya kategoria {{kiungochakategoria}} mpaka" + confirm_pin: "Tayari una mada {{count}} zilizobandikwa. Ubandikaji wa mada nyingi unaweza kuwasumbua watumiaji wapya au wasiojulikana. Una uhakika unataka kubandika mada nyingine kwenye kategoria hii?" + unpin: "Ondoa mada hii kutoka kwenye sehemu ya juu ya kategoria {{categoryLink}}" + unpin_until: "Ondoa mada hii kutoka kwenye sehemu ya juu ya kategoria {{categoryLink}} au subiri mpaka %{until}." + pin_note: "Watumiaji wanaweza kuondoa mabandiko ya mada wenyewe." + pin_validation: "Tarehe inahitajika kubandika mada hii." + not_pinned: "Hakuna mada zilizobandikwa kwenye {{categoryLink}}." + pin_globally: "Fanya mada hii ionekane juu ya orodha ya mada zote mpaka" + confirm_pin_globally: "Tayari una mada {{count}} zilizobandikwa kwa umma. Ubandikaji wa mada nyingi unaweza kuwasumbua watumiaji wapya au wasiojulikana. Una uhakika unataka kubandika mada nyingine kwa umma?" + unpin_globally: "Ondoa mada hii kwenye sehemu ya juu ya orodha za mada." + unpin_globally_until: "Ondoa mada hii kwenye sehemu ya juu ya mada au subiri mpaka %{until}." + global_pin_note: "Watumiaji wanaweza kuondoa mabandiko ya mada wenyewe." + not_pinned_globally: "Hakuna mada zilizobandikwa kwa ajili ya umma." + make_banner: "Fanya mada hii iwe bango linalotokea juu ya kurasa zote." + remove_banner: "Ondoa bango linalotokea juu ya karatasi zote." + banner_note: "Watumiaji wanaweza kuondoa bango kwa kulifunga. Mada moja kwa wakati inaweza kuondolewa kwenye mda wowote." + no_banner_exists: "Hakuna bango la mada." + banner_exists: "Kwa sasa kuna bango la mada." + inviting: "Anakaribishwa..." + automatically_add_to_groups: "Mwaliko huu unakupa ruhusa kuona mada hizi:" + invite_private: + title: 'Mkaribishe kwenye Ujumbe' + email_or_username: "Barua Pepe au Jina la Mtumiaji Aliyekaribishwa" + email_or_username_placeholder: "barua pepe au jina la mtumiaji" + action: "Mualiko" + success: "Tumemkaribisha mtumiaji kushiriki kwenye ujumbe huu." + success_group: "Tumekiribisha kikundi kushiriki kwenye ujumbe huu." + error: "Samahani, hitilafu imetokea wakati wa kumualika mtumiaji." + group_name: "jina la kikundi" + controls: "Udhibiti wa Mada" + invite_reply: + title: 'Mualiko' + username_placeholder: "jina la mtumiaji" + action: 'Tuma Mualiko' + help: 'Wakaribishe watu wengine kwenye mada kupitia barua pepe au taarifa' + to_forum: "Tutatuma barua fupi kumruhusu rafiki yako aingie mara moja kupitia kiungo, haitaji kujiunga." + sso_enabled: "Andika jina la mtumiaji la mtu ambaye ungependa kumualika kwenye mada hii." + to_topic_blank: "Andika jina la mtumiaji au barua pepe ya mtu ambaye ungependa kumualika kwenye mada hii." + to_topic_email: "Umeandika barua pepe. Tutatuma mualiko utakao mruhusu rafiki yako kujibu mada hii." + to_topic_username: "Umeandika jina la mtumiaji. Tutamtumia taarifa zenye mualiko kwenye mada hii." + to_username: "Umeandika jina la mtumiaji la mtu ambaye ungependa kumualika. Tutamtumia taarifa zenye kiungo tukimualika kwenye mada hii." + email_placeholder: 'name@example.com' + success_email: "Tumetuma barua kwenda kwa {{emailOrUsername}}. Tutakutumia mualiko ukipatikana. Angalia kichupo cha mialiko kwenye ukurasa wa mtumiaji kufuatilia mialiko yako." + success_username: "Tumemkaribisha mtumiaji kushiriki kwenye mada hii." + error: "Samahani, tumeshindwa kumkaribisha mtu huyo. Labda ameshakaribishwa? (Mialiko ina kikomo cha kiwango)" + success_existing_email: "Mtumiaji mwenye barua pepe {{emailOrUsername}}tayari yupo.Tumemualika mtumiaji huyo ashiriki kwenye mada hii." + login_reply: 'Ingia Kujibu' + filters: + n_posts: + one: "1 chapisho" + other: "{{count}} machapisho" + cancel: "Ondoa uchujaji" + split_topic: + title: "Hamisha kwenda Mada Mpya" + action: "hamisha kwenda mada mpya" + topic_name: "Jina la mada mpya" + error: "Hitilafu imetokea wakati wa kuhamisha machapisho kwenda mada mpya." + merge_topic: + title: "Hamisha kwenda kwenye Mada Iliyopo" + action: "hamisha kwenda kwenye mada Iliyopo" + error: "Hitilafu imetokea wakati wa kuhamisha machapisho kwenda kwenye hiyo mada mpya." + merge_posts: + title: "Unganisha Machapisho Uliyochagua" + action: "unganisha machapisho uliyochagua" + error: "Hitilafu imetokea wakati wa kuunganisha machapisho yaliyochaguliwa." + change_owner: + title: "Badilisha Mmiliki wa Machapisho" + action: "badilisha umiliki" + error: "Hitilafu imetokea wakati wa kubadilisha mmiliki wa machapisho." + label: "Mmiliki wa Machapisho" + placeholder: "jina la mtumiaji la mmiliki mpya" + instructions_warn: "Taarifa mpya kuhusu chapisho hili hazita amishwa kwenda kwa mtumiaji mpya." + change_timestamp: + title: "Badilisha Mhuri wa mda" + action: "badilisha mhuri wa mda" + invalid_timestamp: "Mhuri wa mda hauwezi ukawa wa wakati ujao." + error: "Hitilafu imetokea wakati wa kubadilisha mhuri wa mda wa mada." + instructions: "Tafadhali chagua mhuri wa mda wa mada. Machapisho ya mada yatasasishwa kuwa na mda tofauti ulio sawa." + multi_select: + select: 'chagua' + selected: '({{count}}) imechaguliwa' + select_post: + label: 'chagua' + title: 'Ongeza chapisho kwenye chaguo' + selected_post: + label: 'imechaguliwa' + title: 'Bofya kuondoa chapisho kwenye chaguo' + select_replies: + label: 'chagua +majibu' + title: 'Ongeza chapisho na majibu yake yote kwenye uteuzi' + select_below: + label: 'chagua +chini' + title: 'Ongeza chapisho na vile vya baadae kwenye uteuzi' + delete: futa vilivyochaguliwa + cancel: ghairi uchaguaji + select_all: chagua zote + deselect_all: Ondoa uteuzi wote + description: + one: 'Umechagua chapisho 1 ' + other: "Umechagua machapisho{{count}}." + post: + quote_reply: "Nukulu" + edit: " {{kiungo}} {{replyAvatar}} {{jina la mtumaiji}}" + edit_reason: "Sababu:" + post_number: "{{namba}} chapisho" + wiki_last_edited_on: "uhariri wa wiki ulifanyika" + last_edited_on: "uhariri wa chapisho ulifanyika" + reply_as_new_topic: "Jibu kama mada iliyounganishwa" + reply_as_new_private_message: "Jibu kama ujumbe mpya kwenda kwa wapokeaji wale wale" + continue_discussion: "Endelea majadiliano kuanzia {{postLink}}:" + follow_quote: "nenda kwenye chapisho lililotajwa" + show_full: "Onyesha Chapisho Lote" + show_hidden: 'Angalia maandishi yaliyofichwa.' + collapse: "kunja" + expand_collapse: "panua/kunja" + locked: "msimamizi amefunga chapisho hili lisifanyiwe uhariri" + gap: + one: "Tazama jibu 1" + other: "Tazama majibu{{count}} " + unread: "Chapisho halijasomwa" + has_replies: + one: "{{count}} Jibu" + other: "{{count}} Majibu" + has_likes: + one: "Limependwa {{count}} " + other: "Limependwa mara {{count}}" + has_likes_title: + one: "Mtu 1 amevutiwa na hii" + other: "Watu {{count}} wamevutiwa na hii" + has_likes_title_only_you: "umependa chapisho hili" + has_likes_title_you: + one: "Wewe na mtu 1 mmevutiwa na hii" + other: "Wewe na watu {{count}} mmevutiwa na hii" + errors: + create: "Samahani, hitilafu imetokea wakati wa kutengeneza chapisho lako. Tafadhali jaribu tena." + edit: "Samahani, hitilafu imetokea wakati wa kuhariri chapisho lako. Tafadhali jaribu tena." + upload: "Samahani, hitilafu imetokea wakati wa kupakia faili hilo. Tafadhali jaribu tena." + file_too_large: "Samahani, hilo faili ni kubwa sana (kiwango cha juu ni {{max_size_kb}}kb). Kwa nini usipakie faili lako kubwa kwenye huduma ya kugawa kwenye wingu kama Google Drive, Dropbox au OneDrive, alafu ukaandika kiungo hapa?" + too_many_uploads: "Samahani, unaweza kupakia faili 1 tu kwa wakati mmoja." + too_many_dragged_and_dropped_files: "Samahani, unaweza kupakia mafaili 10 tu kwa wakati mmoja." + upload_not_authorized: "Samahani, faili unalo jaribu kupakia halina kibali (authorized extensions: {{authorized_extensions}})." + image_upload_not_allowed_for_new_user: "Samahani, watumiaji wapya hawawezi kupakia picha." + attachment_upload_not_allowed_for_new_user: "Samahani, watumiaji wapya hawawezi kupakia viambatanisho." + attachment_download_requires_login: "Samahani, inabidi uwe umeingia kupakua viambatanisho." + abandon: + confirm: "Una uhakika unataka kuacha chapisho lako?" + no_value: "Hapana, tunza" + yes_value: "Ndio, acha" + via_email: "chapisho hili limefika kupitia barua pepe" + via_auto_generated_email: "chapisho hili limefika kupitia barua pepe iliyotengenezwa otomatikali" + whisper: "Chapisho hili ni binafsi kwa wasimamizi tu." + wiki: + about: "chapisho hili ni wiki" + archetypes: + save: 'Hifadhi Machaguo' + few_likes_left: "Asante kwa kutoa upendo! Umebakiwa na upendo mchache kwa ajili ya leo." + controls: + reply: "anza kuandika jibu kwenye mada hii" + like: "penda hili chapisho" + has_liked: "umependa chapisho hili" + undo_like: "ondoa upendo" + edit: "hariri chapisho hili" + edit_action: "Hariri" + edit_anonymous: "Samahani, lazima uwe umeingia kuhariri chapisho hili." + flag: "ripoti kwa siri chapisho hili liangaliwe au tuma ujumbe binafsi wa taarifa kuhusiana na hii" + delete: "futa chapisho hili" + undelete: "rudisha chapisho hili" + share: "gawiza kiungo kwenye mada hii" + more: "Zaidi" + delete_replies: + confirm: "Je unataka pia kufuta majibu ya chapisho hili?" + just_the_post: "Hapana, chapisho hili tu" + admin: "chapisha vitendo vya kiongozi" + wiki: "Tengeneza Wiki" + unwiki: "Ondoa Wiki" + convert_to_moderator: "Ongeza Rangi ya Wasaidizi" + revert_to_regular: "Ondoa Rangi ya Wasaidizi" + rebake: "Tengeneza upya HTML" + unhide: "Onesha" + change_owner: "Badilisha Umiliki" + grant_badge: "Toa Beji" + lock_post: "Funga Chapisho" + lock_post_description: "mzuie mchapishaji kuhariri chapisho hili" + unlock_post: "Fungua Chapisho" + unlock_post_description: "mruhusu mchapishaji kuhariri chapisho hili" + actions: + flag: 'Bendera' + defer_flags: + one: "Puuzia bendera" + other: "Puuzia bendera" + undo: + off_topic: "Ondoa bendera" + spam: "Ondoa bendera" + inappropriate: "Ondoa bendera" + bookmark: "Ondoa Alamisho" + like: "Ondoa upendo" + people: + off_topic: "imeripotiwa kama haihusiki " + spam: "ameripoti hii kuwa barua taka" + inappropriate: "imeripotiwa kuwa haiko sawa" + notify_moderators: "wajulishe wasimamizi" + notify_user: "ujumbe umetumwa" + bookmark: "alamisha hii" + like: "ameipenda hii" + by_you: + off_topic: "Umeripoti hii kuwa haihusiki" + spam: "Umeripoti hii kuwa ni taka" + inappropriate: "Umeripoti kuwa haiko sawa" + notify_moderators: "Umeripoti ili ipitiwe na msimamizi" + notify_user: "Umetuma ujumbe kwa mtumiaji huyu" + bookmark: "Umealamisha chapisho hili" + like: "Umeipenda hii" + by_you_and_others: + notify_user: + one: "Wewe na 1 mwingine mmetuma ujumbe kwa mtumiaji huyu" + other: "Wewe na {{count}} wengine mmetuma ujumbe kwa mtumiaji huyu" + like: + one: "Wewe na 1 mwingine mmevutiwa na hii" + other: "Wewe na {{count}} wengine mmevutiwa na hii" + by_others: + like: + one: "Mtu 1 amevutiwa na hii" + other: "Watu {{count}} wamevutiwa na hii" + delete: + confirm: + one: "Je, umeridhia kufuta chapisho hili?" + other: "Are you sure you want to delete those {{count}} posts?" + revisions: + controls: + first: "Sahihisho la kwanza" + previous: "Sahihisho lililopita" + next: "Sahihisho linalokuja" + last: "Sahihisho iliopita" + hide: "Ficha sahihisho" + show: "Onyesha sahihisho" + revert: "Rudi kwenye sahihisho hili" + edit_wiki: "Hariri Wiki" + edit_post: "Hariri Chapisho" + comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}" + displays: + inline: + button: 'HTML' + side_by_side: + title: "Onyesha utofauti wa matokeo moja pembeni ya nyingine" + button: 'HTML' + side_by_side_markdown: + title: "Onyesha utofauti wa kianzisho moja pembeni ya nyingine" + button: 'Asili' + raw_email: + displays: + raw: + title: "Onyesha barua pepe asili" + button: 'Asili' + text_part: + title: "Onyesha sehemu yenye maneno kwenye barua pepe." + button: 'Neno' + html_part: + title: "Onyesha sehemu yenye html kwenye barua pepe." + button: 'HTML' + category: + can: 'can… ' + none: '(hakuna kategoria)' + all: 'Kategoria Zote' + edit: 'hariri' + edit_long: "Hariri" + view: 'Angalia Mada kwenye Kategoria' + general: 'Jumla' + settings: 'Mipangilio' + topic_template: "kiolezo cha kawaida" + tags: "Lebo" + tags_allowed_tags: "Ruhusu lebo hizi zitumike kwenye kategoria hii tu:" + tags_allowed_tag_groups: "Ruhusu lebo hizi kutoka kwenye vikundi hivi vitumike kwenye kategoria hii tu:" + tags_placeholder: "(Sio muhimu) orodha ya lebo zilizoruhusiwa." + tag_groups_placeholder: "(Sio muhimu) orodha ya vikundi vyenye lebo zilizoruhusiwa." + delete: 'Futa Kategoria' + create: 'Kategoria Mpya' + create_long: 'Tengeneza kategoria mpya' + save: 'Hifadhi Kategoria' + slug: 'Neno la Kategoria ' + creation_error: Tatizo limetokea wakati wa kutengeneza kategoria. + save_error: Hitilafu imetokea wakati wa kuhifadhi kategoria. + name: "Jina la Kategoria" + description: "Maelezo" + topic: "kategoria mada" + logo: "Nembo ya Kategoria" + background_image: "Mandharinyuma ya Kategoria" + badge_colors: "Rangi za Beji" + background_color: "rangi ya Mandharinyuma" + foreground_color: "Rangi ya mandhari ya mbele" + name_placeholder: "Neno moja au mawili" + color_placeholder: "Rangi yoyote ya mtandao" + delete_confirm: "Una uhakika unataka kufuta kategoria hii?" + delete_error: "Hitilafu imetokea wakati wa kuondoa kategoria." + list: "Orodhesha Kategoria" + no_description: "Tafadhali, ongeza maelezo kuhusu kategoria hii." + change_in_category_topic: "Hariri Maelezo" + already_used: 'Rangi hii imetumika kwenye kategoria nyingine' + security: "Ulinzi" + images: "Picha" + email_in_allow_strangers: "Pokea barua pepe kutoka kwa watumiaji wasiojulikana ambao hawana akaunti" + email_in_disabled: "Uchapishaji wa mada mpya kupitia barua pepe umesitishwa kwenye Mipangilio ya Tovuti. Kuruhusu uchapishaji wa mada mpya kupitia barua pepe," + email_in_disabled_click: 'ruhusu mpangilio wa "barua pepe ndani"' + suppress_from_latest: "Husuru kategoria hizi kutokea kwenye mada za hivi karibuni." + num_featured_topics: "Idadi ya mada zitakazo onyeshwa ndani ya ukurasa wa kategoria:" + all_topics_wiki: "Hifadhi mada mpya kama chaguo msingi" + sort_order: "Orodha ya Maneno Imepangwa Kulingana Na:" + default_view: "Orodha ya Mada Chaguo Msingi:" + allow_badges_label: "Ruhusu beji hizi zitolewe kwenye kategoria hii:" + edit_permissions: "Hariri Vibali" + add_permission: "Ongeza Kibali" + this_year: "mwaka huu" + position: "Nafasi" + default_position: "Chaguo Msingi la Nafasi" + position_disabled: "Kategoria zitaonyeshwa kulingana na oda ya shughuli. Kudhibiti oda ya kategoria kwenye orodha," + minimum_required_tags: 'Kiwango cha chini cha lebo zinazohitajika kwenye mada:' + parent: "Kategoria Miliki" + notifications: + watching: + title: "Angalia" + description: "Utaangalia mada zote kwenye kategoria hizi. Utajulishwa kuhusiana na machapisho mapya ndani ya mada zote, na namba ya majibu itaonyeshwa." + watching_first_post: + title: "Chapisho la Kwanza Linaangaliwa" + description: "Utajulishwa kuhusu chapisho la kwanza tu kwenye kila mada ndani ya vikundi hivi." + tracking: + title: "Fuatilia" + description: "Ufuatilia mada zote kwenye kategoria hizi. Utajulishwa kama mtu akitaja @jina lako au akikujibu, na namba ya majibu itaonyeshwa." + regular: + title: "Kawaida" + description: "Utajulishwa kama mtu akitaja @jina lako au akikujibu." + muted: + title: "Imenyamazishwa" + description: "Utajulishwa kuhusu kila kitu kuhusu mada mpya kwenye kategoria hizi, na hazitatokea kama taarifa za hivi karibuni." + sort_options: + default: "chaguo-msingi" + likes: "Upendo" + op_likes: "Upendo wa Chapisho Asilia" + views: "Imeonwa" + posts: "Machapisho" + activity: "Shughuli" + posters: "Wachapishaji" + category: "Kategoria" + created: "Ilitengenezwa" + sort_ascending: 'Kupanda' + sort_descending: 'Kushuka' + subcategory_list_styles: + rows: "Safu" + boxes: "Visanduku" + flagging: + title: 'Asante kwa kuendeleza ustaarabu kwenye jumuiya yetu!' + action: 'Ripoti Chapisho' + take_action: "Fanya Kitendo" + notify_action: 'Ujumbe' + official_warning: 'Onyo Rasmi' + delete_spammer: "Futa Muandishi wa Taka" + delete_confirm_MF: "Unakaribia kufuta {POSTS, plural, one {chapisho1} other {machapisho #}} na {TOPICS, plural, one {mada1} other {mada#}} kutoka kwa mtumiaji mwingine, ondoa akaunti yao, zuia usajili kutoka kwenye anwani zao za mtandao{anwani_ya mtandao}, na ongeza barua pepe zao {barua pepe}kwenye orodha ya waliozuliwa. Una uhakika mtumiaji huyu anatuma barua au ujumbe taka?" + yes_delete_spammer: "Ndiyo, futa mtuma barua taka" + ip_address_missing: "(N/A)" + hidden_email_address: "(imefichwa)" + submit_tooltip: "Wasilisha ripoti binafsi" + cant: "Samahani,hauwezi kuripoti mada hii kwa sasa." + notify_staff: 'Wajulishe wasaidizi kwa njia binafsi' + formatted_name: + off_topic: "Ni Mada Isiyohusika" + inappropriate: "Ni isiyofaa" + spam: "Ni barua taka" + flagging_topic: + title: "Asante kwa kuendeleza ustaarabu kwenye jumuiya yetu!" + action: "Ripoti Mada" + notify_action: "Ujumbe" + topic_map: + title: "Muhtasari wa Mada" + participants_title: "Wachapishaji wa Mara kwa Mara" + links_title: "Viungo Maarufu" + links_shown: "onyesha viungo zaidi..." + topic_statuses: + warning: + help: "Hii ni onyo rasmi." + bookmarked: + help: "Umealamisha mada hii" + locked: + help: "Mada hii imefungwa; majibu mapya hayaruhusiwi" + archived: + help: "Mada hii ni nyaraka. Imesimamishwa na haiwezi kubadilishwa." + locked_and_archived: + help: "Mada hii ni nyaraka na imefungwa. Haikubali majibu mapya na haiwezi kubadilishwa" + unpinned: + title: "Imeondolewa" + help: "Mada ii imeondolewa; itaonekana kwenye oda ya kawaida" + pinned_globally: + title: "Imebandikwa kwa ajili ya Umma" + help: "Mada hii imebandikwa kwa ajili ya umma; itatokea juu ya kategoria yake na juu ya mada za hivi karibuni" + pinned: + title: "Imebandikwa" + help: "Mada hii imebandikwa kwa ajili yako; itatokea juu ya kategoria yake" + invisible: + help: "Mada hii imeondolewa kwenye orodha. Haitaonyeshwa kwenye orodha za mada, na njia pekee ya kuifia ni kupitia kiungo chake" + posts: "Machapisho" + posts_long: "kuna machapisho {{namba}} kwenye hii mada" + posts_likes_MF: | + Mada hii ina {count, plural, one {jibu 1} other {majibu #}} {ratio, select, + low {yenye uwiano wa upendo zaidi kuliko chapisho} + med {yenye uwiano wa upendo mwingi kuliko chapisho} + high {yenye uwiano wa upendo mwingi sana kuliko chapisho} + other {}} + original_post: "Chapisho la Kwanza" + views: "Imeonwa" + views_lowercase: + one: "Imeonwa" + other: "Imeonwa" + replies: "Majibu" + activity: "Kitendo" + likes: "Upendo" + likes_long: "kuna upendo {{namba}} ndani ya mada hii" + users: "Watumiaji" + users_lowercase: + one: "Mtumiaji" + other: "Watumiaji" + category_title: "Kategoria" + history: "Historia" + changed_by: "na {{author}}" + raw_email: + title: "Barua Pepe Iliyopokelewa" + not_available: "Haipatikani!" + categories_list: "Orodha ya Kategoria" + filters: + with_topics: "mada %{filter}" + with_category: "mada %{filter}%{category}" + latest: + title: "Hivi Karibuni" + title_with_count: + one: "Mada 1 ya hivi karibuni" + other: "Mada ({{count}}) za hivi karibuni" + help: "mada zenye machapisho ya hivi karibuni" + hot: + title: "Nzuri Sana" + help: "chaguo la mada nzuri sana" + read: + title: "Soma" + help: "mada ambazo umezisoma, kwenye oda ulivyosoma" + search: + title: "Tafuta" + help: "tafuta mada zote" + categories: + title: "Kategoria" + title_in: "Kategoria - {{Jinalakategoria}}" + help: "mada zote zimewekwa kulingana na kategoria" + unread: + title: "Haijasomwa" + title_with_count: + one: "Haijasomwa (1)" + other: "Hazijasomwa ({{count}})" + help: "mada unazo fuatilia au angalia zenye machapisho ambayo hayajasomwa" + new: + lower_title_with_count: + one: "Mada mpya 1" + other: "Mada mpya {{count}} " + lower_title: "mpya" + title: "Mpya" + help: "mada zilizotengenezwa siku chache zilizopita" + posted: + title: "Machapisho Yangu" + help: "mada zenye machapisho yako" + bookmarks: + title: "Mialamisho" + help: "mada zenye alamisho" + category: + title: "{{categoryName}}" + help: "mada za hivi karibuni ndani ya kategoria ya {{Jinalakategoria}}" + top: + title: "Juu" + help: "mada zilizoongelewa sana ndani ya mwaka, mwezi, wiki au siku zilizopita" + all: + title: "Mda Wote" + yearly: + title: "Kila Mwaka" + quarterly: + title: "Kila baada ya miezi mitatu" + monthly: + title: "Klla mwezi" + weekly: + title: "Kila wiki" + daily: + title: "Kila siku" + all_time: "Wakati wote" + this_year: "Mwaka" + this_quarter: "Robo" + this_month: "Mwezi" + this_week: "Wiki" + today: "Leo" + other_periods: "tazama juu" + browser_update: 'Kwa bahati mbaya, kivinjari unachotumia kimepita mda na hakiwezi kufungua tovuti hii. Tafadhali sasisha kivinjari chako.' + permission_types: + full: "Tengeneza / Jibu / Angalia" + create_post: "Jibu / Angalia" + readonly: "Angalia" + lightbox: + download: "pakua" + keyboard_shortcuts_help: + title: 'Njia Mkato za Baobonye' + jump_to: + title: 'Fikia' + home: 'g, h Nyumbani' + latest: 'g, l Hivi Karibuni' + new: 'g, n Mpya' + unread: 'g, u Haijasomwa' + categories: 'g, c Kategoria' + top: 'g, t Juu' + bookmarks: 'g, b Machelezo' + profile: 'g, p Umbo' + messages: 'g, m Ujumbe' + navigation: + title: 'Abiri' + jump: '# Nenda kwenye chapisho #' + back: 'u Nyuma' + up_down: 'k/j Hamisha chaguo ↑ ↓' + open: 'o or Enter Fungua mada iliyochaguliwa' + next_prev: 'shift+j/shift+k Kifungu Kifuatacho/kilichopita' + application: + title: 'Programu-tumizi' + create: 'c Tengeneza mada mpya' + notifications: 'n Fungua taarifa' + hamburger_menu: '= Fungua menyu ya hamburger - ina mistari mitatu iliyolala' + user_profile_menu: 'p Fungua menyu ya mtumiaji' + show_incoming_updated_topics: '. Onyesha mada zilizosasishwa' + search: '/ or ctrl+alt+f Tafuta' + help: '? Fungua msaada wa kibodi' + dismiss_new_posts: 'x, r Ondosha Mpya/Machapisho' + dismiss_topics: 'x, t Puuzia Mada' + log_out: 'shift+z shift+z Ondoka' + composing: + title: 'Andika' + return: 'shift+c Rudi kwenye sehemu ya uandishi' + actions: + title: 'Vitendo' + bookmark_topic: 'f Swichi alamisho ya mada' + pin_unpin_topic: 'shift+p Bandika/Ondoa mada' + share_topic: 'shift+s Gawiza mada' + share_post: 's Gawiza chapisho' + reply_as_new_topic: 't Jibu kama mada iliyounganishwa' + reply_topic: 'shift+r Jibu mada' + reply_post: 'r Jibu chapisho' + quote_post: 'q Nukulu chapisho' + like: 'l Penda chapisho' + flag: '! Ripoti chapisho' + bookmark: 'b Alamisha chapisho' + edit: 'e Hariri chapisho' + delete: 'd Futa chapisho' + mark_muted: 'm, m Nyamazisha mada' + mark_regular: 'm, r Mada kawaida (chaguo-msingi) ' + mark_tracking: 'm, t Fuatilia mada' + mark_watching: 'm, w Angalia mada' + print: 'ctrl+p Chapisha mada:' + badges: + granted_on: "Imetolewa %{date}" + others_count: "Wengine wenye hii beji (%{count})" + title: Beji + allow_title: "Unaweza kutumia beji hii kama cheo" + multiple_grant: "Unaweza kuipata mara nyingi" + badge_count: + one: "Beji 1" + other: "%{count} Beji" + select_badge_for_title: Chagua beji ya kutumia kama cheo chako + none: "(hakuna)" + successfully_granted: "%{badge}beji imetolewa kwenda kwa %{username}" + badge_grouping: + getting_started: + name: Kuanza + community: + name: Jumuiya + trust_level: + name: Kiwango cha Uaminifu + other: + name: Nyingine + posting: + name: Kuchapisha + google_search: | +

Tafuta kutumia Google

+

+

+

+ tagging: + all_tags: "Lebo Zote" + other_tags: "Lebo Zingine" + selector_all_tags: "lebo zote" + selector_no_tags: "hakuna lebo" + changed: "lebo zilizobadilishwa:" + tags: "Lebo" + choose_for_topic: "lebo zisizo muhimu" + delete_tag: "futa lebo" + delete_confirm_no_topics: "Una uhakika unataka kufuta lebo hii?" + rename_tag: "Badili jina la lebo" + rename_instructions: "Chagua jina jipya la lebo" + sort_by: "Pangilia kwa:" + sort_by_count: "hesabu" + sort_by_name: "jina" + manage_groups: "Dhibiti makundi ya lebo" + manage_groups_description: "Fasili makundi kwa ajili ya kurakibisha lebo" + filters: + without_category: "mada %{filter}%{tag}" + with_category: "mada%{filter} %{tag} za %{category}" + untagged_without_category: "mada ambazo hazina lebo %{filter}" + untagged_with_category: "%{filter}ameondoa lebo kwenye mada za %{category}" + notifications: + watching: + title: "Inaangaliwa" + description: "Otomatikali utaangalia mada zote zenye lebo hii. Utajulishwa kuhusiana na mada na machapisho mapya, pia namba za machapisho ambayo hayajasomwa na mapya itatokea pembeni ya mada." + watching_first_post: + title: "Chapisho la Kwanza Linaangaliwa" + description: "Utajulishwa kuhusu chapisho la kwanza kwenye kila mada zenye lebo hii." + tracking: + title: "Fuatilia" + description: "Utafuatilia mada zote zenye lebo hizi. Namba za machapisho ambayo hayajasomwa na mapya itatokea pembeni ya mada." + regular: + title: "Kawaida" + description: "Utajulishwa kama mtu akitaja @jina lako au akijibu chapisho lako." + muted: + title: "Imenyamazishwa" + description: "Hautajulishwa kuhusu mada mpya zenye lebo hii, na hazitatokea kwenye sehemu ya taarifa ambazo hazijasomwa." + groups: + title: "Vikundi vya Lebo" + about: "Ongeza lebo kwenye vikundi kuzisimamia kwa urahisi zaidi." + new: "Kundi jipya" + tags_label: "Lebo kwenye kundi hili" + parent_tag_label: "lebo zazi" + parent_tag_placeholder: "Sio Muhimu" + parent_tag_description: "Lebo za kikundi hiki haziwezi kutumika kama lebo miliki haipo." + one_per_topic_label: "Weka kikomo cha lebo moja kwenye kila mada iliyo ndani ya kikundi hiki" + new_name: "Kikundi Kipya cha Lebo" + save: "Hifadhi" + delete: "Futa" + confirm_delete: "Una uhakika unataka kufuta kikundi cha lebo hii?" + everyone_can_use: "Lebo zinaweza kutumiwa na kila mtu" + usable_only_by_staff: "Lebo zinaonekana kwa kila mtu, lakini wasaidizi tu wanaweza kuzitumia" + visible_only_to_staff: "Lebo zinaonekana kwa wasaidizi tu" + topics: + none: + unread: "Hauna mada ambazo hazijasomwa." + new: "Hauna mada mpya." + read: "Bado haujasoma mada yoyote." + posted: "Bado haujachapisha kwenye mada yoyote." + latest: "Hakuna mada zingine za hivi karibuni." + hot: "Hakuna mada nzuri." + bookmarks: "Bado hauja alamisha mada yoyote." + top: "Hakuna mada za juu." + search: "Hakuna majibu ya utafiti." + bottom: + latest: "Hakuna mada zingine za hivi karibuni." + hot: "Hakuna mada nzuri sana zaidi." + posted: "Hakuna mada mpya zilizochapishwa." + read: "Hakuna mada zingine zilizosomwa." + new: "Hakuna mada mpya zingine." + unread: "Hakuna mada zingine ambazo hazijasomwa." + top: "Hakuna mada za juu zingine." + bookmarks: "Hakuna mada zingine zilizoalamishwa." + search: "Hakuna majibu zaidi ya utafiti." + invite: + custom_message: "Fanya mualiko wako uwe wa kibinafsi zaidi kwa kuandika" + custom_message_link: "ujumbe binafsi" + custom_message_placeholder: "Andika ujumbe binafsi" + custom_message_template_forum: "Habari, jiunge kwenye jumuiya yetu!" + custom_message_template_topic: "Habari, nadhani utaipenda hii mada!" + admin_js: + type_to_filter: "andika kuchuja..." + admin: + title: 'Kiongozi wa Discourse' + moderator: 'Msimamizi' + reports: + title: "Orodha ya ripoti zilizopo" + dashboard: + title: "Ubao" + last_updated: "Mara ya mwisho ubao umesasishwa:" + old_link: "Tembelea hapa" + version: "Toleo" + up_to_date: "Una toleo la sasa!" + critical_available: "Sasisho muhimu linapatikana." + updates_available: "Masashisho yanapatikana." + please_upgrade: "Tafadhali boresha!" + no_check_performed: "Utafutaji wa toleo la sasa haujafanywa. Hakikisha sidekiq inafanya kazi." + stale_data: "Utafutaji wa toleo la sasa haujafanyika hivi karibuni. Hakikisha sidekiq inafanya kazi." + version_check_pending: "Inaonekana umeweka toleo la sasa hivi karibuni. Vizuri!" + installed_version: "Imesanikishwa" + latest_version: "Hivi Karibuni" + problems_found: "Kuna matatizo yaliyotokea wakati wa kusanikisha Discourse:" + last_checked: "Mara ya Mwisho imeangaliwa" + refresh_problems: "Rudisha Tena" + no_problems: "Hakuna matatizo yaliyopatikana." + moderators: 'Wasimamizi:' + admins: 'Viongozi:' + silenced: 'Nyamazishwa:' + suspended: 'Sitishwa:' + private_messages_short: "Ujumbe" + private_messages_title: "Ujumbe" + mobile_title: "Kifaa cha kiganjani" + space_free: "iko wazi {{size}}" + uploads: "vilivyopakiwa" + backups: "machelezo" + lastest_backup: "Hivi karibuni: %{date}" + traffic_short: "Utembeleaji" + page_views: "Ukurasa Umeonwa Mara" + page_views_short: "Ukurasa Umeonwa Mara" + show_traffic_report: "Onyesha Maelezo ya Ripoti ya Utembeleaji " + community_health: Afya ya Jumuiya + whats_new_in_discourse: "Vitu gani ni vipya kwenye Discourse?" + all_reports: "Ripoti zote" + general_tab: "Jumla" + disabled: Imezuiwa + reports: + today: "Leo" + yesterday: "Jana" + last_7_days: "7 za Mwisho" + last_30_days: "30 za Mwisho" + all_time: "Mda Wote" + 7_days_ago: "Siku 7 Zilizopita" + 30_days_ago: "Siku 30 Zilizopita" + all: "Zote" + view_table: "jedwali" + view_graph: "grafu" + refresh_report: "Rudisha tena Ripoti" + start_date: "Tarehe ya Kuanza" + end_date: "Tarehe ya Kumaliza" + groups: "Vikundi vyote" + disabled: "Hii ripoti imezuiwa" + total: "Jumla ya wakati wote" + no_data: "Hakuna data za kuoneshwa" + commits: + latest_changes: "Mabadiliko ya mwisho: tafadhali sasisha mara kwa mara!" + by: "na" + flags: + title: "Bendera" + active_posts: "Machapisho yenye Bendera" + old_posts: "Machapisho yenye Bendera za Zamani" + topics: "Mada Zilizoripotiwa" + moderation_history: "Historia ya Usimamizi" + agree: "Kubali" + agree_title: "Thibitisha bendera hii kuwa ni halali na sawa" + agree_flag_hide_post: "Ficha Chapisho" + agree_flag_hide_post_title: "Ficha chapisho hili na otomatikali mtumie mtumiaji ujumbe wa kumwambia afanye uhariri." + agree_flag_restore_post: "Kubali na Rudisha Chapisho" + agree_flag_restore_post_title: "Rudisha chapisho ili watumiaji wote waweze kuliona." + agree_flag_suspend: "Simamisha Mtumiaji" + agree_flag_suspend_title: "Kubaliana na bendera na simamisha mtumiaji." + agree_flag_silence: "Nyamazisha Mtumiaji" + agree_flag_silence_title: "Kubaliana na bendera na nyamazisha mtumiaji." + agree_flag: "Tunza Chapisho" + agree_flag_title: "Kubaliana na bendera na chapisho halitabadilishwa." + ignore_flag: "Puuzia" + ignore_flag_title: "Ondoa bendera hii, haihitaji kitendo chochote kwa sasa." + delete: "Futa" + delete_title: "Futa chapisho linalo ongelewa na bendera." + delete_post_defer_flag: "Futa Chapisho na Puuzia bendera" + delete_post_defer_flag_title: "Futa chapisho; kama ni chapisho la kwanza, futa mada" + delete_post_agree_flag: "Futa Chapisho na Kubaliana na bendera" + delete_post_agree_flag_title: "Futa chapisho; kama ni chapisho la kwanza, futa mada" + delete_flag_modal_title: "Futa na..." + delete_spammer: "Futa Muandishi wa Taka" + delete_spammer_title: "Muondoe mtumiaji na machapisho yake yote na mada za mtumiaji huyu." + disagree_flag_unhide_post: "Kataa (onyesha chapisho)" + disagree_flag_unhide_post_title: "Ondoa bendera zote kwenye chapisho hili na fanya chapisho lionekane tena" + disagree_flag: "Kataa" + disagree_flag_title: "Kataa bendera hii kuwa sio sahihi au batili" + clear_topic_flags: "Imekwisha" + clear_topic_flags_title: "Mada hii imefanyiwa upelelezi na matatizo yake yametatuliwa. Bonyeza Imekwisha kuondoa bendera." + more: "(majibu zaidi...)" + suspend_user: "Simamisha Mtumiaji" + suspend_user_title: "Simamisha mtumiaji kwenye chapisho hili" + dispositions: + agreed: "imekubaliwa" + disagreed: "imekataliwa" + deferred: "Imepuuziwa" + flagged_by: "Imeripotiwa na" + resolved_by: "Imesuluhishwa na" + took_action: "Amefanya kitendo" + system: "Mfumo" + error: "Kitu kimeenda vibaya" + reply_message: "Jibu" + no_results: "Hakuna mada zilizoripotiwa." + topic_flagged: "Madahii imeripotiwa." + show_full: "onyesha chapisho lote" + visit_topic: "Tembelea mada kufanya kitendo" + was_edited: "Chapisho lilifanyiwa uhariri baada ya ripoti ya kwanza" + previous_flags_count: "Chapisho hili limeripotiwa mara {{count}}." + show_details: "Onyesha maelezo ya bendera" + details: "maelezo" + flagged_topics: + topic: "Mada" + type: "Aina" + users: "Watumiaji" + last_flagged: "Mara ya mwisho Imeripotiwa" + short_names: + off_topic: "isiyohusika" + inappropriate: "Haifai" + spam: "sio muhimu" + notify_user: "binafsi" + notify_moderators: "binafsi" + groups: + new: + title: "Kikundi Kipya" + create: "Tengeneza" + name: + too_short: "Jina la kikundi ni fupi sana" + too_long: "Jina la kikundi ni refu sana" + checking: "Tunaangalia kama jina la kikundi lipo..." + available: "Jina la kikundi lipo" + not_available: "Jina la kikundi halipo" + blank: "Jina la kikundi haliwezi kuwa wazi" + bulk_add: + title: "Ongeza Wengi kwenye Kikundi" + complete_users_not_added: "Watumiaji hawa hawajaongezwa (hakikisha wana akaunti):" + paste: "Bandika orodha ya majina ya watumiaji au barua pepe, moja kila mstari:" + add_members: + as_owner: "Fanya w(m)umiaji kuwa w(m)amiliki wa kikundi hiki" + manage: + interaction: + email: Barua Pepe + incoming_email: "Barua Pepe inayoingia" + incoming_email_placeholder: "andika anwani ya barua pepe" + visibility: Uonekanaji + visibility_levels: + title: "Nani anaweza kuona kikundi hiki?" + public: "Kila Mtu" + members: "Wamiliki wa vikundi, wanachama na viongozi" + staff: "Wamiliki wa vikundi na wasaidizi" + owners: "Wamiliki wa vikundi na viongozi" + membership: + automatic: Otomatiki + trust_level: Kiwango cha Uaminifu + trust_levels_title: "Wanachama otomatikali watapata kiwango cha uaminifu wakiongezwa:" + trust_levels_none: "Hakuna" + automatic_membership_email_domains: "Watumiaji wanaojiunga kupitia barua pepe zenye kikoa kinacholingana na hichi kwenye orodha hii wataongezwa otomatikali kwenye kikundi hiki:" + automatic_membership_retroactive: "Tumia kanuni ya kikoa cha barua pepe kuongeza watumiaji waliosajiliwa" + primary_group: "Otomatikali weka kama kikundi msingi" + name_placeholder: "Jina la kikundi, hakuna nafasi, sawa na kanuni ya jina la mtumiaji" + primary: "Kikundi Msingi" + no_primary: "(hakuna kikundi msingi)" + title: "Vikundi" + edit: "Hariri Vikundi" + refresh: "Rudisha Tena" + about: "Hariri uanachama wa kikundi chako na majina hapa" + group_members: "Wanachama wa kikundi" + delete: "Ondoa" + delete_confirm: "Ondoa kikundi hiki?" + delete_failed: "Tumeshindwa kuondoa kikundi. Kama kikundi kilitengenezwa otomatikali, hakiwezi kuvunjwa." + delete_owner_confirm: "Ondoa haki ya mmiliki kwa '%{username}'?" + add: "ongeza" + custom: "Binafsi" + automatic: "otomatiki" + default_title: "Kichwa cha habari Chaguo-Msingi" + default_title_description: "itatumiwa kwenye watumiaji wote kwenye kikundi" + group_owners: Wamiliki + add_owners: Ongeza Wamiliki + none_selected: "Chagua kikundi kuanza" + no_custom_groups: "Tengeneza kikundi kipya" + api: + none: "Hakuna funguo za API zilizo amilifu kwa sasa." + user: "Mtumiaji" + title: "API" + key: "Ufunguo wa API" + generate: "Tengeneza" + regenerate: "Tengeneza Upya" + revoke: "Futa" + confirm_regen: "Una uhakika unataka kufuta ufunguo wa API na kuweka mpya?" + confirm_revoke: "Una uhakika unataka kufuta huo ufunguo?" + all_users: "Watumiaji Wote" + web_hooks: + create: "Tengeneza" + save: "Hifadhi" + destroy: "Futa" + description: "Elezo" + controls: "Vidhibiti" + go_back: "Rudi kwenye orodha" + payload_url_placeholder: "https://example.com/postreceive" + secret_invalid: "Siri haiwezi kuwa wazi bila herufi." + secret_too_short: "Siri iwe na herufi 12 au zaidi." + secret_placeholder: "Sehemu nyongeza ya kutengeneza sahihi" + event_type_missing: "Unahitaji kuandika aina moja ya tukio au zaidi." + content_type: "Aina ya Maandishi" + secret: "Siri" + wildcard_event: "Nitumie kila kitu." + individual_event: "Chagua matukio rejareja." + active: "Amilifu" + active_notice: "Tutakuletea taarifa za tukio zinapotokea." + topic_event: + name: "Mada Tukio" + details: "Wakati kuna mada mpya, iliyotadubiriwa, badilisha au kufutwa." + post_event: + name: "Chapisho Tukio" + details: "Wakati kuna jibu jipya, uhariri, kufutwa au kurejeshwa." + user_event: + name: "Mtumiaji Tukio" + details: "Wakati mtumiaji anavyoingia, anavyotoka, anavyotengenezwa, anavyothibitishwa au kusasishwa." + group_event: + name: "Kikundi Tukio" + details: "Wakati kikundi kinapotengenezwa, sasishwa au kuvunjwa." + category_event: + name: "Kategoria Tukio" + details: "Wakati kitengo kinapotengenezwa, sasishwa au kuvunjwa." + tag_event: + name: "Lebo Tukio" + details: "Wakati lebo inapotengenezwa, sasishwa au kufutwa." + flag_event: + name: "Repoti Tukio" + delivery_status: + title: "Hali ya Uwasilishaji" + inactive: "Isiyo Amilifu" + failed: "Kushindwa" + successful: "Fanikiwa" + events: + none: "Hakuna matukio yanayofanana" + redeliver: "Wasilisha tena" + request: "Ombi" + response: "Mwitikio" + headers: "Vichwa" + body: "Mwili" + go_list: "Nenda kwenye orodha" + go_events: "Nenda kwenye matukio" + ping: "Ping" + status: "Kodi ya Hali" + event_id: "Utambulisho" + timestamp: "Imetengenezwa" + completion: "Mda wa Kumaliza" + actions: "Vitendo" + plugins: + title: "Programu-jalizi" + installed: "Progamu-jalizi zilizowekwa" + name: "Jina" + none_installed: "Hauna programu-jalizi zilizowekwa." + version: "Toleo" + enabled: "Imeruhusiwa?" + is_enabled: "N" + not_enabled: "H" + change_settings: "Badilisha Mipangilio" + change_settings_short: "Mipangilio" + howto: "Ninawekaje programu-jalizi?" + official: "Programu-jalizi Rasmi" + backups: + title: "Machelezo" + menu: + backups: "Machelezo" + logs: "Batli" + none: "Hakuna chelezo iliyopo." + read_only: + enable: + title: "Ruhusu hali-tumizi ya usomaji tu." + label: "Ruhusu usomaji tu." + confirm: "Una uhakika unataka kuruhusu halitumizi ya usomaji pekee?" + disable: + title: "Zima hali-timizi ya soma tu" + label: "Zima soma-tu" + logs: + none: "Bado hakuna batli..." + columns: + filename: "Jina la faili" + size: "Kipimo" + upload: + label: "Pakia" + title: "Pakia chelezo kwenye mfano huu." + uploading: "Inapakia..." + success: "'{{jina la faili}}' imepakiwa kwa mafanikio. Faili lipokwenye harakati na litachukua mpaka dakika kuonekana kwenye orodha." + error: "Hitilafu imetokea wakati wa kupakia '{{jina la faili}}': {{ujumbe}}" + operations: + is_running: "Operesheni inaendelea kwa sasa..." + failed: "{{Operesheni}} imeshindwa. Tafadhali angalia batli." + cancel: + label: "Ghairi" + title: "Ghairi operesheni ya sasa." + confirm: "Una uhakika unataka kughairi operesheni ya sasa?" + backup: + label: "Chelezo" + title: "Tengeneza chelezo" + confirm: "Unataka kuanzisha chelezo jipya?" + download: + label: "Pakua" + title: "Tuma barua pepe yenye kiungo cha upakuaji" + alert: "Kiungo cha kupakua chelezo hii imetumwa kwenye barua pepe yako." + destroy: + title: "Ondoa chelezo" + confirm: "Una uhakika unataka kufuta chelezo hii?" + restore: + is_disabled: "Rejesha imezuiliwa kwenye mipangilio ya tovuti." + label: "Rejesha" + title: "Rejesha chelezo" + confirm: "Una uhakika unataka kurejesha chelezo hii?" + rollback: + label: "Urudisho Nyuma" + title: "Urudishaji hifadhidata kwenye hali ya zamani iliyokuwa inafanya kazi" + confirm: "Una uhakika unataka kurudisha hifadhidata kwenye hali ya zamani iliyokuwa inafanya kazi?" + export_csv: + success: "Uhamishaji umeanza, utajulishwa kwa njia ya ujumbe mfumo ukimaliza." + failed: "Uhamishaji haujamaliza. Tafadhali angalia batli." + button_text: "Hamisha" + button_title: + user: "Hamisha orodha yote ya watumiaji kwenye umbizo wa CSV." + staff_action: "Hamisha vitendo vyote vya kuingia kwa wasaidizi kwenye umbizo wa CSV." + screened_email: "Hamisha orodha ya anwani za barua pepe zilizoruhusiwa au kukatazwa kwenye umbizo wa CSV." + screened_ip: "Hamisha orodha ya anwani za mtandao zilizoruhusiwa au kukatazwa kwenye umbizo wa CSV." + screened_url: "Hamisha orodha ya anwani za tovuti zilizoruhusiwa au kukatazwa kwenye umbizo wa CSV." + export_json: + button_text: "Hamisha" + invite: + button_text: "Tuma Mialiko" + button_title: "Tuma Mialiko" + customize: + title: "Geuza Kukufaa" + long_title: "Mabadiliko Maalum ya Tovuti" + preview: "kihakiki" + explain_preview: "Tembelea tovuti inayotumia mandhari hii." + save: "Hifadhi" + new: "Mpya" + new_style: "Style Mpya" + import: "Ingiza" + delete: "Ondoa" + delete_confirm: "Ondoa mandhari hii?" + about: "Badilisha stylesheets za CSS na vichwa vya HTML kwenye tovuti. Ongeza mabadiliko maalum kuanza." + color: "Rangi" + copy: "Nakili" + copy_to_clipboard: "Umenakili kwenye Ubao Nakili" + copied_to_clipboard: "Umenakili kwenye Ubao Nakili" + copy_to_clipboard_error: "Hitilafu imetokea wakati wa kunakili taarifa kwenye ubao nakili." + theme_owner: "haiwezi kufanyiwa uhariri, inamilikiwa na:" + email_templates: + title: "Violezo vya Barua Pepe" + subject: "Maudhui" + body: "Mwili" + none_selected: "Chagua kiolezo cha barua pepe kuanza kuhariri" + revert: "Ondoa Mabadiliko" + revert_confirm: "Una uhakika unataka kuondoa mabadiliko?" + theme: + import_theme: "Ingiza Mandhari" + customize_desc: "Geuza Kukufaa:" + title: "Mandhari" + long_title: "Boresha rangi, taarifa za CSS na HTML zilipo ndani ya tovuti yako" + edit: "Hariri" + edit_confirm: "Mandhari hii ni kutoka nje, ukihariri CSS/HTML mabadiliko yatafutwa mara ukisasisha mandhari." + common: "Kawaida" + desktop: "Eneo kazi la Kompyuta" + mobile: "Kifaa cha kiganjani" + settings: "Mipangilio" + preview: "Kihakiki" + is_default: "Mandhari imewezeshwa kama chaguo-msingi" + user_selectable: "Mandhari inaweza kuchaguliwa na watumiaji" + color_scheme: "Mpango Rangi" + color_scheme_select: "Chagua rangi zitakazotumika kwenye mandhari" + custom_sections: "Vifungu binafsi:" + theme_components: "Vipengele vya Mandhari" + uploads: "Upakiaji" + no_uploads: "Unaweza kupakia vitu vinavyoendana na mandhari yako kama picha na fonti" + add_upload: "Ongeza Upakiaji" + upload_file_tip: "Chagua kitu cha kupakia (png, woff2, na vinginevyo...)" + variable_name: "Jina la SCSS:" + variable_name_invalid: "Jina lililoandikwa sio sahihi. Namba na herufi tu zinaruhusiwa. Lazima ianze na herufi. Lazima iwe ya kipekee." + upload: "Pakia" + child_themes_check: "Mandhari ina mandhari zingine" + css_html: "CSS/HTML Binafsi" + edit_css_html: "Hariri CSS/HTML" + edit_css_html_help: "Hauja hariri CSS au HTML yoyote" + delete_upload_confirm: "Futa upakiaji huu (CSS ya Mandhari inaweza kuacha kufanya kazi!)" + import_web_tip: "Hifadhi yenye mandhari" + import_file_tip: "faili la .dcstyle.json lenye mandhari" + is_private: "Mandhari ipo ndani ya hifadhi binafsi ya git" + public_key: "Ruhusu ufungo wa umma ufuatao ufikie hifadhi:" + about_theme: "Kuhusu Mandhari" + license: "Leseni" + update_to_latest: "Sasisha iwe Toleo Jipya" + check_for_updates: "Angalia Masasisho" + updating: "Inasasishwa..." + up_to_date: "Mandhari hii ime toleo la sasa, mara ya mwisho imeangaliwa:" + add: "Ongeza" + theme_settings: "Mipangilio ya Mandhari" + no_settings: "Mandhari hii haina mipangilio." + scss: + text: "CSS" + title: "Andika CSS binafsi, tunaruhusu CSS sahihi na styles za SCSS" + header: + text: "Kichwa" + title: "Andika HTML kuoekana juu ya kichwa cha tovuti" + after_header: + text: "Baada ya Kichwa" + title: "Ruhusu HTLM kuonekana kwenye kurasa zote baada ya kichwa" + footer: + text: "Kijachini" + title: "Ruhusu HTLM kuonekana kwenye ukurasa wa kijachini" + embedded_scss: + text: "CSS Iliyoambatanishwa" + head_tag: + text: "" + title: "HTML itakayowekwa kabla ya lebo " + body_tag: + text: "" + title: "HTML itakayowekwa kabla ya lebo " + yaml: + text: "YAML" + title: "Tambulisha mipangilio ya mpango kwenye umbiza wa YAML" + colors: + select_base: + title: "Chagua rangi ya mpango msingi" + description: "Mipango msingi:" + title: "Rangi" + edit: "Hariri Mipango Rangi" + long_title: "Mipango Rangi" + about: "Rekebisha rangi zinazotumiwa na mandhari. Tengeneza mpango rangi mpya kuanza." + new_name: "Mpango Rangi Mpya" + copy_name_prefix: "Nakala ya" + delete_confirm: "Ondoa mpango rangi huu?" + undo: "tendua" + undo_title: "tendua madiliko kwenye rangi hii kutoka mara ya mwisho ilivyohifadhiwa." + revert: "rejea" + revert_title: "Rudisha rangi ya Discourse." + primary: + name: 'msingi' + description: 'Neno, ikoni, na mipaka mingi.' + secondary: + name: 'sekondari' + description: 'Rangi msingi ya mandharinyuma, na rangi ya maneno ya baadhi ya vitufe. ' + tertiary: + name: 'kila baada ya miezi mitatu' + description: 'Viungo, baadhi ya vitufe, taarifa, na rangi za lafudhi.' + quaternary: + name: "kila baada ya miezi minne" + description: "Viungo vya kuabiri." + header_background: + name: "mandharinyuma ya kichwa" + description: "Rangi ya mandharinyuma ya kichwa cha tovuti." + header_primary: + name: "kichwa msingi" + description: "neno na ikoni ndani ya kichwa cha tovuti." + highlight: + name: 'angaza' + danger: + name: 'hatari' + description: 'angaza rangi kwa vitendo kama kufuta machapisho na mada.' + success: + name: 'mafanikio' + description: 'inatumika kuonyesha kuwa kitendo kilikuwa na mafanikio' + love: + name: 'upendo' + description: "Rangi ya kitufe cha upendo." + email: + title: "Barua Pepe" + settings: "Mipangilio" + templates: "Violezo" + preview_digest: "Kihakiki Jarida" + sending_test: "Barua Pepe ya Majaribio inatumwa..." + error: "HITILAFU - %{server_error}" + test_error: "Tatizo limetokea wakati wa kutuma barua pepe ya majaribio. Tafadhali angalia tena mipangilio ya barua, hakikisha kuwa muunganisho wa barua haujazuiliwa, na jaribu tena." + sent: "Imetumwa" + skipped: "Imerukwa" + bounced: "Haijafika" + received: "Imepokelewa" + rejected: "Imekataliwa" + sent_at: "Imetumwa" + time: "Mda" + user: "Mtumiaji" + email_type: "Aina ya Barua Pepe" + to_address: "Kwenda kwenye Anwani" + test_email_address: "barua pepe ya kujaribisha" + send_test: "Tuma Barua Pepe ya Kujaribisha" + sent_test: "imetumwa!" + delivery_method: "Njia ya Uwasilishaji" + preview_digest_desc: "Kihakiki maandishi ya barua pepe za jarida zinatomwa kwa watumiaji wasiotembelea jumuiya." + refresh: "Rudisha Tena" + send_digest_label: "Tuma majibu haya kwa:" + send_digest: "Tuma" + sending_email: "Barua Pepe inatumwa..." + format: "umbizo" + html: "html" + text: "neno" + last_seen_user: "Mara ya Mwisho Mtumiaji Ameonekana:" + no_result: "Hakuna majibu yaliyopatikana kwa ajili ya jarida." + reply_key: "Ufunguo wa Jibu" + skipped_reason: "Iruke Sababu" + incoming_emails: + from_address: "Kutoka" + to_addresses: "Kwenda" + cc_addresses: "Cc" + subject: "Maudhui" + error: "Hitilafu" + none: "Hakuna barua pepe inayoingia iliyopatikana." + modal: + title: "Barua Pepe Inayopokelewa" + error: "Hitilafu" + headers: "Vichwa" + subject: "Maudhui" + body: "Mwili" + rejection_message: "Barua ya Kukataa" + filters: + from_placeholder: "from@example.com" + to_placeholder: "kwendakwa@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "Maudhui" + error_placeholder: "Hitilafu" + logs: + none: "Hakuna batli iliyopatikana." + filters: + title: "Chuja" + user_placeholder: "jina la mtumiaji" + address_placeholder: "name@example.com" + type_placeholder: "jifunze, jiunge..." + reply_key_placeholder: "ufunguo wa jibu" + moderation_history: + performed_by: "Imefanywa Na" + no_results: "Hakuna historia ya usimamizi inayopatikana." + actions: + delete_user: "Mtumiaji Ameondolewa" + suspend_user: "Mtumiaji Alisitishwa" + silence_user: "Mtumiaji Amenyamazishwa" + delete_post: "Chapisho Limefutwa" + delete_topic: "Mada Imefutwa" + logs: + title: "Batli" + action: "Kitendo" + created_at: "Imetengenezwa" + last_match_at: "Mara ya mwisho Imefanananishwa" + match_count: "Inalingana" + topic_id: "Utambulisho wa Mada" + post_id: "Utambulisho wa Chapisho" + category_id: "Utambulisho wa Kikundi" + delete: 'Futa' + edit: 'Hariri' + save: 'hifadhi' + screened_actions: + block: "zuia" + do_nothing: "usifanye chochote" + staff_actions: + all: "yote" + filter: "Chuja:" + title: "Vitendo vya Wasaidizi" + clear_filters: "Onyesha Kila Kitu" + staff_user: "Msaidizi Mtumiaji" + target_user: "Mlenge Mtumiaji " + subject: "maudhui" + when: "Lini" + context: "Muktadha" + details: "Taarifa" + previous_value: "Uliopita" + new_value: "Mpya" + diff: "Utofauti" + show: "Onesha" + modal_title: "Taarifa" + no_previous: "Hakuna namba ya zamani." + deleted: "Hakuna namba mpya. Rekodi imefutwa." + actions: + delete_user: "futa mtumiaji" + change_trust_level: "badili kiwango cha uaminifu" + change_username: "badili jina la mtumiaji" + change_site_setting: "badili mpangilio wa tovuti" + change_theme: "badili mandhari" + delete_theme: "futa mandhari" + change_site_text: "badili andiko la tovuti" + suspend_user: "simamisha mtumiaji" + unsuspend_user: "ruhusu mtumiaji" + grant_badge: "jaliwa nishani" + revoke_badge: "tengua nishani" + check_email: "angalia barua pepe" + delete_topic: "futa mada" + recover_topic: "rudisha mada" + delete_post: "ondoa chapisho" + impersonate: "iga" + anonymize_user: "kuficha jina" + change_category_settings: "badili mpangilio wa kategoria" + delete_category: "futa kategoria" + create_category: "umba kategoria" + silence_user: "nyamazisha mtumiaji" + unsilence_user: "ondoa unyamazishaji wa mtumiaji" + grant_admin: "toa uongozi" + revoke_admin: "tengua uongozi" + grant_moderation: "toa usimamizi" + revoke_moderation: "ondoa usimamizi" + backup_create: "tengeneza chelezo" + deleted_tag: "lebo iliyofutwa" + renamed_tag: "lebo iliyobadilishwa jina" + revoke_email: "tengua barua pepe" + lock_trust_level: "funga kiwango cha uaminifu" + unlock_trust_level: "fungua kiwango cha uaminifu" + activate_user: "amilisha mtumiaji" + deactivate_user: "zimisha mtumiaji" + change_readonly_mode: "badilisha hali-tumizi ya usomaji tu" + backup_download: "pakua chelezo" + backup_destroy: "haribu chelezo" + reviewed_post: "chapisho iliyokaguliwa" + post_locked: "chapisho limefungiwa" + post_edit: "uhariri wa chapisho" + post_unlocked: "chapisho limefunguliwa" + check_personal_message: "angalia ujumbe binafsi" + disabled_second_factor: "zuia uhalalalishaji wa Viwango Viwili" + topic_published: "mada iliyotolewa" + post_approved: "Chapisho Limepitishwa" + post_rejected: "Chapisho Limekataliwa" + create_badge: "Tengeneza beji" + change_badge: "Badili beji" + delete_badge: "Futa beji" + merge_user: "Unganisha mtumiaji" + screened_emails: + title: "barua pepe zilizochunguzwa" + email: "anuani ya barua pepe" + actions: + allow: "ruhusu" + screened_urls: + title: "Anwani za tovuti zinazoruhusiwa au kukatazwa" + description: "Anwani za tovuti zilizo orodheshwa hapa zilitumiwa na mtumiaji anayechapisha taka." + url: "Anwani ya tovuti" + domain: "kikoa" + screened_ips: + title: "Anwani za mtandao zinazoruhusiwa au kukatazwa" + delete_confirm: "Una uhakika unataka kuondoa kanuni hii kwenye %{ip_address}?" + actions: + block: "Zuia" + do_nothing: "Ruhusu" + allow_admin: "Ruhusu Kiongozi" + form: + label: "Mpya:" + ip_address: "Anwani ya Mtandao" + add: "Ongeza" + filter: "Tafuta" + search_logs: + title: "Batli ya Utafiti" + term: "Neno" + searches: "Utafiti" + click_through: "Bofya" + unique: "Kipekee" + unique_title: "watumiaji wakipekee wanaofanya utafiti" + types: + all_search_types: "Aina zote za matokeo" + full_page: "Ukurasa Wote" + header_search_results: "Matokeo ya Utafiti" + logster: + title: "Batli ya Hitilafu" + watched_words: + title: "Maneno yanayoangaliwa" + search: "tafuta" + clear_filter: "Futa" + show_words: "onyesha maneno" + actions: + block: 'Zuia' + censor: 'Kizuizi' + require_approval: 'Inahitaji Uthibitisho' + flag: 'Bendera' + action_descriptions: + block: 'Zuia machapisho yenye maneno haya kuchapishwa. Mtumiaji ataona ujumbe wa hitilafu akijaribu kuwasilisha chapisho.' + censor: 'Ruhusu machapisho yenye maneno yafuatayo, lakini badilisha maneno hayo na herufi zinazoficha maneno yanayokatazwa.' + require_approval: 'Machapicho yenye maneno yafuatayo yatahitaji kibali kutoka kwa wafanyakazi kabla hayajaonwa.' + flag: 'Ruhusu machapisho yawe na maneno haya, ila ripoti kuonyesha kuwa hazifai ili wasimamizi waweze kuzikagua.' + form: + label: 'Neno Jipya:' + placeholder: 'neno lote au * kama wildcard' + placeholder_regexp: "muonekano wa kawaida" + add: 'Ongeza' + success: 'Mafanikio' + exists: 'Tayari ipo' + upload: "Upakiaji" + upload_successful: "Upakiaji Umemalizika. Maneno yameongezwa." + impersonate: + title: "Iga Utambulisho" + help: "Tumia kifaa hiki kuiga utambulisho wa mtumiaji ili uweze kutatua matatizo. Itabidi utoke ukishamaliza." + not_found: "Mtumiaji huyo hapatikani." + invalid: "Samahani hauwezi kuchukua utambulisho wa huyo mtumiaji." + users: + title: 'Watumiaji' + create: 'Ongeza Kiongozi' + last_emailed: "Mara ya Mwisho Amepokea Barua Pepe" + not_found: "Samahani, jina la mtumiaji halipo kwenye mfupo wetu." + id_not_found: "Samahani, utambulisho wa mtumiaji haupo kwenye mfumo wetu." + active: "Mara kwa Mara" + show_emails: "Onyesha Barua Pepe" + nav: + new: "Mpya" + active: "Mara kwa Mara" + pending: "Subirishwa" + staff: 'Wasaidizi' + suspended: 'Alisitishwa' + silenced: 'Amenyamazishwa' + suspect: 'Mshukiwa' + approved: "Wamekubaliwa?" + titles: + active: 'Watumiaji amilifu' + new: 'Watumiaji Wapya' + pending: 'Ukaguzi wa watuamiaji ambao hawajapitishwa' + newuser: 'Watumiaji wenye Kiwango 0 cha Uaminifu (Mtumiaji Mpya)' + basic: 'Watumiaji wenye Kiwango cha 1 cha Uaminifu (Mshiriki wa Awali)' + member: 'Watumiaji wenye Kiwango cha 2 cha Uaminifu (Mshiriki)' + regular: 'Watumiaji wenye Kiwango cha 3 cha Uaminifu (Kawaida)' + leader: 'Watumiaji wenye Kiwango cha 4 cha Uaminifu (Kiongozi)' + staff: "Wasaidizi" + admins: 'Watumiaji ambao ni Viongozi' + moderators: 'Wasimamizi' + silenced: 'Watumiaji Walionyamazishwa' + suspended: 'Watumiaji Waliositishwa' + suspect: 'Sitisha Watumiaji' + not_verified: "Haijathibitishwa" + check_email: + title: "Onyesha barua pepe ya mtumiaji" + text: "Onyesha" + user: + suspend_failed: "Hitilafu imetokea wakati wa kumsitisha mtumiaji {{hitilafu}}" + unsuspend_failed: "Hitilafu imetokea wakati wa kuruhusu mtumiaji aweze kujadiliana kwenye jamii {{hitilafu}}" + suspend_duration: "Mtumiaji atasitishwa kwa mda gani?" + suspend_reason_label: "Kwa nini umemsitisha kwa mda? Huu ujumbe utaonyeshwa kwa kila mtumiaji kwenye taarifa binafsi za huyo mtu na ataonyeshwa mtumiaji akijaribu kuingia. Andika ujumbe mfupi." + suspend_reason_hidden_label: "Kwa nini umemsitisha kwa mda? Huu ujumbe utaonyeshwa kwa mtumiaji akijaribu kuingia. Andika ujumbe mfupi." + suspend_reason: "Sababu" + suspend_reason_placeholder: "Sababu ya kusitisha kwa mda mfupi" + suspend_message: "Tuma Ujumbe kwa Barua Pepe" + suspend_message_placeholder: "Sio lazima, ila unaweza kutoa sababu za ziada kuhusiana na sitisho na itatumwa kwa mtumiaji." + suspended_by: "Amesitishwa kwa mda mfupi na" + silence_reason: "Sababu" + silenced_by: "Amenyamazishwa na" + silence_modal_title: "Nyamazisha Mtumiaji" + silence_duration: "Mtumiaji atanyamazishwa kwa mda gani?" + silence_reason_label: "Kwa nini unamnyamazisha mtumiaji?" + silence_reason_placeholder: "Nyamazisha Sababu" + silence_message: "Tuma ujumbe kwa Barua Pepe" + silence_message_placeholder: "(acha wazi kutuma ujumbe halisi au msingi)" + suspended_until: "(mpaka %{until})" + cant_suspend: "Mtumiaji huyu hawezi kusitishwa kwa mda." + delete_all_posts: "Futa machapisho yote" + penalty_post_actions: "Ungependa kufanya nini na taarifa shirika?" + penalty_post_delete: "Futa taarifa" + penalty_post_edit: "Hariri Taarifa" + penalty_post_none: "Usifanye chochote" + delete_all_posts_confirm_MF: "Unaenda kufuta {POSTS, plural, one {chapisho 1} other {machapisho #}} na {TOPICS, plural, one {mada 1} ziada {mada #}}. Una uhakika?" + silence: "Imenyamazishwa" + unsilence: "Imeruhusiwa" + silenced: "Nyamazishwa?" + moderator: "Msimamizi?" + admin: "Kiongozi?" + suspended: "Imesitishwa?" + show_admin_profile: "Msimamizi" + refresh_browsers: "Lazimisha uanzishaji upya wa kivinjari" + refresh_browsers_message: "Ujumbe umetumwa kwa watumiaji wote!" + show_public_profile: "Onyesha Taarifa za Umma" + impersonate: 'Chukua Utambulisho wa Mtu Mwingine' + action_logs: "Taarifa za Shughuli Tofauti" + ip_lookup: "Uangalizi wa anwani ya mtandao" + log_out: "Jitoe" + logged_out: "Mtumiaji amejitoa kwenye vifaa vyote vya kidigitali" + revoke_admin: 'Ondoa Usimamizi' + grant_admin: 'Toa Usimamizi' + grant_admin_confirm: "Tumekutumia barua pepe kuthibitisha Usimamizi wako Mpya. Tafadhali ifungue na fuata maelekezo." + revoke_moderation: 'Ondoa Uongozi' + grant_moderation: 'Toa Uongozi' + unsuspend: 'Ondoa Sitisho' + suspend: 'Sitisha' + show_flags_received: "Onyesha Bendera Zilizopokelewa" + flags_received_by: "Bendera zilizopokelewa na %{username}" + flags_received_none: "Mtumiaji hajapokea bendera zozote." + reputation: Sifa au Nemsi + permissions: Vibali + activity: Shughuli + like_count: Upendo Uliotolewa / Uliopokelewa + last_100_days: 'ndani ya siku 100 zilizopita' + private_topics_count: Mada Binafsi + posts_read_count: Machapisho Yaliosomwa + post_count: Machapisho Yaliotengenezwa + second_factor_enabled: Uthibitisho wa Pili Umewezeshwa + topics_entered: Mada Zilizosomwa + flags_given_count: Bendera Ulizotoa + flags_received_count: Bendera Ulizopokea + warnings_received_count: Maonyo Ulizopokea + flags_given_received_count: 'Bendera Zilizotolewa / Ulizopokea' + approve: 'Imethibitishwa' + approved_by: "imethibitishwa na" + approve_success: "Mtumiaji amekubaliwa na ametumiwa barua pepe yenye maelezo ya uanzishaji." + approve_bulk_success: "Umefanikiwa! Watumiaji wamethibitishwa na wamejulishwa." + time_read: "Mda wa Kusoma" + anonymize: "Mfanye Mtumiaji Asijulikane" + anonymize_confirm: "Una UHAKIKA unataka kufanya hii akaunti iwe ya mtu asiyejulikana? Kitendo hicho kitabadilisha jina la mtumiaji na barua pepe, na kuanzisha upya taarifa zote binafsi." + anonymize_yes: "Ndio, fanya hii akaunti iwe ya mtu asiyejulikana" + anonymize_failed: "Tatizo limetokea wakati wa kufanya akaunti iwe ya mtu asiyejulikana." + delete: "Futa Mtumiaji" + delete_forbidden_because_staff: "Viongozi na wasimamizi hawawezi kufutwa." + delete_posts_forbidden_because_staff: "Hauwezi kufuta machapisho yote za viongozi na wasimamizi." + cant_delete_all_posts: + one: "Hauwezi kufuta taarifa zote. Kuna taarifa ambazo ziliandikwa siku %{count}zilizopita. (The delete_user_max_post_age setting.)" + other: "Hauwezi kufuta machapisho yote. Kuna machapisho ambazo ziliandikwa siku %{count}zilizopita. (The delete_user_max_post_age setting.)" + cant_delete_all_too_many_posts: + one: "Hauwezi kufuta taarifa zote kwa sababu mtumiaji ana taarifa zaidi ya 1. (delete_all_posts_max)" + other: "Hauwezi kufuta machapisho yote kwa sababu mtumiaji ana machapisho zaidi ya %{count}. (delete_all_posts_max)" + delete_confirm: "Una UHAKIKA unataka kumfuta mtumiaji? Hii ni daima!" + delete_and_block: "Futa na fungiahii barua pepe na anwani ya mtandao" + delete_dont_block: "Futa" + deleting_user: "Inafuta mtumiaji" + deleted: "Mtumiaji amefutwa." + delete_failed: "Hitilafu imetokea wakati wa kumfuta mtumiaji. Hakikisha machapisho yake yote yamefutwa kabla ya kujaribu kumfuta mtumiaji." + send_activation_email: "Tuma Barua Pepe ya Uanzisho" + activation_email_sent: "Barua Pepe ya Uanzisho Imetumwa." + send_activation_email_failed: "Tatizo limetokea wakati wa kutuma barua pepe ya uanzisho. %{error}" + activate: "Anzisha akaunti ya mtumiaji" + activate_failed: "Tatizo limetokea wakati wa kuanzisha akaunti ya mtumiaji." + deactivate_account: "Sitisha Akaunti" + deactivate_failed: "Kumetokea tatizo wakati wa kumsitisha mtumiaji." + unsilence_failed: 'Tatizo limetokea wakati wa kumtoa mtumiaji kwenye ukimya.' + silence_failed: 'Tatizo limetokea wakati wa kumnyamazisha mtumiaji.' + silence_confirm: 'Una uhakika unataka kumnyamazisha mtumiaji? Hatoweza kuanzisha mada au kuandika machapisho.' + silence_accept: 'Ndio, mnyamazishe mtumiaji' + bounce_score: "Barua pepe zilizoshindwa kufika" + reset_bounce_score: + label: "Anza Upya" + title: "Rudisha bounce score iwe 0" + visit_profile: "Tembeleaukurasa wa mapendekezo ya mtumiaji kubadilisha taarifa zake binafsi " + deactivate_explanation: "Mtumiaji aliyesitishwa lazima ahakikishe barua yake tena." + suspended_explanation: "Mtumiaji aliyesimamishwa kwa mda hawezi kuingia." + silence_explanation: "Mtumiaji aliyenyamazishwa haruhusiwi kuandika taarifa au kuanzisha mada." + staged_explanation: "Mtuaji wa awali anaweza kuandika ujumbe kwa kutumia barua pepe kwenye mada mahsusi pekee." + bounce_score_explanation: + none: "Barua zimekuwa zinaenda kwenye hiyo barua pepe." + some: "Hivi karibuni barua zimekuwa haziendi kwenye hiyo barua pepe." + threshold_reached: "Barua haziendi kwenye barua pepe iliyotajwa." + trust_level_change_failed: "Kumekuwa na tatizo kwenye kubadilisha Kiwango cha Uaminifu cha Mtumiaji." + suspend_modal_title: "Simamisha Mtumiaji" + trust_level_2_users: "Watumiaji wenye Kiwango cha 2 cha Uaminifu" + trust_level_3_requirements: "Mahitaji ya Kiwango cha 3 cha uaminifu" + trust_level_locked_tip: "kiwango cha uaminifu kimefungwa, mfumo hauta mvusha au kumshusha mtu daraja" + trust_level_unlocked_tip: "kiwango cha uaminifu kimefunguliwa, mfumo unaweza kumvusha au kumshusha mtu daraja" + lock_trust_level: "Funga Kiwango cha Uaminifu" + unlock_trust_level: "Fungua Kiwango cha Uaminifu" + tl3_requirements: + title: "Mahitaji ya Kiwango cha 3 cha uaminifu" + value_heading: "Thamani" + requirement_heading: "Kinachohitajika" + visits: "Waliotembelea" + days: "siku" + topics_replied_to: "Mada Zilizopata Majibu" + topics_viewed: "Mada Zilizoonwa " + topics_viewed_all_time: "Mada Zilizoonwa (Mda Wote) " + posts_read: "Machapisho Yaliosomwa" + posts_read_all_time: "Machapisho Yaliosomwa (Mda Wote)" + flagged_posts: "Machapisho yalioripotiwa" + flagged_by_users: "Watumiaji walioripoti" + likes_given: "Umetoa Likes" + likes_received: "Umepokea Likes" + likes_received_days: "Umepokea Likes: siku za kipekee" + likes_received_users: "Umepokea Likes: watumiaji wakipekee" + qualifies: ".Umefuzu kufika Hatua ya 3 ya Uaminifu." + does_not_qualify: "Haujafuzu kufika Hatua ya 3 ya Uaminifu." + will_be_promoted: "Hivi Karibuni utapanda Daraja." + will_be_demoted: "Hivi Karibuni utashushwa Daraja." + on_grace_period: "Kwa sasa upo kwenye kipindi cha kupanda daraja, hautashushwa daraja." + locked_will_not_be_promoted: "Kiwango cha Uaminifu kimefungwa. Hautawai kupanda daraja." + locked_will_not_be_demoted: "Kiwango cha Uaminifu kimefungwa. Hautashushwa Daraja." + sso: + title: "Ingia Mara Moja" + external_id: "Utambulisho wa kutoka nje" + external_username: "Jina la mtumiaji" + external_name: "Jina" + external_email: "Barua Pepe" + external_avatar_url: "Linki au kiungo cha Picha ya Mtumiaji" + user_fields: + title: "Sehemu za Watumiaji" + help: "Ongeza sehemu za taarifa ambazo watumiaji wanahitaji kujaza." + create: "Tengeneza Sehemu za Taarifa za Mtumiaji" + untitled: "Hakuna Kichwa cha Taarifa" + name: "Jina la Sehemu ya Taarifa" + type: "Aina ya Taarifa" + description: "Sehemu ya Maelezo" + save: "Hifadhi" + edit: "Hariri" + delete: "Futa" + cancel: "Ghairi" + delete_confirm: "Una uhakika unataka kufuta sehemu ya taarifa ya mtumiaji?" + options: "Machaguo" + required: + title: "Inahitajika wakati wa kujiunga?" + enabled: "muhimu" + disabled: "sio muhimu" + editable: + title: "Inaweza kufanyiwa uhariri baada ya kujiunga?" + enabled: "inaweza kufanyiwa uhariri" + disabled: "haiwezi kufanyiwa uhariri" + show_on_profile: + title: "Imeonyeshwa kwenye maelezo mafupi ya mtumiaji yanayo onwa na umma?" + enabled: "imeonyeshwa kwenye maelezo mafupi ya mtumiaji" + disabled: "haijaonyeshwa kwenye maelezo mafupi ya mtumiaji" + show_on_user_card: + title: "Onyesha kwenye kadi ya mtumiaji?" + enabled: "onyesha kwenye kadi ya mtumiaji" + disabled: "usioneshe kwenye kadi ya mtumiaji" + field_types: + text: 'Sehemu ya kuweka Taarifa' + confirm: 'Uhakikisho' + dropdown: "Shusha Chini" + site_text: + description: "Unaweza kufanya maneno ya jamii yako yawe unavyotaka wewe. Tafadhali anza kwa kufanya utafiti hapo chini:" + search: "tafuta maneno ambayo ungependa kuhariri" + title: 'Maandishi' + edit: 'hariri' + revert: "Ondoa Mabadiliko" + revert_confirm: "Una uhakika unataka kuondoa mabadiliko?" + go_back: "Rudi kwenye Utafiti" + recommended: "Tunakushauri ugeuze maneno yafuatayo yaweze kufaa mahitaji yako:" + show_overriden: 'Onyesha vilivyobatilishwa pekee' + settings: + show_overriden: 'Onyesha vilivyobatilishwa pekee' + reset: 'weka au anza upya' + none: 'bila' + site_settings: + title: 'Mpangilio' + no_results: "Hakuna Majibu Yaliyopatikana" + clear_filter: "Futa" + add_url: "ongeza anwani ya mtandao" + add_host: "ongeza mwenyeji" + uploaded_image_list: + label: "Hariri orodha " + empty: "Hakuna picha ,Tafadhali pakia moja." + upload: + label: "Pakia" + title: "Pakia picha" + categories: + all_results: 'Zote' + required: 'Muhimu na Inahitajika' + basic: 'Utaratibu wa Kwanza' + users: 'Watumiaji' + posting: 'Kuweka Ujumbe' + email: 'Barua Pepe' + files: 'Mafaili' + trust: 'Viwango vya Uaminifu' + security: 'Ulinzi' + onebox: "Onebox" + seo: 'Uwezo wa Kupatikana kwenye Mitandao ya Utafutaji kama Google, Yahoo na Bing kwa urahisi' + spam: 'Sio muhimu' + rate_limits: 'Kikomo cha Viwango ' + developer: 'Mtengenezaji' + embedding: "Kuambatanisha" + legal: "Halali" + api: 'API' + user_api: 'API ya Mtumiaji' + uncategorized: 'Nyingine' + backups: "Chelezo" + login: "Ingia" + plugins: "Programu Jalizi" + user_preferences: "Mapendekezo ya Mtumiaji" + tags: "Lebo" + search: "Tafuta" + groups: "Vikundi" + badges: + title: Beji + new_badge: Beji Mpya + new: Mpya + name: Jina + badge: Beji + display_name: Jina la Kutumia + description: Maelezo + long_description: Maelezo Marefu + badge_type: Aina ya beji + badge_grouping: Kikundi + badge_groupings: + modal_title: VIkundi vya beji + granted_by: Imetolewa na + granted_at: Imetolewa wakati wa + reason_help: (Kiungo cha taarifa au ujumbe) + save: Hifadhi + delete: Futa + delete_confirm: "Una uhakika unata kufuta hii beji?" + revoke: Nyang'anya + reason: Sababu + expand: Ongeza & hellip; + revoke_confirm: "Una uhakika unataka kutoa hii beji?" + edit_badges: Hariri Beji + grant_badge: Toa Beji + granted_badges: Beji Zilizotolewa + grant: Toa + no_user_badges: "%{name} hajapewa beji yoyote." + no_badges: Hakuna beji za kutolewa. + none_selected: "Chagua beji ya kuanzia" + allow_title: Ruhusu beji iweze kutumika kama cheo + multiple_grant: Inaweza kutolewa mara nyingi + listable: Onyesha beji kwenye karatasi ya beji ya umma + enabled: Ruhusu beji + icon: ikoni + image: Picha + query: Maswala ya Beji (SQL) + target_posts: Maswala ya kulenga machapisho + auto_revoke: Fanya maswala ya kitanguo kila siku + show_posts: Onyesha taarifa za kutoa beji kwenye karatasi ya beji + trigger: Anzisha + trigger_type: + none: "Sasisha kila siku" + post_action: "Mtumiaji akifanya kitendo kwenye taarifa" + post_revision: "Mtumiaji akiwa amehariri au tengeneza taarifa" + trust_level_change: "Mtumiaji akiwa amebadilisha kiwango cha uaminifu" + user_change: "Mtumiaji akiwa amefanyiwa uhariri au ametengenezwa" + post_processed: "Baada ya taarifa kupitia mchakato" + preview: + link_text: "Mwonekano wa kwanza wa beji zilizotolewa" + modal_title: "Muonekano wa Awali wa Swala la Beji" + sql_error_header: "Hitilafu imetokea kuhusiana na hilo swali." + error_help: "Tembelea viungo vifuatavyo ili upate msaada zaidi kuhusiana na maswala ya beji." + bad_count_warning: + header: "ONYO!" + no_grant_count: "Hakuna beji iliyopewa." + sample: "Sampuli:" + grant: + with: "%{username}" + with_post: "%{username}ndani ya ujumbe wa %{link}" + with_post_time: "%{username} ndani ya ujumbe wa %{link} kwenye %{time}" + with_time: "%{username} kwenye %{time}" + emoji: + title: "Emoji" + help: "Ongeza emoji mpya ambayo itapatikana kwa kila mtu. (USHAURI: unaweza kuweka zaidi ya faili moja mara moja)" + add: "Ongeza Emoji Mpya" + name: "Jina" + image: "Picha" + delete_confirm: "Una uhakika unataka kufuta emoji ya :%{name}: ?" + embedding: + get_started: "Kama ungependa kuambatanisha Discourse kwenye tovuti nyingine, anza kwa kuandika taarifa zake." + confirm_delete: "Una uhakika unataka kumfuta mwenyeji?" + title: "Ambatanisha" + host: "Ruhusu Wenyeji" + class_name: "Jina la Class" + path_whitelist: "Njia au anwani Zilizoruhusiwa" + edit: "hariri" + category: "Andika kwenye Kikundi" + add_host: "Ongeza Mwenyeji" + settings: "Mipangilio iliopachikwa" + feed_settings: "Mipangilio ya Taarifa nyingi" + feed_description: "Taarifa za RSS/ATOM za tovuti yako zinaweza kusaidia Discourse kuingiza taarifa zako kwa urahisi zaidi." + crawling_settings: "Mipangilio ya kutembelea taarifa" + crawling_description: "Discourse ikitengeneza mada za machapisho yako, kama hakuna taarifa kutoka kwa RSS/ATOM itajaribu kupata maneno kutoka kwenye HTML yako. Kuna changamoto zinazotokea wakati wa kupata hizo taarifa, tunakuruhusu uchague kanuni za CSS ili upatikanaji wa machapisho uwe rahisi zaidi." + embed_by_username: "Jina la mtumiaji kwa ajili ya kutengeneza mada" + embed_post_limit: "Kiwango cha Juu cha Kupachika machapisho" + embed_username_key_from_feed: "Ufunguo wa kuvuta majina ya watumiaji wa discourse kutoka kwenye taarifa nyingi" + embed_title_scrubber: "Neno linalotumika kufuta vichwa vya machapisho" + embed_truncate: "Fupisha machapisho yaliyopachikwa" + embed_classname_whitelist: "Ruhusu majina ya madarasa ya CSS " + feed_polling_enabled: "Ingiza machapisho kupitia RSS/ATOM" + feed_polling_url: "Anwani ya mtandao ya taarifa za RSS/ATOM za kutembelea" + feed_polling_frequency_mins: "Uchaguzi wa taarifa unarudia mara (ndani ya dakika)" + save: "Hifadhi Mipangilio Iliyopachikwa" + permalink: + title: "Anwani za mtandao" + url: "Anwani ya mtandao" + topic_id: "Utambulisho wa Mada" + topic_title: "Mada" + post_id: "Utambulisho wa Ujumbe" + post_title: "Ujumbe" + category_id: "Utambulisho wa kikundi" + category_title: "Kikundi" + external_url: "Anwani ya mtandao kutoka nje" + delete_confirm: "Una uhakika unataka kufuta hii link kiungo?" + form: + label: "Mpya:" + add: "Ongeza" + filter: "Tafuta (URL au Kiungo cha nje)" + wizard_js: + wizard: + done: "Imekwisha" + back: "Iliyopita" + next: "Ijayo" + step: "%{current} chini ya %{total}" + upload: "Ongeza" + uploading: "Inaongezwa" + upload_error: "Samahani, hitilafu imetokea wakati wa kupakia faili hilo. Tafadhali jaribu tena." + quit: "Labda Baadae" + invites: + add_user: "ongeza" + none_added: "Haujakaribisha Msaidizi yoyote. Unauhakika ungependa kuendelea?" + roles: + admin: "Msimamizi" + moderator: "Msimamizi" + regular: "Mtumiaji wa Kawaida" + previews: + topic_title: "Mada inayojadiliwa" + share_button: "Shirikisha" + reply_button: "Jibu" diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 9b6d66cd77..f3bd731877 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -8,6 +8,9 @@ te: js: number: + format: + separator: "." + delimiter: "," human: storage_units: format: '%n %u' @@ -30,55 +33,60 @@ te: long_date_with_year_without_time: "MMM D, 'YY" long_date_without_year_with_linebreak: "MMM D
LT" long_date_with_year_with_linebreak: "MMM D, 'YY
LT" + wrap_ago: "%{date} à°•à±à°°à°¿à°¤à°‚" tiny: half_a_minute: "< 1ని" less_than_x_seconds: - one: < 1సె - other: < %{count}సె + one: "< 1సె" + other: "< %{count}సె" x_seconds: - one: 1సె - other: '%{count}సె' + one: "1సె" + other: "%{count}సె" x_minutes: - one: 1ని - other: '%{count}ని' + one: "1ని" + other: "%{count}ని" about_x_hours: - one: 1à°— - other: '%{count}à°—à°‚' + one: "1à°—" + other: "%{count}à°—à°‚" x_days: - one: 1రో - other: '%{count}రో' + one: "1రో" + other: "%{count}రో" about_x_years: - one: 1సం - other: '%{count}సం' + one: "1సం" + other: "%{count}సం" over_x_years: - one: '> 1సం' - other: '> %{count}సం' + one: "> 1సం" + other: "> %{count}సం" almost_x_years: - one: 1సం - other: '%{count}సం' + one: "1సం" + other: "%{count}సం" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 నిమిషం - other: '%{count} నిమిషాలà±' + one: "1 నిమిషం" + other: "%{count} నిమిషాలà±" x_hours: - one: 1 à°—à°‚à°Ÿ - other: '%{count} à°—à°‚à°Ÿà°²à±' + one: "1 à°—à°‚à°Ÿ" + other: "%{count} à°—à°‚à°Ÿà°²à±" x_days: - one: 1 రోజౠ- other: '%{count} రోజà±à°²à±' + one: "1 రోజà±" + other: "%{count} రోజà±à°²à±" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: 1 నిమిషం à°®à±à°‚దౠ- other: '%{count} నిమిషాలౠమà±à°‚à°¦à±' + one: "1 నిమిషం à°®à±à°‚à°¦à±" + other: "%{count} నిమిషాలౠమà±à°‚à°¦à±" x_hours: - one: 1 à°—à°‚à°Ÿ à°•à±à°°à°¿à°¤à°‚ - other: '%{count} à°—à°‚à°Ÿà°² à°®à±à°‚à°¦à±' + one: "1 à°—à°‚à°Ÿ à°•à±à°°à°¿à°¤à°‚" + other: "%{count} à°—à°‚à°Ÿà°² à°®à±à°‚à°¦à±" x_days: - one: 1 రోజౠమà±à°‚దౠ- other: '%{count} రోజà±à°² à°®à±à°‚à°¦à±' + one: "1 రోజౠమà±à°‚à°¦à±" + other: "%{count} రోజà±à°² à°®à±à°‚à°¦à±" + later: + x_days: + one: "1 రోజౠతరà±à°µà°¾à°¤" + other: "%{count} రోజà±à°² తరà±à°µà°¾à°¤" previous_month: 'à°—à°¤ నెల' next_month: 'తరà±à°µà°¾à°¤ నెల' placeholder: తేదీ @@ -110,13 +118,13 @@ te: show_help: "à°à°šà±à°šà°¿à°•ాలà±" links: "లంకెలà±" links_lowercase: - one: లంకె - other: లంకెలౠ+ one: "లంకె" + other: "లంకెలà±" faq: "తవసం" guidelines: "మారà±à°—దరà±à°¶à°•ాలà±" privacy_policy: "అంతరంగికతా విధానం" privacy: "అంతరంగికత" - terms_of_service: "సేవా నిబంధనలౠ" + tos: "సేవా నిబంధనలà±" mobile_view: "à°šà°° సందరà±à°¶à°¨à°‚" desktop_view: "డెసà±à°•ౠటాపౠసందరà±à°¶à°¨à°‚" you: "మీరà±" @@ -134,8 +142,8 @@ te: max_of_count: "{{count}} à°—à°°à°¿à°·à±à°Ÿà°‚" alternation: "లేదా" character_count: - one: '{{count}} à°…à°•à±à°·à°°à°‚' - other: '{{count}} à°…à°•à±à°·à°°à°¾à°²à±' + one: "{{count}} à°…à°•à±à°·à°°à°‚" + other: "{{count}} à°…à°•à±à°·à°°à°¾à°²à±" suggested_topics: title: "సూచించే విషయాలà±" about: @@ -146,9 +154,12 @@ te: our_moderators: "మా నిరà±à°µà°¾à°¹à°•à±à°²à±" stat: all_time: "ఆలౠటైమà±" + last_7_days: "చివరి 7" + last_30_days: "చివరి 30" like_count: "ఇషà±à°Ÿà°¾à°²à±" topic_count: "విషయాలà±" post_count: "టపాలà±" + user_count: "వాడà±à°•à°°à±à°²à±" active_user_count: "à°•à±à°°à°¿à°¯à°¾à°¶à±€à°² సభà±à°¯à±à°²à±" contact: "మమà±à°®à± సంపà±à°°à°¦à°¿à°‚à°šà°‚à°¡à°¿" contact_info: "à°ˆ సంధరà±à°­à°‚లో à°•à±à°²à°¿à°·à±à°Ÿà°®à±ˆà°¨ సమసà±à°¯ లేదా à°…à°¤à±à°¯à°µà°¸à°° విషయం సైటౠనౠపà±à°°à°­à°¾à°µà°¿à°¤à°‚ చేసà±à°¤à±à°‚ది, దయచేసి మమà±à°®à°²à±à°¨à°¿ సంపà±à°°à°¦à°¿à°‚à°šà°‚à°¡à°¿ %{contact_info}." @@ -185,7 +196,10 @@ te: search: "పేరà±, యూఆరౠయలà±, à°à°¡à±€ లనౠబటà±à°Ÿà°¿ విషయానà±à°¨à°¿ వెతà±à°•à±." placeholder: "ఇకà±à°•à°¡ విషయపౠశీరà±à°·à°¿à°• రాయండి" queue: + approve: 'అంగీకరించà±' + reject: 'తిరసà±à°•à°°à°¿à°‚à°šà±' cancel: "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿" + confirm: "మారà±à°ªà±à°²à°¨à± à°­à°¦à±à°°à°ªà°°à°šà±" approval: ok: "సరే" user_action: @@ -205,7 +219,27 @@ te: directory: title: "వాడà±à°•à°°à±à°²à±" groups: + manage: + name: 'పేరà±' + full_name: 'పూరà±à°¤à°¿ పేరà±' + logs: + details: "వివరాలà±" + membership: "సభà±à°¯à°¤à±à°µà°‚" + name: "పేరà±" + user_count: "వాడà±à°•à°°à±à°²à±" + index: + public: "బహిరంగం" + private: "అంతరంగికం" + is_group_user: "సభà±à°¯à±à°¡à±" + is_group_owner: "యజమాని" + activity: "కారà±à°¯à°•లాపం" + members: + filter_placeholder: "వాడà±à°•à°°à°¿ పేరà±" + owner: "యజమాని" + topics: "విషయాలà±" posts: "టపాలà±" + mentions: "à°ªà±à°°à°¸à±à°¤à°¾à°µà°¨à°²à±" + messages: "సందేశాలà±" alias_levels: nobody: "ఎవరూకాదà±" only_admins: "కేవలం అధికారà±à°²à±‡" @@ -226,6 +260,8 @@ te: all: "à°…à°¨à±à°¨à°¿ వరà±à°—ాలà±" no_subcategory: "à°à°¦à±€à°•ాదà±" category: "వరà±à°—à°‚" + reorder: + apply_all: "ఆపాదించà±" posts: "టపాలà±" topics: "విషయాలà±" latest: "తాజా" @@ -233,8 +269,8 @@ te: toggle_ordering: "వరà±à°¸ నియంతà±à°°à°£à°¨à± à°…à°Ÿà±à°‡à°Ÿà±à°šà±‡à°¯à°¿" subcategories: "ఉప వరà±à°—ాలà±" topic_stat_sentence: - one: '%{unit} కాలంలో %{count} à°’à°• కొతà±à°¤ టపా.' - other: ' %{unit} గతంలో %{count} కొతà±à°¤ విషయాలà±.' + one: "%{unit} కాలంలో %{count} à°’à°• కొతà±à°¤ టపా." + other: " %{unit} గతంలో %{count} కొతà±à°¤ విషయాలà±." ip_lookup: title: à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ à°²à±à°•పౠhostname: అతిథిపేరౠ@@ -263,6 +299,7 @@ te: invited_by: "ఆహà±à°µà°¾à°¨à°¿à°šà°¿à°¨à°µà°¾à°°à±" trust_level: "నమà±à°®à°•పౠసà±à°¥à°¾à°¯à°¿" notifications: "à°ªà±à°°à°•టనలà±" + statistics: "గణాంకాలà±" dismiss_notifications_tooltip: "à°…à°¨à±à°¨à°¿ చదవని à°ªà±à°°à°•టనలూ చదివినటà±à°Ÿà± à°—à±à°°à±à°¤à°¿à°‚à°šà±" disable_jump_reply: "నేనౠజవాబిచà±à°šà°¾à°• నా టపాకౠవెళà±à°²à°µà°¦à±à°¦à±" external_links_in_new_tab: "à°…à°¨à±à°¨à°¿ బాహà±à°¯ లంకెలనూ కొతà±à°¤ à°Ÿà±à°¯à°¾à°¬à±à°²à±‹ తెరà±à°µà±" @@ -275,6 +312,7 @@ te: suspended_notice: "à°ˆ సభà±à°¯à±à°¡à± {{date}} వరకూ ససà±à°ªà±†à°‚à°¡à°¯à±à°¯à°¾à°¡à±" suspended_reason: "కారణం:" github_profile: "గిటౠహబà±" + tag_settings: "à°Ÿà±à°¯à°¾à°—à±à°²à±" watched_categories: "à°’à°•à°•à°¨à±à°¨à±‡à°¸à°¾à°°à±" tracked_categories: "గమనించారà±" muted_categories: "నిశà±à°¶à°¬à±à°¦à°‚" @@ -284,6 +322,7 @@ te: unread_message_count: "సందేశాలà±" admin_delete: "తొలగించà±" users: "వాడà±à°•à°°à±à°²à±" + theme: "అలంకారం" staff_counters: flags_given: "సహాయకారి కేతనాలà±" flagged_posts: "కేతనించిన టపాలà±" @@ -292,6 +331,9 @@ te: warnings_received: "హెచà±à°šà°°à°¿à°•à°²à±" messages: all: "à°…à°¨à±à°¨à±€" + preferences_nav: + account: "ఖాతా" + categories: "వరà±à°—ాలà±" change_password: success: "(ఈమెయిలౠపంపిన)" in_progress: "(ఈమెయిలౠపంపà±à°¤à±‹à°¨à±à°¨à°¾à°‚)" @@ -331,6 +373,8 @@ te: authenticated: "మీ ఈమెయిలౠ{{provider}} చేత à°¦à±à°°à±à°µà±€à°•రించబడింది" name: title: "పేరà±" + instructions: "మీ పూరà±à°¤à°¿ పేరౠ(à°à°šà±à°›à°¿à°•à°‚)" + instructions_required: "మీ పూరà±à°¤à°¿ పేరà±" too_short: "మీ పేరౠమరీ à°šà°¿à°¨à±à°¨à°¦à°¿" ok: "మీ పేరౠబాగà±à°‚ది" username: @@ -338,6 +382,7 @@ te: short_instructions: "జనాలౠమిమà±à°®à°²à±à°¨à°¿ @{{username}} అని à°ªà±à°°à°¸à±à°¤à°¾à°µà°¿à°‚చవచà±à°šà±" available: "మీ సభà±à°¯à°¨à°¾à°®à°‚ à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ ఉంది." not_available: "à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ లేదà±. {{suggestion}} à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿?" + not_available_no_suggestion: "à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ లేదà±" too_short: "మీ సభà±à°¯à°¨à°¾à°®à°‚ మరీ à°šà°¿à°¨à±à°¨à°¦à°¿" too_long: "మీ సభà±à°¯à°¨à°¾à°®à°‚ మరీ పొడà±à°—à±" checking: "సభà±à°¯à°¨à°¾à°®à°‚ à°…à°‚à°¦à±à°¬à°¾à°Ÿà± పరిశీలిసà±à°¤à±à°¨à±à°¨à°¾à°‚..." @@ -356,6 +401,10 @@ te: location: "à°ªà±à°°à°¾à°‚తం" website: "వెబౠసైటà±" email_settings: "ఈమెయిలà±" + like_notification_frequency: + always: "à°Žà°²à±à°²à°ªà±à°ªà±à°¡à±‚" + email_previous_replies: + always: "à°Žà°²à±à°²à°ªà±à°ªà±à°¡à±‚" email_digests: daily: "à°ªà±à°°à°¤à±€à°°à±‹à°œà±" every_three_days: "à°ªà±à°°à°¤à°¿ మూడౠరోజà±à°²à°•à±€" @@ -370,6 +419,7 @@ te: auto_track_topics: "నేనౠరాసే విషయాలౠఆటోమేటిగà±à°—à°¾ గమనించà±" auto_track_options: never: "à°Žà°ªà±à°ªà°Ÿà°¿à°•à±€ వదà±à°¦à±" + immediately: "వెంటనే" invited: search: "ఆహà±à°µà°¾à°¨à°¾à°²à°¨à± వెతకడానికి రాయండి ... " title: "ఆహà±à°µà°¾à°¨à°¾à°²à±" @@ -397,7 +447,9 @@ te: same_as_username: "మీ సంకేతపదం మీ వినియోగదారà±à°ªà±‡à°°à± ని పోలి ఉంది." same_as_email: "మీ సంకేతపదం మీ ఈమెయిలౠనౠపోలి ఉంది." ok: "మీ సంకేతపదం బాగà±à°‚ది." - associated_accounts: "లాగినà±à°²à±" + summary: + title: "సారాంశం" + stats: "గణాంకాలà±" ip_address: title: "చివరి à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾" registration_ip_address: @@ -456,8 +508,6 @@ te: disabled_description: "à°ˆ విషయంలోని తొలగించిన టపాలౠచూపà±à°¤à±à°¨à±à°¨à°¾à°®à±." enable: "తొలగించిన టపాలౠదాయà±" disable: "తొలగించిన టపాలౠచూపà±" - private_message_info: - invite: "ఇతరà±à°²à°¨à± ఆహà±à°µà°¾à°¨à°¿à°‚à°šà±" email: 'ఈమెయిలà±' username: 'వాడà±à°•à°°à°¿ పేరà±' last_seen: 'చూసిన' @@ -478,6 +528,8 @@ te: complete_email_found: "మేమౠఈ ఈమెయిలౠ%{email} తో సరిపోయే à°’à°• ఖాతా à°•à°¨à±à°—ొనà±à°¨à°¾à°®à±, మీకౠఅతి à°¤à±à°µà°°à°²à±‹ సంకేతపదం రీసెటౠచేసే సూచనలతో కూడిన ఈమెయిలౠవసà±à°¤à±à°‚ది." complete_username_not_found: "మీ సభà±à°¯à°¨à°¾à°®à°‚ %{username} తో ఠఖాతా సరిపోవడంలేదà±." complete_email_not_found: "%{email} తో ఠఖాతా సరిపోవడంలేదà±" + button_ok: "సరే" + button_help: "సహాయం" login: title: "లాగినà±" username: "వాడà±à°•à°°à°¿" @@ -497,9 +549,6 @@ te: admin_not_allowed_from_ip_address: "మీరౠఆ IP à°šà°¿à°°à±à°¨à°¾à°®à°¾ à°¨à±à°‚à°¡à°¿ నిరà±à°µà°¾à°¹à°•à±à°¨à°¿ వలె లాగినౠకాలేరà±." resend_activation_email: "చేతన ఈమెయిలౠమరలా పంపడానికి ఇకà±à°•à°¡ నొకà±à°•à°‚à°¡à°¿." sent_activation_email_again: "మీకౠ{{currentEmail}} మరో చేతన ఈమెయిలౠపంపామà±. అది చేరà±à°•ోడానికి కొదà±à°¦à°¿ నిమిషాలౠపటà±à°Ÿà°µà°šà±à°šà±. ఇంకా à°¸à±à°ªà°¾à°®à± ఫోలà±à°¡à°°à± చూడటం మరà±à°šà°¿à°ªà±‹à°•à°‚à°¡à°¿ à°¸à±à°®à°¾. " - google: - title: "గూగà±à°²à± తో" - message: "గూగà±à°²à± à°¦à±à°µà°¾à°°à°¾ లాగినౠ(పాపపౠలౠఅనà±à°®à°¤à°¿à°‚à°šà±à°Ÿ మరà±à°šà°¿à°ªà±‹à°•à°‚à°¡à°¿)" google_oauth2: title: "గూగà±à°²à± తో" message: "గూగà±à°²à± à°¦à±à°µà°¾à°°à°¾ లాగినౠ(పాపపౠలౠఅనà±à°®à°¤à°¿à°‚à°šà±à°Ÿ మరà±à°šà°¿à°ªà±‹à°•à°‚à°¡à°¿)" @@ -515,7 +564,21 @@ te: github: title: "గిటౠహబౠతో" message: "గిటౠహబౠదà±à°µà°¾à°°à°¾ లాగినౠ(పాపపౠలౠఅనà±à°®à°¤à°¿à°‚à°šà±à°Ÿ మరà±à°šà°¿à°ªà±‹à°•à°‚à°¡à°¿)" + invites: + accept_title: "ఆహà±à°µà°¾à°¨à°‚" + name_label: "పేరà±" + optional_description: "(à°à°šà±à°›à°¿à°•à°‚)" + emoji_set: + google: "గూగà±à°²à±" + twitter: "à°Ÿà±à°µà°¿à°Ÿà±à°Ÿà°°à±" + category_page_style: + categories_only: "వరà±à°—ాలౠమాతà±à°°à°®à±‡" + emoji_picker: + people: à°ªà±à°°à°œà°²à± + nature: à°ªà±à°°à°•ృతి + food: ఆహారం composer: + options: "ఎంపికలà±" add_warning: "ఇది à°’à°• అధికారిక హెచà±à°šà°°à°¿à°•" posting_not_on_topic: "ఠవిషయానికి మీరౠజవాబివà±à°µà°¾à°²à°¨à±à°•à±à°‚à°Ÿà±à°¨à±à°¨à°¾à°°à±? " saved_draft_tip: "à°­à°¦à±à°°à°‚" @@ -564,6 +627,8 @@ te: ulist_title: "à°šà±à°•à±à°•à°² జాబితా" list_item: "జాబితా à°…à°‚à°¶à°‚" help: "మారà±à°•ౠడైనౠసవరణ సహాయం" + modal_ok: "సరే" + modal_cancel: "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿" admin_options_title: "à°ˆ విషయానికి à°à°šà±à°šà°¿à°• సిబà±à°¬à°‚ది అమరికలà±" notifications: none: "à°ˆ సమయంలో à°ªà±à°°à°•టనలౠచూపలేకà±à°¨à±à°¨à°¾à°®à±." @@ -583,6 +648,7 @@ te: no_results: "à°Žà°Ÿà±à°µà°‚à°Ÿà°¿ ఫలితాలౠదొరకలేదà±." searching: "వెతà±à°•à±à°¤à±à°¨à±à°¨à°¾à°®à±..." post_format: "{{username}} à°¨à±à°‚à°¡à°¿ #{{post_number}}" + search_google_button: "గూగà±à°²à±" context: user: "@{{username}} యొకà±à°• విషయాలౠవెతà±à°•à±" topic: "à°ˆ విషయంలో వెతà±à°•à±" @@ -600,8 +666,8 @@ te: archive_topics: "విషయాలౠకటà±à°Ÿà°•à°Ÿà±à°Ÿà±" choose_new_category: "విషయం కొరకౠకొతà±à°¤ వరà±à°—à°‚ à°Žà°‚à°šà±à°•ొండి:" selected: - one: మీరౠ1 విషయం à°Žà°‚à°šà±à°•à±à°¨à±à°¨à°¾à°°à±. - other: ' మీరౠ{{count}} విషయాలౠఎంచà±à°•à±à°¨à±à°¨à°¾à°°à±.' + one: "మీరౠ1 విషయం à°Žà°‚à°šà±à°•à±à°¨à±à°¨à°¾à°°à±." + other: " మీరౠ{{count}} విషయాలౠఎంచà±à°•à±à°¨à±à°¨à°¾à°°à±." none: unread: "మీరౠచదవని విషయాలౠలేవà±" new: "మీకౠకొతà±à°¤ విషయాలౠలేవà±" @@ -629,10 +695,10 @@ te: new: 'కొతà±à°¤ విషయం' unread: 'చదవని' new_topics: - one: 1 కొతà±à°¤ విషయం + one: '1 కొతà±à°¤ విషయం' other: '{{count}} కొతà±à°¤ విషయాలà±' unread_topics: - one: 1 చదవని విషయం + one: '1 చదవని విషయం' other: '{{count}} చదవని విషయాలà±' title: 'విషయం' invalid_access: @@ -646,17 +712,17 @@ te: title: "విషయం కనిపించలేదà±" description: "à°•à±à°·à°®à°¿à°‚చాలి. à°† విషయం మేమౠకనà±à°—ొనలేకà±à°¨à±à°¨à°¾à°®à±. బహà±à°¶à°¾ నిరà±à°µà°¾à°¹à°•à±à°²à± దానà±à°¨à°¿ తొలగించారేమో?" total_unread_posts: - one: మీకౠఈ విషయంలో 1 చదవని టపా ఉంది - other: మీకౠఈ విషయంలో {{count}} చదవని టపాలౠఉనà±à°¨à°¾à°¯à°¿ + one: "మీకౠఈ విషయంలో 1 చదవని టపా ఉంది" + other: "మీకౠఈ విషయంలో {{count}} చదవని టపాలౠఉనà±à°¨à°¾à°¯à°¿" unread_posts: - one: మీకౠఈ విషయంలో 1 చదవని పాత టపా ఉంది - other: మీకౠఈ విషయంలో {{count}} చదవని పాత టపాలౠఉనà±à°¨à°¾à°¯à°¿ + one: "మీకౠఈ విషయంలో 1 చదవని పాత టపా ఉంది" + other: "మీకౠఈ విషయంలో {{count}} చదవని పాత టపాలౠఉనà±à°¨à°¾à°¯à°¿" new_posts: - one: మీరౠచివరసారి చదివాక à°ˆ విషయంలో 1 కొతà±à°¤ టపా వచà±à°šà°¿à°‚ది - other: మీరౠచివరసారి చదివాక à°ˆ విషయంలో {{count}} కొతà±à°¤ టపాలౠవచà±à°šà°¾à°¯à°¿ + one: "మీరౠచివరసారి చదివాక à°ˆ విషయంలో 1 కొతà±à°¤ టపా వచà±à°šà°¿à°‚ది" + other: "మీరౠచివరసారి చదివాక à°ˆ విషయంలో {{count}} కొతà±à°¤ టపాలౠవచà±à°šà°¾à°¯à°¿" likes: - one: à°ˆ విషయానికి 1 ఇషà±à°Ÿà°‚ ఉంది - other: à°ˆ విషయానికి {{count}} ఇషà±à°Ÿà°¾à°²à± ఉనà±à°¨à°¾à°¯à°¿ + one: "à°ˆ విషయానికి 1 ఇషà±à°Ÿà°‚ ఉంది" + other: "à°ˆ విషయానికి {{count}} ఇషà±à°Ÿà°¾à°²à± ఉనà±à°¨à°¾à°¯à°¿" back_to_list: "విషయాల జాబితాకౠమరలà±" options: "విషయపౠà°à°šà±à°šà°¿à°•ాలà±" show_links: "à°ˆ విషయంలో లంకెలౠచూపà±" @@ -669,7 +735,18 @@ te: jump_reply_up: పాత జవాబà±à°•ౠవెళà±à°²à± jump_reply_down: తరà±à°µà°¾à°¤à°¿ జవాబà±à°•ౠవెళà±à°²à± deleted: "à°ˆ విషయం తొలగించబడింది" + auto_update_input: + tomorrow: "రేపà±" + this_weekend: "à°ˆ వారాంతం" + next_week: "వచà±à°šà±‡ వారం" + two_weeks: "రెండౠవారాలà±" + next_month: "వచà±à°šà±‡ నెల" + three_months: "మూడౠనెలలà±" + six_months: "ఆరౠనెలలà±" auto_close_title: 'à°¸à±à°µà±€à°¯ à°®à±à°—ింపౠఅమరికలà±' + timeline: + back: "వెనà±à°•à°•à±" + replies_short: "%{current} / %{total}" progress: title: విషయపౠపà±à°°à±‹à°—తి go_top: "à°…à°—à±à°°" @@ -735,8 +812,8 @@ te: login_reply: 'జవాబివà±à°µà°¡à°¾à°¨à°¿à°•à°¿ లాగినౠఅవà±à°µà°‚à°¡à°¿' filters: n_posts: - one: 1 టపా - other: '{{count}} టపాలà±' + one: "1 టపా" + other: "{{count}} టపాలà±" cancel: "జలà±à°²à±†à°¡ తొలగించà±" split_topic: title: "కొతà±à°¤ విషయానికి జరà±à°ªà±" @@ -744,15 +821,15 @@ te: topic_name: "కొతà±à°¤ విషయపౠపేరà±" error: "టపాలనౠకొతà±à°¤ విషయానికి జరిపేటపà±à°ªà±à°¡à± దోషం తలెతà±à°¤à°¿à°‚ది" instructions: - one: మీరౠకొతà±à°¤ విషయం సృషà±à°Ÿà°¿à°‚à°šà°¿ దానà±à°¨à°¿ మీరౠఈ టపాతో నింపబోతà±à°¨à±à°¨à°¾à°°à±. - other: మీరౠకొతà±à°¤ విషయం సృషà±à°Ÿà°¿à°‚à°šà°¿ దానà±à°¨à°¿ {{count}} టపాలతో నింపబోతà±à°¨à±à°¨à°¾à°°à±. + one: "మీరౠకొతà±à°¤ విషయం సృషà±à°Ÿà°¿à°‚à°šà°¿ దానà±à°¨à°¿ మీరౠఈ టపాతో నింపబోతà±à°¨à±à°¨à°¾à°°à±." + other: "మీరౠకొతà±à°¤ విషయం సృషà±à°Ÿà°¿à°‚à°šà°¿ దానà±à°¨à°¿ {{count}} టపాలతో నింపబోతà±à°¨à±à°¨à°¾à°°à±." merge_topic: title: "ఇపà±à°ªà°Ÿà°¿à°•ే ఉనà±à°¨ విషయానికి జరà±à°ªà±" action: "ఇపà±à°ªà°Ÿà°¿à°•ే ఉనà±à°¨ విషయానికి జరà±à°ªà±" error: " à°† విషయంలోకి టపాలనౠజరపడంలో దోషం." instructions: - one: à°ˆ టపాలౠజరపాలనà±à°•à±à°¨à±à°¨ విషయానà±à°¨à°¿ à°Žà°‚à°šà±à°•ోండి. - other: à°ˆ {{count}} టపాలనౠజరపాలనà±à°•à±à°¨à±à°¨ విషయానà±à°¨à°¿ à°Žà°‚à°šà±à°•ోండి. + one: "à°ˆ టపాలౠజరపాలనà±à°•à±à°¨à±à°¨ విషయానà±à°¨à°¿ à°Žà°‚à°šà±à°•ోండి." + other: "à°ˆ {{count}} టపాలనౠజరపాలనà±à°•à±à°¨à±à°¨ విషయానà±à°¨à°¿ à°Žà°‚à°šà±à°•ోండి." change_owner: title: "టపాల యజమానిని మారà±à°šà°‚à°¡à°¿" action: "యజమానిని మారà±à°šà±" @@ -760,8 +837,8 @@ te: label: "టపాల కొతà±à°¤ యజమాని" placeholder: "కొతà±à°¤ యజమాని సభà±à°¯à°¨à°¾à°®à°‚" instructions: - one: {{old_user}} యొకà±à°• టపాకౠకొతà±à°¤ యజమానిని à°Žà°‚à°šà±à°•ోండి. - other: {{old_user}} యొకà±à°• {{count}} టపాల కొతà±à°¤ యజమానిని à°Žà°‚à°šà±à°•ోండి. + one: "{{old_user}} యొకà±à°• టపాకౠకొతà±à°¤ యజమానిని à°Žà°‚à°šà±à°•ోండి." + other: "{{old_user}} యొకà±à°• {{count}} టపాల కొతà±à°¤ యజమానిని à°Žà°‚à°šà±à°•ోండి." multi_select: select: 'à°Žà°‚à°šà±à°•ో' selected: 'à°Žà°‚à°šà±à°•à±à°¨à±à°¨à°µà°¿ ({{count}})' @@ -771,7 +848,7 @@ te: deselect_all: à°…à°¨à±à°¨à±€ వియెంచà±à°•ో description: one: మీరౠ1 టపా à°Žà°‚à°šà±à°•à±à°¨à±à°¨à°¾à°°à± - other: మీరౠ{{count}} టపాలౠఎంచà±à°•à±à°¨à±à°¨à°¾à°°à± + other: "మీరౠ{{count}} టపాలౠఎంచà±à°•à±à°¨à±à°¨à°¾à°°à±" post: edit_reason: "కారణం:" post_number: "టపా {{number}}" @@ -782,8 +859,8 @@ te: show_full: "పూరà±à°¤à°¿ టపా చూపà±" show_hidden: 'దాగిన విషయం చూపà±' deleted_by_author: - one: ' (టపా రచయిత à°¦à±à°µà°¾à°°à°¾ తొలగింపబడింది , à°¸à±à°µà°¤à°¸à±à°¸à°¿à°§à±à°¦à°‚à°—à°¾ తొలగింపబ[ది %{count} కాకపోతే సమయం కేతనించలేదà±)' - other: (టపా రచయిత à°¦à±à°µà°¾à°°à°¾ ఉపసంహరించబడింది , à°¸à±à°µà°¤à°¸à°¿à°§à±à°§à°‚à°—à°¾ తొలగించబడతాయి %{count} కాకపోతే సమయం కేతనించలేదà±) + one: " (టపా రచయిత à°¦à±à°µà°¾à°°à°¾ తొలగింపబడింది , à°¸à±à°µà°¤à°¸à±à°¸à°¿à°§à±à°¦à°‚à°—à°¾ తొలగింపబ[ది %{count} కాకపోతే సమయం కేతనించలేదà±)" + other: "(టపా రచయిత à°¦à±à°µà°¾à°°à°¾ ఉపసంహరించబడింది , à°¸à±à°µà°¤à°¸à°¿à°§à±à°§à°‚à°—à°¾ తొలగించబడతాయి %{count} కాకపోతే సమయం కేతనించలేదà±)" expand_collapse: "పెంచà±/à°¤à±à°‚à°šà±" unread: "టపా చదవనిది" errors: @@ -828,7 +905,6 @@ te: inappropriate: "కేతనం à°°à°¦à±à°¦à±" bookmark: "పేజీక à°°à°¦à±à°¦à±" like: "ఇషà±à°Ÿà°‚ à°°à°¦à±à°¦à±" - vote: "à°“à°Ÿà± à°°à°¦à±à°¦à±" by_you: off_topic: "మీరౠదీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±" spam: "మీరౠదీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±" @@ -836,51 +912,44 @@ te: notify_moderators: "మీరౠదీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±" bookmark: "మీరౠదీనికి పేజీక ఉంచారà±" like: "మీరౠదీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±" - vote: "మీరౠఈ టపాకౠఓటౠవేశారà±" by_you_and_others: off_topic: - one: 'మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±. ' - other: 'మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±. ' + one: "మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±. " + other: "మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±. " spam: - one: 'మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±. ' - other: 'మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±. ' + one: "మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±. " + other: "మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±. " inappropriate: - one: 'మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ అసమంజసమైనదిగా కేతనించారà±. ' - other: 'మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ అసమంజసమైనదిగా కేతనించారà±. ' + one: "మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ అసమంజసమైనదిగా కేతనించారà±. " + other: "మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ అసమంజసమైనదిగా కేతనించారà±. " notify_moderators: - one: మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±. - other: మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±. + one: "మీరౠమరియౠఇంకొకరౠదీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±." + other: "మీరౠమరియౠ[[count]] ఇతర జనà±à°²à± దీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±." bookmark: - one: మీరౠమరియౠఇంకొకరౠదీనికి పేజీక ఉంచారà±. - other: మీరౠమరియౠ{{count}} ఇతరà±à°²à± దీనికి పేజీక ఉంచారà±. + one: "మీరౠమరియౠఇంకొకరౠదీనికి పేజీక ఉంచారà±." + other: "మీరౠమరియౠ{{count}} ఇతరà±à°²à± దీనికి పేజీక ఉంచారà±." like: - one: మీరౠమరొకరౠదీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à± - other: మీరౠమరియౠ{{count}} à°—à±à°°à± దీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à± - vote: - one: మీరౠమరియొకరౠఈ టపాకౠవోటౠవేసారౠ- other: మీరౠమరియౠ{{count}} à°—à±à°°à± à°ˆ టపాకౠఓటౠవేసారà±. + one: "మీరౠమరొకరౠదీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±" + other: "మీరౠమరియౠ{{count}} à°—à±à°°à± దీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±" by_others: off_topic: - one: ఒకరౠదీనà±à°¨à°¿ విషయాంతరంగా కేతనించారౠ- other: '{{count}} à°—à±à°°à± దీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±' + one: "ఒకరౠదీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±" + other: "{{count}} à°—à±à°°à± దీనà±à°¨à°¿ విషయాంతరంగా కేతనించారà±" spam: - one: ఒకరౠదీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారౠ- other: '{{count}} à°—à±à°°à± దీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±' + one: "ఒకరౠదీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±" + other: "{{count}} à°—à±à°°à± దీనà±à°¨à°¿ à°¸à±à°ªà°¾à°®à±à°—à°¾ కేతనించారà±" inappropriate: - one: ఒకరౠదీనà±à°¨à°¿ అసమంజసంగా కేతనించారౠ- other: '{{count}} à°—à±à°°à± దీనà±à°¨à°¿ అసమంజసంగా కేతనించారà±' + one: "ఒకరౠదీనà±à°¨à°¿ అసమంజసంగా కేతనించారà±" + other: "{{count}} à°—à±à°°à± దీనà±à°¨à°¿ అసమంజసంగా కేతనించారà±" notify_moderators: - one: ఒకరౠదీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à± - other: '{{count}} à°—à±à°°à± దీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±' + one: "ఒకరౠదీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±" + other: "{{count}} à°—à±à°°à± దీనà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°² దృషà±à°Ÿà°¿à°•à°¿ తెచà±à°šà°¾à°°à±" bookmark: - one: à°’à°•à°°à± à°ˆ టపాకౠపేజీక ఉంచారౠ- other: '{{count}} à°—à±à°°à± à°ˆ విషయానికి పేజీక ఉంచారà±' + one: "à°’à°•à°°à± à°ˆ టపాకౠపేజీక ఉంచారà±" + other: "{{count}} à°—à±à°°à± à°ˆ విషయానికి పేజీక ఉంచారà±" like: - one: ఒకరౠదీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à± - other: '{{count}} à°—à±à°°à± దీనà±à°¨à°¿à°‡à°·à±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±.' - vote: - one: ఒకరౠదీనికి ఓటౠవేశారౠ- other: '{{count}} à°—à±à°°à± దీనికి ఓటౠవేసారà±' + one: "ఒకరౠదీనà±à°¨à°¿ ఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±" + other: "{{count}} à°—à±à°°à± దీనà±à°¨à°¿à°‡à°·à±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±." revisions: controls: first: "తొలి దిదà±à°¦à±à°¬à°¾à°Ÿà±" @@ -899,7 +968,6 @@ te: category: can: 'can…' none: '(ఠవరà±à°—à°‚ లేదà±)' - choose: 'వరà±à°—à°‚ à°Žà°‚à°šà±à°•ో…' edit: 'సవరించà±' edit_long: "సవరించà±" view: 'à°ˆ వరà±à°—ంలోని విషయాలౠచూడà±' @@ -938,7 +1006,6 @@ te: edit_permissions: "à°…à°¨à±à°®à°¤à±à°²à± సవరించà±" add_permission: "à°…à°¨à±à°®à°¤à°¿ à°•à°²à±à°ªà±" this_year: "à°ˆ సంవతà±à°¸à°°à°‚" - position: "à°¸à±à°¥à°¾à°¨à°‚" default_position: "à°…à°ªà±à°°à°®à±‡à°¯ à°¸à±à°¥à°¾à°¨à°‚" position_disabled: "వరà±à°—ాలౠకలాపం వరà±à°¸à°²à±‹ చూపబడతాయి. జాబితాలà±à°²à±‹ వరà±à°—ాల వరà±à°¸à°¨à± నియంతà±à°°à°¿à°‚చడానికి," position_disabled_click: '"à°¸à±à°¥à°¿à°° వరà±à°— à°¸à±à°¥à°¾à°¯à°¿à°²à±" అమరికనౠచేతనం చేయండి' @@ -973,8 +1040,8 @@ te: topic_map: title: "విషయ సారం" clicks: - one: à°’à°• నొకà±à°•à± - other: '%{count} నొకà±à°•à±à°²à±' + one: "à°’à°• నొకà±à°•à±" + other: "%{count} నొకà±à°•à±à°²à±" topic_statuses: warning: help: "ఇది అధికారిక హెచà±à°šà°°à°¿à°•" @@ -1003,6 +1070,9 @@ te: likes: "ఇషà±à°Ÿà°¾à°²à±" likes_long: "à°ˆ విషయానికి {{number}} ఇషà±à°Ÿà°¾à°²à± ఉనà±à°¨à°¾à°¯à°¿" users: "సభà±à°¯à±à°²à±" + users_lowercase: + one: "వాడà±à°•à°°à°¿" + other: "వాడà±à°•à°°à±à°²à±" category_title: "వరà±à°—à°‚" history: "à°šà°°à°¿à°¤à±à°°" changed_by: " {{author}} రాసిన" @@ -1046,6 +1116,11 @@ te: full: "సృషà±à°Ÿà°¿à°‚à°šà°¿ / జవాబివà±à°µà± / చూడà±" create_post: "జవాబివà±à°µà± / చూడà±" readonly: "చూడà±" + keyboard_shortcuts_help: + jump_to: + home: 'g, h à°®à±à°‚గిలి' + actions: + title: 'à°šà°°à±à°¯à°²à±' admin_js: type_to_filter: "జలà±à°²à°¿à°‚à°šà±à°Ÿà°•ౠరాయి..." admin: @@ -1283,7 +1358,6 @@ te: address_placeholder: "name@example.com" type_placeholder: "డైజెసà±à°Ÿà±, సైనపà±..." reply_key_placeholder: "జవాబౠకీ" - skipped_reason_placeholder: "కారణం" logs: title: "లాగà±à°²à±" action: "à°šà°°à±à°¯" @@ -1378,11 +1452,11 @@ te: suspect: 'à°…à°¨à±à°®à°¾à°¨à°¿à°‚à°šà±' approved: "అంగీకరించà±" approved_selected: - one: సభà±à°¯à±à°¡à°¿à°¨à°¿ అంగీకరించౠ- other: ({{count}}) సభà±à°¯à±à°²à°¨à± అంగీకరించౠ+ one: "సభà±à°¯à±à°¡à°¿à°¨à°¿ అంగీకరించà±" + other: "({{count}}) సభà±à°¯à±à°²à°¨à± అంగీకరించà±" reject_selected: - one: సభà±à°¯à±à°¡à°¿à°¨à°¿ నిరాకరించౠ- other: ({{count}}) సభà±à°¯à±à°²à°¨à± నిరాకరించౠ+ one: "సభà±à°¯à±à°¡à°¿à°¨à°¿ నిరాకరించà±" + other: "({{count}}) సభà±à°¯à±à°²à°¨à± నిరాకరించà±" titles: active: 'à°•à±à°°à°¿à°¯à°¾à°¶à±€à°² సభà±à°¯à±à°²à±' new: 'కొతà±à°¤ సభà±à°¯à±à°²à±' @@ -1395,8 +1469,8 @@ te: suspended: 'ససà±à°ªà±†à°‚డయిన సభà±à°¯à±à°²à±' suspect: 'à°…à°¨à±à°®à°¾à°¨à°¿à°¤ సభà±à°¯à±à°²à±' reject_successful: - one: 'వినియోగదారà±à°²à± విజయవంతంగా ' - other: వినియోగదారà±à°²à± విజయవంతంగా %{count} తిరసà±à°•రింపబడà±à°¡à°¾à°°à±.. + one: "వినియోగదారà±à°²à± విజయవంతంగా " + other: "వినియోగదారà±à°²à± విజయవంతంగా %{count} తిరసà±à°•రింపబడà±à°¡à°¾à°°à±.." not_verified: "à°¦à±à°°à±à°µà±€à°•రించలేదà±" check_email: title: "à°ˆ సభà±à°¯à±à°¨à°¿ ఈమెయిలౠచూపà±" @@ -1614,3 +1688,9 @@ te: name: "పేరà±" image: "బొమà±à°®" delete_confirm: "మీరౠనిజంగా %{name}: ఎమోజీ ని తొలగించాలనà±à°•à±à°‚à°Ÿà±à°¨à±à°¨à°¾à°°à°¾ ?" + wizard_js: + wizard: + done: "పూరà±à°¤à°¯à°¿à°‚ది" + back: "వెనà±à°•à°•à±" + next: "తదà±à°ªà°°à°¿" + upload: "à°Žà°•à±à°•à°¿à°‚à°šà±" diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml index f748ef0db3..cf6c2ce7c3 100644 --- a/config/locales/client.th.yml +++ b/config/locales/client.th.yml @@ -42,45 +42,45 @@ th: tiny: half_a_minute: "< 1 นาที" less_than_x_seconds: - other: < %{count} วินาที + other: "< %{count} วินาที" x_seconds: - other: '%{count} วินาที' + other: "%{count} วินาที" x_minutes: - other: '%{count} นาที' + other: "%{count} นาที" about_x_hours: - other: '%{count} ชั่วโมง' + other: "%{count} ชั่วโมง" x_days: - other: '%{count} วัน' + other: "%{count} วัน" about_x_years: - other: '%{count} ปี' + other: "%{count} ปี" over_x_years: - other: '> %{count} ปี' + other: "> %{count} ปี" almost_x_years: - other: '%{count} ปี' + other: "%{count} ปี" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - other: '%{count} นาที' + other: "%{count} นาที" x_hours: - other: '%{count} ชั่วโมง' + other: "%{count} ชั่วโมง" x_days: - other: '%{count} วัน' + other: "%{count} วัน" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - other: '%{count} นาทีที่à¹à¸¥à¹‰à¸§' + other: "%{count} นาทีที่à¹à¸¥à¹‰à¸§" x_hours: - other: '%{count} ชั่วโมงที่à¹à¸¥à¹‰à¸§' + other: "%{count} ชั่วโมงที่à¹à¸¥à¹‰à¸§" x_days: - other: '%{count} วันที่à¹à¸¥à¹‰à¸§' + other: "%{count} วันที่à¹à¸¥à¹‰à¸§" later: x_days: - other: '%{count} วันหลังจาà¸à¸™à¸±à¹‰à¸™' + other: "%{count} วันหลังจาà¸à¸™à¸±à¹‰à¸™" x_months: - other: '%{count} เดือนหลังจาà¸à¸™à¸±à¹‰à¸™' + other: "%{count} เดือนหลังจาà¸à¸™à¸±à¹‰à¸™" x_years: - other: '%{count} ปีหลังจาà¸à¸™à¸±à¹‰à¸™' + other: "%{count} ปีหลังจาà¸à¸™à¸±à¹‰à¸™" previous_month: 'เดือนที่à¹à¸¥à¹‰à¸§' next_month: 'เดือนถัดไป' placeholder: วัน @@ -158,12 +158,12 @@ th: show_help: "ตัวเลือà¸" links: "ลิงà¸à¹Œ" links_lowercase: - other: ลิงค์ + other: "ลิงค์" faq: "ถามตอบ" guidelines: "คู่มือ" privacy_policy: "นโยบายความเป็นส่วนตัว" privacy: "ความเป็นส่วนตัว" - terms_of_service: "เงื่อนไขà¸à¸²à¸£à¸šà¸£à¸´à¸à¸²à¸£" + tos: "เงื่อนไขà¸à¸²à¸£à¸šà¸£à¸´à¸à¸²à¸£" mobile_view: "เปิดหน้าสำหรับอุปà¸à¸£à¸“์เคลื่อนที่" desktop_view: "เปิดหน้าสำหรับเดสท๊อป" you: "คุณ" @@ -182,7 +182,7 @@ th: max_of_count: "สูงสุดของ {{count}}" alternation: "หรือ" character_count: - other: '{{count}} ตัวอัà¸à¸©à¸£' + other: "{{count}} ตัวอัà¸à¸©à¸£" suggested_topics: title: "à¸à¸£à¸°à¸—ู้à¹à¸™à¸°à¸™à¸³" pm_title: "ข้อความที่à¹à¸™à¸°à¸™à¸³" @@ -214,7 +214,7 @@ th: remove: "ลบบุ๊คม๊าค" confirm_clear: "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¹„หม ที่จะลบบุ๊คมาร์à¸à¹ƒà¸™à¸à¸£à¸°à¸—ู้นี้ทั้งหมด" topic_count_latest: - other: เห็น {{count}} à¸à¸£à¸°à¸—ู้ใหม่ หรือที่ถูà¸à¸­à¸±à¸žà¹€à¸”ต + other: "เห็น {{count}} à¸à¸£à¸°à¸—ู้ใหม่ หรือที่ถูà¸à¸­à¸±à¸žà¹€à¸”ต" preview: "à¹à¸ªà¸”งตัวอย่าง" cancel: "ยà¸à¹€à¸¥à¸´à¸" save: "บันทึà¸à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡" @@ -250,14 +250,14 @@ th: cancel: "ยà¸à¹€à¸¥à¸´à¸" view_pending: "ดูโพสที่à¸à¸³à¸¥à¸±à¸‡à¸£à¸­à¸­à¸¢à¸¹à¹ˆ" has_pending_posts: - other: à¸à¸£à¸°à¸—ู้นี้มีโพสอีภ{{count}} โพสที่รอบตรวจสอบอยู่ + other: "à¸à¸£à¸°à¸—ู้นี้มีโพสอีภ{{count}} โพสที่รอบตรวจสอบอยู่" confirm: "บันทึà¸à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡" delete_prompt: "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¸¥à¸š %{username}? นี่จะทำให้เราลบโพสà¹à¸¥à¸°à¸šà¸¥à¹‡à¸­à¸à¸­à¸µà¹€à¸¡à¸¥à¹à¸¥à¸°à¹„อพีของคนนี้" approval: title: "โพสต์นี้ต้องได้รับà¸à¸²à¸£à¸­à¸™à¸¸à¸¡à¸±à¸•ิ" description: "เราได้รับโพสของคุณà¹à¸¥à¹‰à¸§à¹à¸•่จำเป็นต้องมีà¸à¸²à¸£à¸­à¸™à¸¸à¸¡à¸±à¸•โดยผู้ดูà¹à¸¥à¸à¹ˆà¸­à¸™à¸ˆà¸¶à¸‡à¸ˆà¸°à¸›à¸£à¸²à¸à¸Žà¸‚ึ้น à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่" pending_posts: - other: คุณมี {{count}} à¸à¸£à¸°à¸—ู้ที่รอà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™ + other: "คุณมี {{count}} à¸à¸£à¸°à¸—ู้ที่รอà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™" ok: "ตà¸à¸¥à¸‡" user_action: user_posted_topic: "{{user}} โพส à¸à¸£à¸°à¸—ู้" @@ -291,16 +291,42 @@ th: posts_read: "อ่าน" posts_read_long: "อ่านโพส" total_rows: - other: '%{count} ผู้ใช้' + other: "%{count} ผู้ใช้" group_histories: actions: change_group_setting: "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•ั้งค่าà¸à¸¥à¸¸à¹ˆà¸¡" add_user_to_group: "เพิ่มผู้ใช้" remove_user_from_group: "ลบผู้ใช้" groups: + add_members: + title: "เพิ่มสมาชิà¸" + usernames: "ชื่อผู้ใช้" + manage: + title: 'จัดà¸à¸²à¸£' + name: 'ชื่อ' + full_name: 'ชื่อ-นามสà¸à¸¸à¸¥' + add_members: "เพิ่มสมาชิà¸" + delete_member_confirm: "ลบ '%{username}' ออà¸à¸ˆà¸²à¸à¸à¸¥à¸¸à¹ˆà¸¡ '%{group}' " + profile: + title: ข้อมูลผู้ใช้ + interaction: + notification: à¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ือน + membership: + title: à¸à¸²à¸£à¹€à¸›à¹‡à¸™à¸ªà¸¡à¸²à¸Šà¸´à¸ + access: à¸à¸²à¸£à¹€à¸‚้าถึง + logs: + when: "เมื่อ" + details: "รายละเอียด" + from: "จาà¸" + to: "ถึง" public_exit: "อนุà¸à¸²à¸•ให้ผู้ใช้ออà¸à¸ˆà¸²à¸à¸à¸¥à¸¸à¹ˆà¸¡à¸­à¸¢à¹ˆà¸²à¸‡à¸­à¸´à¸ªà¸£à¸°" add: "เพิ่ม" + join: "เข้าร่วม" + leave: "ออà¸" + request: "ร้องขอ" message: "ข้อความ

" + membership_request: + title: "ขอเข้าร่วม @%{group_name}" membership: "à¸à¸²à¸£à¹€à¸›à¹‡à¸™à¸ªà¸¡à¸²à¸Šà¸´à¸" name: "ชื่อ" bio: "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸¥à¸¸à¹ˆà¸¡" @@ -308,7 +334,9 @@ th: owner: "เจ้าของ" index: title: "à¸à¸¥à¸¸à¹ˆà¸¡" + all: "ทุà¸à¸à¸¥à¸¸à¹ˆà¸¡" empty: "ไม่มีà¸à¸¥à¸¸à¹ˆà¸¡à¸—ี่เห็นได้" + closed: "ปิด" activity: "à¸à¸´à¸ˆà¸à¸£à¸£à¸¡" topics: "à¸à¸£à¸°à¸—ู้" posts: "โพสต์" @@ -361,8 +389,6 @@ th: reorder: title: "เรียงหมวดหมู่ใหม่" title_long: "จัดà¸à¸²à¸£à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­à¸«à¸¡à¸§à¸”หมู่" - fix_order: "ตรึงตำà¹à¸«à¸™à¹ˆà¸‡" - fix_order_tooltip: "ไม่ใช่หมวดหมู่ทุà¸à¸­à¸±à¸™à¸ˆà¸°à¸¡à¸µà¹€à¸¥à¸‚ตำà¹à¸«à¸™à¹ˆà¸‡à¸‚องตัวเอง ซึ่งนั่นอาจส่งผลให้เà¸à¸´à¸”ผลที่ไม่ได้คาดหวังไว้" save: "บันทึà¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡" apply_all: "นำไปใช้" position: "ตำà¹à¸«à¸™à¹ˆà¸‡" @@ -373,7 +399,7 @@ th: toggle_ordering: "เปลี่ยนวิธีà¸à¸²à¸£à¸ˆà¸±à¸”ลำดับ" subcategories: "หมวดหมู่ย่อย" topic_stat_sentence: - other: '%{count} à¸à¸£à¸°à¸—ู้ใหม่ในเวลาที่ผ่านมา %{unit}.' + other: "%{count} à¸à¸£à¸°à¸—ู้ใหม่ในเวลาที่ผ่านมา %{unit}." ip_lookup: title: มองหาที่อยู่ไอพี hostname: ชื่อโฮสต์ @@ -509,7 +535,6 @@ th: upload_title: "อัปโหลดรูปภาพของคุณ" upload_picture: "อัปโหลดรูปภาพ" image_is_not_a_square: "ระวัง: เราได้ตัวรูปภาพบางส่วนของคุณ; ความยาวà¹à¸¥à¸°à¸„วามสูงจะไม่เท่าà¸à¸±à¸™" - cache_notice: "คุณได้เปลี่ยนรูปภาพประจำตัวเรียบร้อยà¹à¸¥à¹‰à¸§à¹à¸•่อาจใช้เวลาในà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸šà¹‰à¸²à¸‡à¹€à¸™à¸·à¹ˆà¸­à¸‡à¸ˆà¸²à¸à¹à¸„ชของบาวเซอร์" change_profile_background: title: "พื้นหลังโปรไฟล์" instructions: "พื้นหลังโปรไฟล์จะถูà¸à¸ˆà¸±à¸”ให้อยู่à¸à¸¶à¹ˆà¸‡à¸à¸¥à¸²à¸‡à¹à¸¥à¸°à¸¡à¸µà¸„่าปริยายของความà¸à¸§à¹‰à¸²à¸‡à¹€à¸—่าà¸à¸±à¸š 850 พิà¸à¹€à¸‹à¸¥" @@ -523,7 +548,7 @@ th: authenticated: "อีเมลของคุณได้รับà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¹‚ดย {{provider}}" frequency_immediately: "เราจะอีเมลถึงคุณทันทีหาà¸à¸„ุณยังไม่ได้อ่านสิ่งที่เราอีเมลหาคุณ" frequency: - other: เราจะอีเมลหาคุณเฉพาะสิ่งที่คุณไม่ได้เห็นในช่วง {{count}} นาที + other: "เราจะอีเมลหาคุณเฉพาะสิ่งที่คุณไม่ได้เห็นในช่วง {{count}} นาที" name: title: "ชื่อ" instructions: "ชื่อเต็มของคุณ (ไม่บังคับ)" @@ -604,7 +629,7 @@ th: user: "เชิà¸à¸Šà¸§à¸™à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰" sent: "ส่ง" truncated: - other: à¸à¸³à¸¥à¸±à¸‡à¹à¸ªà¸”งคำเชิภ{{count}} รายà¸à¸²à¸£à¹à¸£à¸ + other: "à¸à¸³à¸¥à¸±à¸‡à¹à¸ªà¸”งคำเชิภ{{count}} รายà¸à¸²à¸£à¹à¸£à¸" redeemed: "ยืนยันà¸à¸²à¸£à¹€à¸Šà¸´à¸à¸Šà¸§à¸™" redeemed_tab: "ยืนยัน" redeemed_tab_with_count: "ยืนยันà¹à¸¥à¹‰à¸§ ({{count}})" @@ -642,15 +667,15 @@ th: stats: "สถิติ" time_read: "เวลาอ่าน" topic_count: - other: à¸à¸£à¸°à¸—ู้สร้าง + other: "à¸à¸£à¸°à¸—ู้สร้าง" post_count: - other: โพสถูà¸à¸ªà¸£à¹‰à¸²à¸‡ + other: "โพสถูà¸à¸ªà¸£à¹‰à¸²à¸‡" days_visited: - other: วันที่ดู + other: "วันที่ดู" posts_read: - other: โพสที่อ่าน + other: "โพสที่อ่าน" bookmark_count: - other: บุ๊คมาร์ค + other: "บุ๊คมาร์ค" top_replies: "ตอบสูงสุด" no_replies: "ยังไม่มีใครตอบ" more_replies: "à¸à¸²à¸£à¸•อบอื่น" @@ -666,7 +691,6 @@ th: most_liked_users: "ถูà¸à¸Šà¸­à¸šà¸¡à¸²à¸à¸—ี่สุด" most_replied_to_users: "ถูà¸à¸•อบมาà¸à¸—ี่สุด" no_likes: "ยังไม่มีใครชอบเลย" - associated_accounts: "à¸à¸²à¸£à¹€à¸‚้าสู่ระบบ" ip_address: title: "ไอพีล่าสุด" registration_ip_address: @@ -713,7 +737,7 @@ th: logout_disabled: "à¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸šà¸™à¸±à¹‰à¸™à¹„ม่สามารถทำได้ในเวลาที่เว็บนั้นอยู่ในโหมด read only" logs_error_rate_notice: rate: - other: '%{count} ผิดพลาด/%{duration}' + other: "%{count} ผิดพลาด/%{duration}" learn_more: "เรียนรู้เพิ่มเติม..." year: 'ปี' year_desc: 'à¸à¸£à¸°à¸—ู้ที่ถูà¸à¸•ั้งเมื่อ365 วันที่ผ่านมา' @@ -733,8 +757,6 @@ th: hide_session: "à¹à¸ˆà¹‰à¸‡à¹€à¸•ือนฉันอีà¸à¸—ีพรุ่งนี้" hide_forever: "ไม่เป็นไร" hidden_for_session: "โอเค ฉันจะถามคุณอีà¸à¸—ีพรุ่งนี้ คุณสามารถใช้เมนู เข้าสู่ระบบ เพื่อสร้างบัà¸à¸Šà¸µà¹„ด้เหมือนà¸à¸±à¸™à¸™à¸°" - intro: "เอาล่ะ! :heart_eyes: ดูเหมือนคุณจะถูà¸à¹ƒà¸Šà¹‰à¸«à¸±à¸§à¸‚้อมาà¸à¹€à¸¥à¸¢à¸™à¸° à¹à¸•่คุณยังไม่ได้สร้างบัà¸à¸Šà¸µà¹€à¸¥à¸¢" - value_prop: "ถ้าคุณสร้างบัà¸à¸Šà¸µ เราจะสามารถจำได้à¹à¸›à¸°à¹†à¹€à¸¥à¸¢à¸§à¹ˆà¸²à¸„ุณà¸à¸³à¸¥à¸±à¸‡à¸­à¹ˆà¸²à¸™à¸­à¸°à¹„รà¹à¸¥à¸°à¹€à¸¡à¸·à¹ˆà¸­à¸„ุณไม่อยู่ คุณจะได้รับà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ือนทั้งจาà¸à¸—ี่นี่ จาà¸à¸­à¸µà¹€à¸¡à¸¥ เมื่อใดà¸à¹‡à¸•ามที่โพสถูà¸à¸ªà¸£à¹‰à¸²à¸‡ à¹à¸¥à¸°à¸™à¸­à¸à¸ˆà¸²à¸à¸™à¸µà¹‰à¸„ุณยังสามารถถูà¸à¹ƒà¸ˆà¹‚พสเพื่อà¹à¸šà¹ˆà¸‡à¸›à¸±à¸™à¸„วามรัà¸à¹„ด้ด้วยนะ :heartbeat:" summary: enabled_description: "คุณà¸à¸³à¸¥à¸±à¸‡à¸”ูสรุปของà¸à¸£à¸°à¸—ู้นี้ : นี่คือโพสที่น่าสนใจที่สุดที่หลายๆคนà¹à¸™à¸°à¸™à¸³" description: "ตอบทั้งหมด {{replyCount}} ครั้ง" @@ -748,7 +770,6 @@ th: disable: "à¹à¸ªà¸”งโพสต์ที่ถูà¸à¸¥à¸š" private_message_info: title: "ข้อความ" - invite: "เชิà¸à¸Šà¸§à¸™à¸­à¸·à¹ˆà¸™à¹†..." remove_allowed_user: "คุณต้องà¸à¸²à¸£à¸ˆà¸°à¸¥à¸š {{name}} จาà¸à¸‚้อความนี้ใช้หรือไม่" email: 'อีเมล' username: 'ชื่อผู้ใช้' @@ -794,9 +815,6 @@ th: to_continue: "โปรดเข้าสู่ระบบ" preferences: "คุณจำเป็นต้องเข้าสู่ระบบจึงจะสามารถเปลี่ยนà¸à¸²à¸£à¸•ั้งค่าส่วนตัวของคุณได้" forgot: "ฉันจำรายละเอียดบัà¸à¸Šà¸µà¸‚องตัวเองไม่ได้" - google: - title: "ด้วย Google" - message: "à¸à¸³à¸¥à¸±à¸‡à¸•รวจสอบà¸à¸±à¸š Google (ต้องไม่ปิดà¸à¸±à¹‰à¸™à¸›à¹Šà¸­à¸›à¸­à¸±à¸ž)" google_oauth2: title: "ด้วย Google" message: "à¸à¸³à¸¥à¸±à¸‡à¸•รวจสอบà¸à¸±à¸š Google (ต้องไม่ปิดà¸à¸±à¹‰à¸™à¸›à¹Šà¸­à¸›à¸­à¸±à¸ž)" @@ -950,7 +968,7 @@ th: archive_topics: "คลังà¸à¸£à¸°à¸—ู้" choose_new_category: "เลือà¸à¸«à¸¡à¸§à¸”ใหม่ให้à¸à¸£à¸°à¸—ู้" selected: - other: คุณได้เลือภ{{count}} à¸à¸£à¸°à¸—ู้ + other: "คุณได้เลือภ{{count}} à¸à¸£à¸°à¸—ู้" none: unread: "คุณไม่มีà¸à¸£à¸°à¸—ู้ที่ยังไม่ได้อ่าน" new: "คุณไม่มีà¸à¸£à¸°à¸—ู้ใหม่" @@ -968,7 +986,7 @@ th: bookmarks: "ไม่มีบุ๊คมาร์คในหัวข้อใดอีà¸à¹à¸¥à¹‰à¸§" topic: filter_to: - other: ' {{count}} โพสในà¸à¸£à¸°à¸—ู้' + other: " {{count}} โพสในà¸à¸£à¸°à¸—ู้" create: 'à¸à¸£à¸°à¸—ู้ใหม่' create_long: 'สร้างà¸à¸£à¸°à¸—ู้ใหม่' private_message: 'สร้างข้อความใหม่' @@ -995,9 +1013,9 @@ th: not_found: title: "ไม่พบà¸à¸£à¸°à¸—ู้" total_unread_posts: - other: คุณมี {{count}} ความคิดเห็น ที่ยังไม่ได้อ่านในà¸à¸£à¸°à¸—ู้นี้ + other: "คุณมี {{count}} ความคิดเห็น ที่ยังไม่ได้อ่านในà¸à¸£à¸°à¸—ู้นี้" unread_posts: - other: คุณมี {{count}} ความคิดเห็นเà¸à¹ˆà¸² ที่ยังไม่ได้อ่านในà¸à¸£à¸°à¸—ู้นี้ + other: "คุณมี {{count}} ความคิดเห็นเà¸à¹ˆà¸² ที่ยังไม่ได้อ่านในà¸à¸£à¸°à¸—ู้นี้" back_to_list: "à¸à¸¥à¸±à¸šà¹„ปที่รายชื่อà¸à¸£à¸°à¸—ู้" show_links: "à¹à¸ªà¸”งลิงค์ในà¸à¸£à¸°à¸—ู้นี้" read_more_in_category: "ต้องà¸à¸²à¸£à¸ˆà¸°à¸­à¹ˆà¸²à¸™à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸«à¸£à¸­? ลองดูà¸à¸£à¸°à¸—ู้อื่นใน {{catLink}} หรือ {{latestLink}}" @@ -1082,7 +1100,7 @@ th: login_reply: 'เข้าสู่ระบบเพื่อตอบ' filters: n_posts: - other: '{{count}} โพส' + other: "{{count}} โพส" cancel: "เอาà¸à¸²à¸£à¸à¸£à¸­à¸‡à¸­à¸­à¸" split_topic: title: "ย้ายไปหัวข้อใหม่" @@ -1107,7 +1125,7 @@ th: select_all: เลือà¸à¸—ั้งหมด deselect_all: ไม่เลือà¸à¸—ั้งหมด description: - other: คุณได้เลือภ{{count}} โพสต์. + other: "คุณได้เลือภ{{count}} โพสต์." post: edit_reason: "เหตุผล:" post_number: "โพสต์ {{number}}" @@ -1117,15 +1135,15 @@ th: show_full: "à¹à¸ªà¸”งโพสà¹à¸šà¸šà¹€à¸•็ม" show_hidden: 'ดูเนื้อหาที่ถูà¸à¸‹à¹ˆà¸­à¸™' deleted_by_author: - other: (โพสถูà¸à¹à¸ˆà¹‰à¸‡à¸¥à¸šà¹‚ดยเจ้าของ à¹à¸¥à¸°à¸ˆà¸°à¸–ูà¸à¸¥à¸šà¹ƒà¸™ %{count} ชั่วโมงเว้นà¹à¸•่จะถูà¸à¸›à¸±à¸à¸˜à¸‡) + other: "(โพสถูà¸à¹à¸ˆà¹‰à¸‡à¸¥à¸šà¹‚ดยเจ้าของ à¹à¸¥à¸°à¸ˆà¸°à¸–ูà¸à¸¥à¸šà¹ƒà¸™ %{count} ชั่วโมงเว้นà¹à¸•่จะถูà¸à¸›à¸±à¸à¸˜à¸‡)" expand_collapse: "ขยาย/หด" unread: "โพสนี้ยังไม่ถูà¸à¸­à¹ˆà¸²à¸™" has_replies: - other: '{{count}} ตอบ' + other: "{{count}} ตอบ" has_likes: - other: '{{count}} ชอบ' + other: "{{count}} ชอบ" has_likes_title: - other: '{{count}} ผู้คนที่ชอบโพสนี้' + other: "{{count}} ผู้คนที่ชอบโพสนี้" has_likes_title_only_you: "คุณชอบโพสนี้" errors: create: "ขอโทษ, เà¸à¸´à¸”ความผิดพลาดขณะà¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¹‚พสของคุณ โปรดลองใหม่อีà¸à¸„รั้ง" @@ -1160,10 +1178,10 @@ th: bookmark: "บุ๊คมาร์คโพสนี้" by_you_and_others: bookmark: - other: คุณà¹à¸¥à¸°à¸­à¸µà¸ {{count}} คนได้บุ๊คมาร์คโพสนี้ + other: "คุณà¹à¸¥à¸°à¸­à¸µà¸ {{count}} คนได้บุ๊คมาร์คโพสนี้" by_others: bookmark: - other: '{{count}} คน ได้บุ๊คมาร์คโพสนี้' + other: "{{count}} คน ได้บุ๊คมาร์คโพสนี้" category: delete: 'ลบหมวดหมู่' delete_confirm: "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¸¥à¸šà¸«à¸¡à¸§à¸”หมู่นี้ออà¸?" @@ -1196,15 +1214,15 @@ th: original_post: "โพสต้นฉบับ" views: "ดู" views_lowercase: - other: ดู + other: "ดู" replies: "ตอบ" activity: "à¸à¸´à¸ˆà¸à¸£à¸£à¸¡" likes: "ชอบ" likes_lowercase: - other: ชอบ + other: "ชอบ" users: "ผู้ใช้" users_lowercase: - other: ผู้ใช้ + other: "ผู้ใช้" category_title: "หมวดหมู่" history: "ประวัติ" changed_by: "โดย {{author}}" @@ -1217,7 +1235,7 @@ th: latest: title: "ล่าสุด" title_with_count: - other: ล่าสุด ({{count}}) + other: "ล่าสุด ({{count}})" help: "หัวข้อพร้อมโพสล่าสุด" hot: title: "ร้อนà¹à¸£à¸‡" @@ -1233,17 +1251,17 @@ th: unread: title: "ยังไม่อ่าน" title_with_count: - other: ยังไม่ได้อ่าน ({{count}}) + other: "ยังไม่ได้อ่าน ({{count}})" help: "หัวข้อที่คุณà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸±à¸šà¸•าหรือติดตามพร้อมโพสที่ยังไม่อ่าน" lower_title_with_count: - other: '{{count}} ไม่ได้อ่าน' + other: "{{count}} ไม่ได้อ่าน" new: lower_title_with_count: - other: '{{count}} ใหม่' + other: "{{count}} ใหม่" lower_title: "ใหม่" title: "ใหม่" title_with_count: - other: ใหม่ ({{count}}) + other: "ใหม่ ({{count}})" help: "หัวข้อที่ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡à¹„ม่à¸à¸µà¹ˆà¸§à¸±à¸™" posted: title: "โพสของฉัน" @@ -1254,7 +1272,7 @@ th: category: title: "{{categoryName}}" title_with_count: - other: '{{categoryName}} ({{count}})' + other: "{{categoryName}} ({{count}})" help: "หัวข้อล่าสุดในหมวดหมู่ {{categoryName}}" top: title: "บน" @@ -1440,9 +1458,9 @@ th: suspect: 'ต้องสงสัย' approved: "ยืนยันหรือไม่" approved_selected: - other: ผู้ใช้งานที่ได้รับยืนยันà¹à¸¥à¹‰à¸§ ({{count}}) + other: "ผู้ใช้งานที่ได้รับยืนยันà¹à¸¥à¹‰à¸§ ({{count}})" reject_selected: - other: ผู้ใช้งานที่ไม่ได้รับยืนยันà¹à¸¥à¹‰à¸§ ({{count}}) + other: "ผู้ใช้งานที่ไม่ได้รับยืนยันà¹à¸¥à¹‰à¸§ ({{count}})" titles: active: 'ผู้ใช้ที่ใช้งานอยู่' new: 'ผู้ใช้งานใหม่' diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index 11e7782b04..5fdad8cb13 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -43,86 +43,87 @@ tr_TR: tiny: half_a_minute: "< 1d" less_than_x_seconds: - one: < %{count}s - other: < %{count}s + one: "< %{count}s" + other: "< %{count}s" x_seconds: - one: '%{count}s' - other: '%{count}s' + one: "%{count}s" + other: "%{count}s" less_than_x_minutes: - one: < %{count}dk - other: < %{count}dk + one: "< %{count}dk" + other: "< %{count}dk" x_minutes: - one: '%{count}d' - other: '%{count}d' + one: "%{count}d" + other: "%{count}d" about_x_hours: - one: '%{count}s' - other: '%{count}s' + one: "%{count}s" + other: "%{count}s" x_days: - one: '%{count}g' - other: '%{count}g' + one: "%{count}g" + other: "%{count}g" x_months: - one: '%{count}ay' - other: '%{count}ay' + one: "%{count}ay" + other: "%{count}ay" about_x_years: - one: '%{count}y' - other: '%{count}y' + one: "%{count}y" + other: "%{count}y" over_x_years: - one: '> %{count}y' - other: '> %{count}y' + one: "> %{count}y" + other: "> %{count}y" almost_x_years: - one: '%{count}y' - other: '%{count}y' + one: "%{count}y" + other: "%{count}y" date_month: "D MMM" date_year: "MMM 'YY" medium: x_minutes: - one: '%{count} dakika' - other: '%{count} dakika' + one: "%{count} dakika" + other: "%{count} dakika" x_hours: - one: '%{count} saat' - other: '%{count} saat' + one: "%{count} saat" + other: "%{count} saat" x_days: - one: '%{count} gün' - other: '%{count} gün' + one: "%{count} gün" + other: "%{count} gün" date_year: "D MMM, 'YY" medium_with_ago: x_minutes: - one: '%{count} dakika önce' - other: '%{count} dakika önce' + one: "%{count} dakika önce" + other: "%{count} dakika önce" x_hours: - one: '%{count} saat önce' - other: '%{count} saat önce' + one: "%{count} saat önce" + other: "%{count} saat önce" x_days: - one: '%{count} gün önce' - other: '%{count} gün önce' + one: "%{count} gün önce" + other: "%{count} gün önce" later: x_days: - one: '%{count} gün sonra' - other: '%{count} gün sonra' + one: "%{count} gün sonra" + other: "%{count} gün sonra" x_months: - one: '%{count} ay sonra' - other: '%{count} ay sonra' + one: "%{count} ay sonra" + other: "%{count} ay sonra" x_years: - one: '%{count} yıl sonra' - other: '%{count} yıl sonra' + one: "%{count} yıl sonra" + other: "%{count} yıl sonra" previous_month: 'Önceki Ay' next_month: 'Sonraki Ay' placeholder: tarih share: - topic: 'bu konunun baÄŸlantısını paylaşın' - post: '#%{postNumber} numaralı gönderiyi paylaşın' + topic: 'bu konunun baÄŸlantısını paylaÅŸ' + post: '#%{postNumber} numaralı gönderiyi paylaÅŸ' close: 'kapat' - twitter: 'bu baÄŸlantıyı Twitter''da paylaşın' - facebook: 'bu baÄŸlantıyı Facebook''da paylaşın' - google+: 'bu baÄŸlantıyı Google+''da paylaşın' - email: 'bu baÄŸlantıyı e-posta ile gönderin' + twitter: 'bu baÄŸlantıyı Twitter''da paylaÅŸ' + facebook: 'bu baÄŸlantıyı Facebook''da paylaÅŸ' + google+: 'bu baÄŸlantıyı Google+''da paylaÅŸ' + email: 'bu baÄŸlantıyı e-posta ile gönder' action_codes: public_topic: "bu konuyu %{when} herkese açık yaptı" + private_topic: "bu konuyu %{when} kiÅŸisel mesaj yaptı" split_topic: "bu konuyu %{when} ayırdı" invited_user: "%{when} %{who} davet edildi" invited_group: "%{who} %{when} davet edildi" - user_left: "%{who} bu iletiden ayrıldı %{when}" - removed_user: "%{when} %{who} silindi" + user_left: "%{who} bu mesajdan ayrıldı %{when}" + removed_user: "%{when} %{who} kaldırıldı" removed_group: "%{who} %{when} kaldırıldı" autoclosed: enabled: '%{when} kapatıldı' @@ -134,39 +135,42 @@ tr_TR: enabled: '%{when} arÅŸivlendi' disabled: '%{when} arÅŸivden çıkarıldı' pinned: - enabled: '%{when} baÅŸa tutturuldu' - disabled: '%{when} baÅŸta tutturulması kaldırıldı' + enabled: '%{when} en yukarıda sabitlendi' + disabled: '%{when} en yukarıda sabitlenmesi kaldırıldı' pinned_globally: - enabled: '%{when} her yerde baÅŸa tutturuldu' - disabled: '%{when} her yerde baÅŸta tutturulması kaldırıldı' + enabled: '%{when} her yerde en yukarıda sabitlendi' + disabled: '%{when} en yukarıda sabitlenmesi kaldırıldı' visible: enabled: '%{when} listelendi' disabled: '%{when} listelenmedi' banner: - enabled: 'Bu konu manÅŸete taşınmıştır %{when}. Kullanıcı tarafından yoksayılana kadar her sayfanın en üstünde belirecektir.' - topic_admin_menu: "konuyla alakalı yönetici eylemleri" - wizard_required: "Yeni Discourse'unuza hoÅŸgeldiniz! Hadi kuruluma baÅŸlayalım! Kurulum Sihirbazı ✨" - emails_are_disabled: "Tüm giden e-postalar yönetici tarafından genel olarak devre dışı bırakıldı. Herhangi bir e-posta bildirimi gönderilmeyecek." + enabled: 'Bunu pankart yaptı %{when}. Kullanıcı tarafından yoksayılana kadar her sayfanın en üstünde belirecek.' + disabled: 'Pankart kaldırıldı %{when}. Bundan sonra her sayfanın en üstünde gözükmeyecek. ' + topic_admin_menu: "konu yöneticisi eylemleri" + wizard_required: "Yeni Discourse'una hoÅŸgeldin! Haydi kuruluma baÅŸlayalım! Kurulum Sihirbazı ✨" + emails_are_disabled: "Giden tüm e-postalar yönetici tarafından devre dışı bırakıldı. Herhangi bir e-posta bildirimi gönderilmeyecek." + bootstrap_mode_disabled: "Önyükleme modu 24 saat içinde devre dışı bırakılacak. " themes: default_description: "Varsayılan " s3: regions: - ap_northeast_1: "Asia Pacific (Tokyo)" - ap_northeast_2: "Asia Pacific (Seoul)" - ap_south_1: "Asia Pacific (Mumbai)" - ap_southeast_1: "Asia Pacific (Singapore)" - ap_southeast_2: "Asia Pacific (Sydney)" - cn_north_1: "China (Beijing)" - eu_central_1: "EU (Frankfurt)" - eu_west_1: "EU (Ireland)" + ap_northeast_1: "Asya Pasifik (Tokyo)" + ap_northeast_2: "Asya Pasifik (Seul)" + ap_south_1: "Asya Pasifik (Mumbai)" + ap_southeast_1: "Asya Pasifik (Singapur)" + ap_southeast_2: "Asya Pasifik (Sidney)" + cn_north_1: "Çin (Pekin)" + eu_central_1: "AB (Frankfurt)" + eu_west_1: "AB (İrlanda)" eu_west_2: "AB (Londra)" - sa_east_1: "South America (Sao Paulo)" - us_east_1: "US East (N. Virginia)" - us_east_2: "ABD DoÄŸu (Ohio)" - us_gov_west_1: "AWS GovCloud (US)" - us_west_1: "US West (N. California)" - us_west_2: "US West (Oregon)" - edit: 'bu konunun baÅŸlığını ve kategorisini düzenleyin' + eu_west_3: "AB (Paris)" + sa_east_1: "Güney Amerika (Sao Paulo)" + us_east_1: "DoÄŸu ABD (Kuzey Virjinya)" + us_east_2: "DoÄŸu ABD (Ohio)" + us_gov_west_1: "AWS GovCloud (ABD)" + us_west_1: "Batı ABD (Kuzey Kaliforniya)" + us_west_2: "Batı ABD (Oregon)" + edit: 'bu konunun baÅŸlığını ve kategorisini düzenle' not_implemented: "Bu özellik henüz geliÅŸtirilmedi, üzgünüz!" no_value: "Hayır" yes_value: "Evet" @@ -177,76 +181,87 @@ tr_TR: log_in: "GiriÅŸ Yap" age: "YaÅŸ" joined: "Katıldı" - admin_title: "Yönetim" - flags_title: "Bildirilenler" - show_more: "devamını göster" + admin_title: "Yönetici" + flags_title: "Bayraklar" + show_more: "daha fazla göster" show_help: "seçenekler" links: "BaÄŸlantılar" links_lowercase: - one: baÄŸlantılar - other: baÄŸlantılar + one: "baÄŸlantılar" + other: "baÄŸlantılar" faq: "SSS" - guidelines: "Yönergeler" + guidelines: "Öneriler" privacy_policy: "Gizlilik SözleÅŸmesi" privacy: "Gizlilik" - terms_of_service: "Kullanım KoÅŸulları" + tos: "Kullanım KoÅŸulları" mobile_view: "Mobil Görünüm" - desktop_view: "Masaüstü Görünüm" - you: "Siz" + desktop_view: "Masaüstü Görünümü" + you: "Sen" or: "ya da" now: "hemen ÅŸimdi" read_more: 'devamını oku' more: "Daha fazla" less: "Daha az" never: "asla" - every_30_minutes: "30 dakikada bir" + every_30_minutes: "her 30 dakikada bir" every_hour: "her saat" daily: "günlük" weekly: "haftalık" every_two_weeks: "her iki haftada bir" every_three_days: "her üç günde bir" - max_of_count: "azami {{count}}" + max_of_count: "maksimum {{count}}" alternation: "ya da" character_count: - one: '{{count}} karakter' - other: '{{count}} karakter' + one: "{{count}} karakter" + other: "{{count}} karakter" suggested_topics: title: "Önerilen Konular" - pm_title: "Önerilen İletiler" + pm_title: "Önerilen Mesajlar" about: simple_title: "Hakkında" title: "%{title} Hakkında" - stats: "Site Sayıtımları" + stats: "Site İstatistikleri" our_admins: "Yöneticilerimiz" our_moderators: "Moderatörlerimiz" stat: all_time: "Tüm Zamanlar" - like_count: "BeÄŸeni" + last_7_days: "Son 7" + last_30_days: "Son 30" + like_count: "BeÄŸeniler" topic_count: "Konular" post_count: "Gönderiler" user_count: "Kullanıcılar" - active_user_count: "Etkin Kullanıcılar" + active_user_count: "Aktif Kullanıcılar" contact: "Bize Ulaşın" - contact_info: "Bu siteyi etkileyen ciddi bir sorun ya da acil bir durum oluÅŸtuÄŸunda, lütfen %{contact_info} adresi üzerinden bizimle iletiÅŸime geçin." + contact_info: "Bu siteyi etkileyen ciddi bir sorun ya da acil bir durum oluÅŸtuÄŸunda, lütfen %{contact_info} adresi üzerinden bizimle iletiÅŸime geç." bookmarked: - title: "İmle" - clear_bookmarks: "İmleneneri Temizle" + title: "İşaret" + clear_bookmarks: "İşaretlenenleri Temizle" help: - bookmark: "Bu konudaki ilk gönderiyi imlemek için tıklayın" - unbookmark: "Bu konudaki bütün imleri kaldırmak için tıklayın" + bookmark: "Bu konudaki ilk gönderiyi iÅŸaretlemek için tıkla" + unbookmark: "Bu konudaki tüm iÅŸaretlenenleri kaldırmak için tıkla" bookmarks: - not_logged_in: "üzgünüz, gönderileri imleyebilmeniz için oturum açmanız gerekiyor." - created: "bu gönderiyi imlediniz" - not_bookmarked: "bu gönderiyi okudunuz; imlerinize eklemek için tıklayın" - last_read: "bu okuduÄŸunuz son gönderi; imlerinize eklemek için tıklayın" - remove: "İmi Kaldır" - confirm_clear: "Bu konuya ait tüm imleri kaldırmak istediÄŸinize emin misiniz?" + not_logged_in: "üzgünüz, gönderileri iÅŸaretleyebilmek için giriÅŸ yapmalısın" + created: "bu gönderiyi iÅŸaretledin" + not_bookmarked: "bu gönderiyi okudun; iÅŸaretlemek için tıkla" + last_read: "bu okuduÄŸun son gönderi; iÅŸaretlemek için tıkla" + remove: "İşareti Kaldır" + confirm_clear: "Bu konuya ait tüm iÅŸaretleri kaldırmak istediÄŸine emin misin?" + drafts: + resume: "Sürdür" + remove: "Kaldır" + new_topic: "Yeni konu taslağı" + new_private_message: "Yeni özel mesaj taslağı" + topic_reply: "Cevap taslağı" topic_count_latest: - one: '{{count}} yeni ya da güncellenmiÅŸ konu.' - other: '{{count}} yeni ya da güncellenmiÅŸ konu.' + one: "{{count}} yeni ya da güncellenmiÅŸ konu." + other: "{{count}} yeni ya da güncellenmiÅŸ konu." topic_count_unread: - one: '{{count}} Okunmamış konuyu görün' - other: '{{count}} Okunmamış konuları görün' + one: "{{count}} Okunmamış konuyu görün" + other: "{{count}} Okunmamış konuları görün" + topic_count_new: + one: "{{count}} Yeni Konu Gör" + other: "{{count}} Yeni konular gör" preview: "önizleme" cancel: "iptal" save: "DeÄŸiÅŸiklikleri Kaydet" @@ -263,16 +278,16 @@ tr_TR: undo: "Geri Al" revert: "Eski Haline Getir" failed: "BaÅŸarısız oldu" - switch_to_anon: "Anonim Moduna Geç" - switch_from_anon: "Anonim Modundan Çık" + switch_to_anon: "Anonim Moda Geç" + switch_from_anon: "Anonim Moddan Çık" banner: - close: "Bu manÅŸeti yoksay." - edit: "Bu manÅŸeti düzenle >>" + close: "Bu pankartı artık anımsatma" + edit: "Bu pankartı düzenle >>" choose_topic: - none_found: "Hiç bir konu bulunamadı." + none_found: "Hiçbir konu bulunamadı." title: - search: "İsim, url ya da id ile baÅŸlık arayın:" - placeholder: "konu baÅŸlığını buraya yazın" + search: "İsim, url ya da id ile konu ara:" + placeholder: "konu baÅŸlığını buraya yaz" queue: topic: "Konu:" approve: 'Onayla' @@ -282,18 +297,18 @@ tr_TR: none: "Gözden geçirilecek bir gönderi yok." edit: "Düzenle" cancel: "İptal" - view_pending: "bekleyen gönderileri görüntüleyin" + view_pending: "bekleyen gönderileri görüntüle" has_pending_posts: - one: Bu konuda {{count}} sayıda onay bekleyen gönderi var - other: Bu konuda {{count}} sayıda onay bekleyen gönderi var - confirm: "Düzenlemeleri Kaydet" - delete_prompt: "%{username} kullanıcısını silmek istediÄŸinize emin misiniz? Bunu yaparsanız tüm gönderileri silinecek, e-posta adresi ve IP adresi engellenecek." + one: "Bu konuda {{count}} sayıda onay bekleyen gönderi var" + other: "Bu konuda {{count}} adet onay bekleyen gönderi var" + confirm: "DeÄŸiÅŸiklikleri Kaydet" + delete_prompt: "%{username} kullanıcısını silmek istediÄŸine emin misin? Bunu yaparsan kullanıcının tüm gönderileri silinecek, e-posta adresi ve IP adresi engellenecek." approval: title: "Gönderi Onay Gerektirir" - description: "Gönderinizi aldık fakat gösterilmeden önce bir moderatör tarafından onaylanması gerekiyor. Lütfen sabırlı olun." + description: "Yeni gönderini aldık fakat gösterilmeden önce moderatör tarafından onaylanması gerekiyor. HoÅŸgörün için teÅŸekkür ederiz. " pending_posts: - one: Bekleyen {{count}} gönderiniz bulunmaktadır. - other: Bekleyen {{count}} gönderiniz bulunmaktadır. + one: "Bekleyen {{count}} gönderiniz bulunmaktadır." + other: "Bekleyen {{count}} gönderin bulunuyor. " ok: "Tamam" user_action: user_posted_topic: "{{user}} konuyu açtı" @@ -301,44 +316,45 @@ tr_TR: user_replied_to_post: "{{user}} {{post_number}} gönderiyi cevapladı" you_replied_to_post: "{{post_number}} gönderiyi sen cevapladın" user_replied_to_topic: "{{user}} konuya cevap verdi" - you_replied_to_topic: "Siz konuya cevap verdiniz" + you_replied_to_topic: "Sen konuya cevap verdin" user_mentioned_user: "{{user}} {{another_user}} adlı kullanıcıdan bahsetti" user_mentioned_you: "{{user}} sizden bahsetti" - you_mentioned_user: "Siz, {{another_user}} adlı kullanıcıdan bahsettiniz" + you_mentioned_user: "Sen, {{another_user}} adlı kullanıcıdan bahsettin" posted_by_user: "{{user}} tarafından gönderildi" - posted_by_you: "Sizin tarafınızdan gönderildi" - sent_by_user: "{{user}} tarafından yollandı" - sent_by_you: "Sizin tarafınızdan yollandı" + posted_by_you: "Senin tarafından gönderildi" + sent_by_user: "{{user}} tarafından gönderildi" + sent_by_you: "Senin tarafından gönderildi" directory: - filter_name: "kullanıcı adına göre süz" + filter_name: "kullanıcı adına göre filtrele" title: "Kullanıcılar" likes_given: "Verilen" likes_received: "Alınan" - topics_entered: "Görüntülendi" - topics_entered_long: "GörüntülediÄŸi Konular" + topics_entered: "Görüntülenen" + topics_entered_long: "Görüntülenen Konular" time_read: "Okuma Zamanı" topic_count: "Konular" topic_count_long: "OluÅŸturulan Konular" - post_count: "Cevap" + post_count: "Cevaplar" post_count_long: "Gönderilen Cevaplar" - no_results: "Sonuç bulunamadı." + no_results: "Hiçbir sonuç bulunamadı." days_visited: "Ziyaretler" - days_visited_long: "Ziyaret Günü" - posts_read: "OkunmuÅŸlar" - posts_read_long: "OkunmuÅŸ Gönderiler" + days_visited_long: "Ziyaret edilen günler" + posts_read: "Okunan" + posts_read_long: "Okunan Gönderiler" total_rows: - one: '%{count} kullanıcı' - other: '%{count} kullanıcı' + one: "%{count} kullanıcı" + other: "%{count} kullanıcı" group_histories: actions: change_group_setting: "Grup ayarlarını deÄŸiÅŸtir" add_user_to_group: "Kullanıcı ekle" remove_user_from_group: "Kullanıcıyı kaldır" - make_user_group_owner: "Sahip yap" + make_user_group_owner: "Sahibi yap" remove_user_as_group_owner: "SahipliÄŸini İptal Et" groups: add_members: title: "Üyeleri ekle" + description: "Bu grubun üyeliÄŸini yönet" usernames: "Kullanıcı adları" manage: title: 'Yönet' @@ -350,6 +366,7 @@ tr_TR: title: Profil interaction: title: EtkileÅŸim + posting: Gönderiliyor notification: Bildirim membership: title: Üyelik @@ -364,25 +381,26 @@ tr_TR: details: "Ayrıntılar" from: "Kimden" to: "Kime" - public_admission: "Kullanıcıların gruba özgürce katılmalarına izin ver (grubun Herkese açık olması gerekir)" - public_exit: "Kullanıcıların grubu özgürce terk etmesine izin ver" + public_admission: "Kullanıcıların gruba ücretsiz olarak katılmalarına izin ver (Grubun herkese açık olması gerekiyor)" + public_exit: "Kullanıcıların gruptan ücretsiz olarak ayrılmalarına izin ver" empty: - posts: "Bu grubun üyelerinden konu yok." - members: "Bu grupta üye bulunmamaktır." - mentions: "Bu grupta kimseden bahsedilmemiÅŸtir." - messages: "Bu grupta mesaj bulunmamaktadır." - topics: "Bu grubun üyeleri tarafından oluÅŸturulmuÅŸtur baÅŸlık yoktur." - logs: "Bu grup için log kaydı bulunmamaktadır." + posts: "Bu grubun üyeleri henüz bir gönderi yapmamış." + members: "Bu grupta henüz hiç üye bulunmuyor. " + mentions: "Henüz bu gruptan kimse söz etmemiÅŸ." + messages: "Henüz bu grup için hiç mesaj bulunmuyor. " + topics: "Bu grubun üyeleri tarafından oluÅŸturulmuÅŸ herhangi bir konu bulunmuyor. " + logs: "Bu grup için herhangi bir kayıt bulunmuyor. " add: "Ekle" join: "Katıl" leave: "Ayrıl" request: "İstek" - message: "ileti" - allow_membership_requests: "Kullanıcılar'ın grup sahiplerine üyelik talepleri göndermesine izin ver" + message: "Mesaj" + allow_membership_requests: "Tüm kullanıcıların grup sahiplerine üyelik talebi göndermesine izin ver" + membership_request_template: "Üyelik talebi gönderirken kullanıcılara gösterilen özel ÅŸablon" membership_request: - submit: "İstek Gönderin" - title: "@%{group_name} için Katılma isteÄŸi " - reason: "Grup sahiplerine bu gruba neden üye olduÄŸunuzu bildirin" + submit: "Talep gönderimi" + title: "@%{group_name} için katılım talebi " + reason: "Grup sahiplerine bu gruba neden üye olduÄŸunu bildir" membership: "Üyelik" name: "İsim" group_name: "Grup adı" @@ -393,99 +411,117 @@ tr_TR: index: title: "Gruplar" all: "Tüm Gruplar" - empty: "Görünen hiç bir grup bulunmamaktadır." + empty: "Görünen hiçbir grup bulunmuyor. " filter: "Grup tipine göre filtrele" + owner_groups: "Sahibi olduÄŸum gruplar" close_groups: "Kapanmış Gruplar" automatic_groups: "Otomatik Gruplar" automatic: "Otomatik" closed: "Kapanmış" public: "Herkese Açık" private: "Özel" + public_groups: "Açık Gruplar" + automatic_group: Otomatik Grup + close_group: Kapalı grup + my_groups: "Gruplarım" + group_type: "Grup türü" + is_group_user: "Üye" + is_group_owner: "Sahip" title: - one: Gruplar - other: Gruplar - activity: "Etkinlik" + one: "Gruplar" + other: "Gruplar" + activity: "Aktivite" members: + title: "Üyeler" filter_placeholder_admin: "kullanıcı adı ya da e-posta" + filter_placeholder: "kullanıcı adı" + remove_member: "Üyeyi çıkar" + remove_member_description: "%{username} üyeyi bu guptan çıkar" + make_owner: "Sahibi Yap" + make_owner_description: " %{username} bu grubun sahibi yap" + remove_owner: "Sahiplikten kaldır" + remove_owner_description: "%{username} grubun sahibi olmaktan çıkar" + owner: "Sahip" topics: "Konular" posts: "Gönderiler" - mentions: "Bahsetmeler" - messages: "İletiler" - notification_level: "Grup mesajları için varsayılan bildirim düzeyi" + mentions: "Bahsedilenler" + messages: "Mesajlar" + notification_level: "Grup mesajları için varsayılan bildirim seviyesi" alias_levels: mentionable: "Bu gruptan kimler @bahsedebilir?" - messageable: "Bu gruba kimler ileti gönderebilir?" - nobody: " Hiç Kimse" + messageable: "Bu gruba kimler mesaj gönderebilir?" + nobody: " Hiç kimse" only_admins: "Sadece Yöneticiler" mods_and_admins: "Sadece Moderatörler ve Yöneticiler" members_mods_and_admins: "Sadece Grup Üyeleri, Moderatörler ve Yöneticiler" everyone: "Herkes" notifications: watching: - title: "Gözleniyor" - description: "Tüm gönderilerdeki her ileti hakkında bilgilendirileceksiniz ve yeni cevap sayısı gösterilecek." + title: "İzleniyor" + description: "Her mesajda her yeni gönderi hakkında bilgilendirileceksin ve yeni cevap sayısı gösterilecek." watching_first_post: - title: "İlk Gönderi Gözlemeniz" - description: "Bu grupta bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." + title: "İlk Gönderi İzlenmesi" + description: "Bu gruptaki her yeni konu ile ilgili olarak sadece ilk gönderide bilgilendirileceksin" tracking: title: "Takip ediliyor" - description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız ve yeni cevap sayısı gösterilecek." + description: "Herhangi biri @isminden bahseder ya da sana cevap verirse bildirim alacaksın ve yeni cevap sayısını göreceksin." regular: - title: "OlaÄŸan" - description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + title: "Normal" + description: "Herhangi biri @isminden bahseder ya da sana cevap verirse bildirim alacaksın" muted: - title: "Susturuldu" - description: "Bu gruptaki herhangi yeni bir konuyla ilgili asla bildirim almayacaksınız." - flair_url: "Avatar Kabiliyet Resmi" + title: "Sessiz" + description: "Bu gruptaki herhangi yeni bir konuyla ilgili bir bildirim almayacaksın. " + flair_url: "Avatar Resmi" flair_url_placeholder: "(İsteÄŸe baÄŸlı) Resim URL'si veya Font Awesome Class'ı" - flair_bg_color: "Avatar Kabiliyet Arkaplan Rengi" + flair_bg_color: "Avatar Arkaplan Rengi" flair_bg_color_placeholder: "(İsteÄŸe baÄŸlı) Hex renk deÄŸeri" - flair_color: "Avatar Kabiliyet Rengi" + flair_color: "Avatar Rengi" flair_color_placeholder: "(İsteÄŸe baÄŸlı) Hex renk deÄŸeri" flair_preview_icon: "İkonu önizle" - flair_preview_image: "Resimi önizle" + flair_preview_image: "Resmi önizle" user_action_groups: - "1": "Verilen BeÄŸeniler" + "1": "BeÄŸenilenler" "2": "Alınan BeÄŸeniler" - "3": "İmlenenler" + "3": "İşaretlenenler" "4": "Konular" "5": "Cevaplar" "6": "Yanıtlar" - "7": "Bahsedenler" + "7": "Bahsedilenler" "9": "Alıntılar" "11": "Düzenlemeler" - "12": "Yollanmış ögeler" + "12": "GönderilmiÅŸ öğeler" "13": "Gelen Kutusu" "14": "Bekleyen" + "15": "Taslaklar" categories: all: "tüm kategoriler" + all_subcategories: "tüm" no_subcategory: "hiçbiri" category: "Kategori" category_list: "Kategori listesini göster" reorder: - title: "Kategorileri Yeniden Sırala" - title_long: "Kategori listesini yeniden yapılandır" - fix_order: "Konumları Onar" - fix_order_tooltip: "Bütün kategoriler eÅŸsiz bir konum numarasına sabit deÄŸil, bu beklenmedik sonuçlara neden olabilir." - save: "Sıralamayı Kaydet" + title: "Kategorileri Yeniden Talep Et" + title_long: "Kategori listesini yeniden düzenle" + save: "Talebi Kaydet" apply_all: "Uygula" position: "Konum" posts: "Gönderiler" topics: "Konular" latest: "En Son" latest_by: "son gönderen" - toggle_ordering: "sıralama kontrolünü aç/kapa" + toggle_ordering: "talep kontrolünü deÄŸiÅŸtir" subcategories: "Alt kategoriler" topic_sentence: - one: '%{count} konu' - other: '%{count} konu' + one: "%{count} konu" + other: "%{count} konu" topic_stat_sentence: - one: '%{unit} beri %{count} yeni konu.' - other: '%{unit} beri %{count} yeni konu.' + one: "%{unit} beri %{count} yeni konu." + other: "%{unit} beri %{count} yeni konu." + more: " (%{count} daha fazla) ..." ip_lookup: title: IP Adresi Ara hostname: Sunucu ismi - location: Yer + location: Lokasyon location_not_found: (bilinmeyen) organisation: Organizasyon phone: Telefon @@ -493,127 +529,130 @@ tr_TR: delete_other_accounts: "Sil %{count}" username: "kullanıcı adı" trust_level: "TL" - read_time: "okunma zamanı" - topics_entered: "açılan konular" + read_time: "okunma süresi" + topics_entered: "girilen konular" post_count: "# gönderi" - confirm_delete_other_accounts: "Bu hesapları silmek isteÄŸinize emin misiniz?" + confirm_delete_other_accounts: "Bu hesapları silmek isteÄŸine emin misin?" powered_by: "ipinfo.io tarafından güçlendirildi" user_fields: - none: "(bir seçenek seçin)" + none: "(bir seçenek tercih et)" user: said: "{{username}}:" profile: "Profil" - mute: "Sustur" + mute: "Sessiz" edit: "Tercihleri Düzenle" download_archive: button_text: "Hepsini İndir" - confirm: "Gönderilerinizi indirmek istediÄŸinize emin misiniz?" - success: "İndirme baÅŸlatıldı, İşlem tamamlandığında mesaj ile bilgilendirileceksiniz." - rate_limit_error: "Gönderiler günde bir kez indirilebilir, lütfen yarın tekrar deneyin." - new_private_message: "Yeni İleti" - private_message: "İleti" - private_messages: "İletiler" - activity_stream: "Etkinlik" + confirm: "Gönderilerini indirmek istediÄŸine emin misin?" + success: "İndirme iÅŸlemi baÅŸlatıldı. İşlem tamamlandığında mesaj ile bilgilendirileceksin." + rate_limit_error: "Gönderiler günde bir kez indirilebilir, lütfen yarın tekrar dene. " + new_private_message: "Yeni Mesaj" + private_message: "Mesaj" + private_messages: "Mesajlar" + activity_stream: "Aktivite" preferences: "Tercihler" expand_profile: "GeniÅŸlet" collapse_profile: "Daralt" - bookmarks: "İmlenenler" + bookmarks: "İşaretlenenler" bio: "Hakkımda" invited_by: "Tarafından Davet Edildi" trust_level: "Güven Seviyesi" notifications: "Bildirimler" - statistics: "Sayıtımlar" + statistics: "İstatistikler" desktop_notifications: + label: "Canlı Bildirimler" not_supported: "Bildirimler bu tarayıcıda desteklenmiyor. Üzgünüz." - perm_default: "Bildirimleri EtkinleÅŸtirin" + perm_default: "Bildirimleri EtkinleÅŸtir" perm_denied_btn: "EriÅŸim İzni Reddedildi" - perm_denied_expl: "Bildirimler için izinleri reddettiniz. Tarayıcı ayarlarınızdan bildirimlere izin verin." - disable: "Bildirimleri Devre Dışı Bırakın" - enable: "Bildirimleri EtkinleÅŸtirin" - each_browser_note: "Not: Bu ayarı kullandığınız her tarayıcıda deÄŸiÅŸtirmelisiniz." + perm_denied_expl: "Bildirimler için izinleri reddettin. Bildirimlere, tarayıcı ayarlarından izin verebilirsin. " + disable: "Bildirimleri Devre Dışı Bırak" + enable: "Bildirimleri EtkinleÅŸtir" + each_browser_note: "Not: Bu ayarı kullandığın her tarayıcıda deÄŸiÅŸtirmelisin." + consent_prompt: "Gönderilerine cevap verildiÄŸinde anlık bildirim almak ister misin?" dismiss: 'Yoksay' dismiss_notifications: "Tümünü Yoksay" dismiss_notifications_tooltip: "Tüm okunmamış bildirileri okunmuÅŸ olarak iÅŸaretle" - first_notification: "İlk bilidiriminiz! BaÅŸlamak için seçiniz" - disable_jump_reply: "Cevapladıktan sonra gönderime atlama" + first_notification: "İlk bildirimin! BaÅŸlamak için seç. " + disable_jump_reply: "Cevapladıktan sonra \"Gönderilerim\" kısmına atlama" dynamic_favicon: "Tarayıcı simgesinde yeni / güncellenen konu sayısını göster" - theme_default_on_all_devices: "Seçilen temayı bütün cihazlarımda varsayılan yap" + theme_default_on_all_devices: "SeçtiÄŸim temayı bütün cihazlarımda \"Varsayılan\" yap" allow_private_messages: "DiÄŸer kullanıcıların bana kiÅŸisel mesaj göndermesine izin ver" external_links_in_new_tab: "Tüm dış baÄŸlantıları yeni sekmede aç" - enable_quoting: "Vurgulanan yazıyı alıntılayarak cevaplama özelliÄŸini etkinleÅŸtir" + enable_quoting: "Bahsedilen konu için yanıtlama özelliÄŸini etkinleÅŸtir" change: "deÄŸiÅŸtir" - moderator: "{{user}} bir moderatördür" - admin: "{{user}} bir yöneticidir" - moderator_tooltip: "Bu kullanıcı bir moderatör" - admin_tooltip: "Bu kullanıcı bir yönetici." - silenced_tooltip: "Bu kullanıcı susturuldu" - suspended_notice: "Bu kullanıcı {{date}} tarihine kadar uzaklaÅŸtırıldı." - suspended_permanently: "Bu kullanıcı askıya alındı." - suspended_reason: "Neden:" + moderator: "{{user}} moderatördür" + admin: "{{user}} yöneticidir" + moderator_tooltip: "Bu kullanıcı moderatördür" + admin_tooltip: "Bu kullanıcı yöneticidir." + silenced_tooltip: "Bu kullanıcı sessize alındı. " + suspended_notice: "Bu kullanıcı {{date}} tarihine kadar beklemeye alındı. " + suspended_permanently: "Bu kullanıcı beklemeye alındı." + suspended_reason: "Sebep:" github_profile: "Github" - email_activity_summary: "Etkinlik özeti" + email_activity_summary: "Aktivite özeti" mailing_list_mode: - label: "Duyuru listesi modu" - enabled: "Duyuru listesi modunu etkinleÅŸtir" - instructions: | - Bu ayar etkinlik özetini geçersiz kılacaktır.
- Susturulmuş konular ve kategoriler bu e-postalarda yer almaz. + label: "Gönderi listesi modu" + enabled: "Gönderi listesi modunu etkinleştir" + instructions: "Bu ayar aktivite özetini geçersiz kılar.
\nSessize alınmış konular ve kategoriler bu e-postalarda yer almaz. \n" individual: "Her yeni gönderi için bir e-posta gönder" - individual_no_echo: "Benim gönderilerim haricindeki her gönderi için mail gönder" + individual_no_echo: "Kendi gönderilerim haricindeki her gönderi için e-posta gönder" many_per_day: "Her yeni gönderi için bir e-posta gönder (günde yaklaşık {{dailyEmailEstimate}})." few_per_day: "Her yeni gönderi için bana e-posta gönder ( günlük yaklaşık 2 )" + warning: "Gönderi listesi modu etkin. E-posta bildirim ayarları geçersiz kılınmış." tag_settings: "Etiketler" - watched_tags: "Gözlendi" - watched_tags_instructions: "Bu etiketlerdeki tüm konuları otomatik olarak gözleyeceksiniz. Tüm yeni gönderi ve konulardan haberdar olabilecek ve yeni gönderilerin sayısı da konunun yanında görebileceksiniz." + watched_tags: "İzlendi" + watched_tags_instructions: "Bu etiketlerdeki tüm konuları otomatik olarak izleyeceksin. Tüm yeni gönderi ve konulardan haberdar olacak ve yeni gönderilerin sayısını konunun yanında göreceksin. " tracked_tags: "Takipte" - tracked_tags_instructions: "Bu etiketlerdeki tüm konuları otomatik olarak takip edeceksiniz. Yeni gönderilerin sayısını da konunun yanında görebileceksiniz." - muted_tags: "Susturuldu" - muted_tags_instructions: "Bu etiketlerdeki yeni konular hakkında herhangi bir bildirim almayacaksınız ve en son gönderilerde de gözükmeyecekler." - watched_categories: "Gözlendi" - watched_categories_instructions: "Bu kategorilerdeki tüm konuları otomatik olarak gözleyeceksiniz. Tüm yeni gönderi ve konulardan haberdar olabilecek ve yeni gönderilerin sayısı da konunun yanında görebileceksiniz." + tracked_tags_instructions: "Bu etiketlerdeki tüm konuları otomatik olarak takip edeceksin. Yeni gönderilerin sayısını konunun yanında göreceksin. " + muted_tags: "Sessiz" + muted_tags_instructions: "Bu etiketlerdeki yeni konular hakkında herhangi bir bildirim almayacaksın ve en son gönderilerde de bunlar gözükmeyecek." + watched_categories: "İzlendi" + watched_categories_instructions: "Bu kategorilerdeki tüm konuları otomatik olarak izleyeceksin. Tüm yeni gönderi ve konu baÅŸlıklarından haberdar olacak ve yeni gönderilerin sayısını konu baÅŸlıklarının yanında göreceksin. " tracked_categories: "Takipte" - tracked_categories_instructions: "Bu kategorilerdeki tüm konuları otomatik olarak takip edeceksiniz. Yeni gönderilerin sayısını da konunun yanında görebileceksiniz." - watched_first_post_categories: "İlk gönderi gözlemeniz" - watched_first_post_categories_instructions: "Bu kategorilerdeki tüm yeni konuların ilk gönderilerinde bildirim alacaksınız." - watched_first_post_tags: "İlk gönderi gözlemeniz" - watched_first_post_tags_instructions: "Bu etiketlerdeki her yeni konudaki ilk gönderi için bildirim alacaksınız." - muted_categories: "Susturuldu" - muted_categories_instructions: "Bu kategorilerdeki yeni konular hakkında herhangi bir bildiri almayacaksınız ve en son gönderilerde gözükmeyecekler. " - no_category_access: "Bir moderatör olarak kategori eriÅŸiminiz sınırlıdır, kaydetme devre dışıdır." + tracked_categories_instructions: "Bu kategorilerdeki tüm konuları otomatik olarak takip edeceksin. Yeni gönderilerin sayısını da konunun yanında göreceksin." + watched_first_post_categories: "İlk gönderiyi izleme" + watched_first_post_categories_instructions: "Bu kategorilerdeki tüm yeni konu baÅŸlıklarının ilk gönderilerinde bildirim alacaksın. " + watched_first_post_tags: "İlk gönderiyi izleme" + watched_first_post_tags_instructions: "Bu etiketlerdeki her yeni konu baÅŸlığındaki ilk gönderi için bildirim alacaksın. " + muted_categories: "Sessiz" + muted_categories_instructions: "Bu kategorilerdeki yeni konu baÅŸlıkları hakkında herhangi bir bildiri almayacaksın ve bu konu baÅŸlıkları en son gönderilerde gözükmeyecek." + no_category_access: "Bir moderatör olarak kategori eriÅŸimin sınırlı ve kaydetme devre dışıdır." delete_account: "Hesabımı Sil" - delete_account_confirm: "Hesabınızı kalıcı olarak silmek istediÄŸinize emin misiniz? Bu eylemi geri alamazsınız!" - deleted_yourself: "Hesabınız baÅŸarıyla silindi." - unread_message_count: "İletiler" + delete_account_confirm: "Hesabını kalıcı olarak silmek istediÄŸine emin misin? Bu eylemi geri alamazsın!" + deleted_yourself: "Hesabın baÅŸarıyla silindi." + delete_yourself_not_allowed: "Hesabının silinmesini istiyorsan lütfen bir personelle iletiÅŸime geç. " + unread_message_count: "Mesajlar" admin_delete: "Sil" users: "Kullanıcılar" - muted_users: "Susturuldu" + muted_users: "Sessiz" muted_users_instructions: "Bu kullanıcılardan gelen tüm bildirileri kapa." - muted_topics_link: "SusturulmuÅŸ konuları göster" - watched_topics_link: "Gözlenen konuları göster" - tracked_topics_link: "İzlenen konuları göster" - automatically_unpin_topics: "En alta ulaşınca otomatik olarak baÅŸlıkların tutturulmasını kaldır." + muted_topics_link: "Sessize alınan baÅŸlıkları göster" + watched_topics_link: "İzlenen konuları göster" + tracked_topics_link: "Takip edilen konuları göster" + automatically_unpin_topics: "Sayfa sonuna geldiÄŸimde en yukarıda sabitlenmiÅŸ tüm konuları kaldır. " apps: "Uygulamalar" revoke_access: "EriÅŸimi İptal Et" undo_revoke_access: "EriÅŸim İptalini Geri Al" api_approved: "Onaylanmış:" theme: "Tema" home: "Varsayılan Anasayfa" + staged: "AÅŸamalı" staff_counters: - flags_given: "yardımcı bildirimler" - flagged_posts: "bildirilen gönderiler" + flags_given: "yardımcı bayraklar" + flagged_posts: "bayraklı gönderiler" deleted_posts: "silinen gönderiler" - suspensions: "uzaklaÅŸtırmalar" + suspensions: "ertelenenler" warnings_received: "uyarılar" messages: all: "Hepsi" inbox: "Gelen Kutusu" - sent: "Gönderildi" + sent: "Gönderilen" archive: " ArÅŸiv" groups: "Gruplarım" - bulk_select: "İletileri seçin" + bulk_select: "Mesajları seç" move_to_inbox: "Gelen kutusuna taşı" move_to_archive: " ArÅŸiv" - failed_to_move: "Seçilen iletileri taşımak baÅŸarısız oldu (muhtemelen ağınız çöktü)" + failed_to_move: "Seçilen mesajların taşınması baÅŸarısız oldu (muhtemelen ÅŸebeke çöktü)" select_all: "Tümünü seç" tags: "Etiketler" preferences_nav: @@ -627,123 +666,147 @@ tr_TR: apps: "Uygulamalar" change_password: success: "(e-posta gönderildi)" - in_progress: "(e-posta yollanıyor)" + in_progress: "(e-posta gönderiliyor)" error: "(hata)" - action: "Parola Sıfırlama E-postası Gönder" - set_password: "Parola Belirle" - choose_new: "Yeni bir parola seçiniz" - choose: "Paralo seçiniz" + action: "Åžifre Sıfırlama E-postası Gönder" + set_password: "Åžifre Belirle" + choose_new: "Yeni bir ÅŸifre seç" + choose: "Åžifre seç" + second_factor_backup: + title: "İki Faktörlü Yedekleme Kodu" + regenerate: "Yeniden oluÅŸtur" + disable: "Devre dışı bırak" + enable: "EtkinleÅŸtir" + enable_long: "Yedek kodları etkinleÅŸtir" + manage: "Yedek kodları yönet" + copied_to_clipboard: "Panoya kopyalandı" + copy_to_clipboard_error: "Panoya kopyalanırken hata oluÅŸtu" + remaining_codes: "{{count}} yedek kodun kaldı " + codes: + title: "Yedek kod oluÅŸturuldu" + description: "İlgili yedek kodlar sadece bir kez kullanılabilir. Kodları güvenli ama eriÅŸilebilir bir yerde tutmalısın. " second_factor: title: "İki Faktörlü Kimlik DoÄŸrulama" disable: "İki faktörlü kimlik doÄŸrulamayı devre dışı bırak" confirm_password_description: "Devam etmek için lütfen ÅŸifrenizi onaylayın" + label: "Kod" enable_description: | Desteklenen bir uygulamada bu QR kodunu tarayın (Android - iOS - Windows Phone) ve kimlik doÄŸrulama kodunuzu girin. + disable_description: "Lütfen kimlik doÄŸrulama kodunu \"Uygulama\"dan gir" + show_key_description: "Manuel olarak gir" extended_description: | İki faktörlü kimlik doÄŸrulama, ÅŸifrenize ek olarak tek seferlik bir kod gerektirerek hesabınıza ek güvenlik ekler. Kodlar Android, iOS, ve Windows Phone cihazlar üzerinde oluÅŸturulabilir. oauth_enabled_warning: "Hesabınızda iki faktörlü kimlik doÄŸrulaması etkinleÅŸtirildikten sonra sosyal giriÅŸlerin devre dışı bırakılacağını lütfen unutmayın." change_about: - title: "Hakkımda'yı DeÄŸiÅŸtir" + title: "\"Hakkımda\"yı DeÄŸiÅŸtir" error: "Bu deÄŸeri deÄŸiÅŸtirirken bir hata oluÅŸtu." change_username: - title: "Kullanıcı Adını DeÄŸiÅŸtir" - confirm: "Kullanıcı adınızı deÄŸiÅŸtirmeniz halinde, eski gönderilerinizden yapılan tüm alıntılar ve @eskiadınızdaki bahsetmeler bozulacak. Bunu yapmak istediÄŸinize gerçekten emin misiniz?" - taken: "Üzgünüz, bu kullanıcı adı alınmış." - invalid: "Bu kullanıcı adı geçersiz. Sadece sayı ve harf içermelidir." + title: "\"Kullanıcı Adı\"nı DeÄŸiÅŸtir" + confirm: "\"Kullanıcı Adı\"nı deÄŸiÅŸtirmek istediÄŸine emin misin?" + taken: "Üzgünüz, bu kullanıcı adı daha önce alınmış. " + invalid: "Bu kullanıcı adı geçersiz. Kullanıcı adı, sadece sayı ve harf içerebilir. " change_email: - title: "E-posta Adresini DeÄŸiÅŸtirin" + title: "\"E-posta Adresi\"ni DeÄŸiÅŸtir" taken: "Üzgünüz, bu e-posta kullanılabilir deÄŸil." - error: "E-posta adresinizi deÄŸiÅŸtirirken bir hata oluÅŸtu. Belki bu adres zaten kullanımdadır?" - success: "Adresinize bir e-posta gönderdik. Lütfen onaylama talimatlarını uygulayınız." - success_staff: "Åžu anki adresinize bir eposta gönderdik. Lütfen doÄŸrulama yönergelerini takip edin." + error: "\"E-posta Adresi\"ni deÄŸiÅŸtirirken bir hata oluÅŸtu. Bu adres zaten kullanımda olabilir! " + success: "Adresine bir e-posta gönderdik. Lütfen onaylama talimatlarını takip et." + success_staff: "Åžu anki adresine bir e-posta gönderdik. Lütfen doÄŸrulama bilgilendirmelerini takip et." change_avatar: - title: "Profil görselinizi deÄŸiÅŸtirin" + title: "Profil resmini deÄŸiÅŸtir" gravatar: "Gravatar, baz alındı" - gravatar_title: "Profil görselinizi Gravatar sitesinde deÄŸiÅŸtirin" - refresh_gravatar_title: "Profil görselinizi yenileyin" - letter_based: "Sistem tarafından verilen profil görseli" - uploaded_avatar: "Özel resim" - uploaded_avatar_empty: "Özel resim ekleyin" - upload_title: "Resminizi yükleyin" - upload_picture: "Resim Yükle" - image_is_not_a_square: "Uyarı: resminizi kırptık; geniÅŸlik ve yükseklik eÅŸit deÄŸildi." - cache_notice: "Profil resminizi baÅŸarıyla deÄŸiÅŸtirdiniz fakat tarayıcı önbelleklemesi nedeniyle görünür olması biraz zaman alabilir." + gravatar_title: "Profil görselini \"Gravatar web sitesi\"nde deÄŸiÅŸtir" + gravatar_failed: "Gravatar getirilemedi. Bu e-posta adresiyle iliÅŸkili bir yönlendirme bulunuyor mu?" + refresh_gravatar_title: "Gravatar profil görselini yenile" + letter_based: "Sistem profil görseli atadı" + uploaded_avatar: "KiÅŸisel resim" + uploaded_avatar_empty: "KiÅŸisel bir resim ekle" + upload_title: "Resmini yükle" + upload_picture: "Resim yükle" + image_is_not_a_square: "Uyarı: GeniÅŸliÄŸi ve yüksekliÄŸi eÅŸit olmadığı için görseli kesmek durumunda kaldık." change_profile_background: title: "Profil Arkaplanı" - instructions: "Profil arkaplanları ortalanacak ve geniÅŸlikleri 850px olacak. " + instructions: "Profil arkaplanları ortalanacak ve geniÅŸliÄŸi 850px olacak. " change_card_background: title: "Kullanıcı Kartı Arkaplanı" - instructions: "Profil arkaplanları ortalanacak ve geniÅŸlikleri 590px olacak. " + instructions: "Profil arkaplanları ortalanacak ve geniÅŸliÄŸi 590px olacak. " email: title: "E-posta" - instructions: "Kimseye gösterilmeyecek" - ok: "Onay için size e-posta atacağız" - invalid: "Lütfen geçerli bir e-posta adresini giriniz" - authenticated: "E-posta adresiniz {{provider}} tarafından doÄŸrulanmıştır" - frequency_immediately: "EÄŸer yollamak üzere olduÄŸumuz ÅŸeyi okumadıysanız size direk e-posta yollayacağız." + primary: "Öncelikli E-posta" + secondary: "İkincil E-postalar" + no_secondary: "İkincil e-posta adresi mevcut deÄŸil" + instructions: "Kimse görüntüleyemez" + ok: "Onaylaman için sana e-posta göndereceÄŸiz" + invalid: "Lütfen geçerli bir e-posta adresi gir" + authenticated: "E-posta adresin {{provider}} tarafından doÄŸrulandı" + frequency_immediately: "EÄŸer göndermek üzere olduÄŸumuz e-postayı okuyamadıysan sana direkt e-posta göndereceÄŸiz. " frequency: - one: Sadece son {{count}} dakika içinde sizi görmediysek e-posta yollayacağız. - other: Sadece son {{count}} dakika içinde sizi görmediysek e-posta yollayacağız. + one: "Sadece son {{count}} dakika içinde sizi görmediysek e-posta yollayacağız." + other: "EÄŸer seni sadece son {{count}} dakika içinde görmediysek sana bir e-posta göndereceÄŸiz. " + associated_accounts: + title: "İliÅŸkili Hesaplar" + connect: "BaÄŸlan" + revoke: "İptal" + not_connected: "(baÄŸlı deÄŸil)" name: title: "İsim" - instructions: "tam adınız (opsiyonel)" - instructions_required: "Tam adınız" - too_short: "İsminiz çok kısa" - ok: "İsminiz iyi görünüyor" + instructions: "tam adın (opsiyonel)" + instructions_required: "Tam adın" + too_short: "İsmin çok kısa" + ok: "İsmin iyi görünüyor" username: title: "Kullanıcı adı" - instructions: "Özgün, boÅŸluksuz, kısa" - short_instructions: "Kullanıcılar sizden @{{username}} olarak bahsedebilirler." - available: "Kullanıcı adınız müsait" - not_available: "Uygun deÄŸil. {{suggestion}} deneyin?" + instructions: "Benzersiz, boÅŸluksuz, kısa" + short_instructions: "Kullanıcılar senden @{{username}} olarak bahsedebilirler" + available: "Kullanıcı adı müsait" + not_available: "Uygun deÄŸil. Åžunu denemeni öneririz: {{suggestion}} " not_available_no_suggestion: "Kullanılabilir deÄŸil" - too_short: "Kullanıcı adınız çok kısa" - too_long: "Kullanıcı adınız çok uzun" + too_short: "Kullanıcı adın çok kısa" + too_long: "Kullanıcı adın çok uzun" checking: "Kullanıcı adı müsait mi kontrol ediliyor..." prefilled: "E-posta bu kullanıcı adı ile eÅŸleÅŸiyor" locale: title: "Arayüz dili" - instructions: "Kullanıcı arayüzünün dili. Sayfayı yenilediÄŸiniz zaman deÄŸiÅŸecektir." - default: "(öntanımlı)" - any: "herhangi biri" + instructions: "Kullanıcı arayüz dili. Sayfayı yenilediÄŸin zaman deÄŸiÅŸecek. " + default: "(varsayılan)" + any: "hiçbir" password_confirmation: - title: "Tekrar Parola" + title: "Åžifre tekrarı" last_posted: "Son Gönderi" - last_emailed: "Son E-posta Atılan" - last_seen: "Son Görülme" + last_emailed: "Gönderilen Son E-posta" + last_seen: "Görüldü" created: "Katıldı" log_out: "Oturumu Kapat" - location: "Yer" - website: "Web Sayfası" + location: "Lokasyon" + website: "Web Sitesi" email_settings: "E-posta" like_notification_frequency: title: "BeÄŸenildiÄŸinde bildir" always: "Her zaman" - first_time_and_daily: "İlk kez bir gönderi günlük beÄŸenildiÄŸinde" - first_time: "İlk gönderi beÄŸenisinde" + first_time_and_daily: "Günlük olarak bir gönderi ilk kez beÄŸenildiÄŸinde" + first_time: "Gönderi ilk kez beÄŸenildiÄŸinde" never: "Asla" email_previous_replies: - title: "Önceki cevapları e-postaların altına ekle" - unless_emailed: "daha önce gönderilmediyse" + title: "Önceki cevapları e-postaların sonuna ekle" + unless_emailed: "daha önce gönderilmedi ise" always: "her zaman" never: "asla" email_digests: - title: "Ben burda yokken gözde konu ve cevapların özetini e-posta olarak gönder" - every_30_minutes: "30 dakikada bir" - every_hour: "saatte bir" + title: "Ben burda deÄŸilken konuÅŸulan popüler konu ve cevapların özetini e-posta olarak gönder" + every_30_minutes: "Her 30 dakikada" + every_hour: "saatlik" daily: "günlük" - every_three_days: "her üç günde bir" + every_three_days: "her üç günde" weekly: "haftalık" - every_two_weeks: "her iki haftada bir" + every_two_weeks: "her iki haftada" include_tl0_in_digests: "Yeni kullanıcılardan gelen içeriÄŸi özet e-postalarına ekle" email_in_reply_to: "Gönderilere gelen cevapların bir örneÄŸini e-postaya ekle" - email_direct: "Birisi gönderime cevap verdiÄŸinde, benden alıntı yaptığında, @kullaniciadi ÅŸeklinde bahsettiÄŸinde ya da beni bir konuya davet ettiÄŸinde bana bir e-posta at" - email_private_messages: "Biri bana ileti yazdığında bana bir e-posta gönder" - email_always: "Sitede etkin olduÄŸum sıralarda bile bana e-posta bildirimleri gönder" + email_direct: "Herhangi biri gönderimi yanıtladığında, benden alıntı yaptığında, @kullanıcıadı ÅŸeklinde bahsettiÄŸinde ya da beni bir konuya davet ettiÄŸinde bana e-posta gönder" + email_private_messages: "Herhangi biri bana mesaj yazdığında bana e-posta gönder" + email_always: "Sitede etkin olduÄŸum sıralarda dahi bana e-posta bildirimleri gönder" other_settings: "DiÄŸer" categories_settings: "Kategoriler" new_topic_duration: - label: "Seçili durumdaki konular yeni sayılsın" + label: "Konuları ÅŸu durumda yeni kabul et" not_viewed: "Onları henüz görüntülemedim" last_here: "son ziyaretimden beri oluÅŸturulanlar" after_1_day: "son 1 gün içinde oluÅŸturulanlar" @@ -761,120 +824,123 @@ tr_TR: after_4_minutes: "4 dakika sonra" after_5_minutes: "5 dakika sonra" after_10_minutes: "10 dakika sonra" - notification_level_when_replying: "Bir konuya yazdığımda, o konuyu ÅŸuna ayarla" + notification_level_when_replying: "Bir konuya gönderi yaptığımda, konuyu ÅŸuna ayarla" invited: - search: "davetiye aramak için yazın..." + search: "davet etmek için yaz..." title: "Davetler" user: "Davet Edilen Kullanıcı" sent: "Gönderildi" - none: "Gösterilecek davet yok." + none: "Görüntülenebilecek bir davet mevcut deÄŸil." truncated: - one: İlk {{count}} davet gösteriliyor. - other: İlk {{count}} davet gösteriliyor. + one: "İlk {{count}} davet gösteriliyor." + other: "İlk {{count}} davet gösteriliyor." redeemed: "Kabul Edilen Davetler" redeemed_tab: "Kabul Edildi" - redeemed_tab_with_count: "İtfa edilmiÅŸ ({{count}})" + redeemed_tab_with_count: "Kabul edildi ({{count}})" redeemed_at: "Kabul Edildi" pending: "Bekleyen Davetler" pending_tab: "Bekleyen" pending_tab_with_count: "Beklemede ({{count}})" - topics_entered: "GörüntülenmiÅŸ Konular" + topics_entered: "Görüntülenen Konular" posts_read_count: "OkunmuÅŸ Gönderi" expired: "Bu davetin süresi doldu." rescind: "Kaldır" rescinded: "Davet kaldırıldı" - rescind_all: "Tüm davetiyeleri kaldır" - rescinded_all: "Tüm davetiyeler kaldırıldı!" - rescind_all_confirm: "Tüm davetiyeleri kaldırmak istediÄŸinizden emin misiniz?" - reinvite: "Davetiyeyi Tekrar Yolla" + rescind_all: "Tüm davetleri kaldır" + rescinded_all: "Tüm davetler kaldırıldı!" + rescind_all_confirm: "Tüm davetleri kaldırmak istediÄŸine emin misin?" + reinvite: "Daveti Tekrar Gönder" reinvite_all: "Tüm davetleri tekrar gönder" - reinvite_all_confirm: "Tüm davetiyeleri tekrar göndermek istediÄŸinizden emin misiniz?" - reinvited: "Davetiye tekrar yollandı" + reinvite_all_confirm: "Tüm davetleri tekrar göndermek istediÄŸine emin misin?" + reinvited: "Davet tekrar gönderildi" reinvited_all: "Tüm davetler tekrar gönderildi!" time_read: "Okunma Zamanı" days_visited: "Ziyaret Edilen Gün" - account_age_days: "Hesabın gün olarak yaşı" - create: "Davet Yolla" - generate_link: "Davet baÄŸlantısını kopyala" - link_generated: "Davet linki baÅŸarılı bir ÅŸekilde oluÅŸturuldu" - valid_for: "Davet linki sadece bu adres için geçerlidir: %{email}" + account_age_days: "Günlük hesap yaşı" + create: "Davet Gönder" + generate_link: "Davet BaÄŸlantısını Kopyala" + link_generated: "Davet baÄŸlantısı baÅŸarılı bir ÅŸekilde oluÅŸturuldu! " + valid_for: "Davet baÄŸlantısı sadece bu adres için geçerli: %{email}" bulk_invite: - none: "Henüz kimseyi davet etmediniz.. KiÅŸsel davet gönderebilir , veya bir çok kiÅŸiyi CSV dosyası yüklerek toplu olarak davet edebilirsiniz.." + none: "Henüz hiç kimseyi davet etmedin. KiÅŸsel davet gönderebilir ya da CSV dosyası yüklerek birden fazla kiÅŸiyi davet edebilirsin. " text: "Dosyadan Toplu Davet Gönder" - success: "Dosya baÅŸarıyla yüklendi, iÅŸlem tamamlandığında iletiyle bilgilendirileceksiniz." - error: "Üzgünüm, dosya CSV formatında olmak zorundadır." + success: "Dosya baÅŸarıyla yüklendi. İşlem tamamlandığında mesaj yoluyla bilgilendirileceksin." + error: "Üzgünüz, dosya CSV formatında olmalı. " password: - title: "Parola" - too_short: "Parolanız çok kısa." - common: "Bu parola çok yaygın." - same_as_username: "Parolanız kullanıcı adınızla aynı." - same_as_email: "Parolanız e-posta adresinizle aynı." - ok: "Parolanız uygun gözüküyor." + title: "Åžifre" + too_short: "Åžifren çok kısa" + common: "Bu ÅŸifre çokça kullanılan bir ÅŸifre" + same_as_username: "Åžifren kullanıcı adınla aynı." + same_as_email: "Åžifren e-posta adresinle aynı." + ok: "Åžifren iyi gözüküyor." instructions: "en az %{count} karakter" summary: title: "Özet" - stats: "Sayıtımlar" - time_read: "okuma süresi" + stats: "İstatistik" + time_read: "okunma süresi" + recent_time_read: "son okunma süresi" topic_count: - one: oluÅŸturulan konular - other: oluÅŸturulan konular + one: "oluÅŸturulan konular" + other: "oluÅŸturulan konular" post_count: - one: oluÅŸturulan gönderiler - other: oluÅŸturulan gönderiler + one: "oluÅŸturulan gönderiler" + other: "oluÅŸturulan gönderiler" likes_given: - one: verilen - other: verilen + one: "verilen" + other: "verilen" likes_received: - one: alınan - other: alınan + one: "alınan" + other: "alınan" days_visited: - one: ziyaret edilen gün - other: ziyaret edilen gün + one: "ziyaret edilen gün" + other: "günlük ziyaret" topics_entered: - one: görüntülenmiÅŸ baÅŸlıklar - other: görüntülenmiÅŸ baÅŸlıklar + one: "görüntülenmiÅŸ baÅŸlıklar" + other: "görüntülenmiÅŸ konular" posts_read: - one: okunmuÅŸ gönderi - other: okunmuÅŸ gönderi + one: "okunmuÅŸ gönderi" + other: "okunmuÅŸ gönderi" bookmark_count: - one: imler - other: imler - top_replies: "BaÅŸlıca Cevapları" - no_replies: "Henüz cevap bulunmuyor." - more_replies: "DiÄŸer Cevapları" - top_topics: "BaÅŸlıca Konuları" + one: "imler" + other: "iÅŸaretliler" + top_replies: "En çok cevaplananlar" + no_replies: "Henüz cevaplanmamış " + more_replies: "Daha fazla cevap" + top_topics: "En çok konuÅŸulan konular" no_topics: "Henüz konu bulunmuyor." - more_topics: "DiÄŸer Konular" - top_badges: "BaÅŸlıca Rozetleri" + more_topics: "Daha fazla konu" + top_badges: "En tepedeki rozetler" no_badges: "Henüz rozet bulunmuyor." - more_badges: "DiÄŸer Rozetleri" - top_links: "Önemli BaÄŸlantılar" + more_badges: "Daha fazla rozet" + top_links: "En çok kullanılan baÄŸlantılar" no_links: "Henüz bir baÄŸlantı bulunmuyor." most_liked_by: "En Çok BeÄŸenen" - most_liked_users: "En Çok BeÄŸenme" + most_liked_users: "En Çok BeÄŸenilen" most_replied_to_users: "En Çok Cevaplanan" - no_likes: "Henüz bir beÄŸeni bulunmuyor." - associated_accounts: "GiriÅŸler" + no_likes: "Henüz beÄŸeni bulunmuyor." + top_categories: "En Çok KonuÅŸulan Kategoriler" + topics: "Konular" + replies: "Cevaplar" ip_address: title: "Son IP Adresi" registration_ip_address: - title: "Kayıt Anındaki IP Adresi" + title: "Kayıt IP Adresi" avatar: - title: "Profil Görseli" - header_title: "profil, iletiler, imler ve tercihler" + title: "Profil Resmi" + header_title: "profil, mesajlar, iÅŸaretlenenler ve tercihler" title: title: "BaÅŸlık" none: "(hiçbiri)" filters: all: "Hepsi" stream: - posted_by: "Gönderen" - sent_by: "Yollayan" - private_message: "ileti" + posted_by: "Tarafından gönderildi" + sent_by: "Tarafından gönderildi" + private_message: "mesaj" the_topic: "konu" loading: "Yükleniyor..." errors: - prev_page: "ÅŸu sayfayı yüklemeye çalışırken:" + prev_page: "yüklemeye çalışırken " reasons: network: "AÄŸ Hatası" server: "Sunucu Hatası" @@ -882,36 +948,36 @@ tr_TR: unknown: "Hata" not_found: "Sayfa Bulunamadı" desc: - network: "Lütfen baÄŸlantınızı kontrol edin." + network: "Lütfen baÄŸlantını kontrol et" network_fixed: "Geri döndü gibi gözüküyor." server: "Hata kodu : {{status}}" - forbidden: "Bunu görüntülemeye izniniz yok." - not_found: "Hay aksi, uygulama var olmayan bir URL'i yüklemeye çalıştı." + forbidden: "Bunu görüntüleme iznin yok " + not_found: "Hoop, uygulama var olmayan bir URL'yi yüklemeye çalıştı." unknown: "Bir ÅŸeyler ters gitti." buttons: - back: "Geri Dönün" - again: "Tekrar Deneyin" + back: "Geri Dön" + again: "Tekrar Dene" fixed: "Sayfayı Yükle" close: "Kapat" - assets_changed_confirm: "Bu site yeni sürüme güncellendi. Son hali için sayfayı yenilemek ister misiniz?" - logout: "Çıkış yapıldı." + assets_changed_confirm: "Bu site henüz güncellendi. Son hali için sayfayı yenilemek ister misin?" + logout: "Çıkış yaptın." refresh: "Yenile" read_only_mode: - enabled: "Bu site yalnızca okunur modunda. Lütfen gezinmeye devam edin, ancak cevap yazma, beÄŸenme ve diÄŸer eylemler ÅŸu an için devre dışı." - login_disabled: "Site yalnızca okunur modda iken oturum açma devre dışı bırakılır ." - logout_disabled: "Site yalnızca okunur modunda iken oturum kapatma iÅŸlemi yapılamaz." - too_few_topics_and_posts_notice: "Hadi bu tartışmayı baÅŸlatalım! Åžu anda %{currentTopics} / %{requiredTopics} konu ve %{currentPosts} / %{requiredPosts} gönderi var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç tartışmaya ihtiyaç duyarlar." - too_few_topics_notice: "Hadi bu tartışmayı baÅŸlatalım! Åžu anda %{currentTopics} / %{requiredTopics} konu var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç tartışmaya ihtiyaç duyarlar." - too_few_posts_notice: "Hadi bu tartışmayı baÅŸlatalım! Åžu anda %{currentPosts} / %{requiredPosts} gönderi var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç tartışmaya ihtiyaç duyarlar." + enabled: "Bu site salt-okunur modda. Lütfen taramaya devam et, ancak yanıtlama, beÄŸenme ve diÄŸer eylemler ÅŸu an için devre dışı durumda. " + login_disabled: "Site salt-okunur modda iken giriÅŸ iÅŸlemi devre dışı bırakılır ." + logout_disabled: "Site salt-okunur modda iken çıkış iÅŸlemi yapılamaz." + too_few_topics_and_posts_notice: "Hadi bu tartışmayı baÅŸlatalım! Åžu anda %{currentTopics} / %{requiredTopics} konu ve %{currentPosts} / %{requiredPosts} gönderi var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç sohbet görmek isteyeceklerdir. " + too_few_topics_notice: "Hadi bu tartışmayı baÅŸlatalım! Åžu anda %{currentTopics} / %{requiredTopics} konu var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç sohbet görmek isteyeceklerdir. " + too_few_posts_notice: "Hadi bu tartışmayı baÅŸlatalım! Åžu anda %{currentPosts} / %{requiredPosts} gönderi var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç sohbet görmek isteyeceklerdir. " logs_error_rate_notice: reached: "%{relativeAge} – %{rate} , %{siteSettingRate} 'in site ayarları limitine ulaÅŸtı." exceeded: "%{relativeAge} – %{rate} , %{siteSettingRate} 'in site ayarları limitini aÅŸtı." rate: - one: '%{count} hata/%{duration}' - other: '%{count} hata/%{duration}' + one: "%{count} hata/%{duration}" + other: "%{count} hata/%{duration}" learn_more: "daha fazlasını öğren..." all_time: 'toplam' - all_time_desc: 'toplam oluÅŸturulan konu' + all_time_desc: 'oluÅŸturulan tüm konular ' year: 'yıl' year_desc: 'son 365 günde oluÅŸturulan konular' month: 'ay' @@ -920,135 +986,144 @@ tr_TR: week_desc: 'son 7 günde oluÅŸturulan konular' day: 'gün' first_post: İlk gönderi - mute: Sustur - unmute: Susturma - last_post: Gönderilme - time_read: Okuma + mute: Sessiz + unmute: Sessiz iptali + last_post: Gönderilen + time_read: Okunan + time_read_recently: '%{time_read} son günlerde' + time_read_tooltip: '%{time_read} toplam okuma zamanı' + time_read_recently_tooltip: '%{time_read} toplam okuma zamanı (%{recent_time_read} son 60 gün içerisinde)' last_reply_lowercase: son cevap replies_lowercase: one: cevap - other: cevap + other: cevaplar signup_cta: sign_up: "Kayıt Ol" hide_session: "Yarın bana hatırlat" hide_forever: "hayır teÅŸekkürler" - hidden_for_session: "Tamamdır, yarın tekrar soracağım. İstediÄŸiniz zaman 'GiriÅŸ' kısmını kullanarak da hesap oluÅŸturabilirsiniz." - intro: "Hey naber! :heart_eyes: Görünüşe göre tartışmaların keyfini çıkarıyorsun, fakat henüz bir hesap almak için kayıt olmamışsın." - value_prop: "Bir hesap oluÅŸturduÄŸunuzda, tam olarak neyi okuyor olduÄŸunuzu hatırlarız, böylece her zaman okumayı bırakmış olduÄŸunuz yere geri gelirsiniz. Ayrıca burada, yeni gönderiler yığıldığında e-posta yoluyla bildirim alırsınız. Ve sevgiyi paylaÅŸmak için gönderileri beÄŸenebilirsiniz. :heartbeat:" + hidden_for_session: "Tamam, sana yarın soracağım. Her zaman \"GiriÅŸ Yap\" kısmını kullanarak da hesap oluÅŸturabilirsin.." summary: - enabled_description: "Bu konunun özetini görüntülemektesiniz: topluluÄŸun en çok ilgisini çeken gönderiler" + enabled_description: "Bu konunun özetini görüntülüyorsun: Okuyucularımızın en çok ilgisini çeken gönderiler" description: "{{replyCount}} adet cevap var." description_time: "Tahmini okuma süresi {{readingTime}} dakika olan {{replyCount}} cevap var." enable: 'Bu Konuyu Özetle' disable: 'Tüm Gönderileri Göster' deleted_filter: - enabled_description: "Bu konu gizlenen silinmiÅŸ gönderiler içeriyor." - disabled_description: "Bu konuda silinen gönderiler gösteriliyor." + enabled_description: "Bu konu silinmiÅŸ gönderiler içeriyor. SilinmiÅŸ gönderiler gizli durumda. " + disabled_description: "Bu konudaki silinen gönderiler gösteriliyor." enable: "Silinen Gönderileri Gizle" disable: "Silinen Gönderileri Göster" private_message_info: - title: "İleti" - invite: "DiÄŸerlerini Davet Et..." - leave_message: "Bu mesajı gerçekten bırakmak mı istiyorsun?" - remove_allowed_user: "Bu iletiden {{name}} isimli kullanıcıyı çıkarmak istediÄŸinize emin misiniz?" - remove_allowed_group: "{{name}} bunu gerçekten iletiden kaldırmak istiyor musunuz?" + title: "Mesaj" + leave_message: "Gerçekten bu mesajdan çıkmak mı istiyorsun?" + remove_allowed_user: "Bu mesajdan {{name}} isimli kullanıcıyı çıkarmak istediÄŸine emin misin?" + remove_allowed_group: "Gerçekten {{name}} isimli kullanıcıyı bu mesajdan kaldırmak istiyor musun?" email: 'E-posta' username: 'Kullanıcı Adı' - last_seen: 'Son Görülme' + last_seen: 'Görülen' created: 'OluÅŸturuldu' created_lowercase: 'oluÅŸturuldu' trust_level: 'Güven Seviyesi' search_hint: 'kullanıcı adı, e-posta veya IP adresi' create_account: - disclaimer: "Kayıt olarak, gizlilik ilkesi ve hizmet kullanım ÅŸartlarını kabul etmiÅŸ olmaktasınız." + disclaimer: "Kayıt olarak, gizlilik ilkesi ve hizmet kullanım ÅŸartlarını kabul etmiÅŸ bulunuyorsun. " title: "Yeni Hesap OluÅŸtur" - failed: "Bir ÅŸeyler ters gitti. Bu e-posta adına daha önce bir kayıt oluÅŸturulmuÅŸ olabilir, parolamı unuttum baÄŸlantısını dene." + failed: "Bir ÅŸeyler ters gitti. Bu e-posta ile daha önce bir kayıt oluÅŸturulmuÅŸ olabilir. \"Åžifremi unuttum\" baÄŸlantısına tıklayarak ilerlemeni öneririz. " forgot_password: - title: "Parola Sıfırla" - action: "Parolamı unuttum" - invite: "Kullanıcı adınızı ya da e-posta adresinizi girin, size parola sıfırlama e-postası yollayalım." - reset: "Parola Sıfırla" - complete_username: " %{username} kullanıcı adı ile eÅŸleÅŸen bir hesap bulunması durumunda, kısa bir süre içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." - complete_email: " %{email} adresi ile eÅŸleÅŸen bir hesap bulunması durumunda, kısa bir süre içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." - complete_username_found: "%{username} kullanıcı adı ile eÅŸleÅŸen bir hesap bulduk, kısa bir süre içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." - complete_email_found: "%{email} adresi ile eÅŸleÅŸen bir hesap bulduk, kısa bir süre içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." + title: "Åžifre Sıfırlama" + action: "Åžifremi unuttum" + invite: "Kullanıcı adını ya da e-posta adresini gir. Sana ÅŸifre sıfırlama e-postası göndereceÄŸiz. " + reset: "Åžifre Sıfırlama " + complete_username: " %{username} kullanıcı adı ile eÅŸleÅŸen bir hesap bulunması durumunda, kısa bir süre içerisinde ÅŸifreni nasıl sıfırlayacağını açıklayan bir e-posta alacaksın. " + complete_email: " %{email} adresi ile eÅŸleÅŸen bir hesap bulunması durumunda, kısa bir süre içerisinde ÅŸifreni nasıl sıfırlayacağını açıklayan bir e-posta alacaksın. " + complete_username_found: "%{username} kullanıcı adı ile eÅŸleÅŸen bir hesap bulduk. Kısa bir süre içerisinde ÅŸifreni nasıl sıfırlayacağını açıklayan bir e-posta alacaksın." + complete_email_found: "%{email} adresi ile eÅŸleÅŸen bir hesap bulduk. Kısa bir süre içerisinde ÅŸifreni nasıl sıfırlayacağını açıklayan bir e-posta alacaksın. " complete_username_not_found: "Hiçbir hesap kullanıcı adı %{username} ile eÅŸleÅŸmiyor" complete_email_not_found: "Hiçbir hesap %{email} adresi ile eÅŸleÅŸmiyor" button_ok: "Tamam" button_help: "Yardım" email_login: + link_label: "Bana \"GiriÅŸ BaÄŸlantısı\"nı e-posta ile gönder" button_label: "e-posta ile" complete_username: "%{username} kullanıcı adı bir hesap ile eÅŸleÅŸirse, kısa bir süre içinde giriÅŸ baÄŸlantısına sahip bir e-posta alacaksınız." complete_email: "%{email} e-posta adresi bir hesap ile eÅŸleÅŸirse, kısa bir süre içinde giriÅŸ baÄŸlantısına sahip bir e-posta alacaksınız." complete_username_found: "%{username} kullanıcı adıyla eÅŸleÅŸen bir hesap bulduk, kısa bir süre içerisinde giriÅŸ baÄŸlantısına sahip bir e-posta alacaksınız." complete_email_found: "%{email} e-posta adresi ile eÅŸleÅŸen bir hesap bulduk, kısa bir süre içinde giriÅŸ baÄŸlantısına sahip bir e-posta alacaksınız." - complete_email_not_found: "%{email}Hiç bir hesap bulunamadı" + complete_username_not_found: "Hiçbir hesap kullanıcı adı %{username} ile eÅŸleÅŸmiyor" + complete_email_not_found: "%{email} Hiçbir hesap bulunamadı" login: title: "GiriÅŸ Yap" username: "Kullanıcı" - password: "Parola" + password: "Åžifre" second_factor_title: "İki Faktörlü Kimlik DoÄŸrulama" + second_factor_description: "Lütfen uygulamadan \"Kimlik DoÄŸrulama Kodu\"nu gir:" + second_factor_backup_title: "İki Faktörlü Yedekleme" + second_factor_backup_description: "Lütfen yedek kodlarından birini gir:" email_placeholder: "e-posta veya kullanıcı adı" caps_lock_warning: "Caps Lock açık" error: "Bilinmeyen hata" - rate_limit: "Tekrar giriÅŸ yapmayı denemeden önce lütfen bekleyin." + cookies_error: "Tarayıcın çerezleri devre dışı bırakmış gibi görünüyor. EtkinleÅŸtirmeden önce giriÅŸ yapamayabilirsin. " + rate_limit: "Tekrar giriÅŸ yapmayı denemeden önce lütfen bekle. " blank_username: "Lütfen e-posta adresinizi ya da kullanıcı adınızı girin." - blank_username_or_password: "Lütfen e-posta adresinizi ya da kullanıcı adınızı, ve parolanızı girin." - reset_password: 'Parola Sıfırlama' + blank_username_or_password: "Lütfen e-posta adresini ya da kullanıcı adını ve ÅŸifreni gir." + reset_password: 'Åžifre Sıfırlama' logging_in: "Oturum açılıyor..." or: "ya da" - authenticating: "KimliÄŸiniz doÄŸrulanıyor..." - awaiting_activation: "Hesabınız etkinleÅŸtirme iÅŸlemini bekliyor, baÅŸka bir etkinleÅŸtirme e-postası göndermek için ÅŸifremi unuttum baÄŸlantısını kullanın." - awaiting_approval: "Hesabınız henüz bir görevli tarafından onaylanmadı. Onaylandığında e-posta ile haberdar edileceksiniz." + authenticating: "KimliÄŸin doÄŸrulanıyor..." + awaiting_activation: "Hesabın etkinleÅŸtirme iÅŸlemini bekliyor. BaÅŸka bir etkinleÅŸtirme e-postası göndermek için \"Åžifremi Unuttum\" baÄŸlantısını kullan." + awaiting_approval: "Hesabın henüz bir görevli tarafından onaylanmadı. Onaylandığında e-posta ile bilgilendirileceksin." requires_invite: "Üzgünüz, bu foruma sadece davetliler eriÅŸebilir." - not_activated: "Henüz oturum açamazsınız. Hesabınızı etkinleÅŸtirmek için lütfen daha önceden {{sentTo}} adresine yollanan etkinleÅŸtirme e-postasındaki açıklamaları okuyun." - not_allowed_from_ip_address: "Bu IP adresiyle oturum açamazsınız." - admin_not_allowed_from_ip_address: "Bu IP adresinden yönetici olarak oturum açamazsınız." - resend_activation_email: "EtkinleÅŸtirme e-postasını tekrar yollamak için buraya tıklayın. " + not_activated: "Henüz oturum açamazsın. Hesabını etkinleÅŸtirmek için daha önceden {{sentTo}} adresine yollanan aktivasyon e-postasındaki açıklamaları okumalısın. " + not_allowed_from_ip_address: "Bu IP adresinden giriÅŸ yapamazsın. " + admin_not_allowed_from_ip_address: "Bu IP adresinden yönetici olarak giriÅŸ yapamazsın. " + resend_activation_email: "Aktivasyon e-postasını tekrar göndermek için buraya tıkla. " omniauth_disallow_totp: "Hesabınızın iki faktör kimlik doÄŸrulaması etkin. Lütfen ÅŸifrenizle giriÅŸ yapın." - resend_title: "EtkinleÅŸtirme epostasını tekrar gönder" - change_email: "Eposta adresini deÄŸiÅŸtir" - provide_new_email: "Yeni bir e posta adresi girerek aktivasyon maili gönderin." - submit_new_email: "Eposta adresi güncelle" - sent_activation_email_again: "{{currentEmail}} adresine yeni bir etkinleÅŸtirme e-postası yolladık. Bu e-postanın size ulaÅŸması bir kaç dakika sürebilir; istenmeyen klasörüzü kontrol etmeyi unutmayın." + resend_title: "Aktivasyon e-postasını tekrar gönder" + change_email: "E-posta adresini deÄŸiÅŸtir" + provide_new_email: "Yeni bir adres gir. Onay e-postanı tekrar gönderelim." + submit_new_email: "E-posta adresi güncelle" + sent_activation_email_again: "{{currentEmail}} adresine yeni bir etkinleÅŸtirme e-postası yolladık. Bu e-postanın sana ulaÅŸması birkaç dakika sürebilir. İstenmeyen klasörünü kontrol etmeyi unutma." to_continue: "Lütfen GiriÅŸ Yap" - preferences: "Tercihlerinizi deÄŸiÅŸtirebilmek için giriÅŸ yapmanız gerekiyor." + preferences: "Tercihlerini deÄŸiÅŸtirebilmek için giriÅŸ yapman gerekiyor." forgot: "Hesap bilgilerimi hatırlamıyorum" - not_approved: "Hesabınız henüz onaylanmış deÄŸil. Onaylandığında mail ile bilgilendirileceksiniz." - google: - title: "Google ile" - message: "Google ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + not_approved: "Hesabın henüz onaylanmış deÄŸil. Onaylandığında e--posta ile bilgilendirileceksin. " google_oauth2: + name: "Google" title: "Google ile" - message: "Google ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + message: "Google ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin ol)" twitter: + name: "Twitter" title: "Twitter ile" - message: "Twitter ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + message: "Twitter ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin ol)" instagram: + name: "Instagram" title: "Instagram ile" - message: "Instagram ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + message: "Instagram ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin ol)" facebook: + name: "Facebook" title: "Facebook ile" - message: "Facebook ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + message: "Facebook ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin ol)" yahoo: + name: "Yahoo" title: "Yahoo ile" - message: "Yahoo ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + message: "Yahoo ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin ol)" github: + name: "GitHub" title: "GitHub ile" - message: "GitHub ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin olun)" + message: "GitHub ile kimlik doÄŸrulaması yapılıyor (pop-up engelleyicilerin etkinleÅŸtirilmediÄŸinden emin ol)" invites: accept_title: "Davet" - welcome_to: "%{site_name} topluluÄŸuna hoÅŸ geldiniz!" + welcome_to: "%{site_name} hoÅŸ geldin!" invited_by: "Davet gönderen:" - social_login_available: "Ayrıca bu eposta adresini kullanan tüm sosyal aÄŸ giriÅŸleriyle oturum açabileceksiniz." - your_email: "Hesap e-posta adresiniz %{email}." + social_login_available: "Ayrıca bu e-posta adresini kullanan tüm sosyal aÄŸ giriÅŸleriyle oturum açabileceksin." + your_email: "Hesap e-posta adresin %{email}." accept_invite: "Daveti kabul et" - success: "Hesabınız oluÅŸturuldu ve ÅŸimdi giriÅŸ yaptınız." + success: "Hesabın oluÅŸturuldu ve ÅŸimdi giriÅŸ yaptın." name_label: "İsim" - password_label: "Parola Belirle" + password_label: "Åžifre Belirle" optional_description: "(isteÄŸe baÄŸlı)" password_reset: - continue: "%{site_name} devam edin" + continue: "%{site_name} devam et" emoji_set: apple_international: "Apple/Uluslararası" google: "Google" @@ -1059,104 +1134,120 @@ tr_TR: facebook_messenger: "Facebook Messenger" category_page_style: categories_only: "Yalnızca Kategoriler" - categories_with_featured_topics: "Kategoriler ve Öne Çıkarılan Konular" + categories_with_featured_topics: "Öne çıkan konulardaki kategoriler" categories_and_latest_topics: "Kategoriler ve Son Konular" categories_and_top_topics: "Kategoriler ve Popüler Konular" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' alt: 'Alt' + conditional_loading_section: + loading: Yükleniyor... select_kit: default_header_text: Seç... - no_content: Hiçbir sonuç bulunamadı + no_content: Hiçbir eÅŸleÅŸme bulunamadı filter_placeholder: Ara... + create: "'{{content}}' OluÅŸtur" + max_content_reached: + one: "Yalnızca {{count}} konu seçebilirsiniz" + other: "Yalnızca {{count}} konuları seçebilirsiniz" + min_content_not_reached: + one: "En azından {{count}} konu seçiniz" + other: "En azından {{count}}konuları seçiniz" emoji_picker: filter_placeholder: Emoji ara people: İnsanlar nature: DoÄŸa food: Gıda - activity: Etkinlik + activity: Aktivite travel: Seyahat objects: Nesneler celebration: Kutlama custom: Özel emojiler recent: Son zamanlarda kullanılmış - default_tone: Cilt rengi yok - light_tone: Açık cilt tonu - medium_light_tone: Orta açık cilt tonu - medium_tone: Orta cilt tonu - medium_dark_tone: Orta koyu cilt tonu - dark_tone: Koyu cilt tonu + default_tone: Görünüm rengi yok + light_tone: Açık görünüm tonu + medium_light_tone: Orta açık görünüm tonu + medium_tone: Orta görünüm tonu + medium_dark_tone: Orta koyu görünüm tonu + dark_tone: Koyu görünüm tonu shared_drafts: + title: "Paylaşılan taslaklar" notice: "Bu konu, yalnızca {{category}} kategorisini görebilen kiÅŸiler tarafından görülebilir." destination_category: "Hedef Kategori" + publish: "Paylaşılan Taslağı Yayımla" + confirm_publish: "Bu taslağı yayımlamak istediÄŸine emin misin?" + publishing: "Konu yayımlanıyor..." composer: emoji: "Emoji :)" - more_emoji: "dahası..." + more_emoji: "daha..." options: "Seçenekler" whisper: "fısıltı" unlist: "listelenmedi" blockquote_text: "Blok-alıntı" add_warning: "Bu resmi bir uyarıdır." toggle_whisper: "Fısıldamayı Aç/Kapa" - toggle_unlisted: "Listelenmeme aç/kapa" + toggle_unlisted: "ListelenmemiÅŸ deÄŸiÅŸiklik" posting_not_on_topic: "Hangi konuyu cevaplamak istiyorsun?" saving_draft_tip: "kaydediliyor..." saved_draft_tip: "kaydedildi" - saved_local_draft_tip: "yerele kaydedildi" - similar_topics: "Konunuz ÅŸunlara çok benziyor..." + saved_local_draft_tip: "yerel olarak kaydedildi" + similar_topics: "Konun ÅŸunlara benziyor..." drafts_offline: "çevrimdışı taslaklar" group_mentioned_limit: "Uyarı! {{group}}'den bahsettiniz, ancak bu grubun yönetici tarafından yapılandırılmış olan maksimum {{max}} kullanıcıdan bahsetme sınırını aÅŸan daha fazla üyesi var. Kimse haberdar edilmeyecek." group_mentioned: - one: '{{group}} hakkında konuÅŸarak {{count}} kiÅŸiyi bilgilendirmek üzeresin, emin misin?' - other: '{{group}} hakkında konuÅŸarak {{count}} kiÅŸiyi bilgilendirmek üzeresin, emin misin?' + one: "{{group}} hakkında konuÅŸarak {{count}} kiÅŸiyi bilgilendirmek üzeresin, emin misin?" + other: "{{group}} hakkında konuÅŸarak {{count}} kiÅŸiyi bilgilendirmek üzeresin, emin misin?" cannot_see_mention: - category: "{{username}} adlı kullanıcıdan bahsettiniz fakat Ona bildirim gönderilmeyecek çünkü bu kategoriye ulaÅŸma izni yok. Bunun gerçekleÅŸmesi için kiÅŸi bu gruba eklemeniz gerekmektedir." - private: "{{username}} adlı kullanıcıdan bahsettiniz fakat Ona bildirim gönderilmeyecek çünkü bu kiÅŸisel mesaja ulaÅŸma izni yok. Bunun gerçekleÅŸmesi için kiÅŸiyi bu PM'ye eklemeniz gerekmektedir." + category: "{{username}} adlı kullanıcıdan bahsettin fakat bildirim gönderilmeyecek çünkü kullanıcının bu kategoriye ulaÅŸma izni yok. Kullanıcının bildirimi görebilmesi için onu bu gruba eklemen gerekiyor. " + private: "{{username}} adlı kullanıcıdan bahsettin fakat bildirim gönderilmeyecek çünkü kullanıcının bu kiÅŸisel mesaja ulaÅŸma izni yok. KiÅŸisel mesaja ulaÅŸabilmesi için kullanıcıyı PM'ye eklemen gerekiyor. " error: title_missing: "BaÅŸlık gerekli" title_too_short: "BaÅŸlık en az {{min}} karakter olmalı" title_too_long: "BaÅŸlık {{max}} karakterden daha uzun olamaz" post_missing: "Gönderiler boÅŸ olamaz" post_length: "Gönderi en az {{min}} karakter olmalı" - try_like: ' düğmesini denediniz mi?' - category_missing: "Bir kategori seçmelisiniz" + try_like: ' düğmesini denedin mi?' + category_missing: "Bir kategori seçmelisin" + tags_missing: "En azından {{count}} etiket seçmelisin" save_edit: "DeÄŸiÅŸikliÄŸi Kaydet" - reply_original: "Ana Konuyu Cevapla" + reply_original: "Asıl konu üzerinden cevap ver" reply_here: "Buradan Cevapla" reply: "Cevapla" cancel: "İptal et" create_topic: "Konu OluÅŸtur" - create_pm: "İleti" + create_pm: "Mesaj" create_whisper: "Fısılda" + create_shared_draft: "Paylaşılmış taslak oluÅŸtur" + edit_shared_draft: "Paylaşılmış Taslağı Düzenle" title: "Ya da Ctrl+Enter'a bas" users_placeholder: "Kullanıcı ekle" - title_placeholder: "Bir cümlede açıklamak gerekirse bu tartışmanın konusu nedir?" - title_or_link_placeholder: "Buraya bir baÅŸlık girin veya bir link paylaşın" - edit_reason_placeholder: "neden düzenleme yapıyorsunuz?" + title_placeholder: "Tek cümleyle açıklamak gerekirse bu tartışmanın konusu nedir?" + title_or_link_placeholder: "Buraya bir konu gir veya bir baÄŸlantı paylaÅŸ" + edit_reason_placeholder: "neden düzenleme yapıyorsun?" show_edit_reason: "(düzenleme sebebi ekle)" - topic_featured_link_placeholder: "BaÅŸlığı olan bir link giriniz." + topic_featured_link_placeholder: "BaÅŸlığı olan bir baÄŸlantı gir." remove_featured_link: "Konudan baÄŸlantıyı kaldır." - reply_placeholder: "Buraya yazın. Biçimlendirmek için Markdown, BBCode ya da HTML kullanabilirsin. Resimleri sürükleyebilir ya da yapıştırabilirsin." - reply_placeholder_no_images: "Buraya yazın. Biçimlendirme için Markdown, BBCode ya da HTML kullanın." + reply_placeholder: "Buraya yaz. Biçimlendirmek için Markdown, BBCode ya da HTML kullanabilirsin. Resimleri sürükleyebilir ya da yapıştırabilirsin." + reply_placeholder_no_images: "Buraya yaz. Biçimlendirme için Markdown, BBCode ya da HTML kullan." reply_placeholder_choose_category: "Buraya yazmadan önce bir kategori seçmelisiniz." - view_new_post: "Yeni gönderinizi görüntüleyin." + view_new_post: "Yeni gönderini görüntüle." saving: "Kaydediliyor" saved: "Kaydedildi!" - saved_draft: "Gönderi taslağı iÅŸleniyor. Geri almak için seçin. " + saved_draft: "Gönderi taslağı iÅŸleniyor. Geri almak için seç. " uploading: "Yükleniyor..." show_preview: 'önizlemeyi göster »' hide_preview: '« önizlemeyi gizle' - quote_post_title: "Tüm gönderiyi alıntıla" + quote_post_title: "Tüm gönderiyi göster" bold_label: "B" - bold_title: "Kalın" - bold_text: "kalın yazı" + bold_title: "Güçlü" + bold_text: "güçlü metin" italic_label: "I" - italic_title: "Vurgular" + italic_title: "Vurgulama" italic_text: "vurgulanan yazı" - link_title: "BaÄŸlantı" - link_description: "buraya baÄŸlantı açıklamasını girin" - link_dialog_title: "BaÄŸlantı ekle" + link_title: "Hyperlink " + link_description: "buraya baÄŸlantı açıklamasını gir" + link_dialog_title: "Hyperlink ekle" link_optional_text: "isteÄŸe baÄŸlı baÅŸlık" link_url_placeholder: "http://ornek.com" quote_title: "Blok-alıntı" @@ -1165,38 +1256,57 @@ tr_TR: code_text: "paragraf girintisi 4 boÅŸluktan oluÅŸan, önceden biçimlendirilen yazı" paste_code_text: "kodu buraya gir veya yapıştır" upload_title: "Yükle" - upload_description: "yükleme açıklamasını buraya girin" + upload_description: "yükleme açıklamasını buraya gir" olist_title: "Numaralandırılmış Liste" ulist_title: "Madde İşaretli Liste" list_item: "Liste öğesi" - help: "Markdown Düzenleme Yardımı" + toggle_direction: "DeÄŸiÅŸtirme Yönü" + help: "Düzenleme Yardım İndirimi" collapse: "yazım alanını küçült" abandon: "yazım alanını kapat ve taslağı sil" modal_ok: "Tamam" modal_cancel: "İptal" - cant_send_pm: "Üzgünüz, %{username} kullanıcısına ileti gönderemezsiniz." + cant_send_pm: "Üzgünüz, %{username} kullanıcısına mesaj gönderemezsin." yourself_confirm: title: "Alıcıları eklemeyi unuttun mu?" - body: "Bu ileti ÅŸu an sadece sana gönderiliyor!" - admin_options_title: "Bu konu için isteÄŸe baÄŸlı görevli ayarları" + body: "Bu mesaj ÅŸu an sadece sana gönderiliyor!" + admin_options_title: "Bu baÅŸlık için isteÄŸe baÄŸlı görevli ayarları" composer_actions: + reply: Yanıt + draft: Taslak + edit: Düzenle + reply_to_post: + desc: "İlgili gönderiyi cevapla " + reply_as_new_topic: + label: BaÄŸlantılı konu olarak yanıtla + desc: Bu konuyla baÄŸlantılı yeni bir konu oluÅŸtur reply_as_private_message: - label: Özel Mesaj + label: Yeni Mesaj + desc: KiÅŸisel bir mesaj oluÅŸtur reply_to_topic: - label: Cevapla + label: Konuyu yanıtla + desc: "Gönderiyi deÄŸil, konuyu yanıtla" + toggle_whisper: + label: Fısıltıyı deÄŸiÅŸtir + desc: Fısıltılar sadece görevliler tarafından görülebilir + create_topic: + label: "Yeni Konu" + shared_draft: + label: "Paylaşılan Taslak" + desc: "Sadece görevli tarafından görülebilecek bir konu tasarla" notifications: tooltip: regular: - one: '{{count}} görülmemiÅŸ bildirim' - other: '{{count}} görülmemiÅŸ bildirim' + one: "{{count}} görülmemiÅŸ bildirim" + other: "{{count}} görülmemiÅŸ bildirim" message: - one: '{{count}} okunmamış ileti' - other: '{{count}} okunmamış ileti' - title: "@isim bahsediliÅŸleri, gönderileriniz ve konularınıza verilen cevaplar, iletilerle vb. ilgili bildiriler" + one: "{{count}} okunmamış ileti" + other: "{{count}} okunmamış mesaj" + title: "@isime yapılan bildirimler, gönderilerin ve konularına verilen cevaplar, mesajlarla vb. ilgili bildiriler" none: "Åžu an için bildirimler yüklenemiyor." empty: "Bildirim yok." - more: "daha eski bildirimleri görüntüle" - total_flagged: "toplam bildirilen gönderiler" + more: "Eski bildirimleri görüntüle" + total_flagged: "tüm bayraklanan gönderiler" mentioned: "{{username}} {{description}}" group_mentioned: "{{username}} {{description}}" quoted: "{{username}} {{description}}" @@ -1206,8 +1316,8 @@ tr_TR: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username}}, {{username2}} ve {{count}} diÄŸer {{description}} - other: {{username}}, {{username2}} ve {{count}} diÄŸer {{description}} + one: "{{username}}, {{username2}} ve {{count}} diÄŸer {{description}}" + other: "{{username}}, {{username2}} ve {{count}} diÄŸer {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1224,53 +1334,55 @@ tr_TR: replied: '{{username}}, "{{topic}}" başlıklı konuda size cevap verdi - {{site_title}}' posted: '{{username}}, "{{topic}}" başlıklı konuya yazdı - {{site_title}}' linked: '{{username}}, "{{topic}}" başlıklı konudaki gönderinize bağlantı yaptı - {{site_title}}' + confirm_title: 'Bildirimler etkin - %{site_title}' + confirm_body: 'Başarılı! Bildirimler etkinleştirildi.' upload_selector: title: "Resim ekle" title_with_attachments: "Resim ya da dosya ekle" from_my_computer: "Kendi cihazımdan" from_the_web: "Webden" - remote_tip: "resme bağlantı ver" + remote_tip: "resme bağlantı ata" remote_tip_with_attachments: "dosya ya da resim bağlantısı {{authorized_extensions}}" - local_tip: "cihazınızdan resimler seçin" - local_tip_with_attachments: "cihazınızdan resim ya da dosya seçin {{authorized_extensions}}" - hint: "(düzenleyiciye sürekle & bırak yaparak da yükleyebilirsiniz)" - hint_for_supported_browsers: "ayrıca resimleri düzenleyiciye sürükleyip bırakabilir ya da yapıştırabilirsiniz" + local_tip: "cihazından resimler seç" + local_tip_with_attachments: "cihazından resim ya da dosya seç {{authorized_extensions}}" + hint: "(düzenleyiciye \"sürükle ve bırak\" yaparak da yükleyebilirsin)" + hint_for_supported_browsers: "ayrıca resimleri düzenleyiciye sürükleyip bırakabilir ya da yapıştırabilirsin" uploading: "Yükleniyor" - select_file: "Dosya seçin" - image_link: "resminizin yönleneceği bağlantı" + select_file: "Dosya seç" + image_link: "resminin yönleneceği bağlantı" default_image_alt_text: resim search: sort_by: "Sırala" - relevance: "Alaka" + relevance: "Uygunluk " latest_post: "Son Gönderi" - latest_topic: "Güncel konu" + latest_topic: "En son konu" most_viewed: "En Çok Görüntülenen" most_liked: "En Çok Beğenilen" select_all: "Tümünü Seç" clear_all: "Tümünü Temizle" too_short: "Aradığın terim çok kısa." result_count: - one: {{term}} için 1 sonuç - other: {{term}} için {{count}} {{plus}} sonuç + one: "{{term}} için 1 sonuç" + other: "{{term}} için {{count}} {{plus}} sonuç" title: "konu, gönderi, kullanıcı veya kategori ara" full_page_title: "konu ya da gönderi ara" - no_results: "Hiç bir sonuç bulunamadı." + no_results: "Hiçbir sonuç bulunamadı." no_more_results: "Başka sonuç yok." searching: "Aranıyor..." post_format: "{{username}} tarafından #{{post_number}}" results_page: "'{{term}}' için arama sonuçları" - more_results: "Daha fazla sonuç var. Lütfen arama kriterlerini daraltın." - cant_find: "Aradığınızı bulamıyor musunuz?" - start_new_topic: "Belki de yeni bir konu oluşturmalısınız?" - or_search_google: "Ya da Google'la aramayı deneyin:" - search_google: "Google'la aramayı deneyin:" + more_results: "Daha fazla sonuç var. Lütfen arama kriterlerini daralt." + cant_find: "Aradığını bulamıyor musun?" + start_new_topic: "Belki de yeni bir başlık oluşturmalısın..." + or_search_google: "Ya da Google'la aramayı dene:" + search_google: "Google'la aramayı dene:" search_google_button: "Google" search_google_title: "Bu sitede ara" context: user: "@{{username}} kullancısına ait gönderilerde ara" category: "#{{category}} kategorisini ara" - topic: "Bu konuda ara" - private_messages: "İletilerde ara" + topic: "Bu konuyu ara" + private_messages: "Mesajlarda ara" advanced: title: Gelişmiş Arama posted_by: @@ -1278,28 +1390,30 @@ tr_TR: in_category: label: Kategorilendirilmiş in_group: - label: Şu Grupta + label: Grupta with_badge: - label: Rozetle + label: Rozetli with_tags: label: Etiketlenmiş filters: + label: Sadece şu konulara/ gönderilere dön... + title: Sadece başlıkta eşleştirme likes: beğendiğim posted: gönderide bulunduğum - watching: gözlediğim - tracking: takip ettiğim - private: İletilerimde - bookmarks: İmledim - first: en ilk gönderidir. - pinned: tutturulmuş - unpinned: tutturulmamış + watching: İzlediğim + tracking: Takip ettiğim + private: Mesajlarımda + bookmarks: İşaretledim + first: "ilk gönderidir " + pinned: sabitlenmiş + unpinned: sabitlenmemiş seen: Okudum unseen: Okumadım wiki: wiki olan images: resim(ler)i dahil et all_tags: Yukarıdaki tüm etiketler statuses: - label: Şöyle olan konular + label: Şu şekildeki konular open: açık closed: kapalı archived: arşivlenmiş @@ -1309,13 +1423,13 @@ tr_TR: count: label: En az gönderi sayısı time: - label: Gönderilme + label: Gönderilen before: önce after: sonra - hamburger_menu: "bir diğer konu ya da kategoriye git" + hamburger_menu: "Diğer bir konu ya da kategoriye git" new_item: "yeni" go_back: 'geri dön' - not_logged_in_user: 'güncel etkinliklerin ve tercihlerin özetinin bulunduğu kullanıcı sayfası' + not_logged_in_user: 'güncel aktivitelerin ve tercihlerin özetinin bulunduğu kullanıcı sayfası' current_user: 'kendi kullanıcı sayfana git' topics: new_messages_marker: "son ziyaret" @@ -1323,69 +1437,72 @@ tr_TR: select_all: "Tümünü Seç" clear_all: "Tümünü Temizle" unlist_topics: "Konuları Listeleme" - relist_topics: "Konuları sırala" + relist_topics: "Konuları tekrar listele" reset_read: "Okunmuşları Sıfırla" delete: "Konuları Sil" dismiss: "Yoksay" dismiss_read: "Okumadıklarını yoksay" dismiss_button: "Yoksay..." dismiss_tooltip: "Yeni gönderileri görmezden gel ya da konuları takip etmeyi bırak" - also_dismiss_topics: "Bana, tekrar okunmamış olarak gösterilmemesi için bu konuları takip etmeyi bırak." + also_dismiss_topics: "Tekrar okunmamış olarak gösterilmemesi için bu konuları takip etmeyi bırak." dismiss_new: "Yenileri Yoksay" - toggle: "konuların toplu seçimini aç/kapa" + toggle: "konuların toplu seçimini değiştir" actions: "Toplu Eylemler" change_category: "Kategori düzenle" close_topics: "Konuları Kapat" archive_topics: "Konuları Arşivle" notification_level: "Bildirimler" - choose_new_category: "Konular için yeni bir kategori seçin:" + choose_new_category: "Konular için yeni bir kategori seç:" selected: - one: {{count}} konu seçtiniz. - other: {{count}} konu seçtiniz. + one: "{{count}} konu seçtiniz." + other: "{{count}} konu seçtin." change_tags: "Etiketleri Değiştir" append_tags: "Etiketleri Ekle" - choose_new_tags: "Konular için yeni etiketler seçin:" + choose_new_tags: "Bu konular için yeni etiketler seç:" choose_append_tags: "Konulara uygulanacak yeni etiketleri seçin:" changed_tags: "Bu konuların etiketleri değiştirildi." none: - unread: "Okunmamış konunuz yok." - new: "Yeni konunuz yok." - read: "Henüz herhangi bir konu okumadınız." - posted: "Henüz herhangi bir konuda gönderi oluşturmadınız." - latest: "Son bir konu yok. Bu üzücü." - hot: "Sıcak bir konu yok." - bookmarks: "Henüz bir konu imlememişsiniz." + unread: "Okunmamış konun yok." + new: "Yeni konun yok." + read: "Henüz herhangi bir konu okumadın." + posted: "Henüz herhangi bir konuda gönderi yapmadın" + latest: "Güncel bir konu yok. Bu üzücü." + hot: "Güncel bir konu yok." + bookmarks: "Henüz bir konu işaretlememişsin. " category: "{{category}} konusu yok." - top: "Gözde bir konu yok." + top: "Popüler bir konu yok." search: "Arama sonuçları yok." educate: - new: '

Yeni konular burada görünecektir.

Öntanımlı olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işaretli olarak gösterilir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' - unread: '

Okumadığınız konular burada görünecektir.

Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane1 okunmamış ileti olduğunun gösterilmesi için

  • Konuyu oluÅŸturmuÅŸ olmanız
  • Konuya cevap vermiÅŸ olmanız
  • Konuyu 4 dakikadan fazla okumuÅŸ olmanız

Veya, konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmeniz durumlarından en az biri gerekir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' + new: '

Yeni konular burada görünecek.

Öntanımlı olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işaretli olarak gösterilir.

tercihler sayfanı ziyaret ederek bunu değiştirebilirsin.

' + unread: '

Okumadığın konular burada görünecek.

Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane1 okunmamış mesaj olduğunun gösterilmesi için

  • Konuyu oluÅŸturmuÅŸ olman
  • Konuya cevap vermiÅŸ olman
  • Konuyu 4 dakikadan fazla okumuÅŸ olman

Veya, konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmen gerekir.

tercihler sayfanı ziyaret ederek bunu değiştirebilirsin.

' bottom: - latest: "Daha fazla son konu yok." + latest: "Daha fazla güncel konu yok." hot: "Daha fazla sıcak bir konu yok." posted: "Daha fazla gönderilmiÅŸ konu yok." read: "Daha fazla okunmuÅŸ konu yok." new: "Daha fazla yeni konu yok." unread: "Daha fazla okunmamış konu yok." category: "Daha fazla {{category}} konusu yok." - top: "Daha fazla gözde konu yok." - bookmarks: "Daha fazla imlenmiÅŸ konu yok." + top: "Daha fazla popüler konu yok." + bookmarks: "Daha fazla iÅŸaretlenmemiÅŸ konu yok." search: "Daha fazla arama sonucu yok." topic: filter_to: - one: konuda {{count}} tane gönderi var - other: konuda {{count}} tane gönderi var + one: "konuda {{count}} tane gönderi var" + other: "konuda {{count}} tane gönderi var" create: 'Yeni Konu' create_long: 'Yeni bir konu oluÅŸtur' open_draft: "Taslağı Aç" - private_message: 'İleti baÅŸlat' + private_message: 'Mesaja baÅŸla' archive_message: - help: 'İletiyi arÅŸivine taşı' + help: 'Mesajı arÅŸivine taşı' title: ' ArÅŸiv' move_to_inbox: title: 'Gelen kutusuna taşı' - help: 'İletiyi yeniden gelen kutusuna taşı' + help: 'Mesajı yeniden gelen kutusuna taşı' + edit_message: + help: 'Mesajın ilk gönderisini düzenle' + title: 'Gönderiyi düzenle' list: 'Konular' new: 'yeni konu' unread: 'okunmamış' @@ -1398,53 +1515,53 @@ tr_TR: title: 'Konu' invalid_access: title: "Bu konu özel" - description: "Üzgünüz, bu konuya eriÅŸiminiz yok!" - login_required: "Bu konuyu görüntülemek için oturum açmanız gerekiyor." + description: "Üzgünüz, bu konuya eriÅŸimin yok!" + login_required: "Bu konuyu görüntülemek için giriÅŸ yapman gerekiyor." server_error: title: "Konu yüklenemedi." - description: "Üzgünüz, muhtemelen bir baÄŸlantı sorunundan ötürü bu konuyu yükleyemedik. Lütfen tekrar deneyin. EÄŸer sorun devam ederse, bizimle iletiÅŸime geçin. " + description: "Üzgünüz, muhtemelen bir baÄŸlantı sorunundan ötürü bu konuyu yükleyemedik. Lütfen tekrar dene. EÄŸer sorun devam ederse, bizimle iletiÅŸime geçmeni öneririz. " not_found: title: "Konu bulunamadı." - description: "Üzgünüz, bu konuyu bulamadık. Belki de moderatör tarafından kaldırıldı?" + description: "Üzgünüz, bu konuyu bulamadık. Bu konu moderatör tarafından kaldırılmış olabilir..." total_unread_posts: - one: bu konuda {{count}} okunmamış gönderi var - other: bu konuda {{count}} okunmamış gönderi var + one: "bu konuda {{count}} okunmamış gönderi var" + other: "bu konuda {{count}} okunmamış gönderi var" unread_posts: - one: bu konuda {{count}} tane okunmamış eski gönderi var - other: bu konuda {{count}} tane okunmamış eski gönderi var + one: "bu konuda {{count}} tane okunmamış eski gönderi var" + other: "bu konuda {{count}} okunmamış eski gönderi var" new_posts: - one: bu konuda, son okumanızdan bu yana {{count}} yeni gönderi var - other: bu konuda, son okumanızdan bu yana {{count}} yeni gönderi var + one: "bu konuda, son okumanızdan bu yana {{count}} yeni gönderi var" + other: "bu konuda, son okumandan bu yana {{count}} yeni gönderi var" likes: - one: bu konuda {{count}} beÄŸeni var - other: bu konuda {{count}} beÄŸeni var + one: "bu konuda {{count}} beÄŸeni var" + other: "bu konuda {{count}} beÄŸeni var" back_to_list: "Konu listesine geri dön" options: "Konu Seçenekleri" show_links: "Bu konunun içindeki baÄŸlantıları göster. " - toggle_information: "konu ayrıntılarını aç/kapa" - read_more_in_category: "Daha fazlası için {{catLink}} kategorisine göz atabilir ya da {{latestLink}}yebilirsiniz." - read_more: "Daha fazla okumak mı istiyorsunuz? {{catLink}} ya da {{latestLink}}." - read_more_MF: "{ UNREAD, plural, =0 {} one { 1 okunmamış mesaj } other { # okunmamış mesaj } } { NEW, plural, =0 {} one { {BOTH, select, true{ve} false {} other{}} 1 yeni konu} other { {BOTH, select, true{ve } false {} other{}} # yeni konu} } var. {CATEGORY, select, true {{catLink} kategorisine} false {{latestLink}} other {}} göz atabilirsiniz." + toggle_information: "konu ayrıntılarını deÄŸiÅŸtir" + read_more_in_category: "Daha fazlası için {{catLink}} kategorisine göz atabilir ya da {{latestLink}}yebilirsin." + read_more: "Daha fazla okumak mı istiyorsun? {{catLink}} ya da {{latestLink}}." + read_more_MF: "{ UNREAD, plural, =0 {} one { 1 okunmamış mesaj } other { # okunmamış mesaj } } { NEW, plural, =0 {} one { {BOTH, select, true{ve} false {} other{}} 1 yeni konu} other { {BOTH, select, true{ve } false {} other{}} # yeni konu} } var. {CATEGORY, select, true {{catLink} kategorisine} false {{latestLink}} other {}} göz atabilirsin." browse_all_categories: Bütün kategorilere göz at - view_latest_topics: en son konuları görüntüle - suggest_create_topic: "Konu oluÅŸturmaya ne dersiniz?" - jump_reply_up: Daha önceki cevaba geç - jump_reply_down: Daha sonraki cevaba geç + view_latest_topics: Son konuları görüntüle + suggest_create_topic: "Konu oluÅŸturmaya ne dersin?" + jump_reply_up: Önceki cevaba geç + jump_reply_down: Sonraki cevaba geç deleted: "Konu silindi " topic_status_update: title: "Konu Zamanlayıcısı" - save: "Zamanlayıcı Ayarla" - num_of_hours: "Saat deÄŸeri:" + save: "Zamanlayıcıyı Ayarla" + num_of_hours: "Saat:" remove: "Zamanlayıcıyı Kaldır" publish_to: "Åžuraya Yayınla:" when: "Ne zaman:" public_timer_types: Konu Zamanlayıcıları - private_timer_types: Kullanıcı Konusu Zamanlayıcılar + private_timer_types: Kullanıcı Konu Zamanlayıcıları auto_update_input: - none: "Bir zaman çerçevesi seçin" - later_today: "Bugünün sonlarında" + none: "Zaman aralığı seç" + later_today: "Bugün ilerleyen saatlerde" tomorrow: "Yarın" - later_this_week: "Bu haftanın sonlarında" + later_this_week: "Bu hafta içinde" this_weekend: "Bu hafta sonu" next_week: "Gelecek hafta" two_weeks: "İki Hafta" @@ -1456,7 +1573,7 @@ tr_TR: pick_date_and_time: "Tarih ve saat seç" set_based_on_last_post: "Son gönderiye göre kapat" publish_to_category: - title: "Yayınlamayı Zamanla" + title: "Program yayını" temp_open: title: "Geçici Olarak Aç" auto_reopen: @@ -1465,8 +1582,8 @@ tr_TR: title: "Geçici Olarak Kapat" auto_close: title: "Konuyu Otomatik Kapat" - label: "Åžu kadar saat sonra konuyu otomatik kapat:" - error: "Lütfen geçerli bir deÄŸer giriniz." + label: "Konunun otomatik kapatılacağı saatler:" + error: "Lütfen geçerli bir deÄŸer gir." based_on_last_post: "Konudaki son gönderi en az bu kadar eski olmadıkça kapatma." auto_delete: title: "Konuyu Otomatik Sil" @@ -1476,10 +1593,11 @@ tr_TR: auto_open: "Bu konu %{timeLeft} otomatik olarak açılacak." auto_close: "Bu konu %{timeLeft} otomatik olarak kapanacak." auto_publish_to_category: "Bu konu %{timeLeft} #%{categoryName} kategorisinde yayınlanacak." + auto_reminder: "%{timeLeft} Bu konu hakkında hatırlatılacaksınız" auto_close_title: 'Otomatik Kapatma Ayarları' auto_close_immediate: - one: Konudaki son gönderi zaten %{count} saat eski, bu yüzden konu hemen kapatılacak. - other: Konudaki son gönderi zaten %{count} saat eski, bu yüzden konu hemen kapatılacak. + one: "Konudaki son gönderi zaten %{count} saat eski, bu yüzden konu hemen kapatılacak." + other: "Konudaki son gönderi zaten %{count} saat önce gönderilmiÅŸ. Bu yüzden konu hemen kapatılacak." timeline: back: "Geri" back_description: "Okunmamış son gönderine dön" @@ -1490,244 +1608,260 @@ tr_TR: go_bottom: "en alt" go: "git" jump_bottom: "son gönderiye geç" - jump_prompt: "atla" + jump_prompt: "geç" jump_prompt_of: " %{count} gönderinin" jump_prompt_long: "Hangi gönderiye gitmek istersin?" jump_bottom_with_number: "%{post_number} numaralı gönderiye geç" - total: tüm gönderiler + jump_prompt_to_date: "ÅŸimdiye kadar" + jump_prompt_or: "ya da" + total: toplam gönderiler current: ÅŸu anki gönderi notifications: - title: bu konu hakkında ne sıklıkla bildirim alacağını deÄŸiÅŸtir + title: bu konu hakkında bildirim sıklığını deÄŸiÅŸtir reasons: - mailing_list_mode: "Duyuru listesi modunu etkinleÅŸtirdin, bundan dolayı bu konuya gelen cevaplarla ilgili bildirimleri e-posta yoluyla alacaksın. " - "3_10": 'Bu konuyla ilgili bir etiketi gözlediÄŸin için bildirim alacaksın.' - "3_6": 'Bu kategoriyi gözlediÄŸiniz için bildirimlerini alacaksınız.' - "3_5": 'Bu konuyu otomatik olarak gözlemeye baÅŸladığınız için bildirimlerini alacaksınız.' - "3_2": 'Bu konuyu gözlediÄŸiniz için bildirimlerini alacaksınız.' - "3_1": 'Bu konuyu siz oluÅŸturduÄŸunuz için bildirimlerini alacaksınız.' - "3": 'Bu konuyu gözlediÄŸiniz için bildirimlerini alacaksınız.' + mailing_list_mode: "Duyuru listesi modunu etkinleÅŸtirdin. Bu sebeple bu konuya gelen cevaplarla ilgili bildirimleri e-posta yoluyla alacaksın. " + "3_10": 'Bu konuyla ilgili bir etiketi izlediÄŸin için bildirimleri alacaksın.' + "3_6": 'Bu kategoriyi izlediÄŸin için bildirimleri alacaksın.' + "3_5": 'Bu konuyu otomatik olarak izlemeye baÅŸladığın için bildirimleri alacaksın.' + "3_2": 'Bu konuyu izlediÄŸin için bildirimleri alacaksın.' + "3_1": 'Bu konuyu sen oluÅŸturduÄŸun için bildirimleri alacaksın.' + "3": 'Bu konuyu izlediÄŸin için bildirimleri alacaksın.' "2_8": 'Bu kategoriyi takip ettiÄŸiniz için yeni cevapların sayısını göreceksiniz.' "2_4": 'Bu konuyu yanıtladığınız için yeni cevapların sayısını göreceksiniz.' "2_2": 'Bu konuyu takip ettiÄŸiniz için yeni cevapların sayısını göreceksiniz.' "2": 'Yeni cevapların sayısını göreceksiniz çünkü bu konuyu okudunuz.' - "1_2": 'Birisi @isminizden bahsederse ya da size cevap verirse bildirim alacaksınız.' - "1": 'Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız.' - "0_7": 'Bu kategoriye ait tüm bildirimleri görmezden geliyorsunuz.' - "0_2": 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' - "0": 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' + "1_2": 'Birisi @isminden bahsederse ya da sana cevap verirse bildirim alacaksın.' + "1": 'Birisi @isminden bahsederse veya sana cevap verirse bildirim alacaksın.' + "0_7": 'Bu kategoriye ait tüm bildirimleri yok sayıyorsun.' + "0_2": 'Bu konuya ait tüm bildirimleri yok sayıyorsun.' + "0": 'Bu konuya ait tüm bildirimleri yok sayıyorsun.' watching_pm: - title: "Gözleniyor" - description: "Bu iletideki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." + title: "İzleniyor" + description: "Bu mesajdaki her yeni gönderi için bir bildirim alacaksın ve yeni cevap sayısı gösterilecek." watching: - title: "Gözleniyor" - description: "Bu konudaki her yeni gönderi için bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." + title: "İzleniyor" + description: "Bu konudaki her yeni gönderi için bildirim alacaksın ve yeni cevap sayısı gösterilecek." tracking_pm: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı iletinin yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + description: "Bu mesaj için yeni cevapların sayısı gösterilecek. Birisi @isminden bahsederse veya sana cevap verirse bildirim alacaksın." tracking: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı baÅŸlığın yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + description: "Bu konu için yeni cevap sayısı gösterilecek. Birisi @isminden bahsederse veya sana cevap verirse bildirim alacaksın." regular: - title: "OlaÄŸan" - description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + title: "Normal" + description: "Birisi @isminden bahsederse veya sana cevap verirse bildirim alacaksın." regular_pm: - title: "OlaÄŸan" - description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + title: "Normal" + description: "Birisi @isminden bahsederse veya sana cevap verirse bildirim alacaksın." muted_pm: - title: "Susturuldu" - description: "Bu ileti ile ilgili hiç bir bildirim almayacaksınız." + title: "Sessiz" + description: "Bu mesaj ile ilgili hiçbir bildirim almayacaksın." muted: - title: "Susturuldu" - description: "Bu konu en son gönderilerde gözükmeyecek, ve hakkında hiçbir bildirim almayacaksınız." + title: "Sessiz" + description: "Bu konu en son gönderilerde gözükmeyecek ve hakkında hiçbir bildirim almayacaksın." actions: recover: "Konuyu Geri Getir" delete: "Konuyu Sil" open: "Konuyu Aç" close: "Konuyu Kapat" multi_select: "Gönderileri Seç..." - timed_update: "Konu Zamanlayıcısı" - pin: "BaÅŸa Tuttur..." - unpin: "BaÅŸtan Kaldır..." - unarchive: "Konuyu ArÅŸivden Kaldır" + timed_update: "Konu Zamanlayıcısını Ayarla" + pin: "Konuyu En Yukarıda Sabitle..." + unpin: "Konuyu En Yukarıda Sabitleme..." + unarchive: "Konuyu ArÅŸivleme" archive: "Konuyu ArÅŸivle" - invisible: "Gizle" - visible: "Görünür Yap" + invisible: "ListelenmemiÅŸ Yap" + visible: "ListelenmiÅŸ Yap" reset_read: "Görüntüleme Verilerini Sıfırla" make_public: "Herkese Açık Konu Yap" + make_private: "KiÅŸisel Mesaj Yap" feature: - pin: "BaÅŸa Tuttur" - unpin: "BaÅŸtan Kaldır" - pin_globally: "Her Yerde BaÅŸa Tuttur" - make_banner: "ManÅŸet Konusu" - remove_banner: "ManÅŸet Konusunu Kaldır" + pin: "Konuyu En Yukarıda Sabitle" + unpin: "Konuyu En Yukarıda Sabitleme" + pin_globally: "Konuyu Her Yerde En Yukarıda Sabitle" + make_banner: "Pankart Konusu" + remove_banner: "Pankart Konusunu Kaldır" reply: title: 'Cevapla' - help: 'bu konuya bir cevap oluÅŸturmaya baÅŸlayın' + help: 'bu konuya bir cevap oluÅŸturmaya baÅŸla' clear_pin: - title: "BaÅŸa tutturmayı iptal et" - help: "Bu konunun baÅŸa tutturulması iptal edilsin ki artık konu listenizin en üstünde gözükmesin" + title: "\"En Yukarıda Sabitleme\"yi temizle" + help: "Bu konunun en yukarıda sabitlenmesi iptal edilsin ki artık konu listenin en üstünde gözükmesin" share: title: 'PaylaÅŸ' - help: 'bu konunun baÄŸlantısını paylaşın' + help: 'bu konunun baÄŸlantısını paylaÅŸ' print: title: 'Yazdır' help: 'Bu konunun yazıcı dostu olan sürümünü aç' flag_topic: - title: 'Bildir' - help: 'bu gönderiyi kontrol edilmesi için özel olarak bildirin ya da bununla ilgili özel bir bildirim yollayın' - success_message: 'Bu konuyu baÅŸarıyla bildirdiniz.' + title: 'Bayrakla iÅŸaretle' + help: 'bu gönderiyi kontrol edilmesi için özel olarak bayrakla iÅŸaretle ya da bununla ilgili özel bir bildirim gönder' + success_message: 'Bu konuyu baÅŸarıyla bayrakla iÅŸaretledin' feature_topic: title: "Bu konuyu ön plana çıkar" pin: "Åžu zamana kadar bu konunun {{categoryLink}} kategorisinin başında görünmesini saÄŸla" - confirm_pin: "Zaten baÅŸa tutturulan {{count}} konunuz var. Çok fazla konuyu baÅŸa tutturmak yeni ve anonim kullanıcılara sıkıntı çektirebilir. Bu kategoride bir konuyu baÅŸa tutturmak istediÄŸinize emin misiniz?" + confirm_pin: "Zaten en yukarıda sabitlenmiÅŸ {{count}} konun var. Çok fazla konuyu en yukarıda sabitlemek yeni ve anonim kullanıcılarda sorun yaratabilir. Bu kategoride bir konuyu en yukarıda sabitlemek istediÄŸine emin misin?" unpin: "Bu konuyu {{categoryLink}} kategorisinin en üstünden kaldır." unpin_until: "Bu konuyu {{categoryLink}} kategorisinin başından kaldır ya da ÅŸu zamana kadar bekle: %{until}." - pin_note: "Kullanıcılar kendileri için konunun baÅŸa tutturulmasını kaldırabilir." - pin_validation: "Bu konuyu baÅŸa tutturmak için bir tarih gerekli." - not_pinned: " {{categoryLink}} kategorisinde baÅŸa tutturulan herhangi bir konu yok." + pin_note: "Kullanıcılar kendileri için konunun en yukarıda sabitlenmesini kaldırabilir." + pin_validation: "Bu konuyu en yukarıda sabitlemek için bir tarih gerekli." + not_pinned: " {{categoryLink}} kategorisinde en yukarıda sabitlenen herhangi bir konu yok." already_pinned: - one: 'Åžu an {{categoryLink}} kategorisinde baÅŸa tutturulan konular: {{count}}.' - other: 'Åžu an {{categoryLink}} kategorisinde baÅŸa tutturulan konular: {{count}}.' + one: "Åžu an {{categoryLink}} kategorisinde baÅŸa tutturulan konular: {{count}}." + other: "Åžu an {{categoryLink}} kategorisinde en yukarıda sabitlenen konular: {{count}}." pin_globally: "Åžu zamana kadar bu konunun bütün konu listelerinin başında yer almasını saÄŸla" - confirm_pin_globally: "Zaten her yerde baÅŸa tutturulan {{count}} konunuz var. Çok fazla konuyu baÅŸa tutturmak yeni ve anonim kullanıcılara sıkıntı çektirebilir. Bir konuyu daha her yerde baÅŸa tutturmak istediÄŸinizden emin misiniz?" + confirm_pin_globally: "Zaten her yerde en yukarıda sabitlenen {{count}} konun var. Çok fazla konuyu en yukarıda sabitlemek yeni ve anonim kullanıcılarda sorun yaratabilir. Bir konuyu her yerde en yukarıda sabitlemek istediÄŸine emin misin?" unpin_globally: "Bu konuyu tüm konu listelerinin en üstünden kaldır." unpin_globally_until: "Bu konuyu bütün konu listelerinin başından kaldır ya da ÅŸu zamana kadar bekle: %{until}." - global_pin_note: "Kullanıcılar kendileri için konunun baÅŸa tutturulmasını kaldırabilir." - not_pinned_globally: "Her yerde baÅŸa tutturulan herhangi bir konu yok." + global_pin_note: "Kullanıcılar kendileri için konunun en yukarıda sabitlenmesini kaldırabilir." + not_pinned_globally: "Her yerde en yukarıda sabitlenen herhangi bir konu yok." already_pinned_globally: - one: 'Åžu an her yerde baÅŸa tutturulan konular: {{count}}.' - other: 'Åžu an her yerde baÅŸa tutturulan konular: {{count}}.' - make_banner: "Bu konuyu tüm sayfaların en üstünde görünecek ÅŸekilde manÅŸetleÅŸtir." - remove_banner: "Tüm sayfaların en üstünde görünen manÅŸeti kaldır." - banner_note: "Kullanıcılar bu manÅŸeti kapatarak yoksayabilirler. Herhangi bir zamanda sadece bir konu manÅŸetlenebilir." - no_banner_exists: "ManÅŸet konusu yok." - banner_exists: "Åžu an bir manÅŸet konusu var." + one: "Åžu an her yerde baÅŸa tutturulan konular: {{count}}." + other: "Åžu an her yerde en yukarıda sabitlenen konular: {{count}}." + make_banner: "Bu konuyu tüm sayfaların en üstünde görünecek ÅŸekilde pankart yap. " + remove_banner: "Tüm sayfaların en üstünde görünen pankartı kaldır." + banner_note: "Kullanıcılar bu pankartı kapatarak yoksayabilirler. Herhangi bir zamanda sadece bir konu pankart yapılabilir. " + no_banner_exists: "Pankart konusu yok." + banner_exists: "Åžu an bir pankart konusu var." inviting: "Davet Ediliyor..." automatically_add_to_groups: "Bu davet aynı zamanda bu gruplara eriÅŸim izni saÄŸlar:" invite_private: - title: 'İletiye Davet Et' + title: 'Mesaja Davet Et' email_or_username: "Davet edilenin e-postası ya da kullanıcı adı" email_or_username_placeholder: "e-posta ya da kullanıcı adı" - action: "Davet et" - success: "O kullanıcıyı bu iletiye davet ettik." - success_group: "Grubu bu iletiye katılması için davet ettik." + action: "Davet" + success: "Kullanıcıyı bu mesaja davet ettik." + success_group: "Grubu bu mesaja katılması için davet ettik." error: "Üzgünüz, kullanıcı davet edilirken bir hata oluÅŸtu." group_name: "grup adı" controls: "Konu Kontrolleri" invite_reply: - title: 'Davet Et' - username_placeholder: "kullanıcıadı" + title: 'Davet' + username_placeholder: "kullanıcı adı" action: 'Davet Gönder' - help: 'e-posta veya bildiri aracılığıyla baÅŸkalarını bu konuya davet edin' - to_forum: "Arkadaşınıza, oturum açması gerekmeden, bir baÄŸlantıya tıklayarak katılabilmesi için kısa bir e-posta göndereceÄŸiz. " - sso_enabled: "Bu konuya davet etmek istediÄŸiniz kiÅŸinin kullanıcı adını girin." - to_topic_blank: "Bu konuya davet etmek istediÄŸiniz kiÅŸinin kullanıcı adını veya e-posta adresini girin." - to_topic_email: "Bir e-posta adresi girdiniz. Arkadaşınızın konuya hemen cevap verebilmesini saÄŸlayacak bir davetiye e-postalayacağız." - to_topic_username: "Bir kullanıcı adı girdiniz. Kullanıcıya, bu konuya davet baÄŸlantısı içeren bir bildiri yollayacağız." - to_username: "Davet etmek istediÄŸiniz kiÅŸinin kullanıcı adını girin. Kullanıcıya, bu konuya davet baÄŸlantısı içeren bir bildiri yollayacağız." + help: 'e-posta veya bildiri aracılığıyla baÅŸkalarını bu konuya davet et' + to_forum: "Arkadaşına, giriÅŸ yapması gerekmeden, baÄŸlantıya tıklayarak katılabilmesi için kısa bir e-posta göndereceÄŸiz. " + sso_enabled: "Bu konuya davet etmek istediÄŸin kiÅŸinin kullanıcı adını gir." + to_topic_blank: "Bu konuya davet etmek istediÄŸin kiÅŸinin kullanıcı adını veya e-posta adresini gir." + to_topic_email: "Bir e-posta adresi girdin. Arkadaşının bu konuya hemen cevap verebilmesini saÄŸlayacak bir davetiyeyi e-posta ile göndereceÄŸiz. " + to_topic_username: "Bir kullanıcı adı girdin. Kullanıcıya, bu konuya davet baÄŸlantısı içeren bir bildirim göndereceÄŸiz." + to_username: "Davet etmek istediÄŸin kiÅŸinin kullanıcı adını gir. Kullanıcıya, bu konuya davet baÄŸlantısı içeren bir bildirim göndereceÄŸiz." email_placeholder: 'isim@örnek.com' - success_email: "{{emailOrUsername}} kullanıcısına davet e-postalandı. Davet kabul edildiÄŸinde size bir bildiri göndereceÄŸiz. Davetlerinizi takip etmek için kullanıcı sayfanızdaki davetler sekmesine göz atın." + success_email: "{{emailOrUsername}} kullanıcısına davet e-postalandı. Davet kabul edildiÄŸinde sana bir bildirim göndereceÄŸiz. Davetlerini takip etmek için kullanıcı sayfandaki davetler sekmesine göz atmalısın. " success_username: "Kullanıcıyı bu konuya katılması için davet ettik." error: "Üzgünüz, kullanıcıyı davet edemedik. Zaten davet edilmiÅŸ olabilir mi? (Davetler oran sınırlarına tabiidir.)" success_existing_email: "{{emailOrUsername}} e-posta adresine sahip bir kullanıcı zaten var. Bu kullanıcıyı bu konuya katılmaya davet ettik." - login_reply: 'Cevaplamak için oturum açın' + login_reply: 'Cevaplamak için giriÅŸ yap' filters: n_posts: - one: '{{count}} gönderi' - other: '{{count}} gönderi' - cancel: "Filteri kaldır" + one: "{{count}} gönderi" + other: "{{count}} gönderi" + cancel: "Filtreyi kaldır" split_topic: title: "Yeni Konuya Geç" action: "yeni konuya geç" topic_name: "Yeni Konu Adı" - error: "Gönderiler yeni konuya taşınırken bir hata oluÅŸtu." + error: "Gönderileri yeni konuya taşırken bir hata oluÅŸtu." instructions: - one: Yeni bir konu oluÅŸturmak ve bu konuyu seçtiÄŸiniz {{count}} gönderi ile doldurmak üzeresiniz. - other: Yeni bir konu oluÅŸturmak ve bu konuyu seçtiÄŸiniz {{count}} gönderi ile doldurmak üzeresiniz. + one: "Yeni bir konu oluÅŸturmak ve bu konuyu seçtiÄŸiniz {{count}} gönderi ile doldurmak üzeresiniz." + other: "Yeni bir konu oluÅŸturmak ve bu konuyu seçtiÄŸin {{count}} gönderi ile doldurmak üzeresin. " merge_topic: title: "Var Olan Bir Konuya Taşı" action: "var olan bir konuya taşı" - error: "Gönderiler konuya aşınırken bir hata oluÅŸtu." + error: "Gönderileri konuya taşırken bir hata oluÅŸtu." instructions: - one: 'Lütfen bu {{count}} gönderiyi taşımak istediÄŸiniz konuyu seçin. ' - other: 'Lütfen bu {{count}} gönderiyi taşımak istediÄŸiniz konuyu seçin. ' + one: "Lütfen bu {{count}} gönderiyi taşımak istediÄŸiniz konuyu seçin. " + other: "Lütfen bu {{count}} gönderiyi taşımak istediÄŸin konuyu seç. " merge_posts: title: "Seçili Gönderileri BirleÅŸtir" action: "seçili gönderileri birleÅŸtir" error: "Seçili gönderileri birleÅŸtirirken bir hata oluÅŸtu." change_owner: title: "Gönderilerin Sahibini DeÄŸiÅŸtir" - action: "sahipliÄŸini deÄŸiÅŸtir" + action: "sahipliÄŸi deÄŸiÅŸtir" error: "Gönderilerin sahipliÄŸi deÄŸiÅŸtirilirken bir hata oluÅŸtu." label: "Gönderilerin Yeni Sahibi" placeholder: "yeni sahibin kullanıcı adı" instructions: - one: Lütfen {{old_user}} kullanıcısına ait {{count}} gönderinin yeni sahibini seçin. - other: Lütfen {{old_user}} kullanıcısına ait {{count}} gönderinin yeni sahibini seçin. + one: "Lütfen {{old_user}} kullanıcısına ait {{count}} gönderinin yeni sahibini seçin." + other: "Lütfen {{old_user}} kullanıcısına ait {{count}} gönderinin yeni sahibini seç." + instructions_warn: "Bu gönderiye iliÅŸkin bildirimlerin; yeni kullanıcıya, geriye dönük olarak aktarılmayacağını unutma." change_timestamp: - action: "Zaman Bilgisini DeÄŸiÅŸtir" - invalid_timestamp: "Zaman bilgisi gelecekte olamaz." - error: "Konunun zaman bilgisini deÄŸiÅŸtirirken bir hata oluÅŸtu." - instructions: "Lütfen konunun yeni zaman bilgisini seçiniz. Konudaki gönderiler aynı zaman farkına sahip olmaları için güncellenecekler." + title: "Tarih Bilgisini DeÄŸiÅŸtir" + action: "tarih bilgisini deÄŸiÅŸtir" + invalid_timestamp: "Tarih bilgisi gelecekte olamaz." + error: "Konunun tarih bilgisi deÄŸiÅŸirken bir hata oluÅŸtu." + instructions: "Lütfen konunun yeni tarih bilgisini seç. Konudaki gönderiler aynı zaman farkına sahip olması için güncellenecek.." multi_select: select: 'seç' selected: '({{count}}) seçildi' select_post: label: 'seç' + title: 'Seçime gönderi ekle' + selected_post: + label: 'seçilmiÅŸ' + title: 'Seçimi yayından kaldırmak için tıkla' + select_replies: + label: 'seçim +cevaplar' + title: 'Gönderiyi ve tüm cevaplarını seçime ekle' + select_below: + label: 'seç +alt' + title: 'Seçimin ardından gönderi ekle' delete: seçilenleri sil cancel: seçimi iptal et - select_all: hepsini seç + select_all: tümünü seç deselect_all: tüm seçimi kaldır description: one: {{count}} gönderi seçtiniz. - other: {{count}} gönderi seçtiniz. + other: "{{count}} gönderi seçtin." post: quote_reply: "Alıntı" edit_reason: "Neden: " post_number: "gönderi {{number}}" - wiki_last_edited_on: "wiki en son düzenlendi" - last_edited_on: "gönderinin en son düzenlenme tarihi" + wiki_last_edited_on: "son düzenlenmiÅŸ wiki" + last_edited_on: "son düzenlenmiÅŸ gönderi" reply_as_new_topic: "BaÄŸlantılı Konu Olarak Cevapla" reply_as_new_private_message: "Aynı alıcıyı yeni bir mesajla cevapla" - continue_discussion: "{{postLink}} Gönderisinden tartışmaya devam ediliyor:" - follow_quote: "alıntılanan iletiye git" + continue_discussion: "{{postLink}} Gönderisinden tartışılmaya devam ediliyor:" + follow_quote: "alıntılanan gönderiye git" show_full: "Gönderinin Tamamını Göster" show_hidden: 'GizlenmiÅŸ içeriÄŸi görüntüle.' deleted_by_author: - one: (yazarı tarafından geri alınan gönderi, bildirilmediÄŸi takdirde %{count} saat içinde otomatik olarak silinecek.) - other: (yazarı tarafından geri alınan gönderi, bildirilmediÄŸi takdirde %{count} saat içinde otomatik olarak silinecek.) + one: "(yazarı tarafından geri alınan gönderi, bildirilmediÄŸi takdirde %{count} saat içinde otomatik olarak silinecek.)" + other: "(yazarı tarafından geri alınan gönderi, bildirilmediÄŸi takdirde %{count} saat içinde otomatik olarak silinecek.)" collapse: "daralt" expand_collapse: "geniÅŸlet/daralt" + locked: "personel bu yayının düzenlenmesini kilitledi" gap: - one: gizlenen {{count}} yorumu gör - other: gizlenen {{count}} yorumu gör + one: "gizlenen {{count}} yorumu gör" + other: "gizlenen {{count}} yorumu gör" unread: "Gönderi okunmamış" has_replies: - one: '{{count}} Cevap' - other: '{{count}} Cevap' + one: "{{count}} Cevap" + other: "{{count}} Cevap" has_likes: - one: '{{count}} BeÄŸeni' - other: '{{count}} BeÄŸeni' + one: "{{count}} BeÄŸeni" + other: "{{count}} BeÄŸeni" has_likes_title: - one: '{{count}} kiÅŸi bu gönderiyi beÄŸendi' - other: '{{count}} kiÅŸi bu gönderiyi beÄŸendi' - has_likes_title_only_you: "bu gönderiyi beÄŸendiniz" + one: "{{count}} kiÅŸi bu gönderiyi beÄŸendi" + other: "{{count}} kiÅŸi bu gönderiyi beÄŸendi" + has_likes_title_only_you: "bu gönderiyi beÄŸendin" has_likes_title_you: - one: siz ve {{count}} diÄŸer kiÅŸi bu gönderiyi beÄŸendi - other: siz ve {{count}} diÄŸer kiÅŸi bu gönderiyi beÄŸendi + one: "siz ve {{count}} diÄŸer kiÅŸi bu gönderiyi beÄŸendi" + other: "sen ve {{count}} kiÅŸi bu gönderiyi beÄŸendi" errors: - create: "Üzgünüz, gönderiniz oluÅŸturulurken bir hata oluÅŸtu. Lütfen tekrar deneyin." - edit: "Üzgünüz, gönderiniz düzenlenirken bir hata oluÅŸtu. Lütfen tekrar deneyin. " - upload: "Üzgünüz, dosya yüklenirken bir hata oluÅŸtu. Lütfen tekrar deneyin." - file_too_large: "Üzgünüz, bu dosya çok büyük (en fazla {{max_size_kb}}kb). Neden büyük boyutlu dosyanı bir paylaşım servisine yükleyip, sonra baÄŸlantını paylaÅŸmıyorsun ?" - too_many_uploads: "Üzgünüz, aynı anda birden fazla dosya yükleyemezsiniz." - too_many_dragged_and_dropped_files: "Üzgünüz, aynı anda 10'dan fazla dosya yükleyemezsiniz." - upload_not_authorized: "Üzgünüz, yüklemeye çalıştığınız dosya izinli deÄŸil (authorized extensions: {{authorized_extensions}})." - image_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar resim yükleyemezler." - attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar dosya yükleyemezler." - attachment_download_requires_login: "Üzgünüz, eklentileri indirebilmek için oturum açmanız gerekiyor." + create: "Üzgünüz, gönderin oluÅŸturulurken bir hata oluÅŸtu. Lütfen tekrar dene." + edit: "Üzgünüz, gönderin düzenlenirken bir hata oluÅŸtu. Lütfen tekrar dene. " + upload: "Üzgünüz, dosya yüklenirken bir hata oluÅŸtu. Lütfen tekrar dene." + file_too_large: "Üzgünüz, bu dosya çok büyük (en fazla {{max_size_kb}}kb). Neden paylaşımını buluta yükleyip baÄŸlantını paylaÅŸmıyorsun ?" + too_many_uploads: "Üzgünüz, aynı anda sadece tek dosya yüklenebilir." + too_many_dragged_and_dropped_files: "Üzgünüz, aynı anda sadece 10 dosya yükleyebilirsin." + upload_not_authorized: "Üzgünüz, yüklemeye çalıştığın dosya izinli deÄŸil (izinli uzantılar : {{izinli uzantılar}})." + image_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar resim yükleyemez." + attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar dosya yükleyemez." + attachment_download_requires_login: "Üzgünüz, eklentileri indirebilmek için giriÅŸ yapman gerekiyor." abandon: - confirm: "Gönderinizden vazgeçtiÄŸinize emin misiniz?" + confirm: "Gönderinden vazgeçtiÄŸine emin misin?" no_value: "Hayır, kalsın" yes_value: "Evet, vazgeç" via_email: "bu gönderi e-posta ile iletildi" @@ -1737,21 +1871,24 @@ tr_TR: about: "bu gönderi bir wiki'dir" archetypes: save: 'Seçenekleri kaydet' - few_likes_left: "Sevgiyi paylaÅŸtığınız için teÅŸekkürler! Bugün için sadece birkaç beÄŸeniniz kaldı. " + few_likes_left: "BeÄŸendiÄŸin için teÅŸekkürler! Bugün için sadece birkaç beÄŸenin kaldı. " controls: - reply: "bu gönderiye bir cevap oluÅŸturmaya baÅŸlayın" + reply: "bu gönderiye bir cevap oluÅŸturmaya baÅŸla" like: "bu gönderiyi beÄŸen" - has_liked: "bu gönderiyi beÄŸendiniz" + has_liked: "bu gönderiyi beÄŸendin" undo_like: "beÄŸenmekten vazgeç" edit: "bu gönderiyi düzenle" edit_action: "Düzenle" - edit_anonymous: "Üzgünüz, ama bu gönderiyi düzenleyebilmek için oturum açmalısınız." - flag: "bu gönderiyi kontrol edilmesi için özel olarak bildirin ya da bununla ilgili özel bir bildirim yollayın" + edit_anonymous: "Üzgünüz, ama bu gönderiyi düzenleyebilmek için giriÅŸ yapmalısın. " + flag: "bu gönderinin kontrol edilmesi için özel olarak bildir ya da bununla ilgili özel bir bildirim gönder" delete: "bu gönderiyi sil" undelete: "bu gönderinin silinmesini geri al" - share: "bu gönderinin baÄŸlantısını paylaşın" + share: "bu gönderinin baÄŸlantısını paylaÅŸ" more: "Daha fazla" - admin: "gönderiyle alakalı yönetici eylemleri" + delete_replies: + confirm: "Bu gönderideki yanıtları da silmek istiyor musun?" + just_the_post: "Hayır, sadece bu gönderi" + admin: "gönderi yönetici eylemleri" wiki: "Wiki Yap" unwiki: "Wiki'yi Kaldır" convert_to_moderator: "Görevli Rengi Ekle" @@ -1759,86 +1896,84 @@ tr_TR: rebake: "HTML'i Yeniden Yapılandır" unhide: "Gizleme" change_owner: "SahipliÄŸini DeÄŸiÅŸtir" + grant_badge: "Hibe Kartı" + lock_post: "Gönderiyi kilitle" + lock_post_description: "Yayımdan bu pankartı engelle" + unlock_post: "Gönderiyi Kilitleme" + unlock_post_description: "Yayımda bu pankarta izin ver" + delete_topic_disallowed_modal: "Bu konuyu silme iznin yok. Gerçekten silinmesini istiyorsan, nedenini de belirterek moderatöre bir bilgilendirme gönder." + delete_topic_disallowed: "bu konuyu silme iznin yok" actions: - flag: 'Bildir' + flag: 'Bayrakla iÅŸaretle' defer_flags: - one: Bildirimi yoksay - other: Bildirimleri yoksay + one: "Bildirimi yoksay" + other: "Bildirimleri yoksay" undo: - off_topic: "Bildirimi geri al" - spam: "Bildirimi geri al" - inappropriate: "Bildirimi geri al" - bookmark: "İmlemeyi geri al" + off_topic: "Bayrakla iÅŸaretlemeyi geri al" + spam: "Bayrakla iÅŸaretlemeyi geri al" + inappropriate: "Bayrakla iÅŸaretlemeyi geri al" + bookmark: "İşaretlemeyi geri al" like: "BeÄŸenini geri al" - vote: "Oyunu geri al" people: - off_topic: "konu dışı olarak bildirildi" - spam: "istenmeyen olarak bildirildi" - inappropriate: "uygunsuz olarak bildirildi" - notify_moderators: "moderatörler bilgilendirdi" - notify_user: "ileti gönderdi" - bookmark: "bunu imledi" - like: "beÄŸendi" - vote: "oyladı" + off_topic: "Bayrakla \"konu dışı\" olarak iÅŸaretlendi" + spam: "Bayrakla \"istenmeyen e-posta\" olarak iÅŸaretlendi" + inappropriate: "Bayrakla \"uygunsuz\" olarak iÅŸaretlendi" + notify_moderators: "bilgilendirilen moderatörler " + notify_user: "mesaj gönderdi" + bookmark: "bunu iÅŸaretledi" + like: "bunu beÄŸendi" by_you: - off_topic: "Bunu konu dışı olarak bildirdiniz" - spam: "Bunu istenmeyen olarak bildirdiniz" - inappropriate: "Bunu uygunsuz olarak bildirdiniz" - notify_moderators: "Bunu moderasyon için bildirdiniz" - notify_user: "Bu kullanıcıya ileti yolladınız" - bookmark: "Bu gönderiyi imlediniz" - like: "Bunu beÄŸendiniz" - vote: "Bu gönderiyi oyladınız" + off_topic: "Bunu bayrakla \"konu dışı\" olarak iÅŸaretledin" + spam: "Bunu bayrakla \"istenmeyen e-posta\" olarak iÅŸaretledin" + inappropriate: "Bunu bayrakla \"uygunsuz\" olarak iÅŸaretledin" + notify_moderators: "Bunu moderatörün denetlemesi için bayrakla iÅŸaretledin" + notify_user: "Bu kullanıcıya mesaj gönderdin" + bookmark: "Bu gönderiyi iÅŸaretledin" + like: "Bunu beÄŸendin" by_you_and_others: off_topic: - one: Siz ve {{count}} diÄŸer kiÅŸi bunu konu dışı olarak bildirdi - other: Siz ve {{count}} diÄŸer kiÅŸi bunu konu dışı olarak bildirdi + one: "Siz ve {{count}} diÄŸer kiÅŸi bunu konu dışı olarak bildirdi" + other: "Sen ve {{count}} kiÅŸi bunu bayrakla \"konu dışı\" olarak iÅŸaretledi" spam: - one: Siz ve {{count}} diÄŸer kiÅŸi bunu istenmeyen olarak bildirdi - other: Siz ve {{count}} diÄŸer kiÅŸi bunu istenmeyen olarak bildirdi + one: "Siz ve {{count}} diÄŸer kiÅŸi bunu istenmeyen olarak bildirdi" + other: "Sen ve {{count}} kiÅŸi bunu bayrakla \"istenmeyen\" olarak iÅŸaretledi" inappropriate: - one: Siz ve {{count}} diÄŸer kiÅŸi bunu uygunsuz olarak bildirdi - other: Siz ve {{count}} diÄŸer kiÅŸi bunu uygunsuz olarak bildirdi + one: "Siz ve {{count}} diÄŸer kiÅŸi bunu uygunsuz olarak bildirdi" + other: "Sen ve {{count}} kiÅŸi bunu bayrakla \"uygunsuz\" olarak iÅŸaretledi" notify_moderators: - one: Siz ve {{count}} diÄŸer kiÅŸi bunu denetlenmesi için bildirdi - other: Siz ve {{count}} diÄŸer kiÅŸi bunu denetlenmesi için bildirdi + one: "Siz ve {{count}} diÄŸer kiÅŸi bunu denetlenmesi için bildirdi" + other: "Sen ve {{count}} kiÅŸi bunu moderatörün denetlemesi için bayrakla iÅŸaretledi" notify_user: - one: Siz ve {{count}} diÄŸer kiÅŸi bu kullanıcıya ileti yolladı - other: Siz ve {{count}} diÄŸer kiÅŸi bu kullanıcıya ileti yolladı + one: "Siz ve {{count}} diÄŸer kiÅŸi bu kullanıcıya ileti yolladı" + other: "Sen ve {{count}} kiÅŸi bu kullanıcıya mesaj gönderdi" bookmark: - one: Siz ve {{count}} diÄŸer kiÅŸi bu gönderiyi imledi - other: Siz ve {{count}} diÄŸer kiÅŸi bu gönderiyi imledi + one: "Siz ve {{count}} diÄŸer kiÅŸi bu gönderiyi imledi" + other: "Sen ve {{count}} kiÅŸi bu gönderiyi iÅŸaretledi" like: - one: Siz ve {{count}} baÅŸka kiÅŸi bunu beÄŸendi - other: Siz ve {{count}} baÅŸka kiÅŸi bunu beÄŸendi - vote: - one: Siz ve {{count}} kiÅŸi bu gönderiyi oyladı - other: Siz ve {{count}} kiÅŸi bu gönderiyi oyladı + one: "Siz ve {{count}} baÅŸka kiÅŸi bunu beÄŸendi" + other: "Sen ve {{count}} kiÅŸi bunu beÄŸendi" by_others: off_topic: - one: '{{count}} kiÅŸi bunu konu dışı olarak bildirdi' - other: '{{count}} kiÅŸi bunu konu dışı olarak bildirdi' + one: "{{count}} kiÅŸi bunu konu dışı olarak bildirdi" + other: "{{count}} kiÅŸi bunu bayrakla \"konu dışı\" olarak iÅŸaretledi" spam: - one: '{{count}} kiÅŸi bunu istenmeyen olarak bildirdi' - other: '{{count}} kiÅŸi bunu istenmeyen olarak bildirdi' + one: "{{count}} kiÅŸi bunu istenmeyen olarak bildirdi" + other: "{{count}} kiÅŸi bunu bayrakla \"istenmeyen\" olarak iÅŸaretledi" inappropriate: - one: '{{count}} kiÅŸi bunu uygunsuz olarak bildirdi' - other: '{{count}} kiÅŸi bunu uygunsuz olarak bildirdi' + one: "{{count}} kiÅŸi bunu uygunsuz olarak bildirdi" + other: "{{count}} kiÅŸi bunu bayrakla \"uygunsuz\" olarak iÅŸaretledi" notify_moderators: - one: '{{count}} kiÅŸi bunu moderasyon için bildirdi' - other: '{{count}} kiÅŸi bunu moderasyon için bildirdi' + one: "{{count}} kiÅŸi bunu moderasyon için bildirdi" + other: "{{count}} kiÅŸi bunu moderasyon için bayrakla iÅŸaretledi" notify_user: - one: '{{count}} bu kullanıcıya ileti yolladı' - other: '{{count}} bu kullanıcıya ileti yolladı' + one: "{{count}} bu kullanıcıya ileti yolladı" + other: "{{count}} bu kullanıcıya ileti yolladı" bookmark: - one: '{{count}} kiÅŸi bu gönderiyi imledi' - other: '{{count}} kiÅŸi bu gönderiyi imledi' + one: "{{count}} kiÅŸi bu gönderiyi imledi" + other: "{{count}} kiÅŸi bu gönderiyi iÅŸaretledi" like: - one: '{{count}} kiÅŸi bunu beÄŸendi' - other: '{{count}} kiÅŸi bunu beÄŸendi' - vote: - one: '{{count}} kiÅŸi bu gönderiyi oyladı' - other: '{{count}} kiÅŸi bu gönderiyi oyladı' + one: "{{count}} kiÅŸi bunu beÄŸendi" + other: "{{count}} kiÅŸi bunu beÄŸendi" revisions: controls: first: "İlk revizyon" @@ -1847,29 +1982,36 @@ tr_TR: last: "Son revizyon" hide: "Düzenlemeyi gizle" show: "Düzenlemeyi göster" - revert: "Bu sürüme geri dön" + revert: "Bu uyarlamaya geri dön" edit_wiki: "Wiki'yi düzenle" - edit_post: "İletiyi düzenle" + edit_post: "Gönderiyi düzenle" comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}" displays: inline: - title: "İşlenmiÅŸ çıktıyı ekleme ve çıkarmalarla birlikte göster" + title: "Hazırlanan cevabı ekleme ve çıkarmalarla birlikte göster" button: 'HTML' side_by_side: - title: "İşlenmiÅŸ diff çıktılarını yan yana göster" + title: "Hazırlanan cevabın farklarını yan yana göster" button: 'HTML' side_by_side_markdown: - title: "İşlenmemiÅŸ diff kaynaklarını yan yana göster" - button: 'Raw' + title: "Hazırlanan cevabın ham kaynaklarını yan yana göster" + button: 'Ham' raw_email: displays: + raw: + title: "E-postanın ham halini göster" + button: 'Ham' + text_part: + title: "E-postanın metin bölümünü göster" + button: 'Metin' html_part: + title: "E-postanın html bölümünü göster" button: 'HTML' category: can: 'yapabilir…' none: '(kategori yok)' all: 'Tüm kategoriler' - choose: 'Kategori seç…' + choose: 'kategori&yardım;' edit: 'düzenle' edit_long: "Düzenle" view: 'Bu Kategorideki Konuları Görüntüle' @@ -1881,147 +2023,166 @@ tr_TR: tags_allowed_tag_groups: "Yalnızca ÅŸu gruplardaki etiketlerin bu kategoride kullanılmasına izin ver:" tags_placeholder: "(Seçmeli) izin verilen etiketlerin listesi" tag_groups_placeholder: "(Seçmeli) izin verilen etiket gruplarının listesi" - topic_featured_link_allowed: " Featured link'lere bu kategoride izin ver" + topic_featured_link_allowed: "Bu kategoride özellikli baÄŸlantılara izin ver" delete: 'Kategoriyi Sil' create: 'Yeni Kategori' create_long: 'Yeni bir kategori oluÅŸtur' save: 'Kategoriyi Kaydet' - slug: 'Kategori Kalıcı BaÄŸlantısı' - slug_placeholder: '(İsteÄŸe baÄŸlı) baÄŸlantı için çizgi ile ayırılmış kelimeler' - creation_error: Kategori oluÅŸturulurken hata oluÅŸtu. + slug: 'Alakasız Kategoriler' + slug_placeholder: '(İsteÄŸe baÄŸlı) baÄŸlantı için çizgi ile ayrılmış kelimeler' + creation_error: "Kategori oluÅŸturulurken bir hata oldu " save_error: Kategori kaydedilirken hata oluÅŸtu. name: "Kategori Adı" description: "Açıklama" topic: "kategori konusu" - logo: "Kategori Görseli" - background_image: "Kategori Arka Planı Görseli" + logo: "Kategori Logo Resmi" + background_image: "Kategori Arka Plan Resmi " badge_colors: "Rozet renkleri" background_color: "Arka plan rengi" foreground_color: "Ön plan rengi" name_placeholder: "En fazla bir ya da iki kelime" color_placeholder: "Herhangi bir web rengi" - delete_confirm: "Bu kategoriyi silmek istediÄŸinize emin misiniz?" - delete_error: "Kategoriyi silinirken bir hata oluÅŸtu." + delete_confirm: "Bu kategoriyi silmek istediÄŸine emin misin?" + delete_error: "Kategori silinirken bir hata oluÅŸtu." list: "Kategorileri Listele" - no_description: "Lütfen bu kategori için bir açıklama girin." + no_description: "Lütfen bu kategori için bir açıklama ekle." change_in_category_topic: "Açıklamayı Düzenle" already_used: 'Bu renk baÅŸka bir kategori için kullanıldı' security: "Güvenlik" - special_warning: "Uyarı: Bu kategori önceden ayarlanmış bir kategoridir ve güvenlik ayarları deÄŸiÅŸtirilemez. EÄŸer bu kategoriyi kullanmak istemiyorsanız, baÅŸka bir amaçla kullanmak yerine silin." + special_warning: "Uyarı: Bu kategori önceden ayarlanmış bir kategoridir ve güvenlik ayarları deÄŸiÅŸtirilemez. EÄŸer bu kategoriyi kullanmak istemiyorsan, baÅŸka bir amaçla kullanmak yerine sil." images: "Resimler" - email_in: "Özel gelen e-posta adresi:" - email_in_allow_strangers: "Hesabı olmayan, anonim kullanıcılardan e-posta kabul et" + email_in: "KiÅŸiselleÅŸmiÅŸ gelen e-posta adresi:" + email_in_allow_strangers: "Hesabı olmayan, isimsiz kullanıcılardan e-posta kabul et" email_in_disabled: "E-posta üzerinden yeni konu oluÅŸturma özelliÄŸi Site Ayarları'nda devre dışı bırakılmış. E-posta üzerinden yeni konu oluÅŸturma özelliÄŸini etkinleÅŸtirmek için," - email_in_disabled_click: '"e-postala" ayarını etkinleÅŸtir' - all_topics_wiki: "Yeni konuyu varsayılan olarak wiki yap" - allow_badges_label: "Bu kategoride rozet verilmesine izin ver" + email_in_disabled_click: '"e-posta" ayarını etkinleÅŸtir' + mailinglist_mirror: "Kategori bir e-posta listesini yansıtır" + suppress_from_latest: "Kategoriyi son konulardan gizle" + show_subcategory_list: "Bu kategorideki alt kategori listesini üst baÅŸlıklarda göster" + num_featured_topics: "Kategoriler sayfasında gösterilen konu sayısı:" + subcategory_num_featured_topics: "Üst kategori sayfasındaki öne çıkan konuların sayısı:" + all_topics_wiki: "Yeni konuları wiki'nin varsayılanı yap" + subcategory_list_style: "Alt Kategori Liste Biçimi:" + sort_order: "Konu Listesini Åžuna Göre Sırala:" + default_view: "Varsayılan Konu Listesi:" + default_top_period: "Varsayılan Üst Periyot:" + allow_badges_label: "Bu kategoride rozetle ödüllendirilmesine izin ver" edit_permissions: "İzinleri Düzenle" add_permission: "İzin Ekle" + require_topic_approval: "Tüm yeni konular moderatör onayını gerektirir" + require_reply_approval: "Tüm yeni cevaplar moderatör onayı gerektirir" this_year: "bu yıl" - position: "konum" - default_position: "Öntanımlı Konum" - position_disabled: "Kategoriler etkinlik sıralarına göre görünecekler. Listelerdeki kategorilerin sıralamalarını kontrol edebilmek için," - position_disabled_click: '"sabitlenmiÅŸ kategori konumları" ayarını etkinleÅŸtirin.' + position: "Konum:" + default_position: "Varsayılan Pozisyon" + position_disabled: "Kategoriler etkinlik sıralarına göre görünecek. Listelerdeki kategorilerin sıralamalarını kontrol edebilmek için," + position_disabled_click: '"Sabit kategori pozisyonları" ayarını etkinleÅŸtir.' + minimum_required_tags: 'Bir konu için gereken minimum etiket sayısı:' parent: "Üst Kategori" + num_auto_bump_daily: 'Günlük otomatik olarak açılan açık konuların sayısı:' + navigate_to_first_post_after_read: 'Konular okunduktan sonra ilk gönderiye dön' notifications: watching: - title: "Gözleniyor" - description: "Bu kategorilerdeki tüm konuları otomatik olarak gözleyeceksiniz. Tüm konulardaki yeni gönderilerden haberdar olabilecek ve yeni cevapların sayısını da konunun yanında görebileceksiniz." + title: "İzleniyor" + description: "Bu kategorilerdeki tüm konuları otomatik olarak izleyeceksin. Tüm konulardaki her yeni gönderiden haberdar olacak ve yeni cevapların sayısını göreceksin. " watching_first_post: - title: "İlk gönderi gözlemeniz" - description: "Bu kategorilerde bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." + title: "İlk Gönderi İzleme" + description: "Bu kategorilerde bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksın." tracking: title: "Takip Ediliyor" - description: "Bu kategorilerdeki tüm yeni konuları otomatik olarak takip edeceksiniz. Birisi @isminizden bahsederse veya gönderinize cevap verirse bildirim alacak, ayrıca yeni cevapların sayısını da konunun yanında görebileceksiniz." + description: "Bu kategorilerdeki tüm yeni konuları otomatik olarak takip edeceksin. Birisi @isminden bahsederse veya gönderine cevap verirse bildirim alacak, ayrıca yeni cevapların sayısını da göreceksin. " regular: - title: "OlaÄŸan" - description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + title: "Normal" + description: "Birisi @isminden bahsederse veya sana cevap verirse bildirim alacaksın." muted: - title: "Susturuldu" - description: "Bu kategorilerdeki yeni konular hakkında herhangi bir bildiri almayacaksınız ve en son gönderilerde gözükmeyecekler. " + title: "Sessiz" + description: "Bu kategorilerdeki yeni konular hakkında herhangi bir bildiri almayacaksın ve en son gönderiler de gözükmeyecek. " sort_options: - default: "öntanımlı" + default: "varsayılan" likes: "BeÄŸeniler" op_likes: "Orijinal Gönderi BeÄŸenileri" - views: "Gösterimler" + views: "Görüntülenenler" posts: "Gönderiler" - activity: "Etkinlik" - posters: "Yazanlar" + activity: "Aktivite" + posters: "Posterler" category: "Kategori" - created: "OluÅŸturulma" + created: "OluÅŸturulan" sort_ascending: 'Artan' sort_descending: 'Azalan' + subcategory_list_styles: + rows: "Satırlar" + rows_with_featured_topics: "Öne çıkan konulardaki satırlar" + boxes: "Kutular" + boxes_with_featured_topics: "Öne çıkan konuların kutusu" flagging: - title: 'TopluluÄŸumuzun düzenli kalmasına desteÄŸiniz için teÅŸekkürler!' - action: 'Gönderiyi Bildir' + title: 'TopluluÄŸumuzun nezaket kuralları içerisinde kalmasına saÄŸladığın destek için teÅŸekkürler!' + action: 'Gönderiyi Bayrakla İşaretle' take_action: "Harekete Geç" - notify_action: 'İleti' + notify_action: 'Mesaj' official_warning: 'Resmi uyarı' - delete_spammer: "Spamcıyı Sil" - delete_confirm_MF: "Bu kullanıcının {POSTS, plural, one {1 gönderisini} other {# gönderisini}} ve {TOPICS, plural, one {1 konusunu} other {# konusunu}} silmek üzeresiniz, ayrıca kullanıcının hesabı kaldırılacak, giriÅŸ yaptığı {ip_address} IP adresinden giriÅŸ yapması engellenecek ve {email} e-posta adresi kalıcı yasaklı listesine eklenecek. Bu kullanıcının gerçekten bir spamcı olduÄŸuna emin misiniz?" - yes_delete_spammer: "Evet, spamcıyı sil" + delete_spammer: "İstenmeyen e-postayı göndereni sil" + delete_confirm_MF: "Bu kullanıcının {POSTS, plural, one {1 gönderisini} other {# gönderisini}} ve {TOPICS, plural, one {1 konusunu} other {# konusunu}} silmek üzeresin, ayrıca kullanıcının hesabı kaldırılacak, giriÅŸ yaptığı {ip_address} IP adresinden giriÅŸ yapması engellenecek ve {email} e-posta adresi kalıcı yasaklı listesine eklenecek. Bu kullanıcının gerçekten bir spamcı olduÄŸuna emin misin?" + yes_delete_spammer: "Evet, İstenmeyen E-postayı Göndereni Sil" ip_address_missing: "(uygulanamaz)" hidden_email_address: "(gizli)" - submit_tooltip: "Özel bildirimi gönder" - take_action_tooltip: "TopluluÄŸunuzdan daha fazla bildirim beklemek yerine bunu siz hızlıca yaparak eÅŸiÄŸe eriÅŸebilirsiniz" - cant: "Üzgünüz, ÅŸu an bu gönderiyi bildiremezsiniz." - notify_staff: 'Görevlilere özel olarak bildir' + submit_tooltip: "Özel bayrağı gönder" + take_action_tooltip: "Grubundan daha fazla bayrak beklemek yerine bunu hızlıca yaparak alt sınıra eriÅŸebilirsin" + cant: "Üzgünüz, ÅŸu an bu gönderiyi bayrakla iÅŸaretleyemezsin." + notify_staff: 'Görevliye özel olarak bildir' formatted_name: off_topic: "Konu Dışı" inappropriate: "Uygunsuz" spam: "İstenmeyen" - custom_placeholder_notify_user: "Açıklayıcı, yapıcı ve her zaman nazik olun." - custom_placeholder_notify_moderators: "Sizi neyin endiÅŸelendirdiÄŸini açıklayıcı bir dille bize bildirin ve mümkün olan yerlerde konu ile alakalı baÄŸlantıları paylaşın." + custom_placeholder_notify_user: "Açıklayıcı, yapıcı ve her zaman nazik ol." + custom_placeholder_notify_moderators: "Seni neyin endiÅŸelendirdiÄŸini açık bir dille bize bildir ve gerekli yerlerde konu ile alakalı baÄŸlantıları paylaÅŸ." custom_message: at_least: - one: en azından {{count}} karakter girin - other: en azından {{count}} karakter girin + one: "en azından {{count}} karakter girin" + other: "en azından {{count}} karakter gir" more: - one: '{{count}} daha...' - other: '{{count}} daha...' + one: "{{count}} daha..." + other: "{{count}} daha..." left: - one: '{{count}} kaldı' - other: '{{count}} kaldı' + one: "{{count}} kaldı" + other: "{{count}} kaldı" flagging_topic: - title: "TopluluÄŸumuzun düzenli kalmasına desteÄŸiniz için teÅŸekkürler!" - action: "Konuyu Bildir" - notify_action: "İleti" + title: "TopluluÄŸumuzun nezaket kuralları içerisinde kalmasına verdiÄŸin destek için teÅŸekkürler!" + action: "Konuyu Bayrakla İşaretle" + notify_action: "Mesaj" topic_map: title: "Konu Özeti" - participants_title: "Sıkça Yazanlar" - links_title: "Gözde BaÄŸlantılar" + participants_title: "Sıkça Gönderi Yapanlar" + links_title: "Popüler BaÄŸlantılar" links_shown: "daha fazla baÄŸlantı göster..." clicks: - one: '%{count} tıklama' - other: '%{count} tıklama' + one: "%{count} tıklama" + other: "%{count} tıklama" post_links: about: "bu gönderi için daha fazla baÄŸlantı koy" title: - one: '%{count} daha' - other: '%{count} daha' + one: "%{count} daha" + other: "%{count} daha" topic_statuses: warning: help: "Bu resmi bir uyarıdır." bookmarked: - help: "Bu konuyu imlediniz" + help: "Bu konuyu iÅŸaretledin" locked: - help: "Bu konu kapatıldı; artık yeni cevaplar kabul edilmiyor" + help: "Bu konu kapatıldığı için artık yeni cevap kabul edilmiyor" archived: - help: "Bu baÅŸlık arÅŸive kaldırıldı; donduruldu ve deÄŸiÅŸtirilemez" + help: "Bu baÅŸlık arÅŸivlendi; donduruldu ve deÄŸiÅŸtirilemez" locked_and_archived: - help: "Bu konu kapatıldı ve arÅŸivlendi; yeni cevaplar kabul edemez ve deÄŸiÅŸtirilemez." + help: "Bu konu kapatıldı ve arÅŸivlendi; yeni cevaplar kabul edilemez ve deÄŸiÅŸtirilemez." unpinned: - title: "BaÅŸa tutturma kaldırıldı" - help: "Bu konu sizin için baÅŸa tutturulmuyor; olaÄŸan sıralama içerisinde görünecek" + title: "En Yukarıda Sabitlenmesi Kaldırıldı" + help: "Bu konu senin için artık en yukarıda sabitli deÄŸil, yani artık sırasıyla görüntülenecek" pinned_globally: - title: "Her Yerde BaÅŸa Tutturuldu" - help: "Bu konu her yerde baÅŸa tutturuldu; gönderildiÄŸi kategori ve en son gönderilerin en üstünde görünecek" + title: "Her Yerde En Yukarıda Sabitlendi" + help: "Bu konu her yerde en yukarıda sabitlendi; gönderildiÄŸi kategori ve son gönderilerin en üstünde görünecek. " pinned: - title: "BaÅŸa Tutturuldu" - help: "Bu konu sizin için baÅŸa tutturuldu; kendi kategorisinin en üstünde görünecek" + title: "En Yukarıda Sabitlendi" + help: "Bu konu senin için en yukarıda sabitlendi; kendi kategorisinin en üstünde görünecek" invisible: - help: "Bu konu gizli; konu listelerinde görünmeyecek, ve sadece doÄŸrudan baÄŸlantı aracılığıyla eriÅŸilebilecek" - posts: "Gönderi" + help: "Bu konu listelenmemiÅŸ; konu listelerinde görüntülenmeyecek ve sadece doÄŸrudan bir baÄŸlantı üzerinden eriÅŸilebilecek" + posts: "Gönderiler" posts_long: "bu konuda {{number}} gönderi var" posts_likes_MF: | Bu konuda {count, plural, one {1 cevap} other {# cevap}} {ratio, select, @@ -2029,30 +2190,31 @@ tr_TR: med {ve çok yüksek beÄŸeni/gönderi oranı} high {ve aşırı yüksek beÄŸeni/gönderi oranı} other {}} var - original_post: "Özgün Gönderi" - views: "Gösterim" + original_post: "Orjinal Gönderi" + views: "Görüntülenenler" views_lowercase: - one: gösterim - other: gösterim - replies: "Cevap" + one: "gösterim" + other: "görüntülenenler" + replies: "Cevaplar" views_long: - one: bu konu {{number}} defa görüntülendi - other: bu konu {{number}} defa görüntülendi - activity: "Etkinlik" + one: "bu konu {{number}} defa görüntülendi" + other: "bu konu {{number}} defa görüntülendi" + activity: "Aktivite" likes: "BeÄŸeni" likes_lowercase: - one: beÄŸeni - other: beÄŸeni + one: "beÄŸeni" + other: "beÄŸeni" likes_long: "bu konuda {{number}} beÄŸeni var" - users: "Kullanıcı" + users: "Kullanıcılar" users_lowercase: - one: kullanıcı - other: kullanıcı + one: "kullanıcı" + other: "kullanıcılar" category_title: "Kategori" history: "GeçmiÅŸ" changed_by: "Yazan {{author}}" raw_email: - not_available: "Müsait deÄŸil!" + title: "Gelen e-posta" + not_available: "Bulunmuyor!" categories_list: "Kategori Listesi" filters: with_topics: "%{filter} konular" @@ -2060,55 +2222,55 @@ tr_TR: latest: title: "En son" title_with_count: - one: En Son ({{count}}) - other: En Son ({{count}}) + one: "En Son ({{count}})" + other: "En Son ({{count}})" help: "yakın zamanda gönderi alan konular" hot: title: "Sıcak" - help: "en sıcak konulardan bir derleme" + help: "en sıcak konuların seçimi" read: title: "OkunmuÅŸ" - help: "okuduÄŸunuz baÅŸlıklar, okunma sırasına göre" + help: "okunma sırasına göre okuduÄŸun konular" search: title: "Arama" help: "tüm konularda ara" categories: title: "Kategoriler" title_in: "Kategori - {{categoryName}}" - help: "kategori bazında tüm konular" + help: "kategoriye göre gruplandırılmış konular" unread: title: "Okunmamış" title_with_count: - one: Okunmamış ({{count}}) - other: Okunmamış ({{count}}) - help: "okunmamış gönderiler bulunan gözlediÄŸiniz ya da takip ettiÄŸiniz konular" + one: "Okunmamış ({{count}})" + other: "Okunmamış ({{count}})" + help: "İzlediÄŸin veya takip ettiÄŸin okunmamış gönderi konuları" lower_title_with_count: - one: '{{count}} okunmamış' - other: '{{count}} okunmamış' + one: "{{count}} okunmamış" + other: "{{count}} okunmamış" new: lower_title_with_count: - one: '{{count}} yeni' - other: '{{count}} yeni' + one: "{{count}} yeni" + other: "{{count}} yeni" lower_title: "yeni" title: "Yeni" title_with_count: - one: 'Yeni ({{count}}) ' - other: 'Yeni ({{count}}) ' + one: "Yeni ({{count}}) " + other: "Yeni ({{count}}) " help: "son birkaç günde oluÅŸturulmuÅŸ konular" posted: title: "Gönderilerim" - help: "gönderi oluÅŸturduÄŸunuz konular" + help: "gönderi yaptığın konular" bookmarks: - title: "İmler" - help: "imlerinize aldığınız konular" + title: "İşaretler" + help: "iÅŸaretlediÄŸin konular" category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} ({{count}})' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" help: "{{categoryName}} kategorisindeki en son konular" top: - title: "Gözde" + title: "Popüler" help: "geçtiÄŸimiz yıl, ay, hafta veya gündeki en etkin baÅŸlıklar" all: title: "Tüm Zamanlar" @@ -2117,7 +2279,7 @@ tr_TR: quarterly: title: "Üç aylık" monthly: - title: "Aylı" + title: "Aylık" weekly: title: "Haftalık" daily: @@ -2129,7 +2291,7 @@ tr_TR: this_week: "Hafta" today: "Bugün" other_periods: "yukarı bak" - browser_update: 'Malesef, tarayıcınız bu site için çok eski. Lütfen tarayıcınızı güncelleyin.' + browser_update: 'Malesef, tarayıcın bu site için çok eski. Lütfen tarayıcını güncelle.' permission_types: full: "OluÅŸtur / Cevapla / Bak" create_post: "Cevapla / Bak" @@ -2146,9 +2308,10 @@ tr_TR: unread: 'g, u Okunmamış' categories: 'g, c Kategoriler' top: 'g, t En üst' - bookmarks: 'g, b İmler' + bookmarks: 'g, b İşaretler' profile: 'g, p Profil' - messages: 'g, m İletiler' + messages: 'g, m Mesajlar' + drafts: 'g, d Taslaklar' navigation: title: 'Navigasyon' jump: '# Gönderiye git #' @@ -2163,14 +2326,17 @@ tr_TR: hamburger_menu: '= Hamburger menüyü aç' user_profile_menu: 'p Kullanıcı menüsünü aç' show_incoming_updated_topics: '. GüncellenmiÅŸ konuları göster' + search: '/ or ctrl+alt+f Ara' help: '? Klavye yardım sayfasını aç' dismiss_new_posts: 'x, r Yeni Konuları/Gönderileri Yoksay' dismiss_topics: 'x, t Konuları yoksay' log_out: 'shift+z shift+z Çıkış' + composing: + title: 'OluÅŸturma' actions: title: 'Eylemler' - bookmark_topic: 'f Konu imini deÄŸiÅŸtir' - pin_unpin_topic: 'shift+p Konuyu tuttur/kaldır' + bookmark_topic: 'f Konu iÅŸaretini deÄŸiÅŸtir' + pin_unpin_topic: 'shift+p Konuyu en yukarıda sabitle/sabitleme' share_topic: 'shift+s Konuyu paylaÅŸ' share_post: 's Gönderiyi paylaÅŸ' reply_as_new_topic: 't BaÄŸlantılı konu olarak cevapla' @@ -2178,33 +2344,36 @@ tr_TR: reply_post: 'r Gönderiyi cevapla' quote_post: 'q Gönderiyi alıntıla' like: 'l Gönderiyi beÄŸen' - flag: '! Gönderiyi bildir' - bookmark: 'b Gönderiyi imle' + flag: '! Gönderiyi bayrakla iÅŸaretle' + bookmark: 'b Gönderiyi iÅŸaretle' edit: 'e Gönderiyi düzenle' delete: 'd Gönderiyi sil' - mark_muted: 'm, m Konuyu sustur' + mark_muted: 'm, m Konuyu sessize al' mark_regular: 'm, r Öntanımlı konu' mark_tracking: 'm, t Konuyu takip et' - mark_watching: 'm, w Konuyu gözle' + mark_watching: 'm, w Konuyu izle' print: 'ctrl+p Konuyu yazdır' badges: earned_n_times: - one: Bu rozet %{count} defa kazanılmış - other: Bu rozet %{count} defa kazanılmış + one: "Bu rozet %{count} defa kazanılmış" + other: "Bu rozet %{count} defa kazanılmış" granted_on: "%{date} tarihinde verildi" others_count: "Bu rozete sahip diÄŸer kiÅŸiler (%{count})" title: Rozetler + allow_title: "Bu rozeti baÅŸlık olarak kullanabilirsin" + multiple_grant: "Bunu birden çok kez kazanabilirsin" badge_count: - one: '%{count} Rozet' - other: '%{count} Rozet' + one: "%{count} Rozet" + other: "%{count} Rozet" more_badges: - one: +%{count} Daha - other: +%{count} Daha + one: "+%{count} Daha" + other: "+%{count} Daha" granted: - one: '%{count} izin verildi' - other: '%{count} izin verildi' - select_badge_for_title: BaÅŸlık yazısı olarak kullanılacak bir rozet seçin + one: "%{count} izin verildi" + other: "%{count} izin verildi" + select_badge_for_title: BaÅŸlık olarak kullanılacak bir rozet seç none: "(hiçbiri)" + successfully_granted: "%{username} baÅŸarıyla %{badge} kazanmıştır" badge_grouping: getting_started: name: BaÅŸlangıç @@ -2236,12 +2405,12 @@ tr_TR: delete_tag: "Etiketi Sil" delete_confirm_no_topics: "Bu etiketi silmek istediÄŸinize emin misiniz?" rename_tag: "Etiketi Yeniden Adlandır" - rename_instructions: "Bu etiket için yeni bir ad seçin:" + rename_instructions: "Bu etiket için yeni bir ad seç:" sort_by: "Sırala:" - sort_by_count: "sayaç" - sort_by_name: "ad" + sort_by_count: "say" + sort_by_name: "isim" manage_groups: "Etiket Grubunu Yönet" - manage_groups_description: "Etiket gurubunu yönetmek için grup tanımla" + manage_groups_description: "Etiket grubunu yönetmek için grup tanımla" filters: without_category: "%{filter} %{tag} konular" with_category: "%{category} içerisindeki konular %{filter} %{tag}" @@ -2249,74 +2418,86 @@ tr_TR: untagged_with_category: "%{category} içindeki %{filter} etiketlenmemiÅŸ konular" notifications: watching: - title: "Gözleniyor" + title: "İzleniyor" + description: "Bu etiketi içeren tüm konuları otomatik olarak izleyeceksin. Tüm yeni mesajlar ve konulardan haberdar edileceksin, ayrıca konuların yanında okunmamış ve yeni mesajların sayısı da görünecek." watching_first_post: - title: "İlk gönderi gözlemeniz" + title: "İlk gönderi izlemesi" + description: "Bu etiketle yalnızca her yeni konudaki ilk gönderiden haberdar edileceksin." tracking: title: "Takip ediliyor" + description: "Bu etiketi içeren tüm konuları otomatik olarak takip edeceksin. Konunun yanında okunmamış ve yeni yayınların sayısı görünecek." regular: - title: "Müdavim" - description: "Birisi @isminizden bahsederse veya gönderinize cevap verirse bildirim alacaksınız." + title: "Düzenli" + description: "Birisi @isminden bahsederse veya gönderine cevap verirse bildirim alacaksın." muted: - title: "Susturuldu" + title: "Sessiz" + description: "Bu etiketle yeni konular hakkında hiçbir ÅŸeyden haberdar edilmeyeceksin ve konular okunmamış sekmesinde görünmeyecek. " groups: title: "Etiket Grupları" - about: "Konuları kolayca yönetmek için onlara etiket ekleyiniz." + about: "Konuları kolayca yönetmek için onlara etiket ekle." new: "Yeni Grup" tags_label: "Bu gruptaki etiketler:" parent_tag_label: "Üst etiket:" parent_tag_placeholder: "İsteÄŸe BaÄŸlı" - parent_tag_description: "Bu gruptaki etiketler üst etiketi olduÄŸu sürece kullanılamaz." - one_per_topic_label: "Bu etiket grubundan her konu için bir etiket ile sınırla" + parent_tag_description: "Bu gruptaki etiketler üst etiket olduÄŸu sürece kullanılamaz." + one_per_topic_label: "Bu etiket grubundan her konu için bir etiket ile sınır koy" new_name: "Yeni Etiket Grubu" save: "Kaydet" delete: "Sil" - confirm_delete: "Bu etiket grubunu silmek istedinizden emin misiniz?" + confirm_delete: "Bu etiket grubunu silmek istediÄŸine emin misin?" + everyone_can_use: "Etiketler herkes tarafından kullanılabilir" + usable_only_by_staff: "Etiketler herkes tarafından görülebilir, ancak yalnızca görevli tarafından kullanabilir" + visible_only_to_staff: "Etiketler yalnızca görevli tarafından görülebilir" topics: none: - unread: "Okunmamış konunuz bulunmuyor." - new: "Yeni konunuz bulunmuyor" - read: "Henüz bir konu okumadınız." - posted: "Henüz herhangi bir konuya gönderim yapmadınız." + unread: "Okunmamış konun bulunmuyor." + new: "Yeni konun bulunmuyor" + read: "Henüz bir konu okumadın." + posted: "Henüz herhangi bir konuya gönderim yapmadın." latest: "Yeni eklenen konu bulunmuyor." - hot: "Hareketli konu bulunmuyor." - bookmarks: "Henüz imlenmiÅŸ bir konunuz bulunmuyor." - top: "Hareketli bir konu bulunmuyor." - search: "Arama sonucu hiçbirÅŸey bulunamadı." + hot: "Sıcak bir konu bulunmuyor." + bookmarks: "Henüz iÅŸaretlenmemiÅŸ bir konun bulunmuyor." + top: "Güncel bir konu bulunmuyor." + search: "Arama sonucunda hiçbir ÅŸey bulunamadı." bottom: - latest: "Daha fazla yeni eklenmiÅŸ konu bulunmuyor." - hot: "Daha fazla hareketli konu bulunmuyor." + latest: "Yeni eklenmiÅŸ konu bulunmuyor." + hot: "Daha fazla sıcak bir konu bulunmuyor." posted: "Daha fazla gönderilmiÅŸ konu bulunmuyor." read: "Okunacak daha fazla konu bulunmuyor." new: "Daha fazla yeni konu bulunmuyor." unread: "Daha fazla okunmamış konu bulunmuyor." - top: "Daha fazla üst sıralarda konu bulunmuyor." - bookmarks: "Daha fazla imlenmiÅŸ konu bulunmuyor." + top: "Daha fazla güncel konu bulunmuyor." + bookmarks: "Daha fazla iÅŸaretlenmiÅŸ konu bulunmuyor." search: "Daha fazla arama sonucu bulunmuyor." invite: custom_message: "Davetini daha özel hale getirmek için ÅŸunu yaz" - custom_message_link: "kiÅŸiselleÅŸtirilmiÅŸ ileti" - custom_message_placeholder: "KiÅŸiselleÅŸtirilmiÅŸ iletinizi düzenleyin" + custom_message_link: "kiÅŸiselleÅŸtirilmiÅŸ mesaj" + custom_message_placeholder: "KiÅŸiselleÅŸtirilmiÅŸ mesajlarını düzenle" custom_message_template_forum: "Hey, bu foruma katılmalısın!" - custom_message_template_topic: "Hey, bu konu senin için eÄŸleceli olabilir!" + custom_message_template_topic: "Hey, bu konu senin için eÄŸlenceli olabilir!" + forced_anonymous: "Aşırı yükleme nedeniyle, çıkış yapan bir kullanıcının göreceÄŸi ÅŸekilde herkese geçici olarak gösteriliyor. " safe_mode: - enabled: "Güvenli mod etkin, çıkmak için bu tarayıcı penceresini kapatın" + enabled: "Güvenli mod etkin, çıkmak için bu tarayıcı penceresini kapat" admin_js: - type_to_filter: "süzgeç girin..." + type_to_filter: "filtrelemek için yaz..." admin: - title: 'Discourse Yönetici Paneli' + title: 'Yönetici Panel Dili' moderator: 'Moderatör' + reports: + title: "Mevcut raporlar listesi" dashboard: - title: "Göstergeler" + title: "Gösterge Paneli" last_updated: "Göstergelerin son güncellenmesi:" + find_old: "Eski gösterge panosunu mu arıyorsun?" + old_link: "buradan ziyaret et" version: "Sürüm" - up_to_date: "Sisteminiz güncel durumda!" + up_to_date: "Sistemin güncel durumda!" critical_available: "Önemli bir güncelleme var." updates_available: "Yeni güncellemeler var." - please_upgrade: "Lütfen güncelleyin!" - no_check_performed: "Güncelleme kontrolü gerçekleÅŸmedi, lütfen sidekiq'in çalışır durumda olduÄŸundan emin olun." - stale_data: "Güncelleme kontrolü bir süredir gerçekleÅŸmiyor, lütfen sidekiq'in çalışır durumda olduÄŸundan emin olun." - version_check_pending: "Sanırım yeni güncelleme yaptınız. Harika!" + please_upgrade: "Lütfen güncelle!" + no_check_performed: "Güncellemeler gerçekleÅŸmedi, yardımcının çalışır durumda olduÄŸundan emin olmalısın." + stale_data: "Güncellemeler bir süredir gerçekleÅŸmiyor, yardımcının çalışır durumda olduÄŸundan emin olmalısın." + version_check_pending: "Yeni güncelleme yaptın. Harika!" installed_version: "Yüklendi" latest_version: "En son" problems_found: "Discourse kurulumuyla ilgili bazı sorunlar bulundu: " @@ -2325,103 +2506,185 @@ tr_TR: no_problems: "Herhangi bir sorun bulunamadı." moderators: 'Moderatörler:' admins: 'Yöneticiler:' - suspended: 'UzaklaÅŸtırılmışlar:' - private_messages_short: "İletiler" - private_messages_title: "İletiler" + silenced: 'Sessize alınmış:' + suspended: 'Askıya Alındı:' + private_messages_short: "Mesajlar" + private_messages_title: "Mesajlar" mobile_title: "Mobil" - space_free: "{{size}} serbest" + space_free: "{{size}} boÅŸ" uploads: "yüklemeler" backups: "yedekler" - traffic_short: "Trafik" + lastest_backup: "Güncel: %{date}" + traffic_short: "Akış" traffic: "Uygulama web istekleri" page_views: "Sayfa Görüntülemeleri" page_views_short: "Sayfa Görüntülemeleri" - show_traffic_report: "Ayrıntılı Trafik Raporunu Görüntüle" + show_traffic_report: "Ayrıntılı Akış Raporunu Göster" + community_health: Topluluk saÄŸlığı + moderators_activity: Moderatörlerin etkinliÄŸi + whats_new_in_discourse: "Discourse'daki yenilikler neler?" + activity_metrics: Aktivite Ölçütleri + all_reports: "Tüm raporlar" + general_tab: "Genel" + moderation_tab: "Moderasyon" + disabled: Devredışı + timeout_error: "Üzgünüz, sorgu çok uzun sürüyor. Lütfen daha kısa bir aralık seç." + exception_error: "Üzgünüz, sorguyu yürütürken bir hata oluÅŸtu" reports: today: "Bugün" yesterday: "Dün" + last_7_days: "Son 7" + last_30_days: "Son 30" all_time: "Tüm Zamanlar" 7_days_ago: "7 Gün Önce" 30_days_ago: "30 Gün Önce" all: "Hepsi" view_table: "tablo" - view_graph: "çizge" + view_graph: "grafik" refresh_report: "Raporu Yenile" start_date: "BaÅŸlangıç tarihi" end_date: "BitiÅŸ Tarihi" groups: "Tüm gruplar" + disabled: "Bu rapor devre dışı" + totals_for_sample: "Örnek toplamlar" + total: "Tüm zamanlar toplamı" + no_data: "Gösterilecek bilgi yok." + trending_search: + more: 'Arama Günlükleri' commits: - latest_changes: "En son deÄŸiÅŸiklikler: lütfen sık güncelleyin!" + latest_changes: "En son deÄŸiÅŸiklikler: lütfen sık sık güncelle!" by: "tarafından" flags: - title: "Bildirilenler" - agree: "Onayla" - agree_title: "Bu bildirimi geçerli ve doÄŸru olarak onayla" + title: "Bayraklılar" + active_posts: "Bayraklı gönderiler" + old_posts: "Bayraklı eski gönderiler" + topics: "Bayraklı Konular" + moderation_history: "Moderasyon Tarihi" + agree: "Katıl" + agree_title: "Bu bayrağın geçerli ve doÄŸru olduÄŸunu onayla" + agree_flag_hide_post: "Gönderiyi Gizle" + agree_flag_hide_post_title: "Bu gönderiyi sakla ve kullanıcıya otomatik olarak uyarı mesajı gönder." + agree_flag_restore_post: "Kabul Et ve Önceki Gönderiyi Yükle" + agree_flag_restore_post_title: "Tüm kullanıcılar tarafından görülebilmesi için gönderiyi geri yükle. " + agree_flag_suspend: "Kullanıcıyı Askıya Al" + agree_flag_suspend_title: "Bayrakla iÅŸaretle ve kullanıcıyı askıya al." + agree_flag_silence: "Kullanıcıyı Sessize Al " + agree_flag_silence_title: "Bayrakla iÅŸaretle ve kullanıcıyı sessize al." + agree_flag: "Gönderiyi Sakla" + agree_flag_title: "Gönderiyi deÄŸiÅŸtirme ve bayrakla iÅŸaretle" + ignore_flag: "Yoksay" + ignore_flag_title: "Bayrağı kaldır; bu sefer herhangi bir iÅŸlem yapılması gerekmiyor." delete: "Sil" - delete_title: "Bu bildirimin ait olduÄŸu gönderiyi sil." - delete_post_defer_flag_title: "Gönderiyi sil; baÅŸka gönderi yoksa, konuyu da sil." - delete_post_agree_flag_title: "Gönderiyi sil; baÅŸka gönderi yoksa, konuyu da sil." + delete_title: "Bu bayraÄŸa ait olan gönderiyi sil." + delete_post_defer_flag: "Gönderiyi Sil ve Bayrağı Yoksay" + delete_post_defer_flag_title: "Gönderiyi sil; ilk gönderi ise, konuyu da sil." + delete_post_agree_flag: "Gönderiyi Sil ve Bayrakla Kabul Et" + delete_post_agree_flag_title: "Gönderiyi sil; ilk gönderi ise, konuyu da sil." delete_flag_modal_title: "Sil ve..." - delete_spammer: "Spamcıyı Sil" + delete_spammer: "Spam Mail Gönderen KiÅŸiyi Sil" delete_spammer_title: "Kullanıcıyı ve kullanıcıya ait tüm konu ve gönderileri kaldır. " disagree_flag_unhide_post: "Onaylama (gönderiyi gizleme)" - disagree_flag_unhide_post_title: "Bu gönderiye ait tüm bildirimleri kaldır ve gönderiyi tekrar görünür hale getir" + disagree_flag_unhide_post_title: "Bu gönderiye ait tüm bayrakları kaldır ve gönderiyi tekrar görünür hale getir" disagree_flag: "Onaylama" - disagree_flag_title: "Bu bildirimi geçersiz ya da yanlış sayarak reddet" - clear_topic_flags: "Tamam" - clear_topic_flags_title: "Bu konu araÅŸtırıldı ve sorunlar çözüldü. Bildirimleri kaldırmak için Tamam düğmesine basın. " + disagree_flag_title: "Bu bayrağı geçersiz ya da yanlış sayarak reddet" + clear_topic_flags: "Tamamlandı" + clear_topic_flags_title: "Bu konuyla ilgili sorunlar çözüldü. Bildirimleri kaldırmak için \"Tamamlandı\" düğmesine bas. " more: "(daha fazla cevap...)" + suspend_user: "Kullanıcıyı Askıya Al" + suspend_user_title: "Bu gönderi için kullanıcıyı askıya al" + replies: + one: "[1 cevap]" + other: "[%{count} cevaplar]" dispositions: agreed: "onaylandı" disagreed: "onaylanmadı" deferred: "Yoksayıldı" - flagged_by: "Bildiren" + flagged_by: "Bayrakla iÅŸaretleyen" resolved_by: "Çözen" took_action: "İşlem uygulandı" system: "Sistem" error: "Bir ÅŸeyler ters gitti" reply_message: "Cevapla" - topic_flagged: "Bu konu bildirildi." - visit_topic: "Harekete geçmek için konuyu ziyaret edin" - was_edited: "İlk bildirimden sonra gönderi düzenlendi" - previous_flags_count: "Bu gönderi daha önce {{count}} defa bildirilmiÅŸ." + no_results: "Bayraklı gönderiler mevcut deÄŸil." + topic_flagged: "Bu konu bayrakla iÅŸaretli. " + show_full: "Gönderiyi tam olarak göster" + visit_topic: "Eyleme geçmek için konuya göz at" + was_edited: "İlk bayraktan sonra gönderi düzenlendi" + previous_flags_count: "Bu gönderi daha önce {{count}} defa bayrakla iÅŸaretlenmiÅŸ. " + show_details: "Bayrak detaylarını göster" details: "ayrıntılar" flagged_topics: topic: "Konu" type: "Tür" users: "Kullanıcılar" + last_flagged: "Son Bayrakla İşaretlenen" + no_results: "Bayraklı Konu Mevcut DeÄŸil." short_names: off_topic: "konu-dışı" inappropriate: "uygunsuz" spam: "istenmeyen" - notify_user: "özel" - notify_moderators: "özel" + notify_user: "özel ayarlar" + notify_moderators: "özel ayarlar" groups: + new: + title: "Yeni Grup" + create: "OluÅŸtur" + name: + too_short: "Grup adı çok kısa" + too_long: "Grup adı çok uzun" + checking: "Grup adının uygunluÄŸu kontrol ediliyor..." + available: "Grup adı uygun" + not_available: "Grup adı mevcut deÄŸil" + blank: "Grup adı boÅŸ olamaz" + bulk_add: + title: "Toplu Grup Ekle" + complete_users_not_added: "Bu kullanıcılar eklenmedi (kullanıcıların hesaplarının olduÄŸundan emin ol):" + paste: "Kullanıcı adlarının veya e-postalarının bir listesini, her satıra birer adet olacak ÅŸekilde yapıştır:" + add_members: + as_owner: "Kullanıcıyı/Kullanıcıları, bu grubun sahibi/sahipleri olarak ayarla" manage: interaction: + email: E-posta + incoming_email: "KiÅŸiselleÅŸtirilmiÅŸ gelen e-posta adresi" + incoming_email_placeholder: "e-posta adresi gir" + visibility: Görünürlük visibility_levels: + title: "Bu grubu kimler görebilir?" + public: "Herkes" members: "Grup sahipleri, üyeler ve yöneticiler" + staff: "Grup sahipleri ve personel" owners: "Grup sahipleri ve yöneticiler" membership: + automatic: Otomatik + trust_level: Güven Seviyesi + trust_levels_title: "Güven seviyesi, üyelere -eklendiklerinde- otomatik olarak verilir:" trust_levels_none: "Hiçbiri" + automatic_membership_email_domains: "Listede, e-posta alan adıyla tam olarak eÅŸleÅŸen kayıtlı kullanıcılar, otomatik olarak bu gruba eklenir:" + automatic_membership_retroactive: "Mevcut kayıtlı kullanıcıları eklemek için aynı e-posta alanı kuralını uygula" + primary_group: "Otomatik olarak ana grup biçiminde ayarla" + name_placeholder: "Grup adı, boÅŸluksuz, kullanıcı adı kuralıyla aynı olarak" primary: "Ana Grup" no_primary: "(ana grup yok)" - title: "Grup" + title: "Gruplar" edit: "Grupları Düzenle" refresh: "Yenile" - about: "Grup üyeliÄŸinizi ve isimleri burada düzenleyin" + about: "Grup üyeliÄŸini ve isimleri burada düzenle" group_members: "Grup üyeleri" delete: "Sil" delete_confirm: "Grup silinsin mi?" delete_failed: "Grup silinemedi. Bu otomatik oluÅŸturulmuÅŸ bir grup ise, yok edilemez." delete_owner_confirm: "'%{username}' için sahiplik izni kaldırılsın mı?" add: "Ekle" - custom: "Özel" + custom: "Özel ayarlar" automatic: "Otomatik" + default_title: "Varsayılan baÅŸlık" + default_title_description: "gruptaki bütün kullanıcılara uygulanacak" group_owners: Sahipler - add_owners: Sahiplik ekle + add_owners: Sahipleri ekle + none_selected: "BaÅŸlamak için bir grup seç" + no_custom_groups: "Yeni bir özel grup oluÅŸtur" api: - generate_master: "Ana API Anahtarı Üret" + generate_master: "Ana API Anahtarını OluÅŸtur" none: "Åžu an etkin API anahtarı bulunmuyor." user: "Kullanıcı" title: "API" @@ -2429,16 +2692,16 @@ tr_TR: generate: "OluÅŸtur" regenerate: "Tekrar OluÅŸtur" revoke: "İptal Et" - confirm_regen: "API anahtarını yenisi ile deÄŸiÅŸtirmek istediÄŸinize emin misiniz?" - confirm_revoke: "Anahtarı iptal etmek istediÄŸinize emin misiniz?" - info_html: "API anahtarınız JSON çaÄŸrıları kullanarak konu oluÅŸturup güncelleyebilmenize olanak saÄŸlayacaktır." + confirm_regen: "API anahtarını yenisi ile deÄŸiÅŸtirmek istediÄŸine emin misin?" + confirm_revoke: "Anahtarı iptal etmek istediÄŸine emin misin?" + info_html: "API anahtarın JSON çaÄŸrıları kullanarak konu oluÅŸturup güncelleyebilmene olanak saÄŸlayacak." all_users: "Tüm Kullanıcılar" - note_html: "Bu anahtarı gizli tutun, anahtara sahip kullanıcılar her hangi bir kullanıcı adı altında istedikleri gönderiyi oluÅŸturabilirler." + note_html: "Bu anahtarı gizli tut, anahtara sahip kullanıcılar herhangi bir kullanıcı adı altında istedikleri gönderiyi oluÅŸturabilirler." web_hooks: title: "Web Kancaları" none: "Åžu anda bir web kancası yok." - instruction: "Web kancaları, sitenizde belirli olaylar meydana geldiÄŸinde dış servisleri haberdar etmek için kullanılır. Bir web kancası tetiklendiÄŸinde, belirtilen URL'e bir POST isteÄŸi gönderilir." - detailed_instruction: "Seçilen olay olduÄŸunda bir POST isteÄŸi verilen URL'e gönderilecek." + instruction: "Web kancaları, sitedeki bazı olaylar meydana geldiÄŸinde dış servisleri haberdar etmek için kullanılır. Bir web kancası tetiklendiÄŸinde, belirtilen URL'ye bir POST isteÄŸi gönderilir." + detailed_instruction: "Seçilen etkinlik gerçekleÅŸtiÄŸinde GÖNDERİ isteÄŸi verilen URL'e gönderilecek." new: "Yeni Web Kancası" create: "OluÅŸtur" save: "Kaydet" @@ -2446,60 +2709,77 @@ tr_TR: description: "Açıklama" controls: "Kontroller" go_back: "Listeye geri dön" - payload_url: "Veri yükü URL'i" + payload_url: "URL Veri yükü " payload_url_placeholder: "https://ornek.com/gonderial" - warn_local_payload_url: "Öyle görünüyor ki, web kancasını yerel bir URL'e ayarlamaya çalışıyorsunuz. Yerel bir adrese iletilen olay yan etki veya beklenmedik davranışlara neden olabilir. Devam edilsin mi?" - secret_invalid: "Gizli alanında boÅŸ karakter olamaz." - secret_too_short: "Gizi en azından 12 karakter olmalı." - secret_placeholder: "İmza oluÅŸturmak için isteÄŸe baÄŸlı bir dizi" - event_type_missing: "En az bir olay tipi ayarlamalısınız." + warn_local_payload_url: "Öyle görünüyor ki, web kancasını yerel bir URL'ye ayarlamaya çalışıyorsun. Yerel bir adrese iletilen etkinlik beklenmedik durumlara neden olabilir. Devam etmek istiyor musun?" + secret_invalid: "Gizli alanda boÅŸ karakter olamaz." + secret_too_short: "Gizli alan en az 12 karakter olmalı." + secret_placeholder: "İmza oluÅŸturmak için isteÄŸe baÄŸlı metin" + event_type_missing: "En az bir etkinlik türü ayarlaman gerekiyor." content_type: "İçerik Türü" secret: "Gizli" + event_chooser: "Bu webkancası hangi olayları tetiklemeli?" wildcard_event: "Bana her ÅŸeyi gönder." - individual_event: "Belirli olayları seç" - verify_certificate: "Veri yükü URL'inin TLS sertifikasını kontrol edin." - active: "Etkin" - active_notice: "OlduÄŸu zaman olay detaylarını ileteceÄŸiz." - categories_filter_instructions: "Alakalı web kancaları, eÄŸer olay belirtilen kategoriler ile alakalıysa tetiklenecektir. Bütün kategoriler için web kancalarını tetiklemek için boÅŸ bırakın." + individual_event: "Belirli etkinlikleri seç" + verify_certificate: "Veri yükü URL'inin TLS sertifikasını kontrol et" + active: "Aktif" + active_notice: "Etkinlik olduÄŸunda, detaylarını göndereceÄŸiz." + categories_filter_instructions: "İlgili web sayfaları yalnızca etkinlik belirtilen kategorilerle ilgiliyse tetiklenir. Tüm kategoriler için web sayfalarını tetiklemek için boÅŸ bırakın." categories_filter: "TetiklenmiÅŸ Kategoriler" - groups_filter_instructions: "Alakalı web kancaları, eÄŸer olay belirtilen gruplar ile alakalıysa tetiklenecektir. Bütün gruplar için web kancalarını tetiklemek için boÅŸ bırakın." + groups_filter_instructions: "İlgili web sayfaları yalnızca etkinlik belirtilen gruplarla ilgiliyse tetiklenir. Tüm gruplar için web sayfalarını tetiklemek için boÅŸ bırakın." groups_filter: "TetiklenmiÅŸ Gruplar" - delete_confirm: "Bu web kancasını sil?" + delete_confirm: "Bu web kancası silinsin mi?" topic_event: - name: "Konu Olayı" + name: "Konu EtkinliÄŸi" details: "Yeni bir konu oluÅŸturulduÄŸunda, düzenlendiÄŸinde veya silindiÄŸinde." post_event: - name: "Gönderme Olayı" - details: "Yeni bir cevap oluÅŸturulduÄŸunda, düzenlendiÄŸinde veya silindiÄŸinde." + name: "Gönderilen Etkinlik" + details: "Yeni bir cevap olduÄŸunda, düzenlendiÄŸinde veya silindiÄŸinde." user_event: - name: "Kullanıcı Olayı" + name: "Kullanıcı EtkinliÄŸi" + details: "Bir kullanıcı giriÅŸ yaptığında, çıkış yaptığında, oluÅŸturulduÄŸunda, onaylandığında veya güncellendiÄŸinde.." + group_event: + name: "Grup EtkinliÄŸi" + details: "Bir grup oluÅŸturulduÄŸunda, güncellendiÄŸinde veya iptal edildiÄŸinde." + category_event: + name: "Kategori EtkinliÄŸi" + details: "Bir kategori oluÅŸturulduÄŸunda, güncellendiÄŸinde veya iptal edildiÄŸinde." + tag_event: + name: "Etiket EtkinliÄŸi" + details: "Bir etiket oluÅŸturulduÄŸunda, güncellendiÄŸinde veya iptal edildiÄŸinde." + flag_event: + name: "Bayraklı Etkinlik" + details: "Bir bayrak oluÅŸturulduÄŸunda, mutabık kalınmış, kalınmamış veya yoksayılmış." + queued_post_event: + name: "Etkinlik Onayı Gönderisi" + details: "Yeni bir kuyruklu posta oluÅŸturulduÄŸunda, onaylanan veya reddedilen." delivery_status: title: "Teslim Durumu" - inactive: "Etkin DeÄŸil" + inactive: "Aktif DeÄŸil" failed: "BaÅŸarısız" successful: "BaÅŸarılı" events: - none: "İlgili bir olay yok." + none: "İlgili bir etkinlik yok" redeliver: "Yeniden ilet" incoming: - one: Åžu anda {{count}} yeni olay var. - other: Åžu anda {{count}} yeni olay var. + one: "Åžu anda {{count}} yeni olay var." + other: "Åžu anda {{count}} yeni etkinlik var." completed_in: - one: '{{count}} saniyede tamamlandı.' - other: '{{count}} saniyede tamamlandı.' + one: "{{count}} saniyede tamamlandı." + other: "{{count}} saniyede tamamlandı." request: "İstek" response: "Yanıt" - redeliver_confirm: "Aynı veri yükünü tekrar iletmek istediÄŸinize emin misiniz?" + redeliver_confirm: "Aynı veri yükünü tekrar iletmek istediÄŸinden emin misin?" headers: "BaÅŸlıklar" payload: "Veri yükü" body: "İçerik" go_list: "Listeye git" go_details: "Web kancasını düzenle" - go_events: "Olaylara git" - ping: "Ping" + go_events: "Etkinliklere git" + ping: "İnternet paketi araÅŸtırıcısı" status: "Durum Kodu" event_id: "Kimlik" - timestamp: "OluÅŸturulma" + timestamp: "OluÅŸturuldu" completion: "Tamamlanma Zamanı" actions: "Eylemler" plugins: @@ -2513,7 +2793,7 @@ tr_TR: not_enabled: "H" change_settings: "Ayarları DeÄŸiÅŸtir" change_settings_short: "Ayarlar" - howto: "Nasıl eklenti yükleyebilirim?" + howto: "Eklentileri nasıl yükleyebilirim?" official: "Resmi eklenti" backups: title: "Yedekler" @@ -2523,146 +2803,200 @@ tr_TR: none: "Yedek bulunmuyor." read_only: enable: - title: "Yalnızca okuma modunu etkinleÅŸtir" - label: "Yalnızca okumayı etkinleÅŸtir" - confirm: "Yalnızca okuma modunu etkinleÅŸtirmek istediÄŸinizden emin misiniz?" + title: "Salt-okuma modunu etkinleÅŸtir" + label: "Salt-okumayı etkinleÅŸtir" + confirm: "Salt-okuma modunu etkinleÅŸtirmek istediÄŸine emin misin?" disable: - title: "Yalnızca okuma modunu kapatır" - label: "Yalnızca okumayı kapa" + title: "Salt-okuma modunu kapat" + label: "Salt-okumayı kapa" logs: none: "Henüz kayıt bulunmuyor..." columns: filename: "Dosya adı" size: "Boyut" upload: - label: "Yedek Yükle" + label: "Yükle" title: "Bu oluÅŸuma bir yedek yükle" uploading: "Yükleniyor..." error: "'{{filename}}': {{message}} yüklenirken bir hata oluÅŸtu" operations: is_running: "İşlem devam ediyor..." - failed: "{{operation}} gerçekleÅŸemedi. Lütfen kayıtları kontrol edin." + failed: "{{operation}} gerçekleÅŸemedi. Lütfen kayıtları kontrol et." cancel: label: "İptal" title: "Devam eden iÅŸlemi iptal et" - confirm: "Devam eden iÅŸlemi iptal etmek istediÄŸinize emin misiniz?" + confirm: "Devam eden iÅŸlemi iptal etmek istediÄŸine emin misin?" backup: label: "Yedek OluÅŸtur" title: "Yedek oluÅŸtur" - confirm: "Yeni bir yedekleme baÅŸlatmak istiyor musunuz?" + confirm: "Yeni bir yedekleme baÅŸlatmak istiyor musun?" + without_uploads: "Evet (yüklemeleri dahil etme)" download: label: "İndir" + title: "İndirme baÄŸlantısıyla e-posta gönder" + alert: "Bu yedeklemeyi indirmek için sana e-posta gönderildi." destroy: title: "YedeÄŸi kaldır" - confirm: "Bu yedeÄŸi yok etmek istediÄŸinize emin misiniz?" + confirm: "Bu yedeÄŸi yok etmek istediÄŸine emin misin?" restore: is_disabled: "Geri getirme site ayarlarında devre dışı bırakılmış." label: "Geri Yükle" title: "YedeÄŸe geri dön" - confirm: "Bu yedeÄŸe geri dönmek istediÄŸinize emin misiniz?" + confirm: "Bu yedeÄŸe geri dönmek istediÄŸine emin misin?" rollback: label: "Geri al" title: "Veritabanını calışan son haline geri al" - confirm: "Veritabanını çalışan son haline döndürmek istediÄŸinize emin misiniz?" + confirm: "Veritabanını çalışan son haline döndürmek istediÄŸine emin misin?" export_csv: - success: "Dışarı aktarma baÅŸlatıldı, iÅŸlem tamamlandığında iletiyle bilgilendirileceksiniz." - failed: "Dışa aktarırken hata oluÅŸtu. Lütfen kayıtları kontrol edin." - button_text: "Dışa aktar" + success: "Dışa aktarma iÅŸlemi baÅŸlatıldı. İşlem tamamlandığında mesajla bilgilendirileceksin." + failed: "Dışa aktarımda bir hata oluÅŸtu. Lütfen kayıtları kontrol et." + button_text: "Dışa Aktar" button_title: - user: "Tüm kullanıcı listesini CSV biçiminde dışa aktar." - staff_action: "Tüm görevli eylemleri kaydını CSV biçiminde dışa aktar." - screened_email: "Tüm taranmış e-postalar listesini CSV biçiminde dışa aktar." - screened_ip: "Tüm taranmış IPler listesini CSV biçiminde dışa aktar." - screened_url: "Tüm taranmış URLler listesini CSV biçiminde dışa aktar." + user: "Tüm kullanıcı listesini CSV formatında dışa aktar" + staff_action: "Tüm görevli eylemleri kaydını CSV formatında dışa aktar" + screened_email: "Tüm taranmış e-postalar listesini CSV formatında dışa aktar" + screened_ip: "Tüm taranmış IP listesini CSV formatında dışa aktar" + screened_url: "Tüm taranmış URL listesini CSV formatında dışa aktar" export_json: - button_text: "Dışarı Aktar" + button_text: "Dışa Aktar" invite: button_text: "Davetleri Gönder" button_title: "Davetleri Gönder" customize: - title: "ÖzelleÅŸtir" - long_title: "Site ÖzelleÅŸtirmeleri" + title: "KiÅŸiselleÅŸtir" + long_title: "Site KiÅŸiselleÅŸtirmeleri" preview: "önizleme" + explain_preview: "Bu temanın etkin olduÄŸu siteye bak" save: "Kaydet" new: "Yeni" new_style: "Yeni Biçim" - import: "İçeri Aktar" + import: "İçe Aktar" delete: "Sil" delete_confirm: "Bu tema silinsin mi?" - about: "Sitedeki CSS biçim sayfalarını ve HTML baÅŸlıklarını deÄŸiÅŸtir. ÖzelleÅŸtirme ekleyerek baÅŸla." + about: "Sitedeki CSS biçim sayfalarını ve HTML baÅŸlıklarını deÄŸiÅŸtir. BaÅŸlamak için kiÅŸiselleÅŸtirme ekle." color: "Renk" - opacity: "Opaklık" + opacity: "Saydam" copy: "Kopyala" copy_to_clipboard: "Kopyala" copied_to_clipboard: "Kopyalandı" + copy_to_clipboard_error: "Panoya veri kopyalama hatası" + theme_owner: "Düzenlenemez, sahibi:" email_templates: title: "E-posta Åžablonları" subject: "Konu" multiple_subjects: "Bu e-posta ÅŸablonunda birden fazla konu mevcut." body: "İçerik" - none_selected: "Düzenlemeye baÅŸlamak için bir e-posta ÅŸablonu seçin. " + none_selected: "Düzenlemeye baÅŸlamak için bir e-posta ÅŸablonu seç. " revert: "DeÄŸiÅŸiklikleri Geri Al" - revert_confirm: "DeÄŸiÅŸikliklerinizi geri almak istediÄŸinize emin misiniz?" + revert_confirm: "DeÄŸiÅŸiklikleri geri almak istediÄŸine emin misin?" theme: - customize_desc: "ÖzelleÅŸtir:" + import_theme: "Temayı İçe Aktar" + customize_desc: "KiÅŸiselleÅŸtir:" title: "Temalar" + long_title: "Sitenin renklerini, CSS ve HTML içeriÄŸini deÄŸiÅŸtir" edit: "Düzenle" + edit_confirm: "Bu, uzak bir temadır. EÄŸer CSS / HTML'yi düzenlersen, temayı güncellediÄŸinde deÄŸiÅŸiklikler silinir." common: "Ortak" desktop: "Masaüstü" mobile: "Mobil" + settings: "Ayarlar" preview: "Önizleme" is_default: "Tema varsayılan olarak etkinleÅŸtirildi" + user_selectable: "Tema kullanıcılar tarafından seçilebilir" + color_scheme: "Renk Åžeması" + color_scheme_select: "Temada kullanılacak renkleri seç" + custom_sections: "İsteÄŸe uyarlanmış bölümler:" + theme_components: "Tema Öğeleri" uploads: "Yüklemeler" + no_uploads: "Fontlar ve resimler gibi temayla iliÅŸkili varlıkları yükleyebilirsin" + add_upload: "Yükleme Ekle" + upload_file_tip: "Yüklenecek bir varlık seç (png, woff2, vb ...)" + variable_name: "SCSS var adı:" + variable_name_invalid: "Geçersiz deÄŸiÅŸken adı. Sadece abecesayısala izin verilir. Bir harfle baÅŸlamalı ve benzersiz olmalıdır." + variable_name_error: + invalid_syntax: "Geçersiz deÄŸiÅŸken adı. Sadece abecesayısala izin verilir. Bir harfle baÅŸlamalıdır." + no_overwrite: "Geçersiz deÄŸiÅŸken adı. Mevcut bir deÄŸiÅŸkenin üzerine yazılmamalıdır." + must_be_unique: "Geçersiz deÄŸiÅŸken adı. Benzersiz olmalıdır." upload: "Yükle" - css_html: "Özel CSS/HTML" + child_themes_check: "Tema diÄŸer çocuk temalarını içerir" + css_html: "İsteÄŸe uyarlanmış CSS/HTML" edit_css_html: "CSS/HTML Düzenle" + edit_css_html_help: "Herhangi bir CSS veya HTML düzenlemedin" + delete_upload_confirm: "Yükleme silinsin mi?(Tema CSS çalışmayı durdurabilir!)" + import_web_tip: "Veri havuzu içeren tema" + import_file_tip: "Tema içeren .dcstyle.json dosyası" + is_private: "Tema özel bir git veri havuzunda" + public_key: "Repo'ya aÅŸağıdaki genel anahtar eriÅŸimini ver:" about_theme: "Tema Hakkında" license: "Lisans" + update_to_latest: "Sona DoÄŸru Güncelle" check_for_updates: "Güncellemeleri kontrol et" updating: "Güncelleniyor..." + up_to_date: "Tema güncel, son kontrol yapıldı:" add: "Ekle" + theme_settings: "Tema Ayarları" + no_settings: "Bu temada ayarlar mevcut deÄŸil." scss: text: "CSS" + title: "İsteÄŸe uyarlanmış CSS'yi gir. Tüm geçerli CSS ve SCSS tiplerini kabul ediyoruz. " header: text: "BaÅŸlık" + title: "Site üstbilgisini görüntülemek için HTML gir" after_header: text: "BaÅŸlıktan Sonra" + title: "Üstbilgi sonrasında tüm sayfalarda görüntülenecek HTML’i gir" footer: - text: "Alt Kısım" + text: "Altbilgi" + title: "Sayfa altbilgisinde görüntülemek için HTML'yi gir" + embedded_scss: + text: "Gömülü CSS" + title: "Gömülü sürüm yorumlarıyla yayınlamak için isteÄŸe uyarlanmış CSS'yi gir" + head_tag: + text: "" + body_tag: + text: "" + yaml: + text: "YAML" + title: "Tema ayarlarını YAML formatında tanımla" colors: + select_base: + title: "Temel renk ÅŸemasını seç" + description: "Temel ÅŸema:" title: "Renkler" - long_title: "Renk Düzenleri" - new_name: "Yeni Renk Düzeni" + edit: "Renk Åžemalarını Düzenle" + long_title: "Renk Åžemaları" + about: "Temalarında kullandığın renkleri deÄŸiÅŸtir. BaÅŸlamak için yeni bir renk ÅŸeması oluÅŸtur." + new_name: "Yeni Renk Åžeması" copy_name_prefix: "Kopyası" - delete_confirm: "Bu renk düzenini sil?" + delete_confirm: "Bu renk ÅŸemasını silmek mi istiyorsun? " undo: "geri al" undo_title: " Son kayıt esnasında yapılan bu renkteki deÄŸiÅŸiklikleri geri al." revert: "eski haline getir" - revert_title: "Bu rengi Discourse'un varsayılan renk düzenine sıfırla." + revert_title: "Bu rengi varsayılan renk ÅŸemasına göre sıfırla." primary: - name: 'birincil' - description: 'ÇoÄŸu yazı, ikon ve kenarların rengi.' + name: 'Ana' + description: 'ÇoÄŸu yazı, ikonlar ve kenarlar' secondary: name: 'ikincil' - description: 'Ana arkaplan ve bazı düğmelerinin yazı rengi.' + description: 'Ana arkaplan ve bazı düğmelerin metin rengi.' tertiary: name: 'üçüncül' - description: 'BaÄŸlantı, bazı düğmeler, bildirimler ve vurguların rengi.' + description: 'BaÄŸlantılar, bazı düğmeler, bildirimler ve vurguların rengi.' quaternary: name: "dördüncül" description: "Navigasyon baÄŸlantıları." header_background: name: "baÅŸlık arkaplanı" - description: "Websitesi'nin sayfa baÅŸlığının arkaplan rengi." + description: "Website sayfa baÅŸlığının arka plan rengi." header_primary: - name: "birincil baÅŸlık" - description: "Websitesi'nin sayfa baÅŸlığındaki yazı ve ikonlar." + name: "ana baÅŸlık" + description: "Websitesi'nin sayfa baÅŸlığındaki metin ve ikonlar." highlight: name: 'vurgula' - description: 'Sayfada vurgulanmış ögelerin, gönderi ve konu gibi, arkaplan rengi.' + description: 'Gönderi ve konu gibi sayfada vurgulanmış öğelerin arkaplan rengi.' danger: name: 'tehlike' - description: 'Gönderi ve konu silme gibi eylemler için vurgulama rengi.' + description: 'Gönderi ve konu silme gibi eylemler için rengi vurgula ' success: name: 'baÅŸarı' description: 'Eylemin baÅŸarılı olduÄŸunu göstermek için kullanılır.' @@ -2676,14 +3010,14 @@ tr_TR: preview_digest: "Özeti Önizle" sending_test: "Test e-postası gönderiliyor..." error: "HATA - %{server_error}" - test_error: "Test e-postasının gönderilmesinde sorun yaÅŸandı. Lütfen e-posta ayarlarınızı tekrar kontrol edin, yer saÄŸlayıcınızın e-posta baÄŸlantılarını engellemediÄŸinden emin olun, ve tekrar deneyin." + test_error: "Test e-postasının gönderilmesinde sorun yaÅŸandı. Lütfen e-posta ayarlarını tekrar kontrol et, yer saÄŸlayıcının e-posta baÄŸlantılarını engellemediÄŸinden emin ol ve tekrar dene." sent: "Gönderildi" skipped: "Atlandı" - bounced: "Geri Sekenler" + bounced: "Geri Sekti" received: "Alındı" rejected: "Reddedildi" - sent_at: "GönderildiÄŸi Zaman" - time: "Zaman" + sent_at: "Gönder" + time: "Saat" user: "Kullanıcı" email_type: "E-posta Türü" to_address: "Gönderi Adresi" @@ -2691,47 +3025,55 @@ tr_TR: send_test: "Test E-postası Gönder" sent_test: "gönderildi!" delivery_method: "Gönderme Metodu" - preview_digest_desc: "Durgun kullanıcılara gönderilen özet e-postaların içeriÄŸini önizle." + preview_digest_desc: "Inaktif kullanıcılara gönderilen özet e-postaların içeriÄŸini önizle." refresh: "Yenile" send_digest_label: "Bu sonucu ÅŸuna gönder:" send_digest: "Gönder" sending_email: "E-posta gönderiliyor..." format: "Biçim" html: "html" - text: "yazı" + text: "metin" last_seen_user: "Son Görülen Kullanıcı:" - no_result: "Derleme için hiç bir sonuç bulunamadı." + no_result: "Özet için hiçbir sonuç bulunamadı." reply_key: "Cevapla TuÅŸu" skipped_reason: "Nedeni Atla" incoming_emails: from_address: "Gönderen" to_addresses: "Kime" - cc_addresses: "Cc" + cc_addresses: "Kk" subject: "Konu" error: "Hata" - none: "Gelen e-posta yok." + none: "Gelen e-posta yok" modal: - title: "Gelen E-posta Ayrıntıları" + title: "Gelen E-posta Detayları" error: "Hata" - headers: "BaÅŸlıklar" + headers: "Üstbilgiler" subject: "Konu" body: "İçerik" - rejection_message: "Ret E-postası" + rejection_message: "Reddedilen E-posta" filters: - from_placeholder: "bundan@ornek.com" - to_placeholder: "suna@ornek.com" - cc_placeholder: "cc@ornek.com" + from_placeholder: "kimden@ornek.com" + to_placeholder: "kime@ornek.com" + cc_placeholder: "bilgi@ornek.com" subject_placeholder: "Konu..." error_placeholder: "Hata" logs: - none: "Hiç bir kayıt bulunamadı." + none: "Hiçbir kayıt bulunamadı." filters: - title: "Süzgeç" - user_placeholder: "kullanıcıadı" + title: "Filtrele" + user_placeholder: "kullanıcı adı" address_placeholder: "isim@örnek.com" type_placeholder: "özet, kayıt olma..." reply_key_placeholder: "cevapla tuÅŸu" - skipped_reason_placeholder: "neden" + moderation_history: + performed_by: "GerçekleÅŸtiren" + no_results: "Mevcut bir moderasyon geçmiÅŸi yok" + actions: + delete_user: "Kullanıcı Silindi" + suspend_user: "Kullanıcı Askıya Alındı" + silence_user: "Kullanıcı Susturuldu" + delete_post: "Gönderi Silindi" + delete_topic: "Konu Silindi" logs: title: "Kayıtlar" action: "Eylem" @@ -2741,7 +3083,7 @@ tr_TR: ip_address: "IP" topic_id: "Konu IDsi" post_id: "Gönderi IDsi" - category_id: "Kategori ID" + category_id: "Kategori IDsi" delete: 'Sil' edit: 'Düzenle' save: 'Kaydet' @@ -2750,6 +3092,7 @@ tr_TR: do_nothing: "hiçbir ÅŸey yapma" staff_actions: all: "hepsi" + filter: "Filtrele:" title: "Görevli Eylemleri" clear_filters: "Hepsini Göster" staff_user: "Görevli Kullanıcı" @@ -2760,7 +3103,7 @@ tr_TR: details: "Ayrıntılar" previous_value: "Önceki" new_value: "Yeni" - diff: "Diff" + diff: "Fark" show: "Göster" modal_title: "Ayrıntılar" no_previous: "Bir önceki deÄŸer yok." @@ -2770,20 +3113,29 @@ tr_TR: change_trust_level: "güven seviyesini deÄŸiÅŸtir" change_username: "kullanıcı adını deÄŸiÅŸtir" change_site_setting: "site ayarlarını deÄŸiÅŸtir" + change_theme: "temayı deÄŸiÅŸtir" + delete_theme: "temayı sil" change_site_text: "site metnini deÄŸiÅŸtir" - suspend_user: "kullanıcıyı uzaklaÅŸtır" - unsuspend_user: "kullanıcıyı uzaklaÅŸtırma" + suspend_user: "kullanıcıyı askıya al" + unsuspend_user: "kullanıcıyı askıya alma" + removed_suspend_user: "askıya alınan kullanıcı (kaldırılmış)" + removed_unsuspend_user: "askıya alınmamış kullanıcı (kaldırılmış)" grant_badge: "rozet ver" revoke_badge: "rozeti iptal et" check_email: "e-posta kontrol et" delete_topic: "konuyu sil" + recover_topic: "konuyu sil-me" delete_post: "gönderiyi sil" - impersonate: "rolüne gir" + impersonate: "taklit et" anonymize_user: "kullanıcıyı anonimleÅŸtir" roll_up: "IP bloklarını topla" change_category_settings: "kategori ayarlarını deÄŸiÅŸtir" delete_category: "kategoriyi sil" create_category: "kategori oluÅŸtur" + silence_user: "sessiz kullanıcı" + unsilence_user: "sessiz kullanıcı" + removed_silence_user: "sessiz kullanıcı (kaldırılmış)" + removed_unsilence_user: "sessiz olmayan kullanıcı (kaldırılmış)" grant_admin: "yönetici yetkisi ver" revoke_admin: "yönetici yetkisini kaldır" grant_moderation: "moderasyon yetkisi ver" @@ -2792,30 +3144,43 @@ tr_TR: deleted_tag: "silinmiÅŸ etiket" renamed_tag: "yeniden adlandırılmış etiket" revoke_email: "e-postayı kaldır" - lock_trust_level: "Güven Seviyesini Kilitle" - unlock_trust_level: "Güvenlik Seviyesi Kilidini Aç" - activate_user: "Kullanıcıyı etkinleÅŸtir." - deactivate_user: "Kullanıcıyı dondur" - change_readonly_mode: "Salt-okunur modunu deÄŸiÅŸtir" + lock_trust_level: "güven seviyesini kilitle" + unlock_trust_level: "güvenlik seviyesi kilidini aç" + activate_user: "kullanıcıyı etkinleÅŸtir." + deactivate_user: "kullanıcıyı pasifleÅŸtir" + change_readonly_mode: "salt-okunur modunu deÄŸiÅŸtir" backup_download: "yedeÄŸi yükle" backup_destroy: "yedeÄŸi sil" - disabled_second_factor: "İki Faktör Kimlik DoÄŸrulaması devre dışı bırakıldı" + reviewed_post: "gözden geçirilmiÅŸ gönderi" + custom_staff: "özel eklenti eylemi" + post_locked: "gönderi kilitlendi" + post_edit: "gönderi düzenleme" + post_unlocked: "gönderi kilidi açıldı" + check_personal_message: "kiÅŸisel mesajlara bak" + disabled_second_factor: "\"İki Faktör Kimlik DoÄŸrulaması\"nı devre dışı bırak" + topic_published: "konu yayımlandı" + post_approved: "gönderi onaylandı" + post_rejected: "gönderi reddedildi" + create_badge: "rozet oluÅŸtur" + change_badge: "rozet deÄŸiÅŸtir" + delete_badge: "rozet sil" + merge_user: "kullanıcıyı birleÅŸtir" screened_emails: title: "Taranmış E-postalar" - description: "Biri yeni bir hesap oluÅŸturmaya çalıştığında, aÅŸağıdaki e-posta adresleri kontrol edilecek ve kayıt önlenecek veya baÅŸka bir eylem gerçekleÅŸecek." + description: "Biri yeni bir hesap oluÅŸturmaya çalıştığında aÅŸağıdaki e-posta adresleri kontrol edilecek ve kayıt önlenecek ya da baÅŸka bir eylem gerçekleÅŸecek." email: "E-posta Adresi" actions: allow: "İzin Ver" screened_urls: - title: "Taranmış BaÄŸlantılar" - description: "Burada listenen URLler spamci olduÄŸu tespit edilmiÅŸ kullanıcılar tarafından gönderilerde kullanılmış." - url: "BaÄŸlantı" + title: "Taranmış URL'ler" + description: "Burada listenen URLler, spam gönderdiÄŸi belirlenmiÅŸ kullanıcıların gönderilerinde kullanılmış." + url: "URL" domain: "Alan Adı" screened_ips: title: "Taranmış IPler" - description: 'Gözlenen IP adresleri. IP adreslerini beyaz listeye aktarmak için "İzin ver"i kullan.' - delete_confirm: "%{ip_address} için konulan kuralı kaldırmak istediÄŸinize emin misiniz?" - roll_up_confirm: "Tüm ortaklaÅŸa taranmış IP adreslerini subnetlere toplamak istediÄŸinize emin misiniz?" + description: 'İzlenen IP adresleri. IP adreslerini beyaz listeye aktarmak için "İzin ver"i kullan.' + delete_confirm: "%{ip_address} için konulan kuralı kaldırmak istediÄŸine emin misin?" + roll_up_confirm: "Sık kullanılan IP adreslerini alt aÄŸlara aktarmak istediÄŸine emin misin?" rolled_up_some_subnets: "Bu subnetlere baÅŸarıyla toplanmış tüm engellenen IP giriÅŸleri: %{subnets}." rolled_up_no_subnet: "Toplanacak bir ÅŸey bulunamadı." actions: @@ -2831,94 +3196,113 @@ tr_TR: text: "Topla" title: "En az 'min_ban_entries_for_roll_up' adet giriÅŸ olduÄŸu takdirde yeni subnet engelleme giriÅŸleri yaratır." search_logs: + title: "Arama Günlükleri" + term: "Dönem" searches: "Aramalar" click_through: "Buraya tıklayın" unique: "Benzersiz" + unique_title: "aramayı yapan benzersiz kullanıcılar" types: all_search_types: "Tüm arama türleri" header: "Üst kısım" full_page: "Tam Sayfa" + click_through_only: "Tümü (sadece tıkla)" + header_search_results: "Üstbilgi Arama Sonuçları" logster: title: "Hata Kayıtları" watched_words: + title: "İzlenen Kelimeler" search: "ara" clear_filter: "Temizle" show_words: "kelimeleri göster" word_count: - one: 1 kelime - other: '%{count} kelimeler' + one: "1 kelime" + other: "%{count} kelimeler" actions: + block: 'Engelle' censor: 'Sansür' require_approval: 'Onay gerektir' - flag: 'Bildir' + flag: 'Bayrakla iÅŸaretle' + action_descriptions: + block: 'Bu kelimeleri içeren gönderilerin yayımlanmasını önle. Kullanıcı, gönderilerini yayımlamaya çalışırken bir hata mesajı görecek.' + censor: 'Bu kelimeleri içeren yayımlara izin ver ancak bu kelimeleri sansürlenmiÅŸ kelimeleri gizleyen karakterlerle deÄŸiÅŸtir. ' + require_approval: 'Bu kelimeleri içeren gönderiler yayımlanmadan önce personel onayı gerektirir.' + flag: 'Bu kelimeleri içeren yayımlara izin ver ancak bunları uygunsuz olarak bayrakla iÅŸaretle. Böylece moderatörler bunları inceleyebilir.' form: label: 'Yeni Kelime: ' + placeholder: 'tam kelime veya * özel karakter olarak' + placeholder_regexp: "güvenilir ifade" add: 'Ekle' success: 'BaÅŸarılı' + exists: 'Zaten mevcut' upload: "Yükle" upload_successful: "Yükleme baÅŸarılı oldu. Kelimeler eklendi." impersonate: - title: "Rolüne gir" - help: "Hata bulma ve giderme amaçları için, bu aracı kullanarak kullanıcının rolüne girin. İşiniz bitince sistemdne çıkış yapmanız gerekecek." - not_found: "Bu kullanıcı bulunamadı." - invalid: "Üzgünüz, bu kullanıcının rolüne giremezsiniz." + title: "Taklit Et" + help: "Kullanıcı hesabındaki hatayı bulmak için kullanıcı hesabını taklit et. Bitirdikten sonra çıkman gerekiyor." + not_found: "Kullanıcı bulunamadı." + invalid: "Üzgünüz, bu kullanıcıyı taklit edemezsin. " users: title: 'Kullanıcılar' - create: 'Yönetici Kullanıcı Ekle' + create: 'Yönetici Ekle' last_emailed: "Son E-posta Gönderimi" - not_found: "Üzgünüz, bu kullanıcı adı sistemde yok." - id_not_found: "Üzgünüz, bu kullanıcı adı sistemimizde bulunmuyor." - active: "Etkin" + not_found: "Üzgünüz, bu kullanıcı adı sistemimizde bulunmuyor. " + id_not_found: "Üzgünüz, bu kullanıcı kimliÄŸi sistemimizde bulunmuyor." + active: "Aktif" show_emails: "E-postaları Göster" nav: new: "Yeni" - active: "Etkin" + active: "Aktif" pending: "Bekleyen" staff: 'Görevli' - suspended: 'UzaklaÅŸtırılmış' + suspended: 'Askıya Alınmış' silenced: 'Susturuldu' - suspect: 'KuÅŸkulanılan' + suspect: 'Şüpheli' + staged: 'AÅŸamalı' approved: "Onaylanmış mı?" approved_selected: - one: '({{count}}) kullanıcıyı onayla ' - other: '({{count}}) kullanıcıyı onayla ' + one: "({{count}}) kullanıcıyı onayla " + other: "({{count}}) kullanıcıyı onayla " reject_selected: - one: ({{count}}) kullanıcıyı reddet - other: ({{count}}) kullanıcıyı reddet + one: "({{count}}) kullanıcıyı reddet" + other: "({{count}}) kullanıcıyı reddet" titles: - active: 'Etkin Kullanıcılar' + active: 'Aktif Kullanıcılar' new: 'Yeni Kullanıcılar' - pending: 'Gözden Geçirilmeyi Bekleyen Kullanıcılar' + pending: 'Gözden Geçirilecek Kullanıcılar' newuser: 'Güven seviyesi 0 (Yeni kullanıcı) olan kullanıcılar' - basic: 'Güven seviyesi 1 (Acemi kullanıcı) olan kullanıcılar' + basic: 'Güven seviyesi 1 (Ana kullanıcı) olan kullanıcılar' member: 'Güven seviyesi 2 (Üye) olan kullanıcılar' - regular: 'Güven seviyesi 3 (Müdavim) olan kullanıcılar' + regular: 'Güven seviyesi 3 (Düzenli) olan kullanıcılar' leader: 'Güven seviyesi 4 (Lider) olan kullanıcılar' staff: "Görevli" admins: 'Yöneticiler' moderators: 'Moderatörler' silenced: 'SusturulmuÅŸ Kullanıcılar' - suspended: 'UzaklaÅŸtırılmış Kullanıcılar' - suspect: 'KuÅŸkulanılan Kullanıcılar' + suspended: 'Askıya Alınan Kullanıcılar' + suspect: 'Şüpheli Kullanıcılar' + staged: 'AÅŸamalı Kullanıcılar' reject_successful: - one: BaÅŸarıyla reddedilmiÅŸ %{count} kullanıcı. - other: BaÅŸarıyla reddedilmiÅŸ %{count} kullanıcı. + one: "BaÅŸarıyla reddedilmiÅŸ %{count} kullanıcı." + other: "BaÅŸarıyla reddedilmiÅŸ %{count} kullanıcı." reject_failures: - one: Reddedilemeyen %{count} kullanıcı. - other: Reddedilemeyen %{count} kullanıcı. - not_verified: "Onaylanmayan" + one: "Reddedilemeyen %{count} kullanıcı." + other: "Reddedilemeyen %{count} kullanıcı." + not_verified: "DoÄŸrulanmadı" check_email: title: "Bu kullanıcının e-posta adresini ortaya çıkar" text: "Göster" user: - suspend_failed: "Bu kullanıcı uzaklaÅŸtırılırken bir ÅŸeyler ters gitti {{error}}" - unsuspend_failed: "Bu kullanıcının uzaklaÅŸtırması kaldırılırken bir ÅŸeyler ters gitti {{error}}" - suspend_duration: "Kullanıcı ne kadar uzun bir süre için uzaklaÅŸtırılacak?" - suspend_reason_label: "Neden uzaklaÅŸtırıyorsunuz? Buraya yazdıklarınız bu kullanıcının profil sayfasında herkese gözükecek ve sistemde oturum açtığı anda kullanıcıya gösterilecek. Lütfen yazıyı kısa tutun." - suspend_reason: "Neden" - suspend_reason_placeholder: "Askıya alma sebebi" + suspend_failed: "Bu kullanıcı askıya alınırken bir ÅŸeyler ters gitti {{error}}" + unsuspend_failed: "Bu kullanıcının askıya alınması kaldırılırken bir ÅŸeyler ters gitti {{error}}" + suspend_duration: "Kullanıcı ne kadar süreyle askıya alınacak?" + suspend_reason_label: "Neden askıya alıyorsun? Bu metin bu kullanıcının profil sayfasında herkes tarafından görüntülenecek ve kullanıcı sisteme giriÅŸ yapmaya çalıştığında kullanıcı tarafından görüntülenecek. Metin lütfen kısa olsun. " + suspend_reason_hidden_label: "Neden askıya alıyorsun? Kullanıcı giriÅŸ yapmaya çalıştığında yazdığın metni görecek. Metin lütfen kısa olsun." + suspend_reason: "Sebep" + suspend_reason_placeholder: "Askıya Alma Sebebi" suspend_message: "E Posta Mesajı" - suspended_by: "UzaklaÅŸtıran" + suspend_message_placeholder: "İsteÄŸe baÄŸlı olarak, askıya alma sebebini daha uzun yazabilirsin. Askıya alma sebebi kullanıcıya e-postayla gönderilecek." + suspended_by: "Askıya alan" silence_reason: "Neden" silenced_by: "Tarafından susturuldu" silence_modal_title: "Kullanıcıyı Sustur" @@ -2927,150 +3311,157 @@ tr_TR: silence_reason_placeholder: "Susturulma sebebi" silence_message: "E-posta Mesajı" silence_message_placeholder: "(varsayılan mesajı göndermek için boÅŸ bırakın)" + suspended_until: "(%{until} a kadar)" cant_suspend: "Bu kullanıcı askıya alınamaz." delete_all_posts: "Tüm gönderileri sil" + penalty_post_actions: "İliÅŸkili gönderi ile ne yapmak istiyorsun? " penalty_post_delete: "Gönderiyi sil" penalty_post_edit: "Gönderiyi düzenle" penalty_post_none: "Hiçbir ÅŸey yapma" - delete_all_posts_confirm_MF: "{POSTS, plural, one {1 gönderi} other {# gönderi}} ve {TOPICS, plural, one {1 konu} other {# konu}} silmek üzeresiniz. Emin misiniz?" + penalty_count: "Ceza Sayımı" + clear_penalty_history: + title: "Ceza GeçmiÅŸini Temizle" + description: "ceza puanı olan kullanıcılar TL3'e ulaÅŸamaz" + delete_all_posts_confirm_MF: "{POSTS, plural, one {1 gönderi} other {# gönderi}} ve {TOPICS, plural, one {1 konu} other {# konu}} silmek üzeresin. Emin misin?" silence: "Sustur" unsilence: "Susturma" silenced: "Susturuldu?" moderator: "Moderatör mü?" admin: "Yönetici mi?" - suspended: "UzaklaÅŸtırıldı mı?" - staged: "AÅŸamalı?" + suspended: "Askıya mı alındı?" + staged: "AÅŸamalı mı?" show_admin_profile: "Yönetici" refresh_browsers: "Tarayıcıyı sayfa yenilemesine zorla" - refresh_browsers_message: "İleti tüm kullanıcılara gönderildi!" - show_public_profile: "Herkese Açık Profili Görüntüle" - impersonate: 'Rolüne gir' + refresh_browsers_message: "Mesaj tüm kullanıcılara gönderildi!" + show_public_profile: "Herkese Açık Profili Göster" + impersonate: 'Taklit et' action_logs: "İşlem Kayıtları" ip_lookup: "IP Arama" log_out: "Çıkış Yap" - logged_out: "Kullanıcının tüm cihazlarda oturumu kapatılmış" - revoke_admin: 'YöneticiliÄŸini İptal Et' + logged_out: "Kullanıcı tüm cihazlarda çıkış yapmış" + revoke_admin: 'Yöneticiyi İptal Et' grant_admin: 'Yönetici Yetkisi Ver' grant_admin_confirm: "Yeni yöneticiyi onaylamanız için size bir e-posta gönderdik. Lütfen onaylama talimatlarını uygulayınız." revoke_moderation: 'Moderasyonu İptal Et' grant_moderation: 'Moderasyon Yetkisi Ver' - unsuspend: 'UzaklaÅŸtırmayı geri al' - suspend: 'UzaklaÅŸtır' + unsuspend: 'Askıya Alma' + suspend: 'Askıya al' show_flags_received: "Alınan Bildirimleri Göster" + flags_received_none: "Bu kullanıcı herhangi bir bayrak almadı." reputation: İtibar permissions: İzinler - activity: Etkinlik + activity: Aktivite like_count: Verilen / Alınan BeÄŸeniler last_100_days: 'son 100 günde' private_topics_count: Özel Konular - posts_read_count: OkuduÄŸu Gönderiler - post_count: OluÅŸturduÄŸu Gönderiler + posts_read_count: Okunan Gönderiler + post_count: OluÅŸturulan Gönderiler second_factor_enabled: İki Faktörlü Kimlik DoÄŸrulama etkinleÅŸtirildi - topics_entered: GörüntülediÄŸi Konular - flags_given_count: Yapılan Bildirimler - flags_received_count: Alınan Bildirimler - warnings_received_count: Uyarılar Alındı - flags_given_received_count: 'Yapılan / Alınan Bildirimler' + topics_entered: Görüntülenen Konular + flags_given_count: Verilen Bayraklar + flags_received_count: Alınan Bayraklar + warnings_received_count: Alınan Uyarılar + flags_given_received_count: 'Yapılan / Alınan Bayraklar' approve: 'Onayla' approved_by: "onaylayan" - approve_success: "Kullanıcı onaylandı ve etkinleÅŸtirme bilgilerini içeren bir e-posta yollandı." + approve_success: "Kullanıcı onaylandı ve aktivasyon bilgilerini içeren bir e-posta gönderildi. " approve_bulk_success: "Tebrikler! Seçilen tüm kullanıcılar onaylandı ve bilgilendirildi." time_read: "Okunma Süresi" anonymize: "Kullanıcıyı AnonimleÅŸtir" - anonymize_confirm: "Bu hesabı anonimleÅŸtirmek istediÄŸinize EMİN misiniz? Kullanıcı adı ve e-posta deÄŸiÅŸtirilecek, ve tüm profil bilgileri sıfırlanacak." + anonymize_confirm: "Bu hesabı anonimleÅŸtirmek istediÄŸine EMİN misin? Kullanıcı adı ve e-posta deÄŸiÅŸtirilecek ve tüm profil bilgileri sıfırlanacak." anonymize_yes: "Evet, bu hesabı anonimleÅŸtir" anonymize_failed: "Hesap anonimleÅŸtirilirken bir hata oluÅŸtu." delete: "Kullanıcıyı Sil" delete_forbidden_because_staff: "Yöneticiler ve moderatörler silinemez." - delete_posts_forbidden_because_staff: "Yöneticiler ve moderatörlerin tüm gönderileri silinemez." + delete_posts_forbidden_because_staff: "Yöneticiler ve moderatörlerin gönderileri silinemez." delete_forbidden: - one: Gönderisi olan kullanıcılar silinemez. Kullanıcıyı silmeden önce tüm gönderilerini silin. (%{count} günden eski gönderiler silinemez.) - other: Gönderisi olan kullanıcılar silinemez. Kullanıcıyı silmeden önce tüm gönderilerini silin. (%{count} günden eski gönderiler silinemez.) + one: "Gönderisi olan kullanıcılar silinemez. Kullanıcıyı silmeden önce tüm gönderilerini silin. (%{count} günden eski gönderiler silinemez.)" + other: "Gönderisi olan kullanıcılar silinemez. Kullanıcıyı silmeden önce tüm gönderilerini sil. (%{count} günden eski gönderiler silinemez.)" cant_delete_all_posts: - one: Tüm gönderileri silemezsiniz. Bazı gönderiler %{count} günden daha eski. (delete_user_max_post_age ayarı.) - other: Tüm gönderileri silemezsiniz. Bazı gönderiler %{count} günden daha eski. (delete_user_max_post_age ayarı.) + one: "Tüm gönderileri silemezsiniz. Bazı gönderiler %{count} günden daha eski. (delete_user_max_post_age ayarı.)" + other: "Tüm gönderileri silemezsin. Bazı gönderiler %{count} günden daha eski. (delete_user_max_post_age ayarı.)" cant_delete_all_too_many_posts: - one: Tüm gönderileri silemezsiniz çünkü kullanıcının %{count} 'ten daha fazla gönderisi var. (delete_all_posts_max) - other: Tüm gönderileri silemezsiniz çünkü kullanıcının %{count} 'ten daha fazla gönderisi var. (delete_all_posts_max) - delete_confirm: "Bu kullanıcıyı silmek istediÄŸinize EMİN misiniz? Bu iÅŸlem geri alınamaz!" + one: "Tüm gönderileri silemezsiniz çünkü kullanıcının %{count} 'ten daha fazla gönderisi var. (delete_all_posts_max)" + other: "Tüm gönderileri silemezsin çünkü kullanıcının %{count} 'ten fazla gönderisi var. (delete_all_posts_max)" + delete_confirm: "Bu kullanıcıyı silmek istediÄŸine EMİN misin? Bu iÅŸlem geri alınamaz!" delete_and_block: "Sil ve bu e-posta ve IP adresini engelle" delete_dont_block: "Sadece sil" deleting_user: "Kullanıcı siliniyor..." deleted: "Kullanıcı silinmiÅŸ." - delete_failed: "Kullanıcı silinirken bir hata oluÅŸtu. Kullanıcıyı silmeye çalışmadan önce tüm gönderilerin silindiÄŸinden emin olun. " + delete_failed: "Kullanıcı silinirken bir hata oluÅŸtu. Kullanıcıyı silmeye çalışmadan önce tüm gönderilerin silindiÄŸinden emin ol. " send_activation_email: "EtkinleÅŸtirme E-postası Gönder" activation_email_sent: "EtkinleÅŸtirme e-postası gönderildi." - send_activation_email_failed: "Tekrar etkinleÅŸtirme e-postası gönderilirken bir sorun yaÅŸandı. %{error}" - activate: "Hesabı etkinleÅŸtir" - activate_failed: "Kullanıcı etkinleÅŸtirilirken bir sorun yaÅŸandı." + send_activation_email_failed: "BaÅŸka bir aktivasyon e-postası gönderilirken bir sorun yaÅŸandı. %{error}" + activate: "Hesabı Aktive Et" + activate_failed: "Kullanıcı aktive edilirken bir sorun yaÅŸandı." deactivate_account: "Hesabı PasifleÅŸtir" - deactivate_failed: "Kullanıcı deaktive edilirken bir sorun yaÅŸandı." + deactivate_failed: "Kullanıcı pasifleÅŸtirilirken bir sorun yaÅŸandı." unsilence_failed: 'Kullanıcının susturulması kaldırılırken bir sorun yaÅŸandı.' silence_failed: 'Kullanıcı susturulurken bir sorun yaÅŸandı.' - silence_confirm: 'Bu kullanıcıyı susturmak istediÄŸinize emin misiniz? Bunu yaparsanız yeni baÅŸlık ya da gönderi oluÅŸturamayacak.' + silence_confirm: 'Bu kullanıcıyı susturmak istediÄŸine emin misin? Bu durumda yeni baÅŸlık ya da gönderi oluÅŸturamayacaklar.' silence_accept: 'Evet, bu kullanıcıyı sustur' - bounce_score: "Geri Sekme Skoru" + bounce_score: "Sekme Puanı" reset_bounce_score: label: "Sıfırla" - title: "Geri sekme skorunu 0'a çek" - visit_profile: "Profilini güncellemek için kullanıcı tercihleri sayfası 'nı ziyaret edebilirsin" - deactivate_explanation: "Deaktive edilmiÅŸ bir kullanıcı e-postasını tekrar doÄŸrulamalı." - suspended_explanation: "UzaklaÅŸtırılmış kullanıcılar sistemde oturum açamaz." + title: "Sekme puanını 0'a çek" + visit_profile: "Profilini güncellemek için kullanıcı tercihleri sayfası 'nı ziyaret et" + deactivate_explanation: "PasifleÅŸtirilmiÅŸ kullanıcı e-postasını tekrar doÄŸrulamalı." + suspended_explanation: "Askıya alınmış kullanıcı giriÅŸ yapamaz. " silence_explanation: "SusturulmuÅŸ bir kullanıcı gönderi oluÅŸturamaz veya konu baÅŸlatamaz." - staged_explanation: "AÅŸamalı bir kullanıcı sadece belirli konularda e-posta ile gönderide bulunabilir." + staged_explanation: "AÅŸamalı kullanıcı sadece belirli konularda e-posta ile gönderide bulunabilir." bounce_score_explanation: - none: "Bu e-posta adresinden yakın zamanda hiç geri sekme alınmadı." - some: "Bu e-posta adresinden yakın zamanda bazı geri sekmeler alındı. " - threshold_reached: "Bu e-posta adresinden birçok geri sekme alındı. " + none: "Bu e-postadan son zamanlarda hiç \"geri sekme\" alınmadı" + some: "Bu e-posta adresinden yakın zamanda bazı \"geri sekme\"ler alındı. " + threshold_reached: "Bu e-posta adresinden birçok \"geri sekme\" alındı. " trust_level_change_failed: "Kullanıcının güven seviyesi deÄŸiÅŸtirilirken bir sorun yaÅŸandı." - suspend_modal_title: "Kullanıcıyı UzaklaÅŸtır" + suspend_modal_title: "Kullanıcıyı Askıya Al" trust_level_2_users: "Güven Seviyesi 2 Olan Kullanıcılar" trust_level_3_requirements: "Güven Seviyesi 3 Gereksinimleri" - trust_level_locked_tip: "güven seviyesi kitlendi, sistem kullanıcının seviyesini ne yükseltebilecek ne de düşürebilecek" - trust_level_unlocked_tip: "güven seviyesi kilidi çözüldü, sistem kullanıcının seviyesini yükseltebilir ya da düşürebilir" + trust_level_locked_tip: "güven seviyesi kilitlendi, sistem kullanıcının seviyesini yükseltmeyecek veya düşürmeyecek " + trust_level_unlocked_tip: "güven seviyesi kilitli deÄŸil, sistem kullanıcının seviyesini yükseltebilir ya da düşürebilir" lock_trust_level: "Güven Seviyesini Kilitle" - unlock_trust_level: "Güvenlik Seviyesi Kilidini Aç" + unlock_trust_level: "Güven Seviyesi Kilidini Aç" tl3_requirements: title: "Güven Seviyesi 3 için Gerekenler" table_title: - one: 'Son %{count} günde:' - other: 'Son %{count} günde:' + one: "Son %{count} günde:" + other: "Son %{count} günde:" value_heading: "DeÄŸer" requirement_heading: "Gereksinim" visits: "Ziyaretler" - days: "gün" + days: "günler" topics_replied_to: "Cevaplanan Konular" topics_viewed: "GörüntülenmiÅŸ Konular" - topics_viewed_all_time: "GörüntülenmiÅŸ Konular (Tüm zamanlar)" + topics_viewed_all_time: "GörüntülenmiÅŸ Konular (tüm zamanlar)" posts_read: "OkunmuÅŸ Gönderiler" - posts_read_all_time: "OkunmuÅŸ Gönderiler (Tüm zamanlarda)" - flagged_posts: "Bildirilen Gönderiler" - flagged_by_users: "Bildiren Kullanıcılar" - likes_given: "Verilen BeÄŸeniler" + posts_read_all_time: "OkunmuÅŸ Gönderiler (tüm zamanlar)" + flagged_posts: "Bayrakla İşaretlenmiÅŸ Gönderiler" + flagged_by_users: "Bayrakla İşaretlenmiÅŸ Kullanıcılar" + likes_given: "BeÄŸenilenler" likes_received: "Alınan BeÄŸeniler" - likes_received_days: "Alınan beÄŸeniler: tekil günlük" - likes_received_users: "Alınan beÄŸeniler: tekil kullanıcı" + likes_received_days: "Alınan beÄŸeniler: Benzersiz günlerde" + likes_received_users: "Alınan beÄŸeniler: Benzersiz kullanıcılar" suspended: "Askıya alındı ​​(tüm zamanlar)" silenced: "Susturuldu (her zaman)" - qualifies: "Güven seviyesi 3 için yeterli." + qualifies: "Güven seviyesi 3 için hak kazanan" does_not_qualify: "Güven seviyesi 3 için yeterli deÄŸil." - will_be_promoted: "Yakinda terfi ettirilecek." + will_be_promoted: "Yakında yükseltilecek." will_be_demoted: "Yakında seviyesi düşürülecek" - on_grace_period: "Åžu an terfisi hoÅŸgörü süresinde, seviyesi düşürülmeyecek" - locked_will_not_be_promoted: "Güven seviyesi kilitlendi. Seviyesi hiç bir zaman yükseltilmeyecek." - locked_will_not_be_demoted: "Güven seviyesi kilitlendi. Seviyesi hiç bir zaman düşürülmeyecek." + on_grace_period: "Åžu an terfisi tolerans süresinde, seviyesi düşürülmeyecek" + locked_will_not_be_promoted: "Güven seviyesi kilitlendi. Seviyesi hiçbir zaman yükseltilmeyecek." + locked_will_not_be_demoted: "Güven seviyesi kilitlendi. Seviyesi hiçbir zaman düşürülmeyecek." sso: title: "Tek Oturum Açma" - external_id: "Harici ID" + external_id: "Harici Kimlik" external_username: "Kullanıcı adı" external_name: "İsim" external_email: "E-posta" - external_avatar_url: "Profil Görseli BaÄŸlantısı" + external_avatar_url: "Profil URL Resmi" user_fields: title: "Kullanıcı Alanları" - help: "Kullanıcıların doldurabileceÄŸi alanlar ekleyin." + help: "Kullanıcıların doldurabileceÄŸi alanlar ekle" create: "Kullanıcı Alanı OluÅŸtur" - untitled: "İsimsiz" + untitled: "BaÅŸlıksız" name: "Alan Adı" type: "Alan Türü" description: "Alan Açıklaması" @@ -3078,38 +3469,38 @@ tr_TR: edit: "Düzenle" delete: "Sil" cancel: "İptal et" - delete_confirm: "Bu kullanıcı alanını silmek istediÄŸinize emin misiniz?" + delete_confirm: "Bu kullanıcı alanını silmek istediÄŸine emin misin?" options: "Seçenekler" required: title: "Kayıt olurken zorunlu mu?" - enabled: "gerekli" - disabled: "isteÄŸe baÄŸlı" + enabled: "zorunlu" + disabled: "zorunlu deÄŸil" editable: title: "Kayıt sonrası düzenlenebilir mi?" enabled: "düzenlenebilir" disabled: "düzenlenemez" show_on_profile: - title: "Herkese açık profilde göster?" + title: "Herkese açık profilde gösterilsin mi? " enabled: "profilde gösteriliyor" disabled: "profilde gösterilmiyor" show_on_user_card: title: "Kullanıcı profilinde gösterilsin mi?" enabled: "kullanıcı profilinde gösterildi" - disabled: "kullanıcı kartında gösterilmiyor" + disabled: "kullanıcı profilinde gösterilmiyor" field_types: - text: 'Yazı Alanı' + text: 'Metin Alanı' confirm: 'Onay' - dropdown: "Açılır liste" + dropdown: "Açılır" site_text: - description: "Forumunuzdaki herhangi bir metni özelleÅŸtirebilirsiniz. Lütfen aÅŸağıda arayarak baÅŸlayın: " - search: "Düzenlemek istediÄŸiniz metni arayın" - title: 'Yazı İçeriÄŸi' + description: "Forumdaki herhangi bir metni isteÄŸine göre uyarlayabilirsin. Lütfen aÅŸağıda arayarak baÅŸla: " + search: "Düzenlemek istediÄŸin metni ara" + title: 'Metin İçeriÄŸi' edit: 'düzenle' revert: "DeÄŸiÅŸiklikleri Geri Al" - revert_confirm: "DeÄŸiÅŸikliklerinizi geri almak istediÄŸinize emin misiniz?" + revert_confirm: "DeÄŸiÅŸiklikleri geri almak istediÄŸinden emin misin?" go_back: "Aramaya geri dön" - recommended: "İzleyen metni ihtiyaçlarınıza uygun ÅŸekilde özelleÅŸtirmenizi öneririz:" - show_overriden: 'Sadece deÄŸiÅŸtirdiklerimi göster' + recommended: "Sıradaki metni isteÄŸine göre uyarlamanı öneririz:" + show_overriden: 'Sadece iptal edilenleri göster' settings: show_overriden: 'Sadece deÄŸiÅŸtirdiklerimi göster' reset: 'sıfırla' @@ -3117,13 +3508,22 @@ tr_TR: site_settings: title: 'Ayarlar' no_results: "Hiç sonuç bulunamadı." + more_than_30_results: "30'dan fazla sonuç var. Lütfen aramanı daralt veya bir kategori seç." clear_filter: "Temizle" add_url: "URL ekle" add_host: "sunucu ekle" + uploaded_image_list: + label: "Listeyi düzenle" + empty: "Henüz hiç resim yok. Lütfen bir tane yükle." + upload: + label: "Yükle" + title: "Resim(leri) Yükle" + selectable_avatars: + title: "Kullanıcıların seçebileceÄŸi avatar listesi" categories: all_results: 'Hepsi' - required: 'Gerekli Ayarlar' - basic: 'Genel Ayarlar' + required: 'Gerekli ' + basic: 'Temel Kurulum' users: 'Kullanıcılar' posting: 'Gönderiler' email: 'E-posta' @@ -3132,8 +3532,8 @@ tr_TR: security: 'Güvenlik' onebox: "Kutulama" seo: 'SEO' - spam: 'İstenmeyen ' - rate_limits: 'Oran Sınırları' + spam: 'İstenmeyen e-posta' + rate_limits: 'Oran Limitleri' developer: 'GeliÅŸtirici' embedding: "YerleÅŸtirme" legal: "Yasal" @@ -3165,49 +3565,51 @@ tr_TR: reason_help: (Bir gönderi ya da konuya baÄŸlantı) save: Kaydet delete: Sil - delete_confirm: "Bu rozeti silmek istediÄŸinize emin misiniz?" + delete_confirm: "Bu rozeti silmek istediÄŸine emin misin?" revoke: İptal Et - reason: Neden - expand: GeniÅŸlet … - revoke_confirm: "Bu rozeti iptal etmek istediÄŸinize emin misiniz?" + reason: Sebep + expand: GeniÅŸlet &yardım; + revoke_confirm: "Bu rozeti iptal etmek istediÄŸine emin misin?" edit_badges: Rozetleri Düzenle grant_badge: Rozet Ver granted_badges: Verilen Rozetler grant: Ver - no_user_badges: "%{name} hiç bir rozet almamış." + no_user_badges: "%{name} hiç rozet almamış." no_badges: Verilebilecek bir rozet yok. - none_selected: "BaÅŸlamak için bir rozet seçin" - allow_title: Rozetin ünvan olarak kullanılmasına izin ver - multiple_grant: Birden çok defa verilebilir + none_selected: "BaÅŸlamak için bir rozet seç" + allow_title: Rozetin baÅŸlık olarak kullanılmasına izin ver + multiple_grant: Birden çok kez verilebilir listable: Rozeti herkese gözüken rozetler sayfasında göster enabled: Rozeti etkinleÅŸtir - icon: İkon + icon: Simge image: Görsel + icon_help: "\"Font Awesome Class\" kullan" + image_help: "Görüntünün URL'sini gir (her ikisi de ayarlanmışsa, simge alanını geçersiz kıl)" query: Rozet Sorgusu (SQL) - target_posts: Sorgu gönderileri hedefliyor - auto_revoke: Geri alma sorgusunu her gün çalıştır. - show_posts: Rozet alınmasına sebep olan gönderileri rozetler sayfasında göster + target_posts: Sorgu hedefleri gönderileri + auto_revoke: Günlük iptal sorgusunu çalıştır + show_posts: Rozet sayfasında yayınlanan rozetleri göster trigger: Tetikleme trigger_type: none: "Her gün güncelle" - post_action: "Bir kullanıcı gönderiyle etkileÅŸime geçtiÄŸinde" - post_revision: "Bir kullanıcı bir gönderiyi düzenlediÄŸinde veya yeni bir gönderi oluÅŸturduÄŸunda" - trust_level_change: "Bir kullanıcı güven seviyesini deÄŸiÅŸtirdiÄŸinde" - user_change: "Bir kullanıcı düzenlendiÄŸinde veya oluÅŸturduÄŸunda" - post_processed: "Bir gönderi iÅŸlendikten sonra" + post_action: "Kullanıcı gönderi üzerinde iÅŸlem yaptığında " + post_revision: "Kullanıcı bir gönderiyi düzenlediÄŸinde veya yeni bir gönderi oluÅŸturduÄŸunda" + trust_level_change: "Kullanıcı güven seviyesini deÄŸiÅŸtirdiÄŸinde" + user_change: "Kullanıcı düzenlendiÄŸinde veya oluÅŸturduÄŸunda" + post_processed: "Gönderi iÅŸlendikten sonra" preview: link_text: "Verilen rozetleri önizle" - plan_text: "Sorgu planıyla önizle" - modal_title: "Rozet Sorgusunu Özizle" + plan_text: "Sorgu planı ile önizleme" + modal_title: "Rozet Sorgu Önizlemesi" sql_error_header: "Sorgu ile ilgili bir hata oluÅŸtu." - error_help: "Rozet sorgularıyla ilgili yardım için aÅŸağıdaki baÄŸlantılara bakın" + error_help: "Rozet sorgularıyla ilgili yardım için aÅŸağıdaki baÄŸlantılara bak" bad_count_warning: header: "UYARI!" - text: "Bazı veriliÅŸ örnekleri bulunamıyor. Bu durum, rozet sorgusundan varolmayan kullanıcı IDsi veya gönderi IDsi dönünce gerçekleÅŸir. İleride beklenmedik sonuçlara sebep olabilir - lütfen sorgunuzu tekrar kontrol edin." + text: "Verilen bazı örnekler bulunamıyor. Bu durum, rozet sorgusunda varolmayan kullanıcı kimliÄŸi veya gönderi kimliÄŸi dönünce gerçekleÅŸir. İleride beklenmedik sonuçlara sebep olabilir - lütfen sorgunu tekrar kontrol et." no_grant_count: "Verilecek rozet bulunmuyor." grant_count: - one: %{count} rozet verilecek. - other: %{count} rozet verilecek. + one: "%{count} rozet verilecek." + other: "%{count} rozet verilecek." sample: "Örnek:" grant: with: "%{username}" @@ -3216,54 +3618,54 @@ tr_TR: with_time: "%{username}, %{time}" emoji: title: "Emoji" - help: "Herkese açık yeni bir emoji ekle. (PROTIP: birden çok dosyayı tek seferde sürükleyip bırakabilirsiniz)" + help: "Herkese açık yeni bir emoji ekle. (PROTIP: birden çok dosyayı tek seferde sürükleyip bırakabilirsin)" add: "Yeni Emoji Ekle" name: "İsim" - image: "Görsel" - delete_confirm: ":%{name}: emojisini silmek istediÄŸinize emin misiniz?" + image: "Resim" + delete_confirm: ":%{name}: emojisini silmek istediÄŸine emin misin?" embedding: - get_started: "EÄŸer Discourse'u bir baÅŸka web sitesine gömmek istiyorsanız, bu sitenin sunucusunu ekleyerek baÅŸlayın." - confirm_delete: "Bu sunucuyu silmek istediÄŸinize emin misiniz?" - sample: "Discourse konuları oluÅŸturmak ve gömmek için aÅŸağıdaki HTML kodunu sitenizde kullanın. REPLACE_ME'yi Discourse'u gömdüğünüz sayfanın tam URL'i ile deÄŸiÅŸtirin." - title: "Gömme" + get_started: "EÄŸer Discourse'u baÅŸka bir web sitesine yerleÅŸtirmek istiyorsan bu sitenin sunucusunu ekleyerek baÅŸla. " + confirm_delete: "Bu sunucuyu silmek istediÄŸine emin misin?" + sample: "Discourse konuları oluÅŸturmak ve yerleÅŸtirmek için aÅŸağıdaki HTML kodunu sitende kullan. REPLACE_ME'yi Discourse'u yerleÅŸtirdiÄŸin sayfanın tam URL'i ile deÄŸiÅŸtir." + title: "YerleÅŸtirme" host: "İzin Verilen Sunucular" class_name: "Sınıf adı" - path_whitelist: "Kabul edilen yol listesi" + path_whitelist: "Beyaz Liste" edit: "düzenle" category: "Kategoriye Gönder" add_host: "Sunucu Ekle" - settings: "Ayarları Gömmek" - feed_settings: "RSS Ayarları" - feed_description: "Siteniz için bir RSS/ATOM beslemesi saÄŸlamanız Discourse'un içeriÄŸinizi içe aktarma yeteneÄŸini geliÅŸtirebilir." - crawling_settings: "Böcek Ayarları" - crawling_description: "Discourse gönderileriniz için konular oluÅŸturduÄŸu zaman, eÄŸer bir RSS/ATOM beslemesi yoksa içeriÄŸinizi HTML'inizden ayrıştırmaya çalışacaktır. Bazen içeriÄŸinizi çıkartmak çok zor olabilir, bu yüzden ayrıştırmayı kolaylaÅŸtırmak için CSS kuralları belirtme yeteneÄŸi saÄŸlıyoruz." + settings: "YerleÅŸtirme Ayarları" + feed_settings: "Yayın Ayarları" + feed_description: "Site için bir RSS/ATOM yayını saÄŸlaman Discourse'un içeriÄŸi aktarma kabiliyetini geliÅŸtirmesini saÄŸlar." + crawling_settings: "Yazı Ayarları" + crawling_description: "Discourse gönderilerin için bir konu oluÅŸturduÄŸunda eÄŸer bir RSS/ATOM beslemesi yoksa içeriÄŸi HTML'den ayrıştırmaya çalışacaktır. Bazen içeriÄŸini çıkartmak zor olabilir. İçeriÄŸini kolayca çıkartabilmen için CSS kuralları belirtme yeteneÄŸi saÄŸlıyoruz." embed_by_username: "Konu oluÅŸturmak için kullanıcı adı" - embed_post_limit: "Gömmek için en büyük gönderi sayısı" - embed_username_key_from_feed: "Discourse kullanıcı adını beslemeden çekmek için anahtar" + embed_post_limit: "YerleÅŸtirmek için en fazla gönderi sayısı" + embed_username_key_from_feed: "Kullanıcı adını yayımdan çıkarmak için anahtar" embed_title_scrubber: "Gönderilerin baÅŸlığını temizlemek için kullanılan düzenli ifade" - embed_truncate: "Gömülü gönderileri buda" - embed_whitelist_selector: "Gömülüler içinde izin verilen elementler için CSS seçici" - embed_blacklist_selector: "Gömülülerden kaldırılan elementler için CSS seçici" - embed_classname_whitelist: "İzin verilen CSS sınıf isimleri" - feed_polling_enabled: "Konuları RSS/ATOM aracılığıyla içe aktar" - feed_polling_url: "İstila etmek için RSS/ATOM beslemesi URL'i" + embed_truncate: "Saklı gönderileri kırp" + embed_whitelist_selector: "Gömülü olarak izin verilen öğeler için CSS seçici" + embed_blacklist_selector: "Gömülmüş öğelerden kaldırılan öğeler için CSS seçici" + embed_classname_whitelist: "İzin verilen CSS sınıfı isimleri" + feed_polling_enabled: "RSS/ATOM ile gönderileri içe aktar" + feed_polling_url: "Taranacak RSS / ATOM yayın URL'si" feed_polling_frequency_mins: "Besleme yoklama sıklığı (dakika cinsinden)" save: "Gömme Ayarlarını Kaydet" permalink: title: "Kalıcı BaÄŸlantılar" - url: "BaÄŸlantı" + url: "URL" topic_id: "Konu ID" topic_title: "Konu" post_id: "Gönderi ID" post_title: "Gönderi" category_id: "Kategori ID" category_title: "Kategori" - external_url: "Harici BaÄŸlantı" - delete_confirm: "Bu kalıcı baÄŸlantıyı silmek istediÄŸinize emin misiniz?" + external_url: "Harici URL" + delete_confirm: "Bu kalıcı baÄŸlantıyı silmek istediÄŸine emin misin?" form: label: "Yeni:" add: "Ekle" - filter: "Ara (BaÄŸlantı veya Harici BaÄŸlantı)" + filter: "Ara (URL veya Harici URL)" wizard_js: wizard: done: "Tamamlandı" @@ -3272,14 +3674,19 @@ tr_TR: step: "%{current} / %{total}" upload: "Yükle" uploading: "Yükleniyor..." + upload_error: "Üzgünüz, bu dosyayı yüklerken bir hata oluÅŸtu. Lütfen tekrar dene." quit: "Belki Sonra" staff_count: - one: TopluluÄŸunuzda %{count} görevli üye var. - other: TopluluÄŸunuzda %{count} görevli üye var. + one: "TopluluÄŸunuzda %{count} görevli üye var." + other: "Toplulukta sen dahil toplam %{count} görevli üye var." invites: add_user: "ekle" - none_added: "Herhangi bir görevli davet etmediniz. Devam etmek istediÄŸinize emin misiniz?" + none_added: "Hiçbir görevliyi davet etmedin. Devam etmek istediÄŸine emin misin?" roles: admin: "Yönetici" moderator: "Moderatör" - regular: "Müdavim Kullanıcı" + regular: "Devamlı Kullanıcı" + previews: + topic_title: "Tartışma konusu" + share_button: "PaylaÅŸ" + reply_button: "Cevap" diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 11b79ffd5c..3c6cafbfe8 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -16,9 +16,9 @@ uk: format: '%n %u' units: byte: + one: Байт few: Байтів many: Байт - one: Байт other: Байт gb: ГБ kb: КБ @@ -34,31 +34,31 @@ uk: date_year: "MMM 'YY" medium: x_minutes: - few: '%{count} хвилини' - many: '%{count} хвилин' - one: 1 хвилина - other: '%{count} хвилин' + one: "1 хвилина" + few: "%{count} хвилини" + many: "%{count} хвилин" + other: "%{count} хвилин" x_hours: - few: '%{count} години' - many: '%{count} годин' - one: 1 година - other: '%{count} годин' + one: "1 година" + few: "%{count} години" + many: "%{count} годин" + other: "%{count} годин" x_days: - few: '%{count} дні' - many: '%{count} днів' - one: 1 день - other: '%{count} днів' + one: "1 день" + few: "%{count} дні" + many: "%{count} днів" + other: "%{count} днів" medium_with_ago: x_hours: - few: 'годин тому: %{count}' - many: '%{count} годин тому' - one: 1 годину тому - other: '%{count} годин тому' + one: "1 годину тому" + few: "годин тому: %{count}" + many: "%{count} годин тому" + other: "%{count} годин тому" x_days: - few: 'днів тому: %{count}' - many: '%{count} днів тому' - one: 1 день тому - other: '%{count} днів тому' + one: "1 день тому" + few: "днів тому: %{count}" + many: "%{count} днів тому" + other: "%{count} днів тому" previous_month: 'Попередній міÑÑць' next_month: 'ÐаÑтупний міÑÑць' share: @@ -99,15 +99,15 @@ uk: show_help: "налаштуваннÑ" links: "ПоÑиланнÑ" links_lowercase: - few: поÑилань - many: поÑÐ¸Ð»Ð°Ð½Ð½Ñ - one: поÑÐ¸Ð»Ð°Ð½Ð½Ñ - other: поÑÐ¸Ð»Ð°Ð½Ð½Ñ + one: "поÑиланнÑ" + few: "поÑилань" + many: "поÑиланнÑ" + other: "поÑиланнÑ" faq: "ЧаÑті запитаннÑ" guidelines: "ІнÑтрукції" privacy_policy: "Політика конфіденційноÑті" privacy: "КонфіденційніÑть" - terms_of_service: "Умови ВикориÑтаннÑ" + tos: "Умови ВикориÑтаннÑ" mobile_view: "ВиглÑд Ð´Ð»Ñ Ð¼Ð¾Ð±Ñ–Ð»ÑŒÐ½Ð¾Ð³Ð¾" desktop_view: "ВиглÑд Ð´Ð»Ñ Ð½Ð°Ñтільного комп'ютера" you: "Ви" @@ -126,10 +126,10 @@ uk: max_of_count: "Ðе більше {{count}}" alternation: "або" character_count: - few: '{{count}} Ñимволи' - many: '{{count}} Ñимволів' - one: '{{count}} Ñимвол' - other: '{{count}} Ñимволів' + one: "{{count}} Ñимвол" + few: "{{count}} Ñимволи" + many: "{{count}} Ñимволів" + other: "{{count}} Ñимволів" suggested_topics: title: "Пропоновані теми" about: @@ -222,10 +222,10 @@ uk: posts_read: "Прочитані" posts_read_long: "Повідомлень Прочитано" total_rows: - few: '%{count} кориÑтувачі' - many: '%{count} кориÑтувачів' - one: '%{count} кориÑтувач' - other: '%{count} кориÑтувачів' + one: "%{count} кориÑтувач" + few: "%{count} кориÑтувачі" + many: "%{count} кориÑтувачів" + other: "%{count} кориÑтувачів" group_histories: actions: change_group_setting: "Змінити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸" @@ -530,7 +530,6 @@ uk: disable: "Показати видалені допиÑи" private_message_info: title: "ПовідомленнÑ" - invite: "ЗапроÑити інших..." remove_allowed_user: "Ви впевнені, що хочете видалити {{name}} з цього повідомленнÑ?" email: 'Електронна пошта' username: 'Ім''Ñ ÐºÐ¾Ñ€Ð¸Ñтувача' @@ -565,9 +564,6 @@ uk: resend_activation_email: "ÐатиÑніть тут, щоб отримати ще один лиÑÑ‚ з активацією." sent_activation_email_again: "Ми надіÑлали на Вашу Ñкриньку {{currentEmail}} ще один лиÑÑ‚ Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— облікового запиÑу. ПротÑгом кількох хвилин він має з'ÑвитиÑÑ Ñƒ Вашій Ñкриньці. Ðе забувайте також перевірÑти теку зі Ñпамом." to_continue: "Будь лаÑка Увійдіть" - google: - title: "через Google" - message: "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‡ÐµÑ€ÐµÐ· Google (перевірте, щоб блокувальники Ñпливних вікон були вимкнені)" google_oauth2: title: "з Google" twitter: @@ -819,10 +815,10 @@ uk: label: "Ðовий ВлаÑник ДопиÑів" placeholder: "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача нового влаÑника" instructions: - few: Будь лаÑка, оберіть нового влаÑника {{count}} допиÑів, що належали {{old_user}}. - many: Будь лаÑка, оберіть нового влаÑника {{count}} допиÑів, що належали {{old_user}}. - one: Будь лаÑка, оберіть нового влаÑника допиÑу, що належав {{old_user}}. - other: Будь лаÑка, оберіть нового влаÑника {{count}} допиÑів, що належали {{old_user}}. + one: "Будь лаÑка, оберіть нового влаÑника допиÑу, що належав {{old_user}}." + few: "Будь лаÑка, оберіть нового влаÑника {{count}} допиÑів, що належали {{old_user}}." + many: "Будь лаÑка, оберіть нового влаÑника {{count}} допиÑів, що належали {{old_user}}." + other: "Будь лаÑка, оберіть нового влаÑника {{count}} допиÑів, що належали {{old_user}}." multi_select: select: 'вибрати' selected: 'вибрано ({{count}})' @@ -831,10 +827,10 @@ uk: select_all: обрати уÑе deselect_all: ÑкаÑувати вибір вÑього description: - few: 'Ви обрали допиÑів: {{count}}.' - many: 'Ви обрали допиÑів: {{count}}.' one: Ви обрали 1 допиÑ. - other: 'Ви обрали допиÑів: {{count}}.' + few: "Ви обрали допиÑів: {{count}}." + many: "Ви обрали допиÑів: {{count}}." + other: "Ви обрали допиÑів: {{count}}." post: edit_reason: "Причина: " post_number: "Ð´Ð¾Ð¿Ð¸Ñ {{number}}" @@ -878,7 +874,6 @@ uk: inappropriate: "Відкликати Ñкаргу" bookmark: "СкаÑувати закладку" like: "СкаÑувати вподобаннÑ" - vote: "Відкликати голоÑ" people: notify_user: "надіÑлати повідомленнÑ" by_you: @@ -888,7 +883,6 @@ uk: notify_moderators: "Ви позначили Ð´Ð¾Ð¿Ð¸Ñ Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ñ–Ñ—" bookmark: "Ви лишили тут закладку" like: "Ви це вподобали" - vote: "Ви проголоÑували за цей допиÑ" revisions: controls: first: "Перша верÑÑ–Ñ" @@ -906,7 +900,6 @@ uk: can: 'може… ' none: '(без категорії)' all: 'Ð’ÑÑ– категорії' - choose: 'Select a category…' edit: 'редагувати' edit_long: "Редагувати" view: 'ПереглÑнути теми, що належать до категорії' @@ -938,7 +931,6 @@ uk: edit_permissions: "Редагувати дозволи" add_permission: "Додати дозвіл" this_year: "цього року" - position: "position" default_position: "Default Position" parent: "БатьківÑька категоріÑ" notifications: @@ -1344,7 +1336,6 @@ uk: user_placeholder: "username" address_placeholder: "name@example.com" type_placeholder: "digest, signup..." - skipped_reason_placeholder: "reason" logs: title: "Журнали" action: "ДіÑ" diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index b64fc6829b..bd9c8db7cb 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -43,68 +43,68 @@ ur: tiny: half_a_minute: "< 1منٹ" less_than_x_seconds: - one: < 1 سیکنڈ - other: < %{count} سیکنڈ + one: "< 1 سیکنڈ" + other: "< %{count} سیکنڈ" x_seconds: - one: 1 سیکنڈ - other: '%{count} سیکنڈ' + one: "1 سیکنڈ" + other: "%{count} سیکنڈ" less_than_x_minutes: - one: < 1منٹ - other: '< %{count}منٹ ' + one: "< 1منٹ" + other: "< %{count}منٹ " x_minutes: - one: 1 منٹ - other: '%{count} منٹس' + one: "1 منٹ" + other: "%{count} منٹس" about_x_hours: - one: 1 گھنٹا - other: '%{count} گھنٹے' + one: "1 گھنٹا" + other: "%{count} گھنٹے" x_days: - one: 1 دن - other: '%{count} دن' + one: "1 دن" + other: "%{count} دن" x_months: - one: 1Ù…Ø§Û - other: '%{count}Ù…Ûینے' + one: "1ماÛ" + other: "%{count}Ù…Ûینے" about_x_years: - one: 1 سال - other: '%{count} سال' + one: "1 سال" + other: "%{count} سال" over_x_years: - one: '> 1 سال' - other: '> %{count} سال' + one: "> 1 سال" + other: "> %{count} سال" almost_x_years: - one: 1 سال - other: '%{count} سال' + one: "1 سال" + other: "%{count} سال" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - one: 1 منٹ - other: '%{count} منٹس' + one: "1 منٹ" + other: "%{count} منٹس" x_hours: - one: 1 گھنٹا - other: '%{count} گھنٹے' + one: "1 گھنٹا" + other: "%{count} گھنٹے" x_days: - one: 1 دن - other: '%{count} دن' + one: "1 دن" + other: "%{count} دن" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - one: 1 منٹ قبل - other: '%{count} منٹ قبل' + one: "1 منٹ قبل" + other: "%{count} منٹ قبل" x_hours: - one: '1 Ú¯Ú¾Ù†Ù¹Û Ù‚Ø¨Ù„ ' - other: ' %{count} گھنٹے قبل ' + one: "1 Ú¯Ú¾Ù†Ù¹Û Ù‚Ø¨Ù„ " + other: " %{count} گھنٹے قبل " x_days: - one: 1 دن قبل - other: '%{count} دن قبل' + one: "1 دن قبل" + other: "%{count} دن قبل" later: x_days: - one: 1 دن بعد - other: '%{count} دن بعد' + one: "1 دن بعد" + other: "%{count} دن بعد" x_months: - one: 1 Ù…Ûینے بعد - other: '%{count} Ù…Ûینے بعد' + one: "1 Ù…Ûینے بعد" + other: "%{count} Ù…Ûینے بعد" x_years: - one: 1 سال بعد - other: '%{count} سال بعد' + one: "1 سال بعد" + other: "%{count} سال بعد" previous_month: 'Ù¾Ú†Ú¾Ù„Û’ ماÛ' next_month: 'اگلے ماÛ' placeholder: تاریخ @@ -187,13 +187,13 @@ ur: show_help: "اختیارات" links: "لنکس" links_lowercase: - one: لنک - other: لنکس + one: "لنک" + other: "لنکس" faq: "عمومی سوالات" guidelines: "ÛØ¯Ø§ÛŒØ§Øª" privacy_policy: "نجی معلومات Ú©ÛŒ Ø­ÙØ§Ø¸Øª پالیسی" privacy: "جی معلومات Ú©ÛŒ Ø­ÙØ§Ø¸Øª" - terms_of_service: "سروس Ú©ÛŒ شرائط" + tos: "سروس Ú©ÛŒ شرائط" mobile_view: "موبائل ÙˆÙیو" desktop_view: "ڈیسک ٹاپ ÙˆÙیو" you: "آپ " @@ -212,8 +212,8 @@ ur: max_of_count: "Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û {{count}}" alternation: "یا " character_count: - one: '{{count}} حرÙ' - other: '{{count}} حروÙ' + one: "{{count}} حرÙ" + other: "{{count}} حروÙ" suggested_topics: title: "تجویز کیے گئے ٹاپک" pm_title: "تجویز کیے گئے پیغامات" @@ -246,14 +246,14 @@ ur: remove: "بÙÚ© مارک Ûٹائیں" confirm_clear: "کیا آپ Ú©Ùˆ یقین ÛÛ’ Ú©Û Ø¢Ù¾ Ø§ÙØ³ ٹاپک سے تمام بÙÚ© مارکس Ûٹانا Ú†Ø§ÛØªÛ’ Ûیں؟" topic_count_latest: - one: '{{count}} نیا یا اَپ ڈیٹ Ú©Ø±Ø¯Û Ù¹Ø§Ù¾Ú© دیکھیں۔' - other: '{{count}} نئے یا اَپ ڈیٹ Ú©Ø±Ø¯Û Ù¹Ø§Ù¾Ú© دیکھیں۔' + one: "{{count}} نیا یا اَپ ڈیٹ Ú©Ø±Ø¯Û Ù¹Ø§Ù¾Ú© دیکھیں۔" + other: "{{count}} نئے یا اَپ ڈیٹ Ú©Ø±Ø¯Û Ù¹Ø§Ù¾Ú© دیکھیں۔" topic_count_unread: - one: '{{count}} غیر پڑھا ٹاپک دیکھیں۔' - other: '{{count}} غیر Ù¾Ú‘Ú¾Û’ ٹاپک دیکھیں۔' + one: "{{count}} غیر پڑھا ٹاپک دیکھیں۔" + other: "{{count}} غیر Ù¾Ú‘Ú¾Û’ ٹاپک دیکھیں۔" topic_count_new: - one: '{{count}} نیا ٹاپک دیکھیں۔' - other: '{{count}} نئے ٹاپک دیکھیں۔' + one: "{{count}} نیا ٹاپک دیکھیں۔" + other: "{{count}} نئے ٹاپک دیکھیں۔" preview: "پیشگی دیکھنا" cancel: "منسوخ" save: "تبدیلیاں محÙوظ کریں" @@ -291,16 +291,16 @@ ur: cancel: "منسوخ" view_pending: "Ø²ÛŒØ±ÙØ§Ùلتوَاء پوسٹس دیکھیں" has_pending_posts: - one: Ø§ÙØ³ ٹاپک Ú©ÛŒ 1 پوسٹس منظوری کا انتظار کر رÛÛŒ Ûیں - other: Ø§ÙØ³ ٹاپک Ú©ÛŒ {{count}} پوسٹس منظوری کا انتظار کر رÛÛŒ Ûیں + one: "Ø§ÙØ³ ٹاپک Ú©ÛŒ 1 پوسٹس منظوری کا انتظار کر رÛÛŒ Ûیں" + other: "Ø§ÙØ³ ٹاپک Ú©ÛŒ {{count}} پوسٹس منظوری کا انتظار کر رÛÛŒ Ûیں" confirm: "تبدیلیاں محÙوظ کریں" delete_prompt: "کیا آپ %{username} حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟ Ø§ÙØ³ طرح سے اÙÙ† Ú©ÛŒ تمام پوسٹس حذ٠ÛÙˆ جائیں Ú¯ÛŒ اور اÙÙ† Ú©Û’ ای میل اور IP ایڈریس Ú©Ùˆ بلاک کردیا جائے گا۔" approval: title: "پوسٹ Ú©Ùˆ منظوری Ú©ÛŒ ضرورت ÛÛ’" description: "Ûمیں آپ Ú©ÛŒ نئی پوسٹ موصول ÛÙˆ Ú†Ú©ÛŒ ÛÛ’ لیکن ÛŒÛ Ø¸Ø§ÛØ± Ûونے سے Ù¾ÛÙ„Û’ ایک منتظم سے منظور Ûونا ضروری ÛÛ’Û” Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ صبر کریں۔" pending_posts: - one: آپ Ú©ÛŒ 1 پوسٹ زیر التوا Ûیں۔ - other: آپ Ú©ÛŒ {{count}} پوسٹس Ø²ÛŒØ±ÙØ§Ùلتوَاء Ûیں۔ + one: "آپ Ú©ÛŒ 1 پوسٹ زیر التوا Ûیں۔" + other: "آپ Ú©ÛŒ {{count}} پوسٹس Ø²ÛŒØ±ÙØ§Ùلتوَاء Ûیں۔" ok: "ٹھیک" user_action: user_posted_topic: "{{user}} Ù†Û’ ٹاپک پوسٹ کیا" @@ -334,8 +334,8 @@ ur: posts_read: "Ù¾Ú‘Ú¾ لیا گیا" posts_read_long: "Ù¾Ú‘Ú¾ÛŒ گئیں پوسٹس" total_rows: - one: 1 صار٠- other: '%{count} صارÙین' + one: "1 صارÙ" + other: "%{count} صارÙین" group_histories: actions: change_group_setting: "گروپ Ú©ÛŒ سیٹÙÙ†Ú¯ تبدیل کریں" @@ -409,8 +409,8 @@ ur: is_group_user: "ممبر" is_group_owner: "مالÙÚ©" title: - one: گروپ - other: گروپس + one: "گروپ" + other: "گروپس" activity: "سرگرمی" members: title: "ممبران" @@ -475,15 +475,12 @@ ur: "14": "Ø²ÛŒØ±ÙØ§Ùلتوَاء" categories: all: "تمام زÙÙ…Ø±ÙŽÛ Ø¬Ø§Øª" - all_subcategories: "%{categoryName}میں تمام " no_subcategory: "کوئی Ù†Ûیں" category: "زمرÛ" category_list: "Ø²Ù…Ø±Û Ø¬Ø§Øª Ú©ÛŒ ÙÛØ±Ø³Øª Ø¸Ø§ÛØ± کریں" reorder: title: "Ø²Ù…Ø±Û Ø¬Ø§Øª Ú©Ùˆ Ø¯ÙˆØ¨Ø§Ø±Û ØªØ±ØªÛŒØ¨ دیں" title_long: "Ø²Ù…Ø±Û Ø¬Ø§Øª Ú©ÛŒ ÙÛØ±Ø³Øª Ú©Ùˆ تنظیم نو کریں" - fix_order: "پوزیشن درست کریں" - fix_order_tooltip: "تمام Ø²Ù…Ø±Û Ø¬Ø§Øª Ú©ÛŒ ایک Ù…Ù†ÙØ±Ø¯ پوزیشن نمبر Ù†Ûیں ÛÛ’ØŒ جو غیر متوقع نتائج کا سبب بن سکتی ÛÛ’Û”" save: "محÙوظ کردینے کا Ø­Ú©Ù…" apply_all: "لاگو کریں" position: "پوزیشن" @@ -494,11 +491,11 @@ ur: toggle_ordering: "ترتیب کاری کا کنٹرول ٹاگل کریں" subcategories: "ذیلی زمرے" topic_sentence: - one: 1 ٹاپک - other: '%{count} ٹاپک' + one: "1 ٹاپک" + other: "%{count} ٹاپک" topic_stat_sentence: - one: '%{count} نئے موضوعات Ù¾Ú†Ú¾Ù„Û’ %{unit} میں۔' - other: '%{count} نئے موضوعات Ù¾Ú†Ú¾Ù„Û’ %{unit} میں۔' + one: "%{count} نئے موضوعات Ù¾Ú†Ú¾Ù„Û’ %{unit} میں۔" + other: "%{count} نئے موضوعات Ù¾Ú†Ú¾Ù„Û’ %{unit} میں۔" ip_lookup: title: IP ایڈریس کا سراغ hostname: Ûوسٹ کا نام @@ -668,7 +665,6 @@ ur: error: "Ø§ÙØ³ چیز Ú©Ùˆ تبدیل کرنے میں ایک خرابی کا سامنا کرنا پڑا۔" change_username: title: "صار٠کا نام تبدیل کریں" - confirm: "اگر آپ اپنا صار٠نام تبدیل کرتے Ûیں تو آپ Ú©ÛŒ پوسٹوں Ú©ÛŒ Ù¾Ú†Ú¾Ù„ÛŒ تمام اقتباسات اور @نام زکر ٹوٹ جائیں Ú¯Û’Û” کیا آپ واقعی ÛŒÛ Ú©Ø±Ù†Ø§ Ú†Ø§ÛØªÛ’ Ûیں؟" taken: "معذرت، ÛŒÙÛ ØµØ§Ø±Ù Ù†Ø§Ù… Ù¾ÛÙ„Û’ سے لیا جاچکا ÛÛ’Û”" invalid: "ÛŒÛ ØµØ§Ø±Ù Ù†Ø§Ù… غلط ÛÛ’Û” Ø§ÙØ³ میں صر٠Ûندسوں اور حرو٠کو شامل کیا جا سکتا ÛÛ’" change_email: @@ -689,7 +685,6 @@ ur: upload_title: "آپنی تصویر اَپ لوڈ کریں" upload_picture: "تصویر اَپ لوڈ کریں" image_is_not_a_square: "انتباÛ: ÛÙ… Ù†Û’ آپ Ú©ÛŒ تصویر Ú©Ùˆ کراپ کیا ÛÛ’Ø› چوڑائی اور اونچائی برابر Ù†Ûیں تھے۔" - cache_notice: "آپ Ù†Û’ کامیابی سے اپنی Ù¾Ø±ÙˆÙØ§Ø¦Ù„ تصویر تبدیل کرلی ÛÛ’ لیکن براؤزر کیشنگ Ú©ÛŒ ÙˆØ¬Û Ø³Û’ Ø§ÙØ³Û’ نمودار Ûونے میں Ú©Ú†Ú¾ وقت Ù„Ú¯ سکتا ÛÛ’Û”" change_profile_background: title: "Ù¾Ø±ÙˆÙØ§Ø¦Ù„ کا پس٠منظر" instructions: "Ù¾Ø±ÙˆÙØ§Ø¦Ù„ کا پس٠منظر مرکوز ÛÙˆ گا اور Ø§ÙØ³ Ú©ÛŒ 850 Ù¾Ùکسل Ú©ÛŒ Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û Ú†ÙˆÚ‘Ø§Ø¦ÛŒ ÛÙˆ گی۔" @@ -704,8 +699,8 @@ ur: authenticated: "آپ Ú©Û’ اÙÛŒ میل Ú©ÛŒ توثیق کر دی گئی ÛÛ’ {{provider}}" frequency_immediately: "جس بارے میں ÛÙ… آپ Ú©Ùˆ اÙÛŒ میل کر رÛÛ’ Ûیں، اگر آپ Ù†Û’ Ù†Ûیں Ù¾Ú‘Ú¾ÛŒ Ûوئی تو ÛÙ… Ùوری طور پر آپ Ú©Ùˆ اÙÛŒ میل کریں Ú¯Û’Û”" frequency: - one: ÛÙ… آپ Ú©Ùˆ اÙÛŒ میل کریں Ú¯Û’ ØµØ±Ù Ø§ÙØ³ صور میں Ú©Û ÛÙ… Ù†Û’ آپ Ú©Ùˆ Ú¯Ø²Ø´ØªÛ Ø§ÛŒÚ© منٹ میں Ù†Û Ø¯ÛŒÚ©Ú¾Ø§ ÛÙˆÛ” - other: ÛÙ… آپ Ú©Ùˆ اÙÛŒ میل کریں Ú¯Û’ ØµØ±Ù Ø§ÙØ³ صور میں Ú©Û ÛÙ… Ù†Û’ آپ Ú©Ùˆ Ú¯Ø²Ø´ØªÛ {{count}} منٹ میں Ù†Û Ø¯ÛŒÚ©Ú¾Ø§ ÛÙˆÛ” + one: "ÛÙ… آپ Ú©Ùˆ اÙÛŒ میل کریں Ú¯Û’ ØµØ±Ù Ø§ÙØ³ صور میں Ú©Û ÛÙ… Ù†Û’ آپ Ú©Ùˆ Ú¯Ø²Ø´ØªÛ Ø§ÛŒÚ© منٹ میں Ù†Û Ø¯ÛŒÚ©Ú¾Ø§ ÛÙˆÛ”" + other: "ÛÙ… آپ Ú©Ùˆ اÙÛŒ میل کریں Ú¯Û’ ØµØ±Ù Ø§ÙØ³ صور میں Ú©Û ÛÙ… Ù†Û’ آپ Ú©Ùˆ Ú¯Ø²Ø´ØªÛ {{count}} منٹ میں Ù†Û Ø¯ÛŒÚ©Ú¾Ø§ ÛÙˆÛ”" name: title: "نام" instructions: "آپ کا پورا نام (اختیاری)" @@ -791,8 +786,8 @@ ur: sent: "بھیج دیا گیا" none: "Ø¸Ø§ÛØ± کرنے Ú©Û’ لئے کوئی دعوتیں Ù†Ûیں Ûیں۔" truncated: - one: Ù¾ÛÙ„ÛŒ دعوت دکھائی جا رÛÛŒ Ûیں۔ - other: Ù¾ÛÙ„ÛŒ {{count}} دعوتیں دکھائی جا رÛÛŒ Ûیں۔ + one: "Ù¾ÛÙ„ÛŒ دعوت دکھائی جا رÛÛŒ Ûیں۔" + other: "Ù¾ÛÙ„ÛŒ {{count}} دعوتیں دکھائی جا رÛÛŒ Ûیں۔" redeemed: "دعوتیں جÙÙ† سے ÙØ§Ø¦Ø¯Û اٹھا لیا گیا ÛÛ’" redeemed_tab: "ÙØ§Ø¦Ø¯Û اٹھا لیا گیا" redeemed_tab_with_count: "ÙØ§Ø¦Ø¯Û اٹھا لیا گیا ({{count}})" @@ -839,29 +834,29 @@ ur: time_read: "Ù¾Ú‘Ú¾Ù†Û’ کیلئے Ø§ÙØ³ØªØ¹Ù…ال Ûونے والا وقت" recent_time_read: "Ù¾Ú‘Ú¾Ù†Û’ کیلئے Ø§ÙØ³ØªØ¹Ù…ال Ûونے والا Ø­Ø§Ù„ÛŒÛ ÙˆÙ‚Øª" topic_count: - one: بنایا گیا ٹاپک - other: بنائے گئے ٹاپک + one: "بنایا گیا ٹاپک" + other: "بنائے گئے ٹاپک" post_count: - one: بنائی گئی پوسٹ - other: بنائی گئیں پوسٹ + one: "بنائی گئی پوسٹ" + other: "بنائی گئیں پوسٹ" likes_given: - one: دیا گیا - other: دیا گیا + one: "دیا گیا" + other: "دیا گیا" likes_received: - one: موصول Ûوا - other: موصول Ûوا + one: "موصول Ûوا" + other: "موصول Ûوا" days_visited: - one: دن جس میں Ø¯ÙˆØ±Û Ú©ÛŒØ§ گیا - other: دن جن میں Ø¯ÙˆØ±Û Ú©ÛŒØ§ گیا + one: "دن جس میں Ø¯ÙˆØ±Û Ú©ÛŒØ§ گیا" + other: "دن جن میں Ø¯ÙˆØ±Û Ú©ÛŒØ§ گیا" topics_entered: - one: دیکھ لیا گیا ٹاپک - other: دیکھ لیے گئے ٹاپک + one: "دیکھ لیا گیا ٹاپک" + other: "دیکھ لیے گئے ٹاپک" posts_read: - one: Ù¾Ú‘Ú¾ÛŒ گئی پوسٹ - other: Ù¾Ú‘Ú¾ÛŒ گئیں پوسٹس + one: "Ù¾Ú‘Ú¾ÛŒ گئی پوسٹ" + other: "Ù¾Ú‘Ú¾ÛŒ گئیں پوسٹس" bookmark_count: - one: بÙÚ© مارک - other: بÙکمارکس + one: "بÙÚ© مارک" + other: "بÙکمارکس" top_replies: "ٹاپ جوابات" no_replies: "ابھی تک کوئی جوابات Ù†Ûیں۔" more_replies: "مزید جوابات" @@ -877,7 +872,6 @@ ur: most_liked_users: "سب سے Ø²ÛŒØ§Ø¯Û Ù„Ø§Ø¦Ú© کیا گیا" most_replied_to_users: "جس Ú©Ùˆ سب سے Ø²ÛŒØ§Ø¯Û Ø¬ÙˆØ§Ø¨ دیا گیا" no_likes: "ابھی تک کوئی لائکس Ù†Ûیں۔" - associated_accounts: "لاگ ان" ip_address: title: "آخری IP ایڈریس" registration_ip_address: @@ -930,8 +924,8 @@ ur: reached: "%{relativeAge} – %{rate} سائٹ سیٹÙÙ†Ú¯ Ù„Ùمٹ %{siteSettingRate} تک Ù¾ÛÙ†Ú† گئی۔" exceeded: "%{relativeAge} – %{rate} سائٹ سیٹÙÙ†Ú¯ Ù„Ùمٹ %{siteSettingRate} سے تجاوز کر گئی۔" rate: - one: 1 خرابی/%{duration} - other: '%{count} خرابیاں/%{duration}' + one: "1 خرابی/%{duration}" + other: "%{count} خرابیاں/%{duration}" learn_more: "اورجانیے..." all_time: 'Ú©ÙÙ„' all_time_desc: 'Ú©ÙÙ„ ٹاپک بنائے گئے' @@ -959,8 +953,6 @@ ur: hide_session: "مجھے Ú©Ù„ یاد دلائیں" hide_forever: "Ù†Ûیں شکریÛ" hidden_for_session: "ٹھیک ÛÛ’ØŒ میں تم سے Ú©ÙŽÙ„ پوچھوں گا۔ آپ جب چاÛیں، اکاؤنٹ بنانے Ú©Û’ لئے 'لاگ اÙÙ†' بھی استعمال کر سکتے Ûیں." - intro: "خوش آمدید! :heart_eyes: ایسا لگتا ÛÛ’ آپ بحث سے لط٠اندوز ÛÙˆ رÛÛ’ Ûیں، لیکن آپ Ù†Û’ اکاؤنٹ Ú©Û’ لئے سائن اَپ Ù†Ûیں کیا Ûوا۔" - value_prop: "جب آپ ایک اکاؤنٹ بناتے Ûیں، ÛÙ… بالکل یاد رکھتے Ûیں Ú©Û Ø¢Ù¾ Ù†Û’ کیا پڑھا ÛÛ’ØŒ ØªØ§Ú©Û Ø¬ÛØ§Úº سے آپ Ù†Û’ پڑھنا چھوڑا ÛÙˆ بلکل ÙˆÛØ§Úº ÛÛŒ پر آپ Ú©Ùˆ ÛÙ…ÛŒØ´Û ÙˆØ§Ù¾Ø³ Ù¾Ûنچایا جا سکے۔ جب بھی کوئی نئی پوسٹ Ûوتی ÛÛ’ آپ Ú©Ùˆ ÛŒÛØ§Úº اور اÙÛŒ میل پر اطلاع بھی دے دی جاتی ÛÛ’Û” اور آپ محبت کا بانٹںے Ú©Û’ لئے پوسٹ لائک کر سکتے Ûیں۔ :heartbeat:" summary: enabled_description: "آپ اس ٹاپک کا Ø®Ù„Ø§ØµÛ Ù…Ù„Ø§Ø­Ø¸Û Ú©Ø±Ø±ÛÛ’ Ûیں: سب سے دلچسپ پوسٹ کمیونٹی Ú©ÛŒ طر٠سے متعین Ú©ÛŒ جاتی Ûیں۔" description: "{{replyCount}} جوابات موجود Ûیں۔" @@ -974,7 +966,6 @@ ur: disable: "Ø­Ø°Ù Ø´Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ú©Ùˆ Ø¸Ø§ÛØ± کریں" private_message_info: title: "پیغام" - invite: "دوسروں Ú©Ùˆ مدعو کریں..." leave_message: "کیا آپ واقعی ÛŒÛ Ù¾ÛŒØºØ§Ù… بھیجنا Ú†Ø§ÛØªÛ’ Ûیں؟" remove_allowed_user: "کیا آپ واقعی Ø§ÙØ³ پیغام سے {{name}} Ûٹانا Ú†Ø§ÛØªÛ’ Ûیں؟" remove_allowed_group: "کیا آپ واقعی Ø§ÙØ³ پیغام سے {{name}} Ûٹانا Ú†Ø§ÛØªÛ’ Ûیں؟" @@ -1045,9 +1036,6 @@ ur: preferences: "آپ کا اپنی صار٠ترجیحات Ú©Ùˆ تبدیل کرنے Ú©Û’ لیے لاگ اÙÙ† Ûونا ضروری ÛÛ’Û”" forgot: "مجھے اپنے اکاؤنٹ Ú©ÛŒ ØªÙØµÛŒÙ„ات یاد Ù†Ûیں Ûیں" not_approved: "آپ کا اکاؤنٹ ابھی تک منظور Ù†Ûیں کیا گیا ÛÛ’Û” جب آپ لاگ اÙÙ† کر سکیں Ú¯Ùˆ اÙÛŒ میل Ú©Û’ ذریعے آپ Ú©Ùˆ مطلع کر دیا جائے گا۔" - google: - title: "Ú¯ÙˆÚ¯Ù„ سے" - message: "Ú¯ÙÙˆÚ¯ÙŽÙ„ Ú©Û’ زریعے تصدیق Ú©ÛŒ جا رÛÛŒ ÛÛ’ (یقینی بنائیں Ú©Û Ù¾Ø§Ù¾ اَپ بلاکرز ÙØ¹Ø§Ù„ Ù†Ûیں Ûیں)" google_oauth2: title: "Ú¯ÙˆÚ¯Ù„ سے" message: "Ú¯ÙÙˆÚ¯ÙŽÙ„ Ú©Û’ زریعے تصدیق Ú©ÛŒ جا رÛÛŒ ÛÛ’ (یقینی بنائیں Ú©Û Ù¾Ø§Ù¾ اَپ بلاکرز ÙØ¹Ø§Ù„ Ù†Ûیں Ûیں)" @@ -1143,8 +1131,8 @@ ur: drafts_offline: "ڈراÙٹس آ٠لائن" group_mentioned_limit: "انتباÛ! آپ Ù†Û’ {{group}} کا ذکر کیا ÛÛ’ØŒ تاÛÙ… اس گروپ Ú©Û’ ممبران Ú©ÛŒ تعداد، منتظم Ú©ÛŒ طر٠سے مقرر Ú©Ø±Ø¯Û {{max}} صارÙین Ú©Û’ ذکر Ú©ÛŒ حد سے Ø²ÛŒØ§Ø¯Û ÛÛ’ Û” کسی Ú©Ùˆ بھی اطلاع Ù†Ûیں دی جائے گی۔" group_mentioned: - one: '{{group}} کا ذکر کر Ú©ÛØŒ آپ 1 شخص Ú©Ùˆ مطلع کرنے Ù„Ú¯Û’ Ûیں - کیا آپ واقعی ÛŒÛ Ú©Ø±Ù†Ø§ Ú†Ø§ÛØªÛ’ Ûیں؟' - other: '{{group}} کا ذکر کر Ú©ÛØŒ آپ {{count}} لوگوں Ú©Ùˆ مطلع کرنے Ù„Ú¯Û’ Ûیں - کیا آپ واقعی ÛŒÛ Ú©Ø±Ù†Ø§ Ú†Ø§ÛØªÛ’ Ûیں؟' + one: "{{group}} کا ذکر کر Ú©ÛØŒ آپ 1 شخص Ú©Ùˆ مطلع کرنے Ù„Ú¯Û’ Ûیں - کیا آپ واقعی ÛŒÛ Ú©Ø±Ù†Ø§ Ú†Ø§ÛØªÛ’ Ûیں؟" + other: "{{group}} کا ذکر کر Ú©ÛØŒ آپ {{count}} لوگوں Ú©Ùˆ مطلع کرنے Ù„Ú¯Û’ Ûیں - کیا آپ واقعی ÛŒÛ Ú©Ø±Ù†Ø§ Ú†Ø§ÛØªÛ’ Ûیں؟" cannot_see_mention: category: "آپ Ù†Û’ {{username}} کا زکر کیا ÛÛ’ لیکن Ú†ÙˆÙ†Ú©Û Ø§ÙÙ† Ú©Ùˆ Ø§ÙØ³ زمرے تک رسائی حاصل Ù†Ûیں، اÙÙ† Ú©Ùˆ مطلع Ù†Ûیں کیا جائے گا۔ آپ Ú©Ùˆ انÛیں ایک ایسے گروپ میں شامل کرنے Ú©ÛŒ ضرورت ÛÛ’ جسے Ø§ÙØ³ زمرے تک رسائی حاصل ÛÛ’Û”" private: "آپ Ù†Û’ {{username}} کا زکر کیا ÛÛ’ لیکن Ú†ÙˆÙ†Ú©Û ÙˆÛ ÛŒÛ Ø°Ø§ØªÛŒ پیغام Ù†Ûیں دیکھ سکتے اÙÙ† Ú©Ùˆ مطلع Ù†Ûیں کیا جائے گا۔ آپ Ú©Ùˆ اÙÙ†Ûیں Ø§ÙØ³ ذاتی پیغام میں مدعو کرنے Ú©ÛŒ ضرورت ÛÛ’Û”" @@ -1241,11 +1229,11 @@ ur: notifications: tooltip: regular: - one: 1 اندیکھی اطلاع - other: '{{count}} اندیکھی اطلاعات' + one: "1 اندیکھی اطلاع" + other: "{{count}} اندیکھی اطلاعات" message: - one: 1 غیر پڑھا پیغام - other: '{{count}} غیر Ù¾Ú‘Ú¾Û’ پیغامات' + one: "1 غیر پڑھا پیغام" + other: "{{count}} غیر Ù¾Ú‘Ú¾Û’ پیغامات" title: "@نام Ú©Û’ ذکر، آپ Ú©ÛŒ پوسٹ اور ٹاپک پر جوابات، پیغامات، ÙˆØºÛŒØ±Û Ú©ÛŒ اطلاعات" none: "Ø§ÙØ³ وقت ویب سائٹ اطلاعات لوڈ کرنے سے قاصر ÛÛ’Û”" empty: "کوئی اطلاعات Ù†Ûیں ملیں۔" @@ -1260,8 +1248,8 @@ ur: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - one: {{username2}}ØŒ {{username}} اور 1 مزید {{description}} - other: {{username2}}ØŒ {{username}} اور {{count}} مزید {{description}} + one: "{{username2}}ØŒ {{username}} اور 1 مزید {{description}}" + other: "{{username2}}ØŒ {{username}} اور {{count}} مزید {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1272,8 +1260,8 @@ ur: topic_reminder: "{{username}} {{description}}" watching_first_post: "نیا ٹاپک {{description}}" group_message_summary: - one: آپ Ú©Û’ {{group_name}} اÙÙ† باکس میں {{count}} پیغام - other: آپ Ú©Û’ {{group_name}} اÙÙ† باکس میں {{count}} پیغامات + one: "آپ Ú©Û’ {{group_name}} اÙÙ† باکس میں {{count}} پیغام" + other: "آپ Ú©Û’ {{group_name}} اÙÙ† باکس میں {{count}} پیغامات" popup: mentioned: '{{username}} Ù†Û’ آپ کا ØªØ°Ú©Ø±Û "{{topic}}" میں کیا - {{site_title}}' group_mentioned: '{{username}} Ù†Û’ آپ کا ØªØ°Ú©Ø±Û "{{topic}}" میں کیا - {{site_title}}' @@ -1395,8 +1383,8 @@ ur: notification_level: "اطلاعات" choose_new_category: "ٹاپکس کیلئے نئے Ø²Ù…Ø±Û Ú©Ø§ انتخاب کریں:" selected: - one: آپ Ù†Û’ 1 ٹاپک منتخب کیا ÛÛ’Û” - other: آپ Ù†Û’ {{count}} ٹاپک منتخب کیے Ûیں۔ + one: "آپ Ù†Û’ 1 ٹاپک منتخب کیا ÛÛ’Û”" + other: "آپ Ù†Û’ {{count}} ٹاپک منتخب کیے Ûیں۔" change_tags: "ٹیگز بدلیں" append_tags: "ٹیگز میں اضاÙÛ Ú©Ø±ÛŒÚº" choose_new_tags: "ان ٹاپکس کیلئے نئے ٹیگز کا انتخاب کریں:" @@ -1429,8 +1417,8 @@ ur: search: "سرچ Ú©Û’ مزید کوئی نتائج Ù†Ûیں۔" topic: filter_to: - one: ٹاپک میں 1 پوسٹ - other: ٹاپک میں {{count}} پوسٹس + one: "ٹاپک میں 1 پوسٹ" + other: "ٹاپک میں {{count}} پوسٹس" create: 'نیا ٹاپک' create_long: 'نیا ٹاپک بنائیں' private_message: 'ایک پیغام شروع کریں' @@ -1447,10 +1435,10 @@ ur: new: 'نیا ٹاپک' unread: 'بغیر Ù¾Ú‘Ú¾Û’' new_topics: - one: 1 نیا ٹاپک + one: '1 نیا ٹاپک' other: '{{count}} نئے ٹاپک' unread_topics: - one: 1 بغیر پڑھا گیا ٹاپک + one: '1 بغیر پڑھا گیا ٹاپک' other: '{{count}} بغیر Ù¾Ú‘Ú¾Û’ گئے ٹاپک' title: 'ٹاپک' invalid_access: @@ -1464,17 +1452,17 @@ ur: title: "ٹاپک Ù†Ûیں ملا" description: "معزرت، ÛÙ… ÛŒÛ Ù¹Ø§Ù¾Ú© Ù†Ûیں ڈھونڈ سکے۔ شاید ÛŒÛ Ú©Ø³ÛŒ ماڈریٹر Ù†Û’ Ûٹا دیا Ûو؟" total_unread_posts: - one: آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں 1 بغیر Ù¾Ú‘Ú¾ÛŒ پوسٹ موجود ÛÛ’ - other: آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں {{count}} بغیر Ù¾Ú‘Ú¾ÛŒ پوسٹ موجود Ûیں + one: "آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں 1 بغیر Ù¾Ú‘Ú¾ÛŒ پوسٹ موجود ÛÛ’" + other: "آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں {{count}} بغیر Ù¾Ú‘Ú¾ÛŒ پوسٹ موجود Ûیں" unread_posts: - one: آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں 1 بغیر Ù¾Ú‘Ú¾ÛŒ پرانی پوسٹ موجود ÛÛ’ - other: آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں {{count}} بغیر Ù¾Ú‘Ú¾ÛŒ پرانی پوسٹ موجود Ûیں + one: "آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں 1 بغیر Ù¾Ú‘Ú¾ÛŒ پرانی پوسٹ موجود ÛÛ’" + other: "آپ Ú©Û’ پاس Ø§ÙØ³ ٹاپک میں {{count}} بغیر Ù¾Ú‘Ú¾ÛŒ پرانی پوسٹ موجود Ûیں" new_posts: - one: آپ Ú©Û’ آخری Ø¯ÙØ¹ ÛŒÛ Ù¹Ø§Ù¾Ú© Ù¾Ú‘Ú¾Ù†Û’ Ú©Û’ بعد 1 نئی پوسٹ شائع Ûوئی - other: آپ Ú©Û’ آخری Ø¯ÙØ¹ ÛŒÛ Ù¹Ø§Ù¾Ú© Ù¾Ú‘Ú¾Ù†Û’ Ú©Û’ بعد {{count}} نئی پوسٹ شائع Ûوئیں + one: "آپ Ú©Û’ آخری Ø¯ÙØ¹ ÛŒÛ Ù¹Ø§Ù¾Ú© Ù¾Ú‘Ú¾Ù†Û’ Ú©Û’ بعد 1 نئی پوسٹ شائع Ûوئی" + other: "آپ Ú©Û’ آخری Ø¯ÙØ¹ ÛŒÛ Ù¹Ø§Ù¾Ú© Ù¾Ú‘Ú¾Ù†Û’ Ú©Û’ بعد {{count}} نئی پوسٹ شائع Ûوئیں" likes: - one: Ø§ÙØ³ ٹاپک میں 1 لائیک ÛÛ’ - other: Ø§ÙØ³ ٹاپک میں {{count}} لائیکس Ûیں + one: "Ø§ÙØ³ ٹاپک میں 1 لائیک ÛÛ’" + other: "Ø§ÙØ³ ٹاپک میں {{count}} لائیکس Ûیں" back_to_list: "واپس ٹاپک ÙÛØ±Ø³Øª پر" options: "ٹاپک اختیارات" show_links: "Ø§ÙØ³ ٹاپک Ú©Û’ اندر موجود لنکس دکھایں" @@ -1538,8 +1526,8 @@ ur: auto_reminder: "آپ Ú©Ùˆ اس ٹاپک Ú©Û’ بارے میں یاد Ø¯ÛØ§Ù†ÛŒ کرائی جائے گا %{timeLeft}Û”" auto_close_title: 'خود کار طریقے سے بند کر Ù†Û’ Ú©ÛŒ سیٹÙÙ†Ú¯' auto_close_immediate: - one: ٹاپک Ú©ÛŒ آخری پوسٹ ابھی سے 1 گھنٹا پرانی ÛÛ’ØŒ Ø§ÙØ³Ù„یئے ٹاپک Ùوری طور پر بند کر دیا جائے گا۔ - other: ٹاپک Ú©ÛŒ آخری پوسٹ ابھی سے %{count} گھنٹے پرانی ÛÛ’ØŒ Ø§ÙØ³Ù„یئے ٹاپک Ùوری طور پر بند کر دیا جائے گا۔ + one: "ٹاپک Ú©ÛŒ آخری پوسٹ ابھی سے 1 گھنٹا پرانی ÛÛ’ØŒ Ø§ÙØ³Ù„یئے ٹاپک Ùوری طور پر بند کر دیا جائے گا۔" + other: "ٹاپک Ú©ÛŒ آخری پوسٹ ابھی سے %{count} گھنٹے پرانی ÛÛ’ØŒ Ø§ÙØ³Ù„یئے ٹاپک Ùوری طور پر بند کر دیا جائے گا۔" timeline: back: "واپس" back_description: "آپنی آخری بغیر Ù¾Ú‘Ú¾ÛŒ پوسٹ پر واپس جائیں" @@ -1647,8 +1635,8 @@ ur: pin_validation: "اس ٹاپک Ú©Ùˆ Ù¾ÙÙ† کرنے کیلئے ایک تاریخ Ú©ÛŒ ضرورت ÛÛ’Û”" not_pinned: "{{categoryLink}} میں کوئی ٹاپک Ù¾ÙÙ† Ù†Ûیں Ûیں۔" already_pinned: - one: 'ÙÛŒ الحال {{categoryLink}} میں Ù¾ÙÙ† ÛÙˆÛ’ ٹاپک: 1' - other: 'ÙÛŒ الحال {{categoryLink}} میں Ù¾ÙÙ† ÛÙˆÛ’ ٹاپک: {{count}}' + one: "ÙÛŒ الحال {{categoryLink}} میں Ù¾ÙÙ† ÛÙˆÛ’ ٹاپک: 1" + other: "ÙÛŒ الحال {{categoryLink}} میں Ù¾ÙÙ† ÛÙˆÛ’ ٹاپک: {{count}}" pin_globally: "Ø§ÙØ³ ٹاپک Ú©Ùˆ تمام ٹاپکس Ú©ÛŒ ÙÛØ±Ø³Øª Ú©Û’ سب سے اÙپر Ø¸Ø§ÛØ± کریں جب تک Ú©Û" confirm_pin_globally: "آپ Ú©Û’ پاس Ù¾ÛÙ„Û’ ÛÛŒ سے {{count}} عالمی سطح پر Ù¾ÙÙ† ÛÙˆÛ’ ٹاپک موجود Ûیں۔ Ø¨ÛØª سارے Ù¾ÙÙ† ÛÙˆÛ’ ٹاپک نئے اور گمنام صارÙین Ú©Û’ لئے ایک بوجھ ثابت ÛÙˆ سکتے Ûیں۔ کیا آپ واقعی عالمی سطح پر ایک اور ٹاپک Ù¾ÙÙ† کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" unpin_globally: "Ø§ÙØ³ ٹاپک Ú©Ùˆ تمام ٹاپکس Ú©ÛŒ ÙÛØ±Ø³Øª Ú©Û’ سب سے اÙپر Ø¸Ø§ÛØ± کرنے سے Ûٹائیں" @@ -1656,8 +1644,8 @@ ur: global_pin_note: "صارÙین خود سے Ø§Ù†ÙØ±Ø§Ø¯ÛŒ طور پر ٹاپک سے پن Ûٹا سکتے Ûیں۔" not_pinned_globally: "کوئی ٹاپک عالمی سطح پر Ù¾ÙÙ† Ù†Ûیں Ûوئے Ûیں۔" already_pinned_globally: - one: 'ÙÛŒ الحال عالمی سطح پر Ù¾ÙÙ† Ûوئے ٹاپک: 1' - other: 'ÙÛŒ الحال عالمی سطح پر Ù¾ÙÙ† Ûوئے ٹاپک: {{count}}' + one: "ÙÛŒ الحال عالمی سطح پر Ù¾ÙÙ† Ûوئے ٹاپک: 1" + other: "ÙÛŒ الحال عالمی سطح پر Ù¾ÙÙ† Ûوئے ٹاپک: {{count}}" make_banner: "Ø§ÙØ³ ٹاپک Ú©Ùˆ ایک بَینر بنا دیں جو تمام ØµÙØ­Ø§Øª Ú©Û’ سب سے اوپر Ø¸Ø§ÛØ± ÛÙˆÛ”" remove_banner: "بَینر Ûٹا دیں جو تمام ØµÙØ­Ø§Øª Ú©Û’ سب سے اوپر Ø¸Ø§ÛØ± Ûوتا ÛÛ’Û”" banner_note: "صارÙین بینر Ú©Ùˆ بند کرکے Ø§ÙØ³Û’ برطر٠کر سکتے Ûیں۔ آیک وقت میں صر٠ایک ٹاپک Ú©Ùˆ بینر بنایا جا سکتا ÛÛ’Û”" @@ -1694,8 +1682,8 @@ ur: login_reply: 'جواب دینے کیلئے لاگ اÙÙ† کریں' filters: n_posts: - one: 1 پوسٹ - other: '{{count}} پوسٹس' + one: "1 پوسٹ" + other: "{{count}} پوسٹس" cancel: "ÙÙلٹر Ûٹائیں" split_topic: title: "نئے ٹاپک پر منتقل کریں" @@ -1703,15 +1691,15 @@ ur: topic_name: "نئے ٹاپک کا نام" error: "نئے ٹاپک پر پوسٹس منتقل کرنے میں ایک خرابی کا سامنا کرنا پڑا۔" instructions: - one: آپ ایک نیا ٹاپک بنانے اور اپنی منتخب Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹ سے Ø§ÙØ³Û’ آباد کرنے والے Ûیں۔ - other: آپ ایک نیا ٹاپک بنانے اور اپنی منتخب Ú©Ø±Ø¯Û {{count}} پوسٹس سے Ø§ÙØ³Û’ آباد کرنے والے Ûیں۔ + one: "آپ ایک نیا ٹاپک بنانے اور اپنی منتخب Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹ سے Ø§ÙØ³Û’ آباد کرنے والے Ûیں۔" + other: "آپ ایک نیا ٹاپک بنانے اور اپنی منتخب Ú©Ø±Ø¯Û {{count}} پوسٹس سے Ø§ÙØ³Û’ آباد کرنے والے Ûیں۔" merge_topic: title: "Ù…ÙˆØ¬ÙˆØ¯Û Ù¹Ø§Ù¾Ú© میں منتقل کریں" action: "Ù…ÙˆØ¬ÙˆØ¯Û Ù¹Ø§Ù¾Ú© میں منتقل کریں" error: "اس ٹاپک میں پوسٹس منتقل کرنے میں ایک خرابی کا سامنا کرنا پڑا۔" instructions: - one: Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ ÙˆÛ Ù¹Ø§Ù¾Ú© منتخب کریں جس میں آپ ÙˆÛ Ù¾ÙˆØ³Ù¹ منتقل کرنا Ú†Ø§ÛØªÛ’ Ûیں۔ - other: Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ ÙˆÛ Ù¹Ø§Ù¾Ú© منتخب کریں جس میں آپ {{count}} پوسٹس منتقل کرنا Ú†Ø§ÛØªÛ’ Ûیں۔ + one: "Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ ÙˆÛ Ù¹Ø§Ù¾Ú© منتخب کریں جس میں آپ ÙˆÛ Ù¾ÙˆØ³Ù¹ منتقل کرنا Ú†Ø§ÛØªÛ’ Ûیں۔" + other: "Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ ÙˆÛ Ù¹Ø§Ù¾Ú© منتخب کریں جس میں آپ {{count}} پوسٹس منتقل کرنا Ú†Ø§ÛØªÛ’ Ûیں۔" merge_posts: title: "منتخب Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ú©Ùˆ ضم کریں" action: "منتخب Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ú©Ùˆ ضم کریں" @@ -1723,8 +1711,8 @@ ur: label: "پوسٹس کا نیا مالک" placeholder: "نئے مالک کا صار٠نام" instructions: - one: Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ {{old_user}} Ú©ÛŒ پوسٹ Ú©Û’ نئے مالک Ú©Ùˆ منتخب کریں۔ - other: Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ {{old_user}} Ú©ÛŒ {{count}} پوسٹس Ú©Û’ نئے مالک Ú©Ùˆ منتخب کریں۔ + one: "Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ {{old_user}} Ú©ÛŒ پوسٹ Ú©Û’ نئے مالک Ú©Ùˆ منتخب کریں۔" + other: "Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒØŒ {{old_user}} Ú©ÛŒ {{count}} پوسٹس Ú©Û’ نئے مالک Ú©Ùˆ منتخب کریں۔" change_timestamp: title: "ٹائمسٹیمپ تبدیل کریں..." action: "ٹائمسٹیمپ تبدیل کریں" @@ -1752,7 +1740,7 @@ ur: deselect_all: تمام غیر منتخب کریں description: one: آپ Ù†Û’ 1 پوسٹ منتخب Ú©ÛŒ ÛÛ’Û” - other: آپ Ù†Û’ {{count}} پوسٹس منتخب Ú©ÛŒ Ûیں۔ + other: "آپ Ù†Û’ {{count}} پوسٹس منتخب Ú©ÛŒ Ûیں۔" post: quote_reply: "اقتباس کریں" edit: "{{link}} {{replyAvatar}} {{username}} " @@ -1767,28 +1755,28 @@ ur: show_full: "مکمل پوسٹ دکھائیں" show_hidden: 'چھپایا Ûوا متن دکھایں۔' deleted_by_author: - one: (مصن٠نے پوسٹ واپس Ù„Û’ لی، %{count} گھنٹے میں ÛŒÛ Ø®ÙˆØ¯ کار طریقے سے حذ٠کر دی جائے Ú¯ÛŒ الا ÛŒÛ Ú©Û Ø§ÙØ³Û’ Ùلیگ کیا گیا ÛÙˆ) - other: (مصن٠نے پوسٹ واپس Ù„Û’ لی، %{count} گھنٹوں میں ÛŒÛ Ø®ÙˆØ¯ کار طریقے سے حذ٠کر دی جائے Ú¯ÛŒ الا ÛŒÛ Ú©Û Ø§ÙØ³Û’ Ùلیگ کیا گیا ÛÙˆ) + one: "(مصن٠نے پوسٹ واپس Ù„Û’ لی، %{count} گھنٹے میں ÛŒÛ Ø®ÙˆØ¯ کار طریقے سے حذ٠کر دی جائے Ú¯ÛŒ الا ÛŒÛ Ú©Û Ø§ÙØ³Û’ Ùلیگ کیا گیا ÛÙˆ)" + other: "(مصن٠نے پوسٹ واپس Ù„Û’ لی، %{count} گھنٹوں میں ÛŒÛ Ø®ÙˆØ¯ کار طریقے سے حذ٠کر دی جائے Ú¯ÛŒ الا ÛŒÛ Ú©Û Ø§ÙØ³Û’ Ùلیگ کیا گیا ÛÙˆ)" collapse: "بند کریں" expand_collapse: "کھولیں/بند کریں" locked: "ایک اسٹا٠کے رکن Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ ترمیم Ûونے سے روک دیا ÛÛ’" gap: - one: 1 چھپایا Ûوا جواب دیکھیں - other: '{{count}} چھپائے ÛÙˆÛ’ جوابات دیکھیں' + one: "1 چھپایا Ûوا جواب دیکھیں" + other: "{{count}} چھپائے ÛÙˆÛ’ جوابات دیکھیں" unread: "پوسٹ بغیر Ù¾Ú‘Ú¾ÛŒ ÛÛ’" has_replies: - one: '{{count}} جواب' - other: '{{count}} جوابات' + one: "{{count}} جواب" + other: "{{count}} جوابات" has_likes: - one: '{{count}} لائیک' - other: '{{count}} لائیکس' + one: "{{count}} لائیک" + other: "{{count}} لائیکس" has_likes_title: - one: 1 شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا" has_likes_title_only_you: " آپ Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا" has_likes_title_you: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کیا" errors: create: "معذرت، آپ Ú©ÛŒ پوسٹ بنانے میں ایک خرابی کا سامنا کرنا پڑا۔ Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کریں۔" edit: "معذرت، آپ Ú©ÛŒ پوسٹ ترمیم کرنے میں ایک خرابی کا سامنا کرنا پڑا۔ Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کریں۔" @@ -1828,11 +1816,11 @@ ur: delete_replies: confirm: "کیا آپ Ø§ÙØ³ پوسٹ پر جوابات بھی حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" direct_replies: - one: جی ÛØ§ÚºØŒ اور Ø¨Ø±Ø§Û Ø±Ø§Ø³Øª 1 جواب - other: جی ÛØ§ÚºØŒ اور Ø¨Ø±Ø§Û Ø±Ø§Ø³Øª {{count}} جوابات + one: "جی ÛØ§ÚºØŒ اور Ø¨Ø±Ø§Û Ø±Ø§Ø³Øª 1 جواب" + other: "جی ÛØ§ÚºØŒ اور Ø¨Ø±Ø§Û Ø±Ø§Ø³Øª {{count}} جوابات" all_replies: - one: جی ÛØ§ÚºØŒ اور 1 جواب - other: جی ÛØ§ÚºØŒ اور تمام {{count}} جوابات + one: "جی ÛØ§ÚºØŒ اور 1 جواب" + other: "جی ÛØ§ÚºØŒ اور تمام {{count}} جوابات" just_the_post: "Ù†Ûیں، ØµØ±Ù ÛŒÛ Ù¾ÙˆØ³Ù¹" admin: "پوسٹ ایڈمن Ú©Û’ ایکشن" wiki: "ÙˆÙیکی بنائیں" @@ -1850,15 +1838,14 @@ ur: actions: flag: 'Ùلَیگ' defer_flags: - one: Ùلَیگ نظر انداز کریں - other: Ùلَیگز نظر انداز کریں + one: "Ùلَیگ نظر انداز کریں" + other: "Ùلَیگز نظر انداز کریں" undo: off_topic: "Ùلَیگ کالعدم کریں" spam: "Ùلَیگ کالعدم کریں" inappropriate: "Ùلَیگ کالعدم کریں" bookmark: "بÙÚ© مارک کالعدم کریں" like: "لائیک کالعدم کریں" - vote: "ووٹ کالعدم کریں" people: off_topic: "Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا گیا" spam: "Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا گیا" @@ -1868,9 +1855,8 @@ ur: bookmark: "Ø§ÙØ³ Ú©Ùˆ بÙÚ© مارک" like: "Ø§ÙØ³ Ú©Ùˆ لائیک کیا" like_capped: - one: اور {{count}} دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا - other: اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا - vote: "Ø§ÙØ³ Ú©Û’ لیے ووٹ دیا" + one: "اور {{count}} دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" + other: "اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" by_you: off_topic: "آپ Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا" spam: "آپ Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا" @@ -1879,65 +1865,58 @@ ur: notify_user: "آپ Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا" bookmark: "آپ Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا" like: "آپ Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" - vote: "آپ Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Û’ لیے ووٹ کیا" by_you_and_others: off_topic: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا" spam: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا" inappropriate: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا" notify_moderators: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا" notify_user: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا" bookmark: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا" like: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا - vote: - one: آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Û’ لیے ووٹ کیا - other: آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Û’ لیے ووٹ کیا + one: "آپ اور 1 دوسرے شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" + other: "آپ اور {{count}} دوسرے لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" by_others: off_topic: - one: 1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ موضوع سے ÛÙ¹ کر Ûونے Ú©Û’ طور پر Ùلَیگ کیا" spam: - one: 1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ سپَیم Ûونے Ú©Û’ طور پر Ùلَیگ کیا" inappropriate: - one: 1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا گیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا گیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا گیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ نامناسب Ûونے Ú©Û’ طور پر Ùلَیگ کیا گیا" notify_moderators: - one: 1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ اعتدال کیلئے Ùلَیگ کیا" notify_user: - one: 1 شخص Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ صار٠کو پیغام بھیجا" bookmark: - one: 1 شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Ùˆ بÙÚ© مارک کیا" like: - one: 1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا' - vote: - one: 1 شخص Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Û’ لیے ووٹ کیا - other: '{{count}} لوگوں Ù†Û’ Ø§ÙØ³ پوسٹ Ú©Û’ لیے ووٹ کیا' + one: "1 شخص Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" + other: "{{count}} لوگوں Ù†Û’ Ø§ÙØ³ Ú©Ùˆ لائیک کیا" delete: confirm: - one: کیا آپ واقعی Ø§ÙØ³ پوسٹ Ú©Ùˆ حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟ - other: کیا آپ واقعی ان {{count}} پوسٹس Ú©Ùˆ حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟ + one: "کیا آپ واقعی Ø§ÙØ³ پوسٹ Ú©Ùˆ حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" + other: "کیا آپ واقعی ان {{count}} پوسٹس Ú©Ùˆ حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" merge: confirm: - one: کیا آپ واقعی ان پوسٹس Ú©Ùˆ ضم کرنا Ú†Ø§ÛØªÛ’ Ûیں؟ - other: کیا آپ واقعی ان {{count}} پوسٹس Ú©Ùˆ ضم کرنا Ú†Ø§ÛØªÛ’ Ûیں؟ + one: "کیا آپ واقعی ان پوسٹس Ú©Ùˆ ضم کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" + other: "کیا آپ واقعی ان {{count}} پوسٹس Ú©Ùˆ ضم کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" revisions: controls: first: "Ù¾ÛÙ„ÛŒ رَوÙیژن" @@ -1975,7 +1954,6 @@ ur: can: 'کر سکتا ÛÛ’… ' none: '(کوئی Ø²Ù…Ø±Û Ù†Ûیں)' all: 'تمام زÙÙ…Ø±ÙŽÛ Ø¬Ø§Øª' - choose: 'ایک Ø²Ù…Ø±Û Ù…Ù†ØªØ®Ø¨ کریں…' edit: 'ترمیم کریں' edit_long: "ترمیم کریں" view: 'Ø²Ù…Ø±Û Ù…ÛŒÚº ٹاپکس دیکھیے' @@ -2024,7 +2002,6 @@ ur: show_subcategory_list: "اس Ø²Ù…Ø±Û Ù…ÛŒÚº ذیلی Ø²Ù…Ø±Û Ø¬Ø§Øª Ú©ÛŒ ÙÛØ±Ø³Øª ٹاپکس سے Ù…Ù†Ø¯Ø±Ø¬Û Ø¨Ø§Ù„Ø§ دکھائیں۔" num_featured_topics: "Ø²Ù…Ø±Û Ú©Û’ ØµÙØ­Û’ پر دکھائے گئے ٹاپکس Ú©ÛŒ تعداد:" subcategory_num_featured_topics: "بالائی Ø²Ù…Ø±Û Ú©Û’ ØµÙØ­Û’ پر دکھائے گئے نمایاں ٹاپکس Ú©ÛŒ تعداد:" - all_topics_wiki: "نئے ٹاپکس Ú©Ùˆ Ù¾ÛÙ„Û’ ÛÛŒ سے ÙˆÙیکی بنائیں۔" subcategory_list_style: "ذیلی Ø²Ù…Ø±Û Ø¬Ø§Øª ÙÛØ±Ø³Øª کا سٹائل:" sort_order: "Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ØªØ±ØªÛŒØ¨:" default_view: "Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆÛŒÙˆ:" @@ -2033,7 +2010,6 @@ ur: edit_permissions: "ترمیم کرنے Ú©ÛŒ اجازتیں" add_permission: "اجازت شامل کریں" this_year: "Ø§ÙØ³ سال" - position: "پوزیشن" default_position: "Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û Ù¾ÙˆØ²ÛŒØ´Ù†" position_disabled: "ایکٹیوٹی Ú©Û’ ÛØ³Ø§Ø¨ سے زÙÙ…Ø±Û Ø¬Ø§Øª Ú©ÛŒ ترتیب دکھائی جائے گی۔ ÙÛØ±Ø³ØªÙˆÚº میں زÙÙ…Ø±Û Ø¬Ø§Øª Ú©ÛŒ ترتیب Ú©Ùˆ کنٹرول کرنے Ú©Û’ لئے،" position_disabled_click: '"Ù…Ù‚Ø±Ø±Û Ø²Ù…Ø±Û Ø¬Ø§Øª پوزیشنوں" Ú©ÛŒ سیٹÙÙ†Ú¯ ÙØ¹Ø§Ù„ کریں۔' @@ -2094,14 +2070,14 @@ ur: custom_placeholder_notify_moderators: "Ûمیں خاص طور پر Ø§ÙØ³ چیز Ú©Û’ بارے میں مطلع کریں جس سے آپ Ùکر مند Ûیں، اور Ø¬ÛØ§Úº ممکن ÛÙˆ سکے Ù…ØªØ¹Ù„Ù‚Û Ù„Ù†Ú©Ø³ اور مثالیں ÙØ±Ø§ÛÙ… کریں۔" custom_message: at_least: - one: Ú©Ù… از Ú©Ù… 1 حر٠درج کریں - other: Ú©Ù… از Ú©Ù… {{count}} حرو٠درج کریں + one: "Ú©Ù… از Ú©Ù… 1 حر٠درج کریں" + other: "Ú©Ù… از Ú©Ù… {{count}} حرو٠درج کریں" more: - one: 1 اور Ø¢Ú¯Û’ بچا ÛÛ’... - other: '{{count}} اور Ø¢Ú¯Û’ بچے Ûیں...' + one: "1 اور Ø¢Ú¯Û’ بچا ÛÛ’..." + other: "{{count}} اور Ø¢Ú¯Û’ بچے Ûیں..." left: - one: 1 باقی Ø±ÛØªØ§ ÛÛ’... - other: '{{count}} باقی Ø±ÛØªÛ’ Ûیں...' + one: "1 باقی Ø±ÛØªØ§ ÛÛ’..." + other: "{{count}} باقی Ø±ÛØªÛ’ Ûیں..." flagging_topic: title: "Ûماری کمیونٹی Ú©Ùˆ Ù…ÛØ°Ø¨ رکھنے Ú©Û’ لئے مدد کا شکریÛ!" action: "ٹاپک Ùلَیگ کریں" @@ -2112,13 +2088,13 @@ ur: links_title: "مقبول لنکس" links_shown: "مزید Ù„Ùنکس دکھایے" clicks: - one: 1 Ú©Ù„Ú© - other: '%{count} کلکس' + one: "1 Ú©Ù„Ú©" + other: "%{count} کلکس" post_links: about: "Ø§ÙØ³ پوسٹ Ú©Û’ لئے مزید لنکس دکھائیں" title: - one: 1 مزید - other: '%{count}مزید ' + one: "1 مزید" + other: "%{count}مزید " topic_statuses: warning: help: "ÛŒÛ Ø§ÛŒÚ© Ø¢Ùیشل Ø§Ù†ØªØ¨Ø§Û ÛÛ’Û”" @@ -2152,22 +2128,22 @@ ur: original_post: "اصل پوسٹ" views: "ÙˆÙیوز" views_lowercase: - one: ÙˆÙیو - other: ÙˆÙیوز + one: "ÙˆÙیو" + other: "ÙˆÙیوز" replies: "جوابات" views_long: - one: Ø§ÙØ³ ٹاپک Ú©Ùˆ 1 Ø¯ÙØ¹Û دیکھا جا چکا ÛÛ’ - other: Ø§ÙØ³ ٹاپک Ú©Ùˆ {{number}} Ø¯ÙØ¹Û دیکھا جا چکا ÛÛ’ + one: "Ø§ÙØ³ ٹاپک Ú©Ùˆ 1 Ø¯ÙØ¹Û دیکھا جا چکا ÛÛ’" + other: "Ø§ÙØ³ ٹاپک Ú©Ùˆ {{number}} Ø¯ÙØ¹Û دیکھا جا چکا ÛÛ’" activity: "سرگرمی" likes: "لائیکس" likes_lowercase: - one: لائیک - other: لائیکس + one: "لائیک" + other: "لائیکس" likes_long: "Ø§ÙØ³ ٹاپک میں {{number}} لائیکس Ûیں" users: "صارÙین" users_lowercase: - one: صار٠- other: صارÙین + one: "صارÙ" + other: "صارÙین" category_title: "زمرÛ" history: "ÛØ³Ù¹Ø±ÛŒ" changed_by: "{{author}} Ú©ÛŒ طر٠سے" @@ -2181,8 +2157,8 @@ ur: latest: title: "ØªØ§Ø²Û ØªØ±ÛŒÙ†" title_with_count: - one: ØªØ§Ø²Û ØªØ±ÛŒÙ† (1) - other: ØªØ§Ø²Û ØªØ±ÛŒÙ† ({{count}}) + one: "ØªØ§Ø²Û ØªØ±ÛŒÙ† (1)" + other: "ØªØ§Ø²Û ØªØ±ÛŒÙ† ({{count}})" help: "Ø­Ø§Ù„ÛŒÛ Ù¾ÙˆØ³Ù¹ والے ٹاپک" hot: title: "ÛØ§Ù¹" @@ -2200,21 +2176,21 @@ ur: unread: title: "بغیر Ù¾Ú‘Ú¾Û’" title_with_count: - one: بغیر پڑھا (1) - other: بغیر Ù¾Ú‘Ú¾Û’ ({{count}}) + one: "بغیر پڑھا (1)" + other: "بغیر Ù¾Ú‘Ú¾Û’ ({{count}})" help: " ٹاپک جن پر ÙÛŒ الحال آپ Ù†Û’ نظر رکھی Ûوئی ÛÛ’ یا بغیر Ù¾Ú‘Ú¾ÛŒ پوسٹس Ú©Û’ ساتھ ٹریک کر رÛÛ’ Ûیں" lower_title_with_count: - one: 1 بغیر پڑھا Ûوا - other: '{{count}} بغیر Ù¾Ú‘Ú¾Û’ Ûوئے' + one: "1 بغیر پڑھا Ûوا" + other: "{{count}} بغیر Ù¾Ú‘Ú¾Û’ Ûوئے" new: lower_title_with_count: - one: 1 نیا - other: '{{count}} نئے' + one: "1 نیا" + other: "{{count}} نئے" lower_title: "نئے" title: "نیا" title_with_count: - one: نیا (1) - other: نئے ({{count}}) + one: "نیا (1)" + other: "نئے ({{count}})" help: "Ù¾Ú†Ú¾Ù„Û’ چند دنوں میں بنائے گئے ٹاپک" posted: title: "میری پوسٹ" @@ -2225,8 +2201,8 @@ ur: category: title: "{{categoryName}}" title_with_count: - one: '{{categoryName}} (1)' - other: '{{categoryName}} ({{count}})' + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "{{categoryName}} Ø²Ù…Ø±Û Ù…ÛŒÚº ØªØ§Ø²Û ØªØ±ÛŒÚº ٹاپک" top: title: "سب سے اوپر" @@ -2314,22 +2290,22 @@ ur: print: 'ctrl+p ٹاپک پرÙنٹ کریں' badges: earned_n_times: - one: ÛŒÛ Ø¨ÙŽÛŒØ¬ 1 Ø¯ÙØ¹Û حاصل کیا - other: ÛŒÛ Ø¨ÙŽÛŒØ¬ %{count} Ù…Ø±ØªØ¨Û Ø­Ø§ØµÙ„ کیا + one: "ÛŒÛ Ø¨ÙŽÛŒØ¬ 1 Ø¯ÙØ¹Û حاصل کیا" + other: "ÛŒÛ Ø¨ÙŽÛŒØ¬ %{count} Ù…Ø±ØªØ¨Û Ø­Ø§ØµÙ„ کیا" granted_on: "عطا کیا گیا %{date}" others_count: "دوسرے جن Ú©Û’ پاس ÛŒÛ Ø¨ÙŽÛŒØ¬ ÛÛ’ (%{count})" title: بَیج allow_title: "آپ Ø§ÙØ³ بَیج Ú©Ùˆ عنوان Ú©Û’ طور پر استعمال کر سکتے Ûیں" multiple_grant: "آپ Ø§ÙØ³ Ú©Ùˆ ایک سے Ø²ÛŒØ§Ø¯Û Ù…Ø±ØªØ¨Û Ø­Ø§ØµÙ„ کر سکتے Ûیں" badge_count: - one: 1 بَیج - other: '%{count} بَیج' + one: "1 بَیج" + other: "%{count} بَیج" more_badges: - one: +1 مزید - other: +%{count} مزید + one: "+1 مزید" + other: "+%{count} مزید" granted: - one: 1 عطا کیا گیا - other: '%{count} عطا کیے گئے' + one: "1 عطا کیا گیا" + other: "%{count} عطا کیے گئے" select_badge_for_title: اپنے عنوان Ú©Û’ طور پر استعمال کرنے Ú©Û’ لئے ایک بیج منتخب کریں none: "(کوئی Ù†Ûیں)" successfully_granted: "%{username}Ú©Ùˆ کامیابی سے %{badge} عطا کیا" @@ -2363,8 +2339,8 @@ ur: choose_for_topic: "اختیاری ٹیگز" delete_tag: "ٹیگ حذ٠کریں" delete_confirm: - one: کیا آپ واقعی اس ٹیگ Ú©Ùˆ حذ٠اور 1 ٹاپک، جس Ú©Ùˆ ÛŒÛ Ø¢Ø³Ø§Ø¦ÛŒÙ† Ûواوا ÛÛ’ØŒ سے Ûٹا دینا Ú†Ø§ÛØªÛ’ Ûیں؟ - other: کیا آپ واقعی اس ٹیگ Ú©Ùˆ حذ٠اور {{count}} ٹاپکس، جن Ú©Ùˆ ÛŒÛ Ø¢Ø³Ø§Ø¦ÛŒÙ† Ûواوا ÛÛ’ØŒ سے Ûٹا دینا Ú†Ø§ÛØªÛ’ Ûیں؟ + one: "کیا آپ واقعی اس ٹیگ Ú©Ùˆ حذ٠اور 1 ٹاپک، جس Ú©Ùˆ ÛŒÛ Ø¢Ø³Ø§Ø¦ÛŒÙ† Ûواوا ÛÛ’ØŒ سے Ûٹا دینا Ú†Ø§ÛØªÛ’ Ûیں؟" + other: "کیا آپ واقعی اس ٹیگ Ú©Ùˆ حذ٠اور {{count}} ٹاپکس، جن Ú©Ùˆ ÛŒÛ Ø¢Ø³Ø§Ø¦ÛŒÙ† Ûواوا ÛÛ’ØŒ سے Ûٹا دینا Ú†Ø§ÛØªÛ’ Ûیں؟" delete_confirm_no_topics: "کیا آپ واقعی Ø§ÙØ³ ٹَیگ Ú©Ùˆ حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" rename_tag: "ٹیگ کا نام تبدیل کریں" rename_instructions: "ٹیگ Ú©Û’ لیے نئے نام کا انتخاب کریں:" @@ -2529,8 +2505,8 @@ ur: suspend_user: "صار٠معطل کریں" suspend_user_title: "Ø§ÙØ³ پوسٹ Ú©ÛŒ ÙˆØ¬Û Ø³Û’ صار٠معطل کریں" replies: - one: '[1 جواب]' - other: '[%{count} جوابات]' + one: "[1 جواب]" + other: "[%{count} جوابات]" dispositions: agreed: "Ø§ØªÙØ§Ù‚ کیا" disagreed: "اختلا٠کیا" @@ -2652,11 +2628,11 @@ ur: none: "کوئی Ù…ØªØ¹Ù„Ù‚Û ÙˆØ§Ù‚Ø¹Ø§Øª موجود Ù†Ûیں۔" redeliver: "Ø¯ÙˆØ¨Ø§Ø±Û ÚˆÛŒÙ„ÛŒÙˆØ± کریں" incoming: - one: ایک نیا ÙˆØ§Ù‚Ø¹Û Ù…ÙˆØ¬ÙˆØ¯ ÛÛ’Û” - other: '{{count}} نئے واقعات موجود Ûیں۔' + one: "ایک نیا ÙˆØ§Ù‚Ø¹Û Ù…ÙˆØ¬ÙˆØ¯ ÛÛ’Û”" + other: "{{count}} نئے واقعات موجود Ûیں۔" completed_in: - one: 1 سیکنڈ میں مکمل Ûوا۔ - other: '{{count}} سیکنڈ میں مکمل Ûوا۔' + one: "1 سیکنڈ میں مکمل Ûوا۔" + other: "{{count}} سیکنڈ میں مکمل Ûوا۔" request: "ریکویسٹ" response: "جواب" redeliver_confirm: "کیا آپ واقعی ÙˆÛÛŒ پَیلوڈ Ø¯ÙˆØ¨Ø§Ø±Û ÚˆÛŒÙ„ÛŒÙˆØ± کرنا Ú†Ø§ÛØªÛ’ Ûیں؟" @@ -2814,7 +2790,6 @@ ur: public_key: "رÙیپَوزÙٹَری Ú©Ùˆ درج ذیل پبلک کلید ایکسَیس ÙØ±Ø§ÛÙ… کریں:" about_theme: "تÙھیم Ú©Û’ بارے میں" license: "لائسنس" - component_of: "تÙھیم ایک جزو ÛÛ’:" update_to_latest: "ØªØ§Ø²Û ØªØ±ÛŒÙ† ورژن تک اÙÙ¾ ڈَیٹ کریں" check_for_updates: "اپ ڈیٹ Ú©Û’ لیے چیک کریں" updating: "اَپ ڈَیٹ کیا جا Ø±ÛØ§ ÛÛ’..." @@ -2823,8 +2798,8 @@ ur: theme_settings: "تھیم Ú©ÛŒ ترتیبات" no_settings: "Ø§ÙØ³ تھیم Ú©ÛŒ کوئی ترتیبات Ù†Ûیں Ûیں۔" commits_behind: - one: تÙھیم 1 Ú©ÙŽÙ…ÙÙ¹ پیچھے ÛÛ’! - other: تÙھیم {{count}} Ú©ÙŽÙ…Ùٹس پیچھے ÛÛ’! + one: "تÙھیم 1 Ú©ÙŽÙ…ÙÙ¹ پیچھے ÛÛ’!" + other: "تÙھیم {{count}} Ú©ÙŽÙ…Ùٹس پیچھے ÛÛ’!" scss: text: "CSS" title: "اپنی مرضی Ú©Û’ مطابق CSS درج کریں، ÛÙ… تمام درست CSS اور SCSS سٹائلز قبول کرتے Ûیں" @@ -2956,7 +2931,6 @@ ur: address_placeholder: "name@example.com" type_placeholder: "ڈائجسٹ، سائن اَپ..." reply_key_placeholder: "جواب Ú©ÙÛŒ" - skipped_reason_placeholder: "وجÛ" moderation_history: performed_by: "Ú©ÛŒ طر٠سے عمل کیا کیا" no_results: "کوئی ماڈرَیشَن ÛØ³Ù¹Ø±ÛŒ موجود Ù†Ûیں ÛÛ’Û”" @@ -3098,8 +3072,8 @@ ur: clear_filter: "صا٠کریں" show_words: "Ø§Ù„ÙØ§Ø¸ دکھائیں" word_count: - one: 1 Ù„ÙØ¸ - other: '%{count}Ø§Ù„ÙØ§Ø¸ ' + one: "1 Ù„ÙØ¸" + other: "%{count}Ø§Ù„ÙØ§Ø¸ " actions: block: 'بلاک کریں' censor: 'سَینسَر' @@ -3141,11 +3115,11 @@ ur: suspect: 'مشتبÛ' approved: "Ù…Ù†Ø¸ÙˆØ±Ø´Ø¯ÛØŸ" approved_selected: - one: صار٠منظور کریں - other: صارÙین منظور کریں ({{count}}) + one: "صار٠منظور کریں" + other: "صارÙین منظور کریں ({{count}})" reject_selected: - one: صار٠مسترد کریں - other: صارÙین مسترد کریں ({{count}}) + one: "صار٠مسترد کریں" + other: "صارÙین مسترد کریں ({{count}})" titles: active: 'متحرک صارÙین' new: 'نئے صارÙین' @@ -3162,11 +3136,11 @@ ur: suspended: 'معطل Ú©Ø±Ø¯Û ØµØ§Ø±Ùین' suspect: 'Ù…Ø´ØªØ¨Û ØµØ§Ø±Ùین' reject_successful: - one: کامیابی Ú©Û’ ساتھ 1 صار٠کو مسترد کیا۔ - other: کامیابی Ú©Û’ ساتھ %{count} صارÙین Ú©Ùˆ مسترد کیا۔ + one: "کامیابی Ú©Û’ ساتھ 1 صار٠کو مسترد کیا۔" + other: "کامیابی Ú©Û’ ساتھ %{count} صارÙین Ú©Ùˆ مسترد کیا۔" reject_failures: - one: 1 صار٠کو مسترد کرنے میں ناکامی۔ - other: '%{count} صارÙین Ú©Ùˆ مسترد کرنے میں ناکامی۔' + one: "1 صار٠کو مسترد کرنے میں ناکامی۔" + other: "%{count} صارÙین Ú©Ùˆ مسترد کرنے میں ناکامی۔" not_verified: "غیر تصدیق شدÛ" check_email: title: "Ø§ÙØ³ صار٠کا اÙیمیل ایڈریس Ø¸Ø§ÛØ± کریں" @@ -3251,14 +3225,14 @@ ur: delete_forbidden_because_staff: "اَیڈمن اور ماڈریٹرز حذ٠نÛیں کیے جا سکتے۔" delete_posts_forbidden_because_staff: "اَیڈمن اور ماڈریٹرز Ú©ÛŒ تمام پوسٹس حذ٠نÛیں Ú©ÛŒ جا سکتیں۔" delete_forbidden: - one: اگر صارÙین Ú©ÛŒ پوسٹس موجود ÛÙˆÚº تو اÙÙ†Ûیں حذ٠نÛیں کیا جا سکتا۔ ایک صار٠کو حذ٠کرنے Ú©ÛŒ کوشش سے Ù¾ÛÙ„Û’ تمام پوسٹس Ú©Ùˆ حذ٠کریں۔ (%{count} دن سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ پوسٹس کوحذ٠نÛیں کیا جا سکتا۔) - other: اگر صارÙین Ú©ÛŒ پوسٹس موجود ÛÙˆÚº تو اÙÙ†Ûیں حذ٠نÛیں کیا جا سکتا۔ ایک صار٠کو حذ٠کرنے Ú©ÛŒ کوشش سے Ù¾ÛÙ„Û’ تمام پوسٹس Ú©Ùˆ حذ٠کریں۔ (%{count} دن سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ پوسٹس کوحذ٠نÛیں کیا جا سکتا۔) + one: "اگر صارÙین Ú©ÛŒ پوسٹس موجود ÛÙˆÚº تو اÙÙ†Ûیں حذ٠نÛیں کیا جا سکتا۔ ایک صار٠کو حذ٠کرنے Ú©ÛŒ کوشش سے Ù¾ÛÙ„Û’ تمام پوسٹس Ú©Ùˆ حذ٠کریں۔ (%{count} دن سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ پوسٹس کوحذ٠نÛیں کیا جا سکتا۔)" + other: "اگر صارÙین Ú©ÛŒ پوسٹس موجود ÛÙˆÚº تو اÙÙ†Ûیں حذ٠نÛیں کیا جا سکتا۔ ایک صار٠کو حذ٠کرنے Ú©ÛŒ کوشش سے Ù¾ÛÙ„Û’ تمام پوسٹس Ú©Ùˆ حذ٠کریں۔ (%{count} دن سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ پوسٹس کوحذ٠نÛیں کیا جا سکتا۔)" cant_delete_all_posts: - one: تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا۔ Ú©Ú†Ú¾ پوسٹس %{count} دن پرانی سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ Ûیں۔(delete_user_max_post_age سیٹÙÙ†Ú¯Û”) - other: تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا۔ Ú©Ú†Ú¾ پوسٹس %{count} دن پرانی سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ Ûیں۔(delete_user_max_post_age سیٹÙÙ†Ú¯Û”) + one: "تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا۔ Ú©Ú†Ú¾ پوسٹس %{count} دن پرانی سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ Ûیں۔(delete_user_max_post_age سیٹÙÙ†Ú¯Û”)" + other: "تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا۔ Ú©Ú†Ú¾ پوسٹس %{count} دن پرانی سے Ø²ÛŒØ§Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ Ûیں۔(delete_user_max_post_age سیٹÙÙ†Ú¯Û”)" cant_delete_all_too_many_posts: - one: تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا Ú©ÛŒÙˆÙ†Ú©Û ØµØ§Ø±Ù Ú©ÛŒ 1 سے Ø²ÛŒØ§Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں۔ (delete_all_posts_max) - other: تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا Ú©ÛŒÙˆÙ†Ú©Û ØµØ§Ø±Ù Ú©ÛŒ %{count} سے Ø²ÛŒØ§Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں۔ (delete_all_posts_max) + one: "تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا Ú©ÛŒÙˆÙ†Ú©Û ØµØ§Ø±Ù Ú©ÛŒ 1 سے Ø²ÛŒØ§Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں۔ (delete_all_posts_max)" + other: "تمام پوسٹس Ú©Ùˆ حذ٠نÛیں کیا جاسکتا Ú©ÛŒÙˆÙ†Ú©Û ØµØ§Ø±Ù Ú©ÛŒ %{count} سے Ø²ÛŒØ§Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں۔ (delete_all_posts_max)" delete_confirm: "کیا آپ واقعی Ø§ÙØ³ صار٠کو حذ٠کرنا Ú†Ø§ÛØªÛ’ Ûیں؟ ÛŒÛ Ù…ÙØ³ØªÙ‚ÙÙ„ عمل ÛÛ’!" delete_and_block: "Ø§ÙØ³ اÙیمیل اور IP ایڈریس Ú©Ùˆ حذ٠اور بلاک کریں" delete_dont_block: "صر٠حذ٠کریں" @@ -3299,8 +3273,8 @@ ur: tl3_requirements: title: "ٹرسٹ لَیول 3 Ú©Û’ تقاضے" table_title: - one: Ù¾Ú†Ú¾Ù„Û’ دن میں - other: Ù¾Ú†Ú¾Ù„Û’ %{count}دنوں میں + one: "Ù¾Ú†Ú¾Ù„Û’ دن میں" + other: "Ù¾Ú†Ú¾Ù„Û’ %{count}دنوں میں" value_heading: "وَیلÙیو" requirement_heading: "ضروریات" visits: "زائرین Ú©ÛŒ تعداد" @@ -3470,8 +3444,8 @@ ur: text: "Ú©Ú†Ú¾ گرانٹ سامپل Ù„Ø§Ù¾ØªÛ Ûیں۔ ÛŒÛ Ø§ÙØ³ وقت Ûوتا ÛÛ’ جب بَیج Ù‚Ùوَیری ÙˆÛ ØµØ§Ø±Ù IDs یا پوسٹ IDs واپس بھیجتا ÛÛ’ جو موجود Ù†Ûیں Ûوتیں۔ ÛŒÛ Ø¨Ø¹Ø¯ میں غیر متوقع نتائج کا سبب بن سکتا ÛÛ’ - آپ اپنی Ù‚Ùوَیری Ú©Ùˆ Ø¯ÙˆØ¨Ø§Ø±Û Ú†ÛŒÚ© کرلیں۔" no_grant_count: "کوئی بَیج تÙویض کرنے کیلئے موجود Ù†Ûیں۔" grant_count: - one: تÙویض کرنے کیلئے 1 بَیج موجود ÛÛ’Û” - other: تÙویض کرنے کیلئے %{count} بَیج موجود Ûیں۔ + one: "تÙویض کرنے کیلئے 1 بَیج موجود ÛÛ’Û”" + other: "تÙویض کرنے کیلئے %{count} بَیج موجود Ûیں۔" sample: "نمونÛ:" grant: with: "%{username}" @@ -3538,8 +3512,8 @@ ur: uploading: "اَپ لوڈ کیا جا Ø±ÛØ§ ÛÛ’..." quit: "شاید بعد میں" staff_count: - one: آپ Ú©ÛŒ کمیونٹی میں 1 اسٹا٠کا رکن ÛÛ’ (آپ)Û” - other: آپ Ú©ÛŒ کمیونٹی میں آپ سمیت، %{count} سٹا٠کے ارکان Ûیں۔ + one: "آپ Ú©ÛŒ کمیونٹی میں 1 اسٹا٠کا رکن ÛÛ’ (آپ)Û”" + other: "آپ Ú©ÛŒ کمیونٹی میں آپ سمیت، %{count} سٹا٠کے ارکان Ûیں۔" invites: add_user: "شامل کریں" none_added: "آپ Ù†Û’ کسی بھی سٹا٠کو مدعو Ù†Ûیں کیا۔ کیا آپ واقعی Ø¢Ú¯Û’ جانا Ú†Ø§ÛØªÛ’ Ûیں؟" diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index b33a69bebd..c4ca3e8354 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -42,49 +42,49 @@ vi: tiny: half_a_minute: "< 1 phút" less_than_x_seconds: - other: < %{count}s + other: "< %{count}s" x_seconds: - other: '%{count}s' + other: "%{count}s" less_than_x_minutes: - other: < %{count} phút + other: "< %{count} phút" x_minutes: - other: '%{count}m' + other: "%{count}m" about_x_hours: - other: '%{count}h' + other: "%{count}h" x_days: - other: '%{count}d' + other: "%{count}d" x_months: - other: '%{count} tháng' + other: "%{count} tháng" about_x_years: - other: '%{count}y' + other: "%{count}y" over_x_years: - other: '> %{count}y' + other: "> %{count}y" almost_x_years: - other: '%{count}y' + other: "%{count}y" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - other: '%{count} phút' + other: "%{count} phút" x_hours: - other: '%{count} giá»' + other: "%{count} giá»" x_days: - other: '%{count} ngày' + other: "%{count} ngày" date_year: "MMM D, 'YY" medium_with_ago: x_minutes: - other: ' %{count} phút trước' + other: " %{count} phút trước" x_hours: - other: '%{count} giá» trước' + other: "%{count} giá» trước" x_days: - other: '%{count} ngày trước' + other: "%{count} ngày trước" later: x_days: - other: còn %{count} ngày + other: "còn %{count} ngày" x_months: - other: còn %{count} tháng + other: "còn %{count} tháng" x_years: - other: còn %{count} năm + other: "còn %{count} năm" previous_month: 'Tháng trước' next_month: 'Tháng sau' placeholder: ngày @@ -163,12 +163,12 @@ vi: show_help: "lá»±a chá»n" links: "Liên kết" links_lowercase: - other: liên kết + other: "liên kết" faq: "FAQ" guidelines: "Hướng dẫn" privacy_policy: "Chính sách vá» quyá»n riêng tư" privacy: "Sá»± riêng tư" - terms_of_service: "Äiá»u khoản dịch vụ" + tos: "Äiá»u khoản dịch vụ" mobile_view: "Xem ở chế độ di động" desktop_view: "Xem ở chế độ máy tính" you: "Bạn" @@ -187,7 +187,7 @@ vi: max_of_count: "tối Ä‘a trong {{count}}" alternation: "hoặc" character_count: - other: '{{count}} ký tá»±' + other: "{{count}} ký tá»±" suggested_topics: title: "Chá»§ đỠtương tá»±" pm_title: "Tin nhắn gợi ý" @@ -256,14 +256,14 @@ vi: cancel: "Há»§y" view_pending: "xem bài viết Ä‘ang chá» xá»­ lý" has_pending_posts: - other: Chá»§ đỠnày có {{count}} bài viết cần phê chuẩn + other: "Chá»§ đỠnày có {{count}} bài viết cần phê chuẩn" confirm: "Lưu thay đổi" delete_prompt: "Bạn có chắc chắn muốn xóa %{username}? Thao tác này sẽ loại bá» tất cả các bài viết cá»§a há» kèm theo khóa địa chỉ IP và email cá»§a há»." approval: title: "Bài viết cần phê duyệt" description: "Chúng tôi đã nhận được bài viết má»›i cá»§a bạn, nhưng nó cần phải được phê duyệt bởi admin trước khi được hiện. Xin hãy kiên nhẫn." pending_posts: - other: Bạn có {{count}} bài viết Ä‘ang chá» xá»­ lý. + other: "Bạn có {{count}} bài viết Ä‘ang chá» xá»­ lý." ok: "OK" user_action: user_posted_topic: "{{user}} đã đăng chá»§ Ä‘á»" @@ -297,7 +297,7 @@ vi: posts_read: "Äã Ä‘á»c" posts_read_long: "Bài đăng đã Ä‘á»c" total_rows: - other: '%{count} ngưá»i dùng' + other: "%{count} ngưá»i dùng" group_histories: actions: change_group_setting: "Äổi cài đặt nhóm" @@ -340,7 +340,7 @@ vi: title: "Nhóm" empty: "Không có nhóm công khai nào." title: - other: Nhóm + other: "Nhóm" activity: "Hoạt động" topics: "Chá»§ Ä‘á»" posts: "Các bài viết" @@ -391,15 +391,12 @@ vi: "14": "Äang chá» xá»­ lý" categories: all: "tất cả chuyên mục" - all_subcategories: "tất cả trong %{categoryName}" no_subcategory: "không có gì" category: "Chuyên mục" category_list: "Hiá»…n thị danh sách chuyên mục" reorder: title: "Sắp xếp lại danh mục" title_long: "Tổ chức lại danh sách danh mục" - fix_order: "Vị trí cố định" - fix_order_tooltip: "Không phải tất cả danh mục có vị trí duy nhất, Ä‘iá»u này có thể dẫn đến kết quả không mong muốn." save: "Lưu thứ tá»±" apply_all: "Ãp dụng" position: "Vị trí" @@ -410,9 +407,9 @@ vi: toggle_ordering: "chuyển lệnh kiểm soát" subcategories: "Phân loại phụ" topic_sentence: - other: '%{count} chá»§ Ä‘á»' + other: "%{count} chá»§ Ä‘á»" topic_stat_sentence: - other: '%{count} số lượng chá»§ đỠmá»›i tá»ng quá khứ %{unit}.' + other: "%{count} số lượng chá»§ đỠmá»›i tá»ng quá khứ %{unit}." ip_lookup: title: Tìm kiếm địa chỉ IP hostname: Hostname @@ -559,7 +556,6 @@ vi: error: "Có lá»—i xảy ra khi thay đổi giá trị này." change_username: title: "Thay Username" - confirm: "Nếu bạn thay đổi tên đăng nhập, tất cả những liên kết ngưá»i khác nhắc đến bạn @name sẽ bị lá»—i. Bạn chắc chắn muốn thay đổi chứ?" taken: "Xin lá»—i, đã có username này." invalid: "Username này không thích hợp. Nó chỉ chứa các ký tá»± là chữ cái và chữ số. " change_email: @@ -578,7 +574,6 @@ vi: upload_title: "Upload hình ảnh cá»§a bạn" upload_picture: "Úp hình" image_is_not_a_square: "Cảnh báo: chúng tôi đã cắt hình ảnh cá»§a bạn; chiá»u rá»™ng và chiá»u cao không bằng nhau." - cache_notice: "Hình hồ sở cá»§a bạn đã thay đổi thành công nhưng có thể thỉnh thoảng xuất hiện ảnh cÅ© bởi cache cá»§a trình duyệt." change_profile_background: title: "Hình ná»n trang hồ sÆ¡" instructions: "Hình ná»n trang hồ sÆ¡ sẽ ở giữa và có chiá»u rá»™ng mặc định là 850px." @@ -593,7 +588,7 @@ vi: authenticated: "Thư Ä‘iện tá»­ cá»§a bạn đã được xác nhận bởi {{provider}}" frequency_immediately: "Chúng tôi sẽ gá»­i email cho bạn ngay lập tức nếu bạn đã chưa Ä‘á»c những Ä‘iá»u chúng tôi đã gá»­i cho bạn qua email." frequency: - other: Chúng tôi sẽ chỉ gá»­i email cho bạn nếu chúng tôi đã không nhìn thấy bạn trong {{count}} phút cuối. + other: "Chúng tôi sẽ chỉ gá»­i email cho bạn nếu chúng tôi đã không nhìn thấy bạn trong {{count}} phút cuối." name: title: "Tên" instructions: "Tên đầy đủ cá»§a bạn (tuỳ chá»n)" @@ -678,7 +673,7 @@ vi: sent: "Äã gá»­i" none: "Không tìm thấy lá»i má»i nào." truncated: - other: Hiện {{count}} thư má»i đầu tiên + other: "Hiện {{count}} thư má»i đầu tiên" redeemed: "Lá»i má»i bù lại" redeemed_tab: "Làm lại" redeemed_tab_with_count: "Làm lại ({{count}})" @@ -724,21 +719,21 @@ vi: time_read: "thá»i gian Ä‘á»c" recent_time_read: "đã Ä‘á»c gần đây" topic_count: - other: Chá»§ đỠđã được tạo + other: "Chá»§ đỠđã được tạo" post_count: - other: Bài viết đã được tạo + other: "Bài viết đã được tạo" likes_given: - other: nhận + other: "nhận" likes_received: - other: Äã nhận + other: "Äã nhận" days_visited: - other: Ngày đã ghé thăm + other: "Ngày đã ghé thăm" topics_entered: - other: chá»§ đỠđã xem + other: "chá»§ đỠđã xem" posts_read: - other: Bài viết đã Ä‘á»c + other: "Bài viết đã Ä‘á»c" bookmark_count: - other: Dấu trang + other: "Dấu trang" top_replies: "Top trả lá»i" no_replies: "Chưa có trả lá»i." more_replies: "Thêm trả lá»i" @@ -750,7 +745,6 @@ vi: more_badges: "Thêm huy hiệu" top_links: "Liên kết đầu" no_links: "Không có liên kết" - associated_accounts: "Äăng nhập" ip_address: title: "Äịa chỉ IP cuối cùng" registration_ip_address: @@ -800,7 +794,7 @@ vi: too_few_posts_notice: "Hãy bắt đầu thảo luận! Hiện có %{currentPosts} / %{requiredPosts} bài viết. Khách ghé thăm cần má»™t số chá»§ đỠđể Ä‘á»c và trả lá»i." logs_error_rate_notice: rate: - other: '%{count} lá»—i/%{duration}' + other: "%{count} lá»—i/%{duration}" learn_more: "tìm hiểu thêm..." all_time: 'tổng cá»™ng' all_time_desc: 'tổng số chá»§ đỠđã tạo' @@ -822,8 +816,6 @@ vi: hide_session: "Nhắc vào ngày mai" hide_forever: "không, cảm Æ¡n" hidden_for_session: "OK, Tôi sẽ há»i bạn vào ngày mai. Bạn có thể luôn luôn sá»­ dụng chức năng đăng nhập để tạo tài khoản." - intro: "Xin chào! :heart_eyes: Có vẻ như bạn Ä‘ang thích thú để thảo luận, nhưng bạn chưa đăng nhập." - value_prop: "Khi bạn tạo tài khoản, website nhá»› chính xác những gì bạn đã Ä‘á»c, vì vậy bạn sẽ luôn trở lại đúng nÆ¡i đã rá»i Ä‘i. Bạn cÅ©ng có thể nhận thông báo ở đây hoặc qua email má»—i khi có bài viết má»›i. Bạn cÅ©ng có thể like bài viết để chia sẻ cảm xúc cá»§a mình. :heartbeat:" summary: enabled_description: "Bạn Ä‘ang xem má»™t bản tóm tắt cá»§a chá»§ đỠnày: các bài viết thú vị nhất được xác định bởi cá»™ng đồng." description: "Có {{replyCount}} trả lá»i." @@ -837,7 +829,6 @@ vi: disable: "Xem các bài viết bị xoá" private_message_info: title: "Tin nhắn" - invite: "Má»i ngưá»i khác..." remove_allowed_user: "Bạn thá»±c sá»± muốn xóa {{name}} từ tin nhắn này?" email: 'Email' username: 'Username' @@ -855,11 +846,11 @@ vi: action: "Tôi đã quên mật khẩu cá»§a tôi" invite: "Äiá»n vào username cá»§a bạn hoặc địa chỉ email và chúng tôi sẽ gá»­i bạn email để khởi tạo lại mật khẩu" reset: "Tạo lại mật khẩu" - complete_username: "Nếu má»™t tài khoản phù hợp vá»›i tên thành viên % {username} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." - complete_email: "Nếu má»™t trận đấu tài khoản % {email} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." - complete_username_found: "Chúng tôi tìm thấy má»™t tài khoản phù hợp vá»›i tên thành viên % {username} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." - complete_email_found: "Chúng tôi tìm thấy má»™t tài khoản phù hợp vá»›i % {email} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." - complete_username_not_found: "Không có tài khoản phù hợp vá»›i tên thành viên % {username} " + complete_username: "Nếu má»™t tài khoản phù hợp vá»›i tên thành viên %{username} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." + complete_email: "Nếu má»™t trận đấu tài khoản %{email} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." + complete_username_found: "Chúng tôi tìm thấy má»™t tài khoản phù hợp vá»›i tên thành viên %{username} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." + complete_email_found: "Chúng tôi tìm thấy má»™t tài khoản phù hợp vá»›i %{email} , bạn sẽ nhận được má»™t email vá»›i hướng dẫn vá» cách đặt lại mật khẩu cá»§a bạn trong thá»i gian ngắn." + complete_username_not_found: "Không có tài khoản phù hợp vá»›i tên thành viên %{username} " complete_email_not_found: "Không tìm thấy tài khoản nào tương ứng vá»›i %{email}" button_help: "Giúp " login: @@ -889,9 +880,6 @@ vi: to_continue: "Vui lòng đăng nhập" preferences: "Bạn cần phải đăng nhập để thay đổi cài đặt tài khoản." forgot: "Tôi không thể nhá»› lại chi tiết tài khoản cá»§a tôi." - google: - title: "vá»›i Google " - message: "Chứng thá»±c vá»›i Google (Bạn hãy chắc chắn là chặn popup không bật)" google_oauth2: title: "vá»›i Google" message: "Chứng thá»±c vá»›i Google (chắc chắn rằng cá»­a sổ pop up blocker không được kích hoạt)" @@ -1111,7 +1099,7 @@ vi: archive_topics: "Chá»§ đỠLưu trữ" choose_new_category: "Chá»n chuyên mục má»›i cho chá»§ đỠnày:" selected: - other: Bạn đã chá»n {{count}} chá»§ đỠ+ other: "Bạn đã chá»n {{count}} chá»§ Ä‘á»" choose_new_tags: "Chá»n thẻ má»›i cho các chuyên mục sau:" none: unread: "Bạn không có chá»§ đỠnào chưa Ä‘á»c." @@ -1167,13 +1155,13 @@ vi: title: "Không tìm thấy chá»§ Ä‘á»" description: "Xin lá»—i, chúng tôi không thể tìm thấy chá»§ đỠđó. Có lẽ nó đã bị loại bởi mod?" total_unread_posts: - other: Bạn có {{number}} bài đăng chưa Ä‘á»c trong chá»§ đỠnày + other: "Bạn có {{number}} bài đăng chưa Ä‘á»c trong chá»§ đỠnày" unread_posts: - other: bạn có {{number}} bài đăng cá»§ chưa Ä‘á»c trong chá»§ đỠnày + other: "bạn có {{number}} bài đăng cá»§ chưa Ä‘á»c trong chá»§ đỠnày" new_posts: - other: có {{count}} bài đăng má»›i trong chá»§ đỠnày từ lần Ä‘á»c cuối + other: "có {{count}} bài đăng má»›i trong chá»§ đỠnày từ lần Ä‘á»c cuối" likes: - other: có {{count}} thích trong chá»§ để này + other: "có {{count}} thích trong chá»§ để này" back_to_list: "Quay lại danh sách chá»§ Ä‘á»" options: "Các lá»±a chá»n chá»§ Ä‘á»" show_links: "Hiển thị liên kết trong chá»§ đỠnày" @@ -1303,7 +1291,7 @@ vi: pin_validation: "Ngày được yêu câu để gắn chá»§ đỠnày" not_pinned: "Không có chá»§ đỠđược ghim trong {{categoryLink}}." already_pinned: - other: 'Chá»§ đỠgần đây được ghim trong {{categoryLink}}: {{count}}' + other: "Chá»§ đỠgần đây được ghim trong {{categoryLink}}: {{count}}" pin_globally: "Làm cho chá»§ đỠnày xuất hiện trên top cá»§a tất cả các chá»§ Ä‘á»" confirm_pin_globally: "Bạn đã có {{count}} chá»§ đỠđược ghim. Ghim quá nhiá»u chá»§ đỠcó thể là trở ngại cho những thành viên má»›i và ẩn danh. Bạn có chắc chắn muốn ghim chá»§ đỠkhác?" unpin_globally: "Bá» chá»§ đỠnày khá»i phần trên cùng cá»§a danh sách tất cả các chá»§ Ä‘á»" @@ -1311,7 +1299,7 @@ vi: global_pin_note: "Ngưá»i dùng có thể bá» ghim chá»§ đỠriêng cho mình" not_pinned_globally: "Không có chá»§ đỠnào được ghim." already_pinned_globally: - other: 'Chá»§ đỠgần đây được ghim trong: {{count}}' + other: "Chá»§ đỠgần đây được ghim trong: {{count}}" make_banner: "Äặt chá»§ đỠnày là má»™t banner xuất hiện trên top cá»§a tất cả các trang." remove_banner: "Gỡ bá» banner xuất hiện trên top cá»§a tất cả các trang." banner_note: "Ngưá»i dùng có thể bá» qua banner này bằng cách đóng nó. Chỉ má»™t chá»§ đỠcó thể được đặt là banner tại má»™t thá»i Ä‘iểm." @@ -1345,7 +1333,7 @@ vi: login_reply: 'Äăng nhập để trả lá»i' filters: n_posts: - other: '{{count}} bài viết' + other: "{{count}} bài viết" cancel: "Bá» Ä‘ièu kiện lá»c" split_topic: title: "Di chuyển tá»›i Chá»§ đỠmá»›i" @@ -1353,13 +1341,13 @@ vi: topic_name: "Tên chá»§ đỠmá»›i" error: "Có lá»—i khi di chuyển bài viết tá»›i chá»§ đỠmá»›i." instructions: - other: Bạn muốn tạo chá»§ đỠmá»›i và phổ biến nó vá»›i {{count}} bài viết đã chá»n. + other: "Bạn muốn tạo chá»§ đỠmá»›i và phổ biến nó vá»›i {{count}} bài viết đã chá»n." merge_topic: title: "Di chuyển tá»›i chá»§ đỠđang tồn tại" action: "di chuyển tá»›i chá»§ đỠđang tồn tại" error: "Có lá»—i khi di chuyển bài viết đến chá»§ đỠnày." instructions: - other: Hãy chá»n chá»§ đỠbạn muốn di chuyển {{count}} bài viết này tá»›i. + other: "Hãy chá»n chá»§ đỠbạn muốn di chuyển {{count}} bài viết này tá»›i." change_owner: title: "Chuyển chá»§ sở hữu bài viết" action: "chuyển chá»§ sở hữu" @@ -1367,7 +1355,7 @@ vi: label: "Chá»§ sở hữ má»›i cá»§a Bài viết" placeholder: "tên đăng nhập cá»§a chá»§ sở hữu má»›i" instructions: - other: Hãy chá»n chá»§ sở hữu má»›i cho {{count}} bài viết cá»§a {{old_user}}. + other: "Hãy chá»n chá»§ sở hữu má»›i cho {{count}} bài viết cá»§a {{old_user}}." change_timestamp: action: "đổi timestamp" invalid_timestamp: "Timestamp không thể trong tương lai." @@ -1381,7 +1369,7 @@ vi: select_all: chá»n tất cả deselect_all: bá» chá»n tất cả description: - other: Bạn đã chá»n {{count}} bài viết. + other: "Bạn đã chá»n {{count}} bài viết." post: quote_reply: "Trích dẫn" edit_reason: "Lý do: " @@ -1393,20 +1381,20 @@ vi: show_full: "Hiển thị đầy đủ bài viết" show_hidden: 'Xem ná»™i dung ẩn' deleted_by_author: - other: (bài viết theo tác giả sẽ được xóa tá»± động sau %{count} giá», trừ khi đã đánh dấu) + other: "(bài viết theo tác giả sẽ được xóa tá»± động sau %{count} giá», trừ khi đã đánh dấu)" expand_collapse: "mở/đóng" gap: - other: xem {{count}} trả lá»i bị ẩn + other: "xem {{count}} trả lá»i bị ẩn" unread: "Bài viết chưa Ä‘á»c" has_replies: - other: '{{count}} Trả lá»i' + other: "{{count}} Trả lá»i" has_likes: - other: '{{count}} Thích' + other: "{{count}} Thích" has_likes_title: - other: '{{count}} ngưá»i thích bài viết này' + other: "{{count}} ngưá»i thích bài viết này" has_likes_title_only_you: "bạn đã like bài viết này" has_likes_title_you: - other: bạn và {{count}} ngưá»i khác đã like bài viết này + other: "bạn và {{count}} ngưá»i khác đã like bài viết này" errors: create: "Xin lá»—i, có lá»—i xảy ra khi tạo bài viết cá»§a bạn. Vui lòng thá»­ lại." edit: "Xin lá»—i, có lá»—i xảy ra khi sá»­a bài viết cá»§a bạn. Vui lòng thá»­ lại." @@ -1454,7 +1442,6 @@ vi: inappropriate: "Há»§y gắn cá»" bookmark: "Há»§y đánh dấu" like: "Há»§y like" - vote: "Há»§y bình chá»n" people: off_topic: "đánh dấu là chá»§ đỠđóng" spam: "đánh dấu là spam" @@ -1463,7 +1450,6 @@ vi: notify_user: "đã gá»­i tin nhắn" bookmark: "đã đánh dấu bài này" like: "đã like bài này" - vote: "đã bầu cho bài này" by_you: off_topic: "Bạn đã đánh dấu cái nfay là chá»§ đỠđóng" spam: "Bạn đã đánh dấu cái này là rác" @@ -1472,41 +1458,36 @@ vi: notify_user: "Bạn đã gá»­i má»™t tin nhắn đến ngưá»i dùng này" bookmark: "Bạn đã đánh dấu bài viết này" like: "Bạn đã thích cái này" - vote: "Bạn đã bình chá»n cho bài viết này" by_you_and_others: off_topic: - other: Bạn và {{count}} ngưá»i khác đã đánh dấu đây là chá»§ đỠđóng + other: "Bạn và {{count}} ngưá»i khác đã đánh dấu đây là chá»§ đỠđóng" spam: - other: Bạn và {{count}} ngưá»i khác gắn cá» nó là rác + other: "Bạn và {{count}} ngưá»i khác gắn cá» nó là rác" inappropriate: - other: Bạn và {{count}} other ngưá»i khác đã đánh dấu nó là không phù hợp + other: "Bạn và {{count}} other ngưá»i khác đã đánh dấu nó là không phù hợp" notify_moderators: - other: Bạn và {{count}} ngưá»i khác gắn cá» nó là Ä‘iá»u tiết + other: "Bạn và {{count}} ngưá»i khác gắn cá» nó là Ä‘iá»u tiết" notify_user: - other: Bạn và {{count}} ngưá»i khác đã gá»­i má»™t tin nhắn đến ngưá»i dùng này + other: "Bạn và {{count}} ngưá»i khác đã gá»­i má»™t tin nhắn đến ngưá»i dùng này" bookmark: - other: Bạn và {{count}} ngưá»i khác đã đánh dấu bài viết này + other: "Bạn và {{count}} ngưá»i khác đã đánh dấu bài viết này" like: - other: Bạn và {{count}} ngưá»i khác đã thích cái này - vote: - other: Bạn và {{count}} nưá»i khác đã bình chá»n cho bài viết này + other: "Bạn và {{count}} ngưá»i khác đã thích cái này" by_others: off_topic: - other: '{{count}} ngưá»i đã đánh dấu nó là chá»§ đỠđóng' + other: "{{count}} ngưá»i đã đánh dấu nó là chá»§ đỠđóng" spam: - other: '{{count}} ngưá»i khác đánh dấu là rác' + other: "{{count}} ngưá»i khác đánh dấu là rác" inappropriate: - other: '{{count}} ngưá»i khác đã đánh dấu là không phù hợp' + other: "{{count}} ngưá»i khác đã đánh dấu là không phù hợp" notify_moderators: - other: '{{count}} ngưá»i đã đánh dấu để chá» duyệt' + other: "{{count}} ngưá»i đã đánh dấu để chá» duyệt" notify_user: - other: '{{count}} gá»­i tin nhắn đến ngưá»i dùng này' + other: "{{count}} gá»­i tin nhắn đến ngưá»i dùng này" bookmark: - other: '{{count}} ngưá»i đã đánh dấu bài viết này' + other: "{{count}} ngưá»i đã đánh dấu bài viết này" like: - other: '{count}} ngưá»i đã thích cái này' - vote: - other: '{{count}} ngưá»i đã bình chá»n cho bài viết này' + other: "{count}} ngưá»i đã thích cái này" revisions: controls: first: "Sá»­a đổi đầu tiên" @@ -1541,7 +1522,6 @@ vi: can: 'can…' none: '(không danh mục)' all: 'Tất cả danh mục' - choose: 'Chá»n chuyên mục…' edit: 'sá»­a' edit_long: "Sá»­a" view: 'Xem Chá»§ đỠtrong Danh mục' @@ -1585,7 +1565,6 @@ vi: edit_permissions: "Sá»­a quyá»n" add_permission: "Thêm quyá»n" this_year: "năm nay" - position: "vị trí" default_position: "vị trí mặc định" position_disabled: "Chuyên mục sẽ được hiển thị theo thứ tá»± hoạt động. Äể kiểm soát thứ tá»± chuyên mục trong danh sách, " position_disabled_click: 'bật thiết lập "cố định vị trí chuyên mục".' @@ -1634,9 +1613,9 @@ vi: custom_placeholder_notify_moderators: "Hãy cho chúng tôi biết cụ thể những gì bạn quan tâm, và cung cấp các liên kết hoặc ví dụ liên quan nếu có thể." custom_message: at_least: - other: nhập ít nhất {{count}} kí tá»± + other: "nhập ít nhất {{count}} kí tá»±" left: - other: '{{count}} còn lại' + other: "{{count}} còn lại" flagging_topic: title: "Cám Æ¡n bạn đã giúp phát triển cá»™ng đồng!" action: "Gắn cá» Chá»§ Ä‘á»" @@ -1647,10 +1626,10 @@ vi: links_title: "Liên kết phổ biến" links_shown: "hiển thị thêm liên kết..." clicks: - other: '%{count} nhấp chuá»™t' + other: "%{count} nhấp chuá»™t" post_links: title: - other: '%{count} thêm' + other: "%{count} thêm" topic_statuses: warning: help: "Äây là má»™t cảnh báo chính thức." @@ -1684,18 +1663,18 @@ vi: original_post: "Bài viết gốc" views: "Lượt xem" views_lowercase: - other: lượt xem + other: "lượt xem" replies: "Trả lá»i" views_long: - other: chá»§ đỠnày đã được xem {{number}} lần + other: "chá»§ đỠnày đã được xem {{number}} lần" activity: "Hoạt động" likes: "Lượt thích" likes_lowercase: - other: lượt thích + other: "lượt thích" likes_long: "Có {{number}} thích trong chá»§ đỠnày" users: "Ngưá»i dùng" users_lowercase: - other: ngưá»i dùng + other: "ngưá»i dùng" category_title: "Danh mục" history: "Lịch sá»­" changed_by: "bởi {{author}}" @@ -1708,7 +1687,7 @@ vi: latest: title: "Má»›i nhất" title_with_count: - other: Má»›i nhất ({{count}}) + other: "Má»›i nhất ({{count}})" help: "chá»§ đỠvá»›i bài viết gần nhất" hot: title: "Nổi bật" @@ -1726,17 +1705,17 @@ vi: unread: title: "Chưa Ä‘á»c" title_with_count: - other: Chưa Ä‘á»c ({{count}}) + other: "Chưa Ä‘á»c ({{count}})" help: "chá»§ đỠbạn Ä‘ang xem hoặc theo dõi có bài viết chưa Ä‘á»c" lower_title_with_count: - other: '{{count}} chưa Ä‘á»c' + other: "{{count}} chưa Ä‘á»c" new: lower_title_with_count: - other: '{{count}} má»›i' + other: "{{count}} má»›i" lower_title: "má»›i" title: "Má»›i" title_with_count: - other: Má»›i ({{count}}) + other: "Má»›i ({{count}})" help: "chá»§ đỠđã tạo cách đây vài ngày" posted: title: "Bài viết cá»§a tôi" @@ -1747,7 +1726,7 @@ vi: category: title: "{{categoryName}}" title_with_count: - other: '{{categoryName}} ({{count}})' + other: "{{categoryName}} ({{count}})" help: "Những chá»§ đỠmá»›i nhất trong chuyên mục{{categoryName}} " top: title: "Top" @@ -1791,10 +1770,10 @@ vi: title: 'Hành động' badges: earned_n_times: - other: Äã giành được huy hiệu này %{count} lần + other: "Äã giành được huy hiệu này %{count} lần" title: Huy hiệu badge_count: - other: '%{count} huy hiệu' + other: "%{count} huy hiệu" badge_grouping: getting_started: name: Bắt đầu @@ -2141,7 +2120,6 @@ vi: address_placeholder: "name@example.com" type_placeholder: "tập san, đăng ký..." reply_key_placeholder: "key phản hồi" - skipped_reason_placeholder: "lý do" logs: title: "Log" action: "Hành động" @@ -2251,9 +2229,9 @@ vi: suspect: 'Nghi ngá»' approved: "Äã duyệt?" approved_selected: - other: duyệt tài khoản ({{count}}) + other: "duyệt tài khoản ({{count}})" reject_selected: - other: từ chối tài khoản ({{count}}) + other: "từ chối tài khoản ({{count}})" titles: active: 'Thành viên kích hoạt' new: 'Thành viên má»›i' @@ -2269,9 +2247,9 @@ vi: suspended: 'Tài khoản Tạm khóa' suspect: 'Tài khoản đáng ngá»' reject_successful: - other: Từ chối thành công %{count} tài khoản. + other: "Từ chối thành công %{count} tài khoản." reject_failures: - other: Từ chối thất bại %{count} tài khoản. + other: "Từ chối thất bại %{count} tài khoản." not_verified: "Chưa xác thá»±c" check_email: title: "Khám phá email cá»§a tài khoản này" @@ -2328,11 +2306,11 @@ vi: delete_forbidden_because_staff: "Admin và mod không thể xóa." delete_posts_forbidden_because_staff: "Không thể xóa tất cả bài viết cá»§a quản trị và Ä‘iá»u hành viên." delete_forbidden: - other: Không thể xóa tài khoản nếu há» có bài viết, hãy xóa tất cả các bài viết trước khi xóa tài khoản. (Không thể xóa các bài viết cÅ© hÆ¡n %{count} ngày.) + other: "Không thể xóa tài khoản nếu há» có bài viết, hãy xóa tất cả các bài viết trước khi xóa tài khoản. (Không thể xóa các bài viết cÅ© hÆ¡n %{count} ngày.)" cant_delete_all_posts: - other: Không thể xóa tất cả các bài viết, má»™t số bài viết cÅ© hÆ¡n %{count} ngày. (Thiết lập delete_user_max_post_age.) + other: "Không thể xóa tất cả các bài viết, má»™t số bài viết cÅ© hÆ¡n %{count} ngày. (Thiết lập delete_user_max_post_age.)" cant_delete_all_too_many_posts: - other: Không thể xóa tất cả các bài viết do tài khoản có hÆ¡n %{count} bài viết. (delete_all_posts_max) + other: "Không thể xóa tất cả các bài viết do tài khoản có hÆ¡n %{count} bài viết. (delete_all_posts_max)" delete_confirm: "Bạn CHẮC CHẮN muốn xóa thành viên này? Nó là vÄ©nh viá»…n!" delete_and_block: "Xóa và khóa email này và địa chỉ IP" delete_dont_block: "Chỉ xóa" @@ -2517,7 +2495,7 @@ vi: text: "Thiếu mẫu cấp độ huy hiệu, Ä‘iá»u này xảy ra khi truy vấn huy hiệu trả vá» IDs tài khoản hoặc IDs bài viết không tồn tại. Äiá»u này có thể gây ra kết quả bất ngá» sau này - hãy kiểm tra lại truy vấn cá»§a bạn lần nữa." no_grant_count: "Không có huy hiệu nào được gán." grant_count: - other: %{count} huy hiệu đã được gán. + other: "%{count} huy hiệu đã được gán." sample: "Ví dụ:" grant: with: "%{username}" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index f1baf3802c..9ccca859f6 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -42,49 +42,49 @@ zh_CN: tiny: half_a_minute: "1分钟内" less_than_x_seconds: - other: '%{count}秒内' + other: "%{count}秒内" x_seconds: - other: '%{count}ç§’å‰' + other: "%{count}ç§’å‰" less_than_x_minutes: - other: '%{count}分钟内' + other: "%{count}分钟内" x_minutes: - other: '%{count}分钟å‰' + other: "%{count}分钟å‰" about_x_hours: - other: '%{count}å°æ—¶å‰' + other: "%{count}å°æ—¶å‰" x_days: - other: '%{count}天å‰' + other: "%{count}天å‰" x_months: - other: '%{count} 个月' + other: "%{count} 个月" about_x_years: - other: '%{count}年内' + other: "%{count}年内" over_x_years: - other: '%{count}å¹´å‰' + other: "%{count}å¹´å‰" almost_x_years: - other: è¿‘%{count}å¹´ + other: "è¿‘%{count}å¹´" date_month: "MMMDo" date_year: "YYå¹´MMM" medium: x_minutes: - other: '%{count}分钟' + other: "%{count}分钟" x_hours: - other: '%{count}å°æ—¶' + other: "%{count}å°æ—¶" x_days: - other: '%{count}天' + other: "%{count}天" date_year: "YYå¹´MMM" medium_with_ago: x_minutes: - other: '%{count}分钟å‰' + other: "%{count}分钟å‰" x_hours: - other: '%{count}å°æ—¶å‰' + other: "%{count}å°æ—¶å‰" x_days: - other: '%{count}天å‰' + other: "%{count}天å‰" later: x_days: - other: '%{count}天åŽ' + other: "%{count}天åŽ" x_months: - other: '%{count}个月åŽ' + other: "%{count}个月åŽ" x_years: - other: '%{count}å¹´åŽ' + other: "%{count}å¹´åŽ" previous_month: '上个月' next_month: '下个月' placeholder: 日期 @@ -129,6 +129,8 @@ zh_CN: topic_admin_menu: "管ç†ä¸»é¢˜" wizard_required: "欢迎æ¥åˆ°ä½ æ–°å®‰è£…çš„ Discourseï¼è®©æˆ‘们开始设置å‘导✨" emails_are_disabled: "出站邮件已ç»è¢«ç®¡ç†å‘˜å…¨å±€ç¦ç”¨ã€‚å°†ä¸å‘é€ä»»ä½•邮件æé†’。" + bootstrap_mode_enabled: "为方便站点准备å‘布,其正处于åˆå§‹åŒ–模å¼ä¸­ã€‚所有新用户将被授予信任等级1ï¼Œå¹¶ä¸ºä»–ä»¬è®¾ç½®æŽ¥å—æ¯æ—¥é‚®ä»¶æ‘˜è¦ã€‚åˆå§‹åŒ–模å¼ä¼šåœ¨ç”¨æˆ·æ•°è¶…过 %{min_users} 个时关闭。" + bootstrap_mode_disabled: "åˆå§‹åŒ–模å¼å°†ä¼šåœ¨24å°æ—¶åŽå…³é—­ã€‚" themes: default_description: "默认" s3: @@ -142,6 +144,7 @@ zh_CN: eu_central_1: "欧洲(Frankfurt)" eu_west_1: "欧洲(Ireland)" eu_west_2: "欧洲(London)" + eu_west_3: "欧洲(Paris)" sa_east_1: "å—美(Sao Paulo)" us_east_1: "美国东部(N. Virginia)" us_east_2: "美国东部(俄亥俄州)" @@ -165,12 +168,12 @@ zh_CN: show_help: "选项" links: "链接" links_lowercase: - other: 链接 + other: "链接" faq: "常è§é—®é¢˜" guidelines: "指引" privacy_policy: "éšç§æ”¿ç­–" privacy: "éšç§" - terms_of_service: "æœåŠ¡æ¡æ¬¾" + tos: "æœåŠ¡æ¡æ¬¾" mobile_view: "移动版" desktop_view: "桌é¢ç‰ˆ" you: "ä½ " @@ -189,7 +192,7 @@ zh_CN: max_of_count: "ä¸è¶…过 {{count}}" alternation: "或" character_count: - other: '%{count} 个字符' + other: "%{count} 个字符" suggested_topics: title: "推è主题" pm_title: "推èç§ä¿¡" @@ -221,6 +224,12 @@ zh_CN: last_read: "这是你阅读过的最åŽä¸€å¸–;点击收è—" remove: "å–æ¶ˆæ”¶è—" confirm_clear: "ä½ ç¡®å®šè¦æ¸…除该主题的所有收è—å—?" + topic_count_latest: + other: "有 {{count}} 个更新或新主题" + topic_count_unread: + other: "有 {{count}} 个未读主题" + topic_count_new: + other: "有 {{count}} 个新主题" preview: "预览" cancel: "å–æ¶ˆ" save: "ä¿å­˜æ›´æ”¹" @@ -258,14 +267,14 @@ zh_CN: cancel: "å–æ¶ˆ" view_pending: "查看待审核帖å­" has_pending_posts: - other: 这个主题有 {{count}} 个帖å­ç­‰å¾…审核 + other: "这个主题有 {{count}} 个帖å­ç­‰å¾…审核" confirm: "ä¿å­˜æ›´æ”¹" delete_prompt: "你确定è¦åˆ é™¤%{username}å—?这将删除用户的所有帖å­å¹¶å°ç¦è¿™ä¸ªé‚®ç®±å’Œ IP 地å€ã€‚" approval: title: "等待审核中" description: "我们已ç»ä¿å­˜äº†ä½ çš„帖å­ï¼Œä¸è¿‡å¸–å­éœ€è¦ç”±ç®¡ç†å‘˜å…ˆå®¡æ ¸æ‰èƒ½æ˜¾ç¤ºã€‚请è€å¿ƒã€‚" pending_posts: - other: 你有 {{count}} 个帖å­å¾…审核。 + other: "你有 {{count}} 个帖å­å¾…审核。" ok: "确认" user_action: user_posted_topic: "{{user}}å‘起了该主题" @@ -299,7 +308,7 @@ zh_CN: posts_read: "阅读" posts_read_long: "阅读帖å­" total_rows: - other: '%{count} ä½ç”¨æˆ·' + other: "%{count} ä½ç”¨æˆ·" group_histories: actions: change_group_setting: "更改å°ç»„设置" @@ -312,6 +321,9 @@ zh_CN: title: "添加æˆå‘˜" usernames: "用户å" manage: + title: '管ç†' + name: 'åå­—' + full_name: 'å…¨å' add_members: "添加æˆå‘˜" delete_member_confirm: "è¦ä»Žç¾¤ç»„ %{group} 中移除用户 %{username} å—?" profile: @@ -361,15 +373,26 @@ zh_CN: all: "所有群组" empty: "没有å¯è§çš„群组。" filter: "æ ¹æ®ç¾¤ç»„类型筛选" + owner_groups: "拥有的群组" + close_groups: "å°é—­ç¾¤ç»„" + automatic_groups: "自动分组" + automatic: "自动" + closed: "已关闭" public: "公开" private: "ç§å¯†" + public_groups: "公开群组" + automatic_group: 自动群组 + close_group: 关闭群组 my_groups: "我的群组" + group_type: "群组类别" + is_group_user: "æˆå‘˜" is_group_owner: "所有者" title: - other: å°ç»„ + other: "å°ç»„" activity: "活动" members: title: "æˆå‘˜" + filter_placeholder_admin: "ç”¨æˆ·åæˆ–电å­é‚®ä»¶" filter_placeholder: "用户å" remove_member: "移除æˆå‘˜" make_owner: "设为所有者" @@ -433,8 +456,6 @@ zh_CN: reorder: title: "釿–°åˆ†ç±»æŽ’åº" title_long: "釿–°å¯¹åˆ†ç±»åˆ—表进行排åº" - fix_order: "固定排åº" - fix_order_tooltip: "䏿˜¯æ‰€æœ‰åˆ†ç±»éƒ½æœ‰å•独的排åºç¼–å·ï¼Œå¯èƒ½èƒ½ä¼šå¯¼è‡´å‡ºé”™ã€‚" save: "ä¿å­˜æŽ’åº" apply_all: "应用" position: "ä½ç½®" @@ -445,9 +466,9 @@ zh_CN: toggle_ordering: "æŽ’åºæŽ§åˆ¶" subcategories: "å­åˆ†ç±»" topic_sentence: - other: '%{count} 主题' + other: "%{count} 主题" topic_stat_sentence: - other: 在过去一%{unit}中有 %{count} 个新主题。 + other: "在过去一%{unit}中有 %{count} 个新主题。" ip_lookup: title: IP åœ°å€æŸ¥è¯¢ hostname: 主机å @@ -482,6 +503,7 @@ zh_CN: activity_stream: "活动" preferences: "设置" expand_profile: "展开" + collapse_profile: "折å " bookmarks: "æ”¶è—" bio: "我是è°" invited_by: "邀请人" @@ -611,7 +633,6 @@ zh_CN: error: "æäº¤ä¿®æ”¹æ—¶å‡ºé”™äº†" change_username: title: "æ›´æ¢ç”¨æˆ·å" - confirm: "确定更æ¢ç”¨æˆ·å?你的帖å­å’Œ@æåŠä½ çš„引用将失效。" taken: "抱歉,此用户åå·²ç»æœ‰äººä½¿ç”¨äº†ã€‚" invalid: "此用户åä¸åˆæ³•,用户ååªèƒ½åŒ…å«å­—æ¯å’Œæ•°å­—" change_email: @@ -632,7 +653,6 @@ zh_CN: upload_title: "上传图片" upload_picture: "上传图片" image_is_not_a_square: "注æ„ï¼šå›¾ç‰‡ä¸æ˜¯æ­£æ–¹å½¢çš„,我们è£å‰ªäº†éƒ¨åˆ†å›¾åƒã€‚" - cache_notice: "æ›´æ”¹äº†å¤´åƒæˆåŠŸï¼Œä½†æ˜¯é‰´äºŽæµè§ˆå™¨ç¼“å­˜å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´åŽæ‰ä¼šç”Ÿæ•ˆã€‚" change_profile_background: title: "个人档背景" instructions: "显示在个人资料页é¢ä¸­ï¼Œä¸Šä¼ çš„图片将被居中且默认宽度为 850px。" @@ -647,7 +667,7 @@ zh_CN: authenticated: "邮箱已ç»ç”± {{provider}} 验è¯äº†ã€‚" frequency_immediately: "如果你没有阅读过摘è¦é‚®ä»¶ä¸­çš„相关内容,将立å³å‘é€ç”µå­é‚®ä»¶ç»™ä½ ã€‚" frequency: - other: 仅在 {{count}} 分钟内没有访问时å‘é€é‚®ä»¶ç»™ä½ ã€‚ + other: "仅在 {{count}} 分钟内没有访问时å‘é€é‚®ä»¶ç»™ä½ ã€‚" name: title: "昵称" instructions: "你的全å(å¯é€‰ï¼‰" @@ -732,7 +752,7 @@ zh_CN: user: "邀请用户" sent: "å·²å‘é€" truncated: - other: åªæ˜¾ç¤ºå‰ {{count}} 个邀请。 + other: "åªæ˜¾ç¤ºå‰ {{count}} 个邀请。" redeemed: "确认邀请" redeemed_tab: "已确认" redeemed_tab_with_count: "已确认({{count}})" @@ -779,21 +799,21 @@ zh_CN: time_read: "阅读时间" recent_time_read: "最近阅读时间" topic_count: - other: 创建主题 + other: "创建主题" post_count: - other: å‘è¡¨å¸–å­ + other: "å‘表帖å­" likes_given: - other: é€å‡º + other: "é€å‡º" likes_received: - other: 收到 + other: "收到" days_visited: - other: 访问天数 + other: "访问天数" topics_entered: - other: 已阅主题 + other: "已阅主题" posts_read: - other: é˜…è¯»å¸–å­ + other: "阅读帖å­" bookmark_count: - other: æ”¶è— + other: "æ”¶è—" top_replies: "热门回å¤" no_replies: "暂无回å¤ã€‚" more_replies: "更多回å¤" @@ -809,7 +829,6 @@ zh_CN: most_liked_users: "èµžè°æœ€å¤š" most_replied_to_users: "最多回å¤è‡³" no_likes: "暂无赞。" - associated_accounts: "登录" ip_address: title: "最åŽä½¿ç”¨çš„ IP 地å€" registration_ip_address: @@ -861,7 +880,7 @@ zh_CN: reached: "%{relativeAge} – %{rate} 达到了站点设置中的 %{siteSettingRate}。" exceeded: "[%{relativeAge}] ç›®å‰çš„错误率 %{rate} 已超出了站点设置中的 %{siteSettingRate}。" rate: - other: '%{count} 错误/%{duration}' + other: "%{count} 错误/%{duration}" learn_more: "了解更多..." all_time: '总é‡' all_time_desc: '创建的主题总é‡' @@ -888,8 +907,6 @@ zh_CN: hide_session: "明天æé†’我" hide_forever: "ä¸äº†" hidden_for_session: "好的,我会在明天æé†’你。ä¸è¿‡ä½ éšæ—¶éƒ½å¯ä»¥ä½¿ç”¨â€œç™»å½•â€æ¥åˆ›å»ºè´¦æˆ·ã€‚" - intro: "嘿ï¼:heart_eyes: 看æ¥ä½ å¾ˆæ¬£èµè¯¥è®¨è®ºï¼Œä½†ä½ æ²¡æœ‰æ³¨å†Œå¸å·ã€‚" - value_prop: "当你创建了å¸å·ï¼Œæˆ‘们就å¯ä»¥å‡†ç¡®åœ°è®°å½•ä½ çš„é˜…è¯»è¿›åº¦ã€‚è¿™æ ·ä½ å†æ¬¡è®¿é—®æ—¶å°±å¯ä»¥å›žåˆ°ä¸Šæ¬¡ç¦»å¼€çš„地方。你也å¯ä»¥é€‰æ‹©æŽ¥å—新帖通知或者邮件。而且你还å¯ä»¥èµžå¸–å­ï¼Œå‘他人分享感激之情。:heartbeat:" summary: enabled_description: "你正在查看主题的精简摘è¦ç‰ˆæœ¬ï¼šä¸€äº›ç¤¾åŒºå…¬è®¤æœ‰æ„æ€çš„帖å­ã€‚" description: "有 {{replyCount}} 个回å¤ã€‚" @@ -903,7 +920,6 @@ zh_CN: disable: "显示已删除的帖å­" private_message_info: title: "ç§ä¿¡" - invite: "邀请其他人..." leave_message: "你真的想è¦å‘逿¶ˆæ¯ä¹ˆï¼Ÿ" remove_allowed_user: "确定将 {{name}} 从本æ¡ç§ä¿¡ä¸­ç§»é™¤ï¼Ÿ" remove_allowed_group: "确定将 {{name}} 从本æ¡ç§ä¿¡ä¸­ç§»é™¤ï¼Ÿ" @@ -932,14 +948,20 @@ zh_CN: help: "没收到邮件?请先查看你的垃圾邮件文件夹。

ä¸ç¡®å®šä½¿ç”¨äº†å“ªä¸ªé‚®ç®±åœ°å€ï¼Ÿè¾“å…¥é‚®ç®±åœ°å€æ¥æŸ¥çœ‹æ˜¯å¦å­˜åœ¨ã€‚

如果你已无法进入你账å·çš„邮箱,请è”系我们的工作人员。

" button_ok: "OK" button_help: "帮助" + email_login: + link_label: "给我通过邮件å‘é€ä¸€ä¸ªç™»å½•链接" + button_label: "通过邮件" login: title: "登录" username: "用户" password: "密ç " + second_factor_title: "åŒé‡éªŒè¯" + second_factor_description: "请输入æ¥è‡ª app 的验è¯ç ï¼š" email_placeholder: "电å­é‚®ä»¶æˆ–者用户å" caps_lock_warning: "大写é”定开å¯" error: "出错了" rate_limit: "请请ç¨åŽå†é‡è¯•" + blank_username: "è¯·è¾“å…¥ä½ çš„é‚®ä»¶åœ°å€æˆ–用户å。" blank_username_or_password: "è¯·è¾“å…¥ä½ çš„é‚®ä»¶åœ°å€æˆ–用户å,以åŠå¯†ç ã€‚" reset_password: 'é‡ç½®å¯†ç ' logging_in: "登录中..." @@ -952,6 +974,7 @@ zh_CN: not_allowed_from_ip_address: "你使用的 IP 地å€å·²è¢«å°ç¦ã€‚" admin_not_allowed_from_ip_address: "ä½ ä¸èƒ½ä»Žè¿™ä¸ª IP 地å€ä»¥ç®¡ç†å‘˜èº«ä»½ç™»å½•。" resend_activation_email: "ç‚¹å‡»æ­¤å¤„é‡æ–°å‘逿¿€æ´»é‚®ä»¶ã€‚" + omniauth_disallow_totp: "您的账户已å¯ç”¨åŒé‡éªŒè¯ï¼Œè¯·ä½¿ç”¨å¯†ç ç™»å½•。" resend_title: "é‡å‘激活邮件" change_email: "更改邮件地å€" provide_new_email: "给个新地å€ï¼ç„¶åŽæˆ‘们会å†ç»™ä½ å‘一å°ç¡®è®¤é‚®ä»¶ã€‚" @@ -961,9 +984,6 @@ zh_CN: preferences: "需è¦ç™»å…¥åŽæ›´æ”¹è®¾ç½®" forgot: "æˆ‘è®°ä¸æ¸…å¸å·è¯¦æƒ…了" not_approved: "ä½ çš„å¸å·è¿˜æœªé€šè¿‡å®¡æ ¸ã€‚一旦审核通过,我们将邮件通知你。" - google: - title: "Google 登录" - message: "正在通过 Google å¸å·éªŒè¯ç™»å½•ï¼ˆè¯·ç¡®ä¿æµè§ˆå™¨æ²¡æœ‰ç¦æ­¢å¼¹å‡ºçª—å£ï¼‰" google_oauth2: title: "Google 登录" message: "正在通过 Google å¸å·éªŒè¯ç™»å½•ï¼ˆè¯·ç¡®ä¿æµè§ˆå™¨æ²¡æœ‰ç¦æ­¢å¼¹å‡ºçª—å£ï¼‰" @@ -1007,14 +1027,19 @@ zh_CN: categories_only: "仅分类" categories_with_featured_topics: "有推è主题的分类" categories_and_latest_topics: "分类和最新主题" + categories_and_top_topics: "分类和最热主题" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' alt: 'Alt' + conditional_loading_section: + loading: 载入中…… select_kit: default_header_text: 选择... no_content: 无符åˆçš„结果 filter_placeholder: æœç´¢â€¦â€¦ + max_content_reached: + other: "您åªèƒ½é€‰æ‹© {{count}} æ¡è®°å½•。" emoji_picker: filter_placeholder: æŸ¥æ‰¾è¡¨æƒ…ç¬¦å· people: 人物 @@ -1032,6 +1057,8 @@ zh_CN: medium_tone: 中间肤色 medium_dark_tone: 中深肤色 dark_tone: 深肤色 + shared_drafts: + title: "共享è‰ç¨¿" composer: emoji: "Emoji :)" more_emoji: "更多…" @@ -1049,7 +1076,7 @@ zh_CN: similar_topics: "你的主题有点类似于..." drafts_offline: "离线è‰ç¨¿" group_mentioned: - other: æåŠ {{group}} 时,你将通知 {{count}} 人 ï¼ ç¡®å®šå—? + other: "æåŠ {{group}} 时,你将通知 {{count}} 人 ï¼ ç¡®å®šå—?" cannot_see_mention: category: "ä½ æåˆ°äº† {{username}} ,然而他们ä¸èƒ½è®¿é—®è¯¥åˆ†ç±»ï¼Œæ‰€ä»¥ä»–们ä¸ä¼šè¢«é€šçŸ¥ã€‚ä½ éœ€è¦æŠŠä»–ä»¬åŠ å…¥åˆ°èƒ½è®¿é—®è¯¥åˆ†ç±»çš„ç¾¤ç»„ä¸­ã€‚" private: "ä½ æåˆ°äº†{{userrname}},然而他们ä¸èƒ½è®¿é—®è¯¥ç§ä¿¡ï¼Œæ‰€ä»¥ä»–们ä¸ä¼šè¢«é€šçŸ¥ã€‚你需è¦é‚€è¯·ä»–们至ç§ä¿¡ä¸­ã€‚" @@ -1120,14 +1147,27 @@ zh_CN: body: "ç›®å‰è¯¥ç§ä¿¡åªå‘给了你自己ï¼" admin_options_title: "本主题å¯é€‰è®¾ç½®" composer_actions: + reply: å›žå¤ + draft: è‰ç¨¿ + edit: 编辑 + reply_as_new_topic: + label: 回å¤ä¸ºè”结主题 + desc: 创建一个新主题链接到这一主题 + reply_as_private_message: + label: æ–°æ¶ˆæ¯ + desc: 新建一个ç§ä¿¡ + reply_to_topic: + label: 回å¤ä¸»é¢˜ + create_topic: + label: "新主题" shared_draft: label: "共享è‰ç¨¿" notifications: tooltip: regular: - other: '{{count}} 个未读通知' + other: "{{count}} 个未读通知" message: - other: '{{count}} æ¡æœªè¯»ç§ä¿¡' + other: "{{count}} æ¡æœªè¯»ç§ä¿¡" title: "使用@æåˆ°ä½ ï¼Œå›žå¤ä½ çš„内容ã€ç§ä¿¡ä»¥åŠå…¶ä»–的通知" none: "现在无法载入通知" empty: "未å‘现通知" @@ -1142,7 +1182,7 @@ zh_CN: liked: "{{username}} {{description}}" liked_2: "{{username}}, {{username2}} {{description}}" liked_many: - other: {{username}}, {{username2}} 和其他 {{count}} 人 {{description}} + other: "{{username}}, {{username2}} 和其他 {{count}} 人 {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "

{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1153,7 +1193,7 @@ zh_CN: topic_reminder: "{{username}} {{description}}" watching_first_post: "新主题 {{description}}" group_message_summary: - other: '{{count}} æ¡ç§ä¿¡åœ¨{{group_name}}组的收件箱中' + other: "{{count}} æ¡ç§ä¿¡åœ¨{{group_name}}组的收件箱中" popup: mentioned: '{{username}}在“{{topic}}â€æåˆ°äº†ä½  - {{site_title}}' group_mentioned: '{{username}}在“{{topic}}â€æåˆ°äº†ä½  - {{site_title}}' @@ -1188,6 +1228,7 @@ zh_CN: clear_all: "清除所有" too_short: "ä½ çš„æœç´¢è¯å¤ªçŸ­ã€‚" title: "æœç´¢ä¸»é¢˜ã€å¸–å­ã€ç”¨æˆ·æˆ–分类" + full_page_title: "æœç´¢ä¸»é¢˜æˆ–帖å­" no_results: "没有找到结果。" no_more_results: "没有找到更多结果。" searching: "æœç´¢ä¸­..." @@ -1275,7 +1316,7 @@ zh_CN: notification_level: "通知" choose_new_category: "选择新分类:" selected: - other: 已选择 {{count}}个主题 + other: "已选择 {{count}}个主题" change_tags: "æ›¿æ¢æ ‡ç­¾" append_tags: "添加标签" choose_new_tags: "为主题选择新标签:" @@ -1308,7 +1349,7 @@ zh_CN: search: "没有更多æœç´¢ç»“果了。" topic: filter_to: - other: 本主题中的 {{count}} 帖 + other: "本主题中的 {{count}} 帖" create: '呿–°ä¸»é¢˜' create_long: '创建新的主题' open_draft: "打开è‰ç¨¿" @@ -1319,6 +1360,8 @@ zh_CN: move_to_inbox: title: '移动到收件箱' help: '移动ç§ä¿¡åˆ°æ”¶ä»¶ç®±' + edit_message: + title: '编辑消æ¯' list: '主题' new: '近期主题' unread: '未读' @@ -1338,13 +1381,13 @@ zh_CN: title: "未找到主题" description: "抱歉,无法找到此主题。å¯èƒ½å·²ç»è¢«åˆ é™¤äº†ã€‚" total_unread_posts: - other: 这个主题中,你有 {{count}} æ¡æœªè¯»çš„å¸–å­ + other: "这个主题中,你有 {{count}} æ¡æœªè¯»çš„帖å­" unread_posts: - other: 这个主题中,你有 {{count}} æ¡æœªè¯»çš„å¸–å­ + other: "这个主题中,你有 {{count}} æ¡æœªè¯»çš„帖å­" new_posts: - other: 自你上一次阅读此主题åŽï¼Œåˆæœ‰ {{count}} 个新帖å­å‘表了 + other: "自你上一次阅读此主题åŽï¼Œåˆæœ‰ {{count}} 个新帖å­å‘表了" likes: - other: 本主题已得到 {{number}} 个赞 + other: "本主题已得到 {{number}} 个赞" back_to_list: "返回列表" options: "主题选项" show_links: "显示此主题中的链接" @@ -1408,7 +1451,7 @@ zh_CN: auto_reminder: "你将在%{timeLeft}åŽæ”¶åˆ°è¯¥ä¸»é¢˜çš„æé†’。" auto_close_title: '自动关闭设置' auto_close_immediate: - other: 主题中的最åŽä¸€å¸–是 %{hours} å°æ—¶å‰å‘出的,所以主题将会立å³å…³é—­ã€‚ + other: "主题中的最åŽä¸€å¸–是 %{hours} å°æ—¶å‰å‘出的,所以主题将会立å³å…³é—­ã€‚" timeline: back: "返回" back_description: "回到最åŽä¸€ä¸ªæœªè¯»å¸–å­" @@ -1483,6 +1526,7 @@ zh_CN: visible: "å–æ¶ˆéšè—主题" reset_read: "é‡ç½®é˜…读数æ®" make_public: "设置为公共主题" + make_private: "设置为ç§ä¿¡" feature: pin: "置顶主题" unpin: "å–æ¶ˆç½®é¡¶ä¸»é¢˜" @@ -1515,7 +1559,7 @@ zh_CN: pin_validation: "置顶该主题需è¦ä¸€ä¸ªæ—¥æœŸã€‚" not_pinned: "{{categoryLink}}没有置顶主题。" already_pinned: - other: '{{categoryLink}}分类的置顶主题数:{{count}}' + other: "{{categoryLink}}分类的置顶主题数:{{count}}" pin_globally: "将主题置于所有主题列表最上方至" confirm_pin_globally: "已有{{count}}个全局置顶主题。太多的置顶主题å¯èƒ½ä¼šå›°æ‰°æ–°ç”¨æˆ·å’Œè®¿å®¢ã€‚确定想å†å…¨å±€ç½®é¡¶ä¸€ä¸ªä¸»é¢˜ï¼Ÿ" unpin_globally: "将主题从所有主题列表的最上方移除。" @@ -1523,7 +1567,7 @@ zh_CN: global_pin_note: "å…è®¸ç”¨æˆ·å–æ¶ˆå…¨å±€ç½®é¡¶ã€‚" not_pinned_globally: "没有全局置顶的主题。" already_pinned_globally: - other: 全局置顶的主题数:{{count}} + other: "全局置顶的主题数:{{count}}" make_banner: "将主题设置为出现在所有页é¢é¡¶ç«¯çš„æ¨ªå¹…主题。" remove_banner: "移除所有页é¢é¡¶ç«¯çš„æ¨ªå¹…主题。" banner_note: "用户能点击关闭éšè—横幅。且åªèƒ½è®¾ç½®ä¸€ä¸ªæ¨ªå¹…主题。" @@ -1560,7 +1604,7 @@ zh_CN: login_reply: '登录以回å¤' filters: n_posts: - other: '{{count}} 个帖å­' + other: "{{count}} 个帖å­" cancel: "å–æ¶ˆè¿‡æ»¤" split_topic: title: "拆分主题" @@ -1568,13 +1612,13 @@ zh_CN: topic_name: "新主题å" error: "拆分主题时å‘生错误。" instructions: - other: 你将创建一个新的主题,并包å«ä½ é€‰æ‹©çš„ {{count}} 个帖å­ã€‚ + other: "你将创建一个新的主题,并包å«ä½ é€‰æ‹©çš„ {{count}} 个帖å­ã€‚" merge_topic: title: "åˆå¹¶ä¸»é¢˜" action: "åˆå¹¶ä¸»é¢˜" error: "åˆå¹¶ä¸»é¢˜æ—¶å‘生错误。" instructions: - other: 请选择一个主题以便移动这 {{count}} 个帖å­ã€‚ + other: "请选择一个主题以便移动这 {{count}} 个帖å­ã€‚" merge_posts: title: "åˆå¹¶é€‰æ‹©çš„帖å­" action: "åˆå¹¶é€‰æ‹©çš„帖å­" @@ -1586,7 +1630,7 @@ zh_CN: label: "帖å­çš„æ–°ä½œè€…" placeholder: "新作者的用户å" instructions: - other: 请选择{{old_user}}创建的 {{count}} 个帖å­çš„æ–°ä½œè€…。 + other: "请选择{{old_user}}创建的 {{count}} 个帖å­çš„æ–°ä½œè€…。" change_timestamp: title: "修改时间" action: "修改时间" @@ -1609,7 +1653,7 @@ zh_CN: select_all: 全选 deselect_all: å…¨ä¸é€‰ description: - other: 已选择 {{count}} 个帖å­ã€‚ + other: "已选择 {{count}} 个帖å­ã€‚" post: quote_reply: "引用" edit: " {{link}} {{replyAvatar}} {{username}}" @@ -1624,21 +1668,21 @@ zh_CN: show_full: "显示所有帖å­" show_hidden: '查看éšè—内容' deleted_by_author: - other: (帖å­è¢«ä½œè€…删除,如无标记将在 %{count} å°æ—¶åŽè‡ªåŠ¨åˆ é™¤ï¼‰ + other: "(帖å­è¢«ä½œè€…删除,如无标记将在 %{count} å°æ—¶åŽè‡ªåŠ¨åˆ é™¤ï¼‰" collapse: "折å " expand_collapse: "展开/折å " gap: - other: 查看 {{count}} 个éšè—å›žå¤ + other: "查看 {{count}} 个éšè—回å¤" unread: "未读帖å­" has_replies: - other: '{{count}} 回å¤' + other: "{{count}} 回å¤" has_likes: - other: '{{count}} 赞' + other: "{{count}} 赞" has_likes_title: - other: '{{count}} 人赞了该贴' + other: "{{count}} 人赞了该贴" has_likes_title_only_you: "你赞了该贴" has_likes_title_you: - other: 你和其他 {{count}} 人赞了该贴 + other: "你和其他 {{count}} 人赞了该贴" errors: create: "æŠ±æ­‰ï¼Œåœ¨åˆ›å»ºä½ çš„å¸–å­æ—¶å‘生了错误。请é‡è¯•。" edit: "æŠ±æ­‰ï¼Œåœ¨ç¼–è¾‘ä½ çš„å¸–å­æ—¶å‘生了错误。请é‡è¯•。" @@ -1692,14 +1736,13 @@ zh_CN: actions: flag: '标记' defer_flags: - other: 忽略标记 + other: "忽略标记" undo: off_topic: "撤回标记" spam: "撤回标记" inappropriate: "撤回标记" bookmark: "å–æ¶ˆæ”¶è—" like: "å–æ¶ˆèµž" - vote: "撤销投票" people: off_topic: "标记为å离主题" spam: "标记为垃圾信æ¯" @@ -1709,8 +1752,7 @@ zh_CN: bookmark: "æ”¶è—" like: "赞了它" like_capped: - other: 和其他 {{count}} 人赞了它 - vote: "已投票" + other: "和其他 {{count}} 人赞了它" by_you: off_topic: "你标记其å离主题" spam: "你标记其为垃圾信æ¯" @@ -1719,44 +1761,39 @@ zh_CN: notify_user: "ä½ å·²ç»é€šçŸ¥äº†è¯¥ç”¨æˆ·" bookmark: "你以收è—了该帖" like: "你赞了它" - vote: "你已投票" by_you_and_others: off_topic: - other: 你和其他 {{count}} 人标记其å离主题 + other: "你和其他 {{count}} 人标记其å离主题" spam: - other: 你和其他 {{count}} äººæ ‡è®°å…¶ä¸ºåžƒåœ¾ä¿¡æ¯ + other: "你和其他 {{count}} 人标记其为垃圾信æ¯" inappropriate: - other: 你和其他 {{count}} äººæ ‡è®°å…¶ä¸ºä¸æ°å½“的言辞 + other: "你和其他 {{count}} äººæ ‡è®°å…¶ä¸ºä¸æ°å½“的言辞" notify_moderators: - other: 你和其他 {{count}} äººæ ‡è®°äº†æœ¬å¸–è¦æ±‚管ç†äººå‘˜å¤„ç† + other: "你和其他 {{count}} äººæ ‡è®°äº†æœ¬å¸–è¦æ±‚管ç†äººå‘˜å¤„ç†" notify_user: - other: 你和其他 {{count}} 人å‘了ç§ä¿¡ç»™è¯¥ç”¨æˆ· + other: "你和其他 {{count}} 人å‘了ç§ä¿¡ç»™è¯¥ç”¨æˆ·" bookmark: - other: 你和其他 {{count}} 人收è—äº†è¿™ä¸ªå¸–å­ + other: "你和其他 {{count}} 人收è—了这个帖å­" like: - other: 你和其他 {{count}} 人赞了它 - vote: - other: 你和其他 {{count}} 人已投票 + other: "你和其他 {{count}} 人赞了它" by_others: off_topic: - other: '{{count}} 人标记其å离主题' + other: "{{count}} 人标记其å离主题" spam: - other: '{{count}} 人标记其为垃圾信æ¯' + other: "{{count}} 人标记其为垃圾信æ¯" inappropriate: - other: '{{count}} äººæ ‡è®°å…¶ä¸ºä¸æ°å½“的言辞' + other: "{{count}} äººæ ‡è®°å…¶ä¸ºä¸æ°å½“的言辞" notify_moderators: - other: '{{count}} äººæ ‡è®°æœ¬å¸–è¦æ±‚管ç†äººå‘˜å¤„ç†' + other: "{{count}} äººæ ‡è®°æœ¬å¸–è¦æ±‚管ç†äººå‘˜å¤„ç†" notify_user: - other: '{{count}} 人给这个用户å‘é€äº†ç§ä¿¡' + other: "{{count}} 人给这个用户å‘é€äº†ç§ä¿¡" bookmark: - other: '{{count}} 人收è—了这个帖å­' + other: "{{count}} 人收è—了这个帖å­" like: - other: '{{count}} 人赞了它' - vote: - other: '{{count}} 人已投票' + other: "{{count}} 人赞了它" merge: confirm: - other: 确定è¦åˆå¹¶è¿™ {{count}} 个帖å­å—? + other: "确定è¦åˆå¹¶è¿™ {{count}} 个帖å­å—?" revisions: controls: first: "第一版" @@ -1794,7 +1831,6 @@ zh_CN: can: '能够… ' none: '(未分类)' all: '所有分类' - choose: '选择分类…' edit: '编辑' edit_long: "编辑" view: 'æµè§ˆåˆ†ç±»çš„主题' @@ -1842,7 +1878,6 @@ zh_CN: show_subcategory_list: "在这个分类中把å­åˆ†ç±»åˆ—表显示在主题的上é¢" num_featured_topics: "分类页é¢ä¸Šæ˜¾ç¤ºçš„主题数é‡ï¼š" subcategory_num_featured_topics: "父分类页é¢ä¸Šçš„æŽ¨è主题数é‡ï¼š" - all_topics_wiki: "默认将新主题设为维基主题" subcategory_list_style: "å­åˆ†ç±»åˆ—表样å¼ï¼š" sort_order: "列表样å¼ï¼ŒæŒ‰æŽ’åºï¼š" default_view: "默认主题列表:" @@ -1851,7 +1886,6 @@ zh_CN: edit_permissions: "编辑æƒé™" add_permission: "添加æƒé™" this_year: "今年" - position: "ä½ç½®" default_position: "默认ä½ç½®" position_disabled: "åˆ†ç±»æŒ‰ç…§å…¶æ´»è·ƒç¨‹åº¦çš„é¡ºåºæ˜¾ç¤ºã€‚è¦å›ºå®šåˆ†ç±»åˆ—表的显示顺åºï¼Œ" position_disabled_click: 'å¯ç”¨â€œå›ºå®šåˆ†ç±»ä½ç½®â€è®¾ç½®ã€‚' @@ -1912,11 +1946,11 @@ zh_CN: custom_placeholder_notify_moderators: "让我们知é“你关心地是什么,并尽å¯èƒ½åœ°æä¾›ç›¸å…³é“¾æŽ¥å’Œä¾‹å­ã€‚" custom_message: at_least: - other: 输入至少 {{count}} 个字符 + other: "输入至少 {{count}} 个字符" more: - other: 还差 {{count}} 个... + other: "还差 {{count}} 个..." left: - other: 剩余 {{count}} + other: "剩余 {{count}}" flagging_topic: title: "感谢你帮助我们建设文明社区ï¼" action: "标记帖å­" @@ -1927,11 +1961,11 @@ zh_CN: links_title: "热门链接" links_shown: "显示更多链接..." clicks: - other: '%{count} 次点击' + other: "%{count} 次点击" post_links: about: "为本帖展开更多链接" title: - other: '%{count} 更多' + other: "%{count} 更多" topic_statuses: warning: help: "这是一个正å¼çš„警告。" @@ -1965,18 +1999,18 @@ zh_CN: original_post: "原始帖" views: "æµè§ˆ" views_lowercase: - other: æµè§ˆ + other: "æµè§ˆ" replies: "回å¤" views_long: - other: 本主题已ç»è¢«æµè§ˆè¿‡ {{number}} 次 + other: "本主题已ç»è¢«æµè§ˆè¿‡ {{number}} 次" activity: "活动" likes: "赞" likes_lowercase: - other: 赞 + other: "赞" likes_long: "本主题已有 {{number}} 次赞" users: "用户" users_lowercase: - other: 用户 + other: "用户" category_title: "分类" history: "历å²" changed_by: "ç”± {{author}}" @@ -1990,7 +2024,7 @@ zh_CN: latest: title: "最新" title_with_count: - other: 最新({{count}}) + other: "最新({{count}})" help: "有了新帖的活动主题" hot: title: "热门" @@ -2008,17 +2042,17 @@ zh_CN: unread: title: "未读" title_with_count: - other: 未读({{count}}) + other: "未读({{count}})" help: "ä½ ç›®å‰ç›‘看或跟踪有了未读帖å­çš„主题" lower_title_with_count: - other: '{{count}} 未读' + other: "{{count}} 未读" new: lower_title_with_count: - other: '{{count}} 近期' + other: "{{count}} 近期" lower_title: "近期" title: "近期" title_with_count: - other: 近期({{count}}) + other: "近期({{count}})" help: "最近几天里创建的主题" posted: title: "我的帖å­" @@ -2029,7 +2063,7 @@ zh_CN: category: title: "{{categoryName}}" title_with_count: - other: '{{categoryName}}({{count}})' + other: "{{categoryName}}({{count}})" help: "{{categoryName}}分类中热门的主题" top: title: "热门" @@ -2114,18 +2148,18 @@ zh_CN: print: 'ctrl+p 打å°ä¸»é¢˜' badges: earned_n_times: - other: 授予徽章 %{count} 次 + other: "授予徽章 %{count} 次" granted_on: "授予于%{date}" others_count: "其他有该徽章的人(%{count})" title: 徽章 allow_title: "ä½ å¯ä»¥å°†è¯¥å¾½ç« è®¾ä¸ºå¤´è¡”" multiple_grant: "å¯å¤šæ¬¡èµ¢å¾—" badge_count: - other: '%{count} Badges' + other: "%{count} Badges" more_badges: - other: +%{count} 更多 + other: "+%{count} 更多" granted: - other: '%{count} 授予' + other: "%{count} 授予" select_badge_for_title: 选择一个徽章作为你的头衔使用 badge_grouping: getting_started: @@ -2156,7 +2190,7 @@ zh_CN: choose_for_topic: "å¯é€‰æ ‡ç­¾" delete_tag: "删除标签" delete_confirm: - other: 你确定你想è¦åˆ é™¤è¿™ä¸ªæ ‡ç­¾ä»¥åŠæ’¤é”€åœ¨{{count}}个主题中的关è”么? + other: "你确定你想è¦åˆ é™¤è¿™ä¸ªæ ‡ç­¾ä»¥åŠæ’¤é”€åœ¨{{count}}个主题中的关è”么?" delete_confirm_no_topics: "你确定你想è¦åˆ é™¤è¿™ä¸ªæ ‡ç­¾å—?" rename_tag: "é‡å‘½å标签" rename_instructions: "标签的新å称:" @@ -2285,6 +2319,7 @@ zh_CN: moderation_history: "ç®¡ç†æ—¥å¿—" agree: "确认标记" agree_title: "确认这个标记有效且正确" + agree_flag_hide_post: "éšè—帖å­" agree_flag_hide_post_title: "éšè—帖å­å¹¶è‡ªåЍå‘é€ç§ä¿¡ç»™ä½œè€…使其修改" agree_flag_restore_post: "确认并æ¢å¤å¸–å­" agree_flag_restore_post_title: "æ¢å¤å¸–å­ä¸ºæ‰€æœ‰ç”¨æˆ·å¯è§ã€‚" @@ -2292,7 +2327,9 @@ zh_CN: agree_flag_suspend_title: "åŒæ„标记并暂åœç”¨æˆ·ã€‚" agree_flag_silence: "ç¦è¨€ç”¨æˆ·" agree_flag_silence_title: "åŒæ„标记并ç¦è¨€ç”¨æˆ·ã€‚" + agree_flag: "ä¿æŒå¸–å­" agree_flag_title: "ç¡®è®¤æ ‡è®°å¹¶ä¿æŒå¸–å­ä¸å˜ã€‚" + ignore_flag: "忽略" delete: "删除" delete_title: "删除标记指å‘的帖å­ã€‚" delete_post_defer_flag: "删除帖å­å¹¶å¿½ç•¥æ ‡è®°" @@ -2343,6 +2380,12 @@ zh_CN: groups: new: title: "新建群组" + create: "创建" + manage: + interaction: + email: 邮箱 + membership: + trust_levels_none: "æ— " primary: "主è¦ç¾¤ç»„" no_primary: "(无主è¦ç¾¤ç»„)" title: "群组" @@ -2426,9 +2469,9 @@ zh_CN: none: "没有相关事件。" redeliver: "釿–°å‘é€" incoming: - other: 有 {{count}} 个新事件。 + other: "有 {{count}} 个新事件。" completed_in: - other: 在 {{count}} 秒内完æˆã€‚ + other: "在 {{count}} 秒内完æˆã€‚" request: "请求" response: "回应" redeliver_confirm: "你确定è¦å†æ¬¡å‘é€ä¸€æ ·çš„内容å—?" @@ -2582,7 +2625,6 @@ zh_CN: import_file_tip: ".dcstyle.json 文件包å«ä¸»é¢˜" about_theme: "关于主题" license: "许å¯è¯" - component_of: "主题是其组件:" update_to_latest: "更新到最新" check_for_updates: "检查更新" updating: "æ›´æ–°..." @@ -2591,7 +2633,7 @@ zh_CN: theme_settings: "主题设置" no_settings: "这个主题内没有设置" commits_behind: - other: 主题è½åŽäº† {{count}} ä¸ªå˜æ›´ï¼ + other: "主题è½åŽäº† {{count}} ä¸ªå˜æ›´ï¼" scss: text: "CSS" title: "输入自定义 CSSï¼Œæˆ‘ä»¬æŽ¥å—æ‰€æœ‰æœ‰æ•ˆçš„ CSS å’Œ SCSS æ ·å¼" @@ -2723,7 +2765,6 @@ zh_CN: address_placeholder: "name@example.com" type_placeholder: "摘è¦ã€æ³¨å†Œâ€¦" reply_key_placeholder: "回å¤é”®" - skipped_reason_placeholder: "原因" moderation_history: performed_by: "执行由" no_results: "暂无管ç†åކå²ã€‚" @@ -2814,6 +2855,10 @@ zh_CN: check_personal_message: "检查个人信æ¯" disabled_second_factor: "åœç”¨åŒé‡éªŒè¯" topic_published: "帖å­å·²å‘布" + create_badge: "创建徽章" + change_badge: "æ›´æ¢å¾½ç« " + delete_badge: "删除徽章" + merge_user: "åˆå¹¶ç”¨æˆ·" screened_emails: title: "被å±è”½çš„邮件地å€" description: "å½“æœ‰äººè¯•å›¾ç”¨ä»¥ä¸‹é‚®ä»¶åœ°å€æ³¨å†Œæ—¶ï¼Œå°†å—到阻止或其它系统æ“作。" @@ -2863,7 +2908,7 @@ zh_CN: clear_filter: "清除" show_words: "æ˜¾ç¤ºæ•æ„Ÿè¯" word_count: - other: '%{count}ä¸ªæ•æ„Ÿè¯' + other: "%{count}ä¸ªæ•æ„Ÿè¯" actions: block: 'å°ç¦' censor: '审查' @@ -2880,6 +2925,7 @@ zh_CN: placeholder_regexp: "正则表达å¼" add: '新增' success: 'æˆåŠŸ' + exists: '已存在' upload: "上传" upload_successful: "上传æˆåŠŸã€‚æ•æ„Ÿè¯å·²æ·»åŠ ã€‚" impersonate: @@ -2905,9 +2951,9 @@ zh_CN: suspect: '怀疑' approved: "已批准?" approved_selected: - other: 审核通过用户({{count) + other: "审核通过用户({{count)" reject_selected: - other: 审核拒ç»ç”¨æˆ·ï¼ˆ{{count}}) + other: "审核拒ç»ç”¨æˆ·ï¼ˆ{{count}})" titles: active: '已激活用户' new: '新用户' @@ -2924,9 +2970,9 @@ zh_CN: suspended: '被ç¦ç”¨æˆ·' suspect: '嫌疑用户' reject_successful: - other: æˆåŠŸæ‹’ç» %{count} 个用户。 + other: "æˆåŠŸæ‹’ç» %{count} 个用户。" reject_failures: - other: æˆåŠŸæ‹’ç» %{count} 个用户。 + other: "æˆåŠŸæ‹’ç» %{count} 个用户。" not_verified: "未验è¯" check_email: title: "显示用户电å­é‚®ä»¶" @@ -3007,14 +3053,15 @@ zh_CN: delete_forbidden_because_staff: "ä¸èƒ½åˆ é™¤ç®¡ç†å‘˜å’Œç‰ˆä¸»ã€‚" delete_posts_forbidden_because_staff: "ä¸èƒ½å®Œå…¨åˆ é™¤ç®¡ç†å‘˜å’Œç‰ˆä¸»çš„帖å­ã€‚" delete_forbidden: - other: 用户如果有帖å­å°†ä¸èƒ½åˆ é™¤ã€‚在试图å°è¯•删除一个用户å‰åˆ é™¤æ‰€æœ‰çš„帖å­ï¼ˆ%{count} 天å‰çš„帖å­ä¸èƒ½è¢«åˆ é™¤ï¼‰ + other: "用户如果有帖å­å°†ä¸èƒ½åˆ é™¤ã€‚在试图å°è¯•删除一个用户å‰åˆ é™¤æ‰€æœ‰çš„帖å­ï¼ˆ%{count} 天å‰çš„帖å­ä¸èƒ½è¢«åˆ é™¤ï¼‰" cant_delete_all_posts: - other: ä¸èƒ½åˆ é™¤æ‰€æœ‰å¸–å­ã€‚一些帖å­å‘表于 %{count} 天å‰ã€‚(设置项:delete_user_max_post_age) + other: "ä¸èƒ½åˆ é™¤æ‰€æœ‰å¸–å­ã€‚一些帖å­å‘表于 %{count} 天å‰ã€‚(设置项:delete_user_max_post_age)" cant_delete_all_too_many_posts: - other: ä¸èƒ½åˆ é™¤æ‰€æœ‰å¸–å­ï¼Œå› ä¸ºç”¨æˆ·æœ‰è¶…过 %{count} 个帖å­ã€‚(delete_all_posts_max) + other: "ä¸èƒ½åˆ é™¤æ‰€æœ‰å¸–å­ï¼Œå› ä¸ºç”¨æˆ·æœ‰è¶…过 %{count} 个帖å­ã€‚(delete_all_posts_max)" delete_confirm: "你确定è¦åˆ é™¤è¿™ä¸ªç”¨æˆ·å—?这个æ“作是ä¸å¯é€†çš„ï¼" delete_and_block: "删除并å°ç¦è¯¥é‚®ä»¶åœ°å€å’ŒIP地å€" delete_dont_block: "仅删除" + deleting_user: "删除用户" deleted: "该用户已被删除。" delete_failed: "在删除用户时å‘生了错误。请确ä¿åˆ é™¤è¯¥ç”¨æˆ·å‰åˆ é™¤äº†è¯¥ç”¨æˆ·çš„æ‰€æœ‰å¸–å­ã€‚" send_activation_email: "å‘逿¿€æ´»é‚®ä»¶" @@ -3052,7 +3099,7 @@ zh_CN: tl3_requirements: title: "信任等级3çš„è¦æ±‚" table_title: - other: 这最近 %{count} 天: + other: "这最近 %{count} 天:" value_heading: "当å‰" requirement_heading: "è¦æ±‚" visits: "访问" @@ -3221,7 +3268,7 @@ zh_CN: text: "有授予的样本消失。这在徽章查询返回用户 ID æˆ–è€…å¸–å­ ID ä¸å­˜åœ¨çš„æ—¶å€™å‘生。这å¯èƒ½å¯¼è‡´æœªé¢„期的结果å‘ç”Ÿâ€”â€”è¯·å†æ¬¡æ£€æŸ¥ä½ çš„æŸ¥è¯¢ã€‚" no_grant_count: "没有徽章å¯ä»¥è¢«æŽˆäºˆã€‚" grant_count: - other: 已授予 %{count} 个徽章。 + other: "已授予 %{count} 个徽章。" sample: "样本:" grant: with: "%{username}" @@ -3288,7 +3335,7 @@ zh_CN: uploading: "上传中..." quit: "以åŽå†è¯´" staff_count: - other: 你的社区中包括你在内有 %{count} ä½å·¥ä½œäººå‘˜ã€‚ + other: "你的社区中包括你在内有 %{count} ä½å·¥ä½œäººå‘˜ã€‚" invites: add_user: "添加" none_added: "你还没有邀请任何工作人员。你确定è¦ç»§ç»­å—?" diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index e83362e0da..01109362d7 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -42,49 +42,49 @@ zh_TW: tiny: half_a_minute: "< 1 分é˜" less_than_x_seconds: - other: < %{count} ç§’ + other: "< %{count} ç§’" x_seconds: - other: '%{count} ç§’' + other: "%{count} ç§’" less_than_x_minutes: - other: < %{count} åˆ†é˜ + other: "< %{count} 分é˜" x_minutes: - other: '%{count} 分é˜' + other: "%{count} 分é˜" about_x_hours: - other: '%{count} å°æ™‚' + other: "%{count} å°æ™‚" x_days: - other: '%{count} 天' + other: "%{count} 天" x_months: - other: '%{count} 月' + other: "%{count} 月" about_x_years: - other: '%{count} å¹´' + other: "%{count} å¹´" over_x_years: - other: '> %{count} å¹´' + other: "> %{count} å¹´" almost_x_years: - other: '%{count} å¹´' + other: "%{count} å¹´" date_month: "MMM D" date_year: "MMM 'YY" medium: x_minutes: - other: '%{count} 分é˜' + other: "%{count} 分é˜" x_hours: - other: '%{count} å°æ™‚' + other: "%{count} å°æ™‚" x_days: - other: '%{count} 天' + other: "%{count} 天" date_year: "'YY MMM D" medium_with_ago: x_minutes: - other: '%{count} 分é˜å‰' + other: "%{count} 分é˜å‰" x_hours: - other: '%{count} å°æ™‚å‰' + other: "%{count} å°æ™‚å‰" x_days: - other: '%{count} 天å‰' + other: "%{count} 天å‰" later: x_days: - other: '%{count} 天後' + other: "%{count} 天後" x_months: - other: '%{count} 個月後' + other: "%{count} 個月後" x_years: - other: '%{count} 年後' + other: "%{count} 年後" previous_month: '上個月' next_month: '下個月' placeholder: 日期 @@ -159,12 +159,11 @@ zh_TW: show_help: "é¸é …" links: "連çµ" links_lowercase: - other: éˆçµ + other: "éˆçµ" faq: "常見å•答集" guidelines: "守則" privacy_policy: "éš±ç§æ¬Šæ”¿ç­–" privacy: "éš±ç§" - terms_of_service: "æœå‹™æ¢æ¬¾" mobile_view: "手機版網站" desktop_view: "電腦版網站" you: "ä½ " @@ -183,7 +182,7 @@ zh_TW: max_of_count: "(最大 {{count}})" alternation: "或者" character_count: - other: '{{count}} 個字' + other: "{{count}} 個字" suggested_topics: title: "推薦的討論話題" pm_title: "推薦訊æ¯" @@ -253,14 +252,14 @@ zh_TW: cancel: "å–æ¶ˆ" view_pending: "觀看等待審核的貼文" has_pending_posts: - other: æœ¬ä¸»é¡Œä»æœ‰ {{count}}篇貼文等待審核 + other: "æœ¬ä¸»é¡Œä»æœ‰ {{count}}篇貼文等待審核" confirm: "儲存變更" delete_prompt: "你確定è¦åˆªé™¤ %{username} ? 這會移走有關他的文章,並å°éŽ–ä»–çš„é›»å­éƒµç®±åŠ IP ä½å€ã€‚" approval: title: "貼文需等待審核" description: "貼文已經é€å‡ºï¼Œä½†å¿…須等待管ç†è€…審核éŽå¾Œæ‰æœƒå‡ºç¾åœ¨æ¿ä¸Šï¼Œè«‹è€å¿ƒç­‰å€™ã€‚" pending_posts: - other: 你有 {{count}} 篇貼文在等待審核中 + other: "你有 {{count}} 篇貼文在等待審核中" ok: "確定" user_action: user_posted_topic: "{{user}} 建立了 此討論話題" @@ -294,7 +293,7 @@ zh_TW: posts_read: "已讀" posts_read_long: "讀éŽçš„æ–‡ç« " total_rows: - other: '%{count} 用戶' + other: "%{count} 用戶" group_histories: actions: change_group_setting: "更改群組設定" @@ -370,7 +369,7 @@ zh_TW: is_group_user: "æˆå“¡" is_group_owner: "æ“æœ‰è€…" title: - other: 群組 + other: "群組" activity: "活動" members: title: "æˆå“¡" @@ -438,8 +437,6 @@ zh_TW: reorder: title: "釿–°æŽ’åºåˆ†é¡ž" title_long: "釿–°æŽ’åºåˆ†é¡žåˆ—表" - fix_order: "固定ä½ç½®" - fix_order_tooltip: "ä¸¦éžæ‰€æœ‰çš„分類皆有唯一的ä½ç½®åƒæ•¸, å¯èƒ½æœƒæœ‰å‡ºä¹Žæ„æ–™ä¹‹å¤–çš„çµæžœ." save: "儲存順åº" apply_all: "申請" position: "ä½ç½®" @@ -450,9 +447,9 @@ zh_TW: toggle_ordering: "顯示/éš±è—æŽ’åºæŽ§åˆ¶" subcategories: "次分類" topic_sentence: - other: '%{count} 話題' + other: "%{count} 話題" topic_stat_sentence: - other: 在éŽå޻䏀%{unit}內有 %{count} 個新討論話題。 + other: "在éŽå޻䏀%{unit}內有 %{count} 個新討論話題。" ip_lookup: title: 最近的 IP ä½å€ hostname: 伺æœå™¨å稱 @@ -612,7 +609,6 @@ zh_TW: error: "修改設定值時發生錯誤" change_username: title: "修改用戶å稱" - confirm: "確定更æ›ç”¨æˆ¶å?你的帖å­å’Œ@æåŠä½ çš„引用將失效。" taken: "抱歉,此用戶å稱已經有人使用。" invalid: "此用戶å稱無效,åªèƒ½ä½¿ç”¨æ•¸å­—與英文字æ¯ã€‚" change_email: @@ -631,7 +627,6 @@ zh_TW: upload_title: "上傳你的圖片" upload_picture: "上傳圖片" image_is_not_a_square: "警告:我們è£åˆ‡äº†ä½ çš„åœ–ç‰‡ï¼Œå› ç‚ºè©²åœ–ç‰‡ä¸æ˜¯æ­£æ–¹å½¢çš„。" - cache_notice: "æ›´æ”¹äº†é ­åƒæˆåŠŸï¼Œä½†æ˜¯é‘’æ–¼ç€è¦½å™¨ç·©å­˜å¯èƒ½éœ€è¦ä¸€æ®µæ™‚é–“å¾Œæ‰æœƒç”Ÿæ•ˆã€‚" change_profile_background: title: "基本資料背景圖案" instructions: "個人資料背景會被置中,且默èªå¯¬åº¦ç‚º850px。" @@ -646,7 +641,7 @@ zh_TW: authenticated: "ä½ çš„ Email 已由 {{provider}} 驗證完æˆã€‚" frequency_immediately: "如果您沒有閱讀éŽé‡è¦é€šçŸ¥ï¼Œæˆ‘們會立å³ç™¼é€é›»å­éƒµä»¶çµ¦æ‚¨ã€‚" frequency: - other: æˆ‘å€‘åªæœƒåœ¨æ‚¨ {{count}} 分é˜å…§æ²’æœ‰æ´»å‹•æ™‚ï¼Œæ‰æœƒå¯„é€é›»éƒµé€šçŸ¥çµ¦æ‚¨ã€‚ + other: "æˆ‘å€‘åªæœƒåœ¨æ‚¨ {{count}} 分é˜å…§æ²’æœ‰æ´»å‹•æ™‚ï¼Œæ‰æœƒå¯„é€é›»éƒµé€šçŸ¥çµ¦æ‚¨ã€‚" name: title: "å稱" instructions: "您的全å (é¸å¡«)" @@ -731,7 +726,7 @@ zh_TW: user: "å—邀請的用戶" sent: "é€å‡º" truncated: - other: åªé¡¯ç¤ºå‰ {{count}} 個邀請。 + other: "åªé¡¯ç¤ºå‰ {{count}} 個邀請。" redeemed: "已接å—的邀請" redeemed_tab: "æŽ¥å—æ—¥æœŸ" redeemed_tab_with_count: "æŽ¥å—æ—¥æœŸ ({{count}})" @@ -775,21 +770,21 @@ zh_TW: time_read: "閱讀時間" recent_time_read: "最近的閱讀時間" topic_count: - other: 討論話題已建立 + other: "討論話題已建立" post_count: - other: 帖å­å·²å»ºç«‹ + other: "帖å­å·²å»ºç«‹" likes_given: - other: å·²é€å‡º + other: "å·²é€å‡º" likes_received: - other: 已接收 + other: "已接收" days_visited: - other: 到訪天數 + other: "到訪天數" topics_entered: - other: 已讀討論話題 + other: "已讀討論話題" posts_read: - other: 讀éŽçš„æ–‡ç«  + other: "讀éŽçš„æ–‡ç« " bookmark_count: - other: 書籤 + other: "書籤" top_replies: "最佳回覆" no_replies: "暫無回覆。" more_replies: "更多回覆" @@ -805,7 +800,6 @@ zh_TW: most_liked_users: "讚誰最多" most_replied_to_users: "最多回覆至" no_likes: "暫無讚" - associated_accounts: "登入" ip_address: title: "最近的 IP ä½å€" registration_ip_address: @@ -858,7 +852,7 @@ zh_TW: reached: "%{relativeAge} – %{rate} é”到了站點設置中的 %{siteSettingRate}。" exceeded: "[%{relativeAge}] ç›®å‰çš„錯誤率 %{rate} 已超出了站點設置中的 %{siteSettingRate}。" rate: - other: '%{count} 錯誤/%{duration}' + other: "%{count} 錯誤/%{duration}" learn_more: "進一步了解..." all_time: '總數' all_time_desc: '創建的主題總é‡' @@ -956,9 +950,6 @@ zh_TW: preferences: "需è¦ç™»å…¥å¾Œæ›´æ”¹è¨­ç½®" forgot: "æˆ‘è¨˜ä¸æ¸…賬號詳情了" not_approved: "你的帳號尚未ç²å¾—批准。一旦你的帳號ç²å¾—批准,你會收到一å°é›»å­éƒµä»¶ã€‚" - google: - title: "使用 Google 帳號" - message: "使用 Google 帳號èªè¨¼ (請確定你的網é ç€è¦½å™¨æœªé˜»æ“‹å½ˆå‡ºè¦–窗)" google_oauth2: title: "使用 Google 帳號" message: "使用 Google 帳號èªè­‰ ( 請確定你的網é ç€è¦½å™¨ä¸æœƒé˜»æ“‹å½ˆå‡ºè¦–窗 )" @@ -1027,7 +1018,7 @@ zh_TW: similar_topics: "與你的討論話題類似的討論..." drafts_offline: "離線è‰ç¨¿" group_mentioned: - other: æåŠ {{group}} 時,你將通知 {{count}} 人 ï¼ ç¢ºå®šå—Žï¼Ÿ + other: "æåŠ {{group}} 時,你將通知 {{count}} 人 ï¼ ç¢ºå®šå—Žï¼Ÿ" cannot_see_mention: category: "ä½ æåˆ°äº†{{userrname}},然而他們ä¸èƒ½è¨ªå•è©²åˆ†é¡žï¼Œæ‰€ä»¥ä»–å€‘ä¸æœƒè¢«é€šçŸ¥ã€‚ä½ éœ€è¦æŠŠä»–å€‘åŠ å…¥åˆ°èƒ½è¨ªå•該分類的群組中。" private: "ä½ æåˆ°äº†{{userrname}},然而他們ä¸èƒ½è¨ªå•該ç§ä¿¡ï¼Œæ‰€ä»¥ä»–們䏿œƒè¢«é€šçŸ¥ã€‚你需è¦é‚€è«‹ä»–們至ç§ä¿¡ä¸­ã€‚" @@ -1091,13 +1082,26 @@ zh_TW: title: "你忘記添加收信人了嗎?" body: "ç›®å‰è©²ç§ä¿¡åªç™¼çµ¦äº†ä½ è‡ªå·±ï¼" admin_options_title: "此討論話題å¯é¸ç”¨ä¹‹å·¥ä½œäººå“¡è¨­å®šé¸é …" + composer_actions: + reply_as_private_message: + label: æ–°å¢žè¨Šæ¯ + desc: 建立一則ç§è¨Š + reply_to_topic: + label: 回復到討論話題 + desc: å›žåˆ°åˆ°è¨Žè«–è©±é¡Œï¼Œä½†ä¸æ˜¯ç‰¹å®šè²¼æ–‡ + create_topic: + label: "新增討論話題" notifications: title: "當有人以「@用戶åç¨±ã€æåŠæ‚¨ã€å›žè¦†æ‚¨çš„è²¼æ–‡ã€æˆ–是傳é€è¨Šæ¯çµ¦æ‚¨çš„æ™‚候通知您的設定。" none: "ç›®å‰ç„¡æ³•載入通知訊æ¯ã€‚" empty: "未找到任何通知。" more: "檢視較舊的通知" total_flagged: "所有被投訴的文章" + invitee_accepted: "{{username}} 接å—了您的邀請" + moved_post: "{{username}} 移動 {{description}}" + linked: "{{username}} {{description}}" granted_badge: "得到 '{{description}}'" + topic_reminder: "{{username}} {{description}}" popup: mentioned: '{{username}}在“{{topic}}â€æåˆ°äº†ä½  - {{site_title}}' group_mentioned: '{{username}}在“{{topic}}â€æåˆ°äº†ä½  - {{site_title}}' @@ -1105,6 +1109,7 @@ zh_TW: replied: '{{username}}在“{{topic}}â€å›žè¦†äº†ä½  - {{site_title}}' posted: '{{username}}在“{{topic}}â€ä¸­ç™¼ä½ˆäº†å¸–å­ - {{site_title}}' linked: '{{username}}在“{{topic}}â€ä¸­é€£çµäº†ä½ çš„å¸–å­ - {{site_title}}' + confirm_body: 'æˆåŠŸ! 通知已啟用' upload_selector: title: "加入一張圖片" title_with_attachments: "加入一張圖片或一個檔案" @@ -1119,20 +1124,29 @@ zh_TW: uploading: "正在上傳" select_file: "é¸å–檔案" image_link: "連çµä½ çš„圖片將指å‘" + default_image_alt_text: åœ–åƒ search: sort_by: "排åº" relevance: "最相關" latest_post: "最新發帖" + latest_topic: "最新的討論話題" most_viewed: "最多閲讀" most_liked: "最多讚" select_all: "鏿“‡å…¨éƒ¨" clear_all: "清除全部" too_short: "ä½ çš„æœç´¢è©žå¤ªçŸ­ã€‚" title: "æœå°‹è¨Žè«–è©±é¡Œã€æ–‡ç« ã€ç”¨æˆ¶æˆ–分類" + full_page_title: "æœå°‹è¨Žè«–話題或貼文" no_results: "æœªæ‰¾åˆ°ä»»ä½•çµæžœã€‚" no_more_results: "æ²’æœ‰æ‰¾åˆ°æ›´å¤šçš„çµæžœã€‚" searching: "正在æœå°‹..." post_format: "#{{post_number}} {{username}}" + results_page: "'{{term}}' çš„æœå°‹çµæžœ" + start_new_topic: "或許開始一個新的討論話題?" + or_search_google: "或是嘗試利用 Google æœå°‹:" + search_google: "嘗試利用 Google æœå°‹:" + search_google_button: "Google" + search_google_title: "æœå°‹é€™å€‹ç¶²ç«™" context: user: "æœå°‹ @{{username}} 的文章" category: "æœç´¢ #{{category}} 分類" @@ -1142,19 +1156,28 @@ zh_TW: title: 高級æœç´¢ posted_by: label: 發帖人 + in_category: + label: 已分類 in_group: label: 在該群組中 with_badge: label: 有該徽章 + with_tags: + label: 已標記 filters: likes: 我給了讚的 posted: 我åƒèˆ‡ç™¼å¸– watching: 我正在關注 tracking: 我正在追蹤 + private: åœ¨æˆ‘çš„è¨Šæ¯ first: 是第一帖 pinned: 是置頂的 unpinned: 䏿˜¯ç½®é ‚çš„ + seen: 我已讀的 + unseen: 我還未讀的 wiki: 公共編輯 + images: 包å«åœ–åƒ + all_tags: 以上所有的標籤 statuses: label: 當主題 open: 是開放的 @@ -1190,11 +1213,13 @@ zh_TW: dismiss_new: "設定新文章為已讀" toggle: "批é‡åˆ‡æ›é¸æ“‡è¨Žè«–話題" actions: "æ‰¹é‡æ“作" + change_category: "設定分類" close_topics: "關閉討論話題" archive_topics: "å·²å°å­˜çš„討論話題" + notification_level: "通知" choose_new_category: "ç‚ºä¸»é¡Œé¸æ“‡æ–°é¡žåˆ¥ï¼š" selected: - other: 你已鏿“‡äº† {{count}} 個討論話題。 + other: "你已鏿“‡äº† {{count}} 個討論話題。" change_tags: "å–代標籤" append_tags: "添加標籤" choose_new_tags: "ç‚ºä¸»é¡Œé¸æ“‡æ–°æ¨™ç±¤" @@ -1227,9 +1252,10 @@ zh_TW: search: "沒有更多æœç´¢çµæžœäº†ã€‚" topic: filter_to: - other: 本主題中的 {{count}} 帖 + other: "本主題中的 {{count}} 帖" create: '新討論話題' create_long: '建立新討論話題' + open_draft: "開啟è‰ç¨¿" private_message: '發é€è¨Šæ¯' archive_message: help: '移動消æ¯åˆ°å­˜æª”' @@ -1237,6 +1263,9 @@ zh_TW: move_to_inbox: title: '移動到收件箱' help: '移動消æ¯åˆ°æ”¶ä»¶ç®±' + edit_message: + help: '編輯這個訊æ¯çš„第一篇貼文' + title: '編輯訊æ¯' list: '討論話題' new: '新討論話題' unread: '未讀' @@ -1256,13 +1285,13 @@ zh_TW: title: "未找到討論話題" description: "抱歉,找ä¸åˆ°æ­¤è¨Žè«–話題,å¯èƒ½å·²è¢«æ¿ä¸»åˆªé™¤ã€‚" total_unread_posts: - other: 你有 {{count}} 個未讀的文章在這討論話題內 + other: "你有 {{count}} 個未讀的文章在這討論話題內" unread_posts: - other: 你有 {{count}} 個未讀的舊文章在討論內 + other: "你有 {{count}} 個未讀的舊文章在討論內" new_posts: - other: 自你上次閱讀後,有 {{count}} 篇新文章在此討論話題內 + other: "自你上次閱讀後,有 {{count}} 篇新文章在此討論話題內" likes: - other: 此討論話題收到了 {{count}} 個讚 + other: "此討論話題收到了 {{count}} 個讚" back_to_list: "回到討論話題列表" options: "討論話題é¸é …" show_links: "在討論話題裡顯示連çµ" @@ -1276,9 +1305,37 @@ zh_TW: jump_reply_up: jump to earlier reply jump_reply_down: jump to later reply deleted: "此討論話題已被刪除" + auto_update_input: + tomorrow: "明天" + this_weekend: "這週末" + next_week: "下週" + two_weeks: "兩週" + next_month: "下個月" + three_months: "三個月" + six_months: "六個月" + one_year: "一年" + forever: "永久" + pick_date_and_time: "æŒ‘é¸æ—¥æœŸèˆ‡æ™‚é–“" + set_based_on_last_post: "ä¾ç…§ä¸Šä¸€ç¯‡è²¼æ–‡ä¾†é—œé–‰" + publish_to_category: + title: "定時發表" + temp_open: + title: "暫時開啟" + auto_reopen: + title: "自動開啟討論話題" + temp_close: + title: "暫時關閉" + auto_close: + title: "自動關閉討論話題" + label: "自動關閉討論話題的期é™:" + error: "請輸入一個有效的值。" + auto_delete: + title: "自動刪除討論話題" + reminder: + title: "æé†’我" auto_close_title: '自動關閉設定' auto_close_immediate: - other: 主題中的最後一帖是 %{hours} å°æ™‚å‰ç™¼å‡ºçš„,所以主題將會立å³é—œé–‰ã€‚ + other: "主題中的最後一帖是 %{hours} å°æ™‚å‰ç™¼å‡ºçš„,所以主題將會立å³é—œé–‰ã€‚" timeline: back: "返回" back_description: "回到最後一個未讀帖å­" @@ -1352,6 +1409,7 @@ zh_TW: visible: "出ç¾åœ¨åˆ—表上" reset_read: "é‡ç½®è®€å–資料" make_public: "設置為公共主題" + make_private: "設置為ç§è¨Š" feature: pin: "置頂主題" unpin: "å–æ¶ˆç½®é ‚主題" @@ -1384,7 +1442,7 @@ zh_TW: pin_validation: "置頂該主題需è¦ä¸€å€‹æ—¥æœŸã€‚" not_pinned: "沒有主題被釘é¸åœ¨ {{categoryLink}} ." already_pinned: - other: '{{categoryLink}}分類的置頂主題數:{{count}}' + other: "{{categoryLink}}分類的置頂主題數:{{count}}" pin_globally: "將主題置於所有主題列表最上方至" confirm_pin_globally: "已有{{count}}個全局置頂主題。太多的置頂主題å¯èƒ½æœƒå›°æ“¾æ–°ç”¨æˆ¶å’Œè¨ªå®¢ã€‚確定想å†å…¨å±€ç½®é ‚一個主題?" unpin_globally: "將主題從所有主題列表的最上方移除。" @@ -1392,7 +1450,7 @@ zh_TW: global_pin_note: "å…è¨±ç”¨æˆ¶å–æ¶ˆå…¨å±€ç½®é ‚。" not_pinned_globally: "沒有全局置頂的主題。" already_pinned_globally: - other: 全局置頂的主題數:{{count}} + other: "全局置頂的主題數:{{count}}" make_banner: "將主題設置為出ç¾åœ¨æ‰€æœ‰é é¢é ‚端的橫幅主題。" remove_banner: "移除所有é é¢é ‚端的橫幅主題。" banner_note: "ç”¨æˆ¶èƒ½é»žæ“Šé—œé–‰éš±è—æ©«å¹…。且åªèƒ½è¨­ç½®ä¸€å€‹æ©«å¹…主題。" @@ -1425,10 +1483,11 @@ zh_TW: success_email: "我們發了一å°éƒµä»¶é‚€è«‹{{emailOrUsername}}。邀請被接å—後你會收到通知。檢查用戶é ä¸­çš„邀請標籤é ä¾†è¿½è¹¤ä½ çš„邀請。" success_username: "我們已經邀請該使用者加入此主題討論" error: "抱歉,我們ä¸èƒ½é‚€è«‹é€™å€‹äººã€‚å¯èƒ½ä»–已經被邀請了?(邀請有頻率é™åˆ¶ï¼‰" + success_existing_email: "已經有一個有此電å­éƒµä»¶ {{emailOrUsername}} 的使用者存在。我們已邀請那ä½ä½¿ç”¨è€…來åƒèˆ‡é€™å€‹è©±é¡Œã€‚" login_reply: '登入以發表回應' filters: n_posts: - other: '{{count}} 則文章' + other: "{{count}} 則文章" cancel: "å–æ¶ˆéŽæ¿¾" split_topic: title: "移至新討論話題" @@ -1436,13 +1495,13 @@ zh_TW: topic_name: "新討論話題的å稱" error: "將討論話題移至新討論話題時發生錯誤。" instructions: - other: ä½ å³å°‡å»ºç«‹ä¸€å€‹æ–°è¨Žè«–話題,並填入 {{count}} ç¯‡ä½ å·²é¸æ“‡çš„æ–‡ç« ã€‚ + other: "ä½ å³å°‡å»ºç«‹ä¸€å€‹æ–°è¨Žè«–話題,並填入 {{count}} ç¯‡ä½ å·²é¸æ“‡çš„æ–‡ç« ã€‚" merge_topic: title: "移至已存在的討論話題" action: "移至已存在的討論話題" error: "將討論話題移至已存在的討論話題時發生錯誤。" instructions: - other: è«‹é¸æ“‡ä½ æƒ³å°‡é‚£ {{count}} 篇文章移至哪一個討論話題。 + other: "è«‹é¸æ“‡ä½ æƒ³å°‡é‚£ {{count}} 篇文章移至哪一個討論話題。" merge_posts: title: "åˆä½µé¸æ“‡çš„帖å­" action: "åˆä½µé¸æ“‡çš„帖å­" @@ -1454,8 +1513,9 @@ zh_TW: label: "æ–‡ç« çš„æ–°æ“æœ‰è€…" placeholder: "æ–°æ“æœ‰è€…的用戶å稱" instructions: - other: è«‹é¸æ“‡ä¸€ä½æ–°ç”¨æˆ¶ä½œç‚ºæ­¤ {{count}} 篇由 {{old_user}} æ’°å¯«ä¹‹æ–‡ç« çš„æ“æœ‰è€…。 + other: "è«‹é¸æ“‡ä¸€ä½æ–°ç”¨æˆ¶ä½œç‚ºæ­¤ {{count}} 篇由 {{old_user}} æ’°å¯«ä¹‹æ–‡ç« çš„æ“æœ‰è€…。" change_timestamp: + title: "變更時間標籤..." action: "變更時間戳記" invalid_timestamp: "時間戳記ä¸èƒ½ç‚ºå°‡ä¾†çš„æ™‚刻。" error: "更改主題時間時發生錯誤。" @@ -1463,12 +1523,16 @@ zh_TW: multi_select: select: 'é¸å–' selected: 'é¸å–了 ({{count}})' + select_post: + label: '鏿“‡' + selected_post: + label: 'å·²é¸å–' delete: 刪除é¸å–的文章 cancel: å–æ¶ˆé¸å– select_all: 鏿“‡å…¨éƒ¨ deselect_all: å–æ¶ˆé¸å– description: - other: 你已鏿“‡äº† {{count}} 篇文章。 + other: "你已鏿“‡äº† {{count}} 篇文章。" post: quote_reply: "引用" edit_reason: "原因: " @@ -1482,20 +1546,20 @@ zh_TW: show_full: "顯示所有文章" show_hidden: '觀看隱è—內容' deleted_by_author: - other: ( 文章已被作者撤回,除éžè¢«æŠ•訴,å¦å‰‡åœ¨ %{count} å°æ™‚內將自動刪除。) + other: "( 文章已被作者撤回,除éžè¢«æŠ•訴,å¦å‰‡åœ¨ %{count} å°æ™‚內將自動刪除。)" expand_collapse: "展開/æ”¶åˆ" gap: - other: 檢視 {{count}} 則隱è—回應 + other: "檢視 {{count}} 則隱è—回應" unread: "文章未讀" has_replies: - other: '{{count}} 個回覆' + other: "{{count}} 個回覆" has_likes: - other: '{{count}} 個讚' + other: "{{count}} 個讚" has_likes_title: - other: '{{count}} å€‹ä½¿ç”¨è€…å°æ­¤æ–‡ç« è®šå¥½' + other: "{{count}} å€‹ä½¿ç”¨è€…å°æ­¤æ–‡ç« è®šå¥½" has_likes_title_only_you: "你已按讚" has_likes_title_you: - other: 你和其他 {{count}} 人讚了該貼 + other: "你和其他 {{count}} 人讚了該貼" errors: create: "抱歉,建立你的文章時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚" edit: "抱歉,編輯你的文章時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚" @@ -1547,7 +1611,6 @@ zh_TW: inappropriate: "撤回投訴" bookmark: "移除書籤" like: "撤回讚" - vote: "撤回投票" people: off_topic: "投訴為離題內容" spam: "投訴為垃圾內容" @@ -1556,7 +1619,6 @@ zh_TW: notify_user: "å·²é€å‡ºä¸€å‰‡è¨Šæ¯" bookmark: "æ”¶è—" like: "讚了它" - vote: "已投票" by_you: off_topic: "你已投訴此文章å離討論話題" spam: "你已投訴此文章為垃圾" @@ -1565,41 +1627,36 @@ zh_TW: notify_user: "您已é€å‡ºè¨Šæ¯çµ¦é€™ä½ç”¨æˆ¶" bookmark: "你已將此文章加上書籤" like: "你已在此文章按讚" - vote: "你已在此文章投票支æŒ" by_you_and_others: off_topic: - other: 你與其他 {{count}} 人已投訴此文章為離題內容 + other: "你與其他 {{count}} 人已投訴此文章為離題內容" spam: - other: 你與其他 {{count}} 人已投訴此文章為垃圾內容 + other: "你與其他 {{count}} 人已投訴此文章為垃圾內容" inappropriate: - other: 你與其他 {{count}} 人已投訴此文章為ä¸ç•¶å…§å®¹ + other: "你與其他 {{count}} 人已投訴此文章為ä¸ç•¶å…§å®¹" notify_moderators: - other: 你與其他 {{count}} 人已投訴此文章請æ¿ä¸»è™•ç† + other: "你與其他 {{count}} 人已投訴此文章請æ¿ä¸»è™•ç†" notify_user: - other: 您和其他 {{count}} 人已é€å‡ºè¨Šæ¯çµ¦é€™ä½ç”¨æˆ¶ + other: "您和其他 {{count}} 人已é€å‡ºè¨Šæ¯çµ¦é€™ä½ç”¨æˆ¶" bookmark: - other: 你與 {{count}} 個人將此文章加上書籤 + other: "你與 {{count}} 個人將此文章加上書籤" like: - other: 你與其他 {{count}} äººå°æ­¤æŒ‰è®š - vote: - other: 你與其他 {{count}} 人已投票給此文章 + other: "你與其他 {{count}} äººå°æ­¤æŒ‰è®š" by_others: off_topic: - other: '{{count}} 人已投訴此文章為離題內容' + other: "{{count}} 人已投訴此文章為離題內容" spam: - other: '{{count}} 人已投訴此文章為垃圾內容' + other: "{{count}} 人已投訴此文章為垃圾內容" inappropriate: - other: '{{count}} 人已投訴此文章為ä¸ç•¶å…§å®¹' + other: "{{count}} 人已投訴此文章為ä¸ç•¶å…§å®¹" notify_moderators: - other: '{{count}} 人已投訴此文章請æ¿ä¸»è™•ç†' + other: "{{count}} 人已投訴此文章請æ¿ä¸»è™•ç†" notify_user: - other: '{{count}} å·²é€å‡ºè¨Šæ¯çµ¦é€™ä½ç”¨æˆ¶' + other: "{{count}} å·²é€å‡ºè¨Šæ¯çµ¦é€™ä½ç”¨æˆ¶" bookmark: - other: '{{count}} 個人將此文章加上書籤' + other: "{{count}} 個人將此文章加上書籤" like: - other: '{{count}} äººå°æ­¤æŒ‰è®š' - vote: - other: '{{count}} 人已投票給此文章' + other: "{{count}} äººå°æ­¤æŒ‰è®š" revisions: controls: first: "第一版" @@ -1730,11 +1787,11 @@ zh_TW: custom_placeholder_notify_moderators: "è®“æˆ‘å€‘çŸ¥é“æ‚¨çš„æ„è¦‹ï¼Œä¸¦è«‹ç›¡å¯èƒ½åœ°æä¾›ç›¸é—œé€£çµå’Œä¾‹å­ã€‚" custom_message: at_least: - other: 輸入至少 {{count}} 個字元 + other: "輸入至少 {{count}} 個字元" more: - other: é‚„å·® {{count}} 個... + other: "é‚„å·® {{count}} 個..." left: - other: 剩餘 {{count}} + other: "剩餘 {{count}}" flagging_topic: title: "感è¬å¹«åŠ©ç¤¾ç¾¤é é›¢é‚ªæƒ¡ï¼" action: "投訴討論話題" @@ -1745,11 +1802,11 @@ zh_TW: links_title: "熱門連çµ" links_shown: "顯示更多連çµ..." clicks: - other: '%{count} 點擊' + other: "%{count} 點擊" post_links: about: "為本帖展開更多連çµ" title: - other: '%{count} 更多' + other: "%{count} 更多" topic_statuses: warning: help: "這是正å¼è­¦å‘Šã€‚" @@ -1783,18 +1840,18 @@ zh_TW: original_post: "原始文章" views: "觀看" views_lowercase: - other: 觀看 + other: "觀看" replies: "回覆" views_long: - other: é€™å€‹è¨Žè«–è©±é¡Œå·²ç¶“è¢«æª¢è¦–éŽ {{number}} 次 + other: "é€™å€‹è¨Žè«–è©±é¡Œå·²ç¶“è¢«æª¢è¦–éŽ {{number}} 次" activity: "活動" likes: "讚" likes_lowercase: - other: 個讚 + other: "個讚" likes_long: "此討論話題收到了 {{number}} 個讚" users: "用戶" users_lowercase: - other: 用戶 + other: "用戶" category_title: "分類" history: "æ­·å²" changed_by: "作者 {{author}}" @@ -1807,7 +1864,7 @@ zh_TW: latest: title: "最新" title_with_count: - other: 最新 ({{count}}) + other: "最新 ({{count}})" help: "最近的討論話題" hot: title: "熱門" @@ -1825,17 +1882,17 @@ zh_TW: unread: title: "未讀" title_with_count: - other: 未讀 ({{count}}) + other: "未讀 ({{count}})" help: "你所關注或追蹤的討論話題有未讀文章" lower_title_with_count: - other: '{{count}} 個未讀' + other: "{{count}} 個未讀" new: lower_title_with_count: - other: '{{count}} 近期' + other: "{{count}} 近期" lower_title: "新話題" title: "æ–°çš„" title_with_count: - other: 近期 ({{count}}) + other: "近期 ({{count}})" help: "最近幾天建立的主題" posted: title: "我的文章" @@ -1846,7 +1903,7 @@ zh_TW: category: title: "{{categoryName}}" title_with_count: - other: '{{categoryName}} ({{count}})' + other: "{{categoryName}} ({{count}})" help: "{{categoryName}} 分類最近的討論話題" top: title: "ç²¾é¸" @@ -1930,16 +1987,16 @@ zh_TW: print: 'ctrl+p 打å°ä¸»é¡Œ' badges: earned_n_times: - other: 授予徽章 %{count} 次 + other: "授予徽章 %{count} 次" granted_on: "授予於%{date}" others_count: "其他有該徽章的人(%{count})" title: 徽章 badge_count: - other: '%{count} 徽章' + other: "%{count} 徽章" more_badges: - other: +%{count} 更多 + other: "+%{count} 更多" granted: - other: '%{count} 授予' + other: "%{count} 授予" select_badge_for_title: 鏿“‡ä¸€å€‹å¾½ç« ä½œç‚ºä½ çš„頭銜使用 none: "(ç„¡)" badge_grouping: @@ -2085,6 +2142,8 @@ zh_TW: start_date: "開始日期" end_date: "çµæŸæ—¥æœŸ" groups: "所有群組" + trending_search: + more: ' æœå°‹è¨˜éŒ„檔 ' commits: latest_changes: "最近的變更:請經常更新ï¼" by: "ç”±" @@ -2092,6 +2151,10 @@ zh_TW: title: "投訴" agree: "åŒæ„" agree_title: "ç¢ºèªæ­¤æŠ•訴為有效且正確" + agree_flag_hide_post: "éš±è—貼文" + agree_flag_restore_post: "åŒæ„並還原貼文" + agree_flag_suspend: "åœæ¬Šä½¿ç”¨è€…" + agree_flag_silence: "éœéŸ³ä½¿ç”¨è€…" delete: "刪除" delete_title: "刪除此標記文章。" delete_post_defer_flag_title: "刪除文章,如果刪除的是討論話題的第一則文章,討論話題也將一併刪除" @@ -2201,9 +2264,9 @@ zh_TW: none: "沒有相關事件。" redeliver: "釿–°ç™¼é€" incoming: - other: 有 {{count}} 個新事件。 + other: "有 {{count}} 個新事件。" completed_in: - other: 在 {{count}} 秒內完æˆã€‚ + other: "在 {{count}} 秒內完æˆã€‚" request: "請求" response: "回應" redeliver_confirm: "你確定è¦å†æ¬¡ç™¼é€ä¸€æ¨£çš„內容嗎?" @@ -2422,7 +2485,6 @@ zh_TW: address_placeholder: "name@example.com" type_placeholder: "digest, signup..." reply_key_placeholder: "回覆金鑰" - skipped_reason_placeholder: "原因" logs: title: "記錄" action: "動作" @@ -2546,9 +2608,9 @@ zh_TW: suspect: '嫌疑' approved: "已批准?" approved_selected: - other: 批准用戶 ({{count}}) + other: "批准用戶 ({{count}})" reject_selected: - other: 拒絕用戶 ({{count}}) + other: "拒絕用戶 ({{count}})" titles: active: 'æ´»èºçš„用戶' new: '新用戶' @@ -2564,9 +2626,9 @@ zh_TW: suspended: 'å·²åœæ¬Šçš„用戶' suspect: '嫌疑使用者' reject_successful: - other: æˆåŠŸæ‹’çµ• %{count} 個用戶。 + other: "æˆåŠŸæ‹’çµ• %{count} 個用戶。" reject_failures: - other: 無法拒絕 %{count} 個用戶 + other: "無法拒絕 %{count} 個用戶" not_verified: "未確èª" check_email: title: "顯示使用者 Email" @@ -2626,11 +2688,11 @@ zh_TW: delete_forbidden_because_staff: "管ç†å“¡èˆ‡æ¿ä¸»ä¸å¯åˆªé™¤ã€‚" delete_posts_forbidden_because_staff: "無法刪除管ç†å“¡å’Œç‰ˆä¸»çš„æ‰€æœ‰å¸–å­ã€‚" delete_forbidden: - other: ä¸èƒ½åˆªé™¤æ“有文章的用戶。請先刪除所有文章後æ‰èƒ½åˆªé™¤è©²ç”¨æˆ¶ã€‚( ç™¼è¡¨è¶…éŽ %{count} 天的文章ä¸èƒ½åˆªé™¤ ) + other: "ä¸èƒ½åˆªé™¤æ“有文章的用戶。請先刪除所有文章後æ‰èƒ½åˆªé™¤è©²ç”¨æˆ¶ã€‚( ç™¼è¡¨è¶…éŽ %{count} 天的文章ä¸èƒ½åˆªé™¤ )" cant_delete_all_posts: - other: 無法刪除所有的文章。有些文章時間早於 %{count} 天å‰ã€‚ ( 請見 delete_user_max_post_age 設定 ) + other: "無法刪除所有的文章。有些文章時間早於 %{count} 天å‰ã€‚ ( 請見 delete_user_max_post_age 設定 )" cant_delete_all_too_many_posts: - other: ç„¡æ³•åˆªé™¤æ‰€æœ‰æ–‡ç« ï¼Œå› ç‚ºæ­¤ç”¨æˆ¶æ“æœ‰è¶…éŽ %{count} 篇文章。( delete_all_posts_max ) + other: "ç„¡æ³•åˆªé™¤æ‰€æœ‰æ–‡ç« ï¼Œå› ç‚ºæ­¤ç”¨æˆ¶æ“æœ‰è¶…éŽ %{count} 篇文章。( delete_all_posts_max )" delete_confirm: "你確定è¦åˆªé™¤æ­¤ç”¨æˆ¶å—Ž? 此動作將ä¸å¯å¾©åŽŸ!" delete_and_block: "刪除並且å°éŽ–æ­¤é›»å­éƒµä»¶åœ°å€èˆ‡ IP ä½å€" delete_dont_block: "åªåˆªé™¤" @@ -2666,7 +2728,7 @@ zh_TW: tl3_requirements: title: "信任等級 3 之æ¢ä»¶" table_title: - other: 這最近 %{count} 天: + other: "這最近 %{count} 天:" value_heading: "價值" requirement_heading: "è¦æ±‚" visits: "訪å•" @@ -2835,7 +2897,7 @@ zh_TW: text: "æŸ¥è©¢çµæžœæ²’æœ‰æŽˆäºˆå¾½ç« çš„æ¨£æœ¬ï¼›ç•¶æŸ¥è©¢çµæžœå›žå‚³çš„使用者 ID 或文章 ID ä¸å­˜åœ¨æ™‚æ­¤å•題有å¯èƒ½ç™¼ç”Ÿã€‚如此å¯èƒ½æœƒç™¼ç”Ÿæœªé æœŸçš„çµæžœ ―― è«‹å†æ¬¡æª¢æŸ¥æ‚¨çš„ SQL 語法。" no_grant_count: "沒有指定徽章。" grant_count: - other: 指定了 %{count} 個徽章。 + other: "指定了 %{count} 個徽章。" sample: "樣本:" grant: with: "%{username}" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 5e5335b5af..134473c7cf 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -86,36 +86,36 @@ ar: one: "لا يمكن حذ٠السجل لإعتماد سجل آخر عليه %{record} " many: "لا يمكن حذ٠السجل لاعتماده %{record} موجود" too_long: + zero: طويل جدا (الحد الأقصى بدون الحروÙ) + one: طويل جدا (الحد الأقصى حر٠واحد) + two: طويل جدا (الحد الأقصى حرÙين) few: طويل جدا (الحد الأقصى حرو٠قليلة) many: طويل جدا (الحد الأقصى %{count} Ø­Ø±ÙØ§) - one: طويل جدا (الحد الأقصى حر٠واحد) other: طويل جدا (الحد الأقصى %{count} Ø­Ø±ÙØ§) - two: طويل جدا (الحد الأقصى حرÙين) - zero: طويل جدا (الحد الأقصى بدون الحروÙ) too_short: + zero: قصير جدا (الحد الأدنى بدون حروÙ) + one: قصير جدا (الحد الأدنى حر٠واحد) + two: قصير جدا (الحد الأدنى حرÙين) few: قصير جدا (الحد الأدنى حرو٠قليلة) many: قصير جدا (الحد الأدنى حرو٠كثيرة) - one: قصير جدا (الحد الأدنى حر٠واحد) other: قصير جدا (الحد الأدنى %{count} حروÙ) - two: قصير جدا (الحد الأدنى حرÙين) - zero: قصير جدا (الحد الأدنى بدون حروÙ) wrong_length: + zero: طول خاطئ (يجب أن يكون بدون حروÙ) + one: طول خاطئ (يجب أن يكون حر٠واحد) + two: طول خاطئ (يجب أن يكون حرÙين) few: طول خاطئ (يجب أن يكون حرو٠قليلة) many: طول خاطئ (يجب أن يكون حرو٠كثيرة) - one: طول خاطئ (يجب أن يكون حر٠واحد) other: طول خاطئ (يجب أن يكون %{count} حروÙ) - two: طول خاطئ (يجب أن يكون حرÙين) - zero: طول خاطئ (يجب أن يكون بدون حروÙ) other_than: "يجب أن تكون غير %{count}" template: body: 'حدثت مشاكل بالحقول الآتية:' header: - few: أخطاء قليل تمنع هذا %{model} من Ø§Ù„Ø­ÙØ¸ - many: أخطاء كثيرة تمنع هذا %{model} من Ø§Ù„Ø­ÙØ¸ + zero: 'لا أخطاء تمنع هذا %{model} من Ø§Ù„Ø­ÙØ¸' one: خطأ واحد منع هذا %{model} من Ø§Ù„Ø­ÙØ¸ + two: 'خطأن منعا هذا %{model} من Ø§Ù„Ø­ÙØ¸' + few: 'أخطاء قليل تمنع هذا %{model} من Ø§Ù„Ø­ÙØ¸' + many: 'أخطاء كثيرة تمنع هذا %{model} من Ø§Ù„Ø­ÙØ¸' other: '%{count} أخطاء منعت هذا %{model} من Ø§Ù„Ø­ÙØ¸' - two: خطأن منعا هذا %{model} من Ø§Ù„Ø­ÙØ¸ - zero: لا أخطاء تمنع هذا %{model} من Ø§Ù„Ø­ÙØ¸ embed: load_from_remote: "حدث عطل أثناء تحميل هذا المنشور." site_settings: @@ -147,75 +147,75 @@ ar: reading_time: "وقت القراءة" likes: "الإعجابات" too_many_replies: - few: آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد %{count} مرات ÙÙŠ Ù†ÙØ³ الموضوع. - many: آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد %{count} مرة ÙÙŠ Ù†ÙØ³ الموضوع. - one: آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد مرة واحدة ÙÙŠ Ù†ÙØ³ الموضوع. - other: آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد %{count} مرة ÙÙŠ Ù†ÙØ³ الموضوع. - two: آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد مرتين ÙÙŠ Ù†ÙØ³ الموضوع. - zero: يمكن للأعضاء الجدد الرد كما يحلو لهم ÙÙŠ كل موضوع. + zero: "يمكن للأعضاء الجدد الرد كما يحلو لهم ÙÙŠ كل موضوع." + one: "آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد مرة واحدة ÙÙŠ Ù†ÙØ³ الموضوع." + two: "آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد مرتين ÙÙŠ Ù†ÙØ³ الموضوع." + few: "آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد %{count} مرات ÙÙŠ Ù†ÙØ³ الموضوع." + many: "آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد %{count} مرة ÙÙŠ Ù†ÙØ³ الموضوع." + other: "آسÙون، Ùلا يمكن للأعضاء الجدد سوى الرد %{count} مرة ÙÙŠ Ù†ÙØ³ الموضوع." embed: start_discussion: "ابدأ النّقاش" continue: "تابع النّقاش" error: "خطأ ÙÙŠ التضمين" referer: "المرجع:" more_replies: - few: '%{count} ردود أخرى' - many: '%{count} ردا آخر' - one: رد واحد آخر - other: '%{count} رد آخر' - two: ردّان آخران - zero: لا ردود أخرى + zero: "لا ردود أخرى" + one: "رد واحد آخر" + two: "ردّان آخران" + few: "%{count} ردود أخرى" + many: "%{count} ردا آخر" + other: "%{count} رد آخر" loading: "يحمّل النّقاش..." permalink: "الرابط الثابت" imported_from: "هذا موضوع نقاش مصاحب للمدخل الأصلي على %{link}" in_reply_to: "â—€ %{username}" replies: - few: '%{count} ردود' - many: '%{count} ردا' - one: رد واحد - other: '%{count} رد' - two: ردّان - zero: لا ردود + zero: "لا ردود" + one: "رد واحد" + two: "ردّان" + few: "%{count} ردود" + many: "%{count} ردا" + other: "%{count} رد" no_mentions_allowed: "Ù†Ø£Ø³ÙØŒ لا يمكنك الإشارة إلى الغير." too_many_mentions: - few: Ù†Ø£Ø³ÙØŒ يمكنك الإشارة إلى %{count} مستخدمين Ùقط ÙÙŠ كلّ مشاركة. - many: Ù†Ø£Ø³ÙØŒ يمكنك الإشارة إلى %{count} مستخدمًا Ùقط ÙÙŠ كلّ مشاركة. - one: عذرا، يمكنك الإشارة إلى عضو واحد Ùقط ÙÙŠ كل منشور. - other: عذرا، يمكنك الإشارة إلى %{count} عضو Ùقط ÙÙŠ كل منشور. - two: Ù†Ø£Ø³ÙØŒ يمكنك الإشارة إلى مستخدمين Ùقط ÙÙŠ كلّ مشاركة. - zero: عذرا، لا يمكنك الإشارة إلى أحد ÙÙŠ كلّ مشاركة. + zero: "عذرا، لا يمكنك الإشارة إلى أحد ÙÙŠ كلّ مشاركة." + one: "عذرا، يمكنك الإشارة إلى عضو واحد Ùقط ÙÙŠ كل منشور." + two: "Ù†Ø£Ø³ÙØŒ يمكنك الإشارة إلى مستخدمين Ùقط ÙÙŠ كلّ مشاركة." + few: "Ù†Ø£Ø³ÙØŒ يمكنك الإشارة إلى %{count} مستخدمين Ùقط ÙÙŠ كلّ مشاركة." + many: "Ù†Ø£Ø³ÙØŒ يمكنك الإشارة إلى %{count} مستخدمًا Ùقط ÙÙŠ كلّ مشاركة." + other: "عذرا، يمكنك الإشارة إلى %{count} عضو Ùقط ÙÙŠ كل منشور." no_mentions_allowed_newuser: "Ù†Ø£Ø³ÙØŒ لا يمكن للمستخدمين الجدد الإشارة إلى الغير." too_many_mentions_newuser: - few: عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} أعضاء ÙÙŠ المشاركة . - many: عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} عضو ÙÙŠ المشاركة . - one: عذرا ØŒ الاعضاء الجدد بامكانهم Ùقط الإشارة إلي عضو واحد Ùقط ÙÙŠ المنشور. - other: عذرا ØŒ الاعضاء الجدد بامكانهم Ùقط الإشارة إلي %{count} عضو ÙÙŠ المنشور. - two: عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} عضوين Ùقط ÙÙŠ المشاركة . - zero: عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} عضو ÙÙŠ المشاركة . + zero: "عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} عضو ÙÙŠ المشاركة ." + one: "عذرا ØŒ الاعضاء الجدد بامكانهم Ùقط الإشارة إلي عضو واحد Ùقط ÙÙŠ المنشور." + two: "عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} عضوين Ùقط ÙÙŠ المشاركة ." + few: "عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} أعضاء ÙÙŠ المشاركة ." + many: "عذرا ØŒ المستخدمون الجدد بامكانهم Ùقط تنبيه %{count} عضو ÙÙŠ المشاركة ." + other: "عذرا ØŒ الاعضاء الجدد بامكانهم Ùقط الإشارة إلي %{count} عضو ÙÙŠ المنشور." no_images_allowed: "عذرا، لا يمكن للأعضاء الجدد وضع صور ÙÙŠ المنشور." too_many_images: - few: آسÙون، يمكن للمستخدمين الجدد وضع %{count} صور Ùقط ÙÙŠ كل منشور. - many: آسÙون، يمكن للمستخدمين الجدد وضع %{count} صورة Ùقط ÙÙŠ كل منشور. - one: عذرا، يمكن للأعضاء الجدد وضع صورة واحدة Ùقط ÙÙŠ كل منشور. - other: عذرا، يمكن للأعضاء الجدد وضع %{count} صورة Ùقط ÙÙŠ كل منشور. - two: آسÙون، يمكن للمستخدمين الجدد وضع صورتين Ùقط ÙÙŠ كل منشور. - zero: يمكن للمستخدمين الجدد وضع أيّ عدد من الصور ÙÙŠ أي منشور. + zero: "يمكن للمستخدمين الجدد وضع أيّ عدد من الصور ÙÙŠ أي منشور." + one: "عذرا، يمكن للأعضاء الجدد وضع صورة واحدة Ùقط ÙÙŠ كل منشور." + two: "آسÙون، يمكن للمستخدمين الجدد وضع صورتين Ùقط ÙÙŠ كل منشور." + few: "آسÙون، يمكن للمستخدمين الجدد وضع %{count} صور Ùقط ÙÙŠ كل منشور." + many: "آسÙون، يمكن للمستخدمين الجدد وضع %{count} صورة Ùقط ÙÙŠ كل منشور." + other: "عذرا، يمكن للأعضاء الجدد وضع %{count} صورة Ùقط ÙÙŠ كل منشور." no_attachments_allowed: "عذرا، لا يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ Ù…Ù„ÙØ§Øª ÙÙŠ المنشورات." too_many_attachments: - few: آسÙون، يمكن للمستخدمين الجدد Ø¥Ø±ÙØ§Ù‚ %{count} Ù…Ù„ÙØ§Øª Ùقط إلى كل منشور. - many: آسÙون، يمكن للمستخدمين الجدد Ø¥Ø±ÙØ§Ù‚ %{count} Ù…Ù„ÙØ§ Ùقط إلى كل منشور. - one: عذرا، يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ مل٠واحد Ùقط ÙÙŠ كل منشور. - other: عذرا، يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ %{count} مل٠Ùقط ÙÙŠ كل منشور. - two: آسÙون، يمكن للمستخدمين الجدد Ø¥Ø±ÙØ§Ù‚ ملÙين Ùقط إلى كل منشور. - zero: عذرا، يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ %{count} مل٠Ùقط إلى كل منشور. + zero: "عذرا، يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ %{count} مل٠Ùقط إلى كل منشور." + one: "عذرا، يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ مل٠واحد Ùقط ÙÙŠ كل منشور." + two: "آسÙون، يمكن للمستخدمين الجدد Ø¥Ø±ÙØ§Ù‚ ملÙين Ùقط إلى كل منشور." + few: "آسÙون، يمكن للمستخدمين الجدد Ø¥Ø±ÙØ§Ù‚ %{count} Ù…Ù„ÙØ§Øª Ùقط إلى كل منشور." + many: "آسÙون، يمكن للمستخدمين الجدد Ø¥Ø±ÙØ§Ù‚ %{count} Ù…Ù„ÙØ§ Ùقط إلى كل منشور." + other: "عذرا، يمكن للأعضاء الجدد Ø¥Ø±ÙØ§Ù‚ %{count} مل٠Ùقط ÙÙŠ كل منشور." no_links_allowed: "عذرا، لا يمكن للأعضاء الجدد وضع روابط ÙÙŠ المنشورات." too_many_links: - few: آسÙون، يمكن للمستخدمين الجدد وضع %{count} روابط Ùقط ÙÙŠ كل منشور. - many: آسÙون، يمكن للمستخدمين الجدد وضع %{count} رابطا Ùقط ÙÙŠ كل منشور. - one: عذرا، يمكن الأعضاء الجدد وضع رابطا واحدا Ùقط ÙÙŠ كل منشور. - other: عذرا، يمكن للأعضاء الجدد وضع %{count} رابط Ùقط ÙÙŠ كل منشور. - two: آسÙون، يمكن للمستخدمين الجدد وضع رابطين Ùقط ÙÙŠ كل منشور. - zero: يمكن للمستخدمين الجدد وضع أيّ عدد من الروابط ÙÙŠ أي منشور. + zero: "يمكن للمستخدمين الجدد وضع أيّ عدد من الروابط ÙÙŠ أي منشور." + one: "عذرا، يمكن الأعضاء الجدد وضع رابطا واحدا Ùقط ÙÙŠ كل منشور." + two: "آسÙون، يمكن للمستخدمين الجدد وضع رابطين Ùقط ÙÙŠ كل منشور." + few: "آسÙون، يمكن للمستخدمين الجدد وضع %{count} روابط Ùقط ÙÙŠ كل منشور." + many: "آسÙون، يمكن للمستخدمين الجدد وضع %{count} رابطا Ùقط ÙÙŠ كل منشور." + other: "عذرا، يمكن للأعضاء الجدد وضع %{count} رابط Ùقط ÙÙŠ كل منشور." spamming_host: "عذرا، لا يمكنك نشر رابط لهذا العنوان." user_is_suspended: "غير مسموح للأعضاء المعلّقة عضويتهم النشر." topic_not_found: "حدث خطب ما. قد يكون الموضوع Ø£ÙØºÙ„Ù‚ أو Ø­ÙØ°Ù وأنت تشاهده؟" @@ -267,12 +267,12 @@ ar: trust_level_4: "مستوى_الثقة_4" education: until_posts: - few: '%{count} مشاركات' - many: '%{count} مشاركة' - one: منشور واحد - other: '%{count} منشور' - two: مشاركتان - zero: لا مشاركات + zero: "لا مشاركات" + one: "منشور واحد" + two: "مشاركتان" + few: "%{count} مشاركات" + many: "%{count} مشاركة" + other: "%{count} منشور" 'new-topic': | مرحبا بك ÙÙŠ %{site_name} — **شكرا لك لأجل بدء محادثه جديدة!** @@ -375,23 +375,6 @@ ar: title: "مرحبًا بك ÙÙŠ دسكورس" lounge_welcome: title: "مرحبا بك ÙÙŠ الاستراحة" - body: |2 - - تهانينا! :confetti_ball: - - إذا تمكنت من رؤية هذا الموضوع, Ùقد تم ترقيتك مؤخرا لـمستوي**منتظم** (مستوى الثقة 3). - - انت الأن تستطيع &hellip - - * تعديل العنوان لأي موضوع. - * تغيير القسم لأي موضوع. - * جميع الروابط التي تضعها ØªÙØ£Ø±Ø´Ù من قبل محركات البحث ( خيار [automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) غير Ù…ÙØ¹Ù„). - * الوصول لقسم خاص للأعضاء بمستوى الثقة 3 أو أعلى. - * Ø¥Ø®ÙØ§Ø¡ رسائل السبام ببلاغ واحد. - - من هنا [القائمة الحالية للأعضاء بمستوي متابع منتظم](/badges/3/regular). - - شكرا لكونك جزءً هاما من هذا المجتمع! category: topic_prefix: "عن القسم %{category}." replace_paragraph: "(قم بإستبدال هذة الÙقرة بوص٠مختصر للقسم الجديد. هذا الوص٠سو٠يظهر ÙÙŠ منطقة إختيار القسم, لذا حاول ان يكون اقل من 200 حرÙ. ** حتي تقوم بتعديل هذا الوص٠أو تقوم Ø¨Ø¥Ø¶Ø§ÙØ© موضوعات, هذا القسم لن يظهر ÙÙŠ ØµÙØ­Ø© الأقسام**)" @@ -407,13 +390,6 @@ ar: cannot_delete: uncategorized: "لا يمكن حذ٠قسم \"غير مصنÙ\"" has_subcategories: "لا يمكن حذ٠هذا القسم لأن له أقسام ÙØ±Ø¹ÙŠÙ‘Ø©." - topic_exists: - few: لا يمكنك حذ٠هذه Ø§Ù„ÙØ¦Ø© ï»·Ù† لها مواضيع قليلة.أقدم موضوع هو %{topic_link}. - many: لا يمكنك حذ٠هذه Ø§Ù„ÙØ¦Ø© ï»·Ù† لها مواضيع كثيرة.أقدم موضوع هو %{topic_link}. - one: لا يمكنك حذ٠هذه Ø§Ù„ÙØ¦Ø© ï»·Ù† لها موضوع واحد.أقدم موضوع هو %{topic_link}. - other: لا يمكنك حذ٠هذا القسم ï»·Ù† به %{count} موضوع. أقدم موضوع هو %{topic_link}. - two: لا يمكنك حذ٠هذه Ø§Ù„ÙØ¦Ø© ï»·Ù† لها موضوعان.أقدم موضوع هو %{topic_link}. - zero: لا يمكنك حذ٠هذه Ø§Ù„ÙØ¦Ø© ﻷنها لا تملك موضوع.أقدم موضوع هو %{topic_link}. topic_exists_no_oldest: "لا يمكن حذ٠هذا القسم لأن عدد الموضوعات به هو %{count}." uncategorized_description: "الموضوعات التي لا تحتاج الي ان تصن٠تحت قسم معين, او لا تندرج تحت الأقسام الأخري." trust_levels: @@ -430,185 +406,185 @@ ar: change_failed_explanation: "حاولت تخÙيض رتبة %{user_name} إلى '%{new_trust_level}'. أيضا مستوى الثقة لهم حاليا '%{current_trust_level}'. %{user_name} سيبقى ÙÙŠ '%{current_trust_level}' - إذا رغبت ÙÙŠ تخÙيض رتبة عضو أنظر لمستوى الثقة أولاً." rate_limiter: hours: - few: '%{count} ساعات' - many: '%{count} ساعة' - one: ساعة واحدة - other: '%{count} ساعة' - two: ساعتان - zero: أقلّ من ساعة + zero: "أقلّ من ساعة" + one: "ساعة واحدة" + two: "ساعتان" + few: "%{count} ساعات" + many: "%{count} ساعة" + other: "%{count} ساعة" minutes: - few: '%{count} دقائق' - many: '%{count} دقيقة' - one: دقيقة واحدة - other: '%{count} دقيقة' - two: دقيقتان - zero: أقلّ من دقيقة + zero: "أقلّ من دقيقة" + one: "دقيقة واحدة" + two: "دقيقتان" + few: "%{count} دقائق" + many: "%{count} دقيقة" + other: "%{count} دقيقة" seconds: - few: '%{count} ثوان' - many: '%{count} ثانية' - one: ثانية واحدة - other: '%{count} ثانية' - two: ثانيتان - zero: أقلّ من ثانية + zero: "أقلّ من ثانية" + one: "ثانية واحدة" + two: "ثانيتان" + few: "%{count} ثوان" + many: "%{count} ثانية" + other: "%{count} ثانية" datetime: distance_in_words: half_a_minute: "< 1دق" less_than_x_seconds: - few: < %{count}ثا - many: < %{count}ثا - one: < %{count}ثا - other: < %{count}ثا - two: < %{count}ثا - zero: < %{count}ثا + zero: "< %{count}ثا" + one: "< %{count}ثا" + two: "< %{count}ثا" + few: "< %{count}ثا" + many: "< %{count}ثا" + other: "< %{count}ثا" x_seconds: - few: '%{count}ثا' - many: '%{count}ثا' - one: '%{count}ثا' - other: '%{count}ثا' - two: '%{count}ثا' - zero: '%{count}ثا' + zero: "%{count}ثا" + one: "%{count}ثا" + two: "%{count}ثا" + few: "%{count}ثا" + many: "%{count}ثا" + other: "%{count}ثا" less_than_x_minutes: - few: < %{count}دق - many: < %{count}دق - one: < %{count}دق - other: < %{count}دق - two: < %{count}دق - zero: < %{count}دق + zero: "< %{count}دق" + one: "< %{count}دق" + two: "< %{count}دق" + few: "< %{count}دق" + many: "< %{count}دق" + other: "< %{count}دق" x_minutes: - few: '%{count}دق' - many: '%{count}دق' - one: '%{count}دق' - other: '%{count}دق' - two: '%{count}دق' - zero: '%{count}دق' + zero: "%{count}دق" + one: "%{count}دق" + two: "%{count}دق" + few: "%{count}دق" + many: "%{count}دق" + other: "%{count}دق" about_x_hours: - few: '%{count}سا' - many: '%{count}سا' - one: '%{count}سا' - other: '%{count}سا' - two: '%{count}سا' - zero: '%{count}سا' + zero: "%{count}سا" + one: "%{count}سا" + two: "%{count}سا" + few: "%{count}سا" + many: "%{count}سا" + other: "%{count}سا" x_days: - few: '%{count}يوم' - many: '%{count}يوم' - one: '%{count}يوم' - other: '%{count}يوم' - two: '%{count}يوم' - zero: '%{count}يوم' + zero: "%{count}يوم" + one: "%{count}يوم" + two: "%{count}يوم" + few: "%{count}يوم" + many: "%{count}يوم" + other: "%{count}يوم" about_x_months: - few: '%{count}شهر' - many: '%{count}شهر' - one: '%{count}شهر' - other: '%{count}شهر' - two: '%{count}شهر' - zero: '%{count}شهر' + zero: "%{count}شهر" + one: "%{count}شهر" + two: "%{count}شهر" + few: "%{count}شهر" + many: "%{count}شهر" + other: "%{count}شهر" x_months: - few: '%{count}شهر' - many: '%{count}شهر' - one: '%{count}شهر' - other: '%{count}شهر' - two: '%{count}شهر' - zero: '%{count}شهر' + zero: "%{count}شهر" + one: "%{count}شهر" + two: "%{count}شهر" + few: "%{count}شهر" + many: "%{count}شهر" + other: "%{count}شهر" about_x_years: - few: '%{count}عام' - many: '%{count}عام' - one: '%{count}عام' - other: '%{count}عام' - two: '%{count}عام' - zero: '%{count}عام' + zero: "%{count}عام" + one: "%{count}عام" + two: "%{count}عام" + few: "%{count}عام" + many: "%{count}عام" + other: "%{count}عام" over_x_years: - few: '> %{count}عام' - many: '> %{count}عام' - one: '> %{count}عام' - other: '> %{count}عام' - two: '> %{count}عام' - zero: '> %{count}عام' + zero: "> %{count}عام" + one: "> %{count}عام" + two: "> %{count}عام" + few: "> %{count}عام" + many: "> %{count}عام" + other: "> %{count}عام" almost_x_years: - few: '%{count}عام' - many: '%{count}عام' - one: '%{count}عام' - other: '%{count}عام' - two: '%{count}عام' - zero: '%{count}عام' + zero: "%{count}عام" + one: "%{count}عام" + two: "%{count}عام" + few: "%{count}عام" + many: "%{count}عام" + other: "%{count}عام" distance_in_words_verbose: half_a_minute: "منذ لحظات" less_than_x_seconds: - few: منذ لحظات - many: منذ لحظات - one: منذ لحظات - other: منذ لحظات - two: منذ لحظات - zero: منذ لحظات + zero: "منذ لحظات" + one: "منذ لحظات" + two: "منذ لحظات" + few: "منذ لحظات" + many: "منذ لحظات" + other: "منذ لحظات" x_seconds: - few: قبل %{count} ثوان - many: قبل %{count} ثانية - one: قبل ثانية واحدة - other: قبل %{count} ثانية - two: قبل ثانيتين - zero: قبل لحظات + zero: "قبل لحظات" + one: "قبل ثانية واحدة" + two: "قبل ثانيتين" + few: "قبل %{count} ثوان" + many: "قبل %{count} ثانية" + other: "قبل %{count} ثانية" less_than_x_minutes: - few: قبل أقل من %{count} دقائق - many: قبل أقل من %{count} دقيقة - one: قبل أقل من دقيقة - other: قبل أقل من %{count} دقيقة - two: قبل أقل من دقيقتين - zero: قبل لحظات + zero: "قبل لحظات" + one: "قبل أقل من دقيقة" + two: "قبل أقل من دقيقتين" + few: "قبل أقل من %{count} دقائق" + many: "قبل أقل من %{count} دقيقة" + other: "قبل أقل من %{count} دقيقة" x_minutes: - few: قبل %{count} دقائق - many: قبل %{count} دقيقة - one: قبل دقيقة واحدة - other: قبل %{count} دقيقة - two: قبل دقيقتين - zero: قبل أقل من دقيقة + zero: "قبل أقل من دقيقة" + one: "قبل دقيقة واحدة" + two: "قبل دقيقتين" + few: "قبل %{count} دقائق" + many: "قبل %{count} دقيقة" + other: "قبل %{count} دقيقة" about_x_hours: - few: قبل %{count} ساعات - many: قبل %{count} ساعة - one: قبل ساعة واحدة - other: قبل %{count} ساعة - two: قبل ساعتين - zero: قبل أقل من ساعة + zero: "قبل أقل من ساعة" + one: "قبل ساعة واحدة" + two: "قبل ساعتين" + few: "قبل %{count} ساعات" + many: "قبل %{count} ساعة" + other: "قبل %{count} ساعة" x_days: - few: قبل %{count} أيام - many: قبل %{count} يوما - one: قبل يوم واحد - other: قبل %{count} يوم - two: قبل يومين - zero: قبل أقل من يوم + zero: "قبل أقل من يوم" + one: "قبل يوم واحد" + two: "قبل يومين" + few: "قبل %{count} أيام" + many: "قبل %{count} يوما" + other: "قبل %{count} يوم" about_x_months: - few: قبل حوالي %{count} أشهر - many: قبل حوالي %{count} شهرا - one: قبل حوالي شهر واحد - other: قبل حوالي %{count} شهر - two: قبل حوالي شهرين - zero: قبل حوالي أقل من شهر + zero: "قبل حوالي أقل من شهر" + one: "قبل حوالي شهر واحد" + two: "قبل حوالي شهرين" + few: "قبل حوالي %{count} أشهر" + many: "قبل حوالي %{count} شهرا" + other: "قبل حوالي %{count} شهر" x_months: - few: قبل %{count} أشهر - many: قبل %{count} شهرا - one: قبل شهر واحد - other: قبل %{count} شهر - two: قبل شهرين - zero: قبل أقل من شهر + zero: "قبل أقل من شهر" + one: "قبل شهر واحد" + two: "قبل شهرين" + few: "قبل %{count} أشهر" + many: "قبل %{count} شهرا" + other: "قبل %{count} شهر" about_x_years: - few: قبل حوالي %{count} سنوات - many: قبل حوالي %{count} سنة - one: قبل حوالي سنة واحدة - other: قبل حوالي %{count} سنة - two: قبل حوالي سنتين - zero: قبل حوالي أقل من سنة + zero: "قبل حوالي أقل من سنة" + one: "قبل حوالي سنة واحدة" + two: "قبل حوالي سنتين" + few: "قبل حوالي %{count} سنوات" + many: "قبل حوالي %{count} سنة" + other: "قبل حوالي %{count} سنة" over_x_years: - few: قبل أكثر من %{count} سنوات - many: قبل أكثر من %{count} سنة - one: قبل أكثر من سنة واحد - other: قبل أكثر من %{count} سنة - two: قبل أكثر من سنتين - zero: قبل أكثر من أقل من سنة + zero: "قبل أكثر من أقل من سنة" + one: "قبل أكثر من سنة واحد" + two: "قبل أكثر من سنتين" + few: "قبل أكثر من %{count} سنوات" + many: "قبل أكثر من %{count} سنة" + other: "قبل أكثر من %{count} سنة" almost_x_years: - few: قبل حوالي %{count} سنوات - many: قبل حوالي %{count} سنة - one: قبل حوالي سنة واحدة - other: قبل حوالي %{count} سنة - two: قبل حوالي سنتين - zero: قبل حوالي أقل من سنة + zero: "قبل حوالي أقل من سنة" + one: "قبل حوالي سنة واحدة" + two: "قبل حوالي سنتين" + few: "قبل حوالي %{count} سنوات" + many: "قبل حوالي %{count} سنة" + other: "قبل حوالي %{count} سنة" password_reset: no_token: "Ù†Ø£Ø³ÙØŒ رابط تغيير كلمة السّرّ قديم جدًّا. انقر زرّ â€Ù„ÙØ¬â€œ واختر â€Ù†Ø³ÙŠØª كلمة السّرّ“ لنرسل لك رابطًا آخر." choose_new: "اختر كلمة المرور الجديدة" @@ -678,14 +654,8 @@ ar: description: 'Ø£ÙØ¹Ø¬ÙŽØ¨ بهذا المنشور' short_description: 'Ø£ÙØ¹Ø¬ÙŽØ¨ بهذا المنشور' long_form: 'أعجبت بهذه' - vote: - title: 'تصويت' - description: 'صوت لهذا المنشور' - short_description: 'صوت لهذا المنشور' - long_form: 'صوت لهذا المنشور' user_activity: no_bookmarks: - self: "ليس لديك منشورات Ù…ÙØ¶Ù„Ø©. Ø§Ø¶Ø§ÙØ© المنشورات إلي Ø§Ù„Ù…ÙØ¶Ùلة يتيح لك الرّجوع إليها لاحقًا بسهولة." others: "لا علامات." no_likes_given: self: "لم تعجبك أيّة منشور." @@ -822,8 +792,6 @@ ar: num_users: "اﻷعضاء" top_referred_topics: title: "أعلى مواضيع مشارة" - xaxis: "موضوع" - num_clicks: "نقرات" page_view_anon_reqs: title: "مجهولون" xaxis: "يوم" @@ -880,7 +848,6 @@ ar: xaxis: "اليوم" yaxis: "مجموع" mobile_visits: - title: "زيارات العضو" xaxis: "اليوم" yaxis: "عدد الزيارات" dashboard: @@ -985,7 +952,6 @@ ar: post_menu: "تحديد العناصر التي تظهر ÙÙŠ القائمة المختصرة للمنشور، Ùˆ ترتيبها. مثل ( اعجاب | تحرير | تبليغ | حذ٠| مشاركة | علّم | رد )" post_menu_hidden_items: "العناصر المخÙية بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ ÙÙŠ القائمة المختصره للمنشور مالم يتم الضغط علي زر الاظهار" share_links: "تحدد اي العناصر تظهر ÙÙŠ قائمة مشاركة المنشور Ùˆ ترتيبها." - track_external_right_clicks: "تتبع الروابط الخارجية التي تم النقر عليها بزر الماوس الايمن (على سبيل المثال: ÙØªØ­Øª ÙÙŠ علامة تبويب جديدة) هذا اللإعداد معطل Ø§ÙØªØ±Ø§Ø¶ÙŠØ§ لأنه يعيد كتابة عناوين المواقع." site_contact_username: "اسم العضو Ø§Ù„Ù…ÙØ³ØªØ®Ø¯ÙŽÙ… لارسال جميع الرسائل الالية, اذا ترك الحقل ÙØ§Ø±ØºØ§ سيتم استخدام اسم الحساب Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù„Ù„Ù†Ø¸Ø§Ù…." send_welcome_message: "أرسل لكل الأعضاء الجدد رسالة ترحيب مع دليل البدء السريع." suppress_reply_directly_below: "لا تظهر العد الرد توسيع على ÙˆØ¸ÙŠÙØ© عندما يكون هناك سوى رد واحد مباشرة تحت هذا المنصب." @@ -1156,7 +1122,6 @@ ar: min_first_post_typing_time: "الحد الأدنى من الوقت بالمللي ثانية يجب على المستخدم كتابته خلال المشاركة الأولى، إذا لم تتم الاستجابة للحد الأدنى للمشاركة ستدخل تلقائيا ÙÙŠ قائمة انتظار المواÙقة على الاحتياجات. تعيين إلى 0 للتعطيل (غير مستحسن)" reply_by_email_enabled: "ØªÙØ¹ÙŠÙ„ الرد على الموضوع بواسطة البريد الالكتروني" reply_by_email_address: "قالب للرد على عنوان البريد الإلكتروني الوارد بواسطة البريد الإلكتروني، مثال: %{reply_key}@reply.example.com أو الردود+%{reply_key}@example.com" - disable_emails: "امنع دسكورس من إرسال أيّ نوع من البريد" strip_images_from_short_emails: "شريط الصور من البريد الإلكتروني لها حجم أقل من 2800 بايت" short_email_length: "طول أقصر بريد الكتروني بـ Bytes." display_name_on_email_from: "أعرض الاسماء كاملة ÙÙŠ البريد الالكتروني من المجال." @@ -1292,69 +1257,66 @@ ar: different_users: "المشاركات من اعضاء مختلÙين لايÙمكن دمجهم" move_posts: new_topic_moderator_post: - few: '%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] ' - many: '%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] ' - one: 'المشاركه التي انقسمت الي موضوع جديد : %{topic_link}' - other: '%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] ' - two: '%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] ' - zero: 'المشاركه التي انقسمت الي موضوع جديد: %{topic_link}' + zero: "المشاركه التي انقسمت الي موضوع جديد: %{topic_link}" + one: "المشاركه التي انقسمت الي موضوع جديد : %{topic_link}" + two: "%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] " + few: "%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] " + many: "%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] " + other: "%{count} المشاركات التي انقسمت الي موضوع جديد: %{topic_link] " existing_topic_moderator_post: - few: '%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}' - many: '%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}' - one: المشاركه التي اندمجت الي موضوع واحد %{topic_link} - other: '%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}' - two: '%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}' - zero: المشاركه التي اندمجت الي موضوع واحد %{topic_link} - change_owner: - post_revision_text: "نقل الملكية من %{old_user} إلى %{new_user}" - deleted_user: "عضو محذوÙ" + zero: "المشاركه التي اندمجت الي موضوع واحد %{topic_link}" + one: "المشاركه التي اندمجت الي موضوع واحد %{topic_link}" + two: "%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}" + few: "%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}" + many: "%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}" + other: "%{count} المشاركات التي اندمجت الي مشاركه واحده %{topic_link}" topic_statuses: archived_enabled: "هذا الموضوع مؤرش٠الأن. لن تستطيع أن تعدل عليه بأي طريقة." archived_disabled: "هذا الموضوع غير مؤرش٠الأن.لم يجمد، Ùˆ تستطيع أن تعدل عليه." closed_enabled: "تم اغلاق هذا الموضوع لا يسمح Ø¨Ø§Ø¶Ø§ÙØ© ردود جديدة" closed_disabled: "تم ÙØªØ­ هذا الموضوع الان ويسمح Ø¨Ø§Ø¶Ø§ÙØ© ردود جديدة " autoclosed_enabled_days: - few: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان. - many: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان. - one: هذا الموضوع تم اغلاقه تلقائيا بعد 1 يوم .الردود الجديده غير Ù…ØªÙˆÙØ±Ù‡ بعد الان. - other: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان. - two: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان. - zero: هذا الموضوع تم اغلاقه تلقائيا بعد 1 يوم .الردود الجديده غير Ù…ØªÙˆÙØ±Ù‡ بعد الان. + zero: "هذا الموضوع تم اغلاقه تلقائيا بعد 1 يوم .الردود الجديده غير Ù…ØªÙˆÙØ±Ù‡ بعد الان." + one: "هذا الموضوع تم اغلاقه تلقائيا بعد 1 يوم .الردود الجديده غير Ù…ØªÙˆÙØ±Ù‡ بعد الان." + two: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان." + few: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان." + many: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان." + other: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ايام . الردود الجديده غير مسموحه بعد الان." autoclosed_enabled_hours: - few: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه - many: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه - one: هذا الموضوع تم اغلاقه تلقائيا بعد 1 ساعه. الردود الجديده غير مسموحه بعد الان. - other: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه - two: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه - zero: هذا الموضوع تم اغلاقه تلقائيا بعد 1 ساعه. الردود الجديده غير مسموحه بعد الان. + zero: "هذا الموضوع تم اغلاقه تلقائيا بعد 1 ساعه. الردود الجديده غير مسموحه بعد الان." + one: "هذا الموضوع تم اغلاقه تلقائيا بعد 1 ساعه. الردود الجديده غير مسموحه بعد الان." + two: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه" + few: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه" + many: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه" + other: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} ساعات. الردود الجديده غير مسموحه" autoclosed_enabled_minutes: - few: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} دقائق. الردود الجديده غير مسموحه بعد الان. - many: 'هذا الموضوع تم اغلاقه تلقائيا بعد %{count} دقائق. الردود الجديده غير مسموحه بعد الان ' - one: هذا الموضوع تم غلاقه تلقائيا بعد 1 دقيقه . الردود الجديده غير مسموحه بعد الان. - other: هذا الموضوع تم اغلاقه تلقائيا بعد %{count} دقائق. الردود الجديده غير مسموحه بعد الان - two: هذا الموضوع تم تم اغلاقه تلقائيا بعد %{count} دقائق . الردود الجديده غير مسموحه بعد الان. - zero: هذا الموضوع تم غلاقه تلقائيا بعد 1 دقيقه . الردود الجديده غير مسموحه بعد الان. + zero: "هذا الموضوع تم غلاقه تلقائيا بعد 1 دقيقه . الردود الجديده غير مسموحه بعد الان." + one: "هذا الموضوع تم غلاقه تلقائيا بعد 1 دقيقه . الردود الجديده غير مسموحه بعد الان." + two: "هذا الموضوع تم تم اغلاقه تلقائيا بعد %{count} دقائق . الردود الجديده غير مسموحه بعد الان." + few: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} دقائق. الردود الجديده غير مسموحه بعد الان." + many: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} دقائق. الردود الجديده غير مسموحه بعد الان " + other: "هذا الموضوع تم اغلاقه تلقائيا بعد %{count} دقائق. الردود الجديده غير مسموحه بعد الان" autoclosed_enabled_lastpost_days: - few: هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه. - many: هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه. - one: هذا الموضوع تم اغلاقه تلقائيا 1 يوم بعد اخر رد . الردود الجديده غير مسموحه بعد الان. - other: هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه. - two: هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه. - zero: هذا الموضوع تم اغلاقه تلقائيا 1 يوم بعد اخر رد . الردود الجديده غير مسموحه بعد الان. + zero: "هذا الموضوع تم اغلاقه تلقائيا 1 يوم بعد اخر رد . الردود الجديده غير مسموحه بعد الان." + one: "هذا الموضوع تم اغلاقه تلقائيا 1 يوم بعد اخر رد . الردود الجديده غير مسموحه بعد الان." + two: "هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه." + few: "هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه." + many: "هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه." + other: "هذا الموضوع تم اغلاقه تلقائيا %{count} ايام بعد اخر رد. الردود الجديده غير مسموحه." autoclosed_enabled_lastpost_hours: - few: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} ساعات من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - many: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} ساعة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - one: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد ساعة واحدة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - other: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} ساعة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - two: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد ساعتين من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - zero: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد أقلّ من ساعة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. + zero: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد أقلّ من ساعة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + one: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد ساعة واحدة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + two: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد ساعتين من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + few: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} ساعات من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + many: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} ساعة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + other: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} ساعة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." autoclosed_enabled_lastpost_minutes: - few: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} دقائق من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - many: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} دقيقة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - one: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد دقيقة واحدة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - other: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} دقيقة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - two: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد دقيقتين من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. - zero: Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد أقلّ من دقيقة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة. + zero: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد أقلّ من دقيقة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + one: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد دقيقة واحدة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + two: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد دقيقتين من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + few: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} دقائق من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + many: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} دقيقة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." + other: "Ø£ÙØºÙ„Ù‚ هذا الموضوع آليًّا بعد %{count} دقيقة من آخر ردّ. لم يعد ممكنًا وضع ردود جديدة." autoclosed_disabled: "تم ÙØªØ­ هذا الموضوع الان ويسمح Ø¨Ø§Ø¶Ø§ÙØ© ردود جديدة " autoclosed_disabled_lastpost: "تم ÙØªØ­ هذا الموضوع الان ويسمح Ø¨Ø§Ø¶Ø§ÙØ© ردود جديدة " pinned_enabled: "هذا الموضوع مثبت الأن. سو٠يظهر ÙÙŠ اعلي القسم الخاص به حتي يتم إزالة التثبيت لكل الاعضاء بواسطة احد Ø§ÙØ±Ø§Ø¯ طاقم العمل او كل عضو Ù„Ù†ÙØ³Ø© ." @@ -1384,7 +1346,6 @@ ar: reserved_username: "اسم المستخدم ذلك غير مسموح." missing_user_field: "لم تÙكمل ÙƒØ§ÙØ© الحقول المطلوبة " user: - no_accounts_associated: "لا حسابات مرتبطة" username: short: "يجب أن تكون على الأقل %{min} أحرÙ" long: "يجب ان تكون الاحر٠اكثر من %{max} " @@ -1403,12 +1364,12 @@ ar: domain_not_allowed: "موقع الوبّ غير صالح. النّطاقات الممكنة هي: %{domains}" flags_reminder: subject_template: - few: '%{count} بلاغات تنتظر التعامل معها' - many: '%{count} بلاغات تنتظر التعامل معها' - one: بلاغ واحد ينتظر التعامل معه - other: '%{count} بلاغات تنتظر التعامل معها' - two: بلاغان ينتظران التعامل معهما - zero: لا يوجد تبليغات تنتظر التعامل معها + zero: "لا يوجد تبليغات تنتظر التعامل معها" + one: "بلاغ واحد ينتظر التعامل معه" + two: "بلاغان ينتظران التعامل معهما" + few: "%{count} بلاغات تنتظر التعامل معها" + many: "%{count} بلاغات تنتظر التعامل معها" + other: "%{count} بلاغات تنتظر التعامل معها" unsubscribe_mailer: subject_template: "أكّد عدم رغبتك بعد الآن باستقبال تحديثات %{site_title} على البريد" invite_password_instructions: @@ -1482,12 +1443,12 @@ ar: القسم الذي ارسلت له يسمح Ùقط لعناوين البريد الإلكتروني Ø§Ù„Ù…Ø¹Ø±ÙˆÙØ© Ùˆ الاعضاء الحاصلين علي صلاحية مناسبة بعمل رد. إذا كنت تعتقد ان هذا خطا [تواصل مع طاقم العمل](%{base_url}/about). pending_users_reminder: subject_template: - few: '%{count} أعضاء تنتظر المواÙقة.' - many: '%{count} أعضاء تنتظر المواÙقة.' - one: عضوا واحد ينتظر المواÙقة. - other: '%{count} أعضاء تنتظر المواÙقة.' - two: عضوان ينتظران المواÙقة. - zero: لا يوجد أعضاء تنتظر المواÙقة. + zero: "لا يوجد أعضاء تنتظر المواÙقة." + one: "عضوا واحد ينتظر المواÙقة." + two: "عضوان ينتظران المواÙقة." + few: "%{count} أعضاء تنتظر المواÙقة." + many: "%{count} أعضاء تنتظر المواÙقة." + other: "%{count} أعضاء تنتظر المواÙقة." text_body_template: | هناك تسجيلات مستخدمين جديده تنظر لكي يتم قبولها (او Ø±ÙØ¶Ù‡Ø§) قبل ان يمكنهم الوصول لهذه المدونه. [الرجاء مراجعنهم ÙÙŠ قسم المدراء](%{base_url}/admin/users/list/pending). @@ -1511,7 +1472,6 @@ ar: description: "لست مهتما ÙÙŠ تلقي هذه الرسائل الالكترونيه؟ لا مشكله! اضغط تحت ليتم الغاء اشتركك Ùورا:" reply_by_email: "[زيارة الموضوع](%{base_url}%{url}) أو بالرد على هذا البريد للإجابه." visit_link_to_respond: "[زيارة الموضوع](%{base_url}%{url}) للرد." - visit_link_to_respond_pm: "[Ø²ÙØ± الرّسالة](%{base_url}%{url}) للرّدّ." posted_by: "مشاركة بواسطة %{username} على %{post_date}" user_posted_pm_staged: subject_template: "%{optional_re}%{topic_title}" @@ -1554,7 +1514,6 @@ ar: recent_topics: "الأحدث" see_more: "المزيد" search_title: "البحث ÙÙŠ الموقع" - search_google: "غوغل" login_required: welcome_message: | ## اهلا بك ÙÙŠ %{title} @@ -1579,21 +1538,6 @@ ar: flag_reason: sockpuppet: "عضو جديد نشر موضوع جديد ثم قام عضو جديد اخر له Ù†ÙØ³ الIP (%{ip_address}) بالرد علية. انظر إعدادات`flag_sockpuppets`." spam_hosts: "عضو جديد حاول إنشاء عدة منشورات تحتوي علي روابط Ù„Ù†ÙØ³ العنوان (%{domain}). انظر إعدادات `newuser_spam_host_threshold`." - email_log: - no_user: "تعذّر العثور على مستخدم معرّÙÙ‡ %{user_id}" - anonymous_user: "المستخدم مجهول" - suspended_not_pm: "عضو Ù…ÙˆÙ‚ÙˆÙØŒ ليست رسالة" - seen_recently: "تم رؤية هذا المستخدم مؤخراً" - post_not_found: "تعذر إيجاد المشاركة ذات المعر٠%{post_id}" - notification_already_read: "تم قراءة هذه الاشعارات " - topic_nil: "مشاركة.موضوع ØµÙØ±" - post_deleted: "تم حذ٠الموضوع من قبل كاتبه " - user_suspended: "تم تعليق حساب المستخدم" - already_read: "المستخدم قرأ هذه المشاركة " - message_blank: "رسالة ÙØ§Ø±ØºØ©" - message_to_blank: "رسالة ÙØ§Ø±ØºØ© " - text_part_body_blank: "text_part.body ÙØ§Ø±Øº" - body_blank: "محتوى ÙØ§Ø±Øº " color_schemes: base_theme_name: "قاعدة" about: "حول " @@ -1700,113 +1644,40 @@ ar: editor: name: Ù…ÙØµØ­Ø­ description: لقد قمت بأول تصحيح لمنشور - long_description: | - تÙمنح هذة الشارة عند اول مرة تقوم Ùيها بتصحيح منشور قمت بنشرة. ÙÙŠ حين أنك لن تكون قادرا على تصحيح منشوراتك إلى الأبد. التصحيح هو دائما Ùكرة جيدة. بإمكانك تحسين منشورك بتصحيح الأخطاء اللغوية او Ø¥Ø¶Ø§ÙØ© اي جزء ÙØ§ØªÙƒ وقت كتابة المنشور او لتعيد صياغة المنشور بالكامل لتعرض المضمون بشكل Ø£ÙØ¶Ù„. basic_user: name: عضو اساسي - description: تÙمنح كل صلاحيات المجتمع الأساسية - long_description: | - تÙمنح هذه الشارة عندما تصل إلي مستوى الثقة الأول. اي انك قمت بقضاء بعض الوقت ÙÙŠ مجتمعنا Ùˆ ØªØ¹Ø±ÙØª علي اهداÙÙ‡ Ùˆ مبادئة. لذا انت الأن تتمتح بكل صلاحيات المجتمع الأساسية. - - ## صلاحيات الشارة - - ارسال رسائل خاصة لأعضاء المجتمع - - الإبلاغ عن المنشورات - - Ø±ÙØ¹ اكثر من صورة إلي المنشورات - - Ø±ÙØ¹ اي مل٠إلي المنشورات - - وضح اكثر من رابطين بالمنشورات - - المشاركة ÙÙŠ كتابه منشورات الwiki - - الإشارة إلي اكثر من عضوين بالمنشورات member: name: عضو متوسط - description: تÙمنح القدرة علي ارسال دعوات Ùˆ عمل محادثات سرية جماعية Ùˆ المزيد من العجابات. - long_description: | - تÙمنح هذه الشارة عندما تصل إلي مستوى الثقة الثاني. اي انك قمت بقضاء الكثير من الوقت ÙÙŠ مجتمعنا Ùˆ شاركت بالعديد من النقاشات. لذا انت الأن تتمتح بعضوية كاملة بالمجتمع. - - ## صلاحيات الشارة - - دعوة الأعضاء Ùˆ اشخاص من خارج المجتمع للنقاشات - - انشاء محادثة سرية لمجموعة من الأشخاص - - زيادة المعدل اليومي للإعجابات المسموحة بمعدل 1.5 regular: name: عضو Ù…ÙØªÙ‚دم - description: تÙمنح القدرة علي إعادة تعيين تصني٠المنشورات Ùˆ تعديل عناوينها Ùˆ ارشÙÙ‡ الروابط التي تشاركها Ùˆ عمل منشورات wiki Ùˆ المزيد من الاعجابات. - long_description: | - تÙمنح هذه الشارة عندما تصل إلي مستوى الثقة الثالث. شكرا علي كونك عضو ÙØ¹Ø§Ù„ بمجتمعنا. عند هذا المستوي تمنح جزء من صلاحيات ÙØ±ÙŠÙ‚ العمل. - - ##صلاحيات الشارة - - اعادة تعيين تصني٠قسم الموضوع Ùˆ عنوانة - - حق الدخول علي قسم مخÙÙŠ يختص بمناقشة موضوعات إدارة المجتمع - - تعطيل الامر ( automatic nofollow ) علي الروابط التي تضعها بمنشوراتك - - Ø§Ø®ÙØ§Ø¡ منشورات الأعضاء ذو المستوي الثقه ØµÙØ± ( الاعضاء الجدد ) ببلاغ واحد - - إنشاء منشورات wiki - - زيادة عدد الاعجابات اليومي المسموح بة الي ضع٠المعدل الطبيعي - - علي عكس الشارات السابقة هذا الشارة ليست دائمة بل يمكنك ان تÙقدها اذا لم ØªØ­Ø§ÙØ¸ علي المعايير المطلوبة ÙÙŠ اخر 100 يوم Ùˆ هي - - - زيارة الموقع علي الاقل 50% من عدد الايام - - الرد علي 10 موضوعات Ù…Ø®ØªÙ„ÙØ© - - مشاهدة 25% من الموضوعات المنشورة - - قراءة 25% من الردود المنشورة - - ان تعطي 30 اعجاب Ùˆ تحصل علي 20 اعجاب علي الاقل من عدد من الأعضاء يقدر بخمس عدد الإعجابات Ùˆ ÙÙŠ ايام Ù…Ø®ØªÙ„ÙØ© تقدر بربع عدد الإعجابات Ùˆ لا ØªÙØ­Ø³Ø¨ الإعجابات بالرسائل الخاصة - - ان لا يصدر بحقق اكثر من 5 بلاغات ÙÙŠ موضوعات Ù…Ø®ØªÙ„ÙØ© Ùˆ من اعضاء مختلÙين مأكدة من قبل طاقم العمل - - ان لا تكون قد تم ايقاÙÙƒ - - محلوظة : هذة المعدلات يمكن ان تغير من قبل مديري الموقع. leader: name: عضو Ù…ÙØ­ØªØ±Ù - description: تÙمنح القدرة علي تعديل اي منشور Ùˆ تثبيتة Ùˆ إغلاقة Ùˆ Ø§Ø±Ø´ÙØªØ© Ùˆ تقسيمة Ùˆ دمجة Ùˆ المزيد من الإجابات. - long_description: | - تÙمنح هذة الشارة عندما تصل إلي مستوي الثقة الرابع. لقد تم اختيارك من قبل طاقم العمل لتكون قائد ÙÙŠ هذا المجتمع Ùˆ لكي تكون مثال يحتذي بة باقي الأعضاء ÙÙŠ Ø§Ù„Ø£ÙØ¹Ø§Ù„ Ùˆ الأقوال. - - ##صلاحيات الشارة - - تعديل كل المنشورات - - تثبيت Ùˆ اذلة تثبيت الموضوعات - - اغلاق الموضوعات - - Ø§Ø±Ø´ÙØ© الموضوعات - - ازالة الموضوعات من القوائم - - تقسيم Ùˆ دمج الموضوعات - - زيادة معدل الاعجابات اليومي الي ثلاث اضعا٠welcome: name: مرحبًا description: تلقيت اعجابا - long_description: | - تÙمنح هذه الشارة عندما تتلقي أولى الإعجابات بمنشورك. تهانينا, لقد نشرت شيئًا وجده أصدقاؤك أعضاء المجتمع أمرا جديرا بالاهتمام ومÙيد! autobiographer: name: كاتب سيرة ذاتية anniversary: name: الذكرى السنوية description: انت الأن عضو بالمجتمع من سنة كاملة Ùˆ نشرت علي الاقل مرة واحدة. - long_description: | - تÙمنح هذة الشارة عندما تكمل عاما كامل كعضو بهذا المجتمع مع النشر علي الاقل لمرة واحدة طوال هذا العام. شكرا علي البقاء معنا طوال هذة المدة. هذا المجتمع كبر بك. nice_post: name: رد رائع description: تلقيت 10 أعجابات على الرد - long_description: | - تÙمنح هذة الشارة عندما تتلقي اكثر من 10 اعجابات علي رد قمت به. ردك حقا ترك طابعا جيدا بالمجتمع Ùˆ Ø¯ÙØ¹ المجتمع إلي الامام. good_post: name: رد ممتاز description: تلقيت 25 إعجابا على الرد - long_description: | - تÙمنح هذة الشارة عندما تتلقي اكثر من 25 اعجابا علي رد قمت به. ردك حقا كان استثنائي Ùˆ نقل النقاش الي مستوي متميز. great_post: name: رد عظيم description: تلقيت 50 إعجابا على الرد - long_description: | - تÙمنح هذة الشارة عندما تتلقي اكثر من 50 اعجابا علي رد قمت به. يا الهول, ردك كان ملهم او ساحر او مرح او ثاقبا Ùˆ المجتمع احبة اكثيرا. nice_topic: name: موضوع رائع description: تلقيت 10 إعجابات على الموضوع - long_description: | - تÙمنح هذة الشارة عندما تتلقي اكثر من 10 اعجابات علي موضوع نشرتة. لقت بدات نقاشا مثيرا احبة المجتمع!. good_topic: name: موضوع ممتاز description: تلقيت 25 اعجابا على الموضوع - long_description: | - تÙمنح هذة الشارة عندما تتلقي اكثر من 25 اعجابا علي موضوع نشرتة. لقد بدات نقاشا متميزا احبة المجتمع!. great_topic: name: موضوع عظيم description: تلقيت 50 إعجابا على الموضوع - long_description: | - تÙمنح هذة الشارة عندما تتلقي اكثر من 50 اعجابا علي موضوع نشرتة. تقد اطلقت نقاشا ملهما احبة المجتمع!. nice_share: name: مشاركة رائعة description: لقد شاركت المنشور مع 25 زائر مختل٠@@ -1815,13 +1686,9 @@ ar: good_share: name: مشاركة ممتازة description: لقد شاركت المنشور مع 300 زائر مختل٠- long_description: | - تÙمنح هذة الشارة عندما تشارك رابط لمنشور قام 300 زائر من خارج المجتمع ÙØªØ­Ø©. رائع! لقد عرضت النقاش علي عدد كبير من الزوار Ùˆ ساعدت المجتمع لكي ينتشر بشكل كبير. great_share: name: مشاركة عظيمة description: لقد شاركت المنشور مع 1000 زائر مختل٠- long_description: | - تÙمنح هذة الشارة عندما تشارك رابط لمنشور قام 1000 زائر من خارج المجتمع ÙØªØ­Ø©. لقد جلبت إلي النقاش جمهور جديد كبير Ùˆ جعلت مجتمعنا ينتشر بشكل واسع. first_like: name: أول إعجاب description: لقد اعجبت بمنشور @@ -1830,22 +1697,15 @@ ar: first_flag: name: أول بلاغ description: لقد ابلغت عن منشور - long_description: | - تÙمنح هذة الشارة عند اول مره تقوم بها بالابلاغ عن منشور. نظام البلاغات هو ما يساعدنا ÙÙŠ جعل هذا المجتمع مكان مناسب للجميع. إذا لاحظت اي منشور يحتاج إلي انتباة المشرÙين لاي سبب لا تتردد ÙÙŠ الإبلاغ عنة. يمكنك ايضا الإبلاغ لترسل Ù„Ø±ÙØ§Ù‚Ùƒ بالمجتمع رسائل خاصة إذا لاحظت مشكلة بمنشوراتهم. - القاعدة: إذا لاحظت اي مشكلة قم :flag_black: بالإبلاغ عنها. promoter: name: Ù…ÙØ±ÙˆØ¬ description: لقد دعوت شخص للمجتمع campaigner: name: Ù…ÙØ¨Ø§Ø¯Ø± description: لقد دعوت ثلاث اشخاص للمجتمع - long_description: | - تÙمنح هذة الشارة عندما تدعو ثلاث اشخاص إلي المجتمع Ùˆ يقضوا بة بعض الوقت حتي يحصلوا علي مستوي الثقة الاول. المجتمع المتميز يحتاج إلي ÙˆØ§ÙØ¯ÙŠÙ† جدد بشكل مستمر لاثراء النقاشات. champion: name: بطل description: لقد دعوت 5 اشخاص للمجتمع - long_description: | - تÙمنح هذة الشارة عندما تدعو خمس اشخاص إلي المجتمع Ùˆ يقضوا بة بعض الوقت حتي يحصلوا علي مستوي الثقة الثاني. شكرا لإثراء مجتمعنا باعضاء جدد. first_share: name: أول مشاركة description: لقد شاركت منشور @@ -1859,8 +1719,6 @@ ar: first_quote: name: أول إقتباس description: لقد اقتبست منشورا - long_description: | - تÙمنح هذة الشارة عند اول مرة تقوم Ùيها بالاقتباس من منشور ÙÙŠ ردك. اقتباس الاجزاء المراد الرد عليها ÙÙŠ المنشورات السابقة يساعد النقاش بان يظل مترابطا. اسهل طريقة للإقتباس هي تظليل النص المراد اقتباسه ثم الضغط علي زر "رد". read_guidelines: name: قراءة القواعد العامة reader: @@ -1911,8 +1769,6 @@ ar: crazy_in_love: name: Ù…ÙØ­Ø¨ مجنون description: نشرت 50 اعجابا يوميا لمدة 20 يوم - long_description: | - تÙمنح هذة الشارة عندما تقوم بعمل 50 اعجاب يوميا لمدة 20 يوما. مذهل! أصبحت أيقونة تشجع بانتظام أصدقائها أعضاء المجتمع! thank_you: name: شكرًا لك description: تم الاعجاب ب(20) منشورا لك Ùˆ اعجبت ب(10) منشورات @@ -1926,19 +1782,15 @@ ar: empathetic: name: متعاط٠description: تم الاعجاب ب(500) منشورا لك Ùˆ اعجبت ب(1000) منشور - long_description: | - تÙمنح هذة الشارة عندما ÙŠÙØ¹Ø¬Ø¨ المجتمع بـ(500) منشورا لك Ùˆ تقوم بالاعجاب بـ(1000) منشور. انت شخص سخي Ùˆ Ù…Ùقدر من الجميع:two_hearts:. first_emoji: name: أول رمز تعبيري description: استخدمت رمز تعبيري ÙÙŠ منشور first_mention: name: أول إشارة description: اشرت إلي عضو اخر ÙÙŠ منشوراتك - long_description: تÙمنح هذة الشارة عندما تشير إلي @اسم المستخدم لاحد اعضاء المجتمع ÙÙŠ منشوراتك. كل اشارة تولد تنبية للشخص المشار إلية. لكي ينتبهوا إلي منشورك. Ùقط قم بكتابه الرمز @ ثم ( اسم المستخدم ) للعضو او للمجموعة إذا كانت هذه الخاصية Ù…ÙØ¹Ù„Ø©. first_onebox: name: اول لوحة Ù…ÙØ¹Ø§ÙŠÙ†Ø©. description: قمت بنشر رابط تحول إلي لوحة Ù…ÙØ¹Ø§ÙŠÙ†Ø©. - long_description: تÙمنح هذة الشارة عندما تنشر رابط بمنشور ÙÙŠ سطر بشكل Ù…Ù†ÙØ±Ø¯. Ùˆ يقوم الموقع Ø¨ÙØªØ­ الرابط Ùˆ وضع ملخص لمحتواه ÙÙŠ لوحة Ù…ÙØ¹Ø§ÙŠÙ†Ø©. first_reply_by_email: name: أوّل ردّ عبر البريد description: قمت بالرد عبر البريد الالكتروني @@ -1952,15 +1804,12 @@ ar: enthusiast: name: Ù…ÙØªØ­Ù…س description: زرت الموقع 10 ايام - long_description: تÙمنح هذة الشارة لزيراتك الموقع 10 ايام متتالية. شكرا لبقائك معنا. aficionado: name: هاوي description: زرت الموقع 100 يوم - long_description: تÙمنح هذة الشارة لزيراتك الموقع 100 يوم متتالي. هذا اكثر من ثلاث اشهر!. devotee: name: متعصب description: زرت الموقع 365 يوم - long_description: تÙمنح هذة الشارة لزيراتك الموقع 365 يوم متتالي. هذا اكثر من سنة!. badge_title_metadata: "%{display_name} شاره على %{site_title}" admin_login: success: "البريد Ø£ÙØ±Ø³Ù„" @@ -1989,8 +1838,6 @@ ar: choices: latest: label: "أحدث المواضيع" - categories: - label: "الأقسام" emoji: title: "الرموز التعبيرية" invites: diff --git a/config/locales/server.bg.yml b/config/locales/server.bg.yml index 5f42a58a84..188ca7a851 100644 --- a/config/locales/server.bg.yml +++ b/config/locales/server.bg.yml @@ -101,42 +101,42 @@ bg: reading_time: "Време за четене" likes: "ХареÑваниÑ" too_many_replies: - one: СъжалÑваме, но новите потребители Ñа временно Ñа ограничени до 1 отговор във Ñъщата публикациÑ. - other: СъжалÑваме, но новите потребители Ñа временно Ñа ограничени до %{count} отговори в Ñъщата публикациÑ. + one: "СъжалÑваме, но новите потребители Ñа временно Ñа ограничени до 1 отговор във Ñъщата публикациÑ." + other: "СъжалÑваме, но новите потребители Ñа временно Ñа ограничени до %{count} отговори в Ñъщата публикациÑ." embed: start_discussion: "Започване на диÑкуÑÐ¸Ñ " continue: "Продължаване на диÑкуÑиÑ" more_replies: - one: още един отговор - other: '%{count} повече отговори' + one: "още един отговор" + other: "%{count} повече отговори" loading: "Зареждане на диÑкуÑиÑ..." permalink: "ПоÑтоÑнен адреÑ" imported_from: "Това е упътваща диÑкуÑионна тема за първоначалното влизане в %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 отговор - other: '%{count} отговори' + one: "1 отговор" + other: "%{count} отговори" no_mentions_allowed: "СъжалÑваме, не може да Ñпоменавате други потребители." too_many_mentions: - one: СъжелÑваме, можете да Ñпоменавате Ñамо един потребител в публикациÑ. - other: СъжалÑваме, можете да Ñпоменете Ñамо %{count} потребители в публикациÑта. + one: "СъжелÑваме, можете да Ñпоменавате Ñамо един потребител в публикациÑ." + other: "СъжалÑваме, можете да Ñпоменете Ñамо %{count} потребители в публикациÑта." no_mentions_allowed_newuser: "СъжалÑваме, новите потребите не могат да Ñпоменават други потребители." too_many_mentions_newuser: - one: СъжалÑваме, новите потребители могат да Ñпоменават Ñамо един друг потребител в публикациÑта. - other: СъжалÑваме, новите потребители могат да Ñпоменават Ñамо %{count} потребители в публикациÑта. + one: "СъжалÑваме, новите потребители могат да Ñпоменават Ñамо един друг потребител в публикациÑта." + other: "СъжалÑваме, новите потребители могат да Ñпоменават Ñамо %{count} потребители в публикациÑта." no_images_allowed: "СъжалÑваме, новите потребители не могат да поÑтавÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² публикациите." too_many_images: - one: СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо едно изображение в публикациÑта. - other: СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо по %{count} Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² публикациÑта. + one: "СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо едно изображение в публикациÑта." + other: "СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо по %{count} Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² публикациÑта." no_attachments_allowed: "СъжалÑваме, новите потребители не могат да поÑтавÑÑ‚ приÑтавки в публикациите." too_many_attachments: - one: СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо по една приÑтавка в публикациÑта. - other: СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ %{count} приÑтавки в публикациÑта. + one: "СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо по една приÑтавка в публикациÑта." + other: "СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ %{count} приÑтавки в публикациÑта." no_links_allowed: "СъжалÑваме, новите потребители не могат да поÑтавÑÑ‚ линкове в публикациите." links_require_trust: "СъжалÑваме, не може да включвате линкове в публикациите Ñи." too_many_links: - one: СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо по един линк в публикациÑ. - other: СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо %{count} линкове в публикациÑ. + one: "СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо по един линк в публикациÑ." + other: "СъжалÑваме, новите потребители могат да поÑтавÑÑ‚ Ñамо %{count} линкове в публикациÑ." contains_blocked_words: "ПубликациÑта ви Ñъдържа непозволена дума: %{word}" spamming_host: "СъжалÑваме, не можете да публикувате линк на този хоÑÑ‚." user_is_suspended: "ОтÑтранените потребители нÑмат право да публикуват." @@ -194,8 +194,8 @@ bg: trust_level_4: "trust_level_4 " education: until_posts: - one: 1 Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ - other: '%{count} публикации' + one: "1 публикациÑ" + other: "%{count} публикации" 'new-topic': | Добре дошли в %{site_name} — **Благодарим ви за Ñъздаването на нова тема!** @@ -256,27 +256,6 @@ bg: staff_category_description: "ЧаÑтна ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·Ð° диÑкуÑии на перÑонала. Темите Ñа видими Ñамо за админи и модератори." lounge_welcome: title: "Добре дошли в Салона" - body: |2 - - ЧеÑтито! :confetti_ball: - - Ðко можете да видите тази тема, вие Ñте повишен в **редовен** (trust level 3) - - Сега Вие можете … - - * Да променÑте заглавието на вÑÑка тема - * Да ÑменÑте категориÑта на вÑÑка тема - * Имате Ñи Ñвои поÑледователи ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) is removed) - * Имате доÑтъп до чаÑтната Lounge категориÑ, видима Ñамо за потребители от trust level 3 и по-виÑоко - * Скриване на Ñпама Ñ ÐµÐ´Ð¸Ð½ Ñигнал - - Ето и [current list of fellow regulars](/badges/3/regular). Ðе забравÑйте да кажете здраÑти. - - Благодарим Ви за това, че Ñте важна чаÑÑ‚ от тази общноÑÑ‚! - - (За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно trust levels, [see this topic][trust]. ÐœÐ¾Ð»Ñ Ð¸Ð¼Ð°Ð¹Ñ‚Ðµ впредвид, че редовни оÑтават Ñамо членовете, които Ñ Ñ‚ÐµÑ‡ÐµÐ½Ð¸Ðµ на времето продължават да отговарÑÑ‚ на изиÑкваниÑта.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "За %{category} категориÑ" errors: @@ -289,9 +268,6 @@ bg: cannot_delete: uncategorized: "Ðе можете да изтриете Ðекатегоризиран" has_subcategories: "Ðе можете да изтриете тази категориÑ, защото има подкатегории." - topic_exists: - one: Ðе можете да изтриете тази категориÑ, защото има 1 тема. Ðай-Ñтарата тема е %{topic_link}. - other: 'Ðе можете да изтриете тази категориÑ, защото има %{count} теми. Ðай-Ñтарата тема е %{topic_link}. ' topic_exists_no_oldest: "Ðе можете да изтриете тази категориÑ, защото броÑÑ‚ на темите е %{count}." trust_levels: newuser: @@ -314,85 +290,85 @@ bg: unsubscribe_via_email: "ДоÑтигнахте макÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð¹ отпиÑÐ²Ð°Ð½Ð¸Ñ Ð¿Ð¾ имейл. МолÑ, изчакайте %{time_left}, преди да опитате отново." topic_invitations_per_day: "ДоÑтигнахте макÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð¹ покани за теми. МолÑ, изчакайте %{time_left}, преди да опитате отново." hours: - one: 1 Ñ‡Ð°Ñ - other: '%{count} чаÑове ' + one: "1 чаÑ" + other: "%{count} чаÑове " minutes: - one: 1 минута - other: '%{count} минути ' + one: "1 минута" + other: "%{count} минути " seconds: - one: 1 Ñекунда - other: '%{count} Ñекунди ' + one: "1 Ñекунда" + other: "%{count} Ñекунди " datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1Ñ - other: < %{count}s + one: "< 1Ñ" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: '1mon ' - other: '%{count}mon' + one: "1mon " + other: "%{count}mon" x_months: - one: '1mon ' - other: '%{count}mon ' + one: "1mon " + other: "%{count}mon " about_x_years: - one: '1y ' - other: '%{count}y ' + one: "1y " + other: "%{count}y " over_x_years: - one: '> 1y ' - other: '> %{count}y ' + one: "> 1y " + other: "> %{count}y " almost_x_years: - one: 1y - other: '%{count}y' + one: "1y" + other: "%{count}y" distance_in_words_verbose: half_a_minute: "преди малко" less_than_x_seconds: - one: преди малко - other: преди малко + one: "преди малко" + other: "преди малко" x_seconds: - one: преди 1 Ñекунда - other: преди %{count} Ñекунди + one: "преди 1 Ñекунда" + other: "преди %{count} Ñекунди" less_than_x_minutes: - one: по малко от 1 минута - other: преди по-малко от %{count} минути + one: "по малко от 1 минута" + other: "преди по-малко от %{count} минути" x_minutes: - one: преди 1 минута - other: преди %{count} минути + one: "преди 1 минута" + other: "преди %{count} минути" about_x_hours: - one: преди 1 Ñ‡Ð°Ñ - other: преди %{count} чаÑа + one: "преди 1 чаÑ" + other: "преди %{count} чаÑа" x_days: - one: преди 1 ден - other: преди %{count} дни + one: "преди 1 ден" + other: "преди %{count} дни" about_x_months: - one: преди около 1 меÑец - other: преди около %{count} меÑеца + one: "преди около 1 меÑец" + other: "преди около %{count} меÑеца" x_months: - one: преди 1 меÑец - other: преди %{count} меÑеца + one: "преди 1 меÑец" + other: "преди %{count} меÑеца" about_x_years: - one: преди около 1 година - other: 'преди около %{count} години ' + one: "преди около 1 година" + other: "преди около %{count} години " over_x_years: - one: 'преди повече от 1 година ' - other: 'преди повече от %{count} години ' + one: "преди повече от 1 година " + other: "преди повече от %{count} години " almost_x_years: - one: преди почти 1 година - other: преди почти %{count} години + one: "преди почти 1 година" + other: "преди почти %{count} години" password_reset: update: 'Обновете паролата' save: 'Задайте парола' @@ -444,10 +420,6 @@ bg: title: 'ХареÑвам' description: 'ХареÑайте тази публикациÑ' long_form: 'хареÑаха това' - vote: - title: 'ГлаÑуване' - description: 'ГлаÑувайте за тази публикациÑ' - long_form: 'Вие глаÑувахте за тази публикациÑ' topic_flag_types: spam: title: 'Спам' @@ -547,8 +519,6 @@ bg: num_users: "Потребители" top_referred_topics: title: "Top ПоÑочени Теми " - xaxis: "Тема" - num_clicks: "КликваниÑ" page_view_anon_reqs: title: "Ðнонимен" xaxis: "Ден" @@ -597,7 +567,6 @@ bg: xaxis: "Ден" yaxis: "Общо" mobile_visits: - title: "ПотребителÑки поÑÐµÑ‰ÐµÐ½Ð¸Ñ " xaxis: "Ден" yaxis: "Брой на поÑещениÑта" dashboard: @@ -674,7 +643,6 @@ bg: post_menu: "Определете кои елементи да Ñе поÑвÑват в менюто на публикациÑта, и в какъв ред. Ðапример like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Меню елементите над публикациÑта, които трÑбва да Ñе Ñкриват и поÑвÑват при натиÑкане на бутона Ñ Ð¼Ð½Ð¾Ð³Ð¾Ñ‚Ð¾Ñ‡Ð¸ÐµÑ‚Ð¾." share_links: "Определете кои елементи да Ñе поÑвÑват в Ñподелен диалог и в какъв ред. " - track_external_right_clicks: "Ðбонирането за външни връзки Ñ ÐºÐ»Ð¸ÐºÐ°Ð½Ðµ на деÑен бутон (например: отвори в нов прозорец) е изключено по подразбиране, защото пренапиÑва URL-тата" site_contact_username: "Валидно потребителÑко име на член от перÑонала за изпращане на автоматизираните ÑъобщениÑ. Ðко оÑтавите празно, ще бъде използвано потребителÑко име по подразбиране." send_welcome_message: "Изпращай Ñъобщение за добре дошли към вÑички нови потребители Ñ Ð¸Ð½Ñтрукции за бързо започване." suppress_reply_directly_below: "Ðе показвай броÑча на отговорите когато има Ñамо един отговор точно под тази публикациÑ." @@ -819,7 +787,6 @@ bg: auto_respond_to_flag_actions: "Ðктивиране на автоматичен отговор Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на Ñигналите на Ñайта." reply_by_email_enabled: "Позволи отговори в темите чрез имейл." reply_by_email_address: "Шаблон за отговор по имейла на входÑщ имейл адреÑ, например: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "Забрани Discoursе да изпраща каквито и да е имейли " strip_images_from_short_emails: "Премахни от имейлите по-малките от 2800 байта изображениÑ" short_email_length: "Колко байта имейл Ñе Ñчита за кратък" pop3_polling_enabled: "Проверка чрез POP3 за имейл отговорите." @@ -911,32 +878,29 @@ bg: redirected_to_top_reasons: new_user: "Добре дошли в нашата общноÑÑ‚! Това Ñа най-популÑрните поÑледни теми. " not_seen_in_a_month: "Добре дошли отново! Това Ñа най-популÑрните теми за времето, през което Ви нÑмаше." - change_owner: - post_revision_text: "СобÑтвеноÑтта е прехвърлена от %{old_user} към %{new_user}" - deleted_user: "изтрит потребител" topic_statuses: archived_enabled: "Тази тема в момента е в архив. Ð¢Ñ Ðµ замразена и не може да Ñе Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾ никакъв начин." archived_disabled: "Тази тема е разархивирана. Вече не е замразена и може да Ñе променÑ." closed_enabled: "Тази тема е затворена. Вече не е разрешено да Ñе Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð² неÑ." closed_disabled: "Тази тема Ñега е отворена. Ðовите отговори Ñа разрешени." autoclosed_enabled_days: - one: Тази тема ще Ñе затвори автоматично Ñлед 1 ден. Ðови отговори вече не Ñе допуÑкат. - other: Тази тема ще Ñе затвори автоматично Ñлед %{count} дни. Ðови отговори вече не Ñе допуÑкат. + one: "Тази тема ще Ñе затвори автоматично Ñлед 1 ден. Ðови отговори вече не Ñе допуÑкат." + other: "Тази тема ще Ñе затвори автоматично Ñлед %{count} дни. Ðови отговори вече не Ñе допуÑкат." autoclosed_enabled_hours: - one: Тази тема ще Ñе затвори автоматично Ñлед 1 чаÑ. Ðови отговори не Ñе допуÑкат. - other: Тази тема ще Ñе затвори автоматично Ñлед %{count} чаÑа. Ðови отговори не Ñе допуÑкат. + one: "Тази тема ще Ñе затвори автоматично Ñлед 1 чаÑ. Ðови отговори не Ñе допуÑкат." + other: "Тази тема ще Ñе затвори автоматично Ñлед %{count} чаÑа. Ðови отговори не Ñе допуÑкат." autoclosed_enabled_minutes: - one: Тази тема ще Ñе затвори автоматично Ñлед 1 минута. Ðови отговори не Ñе допуÑкат. - other: Тази тема ще Ñе затвори автоматично Ñлед %{count} минути. Ðови отговори не Ñе допуÑкат. + one: "Тази тема ще Ñе затвори автоматично Ñлед 1 минута. Ðови отговори не Ñе допуÑкат." + other: "Тази тема ще Ñе затвори автоматично Ñлед %{count} минути. Ðови отговори не Ñе допуÑкат." autoclosed_enabled_lastpost_days: - one: Тази тема беше автоматично затворена 1 ден Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Ðови отговори вече не Ñа разрешени. - other: Тази тема беше автоматично затворена Ñлед %{count} дни Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Ðови отговори вече не Ñа разрешени. + one: "Тази тема беше автоматично затворена 1 ден Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Ðови отговори вече не Ñа разрешени." + other: "Тази тема беше автоматично затворена Ñлед %{count} дни Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Ðови отговори вече не Ñа разрешени." autoclosed_enabled_lastpost_hours: - one: Тази тема беше автоматично затворена 1 Ñ‡Ð°Ñ Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. - other: 'Тази тема беше автоматично затворена %{count} чаÑа Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. ' + one: "Тази тема беше автоматично затворена 1 Ñ‡Ð°Ñ Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени." + other: "Тази тема беше автоматично затворена %{count} чаÑа Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. " autoclosed_enabled_lastpost_minutes: - one: 'Тази тема беше автоматично затворена 1 минута Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. ' - other: 'Тази тема беше автоматично затворена %{count} минути Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. ' + one: "Тази тема беше автоматично затворена 1 минута Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. " + other: "Тази тема беше автоматично затворена %{count} минути Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€. Отговорите в Ð½ÐµÑ Ð²ÐµÑ‡Ðµ Ñа забранени. " autoclosed_disabled: "Тази тема Ñега е отворена. Ðовите отговори Ñа разрешени." autoclosed_disabled_lastpost: "Тази тема Ñега е отворена. Ðовите отговори Ñа разрешени." pinned_enabled: "Тази тема Ñега е закована. Ð¢Ñ Ñ‰Ðµ Ñе поÑвÑва най-отгоре на категориÑта Ñи и на вÑички ÑпиÑъци Ñ Ñ‚ÐµÐ¼Ð¸, докато не бъде откована от член на перÑонала или индивидуално от потребителите." @@ -970,7 +934,6 @@ bg: second_factor_title: "УдоÑтоверÑване Ñ Ð´Ð²Ð° фактора" second_factor_description: "МолÑ, въведете необходимиÑÑ‚ код за удоÑтоверÑване от приложението Ñи:" user: - no_accounts_associated: "ÐÑма Ñвързани профили" username: short: "трÑбва да бъде минимум %{min} Ñимвола." long: "трÑбва да не е повече от %{max} Ñимвола." @@ -984,8 +947,8 @@ bg: max_new_accounts_per_registration_ip: "Ðе Ñа разрешени нови региÑтрации от Ð²Ð°ÑˆÐ¸Ñ IP Ð°Ð´Ñ€ÐµÑ (доÑтигнали Ñте лимита). Свържете Ñе Ñ Ñ‡Ð»ÐµÐ½ на перÑонала." flags_reminder: subject_template: - one: 1 Ñигнал чакащ за обработка - other: '%{count} Ñигнала налични за обработка ' + one: "1 Ñигнал чакащ за обработка" + other: "%{count} Ñигнала налични за обработка " invite_mailer: text_body_template: | %{inviter_name} ви покани да Ñе приÑъедините към диÑкуÑиÑта @@ -1086,8 +1049,8 @@ bg: Ðе намираме Ð²Ð°ÑˆÐ¸Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€ в Ñъобщението. **Уверете Ñе, че вашиÑÑ‚ отговор в горната чаÑÑ‚ на Ñъобщението** -- не можем да обработим инлайн отговори. pending_users_reminder: subject_template: - one: 1 потребител чака одобрение - other: '%{count} потребители чакат одобрение' + one: "1 потребител чака одобрение" + other: "%{count} потребители чакат одобрение" text_body_template: | Има нови потребителÑки региÑтрации, които чакат да бъдат одобрени (отхвърлени) преди да получат доÑтъп до този форум. @@ -1116,7 +1079,6 @@ bg: recent_topics: "Скорошни" see_more: "Повече" search_title: "ТърÑи този Ñайт" - search_google: "Google" terms_of_service: title: "Правила за ползване" signup_form_message: 'Ðз прочетох и приемам правилата за ползване.' @@ -1131,21 +1093,6 @@ bg: images: too_large: "СъжалÑваме, изображението, което Ñе опитвате да качите е прекалено голÑмо (макÑималниÑÑ‚ размер е %{max_size_kb}%KB), Ð¼Ð¾Ð»Ñ Ð¿Ñ€ÐµÐ¾Ñ€Ð°Ð·Ð¼ÐµÑ€ÐµÑ‚Ðµ го и опитайте отново. " size_not_found: "СъжалÑваме, но не можем да определим размера на изображението. Възможно ли е изображението да е повредено?" - email_log: - no_user: "ÐÑма потребител Ñ id %{user_id}" - anonymous_user: "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ðµ анонимен" - suspended_not_pm: "Бла Ð±Ð»Ñ Ð±Ð»Ñ\nБла Ð±Ð»Ñ Ð±Ð»Ñ" - seen_recently: "ПотребителÑÑ‚ Ñкоро е забелÑзан " - post_not_found: "ÐÑма Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ id %{post_id}" - notification_already_read: "Уведомлението, за което е този имейл вече беше прочетено" - topic_nil: "post.topic is nil" - post_deleted: "публикациÑта беше изтрита от автора" - user_suspended: "потребителÑÑ‚ е деактивиран" - already_read: "потребителÑÑ‚ вече е прочел тази публикациÑ" - message_blank: "message е празно" - message_to_blank: "message.to е празно" - text_part_body_blank: "text_part.body е празно" - body_blank: "Ñъдържанието е празно" color_schemes: base_theme_name: "ОÑнова" about: "ОтноÑно" @@ -1164,9 +1111,6 @@ bg: privacy_topic: title: "Ð”ÐµÐºÐ»Ð°Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð° поверителноÑÑ‚" badges: - autobiographer: - long_description: | - Тази значка Ñе предоÑÑ‚Ð°Ð²Ñ Ð·Ð° попълване на потребителÑÐºÐ¸Ñ Ð²Ð¸ профил и за избор на профилна Ñнимка. Дайте възможноÑÑ‚ на общноÑтта да научи малко повече за това кой Ñте и какво ви интереÑува, за да допринеÑете за Ñъздаването на една по-добра, по-Ñвързана общноÑÑ‚. ПриÑъединете Ñе към наÑ! great_topic: name: ЧудеÑна тема description: Получени 50 хареÑÐ²Ð°Ð½Ð¸Ñ Ð·Ð° една тема @@ -1242,14 +1186,12 @@ bg: enthusiast: name: ЕнтуÑиаÑÑ‚ description: ПоÑещавал 10 дни - long_description: "Тази значка Ñе дава за поÑещение в 10 поÑледователни дни. Благодарим Ви, че Ñте били Ñ Ð½Ð°Ñ Ð¿Ð¾Ð²ÐµÑ‡Ðµ от Ñедмица!" aficionado: name: Любител description: ПоÑещавал 100 дни devotee: name: Отдаден description: ПоÑещавал 365 дни - long_description: "Тази значка Ñе дава за поÑещение в 365 поÑледователни дни. Еха, цÑла година!" admin_login: success: "Изпратен имейл" errors: @@ -1317,8 +1259,6 @@ bg: choices: latest: label: "ПоÑледни теми" - categories: - label: "Категории" emoji: title: "Емотикони" description: "Какъв Ñтил Емотикони предпочитате за вашата общноÑÑ‚? Можете да добавите още перÑонализирани Емотикони по-къÑно чрез Ðдмин, ПерÑонализациÑ, Емотикони." diff --git a/config/locales/server.bs_BA.yml b/config/locales/server.bs_BA.yml index 2a0fa4b866..39c38a896e 100644 --- a/config/locales/server.bs_BA.yml +++ b/config/locales/server.bs_BA.yml @@ -167,27 +167,6 @@ bs_BA: staff_category_description: "Private category for staff discussions. Topics are only visible to admins and moderators." lounge_welcome: title: "Welcome to the Lounge" - body: |2 - - Congratulations! :confetti_ball: - - If you can see this topic, you were recently promoted to **regular** (trust level 3). - - You can now … - - * Edit the title of any topic - * Change the category of any topic - * Have all your links followed ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) is removed) - * Access a private Lounge category only visible to users at trust level 3 and higher - * Hide spam with a single flag - - Here's the [current list of fellow regulars](/badges/3/regular). Be sure to say hi. - - Thanks for being an important part of this community! - - (For more information on trust levels, [see this topic][trust]. Please note that only members who continue to meet the requirements over time will remain regulars.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "About the %{category} category" errors: @@ -206,18 +185,18 @@ bs_BA: change_failed_explanation: "You attempted to demote %{user_name} to '%{new_trust_level}'. However their trust level is already '%{current_trust_level}'. %{user_name} will remain at '%{current_trust_level}' - if you wish to demote user lock trust level first" rate_limiter: hours: - few: Par sati - one: 1 sat - other: '%{count} sati' + one: "1 sat" + few: "Par sati" + other: "%{count} sati" datetime: distance_in_words: half_a_minute: "< 1m" distance_in_words_verbose: half_a_minute: "just now" about_x_hours: - few: Pred par sati - one: Pred 1 sat - other: Pred %{count} sata + one: "Pred 1 sat" + few: "Pred par sati" + other: "Pred %{count} sata" password_reset: update: 'Obnovi Å ifru' save: 'Namjesti Å ifru' @@ -261,10 +240,6 @@ bs_BA: title: 'Like' description: 'Lajkuj ovaj post' long_form: 'lajkovao si ovo' - vote: - title: 'Glasaj' - description: 'Glasaj za ovaj post' - long_form: 'glasao za ovaj post' topic_flag_types: spam: title: 'Spam' @@ -361,8 +336,6 @@ bs_BA: num_users: "Users" top_referred_topics: title: "Top Referred Topics" - xaxis: "Topic" - num_clicks: "Clicks" page_view_anon_reqs: xaxis: "Dan" time_to_first_response: @@ -430,7 +403,6 @@ bs_BA: post_menu: "Determine which items appear on the post menu, and in what order. Example like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "The menu items to hide by default in the post menu unless an expansion ellipsis is clicked on." share_links: "Determine which items appear on the share dialog, and in what order." - track_external_right_clicks: "Track external links that are right clicked (eg: open in new tab) disabled by default because it rewrites URLs" site_contact_username: "All automated private messages will be from this user; if left blank the default System account will be used." send_welcome_message: "Send all new users a welcome private message with a quick start guide." suppress_reply_directly_below: "Don't show the expandable reply count on a post when there is only a single reply directly below this post." @@ -548,7 +520,6 @@ bs_BA: levenshtein_distance_spammer_emails: "When matching spammer emails, number of characters difference that will still allow a fuzzy match." reply_by_email_enabled: "Enable replying to topics via email." reply_by_email_address: "Template for reply by email incoming email address, for example: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "Prevent Discourse from sending any kind of emails" strip_images_from_short_emails: "Strip images from emails having size less than 2800 Bytes" short_email_length: "Short email length in Bytes" pop3_polling_enabled: "Poll via POP3 for email replies." @@ -611,8 +582,6 @@ bs_BA: redirected_to_top_reasons: new_user: "DobrodoÅ¡li u naÅ¡u zajednicu! Ovo su najnovije popularne teme." not_seen_in_a_month: "DobrodoÅ¡li nazad! Nismo vas odavno vidjeli. Ovo su najnovije popularne teme od vaÅ¡e zadnje posjete." - change_owner: - post_revision_text: "Ownership transferred from %{old_user} to %{new_user}" topic_statuses: archived_enabled: "This topic is now archived. It is frozen and cannot be changed in any way." archived_disabled: "This topic is now unarchived. It is no longer frozen, and can be changed." @@ -642,7 +611,6 @@ bs_BA: password_too_long: "Passwords are limited to 200 characters." missing_user_field: "You have not completed all the user fields" user: - no_accounts_associated: "No accounts associated" username: short: "must be at least %{min} characters" long: "must be no more than %{max} characters" @@ -710,7 +678,6 @@ bs_BA: recent_topics: "Nove" see_more: "ViÅ¡e" search_title: "Pretraži stranicu" - search_google: "Google" terms_of_service: title: "Terms of Service" signup_form_message: 'I have read and accept the Terms of Service.' @@ -725,20 +692,6 @@ bs_BA: images: too_large: "Sorry, the image you are trying to upload is too big (maximum size is %{max_size_kb}%kb), please resize it and try again." size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?" - email_log: - no_user: "Can't find user with id %{user_id}" - suspended_not_pm: "User is suspended, not a private message" - seen_recently: "User was seen recently" - post_not_found: "Can't find a post with id %{post_id}" - notification_already_read: "The notification this email is about has already been read" - topic_nil: "post.topic is nil" - post_deleted: "post was deleted by the author" - user_suspended: "user was suspended" - already_read: "user has already read this post" - message_blank: "message is blank" - message_to_blank: "message.to is blank" - text_part_body_blank: "text_part.body is blank" - body_blank: "body is blank" color_schemes: base_theme_name: "Base" guidelines: "Guidelines" diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index 09192ca98a..b7c4aaadbd 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -136,8 +136,8 @@ ca: reading_time: "Temps de lectura." likes: "M'agrades" too_many_replies: - one: Ho lamentem, però les noves persones usuàries ara estan de moment limitades a 1 resposta al mateix tema. - other: Ho lamentem, però les noves persones usuàries ara estan de moment limitades a %{count} respostes al mateix tema. + one: "Ho lamentem, però les noves persones usuàries ara estan de moment limitades a 1 resposta al mateix tema." + other: "Ho lamentem, però les noves persones usuàries ara estan de moment limitades a %{count} respostes al mateix tema." embed: start_discussion: "Comença una discussió" continue: "Continua la discussió" @@ -147,35 +147,35 @@ ca: no_hosts: "No s'hi han establert amfitrions per inscrustar." configure: "Configurar la incrustació" more_replies: - one: 1 resposta més - other: '%{count} respostes més ' + one: "1 resposta més" + other: "%{count} respostes més " loading: "Carregant la discussió..." permalink: "Enllaç permanent " imported_from: "Aquesta discussió és derivada de l'entrada original de %{link}" in_reply_to: "%{username}" replies: - one: 1 resposta - other: '%{count} respostes' + one: "1 resposta" + other: "%{count} respostes" no_mentions_allowed: "Disculpa, no pots mencionar altres persones usuàries" too_many_mentions: - one: Disculpa, només pots mencionar una persona usuària a un escrit. - other: Disculpa, només pots mencionar %{count} persones usuàries a un escrit. + one: "Disculpa, només pots mencionar una persona usuària a un escrit." + other: "Disculpa, només pots mencionar %{count} persones usuàries a un escrit." no_mentions_allowed_newuser: "Disculpa, les noves persones usuàries no poden mencionar-ne d'altres." too_many_mentions_newuser: - one: Disculpa, les noves persones usuàries només poden mencionar una persona usuària a un escrit. - other: Disculpa, les noves persones usuàries només poden mencionar %{count} persones usuàries a un escrit. + one: "Disculpa, les noves persones usuàries només poden mencionar una persona usuària a un escrit." + other: "Disculpa, les noves persones usuàries només poden mencionar %{count} persones usuàries a un escrit." no_images_allowed: "Disculpa, les noves persones usuàries no poden adjuntar imatges a un escrit." too_many_images: - one: Disculpa, les noves persones usuàries només poden adjuntar una imatge a un escrit. - other: Disculpa, les noves persones usuàries només poden adjuntar %{count} imatges a un escrit. + one: "Disculpa, les noves persones usuàries només poden adjuntar una imatge a un escrit." + other: "Disculpa, les noves persones usuàries només poden adjuntar %{count} imatges a un escrit." no_attachments_allowed: "Disculpa, les noves persones usuàries no poden adjuntar arxius a un escrit." too_many_attachments: - one: Disculpa, les noves persones usuàries només poden adjuntar un arxiu a un escrit. - other: Disculpa, les noves persones usuàries només poden adjuntar %{count} arxius a un escrit. + one: "Disculpa, les noves persones usuàries només poden adjuntar un arxiu a un escrit." + other: "Disculpa, les noves persones usuàries només poden adjuntar %{count} arxius a un escrit." no_links_allowed: "Disculpa, les noves persones usuàries no poden incloure enllaços a un escrit." too_many_links: - one: Disculpa, les noves persones usuàries només poden incloure un enllaç a un escrit. - other: Disculpa, les noves persones usuàries només poden incloure %{count} enllaços a un escrit. + one: "Disculpa, les noves persones usuàries només poden incloure un enllaç a un escrit." + other: "Disculpa, les noves persones usuàries només poden incloure %{count} enllaços a un escrit." spamming_host: "Disculpa, no pots enviar un enllaç a aquest amfitrió." user_is_suspended: "Les persones usuàries suspeses no tenen permís per publicar." topic_not_found: "Alguna cosa ha fallat. Que potser aquest tema ha estat tancat o esborrat mentre el consultaves?" @@ -231,8 +231,8 @@ ca: trust_level_4: "trust_level_4" education: until_posts: - one: 1 publicació - other: '%{count} publicacions' + one: "1 publicació" + other: "%{count} publicacions" 'new-topic': | Et donem la benvinguda a %{site_name} — **gràcies per encetar una nova conversa!** @@ -348,27 +348,6 @@ ca: Potser desitges tancar aquest tema amb l'eina d'adminstració :wrench: (dalt a la dreta i abaix), perquè les respostes no s'amunteguin sobre un anunci. lounge_welcome: title: "Et donem la benvinguda al saló" - body: |2 - - Enhorabona! :confetti_ball: - - Si pots veure aquest tema, se t'ha promogut recentment a **regular** (nivell 3 de confiança). - - Ara pots … - - * Editar el títol de qualsevol tema - * Canviar la categoria de qualsevol tema - * Tenir tots els teus enllaços seguits ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) és esborrat) - * Accedir a la categoria privada de Saló només visible per a persones usuàries a nivell 3 de confiança i superior - * Amagar correu brossa amb una única bandera - - Vet aquí la llista [current list of fellow regulars](/badges/3/regular). Assegura't d'enviar-hi una salutació. - - Gràcies per formar part d'una part important d'aquesta comunitat! - - (Per a més informació sobre nivell de confiança [see this topic][trust]. Si us plau, fixa't que només membres que continuen reunint els requisits seguiran essent ordinaris). - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Sobre la categoria %{category} " replace_paragraph: "(Reemplaça aquest primer paràgraf amb una breu descripció de la teva nova categoria. Aquesta guia apareixerà a l'àrea de selecció de categoria, perquè s'hi pugui mantenir per sota de 200 caràcters. **Fins que no editis aquesta descripció o en creïs temes, aquesta categoria no apareixerà a la pàgina de categories.**)" @@ -383,9 +362,6 @@ ca: cannot_delete: uncategorized: "No es pot esborrar una descategoritzada" has_subcategories: "No es pot esborrar aquesta categoria perquè té subcategories" - topic_exists: - one: No es pot esborrar aquesta categoria perquè hi conté 1 tema. El tema més antic és %{topic_link}. - other: No es pot esborrar aquesta categoria perquè hi conté %{count} temes. El tema més antic és %{topic_link}. topic_exists_no_oldest: "No es pot esborrar aquesta categoria perquè el recompte de temes és %{count}." uncategorized_description: "Temes que no necessiten una categoria o no encaixen a cap altra categoria existent." trust_levels: @@ -402,85 +378,85 @@ ca: change_failed_explanation: "Has provat de degradar %{user_name} a '%{new_trust_level}'. En qualsevol cas, el seu nivell de confiança ja és '%{current_trust_level}'. %{user_name} restarà a '%{current_trust_level}' - Si vols degradar una persona usuària, bloca-li abans el nivell de confiança" rate_limiter: hours: - one: 1 hora - other: '%{count} hores' + one: "1 hora" + other: "%{count} hores" minutes: - one: 1 minut - other: '%{count} minuts' + one: "1 minut" + other: "%{count} minuts" seconds: - one: 1 segon - other: '%{count} segons' + one: "1 segon" + other: "%{count} segons" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mes - other: '%{count}mes' + one: "1mes" + other: "%{count}mes" x_months: - one: 1mes - other: '%{count}mes' + one: "1mes" + other: "%{count}mes" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" distance_in_words_verbose: half_a_minute: "ara mateix" less_than_x_seconds: - one: ara mateix - other: ara mateix + one: "ara mateix" + other: "ara mateix" x_seconds: - one: fa 1 segon - other: fa %{count} segons + one: "fa 1 segon" + other: "fa %{count} segons" less_than_x_minutes: - one: 'fa menys d''1 minut ' - other: 'fa menys de %{count} minuts ' + one: "fa menys d'1 minut " + other: "fa menys de %{count} minuts " x_minutes: - one: fa 1 minut - other: fa %{count} minuts + one: "fa 1 minut" + other: "fa %{count} minuts" about_x_hours: - one: fa 1 hora - other: fa %{count} houres + one: "fa 1 hora" + other: "fa %{count} houres" x_days: - one: fa 1 dia - other: fa %{count} dies + one: "fa 1 dia" + other: "fa %{count} dies" about_x_months: - one: fa més o menys 1 mes - other: fa més o menys %{count} mesos + one: "fa més o menys 1 mes" + other: "fa més o menys %{count} mesos" x_months: - one: fa 1 mes - other: fa %{count} mesos + one: "fa 1 mes" + other: "fa %{count} mesos" about_x_years: - one: fa més o menys 1 any - other: fa més o menys %{count} anys + one: "fa més o menys 1 any" + other: "fa més o menys %{count} anys" over_x_years: - one: fa més d'1 any - other: fa més de %{count} anys + one: "fa més d'1 any" + other: "fa més de %{count} anys" almost_x_years: - one: fa ben bé 1 any - other: fa ben bé %{count} any + one: "fa ben bé 1 any" + other: "fa ben bé %{count} any" password_reset: no_token: "Disculpa, aquest enllaç de canvi de contrasenya és massa antic. Tria el botó de Registre i fes servir 'He oblidat la meva contrasenya' per obtenir-ne un nou enllaç." choose_new: "Tria una nova contrasenya" @@ -540,13 +516,8 @@ ca: title: 'Agrada' description: 'M''agrada aquesta publicació' long_form: 'ha agradat' - vote: - title: 'Vota' - description: 'Vota per aquesta publicació' - long_form: 'publicació votada' user_activity: no_bookmarks: - self: "No tens publicacions marcades com a preferits, fer-ho et permet accedir-hi després amb facilitat." others: "Sense preferits." no_likes_given: self: "Encara no t'ha agradat cap publicació." @@ -612,6 +583,10 @@ ca: yaxis: "Quantitat de visites" signups: xaxis: "Dia" + dau_by_mau: + xaxis: "Dia" + daily_engaged_users: + xaxis: "Dia" profile_views: title: "Vistes de perfils de persones usuàries" xaxis: "Dia" @@ -651,6 +626,8 @@ ca: user_to_user_private_messages: xaxis: "Dia" yaxis: "Quantitat de missatges" + user_to_user_private_messages_with_replies: + xaxis: "Dia" system_private_messages: title: "Sistema" xaxis: "Dia" @@ -680,8 +657,6 @@ ca: num_users: "Persones usuàries" top_referred_topics: title: "Principals temes referits" - xaxis: "Tema" - num_clicks: "Clics" page_view_anon_reqs: title: "Anònim" xaxis: "Dia" @@ -738,7 +713,6 @@ ca: xaxis: "Dia" yaxis: "Total" mobile_visits: - title: "Visites de la persona usuària" xaxis: "Dia" yaxis: "Quantitat de visites" dashboard: @@ -758,8 +732,8 @@ ca: failing_emails_warning: 'Hi ha %{num_failed_jobs} tasques de correu fallides. Revisa el teu app.yml i assegura''t que la configuració del servidor de correu és correcta. Mira les tasques fallides a Sidekiq.' subfolder_ends_in_slash: "La teva configuració de subcarpeta no és correcta; DISCOURSE_RELATIVE_URL_ROOT acaba amb barra inclinada." email_polling_errored_recently: - one: L'enquesta per correu electrònic ha generat un error durant les darreres 24 hores. Fes un cop d'ull als registres per saber-ne més. - other: L'enquesta per correu electrònic ha generat %{count} errors durant les darreres 24 hores. Fes un cop d'ull als registres per saber-ne més. + one: "L'enquesta per correu electrònic ha generat un error durant les darreres 24 hores. Fes un cop d'ull als registres per saber-ne més." + other: "L'enquesta per correu electrònic ha generat %{count} errors durant les darreres 24 hores. Fes un cop d'ull als registres per saber-ne més." bad_favicon_url: "La càrrega de favicon està fallant. Revisa la configuració de favicon_url a la Configuració del lloc." poll_pop3_timeout: "S'ha esgotat del temps de connexió al servidor POP3. No s'ha pogut lliurar el correu entrant. Si us plau, revisa la teva configuració de POP3 i el proveïdor de serveis." poll_pop3_auth_error: "La connexió al servidor POP3 està fallant amb un error d'autenticació. Si us plau, revisa la teva configuració de POP3." @@ -850,7 +824,6 @@ ca: post_menu: "Determina quins elements apareixen al menú de publicacions i en qui ordre. Per exemple,\nlike|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Els elements del menú que s'oculten per defecte al menú de publicacions, tret que es cliqui sobre una el·lipsi d'expansió." share_links: "Determina quins elements apareixen a diàleg d'acció i en qui ordre." - track_external_right_clicks: "Rastreig d'enllaços externs que es cliquen amb el botó dret (en obrir a una nova pestanya, per exemple) desactivat per defecte, perquè reescriu les URL." site_contact_username: "Un nom vàlid de membre de l'equip per emetre tots els missatges automàtics. Si es deixa buit, es farà servir el compte per defecte del sistema." send_welcome_message: "Envia a totes les noves persones usuàries un missatge de benvinguda amb la guia ràpida d'inici." suppress_reply_directly_below: "No mostris el recompte de respostes expansibles a una publicació quan només hi hagi una resposta directa sota la publicació." @@ -1046,7 +1019,6 @@ ca: reply_by_email_enabled: "Activa la resposta a temes per correu." reply_by_email_address: "Plantilla per respondre per correu una adreça de correu entrant, per exemple: %{reply_key}@reply.example.com o replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Llista de plantilles alternatives per respondre per correu adreces de correu entrant. Per exemple: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "Evita que Discourse enviï qualsevol mena de correus" strip_images_from_short_emails: "Eliminar imatges de correus electrònics amb una mida inferior a 2800 bytes" short_email_length: "Mostra la mida del correu en bits" display_name_on_email_from: "Mostra noms sencers al correu des dels camps" @@ -1087,7 +1059,6 @@ ca: delete_user_max_post_age: "No permetis que s'esborrin persones usuàries amb una publicació de menys d'(x) dies." delete_all_posts_max: "Quantitat màxima de publicacions que es poden esborrar d'un cop amb el botó \"Esborra totes les publicacions\". Si una persona en té una quantitat superior, les publicacions no podran esborrar-se d'un cop i la persona tampoc no podrà ser eliminada." email_editable: "Permet que les persones canviïn la seva adreça de correu després del registre." - logout_redirect: "Ubicació on redirigir el navegador després de desconnectar (per exemple: http://somesite.com/logout)" allow_uploaded_avatars: "Permet que les persones carreguin imatges de perfil personalitzades." allow_animated_avatars: "Permet que les persones facin servir gifs animats a les fotos de perfil. ATENCIÓ: executa la tasca rastell avatars:refresh després de canviar aquesta configuració." allow_animated_thumbnails: "Genera miniatures amb moviment de gifs animats." @@ -1241,50 +1212,47 @@ ca: not_seen_in_a_month: "Et tornem a donar la benvinguda! No t'havíem vist durant un temps. Aquests són els temes populars des de la teva marxa." merge_posts: edit_reason: - one: Una publicació ha estat fusionada per %{username} - other: '%{count} publicacions han estat fusionades per %{username}' + one: "Una publicació ha estat fusionada per %{username}" + other: "%{count} publicacions han estat fusionades per %{username}" errors: different_topics: "Les publicacions que pertanyen a diferents temes no es poden fusionar." different_users: "Les publicacions que pertanyen a diferents participants no es poden fusionar." move_posts: new_topic_moderator_post: - one: 'Una publicació ha estat dividida a un nou tema: %{topic_link}' - other: '%{count} publicacions han estat dividides a un nou tema: %{topic_link}' + one: "Una publicació ha estat dividida a un nou tema: %{topic_link}" + other: "%{count} publicacions han estat dividides a un nou tema: %{topic_link}" existing_topic_moderator_post: - one: 'Una publicació ha estat fusionada a un tema existent: %{topic_link}' - other: '%{count} publicacions han estat fusionades a un tema existent: %{topic_link}' - change_owner: - post_revision_text: "Propietat transferida per %{old_user} a %{new_user}" - deleted_user: "una persona usuària esborrada" + one: "Una publicació ha estat fusionada a un tema existent: %{topic_link}" + other: "%{count} publicacions han estat fusionades a un tema existent: %{topic_link}" topic_statuses: archived_enabled: "Aquest tema ara està arxivat. Està congelat i no es pot canviar de cap manera." archived_disabled: "Aquest tema ara està desarxivat. Ja no està congelat i es pot canviar." closed_enabled: "Aquest tema ara està tancat. Ja no es permeten les noves respostes." closed_disabled: "Aquest tema ara està obert. Es permeten les noves respostes." autoclosed_message_max_posts: - one: Aquest missatge es va tancar automàticament després d'arribar al límit màxim d'1 resposta. - other: Aquest missatge es va tancar automàticament després d'arribar al límit màxim de %{count} respostes. + one: "Aquest missatge es va tancar automàticament després d'arribar al límit màxim d'1 resposta." + other: "Aquest missatge es va tancar automàticament després d'arribar al límit màxim de %{count} respostes." autoclosed_topic_max_posts: - one: Aquest missatge es va tancar automàticament després d'arribar al límit màxim d'1 resposta. - other: Aquest tema es va tancar automàticament després d'arribar al límit màxim de %{count} respostes. + one: "Aquest missatge es va tancar automàticament després d'arribar al límit màxim d'1 resposta." + other: "Aquest tema es va tancar automàticament després d'arribar al límit màxim de %{count} respostes." autoclosed_enabled_days: - one: Aquest missatge es va tancar automàticament després d'1 dia. Ja no es permeten les noves respostes. - other: Aquest missatge es va tancar automàticament després de %{count} dies. Ja no es permeten les noves respostes. + one: "Aquest missatge es va tancar automàticament després d'1 dia. Ja no es permeten les noves respostes." + other: "Aquest missatge es va tancar automàticament després de %{count} dies. Ja no es permeten les noves respostes." autoclosed_enabled_hours: - one: Aquest missatge es va tancar automàticament després d'1 hora. Ja no es permeten les noves respostes. - other: Aquest missatge es va tancar automàticament després de %{count} hores. Ja no es permeten les noves respostes. + one: "Aquest missatge es va tancar automàticament després d'1 hora. Ja no es permeten les noves respostes." + other: "Aquest missatge es va tancar automàticament després de %{count} hores. Ja no es permeten les noves respostes." autoclosed_enabled_minutes: - one: Aquest missatge es va tancar automàticament després d'1 minut. Ja no es permeten les noves respostes. - other: Aquest missatge es va tancar automàticament després de %{count} minuts. Ja no es permeten les noves respostes. + one: "Aquest missatge es va tancar automàticament després d'1 minut. Ja no es permeten les noves respostes." + other: "Aquest missatge es va tancar automàticament després de %{count} minuts. Ja no es permeten les noves respostes." autoclosed_enabled_lastpost_days: - one: Aquest missatge es va tancar automàticament 1 dia després de la darrera resposta. Ja no es permeten les noves respostes. - other: Aquest missatge es va tancar automàticament %{count} dies després de la darrera resposta. Ja no es permeten les noves respostes. + one: "Aquest missatge es va tancar automàticament 1 dia després de la darrera resposta. Ja no es permeten les noves respostes." + other: "Aquest missatge es va tancar automàticament %{count} dies després de la darrera resposta. Ja no es permeten les noves respostes." autoclosed_enabled_lastpost_hours: - one: Aquest missatge es va tancar automàticament 1 hora després de la darrera resposta. Ja no es permeten les noves respostes. - other: Aquest missatge es va tancar automàticament %{count} hores després de la darrera resposta. Ja no es permeten les noves respostes. + one: "Aquest missatge es va tancar automàticament 1 hora després de la darrera resposta. Ja no es permeten les noves respostes." + other: "Aquest missatge es va tancar automàticament %{count} hores després de la darrera resposta. Ja no es permeten les noves respostes." autoclosed_enabled_lastpost_minutes: - one: Aquest missatge es va tancar automàticament 1 minut després de la darrera resposta. Ja no es permeten les noves respostes. - other: Aquest missatge es va tancar automàticament %{count} minuts després de la darrera resposta. Ja no es permeten les noves respostes. + one: "Aquest missatge es va tancar automàticament 1 minut després de la darrera resposta. Ja no es permeten les noves respostes." + other: "Aquest missatge es va tancar automàticament %{count} minuts després de la darrera resposta. Ja no es permeten les noves respostes." autoclosed_disabled: "Aquest tema ara està obert. Es permeten les noves respostes." autoclosed_disabled_lastpost: "Aquest tema ara està obert. Es permeten les noves respostes." pinned_enabled: "Aquest tema ara està clavat. Apareixerà al començament de la seva categoria fins que l'equip el desclavi per a tothom o ho facin les mateixes persones usuàries." @@ -1316,7 +1284,6 @@ ca: missing_user_field: "No has completat tots els camps." already_logged_in: "Ui, sembla que estàs provant d'acceptar una invitació per a una altra persona usuària. Si no ets %{current_user}, si us plau surt i torna a provar-ho." user: - no_accounts_associated: "No hi ha comptes associats" deactivated: "Ha estat desactivat per massa correus retornats a to '%{email}'." deactivated_by_staff: "Desactivat per l'equip" activated_by_staff: "Activat per l'equip" @@ -1340,8 +1307,8 @@ ca: domain_not_allowed: "El lloc web no és vàlid. Els dominis permesos són: %{domains}" flags_reminder: subject_template: - one: 1 bandera esperant ser tractada - other: '%{count} banderes esperant ser tractades' + one: "1 bandera esperant ser tractada" + other: "%{count} banderes esperant ser tractades" unsubscribe_mailer: title: "Cancel·la la subscripció del remitent" subject_template: "Confirma que no vols rebre més actualitzacions per correu des de %{site_title}" @@ -1530,8 +1497,8 @@ ca: pending_users_reminder: title: "Recordatori de persones pendents" subject_template: - one: 1 persona esperant aprovació - other: '%{count} persones esperant aprovació' + one: "1 persona esperant aprovació" + other: "%{count} persones esperant aprovació" text_body_template: | Hi ha registres de noves persones esperant l'aprovació (o el refús) abans d'accedir a aquest fòrum. @@ -1567,10 +1534,8 @@ ca: title: "Cancel·la la subscripció!" description: "No t'interessa rebre aquests correus? Cap problema! Clica tot seguit per cancel·lar la subscripció al moment:" reply_by_email: "[Visita tema](%{base_url}%{url}) o respon aquest correu per respondre." - reply_by_email_pm: "[Visita missatge](%{base_url}%{url}) o respon aquest correu per respondre." only_reply_by_email: "Respon aquest correu per reaccionar." visit_link_to_respond: "[Visita tema](%{base_url}%{url}) per reaccionar." - visit_link_to_respond_pm: "[Visita missatge](%{base_url}%{url}) per reaccionar." posted_by: "Publicat per %{username} a %{post_date}" user_invited_to_private_message_pm: title: "Persona convidada a missatge privat" @@ -1742,7 +1707,6 @@ ca: recent_topics: "Recent" see_more: "Més" search_title: "Busca aquest lloc" - search_google: "Google" terms_of_service: title: "Condicions d'ús" signup_form_message: 'He llegit i accepto les Condicions del servei.' @@ -1764,25 +1728,6 @@ ca: flag_reason: sockpuppet: "Una nova persona ha creat un tema i una altra amb la mateixa adreça IP (%{ip_address}) ha respost. Mira la configuració `flag_sockpuppets`." spam_hosts: "Aquesta nova persona ha creat moltes publicacions amb enllaços al mateix domini (%{domain}). Mira la configuració `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "La persona de la publicació ha estat eliminada" - no_user: "No es pot trobar la persona amb id %{user_id}" - anonymous_user: "La persona és anònima" - suspended_not_pm: "Aquesta persona està suspesa, sense missatge " - seen_recently: "S'ha vist la persona recentment" - post_not_found: "No es pot trobar una publicació amb id %{post_id}" - notification_already_read: "Ja s'ha llegit la notificació sobre aquest correu" - topic_nil: "post.topic és ul" - post_deleted: "la persona autora va esborrar la publicació " - user_suspended: "la persona va ser suspesa" - already_read: "la persona ja ha llegit aquesta publicació" - exceeded_emails_limit: "S'ha excedit exceeded max_emails_per_day_per_user" - exceeded_bounces_limit: "S'ha excedit bounce_score_threshold" - message_blank: "missatge és buit" - message_to_blank: "message.to és buit" - text_part_body_blank: "text_part.body és buit" - body_blank: "el cos és buit" - no_echo_mailing_list_mode: "S'han inhabilitat les alertes de llista de correu per a les publicacions pròpies" color_schemes: base_theme_name: "Base" about: "Sobre" @@ -1804,72 +1749,40 @@ ca: editor: name: Editor description: Edita la primera publicació - long_description: | - Aquest distintiu es concedeix el primer cop que edites una de les teves publicacions. Com no sempre podràs editar-les, fer-ho ara és una bona idea. Pots millorar-les, corregir petits errors o afegir qualsevol cosa que vas oblidar en publicar originalment. Edita per millorar encara més les teves publicacions! basic_user: name: Bàsic - description: "Totes les funcions essencials de la comunitat concedides" - long_description: | - Aquest distintiu es concedeix quan arribes al nivell 1 de confiança. Gràcies pel teu temps dedicat a llegir un grapat de temes i saber de què va la nostra comunitat. S'han aixecat les teves restriccions de nova persona usuària; t'hem concedit totes les capacitats essencials de la comunitat, com els missatges personals, les banderes, edició de wiki i la possibilitat de publicar múltiples imatges i enllaços. member: name: Membre - description: "Invitacions, missatges de grups i més m'agrades concedits" - long_description: | - Aquest distintiu es concedeix quan arribes al nivell 2 de confiança. Gràcies per participar durant setmanes per afegir-te de debò a la nostra comunitat. Ara pots enviar invitacions des de la teva pàgina personal o temes individuals, crear missatges personals en grup i donar uns pocs més m'agrades cada dia. regular: name: Ordinari - description: "Recategoritzar, reanomenar, enllaços seguits, wiki, més m'agrades concedits" - long_description: | - Aquest distintiu es concedeix quan arribes al nivell 3 de confiança. Gràcies per formar part de la nostra comunitat durant mesos. Ara ets una de les persones més actives en lectura i contribucions, a més de fer gran la nostra comunitat. Ara pots recategoritzar i reanomenar temes, aprofitar les banderes més potents de brossa, l'accés a l'àrea privada de saló i també rebràs cada dia més m'agrades. leader: name: Líder - description: "Edició global, clavar, tancar, arxivar, dividir i fusionar, més m'agrades condedits" - long_description: | - Aquest distintiu es concedeix quan has arribat al nivell de confiança 4. Lideres aquesta comunitat tal i com ha triat l'equip i ets un exemple positiu amb les teves paraules i accions per a la resta de la comunitat. Tens la possibilitat d'editar totes les publicacions, prendre accions moderadores típiques com ara clavar, desllistar, arxivar, dividir i fusionar i cada dia tens muntanyes de m'agrades. welcome: name: Benvinguda description: Ha rebut un m'agrada - long_description: | - Aquesta distinció es concedeix quan reps el teu primer m'agrada a una publicació. Enhorabona, has publicat alguna cosa que la resta de la teva comunitat considera interessant, bonic o útil. autobiographer: name: Autobiògraf anniversary: name: Aniversary description: "Membre amb activitat d'un any, ha publicat almenys un cop" - long_description: | - Aquest distintiu es concedeix quan has tingut activitat durant un any amb almenys una publicació. Gràcies per contribuir a la comunitat. Sense tu no ho aconseguiríem. nice_post: name: Bonica resposta description: Ha rebut 10 m'agrades a una resposta - long_description: | - Aquest distintiu es concedeix quan la teva resposta arriba a 10 m'agrades. La teva resposta ha impressionat la comunitat i ha ajudat a empènyer la conversa! good_post: name: Bona resposta description: Ha rebut 25 m'agrades a una resposta - long_description: | - Aquest distintiu es concedeix quan la teva resposta arriba a 25 m'agrades. La teva resposta ha estat excepcional ha fet la conversa millor per a tothom! great_post: name: Gran resposta description: Ha rebut 50 m'agrades a una resposta - long_description: | - Aquest distintiu es concedeix quan la teva resposta arriba a 50 m'agrades. La teva resposta és font d'inspiració i fascinant i la comunitat se l'estima! nice_topic: name: Bonic tema description: Ha rebut 10 m'agrades a un tema - long_description: | - Aquest distintiu es concedeix quan el teu tema arriba a 10 m'agrades. Ep, has començat una conversa interessant i la comunitat en gaudeix! good_topic: name: Bon tema description: Ha rebut 25 m'agrades a un tema - long_description: |+ - Aquest distintiu es concedeix quan el teu tema arriba a 25 m'agrades. Has encetat una conversa vibrant que la comunitat s'estima i comparteix! - great_topic: name: Gran tema description: Ha rebut 50 m'agrades a un tema - long_description: |+ - Aquest distintiu es concedeix quan el teu tema arriba a 50 m'agrades. Has provocat una conversa fascinant i la comunitat en gaudeix del dinamisme! - nice_share: name: Bonica compartició description: Publicació compartida amb 25 visites úniques @@ -1878,13 +1791,9 @@ ca: good_share: name: Bona compartició description: Publicació compartida amb 300 visites úniques - long_description: | - Aquesta insígnia es concedeix quan comparteixes un enllaç a una entrada que ha estat visitat per 300 visitants externs. Has mostrat una discussió a molta gent nova i ens has ajudat a créixer. great_share: name: Gran compartició description: Publicació compartida amb 1000 visites úniques - long_description: | - Aquesta insígnia es concedeix quan comparteixes un enllaç que és visitat per 1000 visitants externs. Uau! Has promocionat una discussió a una nova audiència, la qual cosa ha ajudat a fer créier la comunitat. first_like: name: Primer M'agrada description: Publicació agradada @@ -1893,21 +1802,15 @@ ca: first_flag: name: Primera bandera description: Ha abanderat una publicació - long_description: | - Aquest distintiu es concedeix el primer cop que abanderes una publicació. La manera d'ajudar tothom i mantenir-ho tot net i polit és abanderant. Si observes publicacions que necessiten activitat moderadora per qualsevol motiu, no dubtis en abanderar-les. També pots abanderar per enviar missatges personals a altres persones usuàries si veus res sobre les seves publicacions. Si hi trobes cap problema, :flag_black: abandera'l! promoter: name: Promoció description: Ha convidat una persona campaigner: name: Activista description: Ha convidat 3 persones usuàries bàsiques - long_description: | - Aquesta insígnia es concedeix quan invites 3 persones que després passen prou temps al lloc web com per convertir-se en usuaris bàsics. Una comunitat vibrant necessita un influx constant de nouvinguts que regularment participen i afegeixen la seva veu a les converses. champion: name: De campionat description: Ha convidat 5 membres - long_description: | - Aquest distintiu es concedeix quan has convidat 5 persones amb prou temps invertit al lloc com per esdevenir-ne usuàries completes. Increïble! Gràcies per estendre la diversitat de la nostra comunitat amb noves participacions! first_share: name: Primera compartició description: Ha compartit una publicació @@ -1922,8 +1825,6 @@ ca: first_quote: name: Primera cita description: Ha citat una publicació - long_description: | - Aquesta insígnia es concedeix quan cites per primera vegada una entrada en la teva resposta. Citar les parts rellevants en la teva resposta ajuda a matenir les discussions focalitzades en el tema en qüestió. La manera més fàcil de fer-ho és seleccionar una secció de l'entrada abans d'apretar el botó de respondre. Cita amb generositat! read_guidelines: name: Llegeix les guies reader: @@ -1974,8 +1875,6 @@ ca: crazy_in_love: name: Enamorament boig description: Ha fet servir 50 M'agrada en un dia 20 cops - long_description: | - Aquest distintiu es concedeix quan fas servir tots els teus 50 M'agrada diaris en 20 dies. Ets un exemple de regularitat en animar activament la teva gent de la teva comunitat. thank_you: name: Gràcies description: Té 20 publicacions agradades i ha donat 10 M'agrada @@ -1989,18 +1888,14 @@ ca: empathetic: name: Empàtic description: Té 500 publicacions agradades i ha donat 1000 M'agrada - long_description: | - Aquest distintiu es concedeix quan t'han agradat 500 publicacions i has donat 1000 M'agrada o més. Gran! Ets un model de generositat i apreci mutu :two_hearts: first_emoji: name: Primer emoji description: Ha fet servir un emoji a una publicació first_mention: name: Primera menció - long_description: "Aquest distintiu es concedeix el primer cop que menciones @username d'algú a la teva publicació. Cada menció genera una alerta a aquella persona, perquè sàpiga de la teva publicació. Senzillament comença a escriure @ (símbol arrova) per mencionar qualsevol persona o grup, si està permès – és una forma interessant de cridar la seva atenció." first_onebox: name: Primera caixa description: Enllaç publicat que ha estat encaixat - long_description: "Aquest distintiu es concedeix el primer cop que publiques un enllaç sobre una línia, que automàticament s'ha estès a una caixa amb un breu resum de l'enllaç, un títol i (si hi és) una imatge." first_reply_by_email: name: Primera resposta per correu long_description: | @@ -2025,7 +1920,6 @@ ca: button: "Regsitre" title: "Registrar un compte d'administració" help: "registra un nou compte per començar" - no_emails: "Malauradament no s'han definit correus d'administració durant la instal·lació i per això pot ser difícil concloure la configuració." confirm_email: title: "Confirma el teu correu" message: "

Hem enviat un correu d'activació a %{email}. Si us plau, segueix les instruccions del correu per activar el teu compte.

Si no t'arribam assegura't que has configurat al teu Discourse el teu correu correctament i revisa la teva carpeta de correu brossa.

" @@ -2125,10 +2019,8 @@ ca: fields: favicon_url: label: "Icona petita" - description: "Imatge d'icona emprada per representar el teu lloc web a navegadors que tenen bon aspecte amb mides com ara de 32px per 32px." apple_touch_icon_url: label: "Icona gran" - description: "Imatge d'icona emprada per representar el teu lloc web a dispositius moderns que tenen bon aspecte amb mides més grans. La mida recomanada és d'almenys 144px per 144px." homepage: description: "Et suggerim que mostris els darrers temes a la teva pàgina principal, però si t'ho estimes més, també pots mostrar-hi categories (grups o temes) a la pàgina principal." title: "Pàgina principal" @@ -2137,8 +2029,6 @@ ca: choices: latest: label: "Darrers temes" - categories: - label: "Categories" emoji: title: "Emoji" description: "Quin estil d'Emoji t'estimes més per a la teva comunitat? Més tard pots afegir-hi més Emoji personalitzats, des de Administració, Personalitza, Emoji." diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml index 97356c287c..075686d471 100644 --- a/config/locales/server.cs.yml +++ b/config/locales/server.cs.yml @@ -84,27 +84,27 @@ cs: one: "Nelze odstranit záznam, protože závisející %{record} existuje" many: "Nelze smazat záznam protože na nÄ›m závisí %{record}." too_long: + one: je příliÅ¡ dlouhý ( maximálnÄ› %{count} znak) few: je to příliÅ¡ dlouhé (maximálnÄ› %{count} znaků) many: je to příliÅ¡ dlouhé (maximálnÄ› %{count} znaků) - one: je příliÅ¡ dlouhý ( maximálnÄ› %{count} znak) other: je to příliÅ¡ dlouhé (maximálnÄ› %{count} znaků) too_short: + one: je to příliÅ¡ krátké (minimum je %{count} znak) few: je to příliÅ¡ krátké (minimum je %{count} znaků) many: je to příliÅ¡ krátké (minimum je %{count} znaků) - one: je to příliÅ¡ krátké (minimum je %{count} znak) other: je to příliÅ¡ krátké (minimum je %{count} znaků) wrong_length: + one: Å¡patná délka (má být %{count} znak) few: Å¡patná délka (má být %{count} znaků) many: Å¡patná délka (má být %{count} znaků) - one: Å¡patná délka (má být %{count} znak) other: Å¡patná délka (má být %{count} znaků) other_than: "musí být jiný než %{count}" template: body: 'Nastaly problémy s následujícími poli: ' header: + one: 1 chyba zamezila uložení modelu %{model} few: '%{count} chyb zamezilo uložení modelu %{model}' many: '%{count} chyb zamezilo uložení modelu %{model}' - one: 1 chyba zamezila uložení modelu %{model} other: '%{count} chyb zamezilo uložení modelu %{model}' embed: load_from_remote: "PÅ™i naÄítání příspÄ›vku nastala chyba." @@ -140,58 +140,58 @@ cs: reading_time: "ÄŒas Ätení" likes: "Líbí se" too_many_replies: - few: Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na %{count} odpovÄ›di v tématu. - many: Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na %{count} odpovÄ›dí v tématu. - one: Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na 1 odpovÄ›Ä v tématu. - other: Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na %{count} odpovÄ›dí v tématu. + one: "Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na 1 odpovÄ›Ä v tématu." + few: "Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na %{count} odpovÄ›di v tématu." + many: "Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na %{count} odpovÄ›dí v tématu." + other: "Je nám líto, ale noví uživatelé jsou doÄasnÄ› omezeni na %{count} odpovÄ›dí v tématu." embed: start_discussion: "ZaÄít diskuzi" continue: "PokraÄovat v diskuzi" more_replies: - few: '%{count} další odpovÄ›Äi' - many: '%{count} dalších odpovÄ›Äí' - one: 1 další odpovÄ›Ä - other: '%{count} dalších odpovÄ›Äí' + one: "1 další odpovÄ›Ä" + few: "%{count} další odpovÄ›Äi" + many: "%{count} dalších odpovÄ›Äí" + other: "%{count} dalších odpovÄ›Äí" loading: "NaÄítám diskuzi..." permalink: "Permalink" imported_from: "Diskuze k původnímu příspÄ›vku na blogu: %{link}" in_reply_to: "â–¶ %{username}" replies: - few: '%{count} reakce' - many: '%{count} reakcí' - one: 1 reakce - other: '%{count} reakcí' + one: "1 reakce" + few: "%{count} reakce" + many: "%{count} reakcí" + other: "%{count} reakcí" no_mentions_allowed: "Bohužel, nemůžete zmiňovat ostatní uživatele." too_many_mentions: - few: Bohužel, můžete zmínit jen %{count} uživatele v jednom příspÄ›vku. - many: Bohužel, můžete zmínit jen %{count} uživatelů v jednom příspÄ›vku. - one: Bohužel, můžete zmínit jen jednoho uživatele v jednom příspÄ›vku. - other: Bohužel, můžete zmínit jen %{count} uživatelů v jednom příspÄ›vku. + one: "Bohužel, můžete zmínit jen jednoho uživatele v jednom příspÄ›vku." + few: "Bohužel, můžete zmínit jen %{count} uživatele v jednom příspÄ›vku." + many: "Bohužel, můžete zmínit jen %{count} uživatelů v jednom příspÄ›vku." + other: "Bohužel, můžete zmínit jen %{count} uživatelů v jednom příspÄ›vku." no_mentions_allowed_newuser: "Bohužel, noví uživatelé nemohou zmiňovat ostatní uživatele." too_many_mentions_newuser: - few: Bohužel, noví uživatelé mohou zmínit jen %{count} uživatele v příspÄ›vku. - many: Bohužel, noví uživatelé mohou zmínit jen %{count} uživatelů v příspÄ›vku. - one: Bohužel, noví uživatelé mohou zmínit jen jednoho uživatele v příspÄ›vku. - other: Bohužel, noví uživatelé mohou zmínit jen %{count} uživatelů v příspÄ›vku. + one: "Bohužel, noví uživatelé mohou zmínit jen jednoho uživatele v příspÄ›vku." + few: "Bohužel, noví uživatelé mohou zmínit jen %{count} uživatele v příspÄ›vku." + many: "Bohužel, noví uživatelé mohou zmínit jen %{count} uživatelů v příspÄ›vku." + other: "Bohužel, noví uživatelé mohou zmínit jen %{count} uživatelů v příspÄ›vku." no_images_allowed: "Bohužel, noví uživatelé nemohou vkládat obrázky do příspÄ›vků." too_many_images: - few: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} obrázky. - many: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} obrázků. - one: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen jeden obrázek. - other: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} obrázků. + one: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen jeden obrázek." + few: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} obrázky." + many: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} obrázků." + other: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} obrázků." no_attachments_allowed: "Bohužel, noví uživatelé nemohou do příspÄ›vků vkládat přílohy." too_many_attachments: - few: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} přílohy. - many: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} příloh. - one: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen jednu přílohu. - other: Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} příloh. + one: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen jednu přílohu." + few: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} přílohy." + many: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} příloh." + other: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit jen %{count} příloh." no_links_allowed: "Bohužel, noví uživatelé nemohou vkládat odkazy do příspÄ›vků." links_require_trust: "Bohužel, nemůžete vkládat odkazy do příspÄ›vků." too_many_links: - few: Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› %{count} odkazy. - many: Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› %{count} odkazů. - one: Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› jeden odkaz. - other: Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› %{count} odkazů. + one: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› jeden odkaz." + few: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› %{count} odkazy." + many: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› %{count} odkazů." + other: "Bohužel, noví uživatelé mohou do příspÄ›vku vložit maximálnÄ› %{count} odkazů." spamming_host: "Bohužel, na tento server nemůžete odkazovat." user_is_suspended: "VylouÄení uživatelé nemohou pÅ™idávat příspÄ›vky." topic_not_found: "NÄ›co se pokazilo. Téma mohlo být uzavÅ™eno nebo smazáno bÄ›hem vaÅ¡eho prohlížení." @@ -258,10 +258,10 @@ cs: title: "Žádost o Älenství pro @%{group_name}" education: until_posts: - few: '%{count} příspÄ›vky' - many: '%{count} příspÄ›vků' - one: příspÄ›vek - other: '%{count} příspÄ›vků' + one: "příspÄ›vek" + few: "%{count} příspÄ›vky" + many: "%{count} příspÄ›vků" + other: "%{count} příspÄ›vků" 'new-topic': | Vítejte na %{site_name} — **díky za nové téma!** @@ -382,27 +382,6 @@ cs: Možná budete chtít toto téma v administraci (vpravo nahoÅ™e a dole) zavřít, aby se nehromadily odpovÄ›di na oznámeních. lounge_welcome: title: "Vítejte ve VIP" - body: |2 - - Gratulujeme! :confetti_ball: - - Pokud vidíte toto téma, byli jste nedávno povýšeni na **pravidelného** uživatele (důvÄ›ryhodnost 3). - - TeÄ můžete … - - * Upravovat nadpis jakéhokoliv tématu - * MÄ›nit kategorii jakéhokoliv tématu - * Budou se sledovat vÅ¡ecky VaÅ¡e odkazy ([automatické nofollow](http://en.wikipedia.org/wiki/Nofollow) je odstranÄ›no) - * Máte přístup do privátní kategorie VIP přístupné jen Älenům s důvÄ›ryhodností 3 a vyšší - * Skrýt spam pomocí vlajky - - Zde je [aktuální seznam pravidelných uživatelů](/badges/3/regular). UrÄitÄ› je pozdravte. - - DÄ›kujeme, že jste důležitou souÄástí této komunity! - - (Více informací naleznete na stránce o [důvÄ›ryhodnosti][trust]. Prosím nezapomeňte, že jen Älenové, kteří stále splňují požadavky zůstanou pravidelnými uživateli.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "O kategorii %{category}" replace_paragraph: "(NahraÄte tento první odstavec struÄným popisem nové kategorie. Tento návod se objeví v seznamu kategorií, takže se zkuste vejít do 200 znaků. **Kategorie se neobjeví v seznamu kategorií pokud neupravíte tento popis nebo v ní nevytvoříte témata.**)" @@ -418,11 +397,6 @@ cs: cannot_delete: uncategorized: "„Bez kategorie“ nejde smazat" has_subcategories: "Tato kategorie nejde smazat protože obsahuje podkategorie." - topic_exists: - few: Tato kategorie nejde smazat protože obsahuje %{count} témata. Nejstarší téma je %{topic_link}. - many: Tato kategorie nejde smazat protože obsahuje %{count} témat. Nejstarší téma je %{topic_link}. - one: 'Tato kategorie nejde smazat protože obsahuje 1 téma: %{topic_link}.' - other: Tato kategorie nejde smazat protože obsahuje %{count} témat. Nejstarší téma je %{topic_link}. topic_exists_no_oldest: "Kategorii nelze smazat protože poÄet příspÄ›vků je %{count}." uncategorized_description: "Témata bez kategorií, případnÄ› která nepasují do stávajících kategorií." trust_levels: @@ -442,135 +416,135 @@ cs: broken: "Tento obrázek je rozbitý" rate_limiter: hours: - few: '%{count} hodiny' - many: '%{count} hodin' - one: 1 hodina - other: '%{count} hodin' + one: "1 hodina" + few: "%{count} hodiny" + many: "%{count} hodin" + other: "%{count} hodin" minutes: - few: '%{count} minuty' - many: '%{count} minut' - one: 1 minuta - other: '%{count} minut' + one: "1 minuta" + few: "%{count} minuty" + many: "%{count} minut" + other: "%{count} minut" seconds: - few: '%{count} sekundy' - many: '%{count} sekund' - one: 1 sekunda - other: '%{count} sekund' + one: "1 sekunda" + few: "%{count} sekundy" + many: "%{count} sekund" + other: "%{count} sekund" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - many: < %{count}s - one: < 1s - other: < %{count}s + one: "< 1s" + few: "< %{count}s" + many: "< %{count}s" + other: "< %{count}s" x_seconds: - few: '%{count}s' - many: '%{count}s' - one: 1s - other: '%{count}s' + one: "1s" + few: "%{count}s" + many: "%{count}s" + other: "%{count}s" less_than_x_minutes: - few: < %{count}m - many: < %{count}m - one: < 1m - other: < %{count}m + one: "< 1m" + few: "< %{count}m" + many: "< %{count}m" + other: "< %{count}m" x_minutes: - few: '%{count}m' - many: '%{count}m' - one: 1m - other: '%{count}m' + one: "1m" + few: "%{count}m" + many: "%{count}m" + other: "%{count}m" about_x_hours: - few: '%{count}h' - many: '%{count}h' - one: 1h - other: '%{count}h' + one: "1h" + few: "%{count}h" + many: "%{count}h" + other: "%{count}h" x_days: - few: '%{count}d' - many: '%{count}d' - one: 1d - other: '%{count}d' + one: "1d" + few: "%{count}d" + many: "%{count}d" + other: "%{count}d" about_x_months: - few: '%{count}mÄ›s' - many: '%{count}mÄ›s' - one: 1mÄ›s - other: '%{count}mÄ›s' + one: "1mÄ›s" + few: "%{count}mÄ›s" + many: "%{count}mÄ›s" + other: "%{count}mÄ›s" x_months: - few: '%{count}mÄ›s' - many: '%{count}mÄ›s' - one: 1mÄ›s - other: '%{count}mÄ›s' + one: "1mÄ›s" + few: "%{count}mÄ›s" + many: "%{count}mÄ›s" + other: "%{count}mÄ›s" about_x_years: - few: '%{count}r' - many: '%{count}let' - one: 1r - other: '%{count}let' + one: "1r" + few: "%{count}r" + many: "%{count}let" + other: "%{count}let" over_x_years: - few: '> %{count}r' - many: '> %{count}let' - one: '> 1r' - other: '> %{count}let' + one: "> 1r" + few: "> %{count}r" + many: "> %{count}let" + other: "> %{count}let" almost_x_years: - few: '%{count}r' - many: '%{count}let' - one: 1r - other: '%{count}let' + one: "1r" + few: "%{count}r" + many: "%{count}let" + other: "%{count}let" distance_in_words_verbose: half_a_minute: "právÄ› teÄ" less_than_x_seconds: - few: právÄ› teÄ - many: právÄ› teÄ - one: právÄ› teÄ - other: právÄ› teÄ + one: "právÄ› teÄ" + few: "právÄ› teÄ" + many: "právÄ› teÄ" + other: "právÄ› teÄ" x_seconds: - few: pÅ™ed %{count} sekundami - many: pÅ™ed %{count} sekundami - one: pÅ™ed 1 sekundou - other: pÅ™ed %{count} sekundami + one: "pÅ™ed 1 sekundou" + few: "pÅ™ed %{count} sekundami" + many: "pÅ™ed %{count} sekundami" + other: "pÅ™ed %{count} sekundami" less_than_x_minutes: - few: pÅ™ed ménÄ› než %{count} minutami - many: pÅ™ed ménÄ› než %{count} minutami - one: pÅ™ed ménÄ› než 1 minutou - other: pÅ™ed ménÄ› než %{count} minutami + one: "pÅ™ed ménÄ› než 1 minutou" + few: "pÅ™ed ménÄ› než %{count} minutami" + many: "pÅ™ed ménÄ› než %{count} minutami" + other: "pÅ™ed ménÄ› než %{count} minutami" x_minutes: - few: pÅ™ed %{count} minutami - many: pÅ™ed %{count} minutami - one: pÅ™ed 1 minutou - other: pÅ™ed %{count} minutami + one: "pÅ™ed 1 minutou" + few: "pÅ™ed %{count} minutami" + many: "pÅ™ed %{count} minutami" + other: "pÅ™ed %{count} minutami" about_x_hours: - few: pÅ™ed %{count} hodinami - many: pÅ™ed %{count} hodinami - one: pÅ™ed 1 hodinou - other: pÅ™ed %{count} hodinami + one: "pÅ™ed 1 hodinou" + few: "pÅ™ed %{count} hodinami" + many: "pÅ™ed %{count} hodinami" + other: "pÅ™ed %{count} hodinami" x_days: - few: pÅ™ed %{count} dny - many: pÅ™ed %{count} dny - one: pÅ™ed 1 dnem - other: pÅ™ed %{count} dny + one: "pÅ™ed 1 dnem" + few: "pÅ™ed %{count} dny" + many: "pÅ™ed %{count} dny" + other: "pÅ™ed %{count} dny" about_x_months: - few: asi pÅ™ed %{count} mÄ›síci - many: asi pÅ™ed %{count} mÄ›síci - one: asi pÅ™ed 1 mÄ›sícem - other: asi pÅ™ed %{count} mÄ›síci + one: "asi pÅ™ed 1 mÄ›sícem" + few: "asi pÅ™ed %{count} mÄ›síci" + many: "asi pÅ™ed %{count} mÄ›síci" + other: "asi pÅ™ed %{count} mÄ›síci" x_months: - few: pÅ™ed %{count} mÄ›síci - many: pÅ™ed %{count} mÄ›síci - one: pÅ™ed 1 mÄ›sícem - other: pÅ™ed %{count} mÄ›síci + one: "pÅ™ed 1 mÄ›sícem" + few: "pÅ™ed %{count} mÄ›síci" + many: "pÅ™ed %{count} mÄ›síci" + other: "pÅ™ed %{count} mÄ›síci" about_x_years: - few: asi pÅ™ed %{count} roky - many: asi pÅ™ed %{count} roky - one: asi pÅ™ed 1 rokem - other: asi pÅ™ed %{count} roky + one: "asi pÅ™ed 1 rokem" + few: "asi pÅ™ed %{count} roky" + many: "asi pÅ™ed %{count} roky" + other: "asi pÅ™ed %{count} roky" over_x_years: - few: pÅ™ed více než %{count} roky - many: pÅ™ed více než %{count} roky - one: pÅ™ed více než 1 rokem - other: pÅ™ed více než %{count} roky + one: "pÅ™ed více než 1 rokem" + few: "pÅ™ed více než %{count} roky" + many: "pÅ™ed více než %{count} roky" + other: "pÅ™ed více než %{count} roky" almost_x_years: - few: téměř pÅ™ed %{count} roky - many: téměř pÅ™ed %{count} roky - one: téměř pÅ™ed 1 rokem - other: téměř pÅ™ed %{count} roky + one: "téměř pÅ™ed 1 rokem" + few: "téměř pÅ™ed %{count} roky" + many: "téměř pÅ™ed %{count} roky" + other: "téměř pÅ™ed %{count} roky" password_reset: choose_new: "Vyberte si nové heslo" choose: "Vybrat heslo" @@ -622,14 +596,8 @@ cs: description: 'Tento příspÄ›vek se mi líbí' short_description: 'Tento příspÄ›vek se mi líbí' long_form: 'se líbí' - vote: - title: 'Hlasovat' - description: 'Hlasujte pro tento příspÄ›vek' - short_description: 'Hlasujte pro tento příspÄ›vek' - long_form: 'hlasoval pro tento příspÄ›vek' user_activity: no_bookmarks: - self: "Nemáte žádné příspÄ›vky v záložkách. PÅ™idání do záložek vám umožní téma v budoucnu snadnÄ›ji nalézt." others: "Žádné záložky." no_likes_given: self: "Zatím se ti nelíbil žádný příspÄ›vek." @@ -743,8 +711,6 @@ cs: num_users: "Uživatelé" top_referred_topics: title: "Odkazovaná témata" - xaxis: "Témata" - num_clicks: "Kliknutí" page_view_anon_reqs: title: "Anonymní" xaxis: "Den" @@ -817,7 +783,6 @@ cs: ga_universal_domain_name: "Doménové jméno Google Universal Analytics (analytics.js); například mojeforum.cz; více na http://google.com/analytics" allow_moderators_to_create_categories: "Povolit moderátorům vytváření nových kategorií." post_menu: "UrÄuje, které položky se zobrazí v menu u příspÄ›vku a v jakém poÅ™adí. Příklad: like|edit|flag|delete|share|bookmark|reply" - track_external_right_clicks: "PoÄítat kliknutí na externí odkazy pravým tlaÄítkem (napÅ™. otevÅ™ení do nové záložky); defaultnÄ› zakázáno kvůli pÅ™episu URL" enable_badges: "Povolit odznaky" invite_expiry_days: "Platnost uživatelských pozvánek ve dnech" min_password_length: "Minimální povolená délka hesla." @@ -873,10 +838,10 @@ cs: not_seen_in_a_month: "Vítejte zprátky! Chvíli jsme se nevidÄ›li. Tohle jsou nejpopulárnÄ›jší témata od vaší poslední návÅ¡tÄ›vy." move_posts: new_topic_moderator_post: - few: '%{count}příspÄ›vky byly oddÄ›leny do nového tématu: %{topic_link}' - many: '%{count}příspÄ›vky byly oddÄ›leny do nového tématu: %{topic_link}' - one: 'PříspÄ›vek byl oddÄ›len do nového tématu: %{topic_link}' - other: '%{count}příspÄ›vky byly oddÄ›leny do nového tématu: %{topic_link}' + one: "PříspÄ›vek byl oddÄ›len do nového tématu: %{topic_link}" + few: "%{count}příspÄ›vky byly oddÄ›leny do nového tématu: %{topic_link}" + many: "%{count}příspÄ›vky byly oddÄ›leny do nového tématu: %{topic_link}" + other: "%{count}příspÄ›vky byly oddÄ›leny do nového tématu: %{topic_link}" topic_statuses: archived_enabled: "Toto téma je archivováno. Je zmraženo a již nemůže být nijak zmÄ›nÄ›no." archived_disabled: "Toto téma je vráceno z archivu. Již není zmraženo a může být mÄ›nÄ›no." @@ -920,10 +885,10 @@ cs: subject_template: "Exportování dat selhalo" pending_users_reminder: subject_template: - few: '%{count} users waiting for approval' - many: '%{count} users waiting for approval' - one: 1 user waiting for approval - other: '%{count} users waiting for approval' + one: "1 user waiting for approval" + few: "%{count} users waiting for approval" + many: "%{count} users 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. @@ -965,7 +930,6 @@ cs: popular_topics: "Populární" recent_topics: "Nedávné" see_more: "Více" - search_google: "Google" terms_of_service: title: "Podmínky používání" signup_form_message: 'I have read and accept the Terms of Service.' @@ -975,19 +939,6 @@ cs: pasted_image_filename: "Vložený obrázek" images: size_not_found: "Bohužel se nepodaÅ™ilo zjistit velikost obrázku. Není soubor s obrázkem poÅ¡kozený?" - email_log: - no_user: "Can't find user with id %{user_id}" - seen_recently: "User was seen recently" - post_not_found: "Can't find a post with id %{post_id}" - notification_already_read: "The notification this email is about has already been read" - topic_nil: "post.topic is nil" - post_deleted: "příspÄ›vek byl odstranÄ›n autorem" - user_suspended: "user was suspended" - already_read: "user has already read this post" - message_blank: "message is blank" - message_to_blank: "message.to is blank" - text_part_body_blank: "text_part.body is blank" - body_blank: "body is blank" about: "O fóru" guidelines: "Pokyny" privacy: "Soukromí" @@ -1001,9 +952,6 @@ cs: privacy_topic: title: "Ochrana soukromí" badges: - editor: - long_description: | - Tento odznak je udÄ›len, když poprvé upravíte jeden z VaÅ¡ich příspÄ›vků. I když nebudete moci upravovat VaÅ¡e příspÄ›vky po urÄitém Äase, úprava je vždy dobrý nápad - můžete své příspÄ›vky vylepÅ¡it, opravit malé chyby nebo pÅ™idat cokoliv, co jste v původním příspÄ›vku zapomnÄ›li. Upravujte, abyste VaÅ¡e příspÄ›vky udÄ›lali jeÅ¡tÄ› lepšími! welcome: name: Vítejte first_like: @@ -1054,8 +1002,6 @@ cs: choices: latest: label: "NejnovÄ›jší témata" - categories: - label: "Kategorie" emoji: title: "Smajlíky :)" invites: diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 9d08804942..218cc54934 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -132,8 +132,8 @@ da: reading_time: "Læsetid" likes: "Synes godt om" too_many_replies: - one: Beklager, men nye brugere kan kun skrive 1 svar i hvert emne til at starte med. - other: Beklager, men nye brugere kan kun skrive %{count} svar i hvert emne til at starte med. + one: "Beklager, men nye brugere kan kun skrive 1 svar i hvert emne til at starte med." + other: "Beklager, men nye brugere kan kun skrive %{count} svar i hvert emne til at starte med." embed: start_discussion: "Start diskussion" continue: "Fortsæt diskussion" @@ -143,35 +143,35 @@ da: no_hosts: "Ingen værter var konfigureret til indlejring." configure: "Konfigurér indlejring" more_replies: - one: 1 svar til - other: '%{count} svar til' + one: "1 svar til" + other: "%{count} svar til" loading: "Indlæser diskussion…" permalink: "Permalink" imported_from: "Importeret fra: %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 svar - other: '%{count} svar' + one: "1 svar" + other: "%{count} svar" no_mentions_allowed: "Beklager, du kan ikke nævne andre brugere." too_many_mentions: - one: Beklager, men du kan kun nævne %{count} brugere i et indlæg. - other: Beklager, men du kan kun nævne %{count} brugere i et indlæg. + one: "Beklager, men du kan kun nævne %{count} brugere i et indlæg." + other: "Beklager, men du kan kun nævne %{count} brugere i et indlæg." no_mentions_allowed_newuser: "Beklager, nye brugere kan ikke nævne andre brugere." too_many_mentions_newuser: - one: Beklager, nye brugere kan kun nævne en bruger i et indlæg. - other: Beklager, nye brugere kan kun nævne %{count} brugere i et indlæg. + one: "Beklager, nye brugere kan kun nævne en bruger i et indlæg." + other: "Beklager, nye brugere kan kun nævne %{count} brugere i et indlæg." no_images_allowed: "Beklager, nye brugere kan ikke postere billeder i indlæg." too_many_images: - one: Beklager, nye brugere kan kun anvende et billede i et indlæg. - other: Beklager, nye brugere kan kun anvende %{count} billeder i et indlæg. + one: "Beklager, nye brugere kan kun anvende et billede i et indlæg." + other: "Beklager, nye brugere kan kun anvende %{count} billeder i et indlæg." no_attachments_allowed: "Beklager, nye brugere kan ikke vedhæfte filer i et indlæg." too_many_attachments: - one: Beklager, nye brugere kan kun vedhæfte en fil i et indlæg. - other: Beklager, nye brugere kan kun vedhæfte %{count} filer i et indlæg. + one: "Beklager, nye brugere kan kun vedhæfte en fil i et indlæg." + other: "Beklager, nye brugere kan kun vedhæfte %{count} filer i et indlæg." no_links_allowed: "Beklager, nye brugere kan ikke bruge links i indlæg." too_many_links: - one: Beklager, nye brugere kan kun indsætte et link i et indlæg. - other: Beklager, nye brugere kan kun indsætte %{count} links i et indlæg. + one: "Beklager, nye brugere kan kun indsætte et link i et indlæg." + other: "Beklager, nye brugere kan kun indsætte %{count} links i et indlæg." spamming_host: "Beklager, du kan ikke indsætte et link til det pÃ¥gældende domæne." user_is_suspended: "Suspenderede brugere tilllades ikke at oprette indlæg." topic_not_found: "Der er gÃ¥et noget galt. MÃ¥ske er emnet blevet lukket eller slettet mens du kiggede pÃ¥ det?" @@ -233,8 +233,8 @@ da: trust_level_4: "tillidsniveau_4" education: until_posts: - one: indlæg - other: '%{count} indlæg' + one: "indlæg" + other: "%{count} indlæg" 'new-topic': | Velkommen til %{site_name} — **Tak fordi du starter en ny samtale!** @@ -366,27 +366,6 @@ da: Du bør eventuelt lukke dette emne via administratorfunktionen :wrench: (øverst til højre og i bunden), sÃ¥ledes at der ikke hober sig svar op til denne meddelelse. lounge_welcome: title: "Velkommen i loungen" - body: |2 - - Tillykke! :confetti_ball: - - Hvis du kan se dette er du nu vlevet opgraderet som **regular** (trust level 3) bruger. - - Nu kan du … - - * Rediger enhver emne titel - * Ændre alle kategorier og emner - * Følge alle links ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) ier fjernet) - * FÃ¥ adgang til en privat lounge kategori kun synlig for brugere med Trust LEvel 3, eller højere - * Gemme spam - med et enkelt flag - - Her er [current list of fellow regulars](/badges/3/regular). Sving forbi og hils pÃ¥! - - Tak fordi du er en vigtig del af dette fællesskab! - - (Formere information om Trust Levels [see this topic][trust]. Bemærk venligst at kun brugere der vedbliver at leve op til Trust Level betingelserne, vil have fortsat adgang) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Kategoridefinition for %{category}" replace_paragraph: "(Beskriv din nye kategori her. Beskriv ramme og formÃ¥l med kategori sÃ¥ledes at det er tydeligt for andre. Forsøg at holde beskrivelsen pÃ¥ max 200 tegn. **Kategorien vil ikke fremgÃ¥ pÃ¥ kategori listen, før du har redigeret beskrivelsen, eller oprettet emner)." @@ -401,9 +380,6 @@ da: cannot_delete: uncategorized: "Kan ikke slette Ukategoriseret" has_subcategories: "Kan ikke slette denne kategori, fordi den har under kategorier." - topic_exists: - one: Kan ikke slette denne kategori, da den indeholder et emne. Ældste emne er %{topic_link} - other: Kan ikke slette denne kategori, da den indeholder %{count} emner. Ældste emne er %{topic_link} topic_exists_no_oldest: "Kan ikke slette denne kategori fordi antallet af emner er %{count}" uncategorized_description: "Emner der ikke behøver kategori, eller ikke passer i eksisterende kategori." trust_levels: @@ -420,85 +396,85 @@ da: change_failed_explanation: "Du har forsøgt at degradere %{user_name} til '%{new_trust_level}'. Imidlertid er deres niveau af tillid allerede '%{current_trust_level}'. %{user_name} vil forblive'%{current_trust_level}' - hvis du ønsker at degradere brugeren, skal du først lÃ¥se brugerens tillids niveau / Trust Level" rate_limiter: hours: - one: 1 time - other: '%{count} timer' + one: "1 time" + other: "%{count} timer" minutes: - one: 1 minut - other: '%{count} minutter' + one: "1 minut" + other: "%{count} minutter" seconds: - one: 1 sekund - other: '%{count} sekunder' + one: "1 sekund" + other: "%{count} sekunder" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}t' + one: "1h" + other: "%{count}t" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1md - other: '%{count}mdr' + one: "1md" + other: "%{count}mdr" x_months: - one: 1md - other: '%{count}mdr' + one: "1md" + other: "%{count}mdr" about_x_years: - one: 1 Ã¥r - other: '%{count} Ã¥r' + one: "1 Ã¥r" + other: "%{count} Ã¥r" over_x_years: - one: '> 1 Ã¥r' - other: '> %{count} Ã¥r' + one: "> 1 Ã¥r" + other: "> %{count} Ã¥r" almost_x_years: - one: 1 Ã¥r - other: '%{count} Ã¥r' + one: "1 Ã¥r" + other: "%{count} Ã¥r" distance_in_words_verbose: half_a_minute: "lige nu" less_than_x_seconds: - one: lige nu - other: lige nu + one: "lige nu" + other: "lige nu" x_seconds: - one: 1 sekund siden - other: '%{count} sekunder siden' + one: "1 sekund siden" + other: "%{count} sekunder siden" less_than_x_minutes: - one: mindre end 1 minut siden - other: mindre end %{count} minutter siden + one: "mindre end 1 minut siden" + other: "mindre end %{count} minutter siden" x_minutes: - one: 1 minut siden - other: '%{count} minutter siden' + one: "1 minut siden" + other: "%{count} minutter siden" about_x_hours: - one: 1 time siden - other: '%{count} timer siden' + one: "1 time siden" + other: "%{count} timer siden" x_days: - one: 1 dag siden - other: '%{count} dage siden' + one: "1 dag siden" + other: "%{count} dage siden" about_x_months: - one: ca. 1 mÃ¥ned siden - other: ca. %{count} mÃ¥neder siden + one: "ca. 1 mÃ¥ned siden" + other: "ca. %{count} mÃ¥neder siden" x_months: - one: 1 mÃ¥ned siden - other: '%{count} mÃ¥neder siden' + one: "1 mÃ¥ned siden" + other: "%{count} mÃ¥neder siden" about_x_years: - one: ca. 1 Ã¥r siden - other: ca. %{count} Ã¥r siden + one: "ca. 1 Ã¥r siden" + other: "ca. %{count} Ã¥r siden" over_x_years: - one: over 1 Ã¥r siden - other: over %{count} Ã¥r siden + one: "over 1 Ã¥r siden" + other: "over %{count} Ã¥r siden" almost_x_years: - one: næsten 1 Ã¥r siden - other: næsten %{count} Ã¥r siden + one: "næsten 1 Ã¥r siden" + other: "næsten %{count} Ã¥r siden" password_reset: no_token: "Beklager, dit kodeords-reset link er udløbet. Vælg 'Log ind' knappen og brug 'Jeg har glemt mit kodeord' for at fÃ¥ et nyt link." choose_new: "Vælg en ny adgangskode" @@ -565,13 +541,8 @@ da: title: 'Like' description: 'Du liker dette indlæg' long_form: 'like dette' - vote: - title: 'Stem' - description: 'Stem for dette indlæg' - long_form: 'stemte for dette indlæg' user_activity: no_bookmarks: - self: "Du har ingen bogmærkede indlæg - bogmærkede indlæg lader dig tilgÃ¥ dem nemt pÃ¥ et senere tidspunkt." others: "Ingen bogmærker" no_likes_given: self: "Du har ikke liket nogen indlæg." @@ -705,8 +676,6 @@ da: num_users: "Brugere" top_referred_topics: title: "Top henviste emner" - xaxis: "Emne" - num_clicks: "Klik" page_view_anon_reqs: title: "Anonym" xaxis: "Dag" @@ -763,7 +732,6 @@ da: xaxis: "Dag" yaxis: "Total" mobile_visits: - title: "Brugerbesøg" xaxis: "Dag" yaxis: "Antal besøg" dashboard: @@ -782,8 +750,8 @@ da: failing_emails_warning: 'Der er %{num_failed_jobs} email operationer der mislykkede. Tjek din app.yml for at sikre at din mail server indstillinger er korrekte. Se mislykkede operationer i Sidekiq.' subfolder_ends_in_slash: "Din undermappe er ikke opsat korrekt; DISCOURSE_RELATIVE_URL_ROOT ender med en slash." email_polling_errored_recently: - one: Email afstemning har afstedkommet en fejl i de seneste 24 timer. Venligst se the logs for detaljer. - other: Email afstemning har afstedkommet %{count} fejl i de seneste 24 timer. Se venligst the logs for detaljer. + one: "Email afstemning har afstedkommet en fejl i de seneste 24 timer. Venligst se the logs for detaljer." + other: "Email afstemning har afstedkommet %{count} fejl i de seneste 24 timer. Se venligst the logs for detaljer." bad_favicon_url: "Favicon kan ikke loades. Tjek dine favicon_url indstilling i Site Settings" poll_pop3_timeout: "Forbindelsen til til POP3 serveren er udløbet. Indkomne mail kunne ikke hentes. Venligst tjek POP3 settings og udbyderen." poll_pop3_auth_error: "Forbindelsen til POP3 serveren melder fejl. Venligst tjek POP3 settings." @@ -870,7 +838,6 @@ da: post_menu: "Angiv hvilke elementer der skal vises i indlægsmenuen, og i hvilken rækkefølge. Eksempel: like|edit|flag|delete|share|bookmark|reply." post_menu_hidden_items: "Menuen vil automatisk gemme disse elementer i indlægs menuen, med mindre en udvidelse er tilvalgt." share_links: "Angiv hvilke elementer der skal vises i “del“-dialogboksen og i hvilken rækkefølge." - track_external_right_clicks: "Spor højreklik pÃ¥ eksterne links (f.eks.: Ã¥bn i ny tab); deaktiveret som standard fordi den omskriver URLer" send_welcome_message: "Send alle nye brugere en velkomstbesked, med en hurtig start guide." topics_per_period_in_top_summary: "Antallet af top emner der vises som standard i top emner" topics_per_period_in_top_page: "Antallet af top emner der vises nÃ¥r 'Vis Mere' er aktiveret." @@ -932,7 +899,6 @@ da: auto_respond_to_flag_actions: "Aktivér automatisk besvarelse, nÃ¥r en flagmarkering fjernes." reply_by_email_enabled: "Aktivér muligheden for at svare til emner via email." reply_by_email_address: "Skabelon for e-mail-adressen i formularen, for eksempel: %{reply_key}@reply.myforum.com." - disable_emails: "Stop Discourse i at sende nogen form for emails" strip_images_from_short_emails: "Undlad at inkludere billeder fra emails som fylder mindre end 2800 Bytes" short_email_length: "Kort email i Bytes" display_name_on_email_from: "Vis fulde navne pÃ¥ emails fra felter" @@ -997,31 +963,29 @@ da: frequent_poster: "Hyppig forfatter" redirected_to_top_reasons: new_user: "Velkommen til fællesskabet! Dette er de seneste mest populære emner." - change_owner: - deleted_user: "en slettet bruger" topic_statuses: archived_enabled: "Dette emne er nu arkiveret. Det er frosset fast og kan ikke ændres pÃ¥ nogen mÃ¥de." archived_disabled: "Dette emne er nu ikke længere arkiveret. Det er ikke længere frosset fast, og kan ændres." closed_enabled: "Dette emne er nu lukket. Nye indlæg tillades ikke." closed_disabled: "Dette emne er nu Ã¥bent. Nye indlæg tillades." autoclosed_enabled_days: - one: Dette emne blev automatisk lukket efter 1 dag. Nye svar er ikke længere tilladt. - other: Dette emne blev automatisk lukket efter %{count} dage. Nye svar er ikke længere tilladt. + one: "Dette emne blev automatisk lukket efter 1 dag. Nye svar er ikke længere tilladt." + other: "Dette emne blev automatisk lukket efter %{count} dage. Nye svar er ikke længere tilladt." autoclosed_enabled_hours: - one: Dette emne blev automatisk lukket efter 1 time. Nye svar er ikke længere tilladt. - other: Dette emne blev automatisk lukket efter %{count} timer. Nye svar er ikke længere tilladt. + one: "Dette emne blev automatisk lukket efter 1 time. Nye svar er ikke længere tilladt." + other: "Dette emne blev automatisk lukket efter %{count} timer. Nye svar er ikke længere tilladt." autoclosed_enabled_minutes: - one: Dette emne blev automatisk lukket efter 1 minut. Nye svar er ikke længere tilladt. - other: Dette emne blev automatisk lukket efter %{count} minutter. Nye svar er ikke længere tilladt. + one: "Dette emne blev automatisk lukket efter 1 minut. Nye svar er ikke længere tilladt." + other: "Dette emne blev automatisk lukket efter %{count} minutter. Nye svar er ikke længere tilladt." autoclosed_enabled_lastpost_days: - one: Dette emne blev automatisk lukket 1 dag efter det seneste svar. Nye svar er ikke længere tilladt. - other: Dette emne blev automatisk lukket %{count} dage efter det seneste svar. Nye svar er ikke længere tilladt. + one: "Dette emne blev automatisk lukket 1 dag efter det seneste svar. Nye svar er ikke længere tilladt." + other: "Dette emne blev automatisk lukket %{count} dage efter det seneste svar. Nye svar er ikke længere tilladt." autoclosed_enabled_lastpost_hours: - one: Dette emne blev automatisk lukket 1 time efter det seneste svar. Nye svar er ikke længere tilladt. - other: Dette emne blev automatisk lukket %{count} timer efter det seneste svar. Nye svar er ikke længere tilladt. + one: "Dette emne blev automatisk lukket 1 time efter det seneste svar. Nye svar er ikke længere tilladt." + other: "Dette emne blev automatisk lukket %{count} timer efter det seneste svar. Nye svar er ikke længere tilladt." autoclosed_enabled_lastpost_minutes: - one: Dette emne blev automatisk lukket 1 minut efter det seneste svar. Nye svar er ikke længere tilladt. - other: Dette emne blev automatisk lukket %{count} minutter efter det seneste svar. Nye svar er ikke længere tilladt. + one: "Dette emne blev automatisk lukket 1 minut efter det seneste svar. Nye svar er ikke længere tilladt." + other: "Dette emne blev automatisk lukket %{count} minutter efter det seneste svar. Nye svar er ikke længere tilladt." autoclosed_disabled: "Dette emne er nu Ã¥bnet. Nye svar er tilladt." autoclosed_disabled_lastpost: "Dette emne er nu Ã¥bent. Nye svar er tilladt." pinned_enabled: "Dette emne er nu fastgjort. Det vil stÃ¥ i toppen af dets kategori indtil det bliver frigjort af \"staff\" for alle eller af hver bruger individuelt for dem selv." @@ -1054,7 +1018,6 @@ da: missing_user_field: "Du har ikke udfyldt alle felterne" already_logged_in: "Hovsa, det ser ud til, at du forsøger at acceptere en invitation til en anden bruger. Hvis du ikke er %{current_user}, sÃ¥ log venligst ud og prøv igen." user: - no_accounts_associated: "Ingen konti tilknyttet" deactivated_by_staff: "Deaktiveret af hjælperteamet" activated_by_staff: "Aktiveret af hjælperteamet" new_user_typed_too_fast: "Ny bruger tastede for hurtigt" @@ -1075,8 +1038,8 @@ da: max_new_accounts_per_registration_ip: "Nye kontoer kan ikke oprettes fra din IP-adresse (max antal er nÃ¥et). Kontakt et medlem af hjælperteamet." flags_reminder: subject_template: - one: 1 flag venter pÃ¥ at blive hÃ¥ndteret - other: '%{count} flag venter pÃ¥ at blive hÃ¥ndteret' + one: "1 flag venter pÃ¥ at blive hÃ¥ndteret" + other: "%{count} flag venter pÃ¥ at blive hÃ¥ndteret" unsubscribe_mailer: subject_template: "Bekræft at du ikke længere ønsker at modtage email opdateringer fra %{site_title}" text_body_template: |+ @@ -1130,18 +1093,13 @@ da: deferred: "Tak for din henvendelse. Vi kigger pÃ¥ det." deferred_and_deleted: "Tak for din henvendelse. Vi har fjernet indlægget." temporarily_closed_due_to_flags: - one: Emnet er lukket i 1 time pga. et stort antal flagmarkeringer. - other: Emnet er lukket i %{count} timer pga. et stort antal flagmarkeringer. + one: "Emnet er lukket i 1 time pga. et stort antal flagmarkeringer." + other: "Emnet er lukket i %{count} timer pga. et stort antal flagmarkeringer." system_messages: private_topic_title: "Emne #%{id}" contents_hidden: "GÃ¥ venligst til indlægget for at se indholdet." post_hidden: subject_template: "Inlægget er skjult pga. flagmarkeringer" - usage_tips: - text_body_template: | - Hvis du vil have et par hurtige tips til at komme i gang som ny bruger, sÃ¥ [tjek dette blogindlæg](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). - - NÃ¥r du deltager her, kommer vi til at kende dig, og de midlertidige begrænsninger for nye brugere vil blive ophævet. EfterhÃ¥nden vil du fÃ¥ højere [tillidsniveauer](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), som indbærer særlige muligheder for at hjælpe os med at drive vores forum sammen. welcome_user: title: "Velkomst til bruger" subject_template: "Velkommen til %{site_name}!" @@ -1196,8 +1154,8 @@ da: pending_users_reminder: title: "PÃ¥mindelse om afventende brugere" subject_template: - one: 1 bruger afventer godkendelse - other: '%{count} brugere afventer godkendelse' + one: "1 bruger afventer godkendelse" + other: "%{count} brugere afventer godkendelse" text_body_template: | Der er nye brugere, som afventer godkendelse (eller afvisning) før de kan tilgÃ¥ dette forum. @@ -1225,10 +1183,8 @@ da: title: "Frameld" description: "Ønsker du ikke at modtage disse e-mails? Intet problem! Klik herunder for at framelde med det samme:" reply_by_email: "[Besøg emnet](%{base_url}%{url}) eller svar pÃ¥ denne email for at svare." - reply_by_email_pm: "[GÃ¥ til besked](%{base_url}%{url}) eller svar pÃ¥ denne email for at svare." only_reply_by_email: "Besvar denne mail for at svare." visit_link_to_respond: "[GÃ¥ til emne](%{base_url}%{url}) for at svare." - visit_link_to_respond_pm: "[GÃ¥ til besked](%{base_url}%{url}) for at svare." posted_by: "Oprettet af %{username} den %{post_date}" user_invited_to_private_message_pm: title: "Bruger inviteret til PB" @@ -1409,7 +1365,6 @@ da: recent_topics: "Nye" see_more: "Flere" search_title: "Søg pÃ¥ denne side" - search_google: "Google" terms_of_service: title: "VilkÃ¥r" signup_form_message: 'Jeg har læst og accepterer vilkÃ¥rene.' @@ -1425,24 +1380,6 @@ da: size_not_found: "Beklager, men vi kunne ikke fastslÃ¥ billedets størrelse. MÃ¥ske er dit billede ødelagt?" flag_reason: sockpuppet: "En ny bruger oprettede et emne, og en anden ny bruger med den samme IP-adresse (%{ip_address}) besvarede. Se indstillinger for `flag_sockpuppets`." - email_log: - post_user_deleted: "Brugeren af dette svar er blevet slettet." - no_user: "Kan ikke finde brugeren med id %{user_id}" - anonymous_user: "Brugeren er anonym" - suspended_not_pm: "Brugeren er suspenderet, ikke en besked" - seen_recently: "Bruger har været logget pÃ¥ for nyligt" - post_not_found: "Kan ikke finde et indlæg med id %{post_id}" - notification_already_read: "Den notifikation som denne email handler om er allerede læst" - topic_nil: "post.topic er nul" - post_deleted: "indlægget er blevet slettet af forfatteren" - user_suspended: "brugeren blev suspenderet" - already_read: "brugeren har allerede læst dette indlæg" - exceeded_emails_limit: "Overskredet max_emails_per_day_per_user" - exceeded_bounces_limit: "Overskredet bounce_score_threshold" - message_blank: "beskeden er tom" - message_to_blank: "message.to er tom" - text_part_body_blank: "text_part.body er tom" - body_blank: "brødtekst er tom" color_schemes: base_theme_name: "Base" about: "Om" @@ -1494,8 +1431,6 @@ da: great_topic: name: Glimrende emne description: Modtog 50 synes godt om for et emne - long_description: | - Dette badge tildeles nÃ¥r dit emne fÃ¥r 50 synes godt om-tilkendegivelser. Du startede en fascinerende dialog og fællesskabet værdsatte den dynamiske diskussion som fulgte! good_share: description: Delte et indlæg med 300 unikke besøgende first_like: @@ -1504,8 +1439,6 @@ da: first_flag: name: Første Flagmarkering description: Flagmarkerede et indlæg - long_description: | - Dette badge bliver tildelt den første gang du flagmarkerer et indlæg. Ved at flagmakere hjælper vi alle med at sørge for, at forummet er et godt og rart sted for alle. Hvis du lægger mærke til poster, som kræver moderatorernes opmærksomhed, sÃ¥ tøv ikke med at flagmarkere. Du kan ogsÃ¥ markere for at sende en personlig besked til andre brugere, hvis du kan se et problem med deres indlæg. Hvis du ser et problem, sÃ¥ :flag_black: flagmarker det! promoter: description: Inviterede en bruger campaigner: @@ -1562,8 +1495,6 @@ da: empathetic: name: Empatisk description: Har 500 likede indlæg og givet 1000 likes - first_onebox: - long_description: "Dette badge bliver tildelt første gang du poster et link i en linie for sig selv. Det vil automatisk ekspandere til en boks med et kort sammendrag af siden, en titel og (nÃ¥r muligt) et billede." first_reply_by_email: name: Første svar via email long_description: | @@ -1653,10 +1584,8 @@ da: fields: favicon_url: label: "Lille ikon" - description: "Ikonbillede som bruges til at fremvise dit site i webbrowsere, og som ser godt ud i smÃ¥ størrelser sÃ¥som 32px gange 32px." apple_touch_icon_url: label: "Stort ikon" - description: "Ikonbillede som bruges til at fremvise dit site i moderne webbrowsere, og som ser godt ud i større størrelser. Den anbefalet størrelse er mindst 144px gange 144px." homepage: description: "Vi anbefaler at seneste emner vises pÃ¥ din hjemmeside, men du kan ogsÃ¥ vise kategorier (grupper af emner) pÃ¥ hjemmesiden, hvis du foretrækker dette." title: "Hjemmeside" @@ -1665,8 +1594,6 @@ da: choices: latest: label: "Seneste emner" - categories: - label: "Kategorier" emoji: title: "Emoji" description: "Hvilken Emoji-stil foretrækker du for dit fællesskab? Du kan tilføje flere brugerdefinerede Emoji'er senere via Admin, Tilpas, Emoji." diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 2ad07d3287..22b21031a7 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -39,6 +39,11 @@ de: bad_color_scheme: "Kann Motiv nicht aktualisieren, ungültiges Farbschema" other_error: "Etwas ist schief gelaufen beim Aktualisieren des Theme" error_importing: "Fehler beim Klonen des git-Repository, Zugriff verboten oder Repository nicht gefunden." + errors: + component_no_user_selectable: "Theme Komponenten können nicht Benutzer auswählbar sein " + component_no_default: "Theme Komponenten können nicht Standard Theme sein" + component_no_color_scheme: "Theme Komponenten können kein Farb-Schema haben" + no_multilevels_components: "Themes mit Unter-Themes können nicht selber Unter-Themes sein" settings_errors: invalid_yaml: "Der YAML-Code ist ungültig." data_type_not_a_number: "Der eingestellte Datentyp `%{name}` wird nicht unterstützt. Unterstützte Datentypen sind `integer`, `bool`, `list` und `enum`." @@ -134,8 +139,8 @@ de: load_from_remote: "Beim Laden des Beitrags ist ein Fehler aufgetreten." site_settings: invalid_choice: - one: Du hast die ungültige Auswahl %{name} getroffen - other: Du hast die ungültige Auswahl %{name} getroffen + one: 'Du hast die ungültige Auswahl %{name} getroffen' + other: 'Du hast die ungültige Auswahl %{name} getroffen' min_username_length_exists: "Die minimale Länge für den Benutzernamen kann nicht höher sein als der kürzeste Benutzername." min_username_length_range: "Du kannst das Minimum nicht höher setzen als das Maximum." max_username_length_exists: "Die maximale Länge für den Benutzernamen kann nicht kürzer sein als der längste Benutzername." @@ -169,13 +174,16 @@ de: not_logged_in: "Dazu musst du angemeldet sein." not_found: "Die angeforderte URL oder Ressource konnte nicht gefunden werden." invalid_access: "Du hast nicht die Erlaubnis, die angeforderte Ressource zu betrachten." + authenticator_not_found: "Authentifizierungsmethode existiert nicht oder wurde deaktiviert" invalid_api_credentials: "Du bist nicht berechtigt, die angeforderte Ressource anzuzeigen. Der API-Benutzername oder -Schlüssel ist ungültig." + provider_not_enabled: "Du bist nicht berechtigt, die angeforderte Ressource anzuzeigen. Der Authentifizierungsprovider ist nicht aktiviert." + provider_not_found: "Du bist nicht berechtigt, die angeforderte Ressource anzuzeigen. Der Authentifizierungsprovider existiert nicht." read_only_mode_enabled: "Die Seite befindet sich im Nur-Lesen Modus. Änderungen sind deaktiviert." reading_time: "Lesezeit" likes: "Likes" too_many_replies: - one: Entschuldigung, aber neue Benutzer sind vorübergehend auf eine Antwort pro Thema beschränkt. - other: Entschuldigung, aber neue Benutzer sind vorübergehend auf %{count} Antworten pro Thema beschränkt. + one: "Entschuldigung, aber neue Benutzer sind vorübergehend auf eine Antwort pro Thema beschränkt." + other: "Entschuldigung, aber neue Benutzer sind vorübergehend auf %{count} Antworten pro Thema beschränkt." embed: start_discussion: "Diskussion beginnen" continue: "Diskussion fortsetzen" @@ -185,43 +193,44 @@ de: no_hosts: "Es wurden keine Hostnamen für die Einbettung konfiguriert." configure: "Einbettung konfigurieren" more_replies: - one: 1 weitere Antwort - other: '%{count} weitere Antworten' + one: "1 weitere Antwort" + other: "%{count} weitere Antworten" loading: "Lade Diskussion..." permalink: "Permanenter Link" imported_from: "Dies ist ein Begleitthema zum ursprünglichen Beitrag unter %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 Antwort - other: '%{count} Antworten' + one: "1 Antwort" + other: "%{count} Antworten" no_mentions_allowed: "Entschuldigung, du kannst keine Benutzer erwähnen." too_many_mentions: - one: Entschuldigung, du kannst nur einen anderen Benutzer in einem Beitrag erwähnen. - other: Entschuldigung, du kannst nur %{count} Benutzer in einem Beitrag erwähnen. + one: "Entschuldigung, du kannst nur einen anderen Benutzer in einem Beitrag erwähnen." + other: "Entschuldigung, du kannst nur %{count} Benutzer in einem Beitrag erwähnen." no_mentions_allowed_newuser: "Entschuldigung, neue Benutzer können andere Benutzer nicht erwähnen." too_many_mentions_newuser: - one: Entschuldige, neue Benutzer können nur einen anderen Benutzer in einem Beitrag erwähnen. - other: Entschuldige, neue Benutzer können nur %{count} Benutzer in einem Beitrag erwähnen. + one: "Entschuldige, neue Benutzer können nur einen anderen Benutzer in einem Beitrag erwähnen." + other: "Entschuldige, neue Benutzer können nur %{count} Benutzer in einem Beitrag erwähnen." no_images_allowed_trust: "Entschuldige, du kannst keine Bilder in einen Beitrag einfügen." no_images_allowed: "Entschuldige, neue Benutzer können Beiträgen keine Bilder hinzufügen." too_many_images: - one: Entschuldige, neue Benutzer können Beiträgen höchstens ein Bild hinzufügen. - other: Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Bilder hinzufügen. + one: "Entschuldige, neue Benutzer können Beiträgen höchstens ein Bild hinzufügen." + other: "Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Bilder hinzufügen." no_attachments_allowed: "Entschuldige, neue Benutzer können Beiträgen keine Dateien hinzufügen." too_many_attachments: - one: Entschuldige, neue Benutzer können Beiträgen höchstens eine Datei hinzufügen. - other: Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Dateien hinzufügen. + one: "Entschuldige, neue Benutzer können Beiträgen höchstens eine Datei hinzufügen." + other: "Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Dateien hinzufügen." no_links_allowed: "Entschuldige, neue Benutzer können Beiträgen keine Links hinzufügen." links_require_trust: "Entschuldige, du kannst keine Links in einen Beitrag einfügen." too_many_links: - one: Entschuldige, neue Benutzer können Beiträgen höchstens einen Link hinzufügen. - other: Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Links hinzufügen. + one: "Entschuldige, neue Benutzer können Beiträgen höchstens einen Link hinzufügen." + other: "Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Links hinzufügen." contains_blocked_words: "Dein Beitrag enthält ein nicht erlaubtes Wort: %{word}" spamming_host: "Entschuldigung, du kannst keine Links zu diesem Webserver posten." user_is_suspended: "Gesperrte Benutzer dürfen keine Beiträge schreiben." topic_not_found: "Etwas ist schief gelaufen. Wurde das Thema eventuell geschlossen oder gelöscht, während du es angeschaut hast?" not_accepting_pms: "Entschuldige, %{username} akzeptiert gerade keine Nachrichten." max_pm_recepients: "Sorry, du kannst eine Nachricht nur an maximal %{recipients_limit} Emfpänger senden." + pm_reached_recipients_limit: "Entschuldige, aber Du kannst nicht mehr als %{recipients_limit} Empfänger in einer Nachricht haben." just_posted_that: "ist einer einer vor Kurzem von dir geschriebenen Nachricht zu ähnlich" invalid_characters: "enthält ungültige Zeichen" is_invalid: "scheint unklar, ist das ein ganzer Satz?" @@ -249,7 +258,7 @@ de: top_daily: "Top-Themen der letzten 24 Stunden" posts: "Letzte Beiträge" private_posts: "Neueste Nachrichten" - group_posts: "Letzte Beiträge von %(Gruppen_name)" + group_posts: "Neueste Beiträge von %{group_name}" group_mentions: "Neueste Nennungen von %{group_name}" user_posts: "Neueste Beiträge von @%{username}" user_topics: "Neueste Themen von @%{username}" @@ -264,14 +273,14 @@ de: groups: success: bulk_add: - one: '%{count} Benutzer wurde zu dieser Gruppe hinzugefügt.' - other: '%{count} Benutzer wurden zu dieser Gruppe hinzugefügt.' + one: "%{count} Benutzer wurde zu dieser Gruppe hinzugefügt." + other: "%{count} Benutzer wurden zu dieser Gruppe hinzugefügt." errors: grant_trust_level_not_valid: "'%{trust_level}' ist keine gültige Vertrauensstufe" can_not_modify_automatic: "Du kannst eine automatische Gruppe nicht bearbeiten" member_already_exist: - one: '''%{username}'' ist bereits Mitglied dieser Gruppe.' - other: 'Die folgenden Benutzer sind bereits Mitglieder dieser Gruppe: %{username}' + one: "'%{username}' ist bereits Mitglied dieser Gruppe." + other: "Die folgenden Benutzer sind bereits Mitglieder dieser Gruppe: %{username}" invalid_domain: "'%{domain}' ist keine gültige Domain." invalid_incoming_email: "'%{email}' ist keine gültige E-Mail-Adresse." email_already_used_in_group: "'%{email}' wird bereits von der Gruppe '%{group_name}' verwendet." @@ -291,8 +300,8 @@ de: title: "Mitgliedschaftsanfrage für @%{group_name}" education: until_posts: - one: 1 Beitrag - other: '%{count} Beiträge' + one: "1 Beitrag" + other: "%{count} Beiträge" 'new-topic': | Willkommen bei %{site_name} — **danke, dass du ein neues Thema erstellst!** @@ -451,27 +460,7 @@ de: Du solltest dieses Thema eventuell schließen über die Administration :wrench: (oben rechts oder unten), damit sich an einer Ankündigung wie dieser nicht die Antworten aufstapeln. lounge_welcome: title: "Willkommen in der Lounge" - body: |2 - - Gratuliere! :confetti_ball: - - Wenn du dieses Thema sehen kannst, wurdest du vor Kurzem zum **Stammgast** (Vertrauensstufe 3) befördert. - - Du kannst nun … - - * den Titel eines jeden Themas ändern - * Themen in andere Kategorien verschieben - * Links veröffentlichen, die von Suchmaschinen weiterverfolgt werden (das automatische [nofollow](http://de.wikipedia.org/wiki/Nofollow) wird entfernt) - * auf die private Lounge-Kategorie zugreifen, die für Benutzer mit Vertrauensstufe 3 oder höher sichtbar ist - * Spam durch eine einzige Meldung ausblenden - - Hier ist die [aktuelle Liste aller Stammgäste](/badges/3/regular). Vergiss nicht, hallo zu sagen! - - Vielen Dank dafür, dass du ein wichtiger Teil dieser Community bist! - - (Wenn du mehr über Vertrauensstufen wissen möchtest, kannst du [dieses Thema lesen][trust]. Beachte bitte, dass nur jene Mitglieder Stammgäste bleiben, die auch im Laufe der Zeit die Anforderungen erfüllen.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + body: "\nGratuliere! :confetti_ball:\n\nWenn du dieses Thema sehen kannst, wurdest du vor Kurzem zum **Stammgast** (Vertrauensstufe 3) befördert.\n \nDu kannst nun …\n\n* den Titel eines jeden Themas ändern\n* Themen in andere Kategorien verschieben\n* Links veröffentlichen, die von Suchmaschinen weiterverfolgt werden (das automatische [nofollow](http://de.wikipedia.org/wiki/Nofollow) wird entfernt)\n* auf die private Lounge-Kategorie zugreifen, die für Benutzer mit Vertrauensstufe 3 oder höher sichtbar ist\n* Spam durch eine einzige Meldung ausblenden\n\nHier ist die [aktuelle Liste aller Stammgäste](/badges/3/regular). Vergiss nicht, hallo zu sagen!\n\nVielen Dank dafür, dass du ein wichtiger Teil dieser Community bist!\n\n(Wenn du mehr über Vertrauensstufen wissen möchtest, kannst du [dieses Thema lesen][trust]. Beachte bitte, dass nur jene Mitglieder Stammgäste bleiben, die auch im Laufe der Zeit die Anforderungen erfüllen.)\n\n[trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/\n" category: topic_prefix: "Über die Kategorie %{category}" replace_paragraph: "(Ersetze diesen ersten Absatz mit einer kurzen Beschreibung deiner neuen Kategorie. Diese Richtlinie wird in der Kategorienauswahl angezeigt, versuche also weniger als 200 Zeichen zu benutzen. **Bis du diese Beschreibung geändert oder Themen angelegt hast, wird diese Kategorie nicht auf der Kategorie-Seite angezeigt.**)" @@ -489,9 +478,9 @@ de: uncategorized: "Die \"unkategorisiert\" Kategorie kann nicht gelöscht werden." has_subcategories: "Diese Kategorie kann nicht gelöscht werden, weil sie Unterkategorien besitzt." topic_exists: - one: Diese Kategorie kann nicht gelöscht werden, weil sie ein Thema enthält. Das Thema ist %{topic_link}. - other: Diese Kategorie kann nicht gelöscht werden, weil sie %{count} Themen enthält. Das älteste Thema ist %{topic_link}. - topic_exists_no_oldest: "Diese Kategorie kann nicht gelöscht werden, weil sie #{category.topic_count} Themen enthält." + one: "Diese Kategorie kann nicht gelöscht werden, weil sie %{count} Themen enthält. Das älteste Thema ist %{topic_link}." + other: "Diese Kategorie kann nicht gelöscht werden, weil sie %{count} Themen enthält. Das älteste Thema ist %{topic_link}." + topic_exists_no_oldest: "Diese Kategorie kann nicht gelöscht werden, weil sie %{count} Themen enthält." uncategorized_description: "Themen welche keine Kategorie benötigen oder in keine existierende Kategorie passen." trust_levels: newuser: @@ -527,85 +516,86 @@ de: unsubscribe_via_email: "Du hast die maximale Anzahl an Abbestellungen per E-Mail erreicht. Bitte warte %{time_left}, vor einem neuen Versuch." topic_invitations_per_day: "Du hast die maximale Zahl an neuen Thema-Einladungen erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst." hours: - one: 1 Stunde - other: '%{count} Stunden' + one: "1 Stunde" + other: "%{count} Stunden" minutes: - one: 1 Minute - other: '%{count} Minuten' + one: "1 Minute" + other: "%{count} Minuten" seconds: - one: 1 Sekunde - other: '%{count} Sekunden' + one: "1 Sekunde" + other: "%{count} Sekunden" + short_time: "ein paar Sekunden" datetime: distance_in_words: half_a_minute: "< 1 Min." less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1 Min. - other: < %{count} Min. + one: "< 1 Min." + other: "< %{count} Min." x_minutes: - one: 1 Min. - other: '%{count} Min.' + one: "1 Min." + other: "%{count} Min." about_x_hours: - one: 1 Std. - other: '%{count} Std.' + one: "1 Std." + other: "%{count} Std." x_days: - one: 1 Tag - other: '%{count} Tage' + one: "1 Tag" + other: "%{count} Tage" about_x_months: - one: 1 Monat - other: '%{count} Monate' + one: "1 Monat" + other: "%{count} Monate" x_months: - one: 1 Monat - other: '%{count} Monate' + one: "1 Monat" + other: "%{count} Monate" about_x_years: - one: 1 Jahr - other: '%{count} Jahre' + one: "1 Jahr" + other: "%{count} Jahre" over_x_years: - one: '> 1 Jahr' - other: '> %{count} Jahre' + one: "> 1 Jahr" + other: "> %{count} Jahre" almost_x_years: - one: 1 Jahr - other: '%{count} Jahre' + one: "1 Jahr" + other: "%{count} Jahre" distance_in_words_verbose: half_a_minute: "gerade eben" less_than_x_seconds: - one: gerade eben - other: gerade eben + one: "gerade eben" + other: "gerade eben" x_seconds: - one: vor einer Sekunde - other: vor %{count} Sekunden + one: "vor einer Sekunde" + other: "vor %{count} Sekunden" less_than_x_minutes: - one: vor weniger als einer Minute - other: vor weniger als %{count} Minuten + one: "vor weniger als einer Minute" + other: "vor weniger als %{count} Minuten" x_minutes: - one: vor einer Minute - other: vor %{count} Minuten + one: "vor einer Minute" + other: "vor %{count} Minuten" about_x_hours: - one: vor einer Stunde - other: vor %{count} Stunden + one: "vor einer Stunde" + other: "vor %{count} Stunden" x_days: - one: vor einem Tag - other: vor %{count} Tagen + one: "vor einem Tag" + other: "vor %{count} Tagen" about_x_months: - one: vor etwa einem Monat - other: vor etwa %{count} Monaten + one: "vor etwa einem Monat" + other: "vor etwa %{count} Monaten" x_months: - one: vor einem Monat - other: vor %{count} Monaten + one: "vor einem Monat" + other: "vor %{count} Monaten" about_x_years: - one: vor etwa einem Jahr - other: vor etwa %{count} Jahren + one: "vor etwa einem Jahr" + other: "vor etwa %{count} Jahren" over_x_years: - one: vor über einem Jahr - other: vor über %{count} Jahren + one: "vor über einem Jahr" + other: "vor über %{count} Jahren" almost_x_years: - one: vor fast einem Jahr - other: vor fast %{count} Jahren + one: "vor fast einem Jahr" + other: "vor fast %{count} Jahren" password_reset: no_token: "Entschuldige, aber der Link zum Zurücksetzen des Passworts ist zu alt. Wähle 'Ich habe mein Passwort vergessen' um einen neuen Link zu erhalten." choose_new: "Wähle ein neues Passwort" @@ -618,6 +608,17 @@ de: email_login: invalid_token: "Entschuldige, aber der Link zum Anmelden ist zu alt. Wähle die Anmelden-Schaltfläche und nutze „Ich habe mein Passwort vergessen“, um einen neuen Link zu erhalten." title: "E-Mail-Anmeldung" + user_auth_tokens: + devices: + android: 'Android Gerät' + linux: 'Linux Computer' + windows: 'Windows Computer' + mac: 'Mac' + iphone: 'iPhone' + ipad: 'iPad' + ipod: 'iPod' + mobile: 'Mobiles Gerät' + unknown: 'Unbekanntes Gerät' change_email: confirmed: "Deine E-Mail-Adresse wurde aktualisiert." please_continue: "Weiter zu %{site_name}" @@ -627,6 +628,8 @@ de: authorizing_old: title: "Vielen Dank für die Bestätigung deiner aktuellen E-Mail-Adresse" description: "Wir senden dir jetzt zur Bestätigung eine E-Mail an deine neue Adresse." + associated_accounts: + revoke_failed: "Das Widerrufen deines Kontos bei %{provider_name} ist fehlgeschlagen." activation: action: "Klicke hier, um deinen Account zu aktivieren" already_done: "Entschuldige, dieser Link zur Aktivierung des Benutzerkontos ist nicht mehr gültig. Ist dein Konto schon aktiviert?" @@ -684,17 +687,12 @@ de: description: 'Dieser Beitrag gefällt mir' short_description: 'Dieser Beitrag gefällt mir' long_form: 'hat dies gefallen' - vote: - title: 'Abstimmung' - description: 'Stimme für diesen Beitrag' - short_description: 'Für diesen Beitrag abstimmen' - long_form: 'für diesen Beitrag gestimmt' user_activity: no_default: self: "Du hast noch keine Aktivität." others: "Keine Aktivität." no_bookmarks: - self: "Du hast keine Beiträge mit Lesezeichen, Lesezeichen ermöglichen es dir, diese später einfach zu finden." + self: "Du hast keine Beiträge mit Lesezeichen; Lesezeichen erlauben es Dir schnell zu einem spezifischen Beitrag zu referenzieren." others: "Keine Lesezeichen." no_likes_given: self: "Du hast noch keine Beiträge mit einem „Like“ markiert." @@ -702,19 +700,25 @@ de: no_replies: self: "Du hast auf keine Beiträge geantwortet." others: "Keine Antworten." + no_drafts: + self: "Du hast keine Entwürfe; beginne eine Antwort in einem beliebigen Thema und es wird automatisch als neuer Entwurf gespeichert." + others: "Du hast keine Berechtigung die Entwürfe dieses Benutzers zu sehen." topic_flag_types: spam: title: 'Spam' description: 'Dieser Beitrag besteht effektiv nur aus Werbung, die nicht als solche ausgewiesen ist. Er trägt nichts zum aktuellen Gespräch bei.' long_form: 'als Spam gemeldet' + short_description: 'Dies ist ist Werbung' inappropriate: title: 'Unangemessen' description: 'Dieses Thema enthält Inhalte, die eine vernünftige Person als anstößig, beleidigend oder unsere Richtlinien verletzend auffassen würde.' long_form: 'als unangemessen gemeldet' + short_description: 'Ein Verstoß gegen unsere Community-Richtlinien' notify_moderators: title: "Irgendetwas anderes" description: 'Dieser Beitrag erfordert die allgemeine Aufmerksamkeit des Teams, da er entweder nicht mit den Richtlinien oder den Nutzungsbedingungen in Einklang zu bringen ist, oder aus anderen Gründen.' long_form: ' hast dies den Moderatoren gemeldet' + short_description: 'Erfordert aus einem anderen Grund die Aufmerksamkeit des Teams' email_title: 'Das Thema "%{title}" benötigt die Aufmerksamkeit eines Moderators' email_body: "%{link}\n\n%{message}" flagging: @@ -760,6 +764,41 @@ de: read: "Alles lesen" write: "Alles schreiben" reports: + default: + labels: + count: Anzahl + percent: Prozent + day: Tag + post_edits: + title: "Beitragsbearbeitungen" + labels: + post: Beitrag + editor: Bearbeiter + author: Ersteller + edit_reason: Grund + moderators_activity: + title: "Moderator-Aktivität" + labels: + moderator: Moderator + flag_count: Überprüfte Meldungen + time_read: Lesezeit + topic_count: Erstellte Themen + post_count: Erstellte Beiträge + pm_count: Erstellte Nachrichten + revision_count: Revisionen + flags_status: + title: "Meldungsstatus" + values: + agreed: Zugestimmt + disagreed: Abgelehnt + deferred: Zurückgestellt + no_action: Keine Aktion + labels: + flag: Typ + assigned: Zugewiesen + poster: Ersteller + flagger: Meldender + time_to_resolution: Lösungszeit visits: title: "Nutzerbesuche" xaxis: "Tag" @@ -818,10 +857,14 @@ de: title: "Benutzer nach Stufe" xaxis: "Stufe" yaxis: "Anzahl der Benutzer" + labels: + level: Stufe users_by_type: title: "Benutzer nach Art" xaxis: "Art" yaxis: "Anzahl der Benutzer" + labels: + type: Typ xaxis_labels: admin: Administrator moderator: Moderator @@ -872,10 +915,15 @@ de: num_clicks: "Klicks" num_topics: "Themen" num_users: "Benutzer" + labels: + domain: Domain + num_clicks: Klicks + num_topics: Themen top_referred_topics: title: "Top verwiesene Themen" - xaxis: "Themen" - num_clicks: "Klicks" + labels: + num_clicks: "Klicks" + topic: "Thema" page_view_anon_reqs: title: "Anonym" xaxis: "Tag" @@ -933,13 +981,14 @@ de: xaxis: "Tag" yaxis: "Gesamt" mobile_visits: - title: "Benutzerbesuche" + title: "Benutzerbesuche (mobil)" xaxis: "Tag" yaxis: "Anzahl der Besuche" web_crawlers: title: "Anfragen von Suchmaschinen" - xaxis: "Browserkennung" - yaxis: "Seitenaufrufe" + labels: + user_agent: "Browserkennung" + page_views: "Seitenaufrufe" dashboard: rails_env_warning: "Dein Server läuft im %{env}-Modus." host_names_warning: "Deine config/database.yml-Datei verwendet localhost als Hostname. Trage hier den Hostnamen deiner Website ein." @@ -957,13 +1006,14 @@ de: failing_emails_warning: "%{num_failed_jobs} E-Mails konnten nicht versendet werden. Überprüfe deine app.yml und stelle sicher, dass die E-Mail Servereinstellungen korrekt gesetzt sind. \nSieh dir hier die nicht versendeten E-Mails an." subfolder_ends_in_slash: "Deine Installation in einem Pfad ist nicht korrekt, DISCOURSE_RELATIVE_URL_ROOT endet mit einem Schrägstrich." email_polling_errored_recently: - one: Beim Abrufen von E-Mails ist in den letzten 24 Stunden ein Fehler aufgetreten. Weitere Informationen findest du im Fehlerprotokoll. - other: Beim Abrufen von E-Mails sind in den letzten 24 Stunden %{count} Fehler aufgetreten. Weitere Informationen findest du im Fehlerprotokoll. + one: "Beim Abrufen von E-Mails ist in den letzten 24 Stunden ein Fehler aufgetreten. Weitere Informationen findest du im Fehlerprotokoll." + other: "Beim Abrufen von E-Mails sind in den letzten 24 Stunden %{count} Fehler aufgetreten. Weitere Informationen findest du im Fehlerprotokoll." missing_mailgun_api_key: "Der Server ist so eingestellt, dass E-Mails über Mailgun versendet werden, aber du hast keinen API-Schlüssel angegeben, um Webhook-Nachrichten zu überprüfen." bad_favicon_url: "Das Favicon lässt sich nicht laden. Prüfe die favicon_url-Einstellung in den Einstellungen." poll_pop3_timeout: "Die Verbindung zum POP3-Server schlägt mit einer Zeitüberschreitung fehl. Eingehende E-Mails konnten nicht abgerufen werden. Überprüfe deine POP3-Einstellungen." poll_pop3_auth_error: "Die Verbindung zum POP3-Server schlägt mit einem Authentisierungsfehler fehl. Überprüfe deine POP3-Einstellungen." force_https_warning: "Deine Webseite verwendet SSL, aber die `force_https` ist in deinen Website-Einstellungen noch nicht aktiviert." + out_of_date_themes: "Updates sind zu folgenden Themes verfügbar:" site_settings: censored_words: "Wörter, die automatisch durch ■■■■ ersetzt werden" delete_old_hidden_posts: "Automatisch alle Beiträge löschen, die länger als 30 Tage versteckt bleiben." @@ -987,6 +1037,7 @@ de: search_recent_posts_size: "Wie viele letzte Beiträge im Index halten" log_search_queries: "Protokolliere Suchanfragen von Benutzern" search_query_log_max_size: "Maximale Anzahl von Suchanfragen, die vorgehalten werden" + search_query_log_max_retention_days: "Maximale Aufbewahrungszeit für Suchanfragen, in Tagen." allow_uncategorized_topics: "Erlaube Themen ohne Kategorie zu erstellen. ACHTUNG: Falls es unkategorisierte Themen gibt, musst du sie neu kategorisieren, bevor du diese Option abschaltest." allow_duplicate_topic_titles: "Erlaube Themen mit identischen und doppelten Titeln." unique_posts_mins: "Minuten, nach denen ein Benutzer denselben Inhalt noch einmal schreiben kann." @@ -1040,7 +1091,6 @@ de: summary_max_results: "Maximale Anzahl der sichtbaren Beiträge beim Zusammenfassen von Themen" enable_personal_messages: "Erlaube Benutzern mit der Vertrauensstufe 1 (konfigurierbar über die minimale Vertrauensstufe zum Senden von Nachrichten), Nachrichten zu erstellen und auf Nachrichten zu antworten. Beachte, dass das Team immer Nachrichten und Antworten senden kann." enable_system_message_replies: "Erlaube Benutzern, auf Systemnachrichten zu antworten, auch wenn Nachrichten deaktiviert sind" - enable_personal_email_messages: "Erlaube Benutzern mit Vertrauensstufe 4 (konfigurierbar über die Mindestvertrauensstufe, um Nachrichten zu senden), private E-Mail-Nachrichten zu senden. Bitte beachte, dass das Team immer Nachrichten senden kann." enable_long_polling: "Nachrichtenbus für Benachrichtigungen kann Long-Polling nutzen." long_polling_base_url: "Basis-URL für Long Polling (wenn zum Ausliefern von dynamischen Inhalten ein CDN verwendet wird, setze es auf Origin Pull), z. B. http://origin.site.com" long_polling_interval: "Wartezeit, bevor der Server auf Clients reagiert, wenn keine Daten gesendet werden müssen (nur für angemeldete Benutzer)" @@ -1087,9 +1137,9 @@ de: post_menu: "Legt fest, welche Funktionen in welcher Reihenfolge im Beitragsmenü auftauchen. Beispiel: like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Die Einträge im Menü eines Beitrags, die standardmäßig hinter einer erweiterbaren Ellipse versteckt werden sollen." share_links: "Legt fest, welche Dienste in welcher Reihenfolge im Teilen-Dialog auftauchen." - track_external_right_clicks: "Verfolge, welche externen Links per Rechtsklick geöffnet werden (zum Beispiel in einem neuen Browser-Tab). Standardmäßig deaktiviert, da dies URL-Rewrites erfordert." site_contact_username: "Gültiger Benutzername eines Team-Mitglieds, in dessen Name alle automatisch erzeugten Direktnachrichten versendet werden sollen. Falls leer wird das Standardkonto \"system\" verwendet." send_welcome_message: "Sende allen neuen Benutzern eine Willkommensnachricht mit Hinweisen zur Benutzung des Forums." + send_tl1_welcome_message: "Sende neuen Benutzern mit der Vertrauensstufe 1 eine Willkommensnachricht." suppress_reply_directly_below: "Zeige die erweiterbare Anzahl der Antworten auf einen Beitrag nicht, falls die einzige Antwort direkt darunter folgt." suppress_reply_directly_above: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der beantwortete Beitrag direkt darüber angezeigt wird." suppress_reply_when_quoting: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der Beitrag den beantworteten Beitrag zitiert." @@ -1144,8 +1194,8 @@ de: enable_google_oauth2_logins: "Google OAuth2-Authentifizierung aktivieren. Dies ist der momentan von Google unterstützte Authentifizierungs-Mechanismus. Benötigt Client-ID und Secret." google_oauth2_client_id: "Client-ID deiner Google-Anwendung." google_oauth2_client_secret: "Client-Secret deiner Google-Anwendung." - google_oauth2_prompt: "Eine Leerzeichen-separierte Liste von String-Werten, die angeben, ob der autorisierende Server den Benutzer zur Reauthentifizierung und Zustimmung fragt. Siehe https://developers.google.com/identity/protocols/OpenIDConnect#prompt für die gültigen Werte." - google_oauth2_hd: "Domain, die von Google Apps gehostet wird und auf die Anmeldung eingeschränkt wird. Siehe https://developers.google.com/identity/protocols/OpenIDConnect#hd-param für weitere Details." + google_oauth2_prompt: "Eine optionale Leerzeichen getrennte Liste von Zeichen Werten die angeben ob der Berechtigungsserver den Benutzer zur Re-Authentifizierung auffordert. Siehe https://developers.google.com/identity/protocols/OpenIDConnect#prompt für mögliche Werte." + google_oauth2_hd: "Eine optionale Google Apps gehostete Domain zu welches das Anmelden limitiert sein wird. Siehe https://developers.google.com/identity/protocols/OpenIDConnect#hd-param für weitere Informationen." enable_twitter_logins: "Aktiviere Twitter-Authentifizierung (benötigt twitter_consumer_key und twitter_consumer_secret)." twitter_consumer_key: "Consumer Key für Twitter-Authentifizierung, registriert auf https://apps.twitter.com/" twitter_consumer_secret: "Consumer Secret für Twitter-Authentifizierung, registriert auf https://apps.twitter.com" @@ -1166,6 +1216,8 @@ de: backup_frequency: "Die Anzahl von Tagen zwischen Backups." enable_s3_backups: "Lade fertige Backups zu S3 hoch. WICHTIG: In den Dateien-Einstellungen müssen gültige S3-Kontodaten eingegeben sein." s3_backup_bucket: "Der entfernte Speicherort für Ihre Sicherungen. WARNUNG: Stellen Sie sicher, dass es sich um einen privaten Speicherort handelt." + s3_endpoint: "Dieser Endpunkt kann so angepasst werden, dass er die Sicherung an einen S3-kompatiblen Service wie DigitalOcean Spaces oder Minio übertragt. WARNUNG: Verwende den Standard bei Verwendung von AWS S3." + s3_force_path_style: "Forciere Pfad-Adressierung deines benutzerdefinierten Endpunkts. WICHTIG: Erforderlich bei Verwendung von Minio für Uploads und Sicherungen." s3_disable_cleanup: "Deaktiviere das Löschen von Backups aus S3 wenn sie lokal entfernt werden" backup_time_of_day: "Uhrzeit in UTC, wenn Backups ausgeführt werden sollen." backup_with_uploads: "Hochgeladene Dateien bei geplanten Backups mit einbeziehen. Wenn diese Einstellung deaktiviert ist, wird nur die Datenbank gesichert." @@ -1191,6 +1243,8 @@ de: max_topic_invitations_per_day: "Maximale Zahl an Thema-Einladungen, die ein Benutzer pro Tag verschicken kann." max_logins_per_ip_per_hour: "Maximale Anzahl der erlaubten Anmeldungen pro IP-Adresse und Stunde" max_logins_per_ip_per_minute: "Maximale Anzahl der erlaubten Anmeldungen pro IP-Adresse und Stunde" + max_post_deletions_per_minute: "Maximale Anzahl der Beiträge, die ein Benutzer pro Minute löschen kann." + max_post_deletions_per_day: "Maximale Anzahl an Beiträgen, die ein Benutzer pro Tag löschen kann." alert_admins_if_errors_per_minute: "Anzahl der Fehler pro Minute, bei der ein Administrator benachrichtigt werden soll. Ein Wert von 0 deaktiviert diese Funktion. Achtung: Benötigt einen Neustart." alert_admins_if_errors_per_hour: "Anzahl der Fehler pro Stunde, bei der ein Administrator benachrichtigt werden soll. Ein Wert von 0 deaktiviert diese Funktion. Achtung: Benötigt einen Neustart." categories_topics: "Anzahl der Themen auf der /categories Seite" @@ -1211,8 +1265,10 @@ de: avatar_sizes: "Liste der Größe von automatisch generierten Profilbildern." external_system_avatars_enabled: "Benutze einen externen Avatar Service" external_system_avatars_url: "URL des externen Profilbild-Dienstes. Erlaubte Platzhalter sind {username} {first_letter} {color} {size}" - default_opengraph_image_url: "URL des standardmäßigen Open-Graph-Bildes." - twitter_summary_large_image_url: "URL des Bildes, das standardmäßig in Twitter-Cards angezeigt wird (sollte mindestens 280 Pixel breit und 150 Pixel hoch sein)." + selectable_avatars_enabled: "Forciere Benutzer, ein Avatar aus der Liste auszuwählen." + selectable_avatars: "Liste von Avataren, aus der Benutzer wählen können." + default_opengraph_image_url: "Standard-OpenGraph-Bild, das verwendet wird, wenn die Seite kein anderes passendes Bild oder Seitenlogo hat." + twitter_summary_large_image_url: "Standard-Bild für die Twitter-Zusammenfassungskarte (sollte mindestens 280px breit und 150px hoch sein)." allow_all_attachments_for_group_messages: "Erlaube alle E-Mail-Anhänge für Gruppen-Nachrichten." png_to_jpg_quality: "Qualität der umgewandelten JPG-Datei (1 ist die niedrigste, 99 die beste Qualität, 100 deaktiviert die Funktion)." allow_staff_to_upload_any_file_in_pm: "Erlaube Team-Mitgliedern, in Nachrichten alle Dateien hochzuladen." @@ -1252,10 +1308,10 @@ de: min_trust_to_edit_post: "Die minimal benötigte Vertrauensstufe, um Beiträge bearbeiten zu können." min_trust_to_allow_self_wiki: "Die minimale Vertrauensstufe, die ein Benutzer haben muss, um einen eigenen Wiki Eintrag zu erstellen." min_trust_to_send_messages: "Die minimale Vertrauensstufe zur Erstellung neuer Nachrichten." - min_trust_to_send_email_messages: "Die minimale Vertrauensstufe zum Versenden neuer Nachrichten als E-Mail (an vorbereitete Benutzer)." min_trust_to_flag_posts: "Die minimale Vertrauensstufe zur Meldung von Beiträgen." min_trust_to_post_links: "Die minimale Vertrauensstufe zum Einfügen von Links in Beiträgen." min_trust_to_post_images: "Die minimale Vertrauensstufe zum Einfügen von Bildern in Beiträgen." + whitelisted_link_domains: "Domains, auf die Benutzer verlinken dürfen, auch wenn sie nicht die entsprechende Vertrauensstufe haben, um Links zu setzen." newuser_max_links: "Maximale Anzahl der Links, die neue Benutzer Beiträgen hinzufügen dürfen." newuser_max_images: "Maximale Anzahl der Bilder, die neue Benutzer Beiträgen hinzufügen dürfen." newuser_max_attachments: "Maximale Anzahl der Dateien, die neue Benutzer Beiträgen hinzufügen dürfen." @@ -1327,13 +1383,14 @@ de: reply_by_email_address: "Vorlage für die Antwort einer per E-Mail eingehender E-Mail-Adresse, zum Beispiel: %{reply_key}@reply.example.com oder replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Liste alternativer Vorlagen für eingehende E-Mail-Adressen für das Antworten per E-Mail. Beispiel: %{reply_key}@antwort.example.com|antworten+%{reply_key}@example.com" incoming_email_prefer_html: "Verwende HTML statt Text für eingehende E-Mail." - disable_emails: "Discourse daran hindern jegliche E-Mails zu verschicken" + disable_emails: "Discourse daran hindern jegliche E-Mails zu versenden. Wähle 'yes' um E-Mails für alle Benutzer zu deaktivieren. Wähle 'non-staff' um E-Mails für alle Benutzer außer den Team Mitgliedern zu deaktivieren." strip_images_from_short_emails: "Entferne Bilder aus E-Mails kleiner als 2800 Bytes." short_email_length: "Kurze E-Mail-Länge in Bytes" display_name_on_email_from: "Zeige vollständige Namen im Absender-Feld von E-Mails" unsubscribe_via_email: "Erlaube es Benutzern eine E-Mail mit dem Betreff oder Text: \"unsubscribe\" zum Abbestellen der E-Mails zu senden." unsubscribe_via_email_footer: "Füge einen `mailto:`-Link zum Abbestellen im Fußbereich ausgehender E-Mails hinzu" delete_email_logs_after_days: "Lösche E-Mail Logs nach (N) Tagen. 0 um sie für immer zu behalten." + disallow_reply_by_email_after_days: "Verbiete Antworten per E-Mail nach (N) Tagen. 0 um es unbegrenzt zu lassen." max_emails_per_day_per_user: "Maximale Zahl an E-Mails, die Benutzern gesendet werden. 0 zum Deaktivieren der Grenze." enable_staged_users: "Erstelle automatisch vorbereitete Benutzer, wenn eingehende E-Mails verarbeitet werden." maximum_staged_users_per_email: "Maximale Anzahl vorbereiteter Benutzer, wenn eine eingehende E-Mail bearbeitet wird." @@ -1360,9 +1417,11 @@ de: pop3_polling_host: "Hostname für die POP3-Abfrage." pop3_polling_username: "Benutzername für die POP3-Abfrage." pop3_polling_password: "Passwort für die POP3-Abfrage." + pop3_polling_delete_from_server: "E-Mails vom Server löschen. ACHTUNG: Wenn du dies deaktivierst, solltest du deinen E-Mail-Posteingang manuell aufräumen" log_mail_processing_failures: "Protokolliere Fehler bei der E-Mail-Verarbeitung in http://yoursitename.com/logs" email_in: "Erlaube Benutzern, neue Themen per E-Mail einzutragen (erfordert manuelles oder POP3-Polling). Konfiguriere die Adressen im „Einstellungen“-Reiter in jeder Kategorie." email_in_min_trust: "Minimale Vertrauensstufe um neue Themen per E-Mail erstellen zu können." + email_in_spam_header: "Die E-Mail-Kopfzeile, um Spam zu erkennen." email_prefix: "Das [Präfix], das für den Betreff von E-Mails genutzt wird. Standardwert ist 'title', wenn nicht gesetzt." email_site_title: "Titel der Site, der als Absender beim Versand von E-Mails verwendet wird. Wenn nicht angegeben wird 'title' verwendet. Verwende diese Einstellung, wenn 'title' spezielle Zeichen enthält, die im Absender-Feld einer E-Mail nicht verwendet werden dürfen." find_related_post_with_key: "Verwende nur den 'Antwort-Schlüssel', um den Beitrag zu finden, auf den geantwortet wurde. WARNUNG: Wenn dies deaktiviert wird, können Benutzer auf Grundlage der E-Mail-Adresse nachgeahmt werden." @@ -1372,7 +1431,7 @@ de: delete_all_posts_max: "Die maximale Anzahl von Beiträgen welche auf einmal gelöscht werden kann. Hat ein Benutzer mehr Beiträge, so können die Beiträge nicht auf einmal und der Benutzer nicht gelöscht werden." username_change_period: "Die maximale Anzahl von Tagen, nach der Konten ihren Benutzernamen ändern können (0 verbietet die Änderung des Benutzernamen)." email_editable: "Erlaube Benutzern ihre E-Mail-Adresse nach der Registrierung zu ändern." - logout_redirect: "Benutzer nach dem Abmelden auf diese Adresse umleiten (z.B. http://somesite.com/logout)" + logout_redirect: "Adresse, auf die der Browser nach dem Abmelden weitergeleitet wird (z.B. http://example.com/logout)" allow_uploaded_avatars: "Benutzer können eigene Profilbilder hochladen." allow_animated_avatars: "Benutzer können animierte Profilbilder (.gif) hochladen und benutzen. ACHTUNG: Rufe den Befehl `avatars:refresh rake` auf nachdem du diese Option verändert hast." allow_animated_thumbnails: "Generiert animierte Vorschaubilder aus animierten GIFs." @@ -1410,6 +1469,7 @@ de: dominating_topic_minimum_percent: "Anteil der Nachrichten eines Themas in Prozent, die ein einzelner Benutzer verfassen darf, bevor dieser Benutzer darauf hingewiesen wird, dass er dieses Thema dominiert." disable_avatar_education_message: "Deaktiviert den Hinweis für Benutzer, dass sie ihr Profilbild ändern können" suppress_uncategorized_badge: "Zeige kein Abzeichen für unkategorisierte Themen in der Themenliste." + header_dropdown_category_count: "Wie viele Kategorien im der Header Dropdown-Liste angezeigt werden können." permalink_normalizations: "Diesen regulären Ausdruck anwenden, bevor Permalinks verarbeitet werden; Beispiel: /(topic.*)\\?.*/\\1 wird Query-Strings von Themen-Routen entfernen. Format: regulärer Ausdruck + String, benutze \\1 usw. um Teilausdrücke zu verwenden" global_notice: "Zeigt allen Besuchern eine DRINGENDE NOTFALL-NACHRICHT als global sichtbares Banner an. Deaktiviert bei leerer Nachricht. (HTML ist erlaubt.)" disable_edit_notifications: "Unterdrückt Bearbeitungshinweise durch den System-Benutzer, wenn die 'download_remote_images_to_local' Einstellung aktiviert ist." @@ -1444,6 +1504,7 @@ de: enable_emoji_shortcuts: "Geläufige Text-Smileys wie :) :p :( werden in Emojis umgewandelt" emoji_set: "Welche Emoji sollen es sein?" enforce_square_emoji: "Emojis immer mit quadratischem Seitenverhältnis darstellen." + emoji_autocomplete_min_chars: "Erforderliche Minimalanzahl von Zeichen, um das Popup zur Emoji-Autovervollständigung zu öffnen." approve_post_count: "Anzahl der Beiträge eines neuen Benutzer oder Anwärters, die genehmigt werden müssen" approve_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden" approve_new_topics_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden" @@ -1478,12 +1539,14 @@ de: default_categories_muted: "Liste der standardmäßig stummgeschalteten Kategorien." default_categories_watching_first_post: "Liste von Kategorien, in denen der erste Beiträge in jedem neuen Thema automatisch beobachtet wird." retain_web_hook_events_period_days: "Anzahl an Tagen, die Web-Hook-Ereigniseinträge aufbewahrt werden" + retry_web_hook_events: "Fehlgeschlagene Web-Hook-Ereignisse automatisch 4-mal erneut versuchen. Die Wartezeiten zwischen den Versuchen betragen 1, 5, 25 und 125 MInuten." allow_user_api_keys: "Erlaube das Generieren von Benutzer-API-Schlüsseln" allow_user_api_key_scopes: "Liste erlaubter Scopes für Benutzer-API-Schlüssel" max_api_keys_per_user: "Maximale Zahl der Benutzer API Anfragen pro Benutzer" min_trust_level_for_user_api_key: "Erforderliche Vertrauensstufe für die Generierung von Benutzer API Schlüsseln" allowed_user_api_auth_redirects: "Erlaubte URL für die Authentifizierungs-Umleitung von Benutzer API Schlüsseln" allowed_user_api_push_urls: "Erlaubte URL für Server-Push zur Benutzer API" + expire_user_api_keys_days: "Anzahl Tage bevor ein Benutzer API Schlüssel automatisch abläuft. (0 für niemals)" tagging_enabled: "Schlagwörter für Themen aktivieren" min_trust_to_create_tag: "Minimale Vertrauensstufe, um ein Schlagwort zu erstellen." max_tags_per_topic: "Maximale Anzahl an Schlagwörtern, die einem Thema hinzugefügt werden können." @@ -1557,68 +1620,67 @@ de: not_seen_in_a_month: "Willkommen zurück! Wir haben dich länger nicht gesehen. Während deiner Abwesenheit waren dies die beliebtesten Themen." merge_posts: edit_reason: - one: Ein Beitrag von %{username} wurde zusammengeführt - other: '%{count} Beiträge von %{username} wurden zusammengeführt' + one: "Ein Beitrag wurde von %{username} mit diesem zusammengeführt" + other: "%{count} Beiträge wurden von %{username} zusammengeführt" errors: different_topics: "Beiträge unterschiedlicher Themen können nicht zusammengeführt werden." different_users: "Beiträge unterschiedlicher Benutzer können nicht zusammengeführt werden." move_posts: new_topic_moderator_post: - one: 'Ein Beitrag wurde in ein neues Thema verschoben: %{topic_link}' - other: '%{count} Beiträge wurden in ein neues Thema verschoben: %{topic_link}' + one: "Ein Beitrag wurde in ein neues Thema verschoben: %{topic_link}" + other: "%{count} Beiträge wurden in ein neues Thema verschoben: %{topic_link}" existing_topic_moderator_post: - one: 'Ein Beitrag wurde in ein neues Thema verschoben: %{topic_link}' - other: '%{count} Beiträge wurden in ein neues Thema verschoben: %{topic_link}' + one: "Ein Beitrag wurde in ein neues Thema verschoben: %{topic_link}" + other: "%{count} Beiträge wurden in ein neues Thema verschoben: %{topic_link}" change_owner: - post_revision_text: "Eigentümer geändert von %{old_user} zu %{new_user}" - deleted_user: "ein gelöschter Benutzer" + post_revision_text: "Eigentümer übertragen." topic_statuses: archived_enabled: "Dieses Thema ist nun archiviert. Es ist eingefroren und kann in keiner Weise mehr verändert werden." archived_disabled: "Dieses Thema wurde aus dem Archiv geholt. Es ist nicht länger eingefroren und kann verändert werden." closed_enabled: "Dieses Thema ist nun geschlossen. Es ist nicht länger möglich, auf dieses Thema zu antworten." closed_disabled: "Dieses Thema ist nun geöffnet. Es ist wieder möglich, auf dieses Thema zu antworten." autoclosed_message_max_posts: - one: Diese Nachricht wurde automatisch geschlossen, nachde mdie maximale Anzahl von einer Antwort erreicht wurde. - other: Diese Nachricht wurde automatisch geschlossen, nachde mdie maximale Anzahl von %{count} Antworten erreicht wurde. + one: "Diese Nachricht wurde automatisch geschlossen, nachde mdie maximale Anzahl von einer Antwort erreicht wurde." + other: "Diese Nachricht wurde automatisch geschlossen, nachde mdie maximale Anzahl von %{count} Antworten erreicht wurde." autoclosed_topic_max_posts: - one: Dieses Theme wurde automatisch geschlossen, nachdem die maximale Anzahl von einer Antwort erreicht wurde. - other: Dieses Theme wurde automatisch geschlossen, nachdem die maximale Anzahl von %{count} Antworten erreicht wurde. + one: "Dieses Theme wurde automatisch geschlossen, nachdem die maximale Anzahl von einer Antwort erreicht wurde." + other: "Dieses Theme wurde automatisch geschlossen, nachdem die maximale Anzahl von %{count} Antworten erreicht wurde." autoclosed_enabled_days: - one: Dieses Thema wurde nach einem Tag automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. - other: Dieses Thema wurde nach %{count} Tagen automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. + one: "Dieses Thema wurde nach einem Tag automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." + other: "Dieses Thema wurde nach %{count} Tagen automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." autoclosed_enabled_hours: - one: Dieses Thema wurde nach einer Stunde automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. - other: Dieses Thema wurde nach %{count} Stunden automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. + one: "Dieses Thema wurde nach einer Stunde automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." + other: "Dieses Thema wurde nach %{count} Stunden automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." autoclosed_enabled_minutes: - one: Dieses Thema wurde nach einer Minute automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. - other: Dieses Thema wurde nach %{count} Minuten automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. + one: "Dieses Thema wurde nach einer Minute automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." + other: "Dieses Thema wurde nach %{count} Minuten automatisch geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." autoclosed_enabled_lastpost_days: - one: Dieses Thema wurde automatisch einen Tag nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. - other: Dieses Thema wurde automatisch %{count} Tage nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. + one: "Dieses Thema wurde automatisch einen Tag nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." + other: "Dieses Thema wurde automatisch %{count} Tage nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." autoclosed_enabled_lastpost_hours: - one: Dieses Thema wurde automatisch eine Stunde nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. - other: Dieses Thema wurde automatisch %{count} Stunden nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. + one: "Dieses Thema wurde automatisch eine Stunde nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." + other: "Dieses Thema wurde automatisch %{count} Stunden nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." autoclosed_enabled_lastpost_minutes: - one: Dieses Thema wurde automatisch eine Minute nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. - other: Dieses Thema wurde automatisch %{count} Minuten nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt. + one: "Dieses Thema wurde automatisch eine Minute nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." + other: "Dieses Thema wurde automatisch %{count} Minuten nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt." autoclosed_disabled_days: - one: Das Thema wurde automatisch nach 1 Tag geöffnet. - other: Das Thema wurde automatisch nach %{count} Tagen geöffnet. + one: "Das Thema wurde automatisch nach 1 Tag geöffnet." + other: "Das Thema wurde automatisch nach %{count} Tagen geöffnet." autoclosed_disabled_hours: - one: Das Thema wurde automatisch nach 1 Stunde geöffnet. - other: Das Thema wurde automatisch nach %{count} Stunden geöffnet. + one: "Das Thema wurde automatisch nach 1 Stunde geöffnet." + other: "Das Thema wurde automatisch nach %{count} Stunden geöffnet." autoclosed_disabled_minutes: - one: Das Thema wurde automatisch nach 1 Minute geöffnet. - other: Das Thema wurde automatisch nach %{count} Minuten geöffnet. + one: "Das Thema wurde automatisch nach 1 Minute geöffnet." + other: "Das Thema wurde automatisch nach %{count} Minuten geöffnet." autoclosed_disabled_lastpost_days: - one: Dieses Thema wurde automatisch 1 Tag nach der letzten Antwort geöffnet. - other: Dieses Thema wurde automatisch %{count} Tage nach der letzten Antwort geöffnet. + one: "Dieses Thema wurde automatisch 1 Tag nach der letzten Antwort geöffnet." + other: "Dieses Thema wurde automatisch %{count} Tage nach der letzten Antwort geöffnet." autoclosed_disabled_lastpost_hours: - one: Dieses Thema wurde automatisch 1 Stunde nach der letzten Antwort geöffnet. - other: Dieses Thema wurde automatisch %{count} Stunden nach der letzten Antwort geöffnet. + one: "Dieses Thema wurde automatisch 1 Stunde nach der letzten Antwort geöffnet." + other: "Dieses Thema wurde automatisch %{count} Stunden nach der letzten Antwort geöffnet." autoclosed_disabled_lastpost_minutes: - one: Dieses Thema wurde automatisch 1 Minute nach der letzten Antwort geöffnet. - other: Dieses Thema wurde automatisch %{count} Minuten nach der letzten Antwort geöffnet. + one: "Dieses Thema wurde automatisch 1 Minute nach der letzten Antwort geöffnet." + other: "Dieses Thema wurde automatisch %{count} Minuten nach der letzten Antwort geöffnet." autoclosed_disabled: "Dieses Thema ist nun offen. Neue Beiträge werden angenommen." autoclosed_disabled_lastpost: "Dieses Thema ist jetzt geöffnet. Neue Antworten sind erlaubt." pinned_enabled: "Dieses Thema ist nun angeheftet. In seiner Kategorie wird es nun oben erscheinen, bis es vom Team oder von einzelnen Benutzer losgelöst wird." @@ -1656,9 +1718,18 @@ de: already_logged_in: "Hoppla, es sieht so aus als ob du versuchst die Einladung für einen anderen Benutzer zu akzeptieren. Wenn du nicht %{current_user} bist, melde dich bitte ab und versuch es erneut." second_factor_title: "Zwei-Faktor Authentifizierung" second_factor_description: "Bitte gib den erforderlichen Authentifizierungscode aus deiner App ein:" - invalid_second_factor_code: "Ungültiger Authentifizierungscode" + second_factor_backup_description: "Bitte gib einen deiner Wiederherstellungs-Codes ein:" + second_factor_backup_title: "Zwei-Faktoren Wiederherstellungs-Code" + invalid_second_factor_code: "Ungültiger Authentifizierungscode. Jeder Code kann nur einmal benutzt werden." + second_factor_toggle: + totp: "Benutze stattdessen eine Authentifizierungs-App" + backup_code: "Benutze stattdessen einen Backup Code" + admin: + email: + sent_test: "gesendet!" + sent_test_disabled: "kann nicht gesendet werden da E-Mails deaktiviert sind" + sent_test_disabled_for_non_staff: "kann nicht gesendet werden da E-Mails für Nicht-Moderatoren deaktiviert sind" user: - no_accounts_associated: "Es sind keine Konten zugeordnet" deactivated: "Deaktiviert wegen zu vielen unzustellbaren E-Mails an '%{email}'." deactivated_by_staff: "Deaktiviert vom Team" activated_by_staff: "Aktiviert vom Team" @@ -1690,11 +1761,11 @@ de: same_ip_address: "Gleiche IP-Adresse (%{ip_address}) wie andere Benutzer" flags_reminder: flags_were_submitted: - one: Meldungen wurden vor über 1 Stunde eingereicht. [Bitte übeprüfe sie](/admin/flags). - other: Es wurden Meldungen vor über %{count} Stunden eingereicht. [Bitte überprüfe sie](/admin/flags). + one: "Meldungen wurden vor über 1 Stunde eingereicht. [Bitte übeprüfe sie](/admin/flags)." + other: "Es wurden Meldungen vor über %{count} Stunden eingereicht. [Bitte überprüfe sie](/admin/flags)." subject_template: - one: Eine Markierung wartet auf Bearbeitung - other: '%{count} Markierungen warten auf Bearbeitung' + one: "Eine Markierung wartet auf Bearbeitung" + other: "%{count} Markierungen warten auf Bearbeitung" unsubscribe_mailer: title: "Abbestellung von E-Mail-Updates" subject_template: "Bitte bestätige, dass du keine E-Mail-Updates mehr von %{site_title} erhalten möchtest." @@ -1890,8 +1961,8 @@ de: deferred: "Danke für deine Meldung. Wir sehen uns das an." deferred_and_deleted: "Danke für deine Meldung. Wir haben den Beitrag entfernt." temporarily_closed_due_to_flags: - one: Dieses Thema ist vorübergehend für 1 Stunde gesperrt aufgrund einer großen Anzahl an Community-Meldungen. - other: Dieses Thema ist vorübergehend für %{count} Stunden gesperrt aufgrund einer großen Anzahl an Community-Meldungen. + one: "Dieses Thema ist vorübergehend für 1 Stunde gesperrt aufgrund einer großen Anzahl an Community-Meldungen." + other: "Dieses Thema ist vorübergehend für %{count} Stunden gesperrt aufgrund einer großen Anzahl an Community-Meldungen." system_messages: private_topic_title: "Thema #%{id}" contents_hidden: "Bitte besuche den Beitrag, um die Inhalte zu sehen." @@ -1927,11 +1998,26 @@ de: Mehrere Community-Mitglieder haben diesen Beitrag gemeldet, bevor er ausgeblendet wurde. **Weil der Beitrag mehr als einmal ausgeblendet wurde, wird er nun ausgeblendet bleiben, bis er vom Team behandelt wurde.** Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines). + flags_agreed_and_post_deleted: + title: "Gemeldeter Beitrag von Team entfernt" + subject_template: "Gemeldeter Beitrag von Team entfernt" + text_body_template: | + Hallo, + + Dies ist eine automatische Nachricht von %{site_name} um Dich wissen zu lassen, dass Dein Beitrag entfernt wurde. + + <%{base_url}%{url}> + + %{flag_reason} + + Dieser Beitrag war von der Gemeinschaft gemeldet worden und ein Moderationsmitglied den Beitrag entfernt. + + Bitte sieh Dir unsere [Verhaltensregeln](%{base_url}/guidelines) für weitere Informationen an. usage_tips: text_body_template: | Für einige schnelle Tipps, um als neuer Benutzer loszulegen, [schaue einmal diesen Blog-Beitrag an](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). - Während du hier teilnimmst, lernen wir dich besser kennen, und vorübergehende Einschränkungen für neue Benutzer werden aufgehoben. Über die Zeit wirst du [Vertrauenstufen](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) erreichen, die besondere Fähigkeiten beinhalten, um uns dabei zu helfen, die Community gemeinsam zu verwalten. + Während du hier teilnimmst, lernen wir dich besser kennen, und vorübergehende Einschränkungen für neue Benutzer werden aufgehoben. Über die Zeit wirst du [Vertrauenstufen](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) erreichen, die besondere Fähigkeiten beinhalten, um uns dabei zu helfen, die Community gemeinsam zu verwalten. welcome_user: title: "Willkommen: Benutzer" subject_template: "Willkommen bei %{site_name}!" @@ -1943,6 +2029,13 @@ de: Wir glauben an [zivilisiertes Community-Verhaltung](%{base_url}/guidelines) zu jeder Zeit. Genieße deinen Aufenthalt! + welcome_tl1_user: + title: "Willkommen VS1 Benutzer" + subject_template: "Danke, dass du deine Zeit mit uns verbringst" + text_body_template: | + Hey du. Wir sehen, dass du mit Lesen beschäftigt bist, was fantastisch ist, daher haben wir dich in eine höhere [Vertrauensstufe](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) befördert! + + Wir sind sehr froh, dass du deine Zeit mit uns verbringst und wir würden uns freuen, mehr über dich zu erfahren. Nimm’ dir etwas Zeit, um [dein Profil auszufüllen](/my/preferences/profile), und zögere nicht, [ein neues Thema zu beginnen](/categories). welcome_invite: title: "Willkommen: Einladung" subject_template: "Willkommen bei %{site_name}!" @@ -2140,6 +2233,13 @@ de: %{post_error} Bitte versuch es erneut, wenn du das Problem beheben kannst. + email_reject_post_too_short: + title: "E-Mail Ablehnungsbeitrag zu kurz" + subject_template: "[%{email_prefix}] Email Problem -- Beitrag zu kurz" + text_body_template: | + Es tut uns leid aber Deine E-Mail Nachricht an %{destination} (betitelt mit %{former_title}) funktionierte nicht. + + Um eine tiefere Konversation zu fördern sind kurze Antworten nicht erlaubt. Bitte antworte mit mindestens %{count} Zeichen? Alternativ kannst Du auch einen Beitrag per E-Mail mit "+1" beantworten. email_reject_invalid_post_action: title: "E-Mail abgelehnt weil fehlerhafte Beitragsaktion" subject_template: "[%{email_prefix}] E-Mail-Problem -- Beitragsaktion ungültig" @@ -2165,23 +2265,23 @@ de: title: "E-Mail abgelehnt weil alter Empfänger" subject_template: "[%{email_prefix}] E-Mail-Problem -- Du versuchst, auf eine alte Benachrichtigung zu antworten" text_body_template: | - Entschuldige, aber deine E-Mail-Nachricht an %{destination}(mit dem Betreff ) konnte nicht zugestellt werden. + Es tut uns leid aber Deine E-Mail Nachricht an %{destination} (betitelt mit %{former_title}) funktionierte nicht. - Aus Sicherheitsgründen akzeptieren wir Antworten auf ursprüngliche Benachrichtigungen nur innerhalb von 90 Tagen. Bitte [besuche das Thema](%{short_url}), um die Unterhaltung fortzusetzen. + Wir akzeptieren nur Anworten auf die Original Nachrichten für %{number_of_days} Tage. Bitte [besuche das Thema](%{short_url}) um mit der Konversation fortzufahren. email_reject_topic_not_found: title: "E-Mail abgelehnt weil Thema nicht gefunden" subject_template: "[%{email_prefix}] E-Mail-Problem -- Thema nicht gefunden" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. - Das Thema, auf das du geantwortet hast, gibt es nicht mehr -- vielleicht wurde es gelöscht? Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Team-Mitglied auf. + Das Thema, auf das du geantwortet hast, gibt es nicht mehr -- vielleicht wurde es gelöscht? Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte [Kontakt mit einem Team-Mitglied](%{base_url}/about) auf. email_reject_topic_closed: title: "E-Mail abgelehnt weil Thema geschlossen" subject_template: "[%{email_prefix}] E-Mail-Problem -- Thema geschlossen" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. - Das Thema, auf das du geantwortet hast, ist derzeit geschlossen und akzeptiert keine Antworten mehr. Wenn du glaubst, dass dies ein Irrtum ist, nimm Bitte Kontakt mit einem Team-Mitglied auf. + Das Thema, auf das du geantwortet hast, ist derzeit geschlossen und akzeptiert keine Antworten mehr. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte [Kontakt mit einem Team-Mitglied](%{base_url}/about) auf. email_reject_auto_generated: title: "E-Mail abgelehnt weil automatisch generierte Antwort" subject_template: "[%{email_prefix}] E-Mail-Problem -- Antwort automatisch generiert" @@ -2205,17 +2305,24 @@ de: Bitte stelle sicher, dass du die POP-Zugangsdaten in [den Einstellungen](%{base_url}/admin/site_settings/category/email) korrekt konfiguriert hast. Wenn es eine Weboberfläche für das POP-E-Mail-Postfach gibt, möchtest du dich eventuell dort anmelden und die Einstellungen überprüfen. + email_revoked: + title: "E-Mail widerrufen" + subject_template: "Ist Deine E-Mail-Adresse korrekt?" + text_body_template: | + Es tut uns leid aber wir haben Probleme Dich per E-Mail zu erreichen. Unsere letzten E-Mails an Dich sind alle als unzustellbar zurück gekommen. + + Bitte stelle sicher, dass [E-Mail Adresse](%{base_url}/my/preferences/email) gültig und aktiv ist? Füge bitte unsere E-Mail Adresse in Deinem Adressbuch hinzu, damit die Zustellbarkeit verbessert wird. too_many_spam_flags: title: "Neues Konto gesperrt wegen zu viel Spam" subject_template: "Neues Konto gesperrt" text_body_template: | - Hallo, + Hello, - dies ist eine automatisch erzeugte Nachricht von %{site_name}, um dich darüber zu informieren, dass dein Beitrag vorübergehend versteckt wurde, weil er von der Community gemeldet wurde.. + Dies ist eine automatische Nachricht von %{site_name} um Dich wissen zu lassen, dass deine Beiträge temporär ausgeblendet wurden, weil diese von der Gemeinschaft gemeldet wurden. - Als Vorsichtsmaßnahme wurde dein neues Konto für das Erstellen neuer Antworten und Themen stummgeschaltet, bis ein Team-Mitglied dein Konto überprüfen kann. Wir bitten um Entschuldigung für die Unannehmlichkeiten. + Als Vorsichtsmaßnahme wurde Dein Konto stumm geschaltet und Du kannst nun nicht mehr antworten neue Themen erzeugen bis ein Team Mitglied Dein Konto überprüft hat. Wir bitten diese Unannehmlichkeit zu entschuldigen. - Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines). + Für weitere Hinweise, schaue Dir bitte unsere [Verhaltensregeln](%{base_url}/guidelines) an. too_many_tl3_flags: title: "E-Mail abgelehnt wegen Meldungen durch Vertrauensstufe 3" subject_template: "Neues Konto gesperrt" @@ -2251,7 +2358,7 @@ de: Der Schwellenwert kann über die Einstellung `silence_new_user` geändert werden. spam_post_blocked: title: "Spam-Beitrag ausgeblendet" - subject_template: "Beiträge des neuen Benutzers ${username} wegen mehrfacher Verlinkung blockiert" + subject_template: "Beiträge des neuen Benutzers %{username} wegen mehrfacher Verlinkung blockiert" text_body_template: | Dies ist eine automatisierte Nachricht. @@ -2272,12 +2379,12 @@ de: pending_users_reminder: title: "Benachrichtigung: Benutzer warten auf Freigabe" subject_template: - one: Es gibt einen nicht freigegebenen Benutzer - other: Es gibt %{count} nicht freigegebene Benutzer + one: "Es gibt einen nicht freigegebenen Benutzer" + other: "Es gibt %{count} nicht freigegebene Benutzer" text_body_template: | Es warten neuen Benutzer auf ihre Freigabe. - [Bitte bewerte diese im Administrationsbereich](/admin/users/list/pending). + [Bitte überprüfe diese im Administrationsbereich](%{base_url}/admin/users/list/pending). download_remote_images_disabled: title: "Download von externen Bildern deaktiviert" subject_template: "Download von externen Bildern deaktiviert" @@ -2301,8 +2408,8 @@ de: queued_posts_reminder: title: "Erinnerung für anstehende Beiträge" subject_template: - one: 1 Beitrag wartet auf Überprüfung - other: '%{count} Beiträge warten auf Überprüfung' + one: "1 Beitrag wartet auf Überprüfung" + other: "%{count} Beiträge warten auf Überprüfung" text_body_template: | Hallo, @@ -2320,19 +2427,20 @@ de: user_notifications: previous_discussion: "Vorangehende Antworten" reached_limit: - one: 'Achtung: Wir senden maximal 1 E-Mail pro Tag. Überprüfe die Seite, um möglicherweise zurückgehaltene E-Mails zu sehen.' - other: 'Achtung: Wir senden maximal%{count} E-Mails pro Tag. Überprüfe die Seite, um möglicherweise zurückgehaltene E-Mails zu sehen. P.S.: Danke, dass du so beliebt bist!' + one: "Achtung: Wir senden maximal 1 E-Mail pro Tag. Überprüfe die Seite, um möglicherweise zurückgehaltene E-Mails zu sehen." + other: "Achtung: Wir senden maximal%{count} E-Mails pro Tag. Überprüfe die Seite, um möglicherweise zurückgehaltene E-Mails zu sehen. P.S.: Danke, dass du so beliebt bist!" in_reply_to: "Als Antwort auf" unsubscribe: title: "Abbestellen" description: "Nicht interessiert an diesen E-Mails? Kein Problem! Klicke unten, um sie sofort abzubestellen:" reply_by_email: "[Rufe das Thema auf](%{base_url}%{url}) oder antworte auf diese E-Mail, um zu antworten." - reply_by_email_pm: "[Rufe die Nachricht auf](%{base_url}%{url}) oder antworte auf diese E-Mail, um zu antworten." + reply_by_email_pm: "[Rufe die Nachricht auf](%{base_url}%{url}) oder antworte auf diese E-Mail, um %{participants} zu antworten." only_reply_by_email: "Antworte auf diese E-Mail, um zu antworten." + only_reply_by_email_pm: "Antworte auf diese E-Mail, um %{participants} zu antworten." visit_link_to_respond: "[Rufe das Thema auf](%{base_url}%{url}), um zu antworten." - visit_link_to_respond_pm: "[Rufe die Nachricht auf](%{base_url}%{url}), um zu antworten." + visit_link_to_respond_pm: "[Rufe die Nachricht auf](%{base_url}%{url}) um %{participants} zu antworten." posted_by: "Erstellt von %{username} am %{post_date}" - pm_participants: "Teilnehmer:" + pm_participants: "Teilnehmer: %{participants}" invited_group_to_private_message_body: | %{username} hat @%{group_name} eingeladen zu einer Nachricht @@ -2528,7 +2636,7 @@ de: title: "Konto stummgeschaltet" subject_template: "[%{email_prefix}] Dein Konto wurde stummgeschaltet" text_body_template: | - Du wurdest im Forum stummgeschaltet bis %{suspended_till}. + Du wurdest im Forum stummgeschaltet bis %{silenced_till}. %{reason} @@ -2648,16 +2756,16 @@ de: %{new_email} signup_after_approval: title: "Konto bestätigen nach Genehmigung" - subject_template: "You've been approved on %{site_name}!" + subject_template: "Dein Konto bei %{site_name} wurde genehmigt!" text_body_template: | Willkommen bei%{site_name}! - Ein Team-Mitglied hat dein Benutzerkonto auf %{site_name} bestätigt. + Ein Team-Mitglied hat dein Benutzerkonto auf %{site_name} genehmigt. Du kannst dein neues Konto nun verwenden, indem du dich hier anmeldest: - %{base_url}/u/activate-account/%{email_token} + %{base_url} - Wenn sich der obenstehende Link nicht anklicken lässt, versuche ihn zu kopieren und in die Adresszeile deines Webbrowsers einzufügen. + Wenn sich der obenstehende Link nicht anklicken lässt, versuche ihn zu kopieren und in die Adresszeile deines Browsers einzufügen. %{new_user_tips} @@ -2680,7 +2788,7 @@ de: recent_topics: "Aktuell" see_more: "Mehr" search_title: "Diese Site durchsuchen" - search_google: "Google" + search_button: "Suche" offline: title: "App kann nicht geladen werden" offline_page_message: "Sieht so aus als wärst du offline! Bitte überprüfe deine Netzwerkverbindung und probiere es nochmal." @@ -2714,32 +2822,45 @@ de: flag_reason: sockpuppet: "Ein neuer Benutzer hat ein Thema erstellt und ein anderer neuer Benutzer mit der selben IP-Adresse (%{ip_address}) hat darauf geantwortet. Beachte die `flag_sockpuppets` Einstellung." spam_hosts: "Dieser Benutzer hat versucht, mehrere Antworten mit Links zur gleichen Domain (%{domain}) zu schreiben. Beachte die `newuser_spam_host_threshold`-Einstellung." - email_log: - post_user_deleted: "Der Autor dieses Beitrags wurde gelöscht." - no_user: "Kann Benutzer mit ID %{user_id} nicht finden " - anonymous_user: "Benutzer ist anonym" - suspended_not_pm: "Benutzer ist gesperrt, keine PN" - seen_recently: "Benutzer war kürzlich online" - post_not_found: "Kann Beitrag mit ID %{post_id} nicht finden" - notification_already_read: "Die Benachrichtigung zu dieser E-Mail wurde bereits gelesen" - topic_nil: "post.topic is nil" - post_deleted: "Beitrag wurde vom Autor entfernt" - user_suspended: "Benutzer wurde gesperrt" - already_read: "Benutzer hat diesen Beitrag bereits gelesen" - exceeded_emails_limit: "max_emails_per_day_per_user wurde überschritten" + skipped_email_log: + exceeded_emails_limit: "max_emails_per_day_per_user überschritten" exceeded_bounces_limit: "bounce_score_threshold wurde überschritten" - message_blank: "Nachricht ist leer" - message_to_blank: "message.to ist leer" - text_part_body_blank: "text_part.body ist leer" - body_blank: "body ist leer" - no_echo_mailing_list_mode: "Mailinglisten-Benachrichtigung für eigene Beiträge deaktivieren" + mailing_list_no_echo_mode: "Mailinglisten-Benachrichtigung für eigene Beiträge deaktivieren" + user_email_no_user: "Kann Benutzer mit ID %{user_id} nicht finden " + user_email_post_not_found: "Kann Beitrag mit ID %{post_id} nicht finden" + user_email_anonymous_user: "Benutzer ist anonym" + user_email_user_suspended_not_pm: "Benutzer ist gesperrt, keine Nachricht" + user_email_seen_recently: "Benutzer war kürzlich online" + user_email_notification_already_read: "Die Benachrichtigung zu dieser E-Mail wurde bereits gelesen" + user_email_notification_topic_nil: "post.topic ist leer" + user_email_post_user_deleted: "Der Ersteller dieses Beitrags wurde gelöscht." + user_email_post_deleted: "Beitrag wurde vom Ersteller entfernt" + user_email_user_suspended: "Benutzer wurde gesperrt" + user_email_already_read: "Benutzer hat diesen Beitrag bereits gelesen" + sender_message_blank: "Nachricht ist leer" + sender_message_to_blank: "message.to ist leer" + sender_text_part_body_blank: "text_part.body ist leer" + sender_body_blank: "Textkörper ist leer" + sender_post_deleted: "Beitrag wurde gelöscht" color_schemes: base_theme_name: "Basis" - default: "Helles Schema" + light: "Helles Schema" dark: "Dunkles Schema" - default_theme_name: "Standard" - dark_theme_name: "Dunkel" + neutral: "Neutrales Schema" + grey_amber: "Graues Bernstein-Schema" + shades_of_blue: "Blautöne-Schema" + latte: "Latte-Schema" + summer: "Sommer-Schema" + dark_rose: "Dunkle-Rosen-Schema" + default_theme_name: "Hell" light_theme_name: "Hell" + dark_theme_name: "Dunkel" + neutral_theme_name: "Neutral" + grey_amber_theme_name: "Grauer Bernstein" + shades_of_blue_theme_name: "Blautöne" + latte_theme_name: "Latte" + summer_theme_name: "Sommer" + dark_rose_theme_name: "Dunkle Rosen" about: "Über uns" guidelines: "Richtlinien" privacy: "Datenschutz" @@ -2852,7 +2973,7 @@ de: tos_topic: title: "Nutzungsbedingungen" body: | - SiteDie folgenden Geschäftsbedingungen sind maßgebend für die gesamte Webseite und alle Inhalte, Dienstleistungen und Produkte, die auf oder über die Webseite zur Verfügung gestellt werden, einschließlich, aber nicht beschränkt auf die %{company_domain} Foren-Software, die %{company_domain} Support-Foren und den %{company_domain} Hosting-Dienst („Hostingâ€), (zusammengefasst: die „Webseite“). Die Webseite gehört und wird betrieben von („“). Die Website wird angeboten vorbehaltlich der uneingeschränkten Zustimmung aller hierin enthaltenen Bedingungen und aller anderen sonstigen betrieblichen Regeln, Richtlinien (einschließlich, ohne Einschränkung, der [Datenschutzrichtlinien](/privacy) and [Community-Richtlinien](/faq)) von %{company_domain} und Verfahren, die von Zeit zu Zeit auf dieser Webseite von %{company_name} veröffentlicht werden können (zusammen die „Vereinbarung“). + Die folgenden Geschäftsbedingungen sind maßgebend für die gesamte Webseite und alle Inhalte, Dienstleistungen und Produkte, die auf oder über die Webseite zur Verfügung gestellt werden, einschließlich, aber nicht beschränkt auf die %{company_domain} Foren-Software, die %{company_domain} Support-Foren und den %{company_domain} Hosting-Dienst („Hostingâ€), (zusammengefasst: die „Webseite“). Die Webseite gehört und wird betrieben von %{company_full_name} („%{company_name}“). Die Website wird angeboten vorbehaltlich der uneingeschränkten Zustimmung aller hierin enthaltenen Bedingungen und aller anderen sonstigen betrieblichen Regeln, Richtlinien (einschließlich, ohne Einschränkung, der [Datenschutzrichtlinien](/privacy) and [Community-Richtlinien](/faq)) von %{company_domain} und Verfahren, die von Zeit zu Zeit auf dieser Webseite von veröffentlicht werden können (zusammen die „Vereinbarung“). Bitte lies diese Vereinbarung sorgfältig durch, bevor du die Webseite verwendest oder darauf zugreifst. Durch die Benutzung oder den Zugriff auf einen Teil der Webseite stimmst du den Geschäftsbedingungen dieser Vereinbarung zu. Wenn du nicht allen Geschäftsbedingungen in dieser Vereinbarung zustimmst, dann darfst du weder auf die Seite zugreifen noch irgendwelche Dienstleistungen in Anspruch nehmen. Wenn diese Geschäftsbedingungen als Angebot von %{company_name} erachtet werden, beschränkt sich die Zustimmung ausdrücklich auf diese Bedingungen. Die Website wird nur für Benutzer angeboten, die mindestens 13 Jahre alt sind. @@ -3085,72 +3206,72 @@ de: name: Bearbeiter description: Hat den ersten Beitrag bearbeitet long_description: | - Dieses Abzeichen erhältst du, wenn du das erste Mal einen deiner Beiträge bearbeitest. Auch wenn du deine Beiträge nicht unbegrenzt ändern kannst wirst, sind Bearbeitungen immer eine gute Idee – du kannst deine Beiträge verbessern, kleinere Fehler korrigieren oder irgendetwas ergänzen, was du bei deinem ursprünglichen Beitrag vergessen hast. Bearbeite, um deine Beiträge noch besser zu machen! + Dieses Abzeichen wird verliehen, wenn du das erste Mal einen deiner Beiträge bearbeitest. Auch wenn du deine Beiträge nicht unbegrenzt ändern kannst wirst, sind Bearbeitungen willkommen – du kannst die Formatierung verbessern, kleine Fehler korrigieren oder irgendetwas ergänzen, was du bei deinem ursprünglichen Beitrag vergessen hast. Bearbeite, um deine Beiträge noch besser zu machen! basic_user: name: Anwärter - description: "Ermöglicht das Nutzen aller wesentlichen Community-Funktionen" + description: "Ermöglicht das Nutzen alle wesentlichen Community-Funktionen" long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 1 erreichst. Danke, dass du eine Weile dageblieben bist und ein paar Themen gelesen hast um zu lernen, worum es in unserer Community geht. Für dich gelten die Einschränkungen für neue Nutzer nicht mehr und du hast nun Zugriff auf alle wichtigen Funktionen, beispielsweise persönliche Nachrichten, die Melden-Funktion, das Bearbeiten von Wiki-Beiträgen und die Fähigkeit, mehrere Bilder und Links in Beiträgen zu verwenden. + Dieses Abzeichen wird verliehen, wenn du Vertrauensstufe 1 erreichst. Danke, dass du dabeigeblieben bist und ein paar Themen gelesen hast um zu lernen, worum es in unserer Community geht. Für dich gelten die Einschränkungen für neue Nutzer nicht mehr und du hast nun Zugriff auf alle wichtigen Funktionen, beispielsweise persönliche Nachrichten, die Melden-Funktion, das Bearbeiten von Wiki-Beiträgen und die Fähigkeit, mehrere Bilder und Links in Beiträgen zu verwenden. member: name: Mitglied - description: "Ermöglicht das Versenden von Einladungen, Gruppen-Nachrichten, mehr Likes" + description: "Ermöglicht den Versand von Einladungen, Gruppen-Nachrichten sowie mehr Likes" long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 2 erreichst. Danke, dass du einige Wochen mitgemacht hast, um unserer Community richtig beizutreten. Du kannst nun von deiner Benutzerseite und einzelnen Themen-Seiten aus Einladungen versenden, Gruppennachrichten erstellen und ein paar mehr Likes pro Tag vergeben. + Dieses Abzeichen wird verliehen, wenn du Vertrauensstufe 2 erreichst. Danke, dass du einige Wochen mitgemacht hast, um unserer Community richtig beizutreten. Du kannst nun von deiner Benutzerseite und einzelnen Themen-Seiten aus Einladungen versenden, Gruppennachrichten erstellen und mehr Likes pro Tag vergeben. regular: name: Stammgast - description: "Ermöglicht verschieben und umbenennen von Themen, veröffentlichen verfolgbarer Links, Aktivierung der Wiki-Funktion, mehr Likes" + description: "Ermöglicht das Verschieben und Umbenennen von Themen, die Veröffentlichung verfolgbarer Links, die Umwandlung eines Beitrags in ein Wiki sowie mehr Likes" long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 3 erreichst. Danke, dass du in unserer Community über mehrere Monate ein Stammgast gewesen bist. Du bist nun einer unserer aktivsten Leser und ein zuverlässiges Mitglied, das diese Community großartig macht. Du kannst nun Themen neu kategorisieren und umbenennen, mächtigere Spam-Meldungen nutzen, eine private Lounge nutzen und kannst viel mehr Likes pro Tag erhalten. + Dieses Abzeichen wird verliehen, wenn du Vertrauensstufe 3 erreichst. Danke, dass du in unserer Community über mehrere Monate ein Stammgast gewesen bist. Du bist nun einer unserer aktivsten Leser und ein zuverlässiges Mitglied, das diese Community großartig macht. Du kannst nun Themen neu kategorisieren und umbenennen, mächtigere Spam-Meldungen nutzen, eine private Lounge nutzen und kannst viel mehr Likes pro Tag erhalten. leader: name: Anführer - description: "Ermöglicht bearbeiten aller Beiträge, anheften, schließen, archivieren, aufteilen und zusammenfügen von Themen, mehr Likes" + description: "Ermöglicht das Bearbeiten aller Beiträge, das Anheften, Schließen, Archivieren, Aufteilen und Zusammenfügen von Themen sowie mehr Likes" long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 4 erreichst. Du bist ein vom Team ausgezeichneter Anführer und hast durch deine Aktivität und Worte ein positives Beispiel für die übrige Community abgegeben. Du kannst alle Beiträge bearbeiten, Moderator-Aktionen wie das Anheften, Schließen, Unsichtbar machen, Archivieren, Teilen und Zusammenführen von Themen durchführen und viel mehr Likes pro Tag vergeben. + Dieses Abzeichen wird verliehen, wenn du Vertrauensstufe 4 erreichst. Du bist ein vom Team ausgezeichneter Anführer und hast durch deine Aktivität und Worte ein positives Beispiel für die übrige Community abgegeben. Du kannst alle Beiträge bearbeiten und Moderator-Aktionen wie das Anheften, Schließen, Unsichtbar machen, Archivieren, Teilen und Zusammenführen von Themen durchführen. welcome: name: Willkommen description: Hat ein Like erhalten long_description: | - Das Abzeichen wird verliehen, wenn du den ersten Like auf einen Beitrag erhältst. Glückwunsch, du hast einen Beitrag geschrieben, den deine Mitbenutzer interessant, cool oder nützlich finden! + Dieses Abzeichen wird verliehen, wenn du den ersten Like auf einen Beitrag erhältst. Glückwunsch, du hast einen Beitrag geschrieben, den deine Mitbenutzer interessant, cool oder nützlich finden! autobiographer: name: Autobiograf description: "Hat Benutzerprofil ausgefüllt" long_description: | - Dieses Abzeichen erhältst du für das Ausfüllen von deinem Benutzerprofil und für das Hochladen eines Profilbildes erhalten. Die Community ein bisschen mehr wissen zu lassen über dich und darüber, was du gerne tust, macht die gesamte Community besser. Mach mit! + Dieses Abzeichen wird verliehen, wenn du dein Benutzerprofil ausfüllst und ein Profilbild hochlädst. Die Community ein bisschen mehr wissen zu lassen über dich und darüber, was du gerne tust, macht die gesamte Community besser. Mach mit! anniversary: name: Jubiläum description: Ist ein aktives Mitglied für ein Jahr und hat mindestens einen Beitrag verfasst long_description: | - Das Abzeichen wird verliehen, wenn du ein Jahr lang Mitglied warst und in diesem Jahr mindestens einen Beitrag geschrieben hast. Danke, dass du hier geblieben bist und zu unserer Community beiträgst. Ohne dich könnten wir dies nicht tun. + Dieses Abzeichen wird verliehen, wenn du ein Jahr lang Mitglied warst und in diesem Jahr mindestens einen Beitrag geschrieben hast. Danke, dass du hier geblieben bist und zu unserer Community beiträgst. Ohne dich könnten wir dies nicht tun. nice_post: name: Schöne Antwort description: Hat 10 Likes für eine Antwort erhalten long_description: | - Das Abzeichen wird verliehen, wenn eine deiner Antworten 10 Likes erhält. Deine Antwort hat die Community wirklich beeindruckt und dabei geholfen, den Dialog voranzubringen! + Dieses Abzeichen wird verliehen, wenn eine deiner Antworten 10 Likes erhält. Deine Antwort hat die Community beeindruckt und dabei geholfen, den Dialog voranzubringen! good_post: name: Gute Antwort description: Hat 25 Likes für eine Antwort erhalten long_description: | - Das Abzeichen wird verliehen, wenn eine deiner Antworten 25 Likes erhält. Deine Antwort war außergewöhnlich und hat den Dialog sehr viel besser für alle gemacht! + Dieses Abzeichen wird verliehen, wenn eine deiner Antworten 25 Likes erhält. Deine Antwort war außergewöhnlich und hat den Dialog viel interessanter gemacht. great_post: name: Großartige Antwort description: Hat 50 Likes für eine Antwort erhalten long_description: | - Das Abzeichen wird verliehen, wenn eine deiner Antworten 50 Likes erhält. Wow! Deine Antwort war inspirierend, faszinierend, wahnsinnig komisch oder aufschlussreich und die Community hat sie geliebt. + Dieses Abzeichen wird verliehen, wenn eine deiner Antworten 50 Likes erhält. Wow! Deine Antwort war inspirierend, faszinierend, wahnsinnig komisch oder aufschlussreich und die Community hat sie geliebt. nice_topic: name: Schönes Thema description: Hat 10 Likes für ein Thema erhalten long_description: | - Das Abzeichen wird verliehen, wenn eines deiner Themen 10 Likes erhält. Hey, du hast einen interessanten Dialog begonnen, den die Community genossen hat! + Dieses Abzeichen wird verliehen, wenn eines deiner Themen 10 Likes erhält. Du hast einen interessanten Dialog begonnen, den die Community genossen hat! good_topic: name: Gutes Thema description: Hat 25 Likes für ein Thema erhalten long_description: | - Das Abzeichen wird verliehen, wenn eines deiner Themen 25 Likes erhält. Du hast einen lebendigen Dialog gestartet, die die Community versammelt hat und von dieser geliebt wurde! + Dieses Abzeichen wird verliehen, wenn eines deiner Themen 25 Likes erhält. Du hast einen lebendigen Dialog gestartet, die die Community versammelt hat. great_topic: name: Großartiges Thema description: Hat 50 Likes für ein Thema erhalten long_description: | - Das Abzeichen wird verliehen, wenn eines deiner Themen 50 Likes erhält. Du hast einen faszinierenden Dialog losgetreten und die Community hat die daraus entstandene, dynamische Diskussion genossen! + Dieses Abzeichen wird verliehen, wenn eines deiner Themen 50 Likes erhält. Du hast einen faszinierenden Dialog losgetreten und die Community hat die daraus entstandene, lebhafte Diskussion geliebt! nice_share: name: Schön geteilt description: Hat einen Beitrag mit 25 Besuchern geteilt @@ -3160,12 +3281,12 @@ de: name: Gut geteilt description: Hat einen Beitrag mit 300 Besuchern geteilt long_description: | - Das Abzeichen wird verliehen, wenn du einen Link teilst, der von 300 Besuchern angeklickt wurde. Gute Arbeit! Du hast eine großartige Diskussion einer ganzen Reihe neuer Leute zur Schau gestellt und dieser Community geholfen zu wachsen. + Dieses Abzeichen wird verliehen, wenn du einen Link teilst, der von 300 Besuchern angeklickt wurde. Gute Arbeit! Du hast eine großartige Diskussion einer ganzen Reihe neuer Leute zur Schau gestellt und dieser Community geholfen zu wachsen. great_share: name: Großartig geteilt description: Hat einen Beitrag mit 1000 Besuchern geteilt long_description: | - Das Abzeichen wird verliehen, wenn du einen Link teilst, der von 1000 Besuchern angeklickt wurde. Wow! Du hast eine interessante Diskussion einer riesigen Leserschaft näher gebracht und unserer Community sehr geholfen zu wachsen! + Dieses Abzeichen wird verliehen, wenn du einen Link teilst, der von 1000 Besuchern angeklickt wurde. Wow! Du hast eine interessante Diskussion einer riesigen Leserschaft näher gebracht und unserer Community sehr geholfen zu wachsen! first_like: name: Erster Like description: Hat einen Beitrag mit „Gefällt mir“ markiert @@ -3175,7 +3296,7 @@ de: name: Erste Meldung description: Hat einen Beitrag gemeldet long_description: | - Das Abzeichen wird verliehen, wenn du das erste Mal einen Beitrag meldest. Mit Meldungen bewahren wir dies als sauberen, gut beleuchten Platz für alle. Wenn du einen Beitrag bemerkst, der aus irgendeinem Grund die Aufmerksamkeit eines Moderators erfordert, so zögere bitte nicht, ihn zu melden. Du kannst einen Beitrag auch melden, um eine Nachricht an einen Mitbenutzer zu schicken, wenn du ein Problem mit seinem/ihrem Beitrag siehst. Wenn du ein Problem siehst, :flag_black: melde es! + Dieses Abzeichen wird verliehen, wenn du das erste Mal einen Beitrag meldest. Mit Meldungen bewahren wir dies als netten Platz für alle. Wenn du einen Beitrag bemerkst, der aus irgendeinem Grund die Aufmerksamkeit eines Moderators erfordert, so zögere bitte nicht, ihn zu melden. Wenn du ein Problem siehst, :flag_black: melde es! promoter: name: Werber description: Hat einen Benutzer eingeladen @@ -3185,12 +3306,12 @@ de: name: Aktivist description: Hat 3 Anwärter (Vertrauensstufe 1) eingeladen long_description: | - Das Abzeichen wird verliehen, wenn du 3 Leute eingeladen hast, die daraufhin genug Zeit auf der Site verbracht haben, um Anwärter zu werden. Eine lebendige Community benötigt eine regelmäßige Infusion mit Neulingen, die sich regelmäßig beteiligen und neue Stimmen zum Dialog ergänzen. + Dieses Abzeichen wird verliehen, wenn du 3 Leute eingeladen hast, die daraufhin genug Zeit auf der Site verbracht haben, um Anwärter zu werden. Eine lebendige Community benötigt eine regelmäßige Infusion mit Neulingen, die sich regelmäßig beteiligen und neue Stimmen zum Dialog ergänzen. champion: name: Verfechter description: Hat 5 Mitglieder (Vertrauensstufe 2) eingeladen long_description: | - Das Abzeichen wird verliehen, wenn du 5 Leute eingeladen hast, die daraufhin genug Zeit auf der Site verbracht haben, um vollwertige Mitglieder zu werden. Wow! Danke dafür, dass du die Vielfalt unserer Community mit neuen Mitgliedern erweiterst! + Dieses Abzeichen wird verliehen, wenn du 5 Leute eingeladen hast, die daraufhin genug Zeit auf der Site verbracht haben, um vollwertige Mitglieder zu werden. Wow! Danke dafür, dass du die Vielfalt unserer Community mit neuen Mitgliedern erweiterst! first_share: name: Erste Weitergabe description: Hat einen Beitrag geteilt @@ -3205,7 +3326,7 @@ de: name: Erstes Zitat description: Hat einen Beitrag zitiert long_description: | - Das Abzeichen wird verliehen, wenn du das erste Mal einen Beitrag in deiner Antwort zitierst. Das Zitieren relevanter Abschnitte früherer Beiträge in deiner Antwort hilft dabei, Diskussionen verbunden zu halten und beim Thema zu bleiben. Der einfachste Weg zu zitieren besteht darin, den Abschnitt eines Beitrags zu markieren und dann die Antwort-Schaltfläche zu drücken. Zitiere weiter großzügig! + Dieses Abzeichen wird verliehen, wenn du das erste Mal einen Beitrag in deiner Antwort zitierst. Das Zitieren relevanter Teile früherer Beiträge in deiner Antwort hilft dabei, Diskussionen verbunden zu halten und beim Thema zu bleiben. Der einfachste Weg zu zitieren besteht darin, den Abschnitt eines Beitrags zu markieren und dann die Antwort-Schaltfläche zu drücken. Zitiere weiter großzügig! read_guidelines: name: Richtlinien gelesen description: "Hat die Community-Richtlinien gelesen" @@ -3260,7 +3381,7 @@ de: name: Crazy in Love description: Hat 20-mal je 50 Likes an einem Tag vergeben long_description: | - Das Abzeichen wird verliehen, wenn du 20 Tage lang alle deiner 50 täglichen Likes nutzt. Wow! Du bist ein Vorbild für die regelmäßige Ermunterung deiner Community-Kollegen! + Dieses Abzeichen wird verliehen, wenn du 20 Tage lang alle deiner 50 täglichen Likes nutzt. Wow! Du bist ein Vorbild, das deine Community-Kollegen ermutigt! thank_you: name: Dankeschön description: Hat 20 Likes für Beiträge erhalten und 10 Likes vergeben @@ -3275,7 +3396,7 @@ de: name: Empathisch description: Hat 500 Likes für Beiträge erhalten und 1000 Likes vergeben long_description: | - Das Abzeichen wird verliehen, wenn du bei 500 Beiträgen Likes erhalten und im Gegenzug mindestens 1000 Likes vergeben hast. Wow! Du bist ein Vorbild von Großzügigkeit und gegenseitige Wertschätzung :two_hearts:. + Dieses Abzeichen wird verliehen, wenn du bei 500 Beiträgen Likes erhalten und im Gegenzug mindestens 1000 Likes vergeben hast. Wow! Du bist ein Vorbild von Großzügigkeit und gegenseitige Wertschätzung :two_hearts:. first_emoji: name: Erstes Emoji description: Hat ein Emoji in einem Beitrag verwendet @@ -3284,11 +3405,13 @@ de: first_mention: name: Erste Erwähnung description: Hat einen Benutzer in einem Beitrag erwähnt - long_description: "Das Abzeichen wird verliehen, wenn du das erste Mal den @Benutzernamen von jemandem in deinem Beitrag erwähnst. Jede Erwähnung erzeugt eine Benachrichtigung an die Person, sodass sie über deinen Beitrag informiert wird. Gib einfach ein @ (At-Zeichen) ein und erwähne einen beliebigen Benutzer oder, sofern erlaubt, eine Gruppe – es ist ein komfortabler Weg, die Aufmerksamkeit von jemandem auf etwas zu lenken." + long_description: | + Dieses Abzeichen wird verliehen, wenn du das erste Mal den @Benutzernamen von jemandem in deinem Beitrag erwähnst. Jede Erwähnung erzeugt eine Benachrichtigung an die Person, sodass sie über deinen Beitrag informiert wird. Gib einfach ein @ (At-Zeichen) ein und erwähne einen beliebigen Benutzer oder, sofern erlaubt, eine Gruppe – es ist ein komfortabler Weg, die Aufmerksamkeit von jemandem auf etwas zu lenken. first_onebox: name: Erste Onebox description: "Hat einen Link geteilt, der in eine Onebox umgewandelt wurde" - long_description: "Das Abzeichen wird verliehen, wenn du das erste Mal einen Link auf einer eigenen Zeile schreibst, der dann automatisch in eine Onebox umgewandelt wurde, mit einer kurzen Zusammenfassung des Links, einem Titel und einem Bild (falls verfügbar)." + long_description: | + Dieses Abzeichen wird verliehen, wenn du das erste Mal einen Link auf einer eigenen Zeile schreibst, der automatisch in eine Onebox wurde, mit Zusammenfassung, Titel und Bild (falls verfügbar). first_reply_by_email: name: Erste Antwort per E-Mail description: Hat auf einen Beitrag per E-Mail geantwortet @@ -3302,15 +3425,18 @@ de: enthusiast: name: Enthusiast description: 10-Tages-Besuch - long_description: "Dieses Abzeichen wird verliehen für Besuche an zehn aufeinander folgenden Tagen. Danke, dass du über eine Woche bei uns geblieben bist!" + long_description: | + Dieses Abzeichen wird verliehen für Besuche an zehn aufeinander folgenden Tagen. Danke, dass du über eine Woche bei uns geblieben bist! aficionado: name: Begeisterter Anhänger description: 100-Tages-Besuch - long_description: Dieses Abzeichen wird verliehen für Besuche an 100 aufeinander folgenden Tagen. Das sind mehr als drei Monate! + long_description: | + Dieses Abzeichen wird verliehen für Besuche an 100 aufeinander folgenden Tagen. Das sind mehr als drei Monate! devotee: name: Verehrer description: 365-Tages-Besuch - long_description: "Dieses Abzeichen wird verliehen für Besuche an 365 aufeinander folgenden Tagen. Wow, ein ganzes Jahr!" + long_description: | + Dieses Abzeichen wird verliehen für Besuche an 365 aufeinander folgenden Tagen. Wow, ein ganzes Jahr! badge_title_metadata: "%{display_name} Abzeichen auf %{site_title}" admin_login: success: "E-Mail gesendet" @@ -3334,7 +3460,7 @@ de: button: "Registrieren" title: "Administrator-Konto registrieren" help: "registriere ein neues Konto, um loszulegen" - no_emails: "Leider wurden bei der Einrichtung keine Administrator-Mails festgelegt, sodass es schwer sein dürfte, die Konfiguration abzuschließen." + no_emails: "Leider wurde bei der Einrichtung keine Administrator-E-Mail-Adresse festgelegt, sodass es schwer sein könnte, die Konfiguration abzuschließen. Bitte füge eine Entwickler-E-Mail-Adresse in der Konfigurationsdatei hinzu oder erstelle ein Administrator-Konto über die Konsole." confirm_email: title: "Bestätige deine E-Mail-Adresse" message: "

Wir haben eine Aktivierungsmail an %{email} gesendet. Bitte folge den Anweisungen in der E-Mail, um dein Konto zu aktivieren.

Wenn diese nicht ankommst, stelle sicher, dass du E-Mail für dein Discourse richtig eingestellt hast und prüfe deinen Spamordner.

" @@ -3437,10 +3563,10 @@ de: fields: favicon_url: label: "Kleines Icon" - description: "Icon-Bild, das in Webbrowsern mit kleineren Dimensionen gut aussieht. Die empfohlene Größe beträgt 32x32 Pixel." + description: "Icon-Bild, um deine Seite in Webbrowsern mit kleineren Dimensionen zu repräsentieren, etwa 32x32 Pixel. Empfohlene Bilderweiterungen sind PNG oder JPG." apple_touch_icon_url: label: "Großes Icon" - description: "Icon-Bild, das auf modernen Geräten mit größeren Dimensionen gut aussieht. Die empfohlene Größe beträgt mindestens 144x144 Pixel." + description: "Icon-Bild, das auf modernen Geräten mit größeren Dimensionen gut aussieht. Die empfohlene Größe beträgt mindestens 512x512 Pixel." homepage: description: "Wir empfehlen, die aktuellen Themen auf deiner Startseite anzuzeigen, aber du kannst dich auch dafür entscheiden, Kategorien (Gruppen von Themen) auf der Startseite anzuzeigen, wenn dir das lieber ist." title: "Homepage" @@ -3449,8 +3575,14 @@ de: choices: latest: label: "Neueste Beiträge" - categories: - label: "Kategorien" + categories_only: + label: "nur Kategorien" + categories_with_featured_topics: + label: "Kategorien mit empfohlenen Themen" + categories_and_latest_topics: + label: "Kategorien und aktuelle Themen" + categories_and_top_topics: + label: "Kategorien und angesagte Themen" emoji: title: "Emoji" description: "Welches Emoji-Design bevorzugst du für deine Community? Du kannst später jederzeit mehr benutzerdefinierte Emoji einfügen unter Administration, Anpassen, Emoji." @@ -3479,3 +3611,5 @@ de: staff_action_logs: not_found: "nicht gefunden" unknown: "unbekannt" + user_merged: "%{username} wurde mit diesem Konto zusammengeführt" + user_delete_self: "Selbst gelöscht von %{url}" diff --git a/config/locales/server.el.yml b/config/locales/server.el.yml index 0f5432017e..4f70d032e8 100644 --- a/config/locales/server.el.yml +++ b/config/locales/server.el.yml @@ -139,8 +139,8 @@ el: reading_time: "ΧÏόνος ανάγνωσης" likes: "Μου ΑÏέσει" too_many_replies: - one: ΛυποÏμαστε, αλλά οι νέοι χÏήστες έχουν Ï€ÏοσωÏινό πεÏιοÏισμό 1 απάντησης ανά νήμα. - other: ΛυποÏμαστε, αλλά οι νέοι χÏήστες έχουν Ï€ÏοσωÏινό πεÏιοÏισμό %{count} απαντήσεων ανά νήμα. + one: "ΛυποÏμαστε, αλλά οι νέοι χÏήστες έχουν Ï€ÏοσωÏινό πεÏιοÏισμό 1 απάντησης ανά νήμα." + other: "ΛυποÏμαστε, αλλά οι νέοι χÏήστες έχουν Ï€ÏοσωÏινό πεÏιοÏισμό %{count} απαντήσεων ανά νήμα." embed: start_discussion: "ΈναÏξη Συζήτησης" continue: "Συνέχεια Συζήτησης" @@ -150,35 +150,35 @@ el: no_hosts: "Δεν υπάÏχουν οÏισμένοι hosts για ενσωμάτωση." configure: "ΡÏθμιση Ενσωμάτωσης" more_replies: - one: μια ακόμη απάντηση - other: '%{count} ακόμη απαντήσεις' + one: "μια ακόμη απάντηση" + other: "%{count} ακόμη απαντήσεις" loading: "ΦόÏτωση Συζήτησης..." permalink: "Μόνιμος σÏνδεσμος" imported_from: "Αυτό είναι ένα συνοδό θέμα συζητησης για την αÏχική ανάÏτηση στο %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 απάντηση - other: '%{count} απαντήσεις' + one: "1 απάντηση" + other: "%{count} απαντήσεις" no_mentions_allowed: "ΛυποÏμαστε, δεν μποÏείς να αναφέÏεις άλλους χÏήστες." too_many_mentions: - one: ΛυποÏμαστε, μποÏείς να αναφέÏεις μόνο έναν χÏήστη σε κάθε ανάÏτηση. - other: ΛυποÏμαστε, μποÏείς να αναφέÏεις μόνο %{count} χÏήστες σε κάθε ανάÏτηση. + one: "ΛυποÏμαστε, μποÏείς να αναφέÏεις μόνο έναν χÏήστη σε κάθε ανάÏτηση." + other: "ΛυποÏμαστε, μποÏείς να αναφέÏεις μόνο %{count} χÏήστες σε κάθε ανάÏτηση." no_mentions_allowed_newuser: "ΛυποÏμαστε, οι νέοι χÏήστες δεν μποÏοÏν να αναφέÏουν άλλους χÏήστες." too_many_mentions_newuser: - one: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να αναφέÏουν μόνο έναν χÏήστη σε κάθε ανάÏτηση. - other: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να αναφέÏουν μόνο %{count} χÏήστες σε κάθε ανάÏτηση. + one: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να αναφέÏουν μόνο έναν χÏήστη σε κάθε ανάÏτηση." + other: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να αναφέÏουν μόνο %{count} χÏήστες σε κάθε ανάÏτηση." no_images_allowed: "ΛυποÏμαστε, οι νέοι χÏήστες δεν μποÏοÏν να βάλουν εικόνες στις αναÏτήσεις." too_many_images: - one: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο μία εικόνα σε κάθε ανάÏτηση. - other: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο %{count} εικόνες σε κάθε ανάÏτηση. + one: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο μία εικόνα σε κάθε ανάÏτηση." + other: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο %{count} εικόνες σε κάθε ανάÏτηση." no_attachments_allowed: "ΛυποÏμαστε, οι νέοι χÏήστες δεν μποÏοÏν να βάλουν συνημμένα αÏχεία στις αναÏτήσεις." too_many_attachments: - one: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο ένα συνημμένο αÏχείο σε κάθε ανάÏτηση. - other: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο %{count} συνημμένα αÏχεία σε κάθε ανάÏτηση. + one: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο ένα συνημμένο αÏχείο σε κάθε ανάÏτηση." + other: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο %{count} συνημμένα αÏχεία σε κάθε ανάÏτηση." no_links_allowed: "ΛυποÏμαστε, οι νεοι χÏήστες δεν μποÏοÏν να βάλουν συνδέσμους στις αναÏτήσεις." too_many_links: - one: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο έναν σÏνδεσμο σε κάθε ανάÏτηση. - other: ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο %{count} συνδέσμους σε κάθε ανάÏτηση. + one: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο έναν σÏνδεσμο σε κάθε ανάÏτηση." + other: "ΛυποÏμαστε, οι νέοι χÏήστες μποÏοÏν να βάλουν μόνο %{count} συνδέσμους σε κάθε ανάÏτηση." spamming_host: "Συγγνώμη αλλά δεν μποÏείτε να αναÏτήσετε σÏνδεσμο σε αυτόν τον διακομιστή." user_is_suspended: "Δεν επιτÏέπονται οι αναÏτήσεις από αποβλημένους χÏήστες." topic_not_found: "Κάτι πήγε στÏαβά. Ίσως το νήμα έκλεισε ή διαγÏάφηκε ενώ το κοιτοÏσες;" @@ -243,8 +243,8 @@ el: title: "Αίτημα Μέλους για @%{group_name}" education: until_posts: - one: 1 ανάÏτηση - other: '%{count} αναÏτήσεις' + one: "1 ανάÏτηση" + other: "%{count} αναÏτήσεις" 'new-topic': | Καλώς ήÏθατε στην %{site_name} &mdash. **ευχαÏιστοÏμε που αÏχίσατε μιά νέα συνομιλία!** @@ -391,30 +391,6 @@ el: lounge_welcome: title: "Καλώς ήÏθατε στο Σαλόνι" - body: |2+ - - ΣυγχαÏητήÏια! :confetti_ball: - - Εάν μποÏείς να δεις αυτό το θέμα, έχεις Ï€Ïόσφατα Ï€Ïοαχθεί σε **τακτικό μέλος** (επίπεδο εμπιστοσÏνης 3) - - ΤώÏα μποÏείς να &hellip, - - * ΕπεξεÏγαστείς τον τίτλο οποιουδήποτε θεματος - - * Αλλάξεις την κατηγοÏία οποιουδήποτε θέματος - - * ΑκολουθοÏνται όλοι σου οι σÏνδεσμοι ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) έχει αφαιÏεθεί) - - * Έχεις Ï€Ïόσβαση στην ιδιωτική κατηγοÏία, που εμφανίζεται μόνο σε χÏήστες του επιπέδου 3 και πάνω. - - * ΚÏÏψεις ανεπιθÏμητη αλληλογÏαφία με την σημαία - - Εδώ είναι η [λίστα με όλα τα κανονικά μέλη](/badges/3/regular). Μπες να πεις ένα γεια. - - ΕυχαÏιστοÏμε που συνεχίζεις να είσαι ένα σημαντικό μέÏος αυτής της κοινότητας! - - (ΠαÏακαλώ σημείωσε πως μόνο τα μέλη που συνεχίζουν να τηÏοÏν τις απαÏαίτητες Ï€Ïοϋποθέσεις θα παÏαμένουν τακτικά μέλη.) - category: topic_prefix: "Σχετικά με την κατηγοÏία %{category} " replace_paragraph: "(Αντικατέστησε αυτή την Ï€Ïώτη παÏάγÏαφο με μια σÏντομη πεÏιγÏαφή της νέας σας κατηγοÏίας. Αυτή η οδηγία θα εμφανιστεί στην πεÏιοχή επιλογής κατηγοÏίας, επομένως Ï€Ïοσπάθησε να είναι κάτω απο 200 χαÏακτήÏες. **ΜέχÏι να επεξεÏγαστείς αυτή την πεÏιγÏαφή ή να δημιουÏγήσεις θέματα, αυτή η κατηγοÏία δεν θα εμφανίζεται στην σελίδα κατηγοÏιών. **)" @@ -430,9 +406,6 @@ el: cannot_delete: uncategorized: "Δεν μποÏείτε να διαγÏάψετε την κατηγοÏία 'Αταξινόμητα'" has_subcategories: "Δεν είναι δυνατή η διαγÏαφή αυτής της κατηγοÏίας, επειδή έχει υπο-κατηγοÏίες." - topic_exists: - one: Δεν είναι δυνατή η διαγÏαφή αυτής της κατηγοÏίας, επειδή έχει 1 θέμα. Το παλαιότεÏο θέμα είναι %{topic_link}. - other: Δεν είναι δυνατή η διαγÏαφή αυτής της κατηγοÏίας, επειδή έχει %{count} θέματα. Το παλαιότεÏο θέμα είναι %{topic_link}. topic_exists_no_oldest: "Δεν είναι δυνατή η διαγÏαφή αυτής της κατηγοÏίας, διότι ο αÏιθμός νημάτων είναι %{count}." uncategorized_description: "Îήματα που δεν χÏειάζονται κατηγοÏία ή που δεν ταιÏιάζουν σε καμία άλλη από τις υπάÏχουσες κατηγοÏίες." trust_levels: @@ -452,85 +425,85 @@ el: broken: "Η εικόνα είναι χαλασμένη" rate_limiter: hours: - one: 1 ÏŽÏα - other: '%{count} ÏŽÏες' + one: "1 ÏŽÏα" + other: "%{count} ÏŽÏες" minutes: - one: 1 λεπτό - other: '%{count} λεπτά' + one: "1 λεπτό" + other: "%{count} λεπτά" seconds: - one: 1 δευτεÏόλεπτο - other: '%{count} δευτεÏόλεπτα' + one: "1 δευτεÏόλεπτο" + other: "%{count} δευτεÏόλεπτα" datetime: distance_in_words: half_a_minute: "< 1λ" less_than_x_seconds: - one: < 1δ - other: < %{count}δ + one: "< 1δ" + other: "< %{count}δ" x_seconds: - one: 1δ - other: '%{count}δ' + one: "1δ" + other: "%{count}δ" less_than_x_minutes: - one: 1λ - other: < %{count}λ + one: "1λ" + other: "< %{count}λ" x_minutes: - one: 1λ - other: '%{count}λ' + one: "1λ" + other: "%{count}λ" about_x_hours: - one: 1ω - other: '%{count}ω' + one: "1ω" + other: "%{count}ω" x_days: - one: 1η - other: '%{count}η' + one: "1η" + other: "%{count}η" about_x_months: - one: 1μήνας - other: '%{count}μήνες' + one: "1μήνας" + other: "%{count}μήνες" x_months: - one: 1μήνας - other: '%{count}μήνες' + one: "1μήνας" + other: "%{count}μήνες" about_x_years: - one: 1ε - other: '%{count}ε' + one: "1ε" + other: "%{count}ε" over_x_years: - one: '> 1ε' - other: '> %{count}ε' + one: "> 1ε" + other: "> %{count}ε" almost_x_years: - one: 1ε - other: '%{count}ε' + one: "1ε" + other: "%{count}ε" distance_in_words_verbose: half_a_minute: "μόλις τώÏα" less_than_x_seconds: - one: μόλις τώÏα - other: μόλις τώÏα + one: "μόλις τώÏα" + other: "μόλις τώÏα" x_seconds: - one: Ï€Ïιν 1 δευτεÏόλεπτο - other: Ï€Ïιν %{count} δευτεÏόλεπτα + one: "Ï€Ïιν 1 δευτεÏόλεπτο" + other: "Ï€Ïιν %{count} δευτεÏόλεπτα" less_than_x_minutes: - one: λιγότεÏο από 1 λεπτό Ï€Ïιν - other: λιγότεÏο από %{count} λεπτά Ï€Ïιν + one: "λιγότεÏο από 1 λεπτό Ï€Ïιν" + other: "λιγότεÏο από %{count} λεπτά Ï€Ïιν" x_minutes: - one: Ï€Ïιν 1 λεπτό - other: Ï€Ïιν %{count} λεπτά + one: "Ï€Ïιν 1 λεπτό" + other: "Ï€Ïιν %{count} λεπτά" about_x_hours: - one: Ï€Ïιν 1 ÏŽÏα - other: Ï€Ïιν %{count} ÏŽÏες + one: "Ï€Ïιν 1 ÏŽÏα" + other: "Ï€Ïιν %{count} ÏŽÏες" x_days: - one: Ï€Ïιν 1 μέÏα - other: Ï€Ïιν %{count} μέÏες + one: "Ï€Ïιν 1 μέÏα" + other: "Ï€Ïιν %{count} μέÏες" about_x_months: - one: Ï€Ïιν 1 μήνα πεÏίπου - other: Ï€Ïιν %{count} μήνες πεÏίπου + one: "Ï€Ïιν 1 μήνα πεÏίπου" + other: "Ï€Ïιν %{count} μήνες πεÏίπου" x_months: - one: Ï€Ïιν 1 μήνα - other: Ï€Ïιν %{count} μήνες + one: "Ï€Ïιν 1 μήνα" + other: "Ï€Ïιν %{count} μήνες" about_x_years: - one: Ï€Ïιν 1 χÏόνο πεÏίπου - other: Ï€Ïιν %{count} χÏόνια πεÏίπου + one: "Ï€Ïιν 1 χÏόνο πεÏίπου" + other: "Ï€Ïιν %{count} χÏόνια πεÏίπου" over_x_years: - one: πάνω από 1 χÏόνο - other: πάνω από %{count} χÏόνια + one: "πάνω από 1 χÏόνο" + other: "πάνω από %{count} χÏόνια" almost_x_years: - one: σχεδόν 1 χÏόνο Ï€Ïιν - other: σχεδόν %{count} χÏόνια Ï€Ïιν + one: "σχεδόν 1 χÏόνο Ï€Ïιν" + other: "σχεδόν %{count} χÏόνια Ï€Ïιν" password_reset: no_token: "Συγνώμη, ο σÏνδεσμος αλλαγής ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¯Î½Î±Î¹ Ï€Î¿Î»Ï Ï€Î±Î»Î¹ÏŒÏ‚. Πατήστε ξανά το κουμπί 'Συνδεθείτε' και επιλέξτε 'Ξέχασα τον κωδικό Ï€Ïόσβασής μου' για να λάβετε νέο σÏνδεσμο. " choose_new: "Επιλέξτε νέο κωδικό Ï€Ïόσβασης" @@ -604,17 +577,11 @@ el: description: 'Μου αÏέσει η ανάÏτηση' short_description: 'Μου αÏέσει η ανάÏτηση' long_form: 'άÏεσαν' - vote: - title: 'Ψηφίστε' - description: 'Ψηφίστε την ανάÏτηση' - short_description: 'Ψηφίστε την ανάÏτηση' - long_form: 'ψήφισαν την ανάÏτηση' user_activity: no_default: self: "Δεν έχετε ακόμη καμία δÏαστηÏιότητα." others: "ΧωÏίς δÏαστηÏιότητα." no_bookmarks: - self: "Δεν έχεις κανέναν σελιδοδείκτη σε αναÏτήσεις, οι σελιδοδείκτες στις αναÏτήσεις σου επιτÏέπουν εÏκολη Ï€Ïόσβαση σε αυτές αÏγότεÏα." others: "Κανένας σελιδοδείκτης." no_likes_given: self: "Δεν σου αÏέσει καμία ανάÏτηση." @@ -753,8 +720,6 @@ el: num_users: "ΧÏήστες" top_referred_topics: title: "ΚοÏυφαία ΑναφεÏόμενα Îήματα" - xaxis: "Îήμα" - num_clicks: "Clicks" page_view_anon_reqs: title: "Ανώνυμοι" xaxis: "ΗμέÏα" @@ -811,7 +776,6 @@ el: xaxis: "ΗμέÏα" yaxis: "ΣÏνολο" mobile_visits: - title: "Επισκέψεις χÏήστη" xaxis: "ΗμέÏα" yaxis: "ΑÏιθμός επισκέψεων" dashboard: @@ -833,8 +797,8 @@ el: failing_emails_warning: 'ΥπάÏχουν %{num_failed_jobs} εÏγασίες email οι οποίες απέτυχαν. Ελέγξτε το app.yml και βεβαιωθείτε πως οι Ïυθμίσεις του mail server σας είναι σωστές. Δείτε τις αποτυχημένες εÏγασίες στο Sidekiq.' subfolder_ends_in_slash: "Οι Ïυθμίσεις του υποφακέλου σας δεν είναι σωστές. Το DISCOURSE_RELATIVE_URL_ROOT τελειώνει με κάθετη. " email_polling_errored_recently: - one: 'To Email polling έχει παÏάγει ένα σφάλμα τις τελευταίες 24 ÏŽÏες . Δείτε τα αÏχεία καταγÏαφής για πεÏισσότεÏες λεπτομέÏειες. ' - other: 'To Email polling έχει παÏάγει %{count} σφάλματα τις τελευταίες 24 ÏŽÏες . Δείτε τα αÏχεία καταγÏαφής για πεÏισσότεÏες λεπτομέÏειες. ' + one: "To Email polling έχει παÏάγει ένα σφάλμα τις τελευταίες 24 ÏŽÏες . Δείτε τα αÏχεία καταγÏαφής για πεÏισσότεÏες λεπτομέÏειες. " + other: "To Email polling έχει παÏάγει %{count} σφάλματα τις τελευταίες 24 ÏŽÏες . Δείτε τα αÏχεία καταγÏαφής για πεÏισσότεÏες λεπτομέÏειες. " bad_favicon_url: "Το favicon δεν μποÏεί να φοÏτωθεί 'Ελεγξε το favicon_url στις Ρυθμίσεις Iστοσελίδας" poll_pop3_timeout: "Το χÏονικό ÏŒÏιο σÏνδεσης με τον διακομιστή POP3 έληξε. Τα εισεÏχόμενα email δεν μποÏοÏν να ανακτηθοÏν. ΠαÏακαλώ ελέγξτε τις POP3 Ïυθμίσεις σας και τον πάÏοχο υπηÏεσιών." poll_pop3_auth_error: "ΥπήÏξε σφάλμα ελεχγου ταυτότητας κατά την σÏνδεση με τον διακομιστή POP3. ΠαÏακαλώ όπως ελέξετε τις POP3 Ïυθμίσεις σας. " @@ -943,7 +907,6 @@ el: post_menu: "Αποφάσισε ποια αντικείμενα θα εμφανίζονται στο Î¼ÎµÎ½Î¿Ï Ï„Ï‰Î½ δημοσιεÏσεων, και με ποια σειÏά. ΠαÏάδειγμα μου αÏέσει/επεξεÏγασία/επισήμανση/διαγÏαφή/κοινοποίηση/σελιδοδείκτης/απάντηση" post_menu_hidden_items: "Οι επιλογές που θα κÏυφτοÏν από Ï€Ïοεπιλογή στο Î¼ÎµÎ½Î¿Ï Ï„Î·Ï‚ ανάÏτησης, εκτός αν πατηθεί η επιλογή επέκτασης του μενοÏ. " share_links: "ΚαθόÏισε ποια αντικείμενα εμφανίζονται στον διάλογο διαμοιÏÎ±ÏƒÎ¼Î¿Ï ÎºÎ±Î¹ με ποια σειÏά." - track_external_right_clicks: "ΠαÏακολουθείστε εξωτεÏικοÏÏ‚ συνδέσμους στους οποίους το δεξιό κλικ (πχ: άνοιγμα σε νέα καÏτέλα) είναι απενεÏγοποιημένο από Ï€Ïοεπιλογή διότι επανεγγÏάφει URLs " site_contact_username: "Ένα έγκυÏο όνομα χÏήστη των συνεÏγατών από το οποίο θα στέλνονται όλα τα αυτοματοποιημένα μηνÏματα. Αν αφεθεί κενό, θα χÏησιμοποιείται ο Ï€ÏοκαθοÏισμένος λογαÏιασμός συστήματος. " send_welcome_message: "Στείλε σε όλους τους νέους χÏήστες ένα μήνυμα καλωσοÏίσματος μαζί με ένα γÏήγοÏο οδηγό έναÏξης." suppress_reply_directly_below: "Îα μην εμφανίζεται το επεκτάσιμο αÏιθμός απαντήσεων σε ένα θέμα όταν υπάÏχει μία μόνο απάντηση ακÏιβώς κάτω από αυτήν την ανάÏτηση." @@ -1154,7 +1117,6 @@ el: reply_by_email_enabled: "ΕνεÏγοποίηση απάντησης στα νήματα μέσω email." reply_by_email_address: "ΠÏότυπο για την απάντηση μέσω email της διεÏθυνσης email εισεÏχομένων μηνυμάτων, για παÏάδειγμα: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Λίστα εναλλακτικών Ï€ÏοτÏπων για την απάντηση μέσω email της διεÏθυνσης email εισεÏχομένων μηνυμάτων, πχ: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "ΑπαγόÏευσε στο Discourse να στέλνει email οποιοασδήποτε μοÏφής" strip_images_from_short_emails: "ΑφαίÏεσε εικόνες από email που έχουν μέγεθος λιγότεÏο από 2800 Bytes. " short_email_length: "Μέγεθος μικÏÎ¿Ï email σε Bytes" display_name_on_email_from: "Εμφάνισε πλήÏη ονόματα στα πεδία απoστολέα των email" @@ -1198,7 +1160,6 @@ el: delete_user_max_post_age: "Îα μην επιτÏέπεται η διαγÏαφή χÏηστών των οποίων η Ï€Ïώτη ανάÏτηση είναι τουλάχιστον (Χ) ημεÏών. " delete_all_posts_max: "Ο μέγιστος αÏιθμός αναÏτήσεων που μποÏοÏν να διαγÏαφοÏν με τη μία, χÏησιμοποιώντας το κουμπί ΔιαγÏαφή Όλων Των ΑναÏτήσεων. Αν ο αÏιθμός των αναÏτήσεων ενός χÏήστη υπεÏβαίνει τον μέγιστο αÏιθμό, τότε δεν μποÏόυν να διαγÏαφοÏν όλες οι αναÏτήσεις με τη μία και ο χÏήστης δεν μποÏεί να διαγÏαφεί. " email_editable: "Îα επιτÏέπεται στους χÏήστες η αλλαγή του email μετά την εγγÏαφή." - logout_redirect: "Τοποθεσία του διαδικτÏου όπου ανακατευθÏνεται το Ï€ÏόγÏαμμα πεÏιήγησης μετά την αποσÏνδεση (Ï€.χ.: http://somesite.com/logout)" allow_uploaded_avatars: "Îα επιτÏέπεται στους χÏήστες η μεταφόÏτωση εξατομικευμένων εικόνων Ï€Ïοφίλ. " allow_animated_avatars: "ΕπιτÏέπεται στους χÏήστες να χÏησιμοποιοÏν αÏχεία Ï„Ïπου animated gif για φωτογÏαφίες Ï€Ïοφίλ. ΠΡΟΣΟΧΗ: εκτελέστε τα avatars:refresh Î±Ï†Î¿Ï Î±Î»Î»Î¬Î¾ÎµÏ„Îµ αυτή τη ÏÏθμιση." allow_animated_thumbnails: "ΔημιουÏγεί κινοÏμενες μικÏογÏαφίες κινουμένων GIFs. " @@ -1367,68 +1328,65 @@ el: not_seen_in_a_month: "Καλώς ήλθες και πάλι! Δε σε έχουμε δει για αÏκετό καιÏÏŒ. Αυτά είναι τα πιο δημοφιλή νήματα συζητήσεων από την τελευταία σου επίσκεψη." merge_posts: edit_reason: - one: Μία δημοσίευση συγχωνεÏθηκε από %{username} - other: '%{count} δημοσιεÏσεις συγχωνεÏθηκαν από %{username}' + one: "Μία δημοσίευση συγχωνεÏθηκε από %{username}" + other: "%{count} δημοσιεÏσεις συγχωνεÏθηκαν από %{username}" errors: different_topics: "ΔημοσιεÏσεις που ανήκουν σε διαφοÏετικά νήματα δεν μποÏοÏν να συγχωνευθοÏν." different_users: "ΔημοσιεÏσεις που ανήκουν σε διαφοÏετικοÏÏ‚ χÏήστες δεν μποÏοÏν να συγχωνευθοÏν." move_posts: new_topic_moderator_post: - one: 'Μια ανάÏτηση διαχωÏίστηκε σε ένα νέο νήμα: %{topic_link}' - other: '%{count} αναÏτήσεις διαχωÏίσθηκαν σε ένα νέο νήμα: %{topic_link}' + one: "Μια ανάÏτηση διαχωÏίστηκε σε ένα νέο νήμα: %{topic_link}" + other: "%{count} αναÏτήσεις διαχωÏίσθηκαν σε ένα νέο νήμα: %{topic_link}" existing_topic_moderator_post: - one: 'Μία ανάÏτηση συγχωνεÏθηκε σε ένα υπάÏχον νήμα: %{topic_link}' - other: '%{count} αναÏτήσεις συγχωνεÏθηκαν σε ένα υπάÏχον νήμα: %{topic_link}' - change_owner: - post_revision_text: "Η κυÏιότητα μεταφέÏεται από %{old_user} σε %{new_user}." - deleted_user: "έναν διεγÏαμμένο χÏήστη" + one: "Μία ανάÏτηση συγχωνεÏθηκε σε ένα υπάÏχον νήμα: %{topic_link}" + other: "%{count} αναÏτήσεις συγχωνεÏθηκαν σε ένα υπάÏχον νήμα: %{topic_link}" topic_statuses: archived_enabled: "Αυτό το νήμα είναι τώÏα αÏχειοθετημένο. Έχει παγώσει και δεν μποÏεί να Ï„Ïοποποιηθεί με κανένα Ï„Ïόπο." archived_disabled: "Αυτό το νήμα δεν είναι τώÏα αÏχειοθετημένο. Δεν είναι πια παγωμένο και μποÏεί να Ï„Ïοποποιηθεί." closed_enabled: "Αυτό το νήμα είναι πια κλειστό. Οι απαντήσεις δεν είναι πλέον δυνατές" closed_disabled: "Αυτό το θέμα είναι τώÏα ανοικτό. ΕπιτÏέπονται νεές απαντήσεις." autoclosed_message_max_posts: - one: Αυτό το μήνυμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο της 1 απάντησης. - other: Αυτό το μήνυμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο των %{count} απαντήσεων. + one: "Αυτό το μήνυμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο της 1 απάντησης." + other: "Αυτό το μήνυμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο των %{count} απαντήσεων." autoclosed_topic_max_posts: - one: Αυτό το νήμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο της 1 απάντησης. - other: Αυτό το νήμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο των %{count} απαντήσεων. + one: "Αυτό το νήμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο της 1 απάντησης." + other: "Αυτό το νήμα έκλεισε αυτόματα Î±Ï†Î¿Ï Î­Ï†Ï„Î±ÏƒÎµ το μέγιστο ÏŒÏιο των %{count} απαντήσεων." autoclosed_enabled_days: - one: Αυτό το νήμα έκλεισε αυτόματα μετά από 1 ημέÏα. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. - other: Αυτό το νήμα έκλεισε αυτόματα μετά από %{count} ημέÏες. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. + one: "Αυτό το νήμα έκλεισε αυτόματα μετά από 1 ημέÏα. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." + other: "Αυτό το νήμα έκλεισε αυτόματα μετά από %{count} ημέÏες. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." autoclosed_enabled_hours: - one: Αυτό το νήμα έκλεισε αυτόματα μετά από 1 ÏŽÏα. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. - other: Αυτό το νήμα έκλεισε αυτόματα μετά από %{count} ÏŽÏες. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. + one: "Αυτό το νήμα έκλεισε αυτόματα μετά από 1 ÏŽÏα. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." + other: "Αυτό το νήμα έκλεισε αυτόματα μετά από %{count} ÏŽÏες. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." autoclosed_enabled_minutes: - one: Αυτό το νήμα έκλεισε αυτόματα μετά από 1 λεπτό. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. - other: Αυτό το νήμα έκλεισε αυτόματα μετά από %{count} λεπτά. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. + one: "Αυτό το νήμα έκλεισε αυτόματα μετά από 1 λεπτό. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." + other: "Αυτό το νήμα έκλεισε αυτόματα μετά από %{count} λεπτά. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." autoclosed_enabled_lastpost_days: - one: Αυτό το νήμα έκλεισε αυτόματα 1 ημέÏα μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις. - other: Αυτό το νήμα έκλεισε αυτόματα %{count} ημέÏες μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις. + one: "Αυτό το νήμα έκλεισε αυτόματα 1 ημέÏα μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις." + other: "Αυτό το νήμα έκλεισε αυτόματα %{count} ημέÏες μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις." autoclosed_enabled_lastpost_hours: - one: Αυτό το νήμα έκλεισε αυτόματα 1 ÏŽÏα μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις. - other: Αυτό το νήμα έκλεισε αυτόματα %{count} ÏŽÏες μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις. + one: "Αυτό το νήμα έκλεισε αυτόματα 1 ÏŽÏα μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις." + other: "Αυτό το νήμα έκλεισε αυτόματα %{count} ÏŽÏες μετά την τελευταία απάντηση. Δεν επιτÏέπονται πλέον νέες απαντήσεις." autoclosed_enabled_lastpost_minutes: - one: Αυτό το νήμα έκλεισε αυτόματα 1 λεπτό μετά την τελευταία απάντηση. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις. - other: Αυτό το νήμα έκλεισε αυτόματα %{count} λεπτά μετά την τελευταία απάντηση. Δεν επιτÏέπονται πια νέες απαντήσεις. + one: "Αυτό το νήμα έκλεισε αυτόματα 1 λεπτό μετά την τελευταία απάντηση. Δεν επιτÏέπονται πια καινοÏÏιες απαντήσεις." + other: "Αυτό το νήμα έκλεισε αυτόματα %{count} λεπτά μετά την τελευταία απάντηση. Δεν επιτÏέπονται πια νέες απαντήσεις." autoclosed_disabled_days: - one: Το νήμα αυτό ανοίχτηκε αυτόματα μετά από 1 ημέÏα. - other: Το νήμα αυτό ανοίχτηκε αυτόματα μετά από %{count} ημέÏες. + one: "Το νήμα αυτό ανοίχτηκε αυτόματα μετά από 1 ημέÏα." + other: "Το νήμα αυτό ανοίχτηκε αυτόματα μετά από %{count} ημέÏες." autoclosed_disabled_hours: - one: Το νήμα αυτό ανοίχτηκε αυτόματα μετά από 1 ÏŽÏα. - other: Το νήμα αυτό ανοίχτηκε αυτόματα μετά από %{count} ÏŽÏες. + one: "Το νήμα αυτό ανοίχτηκε αυτόματα μετά από 1 ÏŽÏα." + other: "Το νήμα αυτό ανοίχτηκε αυτόματα μετά από %{count} ÏŽÏες." autoclosed_disabled_minutes: - one: Το νήμα αυτό ανοίχτηκε αυτόματα μετά από 1 λεπτό. - other: Το νήμα αυτό ανοίχτηκε αυτόματα μετά από %{count} λεπτά. + one: "Το νήμα αυτό ανοίχτηκε αυτόματα μετά από 1 λεπτό." + other: "Το νήμα αυτό ανοίχτηκε αυτόματα μετά από %{count} λεπτά." autoclosed_disabled_lastpost_days: - one: Το νήμα αυτό ανοίχτηκε αυτόματα 1 ημέÏα μετά την τελευταία απάντηση. - other: Το νήμα αυτό ανοίχτηκε αυτόματα %{count} ημέÏες μετά την τελευταία απάντηση. + one: "Το νήμα αυτό ανοίχτηκε αυτόματα 1 ημέÏα μετά την τελευταία απάντηση." + other: "Το νήμα αυτό ανοίχτηκε αυτόματα %{count} ημέÏες μετά την τελευταία απάντηση." autoclosed_disabled_lastpost_hours: - one: Το νήμα αυτό ανοίχτηκε αυτόματα 1 ÏŽÏα μετά την τελευταία απάντηση. - other: Το νήμα αυτό ανοίχτηκε αυτόματα %{count} ÏŽÏες μετά την τελευταία απάντηση. + one: "Το νήμα αυτό ανοίχτηκε αυτόματα 1 ÏŽÏα μετά την τελευταία απάντηση." + other: "Το νήμα αυτό ανοίχτηκε αυτόματα %{count} ÏŽÏες μετά την τελευταία απάντηση." autoclosed_disabled_lastpost_minutes: - one: Το νήμα αυτό ανοίχτηκε αυτόματα 1 λεπτό μετά την τελευταία απάντηση. - other: Το νήμα αυτό ανοίχτηκε αυτόματα %{count} λεπτά μετά την τελευταία απάντηση. + one: "Το νήμα αυτό ανοίχτηκε αυτόματα 1 λεπτό μετά την τελευταία απάντηση." + other: "Το νήμα αυτό ανοίχτηκε αυτόματα %{count} λεπτά μετά την τελευταία απάντηση." autoclosed_disabled: "Αυτό το νήμα είναι τώÏα ανοικτό. ΕπιτÏέπονται νέες απαντήσεις." autoclosed_disabled_lastpost: "Αυτό το νήμα είναι τώÏα ανοικτό. ΕπιτÏέπονται νέες απαντήσεις." pinned_enabled: "Αυτό το νήμα είναι τώÏα καÏφιτσωμένο. Θα εμφανίζεται στην κοÏυφή της κατηγοÏίας του έως ότου ξεκαÏφιτσωθεί από τους συνεÏγάτες για όλους ή από τους χÏήστες για τον εαυτό τους." @@ -1464,7 +1422,6 @@ el: click_to_continue: "Κλικ εδώ για να συνεχίσετε." already_logged_in: "Ουπς, φαίνεται ότι Ï€Ïοσπαθείς να αποδεχθείς μια Ï€Ïόσκληση για άλλον χÏήστη. Εάν δεν εισαι %{current_user}, παÏακαλώ αποσυνδέσου και δοκίμασε ξανά." user: - no_accounts_associated: "Δεν υπάÏχουν σχετικοί λογαÏιασμοί" deactivated: "ΑπενεÏγοποιήθηκε εξαιτίας των πολλών μηνυμάτων email που επέστÏεψαν πίσω στο %{email}'." deactivated_by_staff: "ΑπενεÏγοποιήθηκε από τους συνεÏγάτες" activated_by_staff: "ΕνεÏγοποιήθηκε από τους συνεÏγάτες" @@ -1492,11 +1449,11 @@ el: auto_rejected: "ΑποÏÏίφθηκε αυτόματα λόγω παλαιότητας. Δες την ÏÏθμιση auto_handle_queued_age της ιστοσελίδας." flags_reminder: flags_were_submitted: - one: Οι σημάνσεις έχουν καταχωÏηθεί πάνω από 1 ÏŽÏα Ï€Ïιν. [ΠαÏακαλοÏμε ελέγξτε τις](/admin/flags). - other: Οι σημάνσεις έχουν καταχωÏηθεί πάνω από %{count} ÏŽÏες Ï€Ïιν. [ΠαÏακαλοÏμε ελέγξτε τις](/admin/flags). + one: "Οι σημάνσεις έχουν καταχωÏηθεί πάνω από 1 ÏŽÏα Ï€Ïιν. [ΠαÏακαλοÏμε ελέγξτε τις](/admin/flags)." + other: "Οι σημάνσεις έχουν καταχωÏηθεί πάνω από %{count} ÏŽÏες Ï€Ïιν. [ΠαÏακαλοÏμε ελέγξτε τις](/admin/flags)." subject_template: - one: 1 επισήμανση πεÏιμένει να διαχειÏιστεί - other: '%{count} επισημάνσεις πεÏιμένουν να διαχειÏιστοÏν' + one: "1 επισήμανση πεÏιμένει να διαχειÏιστεί" + other: "%{count} επισημάνσεις πεÏιμένουν να διαχειÏιστοÏν" unsubscribe_mailer: title: "ΑπεγγÏαφή" subject_template: "Επιβεβαιώστε ότι δε θέλετε να λαμβάνετε πλέον ενημεÏώσεις μέσω email από %{site_title}" @@ -1565,17 +1522,14 @@ el: deferred: "ΕυχαÏιστοÏμε που μας ειδοποιήσατε. Το εξετάζουμε." deferred_and_deleted: "ΕυχαÏιστοÏμε που μας ειδοποιήσατε. Έχουμε αφαιÏέσει τη δημοσίευση." temporarily_closed_due_to_flags: - one: Αυτό το νήμα έχει κλείσει Ï€ÏοσωÏινά για 1 ÏŽÏα λόγω μεγάλου αÏÎ¹Î¸Î¼Î¿Ï ÏƒÎ·Î¼Î¬Î½ÏƒÎµÏ‰Î½ από την κοινότητα. - other: Αυτό το νήμα έχει κλείσει Ï€ÏοσωÏινά για %{count} ÏŽÏες λόγω μεγάλου αÏÎ¹Î¸Î¼Î¿Ï ÏƒÎ·Î¼Î¬Î½ÏƒÎµÏ‰Î½ από την κοινότητα. + one: "Αυτό το νήμα έχει κλείσει Ï€ÏοσωÏινά για 1 ÏŽÏα λόγω μεγάλου αÏÎ¹Î¸Î¼Î¿Ï ÏƒÎ·Î¼Î¬Î½ÏƒÎµÏ‰Î½ από την κοινότητα." + other: "Αυτό το νήμα έχει κλείσει Ï€ÏοσωÏινά για %{count} ÏŽÏες λόγω μεγάλου αÏÎ¹Î¸Î¼Î¿Ï ÏƒÎ·Î¼Î¬Î½ÏƒÎµÏ‰Î½ από την κοινότητα." system_messages: private_topic_title: "Îήμα #%{id}" contents_hidden: "ΠαÏακαλώ επισκεφθείτε αυτή την ανάÏτηση για να δείτε τα πεÏιεχόμενά της." post_hidden: title: "Η ανάÏτηση κÏÏφτηκε" subject_template: "Η ανάÏτηση κÏÏφτηκε λόγω των επισημάνσεων της κοινότητας" - usage_tips: - text_body_template: | - Με την συμμετοχή σου στην κοινότητα θα γνωÏιστοÏμε καλÏτεÏα και οι πεÏιοÏισμοί που έχεις ως νεός χÏήστης θα αÏθοÏν. Με τον καιÏÏŒ θα σου δοθοÏν πεÏισσότεÏα δικαιώματα και νέες δυνατότητες με τις οποίες θα μποÏείς κι ÎµÏƒÏ Î½Î± μας βοηθήσεις να κάνουμε μαζί την κοινότητά μας καλÏτεÏη. welcome_user: title: "ΚαλωσόÏισμα ΧÏήστη" subject_template: "Καλώς ήλθατε στην %{site_name}!" @@ -1844,14 +1798,6 @@ el: too_many_spam_flags: title: "ΠάÏα πολλές επισημάνσεις ανεπιθÏμητης αλληλογÏαφίας." subject_template: "ΚαινοÏÏιος λογαÏιασμός σε αναμονή" - text_body_template: | - Γεια σου, - - Αυτό είναι αυτοματοποιημένο μήνυμα από %{site_name} για να σε ενημεÏώσει ότι οι αναÏτήσεις σου έχουν αποκÏυφθεί επειδή επισημάνθηκαν από την κοινότητα. - - Ως μέτÏο Ï€Ïοστασίας, ο νέος σου λογαÏιασμός είναι σε σιγή και δε μποÏείς να δημιουÏγήσεις νέες απαντήσεις ή νήματα έως ότου ένας συνεÏγάτης μποÏέσει να εξετάσει το λογαÏιασμό σου. ΖητοÏμε συγνώμη για την ταλαιπωÏία. - - Για επιπλέον καθοδήγηση, παÏακαλοÏμε ανάτÏεξε στον [οδηγό χÏήσης](%{base_url}/guidelines). too_many_tl3_flags: title: "ΠάÏα πολλές επισημάνσεις ΕΕ3 " subject_template: "ΚαινοÏÏιος λογαÏιασμός σε αναμονή" @@ -1897,8 +1843,8 @@ el: pending_users_reminder: title: "ΥπενθÏμηση για χÏήστες που εκκÏεμοÏν" subject_template: - one: 1 χÏήστης πεÏιμένει για έγκÏιση - other: '%{count} χÏήστες πεÏιμένουν για έγκÏιση' + one: "1 χÏήστης πεÏιμένει για έγκÏιση" + other: "%{count} χÏήστες πεÏιμένουν για έγκÏιση" text_body_template: | ΥπάÏχουν εγγÏαφές νέων χÏηστών σε αναμονή έγκÏισης (΄ή απόÏÏιψης) Ï€Ïιν μποÏέσουν να έχουν Ï€Ïόσβαση σε αυτό το φόÏουμ. @@ -1926,8 +1872,8 @@ el: queued_posts_reminder: title: "ΥπενθÏμιση ΟυÏάς ΑναÏτήσεων" subject_template: - one: 1 ανάÏτηση σε αναμονή για έλεγχο - other: '%{count} αναÏτήσεις σε αναμονή για έλεγχο' + one: "1 ανάÏτηση σε αναμονή για έλεγχο" + other: "%{count} αναÏτήσεις σε αναμονή για έλεγχο" text_body_template: | Γεια σου, @@ -1947,17 +1893,15 @@ el: user_notifications: previous_discussion: "ΠÏοηγοÏμενες Απαντήσεις" reached_limit: - one: 'ΕνημέÏωση: Στέλνουμε το μέγιστο 1 email καθημεÏινά. Ελέγξτε την ιστοσελίδα για να δείτε αυτά που πιθανώς έχουν κÏατηθεί. ' - other: 'ΕνημέÏωση: Στέλνουμε το μέγιστο %{count} emails καθημεÏινά. Ελέγξτε την ιστοσελίδα για να δείτε αυτά που πιθανώς έχουν κÏατηθεί. ΥΓ ευχαÏιστοÏμε που είστε τόσο δημοφιλής!' + one: "ΕνημέÏωση: Στέλνουμε το μέγιστο 1 email καθημεÏινά. Ελέγξτε την ιστοσελίδα για να δείτε αυτά που πιθανώς έχουν κÏατηθεί. " + other: "ΕνημέÏωση: Στέλνουμε το μέγιστο %{count} emails καθημεÏινά. Ελέγξτε την ιστοσελίδα για να δείτε αυτά που πιθανώς έχουν κÏατηθεί. ΥΓ ευχαÏιστοÏμε που είστε τόσο δημοφιλής!" in_reply_to: "Απάντηση Σε" unsubscribe: title: "ΑπεγγÏαφή" description: "Δεν ενδιαφέÏεσαι να λαμβάνεις αυτά τα email; Κανένα Ï€Ïόβλημα! Κάνε κλικ στο παÏακάτω για να απεγγÏαφείς στη στιγμή:" reply_by_email: "[Επισκέψου το νήμα](%{base_url}%{url}) ή απάντησε σε αυτό το email για να αποκÏιθείς." - reply_by_email_pm: "[Επισκέψου την ανάÏτηση](%{base_url}%{url}) ή απάντησε σε αυτό το email για να αποκÏιθείς." only_reply_by_email: "Απαντήστε σε αυτό το email για να αποκÏιθείς." visit_link_to_respond: "[Επισκέψου το νήμα](%{base_url}%{url}) για να αποκÏιθείς." - visit_link_to_respond_pm: "[Επισκέψου την ανάÏτηση](%{base_url}%{url}) για να αποκÏιθείς." posted_by: "ΑναÏτήθηκε από %{username} στις %{post_date}" invited_group_to_private_message_body: | Ο/Η %{username} Ï€Ïοσκάλεσε @%{group_name} σε ένα μήνυμα @@ -2265,7 +2209,6 @@ el: recent_topics: "ΠÏόσφατα" see_more: "ΠεÏισσότεÏα" search_title: "Αναζήτηση στην ιστοσελίδα" - search_google: "Google" offline: title: "Cannot load app" offline_page_message: "Πιθανώς βÏίσκεσαι εκτός σÏνδεσης! Έλεγξε την σÏνδεσή σου και δοκίμασε ξανά." @@ -2299,32 +2242,11 @@ el: flag_reason: sockpuppet: "Ένας νέος χÏήστης δημιοÏÏγησε ένα νήμα και ένας άλλος νέος χÏήσης με την ίδια διεÏθυνση IP (%{ip_address}) απάντησε. Δες τις Ïυθμίσεις ιστοτόπου `flag_sockpuppets`." spam_hosts: "Αυτός ο νέος χÏήστης Ï€Ïοσπάθησε να δημιουÏγήσει πολλαπλές αναÏτήσεις με συνδέσμους Ï€Ïος το ίδιο domain (%{domain}). Δες τις Ïυθμίσεις ιστοτόπου `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "Ο χÏήστης της ανάÏτησης έχει διαγÏαφεί." - no_user: "Δεν μποÏεί να βÏεθει χÏήστης με id %{user_id}" - anonymous_user: "Ο χÏήστης είναι ανώνυμος" - suspended_not_pm: "Ο χÏήστης έχει ανασταλεί, δεν είναι μήνυμα" - seen_recently: "Ο χÏήστης εμφανίστηκε Ï€Ïόσφατα" - post_not_found: "Δεν μποÏεί να βÏεθεί ανάÏτηση με id %{post_id}" - notification_already_read: "Η ειδοποίηση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… email έχει ήδη διαβαστεί" - topic_nil: "post.topic είναι κενό" - post_deleted: "η ανάÏτηση διεγÏάφη από τον συγγÏαφέα" - user_suspended: "ο χÏήστης είχε ανασταλεί" - already_read: "ο χÏήστης έχει ήδη διαβάσει την ανάÏτηση" - exceeded_emails_limit: "ΥπέÏβαση max_emails_per_day_per_user" - exceeded_bounces_limit: "ΥπέÏβαση bounce_score_threshold" - message_blank: "το μήνυμα είναι κενό" - message_to_blank: "message.to είναι κενό" - text_part_body_blank: "text_part.body είναι κενό" - body_blank: "body είναι κενό" - no_echo_mailing_list_mode: "Οι ειδοποιήσεις λίστας email είναι απενεÏγοποιημένες για τις αναÏτήσεις του ίδιου του χÏήστη." color_schemes: base_theme_name: "Βάση" - default: "ΑνοιχτόχÏωμος Συνδυασμός" dark: "ΣκουÏόχÏωμος Συνδυασμός" - default_theme_name: "ΠÏοεπιλογή" - dark_theme_name: "ΣκοÏÏο" light_theme_name: "Ανοιχτό" + dark_theme_name: "ΣκοÏÏο" about: "Σχετικά" guidelines: "Οδηγίες" privacy: "Ιδιωτικότητα" @@ -2524,78 +2446,41 @@ el: editor: name: Συντάκτης description: ΠÏώτη επεξεÏγασία ανάÏτησης - long_description: | - Αυτό το παÏάσημο δίνεται την Ï€Ïώτη φοÏά που επεξεÏγάζεσαι μία από τις αναÏτήσεις σου. Δεν θα έχεις τη δυνατότητα να επεξεÏγάζεσαι τις αναÏτήσεις σου για πάντα, όμως η επεξεÏγασία είναι πάντα καλή ιδέα. ΜποÏείς να βελτιώσεις τις αναÏτήσεις σου, να διοÏθώσεις μικÏά λάθη ή να Ï€Ïοσθέσεις οτιδήποτε σου διέφυγε όταν έκανες την ανάÏτηση. ΕπεξεÏγάσου τις αναÏτήσεις σου για να τις κάνεις ακόμη καλÏτεÏες! basic_user: name: ΑÏχάÏιος - description: ΠαÏαχωÏήθηκαν όλες οι βασικές λειτουÏγίες της κοινότητας - long_description: | - Αυτό το παÏάσημο δίνεται όταν φτάσεις το 1ο επίπεδο εμπιστοσÏνης. ΕυχαÏιστοÏμε που μένεις μαζί μας για λίγο και διαβάζεις νήματα για να μάθεις σχετικά με την κοινότητά μας. Οι πεÏιοÏισμοί νέου χÏήστη έχουν αφαιÏεθεί. Όλες οι βασικές δυνατότητες της κοινότητας σου έχουν δοθεί, όπως Ï€Ïοσωπικά μηνÏματα, επισημάνσεις, επεξεÏγασία του wiki και δυνατότητα ανάÏτησης πολλαπλών εικόνων και συνδέσμων. member: name: Μέλος - description: "ΠαÏαχωÏήθηκε δυνατότητα για αποστολή Ï€Ïοσκλήσεων, μηνÏματα ομάδας, πεÏισσότεÏα μου αÏέσει" - long_description: | - Αυτό το παÏάσημο δίνεται όταν φτάσεις το 2ο επίπεδο εμπιστοσÏνης. ΕυχαÏιστοÏμε που συμμετέχεις και είσαι μέλος της κοινότητας μας εδώ και κάποιες εβδομάδες. ΜποÏείς πλέον να στέλνεις Ï€Ïοσκλήσεις από την σελίδα χÏήστη σου ή από ατομικά νήματα, να δημιουÏγείς ομαδικά Ï€Ïοσωπικά μηνÏματα και να έχεις λίγα πεÏισσότεÏα "μου αÏέσει" ημεÏησίως. regular: name: Τακτικός - description: "ΠαÏαχωÏήθηκε δυνατότητα για επανακατηγοÏιοποίηση, μετονομασία, ακολοÏθηση συνδέσμων, wiki, πεÏισσότεÏα \"μου αÏέσει\"" - long_description: | - Αυτό το παÏάσημο δίνεται όταν φτάσεις το 3ο επίπεδο εμπιστοσÏνης. ΕυχαÏιστοÏμε που είσαι τακτικό μέλος της κοινότητάς μας εδώ και μήνες. Είσαι πλέον ένας από τους πιο ενεÏγοÏÏ‚ αναγνώστες και έμπιστα συμβάλλεις να γίνει η κοινότητά μας υπέÏοχη. ΜποÏείς πλέον να ανακατηγοÏιοποιήσεις και να μετονομάσεις νήματα, να εκμεταλλευτείς πιο ισχυÏές επισημάνσεις, να έχεις Ï€Ïόσβαση σε ιδιωτική πεÏιοχή χαλάÏωσης και επιπλέον θα παίÏνεις Ï€Î¿Î»Ï Ï€ÎµÏισσότεÏα "μου αÏέσει" ημεÏησίως. leader: name: ΑÏχηγός - description: "ΠαÏαχωÏήθηκε δυνατότητα για καθολική επεξεÏγασία, καÏφίτσωμα, κλείσιμο, αÏχειοθέτηση, διαχωÏισμό και συγχώνευση, πεÏισσότεÏα μου αÏέσει" - long_description: | - Αυτό το παÏάσημο δίνεται όταν φτάσεις το 4ο επίπεδο εμπιστοσÏνης. Οι συνεÏγάτες έχουν επιλέξει να είσαι αÏχηγός αυτής της κοινότητας και δίνεις το καλό παÏάδειγμα για την υπόλοιπη κοινότητα με τις Ï€Ïάξεις και τα λεγόμενά σου. Έχεις τη δυνατότητα να επεξεÏγαστείς όλες τις αναÏτήσεις, να συντονίσεις νήματα μέσω καÏφιτσώματος, κλεισίματος, αÏχειοθέτησης, αφαίÏεσης κατηγοÏιοποίησης, διαίÏεσης και συγχώνευση καθώς επίσης και τόνους "μου αÏέσει" κάθε μέÏα. welcome: name: ΚαλωσόÏισμα description: Έλαβε ένα "Μου αÏέσει" - long_description: |+ - Το παÏάσημο χοÏηγείται όταν λαμβάνεις το Ï€Ïώτο σου "Μου αÏέσει" σε μια ανάÏτηση. ΣυγχαÏητήÏια, δημοσίευσες κάτι που τα υπόλοιπα μέλη της κοινότητας βÏήκαν ενδιαφέÏον, ωÏαίο ή χÏήσιμο! - autobiographer: name: ΑυτοβιογÏάφος description: "ΣυμπλήÏωσε τις πληÏοφοÏίες του Ï€Ïοφίλ" - long_description: | - Αυτό το παÏάσημο χοÏηγείται όταν συμπληÏώσεις το Ï€Ïοφίλ σου και επιλέξεις μια φωτογÏαφία Ï€Ïοφίλ. ΕπιτÏέποντας στην κοινότητα να μάθει λίγα πεÏισσότεÏα για σένα και τα ενδιαφέÏοντά σου, βοηθάει στην δημιουÏγία μιας καλÏτεÏης, πιο διασυνδεμένης κοινότητας. anniversary: name: Επέτειος description: ΕνεÏγό μέλος για ένα χÏόνο με τουλάχιστον μια ανάÏτηση - long_description: |+ - Το παÏάσημο χοÏηγείται όταν είσαι μέλος για ένα χÏόνο με τουλάχιστον μια ανάÏτηση σε αυτόν τον χÏόνο. ΕυχαÏιστοÏμε που έμεινες Ï„ÏιγÏÏω και για την συνεισφοÏά σου στην κοινότητα. Δε θα μποÏοÏσαμε να κάνουμε χωÏίς εσένα! - nice_post: name: Καλή Απάντηση description: Έλαβε 10 "Μου αÏέσει" σε μια απάντηση - long_description: |+ - Το παÏάσημο χοÏηγείται όταν η απάντηση σου παίÏνει 10 "Μου αÏέσει". Η απάντησή σου άÏεσε στην κοινότητα και βοήθησε τη συζήτηση να πάει μπÏοστά! - good_post: name: Î Î¿Î»Ï ÎšÎ±Î»Î® Απάντηση description: "Έλαβε 25 \"Μου αÏέσει\" σε μια απάντηση " - long_description: | - Το παÏάσημο χοÏηγείται όταν η απάντησή σου παίÏνει 25 ¨Μου αÏέσει". Η απάντησή σου ήταν εξαιÏετική και έκανε τη συζήτηση Ï€Î¿Î»Ï ÎºÎ±Î»ÏτεÏη για όλους! great_post: name: ΥπέÏοχη Απάντηση description: Έλαβε 50 "Μου αÏέσει" σε μια απάντηση - long_description: | - Το παÏάσημο χοÏηγείται όταν η απάντησή σου παίÏνει 50 "Μου αÏέσει". Ουάου! Η απάντησή σου Ï€Ïοκάλεσε έμπνευση, ήταν μαγευτική ή διοÏατική και η κοινότητά μας τη λάτÏεψε. nice_topic: name: Καλο Îήμα description: Έλαβε 10 "Μου αÏέσει" σε ένα νήμα - long_description: |+ - Το παÏάσημο χοÏηγείται όταν το νήμα σου παίÏνει 10 "Μου αÏέσει". Όπως φαίνεται, ξεκίνησες μια ενδιαφέÏουσα συζήτηση που άÏεσε στην κοινότητα! - good_topic: name: Î Î¿Î»Ï ÎšÎ±Î»ÏŒ Îήμα description: Έλαβε 25 "Μου αÏέσει" σε ένα νήμα - long_description: | - Αυτό το παÏάσημο δίνεται όταν το νήμα σου φτάνει τα 25 "μου αÏέσει". Ξεκίνησες μια έντονη συζήτηση γÏÏω από την οποία η κοινότητα συγκεντÏώθηκε και την αγάπησε! great_topic: name: ΥπέÏοχο Îήμα description: Έλαβε 50 "Μου αÏέσει" σε ένα νήμα - long_description: |+ - Το παÏάσημο χοÏηγείται όταν το νήμα σου παίÏνει 50 "Μου αÏέσει". Ξεκίνησες μια συναÏπαστική συζήτηση και η κοινότητα απόλαυσε τη δυναμική κουβέντα που δημιουÏγήθηκε! - nice_share: name: Καλή Κοινοποίηση description: Κοινοποίησε μια ανάÏτηση με 25 μοναδικοÏÏ‚ επισκέπτες @@ -2604,15 +2489,9 @@ el: good_share: name: Î Î¿Î»Ï ÎšÎ±Î»Î® Κοινοποίηση description: Κοινοποίησε μια δημοσίευση με 300 μοναδικοÏÏ‚ επισκέπτες - long_description: |+ - Αυτό το παÏάσημο χοÏηγείται για την κοινοποίηση ενός συνδέσμου στον οποίον έκαναν κλικ 300 εξωτεÏικοί επισκέπτες. ΜπÏάβο σου! Έχεις οδηγήσει ένα πλήθος νέου κόσμου να γνωÏίσει τις συζητήσεις μας βοηθώντας έτσι την κοινότητά μας να μεγαλώσει. - great_share: name: ΥπέÏοχη Κοινοποίηση description: Κοινοποίησε μια δημοσίευση με 1000 μοναδικοÏÏ‚ επισκέπτες - long_description: |+ - Αυτό το παÏάσημο χοÏηγείται για την κοινοποίηση ενός συνδέσμου στον οποίον έκαναν κλικ 1000 εξωτεÏικοί επισκέπτες.. Ουάου! Έχεις Ï€Ïοωθήσει μια ενδιαφέÏουσα συζήτηση σε ένα τεÏάστιο νέο κοινό, βοηθώντας έτσι την κοινότητά μας να μεγαλώσει σε μεγάλο βαθμό! - first_like: name: ΠÏώτο "Μου αÏέσει" description: «Μου άÏεσε» μια ανάÏτηση @@ -2622,23 +2501,15 @@ el: first_flag: name: ΠÏώτη Επισήμανση description: Επισήμανε μια ανάÏτηση - long_description: | - Αυτό το παÏάσημο χοÏηγείται την Ï€Ïώτη φοÏά που επισημαίνεις μια ανάÏτηση. Με τις επισημάνσεις βοηθάμε όλοι να παÏαμένει η κοινότητα καθαÏή για όλους. Εάν παÏατηÏήσεις οποιαδήποτε ανάÏτηση που απαιτεί έλεγχο από συντονιστή για οποιοδήποτε λόγο, σε παÏακαλοÏμε μην διστάσεις να την επισημάνεις. ΜποÏείς επίσης να επισημάνεις για να στείλεις Ï€Ïοσωπικά μηνÏματα σε άλλους χÏήστες εάν βÏεις κάποιο Ï€Ïόβλημα με την ανάÏτησή τους. Εάν βÏεις οποιοδήποτε Ï€Ïόβλημα, :flag_black: επισήμανέ το! promoter: name: ΠÏοωθητής description: ΠÏοσκάλεσε ένα χÏήστη campaigner: name: ΕκστÏατεÏων description: ΠÏοσκάλεσε 3 βασικοÏÏ‚ χÏήστες - long_description: |+ - Το παÏάσημο χοÏηγείται όταν έχεις Ï€Ïοσκαλέσει 3 άτομα, τα οποία στην συνέχεια πέÏασαν αÏκετό χÏόνο στην ιστοσελίδα και έγιναν βασικοί χÏήστες. Μια ζωηÏή κοινότητα χÏειάζεται την τακτική εισÏοή νεων χÏηστών σε αυτήν και με την συμμετοχή τους να Ï€Ïοσθέτουν καινοÏÏιες φωνές στη συζήτηση. - champion: name: "ΠÏωταθλητής " description: ΠÏοσκάλεσε 5 μέλη - long_description: |+ - Το παÏάσημο χοÏηγείται όταν έχεις Ï€Ïοσκαλέσει 5 άτομα, τα οποία στην συνέχεια πέÏασαν αÏκετό χÏόνο στην ιστοσελίδα και έγιναν κανονικοί χÏήστες. Ουάου! ΕυχαÏιστοÏμε που επέκτεινες την ποικιλία της κοινότητάς μας με καινοÏÏια μέλη! - first_share: name: ΠÏώτη Κοινοποίηση description: Κοινοποίησε μια δημοσίευση @@ -2654,14 +2525,9 @@ el: first_quote: name: ΠÏώτη ΠαÏάθεση description: ΠαÏάθεσε μια ανάÏτηση - long_description: | - Αυτό το παÏάσημο δίνεται την Ï€Ïώτη φοÏά που παÏαθέτεις μια ανάÏτηση σε μια απάντησή σου. ΠαÏαθέτοντας σχετικά τμήματα από Ï€ÏοηγοÏμενες αναÏτήσεις στην απάντησή σου, βοηθάει να παÏαμένουν οι συζητήσεις συνδεδεμένες και εντός θέματος. Ο πιο εÏκολος Ï„Ïόπος να παÏαθέσεις, είναι να μαÏκάÏεις ένα τμήμα από μια ανάÏτηση και έπειτα να πατήσεις κάποιο πλήκτÏο απάντησης. ΠαÏαθέστε ελεÏθεÏα! read_guidelines: name: Διάβασε τις Οδηγίες description: "Διάβασε τις οδηγίες χÏήσης της κοινότητας" - long_description: |+ - Το παÏάσημο χοÏηγείται για την ανάγνωση των οδηγιών χÏήσης της κοινότητας. Ακολουθώντας και κοινοποιώντας αυτές τις απλές οδηγίες σε βοηθά να χτίσεις μια ασφαλή, διασκεδαστική και βιώσιμη κοινότητα για όλους. Îα θυμάσαι πάντα ότι υπάÏχει κάποιος άλλος άνθÏωπος, Ï€Î¿Î»Ï ÏŒÎ¼Î¿Î¹Î¿Ï‚ με εσένα, στην άλλη πλευÏά της οθόνης. Îα είσαι καλός! - reader: name: Αναγνώστης description: Διάβασε κάθε απάντηση σε ένα νήμα με πεÏισσότεÏες από 100 απαντήσεις @@ -2714,8 +2580,6 @@ el: crazy_in_love: name: ΤÏελή Αγάπη description: ΧÏησιμοποίησε 50 "Μου αÏέσει" σε μια ημέÏα 20 φοÏές - long_description: | - Το παÏάσημο χοÏηγείται όταν χÏησιμοποιείς όλα τα 50 "Μου αÏέσει" που έχεις ημεÏησίως για 20 ημέÏες. Ουάου! Είσαι υπόδειγμα τακτικής ενθάÏÏυνσης των μελών της κοινότητάς σου! thank_you: name: ΕυχαÏιστεί description: Έχει σε 20 δημοσιεÏσεις "Μου αÏέσει" και πάτησε 10 "Μου αÏέσει" @@ -2729,19 +2593,15 @@ el: empathetic: name: ΛατÏεία description: "Έχει σε 500 δημοσιεÏσεις \"Μου αÏέσει\" και πάτησε 1000 \"Μου αÏέσει\" " - long_description: | - Το παÏάσημο χοÏηγείται όταν έχεις 500 "Μου αÏέσει" σε δημοσιεÏσεις και δίνεις 1000 ή πεÏισσότεÏα "Μου αÏέσει" σε αντάλλαγμα. Ουάου! Είσαι υπόδειγμα γενναιοδωÏίας και αμοιβαίας εκτίμησης :two_hearts:. first_emoji: name: ΠÏώτο Emoji description: ΧÏησιμοποίησε ένα Emoji σε μια ανάÏτηση first_mention: name: ΠÏώτη ΑναφοÏά description: ΑνέφεÏε έναν χÏήστη σε μία ανάÏτηση - long_description: "Αυτό το παÏάσημο δίνεται την Ï€Ïώτη φοÏά που αναφέÏεις το @όνομα κάποιου στην ανάÏτησή σου. Κάθε αναφοÏά δημιουÏγεί μια ειδοποίηση σε αυτό το άτομο, ώστε να μάθουν για την ανάÏτησή σου. Απλώς ξεκίνα να πληκτÏολογείς το @ (at σÏμβολο) για να αναφέÏεις οποιοδήποτε χÏήστη ή εάν επιτÏέπεται, μια ομάδα. Είναι ένας βολικός Ï„Ïόπος να Ï„Ïαβήξεις την Ï€Ïοσοχή τους σε κάτι. " first_onebox: name: ΠÏώτο Onebox description: ΑναÏτήθηκε σÏνδεσμος ο οποίος είναι oneboxed - long_description: "Αυτό το παÏάσημο δίνεται την Ï€Ïώτη φοÏά που αναÏτείς ένα σÏνδεσμο μόνο του σε μια γÏαμμή, το οποίο αυτόματα αναπτÏσσεται σε onebox με μια σÏντονη πεÏίληψη του συνδέσμου, ένα τίτλο και (όπου αυτό είναι διαθέσιμο) μια εικόνα. " first_reply_by_email: name: ΠÏώτη Απάντηση μέσω Email description: Απάντησε σε μία ανάÏτηση μέσω email @@ -2755,15 +2615,12 @@ el: enthusiast: name: Θιασώτης description: 10 ημέÏες επισκέψεων - long_description: Αυτό το παÏάσημο σας απονέμεται για 10 ημέÏες επισκέψεων. ΕυχαÏιστοÏμε που μείνατε μαζί μας για πάνω από μία εβδομάδα! aficionado: name: Οπαδός description: 100 ημέÏες επισκέψεων - long_description: Αυτό το παÏάσημο σας απονέμεται για 100 ημέÏες επισκέψεων. ΠεÏισσότεÏο από Ï„Ïεις μήνες! devotee: name: ΛάτÏης description: 365 ημέÏες επισκέψεων - long_description: "Αυτό το παÏάσημο σας απονέμεται για 365 ημέÏες επισκέψεων. Γουάου, ένας ολόκληÏος χÏόνος!" badge_title_metadata: "%{display_name} παÏάσημο στην %{site_title}" admin_login: success: "Το Email Στάλθηκε" @@ -2783,7 +2640,6 @@ el: button: "ΕγγÏαφή" title: "ΕγγÏαφή ΛογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î”Î¹Î±Ï‡ÎµÎ¹Ïιστή" help: "κάνε εγγÏαφή με ένα καινοÏÏιο λογαÏιασμό για να ξεκινήσεις" - no_emails: "Δυστυχώς, δεν οÏίστηκε καμιά διεÏθυνση email διαχειÏιστή κατά τη διάÏκεια της εγκατάστασης, έτσι η ολοκλήÏωση της διαμόÏφωσης ίσως να είναι δÏσκολη." confirm_email: title: "Επιβεβαίωσε το email σου" message: "

Στείλαμε email ενεÏγοποίησης στο %{email}. ΠαÏακαλώ, ακολοÏθησε τις οδηγίες σε αυτό το email για να ενεÏγοποιήσεις τον λογαÏιασμό σου.

Εάν δεν έÏθει, βεβαιώσου ότι έχεις Ïυθμίσει τα ηλεκτÏονικά μηνÏματα σωστά για το Discourse και έλεγξε τον φάκελο με τα ανεπιθÏμητα.

" @@ -2886,10 +2742,8 @@ el: fields: favicon_url: label: "ΜικÏÏŒ εικονίδιο" - description: "Εικονίδιο το οποίο χÏησιμοποιείται για να απεικονίσει την ιστοσελίδα σας στους web browsers και που φαίνεται καλό σε μικÏά μεγέθη όπως 32px επί 32px." apple_touch_icon_url: label: "Μεγάλο εικονίδιο" - description: "Εικονίδιο το οποίο χÏησιμοποιείται για να απεικονίσει την ιστοσελίδα σας στις σÏγχÏονες συσκευές και που φαίνεται καλό σε μεγαλÏτεÏα μεγέθη. Συνιστώμενο μέγεθος τουλάχιστον 144px επί 144px." homepage: description: "Σου Ï€Ïοτείνουμε να εμφανίζονται τα τελευταία νήματα στην αÏχική σου σελίδα, αλλά μποÏείς επίσης να επιλέξεις να εμφανίζονται κατηγοÏίες (ομάδες ή νήματα) στην αÏχική σου σελίδα, εάν το Ï€Ïοτιμάς." title: "ΑÏχική Σελίδα" @@ -2898,8 +2752,6 @@ el: choices: latest: label: "Τελευταία Θέματα" - categories: - label: "ΚατηγοÏίες" emoji: title: "Emoji" description: "Ποιο στυλ Emoji Ï€Ïοτιμάς στην κοινότητά σου; ΜποÏείς να Ï€Ïοσθέσεις πιο εξατομικευμένα Emoji αÏγότεÏα μέσω της επιλογής ΔιαχείÏιση, Εξατομίκευση, Emoji." diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index a13752cebf..bed4fd8003 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -60,6 +60,11 @@ en: bad_color_scheme: "Can not update theme, invalid color scheme" other_error: "Something went wrong updating theme" error_importing: "Error cloning git repository, access is denied or repository is not found" + errors: + component_no_user_selectable: "Theme components can't be user-selectable" + component_no_default: "Theme components can't be default theme" + component_no_color_scheme: "Theme components can't have color scheme" + no_multilevels_components: "Themes with child themes can't be child themes themselves" settings_errors: invalid_yaml: "Provided YAML is invalid." data_type_not_a_number: "Setting `%{name}` type is unsupported. Supported types are `integer`, `bool`, `list` and `enum`" @@ -197,6 +202,7 @@ en: not_logged_in: "You need to be logged in to do that." not_found: "The requested URL or resource could not be found." invalid_access: "You are not permitted to view the requested resource." + authenticator_not_found: "Authentication method does not exist, or has been disabled." invalid_api_credentials: "You are not permitted to view the requested resource. The API username or key is invalid." provider_not_enabled: "You are not permitted to view the requested resource. The authentication provider is not enabled." provider_not_found: "You are not permitted to view the requested resource. The authentication provider does not exist." @@ -258,6 +264,7 @@ en: topic_not_found: "Something has gone wrong. Perhaps this topic was closed or deleted while you were looking at it?" not_accepting_pms: "Sorry, %{username} is not accepting messages at the moment." max_pm_recepients: "Sorry, you can send a message to maximum %{recipients_limit} recipients." + pm_reached_recipients_limit: "Sorry, you can't have more than %{recipients_limit} recipients in a message." just_posted_that: "is too similar to what you recently posted" invalid_characters: "contains invalid characters" @@ -533,7 +540,7 @@ en: (For more information on trust levels, [see this topic][trust]. Please note that only members who continue to meet the requirements over time will remain regulars.) - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: @@ -553,7 +560,7 @@ en: uncategorized: "Can't delete Uncategorized" has_subcategories: "Can't delete this category because it has sub-categories." topic_exists: - one: "Can't delete this category because is has 1 topic. Oldest topic is %{topic_link}." + one: "Can't delete this category because it has 1 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." @@ -602,6 +609,7 @@ en: seconds: one: "1 second" other: "%{count} seconds" + short_time: "a few seconds" datetime: distance_in_words: @@ -690,6 +698,18 @@ en: invalid_token: "Sorry, that email login link is too old. Select the Log In button and use 'I forgot my password' to get a new link." title: "Email login" + user_auth_tokens: + devices: + android: 'Android Device' + linux: 'Linux Computer' + windows: 'Windows Computer' + mac: 'Mac' + iphone: 'iPhone' + ipad: 'iPad' + ipod: 'iPod' + mobile: 'Mobile Device' + unknown: 'Unknown device' + change_email: confirmed: "Your email has been updated." please_continue: "Continue to %{site_name}" @@ -700,6 +720,9 @@ en: title: "Thanks for confirming your current email address" description: "We're now emailing your new address for confirmation." + associated_accounts: + revoke_failed: "Failed to revoke your account with %{provider_name}." + activation: action: "Click here to activate your account" already_done: "Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?" @@ -757,18 +780,13 @@ en: description: 'Like this post' short_description: 'Like this post' long_form: 'liked this' - vote: - title: 'Vote' - description: 'Vote for this post' - short_description: 'Vote for this post' - long_form: 'voted for this post' user_activity: no_default: self: "You have no activity yet." others: "No activity." no_bookmarks: - self: "You have no bookmarked posts, bookmarking posts allows you to easily access them later on." + self: "You have no bookmarked posts; bookmarks allow you to quickly refer to specific posts." others: "No bookmarks." no_likes_given: self: "You have not liked any posts." @@ -776,6 +794,9 @@ en: no_replies: self: "You have not replied to any posts." others: "No replies." + no_drafts: + self: "You have no drafts; begin composing a reply in any topic and it will be auto-saved as a new draft." + others: "You do not have permission to see drafts for this user." topic_flag_types: spam: @@ -844,6 +865,41 @@ en: write: "Write all" reports: + default: + labels: + count: Count + percent: Percent + day: Day + post_edits: + title: "Post edits" + labels: + post: Post + editor: Editor + author: Author + edit_reason: Reason + moderators_activity: + title: "Moderators activity" + labels: + moderator: Moderator + flag_count: Flags reviewed + time_read: Time reading + topic_count: Topics created + post_count: Posts created + pm_count: PMs created + revision_count: Revisions + flags_status: + title: "Flags status" + values: + agreed: Agreed + disagreed: Disagreed + deferred: Deferred + no_action: No action + labels: + flag: Type + assigned: Assigned + poster: Poster + flagger: Flagger + time_to_resolution: Resolution time visits: title: "User Visits" xaxis: "Day" @@ -902,10 +958,14 @@ en: title: "Users per Trust Level" xaxis: "Trust Level" yaxis: "Number of Users" + labels: + level: Level users_by_type: title: "Users per Type" xaxis: "Type" yaxis: "Number of Users" + labels: + type: Type xaxis_labels: admin: Admin moderator: Moderator @@ -956,10 +1016,15 @@ en: num_clicks: "Clicks" num_topics: "Topics" num_users: "Users" + labels: + domain: Domain + num_clicks: Clicks + num_topics: Topics top_referred_topics: title: "Top Referred Topics" - xaxis: "Topic" - num_clicks: "Clicks" + labels: + num_clicks: "Clicks" + topic: "Topic" page_view_anon_reqs: title: "Anonymous" xaxis: "Day" @@ -1017,13 +1082,14 @@ en: xaxis: "Day" yaxis: "Total" mobile_visits: - title: "User Visits" + title: "User Visits (mobile)" xaxis: "Day" yaxis: "Number of visits" web_crawlers: title: "Web Crawler Requests" - xaxis: "User Agent" - yaxis: "Pageviews" + labels: + user_agent: "User Agent" + page_views: "Pageviews" dashboard: rails_env_warning: "Your server is running in %{env} mode." @@ -1049,6 +1115,7 @@ en: poll_pop3_timeout: "Connection to the POP3 server is timing out. Incoming email could not be retrieved. Please check your POP3 settings and service provider." poll_pop3_auth_error: "Connection to the POP3 server is failing with an authentication error. Please check your POP3 settings." force_https_warning: "Your website is using SSL. But `force_https` is not yet enabled in your site settings." + out_of_date_themes: "Updates are available for the following themes:" site_settings: censored_words: "Words that will be automatically replaced with ■■■■" @@ -1073,6 +1140,7 @@ en: search_recent_posts_size: "How many recent posts to keep in the index" log_search_queries: "Log search queries performed by users" search_query_log_max_size: "Maximum amount of search queries to keep" + search_query_log_max_retention_days: "Maximum amount of time to keep search queries, in days." allow_uncategorized_topics: "Allow topics to be created without a category. WARNING: If there are any uncategorized topics, you must recategorize them before turning this off." allow_duplicate_topic_titles: "Allow topics with identical, duplicate titles." unique_posts_mins: "How many minutes before a user can make a post with the same content again" @@ -1130,8 +1198,6 @@ en: enable_personal_messages: "Allow trust level 1 (configurable via min trust level to send messages) users to create messages and reply to messages. Note that staff can always send messages no matter what." enable_system_message_replies: "Allows users to reply to system messages, even if personal messages are disabled" - enable_personal_email_messages: "Allow trust level 4 (configurable via min trust level to send messages) users to send personal email messages. Note that staff can always send messages no matter what." - enable_long_polling: "Message bus used for notification can use long polling" long_polling_base_url: "Base URL used for long polling (when a CDN is serving dynamic content, be sure to set this to origin pull) eg: http://origin.site.com" long_polling_interval: "Amount of time the server should wait before responding to clients when there is no data to send (logged on users only)" @@ -1183,9 +1249,9 @@ en: post_menu: "Determine which items appear on the post menu, and in what order. Example like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "The menu items to hide by default in the post menu unless an expansion ellipsis is clicked on." share_links: "Determine which items appear on the share dialog, and in what order." - track_external_right_clicks: "Track external links that are right clicked (eg: open in new tab) disabled by default because it rewrites URLs" site_contact_username: "A valid staff username to send all automated messages from. If left blank the default System account will be used." send_welcome_message: "Send all new users a welcome message with a quick start guide." + send_tl1_welcome_message: "Send new trust level 1 users a welcome message." suppress_reply_directly_below: "Don't show the expandable reply count on a post when there is only a single reply directly below this post." suppress_reply_directly_above: "Don't show the expandable in-reply-to on a post when there is only a single reply directly above this post." suppress_reply_when_quoting: "Don't show the expandable in-reply-to on a post when post quotes reply." @@ -1252,8 +1318,8 @@ en: enable_google_oauth2_logins: "Enable Google Oauth2 authentication. This is the method of authentication that Google currently supports. Requires key and secret." google_oauth2_client_id: "Client ID of your Google application." google_oauth2_client_secret: "Client secret of your Google application." - google_oauth2_prompt: "A space-delimited list of string values that specifies whether the authorization server prompts the user for reauthentication and consent. See https://developers.google.com/identity/protocols/OpenIDConnect#prompt for the possible values." - google_oauth2_hd: "Google Apps Hosted domain that the sign-in will be limited to. See https://developers.google.com/identity/protocols/OpenIDConnect#hd-param for more details." + google_oauth2_prompt: "An optional space-delimited list of string values that specifies whether the authorization server prompts the user for reauthentication and consent. See https://developers.google.com/identity/protocols/OpenIDConnect#prompt for the possible values." + google_oauth2_hd: "An optional Google Apps Hosted domain that the sign-in will be limited to. See https://developers.google.com/identity/protocols/OpenIDConnect#hd-param for more details." enable_twitter_logins: "Enable Twitter authentication, requires twitter_consumer_key and twitter_consumer_secret" twitter_consumer_key: "Consumer key for Twitter authentication, registered at https://apps.twitter.com/" @@ -1279,6 +1345,8 @@ en: backup_frequency: "The number of days between backups." enable_s3_backups: "Upload backups to S3 when complete. IMPORTANT: requires valid S3 credentials entered in Files settings." s3_backup_bucket: "The remote bucket to hold backups. WARNING: Make sure it is a private bucket." + s3_endpoint: "The endpoint can be modified to backup to an S3 compatible service like DigitalOcean Spaces or Minio. WARNING: Use default if using AWS S3" + s3_force_path_style: "Enforce path-style addressing for your custom endpoint. IMPORTANT: Required for using Minio uploads and backups." s3_disable_cleanup: "Disable the removal of backups from S3 when removed locally." backup_time_of_day: "Time of day UTC when the backup should occur." backup_with_uploads: "Include uploads in scheduled backups. Disabling this will only backup the database." @@ -1311,6 +1379,9 @@ en: max_logins_per_ip_per_hour: "Maximum number of logins allowed per IP address per hour" max_logins_per_ip_per_minute: "Maximum number of logins allowed per IP address per minute" + max_post_deletions_per_minute: "Maximum number of posts a user can delete per minute." + max_post_deletions_per_day: "Maximum number of posts a user can delete per day." + alert_admins_if_errors_per_minute: "Number of errors per minute in order to trigger an admin alert. A value of 0 disables this feature. NOTE: requires restart." alert_admins_if_errors_per_hour: "Number of errors per hour in order to trigger an admin alert. A value of 0 disables this feature. NOTE: requires restart." @@ -1336,8 +1407,11 @@ en: external_system_avatars_enabled: "Use external system avatars service." external_system_avatars_url: "URL of the external system avatars service. Allowed substitutions are {username} {first_letter} {color} {size}" - default_opengraph_image_url: "URL of the default opengraph image." - twitter_summary_large_image_url: "URL of the default Twitter summary card image (should be at least 280px in width, and at least 150px in height)." + selectable_avatars_enabled: "Force users to choose an avatar from the list." + selectable_avatars: "List of avatars users can choose from." + + default_opengraph_image_url: "Default opengraph image, used when the page has no other suitable image or site logo." + twitter_summary_large_image_url: "Default Twitter summary card image (should be at least 280px in width, and at least 150px in height)." allow_all_attachments_for_group_messages: "Allow all email attachments for group messages." @@ -1347,6 +1421,8 @@ en: strip_image_metadata: "Strip image metadata." + min_ratio_to_crop: "Ratio used to crop tall images. Enter the result of width / height." + enable_flash_video_onebox: "Enable embedding of swf and flv (Adobe Flash) links in oneboxes. WARNING: may introduce security risks." default_invitee_trust_level: "Default trust level (0-4) for invited users." @@ -1390,13 +1466,12 @@ en: min_trust_to_allow_self_wiki: "The minimum trust level required to make user's own post wiki." min_trust_to_send_messages: "The minimum trust level required to create new personal messages." - - min_trust_to_send_email_messages: "The minimum trust level required to send new personal messages via email (to staged users)." - min_trust_to_flag_posts: "The minimum trust level required to flag posts" min_trust_to_post_links: "The minimum trust level required to include links in posts" min_trust_to_post_images: "The minimum trust level required to include images in a post" + whitelisted_link_domains: "Domains that users may link to even if they don't have the appropriate trust level to post links" + newuser_max_links: "How many links a new user can add to a post." newuser_max_images: "How many images a new user can add to a post." newuser_max_attachments: "How many attachments a new user can add to a post." @@ -1490,7 +1565,7 @@ en: alternative_reply_by_email_addresses: "List of alternative templates for reply by email incoming email addresses. Example: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" incoming_email_prefer_html: "Use HTML instead of text for incoming email." - disable_emails: "Prevent Discourse from sending any kind of emails" + disable_emails: "Prevent Discourse from sending any kind of emails. Select 'yes' to disable emails for all users. Select 'non-staff' to disable emails for non-staff users only." strip_images_from_short_emails: "Strip images from emails having size less than 2800 Bytes" short_email_length: "Short email length in Bytes" @@ -1500,6 +1575,7 @@ en: unsubscribe_via_email_footer: "Attach an unsubscribe via email mailto: link to the footer of sent emails" delete_email_logs_after_days: "Delete email logs after (N) days. 0 to keep indefinitely" + disallow_reply_by_email_after_days: "Disallow reply by email after (N) days. 0 to keep indefinitely" max_emails_per_day_per_user: "Maximum number of emails to send users per day. 0 to disable the limit" enable_staged_users: "Automatically create staged users when processing incoming emails." maximum_staged_users_per_email: "Maximum number of staged users created when processing an incoming email." @@ -1530,9 +1606,11 @@ en: pop3_polling_host: "The host to poll for email via POP3." pop3_polling_username: "The username for the POP3 account to poll for email." pop3_polling_password: "The password for the POP3 account to poll for email." + pop3_polling_delete_from_server: "Delete emails from server. NOTE: If you disable this you should manually clean your mail inbox" log_mail_processing_failures: "Log all email processing failures to http://yoursitename.com/logs" email_in: "Allow users to post new topics via email (requires manual or pop3 polling). Configure the addresses in the \"Settings\" tab of each category." email_in_min_trust: "The minimum trust level a user needs to have to be allowed to post new topics via email." + email_in_spam_header: "The email header to detect spam." email_prefix: "The [label] used in the subject of emails. It will default to 'title' if not set." email_site_title: "The title of the site used as the sender of emails from the site. Default to 'title' if not set. If your 'title' contains characters that are not allowed in email sender strings, use this setting." @@ -1545,7 +1623,7 @@ en: delete_all_posts_max: "The maximum number of posts that can be deleted at once with the Delete All Posts button. If a user has more than this many posts, the posts cannot all be deleted at once and the user can't be deleted." username_change_period: "The maximum number of days after registration that accounts can change their username (0 to disallow username change)." email_editable: "Allow users to change their e-mail address after registration." - logout_redirect: "Location to redirect browser to after logout (eg: http://somesite.com/logout)" + logout_redirect: "Location to redirect browser to after logout (eg: http://example.com/logout)" allow_uploaded_avatars: "Allow users to upload custom profile pictures." allow_animated_avatars: "Allow users to use animated gif profile pictures. WARNING: run the avatars:refresh rake task after changing this setting." @@ -1598,6 +1676,8 @@ en: suppress_uncategorized_badge: "Don't show the badge for uncategorized topics in topic lists." + header_dropdown_category_count: "How many categories can be displayed in the header dropdown menu." + permalink_normalizations: "Apply the following regex before matching permalinks, for example: /(topic.*)\\?.*/\\1 will strip query strings from topic routes. Format is regex+string use \\1 etc. to access captures" global_notice: "Display an URGENT, EMERGENCY global banner notice to all visitors, change to blank to hide it (HTML allowed)." @@ -1648,6 +1728,7 @@ en: enable_emoji_shortcuts: "Common smiley text such as :) :p :( will be converted to emojis" emoji_set: "How would you like your emoji?" enforce_square_emoji: "Force a square aspect ratio to all emojis." + emoji_autocomplete_min_chars: "Minimum number of characters required to trigger autocomplete emoji popup" approve_post_count: "The amount of posts from a new or basic user that must be approved" approve_unless_trust_level: "Posts for users below this trust level must be approved" @@ -1692,6 +1773,7 @@ en: default_categories_watching_first_post: "List of categories in which first post in each new topic will be watched by default." retain_web_hook_events_period_days: "Number of days to retain web hook event records." + retry_web_hook_events: "Automatically retry failed web hook events for 4 times. Time gaps between the retries are 1, 5, 25 and 125 minutes." allow_user_api_keys: "Allow generation of user API keys" allow_user_api_key_scopes: "List of scopes allowed for user API keys" @@ -1699,6 +1781,7 @@ en: min_trust_level_for_user_api_key: "Trust level required for generation of user API keys" allowed_user_api_auth_redirects: "Allowed URL for authentication redirect for user API keys" allowed_user_api_push_urls: "Allowed URLs for server push to user API" + expire_user_api_keys_days: "Number of days before an user API key automatically expires (0 for never)" tagging_enabled: "Enable tags on topics?" min_trust_to_create_tag: "The minimum trust level required to create a tag." @@ -1797,8 +1880,7 @@ en: other: "%{count} posts were merged into an existing topic: %{topic_link}" change_owner: - post_revision_text: "Ownership transferred from %{old_user} to %{new_user}" - deleted_user: "a deleted user" + post_revision_text: "Ownership transferred" topic_statuses: archived_enabled: "This topic is now archived. It is frozen and cannot be changed in any way." @@ -1887,10 +1969,20 @@ en: already_logged_in: "Oops, looks like you are attempting to accept an invitation for another user. If you are not %{current_user}, please log out and try again." second_factor_title: "Two Factor Authentication" second_factor_description: "Please enter the required authentication code from your app:" - invalid_second_factor_code: "Invalid authentication code" + second_factor_backup_description: "Please enter one of your backup codes:" + second_factor_backup_title: "Two Factor Backup Code" + invalid_second_factor_code: "Invalid authentication code. Each code can only be used once." + second_factor_toggle: + totp: "Use an authenticator app instead" + backup_code: "Use a backup code instead" + + admin: + email: + sent_test: "sent!" + sent_test_disabled: "cannot send because emails are disabled" + sent_test_disabled_for_non_staff: "cannot send because emails are disabled for non-staff" user: - no_accounts_associated: "No accounts associated" deactivated: "Was deactivated due to too many bounced emails to '%{email}'." deactivated_by_staff: "Deactivated by staff" activated_by_staff: "Activated by staff" @@ -2178,11 +2270,27 @@ en: For additional guidance, please refer to our [community guidelines](%{base_url}/guidelines). + flags_agreed_and_post_deleted: + title: "Flagged post removed by staff" + subject_template: "Flagged post removed by staff" + text_body_template: | + Hello, + + This is an automated message from %{site_name} to let you know that your post was removed. + + <%{base_url}%{url}> + + %{flag_reason} + + This post was flagged by the community and a staff member opted to remove it. + + Please review our [community guidelines](%{base_url}/guidelines) for details. + usage_tips: text_body_template: | For a few quick tips on getting started as a new user, [check out this blog post](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). - As you participate here, we’ll get to know you, and temporary new user limitations will be lifted. Over time you’ll gain [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together. + As you participate here, we’ll get to know you, and temporary new user limitations will be lifted. Over time you’ll gain [trust levels](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) that include special abilities to help us manage our community together. welcome_user: title: "Welcome User" @@ -2196,6 +2304,14 @@ en: Enjoy your stay! + welcome_tl1_user: + title: "Welcome TL1 User" + subject_template: "Thanks for spending time with us" + text_body_template: | + Hey there. We see you’ve been busy reading, which is fantastic, so we’ve promoted you up a [trust level!](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) + + We’re really glad you’re spending time with us and we’d love to know more about you. Take a moment to [fill out your profile](/my/preferences/profile), or feel free to [start a new topic](/categories). + welcome_invite: title: "Welcome Invite" subject_template: "Welcome to %{site_name}!" @@ -2416,6 +2532,14 @@ en: If you can correct the problem, please try again. + email_reject_post_too_short: + title: "Email Reject Post Too Short" + subject_template: "[%{email_prefix}] Email issue -- Post too short" + text_body_template: | + We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work. + + To promote more in depth conversations, very short replies are not allowed. Can you please reply with at least %{count} characters? Alternatively, you can like a post via email by replying with "+1". + email_reject_invalid_post_action: title: "Email Reject Invalid Post Action" subject_template: "[%{email_prefix}] Email issue -- Invalid Post Action" @@ -2447,7 +2571,7 @@ en: text_body_template: | We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work. - For security reasons we only accept replies to original notifications for 90 days. Please [visit the topic](%{short_url}) to continue the conversation. + We only accept replies to original notifications for %{number_of_days} days. Please [visit the topic](%{short_url}) to continue the conversation. email_reject_topic_not_found: title: "Email Reject Topic Not Found" @@ -2490,6 +2614,15 @@ en: Please make sure you have properly configured the POP credentials in [the site settings](%{base_url}/admin/site_settings/category/email). If there is a web UI for the POP email account, you may need to log in on the web and check your settings there. + + email_revoked: + title: "Email Revoked" + subject_template: "Is your email address correct?" + text_body_template: | + We’re sorry, but we’re having trouble reaching you via email. Our last few emails to you have all bounced back as undeliverable. + + Can you make sure [your email address](%{base_url}/my/preferences/email) is valid and working? You may also wish to add our email address to your address book / contact list to improve deliverability. + too_many_spam_flags: title: "Too Many Spam Flags" subject_template: "New account on hold" @@ -2498,7 +2631,7 @@ en: This is an automated message from %{site_name} to let you know that your posts have been temporarily hidden because they were flagged by the community. - As a precautionary measure, your new account has been silenced from creating new replies or topics until a staff member can review your account. We apologize for the inconvenience. + As a precautionary measure, your new account has been silenced and will be unable to create replies or topics until a staff member can review your account. We apologize for the inconvenience. For additional guidance, please refer to our [community guidelines](%{base_url}/guidelines). too_many_tl3_flags: @@ -2629,14 +2762,15 @@ en: header_instructions: '' reply_by_email: "[Visit Topic](%{base_url}%{url}) or reply to this email to respond." - reply_by_email_pm: "[Visit Message](%{base_url}%{url}) or reply to this email to respond." + reply_by_email_pm: "[Visit Message](%{base_url}%{url}) or reply to this email to respond to %{participants}." only_reply_by_email: "Reply to this email to respond." + only_reply_by_email_pm: "Reply to this email to respond to %{participants}." visit_link_to_respond: "[Visit Topic](%{base_url}%{url}) to respond." - visit_link_to_respond_pm: "[Visit Message](%{base_url}%{url}) to respond." + visit_link_to_respond_pm: "[Visit Message](%{base_url}%{url}) to respond to %{participants}." posted_by: "Posted by %{username} on %{post_date}" - pm_participants: "Participants:" + pm_participants: "Participants: %{participants}" invited_group_to_private_message_body: | %{username} invited @%{group_name} to a message @@ -3048,7 +3182,7 @@ en: recent_topics: "Recent" see_more: "More" search_title: "Search this site" - search_google: "Google" + search_button: "Search" offline: title: "Cannot load app" @@ -3091,33 +3225,46 @@ en: sockpuppet: "A new user created a topic, and another new user at the same IP address (%{ip_address}) replied. See the `flag_sockpuppets` site setting." spam_hosts: "This new user tried to create multiple posts with links to the same domain (%{domain}). See the `newuser_spam_host_threshold` site setting." - email_log: - post_user_deleted: "User of the post has been deleted." - no_user: "Can't find user with id %{user_id}" - anonymous_user: "User is anonymous" - suspended_not_pm: "User is suspended, not a message" - seen_recently: "User was seen recently" - post_not_found: "Can't find a post with id %{post_id}" - notification_already_read: "The notification this email is about has already been read" - topic_nil: "post.topic is nil" - post_deleted: "post was deleted by the author" - user_suspended: "user was suspended" - already_read: "user has already read this post" + skipped_email_log: exceeded_emails_limit: "Exceeded max_emails_per_day_per_user" exceeded_bounces_limit: "Exceeded bounce_score_threshold" - message_blank: "message is blank" - message_to_blank: "message.to is blank" - text_part_body_blank: "text_part.body is blank" - body_blank: "body is blank" - no_echo_mailing_list_mode: "Mailing list notifications disabled for user's own posts" + mailing_list_no_echo_mode: "Mailing list notifications disabled for user's own posts" + user_email_no_user: "Can't find user with id %{user_id}" + user_email_post_not_found: "Can't find a post with id %{post_id}" + user_email_anonymous_user: "User is anonymous" + user_email_user_suspended_not_pm: "User is suspended, not a message" + user_email_seen_recently: "User was seen recently" + user_email_notification_already_read: "The notification this email is about has already been read" + user_email_notification_topic_nil: "post.topic is nil" + user_email_post_user_deleted: "User of the post has been deleted." + user_email_post_deleted: "post was deleted by the author" + user_email_user_suspended: "user was suspended" + user_email_already_read: "user has already read this post" + sender_message_blank: "message is blank" + sender_message_to_blank: "message.to is blank" + sender_text_part_body_blank: "text_part.body is blank" + sender_body_blank: "body is blank" + sender_post_deleted: "post has been deleted" color_schemes: base_theme_name: "Base" - default: "Light Scheme" + light: "Light Scheme" dark: "Dark Scheme" - default_theme_name: "Default" - dark_theme_name: "Dark" + neutral: "Neutral Scheme" + grey_amber: "Grey Amber Scheme" + shades_of_blue: "Shades of Blue Scheme" + latte: "Latte Scheme" + summer: "Summer Scheme" + dark_rose: "Dark Rose Scheme" + default_theme_name: "Light" light_theme_name: "Light" + dark_theme_name: "Dark" + neutral_theme_name: "Neutral" + grey_amber_theme_name: "Grey Amber" + shades_of_blue_theme_name: "Shades of Blue" + latte_theme_name: "Latte" + summer_theme_name: "Summer" + dark_rose_theme_name: "Dark Rose" about: "About" guidelines: "Guidelines" @@ -3464,72 +3611,72 @@ en: name: Editor description: First post edit long_description: | - This badge is granted the first time you edit one of your posts. While you won't be able to edit your posts forever, editing is always a good idea — you can improve your posts, fix small mistakes, or add anything you missed when you originally posted. Edit to make your posts even better! + This badge is granted the first time you edit one of your posts. While you won’t be able to edit your posts forever, editing is encouraged — you can improve the formatting, fix small mistakes, or add anything you missed when you originally posted. Edit to make your posts even better! basic_user: name: Basic - description: Granted all essential community functions + description: Granted all essential community functions long_description: | - This badge is granted when you reach trust level 1. Thanks for sticking around a little while and reading a few topics to learn what our community is about. Your new user restrictions have been lifted; you've been granted all essential community abilities, such as personal messaging, flagging, wiki editing, and the ability to post multiple images and links. + This badge is granted when you reach trust level 1. Thanks for sticking around and reading a few topics to learn what our community is about. New user restrictions have been lifted; you’ve been granted all essential community abilities, such as personal messaging, flagging, wiki editing, and the ability to post multiple images and links. member: name: Member - description: Granted invitations, group messaging, more likes + description: Granted invitations, group messaging, more likes long_description: | - This badge is granted when you reach trust level 2. Thanks for participating over a period of weeks to truly join our community. You can now send invitations from your user page or individual topics, create group personal messages, and have a few more likes per day. + This badge is granted when you reach trust level 2. Thanks for participating over a period of weeks to truly join our community. You can now send invitations from your user page or individual topics, create group personal messages, and have more likes per day. regular: name: Regular - description: Granted recategorize, rename, followed links, wiki, more likes + description: Granted recategorize, rename, followed links, wiki, more likes long_description: | - This badge is granted when you reach trust level 3. Thanks for being a regular part of our community over a period of months. You're now one of the most active readers, and a reliable contributor that makes our community great. You can now recategorize and rename topics, take advantage of more powerful spam flags, access a private lounge area, and you'll also get lots more likes per day. + This badge is granted when you reach trust level 3. Thanks for being a regular part of our community over a period of months. You’re now one of the most active readers, and a reliable contributor that makes our community great. You can now recategorize and rename topics, take advantage of more powerful spam flags, access a private lounge area, and you’ll also get lots more likes per day. leader: name: Leader - description: Granted global edit, pin, close, archive, split and merge, more likes + description: Granted global edit, pin, close, archive, split and merge, more likes long_description: | - This badge is granted when you reach trust level 4. You're a leader in this community as selected by staff, and you set a positive example for the rest of the community in your actions and words here. You have the ability to edit all posts, take common topic moderator actions such as pin, close, unlist, archive, split, and merge, and you have tons of likes per day. + This badge is granted when you reach trust level 4. You’re a leader in this community as selected by staff, and you set a positive example for the rest of the community in your actions and words here. You have the ability to edit all posts, take common topic moderator actions such as pin, close, unlist, archive, split, and merge. welcome: name: Welcome description: Received a like long_description: | - This badge is granted when you receive your first like on a post. Congratulations, you've posted something that your fellow community members found interesting, cool, or useful! + This badge is granted when you receive your first like on a post. Congratulations, you’ve posted something that your fellow community members found interesting, cool, or useful! autobiographer: name: Autobiographer description: Filled out profile information long_description: | - This badge is granted for filling out your user profile and selecting a profile picture. Letting the community know a bit more about who you are and what you're interested in makes for a better, more connected community. Join us! + This badge is granted for filling out your user profile and selecting a profile picture. Letting the community know a bit more about who you are and what you’re interested in makes for a better, more connected community. Join us! anniversary: name: Anniversary description: Active member for a year, posted at least once long_description: | - This badge is granted when you've been a member for a year with at least one post in that year. Thank you for sticking around and contributing to our community. We couldn't do it without you. + This badge is granted when you’ve been a member for a year with at least one post in that year. Thank you for sticking around and contributing to our community. We couldn’t do it without you. nice_post: name: Nice Reply description: Received 10 likes on a reply long_description: | - This badge is granted when your reply gets 10 likes. Your reply really made an impression on the community and helped move the conversation forward! + This badge is granted when your reply gets 10 likes. Your reply made an impression on the community and helped move the conversation forward. good_post: name: Good Reply description: Received 25 likes on a reply long_description: | - This badge is granted when your reply gets 25 likes. Your reply was exceptional and made the conversation a whole lot better for everyone! + This badge is granted when your reply gets 25 likes. Your reply was exceptional and made the conversation much more interesting. great_post: name: Great Reply description: Received 50 likes on a reply long_description: | - This badge is granted when your reply gets 50 likes. Wow! Your reply was inspiring, fascinating, hilarious, or insightful and the community loved it. + This badge is granted when your reply gets 50 likes. Wow! Your reply was inspiring, fascinating, hilarious, or insightful and the community loved it! nice_topic: name: Nice Topic description: Received 10 likes on a topic long_description: | - This badge is granted when your topic gets 10 likes. Hey, you started an interesting conversation that the community enjoyed! + This badge is granted when your topic gets 10 likes. You started an interesting conversation that the community enjoyed. good_topic: name: Good Topic description: Received 25 likes on a topic long_description: | - This badge is granted when your topic gets 25 likes. You launched a vibrant conversation that the community rallied around and loved! + This badge is granted when your topic gets 25 likes. You launched a vibrant conversation that the community rallied around. great_topic: name: Great Topic description: Received 50 likes on a topic long_description: | - This badge is granted when your topic gets 50 likes. You kicked off a fascinating conversation and the community enjoyed the dynamic discussion that resulted! + This badge is granted when your topic gets 50 likes. You kicked off a fascinating conversation and the community loved the lively discussion that resulted! nice_share: name: Nice Share description: Shared a post with 25 unique visitors @@ -3539,12 +3686,12 @@ en: name: Good Share description: Shared a post with 300 unique visitors long_description: | - This badge is granted for sharing a link that was clicked by 300 outside visitors. Good work! You've shown off a great discussion to a bunch of new people and helped this community grow. + This badge is granted for sharing a link that was clicked by 300 outside visitors. Good work! You’ve shown off a great discussion to a bunch of new people and helped this community grow. great_share: name: Great Share description: Shared a post with 1000 unique visitors long_description: | - This badge is granted for sharing a link that was clicked by 1000 outside visitors. Wow! You've promoted an interesting discussion to a huge new audience, and helped us grow our community in a big way! + This badge is granted for sharing a link that was clicked by 1000 outside visitors. Wow! You’ve promoted an interesting discussion to a huge new audience, and helped us grow our community in a big way! first_like: name: First Like description: Liked a post @@ -3554,7 +3701,7 @@ en: name: First Flag description: Flagged a post long_description: | - This badge is granted the first time you flag a post. Flagging is how we all help keep this a clean, well lit place for everyone. If you notice any posts that require moderator attention for any reason please don't hesitate to flag. You can also flag to send personal messages to fellow users if you see an issue with their post. If you see a problem, :flag_black: flag it! + This badge is granted the first time you flag a post. Flagging is how we all help keep this a nice place for everyone. If you notice any posts that require moderator attention for any reason please don’t hesitate to flag. If you see a problem, :flag_black: flag it! promoter: name: Promoter description: Invited a user @@ -3564,12 +3711,12 @@ en: name: Campaigner description: Invited 3 basic users long_description: | - This badge is granted when you've invited 3 people who subsequently spent enough time on the site to become basic users. A vibrant community needs a regular infusion of newcomers who regularly participate and add new voices to the conversations. + This badge is granted when you’ve invited 3 people who subsequently spent enough time on the site to become basic users. A vibrant community needs a regular infusion of newcomers who regularly participate and add new voices to the conversations. champion: name: Champion description: Invited 5 members long_description: | - This badge is granted when you've invited 5 people who subsequently spent enough time on the site to become full members. Wow! Thanks for expanding the diversity of our community with new members! + This badge is granted when you’ve invited 5 people who subsequently spent enough time on the site to become full members. Wow! Thanks for expanding the diversity of our community with new members! first_share: name: First Share description: Shared a post @@ -3584,12 +3731,12 @@ en: name: First Quote description: Quoted a post long_description: | - This badge is granted the first time you quote a post in your reply. Quoting relevant sections of earlier posts in your reply helps keep discussions connected together and on topic. The easiest way to quote is to highlight a section of a post, and then press any reply button. Quote generously! + This badge is granted the first time you quote a post in your reply. Quoting relevant parts of earlier posts in your reply helps keep discussions connected together and on topic. The easiest way to quote is to highlight a section of a post, and then press any reply button. Quote generously! read_guidelines: name: Read Guidelines description: Read the community guidelines long_description: | - This badge is granted for reading the community guidelines. Following and sharing these simple guidelines helps build a safe, fun, and sustainable community for everyone. Always remember there's another human being, one very much like yourself, on the other side of that screen. Be nice! + This badge is granted for reading the community guidelines. Following and sharing these simple guidelines helps build a safe, fun, and sustainable community for everyone. Always remember there’s another human being, one very much like yourself, on the other side of that screen. Be nice! reader: name: Reader description: Read every reply in a topic with more than 100 replies @@ -3639,22 +3786,22 @@ en: name: Crazy in Love description: Used 50 likes in a day 20 times long_description: | - This badge is granted when you use all 50 of your daily likes for 20 days. Wow! You're a model of regularly encouraging your fellow community members! + This badge is granted when you use all 50 of your daily likes for 20 days. Wow! You’re a role model for encouraging your fellow community members! thank_you: name: Thank You description: Has 20 liked posts and gave 10 likes long_description: | - This badge is granted when you have 20 liked posts and give 10 or more likes in return. When someone likes your posts, you find the time to like what others are posting, too. + This badge is granted when you have 20 liked posts and give 10 or more likes in return. When someone likes your posts, you find the time to like what others are posting, too. gives_back: name: Gives Back description: Has 100 liked posts and gave 100 likes long_description: | - This badge is granted when you have 100 liked posts and give 100 or more likes in return. Thanks for paying it forward! + This badge is granted when you have 100 liked posts and give 100 or more likes in return. Thanks for paying it forward! empathetic: name: Empathetic description: Has 500 liked posts and gave 1000 likes long_description: | - This badge is granted when you have 500 liked posts and give 1000 or more likes in return. Wow! You're a model of generosity and mutual appreciation :two_hearts:. + This badge is granted when you have 500 liked posts and give 1000 or more likes in return. Wow! You’re a model of generosity and mutual appreciation :two_hearts:. first_emoji: name: First Emoji description: Used an Emoji in a Post @@ -3663,11 +3810,13 @@ en: first_mention: name: First Mention description: Mentioned a user in a post - long_description: This badge is granted the first time you mention someone's @username in your post. Each mention generates a notification to that person, so they know about your post. Just begin typing @ (at symbol) to mention any user or, if allowed, group – it's a convenient way to bring something to their attention. + long_description: | + This badge is granted the first time you mention someone’s @username in your post. Each mention generates a notification to that person, so they know about your post. Just begin typing @ (at symbol) to mention any user or, if allowed, group – it’s a convenient way to bring something to their attention. first_onebox: name: First Onebox description: Posted a link that was oneboxed - long_description: This badge is granted the first time you post a link on a line by itself, which was then automatically expanded into a onebox with a brief summary of the link, a title, and (when available) a picture. + long_description: | + This badge is granted the first time you post a link on a line by itself, which automatically expanded into a onebox with a summary, title, and (when available) picture. first_reply_by_email: name: First Reply By Email description: Replied to a post via email @@ -3681,15 +3830,18 @@ en: enthusiast: name: Enthusiast description: Visited 10 days - long_description: This badge is granted for visiting 10 consecutive days. Thanks for sticking with us for over a week! + long_description: | + This badge is granted for visiting 10 consecutive days. Thanks for sticking with us for over a week! aficionado: name: Aficionado description: Visited 100 days - long_description: This badge is granted for visiting 100 consecutive days. That's more than three months! + long_description: | + This badge is granted for visiting 100 consecutive days. That’s more than three months! devotee: name: Devotee description: Visited 365 days - long_description: This badge is granted for visiting 365 consecutive days. Wow, an entire year! + long_description: | + This badge is granted for visiting 365 consecutive days. Wow, an entire year! badge_title_metadata: "%{display_name} badge on %{site_title}" admin_login: @@ -3717,7 +3869,7 @@ en: button: "Register" title: "Register Admin Account" help: "register a new account to get started" - no_emails: "Unfortunately, no administrator emails were defined during setup, so finalizing the configuration may be difficult." + no_emails: "Unfortunately, no administrator emails were defined during setup, so finalizing the configuration may be difficult. Please add a developer email in the configuration file or create an administrator account from console." confirm_email: title: "Confirm your Email" message: "

We sent an activation mail to %{email}. Please follow the instructions in the email to activate your account.

If it doesn't arrive, ensure you have set up email correctly for your Discourse and check your spam folder.

" @@ -3840,10 +3992,10 @@ en: fields: favicon_url: label: "Small Icon" - description: "Icon image used to represent your site in web browsers that looks good at small sizes such as 32px by 32px." + description: "Icon image used to represent your site in web browsers that looks good at small sizes such as 32px by 32px. Recommended image extensions are PNG or JPG." apple_touch_icon_url: label: "Large Icon" - description: "Icon image used to represent your site on modern devices that looks good at larger sizes. Recommended size is at least 144px by 144px." + description: "Icon image used to represent your site on modern devices that looks good at larger sizes. Recommended size is at least 512px by 512px." homepage: description: "We recommend showing the latest topics on your homepage, but you can also show categories (groups of topics) on the homepage if you prefer." @@ -3854,8 +4006,14 @@ en: choices: latest: label: "Latest Topics" - categories: - label: "Categories" + categories_only: + label: "Categories Only" + categories_with_featured_topics: + label: "Categories with Featured Topics" + categories_and_latest_topics: + label: "Categories and Latest Topics" + categories_and_top_topics: + label: "Categories and Top Topics" emoji: title: "Emoji" @@ -3887,3 +4045,9 @@ en: linked: '%{username} linked to your post from "%{topic}" - %{site_title}' confirm_title: 'Notifications enabled - %{site_title}' confirm_body: 'Success! Notifications have been enabled.' + + staff_action_logs: + not_found: "not found" + unknown: "unknown" + user_merged: "%{username} was merged into this account" + user_delete_self: "Deleted by self from %{url}" diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 35f13d3ceb..d349691671 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -39,6 +39,11 @@ es: bad_color_scheme: "No puedes actualizar theme, esquema de color inválido" other_error: "Algo salió mal actualizando el theme" error_importing: "Error al clonar el repositorio de git, acceso denegado o no se encuentra el repositorio" + errors: + component_no_user_selectable: "Los componentes de tema no pueden ser seleccionables por los usuarios" + component_no_default: "Los componentes de temas no pueden ser el tema por defecto" + component_no_color_scheme: "Los componentes de tema no pueden tener esquemas de color" + no_multilevels_components: "Loa temas con temas hijos no pueden ser hijos de otros temas" settings_errors: invalid_yaml: "YAML provisto es inválido." data_type_not_a_number: "Tipo de ajuste `%{name}` no está soportado. Tipos soportados: `integer`, `bool`, `list` and `enum`" @@ -134,8 +139,8 @@ es: load_from_remote: "Hubo un error al cargar ese post." site_settings: invalid_choice: - one: Has especificado la opción inválida %{name} - other: Has especificado las opciones inválidas %{name} + one: 'Has especificado la opción inválida %{name}' + other: 'Has especificado las opciones inválidas %{name}' min_username_length_exists: "No se puede establecer una longitud mínima para nombre de usuario mayor que el nombre de usuario más corto ya existente." min_username_length_range: "No se puede establecer el mínimo por encima del máximo." max_username_length_exists: "No se puede establecer una longitud máxima de nombre de usuario menor que el nombre de usuario más largo ya existente." @@ -169,13 +174,16 @@ es: not_logged_in: "Tienes que iniciar sesión para hacer eso." not_found: "No se ha podido encontrar la URL o recurso solicitado." invalid_access: "No tienes permiso para ver el recurso solicitado." + authenticator_not_found: "El método de verificación no existe o se ha desactivado" invalid_api_credentials: "No tienes permisos para visualizar el recurso solicitado. El nombre de usuario API o la clave es inválida. " + provider_not_enabled: "No tienes permisos para visualizar el recurso solicitado. El proveedor de autenticación no está habilitado." + provider_not_found: "No tienes permisos para visualizar el recurso solicitado. El proveedor de autenticación no existe." read_only_mode_enabled: "El sitio está en modo sólo lectura. Las interacciones están deshabilitadas." reading_time: "Tiempo de lectura" likes: "Me gusta" too_many_replies: - one: Lo sentimos, pero los usuarios nuevos están limitados a 1 respuesta en el mismo tema. - other: Lo sentimos, pero los usuarios nuevos están limitados a %{count} respuestas en el mismo tema. + one: "Lo sentimos, pero los usuarios nuevos están limitados a 1 respuesta en el mismo tema." + other: "Lo sentimos, pero los usuarios nuevos están limitados a %{count} respuestas en el mismo tema." embed: start_discussion: "Empezar discusión" continue: "Continuar discusión" @@ -185,43 +193,44 @@ es: no_hosts: "No se han definido hosts para el insertado" configure: "Configurar insertado" more_replies: - one: otra respuesta - other: otras %{count} respuestas + one: "otra respuesta" + other: "otras %{count} respuestas" loading: "Cargando discusión" permalink: "Enlace permanente" imported_from: "Este es un tema de discusión derivado de la entrada %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 respuesta - other: '%{count} respuestas' + one: "1 respuesta" + other: "%{count} respuestas" no_mentions_allowed: "Lo sentimos, pero no puedes mencionar a otros usuarios." too_many_mentions: - one: Lo sentimos, solo puedes mencionar a un usuario en un post. - other: Lo sentimos, pero solo puedes mencionar a %{count} usuarios en un post. + one: "Lo sentimos, solo puedes mencionar a un usuario en un post." + other: "Lo sentimos, pero solo puedes mencionar a %{count} usuarios en un post." no_mentions_allowed_newuser: "Lo sentimos, pero los usuarios nuevos no pueden mencionar a otros usuarios." too_many_mentions_newuser: - one: Lo sentimos, pero los usuarios nuevos solo pueden mencionar a un usuario en un post. - other: Lo sentimos, pero los usuarios nuevos solo pueden mencionar a %{count} usuarios en un post. + one: "Lo sentimos, pero los usuarios nuevos solo pueden mencionar a un usuario en un post." + other: "Lo sentimos, pero los usuarios nuevos solo pueden mencionar a %{count} usuarios en un post." no_images_allowed_trust: "Lo sentimos, no puedes poner imágenes en una publicación" no_images_allowed: "Lo sentimos, pero los usuarios nuevos no pueden poner imágenes en los mensajes." too_many_images: - one: Lo sentimos, pero los usuarios nuevos solo pueden poner una imagen por post. - other: Lo sentimos, los nuevos usuarios solo pueden poner %{count} imágenes en un post. + one: "Lo sentimos, pero los usuarios nuevos solo pueden poner una imagen por post." + other: "Lo sentimos, los nuevos usuarios solo pueden poner %{count} imágenes en un post." no_attachments_allowed: "Lo sentimos, los usuarios nuevos no pueden adjuntar archivos en posts." too_many_attachments: - one: Lo sentimos, los usuarios nuevos solo pueden adjuntar un archivo por post - other: Lo sentimos, los usuarios nuevos solo pueden adjuntar %{count} archivos por post. + one: "Lo sentimos, los usuarios nuevos solo pueden adjuntar un archivo por post" + other: "Lo sentimos, los usuarios nuevos solo pueden adjuntar %{count} archivos por post." no_links_allowed: "Lo sentimos, los nuevos usuarios no pueden poner enlaces en los posts." links_require_trust: "Lo sentimos, no puedes incluir enlaces en tus posts." too_many_links: - one: Lo sentimos, los nuevos usuarios solo pueden poner un link en un post. - other: Lo sentimos, los nuevos usuarios solo pueden poner %{count} enlaces en un post. + one: "Lo sentimos, los nuevos usuarios solo pueden poner un link en un post." + other: "Lo sentimos, los nuevos usuarios solo pueden poner %{count} enlaces en un post." contains_blocked_words: "Tu post contiene una palabra que no está permitida: %{word}" spamming_host: "Lo sentimos, no puedes publicar un enlace a esa web." user_is_suspended: "A los usuarios suspendidos no se les permite publicar." topic_not_found: "Algo ha salido mal. ¿Tal vez este tema ha sido cerrado o eliminado mientras estabas lo estabas mirando?" not_accepting_pms: "Lo sentimos, %{username} no acepta mensajes en este momento." max_pm_recepients: "Lo sentimos, puedes enviar un mensaje a un máximo de %{recipients_limit} destinatarios." + pm_reached_recipients_limit: "Lo sentimos, no puedes tener más de %{recipients_limit} destinatarios en un mensaje." just_posted_that: "es demasiado parecido a lo que has publicado recientemente" invalid_characters: "contiene caracteres no válidos" is_invalid: "parece poco claro, es una oración completa?" @@ -264,14 +273,14 @@ es: groups: success: bulk_add: - one: '%{count} usuario ha sido agregado al grupo.' - other: '%{count} usuarios han sido agregados al grupo.' + one: "%{count} usuario ha sido agregado al grupo." + other: "%{count} usuarios han sido agregados al grupo." errors: grant_trust_level_not_valid: "'%{trust_level}' no es un nivel de confianza válido." can_not_modify_automatic: "No se puede modificar un grupo automático" member_already_exist: - one: '''%{username}'' ya es miembro de este grupo.' - other: 'Los siguientes usuarios ya son miembros de éste grupo: %{username}' + one: "'%{username}' ya es miembro de este grupo." + other: "Los siguientes usuarios ya son miembros de éste grupo: %{username}" invalid_domain: "'%{domain}' no es un dominio válido." invalid_incoming_email: "'%{email}' no es una dirección de email válida." email_already_used_in_group: "'%{email}' ya está siendo utilizado por el grupo '%{group_name}'." @@ -291,8 +300,8 @@ es: title: "Solicitud de membresía para @%{group_name}" education: until_posts: - one: 1 post - other: '%{count} posts' + one: "1 post" + other: "%{count} posts" 'new-topic': | Bienvenido a %{site_name} — **¡gracias por comenzar una nueva conversación!** @@ -453,25 +462,25 @@ es: title: "Bienvenido a la Sala VIP" body: |2 - ¡Enhorabuena! :confetti_ball: + ¡Enhorabuena! :confetti_ball: - Si puedes ver este tema, es que has sido promocionado a usuario **habitual** (nivel de confianza 3). + Si puedes ver este tema, es que has sido promocionado a usuario **habitual** (nivel de confianza 3). - Ahora puedes … + Ahora puedes … - * Editar el título de cualquier tema - * Cambiar la categoría de cualquier tema - * Tus enlaces no llevarán automáticamente la etiqueta [nofollow](http://es.wikipedia.org/wiki/Nofollow) - * Acceder a la categoría privada Sala VIP, solo visible para usuarios de nivel 3 o más - * Ocultar spam con una sola vez que reportes + * Editar el título de cualquier tema + * Cambiar la categoría de cualquier tema + * Tus enlaces no llevarán automáticamente la etiqueta [nofollow](http://es.wikipedia.org/wiki/Nofollow) + * Acceder a la categoría privada Sala VIP, solo visible para usuarios de nivel 3 o más + * Ocultar spam con una sola vez que reportes - Consulta aquí [la lista actualizada de usuarios habituales](/badges/3/regular). ¡Manda un saludo! + Consulta aquí [la lista actualizada de usuarios habituales](/badges/3/regular). ¡Manda un saludo! - ¡Gracias por formar la parte más importante de esta comunidad! + ¡Gracias por formar la parte más importante de esta comunidad! - (Para saber más sobre niveles de confianza, [mira este tema][trust]. Por favor, ten en cuenta que solo los usuarios que continúen cumpliendo los requisitos a lo largo del tiempo seguirán en el nivel de usuarios habituales.) + (Para saber más sobre niveles de confianza, [mira este tema][trust]. Por favor, ten en cuenta que solo los usuarios que continúen cumpliendo los requisitos a lo largo del tiempo seguirán en el nivel de usuarios habituales.) - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: topic_prefix: "Definición de la categoría %{category}" replace_paragraph: "(Sustituye este primer párrafo con una descripción breve de tu nueva categoría. Esta descripción aparecerá en el área de selección de categoría, por ello, intenta que sea inferior a 200 caracteres. **Hasta que edites esta descripción o se creen temas, esta categoría no aparecerá en la página de categorías.**)" @@ -489,8 +498,8 @@ es: uncategorized: "Sin categoría no se puede eliminar" has_subcategories: "No se puede eliminar esta categoría porque tiene sub-categorías." topic_exists: - one: No se puede eliminar esta categoría porque tiene 1 tema. El más antiguo es %{topic_link}. - other: No se puede eliminar esta categoría porque tiene %{count} temas. El tema más antiguo es %{topic_link}. + one: "No se puede borrar esta categoría porque tiene 1 tema. El tema más antiguo es %{topic_link}." + other: "No se puede borrar esta categoría porque tiene %{count} temas. El tema más antiguo es %{topic_link}." topic_exists_no_oldest: "No se puede eliminar esta categoría porque el contador de temas está en %{count}." uncategorized_description: "Debates que no necesitan una categoría, o bien no encajan en alguna de las categorías existentes." trust_levels: @@ -527,85 +536,86 @@ es: unsubscribe_via_email: "Has alcanzado el número máximo de desuscripciones por email. Por favor espera %{time_left} antes de intentar de nuevo." topic_invitations_per_day: "Has alcanzado el número máximo de invitaciones al tema. Por favor espera %{time_left} antes de intentar de nuevo." hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" minutes: - one: 1 minuto - other: '%{count} minutos' + one: "1 minuto" + other: "%{count} minutos" seconds: - one: 1 segundo - other: '%{count} segundos' + one: "1 segundo" + other: "%{count} segundos" + short_time: "unos pocos segundos" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mon - other: '%{count}mon' + one: "1mon" + other: "%{count}mon" x_months: - one: 1mon - other: '%{count}mon' + one: "1mon" + other: "%{count}mon" about_x_years: - one: 1y - other: '%{count}y' + one: "1y" + other: "%{count}y" over_x_years: - one: '> 1y' - other: '> %{count}y' + one: "> 1y" + other: "> %{count}y" almost_x_years: - one: 1y - other: '%{count}y' + one: "1y" + other: "%{count}y" distance_in_words_verbose: half_a_minute: "ahora mismo" less_than_x_seconds: - one: ahora mismo - other: ahora mismo + one: "ahora mismo" + other: "ahora mismo" x_seconds: - one: hace 1 segundo - other: hace %{count} segundos + one: "hace 1 segundo" + other: "hace %{count} segundos" less_than_x_minutes: - one: hace menos de 1 minuto - other: hace menos de %{count} minutos + one: "hace menos de 1 minuto" + other: "hace menos de %{count} minutos" x_minutes: - one: hace 1 minuto - other: hace %{count} minutos + one: "hace 1 minuto" + other: "hace %{count} minutos" about_x_hours: - one: hace 1 hora - other: hace %{count} horas + one: "hace 1 hora" + other: "hace %{count} horas" x_days: - one: hace 1 día - other: hace %{count} días + one: "hace 1 día" + other: "hace %{count} días" about_x_months: - one: hace como 1 mes - other: hace como %{count} meses + one: "hace como 1 mes" + other: "hace como %{count} meses" x_months: - one: hace 1 mes - other: hace %{count} meses + one: "hace 1 mes" + other: "hace %{count} meses" about_x_years: - one: hace sobre 1 año - other: hace sobre %{count} años + one: "hace sobre 1 año" + other: "hace sobre %{count} años" over_x_years: - one: hace más de 1 año - other: hace más de %{count} años + one: "hace más de 1 año" + other: "hace más de %{count} años" almost_x_years: - one: hace casi 1 año - other: hace casi %{count} años + one: "hace casi 1 año" + other: "hace casi %{count} años" password_reset: no_token: "Lo sentimos, ese enlace para cambiar la contraseña es demasiado antiguo. Haz clic en el botón Iniciar sesión y utiliza el 'olvidé mi contraseña' para obtener un nuevo enlace. " choose_new: "Escoge una nueva contraseña" @@ -618,6 +628,17 @@ es: email_login: invalid_token: "Lo sentimos, ese enlace de inicio de sesión de correo electrónico es demasiado viejo. Seleccione el botón Iniciar sesión y use 'Olvidé mi contraseña' para obtener un nuevo enlace." title: "Email login" + user_auth_tokens: + devices: + android: 'Dispositivo Android' + linux: 'Ordenador Linux' + windows: 'Ordenador Windows' + mac: 'Mac' + iphone: 'iPhone' + ipad: 'iPad' + ipod: 'iPod' + mobile: 'Dispositivo móvil' + unknown: 'Dispositivo desconocido' change_email: confirmed: "Tu email ha sido actualizado." please_continue: "Continuar a %{site_name}" @@ -627,6 +648,8 @@ es: authorizing_old: title: "Gracias por confirmar tu dirección de correo actual" description: "Te enviaremos un email a tu nueva dirección para confirmar." + associated_accounts: + revoke_failed: "No se ha podido revocar la conexión con %{provider_name}." activation: action: "Haz clic aquí para activar tu cuenta" already_done: "Lo sentimos, este link de confirmación de cuenta ya no es válido. ¿Quizás tu cuenta ya está activa?" @@ -684,17 +707,12 @@ es: description: 'Te gusta este post' short_description: 'Te gusta este post' long_form: 'Te gusta esto' - vote: - title: 'Vota' - description: 'Vota por este post' - short_description: 'Vota por este post' - long_form: 'Votado para este post' user_activity: no_default: self: "No tienes actividad aún." others: "Sin actividad." no_bookmarks: - self: "No tienes temas en marcadores, añadir temas a marcadores te permite acceder a ellos más tarde fácilmente." + self: "No tienes posts en marcadores; añadir a marcadores permite que vuelvas a los temas rápidamente." others: "Sin marcadores." no_likes_given: self: "No le has dado a \"Me gusta\" en ningún tema." @@ -702,19 +720,25 @@ es: no_replies: self: "No tienes respuestas a ningún post." others: "Sin respuestas." + no_drafts: + self: "No tienes ningún borrador; empieza a escribir una respuesta en cualquier tema y se guardará automáticamente como nuevo borrador." + others: "No tienes permisos para ver los borradores de este usuario." topic_flag_types: spam: title: 'Spam' description: 'Este tema es un anuncio publicitario. No es útil ni relevante para este sitio, sino de naturaleza promocional.' long_form: 'marcar esto como spam' + short_description: 'Esto es un anuncio' inappropriate: title: 'Inapropiado' description: 'Este tema contiene material que una persona sensata podría considerar ofensivo, abusivo, o que viola las directrices de nuestra comunidad.' long_form: 'marcado como inapropiado' + short_description: 'Incumple nuestras directrices de la comunidad' notify_moderators: title: "Notificar a los moderadores" description: 'Este tema requiere atención del equipo de moderación basándose en las pautas de la comunidad o los Términos y condiciones, o por otra razón no especificada arriba.' long_form: 'reportado para atención de los moderadores' + short_description: 'Requiere atención del staff por otro motivo' email_title: 'El tema "%{title}" requiere la atención de un moderador' email_body: "%{link}\n\n%{message}" flagging: @@ -760,6 +784,41 @@ es: read: "Leer todo" write: "Escribir todo" reports: + default: + labels: + count: Cuenta + percent: Porcentaje + day: Día + post_edits: + title: "Ediciones" + labels: + post: Post + editor: Editor + author: Autor + edit_reason: Motivo + moderators_activity: + title: "Actividad de moderadores" + labels: + moderator: Moderador + flag_count: Reportes revisados + time_read: Tiempo de lectura + topic_count: Temas creados + post_count: Mensajes creados + pm_count: Mensajes privados creados + revision_count: Ediciones + flags_status: + title: "Estado de los reportes" + values: + agreed: De acuerdo + disagreed: En desacuerdo + deferred: Aplazado + no_action: Ninguna acción + labels: + flag: Tipo + assigned: Asignado + poster: Autor + flagger: Reportado por + time_to_resolution: Tiempo de resolución visits: title: "Visitas de usuario" xaxis: "Día" @@ -818,10 +877,14 @@ es: title: "Usuarios por nivel de confianza" xaxis: "Día" yaxis: "Número de usuarios" + labels: + level: Nivel users_by_type: title: "Usuarios por Tipos" xaxis: "Tipo" yaxis: "Número de Usuarios" + labels: + type: Tipo xaxis_labels: admin: Admin moderator: Moderador @@ -872,10 +935,15 @@ es: num_clicks: "Clics" num_topics: "Temas" num_users: "Usuarios" + labels: + domain: Dominio + num_clicks: Clics + num_topics: Temas top_referred_topics: title: "Los temas más referidos" - xaxis: "Tema" - num_clicks: "Clics" + labels: + num_clicks: "Clics" + topic: "Tema" page_view_anon_reqs: title: "Anónimas" xaxis: "Día" @@ -933,13 +1001,14 @@ es: xaxis: "Día" yaxis: "Total" mobile_visits: - title: "Visitas de Usuarios" + title: "Visitas de usuarios (móvil)" xaxis: "Día" yaxis: "Número de visita" web_crawlers: title: "Solicitudes de Rastreadores Web" - xaxis: "User Agent" - yaxis: "Páginas vistas" + labels: + user_agent: "Agente de usuario" + page_views: "Páginas vistas" dashboard: rails_env_warning: "Tu servidor está funcionando en modo de %{env}." host_names_warning: "Tu archivo 'config/database.yml' está utilizando un hostname predeterminado de 'localhost'. Actualízalo para usar el hostname de tu sitio." @@ -957,13 +1026,14 @@ es: failing_emails_warning: 'Hay %{num_failed_jobs} jobs de email que fallaron. Revisa tu app.yml y asegúrate que la configuración del servidor de mail es correcta. Mira los jobs fallados en Sidekiq.' subfolder_ends_in_slash: "La configuación del subdirectorio no es correcta; el campo DISCOURSE_RELATIVE_URL_ROOT termina con una barra." email_polling_errored_recently: - one: El email polling ha generado un error en las pasadas 24 horas. Mira en los logs para más detalles. - other: El email polling ha generado %{count} errores en las pasadas 24 horas. Mira en los logs para más detalles. + one: "El email polling ha generado un error en las pasadas 24 horas. Mira en los logs para más detalles." + other: "El email polling ha generado %{count} errores en las pasadas 24 horas. Mira en los logs para más detalles." missing_mailgun_api_key: "El servidor está configurado para enviar correos electrónicos a través de Mailgun pero no ha proporcionado una clave API utilizada para verificar los mensajes de webhook." bad_favicon_url: "El favicon está dando fallos en su carga. Revisa la opción favicon_url en Ajustes del sitio." poll_pop3_timeout: "La conexión al servidor POP3 está rebasando el tiempo de espera. Los emails entrantes no han podido ser recogidos. Por favor revisa los ajustes de POP3 y tu proveedor de servicio." poll_pop3_auth_error: "La conexión al servidor POP3 está fallando debido a un error de autenticación. Por favor revisa los ajustes POP3." force_https_warning: "Tu sitio web está usando SSL. Pero `force_https` no está aún habilitado en la configuración de tu sitio." + out_of_date_themes: "Hay actualizaciones disponibles para los siguientes temas:" site_settings: censored_words: "Las palabras serán reemplazadas con ■■■■" delete_old_hidden_posts: "Auto-borrar cualquier post que se quede oculto por mas de 30 días." @@ -987,6 +1057,7 @@ es: search_recent_posts_size: "Cuántos posts recientes mantener en el índice" log_search_queries: "Log de búsquedas de los usuarios" search_query_log_max_size: "Cantidad máxima de consultas a conservar" + search_query_log_max_retention_days: "Cantidad máxima de tiempo para mantener consultas de búsqueda, en días." allow_uncategorized_topics: "Permitir la creación de temas sin categoría. AVISO: Si ya hay algún tema sin categoría, debes recategorizarlo antes de activar esta opción." allow_duplicate_topic_titles: "Permitir temas con títulos idénticos, duplicados." unique_posts_mins: "¿Cuántos minutos deben pasar antes de que un usuario pueda publicar el mismo contenido de nuevo?" @@ -1040,7 +1111,6 @@ es: summary_max_results: "Máximo de posts devueltos en \"Resumen de este tema\"" enable_personal_messages: "Permitir que los usuarios con nivel de confianza 1 (configurable a través del mínimo nivel de confianza para enviar mensajes) crear mensajes y responder a ellos. Tenga en cuenta que el staff siempre puede enviar mensajes pase lo que pase." enable_system_message_replies: "Permite a los usuarios responder a los mensajes del sistema, incluso si los mensajes privados están inhabilitados." - enable_personal_email_messages: "Permita que el nivel de confianza 4 (configurable a través del nivel mínimo de confianza para enviar mensajes) envíe mensajes de correo electrónico privados. Tenga en cuenta que el personal siempre puede enviar mensajes, pase lo que pase." enable_long_polling: "Los mensajes usados para notificaciones pueden usar el long polling" long_polling_base_url: "URL base usada para el 'long polling' (cuando un CDN esta sirviendo contenido dinámico, asegúrate de ajustar esto al 'pull' de origen) ejemplo: http://origin.site.com" long_polling_interval: "Cantidad de tiempo que el servidor debe de esperar antes de responder a los clientes que no hay datos enviados (solamente usuarios con sesión iniciada)." @@ -1087,9 +1157,9 @@ es: post_menu: "Determina qué elementos aparecen en el menú de un post y en qué orden. Ejemplo: like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Los elementos del menú a ocultar por defecto en el menú de cada post a menos que se haga clic en el botón para expandir las opciones." share_links: "Determina qué elementos aparecen en el cuadro de compartir y en qué orden" - track_external_right_clicks: "Hacer seguimiento de los enlaces externos en los que se ha hecho clic con el botón derecho (ej: abrir en nueva pestaña) desactivado por defecto porque reescribe URLs" site_contact_username: "Nombre de usuario de moderador o administrador desde donde se enviarán mensajes automáticos. Si se deja en blanco, se utilizará la cuenta system por defecto." send_welcome_message: "Enviar a todos los nuevos usuarios un mensaje de bienvenida con una guía rápida para comenzar." + send_tl1_welcome_message: "Enviar a los nuevos usuarios con nivel de confianza 1 un mensaje de bienvenida." suppress_reply_directly_below: "No mostrar el contador de respuestas desplegable en un post si solo hay una única respuesta y está justamente debajo del post en cuestión." suppress_reply_directly_above: "No mostrar el en-respuesta-a desplegable en un post cuando solo hay una sola respuesta justo encima del post." suppress_reply_when_quoting: "No mostrar el desplegable en-respuesta-a en un post cuando el post cite la respuesta." @@ -1144,8 +1214,8 @@ es: enable_google_oauth2_logins: "Habilita la autenticación con Google Oauth2. Este es el método de autenticación a la que Google da soporte actualmente. Requiere de una clave de cliente y una clave secreta." google_oauth2_client_id: "Client ID de tu aplicación Google." google_oauth2_client_secret: "Client secret de tu aplicación Google." - google_oauth2_prompt: "Una lista delimitada por espacios de valores de cadena que especifica si el servidor de autorizaciones solicita al usuario la reautenticación y el consentimiento. Consulte https://developers.google.com/identity/protocols/OpenIDConnect#prompt para conocer los valores posibles." - google_oauth2_hd: "Dominio hospedado de Google Apps al que se limitará el inicio de sesión. Consulte https://developers.google.com/identity/protocols/OpenIDConnect#hd-param para obtener más detalles." + google_oauth2_prompt: "Una lista opcional delimitada por espacios de valores de cadena que especifica si el servidor de autorizaciones solicita al usuario la reautenticación y el consentimiento. Consulte https://developers.google.com/identity/protocols/OpenIDConnect#prompt para conocer los valores posibles." + google_oauth2_hd: "Un dominio opcional hospedado de Google Apps al que se limitará el inicio de sesión. Consulte https://developers.google.com/identity/protocols/OpenIDConnect#hd-param para más detalles." enable_twitter_logins: "Activar autenticación por Twitter, requiere una twitter_consumer_key y un twitter_consumer_secret" twitter_consumer_key: "Clave del consumidor para la autenticación de Twitter, registrado en https://apps.twitter.com/" twitter_consumer_secret: "Secreto del consumidor para la autenticación de Twitter, registrado en https://apps.twitter.com/" @@ -1166,6 +1236,8 @@ es: backup_frequency: "El número de días entre backups." enable_s3_backups: "Sube copias de seguridad a S3 cuando complete. IMPORTANTE: requiere credenciales validas de S3 puestas Archivos configuración." s3_backup_bucket: "El bucket remoto para mantener copias de seguridad. AVISO: Asegúrate de que es un bucket privado." + s3_endpoint: "El punto final se puede modificar para realizar una copia de seguridad en un servicio compatible con S3 como DigitalOcean Spaces o Minio. ADVERTENCIA: utilice el valor predeterminado si usa AWS S3" + s3_force_path_style: "Haga cumplir el direccionamiento de estilo de ruta para su punto final personalizado. IMPORTANTE: se requiere para usar cargas y copias de seguridad desde Minio." s3_disable_cleanup: "Desactivar el eliminado de backups de S3 cuando se eliminen de forma local." backup_time_of_day: "Hora UTC del día cuando debería ejecutarse el backup." backup_with_uploads: "Incluir archivos adjuntos en los backups programados. Desactivando esta opción tan solo se ejecutará una copia de seguridad de la base de datos." @@ -1191,6 +1263,8 @@ es: max_topic_invitations_per_day: "Máximo número de invitaciones a un tema que un usuario puede enviar por día." max_logins_per_ip_per_hour: "Máximo número de inicios de sesión permitidos por direcciones IP por hora." max_logins_per_ip_per_minute: "Máximo número de inicios de sesión permitidos por direcciones IP por minuto." + max_post_deletions_per_minute: "Número máximo de publicaciones que un usuario puede eliminar por minuto." + max_post_deletions_per_day: "Número máximo de publicaciones que un usuario puede eliminar por día." alert_admins_if_errors_per_minute: "Número de errores por minuto que activa la alerta a administración. Un valor de 0 desactiva esta funcionalidad. NOTA: requiere reiniciar la instancia." alert_admins_if_errors_per_hour: "Número de errores por hora que activa la alerta a administración. Un valor de 0 desactiva esta funcionalidad. NOTA: requiere reiniciar la instancia." categories_topics: "Número de temas a mostrar en la página de /categorías." @@ -1211,8 +1285,10 @@ es: avatar_sizes: "Lista de tamaños de avatar generados automáticamente." external_system_avatars_enabled: "Usar un servicio externo para los avatares." external_system_avatars_url: "Dirección URL del servicio externo para los avatares. Sustituciones permitidas: {username} {first_letter} {color} {size}" - default_opengraph_image_url: "URL de la imagen opengraph por defecto." - twitter_summary_large_image_url: "URL de la imagen por defecto para la tarjeta resumen de Twitter (debería ser al menos de 280px de ancho y 150 px de alto)." + selectable_avatars_enabled: "Forzar a los usuarios a elegir una foto de perfil de la lista." + selectable_avatars: "Lista de fotos de perfil de la cual los usuarios pueden elegir." + default_opengraph_image_url: "URL de la imagen opengraph por defecto, utilizado cuando la página no tiene otra imagen o logotipo del sitio adecuado." + twitter_summary_large_image_url: "URL de la imagen por defecto para la tarjeta resumen de Twitter (debería ser al menos de 280px de ancho y 150px de alto)." allow_all_attachments_for_group_messages: "Permitir todos los archivos adjuntos de email para los mensajes a grupos." png_to_jpg_quality: "Calidad del archivo JPG convertido (1 es calidad mínima, 99 es máxima calidad, 100 para deshabilitar conversión)." allow_staff_to_upload_any_file_in_pm: "Permitir a los miembros del staff subir cualquier archivo en MP." @@ -1252,10 +1328,10 @@ es: min_trust_to_edit_post: "El mínimo nivel de confianza requerido para editar posts." min_trust_to_allow_self_wiki: "El mínimo nivel de confianza requerido para que un usuario convierta sus propios posts a wiki." min_trust_to_send_messages: "El mínimo nivel de confianza requerido para crear nuevos mensajes personales." - min_trust_to_send_email_messages: "El nivel de confianza mínimo necesario para enviar nuevos mensajes privados por correo electrónico (a los usuarios staged)." min_trust_to_flag_posts: "El mínimo nivel de confianza requerido para reportar posts" min_trust_to_post_links: "El mínimo nivel de confianza requerido para incluir enlaces en posts" min_trust_to_post_images: "El nivel mínimo de confianza requerido para incluir imágenes en una publicación" + whitelisted_link_domains: "Dominios que los usuarios pueden vincular incluso si no tienen el nivel de confianza apropiado para publicar enlaces" newuser_max_links: "Cuántos enlaces puede un nuevo usuario añadir a un post." newuser_max_images: "Cuántas imágenes puede un nuevo usuario añadir a un post." newuser_max_attachments: "Cuántos adjuntos puede un nuevo usuario añadir a un post." @@ -1334,6 +1410,7 @@ es: unsubscribe_via_email: "Permitir a los usuarios darse de baja de los emails respondiendo con el texto 'unsubscribe' en el asunto o el cuerpo del mensaje" unsubscribe_via_email_footer: "Adjuntar un enlace para darse de baja al pie de los emails enviados" delete_email_logs_after_days: "Eliminar logs de email después de (N) días. Si es 0 permanecerán de forma indefinida." + disallow_reply_by_email_after_days: "Deshabilitar la respuesta por email después de (N) días. Si es 0 quedará de forma indefinida." max_emails_per_day_per_user: "Máximo número de emails a enviar a los usuarios por día. Establece 0 para desactivar el límite" enable_staged_users: "Crear cuentas provisionales automáticamente al procesar emails entrantes." maximum_staged_users_per_email: "Máximo número de usuarios provisionales creados al procesar un email entrante." @@ -1360,9 +1437,11 @@ es: pop3_polling_host: "El host utilizado para hacer polling de e-mails vía POP3." pop3_polling_username: "El nombre de usuario de la cuenta POP3 para hacer polling de e-mails." pop3_polling_password: "La contraseña de la cuenta POP3 para hacer polling de correos." + pop3_polling_delete_from_server: "Eliminar correos electrónicos del servidor. NOTA: si desactiva esto, debe limpiar manualmente su bandeja de entrada de correo" log_mail_processing_failures: "Registra todos los fallos de procesamiento de email a http://yoursitename.com/logs" email_in: "Permitir a los usuarios crear nuevos temas por email (requiere el polling pop3). Configura las direcciones en la pestaña \"Ajustes\" de cada categoría." email_in_min_trust: "El mínimo nivel de confianza requerido para poder publicar nuevos temas por email." + email_in_spam_header: "El encabezado del correo electrónico para detectar spam." email_prefix: "La [etiqueta] utilizada en el asunto de los emails. Si no está configurado, será por defecto el 'título'." email_site_title: "El título del sitio utilizado como remitente de los emails desde el sitio. Si no está configurado, será por defecto 'título'. Si tu 'título' contiene caracteres que no están permitidos en las cadenas del remitente del email, usa esta opción." find_related_post_with_key: "Solo usar la 'reply key' para encontrar el mensaje que respondió. ADVERTENCIA: deshabilitar esto permitirá al usuario impersonar basado en las direcciones de email." @@ -1372,7 +1451,7 @@ es: delete_all_posts_max: "El máximo número de posts que pueden ser eliminados a la vez con el botón \"Eliminar todos los posts\". Si un usuario tiene un mayor número de posts que este valor, éstos no podrán ser eliminados de una vez y el usuario no podrá ser eliminado." username_change_period: "El número máximo de días después de registrarse entre los cuales una cuenta puede cambiar su nombre de usuario (0 para deshabilitar el cambio de nombre)" email_editable: "Permitir a los usuarios cambiar su dirección de email después de registrarse." - logout_redirect: "Destino hacia donde redirigir el navegador después de cerrar sesión (ej: http://sitio.com/salida)" + logout_redirect: "Ubicación para redirigir el navegador a después del cierre de sesión (por ejemplo: http://example.com/logout)" allow_uploaded_avatars: "Permitir a los usuarios subir imágenes de perfil personalizadas." allow_animated_avatars: "Permitir a los usuarios utilizar imágenes de perfil animadas en gif. AVISO: ejecuta la tarea rake avatars:refresh después de cambiar esta opción." allow_animated_thumbnails: "Generar miniaturas en movimiento de los gifs animados." @@ -1444,6 +1523,7 @@ es: enable_emoji_shortcuts: "Texto común de emoticones como :) :p :( serán convertidos a emojis" emoji_set: "¿De qué tipo os gustan los emoji?" enforce_square_emoji: "Forzar una relación de aspecto cuadrada para todos los emojis." + emoji_autocomplete_min_chars: "Número mínimo de caracteres necesarios para que aparezca el diálogo de selección de emoji" approve_post_count: "La cantidad de posts que deben ser aprobados de usuarios nuevos o de nivel básico" approve_unless_trust_level: "Los posts de usuarios con un nivel de confianza inferior a este deberán ser aprobados" approve_new_topics_unless_trust_level: "Los nuevos temas de usuarios por debajo de este nivel de confianza deben ser aprobados" @@ -1557,68 +1637,67 @@ es: not_seen_in_a_month: "¡Bienvenido de vuelta! No te habíamos visto en un tiempo. Estos son los temas mas populares desde que no has estado." merge_posts: edit_reason: - one: Un tema fue juntado por %{username} - other: '%{count} mensaje fueron juntados por %{username}' + one: "Un tema fue juntado por %{username}" + other: "%{count} mensaje fueron juntados por %{username}" errors: different_topics: "Mensajes que pertenecen a temas diferentes no pueden ser juntados." different_users: "Mensajes que pertenecen a diferentes usuarios no pueden ser juntados." move_posts: new_topic_moderator_post: - one: 'un post fue trasladado a un nuevo tema: %{topic_link}' - other: '%{count} posts fueron trasladados a un nuevo tema: %{topic_link}' + one: "un post fue trasladado a un nuevo tema: %{topic_link}" + other: "%{count} posts fueron trasladados a un nuevo tema: %{topic_link}" existing_topic_moderator_post: - one: 'Un post fue trasladado al siguiente tema: %{topic_link}' - other: '%{count} posts fueron trasladados al siguiente tema: %{topic_link}' + one: "Un post fue trasladado al siguiente tema: %{topic_link}" + other: "%{count} posts fueron trasladados al siguiente tema: %{topic_link}" change_owner: - post_revision_text: "Se ha transferido la propiedad de %{old_user} a %{new_user}" - deleted_user: "un usuario eliminado" + post_revision_text: "Se ha transferido la propiedad" topic_statuses: archived_enabled: "Este tema está ahora archivado. Se paraliza y no puede ser cambiado en ningún modo." archived_disabled: "Este tema se ha desarchivado. Se desparaliza y ahora puede ser cambiado." closed_enabled: "Este tema está ahora cerrado. No se admiten nuevas respuestas." closed_disabled: "Este tema ahora está abierto. Se admiten nuevas respuestas." autoclosed_message_max_posts: - one: Este mensaje fue cerrado automáticamente al alcanzar el límite máximo de 1 respuesta. - other: Este mensaje fue cerrado automáticamente al alcanzar el límite máximo de %{count} respuestas. + one: "Este mensaje fue cerrado automáticamente al alcanzar el límite máximo de 1 respuesta." + other: "Este mensaje fue cerrado automáticamente al alcanzar el límite máximo de %{count} respuestas." autoclosed_topic_max_posts: - one: Este tema fue cerrado automáticamente al alcanzar el límite máximo de 1 respuesta. - other: Este tema fue cerrado automáticamente al alcanzar el límite máximo de %{count} respuestas. + one: "Este tema fue cerrado automáticamente al alcanzar el límite máximo de 1 respuesta." + other: "Este tema fue cerrado automáticamente al alcanzar el límite máximo de %{count} respuestas." autoclosed_enabled_days: - one: Este tema se cerró automáticamente después de 1 día. No se permiten nuevas respuestas. - other: Este tema se cerró automáticamente después de %{count} días. No se permiten nuevas respuestas. + one: "Este tema se cerró automáticamente después de 1 día. No se permiten nuevas respuestas." + other: "Este tema se cerró automáticamente después de %{count} días. No se permiten nuevas respuestas." autoclosed_enabled_hours: - one: Este tema se cerró automáticamente después de 1 hora. No se permiten nuevas respuestas. - other: Este tema se cerró automáticamente después de %{count} horas. No se permiten nuevas respuestas. + one: "Este tema se cerró automáticamente después de 1 hora. No se permiten nuevas respuestas." + other: "Este tema se cerró automáticamente después de %{count} horas. No se permiten nuevas respuestas." autoclosed_enabled_minutes: - one: Este tema se cerró automáticamente después de 1 minuto. No se permiten nuevas respuestas. - other: Este tema se cerró automáticamente después de %{count} minutos. No se permiten nuevas respuestas. + one: "Este tema se cerró automáticamente después de 1 minuto. No se permiten nuevas respuestas." + other: "Este tema se cerró automáticamente después de %{count} minutos. No se permiten nuevas respuestas." autoclosed_enabled_lastpost_days: - one: Este tema se cerró automáticamente 1 día después del último post. No se permiten nuevas respuestas. - other: Este tema se cerró automáticamente %{count} días después del último post. No se permiten nuevas respuestas. + one: "Este tema se cerró automáticamente 1 día después del último post. No se permiten nuevas respuestas." + other: "Este tema se cerró automáticamente %{count} días después del último post. No se permiten nuevas respuestas." autoclosed_enabled_lastpost_hours: - one: Este tema se cerró automáticamente 1 hora después del último post. No se permiten nuevas respuestas. - other: Este tema se cerró automáticamente %{count} horas después del último post. No se permiten nuevas respuestas. + one: "Este tema se cerró automáticamente 1 hora después del último post. No se permiten nuevas respuestas." + other: "Este tema se cerró automáticamente %{count} horas después del último post. No se permiten nuevas respuestas." autoclosed_enabled_lastpost_minutes: - one: Este tema se cerró automáticamente 1 minuto después del último post. No se permiten nuevas respuestas. - other: Este tema se cerró automáticamente %{count} minutos después del último post. No se permiten nuevas respuestas. + one: "Este tema se cerró automáticamente 1 minuto después del último post. No se permiten nuevas respuestas." + other: "Este tema se cerró automáticamente %{count} minutos después del último post. No se permiten nuevas respuestas." autoclosed_disabled_days: - one: Este tema se abrió automáticamente después de 1 día. - other: Este tema se abrió automáticamente después de %{count} días. + one: "Este tema se abrió automáticamente después de 1 día." + other: "Este tema se abrió automáticamente después de %{count} días." autoclosed_disabled_hours: - one: Este tema se abrió automáticamente después de 1 hora. - other: Este tema se abrió automáticamente después de %{count} horas. + one: "Este tema se abrió automáticamente después de 1 hora." + other: "Este tema se abrió automáticamente después de %{count} horas." autoclosed_disabled_minutes: - one: Este tema se abrió automáticamente después de 1 minuto. - other: Este tema se abrió automáticamente después de %{count} minutos. + one: "Este tema se abrió automáticamente después de 1 minuto." + other: "Este tema se abrió automáticamente después de %{count} minutos." autoclosed_disabled_lastpost_days: - one: Este tema se abrió automáticamente 1 día después de la última respuesta. - other: Este tema se abrió automáticamente %{count} días después de la última respuesta. + one: "Este tema se abrió automáticamente 1 día después de la última respuesta." + other: "Este tema se abrió automáticamente %{count} días después de la última respuesta." autoclosed_disabled_lastpost_hours: - one: Este tema se abrió automáticamente 1 hora después de la última respuesta. - other: Este tema se abrió automáticamente %{count} horas después de la última respuesta. + one: "Este tema se abrió automáticamente 1 hora después de la última respuesta." + other: "Este tema se abrió automáticamente %{count} horas después de la última respuesta." autoclosed_disabled_lastpost_minutes: - one: Este tema se abrió automáticamente 1 minuto después de la última respuesta. - other: Este tema se abrió automáticamente %{count} minutos después de la última respuesta. + one: "Este tema se abrió automáticamente 1 minuto después de la última respuesta." + other: "Este tema se abrió automáticamente %{count} minutos después de la última respuesta." autoclosed_disabled: "El tema ahora está en abierto, se permiten respuestas." autoclosed_disabled_lastpost: "Este tema está ahora abierto. Se permiten nuevas respuestas." pinned_enabled: "Este tema ahora está destacado. Aparecerá en primer lugar en la lista de su categoría hasta que se deshaga el destacado de forma general por los moderadores o de forma particular por cada usuario para sí." @@ -1656,9 +1735,17 @@ es: already_logged_in: "Ups, parece que estás intentando aceptar una invitación dirigida a otro usuariol. Si no eres %{current_user}, por favor cierra sesión e inténtalo de nuevo." second_factor_title: "Autenticación Dos Factores" second_factor_description: "Por favor ingrese el código de autenticación desde tu aplicación:" - invalid_second_factor_code: "Código de Autenticación inválido" + second_factor_backup_description: "Por favor, introduce uno de los códigos de respaldo:" + second_factor_backup_title: "Código de respaldo de verificación" + invalid_second_factor_code: "Código de autentificación no válido. Cada código puede usarse solo una vez." + second_factor_toggle: + totp: "Usar una aplicación de verificación en su lugar" + backup_code: "Usar un código de respaldo en su lugar" + admin: + email: + sent_test: "¡enviado!" + sent_test_disabled: "no se ha podido enviar el email porque están desactivados" user: - no_accounts_associated: "No hay cuentas relacionadas." deactivated: "Ha sido desactivado a causa de muchos rebotes al email '%{email}'." deactivated_by_staff: "Desactivado por el staff" activated_by_staff: "Activado por el staff" @@ -1690,11 +1777,11 @@ es: same_ip_address: "Misma dirección de IP (%{ip_address}) como otros usuarios" flags_reminder: flags_were_submitted: - one: Hay un reporte enviados hace 1 hora. [Por favor, revísalo](/admin/flags). - other: Hay reportes enviados hace %{count} horas. [Por favor, revísalos](/admin/flags). + one: "Hay un reporte enviados hace 1 hora. [Por favor, revísalo](/admin/flags)." + other: "Hay reportes enviados hace %{count} horas. [Por favor, revísalos](/admin/flags)." subject_template: - one: 1 reporte esperando ser atendidos. - other: '%{count} reportes esperando ser atendidos.' + one: "1 reporte esperando ser atendidos." + other: "%{count} reportes esperando ser atendidos." unsubscribe_mailer: title: "Darse de baja" subject_template: "Confirma que no quieres recibir más emails de %{site_title}" @@ -1891,8 +1978,8 @@ es: deferred: "Gracias por hacérnoslo saber. Estamos revisándolo." deferred_and_deleted: "Gracias por hacérnoslo saber. Hemos eliminado el post." temporarily_closed_due_to_flags: - one: Este tema está temporalmente cerrado por 1 hora debido a un gran número de reportes de la comunidad. - other: Este tema está temporalmente cerrado por %{count} horas debido a un gran número de reportes de la comunidad. + one: "Este tema está temporalmente cerrado por 1 hora debido a un gran número de reportes de la comunidad." + other: "Este tema está temporalmente cerrado por %{count} horas debido a un gran número de reportes de la comunidad." system_messages: private_topic_title: "Tema #%{id}" contents_hidden: "Por favor, visita el post para ver su contenido." @@ -1928,11 +2015,26 @@ es: Varios miembros de la comunidad han reportado tu mensaje antes de que éste se haya ocultado. **Porque este post ha sido ocultado más de una vez, permanecerá oculto hasta que personal del staff lo revise.** Para aprender más, por favor leer nuestra [guía de la comunidad](%{base_url}/guidelines). + flags_agreed_and_post_deleted: + title: "Tema reportado y eliminado por el staff" + subject_template: "Tema reportado y eliminado por el staff" + text_body_template: | + Hola, + + Esto es un mensaje automático de %{site_name} para hacerte saber que tu mensaje ha sido eliminado. + + <%{base_url}%{url}> + + %{flag_reason} + + Este mensaje ha sido reportado por la comunidad y un miembro del equipo ha decidido eliminarlo. + + Por favor, revisa nuestras [directrices de la comunidad](%{base_url}/guidelines) para más detalles. usage_tips: text_body_template: | Si quieres unos consejos para empezar, [echa un vistazo a esta entrada de blog](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). - Conforme vayas participando por aquí, te iremos conociendo más, y tus limitaciones temporales como nuevo usuario serán levantadas. Con el tiempo ganarás [niveles de confianza](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) que incluyen habilidades especiales para ayudarnos a gestionar la comunidad juntos. + Conforme vayas participando por aquí, te iremos conociendo más, y tus limitaciones temporales como nuevo usuario serán levantadas. Con el tiempo ganarás [niveles de confianza](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) que incluyen habilidades especiales para ayudarnos a gestionar la comunidad juntos. welcome_user: title: "Bienvenido Usuario" subject_template: "¡Bienvenido a %{site_name}!" @@ -1944,6 +2046,13 @@ es: Creemos en una comunidad con un [comportamiento civilizado](%{base_url}/guidelines). ¡Disfruta de tu estancia! + welcome_tl1_user: + title: "Bienvenida al Usuario NC1" + subject_template: "Gracias por pasar tiempo con nosotros" + text_body_template: | + Hola. Hemos visto que has estado leyendo muchas cosas, que es fantástico, ¡así que te hemos aumentado el [nivel de confianza](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/)! + + Nos alegra que hayas pasado tiempo con nosotros y nos gustaría saber más sobre ti. Si puedes, tómate un minuto para [completar tu perfil](/my/preferences/profile) o [empieza un nuevo tema](/categories) si quieres. welcome_invite: title: "Bienvenido Invitado" subject_template: "¡Bienvenido a %{site_name}!" @@ -2168,10 +2277,6 @@ es: email_reject_old_destination: title: "Correo electrónico rechazo antiguo destino" subject_template: "[%{email_prefix}] Problema con el correo -- Estás intentando responder a una notificación antigua" - text_body_template: | - Lo sentimos, pero tu mensaje de correo a %{destination} (titulado %{former_title}) no ha funcionado. - - Por razones de seguridad nosotros solo aceptamos respuestas a notificaciones originales para 90 días. Por favor [visita el tema](%{short_url}) para continuar esta conversación. email_reject_topic_not_found: title: "Email rechazado, tema no encontrado" subject_template: "[%{email_prefix}] Problema con el correo -- Tema no encontrado" @@ -2210,17 +2315,16 @@ es: Si dispones de una interfaz de usuario web para la cuenta de correo POP, es posible que debas iniciar sesión allí y comprobar su configuración. + email_revoked: + title: "Email revocado" + subject_template: "¿Es tu correo electrónico correcto?" + text_body_template: | + Lo sentimos, pero estamos teniendo problemas para contactarte por correo. Nuestros últimos mensajes nos han sido devueltos como imposibles de entregar. + + ¿Podrías comprobar que [tu dirección de email](%{base_url}/my/preferences/email) es válida y funciona? También puedes añadir nuestra dirección a tu agenda para mejorar la entregabilidad. too_many_spam_flags: title: "Demasiadas banderas por Spam" subject_template: "Nueva cuenta retenida" - text_body_template: | - Hola, - - Esto es un mensaje automático de %{site_name} para hacerte saber que tus mensajes han sido ocultados temporalmente porque han sido reportados muchas veces por la comunidad. - - Como medida cautelar, tu cuenta nueva ha sido silenciada de crear nuevas respuestas o debates hasta que un miembro del staff la revise tu cuenta. Sentimos las molestias ocasionadas. - - Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines). too_many_tl3_flags: title: "Demasiadas banderas NC3" subject_template: "Nueva cuenta retenida" @@ -2277,8 +2381,8 @@ es: pending_users_reminder: title: "Recordatorio de usuarios pendientes de revisión" subject_template: - one: 1 usuario esperando aprobación - other: '%{count} usuarios esperando aprobación' + one: "1 usuario esperando aprobación" + other: "%{count} usuarios esperando aprobación" text_body_template: | Hay nuevos registros de usuario esperando ser aprobados (o no) antes de poder acceder al foro. @@ -2306,8 +2410,8 @@ es: queued_posts_reminder: title: "Recordatorio de post en revisión" subject_template: - one: 1 post esperando a ser revisado - other: '%{count} posts esperando a ser revisados' + one: "1 post esperando a ser revisado" + other: "%{count} posts esperando a ser revisados" text_body_template: | Hola, @@ -2325,19 +2429,20 @@ es: user_notifications: previous_discussion: "Respuestas anteriores" reached_limit: - one: 'ADVERTENCIA: has superado el límite de 1 email diario. Revisa el sitio para ver las otras notificaciones que no te han llegado.' - other: 'ADVERTENCIA: has superado el límite de %{count} emails diarios. Las próximas notificaciones de emails serán suprimidas. PD: gracias por ser tan popular!' + one: "ADVERTENCIA: has superado el límite de 1 email diario. Revisa el sitio para ver las otras notificaciones que no te han llegado." + other: "ADVERTENCIA: has superado el límite de %{count} emails diarios. Las próximas notificaciones de emails serán suprimidas. PD: gracias por ser tan popular!" in_reply_to: "En respuesta a" unsubscribe: title: "Darse de baja" description: "¿No estás interesado en recibir estos emails? ¡No hay problema! Haz clic abajo para darte de baja de forma instantánea:" reply_by_email: "[Visita el tema](%{base_url}%{url}) o responde a este email para publicar." - reply_by_email_pm: "[Visita el mensaje](%{base_url}%{url}) o responde a este email para comentar." + reply_by_email_pm: "[Visitar Mensaje](%{base_url}%{url}) o responde a este email para contestar a %{participants}." only_reply_by_email: "Responde a este email para comentar." + only_reply_by_email_pm: "Responde a este email para contestar a %{participants}." visit_link_to_respond: "[Visita el tema](%{base_url}%{url}) para responder." - visit_link_to_respond_pm: "[Visita el mensaje](%{base_url}%{url}) para responder." + visit_link_to_respond_pm: "[Visitar Mensaje](%{base_url}%{url}) para responder a %{participants}." posted_by: "Publicado por %{username} el %{post_date}" - pm_participants: "Participantes:" + pm_participants: "Participantes: %{participants}" invited_group_to_private_message_body: | %{username} te invitó en @%{group_name} al mensaje @@ -2685,7 +2790,7 @@ es: recent_topics: "Recientes" see_more: "Más" search_title: "Busca en este sitio" - search_google: "Google" + search_button: "Buscar" offline: title: "No carga app" offline_page_message: "¡Parece que estás offline! Por favor revisa tu conexión a internet e intenta de nuevo." @@ -2719,32 +2824,36 @@ es: flag_reason: sockpuppet: "Un nuevo usuario ha creado un tema, y otro nuevo usuario con la misma dirección IP (%{ip_address}) le ha respondido. Mira la opción \"flag_sockpuppets\" en la configuración del sitio." spam_hosts: "Un nuevo usuario intentó crear varios temas con enlaces al mismo dominio (%{domain}). Mira la opción \"newuser_spam_host_threshold\" en la configuración del sitio." - email_log: - post_user_deleted: "El autor de la publicación ha sido eliminado." - no_user: "No se puede encontrar al usuario con id %{user_id}" - anonymous_user: "El usuario es anónimo" - suspended_not_pm: "El usuario está suspendido, no mensaje" - seen_recently: "El usuario fue visto hace poco" - post_not_found: "No se puede encontrar un post con id %{post_id}" - notification_already_read: "La notificación de la que informaba este email ya ha sido leída" - topic_nil: "post.topic es nulo" - post_deleted: "el post fue eliminado por su autor" - user_suspended: "el usuario fue suspendido" - already_read: "el usuario ya ha leído este post" - exceeded_emails_limit: "Se ha excedido el max_emails_per_day_per_user" - exceeded_bounces_limit: "Se ha excedido el bounce_score_threshold" - message_blank: "el mensaje está en blanco" - message_to_blank: "message.to está en blanco" - text_part_body_blank: "text_part.body está en blanco" - body_blank: "el cuerpo está en blanco" - no_echo_mailing_list_mode: "Modo lista de correo desactivado para los post del usuario" + skipped_email_log: + user_email_anonymous_user: "El usuario es anónimo" + user_email_user_suspended_not_pm: "El usuario está suspendido, no es un mensaje" + user_email_seen_recently: "El usuario ha sido visto recientemente" + user_email_notification_already_read: "La notificación sobre la que va el correo ya ha sido leída" + user_email_notification_topic_nil: "post.topic es nulo" + user_email_post_user_deleted: "El usuario del post ha sido eliminado." + user_email_post_deleted: "el mensaje ha sido eliminado por el autor" + user_email_user_suspended: "el usuario ha sido suspendido" + sender_message_blank: "el mensaje está en blanco" + sender_message_to_blank: "mensage.to está en blanco" color_schemes: base_theme_name: "Base" - default: "Esquema Claro" + light: "Esquema claro" dark: "Esquema Oscuro" - default_theme_name: "Por defecto" - dark_theme_name: "Oscuro" + neutral: "Esquema neutral" + grey_amber: "Esquema gris-ámbar" + shades_of_blue: "Esquema gama azul" + latte: "Gama Latte" + summer: "Gama veraniega" + dark_rose: "Gama rosa oscura" + default_theme_name: "Claro" light_theme_name: "Claro" + dark_theme_name: "Oscuro" + neutral_theme_name: "Neutral" + grey_amber_theme_name: "Gris ámbar" + shades_of_blue_theme_name: "Gama azul" + latte_theme_name: "Latte" + summer_theme_name: "Veraniego" + dark_rose_theme_name: "Rosa oscuro" about: "Acerca de" guidelines: "Directrices" privacy: "Privacidad" @@ -3087,69 +3196,45 @@ es: Este distintivo se concede la primera vez que editas uno de tus posts. Aunque no siempre podrás editar tus posts, editar es una buena idea — te permite mejorar tus posts, corregir pequeños errores o añadir algo que se te había pasado. ¡Editar hace mejores tus publicaciones! basic_user: name: Básico - description: "Dispone de todas las funciones esenciales de la comunidad" + description: "Dispone de todas las funciones esenciales de la comunidad" long_description: | - Este distintivo se concede cuando alcanzas el nivel de confianza 1. Gracias por pasar por aquí un momento y leer unos cuantos temas para ver de qué va esta comunidad. Las restricciones de nuevo usuario se eliminan y podrás usar las funcionalidades esenciales del sitio como enviar mensajes a otras personas, reportar posts, editar posts wiki y publicar imágenes o varios enlaces. + Este distintivo se concede cuando alcanzas el nivel de confianza 1. Gracias por pasar por aquí y leer unos cuantos temas para aprender acerca de qué es esta comunidad. Las restricciones de nuevo usuario se han eliminado; podrás usar las funcionalidades esenciales como enviar mensajes privados a otras personas, reportar posts, editar posts wiki y publicar con múltiples imágenes y enlaces. member: name: Miembro - description: "Disponen de invitaciones, mensaje a grupos y más \"me gusta\"" - long_description: | - Este distintivo se concede cuando alcanzas el nivel de confianza 2. Gracias por tu constante participación en la comunidad. Ahora puedes enviar invitaciones a otras personas desde tu perfil o temas individuales, enviar mensajes a grupos y dar más Me gusta por día. + description: "Disponen de invitaciones, mensaje a grupos y más \"me gusta\"" regular: name: Habitual - description: "Disponen del poder recategorizar, renombrar, publicar enlacer sin el tag no-follow y más me gusta" - long_description: | - Este distintivo se concede cuando alcanzas el nivel de confianza 3. Gracias por tomar parte activa de nuestra comunidad por tanto tiempo, ser uno de los más ávidos lectores y contribuir tanto a su crecimiento y calidad. Ahora puedes recategorizar o renombrar temas, acceder al área vip, reportar spam de forma más contundente y dar muchos más Me gusta por día. + description: "Disponen del poder recategorizar, renombrar, publicar enlacer sin el tag no-follow y más me gusta" leader: name: Líder - description: "Dispone de poder editar, destacar, cerrar, archivar, dividir y combinar temas globalmente" - long_description: | - Este distintivo se concede cuando alcanzas el nivel de confianza 4. Eres un líder de la comunidad elegido por los administradores, constituyes un ejemplo positivo para los demás mediante tus hechos y palabras. Ahora puedes editar todos los posts, dar muchísimos Me gusta por día y realizar acciones de moderador como destacar temas, cerrarlos, archivarlos, hacerlos invisibles, dividirlos o integrarlos. + description: "Dispone de poder editar, destacar, cerrar, archivar, dividir y combinar temas globalmente" welcome: name: ¡Bienvenido/a! description: Recibió un "me gusta" - long_description: | - Este distintivo se concede cuando recibes tu primer Me gusta en un post. ¡Enhorabuena, has publicado algo que la comunidad considera guay, útil o interesante! autobiographer: name: Autobiógrafo description: "Detalló información en su perfil de usuario" - long_description: | - Este distintivo se otorga por completar tu perfil de usuario y seleccionando una foto de perfil. Permitiendo a la comunidad saber más sobre ti y tus intereses hace que la comunidad sea mejor y esté más conectada. ¡Anímate! anniversary: name: Aniversario description: Miembro activo desde hace un año y que ha publicado al menos una vez - long_description: | - Este distintivo se concede cuando cumples un año como miembro que ha publicado al menos un post. Gracias por pasarte por aquí y contribuir a nuestra comunidad. ¡No lo podríamos haber logrado sin ti! nice_post: name: Buena respuesta description: Recibió 10 "me gusta" en una respuesta - long_description: | - Este distintivo se concede cuando tu respuesta logra obtener 10 Me gusta. ¡Tu respuesta tuvo un buena impresión en la comunidad y ayudó a avanzar en la conversación! good_post: name: Gran respuesta description: Recibió 25 "me gusta" en una respuesta - long_description: | - Este distintivo se concede cuando tu respuesta logra obtener 25 Me gusta. ¡Tu respuesta fue excepcional y ayudó mucho a avanzar en la conversación! great_post: name: Excelente respuesta description: Recibió 50 "me gusta" en una respuesta - long_description: | - Este distintivo se concede cuando tu respuesta logra obtener 50 Me gusta. ¡Tu respuesta fue inspiradora, fascinante o verdaderamente útil y la comunidad así lo valoró! nice_topic: name: Buen tema description: Recibió 10 "me gusta" en un tema - long_description: | - Este distintivo se concede cuando tu tema alcanza los 10 Me gusta. ¡Empezaste una conversación interesante con la que la comunidad ha disfrutado! good_topic: name: Gran tema description: Recibió 25 "me gusta" en un tema - long_description: | - Este distintivo se concede cuando tu tema alcanza los 25 Me gusta. ¡Has lanzado una conversación vibrante con la que la comunidad se ha reunido y está encantada! great_topic: name: Excelente tema description: Recibió 50 "me gusta" en un tema - long_description: | - Este distintivo se concede cuando tu tema alcanza los 50 Me gusta. ¡Creaste una conversación fascinante, con un debate movilizador que la comunidad ha disfrutado! nice_share: name: Buena contribución description: Compartió un post con 25 visitantes únicos @@ -3158,13 +3243,9 @@ es: good_share: name: Gran contribución description: Compartió un post con 300 visitantes únicos - long_description: | - Este distintivo se concede por compartir un enlace a un post que ha recibido 300 visitantes nuevos. ¡Genial! Has descubierto un debate interesante para mucha gente que no conocía el sitio y nos has ayudado a crecer. great_share: name: Excelente contribución description: Compartió un post con 1000 visitantes únicos - long_description: | - Este distintivo se concede por compartir un enlace a un post que ha recibido 1000 visitantes nuevos. ¡Bravo! Has promovido un debate interesante para una inmensa audiencia que no conocía el sitio y nos has ayudado a crecer muchísimo. first_like: name: Primer "me gusta" description: Le dio a "me gusta" a un post @@ -3173,8 +3254,6 @@ es: first_flag: name: Primer reporte description: Reportó un post - long_description: | - Este distintivo se concede por reportar un post por primera vez. Reportar es la forma en que ayudamos a mantener este sitio limpio y dejar espacio para que todos aporten. Si detectas que alguna publicación requiere de la atención de un moderador por favor no dudes en reportarlo. También puedes usar el diálogo de reporte para enviar mensajes a otros usuarios. Si ves algún problema see a problem, :flag_black: ¡repórtalo! promoter: name: Promotor description: Invitó a un usuario @@ -3183,13 +3262,9 @@ es: campaigner: name: Paladín description: Invitó a 3 usuarios - long_description: | - Este distintivo se concede cuando has invitado a 3 personas que han pasado tiempo en el sitio y se han convertido en usuarios básicos. Una comunidad vibrante necesita de un flujo constante de nuevas voces que participen en las conversaciones. champion: name: Campeón description: Invitó a 5 miembros - long_description: | - Este distintivo se concede cuando has invitado a 5 personas que han pasado el suficiente tiempo en el sitio como para convertirse en miembros de pleno derecho. ¡Bravo! ¡Gracias por enriquecer la diversidad de la comunidad con nuevos miembros! first_share: name: Primer compartido description: Compartió un post @@ -3203,13 +3278,9 @@ es: first_quote: name: Primera Cita description: Citó un post - long_description: | - Este distintivo se otorga la primera vez que citas un post en tu respuesta. Citar secciones relevantes de posts anteriores ayuda a mantener los debates conectados y centrados en el tema. La forma más fácil de citar es seleccionando un trozo de cualquier post y utilizando el botón Citar que aparece al lado. ¡Cita generosamente! read_guidelines: name: Directrices leídas description: "Leyó las directrices de la comunidad" - long_description: | - Este distintivo se otorga por leer las directrices de la comunidad. Siguiendo y compartiendo estas simples directrices ayudas a construir una comunidad segura, divertida y sostenible para todos. Recuerda siempre que hay otra persona como tú al otro lado de la pantalla, ¡sé agradable! reader: name: Lector description: Leyó todas las respuestas en un tema con más de 100 respuestas @@ -3258,8 +3329,6 @@ es: crazy_in_love: name: Generoso description: Utilizó 50 "me gusta" 20 veces - long_description: | - Este distintivo se concede cuando das 20 veces todos los 50 me gusta que puedes utilizar al día. ¡Bravo! Eres un ejemplo de cómo incentivar a tus colegas miembros de la comunidad! thank_you: name: Agradecido/a description: "Ha recibido me gusta en 20 posts y dado a 10 " @@ -3273,8 +3342,6 @@ es: empathetic: name: Empático description: Ha recibido me gusta en 500 posts y dado a 1000 - long_description: | - Este distintivo se concede cuando has recibido 500 Me gusta en tus posts y has dado 1000 o más de vuelta. ¡Eres un auténtico ejemplo de generosidad! :two_hearts: first_emoji: name: Primer emoji description: Utilizó un emoji en un post @@ -3283,11 +3350,9 @@ es: first_mention: name: Primera mención description: Mencionó a un usuario en un post - long_description: "Este distintivo se concede la primera vez que mencionas a un @usuario en tu post. Las menciones generan una notificación a la persona, así saben de tu publicación. Comienza escribiendo una @ para mencionar a cualquier usuario o, si está permitido, a un grupo – es una forma útil de llamar su atención." first_onebox: name: Primer Onebox description: Publicó un enlace expandido vía Onebox - long_description: "Este distintivo se concede la primera vez que publicas un enlace en una línea aparte, que fue automáticamente expandido vía Onebox con un resumen del enlace, un título y (si estuvo disponible) una imagen." first_reply_by_email: name: Primera respuesta por email description: Respondió a un post vía email @@ -3301,15 +3366,12 @@ es: enthusiast: name: Entusiasta description: 10 días de visitas - long_description: Este distintivo se gana por visitas durante 10 días consecutivos. ¡Gracias por quedarte con nosotros por más de una semana! aficionado: name: Aficionado description: 100 días de visitas - long_description: Este distintivo se gana por visitas durante 100 días consecutivos. ¡Eso es más de tres meses! devotee: name: Devoto description: 365 días de visitas - long_description: "Este distintivo se gana por visitas durante 365 días consecutivos. ¡Wow, un año entero!" badge_title_metadata: "%{display_name} distintivo en %{site_title}" admin_login: success: "Email enviado" @@ -3333,7 +3395,7 @@ es: button: "Registrarse" title: "Registrar cuenta de administrador" help: "registra una nueva cuenta para empezar" - no_emails: "Desgraciadamente, no se han definido emails de administrador durante la instalación, por lo que finalizar la configuración podría ser difícil." + no_emails: "Por desgracia, no se han definido emails de administradores durante la configuración inicial, por lo que terminar de instalar el foro será complicado. Por favor, añade un correo de desarrollador en el archivo de configuración o crea una cuenta de administrador desde la consola." confirm_email: title: "Confirmar tu email" message: "

Hemos enviado un email de activación a %{email}. Por favor, sigue las intrucciones en el email para activar tu cuenta.

Si no llega, asegúrate que el email esté configurado correctamente en Discourse y comprueba tu carpeta de spam

" @@ -3436,10 +3498,10 @@ es: fields: favicon_url: label: "Icono pequeño" - description: "Imagen usada para representar tu página en los navegadores que se vea bien en tamaños pequelos como 32px por 32px." + description: "Imagen usada para representar tu página en los navegadores que se vea bien en tamaños pequeños como 32px por 32px. Extensiones recomendadas para las imágenes son PNG o JPG." apple_touch_icon_url: label: "Icono grande" - description: "Icono usado para representar tu página en dispositivos modernos y que se ve bien para tamaños grandes. El tamaño recomendado es al menos de 144px por 144px." + description: "Imagen de icono utilizada para representar su sitio en dispositivos modernos que se ve bien en tamaños más grandes. El tamaño recomendado es de al menos 512 px por 512 px." homepage: description: "Recomendamos mostrar los últimos temas en tu página principal, pero siempre puedes mostrar categorías (grupos de temas) en la página principal si prefieres." title: "Página de inicio" @@ -3448,8 +3510,14 @@ es: choices: latest: label: "Temas recientes" - categories: - label: "Categorías" + categories_only: + label: "Sólo Categorías" + categories_with_featured_topics: + label: "Categorías con Temas Destacados" + categories_and_latest_topics: + label: "Categorías y Temas Recientes" + categories_and_top_topics: + label: "Categorías y Temas Top" emoji: title: "Emoji" description: "¿Qué estilo de Emoji prefieres para tu comunidad? Siempre puedes añadir más Emojis personalizados a trvés de Admin, Personalizar, Emoji." @@ -3478,3 +3546,5 @@ es: staff_action_logs: not_found: "no encontrado" unknown: "desconocido" + user_merged: "%{username} se ha unido en esta cuenta" + user_delete_self: "Eliminado a si mismo de %{url}" diff --git a/config/locales/server.et.yml b/config/locales/server.et.yml index 988ae433cd..67910a7e87 100644 --- a/config/locales/server.et.yml +++ b/config/locales/server.et.yml @@ -124,8 +124,8 @@ et: reading_time: "Lugemise aeg" likes: "Meeldimisi" too_many_replies: - one: Vabandame, kuid ajutiselt on uutel kasutajatel lubatud 1 vastus teema kohta. - other: Vabandame, kuid ajutiselt on uutel kasutajatel lubatud %{count} vastust teema kohta. + one: "Vabandame, kuid ajutiselt on uutel kasutajatel lubatud 1 vastus teema kohta." + other: "Vabandame, kuid ajutiselt on uutel kasutajatel lubatud %{count} vastust teema kohta." embed: start_discussion: "Alusta vestlust" continue: "Jätka arutelu" @@ -135,35 +135,35 @@ et: no_hosts: "Sängitamiseks pole ühtegi hosti seadistatud." configure: "Sängitamise seadistamine" more_replies: - one: veel 1 vastus - other: veel %{count} vastust + one: "veel 1 vastus" + other: "veel %{count} vastust" loading: "Laen arutelu..." permalink: "Püsilink" imported_from: "See on kaasnev vestlusteema originaalsisestusele %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 vastus - other: '%{count} vastust' + one: "1 vastus" + other: "%{count} vastust" no_mentions_allowed: "Vabandust, sa ei saa teisi kasutajaid mainida." too_many_mentions: - one: Vabandust, sa tohid postituses vaid üht kasutajat mainida. - other: Vabandust, Sa tohid postituses vaid %{count} kasutajat mainida. + one: "Vabandust, sa tohid postituses vaid üht kasutajat mainida." + other: "Vabandust, Sa tohid postituses vaid %{count} kasutajat mainida." no_mentions_allowed_newuser: "Vabanda, uued kasutajad ei tohi teisi kasutajaid mainida." too_many_mentions_newuser: - one: Vabandust, uued kasutajad tohivad postituses vaid ühte kasutajat mainida. - other: Vabanda, uued kasutajad tohivad postituses vaid %{count} kasutajat mainida. + one: "Vabandust, uued kasutajad tohivad postituses vaid ühte kasutajat mainida." + other: "Vabanda, uued kasutajad tohivad postituses vaid %{count} kasutajat mainida." no_images_allowed: "Vabanda, uued kasutajad ei saa postitustesse pilte panna." too_many_images: - one: Vabandust, uued kasutajad tohivad postitusse panna vaid ühe pildi. - other: Vabandust, uued kasutajad tohivad postitusse panna vaid %{count} pilti. + one: "Vabandust, uued kasutajad tohivad postitusse panna vaid ühe pildi." + other: "Vabandust, uued kasutajad tohivad postitusse panna vaid %{count} pilti." no_attachments_allowed: "Vabanda, uued kasutajad ei tohi postitusse manuseid lisada." too_many_attachments: - one: Vabandust, uued kasutajad tohivad postitusele ainult ühe manuse lisada. - other: Vabandust, uued kasutajad tohivad postitusele ainult %{count} manust lisada. + one: "Vabandust, uued kasutajad tohivad postitusele ainult ühe manuse lisada." + other: "Vabandust, uued kasutajad tohivad postitusele ainult %{count} manust lisada." no_links_allowed: "Vabandust, uued kasutajad ei tohi postituses viiteid kasutada." too_many_links: - one: Vabandust, uued kasutajad tohivad postituses vaid ühte viidet kasutada. - other: Vabandust, uued kasutajad tohivad postituses vaid %{count} viidet kasutada. + one: "Vabandust, uued kasutajad tohivad postituses vaid ühte viidet kasutada." + other: "Vabandust, uued kasutajad tohivad postituses vaid %{count} viidet kasutada." spamming_host: "Vabandust, sa ei tohi sellele domeenile viidata." user_is_suspended: "Peatatud kasutajatel pole lubatud postitada." topic_not_found: "Midagi on valesti. Kas on võimalik, et antud teema suleti või kustutati samal ajal, kui te seda vaatasite?" @@ -217,8 +217,8 @@ et: trust_level_4: "usaldustase_4" education: until_posts: - one: 1 postitus - other: '%{count} postitust' + one: "1 postitus" + other: "%{count} postitust" 'new-topic': | Teretulemast saidile %{site_name} — **tänud uue vestluse alustamise eest!** @@ -306,27 +306,6 @@ et: Ilmselt peaksid sa selle teema administreerimise alt sulgema :wrench: (üleval paremal ja allääres), et teadandele vastuseid ei kuhjuks. lounge_welcome: title: "Teretulemast Lounge'i" - body: |2 - - Õnnitlused! :confetti_ball: - - Kui Sa seda teemat näed, oled hiljuti edutatud **püsiliikmeks** (usaldustase 3). - - Nüüd võid … - - * Muuta suvalise teema pealkirja - * Muuta suvalise teema foorumit - * Lasta kõiki oma viiteid järgida ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) on eemaldatud) - * Siseneda vaid usaldustasemel 3 ja kõrgemal olevatele kasutajatele mõeldud privaatse Salongi foorumisse - * Peita spämmi vaid ühe tähisega - - Siin on [hetke püsiliikmete nimekiri](/badges/3/regular). Tervita neid kindlasti. - - Täname, et oled meie kogukonna tähtis liige! - - (Täiendava info saamiseks usaldustasemete kohta [vaata teemat][trust]. Pea meeles, et vaid need liikmed kes jätkuvalt seatud nõudmisi täidavad püsivad püsiliikmetena.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Liigist %{category}" replace_paragraph: "(Asenda see paragrahv oma uues kategoorias kategooria lühitutvustusega. See juhis ilmub siis kategooriate vaates. Seega, katsu hoida kirjeldus alla 200 tähemärgi. **Kuniks sa pole muutnud seda kirjeldust või kuni sa pole loonud teemasid, ei ole seda kategooriat kategooriate lehel näha.**)" @@ -341,9 +320,6 @@ et: cannot_delete: uncategorized: "Ei saa kustutada Liigitamata liiki" has_subcategories: "Seda foorumit ei saa kustutada, kuna tal on alamfoorumid." - topic_exists: - one: Seda foorumit ei saa kustutada, kuna tal on 1 teema. Vanim teema on %{topic_link}. - other: Seda foorumit ei saa kustutada, kuna tal on %{count} teemat. Vanim teema on %{topic_link}. topic_exists_no_oldest: "Seda foorumit ei saa kustutada, kuna teemade arv on %{count}." uncategorized_description: "Teemad, mis ei vaja või mida ei saa liigitada ühegi olemasoleva foorumi alla." trust_levels: @@ -360,85 +336,85 @@ et: change_failed_explanation: "Üritasid alandada %{user_name} tasemele '%{new_trust_level}'. Samas on tal juba tase'%{current_trust_level}'. %{user_name} jääb tasemele '%{current_trust_level}' - kui soovid alandada kasutaja taset, siis lukusta kõigepealt usaldustase." rate_limiter: hours: - one: 1 tund - other: '%{count} tundi' + one: "1 tund" + other: "%{count} tundi" minutes: - one: 1 minut - other: '%{count} minutit' + one: "1 minut" + other: "%{count} minutit" seconds: - one: 1 sekund - other: '%{count} sekundit' + one: "1 sekund" + other: "%{count} sekundit" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1p - other: '%{count}p' + one: "1p" + other: "%{count}p" about_x_months: - one: 1kuu - other: '%{count}kuud' + one: "1kuu" + other: "%{count}kuud" x_months: - one: 1kuu - other: '%{count}kuud' + one: "1kuu" + other: "%{count}kuud" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" distance_in_words_verbose: half_a_minute: "just praegu" less_than_x_seconds: - one: hetk tagasi - other: hetk tagasi + one: "hetk tagasi" + other: "hetk tagasi" x_seconds: - one: 1 sekund tagasi - other: '%{count} sekundit tagasi' + one: "1 sekund tagasi" + other: "%{count} sekundit tagasi" less_than_x_minutes: - one: vähem kui 1 minut tagasi - other: vähem kui %{count} minutit tagasi + one: "vähem kui 1 minut tagasi" + other: "vähem kui %{count} minutit tagasi" x_minutes: - one: 1 minut tagasi - other: '%{count} minutit tagasi' + one: "1 minut tagasi" + other: "%{count} minutit tagasi" about_x_hours: - one: 1 tund tagasi - other: '%{count} tundi tagasi' + one: "1 tund tagasi" + other: "%{count} tundi tagasi" x_days: - one: 1 päev tagasi - other: '%{count} päeva tagasi' + one: "1 päev tagasi" + other: "%{count} päeva tagasi" about_x_months: - one: umbes 1 kuu tagasi - other: umbes%{count} kuud tagasi + one: "umbes 1 kuu tagasi" + other: "umbes%{count} kuud tagasi" x_months: - one: 1 kuu tagasi - other: '%{count} kuud tagasi' + one: "1 kuu tagasi" + other: "%{count} kuud tagasi" about_x_years: - one: umbes 1 aasta tagasi - other: umbes %{count} aastat tagasi + one: "umbes 1 aasta tagasi" + other: "umbes %{count} aastat tagasi" over_x_years: - one: üle 1 aasta tagasi - other: üle %{count} aasta tagasi + one: "üle 1 aasta tagasi" + other: "üle %{count} aasta tagasi" almost_x_years: - one: peaaegu 1 aasta tagasi - other: peaaegu %{count} aastat tagasi + one: "peaaegu 1 aasta tagasi" + other: "peaaegu %{count} aastat tagasi" password_reset: no_token: "Vabandust, see parooli uuendamise link on liiga vana. Vajuta sisselogimise nuppu ja kasuta värske lingi saamiseks 'Unustasin parooli'." choose_new: "Vali uus parool" @@ -498,13 +474,8 @@ et: title: 'Laigi' description: 'Laigi seda postitust' long_form: 'laikis seda' - vote: - title: 'Hääleta' - description: 'Hääleta selle postituse poolt' - long_form: 'hääletas selle postituse poolt' user_activity: no_bookmarks: - self: "Te ei ole postitustele järjehoidjaid lisanud. Postitustele järjehoidjate lisamine lubab nende juurde hiljem hõlpsasti tagasi pöörduda." others: "Järjehoidjad puuduvad." no_likes_given: self: "Sa pole oma meeldimist ühelegi postitusele andnud." @@ -612,8 +583,6 @@ et: num_users: "Kasutajad" top_referred_topics: title: "Parimad viidatud teemad" - xaxis: "Teema" - num_clicks: "Klikid" page_view_anon_reqs: title: "Anonüümne" xaxis: "Päev" @@ -741,27 +710,16 @@ et: recent_topics: "Viimased" see_more: "Veel" search_title: "Otsi sellelt saidilt" - search_google: "Google" terms_of_service: title: "Teenuse tingimused" deleted: 'kustutatud' image: "pilt" upload: pasted_image_filename: "Asetatud pilt" - email_log: - anonymous_user: "Kasutaja on anonüümne" - seen_recently: "Kasutajat nähti hiljuti" - topic_nil: "post.topic tühi hulk" - message_blank: "sõnum on tühi" - message_to_blank: "message.to on tühi" - text_part_body_blank: "text_part.body on tühi" - body_blank: "sisu on tühi" color_schemes: - default: "Hele skeem" dark: "Tume skeem" - default_theme_name: "Vaikimisi" - dark_theme_name: "Tume" light_theme_name: "Hele" + dark_theme_name: "Tume" about: "Teave" guidelines: "Juhendid" privacy: "Privaatsus" @@ -875,8 +833,6 @@ et: empathetic: name: Empaatiline description: Omab 500 laigitud postitust ja laikis 1000 postitust - long_description: | - Saad selle märgise, kui sul on 500 laigitud postitust ning oled ise laikunud 1000 või enam postitust. Oled tõeline lahkuse ja vastastikuse lugupidamise eeskuju :two_hearts: first_emoji: name: Esimene emotikon description: Kasutasid postituses emotikoni @@ -988,7 +944,6 @@ et: label: "Väike ikoon" apple_touch_icon_url: label: "Suur ikoon" - description: "Soovitame kasutada ikooni, et kuvada oma saiti uuematel seadmetel, mille pilt on suurem. Soovitatud ikooni suurus on vähemalt 144px x 144px" homepage: title: "Avaleht" fields: @@ -996,8 +951,6 @@ et: choices: latest: label: "Viimased teemad" - categories: - label: "Foorumid" emoji: title: "Emotikon" invites: diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 58f7cbb79b..0129ac2c7c 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -133,8 +133,8 @@ fa_IR: reading_time: "زمان مطالعه" likes: "پسند‌ها" too_many_replies: - one: متأسÙیم، ولی کاربران جدید موقتا محدود به {count}% پاسخ در یک موضوع هستند. - other: متأسÙیم، ولی کاربران جدید موقتا محدود به {count}% پاسخ در یک موضوع هستند. + one: "متأسÙیم، ولی کاربران جدید موقتا محدود به {count}% پاسخ در یک موضوع هستند." + other: "متأسÙیم، ولی کاربران جدید موقتا محدود به {count}% پاسخ در یک موضوع هستند." embed: start_discussion: "شروع بحث" continue: "ادامه‌ی بحث" @@ -144,35 +144,35 @@ fa_IR: no_hosts: "میزبانی برای قرارگیری ÙØ§ÛŒÙ„‌ها تعبیه نشده." configure: "پیکربندی کد‌های جاسازی شده" more_replies: - one: '%{count} پاسخ دیگر' - other: '%{count} پاسخ دیگر' + one: "%{count} پاسخ دیگر" + other: "%{count} پاسخ دیگر" loading: "بارگزاری بحث..." permalink: " پیوند یکتا" imported_from: "این Ø¨Ø­Ø«â€ŒÙˆÚ¯ÙØªÚ¯ÙˆÛŒ همراه برای ورود اصلی در %{link} است" in_reply_to: "â—€ %{username}" replies: - one: '%{count} پاسخ' - other: '%{count} پاسخ' + one: "%{count} پاسخ" + other: "%{count} پاسخ" no_mentions_allowed: "متأسÙیم، شما نمی‌توانید به کاربران دیگر اشاره کنید." too_many_mentions: - one: متأسÙیم، شما در هر نوشته تنها می‌توانید به %{count} کاربر اشاره کنید. - other: متأسÙیم، شما در هر نوشته تنها می‌توانید به %{count} کاربر اشاره کنید. + one: "متأسÙیم، شما در هر نوشته تنها می‌توانید به %{count} کاربر اشاره کنید." + other: "متأسÙیم، شما در هر نوشته تنها می‌توانید به %{count} کاربر اشاره کنید." no_mentions_allowed_newuser: "متأسÙیم، کاربران تازه نمی‌توانند به کاربران دیگر اشاره کنند." too_many_mentions_newuser: - one: متأسÙیم، کاربران تازه در هر نوشته تنها می‌توانند به %{count} کاربر دیگر اشاره کنند. - other: متأسÙیم، کاربران تازه در هر نوشته تنها می‌توانند به %{count} کاربر دیگر اشاره کنند. + one: "متأسÙیم، کاربران تازه در هر نوشته تنها می‌توانند به %{count} کاربر دیگر اشاره کنند." + other: "متأسÙیم، کاربران تازه در هر نوشته تنها می‌توانند به %{count} کاربر دیگر اشاره کنند." no_images_allowed: "متأسÙیم، کاربران تازه نمی‌توانند در نوشته‌ها تصویر بگذارند." too_many_images: - one: متأسÙیم، کاربران تازه تنها می‌توانند %{count} تصویر در هر نوشته بگذارند. - other: متأسÙیم، کاربران تازه تنها می‌توانند %{count} تصویر در هر نوشته بگذارند. + one: "متأسÙیم، کاربران تازه تنها می‌توانند %{count} تصویر در هر نوشته بگذارند." + other: "متأسÙیم، کاربران تازه تنها می‌توانند %{count} تصویر در هر نوشته بگذارند." no_attachments_allowed: "متأسÙیم، کاربران تازه امکان قرار دادن پیوست را در نوشته هایشان ندارند." too_many_attachments: - one: متأسÙیم ØŒ کاربران تازه تنها میتوانند %{count} پیوست در هر نوشته قرار بدهند. - other: متأسÙیم ØŒ کاربران تازه تنها میتوانند %{count} پیوست در هر نوشته قرار بدهند. + one: "متأسÙیم ØŒ کاربران تازه تنها میتوانند %{count} پیوست در هر نوشته قرار بدهند." + other: "متأسÙیم ØŒ کاربران تازه تنها میتوانند %{count} پیوست در هر نوشته قرار بدهند." no_links_allowed: "متأسÙیم، کاربران تازه نمی‌توانند در نوشته‌ها پیوند بگذارند." too_many_links: - one: متأسÙیم، کاربران تازه تنها می‌توانند در هر نوشته %{count} پیوند بگذارند. - other: متأسÙیم، کاربران تازه تنها می‌توانند در هر نوشته %{count} پیوند بگذارند. + one: "متأسÙیم، کاربران تازه تنها می‌توانند در هر نوشته %{count} پیوند بگذارند." + other: "متأسÙیم، کاربران تازه تنها می‌توانند در هر نوشته %{count} پیوند بگذارند." spamming_host: "Ù…ØªØ£Ø³ÙØ§Ù†Ù‡ شما نمی‌توانید پیوندی با آن میزبان را Ø¨ÙØ±Ø³ØªÛŒØ¯." user_is_suspended: "کاربر تعلیق شده نمی‌تواند نوشته‌ای ارسال کند." topic_not_found: "یک مشکلی وجود دارد. شاید این موضوع همزمان Ú©Ù‡ شما در حال خواندن آن بودید بسته شده یا پاک شده." @@ -236,8 +236,8 @@ fa_IR: title: "درخواست عضویت در @%{group_name}" education: until_posts: - one: '%{count} نوشته' - other: '%{count} نوشته' + one: "%{count} نوشته" + other: "%{count} نوشته" 'new-topic': | به %{site_name} &mdash خوش آمدید؛ **با تشکر از شما برای شروع Ú¯ÙØªÚ¯Ùˆ!** @@ -377,28 +377,6 @@ fa_IR: شاید بخواهید این موضوع را از طریق مدیریت ببندید :wrench: (در قسمت بالا سمت راست Ùˆ پایین)ØŒ بنابراین پاسخ‌ها در اعلان ها انباشته نمی‌شوند. lounge_welcome: title: "به سالن خوش آمدید" - body: |2 - - تبریک! :confetti_ball: - - اگر می‌توانید این موضوع را ببینید، یعنی به **ناظم** (سطح اعتماد 3) ارتقا پیدا کردید. - - حالا می‌توانید … - - * عنواهر موضوعی را ویرایش کنید - * دسته‌بندی هر موضوعی را تغییر دهید - * تمام پیوند‌های خود را به صورت follow قرار دهید. ([nofollow خودکار](http://en.wikipedia.org/wiki/Nofollow) حذ٠می‌شود) - * دسترسی به تالار های خصوصی دسته‌بندی‌هایی Ú©Ù‡ Ùقط به کاربران سطح 3 Ùˆ بالاتر به آن دسترسی دارند - * مخÙÛŒ سازی هرزنامه‌ با یک پرچم - - در اینجا [لیست ÙØ¹Ù„ÛŒ کاربران ناظم](/badges/3/regular) را می‌تواند ببینید. مطمئن شوید Ú©Ù‡ سلام می‌کنید! - - با تشکر از شما Ú©Ù‡ بخش مهمی از این انجمن هستید! - - - (برای اطلاعات بیشتر درباره سطوح اعتماد [این موضوع را ببینید][trust]. توجه داشته باشید Ú©Ù‡ اعضا Ùقط در صورتی Ú©Ù‡ شرایط را رعایت کنند در سطح اعتماد 3 باقی می‌مانند.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "در رابطه با دسته‌بندی %{category}" replace_paragraph: "(به جای پاراگرا٠اول توضیحات کوتاهی درباره دسته جدیدتان قرار بدهید. این راهنما در قسمت دسته ها نمایش داده Ù…ÛŒ شود٬ پس سعی کنید آن را زیر 200 کلمه نگاه دارید. **قبل از اینکه این متن را ویرایش کنید یا موضوع جدیدی بوجود بیاورید٬ این دسته در ØµÙØ­Ù‡ دسته ها نمایش داده نمی شود.**)" @@ -413,9 +391,6 @@ fa_IR: cannot_delete: uncategorized: "بدون دسته‌بندی را نمی توان حذ٠کرد" has_subcategories: "این دسته‌بندی به دلیل داشتن زیردسته قابل پاک شدن نیست." - topic_exists: - one: این دسته‌بندی باید پاک شود زیرا این موضوع دارای %{count} است. قدیمی ترین موضوع %{topic_link}. - other: این دسته‌بندی باید پاک شود زیرا این موضوع دارای %{count} است. قدیمی ترین موضوع %{topic_link}. topic_exists_no_oldest: "این دسته را نمی توان پاک کرد زیرا تعداد موضوع %{count} است " uncategorized_description: "موضوعاتی Ú©Ù‡ نیاز به دسته‌بندی ندارند، یا قابل دسته‌بندی نیستند." trust_levels: @@ -435,85 +410,85 @@ fa_IR: broken: "عکس خراب شده است." rate_limiter: hours: - one: '%{count} ساعت' - other: '%{count} ساعت' + one: "%{count} ساعت" + other: "%{count} ساعت" minutes: - one: '%{count} دقیقه' - other: '%{count} دقیقه' + one: "%{count} دقیقه" + other: "%{count} دقیقه" seconds: - one: '%{count} ثانیه' - other: '%{count} ثانیه' + one: "%{count} ثانیه" + other: "%{count} ثانیه" datetime: distance_in_words: half_a_minute: "< 1 دقیقه" less_than_x_seconds: - one: < %{count} ثانیه - other: < %{count} ثانیه + one: "< %{count} ثانیه" + other: "< %{count} ثانیه" x_seconds: - one: '%{count} ثانیه' - other: '%{count} ثانیه' + one: "%{count} ثانیه" + other: "%{count} ثانیه" less_than_x_minutes: - one: < %{count} دقیقه - other: < %{count} دقیقه + one: "< %{count} دقیقه" + other: "< %{count} دقیقه" x_minutes: - one: '%{count} دقیقه' - other: '%{count} دقیقه' + one: "%{count} دقیقه" + other: "%{count} دقیقه" about_x_hours: - one: '%{count} ساعت' - other: '%{count} ساعت' + one: "%{count} ساعت" + other: "%{count} ساعت" x_days: - one: '%{count} روز' - other: '%{count} روز' + one: "%{count} روز" + other: "%{count} روز" about_x_months: - one: '%{count} ماه' - other: '%{count} ماه' + one: "%{count} ماه" + other: "%{count} ماه" x_months: - one: '%{count} ماه' - other: '%{count} ماه' + one: "%{count} ماه" + other: "%{count} ماه" about_x_years: - one: '%{count} سال' - other: '%{count} سال' + one: "%{count} سال" + other: "%{count} سال" over_x_years: - one: '> %{count} سال' - other: '> %{count} سال' + one: "> %{count} سال" + other: "> %{count} سال" almost_x_years: - one: '%{count} سال' - other: '%{count} سال' + one: "%{count} سال" + other: "%{count} سال" distance_in_words_verbose: half_a_minute: "هم اکنون" less_than_x_seconds: - one: هم اکنون - other: هم اکنون + one: "هم اکنون" + other: "هم اکنون" x_seconds: - one: '%{count} ثانیه قبل' - other: '%{count} ثانیه قبل' + one: "%{count} ثانیه قبل" + other: "%{count} ثانیه قبل" less_than_x_minutes: - one: کمتر از %{count} دقیقه قبل - other: کمتر از %{count} دقیقه قبل + one: "کمتر از %{count} دقیقه قبل" + other: "کمتر از %{count} دقیقه قبل" x_minutes: - one: '%{count} دقیقه قبل' - other: '%{count} دقیقه قبل' + one: "%{count} دقیقه قبل" + other: "%{count} دقیقه قبل" about_x_hours: - one: '%{count} ساعت قبل' - other: '%{count} ساعت قبل' + one: "%{count} ساعت قبل" + other: "%{count} ساعت قبل" x_days: - one: '%{count} روز قبل' - other: '%{count} روز قبل' + one: "%{count} روز قبل" + other: "%{count} روز قبل" about_x_months: - one: حدود %{count} ماه قبل - other: حدود %{count} ماه قبل + one: "حدود %{count} ماه قبل" + other: "حدود %{count} ماه قبل" x_months: - one: '%{count} ماه قبل' - other: '%{count} ماه قبل' + one: "%{count} ماه قبل" + other: "%{count} ماه قبل" about_x_years: - one: حدود %{count} سال قبل - other: حدود %{count} سال قبل + one: "حدود %{count} سال قبل" + other: "حدود %{count} سال قبل" over_x_years: - one: بیش از %{count} سال قبل - other: بیش از %{count} سال قبل + one: "بیش از %{count} سال قبل" + other: "بیش از %{count} سال قبل" almost_x_years: - one: تقریبا %{count} سال قبل - other: تقریبا %{count} سال قبل + one: "تقریبا %{count} سال قبل" + other: "تقریبا %{count} سال قبل" password_reset: no_token: "متآسÙیم, پیوند تغییر رمز عبور بسیار قدیمی است. دکمه ورود را انتخاب کنید Ùˆ از 'من رمز عبور خود را ÙØ±Ø§Ù…وش کرده ام' برای Ø¯Ø±ÛŒØ§ÙØª یک پیوند جدید Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید." choose_new: "رمز‌عبور جدید را وارد کنید" @@ -587,14 +562,8 @@ fa_IR: description: 'پسندیدن این نوشته' short_description: 'پسندیدن این نوشته' long_form: 'این مورد پسندیده شد' - vote: - title: 'امتیاز' - description: 'به این نوشته رای دهید' - short_description: 'رای به این نوشته' - long_form: 'به این نوشته رای داده شد' user_activity: no_bookmarks: - self: "نوشته‌ی نشانه‌گذاری شده‌ای ندارید. نشانه‌گذاری به شما اجازه می‌دهد در Ø¯ÙØ¹Ø§Øª بعدی دسترسی آسان تری به نوشته‌ها داشته باشید." others: "نشانه‌گذاری وجود ندارد" no_likes_given: self: "نوشته پسندیده شده‌ای ندارید." @@ -732,8 +701,6 @@ fa_IR: num_users: "کاربران" top_referred_topics: title: "بالاترین موضوعات مورد مراجعه" - xaxis: "موضوعات" - num_clicks: "کلیک‌ها" page_view_anon_reqs: title: "ناشناس" xaxis: "روز" @@ -790,7 +757,6 @@ fa_IR: xaxis: "روز" yaxis: "مجموع" mobile_visits: - title: "بازدید کاربران" xaxis: "روز" yaxis: "تعداد بازدید‌ها" dashboard: @@ -810,8 +776,8 @@ fa_IR: failing_emails_warning: '%{num_failed_jobs} ایمیل زمانبندی شده نا‌موÙÙ‚ وجود دارد. ÙØ§ÛŒÙ„ app.yml را بررسی کنید Ùˆ مطمئن شوید Ú©Ù‡ تنظیمات سرور ایمیل درست است. نمایش زمابندی‌های ناموÙÙ‚ Sidekiq .' subfolder_ends_in_slash: "تنظیمات زیرپوشه نادرست است، مقدار DISCOURSE_RELATIVE_URL_ROOT با نویسه‌ی slash تمام می‌شود." email_polling_errored_recently: - one: رای‌گیری ایمیلی %{count} خطا در 24 ساعت گذشته ایجاد کرده. گزارشات را ببینید. - other: رای‌گیری ایمیلی %{count} خطا در 24 ساعت گذشته ایجاد کرده. گزارشات را ببینید. + one: "رای‌گیری ایمیلی %{count} خطا در 24 ساعت گذشته ایجاد کرده. گزارشات را ببینید." + other: "رای‌گیری ایمیلی %{count} خطا در 24 ساعت گذشته ایجاد کرده. گزارشات را ببینید." bad_favicon_url: "favicon نمی‌تواند بارگذاری شود. مقدار favicon_url را در تنظیمات سایت بررسی کنید." poll_pop3_timeout: "اتصال به سرور POP3 انجام نشد. ایمیل‌های ورودی ممکن است Ø¯Ø±ÛŒØ§ÙØª نشوند. Ù„Ø·ÙØ§ تنظیمات POP3 Ùˆ ÙØ±Ø§Ù‡Ù… کننده خدمات را بررسی کنید." poll_pop3_auth_error: "اتصال به سرور POP3 ناموÙÙ‚ بود، خطای اعتبار سنجی. Ù„Ø·ÙØ§ تنظیمات POP3 را بررسی کنید." @@ -905,7 +871,6 @@ fa_IR: post_menu: "مشخص کنید کدام موارد بر روی Ùهرست نوشته ها نشان داده شوند٬ Ùˆ بر اساس Ú†Ù‡ ترتیبی. برای مثال : پسند|ویرایش|پرچم|پاک کردن|همرسانی|نشانک|پاسخ" post_menu_hidden_items: "Ùهرست موارد مخÙÛŒ شود بطور پیش ÙØ±Ø¶ در Ùهرست نوشته مگر اینکه Ø±ÙØ¹ گسترش به حالت روشن باشد." share_links: "مشخص کنید کدام موارد بر روی کادر Ú¯ÙØªÚ¯Ùˆ در قسمت اشترک گذاری Ùˆ بر اساس Ú†Ù‡ ترتیبی نشان داده شوند. " - track_external_right_clicks: "پیوند‌های خارجی را پیگری Ú©Ù† Ú©Ù‡ کلیک راست (به عنوان مثال: باز کردن یک تب جدید) آنها غیر ÙØ¹Ø§Ù„ است بطور پیش ÙØ±Ø¶ چرا Ú©Ù‡ این URL دوباره نوشته شده است. " site_contact_username: "یک نام کاربری مدیر برای ارسال خودکار پیام‌ها. اگر خالی گذاشته شود از حساب‌کاربری Ù¾ÛŒØ´â€ŒÙØ±Ø¶ سیستم Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌شود. " send_welcome_message: "برای تمام کاربران جدید پیام خوش آمدید به همراه راهنمای شروع سریع Ø¨ÙØ±Ø³Øª." suppress_reply_directly_below: "وقتی Ú©Ù‡ نوشته Ùقط یک پاسخ مستقیم دارد، تعداد پاسخ قابل باز شدن را نمایش نده." @@ -1110,7 +1075,6 @@ fa_IR: reply_by_email_enabled: "Enable replying to topics via email." reply_by_email_address: "نمونه برای پاسخ به ایمیل، آدرس‌های ایمیل آمده برای مثال: %{reply_key}@reply.example.com یا replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "لیست قالب‌های مشابه برای پاسخ به ایمیل‌های Ø¯Ø±ÛŒØ§ÙØªÛŒ. مثال:\n%{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "به discourse اجازه ارسال هیچ گونه ایمیلی را نده" strip_images_from_short_emails: "محروم کردن تصاویر از ایمیل‌هایی با حجم کمتر از 2800 بایت" short_email_length: "طول ایمیل کوتاه به بایت" display_name_on_email_from: "نمایش نام Ùˆ نام‌خانوادگی در زمینه‌ی ÙØ±Ø³ØªÙ†Ø¯Ù‡â€ŒÛŒ ایمیل" @@ -1152,7 +1116,6 @@ fa_IR: delete_user_max_post_age: "به کاربرانی Ú©Ù‡ عمر نوشته‌شان بیشتر از (x) روز است اجازه پاک کردن نده." delete_all_posts_max: "حداکثر تعداد نوشته‌هایی Ú©Ù‡ می‌تواند یکباره پاک شود با کلید همه نوشته ها را پاک Ú©Ù†. اگر کاربر بییشتر از این نوشته دارد، نوشته نمی تواند یکبار پاک شود Ùˆ کاربر نمی تواند حذ٠شود." email_editable: "به کاربران اجازه بده بعد از ثبت نام ایمیل خود را عوض کنند. " - logout_redirect: "محل انتقال کاربر بعد از خروج از حساب‌کاربری (مثال: http://somesite.com/logout)" allow_uploaded_avatars: "اجازه بارگذاری تصاویر Ø³ÙØ§Ø±Ø´ÛŒ Ù¾Ø±ÙˆÙØ§ÛŒÙ„ به کاربران" allow_animated_avatars: "اجازه Ø§Ø³ØªÙØ§Ø¯Ù‡ از تصویر متحرک gif در Ù¾Ø±ÙˆÙØ§ÛŒÙ„. اخطار: تسک avatars:refresh rake را بعد از انجام این تنظیمات اجرا کنید." allow_animated_thumbnails: "تولید تصاویر بند انگشتی متحرک از تصاویر GIF انیمیشن." @@ -1310,68 +1273,65 @@ fa_IR: not_seen_in_a_month: "خوش آمدید دوباره!‌ شما را برای مدت طولانی ندیده‌ایم. اینها بهترین موضعات از وقتی Ú©Ù‡ شما نبودید، هستند." merge_posts: edit_reason: - one: '%{count} نوشته ترکیب شده توسط %{username}' - other: '%{count} نوشته ترکیب شده توسط %{username}' + one: "%{count} نوشته ترکیب شده توسط %{username}" + other: "%{count} نوشته ترکیب شده توسط %{username}" errors: different_topics: "نوشته‌ها به موضوعات مختلÙÛŒ تعلق دارند Ùˆ امکان ترکیب آن‌ها وجود ندارد." different_users: "نوشته‌ها به کاربران مختلÙÛŒ تعلق دارند Ùˆ امکان ترکیب آن‌ها وجود ندارد." move_posts: new_topic_moderator_post: - one: '%{count} نوشته تبدیل به یک موضوع جدید شدند: %{topic_link}' - other: '%{count} نوشته تبدیل به یک موضوع جدید شدند: %{topic_link}' + one: "%{count} نوشته تبدیل به یک موضوع جدید شدند: %{topic_link}" + other: "%{count} نوشته تبدیل به یک موضوع جدید شدند: %{topic_link}" existing_topic_moderator_post: - one: '%{count} نوشته با یک موضوع موجود ترکیب شدند: %{topic_link}' - other: '%{count} نوشته با یک موضوع موجود ترکیب شدند: %{topic_link}' - change_owner: - post_revision_text: "حق مالکیت از کاربر {old_user}% به کاربر {new_user}% منتقل شد" - deleted_user: "یک کاربر حذ٠شده" + one: "%{count} نوشته با یک موضوع موجود ترکیب شدند: %{topic_link}" + other: "%{count} نوشته با یک موضوع موجود ترکیب شدند: %{topic_link}" topic_statuses: archived_enabled: "این موضوع بایگانی شده است. غیر قابل دسترسی است Ùˆ قادر به تغییر آن نیستید." archived_disabled: "این موضوع الان از بایگانی خارج شد.این دیگر غیر قابل دسترسی نیست Ùˆ قادر به عوض شدن است." closed_enabled: "این موضوع در حال حاضر بسته شده است. پاسخ جدید دیگر مجاز نیست." closed_disabled: "موضوع در حال حاضر باز است. پاسخ‌های جدید اجازه‌ی ثبت دارند." autoclosed_message_max_posts: - one: این پیام بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد. - other: این پیام بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد. + one: "این پیام بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد." + other: "این پیام بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد." autoclosed_topic_max_posts: - one: این موضوع بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد. - other: این موضوع بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد. + one: "این موضوع بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد." + other: "این موضوع بعد از رسیدن به حداکثر تعداد پاسخ‌ها %{count} بسته شد." autoclosed_enabled_days: - one: این موضوع به صورت خود کار بعد از %{count} روز بسته شد. پاسخ جدید دیگر مجاز نیست. - other: این موضوع به صورت خود کار بعد از %{count} روز بسته شد. پاسخ جدید دیگر مجاز نیست. + one: "این موضوع به صورت خود کار بعد از %{count} روز بسته شد. پاسخ جدید دیگر مجاز نیست." + other: "این موضوع به صورت خود کار بعد از %{count} روز بسته شد. پاسخ جدید دیگر مجاز نیست." autoclosed_enabled_hours: - one: این موضوع به صورت خود کار بعد از %{count} ساعت بسته شد. پاسخ جدید دیگر مجاز نیست. - other: این موضوع به صورت خود کار بعد از %{count} ساعت بسته شد. پاسخ جدید دیگر مجاز نیست. + one: "این موضوع به صورت خود کار بعد از %{count} ساعت بسته شد. پاسخ جدید دیگر مجاز نیست." + other: "این موضوع به صورت خود کار بعد از %{count} ساعت بسته شد. پاسخ جدید دیگر مجاز نیست." autoclosed_enabled_minutes: - one: این موضوع به صورت خود کار بعد از %{count} دقیقه بسته شد. پاسخ جدید دیگر مجاز نیست. - other: این موضوع به صورت خود کار بعد از %{count} دقیقه بسته شد. پاسخ جدید دیگر مجاز نیست. + one: "این موضوع به صورت خود کار بعد از %{count} دقیقه بسته شد. پاسخ جدید دیگر مجاز نیست." + other: "این موضوع به صورت خود کار بعد از %{count} دقیقه بسته شد. پاسخ جدید دیگر مجاز نیست." autoclosed_enabled_lastpost_days: - one: این موضوع به صورت خود کار بعد از %{count} روز بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست. - other: این موضوع به صورت خود کار بعد از %{count} روز بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست. + one: "این موضوع به صورت خود کار بعد از %{count} روز بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست." + other: "این موضوع به صورت خود کار بعد از %{count} روز بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست." autoclosed_enabled_lastpost_hours: - one: این موضوع به صورت خود کار بعد از %{count} ساعت بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست. - other: این موضوع به صورت خود کار بعد از %{count} ساعت بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست. + one: "این موضوع به صورت خود کار بعد از %{count} ساعت بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست." + other: "این موضوع به صورت خود کار بعد از %{count} ساعت بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست." autoclosed_enabled_lastpost_minutes: - one: این موضوع به صورت خود کار بعد از %{count} دقیقه بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست. - other: این موضوع به صورت خود کار بعد از %{count} دقیقه بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست. + one: "این موضوع به صورت خود کار بعد از %{count} دقیقه بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست." + other: "این موضوع به صورت خود کار بعد از %{count} دقیقه بعد از آخرین پاسخ بسته شد. پاسخ جدید دیگر مجاز نیست." autoclosed_disabled_days: - one: این موضوع بعد از %{count} روز به صورت خودکار باز شد. - other: این موضوع بعد از %{count} روز به صورت خودکار باز شد. + one: "این موضوع بعد از %{count} روز به صورت خودکار باز شد." + other: "این موضوع بعد از %{count} روز به صورت خودکار باز شد." autoclosed_disabled_hours: - one: این موضوع بعد از %{count} ساعت به صورت خودکار باز شد. - other: این موضوع بعد از %{count} ساعت به صورت خودکار باز شد. + one: "این موضوع بعد از %{count} ساعت به صورت خودکار باز شد." + other: "این موضوع بعد از %{count} ساعت به صورت خودکار باز شد." autoclosed_disabled_minutes: - one: این موضوع بعد از %{count} دقیقه به صورت خودکار باز شد. - other: این موضوع بعد از %{count} دقیقه به صورت خودکار باز شد. + one: "این موضوع بعد از %{count} دقیقه به صورت خودکار باز شد." + other: "این موضوع بعد از %{count} دقیقه به صورت خودکار باز شد." autoclosed_disabled_lastpost_days: - one: این موضوع %{count} روز بعد از آخرین پاسخ به صورت خودکار باز شد. - other: این موضوع %{count} روز بعد از آخرین پاسخ به صورت خودکار باز شد. + one: "این موضوع %{count} روز بعد از آخرین پاسخ به صورت خودکار باز شد." + other: "این موضوع %{count} روز بعد از آخرین پاسخ به صورت خودکار باز شد." autoclosed_disabled_lastpost_hours: - one: این موضوع %{count} ساعت بعد از آخرین پاسخ به صورت خودکار باز شد. - other: این موضوع %{count} ساعت بعد از آخرین پاسخ به صورت خودکار باز شد. + one: "این موضوع %{count} ساعت بعد از آخرین پاسخ به صورت خودکار باز شد." + other: "این موضوع %{count} ساعت بعد از آخرین پاسخ به صورت خودکار باز شد." autoclosed_disabled_lastpost_minutes: - one: این موضوع %{count} دقیقه بعد از آخرین پاسخ به صورت خودکار باز شد. - other: این موضوع %{count} دقیقه بعد از آخرین پاسخ به صورت خودکار باز شد. + one: "این موضوع %{count} دقیقه بعد از آخرین پاسخ به صورت خودکار باز شد." + other: "این موضوع %{count} دقیقه بعد از آخرین پاسخ به صورت خودکار باز شد." autoclosed_disabled: "این موضوع در حال حاضر باز است. پاسخ‌های جدید اجازه‌ی ثبت دارند." autoclosed_disabled_lastpost: "این موضوع در حال حاضر باز است. پاسخ‌های جدید اجازه‌ی ثبت دارند." pinned_enabled: "این موضوع الان سنجاق شد. این در بالای تمام دسته‌بندی‌ها نمایش داده خواهد شد تا زمانی Ú©Ù‡ توسط مدیران از سنجاق خارج شود Ùˆ یا کاربران برای خودشان از سنجاق خارج کنند. " @@ -1405,7 +1365,6 @@ fa_IR: missing_user_field: "شما تمام Ùیلد‌های کاربری را تکمیل نکرده اید" already_logged_in: "به نظر می‌رسد می‌خواهید دعوت کاربری دیگری را تایید کنید. اگر کاربر %{current_user} نیستید Ù„Ø·ÙØ§ خارج شده Ùˆ دوباره وارد سایت شوید." user: - no_accounts_associated: "بدون حساب‌کاربری مرتبط" deactivated: "به دلیل ارسال ایمیل زیاد به '%{email}' ØºÛŒØ±â€ŒÙØ¹Ø§Ù„ شد." deactivated_by_staff: "ØºÛŒØ±â€ŒÙØ¹Ø§Ù„ شده توسط کارمندان" activated_by_staff: "ÙØ¹Ø§Ù„ شده توسط کارمندان" @@ -1431,11 +1390,11 @@ fa_IR: domain_not_allowed: "سایت نامعتبر است. دامنه‌های مجاز: %{domains}" flags_reminder: flags_were_submitted: - one: پرچم‌ها %{count} ساعت پیش ثبت شدند. [Ù„Ø·ÙØ§ بررسی کنید](/admin/flags). - other: پرچم‌ها %{count} ساعت پیش ثبت شدند. [Ù„Ø·ÙØ§ بررسی کنید](/admin/flags). + one: "پرچم‌ها %{count} ساعت پیش ثبت شدند. [Ù„Ø·ÙØ§ بررسی کنید](/admin/flags)." + other: "پرچم‌ها %{count} ساعت پیش ثبت شدند. [Ù„Ø·ÙØ§ بررسی کنید](/admin/flags)." subject_template: - one: '%{count} نشانه ها منتظر Ø§Ø³ØªÙØ§Ø¯Ù‡' - other: '%{count} نشانه ها منتظر Ø§Ø³ØªÙØ§Ø¯Ù‡' + one: "%{count} نشانه ها منتظر Ø§Ø³ØªÙØ§Ø¯Ù‡" + other: "%{count} نشانه ها منتظر Ø§Ø³ØªÙØ§Ø¯Ù‡" unsubscribe_mailer: title: "لغو اشتراک نامه‌رسان" subject_template: "تایید کنید Ú©Ù‡ دیگر نمی‌خواهید از %{site_title} ایمیل بروز‌رسانی Ø¯Ø±ÛŒØ§ÙØª کنید" @@ -1505,19 +1464,14 @@ fa_IR: deferred: "ممنون از اینکه به ما اطلاع دادید. ما بررسی Ù…ÛŒ کنیم" deferred_and_deleted: "ممنون از اینکه به ما اطلاع دادید. ما نوشته را حذ٠کردیم." temporarily_closed_due_to_flags: - one: این موضوع موقتا به دلیل Ø¯Ø±ÛŒØ§ÙØª تعداد زیادی پرچم به مدت %{count} ساعت بسته می‌شود. - other: این موضوع موقتا به دلیل Ø¯Ø±ÛŒØ§ÙØª تعداد زیادی پرچم به مدت %{count} ساعت بسته می‌شود. + one: "این موضوع موقتا به دلیل Ø¯Ø±ÛŒØ§ÙØª تعداد زیادی پرچم به مدت %{count} ساعت بسته می‌شود." + other: "این موضوع موقتا به دلیل Ø¯Ø±ÛŒØ§ÙØª تعداد زیادی پرچم به مدت %{count} ساعت بسته می‌شود." system_messages: private_topic_title: "موضوع #%{id}" contents_hidden: "Ù„Ø·ÙØ§ نوشته را برای نمایش محتویات ببینید" post_hidden: title: "نوشته مخÙÛŒ" subject_template: "نوشته مخÙÛŒ شده توسط پرچم‌های اعضا" - usage_tips: - text_body_template: | - چند نکته Ú©ÙˆÚ†Ú© برای شروع به عنوان کاربر جدید، [این نوشته‌ی بلاگ را ببینید](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/) - - همینطور Ú©Ù‡ در اینجا شرکت می‌کنید، ما شما را می‌شناسیم، Ùˆ به صورت موقت محدودیت‌های کاربر جدید برداشته خواهند شد. در طول زمان شما [سطح اعتماد](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) Ø¯Ø±ÛŒØ§ÙØª می‌کنید Ú©Ù‡ شامل توانایی های ویژه برای Ú©Ù…Ú© به ما در مدیریت انجمن با یکدیگر هست. welcome_user: title: "خوش‌آمد کاربر" subject_template: "به %{site_name} خوش آمدید!" @@ -1725,8 +1679,8 @@ fa_IR: pending_users_reminder: title: "یاداور کاربران در انتظار" subject_template: - one: '%{count} کاربران منتظر تایید' - other: '%{count} کاربران منتظر تایید' + one: "%{count} کاربران منتظر تایید" + other: "%{count} کاربران منتظر تایید" text_body_template: | تعدادی درخواست کاربران جدید عضو شده برای تایید (یا رد شدن) منتظر هستند. قبل از اینکه به انجمن دسترسی داشته باشند. @@ -1749,8 +1703,8 @@ fa_IR: queued_posts_reminder: title: "یادآور نوشته‌های زمانبندی شده" subject_template: - one: '%{count} نوشته منتظر بررسی است' - other: '%{count} نوشته منتظر بررسی است' + one: "%{count} نوشته منتظر بررسی است" + other: "%{count} نوشته منتظر بررسی است" unsubscribe_link: | برای لغو اشتراک از این ایمیل‌ها، [کلیک کنید](%{unsubscribe_url}). unsubscribe_link_and_mail: | @@ -1764,17 +1718,15 @@ fa_IR: user_notifications: previous_discussion: "پاسخ‌های قبلی" reached_limit: - one: 'توجه کنید: ما حداکثر %{count} ایمیل در روز ارسال می‌کنیم. برای دیدن موارد ارسال نشده سایت را بررسی کنید. Ù¾.Ù†: از شما برای محبوب بودنتان تشکر می‌کنیم!' - other: 'توجه کنید: ما حداکثر %{count} ایمیل در روز ارسال می‌کنیم. برای دیدن موارد ارسال نشده سایت را بررسی کنید. Ù¾.Ù†: از شما برای محبوب بودنتان تشکر می‌کنیم!' + one: "توجه کنید: ما حداکثر %{count} ایمیل در روز ارسال می‌کنیم. برای دیدن موارد ارسال نشده سایت را بررسی کنید. Ù¾.Ù†: از شما برای محبوب بودنتان تشکر می‌کنیم!" + other: "توجه کنید: ما حداکثر %{count} ایمیل در روز ارسال می‌کنیم. برای دیدن موارد ارسال نشده سایت را بررسی کنید. Ù¾.Ù†: از شما برای محبوب بودنتان تشکر می‌کنیم!" in_reply_to: "در پاسخ به" unsubscribe: title: "لغو اشتراک" description: "آیا تمایلی به Ø¯Ø±ÛŒØ§ÙØª این ایمیل‌ها ندارید؟ مشکلی نیست! اینجا را کلیک کنید تا اشتراک آن هم‌اکنون حذ٠شود." reply_by_email: "[نمایش موضوع](%{base_url}%{url}) یا پاسخ با ارسال ایمیل." - reply_by_email_pm: "[نمایش پیام](%{base_url}%{url}) یا پاسخ با ارسال ایمیل." only_reply_by_email: "برای پاسخدهی، به این ایمیل پاسخ دهید." visit_link_to_respond: "[موضوع را](%{base_url}%{url}) برای ارسال پاسخ ببینید." - visit_link_to_respond_pm: "[پیام را](%{base_url}%{url}) برای ارسال پاسخ ببینید." posted_by: "نوشته شده توسط {username}% در تاریخ {post_date}%" user_invited_to_private_message_pm_group: title: "کاربر دعوت شده به پیام خصوصی" @@ -2027,7 +1979,6 @@ fa_IR: recent_topics: "اخیر" see_more: "بیشتر" search_title: "جستجو در سایت" - search_google: "Ú¯ÙˆÚ¯Ù„" login_required: welcome_message: | ## [خوش آمدید به %{title}](#welcome) @@ -2055,32 +2006,11 @@ fa_IR: flag_reason: sockpuppet: "یک کاربر جدید موضوع جدیدی ایجاد کرده Ùˆ کاربری با همان آیپی به موضوع پاسخ داده (%{ip_address}). قسمت `flag_sockpuppets` را از تنظیمات سایت ببینید." spam_hosts: "این کاربر تلاش کرده چند نوشته با لینک به یک دامنه ارسال کند(%{domain}). قسمت `newuser_spam_host_threshold` را از تنظیمات سایت ببینید." - email_log: - post_user_deleted: "کاربر این نوشته حذ٠شده است" - no_user: "کاربری با این شناسه پیدا نمی شود %{user_id}" - anonymous_user: "کاربر ناشناس است" - suspended_not_pm: "کاربر معلق شده٬ نه پیام" - seen_recently: "کاربر به تازگی دیده شد" - post_not_found: "نوشته ای با این شناسه پیدا نمی شود %{post_id}" - notification_already_read: "اعلان این ایمیل قبلا خوانده شده" - topic_nil: "پاسخ در نوشه ØµÙØ± است" - post_deleted: "نوشته توسط نویسنده حذ٠شده است" - user_suspended: "کاربر معلق شده بود" - already_read: "کاربر قبلا این پست را خوانده" - exceeded_emails_limit: "مقدار max_emails_per_day_per_user بیش از حد مجاز است" - exceeded_bounces_limit: "مقدار bounce_score_threshold بیش از حد مجاز است" - message_blank: "پیام خالی است" - message_to_blank: "پیام به خالی است" - text_part_body_blank: "text_part.body خالی است " - body_blank: "متن خالی است " - no_echo_mailing_list_mode: "اطلاعیه ایمیلی برای نوشته‌های خود کاربر ØºÛŒØ±â€ŒÙØ¹Ø§Ù„ است." color_schemes: base_theme_name: "پایه" - default: "طرح روشن" dark: "طرح تیره" - default_theme_name: "Ù¾ÛŒØ´ÙØ±Ø¶" - dark_theme_name: "تیره" light_theme_name: "روشن" + dark_theme_name: "تیره" about: "درباره" guidelines: "دستورالعمل‌ها" privacy: "خصوصی" @@ -2101,71 +2031,41 @@ fa_IR: editor: name: ویرایشگر description: نخستین ویرایش نوشته - long_description: | - این نشان را وقتی Ø¯Ø±ÛŒØ§ÙØª می‌کنید Ú©Ù‡ برای بار اول یکی از نوشته‌هایتان را ویرایش کنید. در حالی Ú©Ù‡ همیشه قادر به ویرایش خود نخواهید بود، ویرایش همیشه ایده خوبی است -- می‌توانید سطح نوشته‌های خود را ارتقا دهید، اشتباهات را Ø±ÙØ¹ کنید، یا هرچیزی Ú©Ù‡ در زمان ارسال نوشته ÙØ±Ø§Ù…وش کردید به آن اضاÙÙ‡ کنید. ویرایش کنید تا نوشته‌هایتان بهتر شوند! basic_user: name: پایه‌ای - description: "تمام عملکرد‌های ضرورع اعطا شدند" - long_description: | - این نشان را زمانی Ú©Ù‡ به سطح اعتماد 1 برسید Ø¯Ø±ÛŒØ§ÙØª می‌کنید. از شما برای برای حضور Ùˆ خواندن موضوعات برای یادگیری موضوعات مربوط به انجمن تشکر می‌کنیم. محدودیت‌های حساب کاربری شما برداشته شد; حالا به تمام توانایی‌های ضروری انجمن دسترسی دارید، مواردی مثل ارسال پیام شخصی، پرچم گذاری، ویرایش دانشنامه، Ùˆ امکان ارسال چند تصویر Ùˆ پیوند در نوشته. member: name: عضو - description: "دعوت، پیام گروهی، پسند بیشتر اعطا شد" - long_description: | - این نشان را وقتی به سطح اعتماد 2 برسید، Ø¯Ø±ÛŒØ§ÙØª می‌کنید. با تشکر از شما برای شرکت در دوره‌های Ù‡ÙØªÚ¯ÛŒ برای پیوستن واقعی به انجمن ما. حالا می‌توانید از ØµÙØ­Ù‡ کاربری یا موضوعات جداگانه خود دعوتنامه Ø¨ÙØ±Ø³ØªÛŒØ¯. گروه Ùˆ پیام خصوصی ایجاد کنید، Ùˆ پسند‌های روزانه بیشتری داشته باشید. regular: name: معمولی - description: "تغییر دسته‌بندی، تغییر نام، پیوند‌های follow ØŒ دانشنامه Ùˆ پسند‌های بیشتر اعطا شد " - long_description: | - این نشان را در زمان رسیدن به سطح اعتماد 3 Ø¯Ø±ÛŒØ§ÙØª می‌کنید. با تشکر از شما برای نظم شما Ùˆ بودن در انجمن برای چند ماه. حالا یکی از بهترین خوانندگان، Ùˆ یکی از عواملی هستید Ú©Ù‡ باعث می‌شوید انجمن ما عالی باشد. حالا می‌توانید دسته‌بندی Ùˆ نام موضوعات را تغییر دهید، از مزایای پرچم‌های قدرتمند هرزنامه Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید، به تالار خصوصی دسترسی پیدا کنید، Ùˆ می‌توانید پسند‌های بیشتری در روز داشته باشید. leader: name: رهبر - description: "ویرایش سراسری، سنجاق، بستن، آرشیو کردن، جدا سازی Ùˆ داغام Ùˆ پسند‌های بیشتر اعطا شد" - long_description: | - این نشان را زمانی Ø¯Ø±ÛŒØ§ÙØª می‌کنید Ú©Ù‡ به سطح اعتماد 4 برسید، حالا شما یک راهبر برای این انجمن هستید Ú©Ù‡ توسط همکاران انتخاب شده، Ùˆ می‌توانید یک نمونه مثبت در حر٠و عمل برای سایر اعضای انجمن باشید. شما می‌توانید تمام نوشته‌ها را ویرایش کنید،‌ موارد مدیریتی متداول موضوعات را بر عهده بگیرید، مواردی مثل سنجاق کردن، بستن، خروج از Ùهرست، آرشیو، جداسازی، ادغام، Ùˆ می‌توانید هزاران پسند در روز داشته باشید. welcome: name: خوش آمدید description: یک پسند Ø¯Ø±ÛŒØ§ÙØª کرده‌اید - long_description: | - این نشان را وقتی Ú©Ù‡ اولین پسند را Ø¯Ø±ÛŒØ§ÙØª کنید به شما اعطا می‌شود. تبریک، نوشته‌ای ارسال کردید Ú©Ù‡ اعضای انجمن به آن علاقه نشان دادند، باحال، یا Ù…Ùید بود! autobiographer: name: نویسنده شرح‌حال description: اطلاعات ØµÙØ­Ù‡ شخصی خود را تکمیل کرده anniversary: name: سالگرد description: برای یک سال کاربر ÙØ¹Ø§Ù„ بوده، حداقل یک نوشته دارد. - long_description: | - این نشان را وقتی Ø¯Ø±ÛŒØ§ÙØª می‌کنید Ú©Ù‡ یک سال با حداقل یک نوشته در آن سال عضو باشید. با تشکر از شما برای بودن در کنار ما Ùˆ همکاری در انجمن. بدون Ú©Ù…Ú© شما نمی‌توانستیم این کار را انجام دهیم. nice_post: name: پاسخ خوب description: 10 پسند Ø¯Ø±ÛŒØ§ÙØª شده در یک پاسخ - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ پاسخ شما 10 پسند Ø¯Ø±ÛŒØ§ÙØª کند. پاسخ شما واقعا در انجمن تاثیر گذار بوده Ùˆ به ادامه بحث Ùˆ Ú¯ÙØªÚ¯Ùˆ Ú©Ù…Ú© کرده! good_post: name: پاسخ بهتر description: 25 پسند Ø¯Ø±ÛŒØ§ÙØª شده در یک پاسخ - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ پاسخ شما 25 پسند Ø¯Ø±ÛŒØ§ÙØª کند. پاسخ شما استثنایی بود Ùˆ باعث شد Ú¯ÙØªÚ¯Ùˆ برای همه بسیار بهتر شود! great_post: name: پاسخ عالی description: 50 پسند Ø¯Ø±ÛŒØ§ÙØª شده در یک پاسخ - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ پاسخ شما 50پسند Ø¯Ø±ÛŒØ§ÙØª کند. وای! پاسخ شما الهام بخش، جذاب، خنده دار، Ùˆ یا خردمندانه بود Ùˆ انجمن عاشقش شد! nice_topic: name: موضوع خوب description: 10 پسند Ø¯Ø±ÛŒØ§ÙØª شده در یک موضوع - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ موضوع شما 10 پسند Ø¯Ø±ÛŒØ§ÙØª کند. شما یک موضوع جذاب ایجاد کردید Ú©Ù‡ انجمن از آن لذت برد. good_topic: name: موضوع بهتر description: 25 پسند Ø¯Ø±ÛŒØ§ÙØª شده در یک موضوع - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ موضوع شما 25 پسند Ø¯Ø±ÛŒØ§ÙØª کند. شما یک Ú¯ÙØªÚ¯ÙˆÛŒ پر جنب‌و‌جوش ایجاد کردید Ú©Ù‡ انجمن در آن بسیج شدند Ùˆ عاشقش شدند! great_topic: name: موضوع عالی description: 50 پسند Ø¯Ø±ÛŒØ§ÙØª شده در یک موضوع - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ موضوع شما 50 پسند Ø¯Ø±ÛŒØ§ÙØª کند. شما یک Ú¯ÙØªÚ¯ÙˆÛŒ جذاب ایجاد کردید Ùˆ انجمن از بحث پویای Ø´Ú©Ù„ Ú¯Ø±ÙØªÙ‡ØŒ لذت برد. nice_share: name: اشتراک‌گذاری خوب description: یک نوشته با 25 بازدید‌کننده یکتا را به اشتراک گذاشته‌اید. @@ -2174,13 +2074,9 @@ fa_IR: good_share: name: اشتراک‌گذاری بهتر description: یک نوشته با 300 بازدید یکتا را به اشتراک گذاشته - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ یک لینک را به اشتراک بگذارید Ùˆ 300 کلیک Ø¯Ø±ÛŒØ§ÙØª کند. عالی بود! شما یک بحث عالی را به دسته‌ای از مردم جدید نشان دادید Ùˆ به رشد انجمن Ú©Ù…Ú© کردید. great_share: name: اشتراک‌گذاری عالی description: یک نوشته با 1000 بازدید‌کننده یکتا را به اشتراک گذاشته‌اید. - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ یک لینک را به اشتراک بگذارید Ùˆ 1000 کلیک Ø¯Ø±ÛŒØ§ÙØª کند. وای!‌ شما یک بحث جالب را به حضار زیادی ترویج کردید، شما Ú©Ù…Ú© بزرگ به رشد انجمن کردید! first_like: name: اولین پسند description: یک پست را پسندیده است @@ -2189,21 +2085,15 @@ fa_IR: first_flag: name: اولین پرچم description: یک نوشته را پرچم گذاری کرده - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ برای بار اول یک نوشته را پرچم گذاری کنید. پرچم گذاری راهی است برای تمیز Ù†Ú¯Ù‡ داشتن انجمن، جای روشنی برای همه. اگر Ùکر می‌کنید نوشته‌ای به هر دلیلی نیاز به توجه مدیریت دارد Ù„Ø·ÙØ§ از پرچم گذاری دریغ نکنید. می‌توانید برای ارسال پیام خصوصی هم پرچم بزنید تا اعضا متوجه ایراد در نوشته‌هایشان شوند. اگر مشکلی میبینید، :flag_black: پرچم‌گذاری کنید! promoter: name: ترویج کننده description: 1 کاربر دعوت کرده campaigner: name: سرباز کهنه‌کار description: 3 کاربر معمولی دعوت کرده - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ 3 کاربر را با دکمه دعوت در ØµÙØ­Ù‡ کاربری خود، به انجمن دعوت کنید Ùˆ این کاربران تبدیل به کاربر معمولی شوند. یک انجمن ÙØ¹Ø§Ù„ به تزریق منظرم اعضای جدید نیاز دارد Ú©Ù‡ همکاری کنند Ùˆ صدا‌های جدید به Ú¯ÙØªÚ¯Ùˆ ها اضاÙÙ‡ کنند! champion: name: قهرمان description: 5 عضو دعوت کرده است - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ 5 کاربر را دعوت کنید Ú©Ù‡ به اندازه‌ای در انجمن زمان بگذرانند Ú©Ù‡ تبدیل به کاربر دائم شوند. وای! با تشکر از شما برای گسترش تنوع انجمن ما با اعضای جدید! first_share: name: اولین اشتراک‌گذاری description: یک نوشته را به اشتراک گذاشته @@ -2217,8 +2107,6 @@ fa_IR: first_quote: name: اولین نقل‌قول description: یک نوشته را نقل‌قول کرده است - long_description: | - این نشان زمانی اعطا می‌شود Ú©Ù‡ برای بار اول یک نوشته را در پاسخ خود نقل‌قول کنید. نقل‌قول بخش‌های مربوطه Ú©Ù…Ú© می‌کند Ú©Ù‡ بحث‌های موضوع به هم متصل شوند. بهترین راه برای نقل قول انتخاب متن در نوشته Ùˆ کلیک روی دکمه پاسخ است. سخاوتمندانه نقل‌قول کنید! read_guidelines: name: خواندن دستورالعمل‌ها description: " دستورالعمل های انجمن را خوانده" @@ -2270,8 +2158,6 @@ fa_IR: crazy_in_love: name: الهه‌ی مهر description: در 20 روز، روزانه 50 نوشته را پسندیده است. - long_description: | - این مدال وقتی به شما تعلق می‌گیرد Ú©Ù‡ برای 20 روز متوالی روزانه 50 بار نوشته دیگران را بپسندید. شما نمونه ÙØ±Ø¯ÛŒ هستید Ú©Ù‡ Ø§ÙØ±Ø§Ø¯ انجمن را به طور منظم تشویق می‌کنید! thank_you: name: سپاس‌گذاریم description: 20 نوشته پسندیده شده دارد Ùˆ 10 نوشته را پسندیده است. @@ -2285,19 +2171,15 @@ fa_IR: empathetic: name: همدلانه description: 500 نوشته پسندیده شده دارد Ùˆ 1000 نوشته را پسندیده است. - long_description: | - این مدال زمانی به شما تعلق می‌گیرد Ú©Ù‡ نوشته‌هایتان 1000 بار پسندیده شده باشد Ùˆ شما هم 500 نوشته را بپسندید. شما نمونه بخشندگی Ùˆ قدردانی متقابل هستید :two_hearts:. first_emoji: name: اولین Ø´Ú©Ù„Ú© description: در یک نوشته از Ø´Ú©Ù„Ú© Ø§Ø³ØªÙØ§Ø¯Ù‡ کرده. first_mention: name: اولین اشاره description: کاربری را در یک نوشته مخاطب قرار داده. - long_description: این نشان را در زمانی Ú©Ù‡ برای بار اول به یک کاربر به صورت @نام‌کاربری اشاره کنید، Ø¯Ø±ÛŒØ§ÙØª می‌کنید. هر اشاره به نام کاربری یه اعلان برای آن شخص ارسال می‌کند، بنابراین آن‌ها از نوشته‌ی شما مطلع خواهند شد. Ùقط علامت @ (علامت at) را تایپ کنید تا بتوانید به هر کاربری اشاره کنید یا، اگر اجازه وجود دارد، در گروه. -- این یک راه ساده برای جلب توجه آن‌ها است. first_onebox: name: اولین لینک قاب‌شده description: یک لینک قاب شده پست کرده - long_description: این مدال زمانی به شما تعلق می‌گیرد Ú©Ù‡ برای بار اول یک پیوند قرار می‌دهید، Ú©Ù‡ به صورت خودکار در جعبه باز شده Ùˆ عنوان Ùˆ خلاصه Ùˆ عکس آن (در صورت وجود) نمایش داده می‌شود. first_reply_by_email: name: اولین پاسخ با ایمیل description: به یک نوشته از طریق ایمیل پاسخ داده @@ -2311,15 +2193,12 @@ fa_IR: enthusiast: name: علاقه‌مند description: Û±Û° روز به اینجا سر زده - long_description: "به به! این مدال رو به شما دادیم چون ده روزه پشت سر هم به اینجا سر زدی. از اینکه بیش از یک Ù‡ÙØªÙ‡ با ما هستی ازت متشکریم. " aficionado: name: Ø·Ø±ÙØ¯Ø§Ø± description: Û±Û°Û° روز به اینجا سر زده. - long_description: این نشان برای بازدید Û±Û°Û° روز متوالی به شما اهدا شده. یعنی بیشتر از سه ماه! از همراهی‌تون ممنونیم. devotee: name: هواخواه description: Û³Û¶Ûµ روز به اینجا سر زده - long_description: این نشان برای Û³Û¶Ûµ روز بازدید متوالی به شما اهدا شده. دمت گرم! یک سال تمام! Ú†Ù‡ زود گذشت. نه؟ badge_title_metadata: "نشان %{display_name} در %{site_title}" admin_login: success: "ایمیل ارسال شد " @@ -2339,7 +2218,6 @@ fa_IR: button: "ثبت‌نام" title: "ثبت‌نام مدیر" help: "برای شروع ثبت‌نام کنید" - no_emails: "Ù…ØªØ§Ø³ÙØ§Ù†Ù‡ هیچ ایمیلی برای مدیریت تنظیم نشده، بنابراین اتمام تنظیمات شاید مشکل باشد." confirm_email: title: "ایمیل خود را تایید کنید" message: "

یک ایمیل ÙØ¹Ø§Ù„سازی به %{email} ارسال کردیم. Ù„Ø·ÙØ§ دستورالعمل آن را برای ÙØ¹Ø§Ù„سازی حساب کاربری خود دنبال کنید.

اگر ایمیلی نرسیده مطمئن شوید که تنظیمات ایمیل را به درستی انجام داده‌اید و پوشه اسپم را بررسی کنید.

" @@ -2440,10 +2318,8 @@ fa_IR: fields: favicon_url: label: "آیکن Ú©ÙˆÚ†Ú©" - description: "آیکن نشان دهنده‌ی سایت شما در مرورگر‌هایی است Ú©Ù‡ در اندازه های Ú©ÙˆÚ†Ú© خوب نمایش داده می‌شوند. اندازه‌ای مثل 32 در 32 پیکسل." apple_touch_icon_url: label: "آیکن بزرگ" - description: "آیکن نشان دهنده‌ی سایت شما در مرورگر‌هایی است Ú©Ù‡ در اندازه های بزرگ خوب نمایش داده می‌شوند. اندازه‌ی حداقلی 144 در 144 پیکسل." homepage: description: "توصیه می‌کنیم آخرین موضوعات را در ØµÙØ­Ù‡ اصلی سایت نمایش دهید. اما می‌توانید دسته‌بندی‌ها (گروه‌های موضوعات) را نیز نمایش دهید." title: "ØµÙØ­Ù‡ اصلی" @@ -2452,8 +2328,6 @@ fa_IR: choices: latest: label: "آخرین‌ ارسال‌ها" - categories: - label: "دسته‌بندی‌ها" emoji: title: "Ø´Ú©Ù„Ú©" description: "نوع Ø´Ú©Ù„Ú© مورد نظرتان را انتخاب کنید. می‌توانید از بخش مدیریت Ø´Ú©Ù„Ú© های Ø³ÙØ§Ø±Ø´ÛŒ اضاÙÙ‡ کنید." diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index de3a89ded3..20026e3307 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -29,24 +29,51 @@ fi: loading: "Lataa" powered_by_html: 'Voimanlähteenä Discourse, toimii parhaiten, kun JavaScript on käytössä' log_in: "Kirjaudu" + submit: "Lähetä" purge_reason: "Hylätty, aktivoimaton tili poistettiin automaattisesti" disable_remote_images_download_reason: "Linkattujen kuvien lataaminen poistettiin käytöstä vähäisen tallennustilan vuoksi." anonymous: "Anonyymejä" remove_posts_deleted_by_author: "Kirjoittajan poistama" + redirect_warning: "Emme pystyneet varmistamaan että klikkaamasi linkki on oikeasti lähetetty palstalle. Jos haluat silti jatkaa, klikkaa alla olevaa linkkiä." themes: bad_color_scheme: "Teemaa ei voitu päivittää, värimalli ei kelpaa" other_error: "Jotakin meni vikaan, kun teemaa päivitettiin" + error_importing: "Virhe kloonatessa Git-tietovarastoa: ei käyttöoikeutta tai tietovarastoa ei löytynyt" + errors: + component_no_user_selectable: "Teeman osia ei voi valita käyttäjätasolla" + component_no_default: "Teeman osat eivät voi olla oletusteema" + component_no_color_scheme: "Teeman osalla ei voi olla värimallia" + no_multilevels_components: "Teemat joilla on tytärteemoja eivät voi olla tytärteemoja itse" + settings_errors: + invalid_yaml: "Annettu YAML ei kelpaa" + data_type_not_a_number: "Ei voi asettaa tietotyypiksi %{name}. Tuettuja tyyppejä ovat integer, blool, list ja enum." + name_too_long: "Jollain asetuksella on liian pitkä nimi. Enimmäispituus on 255." + default_value_missing: "Asetuksella \"%{name}\" ei ole oletusarvoa" + default_not_match_type: "Asetuksen \"%{name}\" oletusarvo ei sovi asetuksen tyyppiin." + default_out_range: "Asetuksen \"%{name}\" oletusarvo ei ole sallituissa rajoissa." + enum_value_not_valid: "Valittu arvo ei ole enum-arvojen listalla." + number_value_not_valid: "Uusi arvo ei ole sallituissa rajoissa." + number_value_not_valid_min_max: "Sen täytyy olla vähintään %{min}ja enintään %{max}." + number_value_not_valid_min: "Sen täytyy olla suurempi tai yhtä suuri kuin %{min}." + number_value_not_valid_max: "Sen täytyy olla pienempi tai yhtä suuri kuin %{max}." + string_value_not_valid: "Uuden arvon pituus ei ole sallituissa rajoissa." + string_value_not_valid_min_max: "Sen täytyy olla vähintään %{min} ja enintään %{max}merkkiä pitkä." + string_value_not_valid_min: "Sen täytyy olla vähintään %{min}merkkiä pitkä." + string_value_not_valid_max: "Sen täytyy olla enintään %{max}merkkiä pitkä" emails: incoming: default_subject: "Tämä ketju tarvitsee otsikon" show_trimmed_content: "Näytä piilotettu sisältö" maximum_staged_user_per_email_reached: "Saavutti maksimimäärän automaattisesti luotuja esikäyttäjiä per sähköpostiosoite." + no_subject: "(ei aihetta)" + no_body: "(ei leipätekstiä)" errors: empty_email_error: "Näin käy, kun saapuneessa sähköpostissa ei lue mitään." no_message_id_error: "Näin käy, kun viestin otsikkotiedoista puuttuu ID-tunniste (engl. message-ID)." auto_generated_email_error: "Näin käy, kun viestin kiireellisyysluokitus (engl. precedence header) on joku seuraavista: list, junk, bulk tai auto_reply, tai kun joku muu otsikkotiedoista sisältää jonkun seuraavista: auto-submitted, auto-replied tai auto-generated." no_body_detected_error: "Näin käy, kun leipätekstin poiminta epäonnistuu eikä liitteitä ole." no_sender_detected_error: "Näin käy, kun emme tunnista käypää sähköpostiosoitetta viestin From-otsikkotiedosta." + from_reply_by_address_error: "Näin käy, kun lähettäjän osoite (From) on sama kuin vastausten sähköpostiosoite." inactive_user_error: "Näin käy, kun lähettäjä ei ole aktiivinen." silenced_user_error: "Näin käy, kun lähettäjä on hiljennetty." bad_destination_address: "Näin käy, kun viestin vastaanottaja/kopio/piilokopio -kenttien osoitteet eivät täsmää asetettuihin saapuvan sähköpostin osoitteiden kanssa." @@ -88,6 +115,8 @@ fi: not_an_integer: täytyy olla kokonaisluku odd: täytyy olla pariton record_invalid: 'Validointi epäonnistui: %{errors}' + max_emojis: "ei voi olla yli %{max_emojis_count}emojia" + ip_address_already_screened: "sisältyy jo olemassa olevaan sääntöön" restrict_dependent_destroy: one: "Tietuetta ei voi poistaa, koska siitä riippuva tietue %{record} on olemassa" many: "Tietueita ei voi poistaa, koska siitä riippuva tietue %{record} on olemassa." @@ -109,17 +138,27 @@ fi: embed: load_from_remote: "Viestin lataamisessa tapahtui virhe." site_settings: + invalid_choice: + one: 'Määrittämäsi valinta ei kelpaa %{name}' + other: 'Määrittämäsi valinnat eivät kelpaa %{name}' min_username_length_exists: "Käyttäjänimen vähimmäispituutta ei voi asettaa lyhyintä käyttäjänimeä pidemmäksi." min_username_length_range: "Et voi asettaa minimi korkeammaksi kuin maksimi" max_username_length_exists: "Et voi asettaa käyttäjänimen enimmäispituutta alle pisimmän käyttäjänimen." max_username_length_range: "Et voi asettaa maksimia minimin alle." default_categories_already_selected: "Et voi valita aluetta, joka on käytössä toisella listalla" s3_upload_bucket_is_required: "Et voi ottaa s3 latausta käyttöön, jos et ole määrittänyt 's3_upload_bucket'." + conflicting_google_user_id: 'Tämän käyttäjätilin Google Account ID on muuttunut. Henkilökunnan toimenpiteet ovat tarpeen tietoturvasyistä. Ota yhteyttä henkilökuntaan ja ohjaa heidät osoitteeseen
https://meta.discourse.org/t/76575' activemodel: errors: <<: *errors invite: not_found: "Kutsusi tunnistusväline ei kelpaa. Ota yhteyttä sivuston ylläpitäjään." + not_found_template: | +

Kutsusi sivustolle%{site_name} on jo käytetty.

+ +

Jos muistat salasanasi voit kirjautua sisään.

+ +

Muussa tapauksessa uusi salasanasi.

user_exists: "Ei ole tarpeen lähettää kutsua osoitteeseen %{email}, sillä kutsuttavalla on jo tunnus!" bulk_invite: file_should_be_csv: "Ladattavan tiedoston tulee olla CSV-muodossa." @@ -131,16 +170,20 @@ fi: backup_file_should_be_tar_gz: "Varmuuskopion tulisi olla .tar.gz-pakattu tiedosto." not_enough_space_on_disk: "Ei tarpeeksi levytilaa." invalid_filename: "Varmuuskopion nimi sisältää ei-sallittuja merkkejä. Sallittuja ovat a-z 0-9 . - _." + invalid_params: "Vastasit pyyntöön parametreilla, jotka eivät kelpaa: %{message}" not_logged_in: "Sinun täytyy kirjautua sisään ensin." not_found: "Pyydettyä osoitetta tai resurssia ei löytynyt." invalid_access: "Sinulla ei ole oikeutta nähdä pyydettyä resurssia." + authenticator_not_found: "Autentikointimenetelmää ei ole olemassa tai se on poistettu käytöstä." invalid_api_credentials: "Et voi katsella pyytämääsi resurssia. Rajapinnan käyttäjänimi tai avain ei kelpaa." + provider_not_enabled: "Et saa katsella pyydettyä resurssia. Autentikoinnintarjoajaa ei ole otettu käyttöön." + provider_not_found: "Et saa katsella pyydettyä resurssia. Autentikoinnintarjoajaa ei ole olemassa." read_only_mode_enabled: "Sivusto on vain luku-tilassa. Vuorovaikutteiset toiminnot ovat poissa käytöstä." reading_time: "Lukuaika" likes: "Tykkäykset" too_many_replies: - one: Pahoittelut, uudet käyttäjät voivat kirjoittaa yhden vastauksen samaan ketjuun. - other: Pahoittelut, uudet käyttäjät voivat kirjoittaa %{count} vastausta samaan ketjuun. + one: "Pahoittelut, uudet käyttäjät voivat kirjoittaa yhden vastauksen samaan ketjuun." + other: "Pahoittelut, uudet käyttäjät voivat kirjoittaa %{count} vastausta samaan ketjuun." embed: start_discussion: "Lisää kommentti" continue: "Siirry keskusteluun" @@ -150,40 +193,44 @@ fi: no_hosts: "Isäntiä ei ole määritetty upotusta varten." configure: "Määritä upottaminen" more_replies: - one: 1 muu kommentti - other: '%{count} muuta kommenttia' + one: "1 muu kommentti" + other: "%{count} muuta kommenttia" loading: "Haetaan kommentteja..." permalink: "Ikilinkki" imported_from: "Tämä on kommenttiketju artikkelille %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 kommentti - other: '%{count} kommenttia' + one: "1 kommentti" + other: "%{count} kommenttia" no_mentions_allowed: "Pahoittelut, et voi mainita muita käyttäjiä." too_many_mentions: - one: Pahoittelut, voit mainita viestissä vain yhden käyttäjän. - other: Pahoittelut, voit mainita viestissä vain %{count} käyttäjää. + one: "Pahoittelut, voit mainita viestissä vain yhden käyttäjän." + other: "Pahoittelut, voit mainita viestissä vain %{count} käyttäjää." no_mentions_allowed_newuser: "Pahoittelut, uusi käyttäjä ei voi mainita muita käyttäjiä." too_many_mentions_newuser: - one: Pahoittelut, uusi käyttäjä voi mainita viestissä vain yhden käyttäjän. - other: Pahoittelut, uusi käyttäjä voi mainita viestissä vain %{count} käyttäjää. + one: "Pahoittelut, uusi käyttäjä voi mainita viestissä vain yhden käyttäjän." + other: "Pahoittelut, uusi käyttäjä voi mainita viestissä vain %{count} käyttäjää." + no_images_allowed_trust: "Pahoittelut, et voi laittaa kuvia viesteihin" no_images_allowed: "Pahoittelut, uusi käyttäjä ei voi liittää kuvia viestiin." too_many_images: - one: Pahoittelut, uusi käyttäjä voi liittää vain yhden kuvan viestiin. - other: Pahoittelut, uusi käyttäjä voi liittää vain %{count} kuvaa viestiin. + one: "Pahoittelut, uusi käyttäjä voi liittää vain yhden kuvan viestiin." + other: "Pahoittelut, uusi käyttäjä voi liittää vain %{count} kuvaa viestiin." no_attachments_allowed: "Pahoittelut, uusi käyttäjä ei voi liittää liitteitä viesteihin." too_many_attachments: - one: Pahoittelut, uusi käyttäjä voi liittää vain yhden liitteen viestiin. - other: Pahoittelut, uusi käyttäjä voi liittää vain %{count} liittettä viestiin. + one: "Pahoittelut, uusi käyttäjä voi liittää vain yhden liitteen viestiin." + other: "Pahoittelut, uusi käyttäjä voi liittää vain %{count} liittettä viestiin." no_links_allowed: "Pahoittelut, uusi käyttäjä ei voi laittaa linkkiä viestiin." + links_require_trust: "Pahoittelut, et voi laittaa linkkejä viesteihin" too_many_links: - one: Pahoittelut, uudet käyttäjät voivat laittaa vain yhden linkin viestiin. - other: Pahoittelut, uusi käyttäjä voi laittaa vain %{count} linkkiä viestiin. + one: "Pahoittelut, uudet käyttäjät voivat laittaa vain yhden linkin viestiin." + other: "Pahoittelut, uusi käyttäjä voi laittaa vain %{count} linkkiä viestiin." + contains_blocked_words: "Viestissäsi on sana joka ei ole sallittu: %{word}" spamming_host: "Pahoittelut, linkit tuolle sivulle eivät ole sallittuja." user_is_suspended: "Hyllytetyt käyttäjät eivät saa luoda viestejä." topic_not_found: "Jotain on mennyt pieleen. Ehkä tämä ketju on suljettu tai poistettu sillä välin, kun katselit sitä?" not_accepting_pms: "Pahoittelut, %{username} ei ota vastaan yksityisviestejä tällä hetkellä." max_pm_recepients: "Pahoittelut, voit lähettää viestin enintään %{recipients_limit} vastaanottajalle." + pm_reached_recipients_limit: "Pahoittelut, yksityisviestillä ei voi olla yli %{recipients_limit} vastaanottajaa." just_posted_that: "on liian samanlainen kuin aiempi viestisi" invalid_characters: "sisältää epäkelpoja merkkejä" is_invalid: "vaikuttaa epäselvältä, olihan se kokonainen virke?" @@ -210,6 +257,7 @@ fi: top_weekly: "Viikon parhaat ketjut" top_daily: "Päivän parhaat ketjut" posts: "Uusimmat viestit" + private_posts: "Tuoreimmat yksityisviestit" group_posts: "Uusimmat viestit ryhmässä %{group_name}" group_mentions: "Uusimmat maininnat ryhmässä %{group_name}" user_posts: "Viimeisimmät viestit käyttäjältä @%{username}" @@ -223,8 +271,16 @@ fi: delete_reason: "Poistettu moderointijonon kautta" not_found: "Viestiä ei löytynyt tai se päivittyi jo." groups: + success: + bulk_add: + one: "%{count} käyttäjä lisättiin ryhmään." + other: "%{count} käyttäjää lisättiin ryhmään." errors: + grant_trust_level_not_valid: "'%{trust_level}' ei kelpaa luottamustasoksi." can_not_modify_automatic: "Et voi muokata automaattista ryhmää" + member_already_exist: + one: "'%{username}' on jo ryhmän jäsen." + other: "Nämä käyttäjät ovat jo ryhmän jäseniä: %{username}" invalid_domain: "'%{domain}' ei ole käypä verkkotunnus." invalid_incoming_email: "'%{email}' ei ole käypä sähköpostiosoite." email_already_used_in_group: "'%{email}' on jo käytössä ryhmällä '%{group_name}'." @@ -244,8 +300,8 @@ fi: title: "Jäsenhakemus ryhmään @%{group_name}" education: until_posts: - one: ensimmäisen viestisi - other: '%{count} ensimmäistä viestiäsi' + one: "ensimmäisen viestisi" + other: "%{count} ensimmäistä viestiäsi" 'new-topic': | Tervetuloa, tämä on %{site_name} — **kiitos uuden viestiketjun aloittamisesta!** @@ -303,6 +359,12 @@ fi: Olemme pahoillamme, mutta uusien käyttäjien viestien määrä on rajoitettu %{newuser_max_replies_per_topic} vastaukseen samassa ketjussa. Harkitse edellisten viestiesi muokkaamista uuden viestin kirjoittamisen sijaan tai vieraile muissa ketjuissa. + reviving_old_topic: | + ### Elvytä ketju? + + Viimeisimmästä vastauksesta ketjuun on jo **%{time_ago}**. Vastauksesi nostaa ketjun listausten kärkeen ja siitä lähtee ilmoitus aiemmin keskusteluun osallistuneille. + + Oletko varma, että haluat jatkaa tätä vanhaa keskustelua? activerecord: attributes: category: @@ -320,9 +382,12 @@ fi: topic: attributes: base: + warning_requires_pm: "Voit liittää varoituksia vain yksityisviesteihin." too_many_users: "Voit lähettää varoituksia vain yhdelle käyttäjälle kerrallaan." + cant_send_pm: "Pahoittelut, et voi lähettää yksityisviestiä tällä käyttäjälle." no_user_selected: "Sinun täytyy valita kelpaava käyttäjä." reply_by_email_disabled: "Sähköpostilla vastaaminen ei ole käytössä." + target_user_not_found: "Ei löydetty yhtä niistä käyttäjistä, joille lähetät viestiä." featured_link: invalid: "ei ole käypä. URL:in tulisi sisältää http:// tai https://." invalid_category: "ei voi muokata tällä alueella." @@ -336,6 +401,10 @@ fi: unique_characters: "on liikaa toistuvia merkkejä. Valitse turvallisempi salasana." ip_address: signup_not_allowed: "Liittyminen ei ole sallittu tälle tilille." + user_email: + attributes: + user_id: + reassigning_primary_email: "Ensisijaista sähköpostia ei voi siirtää toiselle käyttäjälle." color_scheme_color: attributes: hex: @@ -394,30 +463,31 @@ fi: title: "Tervetuloa Loungeen" body: |2 - Onnittelut! :confetti_ball: + Onnittelut! :confetti_ball: - Jos näet tämän ketjun, sinut on juuri ylennetty **Mestariksi** (luottamustaso 3). + Jos näet tämän ketjun, sinut on juuri ylennetty **Mestariksi** (luottamustaso 3). - Voit nyt… + Voit nyt… - * Muokata minkä hyvänsä ketjun otsikkoa - * Siirtää minkä tahansa ketjun toiselle alueelle - * Lisätä linkkejä, joita hakukoneet seuraavat ([nofollow](http://en.wikipedia.org/wiki/Nofollow) on poistettu) - * Päästä suljetulle Lounge-alueelle, joka näkyy vain luottamustason 3 ja korkeammille käyttäjille - * Piilottaa roskapostiviestin yhdellä liputuksella + * Muokata minkä hyvänsä ketjun otsikkoa + * Siirtää minkä tahansa ketjun toiselle alueelle + * Lisätä linkkejä, joita hakukoneet seuraavat ([nofollow](http://en.wikipedia.org/wiki/Nofollow) on poistettu) + * Päästä suljetulle Lounge-alueelle, joka näkyy vain luottamustason 3 ja korkeammille käyttäjille + * Piilottaa roskapostiviestin yhdellä liputuksella - Tässä on nykyinen [lista mestareista](/badges/3/leader). Muista käydä moikkaamassa. + Tässä on nykyinen [lista mestareista](/badges/3/leader). Muista käydä moikkaamassa. - Kiitos, että olet tämän yhteisön arvokas jäsen! + Kiitos, että olet tämän yhteisön arvokas jäsen! - (Lisää tietoa luottamustasoista saat [tästä englanninkielisestä ketjusta][trust]. Huomaa, että pysyäksesi mestarina sinun pitää täyttää vaatimukset jatkossakin.) + (Lisää tietoa luottamustasoista saat [tästä englanninkielisestä ketjusta][trust]. Huomaa, että pysyäksesi mestarina sinun pitää täyttää vaatimukset jatkossakin.) - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: topic_prefix: "Alueesta %{category}" replace_paragraph: "(Korvaa tämä kappale lyhyellä kuvauksella uudesta alueesta. Tämä kuvaus näytetään alueen valinnan yhteydessä, joten yritä pitää se alle 200 merkin pituisena. **Aluetta ei näytetä Keskustelualueet-sivulla ennen kuin olet muokannut tätä tekstiä tai aloittanut viestiketjuja.**)" post_template: "%{replace_paragraph}\n\nKäytä seuraavat kappaleet pidempään kuvaukseen tai selvittääksesi alueen säännöt ja ohjeet:\n\n- Miksi käyttäjät valitsisivat tämän alueen? Mitä varten se on?\n\n- Kuinka se tarkkaan ottaen eroaa muista olemassa olevista alueista?\n\n- Minkälaista sisältöä alueen ketjuissa tulisi yleensä olla?\n\n- Tarvitaanko tätä aluetta? Voisiko sen yhdistää toiseen alueeseen tai siirtää toisen alueen alle?\n" errors: + not_found: "Aluetta ei löytynyt!" uncategorized_parent: "Alueettomilla ei voi olla emoaluetta" self_parent: "Alue ei voi olla itsensä emoalue" depth: "Alue ei voi olla tytäralueen tytäralue" @@ -429,8 +499,8 @@ fi: uncategorized: "Alueettomat-aluetta ei voi poistaa" has_subcategories: "Aluetta ei voi poistaa, koska sillä on tytäralueita." topic_exists: - one: Aluetta ei voi poistaa, koska siellä on 1 ketju. Linkki ketjuun %{topic_link}. - other: Aluetta ei voi poistaa, koska siellä on %{count} ketjua. Vanhin ketju on %{topic_link}. + one: "Aluetta ei voi poistaa, koska siellä on 1 ketju. Vanhin ketju on %{topic_link}." + other: "Aluetta ei voi poistaa, koska siellä on %{count} ketjua. Vanhin ketju on %{topic_link}." topic_exists_no_oldest: "Aluetta ei voi poistaa, koska ketjujen lukumäärä on #{count}." uncategorized_description: "Ketjut, jotka eivät tarvitse aluetta tai eivät sovi muihin alueisiin." trust_levels: @@ -449,86 +519,104 @@ fi: image_placeholder: broken: "Tämä kuva ei toimi" rate_limiter: + slow_down: "Olet suorittanut toiminnon liian monta kertaa. Kokeile myöhemmin uudelleen." + too_many_requests: "Olet suorittanut toiminnon liian monta kertaa. Odota %{time_left} ennen kuin yrität uudelleen." + by_type: + first_day_replies_per_day: "Olet jo lähettänyt niin monta viestiä kuin uusi käyttäjä ensimmäisenä päivänään voi. Odota %{time_left} ennen kuin yrität uudelleen." + first_day_topics_per_day: "Olet jo aloittanut niin monta ketjua kuin uusi käyttäjä ensimmäisenä päivänään voi. Odota %{time_left} ennen kuin yrität uudelleen." + create_topic: "Aloitat ketjuja liian taajaan. Odota %{time_left} ennen kuin yrität uudelleen." + create_post: "Lähetät vastauksia liian taajaan. Odota %{time_left} ennen kuin yrität uudelleen." + delete_post: "Poistat viestejä liian taajaan. Odota %{time_left} ennen kuin yrität uudelleen." + public_group_membership: "Liityt tai poistut ryhmistä liian taajaan. Odota %{time_left} ennen kuin yrität uudelleen." + topics_per_day: "Olet aloittanut enimmäismäärän uusia ketjuja. Odota %{time_left} ennen kuin yrität uudelleen." + pms_per_day: "Olet lähettänyt enimmäismäärän yksityisviestejä. Odota %{time_left} ennen kuin yrität uudelleen." + create_like: "Olet jakanut enimmäismäärän tykkäyksiä. Odota %{time_left} ennen kuin yrität uudelleen." + create_bookmark: "Olet lisännyt enimmäismäärän kirjanmerkkejä. Odota %{time_left} ennen kuin yrität uudelleen. " + edit_post: "Olet tehnyt enimmäismäärän muokkauksia. Odota %{time_left} ennen kuin yrität uudelleen." + live_post_counts: "Kysyt viestimääriä liian nopealla tahdilla. Odota %{time_left} ja yritä sitten uudelleen." + unsubscribe_via_email: "Olet perunut enimmäismäärän sähköpostitse. Odota %{time_left} ja yritä sitten uudelleen." + topic_invitations_per_day: "Olet kutsunut enimmäismäärän käyttäjiä ketjuihin. Odota %{time_left} ja yritä sitten uudelleen." hours: - one: 1 tunti - other: '%{count} tuntia' + one: "1 tunti" + other: "%{count} tuntia" minutes: - one: 1 minuutti - other: '%{count} minuuttia' + one: "1 minuutti" + other: "%{count} minuuttia" seconds: - one: 1 sekunti - other: '%{count} sekuntia' + one: "1 sekunti" + other: "%{count} sekuntia" + short_time: "muutama sekunti" datetime: distance_in_words: half_a_minute: "< 1 min" less_than_x_seconds: - one: < 1 s - other: < %{count} s + one: "< 1 s" + other: "< %{count} s" x_seconds: - one: 1 s - other: '%{count} s' + one: "1 s" + other: "%{count} s" less_than_x_minutes: - one: < 1 min - other: < %{count} min + one: "< 1 min" + other: "< %{count} min" x_minutes: - one: 1 min - other: '%{count} min' + one: "1 min" + other: "%{count} min" about_x_hours: - one: 1 t - other: '%{count} t' + one: "1 t" + other: "%{count} t" x_days: - one: 1 pv - other: '%{count} pv' + one: "1 pv" + other: "%{count} pv" about_x_months: - one: 1 kk - other: '%{count} kk' + one: "1 kk" + other: "%{count} kk" x_months: - one: 1 kk - other: '%{count} kk' + one: "1 kk" + other: "%{count} kk" about_x_years: - one: 1 v - other: '%{count} v' + one: "1 v" + other: "%{count} v" over_x_years: - one: '> 1 v' - other: '> %{count} v' + one: "> 1 v" + other: "> %{count} v" almost_x_years: - one: 1 v - other: '%{count} v' + one: "1 v" + other: "%{count} v" distance_in_words_verbose: half_a_minute: "hetki sitten" less_than_x_seconds: - one: hetki sitten - other: hetki sitten + one: "hetki sitten" + other: "hetki sitten" x_seconds: - one: 1 sekunti sitten - other: '%{count} sekuntia sitten' + one: "1 sekunti sitten" + other: "%{count} sekuntia sitten" less_than_x_minutes: - one: alle minuutti sitten - other: alle %{count} minuuttia sitten + one: "alle minuutti sitten" + other: "alle %{count} minuuttia sitten" x_minutes: - one: minuutti sitten - other: '%{count} minuuttia sitten' + one: "minuutti sitten" + other: "%{count} minuuttia sitten" about_x_hours: - one: tunti sitten - other: '%{count} tuntia sitten' + one: "tunti sitten" + other: "%{count} tuntia sitten" x_days: - one: 1 päivä sitten - other: '%{count} päivää sitten' + one: "1 päivä sitten" + other: "%{count} päivää sitten" about_x_months: - one: noin kuukausi sitten - other: noin %{count} kuukautta sitten + one: "noin kuukausi sitten" + other: "noin %{count} kuukautta sitten" x_months: - one: kuukausi sitten - other: '%{count} kuukautta sitten' + one: "kuukausi sitten" + other: "%{count} kuukautta sitten" about_x_years: - one: noin vuosi sitten - other: noin %{count} vuotta sitten + one: "noin vuosi sitten" + other: "noin %{count} vuotta sitten" over_x_years: - one: yli vuosi sitten - other: yli %{count} vuotta sitten + one: "yli vuosi sitten" + other: "yli %{count} vuotta sitten" almost_x_years: - one: lähes vuosi sitten - other: lähes %{count} vuotta sitten + one: "lähes vuosi sitten" + other: "lähes %{count} vuotta sitten" password_reset: no_token: "Pahoittelut, tämä salasanan uusimisen linkki on liian vanha. Paina 'Kirjaudu sisään' nappia ja valitse 'Unohdin salasanani' saadaksesi uuden linkin." choose_new: "Valitse uusi salasana" @@ -538,6 +626,9 @@ fi: title: 'Uusi salasana' success: "Salasanan vaihto onnistui ja olet nyt kirjautuneena sisään." success_unapproved: "Salasana vaihdettu onnistuneesti." + email_login: + invalid_token: "Pahoittelut, tämä sisäänkirjautumislinkki on liian vanha. Paina 'Kirjaudu sisään' nappia ja valitse 'Unohdin salasanani' saadaksesi uuden linkin." + title: "Sähköpostikirjautuminen" change_email: confirmed: "Sähköpostiosoite päivitetty." please_continue: "Jatka sivustolle %{site_name}" @@ -547,6 +638,8 @@ fi: authorizing_old: title: "Kiitos sähköpostiosoitteesi varmentamisesta" description: "Lähetämme sinulle sähköpostin varmennusta varten." + associated_accounts: + revoke_failed: "Tunnustasi palveluntarjoajalla %{provider_name} ei onnistuttu perumaan." activation: action: "Aktivoi tilisi klikkaamalla tästä" already_done: "Pahoittelut, tämän tilin varmennuslinkki ei ole enää voimassa. Ehkäpä tili on jo varmennettu?" @@ -582,6 +675,8 @@ fi: long_form: 'liputti tämän sopimattomaksi' notify_user: title: 'Lähetä käyttäjälle @{{username}} viesti.' + description: 'Haluan keskustella viestistä kirjoittajan kanssa suoraan ja henkilökohtaisesti.' + short_description: 'Haluan keskustella viestistä kirjoittajan kanssa suoraan ja henkilökohtaisesti.' long_form: 'lähetä käyttäjälle viesti' email_title: 'Viestisi ketjussa "%{title}"' email_body: "%{link}\n\n%{message}" @@ -602,17 +697,12 @@ fi: description: 'Tykkää viestistä' short_description: 'Tykkää viestistä' long_form: 'tykkäsi tästä' - vote: - title: 'Äänestä' - description: 'Äänestä viestiä' - short_description: 'Äänestä viestiä' - long_form: 'viestiä äänestetty' user_activity: no_default: self: "Et ole vielä tehnyt mitään mainittavaa." others: "Ei ole tehnyt mitään mainittavaa." no_bookmarks: - self: "Kirjanmerkeissäsi ei ole viestejä. Kirjanmerkit auttavat löytämään viestejä helposti myöhemmin." + self: "Kirjanmerkeissäsi ei ole mitään. Kirjanmerkitsemällä viestejä löydät ne myöhemmin helposti." others: "Ei kirjanmerkkejä." no_likes_given: self: "Et ole tykännyt yhdestäkään viestistä." @@ -620,19 +710,25 @@ fi: no_replies: self: "Et ole vastannut yhteenkään viestiin." others: "Ei vastauksia." + no_drafts: + self: "Sinulla ei ole luonnoksia. Aloita kirjoittamaan viestiä mihin tahansa ketjuun niin se tallentuu automaattiseksi uudeksi luonnokseksi." + others: "Et voi nähdä tämän käyttäjän luonnoksia." topic_flag_types: spam: title: 'Roskaposti' description: 'Tämä ketju on mainos. Se ei ole hyödyllinen tai relevantti tällä sivustolla, vaan on luonteeltaan mainostamista.' long_form: 'liputti tämän roskapostiksi' + short_description: 'Tämä on mainos' inappropriate: title: 'Sopimaton' description: 'Ketjussa on loukkaavaa, herjaavaa tai palstan sääntöjen kanssa ristiriitaista sisältöä.' long_form: 'liputti tämän sopimattomaksi' + short_description: 'Palstan sääntöjen vastainen' notify_moderators: title: "Jotain muuta" description: 'Valvojan tulee huomioida tämä ketju palstan sääntöjen, palveluehtojen tai jonkun muun syyn vuoksi.' long_form: 'liputit tämän valvojille tiedoksi' + short_description: 'Henkilökunnan tulisi huomioida muusta syystä' email_title: 'Ketju"%{title}" kaipaa valvojan huomiota' email_body: "%{link}\n\n%{message}" flagging: @@ -650,6 +746,7 @@ fi: title: "Tilaus peruttu!" description: "Tilaus osoitteeseen %{email} on peruttu. Voit muuttaa sähköpostiasetuksia käyttäjäasetuksissasi." topic_description: "Tilaa %{link} uudelleen ketjun alla tai oikealla puolen sijaitsevan ilmoitusvalikon kautta." + private_topic_description: "Voit tilata ketjun uudelleen sen alla tai oikealla puolella sijaitsevan ilmoitusvalikon kautta." unsubscribe: title: "Peru tilaus" stop_watching_topic: "Lopeta ketjun tarkkailu, %{link}" @@ -677,12 +774,65 @@ fi: read: "Kaikkien luku" write: "Kaikkiin kirjaittaminen" reports: + default: + labels: + count: Lukumäärä + percent: Prosenttia + day: Päivä + post_edits: + title: "Viestin muokkauksia" + labels: + post: Viesti + editor: Muokkaaja + author: Kirjoittaja + edit_reason: Syy + moderators_activity: + title: "Valvojien toiminta" + labels: + moderator: Valvoja + flag_count: Arvioituja lippuja + time_read: Lukuaika + topic_count: Aloitetut ketjut + post_count: Kirjoitetut viestit + pm_count: Kirjoitetut yksityisviestit + revision_count: Revisiot + flags_status: + title: "Lippujen tilanne" + values: + agreed: Samaa mieltä + disagreed: Eri mieltä + deferred: Lykätty + no_action: Ei toimintaa + labels: + flag: Tyyppi + assigned: Osoitettu + poster: Kirjoittaja + flagger: Liputtaja + time_to_resolution: Selvitysaika visits: title: "Vierailut" xaxis: "Päivä" yaxis: "Vierailujen määrä" signups: + title: "Liittymiset" xaxis: "Päivä" + yaxis: "Liittymisten lukumäärä" + description: "Uusien tunnusten luonnit tänä aikana" + new_contributors: + title: "Uusia kirjoittajia" + xaxis: "Päivä" + yaxis: "Uusien kirjoittajien lukumäärä" + description: "Kuinka moni käyttäjä kirjoitti ensimmäisen viestinsä tänä aikana" + dau_by_mau: + title: "DAU/MAU" + xaxis: "Päivä" + yaxis: "Päivittäin aktiivisten käyttäjien osuus kuukausittain aktiivisista" + description: "Viimeisenä päivänä kirjautuneiden käyttäjien lukumäärän suhde viimeisen kuukauden aikana kirjautuneisiin. Tämä prosenttiluku mittaa yhteisön pysyvyyttä. Sopiva tavoite: >30%." + daily_engaged_users: + title: "Sitoutuneet päivittäiskäyttäjät" + xaxis: "Päivä" + yaxis: "Sitoutuneet käyttäjät" + description: "Viimeisen päivän aikana tykänneiden tai kirjoittaneiden käyttäjien lukumäärä" profile_views: title: "Käyttäjäprofiilin katselut" xaxis: "Päivä" @@ -691,10 +841,12 @@ fi: title: "Ketjut" xaxis: "Päivä" yaxis: "Uusien ketjujen lukumäärä" + description: "Tänä aikana aloitettujen ketjujen määrä" posts: title: "Viestit" xaxis: "Päivä" yaxis: "Uusien viestien lukumäärä" + description: "Tänä aikana kirjoitettujen viestien määrä" likes: title: "Tykkäyksiä" xaxis: "Päivä" @@ -715,13 +867,37 @@ fi: title: "Käyttäjiä luottamustasoilla" xaxis: "Luottamustaso" yaxis: "Käyttäjien lukumäärä" + labels: + level: Taso + users_by_type: + title: "Käyttäjät tyypeittäin" + xaxis: "Tyyppi" + yaxis: "Käyttäjien lukumäärä" + labels: + type: Tyyppi + xaxis_labels: + admin: Ylläpitäjä + moderator: Valvoja + suspended: Hyllytetty + silenced: Hiljennetty + trending_search: + title: Kuumat haut + labels: + term: Hakusana + searches: Hakuja + click_through: KS emails: title: "Lähetettyjä sähköposteja" xaxis: "Päivä" yaxis: "Sähköpostien lukumäärä" user_to_user_private_messages: + title: "Käyttäjältä käyttäjälle (pl. vastaukset)" xaxis: "Päivä" yaxis: "Viestien lukumäärä" + user_to_user_private_messages_with_replies: + title: "Käyttäjältä käyttäjälle (ml. vastaukset)" + xaxis: "Päivä" + yaxis: "Viestien määrä" system_private_messages: title: "Järjestelmä" xaxis: "Päivä" @@ -749,10 +925,15 @@ fi: num_clicks: "Klikkausta" num_topics: "Ketjut" num_users: "Käyttäjät" + labels: + domain: Verkkotunnus + num_clicks: Klikkaukset + num_topics: Ketjut top_referred_topics: title: "Parhaat viitatut ketjut" - xaxis: "Ketju" - num_clicks: "Klikkausta" + labels: + num_clicks: "Klikkaukset" + topic: "Ketju" page_view_anon_reqs: title: "Anonyymejä" xaxis: "Päivä" @@ -766,6 +947,7 @@ fi: xaxis: "Päivä" yaxis: "Hakurobottien sivunlataukset" page_view_total_reqs: + title: "Sivunkatselua" xaxis: "Päivä" yaxis: "Sivunlatauksia yhteensä" page_view_logged_in_mobile_reqs: @@ -809,9 +991,14 @@ fi: xaxis: "Päivä" yaxis: "Yhteensä" mobile_visits: - title: "Vierailut" + title: "Käyttäjävierailut (mobiili)" xaxis: "Päivä" yaxis: "Vierailujen määrä" + web_crawlers: + title: "Hakurobottien pyynnöt" + labels: + user_agent: "Käyttäjäagentti" + page_views: "Sivunkatselut" dashboard: rails_env_warning: "Palvelintasi ajetaan %{env} moodissa." host_names_warning: "Sivuston config/database.yml tiedosto käyttää oletusisäntänimeä. Päivitä se käyttämään sivuston isäntänimeä." @@ -829,29 +1016,38 @@ fi: failing_emails_warning: 'Epäonnistuneiden sähköpostitehtävien määrä on %{num_failed_jobs}. Tarkista app.yml ja varmista, että palvelimen asetukset ovat kunnossa. Katsele epäonnistuneita tehtäviä Sidekiqissa.' subfolder_ends_in_slash: "Alihakemiston asetuksesi ei kelpaa; DISCOURSE_RELATIVE_URL_ROOT päättyy vinoviivaan." email_polling_errored_recently: - one: Sähköpostin pollaus on aiheuttanut virheen edellisen 24 tunnin aikana. Tarkastele lokeja saadaksesi lisätietoja. - other: Sähköpostin pollaus aiheutti %{count} virhettä edellisen 24 tunnin aikana. Tarkastele lokeja saadaksesi lisätietoja. + one: "Sähköpostin pollaus on aiheuttanut virheen edellisen 24 tunnin aikana. Tarkastele lokeja saadaksesi lisätietoja." + other: "Sähköpostin pollaus aiheutti %{count} virhettä edellisen 24 tunnin aikana. Tarkastele lokeja saadaksesi lisätietoja." + missing_mailgun_api_key: "Palvelin on määritelty lähettämään sähköpostit Mailgunin avulla, muttet ole määritellyt rajapinta-avainta, jolla varmistetaan webhook-viestien aitous." bad_favicon_url: "Faviconin asettaminen epäonnistui. Tarkista favicon_url -asetus sivuston asetuksissa." poll_pop3_timeout: "Yhteyttä POP3-palvelimelle aikakatkaistaan ja saapuvaa sähköpostia ei voitu hakea. Tarkista POP3-asetukset ja palveluntarjoaja." poll_pop3_auth_error: "Yhteys POP3-palvelimelle epäonnistuu autentikaatiovirheen vuoksi. Tarkista POP3-asetukset." + force_https_warning: "Sivusto käyttää SSL-salausta, mutta `force_https` ei ole valittuna asetuksissa." + out_of_date_themes: "Päivityksiä on saatavilla näihin teemoihin:" site_settings: censored_words: "Sanat, jotka korvataan automaattisesti merkeillä ■■■■" delete_old_hidden_posts: "Poista automaattisesti kaikki yli 30 päivää piilotettuna olleet viestit." + default_locale: "Tämän Discourse-ympäristön oletuskieli" allow_user_locale: "Salli käyttäjien vaihtaa käyttöliittymän kieli omista asetuksista" set_locale_from_accept_language_header: "Aseta sivuston kieli kirjautumattomille käyttäjille selaimen kielivalinnan perusteella. (KOKEELLINEN, ei toimi anonyymin välimuistin kanssa)" + support_mixed_text_direction: "Salli vasemmalta-oikealle- ja oikealta-vasemmalle-kirjoitusta käytettävän sekaisin." min_post_length: "Viestin merkkien minimimäärä" min_first_post_length: "Ketjun aloitusviestin (leipätekstin) merkkien minimimäärä" + min_personal_message_post_length: "Yksityisviestin vähimmäismerkkimäärä" max_post_length: "Viestin merkkien minimimäärä" topic_featured_link_enabled: "Ota käyttöön ketjulinkit." show_topic_featured_link_in_digest: "Näytä ketjulinkki tiivistelmäsähköpostissa." min_topic_title_length: "Viestin otsikon merkkien minimimäärä" max_topic_title_length: "Viestin otsikon merkkien maksimimäärä" + min_personal_message_title_length: "Yksityisviestin otsikon vähimmäismerkkimäärä" + max_emojis_in_title: "Kuinka monta emojia enintään otsikossa" min_search_term_length: "Haun merkkien minimimäärä" search_tokenize_chinese_japanese_korean: "Pakota haku käsittelemään kiinaa/japania/koreaa myös muunkielisillä sivustoilla" search_prefer_recent_posts: "Jos hakeminen suurelta palstaltasi on hidasta, tämä asetus kokeilee hakemistorakennetta, jossa tuoreimmat viestit ovat ensin" search_recent_posts_size: "Kuinka monta tuoretta viestiä pidetään hakemistossa" log_search_queries: "Pidä lokia käyttäjien tekemistä hauista" search_query_log_max_size: "Kuinka monta hakukyselyä säilötään enintään" + search_query_log_max_retention_days: "Kuinka pitkään hakukyselyä enintään säilötään päivissä." allow_uncategorized_topics: "Salli ketjujen aloittaminen valitsematta aluetta. VAROITUS: Alueettomat ketjut täytyy siirtää jollekin alueelle ennen kuin poistat asetuksen käytöstä." allow_duplicate_topic_titles: "Salli ketjun aloittaminen identtisellä otsikolla." unique_posts_mins: "Kuinka monen minuutin kuluttua käyttäjä voi lähettää uudestaan samansisältöisen viestin" @@ -866,6 +1062,9 @@ fi: download_remote_images_max_days_old: "Älä lataa linkattuja kuvia viesteistä, jotka ovat yli n päivää vanhoja." disabled_image_download_domains: "Linkattuja kuvia ei koskaan ladata näistä verkkotunnuksista. Pystyviivalla eroteltu lista." editing_grace_period: "Viestin muokkaaminen (n) sekunnin sisällä sen lähettämisestä ei luo viestistä uutta versiota viestin lokiin." + editing_grace_period_max_diff: "Kuinka monen merkin muutos sallitaan katumusaikana. Jos muutos on isompi tallennetaan uusi viestirevisio (luottamustasolla 0 ja 1)." + editing_grace_period_max_diff_high_trust: "Kuinka monen merkin muutos sallitaan katumusaikana. Jos muutos on isompi tallennetaan uusi viestirevisio (luottamustasosta 2 ylöspäin)." + staff_edit_locks_post: "Viesti lukitaan muokkauksilta, jos henkilökunnan jäsen muokkaa sitä" post_edit_time_limit: "Kirjoittaja voi muokata tai poistaa viestinsä (n) minuuttia lähettämisen jälkeen. Aseta 0 poistaaksesi rajoituksen kokonaan." edit_history_visible_to_public: "Salli kaikkien nähdä muokatun viestin edelliset versiot. Jos asetus otetaan pois käytöstä, vain henkilökunta näkee versiot." delete_removed_posts_after: "Kirjoittajalta poistetut viestit poistetaan automaattisesti (n) tunnin kuluttua. Jos asetetaan 0, viestit poistetaan välittömästi." @@ -899,6 +1098,8 @@ fi: summary_likes_required: "Montako tykkäystä ketjussa pitää olla, jotta ketjun tiivistelmä otetaan käyttöön" summary_percent_filter: "Kun käyttäjä klikkaa 'Näytä ketjun tiivistelmä', näytä paras % viesteistä" summary_max_results: "Maksimimäärä viestejä, jotka näytetään ketjun tiivistelmässä" + enable_personal_messages: "Salli luottamustason 1 saavuttaneiden käyttäjien (\"min trust level to send messages\" on säädettävissä) lähettää yksityisviestejä ja vastata niihin. Huomioi, että henkilökunta voi aina lähettää yksityisviestejä." + enable_system_message_replies: "Sallii käyttäjien vastata systeemin yksityisviesteihin, vaikka yksityisviestit eivät olisikaan käytössä" enable_long_polling: "Ilmoitusten käyttämä viestiväylä voi käyttää long pollingia" long_polling_base_url: "Base URL, jota käytetään long pollingissa (kun CDN on käytössä, varmista että tähän on asetettu origin pull) esim: http://origin.site.com" long_polling_interval: "Kuinka kauan palvelimen pitäisi odottaa ennen vastaamista asiakkaalle, kun ei ole mitään dataa jota lähettää (vain kirjautuneille käyttäjille)" @@ -919,6 +1120,8 @@ fi: notify_mods_when_user_silenced: "Jos käyttäjä hiljennetään automaattisesti, lähetä viesti kaikile valvojille." flag_sockpuppets: "Jos uuden käyttäjän aloittamaan ketjuun vastaa toinen uusi käyttäjä samasta IP-osoitteesta, liputa molemmat viestit mahdolliseksi roskapostiksi." traditional_markdown_linebreaks: "Käytä perinteisiä rivinvaihtoja Markdownissa, joka vaatii kaksi perättäistä välilyöntiä rivin vaihtoon." + enable_markdown_linkify: "Tee linkin näköisestä tekstistä automaattisesti linkki: www.site.com ja http://site.com muutetaan automaattisesti linkeiksi" + markdown_linkify_tlds: "Luettelo ylätason verkkotunnuksista, jotka muutetaan esiintyessään linkeiksi automaattisesti" post_undo_action_window_mins: "Kuinka monta minuuttia käyttäjällä on aikaa perua viestiin kohdistuva toimi (tykkäys, liputus, etc)." must_approve_users: "Henkilökunnan täytyy hyväksyä kaikki uudet tilit, ennen uusien käyttäjien päästämistä sivustolle. VAROITUS: tämän asetuksen valitseminen poistaa pääsyn kaikilta jo olemassa olevilta henkilökuntaan kuulumattomilta käyttäjiltä." pending_users_reminder_delay: "Ilmoita valvojille, jos uusi käyttäjä on odottanut hyväksyntää kauemmin kuin näin monta tuntia. Aseta -1, jos haluat kytkeä ilmoitukset pois päältä." @@ -932,13 +1135,17 @@ fi: use_admin_ip_whitelist: "Ylläpitäjät voivat kirjautua vain IP-osoitteista, jotka on määritetty Seulottavien IP:iden listassa (Ylläpito > Lokit > Seulottavat IP:t)" blacklist_ip_blocks: "Lista yksityisistä IP-blokeista, joita Discoursen ei tule käydä läpi" allowed_iframes: "Iframe src -verkkotunnukset, jotka Discourse voi turvallisesti sallia viesteissä" + whitelisted_crawler_user_agents: 'Hakurobottien käyttäjäagentit, jotka saavat tulla sivustolle.' + blacklisted_crawler_user_agents: 'Uniikki kirjainkoosta riippumaton sana käyttäjäagentin nimessä, josta tunnistaa sivustolle ei-tervetulleen hakurobotin. Ei vaikutusta, mikäli valkolista sallituista on määritelty.' + slow_down_crawler_user_agents: 'Hakurobottien käyttäjäagentit, joiden toiminnan nopeutta rajoitetaan hakuviivemääräyksen (Crawl-delay directive) mukaisesti' + slow_down_crawler_rate: 'Jos slow_down_crawler_user_agents on määritelty tämä nopeusrajoitus koskee kaikkia hakurobotteja (kuinka monta sekuntia pitää kulua pyyntöjen välillä)' top_menu: "Mitkä painikkeet näytetään kotisivun navigointipalkissa, ja missä järjestyksessä. Esimerkiksi latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "Mitkä painikkeet näytetään viestin valikossa, ja missä järjestyksessä. Esimerkiksi like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Piilotettavat painikkeet viestin valikosta, kunnes '...' klikataan." share_links: "Mitkä painikkeet näytetään Jaa-valikossa ja missä järjestyksessä." - track_external_right_clicks: "Seuraa pois sivustolta vieviä linkkejä, jotka avataan hiiren oikealla näppäimellä (esim. avaa uudessa välilehdessä) oletuksena poistettu käytöstä, koska tämä kirjoittaa URL:n uudelleen" site_contact_username: "Henkilökuntaan kuuluvan käyttäjä, jonka nimissä kaikki automaattiset viestit lähetetään. Jos jätetään tyhjäksi, oletuksena on System-käyttäjä." send_welcome_message: "Lähetä kaikille uusille käyttäjille tervetuliaisviesti, jossa on pikakäyttöopas" + send_tl1_welcome_message: "Lähetä luottamustason 1 saavuttaville käyttäjille yksityinen tervetuloviesti." suppress_reply_directly_below: "Älä näytä vastausten lukumäärää viestissä, jos ainoa vastaus on seuraavassa viestissä." suppress_reply_directly_above: "Älä näytä vastauksena-painiketta viestin yläreunassa, jos viestissä on vastattu vain edelliseen viestiin." suppress_reply_when_quoting: "Älä näytä vastauksena-painiketta viestin yläreunassa, kun viestissä on lainaus." @@ -982,6 +1189,8 @@ fi: sso_overrides_avatar: "Syrjäyttää käyttäjän avatarin ulkopuolisella kertakirjautumisen kautta haetulla avatarilla. Jos tämä otetaan käyttöön, suositellaan samalla allow_uploaded_avatars -asetuksen poistamista käytöstä." sso_not_approved_url: "Uudelleenohjaa hyväksymättömät SSO-tilit tähän osoitteeseen" sso_allows_all_return_paths: "Älä rajoita SSO:n antamien palautuspolkujen verkkotunnusta (oletuksena palautuspolun on oltava nykyisellä sivustolla)" + enable_local_logins: "Salli kirjautuminen paikallisesti käyttäjänimen ja salasanan avulla. Tämä tulee olla päällä, jotta kutsuminen voi toimia. VAROITUS: jos ei ole käytössä, voi sinun olla mahdotonta kirjautua sisään, jollet ole aiemmin määritellyt ainakin yhtä muuta kirjautumistapaa." + enable_local_logins_via_email: "Salli käyttäjän pyytää klikattava kirjautumislinkki, joka lähetetään hänen sähköpostiinsa." allow_new_registrations: "Salli uusien käyttäjien rekisteröityminen. Ota tämä asetus pois käytöstä estääksesi uusien käyttäjätilien luomisen." enable_signup_cta: "Näytä palaaville anonyymeille käyttäjille ilmoitus, jossa kehoitetaan heitä luomaan tili." enable_yahoo_logins: "Ota käyttöön Yahoo kirjautuminen" @@ -1003,6 +1212,7 @@ fi: allow_restore: "Salli palautus, joka korvaa KAIKEN sivuston datan! Jätä valitsematta, jos et aio palauttaa sivuston varmuuskopiota" maximum_backups: "Tallennettuna pidettävien varmuuskopioiden maksimimäärä. Vanhemmat varmuuskopiot poistetaan automaattisesti" automatic_backups_enabled: "Tee automaattinen varmuuskopiointi, kuten tiheysasetus on määritelty" + backup_frequency: "Kuinka monen päivän välein otetaan varmuuskopio." enable_s3_backups: "Lataa varmuuskopiot S3:een niiden valmistuttua. TÄRKEÄÄ: edellyttää, että toimivat S3 kirjautumistiedot on syötetty asetuksiin." s3_backup_bucket: "Amazon S3 bucket johon varmuuskopiot ladataan. VAROITUS: Varmista, että se on yksityinen." s3_disable_cleanup: "Älä poista varmuuskopiota S3:sta, kun se poistetaan paikallisesti." @@ -1015,6 +1225,7 @@ fi: top_topics_formula_first_post_likes_multiplier: "avausviestin tykkäysmäärän kerroin (n) Huiput-listauksen kaavassa: `log(katselut) * 2 + avausviestin tykkäykset * (n) + PIENEMPI(tykkäysten määrä / viestien määrä, 3) + 10 + log(viestien määrä)`" top_topics_formula_least_likes_per_post_multiplier: "tykkäykset/viestit -suhteen enimmäisarvo (n) Huiput-listauksen kaavassa: `log(katselut) * 2 + avausviestin tykkäykset * 0.5 + PIENEMPI(tykkäysten määrä / viestien määrä, (n)) + 10 + log(viestien määrä)`" rebake_old_posts_count: "Kuinka monta vanhaa viestiä rakennetaan uudelleen 15 minuutissa." + enable_safe_mode: "Salli käyttäjän mennä vikasietotilaan, jotta hän voi rajata pois ongelmanaiheuttajista lisäosat." rate_limit_create_topic: "Ketjun aloittamisen jälkeen käyttäjän täytyy odottaa (n) sekuntia voidakseen aloittaa toisen ketjun." rate_limit_create_post: "Viestin luomisen jälkeen käyttäjän täytyy odottaa (n) sekuntia voidakseen luoda uuden viestin." rate_limit_new_user_create_topic: "Ketjun luomisen jälkeen uuden käyttäjän täytyy odottaa (n) sekuntia voidakseen luoda uuden ketjun." @@ -1024,10 +1235,13 @@ fi: max_bookmarks_per_day: "Kirjanmerkkien päivittäinen maksimimäärä per käyttäjä." max_edits_per_day: "Muokkausten päivittäinen maksimimäärä per käyttäjä." max_topics_per_day: "Kuinka monta ketjua käyttäjä voi aloittaa päivässä." + max_personal_messages_per_day: "Kuinka monta yksityisviestiketjua käyttäjä voi aloittaa päivässä." max_invites_per_day: "Maksimimäärä kutsuja, jonka käyttäjä voi lähettää päivässä." max_topic_invitations_per_day: "Maksimimäärä ketjukutsuja, jonka yksittäinen käyttäjä voi lähettää päivässä" max_logins_per_ip_per_hour: "Enimmäismäärä kirjautumisia IP-osoitetta kohden tunnissa" max_logins_per_ip_per_minute: "Enimmäismäärä kirjautumisia IP-osoitetta kohden minuutissa" + max_post_deletions_per_minute: "Kuinka monta viestiä käyttäjä voi poistaa minuutissa." + max_post_deletions_per_day: "Kuinka monta viestiä käyttäjä voi poistaa päivässä." alert_admins_if_errors_per_minute: "Virheiden määrä minuutissa, jonka seurauksena hälytetään ylläpitäjä. 0 ottaa toiminnon pois käytöstä. HUOM: vaatii uudelleenkäynnistyksen." alert_admins_if_errors_per_hour: "Virheiden määrä tunnissa, jonka seurauksena hälytetään ylläpitäjä. 0 ottaa toiminnon pois käytöstä. HUOM: vaatii uudelleenkäynnistyksen." categories_topics: "Kuinka monta ketjua näytetään /keskustelualueet-sivulla" @@ -1047,12 +1261,15 @@ fi: avatar_sizes: "Profiilikuvista automaattisesti luotavat koot." external_system_avatars_enabled: "Käytä ulkopuolista avatarpalvelua." external_system_avatars_url: "Ulkoisen avatarpalvelun URL. Sallitut vaihdokset ovat {username} {first_letter} {color} {size}" + selectable_avatars_enabled: "Pakota käyttäjä valitsemaan avatarinsa listalta." + selectable_avatars: "Avatarit, joista käyttäjä voi valita." default_opengraph_image_url: "Oletuksena käytettävän opengraph-kuvan URL." twitter_summary_large_image_url: "Oletuksena käytettävän Twitter-tiivistelmäkortin kuva (tulisi olla leveydeltään ainakin 280 px leveä ja 150 px korkea)." allow_all_attachments_for_group_messages: "Salli kaikki sähköpostiliitteet ryhmäviesteissä." png_to_jpg_quality: "Muunnetun JPG-tiedoston laatu (1 on huonoin laatu, 99 on paras laatu, 100 ottaa pois käytöstä)." allow_staff_to_upload_any_file_in_pm: "Salli henkilökunnan ladata minkätyyppisiä liitteitä tahansa yksityisviesteihin." strip_image_metadata: "Poista metadata kuvista." + min_ratio_to_crop: "Suhde, jolla korkeat kuvat cropataan. Syötä tulos suhteena leveys / korkeus." enable_flash_video_onebox: "Ota käyttöön swf- ja flv-linkkien (Adobe Flash) onebox-tuki. VAROITUS: saattaa lisätä tietoturvariskejä." default_invitee_trust_level: "Oletus luottamustaso (0-4) kutsutuille käyttäjille." default_trust_level: "Uusien käyttäjien oletusarvoinen luottamustaso (0-4). VAROITUS! Tämän muuttaminen altistaa roskapostille." @@ -1080,10 +1297,17 @@ fi: tl3_requires_likes_given: "Montako tykkäystä käyttäjän täytyy olla vähintään antanut viimeisen (tl3 time period) päivän aikana voidakseen saavuttaa luottamustason 3." tl3_requires_likes_received: "Montako tykkäystä käyttäjän täytyy olla vähintään saanut viimeisen (tl3 time period) päivän aikana voidakseen saavuttaa luottamustason 3." tl3_links_no_follow: "Älä poista rel=nofollow -attribuuttia linkeistä luottamustason 3 käyttäjiltä." + trusted_users_can_edit_others: "Salli korkean luottamustason käyttäjän muokata toisten käyttäjien viestien sisältöjä" min_trust_to_create_topic: "Ketjun aloittamiseen vaadittava luottamustaso." + allow_flagging_staff: "Jos käytössä, käyttäjät voivat liputtaa henkilökunnan viestejä." min_trust_to_edit_wiki_post: "Wikiviestin muokkaamiseen vaadittava luottamustaso." min_trust_to_edit_post: "Viestin muokkaamiseen vaadittava luottamustaso." min_trust_to_allow_self_wiki: "Minimiluottamustaso, jolla käyttäjä voi tehdä omasta viestistään wiki-viestin." + min_trust_to_send_messages: "Vähimmäisluottamustaso, jolla voi aloittaa yksityisviestiketjuja." + min_trust_to_flag_posts: "Vähimmäisluottamustaso, jolla voi liputtaa viestejä" + min_trust_to_post_links: "Vähimmäisluottamustaso, jolla voi lisätä linkkejä viesteihin" + min_trust_to_post_images: "Vähimmäisluottamustaso, jolla voi lisätä kuvia viesteihin" + whitelisted_link_domains: "Verkkotunnukset, joihin voi linkittää vaikkei olisikaan riittävällä luottamustasolla, jotta muuten voisi lisätä linkkejä viesteihin" newuser_max_links: "Kuinka monta linkkiä uusi käyttäjä voi lisätä viestiin." newuser_max_images: "Kuinka monta kuvaa uusi käyttäjä voi lisätä viestiin." newuser_max_attachments: "Kuinka monta liitettä uusi käyttäjä voi lisätä viestiin." @@ -1094,6 +1318,7 @@ fi: enable_mentions: "Salli käyttäjän mainita toinen käyttäjä." create_thumbnails: "Luo esikatselu- ja lightbox-kuvia, jotka ovat liian suuria mahtuakseen viestiin." email_time_window_mins: "Odota (n) minuuttia ennen ilmoitussähköpostien lähettämistä, jotta käyttäjällä on aikaa muokata ja viimeistellä viestinsä." + personal_email_time_window_seconds: "Odota (n) sekuntia ennen kuin lähetetään mitään yksityisiä sähköposti-ilmoituksia, jotta käyttäjillä on mahdollisuus muokata ja viimeistellä yksityisviestinsä." email_posts_context: "Kuinka monta edellistä vastausta liitetään kontekstiksi sähköposti-ilmoituksessa." flush_timings_secs: "Kuinka usein timing data päivitetään palvelimelle, sekunneissa." title_max_word_length: "Sanan enimmäispituus merkkeinä ketjun otsikossa" @@ -1109,6 +1334,7 @@ fi: max_image_size_kb: "Liitetyn kuvan suurin sallittu koko kilotavuissa. Tämä pitää asettaa myös nginxin (client_max_body_size) / apachen tai proxyn asetuksista." max_attachment_size_kb: "Liitetyn tiedoston suurin sallittu koko kilotavuissa. Tämä pitää asettaa myös nginxin (client_max_body_size) / apachen tai proxyn asetuksista." authorized_extensions: "Liitetiedostojen sallitut tiedostopäätteet (käytä '*' salliaksesi kaikki tiedostotyypit)" + authorized_extensions_for_staff: "Luettelo tiedostopäätteistä, jotka ovat sallittuja henkilökunnan jäsenille niiden lisäksi, jotka on määritelty sivustoasetuksella \"authorized_extensions\". (salli asettamalla * kaikki tiedostotyypit)" theme_authorized_extensions: "Teemalatausten liitetiedostojen sallitut tiedostopäätteet (käytä '*' salliaksesi kaikki tiedostotyypit)" max_similar_results: "Kuinka monta samankaltaista ketjua näytetään viestikentän päällä uutta ketjua aloitettaessa. Vertailu perustuu sekä otsikkoon että leipätekstiin." max_image_megapixels: "Kuvan enimmäiskoko megapikseleinä." @@ -1128,6 +1354,7 @@ fi: faq_url: "Jos haluat käyttää sivuston ulkopuolella ylläpidettyä UKK-listaa, syötä URL tähän." tos_url: "Jos haluat ylläpitää käyttöehtoja sivuston ulkopuolella, syötä URL tähän." privacy_policy_url: "Jos haluat ylläpitää tietosuojaselostetta sivuston ulkopuolella, syötä URL tähän." + log_anonymizer_details: "Pidetäänkö käyttäjästä tietoa lokeissa anonymisoinnin jälkeen. Jos noudatat GDPR:ää sinun on kytkettävä tämä pois käytöstä." newuser_spam_host_threshold: "Kuinka monta kertaa uusi käyttäjä voi linkittää samalle sivustolle `newuser_spam_host_posts` viesteissään, ennen kuin se tulkitaan roskapostin lähettämiseksi." white_listed_spam_host_domains: "Lista verkkotunnuksista, joita ei oteta huomioon roskapostin tunnistamisessa. Uusilla käyttäjillä ei ole rajoituksia linkkaamisessa näihin tunnuksiin." staff_like_weight: "Kuinka suuri ylimääräinen arvo on henkilökunnan tykkäyksillä." @@ -1147,16 +1374,19 @@ fi: auto_silence_fast_typers_max_trust_level: "Enimmäisluottamustaso, jolla nopea kirjoittaja voidaan hiljentää automaattisesti" auto_silence_first_post_regex: "Isoista ja pienistä kirjaimista riippumaton säännöllinen lauseke, joka osuessaan aiheuttaa käyttäjän ensimmäisen viestin hiljennyksen ja viesti viedään arvioitavaksi. Esimerkki: hemmetti|a[bc]a aiheuttaa hiljennyksen, jos viesti sisältää sanan 'hemmetti', 'aba' tai 'aca'. Koskee vain käyttäjän ensimmäistä viestiä." flags_default_topics: "Näytä liputetut ketjut oletuksena ylläpito-osiossa" + min_flags_staff_visibility: "Kuinka monesti viesti täytyy liputtaa, jotta henkilökunta näkee sen ylläpito-osiossa" reply_by_email_enabled: "Ota käyttöön vastaukset sähköpostin avulla." reply_by_email_address: "Saapuvien sähköpostivastausten sähköpostiosoitekaava, esimerkiksi: %{reply_key}@reply.example.com tai replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Lista vaihtoehtoisista saapuvien sähköpostivastausten sähköpostiosoitekaavoista, esimerkiksi: %{reply_key}@reply.example.com tai replies+%{reply_key}@example.com" - disable_emails: "Estä Discoursea lähettämästä mitään sähköpostia" + incoming_email_prefer_html: "Käytä HTML:ää tekstin sijaan saapuvissa sähköposteissa." + disable_emails: "Estä Discoursea lähettämästä minkäänlaisia sähköposteja. Ota pois sähköpostit kaikilta käyttäjiltä valitsemalla \"yes\" . \"Non-staff\" poistaa sähköpostit vain muilta kuin henkilökunnalta." strip_images_from_short_emails: "Poista kuvat sähköposteista, joiden koko on alle 2800 tavua" short_email_length: "Lyhyen sähköpostin pituus tavuissa" display_name_on_email_from: "Näytä sähköpostien lähettäjinä käyttäjien koko nimet" unsubscribe_via_email: "Salli käyttäjän lakkauttaa sähköposti-ilmoitukset lähettämällä sähköpostiviesti, jonka otsikossa tai leipätekstissä esiintyy sana \"unsubscribe\"" unsubscribe_via_email_footer: "Liitä sähköpostiviestien alaosaan mailto: linkki, jonka avulla saaja voi lakkauttaa sähköposti-ilmoitukset" delete_email_logs_after_days: "Poista sähköpostilokit (N) päivän jälkeen. Aseta 0 säilyttääksesi ikuisesti." + disallow_reply_by_email_after_days: "Estä vastaaminen sähköpostitse (N) päivän jälkeen. 0 sallii vastaamisen aina." max_emails_per_day_per_user: "Käyttäjälle päivässä lähetettävien sähköpostien enimmäismäärä. Aseta 0, jos et halua rajoittaa." enable_staged_users: "Luo automaattisesti esikäyttäjiä, kun saapuvia sähköposteja käsitellään." maximum_staged_users_per_email: "Enimmäismäärä automaattisesti luotuja esikäyttäjiä, kun käsitellään saapuvaa sähköpostia." @@ -1183,6 +1413,7 @@ fi: pop3_polling_host: "POP3 pollauksen host." pop3_polling_username: "POP3 käyttäjänimi" pop3_polling_password: "POP3 käyttäjätilin salasana." + pop3_polling_delete_from_server: "Poista sähköpostit palvelimelta. HUOM: Jos tämä on pois päältä sinun täytyy siivota saapuvien sähköpostien kansio manuaalisesti" log_mail_processing_failures: "Kirjaa kaikki sähköpostin prosessoinnin virheet tänne http://sivustonnimi.com/logs" email_in: "Salli käyttäjien aloittaa uusia ketjuja sähköpostitse (vaatii manuaalisen tai pop3-pollauksen). Määritä osoitteet jokaiselle alueelle erikseen niiden Asetukset-välilehdiltä. " email_in_min_trust: "Vähimmäisluottamustaso, jonka käyttäjä tarvitsee uuden ketjun aloittamiseen sähköpostitse." @@ -1195,7 +1426,7 @@ fi: delete_all_posts_max: "Kerralla poistettavien viestien maksimimäärä Poista kaikki viestit-painikkeella. Jos käyttäjällä on enemmän viestejä, niitä ei voi poistaa kerralla eikä käyttäjää voi poistaa." username_change_period: "Kuinka monen päivän ajan voi vaihtaa käyttäjänimeään sen jälkeen, kun rekisteröityy (0 estää käyttäjänimen muuttamisen)." email_editable: "Salli käyttäjien vaihtaa sähköpostiosoitteensa tilin luomisen jälkeen." - logout_redirect: "Sivu, jonne selain ohjataan uloskirjautumisen jälkeen, esim: (http://somesite.com/logout)" + logout_redirect: "Minne selain ohjataan uloskirjautumisen jälkeen (esim: http://example.com/logout)" allow_uploaded_avatars: "Salli käyttäjien ladata oma profiilikuva." allow_animated_avatars: "Salli käyttäjien valita animoituja gif-profiilikuvia. VAROITUS: aja avatars:refresh rake task tämän asetuksen muuttamisen jälkeen." allow_animated_thumbnails: "Luo animoidut esikatselukuvat animoiduista gif-tiedostoista." @@ -1364,68 +1595,65 @@ fi: not_seen_in_a_month: "Tervetuloa takaisin! Emme ole nähneet sinua vähään aikaan. Tässä ovat suosituimmat viestiketjut sitten viime näkemän." merge_posts: edit_reason: - one: '%{username} yhdisti viestin' - other: '%{username} yhdisti %{count} viestiä' + one: "%{username} yhdisti viestin" + other: "%{username} yhdisti %{count} viestiä" errors: different_topics: "Eri ketjuissa olevia viestejä ei voi yhdistää." different_users: "Eri käyttäjien viestejä ei voi yhdistää." move_posts: new_topic_moderator_post: - one: 'Yksi viesti siirrettiin uuteen ketjuun: %{topic_link}' - other: '%{count} viestiä siirrettiin uuteen ketjuun: %{topic_link}' + one: "Yksi viesti siirrettiin uuteen ketjuun: %{topic_link}" + other: "%{count} viestiä siirrettiin uuteen ketjuun: %{topic_link}" existing_topic_moderator_post: - one: 'Yksi viesti siirrettiin toiseen ketjuun: %{topic_link}' - other: '%{count} viestiä siirrettiin toiseen ketjuun: %{topic_link}' - change_owner: - post_revision_text: "Omistus siirrettiin käyttäjältä %{old_user} käyttäjälle %{new_user}" - deleted_user: "poistettu käyttäjä" + one: "Yksi viesti siirrettiin toiseen ketjuun: %{topic_link}" + other: "%{count} viestiä siirrettiin toiseen ketjuun: %{topic_link}" topic_statuses: archived_enabled: "Tämä ketju on arkistoitu. Se on jäädytetty eikä sitä voi muuttaa millään tavalla." archived_disabled: "Ketjun arkistointi on poistettu, se ei ole enää jäädytettynä ja sitä voi taas muuttaa." closed_enabled: "Tämä ketju on suljettu. Uusia vastauksia ei voi enää kirjoittaa." closed_disabled: "Tämä ketju on nyt avattu. Uusia vastauksia voi taas kirjoittaa." autoclosed_message_max_posts: - one: Tämä yksityisketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän 1. - other: Tämä yksityisketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän %{count}. + one: "Tämä yksityisketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän 1." + other: "Tämä yksityisketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän %{count}." autoclosed_topic_max_posts: - one: Tämä viestiketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän 1. - other: Tämä viestiketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän %{count}. + one: "Tämä viestiketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän 1." + other: "Tämä viestiketju suljettiin automaattisesti sen saavutettua vastausten maksimimäärän %{count}." autoclosed_enabled_days: - one: Tämä ketju suljettiin automaattisesti 1 päivän kuluttua. Uusia vastauksia ei voi enää kirjoittaa. - other: Ketju suljettiin ajastetusti %{count} päivän kuluttua. Uusia vastauksia ei voi enää kirjoittaa. + one: "Tämä ketju suljettiin automaattisesti 1 päivän kuluttua. Uusia vastauksia ei voi enää kirjoittaa." + other: "Ketju suljettiin ajastetusti %{count} päivän kuluttua. Uusia vastauksia ei voi enää kirjoittaa." autoclosed_enabled_hours: - one: Tämä ketju suljettiin automaattisesti 1 tunnin kuluttua. Uusia vastauksia ei voi enää kirjoittaa. - other: Ketju suljettiin ajastetusti %{count} tunnin kuluttua. Uusia vastauksia ei voi enää kirjoittaa. + one: "Tämä ketju suljettiin automaattisesti 1 tunnin kuluttua. Uusia vastauksia ei voi enää kirjoittaa." + other: "Ketju suljettiin ajastetusti %{count} tunnin kuluttua. Uusia vastauksia ei voi enää kirjoittaa." autoclosed_enabled_minutes: - one: Tämä ketju suljettiin automaattisesti 1 minuutin kuluttua. Uusia vastauksia ei voi enää kirjoittaa. - other: Ketju suljettiin ajastetusti %{count} minuutin kuluttua. Uusia vastauksia ei voi enää kirjoittaa. + one: "Tämä ketju suljettiin automaattisesti 1 minuutin kuluttua. Uusia vastauksia ei voi enää kirjoittaa." + other: "Ketju suljettiin ajastetusti %{count} minuutin kuluttua. Uusia vastauksia ei voi enää kirjoittaa." autoclosed_enabled_lastpost_days: - one: Tämä ketju suljettiin automaattisesti 1 päivän kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa. - other: Ketju suljettiin automaattisesti %{count} päivän kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa. + one: "Tämä ketju suljettiin automaattisesti 1 päivän kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa." + other: "Ketju suljettiin automaattisesti %{count} päivän kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa." autoclosed_enabled_lastpost_hours: - one: Tämä ketju suljettiin automaattisesti 1 tunnin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa. - other: Ketju suljettiin automaattisesti %{count} tunnin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa. + one: "Tämä ketju suljettiin automaattisesti 1 tunnin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa." + other: "Ketju suljettiin automaattisesti %{count} tunnin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa." autoclosed_enabled_lastpost_minutes: - one: Tämä ketju suljettiin automaattisesti 1 minuutin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa. - other: Ketju suljettiin automaattisesti %{count} minuutin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa. + one: "Tämä ketju suljettiin automaattisesti 1 minuutin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa." + other: "Ketju suljettiin automaattisesti %{count} minuutin kuluttua viimeisestä viestistä. Uusia vastauksia ei voi enää kirjoittaa." autoclosed_disabled_days: - one: Ketju avattiin ajastetusti 1 päivän kuluttua. - other: Ketju avattiin ajastetusti %{count} päivän kuluttua. + one: "Ketju avattiin ajastetusti 1 päivän kuluttua." + other: "Ketju avattiin ajastetusti %{count} päivän kuluttua." autoclosed_disabled_hours: - one: Ketju avattiin ajastetusti 1 tunnin kuluttua. - other: Ketju avattiin ajastetusti %{count} tunnin kuluttua. + one: "Ketju avattiin ajastetusti 1 tunnin kuluttua." + other: "Ketju avattiin ajastetusti %{count} tunnin kuluttua." autoclosed_disabled_minutes: - one: Ketju avattiin ajastetusti 1 minuutin kuluttua. - other: Ketju avattiin ajastetusti %{count} minuutin kuluttua. + one: "Ketju avattiin ajastetusti 1 minuutin kuluttua." + other: "Ketju avattiin ajastetusti %{count} minuutin kuluttua." autoclosed_disabled_lastpost_days: - one: Ketju avattiin automaattisesti 1 päivän kuluttua viimeisimmästä viestistä. - other: Ketju avattiin automaattisesti %{count} päivän kuluttua viimeisimmästä viestistä. + one: "Ketju avattiin automaattisesti 1 päivän kuluttua viimeisimmästä viestistä." + other: "Ketju avattiin automaattisesti %{count} päivän kuluttua viimeisimmästä viestistä." autoclosed_disabled_lastpost_hours: - one: Ketju avattiin automaattisesti 1 tunnin kuluttua viimeisimmästä viestistä. - other: Ketju avattiin automaattisesti %{count} tunnin kuluttua viimeisimmästä viestistä. + one: "Ketju avattiin automaattisesti 1 tunnin kuluttua viimeisimmästä viestistä." + other: "Ketju avattiin automaattisesti %{count} tunnin kuluttua viimeisimmästä viestistä." autoclosed_disabled_lastpost_minutes: - one: Ketju avattiin automaattisesti 1 minuutin kuluttua viimeisimmästä viestistä. - other: Ketju avattiin automaattisesti %{count} minuutin kuluttua viimeisimmästä viestistä. + one: "Ketju avattiin automaattisesti 1 minuutin kuluttua viimeisimmästä viestistä." + other: "Ketju avattiin automaattisesti %{count} minuutin kuluttua viimeisimmästä viestistä." autoclosed_disabled: "Tämä ketju on nyt avattu. Uusia vastauksia voi taas kirjoittaa." autoclosed_disabled_lastpost: "Tämä ketju on nyt avattu. Uusia vastauksia voi taas kirjoittaa." pinned_enabled: "Tämä ketju on nyt kiinnitetty. Se näytetään alueensa ylimmäisenä. Kiinnityksen voi poistaa joko henkilökunnan jäsen kaikilta yhteisesti tai yksittäiset käyttäjät itseltään." @@ -1461,7 +1689,6 @@ fi: click_to_continue: "Jatka klikkaamalla tästä." already_logged_in: "Hups, näyttää siltä, että yrität hyväksyä kutsun käyttäjänä, jolle sitä ei lähetetty. Jos et ole %{current_user}, kirjaudu ulos ja yritä uudestaan." user: - no_accounts_associated: "Ei liittyviä käyttäjätilejä" deactivated: "Käyttäjätili poistettiin käytöstä osoitteesta '%{email}' palautettujen sähköpostien vuoksi." deactivated_by_staff: "Henkilökunta poisti käytöstä" activated_by_staff: "Henkilökunta vahvisti" @@ -1492,11 +1719,11 @@ fi: same_ip_address: "Sama IP-osoite (%{ip_address}) kuin muilla käyttäjillä" flags_reminder: flags_were_submitted: - one: Viestejä liputettiin yli tunti sitten. [Tarkastele niitä](/admin/flags). - other: Viestejä liputettiin yli %{count} tuntia sitten. [Tarkastele niitä](/admin/flags). + one: "Viestejä liputettiin yli tunti sitten. [Tarkastele niitä](/admin/flags)." + other: "Viestejä liputettiin yli %{count} tuntia sitten. [Tarkastele niitä](/admin/flags)." subject_template: - one: Yksi liputus odottaa käsittelyä - other: '%{count} liputusta odottaa käsittelyä' + one: "Yksi liputus odottaa käsittelyä" + other: "%{count} liputusta odottaa käsittelyä" unsubscribe_mailer: title: "Peru sähköpostimuistukset" subject_template: "Vahvista, ettet enää halua, että %{site_title} lähettää sinulle sähköpostimuistutuksia." @@ -1650,8 +1877,8 @@ fi: deferred: "Kiitos kun toit asian tietoomme. Selvitämme asiaa." deferred_and_deleted: "Kiitos kun toit asian tietoomme. Poistimme kyseisen viestin." temporarily_closed_due_to_flags: - one: Ketju on suljettu väliaikaisesti 1 tunnin ajan suuren lippumäärän vuoksi. - other: Ketju on suljettu väliaikaisesti %{count} tunnin ajan suuren lippumäärän vuoksi. + one: "Ketju on suljettu väliaikaisesti 1 tunnin ajan suuren lippumäärän vuoksi." + other: "Ketju on suljettu väliaikaisesti %{count} tunnin ajan suuren lippumäärän vuoksi." system_messages: private_topic_title: "Ketju #%{id}" contents_hidden: "Käy lukemassa viesti, jotta näet sen sisällön." @@ -1672,11 +1899,6 @@ fi: Jos viesti kuitenkin piilotetaan toisen kerran, se pysyy piilotettuna, kunnes henkilökunta selvittää tilanteen. Saadaksesi lisätietoja, lue [yhteisön säännöt](%{base_url}/guidelines). - usage_tips: - text_body_template: | - [Tässä blogikirjoituksessa](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/) on joitakin käteviä vinkkejä uudelle käyttäjälle. - - Sitä mukaa kun toimit täällä, opimme tuntemaan sinut ja väliaikaisia uuden käyttäjän rajoitteita poistetaan automaattisesti. Ajan myötä nouset ylemmille [luottamustasoille](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) ja saat valtuuksia, joiden avulla voit osallistua yhteisömme ylläpitoon. welcome_user: title: "Tervetuloa käyttäjä" subject_template: "Tervetuloa sivustolle %{site_name}!" @@ -1946,14 +2168,6 @@ fi: too_many_spam_flags: title: "Liian monta roskapostiliputusta" subject_template: "Uusi tili on estetty" - text_body_template: | - Hei, - - Lähetämme tämän automaattisen viestin sivustolta %{site_name} kertoaksemme, että viestejäsi on väliakaisesti piilotettu yhteisön liputusten perusteella. - - Varotoimena uusi käyttäjätilisi on hiljennetty etkä voi vastata etkä aloittaa uusia ketjuja ennen kuin henkilökunnan jäsen arvioi tilanteen. Pahoittelemme tästä aiheutuvaa vaivaa. - - Saat lisätietoa [yhteisön ohjeista](%{base_url}/guidelines). too_many_tl3_flags: title: "Liian monta lt3-lippua" subject_template: "Uusi tili on estetty" @@ -2010,8 +2224,8 @@ fi: pending_users_reminder: title: "Käyttäjiä jonossa" subject_template: - one: 1 käyttäjä odottaa hyväksymistä - other: '%{count} käyttäjää odottaa hyväksymistä' + one: "1 käyttäjä odottaa hyväksymistä" + other: "%{count} käyttäjää odottaa hyväksymistä" text_body_template: | Uusia käyttäjiä odottaa hyväksymistä (tai hylkäämistä) ja pääsyä palstalle. @@ -2039,8 +2253,8 @@ fi: queued_posts_reminder: title: "Muistutukset jonossa olevista viesteistä" subject_template: - one: Yksi viesti odottaa tarkastusta - other: '%{count} viestiä odottaa tarkastusta' + one: "Yksi viesti odottaa tarkastusta" + other: "%{count} viestiä odottaa tarkastusta" text_body_template: | Hei @@ -2058,17 +2272,15 @@ fi: user_notifications: previous_discussion: "Edelliset vastaukset" reached_limit: - one: Huom. Olemme lähettäneet jo yhden sähköpostin tänään, mikä on enimmäismäärä. Käy sivustolla, jottet jää mistään paitsi. PS. Kiitos kun olet niin suosittu! - other: Huom. Olemme lähettäneet jo %{count} sähköpostia tänään, mikä on enimmäismäärä. Käy sivustolla, jottet jää mistään paitsi. PS. Kiitos kun olet niin suosittu! + one: "Huom. Olemme lähettäneet jo yhden sähköpostin tänään, mikä on enimmäismäärä. Käy sivustolla, jottet jää mistään paitsi. PS. Kiitos kun olet niin suosittu!" + other: "Huom. Olemme lähettäneet jo %{count} sähköpostia tänään, mikä on enimmäismäärä. Käy sivustolla, jottet jää mistään paitsi. PS. Kiitos kun olet niin suosittu!" in_reply_to: "Vastauksena" unsubscribe: title: "Peru tilaus" description: "Etkö halua vastaanottaa näitä sähköposteja? Ei hätää! Klikkaa alta peruaksesi tilauksen välittömästi:" reply_by_email: "Vastaa [vierailemalla ketjussa](%{base_url}%{url}) tai vastaamalla tähän sähköpostiin." - reply_by_email_pm: "Vastaa [vierailemalla ketjussa](%{base_url}%{url}) tai vastaamalla tähän sähköpostiin." only_reply_by_email: "Vastaa vastaamalla tähän sähköpostiin." visit_link_to_respond: "[Vieraile ketjussa](%{base_url}%{url}) vastataksesi." - visit_link_to_respond_pm: "[Vieraile ketjussa](%{base_url}%{url}) vastataksesi." posted_by: "Käyttäjältä %{username} %{post_date}" invited_group_to_private_message_body: | %{username} kutsui ryhmän @%{group_name} yksityiskeskusteluun @@ -2373,7 +2585,6 @@ fi: recent_topics: "Tuoreimpia" see_more: "Lisää" search_title: "Etsi tältä sivustolta" - search_google: "Google" offline: title: "Sovellusta ei voida ladata" offline_page_message: "Yhteydessäsi vaikuttaa olevan vikaa! Tarkista verkkoyhteytesi ja yritä uudelleen." @@ -2407,32 +2618,11 @@ fi: flag_reason: sockpuppet: "Uusi käyttäjä aloitti ketjun, johon toinen uusi käyttäjä samasta IP-osoitteesta (%{ip_address}) vastasi. Katso asetus `flag_sockpuppets`." spam_hosts: "Tämä uusi käyttäjä yritti luoda useita viestejä, jotka sisälsivät linkkejä samaan verkkotunnukseen (%{domain}). Katso asetus `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "Viestin käyttäjä on poistettu" - no_user: "Käyttäjää id:llä %{user_id} ei löydy" - anonymous_user: "Käyttäjä on anonyymi" - suspended_not_pm: "Käyttäjä on hyllytetty, ei viesti" - seen_recently: "Käyttäjä nähtiin äskettäin" - post_not_found: "Viestiä id:llä %{post_id} ei löydy" - notification_already_read: "Ilmoitus, jota tämä sähköposti koskee, on jo luettu" - topic_nil: "post.topic on olematon" - post_deleted: "kirjoittaja poisti viestin" - user_suspended: "käyttäjä hyllytettiin" - already_read: "käyttäjä on jo lukenut tämän viestin" - exceeded_emails_limit: "Ylitti max_emails_per_day_per_user" - exceeded_bounces_limit: "Ylitti bounce_score_threshold" - message_blank: "viesti on tyhjä" - message_to_blank: "message.to on tyhjä" - text_part_body_blank: "text_part.body on tyhjä" - body_blank: "body on tyhjä" - no_echo_mailing_list_mode: "Postitustilassa ei sähköposti-ilmoituksia käyttäjän omista viesteistä" color_schemes: base_theme_name: "Pohja" - default: "Vaalea värimalli" dark: "Tumma värimalli" - default_theme_name: "Oletus" - dark_theme_name: "Tumma" light_theme_name: "Vaalea" + dark_theme_name: "Tumma" about: "Tietoja" guidelines: "Ohjeet" privacy: "Tietosuoja" @@ -2632,74 +2822,41 @@ fi: editor: name: Muokkaaja description: Ensimmäinen viestin muokkaus - long_description: | - Tämä ansiomerkki myönnetään, kun ensimmäistä kertaa muokkaat viestiäsi. Viestiä ei voi muokata kuin määrätyn ajan viestin lähettämisen jälkeen, mutta sinä aikana muokkaaminen on aina hyvä ajatus. Voit parannella viestiä, korjata pieniä virheitä tai lisätä jotakin, mikä pääsi unohtumaan viestin kirjoittamisen hetkellä. Muokkaa viesteistäsi entistäkin parempia! basic_user: name: Haastaja - description: "Myönnetty kaikki palstan välttämättömimmät toiminnot" - long_description: | - Tämä ansiomerkki myönnetään, kun nouset luottamustasolle 1. Kiitos siitä, että olet päättänyt antaa palstalle mahdollisuuden ja lukenut muutamaa ketjua ottaaksesi selvää, mistä yhteisössä on kyse. Uuden käyttäjän rajoituksia on nyt poistettu; sait käyttöösi välttämättömimmät palstan toiminnot kuten yksityisviestit, liputtamisen, wiki-viestien muokkaamisen ja oikeuden laittaa viestiin useampia kuvia ja linkkejä. member: name: Konkari - description: "Myönnetty kutsut, ryhmäviestit ja lisää tykkäyksiä" - long_description: | - Tämä ansiomerkki myönnetään, kun nouset luottamustasolle 2. Kiitos siitä, että olet ollut keskuudessamme viikkojen ajan ja tullut osaksi yhteisöä. Voit nyt lähettää kutsuja käyttäjäsivultasi ja ketjuista, aloittaa ryhmäviestejä ja käytössäsi on muutama tykkäys enemmän päivää kohden. regular: name: Mestari - description: "Myönnetty ketjujen siirto toiselle alueelle ja uudelleen nimeäminen, hakukoneiden seuraamat linkit, wiki-viestit ja lisää tykkäyksiä" - long_description: | - Tämä ansiomerkki myönnetään, kun nouset luottamustasolle 3. Kiitos kun olet ollut tärkeä osa yhteisöä kuukausien ajan. Olet yksi innokkaimmista lukijoista ja luotettava sisällön tuottaja, ja olet tekemässä yhteisöstä niin hienoa kuin se on. Voit nyt siirtää alueelta toiselle ja uudelleennimetä ketjuja, roskapostiliputuksesi ovat tehokkaampia, pääset lounge-alueelle ja käytössäsi on selvästi enemmän tykkäyksiä päivää kohden. leader: name: Johtaja - description: "Myönnetty minkä tahansa viestin muokkaaminen, kiinnittäminen, sulkeminen, arkistoiminen, pilkkominen ja yhdistäminen ja lisää tykkäyksiä" - long_description: | - Tämä ansiomerkki myönnetään, kun nouset luottamustasolle 4. Palstan henkilökunta on valinnut sinut johtajaksi. Näytät muille positiivista esimerkkiä sanoin ja teoin. Voit nyt muokata mitä tahansa viestiä ja käytössäsi on yleiset valvojatyökalut, joilla voit hallita ketjuja kuten kiinnittäminen, sulkeminen, listauksista poistaminen, arkistoiminen, pilkkominen ja yhdistäminen, ja käytössäsi on paljon enemmän tykkäyksiä päivää kohden. welcome: name: Tervetuloa description: Sai tykkäyksen - long_description: | - Tämä ansiomerkki myönnetään, kun viestistäsi tykätään ensi kertaa. Onnittelut, olet tuottanut jotakin, mitä toinen käyttäjä on pitänyt mielenkiintoisena, hauskana tai hyödyllisenä! autobiographer: name: Omaelämäkerta description: "Täytti käyttäjätiedot" - long_description: | - Tämä ansiomerkki myönnetään, kun täytät käyttäjätiedot ja valitset profiilikuvan. Kertomalla hieman itsestäsi ja kiinnostuksen kohteistasi edistät yhteisöllisyyttä. Liity meihin! anniversary: name: Vuosipäivä description: "Aktiivinen jäsen vuoden ajan, kirjoittanut ainakin yhden viestin" - long_description: | - Tämä ansiomerkki myönnetään aina, kun olet jäsenenä vuoden ajan ja kirjoitat sinä aikana ainakin yhden viestin. Kiitos, kun olet yhä keskuudessamme ja antanut panoksesi yhteisön hyväksi. Emme pärjäisi ilman sinua. nice_post: name: Hyvä vastaus description: Vastaus sai 10 tykkäystä - long_description: | - Tämä ansiomerkki myönnetään, kun vastauksesi saa 10 tykkäykstä. Teit sillä todellisen vaikutuksen yhteisöön ja edistit keskustelua! good_post: name: Erinomainen vastaus description: Vastaus sai 25 tykkäystä - long_description: | - Tämä ansiomerkki myönnetään, kun vastauksesi saa 25 tykkäystä. Vastauksesi oli poikkeuksellinen ja teki keskustelusta todella paljon paremman! great_post: name: Loistava vastaus description: Vastaus sai 50 tykkäystä - long_description: | - Tämä ansiomerkki myönnetään, kun vastauksesi saa 50 tykkäystä. Vau! Vastauksesi oli innoittava, hulvaton tai oivaltava, ja yhteisö rakasti sitä. nice_topic: name: Hyvä ketju description: Ketjunavaus sai 10 tykkäystä - long_description: | - Tämä ansiomerkki myönnetään, kun ketjunaloituksesi saa 10 tykkäystä. Aloitit kiintoisan keskustelun, josta yhteisö nautti! good_topic: name: Erinomainen ketju description: Ketjunavaus sai 25 tykkäystä - long_description: | - Tämä ansiomerkki myönnetään, kun ketjunaloituksesi saa 25 tykkäystä. Aloitit vilkkaan keskustelun, jota yhteisö rakasti! great_topic: name: Loistava ketju description: Ketjunavaus sai 50 tykkäystä - long_description: |+ - Tämä ansiomerkki myönnetään, kun ketjunaloituksesi saa 50 tykkäystä. Aloitit kiehtovan keskustelun, jossa vaihdetuista ajatuksista yhteisö nautti! - nice_share: name: Hyvä jako description: "Jakoi viestin, ja linkin kautta saapui 25 vierailijaa" @@ -2709,13 +2866,9 @@ fi: good_share: name: Erinomainen jako description: "Jakoi viestin, ja linkin kautta saapui 300 vierailijaa" - long_description: | - Tämä ansiomerkki myönnetään, kun jaat linkin, jota klikkaa 300 ulkopuolista vierailijaa. Hyvää työtä! Olet esitellyt upean keskustelun joukolle uusia ihmisiä ja siten auttanut yhteisöä kasvamaan. great_share: name: Loistava jako description: "Jakoi viestin, ja linkin kautta saapui 1000 vierailijaa" - long_description: | - Tämä ansiomerkki myönnetään, kun jaat linkin, jota klikkaa 1000 ulkopuolista vierailijaa. Vau! Olet mainostanut kiinnostavaa keskustelua valtavalle joukolle uusia ihmisiä ja siten auttanut yhteisöä kasvamaan merkittävästi. first_like: name: Ensimmäinen tykkäys description: Tykkäsi viestistä @@ -2724,21 +2877,15 @@ fi: first_flag: name: Ensimmäinen liputus description: Liputti viestin - long_description: | - Tämä ansiomerkki myönnetään, kun ensi kertaa liputat viestin. Liputtaminen on keino, jolla yhdessä pidämme palstan siistinä ja selkeänä. Jos huomaat viestin joka valvojien tulisi huomioida syystä tai toisesta, älä epäröi liputtaa. Liputuskuvakkeen kautta voit myös lähettää yksityisviestin kirjoittajalle, jos näet viestissä jotakin huomautettavaa. Kun näet ongelman, :flag_black: liputa! promoter: name: Markkinoija description: Kutsui käyttäjän campaigner: name: Kampanjoija description: Kutsui kolme haastajaa (luottamustaso 1) - long_description: | - Tämä ansiomerkki myönnetään, kun 3 kutsumaasi ihmistä viettää sen verran aikaa palstalla, että heidän luottamustasonsa nousee ja heistä tulee "haastajia". Elinvoimainen yhteisö tarvitsee säännöllisesti uusia jäseniä tuomaan tuoreita näkökulmia keskusteluihin. champion: name: Kampanjapäällikkö description: Kutsui viisi konkaria (luottamustaso 2) - long_description: | - Tämä ansiomerkki myönnetään, kun 5 kutsumaasi ihmistä viettää sen verran aikaa palstalla, että heistä tulee yhteisön täysivaltaisia jäseniä. Vau! Kiitos, kun edistät yhteisömme monimuotoisuutta tuomalla uusia jäseniä! first_share: name: Ensimmäinen jako description: Jakoi viestin @@ -2752,13 +2899,9 @@ fi: first_quote: name: Ensimmäinen lainaus description: Lainasi viestiä - long_description: | - Tämä ansiomerkki myönnetään, kun ensi kerran lainaat viestiä vastauksessasi. Edellisten viestien olennaisten osien lainaaminen auttaa pitämään keskustelun yhtenäisenä ja aiheen mukaisena. Helpoin tapa on maalata viestin osa ja sitten painaa vastaa-painiketta. Lainaa runsaasti! read_guidelines: name: Luki ohjeet description: "Luki yhteisön säännöt" - long_description: | - Tämä ansiomerkki myönnetään, kun luet yhteisön säännöt. Noudattamalla ja jakamalla näitä yksinkertaisia ohjeita edistät yhteisön turvallisuutta, viihtyisyyttä ja jatkuvuutta. Muista aina, että toisessa päässä on toinen ihminen, hyvin itsesi kaltainen. Ole kohtelias! reader: name: Lukutoukka description: "Luki jokaisen viestin ketjusta, jossa on enemmän kuin 100 vastausta" @@ -2807,8 +2950,6 @@ fi: crazy_in_love: name: Korviaan myöten rakastunut description: Käytti 50 päivittäistä tykkäystä 20 päivänä - long_description: | - Tämä ansiomerkki myönnetään, kun olet käyttänyt kaikki 50 päivittäistä tykkäystäsi 20 päivänä. Wow! Olet esimerkillinen kannustaessasi jatkuvasti muita käyttäjiä! thank_you: name: Kiitos description: 20 viestistä on tykätty ja on tykännyt 10 viestistä @@ -2822,19 +2963,15 @@ fi: empathetic: name: Empaattinen description: 500 viestistä on tykätty ja on tykännyt 1000 viestistä - long_description: | - Tämä ansiomerkki myönnetään, kun sinulla on 500 tykättyä viestiä ja olet antanut vähintään 1000 tykkäystä takaisin. Wow! Olet esimerkki avokätisyydestä ja keskinäisestä arvostuksesta :two_hearts:. first_emoji: name: Ensimmäinen Emoji description: Käytti Emojia viestissä first_mention: name: Ensimmäinen maininta description: Mainitsi käyttäjän viestissä - long_description: "Tämä ansiomerkki myönnetään, kun ensimmäistä kertaa mainitset jonkun @käyttäjänimen viestissäsi. Tämä käyttäjä saa ilmoituksen viestistäsi. Aloita vain kirjoittamaan @ (at-merkki) mainitaksesi käyttäjän tai, jos sallittua, ryhmän – se on helppo tapa tuoda jotain toisten huomioon." first_onebox: name: Ensimmäinen Onebox description: "Lähetti linkin, josta tehtiin onebox" - long_description: "Tämä ansiomerkki myönnetään, kun ensimmäistä kertaa lisäät linkin omalle rivilleen, josta sitten automaattisesti tehdään onebox esikatselu otsikolla, lyhyellä kuvauksella ja (jos saatavilla) kuvalla." first_reply_by_email: name: Ensimmäinen vastaus sähköpostilla description: Vastasi sähköpostilla @@ -2848,15 +2985,12 @@ fi: enthusiast: name: Intoilija description: Vieraili 10 päivänä - long_description: "Tämä ansiomerkki myönnetään, kun olet vieraillut 10 peräkkäisenä päivänä. Kiitos kun olet ollut kanssamme yli viikon ajan!" aficionado: name: Hullaantunut description: Vieraili 100 päivänä - long_description: "Tämä ansiomerkki myönnetään, kun olet vieraillut 100 peräkkäisenä päivänä. Sehän on yli kolme kuukautta!" devotee: name: Omistautunut description: Vieraili 365 päivänä - long_description: "Tämä ansiomerkki myönnetään, kun olet vieraillut 365 peräkkäisenä päivänä. Vau, kokonainen vuosi!" badge_title_metadata: "%{display_name} -ansiomerkki sivustolla %{site_title}" admin_login: success: "Sähköposti lähetetty" @@ -2876,7 +3010,6 @@ fi: button: "Rekisteröidy" title: "Rekisteröi ylläpitäjätunnus" help: "aloita rekisteröimällä uusi tunnus" - no_emails: "Valitettavasti ylläpitäjän sähköpostiosoitetta ei määritetty asennuksen aikana, joten asennuksen viimeistely voi olla vaikeaa." confirm_email: title: "Vahvista sähköpostisi" message: "

Lähetimme vahvistusviestin osoitteeseen %{email}. Ota tili käyttöön seuraamalla viestin ohjeita.

Jos viesti ei saavu, varmista että näppäilit sähköpostin oikein Discourseen ja tarkista roskapostikansiosi.

" @@ -2979,10 +3112,8 @@ fi: fields: favicon_url: label: "Pieni ikoni" - description: "Ikoni, joka edustaa sivustoasi selaimissa ja joka näyttää hyvältä pienessäkin koossa kuten 32 px kertaa 32 px." apple_touch_icon_url: label: "Suuri ikoni" - description: "Ikoni, joka edustaa sivustoasi nykyaikaisemmilla laitteilla ja joka näyttää hyvältä isommassakin koossa. Suositeltu koko on vähintään 144 px kertaa 144 px." homepage: description: "Suosittelemme, että kotisivusi on Tuoreimmat-näkymä, mutta voit valita Keskustelualueet-näkymän (ketjut ryhmitelty aihepiirin mukaan) kotisivuksi, jos haluat." title: "Kotisivu" @@ -2991,8 +3122,6 @@ fi: choices: latest: label: "Tuoreimmat ketjut" - categories: - label: "Keskustelualueet" emoji: title: "Emojit" description: "Minkä emojityylin haluat yhteisöösi? Voit milloin vain lisätä mukautettuja emojeita navigoimalla Ylläpito --> Mukauta --> Emoji." diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index eaac77ae3e..4b6ec75c58 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -39,6 +39,11 @@ fr: bad_color_scheme: "Impossible de mettre à jour le thème, la palette de couleur est invalide" other_error: "Il y a eu un problème pendant la mise à jour du thème" error_importing: "Erreur de clonage du dépôt git, l'accès est refusé ou le dépôt n'est pas trouvé." + errors: + component_no_user_selectable: "Les composants du thème ne peuvent pas être sélectionnés par les utilisateurs" + component_no_default: "Les composants du thème ne peuvent pas être un thème par défaut" + component_no_color_scheme: "Les composants de thème ne peuvent pas avoir de palette de couleur" + no_multilevels_components: "Les thèmes incluant d'autres thèmes ne peuvent pas être inclus eux-mêmes" settings_errors: invalid_yaml: "Le YAML est invalide" data_type_not_a_number: "Le type du paramètre `%{name}` n'est pas supporté. Les types supportés sont `integer`, `bool`, `list` et `enum`" @@ -68,6 +73,7 @@ fr: auto_generated_email_error: "Se produit quand l'entête « precedence » est : list, junk, bulk ou auto-reply, ou lorsque n'importe quel autre entête contient : auto-submitted, auto-replied ou auto-generated." no_body_detected_error: "Se produit quand il est impossible d'extraire le corps du message et qu'il n'y a pas de pièces-jointes." no_sender_detected_error: "Se produit lorsque nous n'avons pas trouvé une adresse courriel valide dans l'entête From." + from_reply_by_address_error: "Survient quand l'entête 'From' correspond à l'adresse courriel 'Reply by'." inactive_user_error: "Se produit quand l'expéditeur n'est pas actif." silenced_user_error: "Se produit lorsque l'expéditeur a été mis sous silence." bad_destination_address: "Se produit quand aucune des adresses de courriel des champs To/Cc/Bcc ne correspondent à une adresse de courriel entrante configurée." @@ -133,8 +139,8 @@ fr: load_from_remote: "Il y a eu une erreur lors du chargement de ce message." site_settings: invalid_choice: - one: Vous avez spécifié le choix invalide %{name} - other: Vous avez spécifié les choix invalides %{name} + one: 'Vous avez spécifié le choix invalide %{name}' + other: 'Vous avez spécifié les choix invalides %{name}' min_username_length_exists: "Il n'est pas possible de définir une longeur minimale de pseudo qui soit plus court qu'un pseudo qui existe déjà." min_username_length_range: "Il n'est pas possible de définir un minimum plus grand qu'un maximum." max_username_length_exists: "Il n'est pas possible de définir une longeur maximale de pseudo qui soit plus court qu'un pseudo qui existe déjà." @@ -168,13 +174,16 @@ fr: not_logged_in: "Vous devez être connecté pour faire cela." not_found: "L'URL ou ressource demandée n'a pas été retrouvé." invalid_access: "Vous n'avez pas la permission de voir cette ressource." + authenticator_not_found: "La méthode d'authentification n'existe pas ou a été désactivée." invalid_api_credentials: "Vous n'êtes pas autorisés à voir cette ressource. Le nom d’utilisateur ou la clé API n'est pas valide." + provider_not_enabled: "Vous n'êtes pas autorisés à voir cette ressources. Le fournisseur d'authentification n'est pas activé." + provider_not_found: "Vous n'êtes pas autorisés à voir cette ressources. Le fournisseur d'authentification n'existe pas." read_only_mode_enabled: "Le site est en mode lecture seule. Les interactions sont désactivées." reading_time: "Temps de lecture" likes: "J'aime" too_many_replies: - one: Nous sommes désolés, mais les nouveaux utilisateurs sont temporairement limités à 1 réponse par sujet. - other: Nous sommes désolés, mais les nouveaux utilisateurs sont temporairement limités à %{count} réponses par sujet. + one: "Nous sommes désolés, mais les nouveaux utilisateurs sont temporairement limités à 1 réponse par sujet." + other: "Nous sommes désolés, mais les nouveaux utilisateurs sont temporairement limités à %{count} réponses par sujet." embed: start_discussion: "Démarrer la discussion" continue: "Continuer la discussion" @@ -184,43 +193,44 @@ fr: no_hosts: "Aucun hôte n'a été configuré pour l'intégration." configure: "Configurer l'intégration" more_replies: - one: 1 réponse supplémentaire - other: '%{count} réponses supplémentaires' + one: "1 réponse supplémentaire" + other: "%{count} réponses supplémentaires" loading: "Chargement de la discussion…" permalink: "Lien permanent" imported_from: "Il s'agit d'un sujet en provenance de l'article %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 réponse - other: '%{count} réponses' + one: "1 réponse" + other: "%{count} réponses" no_mentions_allowed: "Désolé, vous ne pouvez pas mentionner d'autres utilisateurs." too_many_mentions: - one: Désolé, vous ne pouvez mentionner qu'un utilisateur dans un message. - other: Désolé, vous ne pouvez mentionner que %{count} utilisateurs dans un message. + one: "Désolé, vous ne pouvez mentionner qu'un utilisateur dans un message." + other: "Désolé, vous ne pouvez mentionner que %{count} utilisateurs dans un message." no_mentions_allowed_newuser: "Désolé, les nouveaux utilisateurs ne peuvent pas mentionner d'autres utilisateurs." too_many_mentions_newuser: - one: Désolé, les nouveaux utilisateurs ne peuvent mentionner qu'un utilisateur dans un message. - other: Désolé, les nouveaux utilisateurs ne peuvent mentionner que %{count} utilisateurs dans un message. + one: "Désolé, les nouveaux utilisateurs ne peuvent mentionner qu'un utilisateur dans un message." + other: "Désolé, les nouveaux utilisateurs ne peuvent mentionner que %{count} utilisateurs dans un message." no_images_allowed_trust: "Désolé, il ne vous est pas possible d'inclure des images dans un message" no_images_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas ajouter d'image dans les messages." too_many_images: - one: Désolé, les nouveaux utilisateurs ne peuvent ajouter qu'une image dans un message. - other: Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} images dans un message. + one: "Désolé, les nouveaux utilisateurs ne peuvent ajouter qu'une image dans un message." + other: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} images dans un message." no_attachments_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas ajouter de fichiers dans leurs messages." too_many_attachments: - one: Désolé, les nouveaux utilisateurs ne peuvent ajouter qu'un fichier dans leurs messages. - other: Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} fichiers dans leurs messages. + one: "Désolé, les nouveaux utilisateurs ne peuvent ajouter qu'un fichier dans leurs messages." + other: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} fichiers dans leurs messages." no_links_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas insérer de liens dans leurs messages." links_require_trust: "Désolé, il ne vous est pas possible d'inclure des liens dans vos messages." too_many_links: - one: Désolé, les nouveaux utilisateurs ne peuvent insérer qu'un seul lien par message. - other: Désolé, les nouveaux utilisateurs ne peuvent insérer que %{count} liens par message. + one: "Désolé, les nouveaux utilisateurs ne peuvent insérer qu'un seul lien par message." + other: "Désolé, les nouveaux utilisateurs ne peuvent insérer que %{count} liens par message." contains_blocked_words: "Votre message contient un mot qui n'est pas permis : %{word}" spamming_host: "Désolé, vous ne pouvez pas insérer de lien vers ce domaine." user_is_suspended: "Les utilisateurs suspendus ne sont pas autorisés à poster de messages." topic_not_found: "Une erreur est survenue. Peut-être que ce sujet a été fermé ou supprimé pendant que vous le regardiez ?" not_accepting_pms: "Désolé, %{username} n'accepte pas de messages pour le moment." max_pm_recepients: "Désolé, vous pouvez envoyer un message à un maximum de %{recipients_limit} destinataires." + pm_reached_recipients_limit: "Désolé, vous ne pouvez pas avoir plus de %{recipients_limit} destinataires dans un message." just_posted_that: "est trop similaire à ce que vous avez récemment posté" invalid_characters: "contient des caractères invalides" is_invalid: "ne semble pas clair, est-ce une phrase complète ?" @@ -263,14 +273,14 @@ fr: groups: success: bulk_add: - one: '%{count}utilisateur a été ajouté au groupe.' - other: '%{count}utilisateurs ont été ajoutés au groupe.' + one: "%{count}utilisateur a été ajouté au groupe." + other: "%{count}utilisateurs ont été ajoutés au groupe." errors: grant_trust_level_not_valid: "'%{trust_level}' n'est pas un niveau de confiance valide." can_not_modify_automatic: "Vous ne pouvez pas modifier un groupe automatique" member_already_exist: - one: '''%{username}'' est déjà membre de ce groupe.' - other: 'Les utilisateurs suivants sont déjà membres de ce groupe: %{username}' + one: "'%{username}' est déjà membre de ce groupe." + other: "Les utilisateurs suivants sont déjà membres de ce groupe: %{username}" invalid_domain: "'%{domain}' n'est pas un domaine valide." invalid_incoming_email: "« %{email} » n'est pas une adresse de courriel valide." email_already_used_in_group: "« %{email} » est déjà utilisé par le groupe « %{group_name} »." @@ -290,8 +300,8 @@ fr: title: "Demande d'adhésion pour @%{group_name}" education: until_posts: - one: 1 message - other: '%{count} messages' + one: "1 message" + other: "%{count} messages" 'new-topic': | Bienvenue sur %{site_name} — **merci de débuter une nouvelle conversation !** @@ -452,25 +462,25 @@ fr: title: "Bienvenue dans le salon" body: |2 - Félicitation ! :confetti_ball: + Félicitations ! :confetti_ball: - Si vous voyez ce sujet, c'est que vous avez récemment été promu au niveau de confiance **habitué** (niveau de confiance 3). + Si vous voyez ce sujet, vous avez été promu **habitué** (niveau de confiance 3). - Vous pouvez désormais … + Dorénavant vous pouvez … - * Modifier le titre de tous les sujets - * Modifier la catégorie de tous les sujets - * Avoir vos liens suivis ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) est retiré) - * Accès à un salon privé visible uniquement pour les membres de niveau de confiance 3 ou plus. - * Masquer un message indésirable avec seulement un drapeau. + * Modifier le titre de n'importe quel sujet + * Modifier la catégorie de n'importe quel sujet + * Avoir des liens qui sont suivis ([automatic nofollow](http://fr.wikipedia.org/wiki/Nofollow) est ôté) + * Accéder à la catégorie privée Salon qui est réservée aux utilisateurs de niveau de confiance 3 et plus + * Cacher du spam avec un seul signalement - Voici la [liste courante des membres habitués](/badges/3/regular). N'hésitez pas à venir dire bonjour ! + Voilà la [liste des habitués actuels](/badges/3/regular). N'hésitez pas à dire bonjour. - Merci d'être une part importante de cette communauté ! + Merci pour votre contribution à notre communauté ! - (Pour plus d'information sur les niveaux de confiance [voir ce sujet][trust]. Veuillez noter que seuls les membres qui continuerons de respecter les critères garderons ce niveau de confiance.) + (Pour plus d'informations sur les niveaux de confiance, [voir ce sujet][trust]. Notez que seul les utilisateurs qui continuent de remplir les conditions gardent leur statut d'habitués.) - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: topic_prefix: "À propos de la catégorie %{category}" replace_paragraph: "(Remplacez ce premier paragraphe par une brève description de votre nouvelle catégorie. Ce guide apparaîtra dans la zone de sélection de la catégorie, alors essayez de rester en dessous de 200 caractères. **Cette catégorie n'apparaîtra pas sur la page des catégories jusqu'à ce que vous ayez modifié cette description ou créé des sujets.**" @@ -488,8 +498,8 @@ fr: uncategorized: "Vous ne pouvez pas supprimer Sans Catégorie" has_subcategories: "Vous ne pouvez pas supprimer cette catégorie car elle a des sous-catégories." topic_exists: - one: Vous ne pouvez pas supprimer cette catégorie car elle contient 1 sujet. Le plus vieux sujet est %{topic_link}. - other: Vous ne pouvez pas supprimer cette catégorie car elle contient %{count} sujets. Le plus vieux sujet est %{topic_link}. + one: "Vous ne pouvez pas supprimer cette catégorie car elle contient 1 sujet. Le plus vieux sujet est %{topic_link}." + other: "Vous ne pouvez pas supprimer cette catégorie car elle contient %{count} sujets. Le plus vieux sujet est %{topic_link}." topic_exists_no_oldest: "Vous ne pouvez pas supprimer cette catégorie car le nombre de sujet est de %{count}." uncategorized_description: "Sujets qui n'ont pas besoin d'une catégorie ou qui ne correspondent à aucune catégorie existante." trust_levels: @@ -526,85 +536,86 @@ fr: unsubscribe_via_email: "Vous avez atteint le nombre maximum de désinscriptions par courriel. Merci de patienter %{time_left} avant d'essayer à nouveau." topic_invitations_per_day: "Vous avez atteint le nombre maximum d'invitations dans un sujet. Merci de patienter %{time_left} avant d'essayer à nouveau." hours: - one: 1 heure - other: '%{count} heures' + one: "1 heure" + other: "%{count} heures" minutes: - one: 1 minute - other: '%{count} minutes' + one: "1 minute" + other: "%{count} minutes" seconds: - one: 1 seconde - other: '%{count} secondes' + one: "1 seconde" + other: "%{count} secondes" + short_time: "quelques secondes" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" x_minutes: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1j - other: '%{count}j' + one: "1j" + other: "%{count}j" about_x_months: - one: '1 mois ' - other: '%{count} mois' + one: "1 mois " + other: "%{count} mois" x_months: - one: 1 mois - other: '%{count} mois' + one: "1 mois" + other: "%{count} mois" about_x_years: - one: 1 an - other: '%{count} ans' + one: "1 an" + other: "%{count} ans" over_x_years: - one: '> 1 an' - other: '> %{count} ans' + one: "> 1 an" + other: "> %{count} ans" almost_x_years: - one: 1 an - other: '%{count} ans' + one: "1 an" + other: "%{count} ans" distance_in_words_verbose: half_a_minute: "à l'instant" less_than_x_seconds: - one: à l'instant - other: à l'instant + one: "à l'instant" + other: "à l'instant" x_seconds: - one: il y a une seconde - other: il y a %{count} secondes + one: "il y a une seconde" + other: "il y a %{count} secondes" less_than_x_minutes: - one: il y a moins d'une minute - other: il y a moins de %{count} minutes + one: "il y a moins d'une minute" + other: "il y a moins de %{count} minutes" x_minutes: - one: il y a 1 minute - other: il y a %{count} minutes + one: "il y a 1 minute" + other: "il y a %{count} minutes" about_x_hours: - one: il y a 1 heure - other: il y a %{count} heures + one: "il y a 1 heure" + other: "il y a %{count} heures" x_days: - one: il y a un jour - other: il y a %{count} jours + one: "il y a un jour" + other: "il y a %{count} jours" about_x_months: - one: il y a environ un mois - other: il y a environ %{count} mois + one: "il y a environ un mois" + other: "il y a environ %{count} mois" x_months: - one: il y a un mois - other: il y a %{count} mois + one: "il y a un mois" + other: "il y a %{count} mois" about_x_years: - one: il y a environ un an - other: il y a environ %{count} ans + one: "il y a environ un an" + other: "il y a environ %{count} ans" over_x_years: - one: il y a plus d'un an - other: il y a plus de %{count} ans + one: "il y a plus d'un an" + other: "il y a plus de %{count} ans" almost_x_years: - one: il y a presque un an - other: il y a presque %{count} ans + one: "il y a presque un an" + other: "il y a presque %{count} ans" password_reset: no_token: "Désolé, le lien pour le changement de mot de passe est trop ancien. Cliquez sur Connexion puis redemandez un mot de passe afin d'obtenir un nouveau lien. " choose_new: "Choisir un nouveau mot de passe" @@ -617,6 +628,17 @@ fr: email_login: invalid_token: "Désolé, ce lien de connexion courriel est trop vieux. Séléctionner le bouton 'Se connecter' et utiliser 'Mot de passe oublié' pour obtenir un nouveau lien." title: "Connexion courriel" + user_auth_tokens: + devices: + android: 'Appareil Android' + linux: 'Ordinateur Linux' + windows: 'Ordinateur Windows' + mac: 'Mac' + iphone: 'iPhone' + ipad: 'iPad' + ipod: 'iPod' + mobile: 'Appareil portable' + unknown: 'Appareil inconnu' change_email: confirmed: "Votre adresse de courriel a été mise à jour." please_continue: "Continuer vers %{site_name}" @@ -626,6 +648,8 @@ fr: authorizing_old: title: "Merci d'avoir confirmé votre adresse de courriel" description: "Nous envoyons un courriel sur votre nouvelle adresse pour confirmation." + associated_accounts: + revoke_failed: "Echec de révocation de votre compte avec %{provider_name}." activation: action: "Cliquer ici pour activer votre compte" already_done: "Désolé, ce lien de confirmation n'est plus valide. Votre compte est peut-être déjà activé ?" @@ -683,17 +707,12 @@ fr: description: 'Aimer ce message' short_description: 'Aimer ce message' long_form: 'a été aimé' - vote: - title: 'Vote' - description: 'Votez pour ce message' - short_description: 'Voter pour ce message' - long_form: 'a voté pour ce message' user_activity: no_default: self: "Vous n'avez aucune activité pour le moment." others: "Aucune activité." no_bookmarks: - self: "Vous n'avez mis de signets à aucun message ; mettre des signets vous permet de facilement les retrouver par la suite." + self: "Vous n'avez pas de sujet dans vos signets; les signets vous permettent de retrouver rapidement des sujets d'intérêt." others: "Aucun signet." no_likes_given: self: "Vous n'avez aimé aucun message" @@ -701,19 +720,25 @@ fr: no_replies: self: "Vous n'avez répondu à aucun message." others: "Aucune réponse." + no_drafts: + self: "Vous n'avez pas d'ébauche; commencez à répondre à un sujet et la réponse sera automatiquement sauvegardée comme nouvelle ébauche." + others: "Vous n'avez pas la permission de consulter les ébauches de cet utilisateur." topic_flag_types: spam: title: 'Spam' description: 'Ce message est une publicité. Il n''est pas utile ou pertinent pour ce site, mais de nature promotionnelle.' long_form: 'signalé comme spam' + short_description: 'Ceci est une publicité' inappropriate: title: 'Inapproprié' description: 'Ce message contient du contenu qu''une personne raisonnable jugerait offensant, abusif ou en violation de la charte de notre communauté.' long_form: 'signalé comme inapproprié' + short_description: 'Une transgression de notre charte communautaire' notify_moderators: title: "Autre chose" description: 'Ce sujet demande l''attention des responsables d''après la charte de la communauté, les conditions générales de service ou pour une autre raison.' long_form: 'signalé pour modération' + short_description: 'Nécessite l''attention du staff pour une autre raison' email_title: 'Le sujet « %{title} » nécessite l''attention d''un modérateur' email_body: "%{link}\n\n%{message}" flagging: @@ -759,12 +784,50 @@ fr: read: "Tout lire" write: "Tout écrire" reports: + default: + labels: + count: Nombre + percent: Pourcentage + day: Jour + post_edits: + title: "Modifications de message" + labels: + post: Message + editor: Éditeur + author: Auteur + edit_reason: Raison + moderators_activity: + title: "Activité des modérateurs" + labels: + moderator: Modérateur + flag_count: Signalements examinés + time_read: Temps de lecture + topic_count: Sujets créés + post_count: Messages créés + pm_count: Messages privés créés + revision_count: Révisions + flags_status: + title: "Statut des signalements" + values: + agreed: Acceptés + disagreed: Rejetés + deferred: Reportés + no_action: Aucune action + labels: + flag: Type + assigned: Affectés + poster: Auteur + flagger: Signalant + time_to_resolution: Temps de résolution visits: title: "Visites d'utilisateurs" xaxis: "Jour" yaxis: "Nombre de visites" signups: + title: "Inscriptions" xaxis: "Jour" + yaxis: "Nombre d'inscriptions" + description: "Nouvelles créations de compte pour cette période" new_contributors: title: "Nouveaux contributeurs" xaxis: "Jour" @@ -773,6 +836,8 @@ fr: dau_by_mau: title: "DAU/MAU" xaxis: "Jour" + yaxis: "DAU/MAU" + description: "Nombre d'utilisateurs qui se sont connectés dans la dernière journée, divisé par le nombre d'utilisateurs qui se sont connectés dans le dernier mois – en % qui représente le taux \"d'adhérence\" de la communauté. Viser > 30%." daily_engaged_users: title: "Utilisateurs impliqués au quotidien" xaxis: "Jour" @@ -812,10 +877,14 @@ fr: title: "Utilisateurs par niveau de confiance" xaxis: "Niveau de confiance" yaxis: "Nombre d'utilisateurs" + labels: + level: Niveau users_by_type: title: "Utilisateurs par type" xaxis: "Type" yaxis: "Nombre d'utilisateurs" + labels: + type: Type xaxis_labels: admin: Administrateur moderator: Modérateur @@ -826,6 +895,7 @@ fr: labels: term: Terme searches: Recherches + click_through: CTR emails: title: "Courriels envoyés" xaxis: "Jour" @@ -835,6 +905,7 @@ fr: xaxis: "Jour" yaxis: "Nombre de messages" user_to_user_private_messages_with_replies: + title: "Utilisateur à utilisateur (avec réponses)" xaxis: "Jour" yaxis: "Nombre de messages" system_private_messages: @@ -864,10 +935,15 @@ fr: num_clicks: "Clics" num_topics: "Sujets" num_users: "Utilisateurs" + labels: + domain: Domaine + num_clicks: Clics + num_topics: Sujets top_referred_topics: title: "Sujets les plus référencés" - xaxis: "Sujet" - num_clicks: "Clics" + labels: + num_clicks: "Clics" + topic: "Sujet" page_view_anon_reqs: title: "Anonyme" xaxis: "Jour" @@ -925,13 +1001,14 @@ fr: xaxis: "Jour" yaxis: "Total" mobile_visits: - title: "Visites d'utilisateurs" + title: "Visites d'utilisateur (mobile)" xaxis: "Jour" yaxis: "Nombre de visites" web_crawlers: title: "Requêtes de crawler web" - xaxis: "User Agent" - yaxis: "Pages vues" + labels: + user_agent: "User Agent" + page_views: "Pages vues" dashboard: rails_env_warning: "Votre serveur fonctionne dans l'environnement de %{env}." host_names_warning: "Votre fichier config/database.yml utilise le nom d'hôte par défaut. Veuillez renseigner votre nom d'hôte." @@ -949,13 +1026,14 @@ fr: failing_emails_warning: 'Il y a %{num_failed_jobs} tâches d''envois de courriel en erreur. Vérifiez votre fichier app.yml et assurez-vous de la conformité des paramètres du serveur de courriel. Voir aussi les processus en échec dans Sidekiq.' subfolder_ends_in_slash: "Votre configuration de sous-répertoire est erronée; DISCOURSE_RELATIVE_URL_ROOT se termine avec une barre oblique ." email_polling_errored_recently: - one: La vérification des courriels a généré une erreur au cours des 24 dernières heures. Vérifiez le journal pour plus de détails. - other: La vérification des courriels a généré %{count} erreurs au cours des 24 dernières heures. Vérifiez le journal pour plus de détails. + one: "La vérification des courriels a généré une erreur au cours des 24 dernières heures. Vérifiez le journal pour plus de détails." + other: "La vérification des courriels a généré %{count} erreurs au cours des 24 dernières heures. Vérifiez le journal pour plus de détails." missing_mailgun_api_key: "Le serveur est configuré pour envoyer des courriels via Mailgun mais vous n'avez pas fourni la clef API nécessaire pour vérifier les messages webhook." bad_favicon_url: "Impossible de charger la favicon. Vérifiez le paramètre favicon_url dans les paramètres du site" poll_pop3_timeout: "La connexion vers le serveur POP3 a expiré. Les courriels entrants n'ont pas pu être téléchargés. Veuillez vérifier les paramètres POP3 et votre fournisseur de service courriel." poll_pop3_auth_error: "La connexion vers le serveur POP3 échoue avec une erreur d'authentification. Veuillez vérifier les paramètres POP3." force_https_warning: "Votre site web utiliser le SSL. Mais `force_https` n'est pas encore activé dans les paramètres du site." + out_of_date_themes: "Des mises à jour sont disponibles pour les thèmes suivants :" site_settings: censored_words: "Mots qui seront automatiquement remplacés par ■■■■" delete_old_hidden_posts: "Supprimer automatiquement les messages cachés plus de 30 jours." @@ -979,6 +1057,7 @@ fr: search_recent_posts_size: "Combien de messages récents à garder dans l'index" log_search_queries: "Archiver les requêtes de recherche des utilisateurs" search_query_log_max_size: "Nombre maximum de requêtes de recherche à conserver" + search_query_log_max_retention_days: "Durée maximum de conservation de requêtes de recherche" allow_uncategorized_topics: "Autorise la création de sujets sans catégorie. ATTENTION : S'il existe des sujets non-catégorisés, vous devez les catégoriser avant de désactiver cette fonction." allow_duplicate_topic_titles: "Autoriser la création de sujet avec le même titre." unique_posts_mins: "Combien de temps avant qu'un utilisateur puisse poster le même contenu à nouveau" @@ -1032,7 +1111,6 @@ fr: summary_max_results: "Nombre maximum de messages retournés par « Résumer ce sujet »" enable_personal_messages: "Autoriser les utilisateurs de niveau de confiance 1 à créer des messages et à répondre (configurable via le niveau de confiance minimum pour envoyer des messages). Notez que les responsables peuvent toujours envoyer des messages." enable_system_message_replies: "Permettre aux utilisateurs de répondre aux messages système, même si les messages directs sont désactivés." - enable_personal_email_messages: "Autoriser les utilisateurs de niveau de confiance 1 à envoyer des messages courriel personnels (configurable via le niveau de confiance minimum pour envoyer des messages). Notez que les responsables peuvent toujours envoyer des messages." enable_long_polling: "Utiliser les requêtes longues pour le flux de notifications." long_polling_base_url: "Racine de l'URL utilisée pour les requêtes longues (dans le cas de l'utilisation d'un CDN pour fournir du contenu dynamique, pensez à le configurer en mode \"origin pull\") par exemple : http://origin.site.com" long_polling_interval: "Délai d'attente du serveur avant de répondre aux clients lorsqu'il n'y a pas de données à envoyer\n(réservé aux utilisateurs connectés)" @@ -1079,9 +1157,9 @@ fr: post_menu: "L'ordre des éléments dans le menu de rédaction. Exemple like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Les éléments du menu qui seront cachés par défaut jusqu’à extension du menu." share_links: "Choix des éléments qui doivent apparaître dans la fenêtre de partage, et leur ordre." - track_external_right_clicks: "Suivi des clics sur les liens externes (ex. : ouverture dans un nouvel onglet) désactivé par défaut car nécessite une ré-écriture de toutes les URLs" site_contact_username: "Un pseudo de responsable valide pour envoyer tous les message automatiques. Si laissé vide, le compte système sera utilisé." send_welcome_message: "Envoyer à tous les nouveaux utilisateurs un message de bienvenue avec un guide de démarrage rapide." + send_tl1_welcome_message: "Envoyer à tous les utilisateurs de niveau de confiance 1 un message de bienvenue." suppress_reply_directly_below: "Ne pas afficher le panneau extensible des réponses d'un message quand la seule réponse est juste en dessous ce dernier." suppress_reply_directly_above: "Ne pas afficher 'en réponse à' sur un message quand la seule réponse est juste en dessus de ce dernier." suppress_reply_when_quoting: "Ne pas affiché le panneau \"En réponse à\" sur un message qui répond à une citation." @@ -1136,8 +1214,8 @@ fr: enable_google_oauth2_logins: "Activer l'authentification Google Oauth2. C'est la méthode d'authentification que Google supporte désormais. Nécessite une clé et une phrase secrète." google_oauth2_client_id: "Identifiante du client de votre application Google." google_oauth2_client_secret: "Clé secrète du client de votre application Google." - google_oauth2_prompt: "Une liste de valeurs de chaînes de caractères délimitées par des espaces qui spécifie si le serveur d'autorisation demande à l'utilisateur de se réauthentifier et de donner son consentement. Voir https://developers.google.com/identity/protocols/OpenIDConnect#prompt pour les valeurs possibles." - google_oauth2_hd: "Google Apps Hosted domain auquel la connexion sera limitée. Voir https://developers.google.com/identity/protocols/OpenIDConnect#hd-param pour plus de détails." + google_oauth2_prompt: "Liste facultative de valeurs de chaînes de caractères délimitées par des espaces, qui spécifie si le serveur d'autorisation invite l'utilisateur à se réauthentifier et à donner son consentement. Voir https://developers.google.com/identity/protocols/OpenIDConnect#prompt pour des valeurs possibles." + google_oauth2_hd: "Un domaine optionnel Google Apps Hosted auquel la connexion sera limitée. Voir https://developers.google.com/identity/protocols/OpenIDConnect#hd-param pour plus de détails." enable_twitter_logins: "Activer l'authentification Twitter, nécessite twitter_consumer_key et twitter_consumer_secret" twitter_consumer_key: "Clé consommateur pour l'authentification Twitter, enregistrée sur https://apps.twitter.com/" twitter_consumer_secret: "Secret consommateur pour l'authentification Twitter, enregistré sur http://dev.twitter.com" @@ -1158,6 +1236,8 @@ fr: backup_frequency: "Nombre de jours entre sauvegardes" enable_s3_backups: "Envoyer vos sauvegardes à S3 lorsqu'elles sont terminées. IMPORTANT : Vous devez avoir renseigné vos identifiants S3 dans les paramètres de fichiers." s3_backup_bucket: "Bucket distant qui contiendra les sauvegardes. ATTENTION: Vérifiez que c'est un bucket privé" + s3_endpoint: "Le terminal peut être modifié pour être sauvegardé sur un service compatible S3 comme DigitalOcean Spaces ou Minio. ATTENTION: Utiliser défaut si vous utilisez AWS S3" + s3_force_path_style: "Appliquez l'adressage de type chemin pour votre terminal personnalisé. IMPORTANT : Nécessaire pour utiliser les téléchargements et sauvegardes Minio." s3_disable_cleanup: "Désactiver la suppression des sauvegardes de S3 lors de leur suppression locale." backup_time_of_day: "Heure (UTC) de planification de la sauvegarde." backup_with_uploads: "Inclure les fichiers envoyés dans les sauvegardes. Si désactivé, seule la base de données sera sauvegardée." @@ -1183,6 +1263,8 @@ fr: max_topic_invitations_per_day: "Nombre maximum d'invitations à un sujet qu'un utilisateur peut envoyer par jour." max_logins_per_ip_per_hour: "Nombre maximum de connexions autorisées par adresse IP et par heure" max_logins_per_ip_per_minute: "Nombre maximum de connexions autorisées par adresse IP, par minute" + max_post_deletions_per_minute: "Nombre maximum de sujet qu'un utilisateur peut supprimer par minute." + max_post_deletions_per_day: "Nombre maximum de sujet qu'un utilisateur peut supprimer par jour." alert_admins_if_errors_per_minute: "Nombre d'erreurs par minute nécessaires pour déclencher une alerte administrateur. Une valeur de 0 désactive cette fonctionnalité. N. B. : nécessite un redémarrage." alert_admins_if_errors_per_hour: "Nombre d'erreurs par heure nécessaires pour déclencher une alerte administrateur. Une valeur de 0 désactive cette fonctionnalité. N. B. : nécessite un redémarrage." categories_topics: "Nombre de sujets à afficher dans la page /categories." @@ -1203,12 +1285,15 @@ fr: avatar_sizes: "Liste des tailles des avatars automatiquement générés" external_system_avatars_enabled: "Utilisez un service d'avatars externe." external_system_avatars_url: "URL du service d'avatars externe. Les remplacements autorisés sont {username} {first_letter} {color} {size}" - default_opengraph_image_url: "URL de l'image par défaut pour les balises Open Graph." - twitter_summary_large_image_url: "URL de l'image par défaut de la carte de résumé Twitter (devrait au moins mesurer 280px en largeur et 150px en hauteur). " + selectable_avatars_enabled: "Obliger les utilisateurs à choisir un avatar de la liste." + selectable_avatars: "Liste d'avatars parmi lesquels les utilisateurs peuvent choisir." + default_opengraph_image_url: "Image opengraph par défaut, utilisée quand la page n'a pas d'autre image or logo de site approprié." + twitter_summary_large_image_url: "Image par défaut de la carte de résumé Twitter (devrait au moins mesurer 280px en largeur et 150px en hauteur). " allow_all_attachments_for_group_messages: "Autorise toutes les pièces-jointes pour les messages de groupes." png_to_jpg_quality: "Qualité du fichier JPEG converti (1 est la plus faible, 99 est la meilleure, 100 pour désactiver)." allow_staff_to_upload_any_file_in_pm: "Autoriser les responsables à envoyer n'importe quel fichier dans les messages directs." strip_image_metadata: "Enlever les métadonnées de l'image." + min_ratio_to_crop: "Ratio utilisé pour recadrer les images en hauteur. Entrez le résultat de la largeur / hauteur." enable_flash_video_onebox: "Activer l'utilisation de swf et flv (Adobe Flash) dans les boites imbriquées. ATTENTION : cela pourrait introduire un risque de sécurité." default_invitee_trust_level: "Niveau de confiance par défaut (0-4) pour les invités." default_trust_level: "Niveau de confiance par défaut (entre 0 et 4) pour tous les nouveaux utilisateurs. ATTENTION ! Changer ce paramètre peut vous exposer à des spams." @@ -1243,10 +1328,10 @@ fr: min_trust_to_edit_post: "Le niveau de confiance minimum requis pour modifier des messages." min_trust_to_allow_self_wiki: "Le niveau de confiance minimum requis pour transformer ses propres messages en type wiki." min_trust_to_send_messages: "Le niveau de confiance minimum pour être autorisé à créer des nouveaux messages directs." - min_trust_to_send_email_messages: "Le niveau de confiance minimum requis pour envoyer de nouveaux messages directs par courriel (aux utilisateurs distants)." min_trust_to_flag_posts: "Le niveau de confiance minimum requis pour signaler des messages" min_trust_to_post_links: "Le niveau de confiance minimum requis pour inclure des liens dans les messages" min_trust_to_post_images: "Le niveau de confiance minimum requis pour inclure des images dans les messages" + whitelisted_link_domains: "Domaines vers lesquels les utilisateurs peuvent créer des liens même s'ils n'ont pas le niveau de confiance approprié pour poster des liens." newuser_max_links: "Combien de liens un nouvel utilisateur peut-il ajouter à un message." newuser_max_images: "Combien d'images un nouvel utilisateur peut-il ajouter à un message." newuser_max_attachments: "Combien de fichiers un nouvel utilisateur peut-il ajouter à un message." @@ -1318,13 +1403,14 @@ fr: reply_by_email_address: "Modèle pour la réponse par courriel entrant; exemple : %{reply_key}@reply.example.com ou replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Liste des templates alternatifs pour les adresses des courriels entrants de la réponse par courriel. Exemple : %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" incoming_email_prefer_html: "Utilisez HTML plutôt que du texte pour les courriels entrants." - disable_emails: "Désactiver l'envoi de les courriels depuis Discourse." + disable_emails: "Empêcher Discourse d'envoyer tout type de courriels. Sélectionnez 'oui' pour désactiver les courriels pour tous les utilisateurs. Sélectionnez 'non-responsables' pour désactiver les courriels uniquement pour les utilisateurs qui ne sont pas des responsables." strip_images_from_short_emails: "Retirer les images des courriels dont la taille est inférieur à 2800 Octets" short_email_length: "Taille des courriels courts en Octets" display_name_on_email_from: "Affiche les noms complets dans le champ From du courriel." unsubscribe_via_email: "Autorise les utilisateurs à se désinscrire des courriels en envoyant un courriel avec \"unsubscribe\" dans le sujet ou le corps du message." unsubscribe_via_email_footer: "Inclure un lien dans le pied des courriels envoyés pour se désabonner" delete_email_logs_after_days: "Efface les journaux de messagerie après (N) jours. 0 pour conserver indéfiniment." + disallow_reply_by_email_after_days: "Interdire la réponse par courriel après (N) jours. 0 pour permettre indéfiniment." max_emails_per_day_per_user: "Nombre maximum de courriels à envoyer aux utilisateurs par jour. 0 pour désactiver la limite" enable_staged_users: "Créer automatiquement les utilisateurs distants lors du traitement des courriels entrants." maximum_staged_users_per_email: "Nombre maximum d'utilisateurs distants créés lors du traitement d'un courriel entrant." @@ -1351,9 +1437,11 @@ fr: pop3_polling_host: "L'hôte pour le pooling des courriels via POP3." pop3_polling_username: "Le nom d'utilisateur du compte POP3 pour le pooling des courriels." pop3_polling_password: "Le mot de passe du compte POP3 pour le pooling des courriels." + pop3_polling_delete_from_server: "Courriels supprimés du serveur. NOTE: Si vous désactivez ceci vous devrez vider manuellement votre boîte de réception courriel." log_mail_processing_failures: "Enregistrer tous les problèmes de mails sur\nhttp://yoursitename.com/logs" email_in: "Autoriser les utilisateurs à poster de nouveaux sujets par courriel (requêtes manuelles ou via pop3 requises). Configurer les adresses dans l'onglet \"Paramètres\" de chaque catégorie." email_in_min_trust: "Le niveau de confiance minimum qu'un utilisateur doit avoir pour être autorisé à poster de nouveaux sujets par courriel." + email_in_spam_header: "Entête courriel pour détecter du spam." email_prefix: "Le [label] qui sera utilisé dans le sujet des courriels. Par défaut il prend la valeur de 'title'." email_site_title: "Le titre du site utilisé comme expéditeur pour les courriels du site. Par défaut il prend la valeur de 'title'. Si votre 'title\" utilise des caractères interdits dans les courriels, utiliser ce paramètre." find_related_post_with_key: "N'utilisez que le 'reply key' pour trouver le message auquel on a répondu. ATTENTION : la désactivation de cette option permet l'usurpation d'identité de l'utilisateur sur la base de l'adresse e-mail." @@ -1363,7 +1451,7 @@ fr: delete_all_posts_max: "Le nombre maximum de messages qui peuvent être supprimés en une seule fois avec le bouton Supprimer tous les messages. Si un utilisateur a plus que ce nombre de messages, ses messages ne pourront pas être supprimés en une seule fois et l'utilisateur ne pourra pas être supprimé." username_change_period: "Le nombre de jours maximum après l'enregistrement que l'utilisateur peut encore modifier son pseudo (0 pour empêcher la modification de pseudo)." email_editable: "Autoriser les utilisateurs à modifier leur adresse de courriel après l'inscription." - logout_redirect: "URL vers laquelle rediriger le navigateur après déconnexion (par exemple : http://unsite.com/deconnexion)" + logout_redirect: "URL vers laquelle rediriger le navigateur après déconnexion (par exemple : http://example.com/deconnexion)" allow_uploaded_avatars: "Autoriser les utilisateurs à télécharger une photo de profil personnalisé." allow_animated_avatars: "Autoriser les utilisateurs à télécharger une photo de profil de type gif animé. ATTENTION: lancer la commande rake avatars:refresh après avoir modifié ceci." allow_animated_thumbnails: "Créer des aperçus animés pour les gifs animés." @@ -1401,6 +1489,7 @@ fr: dominating_topic_minimum_percent: "Quel est le pourcentage de messages un utilisateur doit poster dans un sujet avant d'être rappelé à l'ordre pour laissé la communauté répondre." disable_avatar_education_message: "Désactiver le message incitant à changer l'avatar." suppress_uncategorized_badge: "Ne pas afficher le badge pour les sujets non catégorisés dans les listes des sujets." + header_dropdown_category_count: "Nombre de catégories qui peuvent être affiché dans le menu déroulant d'en-tête." permalink_normalizations: "Appliquer l'expression régulière suivante avant de détecter les permaliens, par exemple /(\\/topic.*)\\?.*/\\1 supprimera les chaînes de requête des chemins de sujet. Le format est regex+string, utilisez \\1 etc. pour capturer des séquences" global_notice: "Affiche un bandeau global URGENT pour tout les utilisateurs du site, laissez vide pour le cacher (HTML autorisé)." disable_edit_notifications: "Désactiver les notifications de modifications par l'utilisateur système lorsque l'option 'download_remote_images_to_local' est activée." @@ -1435,6 +1524,7 @@ fr: enable_emoji_shortcuts: "Les textes de smiley courants :) :p :( seront convertis en emojis" emoji_set: "Comment aimeriez-vous vos emoji ?" enforce_square_emoji: "Forcer tous les Emojis à être carrés." + emoji_autocomplete_min_chars: "Nombre minimum de caractères nécessaires pour invoquer la fenêtre contextuelle d'emoji" approve_post_count: "Le nombre de messages d'un utilisateur nouveau ou basique devant être approuvés" approve_unless_trust_level: "Les messages des utilisateurs qui n'ont pas atteint ce niveau de confiance doivent être approuvés" approve_new_topics_unless_trust_level: "Les nouveaux sujets des utilisateurs en dessous de ce niveau de confiance doivent être approuvés" @@ -1469,12 +1559,14 @@ fr: default_categories_muted: "Liste de catégories silencées par défaut." default_categories_watching_first_post: "Liste des catégories dont le premier message de chaque nouveau sujet sera surveillé par défaut." retain_web_hook_events_period_days: "Nombre de jours de conservation des événement des Web hooks." + retry_web_hook_events: "Réessayez automatiquement 4 fois les événements de hook web qui ont échoué. Les intervalles entre les tentatives sont de 1, 5, 25 et 125 minutes." allow_user_api_keys: "Autoriser la génération des clés de l'API utilisateur" allow_user_api_key_scopes: "Liste des champs d'action autorisés pour les clés de l'API utilisateur" max_api_keys_per_user: "Nombre maximum de clés de l'API utilisateur par utilisateur" min_trust_level_for_user_api_key: "Niveau de confiance requis pour générer des clés pour l'API utilisateur" allowed_user_api_auth_redirects: "URL autorisées pour la redirection d'authentification pour les clés de l'API utilisateur" allowed_user_api_push_urls: "URL autorisées pour le service push du serveur vers l'API utilisateur" + expire_user_api_keys_days: "Nombre de jours avant l'expiration automatique d'une clé API utilisateur (0 pour jamais)" tagging_enabled: "Activer les tags sur les sujets ?" min_trust_to_create_tag: "Le niveau de confiance minimum requis pour créer un tag." max_tags_per_topic: "Le nombre maximum de tags pouvant être ajoutés à un sujet." @@ -1548,68 +1640,67 @@ fr: not_seen_in_a_month: "Heureux de vous revoir parmi nous ! Nous ne vous avons pas vu depuis un moment. Voici les sujets les plus populaires depuis votre absence." merge_posts: edit_reason: - one: Un message a été fusionné par %{username} - other: '%{count} messages ont été fusionnés par %{username}' + one: "Un message a été fusionné par %{username}" + other: "%{count} messages ont été fusionnés par %{username}" errors: different_topics: "Des messages appartenant à différents sujets ne peuvent pas être fusionnés." different_users: "Des messages appartenant à différents utilisateurs ne peuvent pas être fusionnés." move_posts: new_topic_moderator_post: - one: 'Un message a été déplacé vers un nouveau sujet : %{topic_link}' - other: '%{count} messages ont été déplacés vers un nouveau sujet : %{topic_link}' + one: "Un message a été déplacé vers un nouveau sujet : %{topic_link}" + other: "%{count} messages ont été déplacés vers un nouveau sujet : %{topic_link}" existing_topic_moderator_post: - one: 'Un message a été intégré dans un sujet existant : %{topic_link}' - other: '%{count} messages ont été intégrés dans un sujet existant : %{topic_link}' + one: "Un message a été intégré dans un sujet existant : %{topic_link}" + other: "%{count} messages ont été intégrés dans un sujet existant : %{topic_link}" change_owner: - post_revision_text: "Auteur du message changé de %{old_user} vers %{new_user}" - deleted_user: "un utilisateur supprimé" + post_revision_text: "Propriété transférée" topic_statuses: archived_enabled: "Ce sujet est maintenant archivé. Il est gelé et ne peut plus être modifié d'aucune façon." archived_disabled: "Ce sujet est maintenant désarchivé. Il n'est plus figé et peut être modifié." closed_enabled: "Ce sujet est maintenant fermé. Les nouvelles réponses ne sont plus autorisées." closed_disabled: "Ce sujet est maintenant ouvert. Les nouvelles réponses sont autorisées." autoclosed_message_max_posts: - one: Ce message a été automatiquement fermé après avoir atteint la limite maximum de 1 réponse. - other: Ce message a été automatiquement fermé après avoir atteint la limite maximum de %{count} réponses. + one: "Ce message a été automatiquement fermé après avoir atteint la limite maximum de 1 réponse." + other: "Ce message a été automatiquement fermé après avoir atteint la limite maximum de %{count} réponses." autoclosed_topic_max_posts: - one: Ce sujet a été automatiquement fermé après avoir atteint la limite maximum de 1 réponse. - other: Ce sujet a été automatiquement fermé après avoir atteint la limite maximum de %{count} réponses. + one: "Ce sujet a été automatiquement fermé après avoir atteint la limite maximum de 1 réponse." + other: "Ce sujet a été automatiquement fermé après avoir atteint la limite maximum de %{count} réponses." autoclosed_enabled_days: - one: Cette discussion a été automatiquement fermée après un jour. Aucune réponse n'est permise dorénavant. - other: Ce sujet a été automatiquement fermé après %{count} jours. Aucune réponse n'est permise dorénavant. + one: "Cette discussion a été automatiquement fermée après un jour. Aucune réponse n'est permise dorénavant." + other: "Ce sujet a été automatiquement fermé après %{count} jours. Aucune réponse n'est permise dorénavant." autoclosed_enabled_hours: - one: Cette discussion a été automatiquement fermée après une heure. Aucune réponse n'est permise dorénavant. - other: Ce sujet a été automatiquement fermé après %{count} heures. Aucune réponse n'est permise dorénavant. + one: "Cette discussion a été automatiquement fermée après une heure. Aucune réponse n'est permise dorénavant." + other: "Ce sujet a été automatiquement fermé après %{count} heures. Aucune réponse n'est permise dorénavant." autoclosed_enabled_minutes: - one: Cette discussion a été automatiquement fermée après une minute. Aucune réponse n'est permise dorénavant. - other: Ce sujet a été automatiquement fermé après %{count} minutes. Aucune réponse n'est permise dorénavant. + one: "Cette discussion a été automatiquement fermée après une minute. Aucune réponse n'est permise dorénavant." + other: "Ce sujet a été automatiquement fermé après %{count} minutes. Aucune réponse n'est permise dorénavant." autoclosed_enabled_lastpost_days: - one: Cette discussion a été automatiquement fermée après un jour. Aucune réponse n'est permise dorénavant. - other: Ce sujet a été automatiquement fermé après %{count} jours. Aucune réponse n'est permise dorénavant. + one: "Cette discussion a été automatiquement fermée après un jour. Aucune réponse n'est permise dorénavant." + other: "Ce sujet a été automatiquement fermé après %{count} jours. Aucune réponse n'est permise dorénavant." autoclosed_enabled_lastpost_hours: - one: Cette discussion a été automatiquement fermée après 1 heure suivant le dernier commentaire. Aucune réponse n'est permise dorénavant. - other: Ce sujet a été automatiquement fermé après %{count} heures suivant le dernier commentaire. Aucune réponse n'est permise dorénavant. + one: "Cette discussion a été automatiquement fermée après 1 heure suivant le dernier commentaire. Aucune réponse n'est permise dorénavant." + other: "Ce sujet a été automatiquement fermé après %{count} heures suivant le dernier commentaire. Aucune réponse n'est permise dorénavant." autoclosed_enabled_lastpost_minutes: - one: Cette discussion a été automatiquement fermée une minute après le dernier message. Aucune réponse n'est permise dorénavant. - other: Ce sujet a été automatiquement fermé %{count} minutes après le dernier message. Aucune réponse n'est permise dorénavant. + one: "Cette discussion a été automatiquement fermée une minute après le dernier message. Aucune réponse n'est permise dorénavant." + other: "Ce sujet a été automatiquement fermé %{count} minutes après le dernier message. Aucune réponse n'est permise dorénavant." autoclosed_disabled_days: - one: Ce sujet a été automatiquement ouvert après 1 jour. - other: Ce sujet a été automatiquement ouvert après %{count} jours. + one: "Ce sujet a été automatiquement ouvert après 1 jour." + other: "Ce sujet a été automatiquement ouvert après %{count} jours." autoclosed_disabled_hours: - one: Ce sujet a été automatiquement ouvert après 1 heure. - other: Ce sujet a été automatiquement ouvert après %{count} heures. + one: "Ce sujet a été automatiquement ouvert après 1 heure." + other: "Ce sujet a été automatiquement ouvert après %{count} heures." autoclosed_disabled_minutes: - one: Ce sujet a été automatiquement ouvert après 1 minute. - other: Ce sujet a été automatiquement ouvert après %{count} minutes. + one: "Ce sujet a été automatiquement ouvert après 1 minute." + other: "Ce sujet a été automatiquement ouvert après %{count} minutes." autoclosed_disabled_lastpost_days: - one: Ce sujet a été automatiquement ouvert 1 jour après la dernière réponse. - other: Ce sujet a été automatiquement ouvert %{count} jours après la dernière réponse. + one: "Ce sujet a été automatiquement ouvert 1 jour après la dernière réponse." + other: "Ce sujet a été automatiquement ouvert %{count} jours après la dernière réponse." autoclosed_disabled_lastpost_hours: - one: Ce sujet a été automatiquement ouvert 1 heure après la dernière réponse. - other: Ce sujet a été automatiquement ouvert %{count} heures après la dernière réponse. + one: "Ce sujet a été automatiquement ouvert 1 heure après la dernière réponse." + other: "Ce sujet a été automatiquement ouvert %{count} heures après la dernière réponse." autoclosed_disabled_lastpost_minutes: - one: Ce sujet a été automatiquement ouvert 1 minute après la dernière réponse. - other: Ce sujet a été automatiquement ouvert %{count} minutes après la dernière réponse. + one: "Ce sujet a été automatiquement ouvert 1 minute après la dernière réponse." + other: "Ce sujet a été automatiquement ouvert %{count} minutes après la dernière réponse." autoclosed_disabled: "Ce sujet est maintenant ouvert. Les nouvelles réponses sont autorisées." autoclosed_disabled_lastpost: "Ce sujet est maintenant ouvert. Vous pouvez y participer." pinned_enabled: "Ce sujet est maintenant épinglé. Il apparaîtra en haut de sa catégorie jusqu'à ce qu'il soit désépinglé par un modérateur, ou individuellement par les utilisateurs eux-mêmes." @@ -1647,9 +1738,18 @@ fr: already_logged_in: "Oups, on dirait que vous essayez d'accepter une invitation d'un autre utilisateur. Si vous n'êtes pas %{current_user}, veuillez vous déconnecter et réessayer." second_factor_title: "Authentification à deux facteurs" second_factor_description: "Veuillez saisir le code d'authentification requise de votre app :" - invalid_second_factor_code: "Code d'authentification invalide" + second_factor_backup_description: "Veuillez entrer un de vos codes de secours :" + second_factor_backup_title: "Code de secours de l'authentification à deux étapes" + invalid_second_factor_code: "Code d'authentification invalide. Chaque code ne peut être utilisé qu'une fois." + second_factor_toggle: + totp: "Utilisez plutôt une application d'authentification" + backup_code: "Utilisez plutôt un code de secours" + admin: + email: + sent_test: "envoyé !" + sent_test_disabled: "impossible d'envoyer, les courriels sont désactivés" + sent_test_disabled_for_non_staff: "impossible d'envoyer, les courriels sont désactivés sauf pour les responsables" user: - no_accounts_associated: "Aucun compte associé" deactivated: "A été désactivé à cause de trop de courriels rejetés vers '%{email}'." deactivated_by_staff: "Désactivé par un responsable" activated_by_staff: "Activé par un responsable" @@ -1681,11 +1781,11 @@ fr: same_ip_address: "Même adresse IP (%{ip_address}) que d'autres utilisateurs" flags_reminder: flags_were_submitted: - one: Des signalements ont été soumis il y a plus de 1 heure. [Veuillez les passer en revue](/admin/flags). - other: Des signalements ont été soumis il y a plus de %{count} heures. [Veuillez les passer en revue](/admin/flags). + one: "Des signalements ont été soumis il y a plus de 1 heure. [Veuillez les passer en revue](/admin/flags)." + other: "Des signalements ont été soumis il y a plus de %{count} heures. [Veuillez les passer en revue](/admin/flags)." subject_template: - one: un signalement en attente de traitement - other: '%{count} signalements en attente de traitement.' + one: "un signalement en attente de traitement" + other: "%{count} signalements en attente de traitement." unsubscribe_mailer: title: "Désinscription" subject_template: "Confirmez que vous ne souhaitez plus recevoir de courriels de mises à jour de %{site_title}" @@ -1883,8 +1983,8 @@ fr: deferred: "Merci de nous en informer. Nous travaillons à sa résolution." deferred_and_deleted: "Merci de nous en informer. Nous avons supprimé le message." temporarily_closed_due_to_flags: - one: Ce sujet est fermé 1 heure suite à plusieurs signalements de la communauté. - other: Ce sujet est fermé %{count} heures suite à plusieurs signalements de la communauté. + one: "Ce sujet est fermé 1 heure suite à plusieurs signalements de la communauté." + other: "Ce sujet est fermé %{count} heures suite à plusieurs signalements de la communauté." system_messages: private_topic_title: "Topic #%{id}" contents_hidden: "Veuillez visiter le message pour voir son contenu." @@ -1922,11 +2022,27 @@ fr: Pour plus d'informations, merci de vous référer à notre [charte communautaire](%{base_url}/guidelines). + flags_agreed_and_post_deleted: + title: "Message signalé, retiré par un responsable" + subject_template: "Message signalé, retiré par un responsable" + text_body_template: |+ + Bonjour, + + Ceci est un message automatique de %{site_name} pour vous informer que votre message a été caché. + + <%{base_url}%{url} > + + %{flag_reason} + + Les message a été signalé par la communauté et un responsable a décidé de le retirer. + + Pour plus d'informations, merci de vous référer à notre [charte communautaire](%{base_url}/guidelines). + usage_tips: text_body_template: | Pour connaître quelques astuces pour vous aider à démarrer en tant que nouveau membre, [rendez-vous sur cette page](https://meta.discourse.org/t/fr-trucs-et-astuces-pour-nouveaux-utilisateurs/84100/). - Au fur et à mesure que vous participerez ici, nous apprendrons à vous connaître et les limitations temporaires des nouveaux utilisateurs seront levées. Avec le temps, vous gagnerez [des niveaux de confiance](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) (en anglais) qui incluent des fonctionnalités spéciales pour nous aider à gérer notre communauté ensemble. + Au fur et à mesure que vous participerez ici, nous apprendrons à vous connaître et les limitations temporaires des nouveaux utilisateurs seront levées. Avec le temps, vous gagnerez [des niveaux de confiance](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) (en anglais) qui incluent des fonctionnalités spéciales pour nous aider à gérer notre communauté ensemble. welcome_user: title: "Bienvenue Utilisateur" subject_template: "Bienvenue sur %{site_name} !" @@ -1938,6 +2054,13 @@ fr: Nous croyons au [comportement civilisé de la communauté](%{base_url}/guidelines) en tout temps. Amusez-vous bien ! + welcome_tl1_user: + title: "Bienvenue Utilisateur" + subject_template: "Merci de passer du temps avec nous" + text_body_template: | + Salut ! Nous avons vu que vous lisez beaucoup, ce qui est super, alors nous vous avons monté d'un [niveau de confiance !](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) + + Nous sommes ravis que vous passez du temps avec nous, et on adorerez en savoir plus sur vous. Prenez un moment pour [remplir votre profil](/my/preferences/profile), ou sentez-vous libre de [démarrer un nouveau sujet](/categories). welcome_invite: title: "Bienvenue invité" subject_template: "Bienvenue sur %{site_name} !" @@ -2135,6 +2258,13 @@ fr: %{post_error} Si vous pouvez corriger les erreurs, veuillez réessayer. + email_reject_post_too_short: + title: "Courriel rejeté trop court" + subject_template: "[%{email_prefix}] Problème de courriel -- Message trop court" + text_body_template: | + Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. + + Afin de favoriser des discussions plus approfondies, les réponses très courtes ne sont pas permises. Est-ce que vous pouvez reformuler votre réponse avec au moins %{count} caractères ? Alternativement, vous pouvez aimer un message par courriel en répondant "+1". email_reject_invalid_post_action: title: "Courriel rejeté - Message action invalide" subject_template: "[%{email_prefix}] Problème de courriel -- Action de message invalide" @@ -2162,7 +2292,7 @@ fr: text_body_template: | Nous sommes désolé, mais l'envoi de votre courriel à destination de %{destination} (intitulé %{former_title}) n'a pas fonctionné. - Pour des raisons de sécurité, nous n'acceptons des réponses aux notifications que pendant 90 jours. Veuillez vous rendre sur [le sujet](%{short_url}) pour continuer la conversation. + Pour des raisons de sécurité, nous n'acceptons des réponses aux notifications que pendant %{number_of_days} jours. Veuillez vous rendre sur [le sujet](%{short_url}) pour continuer la conversation. email_reject_topic_not_found: title: "Courriel rejeté - Sujet introuvable" subject_template: "[%{email_prefix}] Problème de courriel -- Sujet introuvable" @@ -2200,6 +2330,13 @@ fr: Assurez-vous que les paramètres de connexion POP sont corrects dans les [paramètres du site](%{base_url}/admin/site_settings/category/email). S'il y a une interface web pour le compte POP, vous devrez peut-être vous y connecter pour vérifier les paramètres. + email_revoked: + title: "Courriel revoqué" + subject_template: "Est-ce que votre adresse courriel est correct ?" + text_body_template: | + Nous sommes désolés, mais nous avons de la difficulté à vous joindre par courriel. Nos derniers courriels vous ont tous été renvoyés comme non livrables. + + Pouvez-vous vous assurer que [votre adresse email](%{base_url}/my/preferences/email) est valide et fonctionne ? Vous pouvez également ajouter notre adresse e-mail à votre carnet d'adresses / liste de contacts pour améliorer la délivrabilité. too_many_spam_flags: title: "Trop de signalements de spam" subject_template: "Nouveau compte bloqué" @@ -2267,8 +2404,8 @@ fr: pending_users_reminder: title: "Rappel d'utilisateurs en attente" subject_template: - one: 1 utilisateur en attente d'approbation - other: '%{count} utilisateurs en attente d''approbation' + one: "1 utilisateur en attente d'approbation" + other: "%{count} utilisateurs en attente d'approbation" text_body_template: | Il y a de nouvelles inscriptions utilisateurs en attente d'approbation (ou rejet). @@ -2296,8 +2433,8 @@ fr: queued_posts_reminder: title: "Messages dans la file d'attente" subject_template: - one: 1 message en attente de modération - other: '%{count} messages en attention de modération' + one: "1 message en attente de modération" + other: "%{count} messages en attention de modération" text_body_template: | Bonjour, @@ -2315,19 +2452,20 @@ fr: user_notifications: previous_discussion: "Réponses précédentes" reached_limit: - one: 'Rappel : nous envoyons un maximum de 1 courriel quotidien. Vérifiez le site pour voir lesquels pourraient être retenus. P.S. : merci d''être populaire !' - other: 'Rappel : nous envoyons un maximum de %{count} courriels quotidiens. Vérifiez le site pour voir lesquels pourraient être retenus. P.S. : merci d''être populaire !' + one: "Rappel : nous envoyons un maximum de 1 courriel quotidien. Vérifiez le site pour voir lesquels pourraient être retenus. P.S. : merci d'être populaire !" + other: "Rappel : nous envoyons un maximum de %{count} courriels quotidiens. Vérifiez le site pour voir lesquels pourraient être retenus. P.S. : merci d'être populaire !" in_reply_to: "En réponse à" unsubscribe: title: "Se désabonner" description: "Ces courriels ne vous intéressent pas ? Aucun problème ! Cliquez ci-dessous pour vous désabonner immédiatement :" reply_by_email: "[Voir le sujet](%{base_url}%{url}) ou répondre à ce courriel pour répondre." - reply_by_email_pm: "[Voir le message](%{base_url}%{url}) ou répondre à ce courriel pour répondre." + reply_by_email_pm: "[Voir le message](%{base_url}%{url}) ou répondre à ce courriel pour répondre à %{participants}." only_reply_by_email: "Répondre à ce courriel pour répondre." + only_reply_by_email_pm: "Répondre à ce courriel pour répondre à %{participants}." visit_link_to_respond: "[Voir le sujet](%{base_url}%{url}) pour répondre." - visit_link_to_respond_pm: "[Voir le message](%{base_url}%{url}) pour répondre." + visit_link_to_respond_pm: "[Voir le message](%{base_url}%{url}) pour répondre à %{participants}." posted_by: "Redigé par %{username} le %{post_date}" - pm_participants: "Participants :" + pm_participants: "Participants : %{participants}" invited_group_to_private_message_body: | %{username} a invité @%{group_name} à un message @@ -2677,7 +2815,7 @@ fr: recent_topics: "Récents" see_more: "Plus" search_title: "Rechercher dans ce site" - search_google: "Google" + search_button: "Rechercher" offline: title: "Impossible de charger l'application" offline_page_message: "Il semble que vous n'êtes pas connectés à Internet. Veuillez vérifier votre connexion réseau puis réessayez." @@ -2711,32 +2849,45 @@ fr: flag_reason: sockpuppet: "Un nouvel utilisateur a créé un sujet et un autre nouvel utilisateur avec la même adresse IP (%{ip_address}) a répondu. Voir le paramètre `flag_sockpuppets`." spam_hosts: "Ce nouvel utilisateur a tenté de créer plusieurs messages avec des liens vers le même domaine (%{domain}). Voir le paramètre `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "L'auteur du message a été supprimé." - no_user: "Impossible de trouver l'utilisateur avec l'id %{user_id}" - anonymous_user: "L'utilisateur est anonyme" - suspended_not_pm: "L'utilisateur est suspendu, pas un message" - seen_recently: "L'utilisateur a été vu récemment" - post_not_found: "Impossible de trouver le message avec l'id %{post_id}" - notification_already_read: "La notification de ce courriel a déjà été lue" - topic_nil: "post.topic vaut nil" - post_deleted: "le message a été supprimé par l'auteur" - user_suspended: "l'utilisateur a été suspendu" - already_read: "l'utilisateur a déjà lu ce message" + skipped_email_log: exceeded_emails_limit: "max_emails_per_day_per_user dépassé" exceeded_bounces_limit: "bounce_score_threshold dépassé" - message_blank: "le message est vide" - message_to_blank: "message.to est vide" - text_part_body_blank: "text_part.body est vide" - body_blank: "sans contenu" - no_echo_mailing_list_mode: "Notifications de la liste de diffusion désactivées pour les messages de l'utilisateur." + mailing_list_no_echo_mode: "Notifications de la liste de diffusion désactivées pour les messages de l'utilisateur." + user_email_no_user: "Impossible de trouver l'utilisateur avec l'id %{user_id}" + user_email_post_not_found: "Impossible de trouver le message avec l'id %{post_id}" + user_email_anonymous_user: "L'utilisateur est anonyme" + user_email_user_suspended_not_pm: "L'utilisateur est suspendu, pas un message" + user_email_seen_recently: "L'utilisateur a été vu récemment" + user_email_notification_already_read: "La notification de ce courriel a déjà été lue" + user_email_notification_topic_nil: "post.topic vaut nil" + user_email_post_user_deleted: "L'auteur du message a été supprimé." + user_email_post_deleted: "le message a été supprimé son auteur" + user_email_user_suspended: "l'utilisateur a été suspendu" + user_email_already_read: "l'utilisateur a déjà lu ce message" + sender_message_blank: "le message est vide" + sender_message_to_blank: "message.to est vide" + sender_text_part_body_blank: "text_part.body est vide" + sender_body_blank: "sans contenu" + sender_post_deleted: "le message a été supprimé" color_schemes: base_theme_name: "Base" - default: "Palette claire" + light: "Palette claire" dark: "Palette sombre" - default_theme_name: "Par défaut" - dark_theme_name: "Sombre" + neutral: "Palette neutre" + grey_amber: "Palette gris ambre" + shades_of_blue: "Palette nuances de bleu" + latte: "Palette latte" + summer: "Palette été" + dark_rose: "Palette rose foncé" + default_theme_name: "Clair" light_theme_name: "Clair" + dark_theme_name: "Sombre" + neutral_theme_name: "Neutre" + grey_amber_theme_name: "Gris ambre" + shades_of_blue_theme_name: "Nuances de bleu" + latte_theme_name: "Latte" + summer_theme_name: "Eté" + dark_rose_theme_name: "Rose foncé" about: "À propos" guidelines: "Charte" privacy: "Confidentialité" @@ -2848,6 +2999,144 @@ fr: Oui, le jargon juridique est ennuyeux, mais nous devons nous protéger – et par extension, vous et vos données – contre des gens hostiles. Nous avons des [Conditions générales d'utilisation](/tos) décrivant votre (et notre) comportement et les droits liés au contenu, la confidentialité et les lois. Pour utiliser ce service, vous devez accepter de respecter nos [CGU](/tos). tos_topic: title: "Conditions générales d'utilisation" + body: | + (Désolé, il n'existe pas encore de traduction de ce texte) + The following terms and conditions govern all use of the %{company_domain} website and all content, services and products available at or through the website, including, but not limited to, %{company_domain} Forum Software, %{company_domain} Support Forums and the %{company_domain} Hosting service ("Hosting"), (taken together, the Website). The Website is owned and operated by %{company_full_name} ("%{company_name}"). The Website is offered subject to your acceptance without modification of all of the terms and conditions contained herein and all other operating rules, policies (including, without limitation, %{company_domain}’s [Privacy Policy](/privacy) and [Community Guidelines](/faq)) and procedures that may be published from time to time on this Site by %{company_name} (collectively, the "Agreement"). + + Please read this Agreement carefully before accessing or using the Website. By accessing or using any part of the web site, you agree to become bound by the terms and conditions of this agreement. If you do not agree to all the terms and conditions of this agreement, then you may not access the Website or use any services. If these terms and conditions are considered an offer by %{company_name}, acceptance is expressly limited to these terms. The Website is available only to individuals who are at least 13 years old. + + + + ## [1. Your %{company_domain} Account](#1) + + If you create an account on the Website, you are responsible for maintaining the security of your account and you are fully responsible for all activities that occur under the account. You must immediately notify %{company_name} of any unauthorized uses of your account or any other breaches of security. %{company_name} will not be liable for any acts or omissions by you, including any damages of any kind incurred as a result of such acts or omissions. + + + + ## [2. Responsibility of Contributors](#2) + + If you post material to the Website, post links on the Website, or otherwise make (or allow any third party to make) material available by means of the Website (any such material, "Content"), You are entirely responsible for the content of, and any harm resulting from, that Content. That is the case regardless of whether the Content in question constitutes text, graphics, an audio file, or computer software. By making Content available, you represent and warrant that: + + * the downloading, copying and use of the Content will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark or trade secret rights, of any third party; + * if your employer has rights to intellectual property you create, you have either (i) received permission from your employer to post or make available the Content, including but not limited to any software, or (ii) secured from your employer a waiver as to all rights in or to the Content; + * you have fully complied with any third-party licenses relating to the Content, and have done all things necessary to successfully pass through to end users any required terms; + * the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content; + * the Content is not spam, is not machine- or randomly-generated, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing); + * the Content is not pornographic, does not contain threats or incite violence, and does not violate the privacy or publicity rights of any third party; + * your content is not getting advertised via unwanted electronic messages such as spam links on newsgroups, email lists, blogs and web sites, and similar unsolicited promotional methods; + * your content is not named in a manner that misleads your readers into thinking that you are another person or company; and + * you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by %{company_name} or otherwise. + + + + ## [3. User Content License](#3) + + User contributions are licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). Without limiting any of those representations or warranties, %{company_name} has the right (though not the obligation) to, in %{company_name}’s sole discretion (i) refuse or remove any content that, in %{company_name}’s reasonable opinion, violates any %{company_name} policy or is in any way harmful or objectionable, or (ii) terminate or deny access to and use of the Website to any individual or entity for any reason, in %{company_name}’s sole discretion. %{company_name} will have no obligation to provide a refund of any amounts previously paid. + + + + + ## [4. Payment and Renewal](#4) + + ### General Terms + + Optional paid services or upgrades may be available on the Website. When utilizing an optional paid service or upgrade, you agree to pay %{company_name} the monthly or annual subscription fees indicated. Payments will be charged on a pre-pay basis on the day you begin utilizing the service or upgrade and will cover the use of that service or upgrade for a monthly or annual subscription period as indicated. These fees are not refundable. + + ### Automatic Renewal + + Unless you notify %{company_name} before the end of the applicable subscription period that you want to cancel a service or upgrade, your subscription will automatically renew and you authorize us to collect the then-applicable annual or monthly subscription fee (as well as any taxes) using any credit card or other payment mechanism we have on record for you. Subscriptions can be canceled at any time. + + + + ## [5. Services](#5) + + ### Hosting, Support Services + + Optional Hosting and Support services may be provided by %{company_name} under the terms and conditions for each such service. By signing up for a Hosting/Support or Support services account, you agree to abide by such terms and conditions. + + ### HTTPS + + We offer HTTPS as a paid add-on. By signing up and using a custom domain on %{company_domain}, you authorize us to act on the domain name registrant’s behalf (by requesting the necessary certificates, for example) for the sole purpose of providing HTTPS on your site. + + ### Enterprise + + Enterprise Hosting services are provided by %{company_name} under the terms and conditions for each such service, which are determined by a customer-specific contract. By signing up for an Enterprise Hosting account you agree to abide by such terms and conditions. + + + + ## [6. Responsibility of Website Visitors](#6) + + %{company_name} has not reviewed, and cannot review, all of the material, including computer software, posted to the Website, and cannot therefore be responsible for that material’s content, use or effects. By operating the Website, %{company_name} does not represent or imply that it endorses the material there posted, or that it believes such material to be accurate, useful or non-harmful. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. The Website may contain content that is offensive, indecent, or otherwise objectionable, as well as content containing technical inaccuracies, typographical mistakes, and other errors. The Website may also contain material that violates the privacy or publicity rights, or infringes the intellectual property and other proprietary rights, of third parties, or the downloading, copying or use of which is subject to additional terms and conditions, stated or unstated. %{company_name} disclaims any responsibility for any harm resulting from the use by visitors of the Website, or from any downloading by those visitors of content there posted. + + + + ## [7. Content Posted on Other Websites](#7) + + We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which %{company_domain} links, and that link to %{company_domain}. %{company_name} does not have any control over those non-%{company_domain} websites and webpages, and is not responsible for their contents or their use. By linking to a non-%{company_domain} website or webpage, %{company_name} does not represent or imply that it endorses such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. %{company_name} disclaims any responsibility for any harm resulting from your use of non-%{company_domain} websites and webpages. + + + + ## [8. Copyright Infringement and DMCA Policy](#8) + + As %{company_name} asks others to respect its intellectual property rights, it respects the intellectual property rights of others. If you believe that material located on or linked to by %{company_domain} violates your copyright, and if this website resides in the USA, you are encouraged to notify %{company_name} in accordance with %{company_name}’s [Digital Millennium Copyright Act](http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) ("DMCA") Policy. %{company_name} will respond to all such notices, including as required or appropriate by removing the infringing material or disabling all links to the infringing material. %{company_name} will terminate a visitor’s access to and use of the Website if, under appropriate circumstances, the visitor is determined to be a repeat infringer of the copyrights or other intellectual property rights of %{company_name} or others. In the case of such termination, %{company_name} will have no obligation to provide a refund of any amounts previously paid to %{company_name}. + + + + ## [9. Intellectual Property](#9) + + This Agreement does not transfer from %{company_name} to you any %{company_name} or third party intellectual property, and all right, title and interest in and to such property will remain (as between the parties) solely with %{company_name}. %{company_name}, %{company_domain}, the %{company_domain} logo, and all other trademarks, service marks, graphics and logos used in connection with %{company_domain}, or the Website are trademarks or registered trademarks of %{company_name} or %{company_name}’s licensors. Other trademarks, service marks, graphics and logos used in connection with the Website may be the trademarks of other third parties. Your use of the Website grants you no right or license to reproduce or otherwise use any %{company_name} or third-party trademarks. + + + + ## [10. Attribution](#10) + + %{company_name} reserves the right to display attribution links such as ‘Powered by %{company_domain},’ theme author, and font attribution in your content footer. + + + + ## [11. Changes](#11) + + %{company_name} reserves the right, at its sole discretion, to modify or replace any part of this Agreement. It is your responsibility to check this Agreement periodically for changes. Your continued use of or access to the Website following the posting of any changes to this Agreement constitutes acceptance of those changes. %{company_name} may also, in the future, offer new services and/or features through the Website (including, the release of new tools and resources). Such new features and/or services shall be subject to the terms and conditions of this Agreement. + + + + ## [12. Termination](#12) + + %{company_name} may terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. If you wish to terminate this Agreement or your %{company_domain} account (if you have one), you may simply discontinue using the Website. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability. + + + + ## [13. Disclaimer of Warranties](#13) + + The Website is provided "as is". %{company_name} and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither %{company_name} nor its suppliers and licensors, makes any warranty that the Website will be error free or that access thereto will be continuous or uninterrupted. If you’re actually reading this, here’s [a treat](http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html). You understand that you download from, or otherwise obtain content or services through, the Website at your own discretion and risk. + + + + ## [14. Limitation of Liability](#14) + + In no event will %{company_name}, or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement for substitute products or services; (iii) for interruption of use or loss or corruption of data; or (iv) for any amounts that exceed the fees paid by you to %{company_name} under this agreement during the twelve (12) month period prior to the cause of action. %{company_name} shall have no liability for any failure or delay due to matters beyond their reasonable control. The foregoing shall not apply to the extent prohibited by applicable law. + + + + ## [15. General Representation and Warranty](#15) + + You represent and warrant that (i) your use of the Website will be in strict accordance with the %{company_name} [Privacy Policy](/privacy), [Community Guidelines](/guidelines), with this Agreement and with all applicable laws and regulations (including without limitation any local laws or regulations in your country, state, city, or other governmental area, regarding online conduct and acceptable content, and including all applicable laws regarding the transmission of technical data exported from the country in which this website resides or the country in which you reside) and (ii) your use of the Website will not infringe or misappropriate the intellectual property rights of any third party. + + + + ## [16. Indemnification](#16) + + You agree to indemnify and hold harmless %{company_name}, its contractors, and its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys’ fees, arising out of your use of the Website, including but not limited to your violation of this Agreement. + + + + ## [17. Miscellaneous](#17) + + This Agreement constitutes the entire agreement between %{company_name} and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of %{company_name}, or by the posting by %{company_name} of a revised version. Except to the extent applicable law, if any, provides otherwise, this Agreement, any access to or use of the Website will be governed by the laws of the state of California, U.S.A., excluding its conflict of law provisions, and the proper venue for any disputes arising out of or relating to any of the same will be the state and federal courts located in San Francisco County, California. Except for claims for injunctive or equitable relief or claims regarding intellectual property rights (which may be brought in any competent court without the posting of a bond), any dispute arising under this Agreement shall be finally settled in accordance with the Comprehensive Arbitration Rules of the Judicial Arbitration and Mediation Service, Inc. (“JAMSâ€) by three arbitrators appointed in accordance with such Rules. The arbitration shall take place in San Francisco, California, in the English language and the arbitral decision may be enforced in any court. The prevailing party in any action or proceeding to enforce this Agreement shall be entitled to costs and attorneys’ fees. If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties’ original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof. You may assign your rights under this Agreement to any party that consents to, and agrees to be bound by, its terms and conditions; %{company_name} may assign its rights under this Agreement without condition. This Agreement will be binding upon and will inure to the benefit of the parties, their successors and permitted assigns. + + This document is CC-BY-SA. It was last updated January 1, 2018. + + Originally adapted from the [WordPress Terms of Service](http://en.wordpress.com/tos/). privacy_topic: title: "Politique de confidentialité" body: | @@ -2963,27 +3252,27 @@ fr: name: Éditeur description: Première modification d'un message long_description: | - Ce badge est accordé après la première modification d'un de vos messages. Bien que la possibilité d'éditer un message soit limitée dans le temps, l'édition est toujours une bonne idée — vous pouvez améliorer vos messages, réparer des petites erreurs, ou ajouter des éléments que vous avez oubliés lors de la rédaction. Éditer vos messages pour les rendre encore meilleurs ! + Ce badge est accordé après la première modification d'un de vos messages. Bien que la possibilité d'éditer un message soit limitée dans le temps, l'édition est toujours encouragée — vous pouvez améliorer les messages, réparer des petites erreurs, ou ajouter des éléments que vous avez oubliés lors de la rédaction. Éditer vos messages pour les rendre encore meilleurs ! basic_user: name: Actif - description: "Accès accordé à toutes les fonctions communautaires essentielles" + description: "Accès accordé à toutes les fonctions communautaires essentielles" long_description: | - Ce badge est accordé lorsque vous atteignez le niveau de confiance 1. Merci d'être resté dans le coin un petit moment et d'avoir lu quelques sujets pour en apprendre plus sur notre communauté. Vos restrictions "nouvel utilisateur" ont été levées, et vous avez accès aux fonctionnalités essentielles telles que la messagerie personnelle, le signalement, l'édition des wikis, et la possibilité de poster des images et de multiples liens. + Ce badge est accordé lorsque vous atteignez le niveau de confiance 1. Merci d'être resté dans le coin et d'avoir lu quelques sujets pour en apprendre plus sur notre communauté. Les restrictions "nouvel utilisateur" ont été levées, et vous avez accès aux fonctionnalités essentielles telles que la messagerie personnelle, le signalement, l'édition des wikis, et la possibilité de poster des images et de multiples liens. member: name: Membre - description: "Accès accordé aux invitations, aux messages de groupe et à plus de J'aime" + description: "Accès accordé aux invitations, aux messages de groupe et à plus de J'aime" long_description: | - Ce badge est accordé lorsque vous atteignez le niveau de confiance 2. Merci d'avoir participé durant plusieurs semaines à notre communauté. Vous pouvez désormais envoyer des invitations personnelles depuis votre page utilisateur ou un sujet, envoyer des messages groupés, et avez quelques J'aime supplémentaires chaque jour. + Ce badge est accordé lorsque vous atteignez le niveau de confiance 2. Merci d'avoir participé durant plusieurs semaines à notre communauté. Vous pouvez désormais envoyer des invitations personnelles depuis votre page utilisateur ou un sujet, envoyer des messages groupés, et avez des J'aime supplémentaires chaque jour. regular: name: Habitué - description: "Accès accordé à la re-catégorisation, au renommage, au suivi de liens, au Wiki et à plus de J'aime" + description: "Accès accordé à la re-catégorisation, au renommage, au suivi de liens, au Wiki et à plus de J'aime" long_description: | Ce badge est accordé lorsque vous atteignez le niveau de confiance 3. Merci d'avoir été un participant régulier à notre communauté pendant ces quelques mois, l'un de nos lecteurs les plus actifs et un contributeur sérieux à ce qui rend notre communauté si belle. Vous pouvez désormais re-catégoriser et renommer des sujets, accéder à la section privée, signaler des spams, et vous avez plein de J'aime en plus chaque jour. leader: name: Meneur - description: "Accès accordé à l'édition globale, l'épinglage, la fermeture, l'archivage, la séparation et la fusion de sujets, et toujours plus de J'aime" + description: "Accès accordé à l'édition globale, l'épinglage, la fermeture, l'archivage, la séparation et la fusion de sujets, et toujours plus de J'aime" long_description: | - Ce badge est accordé lorsque vous atteignez le niveau de confiance 4. Vous êtes un meneur choisi par l'équipe dans cette communauté, et vous montrez l'exemple dans vos actions et vos mots. Vous avez la capacité de modifier tous les messages, utiliser les actions de modérations telles qu'épingler, fermer, cacher, archiver, scinder et fusionner, ainsi que des tonnes de J'aime par jour. + Ce badge est accordé lorsque vous atteignez le niveau de confiance 4. Vous êtes un meneur choisi par l'équipe dans cette communauté, et vous montrez l'exemple dans vos actions et vos mots. Vous avez la capacité de modifier tous les messages, utiliser les actions de modérations telles qu'épingler, fermer, cacher, archiver, scinder et fusionner. welcome: name: Bienvenue description: A reçu un J'aime @@ -3008,12 +3297,12 @@ fr: name: Bonne réponse description: A reçu 25 J'aime sur une réponse long_description: | - Ce badge est accordé quand votre réponse obtient 25 J'aime. Votre réponse est exceptionnel et a rendu la conversation meilleur pour tout le monde ! + Ce badge est accordé quand votre réponse obtient 25 J'aime. Votre réponse est exceptionnel et a rendu la conversation beaucoup plus intéressante ! great_post: name: Super réponse description: A reçu 50 J'aime sur une réponse long_description: | - Ce badge est accordé quand votre réponse obtient 50 J'aime. Votre réponse était inspirante, fascinante, hilarante, ou pertinente et la communauté l'a adorée. + Ce badge est accordé quand votre réponse obtient 50 J'aime. Votre réponse était inspirante, fascinante, hilarante, ou pertinente et la communauté l'a adorée ! nice_topic: name: Sujet intéressant description: A reçu 10 J'aime sur un sujet @@ -3023,7 +3312,7 @@ fr: name: Bon sujet description: A reçu 25 J'aime sur un sujet long_description: | - Ce badge est accordé quand votre sujet obtient 25 J'aime. Vous avez lancé une conversation vibrante autour de laquelle la communauté s'est ralliée et elle l'a adorée ! + Ce badge est accordé quand votre sujet obtient 25 J'aime. Vous avez lancé une conversation vibrante autour de laquelle la communauté s'est ralliée ! great_topic: name: Super sujet description: A reçu 50 J'aime sur un sujet @@ -3053,7 +3342,7 @@ fr: name: Premier signalement description: A signalé un message long_description: | - Ce badge est accordé la première fois que vous signalez un message. Les signalements sont essentiels à la santé de votre communauté. Si vous remarquez des messages nécessitant l'intervention d'un modérateur n'hésitez pas à les signaler. Vous pouvez aussi utiliser les boîtes de dialogue de signalement pour envoyer des messages directs à d'autres utilisateurs. Si vous voyez un problème, :flag_black: signalez-le ! + Ce badge est accordé la première fois que vous signalez un message. Les signalements sont essentiels à la santé de votre communauté. Si vous remarquez des messages nécessitant l'intervention d'un modérateur n'hésitez pas à les signaler. Si vous voyez un problème, :flag_black: signalez-le ! promoter: name: Ambassadeur description: A invité un utilisateur @@ -3138,7 +3427,7 @@ fr: name: Fou amoureux description: A utilisé 50 likes en un jour 20 fois long_description: | - Ce badge est accordé lorsque vous utilisez la totalité vos 50 J'aime par jour pendant 20 jours. Whaou ! Vous êtes un modèle d'encouragement régulier des membres de la communauté ! + Ce badge est accordé lorsque vous utilisez la totalité vos 50 J'aime par jour pendant 20 jours. Whaou ! Vous êtes un modèle d'encouragement pour les membres de la communauté ! thank_you: name: "Merci " description: A 20 messages ayant reçu un J'aime et a donné 10 j'aime @@ -3152,8 +3441,7 @@ fr: empathetic: name: Empathique description: A 500 messages ayant reçu un J'aime et a donné 1000 J'aime - long_description: | - Ce badge est accordé quand vous avez reçu 500 J'aime et en avez donné 1000 ou plus en retour. Whaou ! Vous êtes un modèle de générosité et d'amour mutuel :two_hearts:. + long_description: "Ce badge est accordé quand vous avez reçu 500 J'aime et en avez donné 1000 ou plus en retour. Whaou ! Vous êtes un modèle de générosité et d'amour mutuel :two_hearts:. \n" first_emoji: name: Premier Emoji description: A utilisé un emoji dans un message @@ -3162,11 +3450,13 @@ fr: first_mention: name: Première mention description: A mentionné un utilisateur dans un message - long_description: "Ce badge est accordé la première fois que vous mentionnez le @pseudo de quelqu'un dans votre message. Chaque mention génère une notification à cette personne pour qu'elle soit informée de votre message. Il suffit de commencer à taper @ (arobase) pour mentionner un utilisateur ou, si autorisé, un groupe – c'est un moyen pratique de porter quelque chose à leur attention." + long_description: | + Ce badge est accordé la première fois que vous mentionnez le @pseudo de quelqu'un dans votre message. Chaque mention génère une notification à cette personne pour qu'elle soit informée de votre message. Il suffit de commencer à taper @ (arobase) pour mentionner un utilisateur ou, si autorisé, un groupe – c'est un moyen pratique de porter quelque chose à leur attention. first_onebox: name: Premier onebox description: A inséré un lien qui a été transformé en onebox - long_description: "Ce badge est accordé la première fois que vous publiez un lien seul sur une ligne, qui a ensuite été développé automatiquement dans un onebox avec un bref résumé du lien, un titre, et (le cas échéant) une image." + long_description: | + Ce badge est accordé la première fois que vous publiez un lien seul sur une ligne, qui a été développé automatiquement dans un onebox avec un bref résumé, un titre, et (le cas échéant) une image. first_reply_by_email: name: Première réponse par courriel description: A répondu à un message par courriel @@ -3180,15 +3470,18 @@ fr: enthusiast: name: Passionné description: A visité 10 jours - long_description: Ce badge est décerné pour avoir visité 10 jours consécutifs. Merci d'être resté avec nous pendant plus d'une semaine ! + long_description: | + Ce badge est décerné pour avoir visité 10 jours consécutifs. Merci d'être resté avec nous pendant plus d'une semaine ! aficionado: name: Aficionado description: A visité 100 jours - long_description: Ce badge est décerné pour avoir visité 100 jours consécutifs. C'est plus de trois mois ! + long_description: | + Ce badge est décerné pour avoir visité 100 jours consécutifs. C'est plus de trois mois ! devotee: name: Adepte description: A visité 365 jours - long_description: "Ce badge est décerné pour avoir visité 365 jours consécutifs. Waouh, une année entière !" + long_description: | + Ce badge est décerné pour avoir visité 365 jours consécutifs. Waouh, une année entière ! badge_title_metadata: "%{display_name} badge sur %{site_title}" admin_login: success: "Courriel envoyé" @@ -3212,7 +3505,7 @@ fr: button: "Créer" title: "Créer un compte administrateur" help: "créez un nouveau compte pour commencer" - no_emails: "Malheureusement aucune adresse courriel d'administrateur n'a été définie lors de la configuration ; finaliser la configuration peut être compliqué." + no_emails: "Malheureusement aucune adresse courriel d'administrateur n'a été définie lors de la configuration. Merci d'ajouter un courriel de développeur dans le fichier de configuration ou de créer un compte administrateur depuis le console." confirm_email: title: "Confirmer votre adresse courriel" message: "

Nous avons envoyé un courriel d’activation à %{email}. Veuillez suivre les instructions du courriel pour activer votre compte.

S'il n'est pas réceptionné, assurez-vous que l'adresse courriel est correctement configurée pour votre Discourse et vérifiez vos courriers indésirables.

" @@ -3315,10 +3608,10 @@ fr: fields: favicon_url: label: "Petite icône" - description: "Icône utilisée pour représenter le site dans les navigateurs Web et qui rend bien à de petites tailles comme 32px par 32px. " + description: "Icône utilisée pour représenter le site dans les navigateurs Web et qui rend bien à de petites tailles comme 32px par 32px. PNG ou JPG recommandés." apple_touch_icon_url: label: "Grande icône" - description: "Icône utilisée pour représenter le site sur les appareils modernes et que rend bien à des tailles plus grandes. La taille minimale conseillée est de 144px par 144px." + description: "Icône utilisée pour représenter le site sur les appareils modernes et que rend bien à des tailles plus grandes. La taille minimale conseillée est de 512px par 512px." homepage: description: "Nous recommandons d'afficher les sujets récents sur votre page d'accueil mais vous pouvez choisir d'y afficher les catégories (groupes de sujets) si vous préférez." title: "Page d'accueil" @@ -3327,8 +3620,14 @@ fr: choices: latest: label: "Sujets récents" - categories: - label: "Catégories" + categories_only: + label: "Catégories seules" + categories_with_featured_topics: + label: "Catégories avec sujets à la une" + categories_and_latest_topics: + label: "Catégories et sujets récents" + categories_and_top_topics: + label: "Catégories et meilleurs sujets" emoji: title: "Emoji" description: "Quel style d'Emoji préférez-vous pour votre communauté ? Vous pouvez ajouter des Emoji supplémentaires dans Administration, Personnaliser, Emoji." @@ -3354,3 +3653,8 @@ fr: linked: '%{username} a créé un lien vers votre message posté dans « %{topic} » - %{site_title}' confirm_title: 'Notifications activées - %{site_title}' confirm_body: 'Les notifications ont été activées.' + staff_action_logs: + not_found: "non trouvé" + unknown: "inconnu" + user_merged: "%{username} a être fusionné avec ce compte" + user_delete_self: "Supprimer par l'utilisateur depuis %{url}" diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml index 2b9231fbf1..91cfd1aa2a 100644 --- a/config/locales/server.gl.yml +++ b/config/locales/server.gl.yml @@ -77,14 +77,14 @@ gl: start_discussion: "Comezar a discusión" continue: "Continuar a discusión" more_replies: - one: Unha resposta máis - other: '%{count} respostas máis' + one: "Unha resposta máis" + other: "%{count} respostas máis" loading: "Cargando a discusión..." permalink: "Ligazón permanente" in_reply_to: "â–¶ %{username}" replies: - one: Unha resposta - other: '%{count} respostas' + one: "Unha resposta" + other: "%{count} respostas" no_mentions_allowed: "Sentímolo pero non podes mencionar outros usuarios" invalid_characters: "contén caracteres incorrectos" next_page: "páxina seguinte →" @@ -118,8 +118,8 @@ gl: trust_level_4: "nivel_de_confianza_4" education: until_posts: - one: Unha publicación - other: '%{count} publicacións' + one: "Unha publicación" + other: "%{count} publicacións" activerecord: attributes: category: @@ -172,41 +172,41 @@ gl: title: "líder" rate_limiter: hours: - one: Unha hora - other: '%{count} horas' + one: "Unha hora" + other: "%{count} horas" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mes - other: '%{count}mes' + one: "1mes" + other: "%{count}mes" x_months: - one: 1mes - other: '%{count}mes' + one: "1mes" + other: "%{count}mes" about_x_years: - one: 1ano - other: '%{count}ano' + one: "1ano" + other: "%{count}ano" over_x_years: - one: '> 1ano' - other: '> %{count}ano' + one: "> 1ano" + other: "> %{count}ano" almost_x_years: - one: 1ano - other: '%{count}ano' + one: "1ano" + other: "%{count}ano" distance_in_words_verbose: half_a_minute: "agora mesmiño" password_reset: @@ -244,10 +244,6 @@ gl: title: 'Gústame' description: 'Gústame esta publicación' long_form: 'gustoume isto' - vote: - title: 'Votar' - description: 'Votar por esta publicación' - long_form: 'votei esta publicación' topic_flag_types: spam: title: 'Spam' @@ -335,9 +331,6 @@ gl: num_clicks: "Clics" num_topics: "Temas" num_users: "Usuarios" - top_referred_topics: - xaxis: "Tema" - num_clicks: "Clics" page_view_anon_reqs: title: "Anónimo" xaxis: "Día" @@ -381,7 +374,6 @@ gl: xaxis: "Día" yaxis: "Total" mobile_visits: - title: "Visitas de usuarios" xaxis: "Día" yaxis: "Número de visitas" site_settings: @@ -429,7 +421,6 @@ gl: subject_template: "O convite en bloque procesouse correctamente" page_not_found: see_more: "Máis" - search_google: "Google" terms_of_service: title: "Termos do servizo" about: "Sobre" diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index a4f9cec205..4be76b3b7d 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -88,31 +88,31 @@ he: odd: חייב להיות ××™-זוגי record_invalid: 'בדיקה נכשלה: %{errors}' restrict_dependent_destroy: - one: "×œ× × ×™×ª×Ÿ למחוק בגלל קיומה של רשומה תלויה %{record}" - many: "×œ× × ×™×ª×Ÿ למחוק רשומה בגלל קיומה של רשומה תלויה %{record}" + one: "×œ× × ×™×ª×Ÿ להסיר בגלל קיומה של רשומה תלויה %{record}" + many: "×œ× × ×™×ª×Ÿ להסיר רשומה בגלל קיומה של רשומה תלויה %{record}" too_long: - many: ×רוך מידי (×”×ž×§×¡×™×ž×•× ×”×פשרי ×”×•× %{count} תוי×) one: ×רוך מידי (×”×ž×§×¡×™×ž×•× ×”×פשרי ×”×•× ×ª×• ×חד) - other: ×רוך מידי (×”×ž×§×¡×™×ž×•× ×”×פשרי ×”×•× %{count} תוי×) two: ×רוך מידי (×”×ž×§×¡×™×ž×•× ×”×פשרי ×”×•× %{count} תוי×) + many: ×רוך מידי (×”×ž×§×¡×™×ž×•× ×”×פשרי ×”×•× %{count} תוי×) + other: ×רוך מידי (×”×ž×§×¡×™×ž×•× ×”×פשרי ×”×•× %{count} תוי×) too_short: - many: קצר מידי (×”×ž×™× ×™×ž×•× ×”× ×“×¨×© ×”×•× %{count} תוי×) one: קצר מידי (×”×ž×™× ×™×ž×•× ×”× ×“×¨×© ×”×•× ×ª×• ×חד) - other: קצר מידי (×”×ž×™× ×™×ž×•× ×”× ×“×¨×© ×”×•× %{count} תוי×) two: קצר מידי (×”×ž×™× ×™×ž×•× ×”× ×“×¨×© ×”×•× %{count} תוי×) + many: קצר מידי (×”×ž×™× ×™×ž×•× ×”× ×“×¨×© ×”×•× %{count} תוי×) + other: קצר מידי (×”×ž×™× ×™×ž×•× ×”× ×“×¨×© ×”×•× %{count} תוי×) wrong_length: - many: ב×ורך שגוי (צריך להיות %{count} תוי×) one: ב×ורך שגוי (צריך להיות ב×ורך תו ×חד) - other: ב×ורך שגוי (צריך להיות %{count} תוי×) two: ב×ורך שגוי (צריך להיות %{count} תוי×) + many: ב×ורך שגוי (צריך להיות %{count} תוי×) + other: ב×ורך שגוי (צריך להיות %{count} תוי×) other_than: "צריך להיות שונה מ-%{count}" template: body: 'היו בעיות ×¢× ×”×©×“×•×ª הב××™×:' header: - many: '%{count} שגי×ות מנעו מ-%{model} להישמר.' one: שגי××” מנעה מ-%{model} להישמר. - other: '%{count} שגי×ות מנעו מ-%{model} להישמר.' two: '%{count} שגי×ות מנעו מ-%{model} להישמר.' + many: '%{count} שגי×ות מנעו מ-%{model} להישמר.' + other: '%{count} שגי×ות מנעו מ-%{model} להישמר.' embed: load_from_remote: "×רעה שגי××” בטעינת הפוסט ×”×–×”." site_settings: @@ -145,10 +145,10 @@ he: reading_time: "זמן קרי××”" likes: "לייקי×" too_many_replies: - many: ×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª ל-%{count} תגובות ל×ותו הנוש×. - one: ×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª לתגובה ×חת ל×ותו הנוש×. - other: ×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª ל-%{count} תגובות ל×ותו הנוש×. - two: ×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª ל-%{count} תגובות ל×ותו הנוש×. + one: "×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª לתגובה ×חת ל×ותו הנוש×." + two: "×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª ל-%{count} תגובות ל×ותו הנוש×." + many: "×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª ל-%{count} תגובות ל×ותו הנוש×." + other: "×נחנו מצטערי×, ×בל ×ž×©×ª×ž×©×™× ×—×“×©×™× ×ž×•×’×‘×œ×™× ×–×ž× ×™×ª ל-%{count} תגובות ל×ותו הנוש×." embed: start_discussion: "התחלת דיון" continue: "המשך דיון" @@ -158,49 +158,49 @@ he: no_hosts: "××£ שרת ×œ× ×”×•×’×“×¨ לשילוב." configure: "הגדרת שילוב (Embedding)" more_replies: - many: עוד %{count} תגובות - one: עוד תגובה ×חת - other: עוד %{count} תגובות - two: עוד %{count} תגובות + one: "עוד תגובה ×חת" + two: "עוד %{count} תגובות" + many: "עוד %{count} תגובות" + other: "עוד %{count} תגובות" loading: "טוען דיון..." permalink: "קישור" imported_from: "×–×” × ×•×©× ×“×™×•×Ÿ מלווה לערך המקורי ב- %{link}" in_reply_to: "â—„ %{username}" replies: - many: '%{count} תגובות' - one: תגובה ×חת - other: '%{count} תגובות' - two: '%{count} תגובות' + one: "תגובה ×חת" + two: "%{count} תגובות" + many: "%{count} תגובות" + other: "%{count} תגובות" no_mentions_allowed: "מצטערי×, ×ך ××™× ×›× ×™×›×•×œ×™× ×œ×זכר ×ž×©×ª×ž×©×™× ×חרי×." too_many_mentions: - many: מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק %{count} ×ž×©×ª×ž×©×™× ×‘×¤×•×¡×˜ - one: מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק משתמש ×חד בפוסט - other: מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק %{count} ×ž×©×ª×ž×©×™× ×‘×¤×•×¡×˜ - two: מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק %{count} ×ž×©×ª×ž×©×™× ×‘×¤×•×¡×˜ + one: "מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק משתמש ×חד בפוסט" + two: "מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק %{count} ×ž×©×ª×ž×©×™× ×‘×¤×•×¡×˜" + many: "מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק %{count} ×ž×©×ª×ž×©×™× ×‘×¤×•×¡×˜" + other: "מצטערי×, ××ª× ×™×›×•×œ×™× ×œ×זכר רק %{count} ×ž×©×ª×ž×©×™× ×‘×¤×•×¡×˜" no_mentions_allowed_newuser: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×œ× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ ×ž×©×ª×ž×©×™× ×חרי×." too_many_mentions_newuser: - many: 'מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ רק %{count} ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×¤×•×¡×˜. ' - one: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×זכר רק משתמש ×חד בפוסט. - other: 'מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ רק %{count} ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×¤×•×¡×˜. ' - two: 'מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ רק %{count} ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×¤×•×¡×˜. ' + one: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×זכר רק משתמש ×חד בפוסט." + two: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ רק %{count} ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×¤×•×¡×˜. " + many: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ רק %{count} ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×¤×•×¡×˜. " + other: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×–×›×™×¨ רק %{count} ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×¤×•×¡×˜. " no_images_allowed: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×œ× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ תמונות לפוסטי×." too_many_images: - many: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} תמונות לפוסט. - one: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק תמונה ×חת לפוסט. - other: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} תמונות לפוסט. - two: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} תמונות לפוסט. + one: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק תמונה ×חת לפוסט." + two: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} תמונות לפוסט." + many: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} תמונות לפוסט." + other: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} תמונות לפוסט." no_attachments_allowed: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×œ× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ ×§×‘×¦×™× ×œ×¤×•×¡×˜×™×." too_many_attachments: - many: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×¦×™×¨×•×¤×™× ×œ×¤×•×¡×˜. - one: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק צירוף ×חד לפוסט. - other: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×¦×™×¨×•×¤×™× ×œ×¤×•×¡×˜. - two: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×¦×™×¨×•×¤×™× ×œ×¤×•×¡×˜. + one: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק צירוף ×חד לפוסט." + two: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×¦×™×¨×•×¤×™× ×œ×¤×•×¡×˜." + many: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×¦×™×¨×•×¤×™× ×œ×¤×•×¡×˜." + other: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×¦×™×¨×•×¤×™× ×œ×¤×•×¡×˜." no_links_allowed: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×œ× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ ×§×™×©×•×¨×™× ×œ×¤×•×¡×˜×™×." too_many_links: - many: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×§×™×©×•×¨×™× ×‘×¤×•×¡×˜. - one: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק קישור ×חד בפוסט. - other: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×§×™×©×•×¨×™× ×‘×¤×•×¡×˜. - two: מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×§×™×©×•×¨×™× ×‘×¤×•×¡×˜. + one: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק קישור ×חד בפוסט." + two: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×§×™×©×•×¨×™× ×‘×¤×•×¡×˜." + many: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×§×™×©×•×¨×™× ×‘×¤×•×¡×˜." + other: "מצטערי×, ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ רק %{count} ×§×™×©×•×¨×™× ×‘×¤×•×¡×˜." spamming_host: "סליחה ×ך ××™× ×›× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ קישור ל×תר ×–×”." user_is_suspended: "×ž×©×ª×ž×©×™× ×ž×•×©×¢×™× ××™× × ×ž×•×¨×©×™× ×œ×¤×¨×¡×." topic_not_found: "משהו השתבש ×ולי × ×•×©× ×–×” נסגר ×ו נמחק בזמן שקר××ª× ×ותו?" @@ -238,7 +238,7 @@ he: user_topics: "נוש××™× ××—×¨×•× ×™× ×©×œ @%{username}" tag: "נוש××™× ×ž×ª×•×™×™×’×™×" badge: "עיטור של %{display_name} ב-%{site_title}" - too_late_to_edit: "פוסט ×–×” נוצר לפני זמן רב מידי. ×œ× × ×™×ª×Ÿ יותר לערוך ×ו למחוק ×ותו." + too_late_to_edit: "פוסט ×–×” נוצר לפני זמן רב מידי. ×œ× × ×™×ª×Ÿ יותר לערוך ×ו להסיר ×ותו." revert_version_same: "הגרסה הנוכחית ×–×”×” לגרסה ×ליה ××ª× ×ž× ×¡×™× ×œ×—×–×•×¨." excerpt_image: "תמונה" queue: @@ -265,10 +265,10 @@ he: title: "בקשת חברות עבור @%{group_name}" education: until_posts: - many: '%{count} פוסטי×' - one: פוסט ×חד - other: '%{count} פוסטי×' - two: '%{count} פוסטי×' + one: "פוסט ×חד" + two: "%{count} פוסטי×" + many: "%{count} פוסטי×" + other: "%{count} פוסטי×" 'new-topic': | ×‘×¨×•×›×™× ×‘××™× ×œ%{site_name} — **תודה ×©×”×ª×—×œ×ª× ×©×™×—×” חדשה! ** -הכותרת נשמעת מעניינת כש××ª× ×§×•×¨××™× ×ותה בקול ר×? ×”×× ×”×™× ×ª×§×¦×™×¨ טוב? @@ -406,26 +406,6 @@ he: ייתכן ותרצו לסגור × ×•×©× ×–×” ב×מצעות :wrench: הניהול (בפינות משמ×ל למעלה ולמטה), כדי שתגובות ×œ× ×™×™×¢×¨×ž×• על גבי כרזה. lounge_welcome: title: "×‘×¨×•×›×™× ×”×‘××™× ×œ×œ×ונג'" - body: |2 - - ברכות!: confetti_ball - - ×× ××ª× ×¨×•××™× × ×•×©× ×–×”, ×§×•×“×ž×ª× ×œ×חרונה ל**משתמשי×** (trust level 3). - - ××ª× ×™×›×•×œ×™× ×¢×›×©×™×• … - * לערוך כותרות של כל × ×•×©× - * לשנות ×ת הקטגוריה של כל × ×•×©× - * ל×פשר מעקב ×חר כל ×”×§×™×©×•×¨×™× ×©×œ×›× (([automatic nofollow]) (http://en.wikipedia.org/wiki/Nofollow) ) יוסר. - * לגשת לקטגוריית הל×ונג' הפרטי הזמינה רק ×œ×ž×©×ª×ž×©×™× ×‘×¨×ž×ª ×מון 3 ומעלה - * להסתיר ספ×× ×‘×¢×–×¨×ª דגל ×חד - - ×”× ×” [רשימת ×”×—×‘×¨×™× ×©×œ×›× ×œ×ž×¢×ž×“ ×–×”(/badges/3/regular). ××ª× ×ž×•×–×ž× ×™× ×œ×”×’×™×“ שלו×. - - תודה על החלק החשוב ש××ª× × ×•×˜×œ×™× ×‘×§×”×™×œ×” שלנו! - - למידע נוסף על רמות ×”×מון, [ר×ו × ×•×©× ×–×”][trust]. שימו לב בבקשה שרק ×—×‘×¨×™× ×©×ž×ž×©×™×›×™× ×œ×¢×ž×•×“ בדירשות ל×ורך זמן נש××¨×™× ×‘×¨×ž×ª ×מון זו). - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "×ודות הקטגוריה %{category}" replace_paragraph: "(החליפו פסקה ר×שונה זו ×¢× ×ª×™×ור קצר של הקטגוריה החדשה שלכ×. ×”× ×—×™×” זו תופיעה ב×זור בחירת הקטגוריה, ××– נסו לשמור על פחות מ 200 ×ותיות. **עד שתערכו תי×ור ×–×” ×ו תיצרו נוש××™×, קטגוריה זו ×œ× ×ª×•×¤×™×¢ בדף הקטגוריות.**)" @@ -439,14 +419,9 @@ he: email_already_used_in_category: "'%{email}' כבר בשימוש על ידי הקטגוריה '%{category_name}'." description_incomplete: "לתי×ור קטגוריה זו צריכה להיות לפחות פסקה ×חת." cannot_delete: - uncategorized: "×œ× × ×™×ª×Ÿ למחוק תוכן ×œ×œ× ×§×˜×’×•×¨×™×”" - has_subcategories: "×œ× × ×™×ª×Ÿ למחוק קטגוריה זו ×ž×©×•× ×©×™×© בה תת-קטגוריות." - topic_exists: - many: ×œ× × ×™×ª×Ÿ למחוק ×ת הקטגוריה הזו ×ž×©×•× ×©×™×© בה %{count} נוש××™×. ×”× ×•×©× ×”×•×ª×™×§ ביותר ×”×•× %{topic_link}. - one: ×œ× × ×™×ª×Ÿ למחוק ×ת הקטגוריה הזו ×ž×©×•× ×©×™×© בה × ×•×©× ×חד. ×”× ×•×©× ×”×•×ª×™×§ ביותר ×”×•× %{topic_link}. - other: ×œ× × ×™×ª×Ÿ למחוק ×ת הקטגוריה הזו ×ž×©×•× ×©×™×© בה %{count} נוש××™×. ×”× ×•×©× ×”×•×ª×™×§ ביותר ×”×•× %{topic_link}. - two: ×œ× × ×™×ª×Ÿ למחוק ×ת הקטגוריה הזו ×ž×©×•× ×©×™×© בה %{count} נוש××™×. ×”× ×•×©× ×”×•×ª×™×§ ביותר ×”×•× %{topic_link}. - topic_exists_no_oldest: "×œ× × ×™×ª×Ÿ למחוק קטגוריה זו ×ž×©×•× ×©×¡×š הנוש××™× ×”×•× %{count}." + uncategorized: "×œ× × ×™×ª×Ÿ להסיר תוכן ×œ×œ× ×§×˜×’×•×¨×™×”" + has_subcategories: "×œ× × ×™×ª×Ÿ להסיר קטגוריה זו ×ž×©×•× ×©×™×© בה תת-קטגוריות." + topic_exists_no_oldest: "×œ× × ×™×ª×Ÿ להסיר קטגוריה זו ×ž×©×•× ×©×¡×š הנוש××™× ×”×•× %{count}." uncategorized_description: "נוש××™× ×©×œ× ×“×•×¨×©×™× ×§×˜×’×•×¨×™×” מסויימת, ×ו ש××™× × ×ž×ª××™×ž×™× ×œ××£ קטגוריה קיימת." trust_levels: newuser: @@ -465,135 +440,135 @@ he: broken: "תמונה זו שבורה" rate_limiter: hours: - many: '%{count} שעות' - one: שעה ×חת - other: '%{count} שעות' - two: '%{count} שעות' + one: "שעה ×חת" + two: "%{count} שעות" + many: "%{count} שעות" + other: "%{count} שעות" minutes: - many: '%{count} דקות' - one: דקה ×חת - other: '%{count} דקות' - two: '%{count} דקות' + one: "דקה ×חת" + two: "%{count} דקות" + many: "%{count} דקות" + other: "%{count} דקות" seconds: - many: '%{count} שניות' - one: שניה ×חת - other: '%{count} שניות' - two: '%{count} שניות' + one: "שניה ×חת" + two: "%{count} שניות" + many: "%{count} שניות" + other: "%{count} שניות" datetime: distance_in_words: half_a_minute: "פחות מדקה" less_than_x_seconds: - many: פחות מ-%{count} שניות - one: פחות משנייה - other: פחות מ-%{count} שניות - two: פחות מ-%{count} שניות + one: "פחות משנייה" + two: "פחות מ-%{count} שניות" + many: "פחות מ-%{count} שניות" + other: "פחות מ-%{count} שניות" x_seconds: - many: '%{count} שניות' - one: שנייה - other: '%{count} שניות' - two: '%{count} שניות' + one: "שנייה" + two: "%{count} שניות" + many: "%{count} שניות" + other: "%{count} שניות" less_than_x_minutes: - many: פחות מ-%{count} דקות - one: פחות מדקה - other: פחות מ-%{count} דקות - two: פחות מ-%{count} דקות + one: "פחות מדקה" + two: "פחות מ-%{count} דקות" + many: "פחות מ-%{count} דקות" + other: "פחות מ-%{count} דקות" x_minutes: - many: '%{count} דקות' - one: דקה - other: '%{count} דקות' - two: '%{count} דקות' + one: "דקה" + two: "%{count} דקות" + many: "%{count} דקות" + other: "%{count} דקות" about_x_hours: - many: '%{count} שעות' - one: שעה - other: '%{count} שעות' - two: '%{count} שעות' + one: "שעה" + two: "%{count} שעות" + many: "%{count} שעות" + other: "%{count} שעות" x_days: - many: '%{count} ימי×' - one: ×™×•× - other: '%{count} ימי×' - two: '%{count} ימי×' + one: "יו×" + two: "%{count} ימי×" + many: "%{count} ימי×" + other: "%{count} ימי×" about_x_months: - many: '%{count} חודשי×' - one: חודש - other: '%{count} חודשי×' - two: '%{count} חודשי×' + one: "חודש" + two: "%{count} חודשי×" + many: "%{count} חודשי×" + other: "%{count} חודשי×" x_months: - many: '%{count} חודשי×' - one: חודש - other: '%{count} חודשי×' - two: '%{count} חודשי×' + one: "חודש" + two: "%{count} חודשי×" + many: "%{count} חודשי×" + other: "%{count} חודשי×" about_x_years: - many: '%{count} שני×' - one: שנה - other: '%{count} שני×' - two: '%{count} שני×' + one: "שנה" + two: "%{count} שני×" + many: "%{count} שני×" + other: "%{count} שני×" over_x_years: - many: יותר מ-%{count} ×©× ×™× - one: יותר משנה - other: יותר מ-%{count} ×©× ×™× - two: יותר מ-%{count} ×©× ×™× + one: "יותר משנה" + two: "יותר מ-%{count} שני×" + many: "יותר מ-%{count} שני×" + other: "יותר מ-%{count} שני×" almost_x_years: - many: '%{count} שני×' - one: שנה - other: '%{count} שני×' - two: '%{count} שני×' + one: "שנה" + two: "%{count} שני×" + many: "%{count} שני×" + other: "%{count} שני×" distance_in_words_verbose: half_a_minute: "ממש עכשיו" less_than_x_seconds: - many: ממש עכשיו - one: ממש עכשיו - other: ממש עכשיו - two: ממש עכשיו + one: "ממש עכשיו" + two: "ממש עכשיו" + many: "ממש עכשיו" + other: "ממש עכשיו" x_seconds: - many: לפני %{count} שניות - one: לפני שנייה - other: לפני %{count} שניות - two: לפני %{count} שניות + one: "לפני שנייה" + two: "לפני %{count} שניות" + many: "לפני %{count} שניות" + other: "לפני %{count} שניות" less_than_x_minutes: - many: לפני פחות מ-%{count} דקות - one: לפני פחות מדקה - other: לפני פחות מ-%{count} דקות - two: לפני פחות מ-%{count} דקות + one: "לפני פחות מדקה" + two: "לפני פחות מ-%{count} דקות" + many: "לפני פחות מ-%{count} דקות" + other: "לפני פחות מ-%{count} דקות" x_minutes: - many: לפני %{count} דקות - one: לפני דקה - other: לפני %{count} דקות - two: לפני %{count} דקות + one: "לפני דקה" + two: "לפני %{count} דקות" + many: "לפני %{count} דקות" + other: "לפני %{count} דקות" about_x_hours: - many: לפני %{count} שעות - one: לפני שעה - other: לפני %{count} שעות - two: לפני %{count} שעות + one: "לפני שעה" + two: "לפני %{count} שעות" + many: "לפני %{count} שעות" + other: "לפני %{count} שעות" x_days: - many: לפני %{count} ×™×ž×™× - one: ×תמול - other: לפני %{count} ×™×ž×™× - two: לפני %{count} ×™×ž×™× + one: "×תמול" + two: "לפני %{count} ימי×" + many: "לפני %{count} ימי×" + other: "לפני %{count} ימי×" about_x_months: - many: לפני בערך %{count} ×—×•×“×©×™× - one: לפני בערך חודש - other: לפני בערך %{count} ×—×•×“×©×™× - two: לפני בערך %{count} ×—×•×“×©×™× + one: "לפני בערך חודש" + two: "לפני בערך %{count} חודשי×" + many: "לפני בערך %{count} חודשי×" + other: "לפני בערך %{count} חודשי×" x_months: - many: לפני %{count} ×—×•×“×©×™× - one: לפני חודש - other: לפני %{count} ×—×•×“×©×™× - two: לפני %{count} ×—×•×“×©×™× + one: "לפני חודש" + two: "לפני %{count} חודשי×" + many: "לפני %{count} חודשי×" + other: "לפני %{count} חודשי×" about_x_years: - many: לפני בערך %{count} ×©× ×™× - one: לפני בערך שנה - other: לפני בערך %{count} ×©× ×™× - two: לפני בערך %{count} ×©× ×™× + one: "לפני בערך שנה" + two: "לפני בערך %{count} שני×" + many: "לפני בערך %{count} שני×" + other: "לפני בערך %{count} שני×" over_x_years: - many: לפני יותר מ %{count} ×©× ×™× - one: לפני יותר משנה - other: לפני יותר מ %{count} ×©× ×™× - two: לפני יותר מ %{count} ×©× ×™× + one: "לפני יותר משנה" + two: "לפני יותר מ %{count} שני×" + many: "לפני יותר מ %{count} שני×" + other: "לפני יותר מ %{count} שני×" almost_x_years: - many: לפני כמעט %{count} ×©× ×™× - one: לפני כמעט שנה - other: לפני כמעט %{count} ×©× ×™× - two: לפני כמעט %{count} ×©× ×™× + one: "לפני כמעט שנה" + two: "לפני כמעט %{count} שני×" + many: "לפני כמעט %{count} שני×" + other: "לפני כמעט %{count} שני×" password_reset: no_token: "מצטערי×, הקישור לשינוי הסיסמה ישן מדי. לחצו על כפתור הכניסה ובחרו ב\"שכחתי ×ת הסיסמה שלי\" כדי לקבל קישור חדש." choose_new: "בחרו סיסמה חדשה" @@ -667,16 +642,10 @@ he: description: 'תנו לייק לפוסט ×–×”' short_description: '×הבו פוסט ×–×”' long_form: 'נתתי לזה לייק' - vote: - title: 'הצבע' - description: 'הצביעו לפוסט ×–×”' - short_description: 'הצביעו עבור פוסט ×–×”' - long_form: '×”×¦×‘×¢×ª× ×œ×¤×•×¡×˜ ×–×”' user_activity: no_default: others: "×ין פעילות." no_bookmarks: - self: "×ין ×œ×›× ×¤×•×¡×˜×™× ×©×¡×•×ž× ×• בסימניה, סימון ×¤×•×¡×˜×™× ×ž×פשר ×œ×›× ×œ×’×©×ª ××œ×™×”× ×‘×§×œ×•×ª בהמשך." others: "×ין סימניות." no_likes_given: self: "×œ× ×¢×©×™×ª× ×œ×™×™×§ ל××£ פוסט." @@ -721,7 +690,7 @@ he: disable_digest_emails: "הפסיקו לשלוח לי סיכומי×" all: "×ל תשלחו ×לי יותר ×ž×™×™×œ×™× ×ž %{sitename}" different_user_description: "××ª× ×›×¨×’×¢ ×ž×—×•×‘×¨×™× ×›×ž×©×ª×ž×© ×חר מ×שר ×ליו שלחנו מייל. ×× × ×”×ª× ×ª×§×•, ×ו עיברו למצב ×נונימי, ונסו שוב." - not_found_description: "מצטערי×, ×œ× ×ž×¦×נו ×ת ביטול המנוי ×”×–×”. ייתכן שהלינק במייל ×©×œ×›× ×›×‘×¨ ×œ× ×‘×ª×•×§×£?" + not_found_description: "מצטערי×, ×œ× ×ž×¦×נו ×ת הקישור לביטול המנוי ×–×”. ייתכן הקישור במייל ×©×œ×›× ×›×‘×¨ ×œ× ×‘×ª×•×§×£?" log_out: "התנתקות" user_api_key: title: "×ישור גישת ×פליקציה" @@ -813,8 +782,6 @@ he: num_users: "משתמשי×" top_referred_topics: title: "נוש××™× ×ž×™×•×—×¡×™×" - xaxis: "נוש×" - num_clicks: "לחיצות" page_view_anon_reqs: title: "×נונימי" xaxis: "יו×" @@ -871,7 +838,6 @@ he: xaxis: "יו×" yaxis: "סה\"×›" mobile_visits: - title: "ביקורי משתמשי×" xaxis: "יו×" yaxis: "מספר ביקורי×" dashboard: @@ -891,10 +857,10 @@ he: failing_emails_warning: 'יש %{num_failed_jobs} עבודות מייל שנכשלו. בידקו ×ת app.yml ×©×œ×›× ×›×“×™ ×œ×•×•×“× ×©×©×¨×ª המייל מוגדר ×›×™×ות. ר×ו ×ת העבודות שנכשלו ב Sidekiq.' subfolder_ends_in_slash: "הגדרות תיקיית המשנה ×©×œ×›× ×œ× × ×›×•× ×•×ª, הנתיב DISCOURSE_RELATIVE_URL_ROOT צריך ×œ×”×¡×ª×™×™× ×‘×œ×•×›×¡×Ÿ." email_polling_errored_recently: - many: ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• %{count} תקלות ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×. - one: ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• תקלה ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×. - other: ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• %{count} תקלות ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×. - two: ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• %{count} תקלות ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×. + one: "ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• תקלה ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." + two: "ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• %{count} תקלות ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." + many: "ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• %{count} תקלות ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." + other: "ניסיונות שליחת ×ž×™×™×œ×™× ×™×¦×¨×• %{count} תקלות ב 24 השעות ×”×חרונות. צפו ×‘×™×•×ž× ×™× ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." bad_favicon_url: "×” favicon ×œ× ×¢×•×œ×”. ×× × ×‘×“×§×• ×ת הגדרת ×” favicon_url ב הגדרות ×”×תר." poll_pop3_timeout: "החיבור לשרת POP3 התנתק. דו×\"ל נכנס ×œ× ×™×›×•×œ להשלף ו×ינו מ×וחזר. ×× × ×‘×“×§×• ×ת הגדרות ×”-POP3 ×©×œ×›× ×•×ת ספק השירות." poll_pop3_auth_error: "החיבור לשרת POP3 נכשל בשל שגי×ת הזדהות. ×× × ×‘×“×§×• ×ת הגדרות ×”-POP3 שלכ×." @@ -929,7 +895,7 @@ he: download_remote_images_max_days_old: "×œ× ×œ×”×•×¨×™×“ תמונות מרוחקות עבור ×¤×•×¡×˜×™× ×‘× ×™ יותר מ n ימי×." disabled_image_download_domains: "תמונות מרחוק ×œ×¢×•×œ× ×œ× ×™×•×¨×“×• ×ž×ž×ª×—×ž×™× (domains) ×לו. " editing_grace_period: "ל (n) שניות ל×חר פרסו×, עריכה ×œ× ×ª×™×¦×•×¨ גרסה חדשה בהיסטוריית הפוסט." - post_edit_time_limit: "×”×¢×•×¨×›×™× ×™×›×•×œ×™× ×œ×¢×¨×•×š ×ו למחוק ×ת הפוסט ×©×œ×”× ×‘×ž×©×š (n) דקות ל×חר הפרסו×. הזינו 0 ×›\"תמיד\"." + post_edit_time_limit: "×”×¢×•×¨×›×™× ×™×›×•×œ×™× ×œ×¢×¨×•×š ×ו להסיר ×ת הפוסט ×©×œ×”× ×‘×ž×©×š (n) דקות ל×חר הפרסו×. הזינו 0 ×›\"תמיד\"." edit_history_visible_to_public: "×פשרו ×œ×›×•×œ× ×œ×¨×ות גרס×ות קודמות של פוסט ערוך. ×›×שר ×פשרות זו מנוטרלת, רק חברי צוות ×™×›×•×œ×™× ×œ×¦×¤×•×ª בהן." delete_removed_posts_after: "×¤×•×¡×˜×™× ×©×”×•×¡×¨×• על ידי ×ž×—×‘×¨×™×”× ×™×ž×—×§×• ב×ופן ×וטומטי ל×חר (n) שעות. ×× ×”×’×“×¨×” זו מכוונת ל-0, ×¤×•×¡×˜×™× ×™×ž×—×§×• מיידית." max_image_width: "הרוחב המקסימלי של תצוגת תמונה מוקטנת בפוסט" @@ -989,7 +955,6 @@ he: post_menu: "החליטו ×ילו ×¤×¨×™×˜×™× ×ž×•×¤×™×¢×™× ×‘×ª×¤×¨×™×˜ הפוסט, וב××™×–×” סדר. למשל like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "פריטי התפריט להסתרה כברירת מחדל בתפריט הפוסט, ××œ× ×× ×›×Ÿ נלחץ לחצן ההרחבה." share_links: "החליטו ×ילו ×¤×¨×™×˜×™× ×™×•×¤×™×¢×• בתיבת השיתוף, וב××™×–×” סדר." - track_external_right_clicks: "עקבו ×חר ×§×™×©×•×¨×™× ×—×™×¦×•× ×™×™× ×©×¢×œ×™×”× × ×œ×—×¥ הכפתור הימני (למשל: פתיחה בט×ב חדש) מנוטרל כברירת מחדל כיוון שזה כותב מחדש URLs" site_contact_username: "×©× ×ž×©×ª×ž×©/ת תקין של ×יש צוות ממנו ישלחו כל ההודעות ×וטומטיות. ×× ×™×©×ר ריק חשבון ברירת המחדל של המערכת ישמש לכך." send_welcome_message: "שלחו לכל ×”×ž×©×ª×ž×©×™× ×”×—×“×©×™× ×”×•×“×¢×ª \"×‘×¨×•×›×™× ×”×‘××™×\" ×¢× ×”×“×¨×›×” ר×שונית כיצד להתחיל." suppress_reply_directly_below: "×ל תציגו ×ת סך התגובות המצטבר בפוסט ×›×שר ישנה תגובה ישירה ×חת לפוסט ×–×”." @@ -1021,7 +986,7 @@ he: min_admin_password_length: "×ורך סיסמה מינימלית ל×דמיניסטרטור." password_unique_characters: "מספר מינימלי של ×ª×•×•×™× ×™×™×—×•×“×™×™× ×©×—×™×™×‘×™× ×œ×”×™×•×ª בסיסמ×ות." block_common_passwords: "×ל ת×פשרו סיסמ×ות מתוך 10,000 הסיסמ×ות הנפוצות ביותר." - enable_sso: "×פשרו התחברות יחידה (Single Sign On) ב×מצעות ×תר חיצוני (×-×–-×”-ר-×”: כתובות המייל של ×ž×©×ª×ž×©×™× *חייבות* לעבור ×ימות על ידי ×תר חיצוני!)" + enable_sso: "הפעלת התחברות יחידה (Single Sign On) ב×מצעות ×תר חיצוני (×-×–-×”-ר-×”: כתובות המייל של ×ž×©×ª×ž×©×™× *חייבות* לעבור ×ימות על ידי ×תר חיצוני!)" verbose_sso_logging: "×¨×™×©×•× ×™×•×ž× ×™× ×ž×¤×•×¨×˜×™× ×‘× ×•×’×¢ לדי×גנוסטיקות SSO ל /logs" enable_sso_provider: "הטמיעו ×ת פרוטוקול הספק Discourse SSO בנקודת הקצה /session/sso_provider, דורש כיוון של sso_secret" sso_url: "URL of single sign on endpoint (must include http:// or https://)" @@ -1033,14 +998,14 @@ he: sso_overrides_avatar: "מעקף ×ווט×ר של משתמש בעזרת ×ווטר ×תר חיצוני מ-SSO Payload. ×× ×פשרות זו מופעלת, מומלץ מ×וד לבטל ×ת ×”×פשרות להעל×ת ×ווטר." sso_not_approved_url: "SSO של חשבונות ×©×œ× ×ושרו יופנו ל URL ×–×”" sso_allows_all_return_paths: "×ל תגבילו ×ת שמות ×”×ž×ª×—× ×©×œ נתיבי החזרה (return_paths) ×©× ×™×ª× ×™× ×¢×œ ידי ×”-SSO (כברירת מחדל, נתיבי החזרה ×—×™×™×‘×™× ×œ×”×™×•×ª ב×תר הנוכחי)" - allow_new_registrations: "×פשרו הרשמות ×ž×©×ª×ž×©×™× ×—×“×©×™×. בטלו סימון ×–×” כדי למנוע יצירת חשבונות חדשי×." + allow_new_registrations: "הפעלת הרשמות ×ž×©×ª×ž×©×™× ×—×“×©×™×. בטלו סימון ×–×” כדי למנוע יצירת חשבונות חדשי×." enable_signup_cta: "הציגו מודעה ×œ×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×—×•×–×¨×™× ×©×ž×¦×™×¢×” ×œ×”× ×œ×”×¨×©× ×›×“×™ לקבל חשבון." enable_yahoo_logins: "×יפשור ×ימות של Yahoo" - enable_google_oauth2_logins: "×פשרו הזדהות ב×מצעות Oauth2 של גוגל. זהו מנגנון ההזדהות שנתמך כרגע על ידי גוגל. דורש מפתח וסיסמה." + enable_google_oauth2_logins: "הפעלת הזדהות ב×מצעות Oauth2 של גוגל. זהו מנגנון ההזדהות שנתמך כרגע על ידי גוגל. דורש מפתח וסיסמה." google_oauth2_client_id: "זהות לקוח (Client ID) של ×פליקציית ×”-Google שלך." google_oauth2_client_secret: "קוד סודי של לקוח (client secret) של ×פליקציית Google." - enable_twitter_logins: "×פשרו ×ימות Twitter, מצריך twitter_consumer_key ו twitter_consumer_secret" - enable_instagram_logins: "×פשרו ×ימות ×ינסטגר×, מצריך instagram_consumer_key ו instagram_consumer_secret" + enable_twitter_logins: "הפעלת ×ימות Twitter, מצריך twitter_consumer_key ו twitter_consumer_secret" + enable_instagram_logins: "הפעלת ×ימות ×ינסטגר×, מצריך instagram_consumer_key ו instagram_consumer_secret" instagram_consumer_key: "מפתח ל×ימות ×ינסטגר×" instagram_consumer_secret: "סוד ל×ימות ×ינסטגר×" enable_facebook_logins: "×יפשור ×ימות פייסבוק, מצריך facebook_app_id ו facebook_app_secret" @@ -1049,7 +1014,7 @@ he: enable_github_logins: "×פשור ×ימות Github, מצריך github_client_id ו github_client_secret" github_client_id: "מזהה לקוח ל×ימות Github, ×¨×©×•× ×‘ https://github.com/settings/applications" github_client_secret: "סוד לקוח ל×ימות Github, ×¨×©×•× ×‘ https://github.com/settings/applications" - readonly_mode_during_backup: "×פשרו מצב של קרי××” בלבד בזמן גיבוי" + readonly_mode_during_backup: "הפעלת מצב קרי××” בלבד בזמן גיבוי" allow_restore: "×פשר שחזור, ×שר יכול להחליף ×ת כל(!) המידע ב×תר! הותירו על \"שלילי\" (false) ××œ× ×× ×›×Ÿ ××ª× ×ž×ª×›× × ×™× ×œ×©×—×–×¨ גיבוי." maximum_backups: "המספר המקסימלי של ×’×™×‘×•×™×™× ×œ×©×ž×™×¨×” על הכונן. ×’×™×‘×•×™×™× ×™×©× ×™× ×™×•×ª×¨ ימחקו ×וטומטית" automatic_backups_enabled: "הרץ ×’×™×‘×•×™×™× ××•×˜×•×ž×˜×™× ×›×ž×• שמוגדר בתדירות הגיבויי×" @@ -1102,7 +1067,7 @@ he: png_to_jpg_quality: "×”×יכות של קובץ JPG שמומר (1 הנמוכה ביותר, 99 הטובה ביותר, 100 לניטרול)." allow_staff_to_upload_any_file_in_pm: "×פשרו לחברי צוות להעלות כל קובץ בהודעה פרטית." strip_image_metadata: "הסרת מטה-ד×טה מהתמונה" - enable_flash_video_onebox: "×פשרו הטמעת קישורי swf ו-flv (פל×ש של ×דובי) ב Oneboxes. ×זהרה: עלול ×œ×”×‘×™× ×œ×‘×¢×™×•×ª ×בטחה ב×תר." + enable_flash_video_onebox: "הפעלת הטמעת קישורי swf ו-flv (פל×ש של ×דובי) ב Oneboxes. ×זהרה: עלול ×œ×”×‘×™× ×œ×‘×¢×™×•×ª ×בטחה ב×תר." default_invitee_trust_level: "ברירת מחדל של רמת ×מון (0-4) של ×ž×©×ª×ž×©×™× ×ž×•×–×ž× ×™×." default_trust_level: "רמת ×מון (0-4) לכל ×”×ž×©×ª×ž×©×™× ×”×—×“×©×™×. ×זהרה! שינוי של משתנה ×–×” ×©× ××ª×›× ×‘×¡×™×›×•×Ÿ רציני לספ××." tl1_requires_topics_entered: "כמה נוש××™× ×ž×©×ª×ž×©×™× ×—×“×©×™× ×¦×¨×™×›×™× ×œ×”×ª×—×™×œ עד שישודרגו לרמת ×מון 1." @@ -1189,12 +1154,11 @@ he: num_flaggers_to_close_topic: "מספר מינימלי של ×“×’×œ×™× ×©×•× ×™× ×©× ×“×¨×© כדי להשהות ב×ופן ×וטומטי ×פשות להתערב בנוש×" num_flags_to_close_topic: "מספר מינימלי של ×“×’×œ×™× ×¤×¢×™×œ×™× ×©× ×“×¨×© כדי להשהות ב×ופן ×וטומטי ×ת היכולת להתערב בנוש×" num_hours_to_close_topic: "מספר שעות לעצירת × ×•×©× ×œ×¦×•×¨×š התערבות." - auto_respond_to_flag_actions: "×פשרו תגובה ×וטמטית ×¢× ×”×¡×¨×ª דגל." + auto_respond_to_flag_actions: "הפעלת תגובה ×וטמטית ×¢× ×”×¡×¨×ª דגל." min_first_post_typing_time: "זמן מינימלי במילי-שניות שמשתמש חייב להקיש בזמן הפוסט הר×שון, ×× ×”×¡×£ ×œ× × ×¢×‘×¨ הפוסט ×וטומטית יכנס לתור של ×לו ×©×¦×¨×™×›×™× ×ישור. קיבעו 0 כדי לנטרל (×œ× ×ž×•×ž×œ×¥)" - reply_by_email_enabled: "×פשרו תגובה לנוש××™× ×‘×מצעות הדו×\"ל." + reply_by_email_enabled: "הפעלת תגובה לנוש××™× ×‘×מצעות הדו×\"ל." reply_by_email_address: "תבנית עבור כתובות מייל של מענה ב×מצעות ×ימייל, למשל: {reply_key}@reply.example.com ×ו replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "רשימה של כמה תבניות לתגובות במייל ב×מצעות כתובות מייל נכנסות. למשל: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "מנעו מ-Discourse ממשלוח דו×\"ל כלשהו" strip_images_from_short_emails: "הסרת תמונות מדו×\"ל בגודל של פחות מ-2800 בתי×" short_email_length: "×ורכו של דו×\"ל קצר ×‘×‘×ª×™× (Bytes)" display_name_on_email_from: "הצגת שמות מל××™× ×‘×©×“×” ה״מ×ת״ במיילי×" @@ -1234,9 +1198,8 @@ he: minimum_topics_similar: "כמה נוש××™× ×¦×¨×™×›×™× ×œ×”×ª×§×™×™× ×œ×¤× ×™ שנוש××™× ×“×•×ž×™× ×™×•×¦×’×• בעת חיפוש × ×•×©× ×—×“×©." relative_date_duration: "מספר ×”×™×ž×™× ×œ×חר ×¤×¨×¡×•× ×‘×”× ×ª×ריך הפוסט מופיע כת×ריך יחסי (7 ימי×) לעומת ת×ריך רגיל (20 בפברו×ר)." delete_user_max_post_age: "×ל תפ×שרו מחיקת ×ž×©×ª×ž×©×™× ×©×”×¤×•×¡×˜ הר×שון ×©×œ×”× ×”×•× ×‘×Ÿ יותר מ-(x) ימי×." - delete_all_posts_max: "מספר ×”×¤×•×¡×˜×™× ×”×ž×§×¡×™×ž×œ×™ שניתן למחוק בבת ×חת ×¢× ×›×¤×ª×•×¨ המחיקה של כל הפוסטי×. ×× ×œ×ž×©×ª×ž×© יש יותר מהמספר ×”×–×” של פוסטי×, ×”×¤×•×¡×˜×™× ×œ× ×™×›×•×œ×™× ×œ×”×ž×—×§ ×›×•×œ× ×‘×™×—×“ והמשתמש ×œ× ×™×›×•×œ להמחק." + delete_all_posts_max: "מספר ×”×¤×•×¡×˜×™× ×”×ž×§×¡×™×ž×œ×™ שניתן להסיר בבת ×חת ×¢× ×›×¤×ª×•×¨ ההסרה של כל הפוסטי×. ×× ×œ×ž×©×ª×ž×© יש יותר מהמספר ×”×–×” של פוסטי×, ×”×¤×•×¡×˜×™× ×œ× ×™×›×•×œ×™× ×œ×”×ž×—×§ ×›×•×œ× ×‘×™×—×“ והמשתמש ×œ× ×™×›×•×œ להמחק." email_editable: "×פשרו ×œ×ž×©×ª×ž×©×™× ×œ×©× ×•×ª ×ת כתובת המייל ×©×œ×”× ×œ×חר ההרשמה." - logout_redirect: "כתובת להפנות ×ליה ×ת ×”×“×¤×“×¤× ×™× ×œ×חר התנתקות (למשל: http://somesite.com/logout)" allow_uploaded_avatars: "×פשרו ×œ×ž×©×ª×ž×©×™× ×œ×”×¢×œ×•×ª תמונות פרופיל משלה×." allow_animated_avatars: "×פשרו ×œ×ž×©×ª×ž×©×™× ×œ×”×©×ª×ž×© ב×נימציית gif בתור תמונת פרופיל. ×זהרה: הריצו משימת rake של avatars:refresh ל×חר שינוי הגדרה זו." allow_animated_thumbnails: "יצירת תמונות ×נימציה מוקטנות קטנות של קבצי ×נימציית gif." @@ -1296,7 +1259,7 @@ he: bootstrap_mode_min_users: "מספר ×ž×©×ª×ž×©×™× ×ž×™× ×™×ž×œ×™ שנדרש כדי לנטרל מצב ×יתחול (קבעו ל 0 כדי לנטרל)" prevent_anons_from_downloading_files: "מונע ×ž×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×œ×”×•×¨×™×“ צרופות (attachments). ×זהרה: דבר ×–×” ימנע מכל מש×ב ש×ינו תמונה ×•×¤×•×¨×¡× ×›×¦×¨×•×¤×” לעבוד." slug_generation_method: "בחרו צורת ייצור slug. צורה של 'encoded' ×ª×’×¨×•× ×œ×ž×—×¨×•×–×•×ª ×¢× ×§×™×“×•×“ ×חוזי×. 'none' ינטרל slug לחלוטין." - enable_emoji: "×פשרו emoji" + enable_emoji: "הפעלת emoji" emoji_set: "×יך ××ª× ××•×”×‘×™× ×ת ×”-emoji שלכ×?" enforce_square_emoji: "חובת ×ž×™×ž×“×™× ×¨×™×‘×•×¢×™×™× ×‘×›×œ ×”-emojis." approve_post_count: "מספר ×”×¤×•×¡×˜×™× ×ž×ž×©×ª×ž×©×™× ×—×“×©×™× ×ו ×‘×¡×™×¡×™×™× ×©×—×™×™×‘×™× ×œ×שר ×ות×" @@ -1396,102 +1359,99 @@ he: not_seen_in_a_month: "ברוך שובכ×! ×œ× ×¨×ינו ××ª×›× ×›×‘×¨ כמה זמן, ××”? ×”× ×” כמה נוש××™× ×¤×•×¤×•×œ××¨×™×™× ×©×”×ª×•×•×¡×¤×• מ××– ×©×”×™×™×ª× ×›×ן." merge_posts: edit_reason: - many: '%{count} ×¤×•×¡×˜×™× ×ž×•×–×’×• על ידי %{username}' - one: פוסט מוזג על ידי %{username} - other: '%{count} ×¤×•×¡×˜×™× ×ž×•×–×’×• על ידי %{username}' - two: '%{count} ×¤×•×¡×˜×™× ×ž×•×–×’×• על ידי %{username}' + one: "פוסט מוזג על ידי %{username}" + two: "%{count} ×¤×•×¡×˜×™× ×ž×•×–×’×• על ידי %{username}" + many: "%{count} ×¤×•×¡×˜×™× ×ž×•×–×’×• על ידי %{username}" + other: "%{count} ×¤×•×¡×˜×™× ×ž×•×–×’×• על ידי %{username}" errors: different_topics: "×œ× × ×™×ª×Ÿ למזג ×¤×•×¡×˜×™× ×©×©×™×™×›×™× ×œ× ×•×©××™× ×©×•× ×™×." different_users: "×œ× × ×™×ª×Ÿ למזג ×¤×•×¡×˜×™× ×©×©×™×™×›×™× ×œ×ž×©×ª×ž×©×™× ×©×•× ×™×." move_posts: new_topic_moderator_post: - many: '%{count} תגובות פוצלו ×œ× ×•×©× ×—×“×©: %{topic_link}' - one: 'תגובה פוצלה ×œ× ×•×©× ×—×“×©: %{topic_link}' - other: '%{count} תגובות פוצלו ×œ× ×•×©× ×—×“×©: %{topic_link}' - two: '%{count} תגובות פוצלו ×œ× ×•×©× ×—×“×©: %{topic_link}' + one: "תגובה פוצלה ×œ× ×•×©× ×—×“×©: %{topic_link}" + two: "%{count} תגובות פוצלו ×œ× ×•×©× ×—×“×©: %{topic_link}" + many: "%{count} תגובות פוצלו ×œ× ×•×©× ×—×“×©: %{topic_link}" + other: "%{count} תגובות פוצלו ×œ× ×•×©× ×—×“×©: %{topic_link}" existing_topic_moderator_post: - many: '%{count} תגובות ×וחדו ×œ× ×•×©× ×§×™×™×: %{topic_link}' - one: 'תגובה ×וחדה ×œ× ×•×©× ×§×™×™×: %{topic_link}' - other: '%{count} תגובות ×וחדו ×œ× ×•×©× ×§×™×™×: %{topic_link}' - two: '%{count} תגובות ×וחדו ×œ× ×•×©× ×§×™×™×: %{topic_link}' - change_owner: - post_revision_text: "בעלות הועברה מהמשתמש %{old_user} ×ל %{new_user}" - deleted_user: "משתמש שנמחק" + one: "תגובה ×וחדה ×œ× ×•×©× ×§×™×™×: %{topic_link}" + two: "%{count} תגובות ×וחדו ×œ× ×•×©× ×§×™×™×: %{topic_link}" + many: "%{count} תגובות ×וחדו ×œ× ×•×©× ×§×™×™×: %{topic_link}" + other: "%{count} תגובות ×וחדו ×œ× ×•×©× ×§×™×™×: %{topic_link}" topic_statuses: archived_enabled: "×”× ×•×©× ×”×–×” נכנס ל×רכיון. ×”×•× ×§×¤×•× ×•×œ× × ×™×ª×Ÿ לשינוי בכל דרך." archived_disabled: "×”× ×•×©× ×”×–×” ×”×•×¦× ×ž×”×רכיון. ×”×•× ×›×‘×¨ ×œ× ×§×¤×•×, וניתן לשינוי." closed_enabled: "×”× ×•×©× ×”×–×” סגור. ×œ× × ×™×ª×Ÿ להגיב תגובות חדשות." closed_disabled: "×”× ×•×©× ×”×–×” פתוח. ניתן להגיב תגובות חדשות." autoclosed_message_max_posts: - many: 'הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: %{count} .' - one: 'הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: 1 .' - other: 'הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: %{count} .' - two: 'הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: %{count} .' + one: "הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: 1 ." + two: "הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: %{count} ." + many: "הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: %{count} ." + other: "הודעה זו נסגרה ×וטומטית ×חרי שהגיעה למספר המקסימלי של תגובות: %{count} ." autoclosed_topic_max_posts: - many: '× ×•×©× ×–×” נסגר ×וטומטית ×חרי שהגיע למספר המקסימלי של תגובות: %{count} .' - one: '× ×•×©× ×–×” נסגר ×וטומטית ל×חר שהגיע למספר המקסימלי של תגובות: 1.' - other: '× ×•×©× ×–×” נסגר ×וטומטית ×חרי שהגיע למספר המקסימלי של תגובות: %{count} .' - two: '× ×•×©× ×–×” נסגר ×וטומטית ×חרי שהגיע למספר המקסימלי של תגובות: %{count} .' + one: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר שהגיע למספר המקסימלי של תגובות: 1." + two: "× ×•×©× ×–×” נסגר ×וטומטית ×חרי שהגיע למספר המקסימלי של תגובות: %{count} ." + many: "× ×•×©× ×–×” נסגר ×וטומטית ×חרי שהגיע למספר המקסימלי של תגובות: %{count} ." + other: "× ×•×©× ×–×” נסגר ×וטומטית ×חרי שהגיע למספר המקסימלי של תגובות: %{count} ." autoclosed_enabled_days: - many: × ×•×©× ×–×” נסגר ב×ופן ×וטומטי ל×חר %{count} ימי×. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. - one: ×”× ×•×©× ×”×–×” ננעל ×וטומטית ל×חר ×™×•× ×חד. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - other: × ×•×©× ×–×” נסגר ב×ופן ×וטומטי ל×חר %{count} ימי×. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. - two: × ×•×©× ×–×” נסגר ב×ופן ×וטומטי ל×חר %{count} ימי×. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. + one: "×”× ×•×©× ×”×–×” ננעל ×וטומטית ל×חר ×™×•× ×חד. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + two: "× ×•×©× ×–×” נסגר ב×ופן ×וטומטי ל×חר %{count} ימי×. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." + many: "× ×•×©× ×–×” נסגר ב×ופן ×וטומטי ל×חר %{count} ימי×. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." + other: "× ×•×©× ×–×” נסגר ב×ופן ×וטומטי ל×חר %{count} ימי×. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." autoclosed_enabled_hours: - many: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} שעות. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. - one: × ×•×©× ×–×” ננעל ל×חר שעה ×חת. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. - other: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} שעות. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. - two: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} שעות. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות. + one: "× ×•×©× ×–×” ננעל ל×חר שעה ×חת. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." + two: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} שעות. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." + many: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} שעות. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." + other: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} שעות. ×œ× × ×™×ª×Ÿ להוסיף תגובות חדשות." autoclosed_enabled_minutes: - many: ×”× ×•×©× ×”×–×” נסגר ×וטומטית ל×חר %{count} דקות. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - one: ×”× ×•×©× ×”×–×” ננעל ×וטומטית ל×חר דקה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - other: ×”× ×•×©× ×”×–×” נסגר ×וטומטית ל×חר %{count} דקות. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - two: ×”× ×•×©× ×”×–×” נסגר ×וטומטית ל×חר %{count} דקות. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. + one: "×”× ×•×©× ×”×–×” ננעל ×וטומטית ל×חר דקה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + two: "×”× ×•×©× ×”×–×” נסגר ×וטומטית ל×חר %{count} דקות. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + many: "×”× ×•×©× ×”×–×” נסגר ×וטומטית ל×חר %{count} דקות. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + other: "×”× ×•×©× ×”×–×” נסגר ×וטומטית ל×חר %{count} דקות. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." autoclosed_enabled_lastpost_days: - many: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} ×™×ž×™× ×ž×”×ª×’×•×‘×” ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - one: × ×•×©× ×–×” ננעל ×וטומטית ל×חר ×™×•× ×חד מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - other: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} ×™×ž×™× ×ž×”×ª×’×•×‘×” ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - two: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} ×™×ž×™× ×ž×”×ª×’×•×‘×” ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. + one: "× ×•×©× ×–×” ננעל ×וטומטית ל×חר ×™×•× ×חד מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + two: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} ×™×ž×™× ×ž×”×ª×’×•×‘×” ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + many: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} ×™×ž×™× ×ž×”×ª×’×•×‘×” ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + other: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} ×™×ž×™× ×ž×”×ª×’×•×‘×” ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." autoclosed_enabled_lastpost_hours: - many: × ×•×©× ×–×” נסגר ×וטומטית %{count} שעות ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר. - one: × ×•×©× ×–×” נסגר שעה ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר. - other: × ×•×©× ×–×” נסגר ×וטומטית %{count} שעות ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר. - two: × ×•×©× ×–×” נסגר ×וטומטית %{count} שעות ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר. + one: "× ×•×©× ×–×” נסגר שעה ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר." + two: "× ×•×©× ×–×” נסגר ×וטומטית %{count} שעות ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר." + many: "× ×•×©× ×–×” נסגר ×וטומטית %{count} שעות ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר." + other: "× ×•×©× ×–×” נסגר ×וטומטית %{count} שעות ל×חר התגובה ×”×חרונה. תגובות נוספות ×ינן מותרות יותר." autoclosed_enabled_lastpost_minutes: - many: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} דקות מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - one: × ×•×©× ×–×” ננעל ×וטומטית ל×חר דקה מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - other: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} דקות מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. - two: × ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} דקות מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª. + one: "× ×•×©× ×–×” ננעל ×וטומטית ל×חר דקה מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + two: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} דקות מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + many: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} דקות מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." + other: "× ×•×©× ×–×” נסגר ×וטומטית ל×חר %{count} דקות מהתגובה ×”×חרונה. תגובות חדשות ×œ× ×ž×ª×§×‘×œ×•×ª." autoclosed_disabled_days: - many: × ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} ימי×. - one: × ×•×©× ×–×” נפתח ×וטומטית ל×חר ×™×•× 1. - other: × ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} ימי×. - two: × ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} ימי×. + one: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר ×™×•× 1." + two: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} ימי×." + many: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} ימי×." + other: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} ימי×." autoclosed_disabled_hours: - many: × ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} שעות. - one: × ×•×©× ×–×” נפתח ×וטומטית ל×חר שעה 1. - other: × ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} שעות. - two: × ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} שעות. + one: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר שעה 1." + two: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} שעות." + many: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} שעות." + other: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר %{count} שעות." autoclosed_disabled_minutes: - many: × ×•×©× ×–×” נפתוח ×וטומטית ל×חר %{count} דקות. - one: × ×•×©× ×–×” נפתח ×וטומטית ל×חר דקה 1. - other: × ×•×©× ×–×” נפתוח ×וטומטית ל×חר %{count} דקות. - two: × ×•×©× ×–×” נפתוח ×וטומטית ל×חר %{count} דקות. + one: "× ×•×©× ×–×” נפתח ×וטומטית ל×חר דקה 1." + two: "× ×•×©× ×–×” נפתוח ×וטומטית ל×חר %{count} דקות." + many: "× ×•×©× ×–×” נפתוח ×וטומטית ל×חר %{count} דקות." + other: "× ×•×©× ×–×” נפתוח ×וטומטית ל×חר %{count} דקות." autoclosed_disabled_lastpost_days: - many: ×”× ×•×©× × ×¤×ª×— ×וטומטית %{count} ×™×ž×™× ×חרי התגובה ×”×חרונה. - one: ×”× ×•×©× × ×¤×ª×— ×וטומטית ×™×•× 1 ×חרי התגובה ×”×חרונה. - other: ×”× ×•×©× × ×¤×ª×— ×וטומטית %{count} ×™×ž×™× ×חרי התגובה ×”×חרונה. - two: ×”× ×•×©× × ×¤×ª×— ×וטומטית %{count} ×™×ž×™× ×חרי התגובה ×”×חרונה. + one: "×”× ×•×©× × ×¤×ª×— ×וטומטית ×™×•× 1 ×חרי התגובה ×”×חרונה." + two: "×”× ×•×©× × ×¤×ª×— ×וטומטית %{count} ×™×ž×™× ×חרי התגובה ×”×חרונה." + many: "×”× ×•×©× × ×¤×ª×— ×וטומטית %{count} ×™×ž×™× ×חרי התגובה ×”×חרונה." + other: "×”× ×•×©× × ×¤×ª×— ×וטומטית %{count} ×™×ž×™× ×חרי התגובה ×”×חרונה." autoclosed_disabled_lastpost_hours: - many: × ×•×©× ×–×” נפתח ×וטומטית %{count} שעות ×חרי התגובה ×”×חרונה. - one: × ×•×©× ×–×” נפתח ×וטומטית שעה 1 ×חרי התגובה ×”×חרונה. - other: × ×•×©× ×–×” נפתח ×וטומטית %{count} שעות ×חרי התגובה ×”×חרונה. - two: × ×•×©× ×–×” נפתח ×וטומטית %{count} שעות ×חרי התגובה ×”×חרונה. + one: "× ×•×©× ×–×” נפתח ×וטומטית שעה 1 ×חרי התגובה ×”×חרונה." + two: "× ×•×©× ×–×” נפתח ×וטומטית %{count} שעות ×חרי התגובה ×”×חרונה." + many: "× ×•×©× ×–×” נפתח ×וטומטית %{count} שעות ×חרי התגובה ×”×חרונה." + other: "× ×•×©× ×–×” נפתח ×וטומטית %{count} שעות ×חרי התגובה ×”×חרונה." autoclosed_disabled_lastpost_minutes: - many: × ×•×©× ×–×” נפתח ×וטומטית %{count} דקות ×חרי התגובה ×”×חרונה. - one: × ×•×©× ×–×” נפתח ×וטומטית דקה 1 ×חרי התגובה ×”×חרונה. - other: × ×•×©× ×–×” נפתח ×וטומטית %{count} דקות ×חרי התגובה ×”×חרונה. - two: × ×•×©× ×–×” נפתח ×וטומטית %{count} דקות ×חרי התגובה ×”×חרונה. + one: "× ×•×©× ×–×” נפתח ×וטומטית דקה 1 ×חרי התגובה ×”×חרונה." + two: "× ×•×©× ×–×” נפתח ×וטומטית %{count} דקות ×חרי התגובה ×”×חרונה." + many: "× ×•×©× ×–×” נפתח ×וטומטית %{count} דקות ×חרי התגובה ×”×חרונה." + other: "× ×•×©× ×–×” נפתח ×וטומטית %{count} דקות ×חרי התגובה ×”×חרונה." autoclosed_disabled: "×”× ×•×©× ×”×–×” נפתח. ניתן להגיב תגובות חדשות." autoclosed_disabled_lastpost: "×”× ×•×©× ×”×–×” נפתח. ניתן להגיב תגובות חדשות." pinned_enabled: "×”× ×•×©× ×”×–×” × × ×¢×¥. ×”×•× ×™×•×¤×™×¢ בר×ש הקטגוריה שלו עד שיוסר מנעיצה על ידי מנהל ×ו שכפתור × ×§×” נעיצות נלחץ." @@ -1525,7 +1485,6 @@ he: missing_user_field: "×œ× ×ž×™×œ×ת ×ת כל שדות המשתמש/ת" already_logged_in: "×ופס, נר××” ש××ª× ×ž× ×¡×™× ×œ×§×‘×œ הזמנה שנועדה למשתמש ×חר. ×× ××ª× ×œ× %{current_user}, ×× × ×”×ª× ×ª×§×• ונסו שוב." user: - no_accounts_associated: "×ין חשבונות מקושרי×." deactivated: "הושבת בעקבות ×ž×™×™×œ×™× ×¨×‘×™× ×ž×™×“×™ שהוחזרו ל '%{email}'." deactivated_by_staff: "נוטרל על ידי הצוות" activated_by_staff: "הופעל על ידי הצוות" @@ -1551,15 +1510,15 @@ he: domain_not_allowed: "×תר ×œ× ×ª×§×™×Ÿ. ×ž×ª×—×ž×™× ×ž×•×ª×¨×™×: %{domains}" flags_reminder: flags_were_submitted: - many: ×“×’×œ×™× × ×¨×©×ž×• לפני יותר מ %{count} שעות. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags). - one: ×“×’×œ×™× × ×¨×©×ž×• לפני יותר משעה. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags). - other: ×“×’×œ×™× × ×¨×©×ž×• לפני יותר מ %{count} שעות. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags). - two: ×“×’×œ×™× × ×¨×©×ž×• לפני יותר מ %{count} שעות. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags). + one: "×“×’×œ×™× × ×¨×©×ž×• לפני יותר משעה. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags)." + two: "×“×’×œ×™× × ×¨×©×ž×• לפני יותר מ %{count} שעות. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags)." + many: "×“×’×œ×™× × ×¨×©×ž×• לפני יותר מ %{count} שעות. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags)." + other: "×“×’×œ×™× × ×¨×©×ž×• לפני יותר מ %{count} שעות. [×× × ×¡×™×§×¨×• ×ות×](/admin/flags)." subject_template: - many: '%{count} ×“×’×œ×™× ×ž×ž×ª×™× ×™× ×œ×˜×™×¤×•×œ' - one: דגל ×חד ממתין לטיפול - other: '%{count} ×“×’×œ×™× ×ž×ž×ª×™× ×™× ×œ×˜×™×¤×•×œ' - two: '%{count} ×“×’×œ×™× ×ž×ž×ª×™× ×™× ×œ×˜×™×¤×•×œ' + one: "דגל ×חד ממתין לטיפול" + two: "%{count} ×“×’×œ×™× ×ž×ž×ª×™× ×™× ×œ×˜×™×¤×•×œ" + many: "%{count} ×“×’×œ×™× ×ž×ž×ª×™× ×™× ×œ×˜×™×¤×•×œ" + other: "%{count} ×“×’×œ×™× ×ž×ž×ª×™× ×™× ×œ×˜×™×¤×•×œ" unsubscribe_mailer: title: "שולח-×ž×™×™×œ×™× ×œ×‘×™×˜×•×œ מנוי" subject_template: "×שרו ש××™× ×›× ×ž×¢×•× ×™×™× ×™× ×™×•×ª×¨ לקבל עדכוני דו×\"ל מ%{site_title}" @@ -1628,21 +1587,16 @@ he: deferred: "תודה ×©×¢×“×›× ×ª× ×ותנו. ×נחנו ×‘×•×“×§×™× ×ת העניין." deferred_and_deleted: "תודה ×©×¢×“×›× ×ª× ×ותנו. הסרנו ×ת הפוסט." temporarily_closed_due_to_flags: - many: × ×•×©× ×–×” סגור זמנית ל-%{count} שעות עקב מספר רב של דגלי קהילה. - one: × ×•×©× ×–×” סגור זמנית לשעה 1 עקב מספר רב של דגלי קהילה. - other: × ×•×©× ×–×” סגור זמנית ל-%{count} שעות עקב מספר רב של דגלי קהילה. - two: × ×•×©× ×–×” סגור זמנית ל-%{count} שעות עקב מספר רב של דגלי קהילה. + one: "× ×•×©× ×–×” סגור זמנית לשעה 1 עקב מספר רב של דגלי קהילה." + two: "× ×•×©× ×–×” סגור זמנית ל-%{count} שעות עקב מספר רב של דגלי קהילה." + many: "× ×•×©× ×–×” סגור זמנית ל-%{count} שעות עקב מספר רב של דגלי קהילה." + other: "× ×•×©× ×–×” סגור זמנית ל-%{count} שעות עקב מספר רב של דגלי קהילה." system_messages: private_topic_title: "× ×•×©× #%{id}" contents_hidden: "×× × ×‘×§×¨×• בפוסט כדי לצפות בתוכן שלו." post_hidden: title: "פוסט חבוי" subject_template: "פוסט הוסתר על ידי ×“×’×œ×™× ×©×œ הקהילה" - usage_tips: - text_body_template: | - לכמה ×˜×™×¤×™× ×–×¨×™×–×™× ×‘× ×•×’×¢ להתחלה ×›×ž×©×ª×ž×©×™× ×—×“×©×™×, [קיר×ו פוסט ×–×”](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). - - ככל שתשתתפו ×›×ן, נכיר ×תכ×, והגבלות זמניות של ×ž×©×ª×ž×©×™× ×—×“×©×™× ×™×•×¡×¨×•. במשך הזמן תצברו [רמות ×מון](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) שיכללו יכולות מיוחדות שיעזרו לנו לנהל ×ת הקהילה שלנו יחד. welcome_user: title: "×‘×¨×•×›×™× ×”×‘××™× ×œ×ž×©×ª×ž×©/ת" subject_template: "×‘×¨×•×›×™× ×”×‘××™× ×œ %{site_name}!" @@ -1835,10 +1789,10 @@ he: pending_users_reminder: title: "תזכורת ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™×" subject_template: - many: '%{count} ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™× ×œ×ישורכ×' - one: משתמש 1 ממתין ל××™×©×•×¨×›× - other: '%{count} ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™× ×œ×ישורכ×' - two: '%{count} ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™× ×œ×ישורכ×' + one: "משתמש 1 ממתין ל×ישורכ×" + two: "%{count} ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™× ×œ×ישורכ×" + many: "%{count} ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™× ×œ×ישורכ×" + other: "%{count} ×ž×©×ª×ž×©×™× ×ž×ž×ª×™× ×™× ×œ×ישורכ×" text_body_template: | ישנן הרשמות של ×ž×©×ª×ž×©×™× ×—×“×©×™× ×©×ž×ž×ª×™× ×•×ª ל×ישור (×ו דחייה) לפני ×©×”× ×™×•×›×œ×• לגשת ×œ×¤×•×¨×•× ×–×”. @@ -1872,19 +1826,17 @@ he: user_notifications: previous_discussion: "תגובות קודמות" reached_limit: - many: 'שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר %{count} ×ž×™×™×œ×™× ×™×•×ž×™×™×. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור. × .ב: תודה ש××ª× ×¤×•×¤×•×œ×ריי×!' - one: 'שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר מייל 1 יומי. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור.' - other: 'שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר %{count} ×ž×™×™×œ×™× ×™×•×ž×™×™×. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור. × .ב: תודה ש××ª× ×¤×•×¤×•×œ×ריי×!' - two: 'שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר %{count} ×ž×™×™×œ×™× ×™×•×ž×™×™×. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור. × .ב: תודה ש××ª× ×¤×•×¤×•×œ×ריי×!' + one: "שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר מייל 1 יומי. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור." + two: "שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר %{count} ×ž×™×™×œ×™× ×™×•×ž×™×™×. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור. × .ב: תודה ש××ª× ×¤×•×¤×•×œ×ריי×!" + many: "שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר %{count} ×ž×™×™×œ×™× ×™×•×ž×™×™×. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור. × .ב: תודה ש××ª× ×¤×•×¤×•×œ×ריי×!" + other: "שימו לב: ×נחנו ×©×•×œ×—×™× ×œ×›×œ היותר %{count} ×ž×™×™×œ×™× ×™×•×ž×™×™×. בידקו ב×תר כדי לר×ות ×ת ×לו ×©×¢×œ×•×œ×™× ×œ×”×©×ר מ×חור. × .ב: תודה ש××ª× ×¤×•×¤×•×œ×ריי×!" in_reply_to: "בתגובה ל" unsubscribe: title: "ביטול מנוי" description: "×œ× ×ž×¢×•× ×™×™× ×™× ×‘×§×‘×œ×ª ×”×ž×™×™×œ×™× ×”×לו? ×ין בעיה! לחצו למטה כדי להסיר ×ת ×¢×¦×ž×›× ×ž×”×ž× ×•×™ מיידית:" reply_by_email: "[בקרו בנוש×](%{base_url}%{url}) ×ו ענו למייל ×–×” כדי להגיב." - reply_by_email_pm: "[בקרו בהודעה](%{base_url}%{url}) ×ו ענו למייל ×–×” כדי להגיב." only_reply_by_email: "השיבו למייל ×–×” כדי לענות." visit_link_to_respond: "[בקרו בנוש×](%{base_url}%{url}) כדי לענות." - visit_link_to_respond_pm: "[בקרו בהודעה](%{base_url}%{url}) כדי לענות." posted_by: "×¤×•×¨×¡× ×¢×œ ידי %{username} ב %{post_date}" user_invited_to_private_message_pm: title: "משתמש/ת הוזמן/×” להודעה פרטית" @@ -2119,7 +2071,6 @@ he: recent_topics: "ל×חרונה" see_more: "עוד" search_title: "חיפוש ב×תר ×–×”" - search_google: "גוגל" login_required: welcome_message: | ## [ברוך בו×ך ×ל %{title}](#welcome) @@ -2147,32 +2098,11 @@ he: flag_reason: sockpuppet: "משתמש חדש יצר נוש×, ומשתמש חדש ×חר מ×ותה כתובת IP (%{ip_address}) ענו לה×. ר×ו ×ת הגדרת ×”×תר `flag_sockpuppets`." spam_hosts: "משתמש חדש ×–×” ניסה ליצור מספר ×¤×•×¡×˜×™× ×¢× ×§×™×©×•×¨×™× ×œ×ותה הכתובת (%{domain}). ר×ו ×ת הגדרת ×”×תר `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "המשתמש של פוסט ×–×” נמחק." - no_user: "×œ× × ×ž×¦× ×ž×©×ª×ž×©/ת ×¢× ×ž×–×”×” %{user_id}" - anonymous_user: "המשתמש ×”×•× ×נונימי" - suspended_not_pm: "המשתמש מושהה, ×œ× ×”×•×“×¢×”" - seen_recently: "המשתמש נר××” ל×חרונה" - post_not_found: "×œ× × ×ž×¦× ×¤×•×¡×˜ ×¢× ×ž×–×”×” %{post_id}" - notification_already_read: "ההתר××” שעבורה נשלח מייל ×–×” כבר נקר××”" - topic_nil: "post.topic ×”×•× nil" - post_deleted: "הפוסט נמחק על ידי הכותב שלו" - user_suspended: "המשתמש הושעה" - already_read: "המשתמש כבר ×§×¨× ×¤×•×¡×˜ ×–×”" - exceeded_emails_limit: "נחצה max_emails_per_day_per_user" - exceeded_bounces_limit: "נחצה bounce_score_threshold" - message_blank: "ההודעה ריקה" - message_to_blank: "message.to ריק" - text_part_body_blank: "text_part.body ריק" - body_blank: "גוף ריק" - no_echo_mailing_list_mode: "התר×ות רשימת תפוצה ינוטרלו עבור ×”×¤×•×¡×˜×™× ×©×œ המשתמש עצמו" color_schemes: base_theme_name: "בסיס" - default: "סכמה בהירה" dark: "סכמה ×›×”×”" - default_theme_name: "בררת מחדל" - dark_theme_name: "×›×”×”" light_theme_name: "בהיר" + dark_theme_name: "×›×”×”" about: "×ודות" guidelines: "×§×•×•×™× ×ž× ×—×™×" privacy: "פרטיות" @@ -2274,71 +2204,40 @@ he: editor: name: ×¢×•×¨×›×™× description: עריכת פוסט ר×שונה - long_description: | - עיטור ×–×” מוענק ×‘×¤×¢× ×”×¨×שונה ש××ª× ×¢×•×¨×›×™× ×ת ×חד ×”×¤×•×¡×˜×™× ×©×œ×›×. ××ž× × ×œ× ×ª×•×›×œ×• לערוך ×ת ×”×¤×•×¡×˜×™× ×©×œ×›× ×œ×¢×“, ×בל עריכות ×–×” רעיון טוב - ××ª× ×™×›×•×œ×™× ×œ×©×¤×¨ ×ת ×”×¤×•×¡×˜×™× ×©×œ×›×, לתקן טעויות קטנות, ×ו להוסיף כל דבר ×©×¤×¡×¤×¡×ª× ×‘×ž×§×•×¨. עירכו כדי להפוך ×ת ×”×¤×•×¡×˜×™× ×©×œ×›× ×œ×˜×•×‘×™× ×פילו יותר! basic_user: name: ×‘×¡×™×¡×™×™× - description: "הוענקו ×œ×”× ×›×œ ×פשרויות הקהילה הבסיסיות" - long_description: | - עיטור ×–×” מוענק כש××ª× ×ž×’×™×¢×™× ×œ×¨×ž×ª ×מון 1. תודה שנש××¨×ª× ×•×§×¨××ª× ×›×ž×” נוש××™× ×›×“×™ להבין במה הקהילה הזו עוסקת. הסרנו כמה מגבלות של ×ž×©×ª×ž×©×™× ×—×“×©×™×; הוענקו ×œ×›× ×›×ž×” יכולות נחוצות לקהילה, כמו הודעות פרטיות, דגלי×, עריכת ויקי, והיכולת להוסיף תמונות ×•×§×™×©×•×¨×™× ×ž×¨×•×‘×™×. member: name: ×—×‘×¨×™× - description: "הוענקו ×œ×›× ×”×–×ž× ×•×ª, הודעות קבוצתיות, יותר לייקי×" - long_description: | - עיטור ×–×” מוענק ×›×שר ××ª× ×ž×’×™×¢×™× ×œ×¨×ž×ª ×מון 2. תודה על השתתפות במשך תקופה של שבועות כדי ב×מת להצטרף לקהילה שלנו. ××ª× ×™×›×•×œ×™× ×›×¢×ª לשלוח הזמנות מחשבון המשתמש ×©×œ×›× ×ו מנוש××™×, ליצור הודעות ×ישיות לקבוצות, ולחלק קצת יותר ×œ×™×™×§×™× ×‘×›×œ יו×. regular: name: ×¨×’×™×œ×™× - description: "הוענקו ×œ×›× ×”×•×§×¨×”, שינוי ש×, מעקב ×חר לינקי×, וויקי, ×•×œ×™×™×§×™× × ×•×¡×¤×™×" - long_description: | - עיטור ×–×” מוענק ×›×שר ××ª× ×ž×’×™×¢×™× ×œ×¨×ž×ª ×מון 3. תודה על נטילת חלק ב×ופן קבוע בקהילה ל×ורך תקופה של חודשי×. ××ª× ×›×¢×ª חלק מקבוצת הקור××™× ×”×¤×¢×™×œ×” ביותר, ומקור ×מין שהופך ×ת הקהילה שלנו למעולה. ××ª× ×›×¢×ª ×™×›×•×œ×™× ×œ×§×˜×œ×’ ולשנות שמות לנוש××™×, להשתמש ×‘×“×’×œ×™× ×—×–×§×™× ×™×•×ª×¨, לגשת ל×זור הל×ונג׳ הפרטי, ותקבלו ×’× ×”×¨×‘×” יותר ×œ×™×™×§×™× ×œ×™×•×. leader: name: ×ž×•×‘×™×œ×™× - description: "הוענקו ×œ×›× ×™×›×•×œ×•×ª עריכה גלוב×ליות, נעיצה, סגירה, ×ירכוב, פיצול ומיזוג, ×œ×™×™×§×™× × ×•×¡×¤×™×" - long_description: | - עיטור ×–×” מוענק ×›×שר ××ª× ×ž×’×™×¢×™× ×œ×¨×ž×ª ×מון 4. ××ª× ×ž×•×‘×™×œ×™× ×‘×§×”×™×œ×” הזו כחברי צוות נבחרי×, ו××ª× ×ž×©×ž×©×™× ×“×•×’×ž×” חיובית לש×ר הקהילה בפעולות ×•×‘×ž×™×œ×™× ×©×œ×›× ×¤×”. יש ×œ×›× ×ת היכולת לערוך ×ת כל הפוסטי×, ולהשתמש ביכולות ×”×”× ×—×™×™×” הנפוצות כמו נעיצה, סגירה, הסרה מהרשימות, ×רכוב, פיצול, ומיזוג, ויש ×œ×›× ×˜×•× ×•×ª של ×œ×™×™×§×™× ×‘×™×•×. welcome: name: ×‘×¨×•×›×™× ×”×‘××™× description: קיבלו לייק - long_description: | - עיטור זוה מוענק ×›×שר ××ª× ×ž×§×‘×œ×™× ×ת הלייק הר×שון ×©×œ×›× ×¢×œ פוסט. מזל טוב, ×¤×¨×¡×ž×ª× ×ž×©×”×• ×©×—×‘×¨×™×›× ×œ×§×”×™×œ×” חשבו ×©×”×•× ×ž×¢× ×™×™×Ÿ, מגניב, ×ו שימושי! autobiographer: name: ××•×˜×•×‘×™×•×’×¨×¤×™× anniversary: name: ×™×•× ×”×©× ×” description: "×—×‘×¨×™× ×¤×¢×™×œ×™× ×œ×ž×©×š שנה, פרסמו לפחות ×¤×¢× ×חת" - long_description: | - עיטור ×–×” מוענק ×× ×”×™×™×ª× ×—×‘×¨×™× ×œ×ž×©×š שנה ×¢× ×œ×¤×—×•×ª פוסט ×חד בשנה זו. תודה על שנש××¨×ª× ×יתנו ועל ×ª×¨×•×ž×ª×›× ×œ×§×”×™×œ×” שלנו. ×œ× ×™×›×•×œ× ×• לעשות ×–×ת בלעדיכ×. nice_post: name: תשובה נחמדה description: התקבלו 10 ×œ×™×™×§×™× ×¢×œ תגובה - long_description: | - עיטור ×–×” מוענק ×›×שר תגובה ×©×œ×›× ×ž×§×‘×œ×ª 10 לייקי×. התגובה ×©×œ×›× ×ž×ž×© הרשימה ×ת הקהילה שלנו וסייעה ×œ×§×™×“×•× ×”×©×™×—×”! good_post: name: תשובה טובה description: התקבלו 25 ×œ×™×™×§×™× ×¢×œ תגובה - long_description: | - עיטור ×–×” מוענק ×›×שר תגובה ×©×œ×›× ×ž×§×‘×œ×ª 25 לייקי×. התגובה ×©×œ×›× ×”×™×ª×” יוצ×ת מן הכלל ושיפרה ×ת השיחה עבור כול×! great_post: name: תשובה מעולה description: התקבלו 50 ×œ×™×™×§×™× ×¢×œ תגובה - long_description: |+ - עיטור ×–×” מוענק ×›×שר תגובה ×©×œ×›× ×ž×§×‘×œ×ª 50 לייקי×. וו×ו! התגובה ×©×œ×›× ×¢×•×¨×¨×” השר××”, הקסימה, גלגלה מצחוק ×ו הבי××” זווית חדשה והקהילה ×הבה ×ת ×–×”. - nice_topic: name: × ×•×©× × ×—×ž×“ description: התקבלו 10 ×œ×™×™×§×™× ×¢×œ × ×•×©× - long_description: | - עיטור ×–×” מוענק ×›×©×”× ×•×©× ×©×œ×›× ×ž×§×‘×œ 10 לייקי×. ×”×™×™, ×”×ª×—×œ×ª× ×©×™×—×” מעניינת שהקהילה נהנתה ממנה! good_topic: name: × ×•×©× ×˜×•×‘ description: קיבלו 25 ×œ×™×™×§×™× ×¢×œ × ×•×©× - long_description: | - עיטור ×–×” מוענק ×›×שר × ×•×©× ×©×œ×›× ×ž×§×‘×œ 25 לייקי×. ×”×ª×—×œ×ª× ×©×™×—×” תוססת שהקהילה התחברה ×ליה ו×הבה ×ותה! great_topic: name: × ×•×©× ×ž×¢×•×œ×” description: קיבלו 50 ×œ×™×™×§×™× ×¢×œ × ×•×©× - long_description: | - עיטור ×–×” מוענק ×›×שר ×”× ×•×©× ×©×œ×›× ×ž×§×‘×œ 50 לייקי×. ×”×ª×—×œ×ª× × ×•×©× ×©×™×—×” מרתק והקהילה נהנתה מהדיון הדינמי שהתגלגל ממנו! nice_share: name: שיתוף נחמד description: שיתפו פוסט ×¢× 25 ×ž×‘×§×¨×™× ×©×•× ×™× @@ -2347,13 +2246,9 @@ he: good_share: name: שיתוף טוב description: שיתפו פוסט ×¢× 300 ×ž×‘×§×¨×™× ×™×™×—×•×“×™×™× - long_description: | - עיטור ×–×” מוענק על שיתוף של קישור שהקליקו עליו 300 ×ž×‘×§×¨×™× ×—×™×¦×•× ×™×™×. עבודה טובה! ×”×©×•×•×¦×ª× ×‘×“×™×•×Ÿ מעולה לחבר׳ה ×•×¢×–×¨×ª× ×œ×§×”×™×œ×” לגדול. great_share: name: שיתוף מעולה description: שיתפו פוסט ×¢× ×œ×ž×¢×œ×” מ 1000 ×ž×‘×§×¨×™× ×©×•× ×™× - long_description: | - עיטור ×–×” מוענק בעבור שיתוף של קישור שהקליקו עליו 1000 ×ž×‘×§×¨×™× ×—×™×¦×•× ×™×™×. וו×ו! ×§×™×“×ž×ª× ×“×™×•×Ÿ מעניין לקהל ×¢× ×§, ×•×¡×™×™×¢×ª× ×œ×”×’×“×™×œ ×ת הקהילה בגדול! first_like: name: לייק ר×שון description: ×הבו פוסט @@ -2362,21 +2257,15 @@ he: first_flag: name: דגל ר×שון description: דיגלו פוסט - long_description: | - עיטור ×–×” מוענק ×‘×¤×¢× ×”×¨×שונה ש××ª× ×ž×“×’×œ×™× ×¤×•×¡×˜. דיגול זו הדרך ש×נחנו ×¢×•×–×¨×™× ×œ×©×ž×•×¨ על ×”×ž×§×•× ×”×–×” × ×§×™ ומו×ר בשביל כול×. ×× ××ª× ×©×ž×™× ×œ×‘ שפוסט כלשהו מצריך תשומת לב ×ž× ×—×™× ×ž×›×œ סיבה ×©×”×™× - ×ל תהססו ×œ×”×¨×™× ×“×’×œ. ××ª× ×™×›×•×œ×™× ×’× ×œ×“×’×œ כדי לשלוח הודעות ×ישיות ×œ×—×‘×¨×™×›× ×”×ž×©×ª×ž×©×™× ×× ××ª× ×¨×•××™× ×‘×¢×™×™×” בפוסט שלה×. ×× ××ª× ×¨×•××™× ×‘×¢×™×”, :flag_black: דגלו ×ותה! promoter: name: ×ž×§×“×ž×™× description: הזמינו משתמש campaigner: name: ×§×ž×¤×™×™× ×¨×™× description: הזמינו 3 ×ž×©×ª×ž×©×™× ×‘×¡×™×¡×™×™× - long_description: | - עיטור ×–×” מוענק ×›×שר ×”×–×ž× ×ª× 3 ×× ×©×™× ×©×‘×”×ž×©×š השקיעו מספיק זמן ב×תר כדי להפוך ×œ×ž×©×ª×ž×©×™× ×‘×¡×™×¡×™×™×. קהילה תוססת צריכה שטף קבוע של ×× ×©×™× ×—×“×©×™× ×©×ž×ž×©×™×›×™× ×œ×”×©×ª×ª×£ ולהוסיף קולות ×—×“×©×™× ×œ×“×™×•× ×™×. champion: name: ××œ×•×¤×™× description: הזמינו 5 ×—×‘×¨×™× - long_description: | - עיטור ×–×” מוענק ×›×שר ×”×–×ž× ×ª× 5 ×× ×©×™× ×©×›×ª×•×¦××” מכך בילו מספיק זמן ב×תר כדי להפוך ×œ×—×‘×¨×™× ×ž×œ××™×. וו×ו! תודה ×©×”×’×“×œ×ª× ×ת מגוון הדעות בקהילה שלנו ב×מצעות ×—×‘×¨×™× ×—×“×©×™×! first_share: name: שיתוף ר×שון description: שיתפו פוסט @@ -2390,8 +2279,6 @@ he: first_quote: name: ציטוט ר×שון description: ציטטו פוסט - long_description: | - עיטור ×–×” מוענק ×‘×¤×¢× ×”×¨×שונה ש××ª× ×ž×¦×˜×˜×™× ×¤×•×¡×˜ בתגובה שלכ×. ציטוט ×—×œ×§×™× ×¨×œ×•×•× ×˜×™×™× ×©×œ ×¤×•×¡×˜×™× ×§×•×“×ž×™× ×‘×ª×’×•×‘×” ×©×œ×›× ×¢×•×–×¨×ª ×œ×“×™×•× ×™× ×œ×”×©×ר ×ž×—×•×‘×¨×™× ×œ× ×•×©×. הדרך הקלה ביותר לצטט ×”×™× ×œ×”×“×’×™×© קטע בפוסט, וללחוץ על כפתור מענה כלשהו. צטטו בנדיבות! read_guidelines: name: קר×ו ×ת ההנחיות reader: @@ -2442,8 +2329,6 @@ he: crazy_in_love: name: מ××•×”×‘×™× ×‘×˜×™×¨×•×£ description: השתמשו ב 50 ×œ×™×™×§×™× ×‘×™×•× 20 ×¤×¢× - long_description: | - עיטור ×–×” מוענק ×›×שר ××ª× ×ž×©×ª×ž×©×™× ×‘×›×œ 50 ×”×œ×™×™×§×™× ×”×™×•×ž×™×™× ×©×œ×›× ×‘×ž×©×š 20 ימי×. וו×ו! ××ª× ×ž×•×¤×ª לעידוד מתמשך של ×—×‘×¨×™×›× ×œ×§×”×™×œ×”! thank_you: name: תודה רבה description: יש ×œ×›× 20 ×¤×•×¡×˜×™× ×©× ×הבו ×•× ×ª×ª× 10 ×œ×™×™×§×™× @@ -2457,19 +2342,15 @@ he: empathetic: name: ××ž×¤×ª×˜×™× description: יש ×œ×”× 500 ×¤×•×¡×˜×™× ×¢× ×œ×™×™×§×™× ×•×—×™×œ×§×• 1000 ×œ×™×™×§×™× - long_description: | - עיטור ×–×” מוענק ×›×שר יש ×œ×›× 500 ×¤×•×¡×˜×™× ×¢× ×œ×™×™×§×™× ×•×›×שר ×—×™×œ×§×ª× 1000 ×œ×™×™×§×™× ×ו יותר בחזרה. וו×ו! ××ª× ×ž×•×¤×ª לנדיבות והערכה הדדית :two_hearts:. first_emoji: name: ×מוג׳י ר×שון description: השתמשו ב×מוג׳י בפוסט first_mention: name: ×זכור ר×שון description: הזכירו משתמש בפוסט - long_description: "עיטור ×–×” מוענק ×‘×¤×¢× ×”×¨×שונה ש××ª× ×ž×–×›×™×¨×™× ×ת ×©× @המשתמש של מישהו בפוסט שלכ×. כל ×יזכור מייצר התר××” ל××“× ×–×”, כדי שידעו על הפוסט שלכ×. פשוט התחילו בהקלדת @ (כרוכית) כדי ל×זכר כל משתמש ×ו, ×× × ×™×ª×Ÿ, קבוצה - זו דרך נוחה ×œ×”×‘×™× ×“×‘×¨×™× ×œ×ª×©×•×ž×ª ליב×." first_onebox: name: Onebox ר×שון description: פרסמו קישור שנעשה לו onebox - long_description: "עיטור ×–×” מוענק ×‘×¤×¢× ×”×¨×שונה ×©×ž×¤×¨×¡×ž×™× ×§×™×©×•×¨ בשורה נפרדת, מה ×©×™×’×¨×•× ×œ×• להתרחב לתיבת onebox ×¢× ×ª×§×¦×™×¨ של העמוד המקושר, כותרת ותמונה (×›×שר ישנה תמונה בעמוד המקושר)." first_reply_by_email: name: תגובה ר×שונה במייל description: הגיבו לפוסט ב×מצעות מייל @@ -2506,7 +2387,6 @@ he: button: "הרשמה" title: "הרשמת חשבון ×דמיניסטרטור" help: "רישמו חשבון חדש כדי להתחיל" - no_emails: "לצערנו, ×œ× ×”×•×’×“×¨ מייל של ×דמיניסטרטור במהלך ההתקנה, כך שהשלמת ההגדרות כנר××” תהיה מ×תגרת." confirm_email: title: "×שרו ×ת המייל שלכ×" message: "

שלחנו מייל ×קטיבציה ל%{email}. ×× × ×¢×™×§×‘×• ×חר ההור×ות במייל כדי להפעיל ×ת החשבון שלכ×.

×× ×”×•× ×œ× ×ž×’×™×¢, ווד×ו ×©×”×’×“×¨×ª× × ×›×•×Ÿ ×ת המייל עבור הדיסקורס ×©×œ×›× ×•×‘×™×“×§×• בתיקיית הספ××.

" @@ -2607,10 +2487,8 @@ he: fields: favicon_url: label: "×ייקון קטן" - description: "תמונה שמשמשת לייצוג ×”×תר ×©×œ×›× ×‘×“×¤×“×¤× ×™× ×©× ×¨×ית טוב ×‘×’×“×œ×™× ×§×˜× ×™× ×›×ž×• 32 על 32 פיקסלי×." apple_touch_icon_url: label: "×ייקון גדול" - description: "תמונה שמשמשת לייצוג ×”×תר ×©×œ×›× ×‘×ž×›×©×™×¨×™× ×ž×•×“×¨× ×™×™× ×•× ×¨×ית טוב ×‘×’×“×œ×™× ×’×“×•×œ×™× ×™×•×ª×¨. הגודל המומלץ ×”×•× ×œ×¤×—×•×ª 144 על 144 פיקסלי×." homepage: description: "×נחנו ×ž×ž×œ×™×¦×™× ×œ×”×¦×™×’ ×ת הנוש××™× ×”××—×¨×•× ×™× ×‘×“×£ הבית שלכ×, ×בל ××ª× ×™×›×•×œ×™× ×’× ×œ×”×¦×™×’ קטגוריות (קבוצות נוש××™×) בדף הבית ×× ×ª×¢×“×™×¤×•." title: "דף הבית" @@ -2619,8 +2497,6 @@ he: choices: latest: label: "נוש××™× ×חרוני×" - categories: - label: "קטגוריות" emoji: title: "×מוג׳י" description: "××™×–×” סגנון ×מוג׳יז תעדיפו לקהילה שלכ×? ××ª× ×™×›×•×œ×™× ×œ×”×•×¡×™×£ עוד ×מוג׳יז מות××ž×™× ×ישית תחת ניהול, הת×מה ×ישית, ×מוג׳י." diff --git a/config/locales/server.hu.yml b/config/locales/server.hu.yml new file mode 100644 index 0000000000..58462d7ee7 --- /dev/null +++ b/config/locales/server.hu.yml @@ -0,0 +1,1049 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + dates: + short_date_no_year: "D MMM" + short_date: "D MMM, YYYY" + long_date: "MMMM D, YYYY h:mma" + datetime_formats: &datetime_formats + formats: + short: "%m-%d-%Y" + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [~, Január, Február, Március, Ãprilis, Május, Június, Július, Augusztus, Szeptember, Október, November, December] + <<: *datetime_formats + time: + <<: *datetime_formats + am: "de." + pm: "du." + title: "Discourse" + topics: "Témák" + posts: "Bejegyzések" + loading: "Töltés" + powered_by_html: 'Discourse által működtetve, legjobb megtekintés JavaScript engedélyezésével ' + log_in: "Bejelentkezés" + submit: "Beküldés" + purge_reason: "Automatikusan törölve, mint elhagyott, deaktivált account" + disable_remote_images_download_reason: "A távoli képletöltés ki lett kapcsolva, mivel nem áll rendelkezésre tárhely." + anonymous: "Anonim" + remove_posts_deleted_by_author: "SzerzÅ‘ által törölve" + themes: + bad_color_scheme: "Nem lehet az oldal stílust frissíteni, érvénytelen szín séma." + other_error: "Hiba történt az oldal stílusának frissítése közben" + error_importing: "Nem sikerült klónozni a git repositoryt, hozzáférés megtagadva vagy repository nem található" + settings_errors: + invalid_yaml: "Az adott YAML érvénytelen." + default_value_missing: "'%{name}' beállításnak nincs alapértelmezett értéke" + number_value_not_valid_min_max: "%{min} és %{max} között kell lennie." + emails: + incoming: + default_subject: "Ennek a témának címre van szüksége" + show_trimmed_content: "Levágott tartalom mutatása" + no_subject: "(nincs tárgy)" + no_body: "(nincs törzs)" + errors: + empty_email_error: "Akkor fordul elÅ‘, amikor a nyers email, amit kaptunk, üres volt." + no_body_detected_error: "Történik, amikor nem tudtunk kivonatolni egy törzset és nem voltak csatolmányok." + inactive_user_error: "Történik, ha a feladó nem aktív." + bad_destination_address: "Történik, ha a To/Cc/Bcc mezÅ‘kben lévÅ‘ email címek egyike sem illeszkedik a beállított beérkezÅ‘ e-mail címhez." + strangers_not_allowed_error: "Történik, ha egy felhasználó megpróbált létrehozni egy új témát egy kategóriában, amelynek nem tagja." + unrecognized_error: "Ismeretlen hiba" + errors: &errors + format: '%{attribute} %{message}' + format_with_full_message: '%{attribute}:%{message}' + messages: + too_long_validation: "limitálva %{max} karakterre; megadott karakterek száma: %{length}." + invalid_boolean: "Érvénytelen logikai érték." + taken: "már foglalt" + accepted: elfogadva kell lennie + blank: nem lehet üres + present: üres kell hogy legyen + confirmation: "nem egyezik %{attribute}" + empty: nem lehet üres + equal_to: "meg kell egyeznie az alábbival: %{count}" + even: "páros szám kell, hogy legyen" + exclusion: foglalt + greater_than: "nagyobbnak kell lenni, mint %{count} " + greater_than_or_equal_to: "nagyobbnak vagy egyenlÅ‘nek kell lennie, mint %{count}" + has_already_been_used: "már használatban van" + inclusion: nincs benne a listában + invalid: érvénytelen + contains_censored_words: "tartalmazza a következÅ‘ nem engedélyezett szavakat: %{censored_words}" + less_than: "kevesebbnek kell lenni, mint %{count}" + less_than_or_equal_to: "kisebbnek vagy egyenlÅ‘nek kell lennie, mint %{count}" + not_a_number: ez nem szám + not_an_integer: Az értéknek egész számnak kell lennie + odd: "páratlan szám kell, hogy legyen" + record_invalid: 'Érvényesítés sikertelen: %{error}' + max_emojis: "nem lehet több mint %{max_emojis_count} emoji" + restrict_dependent_destroy: + one: "Nem lehet törölni rekordot, mert egy függÅ‘ %{rekord} létezik" + many: "Nem lehet törölni rekordot, mert függÅ‘ %{rekord} léteznek" + too_long: + one: túl hosszú (legfeljebb 1 karakter lehet) + other: túl hosszú (legfeljebb %{count} karakter lehet) + too_short: + one: túl rövid (minimum 1 karakter) + other: túl rövid (minimum %{count} karakter) + wrong_length: + one: nem megfelelÅ‘ hosszúságú. (1 karakter szükséges) + other: nem megfelelÅ‘ hosszúságú. (%{count} karakter szükséges) + other_than: "nem lehet %{count}" + template: + body: 'Problémák vannak az alábbi mezÅ‘kkel:' + embed: + load_from_remote: "Hiba történt a bejegyzés betöltése során!" + site_settings: + min_username_length_exists: "Nem lehet a legrövidebb felhasználói névnél rövidebb minimum felhasználói név hosszúságot beállítani." + min_username_length_range: "Nem lehet a maximum értéknél nagyobb minimum értéket beállítani." + max_username_length_exists: "Nem lehet a leghosszabb felhasználói névnél rövidebb maximum felhasználói név hosszúságot beállítani." + max_username_length_range: "Nem lehet a minimum értéknél kisebb maximum értéket beállítani." + default_categories_already_selected: "Nem lehet olyan kategóriát kiválasztani ami másik listában már használva van." + s3_upload_bucket_is_required: "Nem lehet engedélyezni a feltöltést az S3-ba amíg nincs megadva a 's3_upload_bucket'." + activemodel: + errors: + <<: *errors + invite: + not_found: "Meghívási tokened nem érvényes. Kérlek vedd fel a kapcsolatot az oldal adminisztrátorával." + backup: + operation_already_running: "Egy művelet jelenleg is fut. Nem tudunk újat indítani jelenleg." + backup_file_should_be_tar_gz: "A biztonsági mentésnek .tar.gz formátumúnak kell lennie." + not_enough_space_on_disk: "Nincs elég hely a lemezen, hogy feltöltsük ezt a biztonsági mentést." + invalid_filename: "A mentési fájlnév érvénytelen karaktereket tartalmaz. Érvényes karakterek a-z 0-9 . - _." + not_logged_in: "Be kell jelentkezned, hogy ezt megtehesd." + not_found: "A kért hivatkozás vagy forrás nem található." + invalid_access: "Nincs engedélyed a kért forrás megtekintéséhez." + authenticator_not_found: "Azonosítási mód nem létezik, vagy ki lett kapcsolva." + read_only_mode_enabled: "Ez a weboldal írásvédett módban van. Az interakciók le vannak tiltva." + reading_time: "Olvasási IdÅ‘" + likes: "Lájkok" + too_many_replies: + one: "Sajnáljuk, de az új felhasználók ideiglenesen csak 1 választ küldhetnek ugyanabba a témába." + other: "Sajnáljuk, de az új felhasználók ideiglenesen csak %{replies} választ küldhetnek ugyanabba a témába." + embed: + start_discussion: "Csevegés indítása" + continue: "Csevegés folytatása" + referer: "Hivatkozó:" + more_replies: + one: "és 1 további válasz" + other: "és %{count} további válasz" + loading: "Csevegés betöltése..." + permalink: "Közvetlen link" + imported_from: "Ez egy társ beszélgetés, az eredeti topic itt található: %{link}" + in_reply_to: "â–¶ %{username}" + replies: + one: "1 válasz" + other: "%{count} válasz" + no_mentions_allowed: "Sajnáljuk, de nem említhetsz meg más felhasználókat." + too_many_mentions: + one: "Sajnáljuk, de csak egy felhasználót említhetsz meg ebben a bejegyzésben." + other: "Sajnáljuk, de csak %{count} számú felhasználót említhetsz meg ebben a bejegyzésben." + no_mentions_allowed_newuser: "Sajnáljuk, de az új felhasználók nem említhetnek meg más felhasználókat." + too_many_mentions_newuser: + one: "Sajnáljuk, de az új felhasználók csak egy felhasználót említhetnek meg." + other: "Sajnáljuk, de az új felhasználók csak %{count} számú felhasználót említhetnek meg." + no_images_allowed_trust: "Sajnáljuk, de nem tudsz képeket rakni a bejegyzésbe" + no_images_allowed: "Sajnáljuk, de az új felhasználók nem tehetnek képeket a bejegyzésbe." + too_many_images: + one: "Sajnáljuk, de az új felhasználók csak %{count} képet rakhatnak a bejegyzéseikbe." + other: "Sajnáljuk, de az új felhasználók csak %{count} képet rakhatnak a bejegyzéseikbe." + no_attachments_allowed: "Sajnáljuk, de az új felhasználók nem adhatnak csatolmányokat a bejegyzéseikbe." + too_many_attachments: + one: "Sajnáljuk, de az új felhasználók csak %{count} csatolmányt adhatnak a bejegyzéseikbe." + other: "Sajnáljuk, de az új felhasználók csak %{count} csatolmányt adhatnak a bejegyzéseikbe." + no_links_allowed: "Sajnáljuk, de az új felhasználók nem tehetnek hivatkozásokat a bejegyzéseikbe." + too_many_links: + one: "Sajnáljuk, de az új felhasználók csak %{count} hivatkozást tehetnek a bejegyzéseikbe." + other: "Sajnáljuk, de az új felhasználók csak %{count} hivatkozást tehetnek a bejegyzéseikbe." + spamming_host: "Sajnáljuk, nem küldhetsz linket ennek a hostnak." + user_is_suspended: "A felfüggesztett felhasználók nem hozhatnak létre új bejegyzést." + topic_not_found: "Valami elromlott. Talán ezt a téma lezárták vagy törölték, miközben nézted?" + just_posted_that: "túl hasonló ahhoz, amit legutóbb megosztottál" + invalid_characters: "érvénytelen karaktereket tartalmaz" + next_page: "következÅ‘ oldal →" + prev_page: "↠elÅ‘zÅ‘ oldal" + page_num: "%{num}. oldal" + home_title: "KezdÅ‘lap" + topics_in_category: "Témák a '%{category}' kategóriában" + rss_posts_in_topic: "A '%{topic}' RSS feed-je" + rss_topics_in_category: "A '%{category}' témáinak az RSS feed-je" + author_wrote: "%{author} írta:" + num_posts: "Bejegyzések:" + num_participants: "RésztvevÅ‘k:" + read_full_topic: "Teljes téma elolvasása" + private_message_abbrev: "Üzenet" + rss_description: + latest: "Legutóbbi témák" + hot: "Legnépszerűbb témák" + top: "Top témák" + top_yearly: "Éves top témák" + top_quarterly: "3 havi top témák" + top_monthly: "Havi top témák" + top_weekly: "Heti top témák" + top_daily: "Napi top témák" + posts: "Legújabb bejegyzések" + private_posts: "Legutóbbi személyes üzenetek" + group_posts: "Legújabb bejegyzések %{group_name}-ból" + group_mentions: "Legújabb megemlítések %{group_name}-ból" + user_posts: "Legújabb bejegyzések @%{username} felhasználótól." + user_topics: "Legújabb témák @%{username} felhasználótól." + tag: "Megjelölt témák" + too_late_to_edit: "Ez a bejegyzés túl régen lett létrehozva. Már nem lehet szerkeszteni vagy törölni." + revert_version_same: "A jelenlegi verzió megegyezik azzal a verzióval amire vissza szeretne térni." + excerpt_image: "kép" + queue: + delete_reason: "Törölve lett a moderátori sor által" + not_found: "Bejegyzés nem található vagy frissítve lett." + groups: + errors: + can_not_modify_automatic: "Nem módosíthasz automata csoportot" + invalid_domain: "'%{domain}' nem érvényes domain." + invalid_incoming_email: "'%{email}' nem érvényes email cím." + email_already_used_in_group: "'%{email}' már használva van a '%{group_name}' csoport által." + email_already_used_in_category: "'%{email}' már használva van a '%{category_name}' kategória által." + default_names: + everyone: "mindenki" + admins: "adminisztrátorok" + moderators: "moderátorok" + staff: "személyzet" + trust_level_0: "bizalom_szint_0" + trust_level_1: "bizalom_szint_1" + trust_level_2: "bizalom_szint_2" + trust_level_3: "bizalom_szint_3" + trust_level_4: "bizalom_szint_4" + education: + until_posts: + one: "1 bejegyzés" + other: "%{count} bejegyzés" + activerecord: + attributes: + category: + name: "Kategória neve" + topic: + title: 'Cím' + post: + raw: "Test" + user_profile: + bio_raw: "Bemutatkozás" + errors: + <<: *errors + models: + topic: + attributes: + base: + too_many_users: "Egyszerre csak egy felhasználónak küldhetsz figyelmeztetést." + no_user_selected: "Érvényes felhasználót kell választanod." + user: + attributes: + password: + common: "egy a 10000 leggyakoribb jelszó közül. Arra kérünk, hogy használj egy biztonságosabb jelszót!" + same_as_username: "azonos a felhasználói neveddel. Használj biztonságosabb jelszót!" + same_as_email: "azonos az email címeddel. Használj biztonságosabb jelszót!" + same_as_current: "azonos a jelenlegi jelszavaddal." + ip_address: + signup_not_allowed: "Feliratkozás nem lehetséges errÅ‘l a fiókról." + color_scheme_color: + attributes: + hex: + invalid: "egy érvénytelen szín" + vip_category_name: "Társalgó" + vip_category_description: "A kategória csak 3, vagy magasabb bizalmi szinttel rendelkezÅ‘ tagok számára érhetÅ‘ el." + meta_category_name: "Visszajelzés" + meta_category_description: "Beszélgetés errÅ‘l az oldalról, a szervezetérÅ‘l, arról hogy hogyan működés és hogyan tudnánk jobbá tenni." + staff_category_name: "Személyzet" + staff_category_description: "Privát kategória a személyzet számára. Ezeket a témákat csak adminok és moderátorok látják." + lounge_welcome: + title: "Üdv a társalgóban" + category: + topic_prefix: "A %{category} kategóriáról" + errors: + not_found: "Kategória nem található!" + uncategorized_parent: "Nem kategorizált elem nem rendelkezhet szülÅ‘ kategóriával" + self_parent: "Az alkategória nem tartozhat önmaga alá" + invalid_email_in: "'%{email}' nem érvényes email cím." + email_already_used_in_group: "'%{email}' már használva van a '%{group_name}' csoport által." + email_already_used_in_category: "'%{email}' már használva van a '%{category_name}' kategória által." + cannot_delete: + uncategorized: "Nem kategorizált elemet nem lehet törrölni" + has_subcategories: "Nem lehet kitörölni ezt a kategóriát, mert vannak alkategóriái." + topic_exists_no_oldest: "Nem lehet törölni ezt a kategóriát, mert benne a témák száma %{count}." + uncategorized_description: "Témák, amelyeknek nincs szükségük kategóriára, vagy nem férnek bele semmilyen más létezÅ‘ kategóriába." + trust_levels: + newuser: + title: "új felhasználó" + basic: + title: "egyszerű felhasználó" + member: + title: "tag" + regular: + title: "általános" + leader: + title: "vezetÅ‘" + post: + image_placeholder: + broken: "A kép törött" + rate_limiter: + slow_down: "Túl sokszor hajtottad már végre ezt a müveletet, kérlek próbáld újra késÅ‘bb." + too_many_requests: "Túl sokszor hajtottad már végre ezt a müveletet, kérlek várj %{time_left} mielÅ‘tt újra próbálnád." + hours: + one: "1 óra" + other: "%{count} óra" + minutes: + one: "1 perc" + other: "%{count} perc" + seconds: + one: "1 másodperc" + other: "%{count} másodperc" + short_time: "néhány másodperc" + datetime: + distance_in_words: + half_a_minute: "< 1p" + less_than_x_seconds: + one: "< 1mp" + other: "< %{count}mp" + x_seconds: + one: "1mp" + other: "%{count}mp" + less_than_x_minutes: + one: "< 1p" + other: "< %{count}p" + x_minutes: + one: "1p" + other: "%{count}p" + about_x_hours: + one: "1ó" + other: "%{count}ó" + x_days: + one: "1n" + other: "%{count}n" + about_x_months: + one: "1hó" + other: "%{count}hó" + x_months: + one: "1hó" + other: "%{count}hó" + about_x_years: + one: "1év" + other: "%{count}év" + over_x_years: + one: "> 1év" + other: "> %{count}év" + almost_x_years: + one: "1év" + other: "%{count}év" + distance_in_words_verbose: + half_a_minute: "éppen most" + less_than_x_seconds: + one: "éppen most" + other: "éppen most" + x_seconds: + one: "1 másodperce" + other: "%{count} másodperce" + less_than_x_minutes: + one: "kevesebb, mint 1 perce" + other: "kevesebb, mint %{count} perce" + x_minutes: + one: "1 perce" + other: "%{count} perce" + about_x_hours: + one: "1 órája" + other: "%{count} órája" + x_days: + one: "1 napja" + other: "%{count} napja" + about_x_months: + one: "kb. 1 hónapja" + other: "kb. %{count} hónapja" + x_months: + one: "1 hónapja" + other: "%{count} hónapja" + about_x_years: + one: "kb. 1 éve" + other: "kb. %{count} éve" + over_x_years: + one: "több, mint 1 éve" + other: "több, mint %{count} éve" + almost_x_years: + one: "majdnem 1 éve" + other: "majdnem %{count} éve" + password_reset: + no_token: "Sajnos a jelszómódosítás link túl régi. Ahhoz, hogy egy új linket kapjál, válaszd ki a Bejelentkezés gombot és használd az 'Elfelejtettem a jelszót' opciót." + choose_new: "Válassz egy új jelszót" + choose: "Válassz egy jelszót" + update: 'Jelszó frissítése' + save: 'Jelszó beállítása' + title: 'Jelszó visszaállítása' + success: "Sikeresen megváltoztattad a jelszavadat és bejelentkeztél!" + success_unapproved: "Sikeresen megváltoztattad a jelszavadat!" + email_login: + title: "Email bejelentkezés" + change_email: + confirmed: "Az email címed frissítve lett!" + please_continue: "Tovább a %{site_name}-ra" + error: "Hiba az email cím változtatásánál. Lehet hogy már használatban van?" + authorizing_old: + title: "Köszönjük hogy megerÅ‘sítetted az email címedet." + activation: + action: "Kattints ide hogy aktiváld a felhasználói fiókodat." + already_done: "Sajnáljuk, ez a fiók megerÅ‘sítési hivatkozás már érvénytelen! Lehet, hogy a fiókod már aktiválva van?" + please_continue: "Fiókodat aktiváltuk, most visszairányítunk a kezdÅ‘oldalra." + continue_button: "Tovább a %{site_name}-ra" + welcome_to: "Üdv a %{site_name}-on!" + admin_confirm: + title: "Adminisztrátori Fiók MegerÅ‘sítése" + grant: "Adminisztrátori Hozzáférés Adása" + back_to: "Vissza %{title}" + post_action_types: + off_topic: + title: 'Off-Topik' + long_form: 'megjelölve mint off-topic' + spam: + title: 'Szemét' + long_form: 'spamnek jelölve' + email_title: '"%{title}" spam-nek jelölve' + email_body: "%{link}\n\n%{message}" + inappropriate: + title: 'Alkalmatlan' + long_form: 'nem a témába tartozónak jelölve' + notify_user: + email_title: 'A bejegyzésed itt "%{title}"' + notify_moderators: + title: "Valami más" + email_body: "%{link}\n\n%{message}" + bookmark: + title: 'KönyvjelzÅ‘' + description: 'Bejegyzés hozzáadása a könyvjelzÅ‘khöz' + short_description: 'Bejegyzés hozzáadása a könyvjelzÅ‘khöz' + long_form: 'a bejegyzés hozzáadva a könyvjelzÅ‘khöz' + like: + title: 'Kedvel' + description: 'Bejegyzés kedvelése' + short_description: 'Bejegyzés kedvelése' + long_form: 'kedvelve' + user_activity: + no_default: + self: "Nincsenek tevékenységek." + others: "Nincs tevékenység." + no_bookmarks: + others: "Nincsenek könyvjelzÅ‘k." + no_likes_given: + others: "Nincsenek kedvelt bejegyzések." + no_replies: + others: "Nincsenek válaszok." + topic_flag_types: + spam: + title: 'Szemét' + long_form: 'szemétnek jelölte ezt' + short_description: 'Ez egy hirdetés' + inappropriate: + title: 'Alkalmatlan' + notify_moderators: + title: "Valami más" + email_title: 'A következÅ‘ témakör "%{title}" moderátori figyelmet igényel' + email_body: "%{link}\n\n%{message}" + archetypes: + regular: + title: "Ãltalános téma" + banner: + title: "Kiemelt Téma" + unsubscribed: + title: "Leiratkozott!" + unsubscribe: + title: "Leiratkozás" + log_out: "Kijelentkezés" + user_api_key: + authorize: "Engedélyezés" + read: "olvasható" + read_write: "olvasható/írható" + reports: + default: + labels: + percent: Százalék + day: Nap + post_edits: + labels: + post: Bejegyzés + editor: SzerkesztÅ‘ + author: SzerzÅ‘ + edit_reason: Indok + visits: + title: "Felhasználói látogatások" + xaxis: "Nap" + yaxis: "Látogatások száma" + signups: + title: "Feliratkozások" + xaxis: "Nap" + yaxis: "Feliratkozások száma" + new_contributors: + xaxis: "Nap" + dau_by_mau: + xaxis: "Nap" + daily_engaged_users: + xaxis: "Nap" + profile_views: + title: "Felhasználói Profil Megtekintések" + xaxis: "Nap" + yaxis: "Felhasználói profil megtekintések száma" + topics: + title: "Témák" + xaxis: "Nap" + yaxis: "Új témák száma" + posts: + title: "Bejegyzések" + xaxis: "Nap" + yaxis: "Új bejegyzések száma" + likes: + title: "Kedvelések" + xaxis: "Nap" + yaxis: "Új kedvelések száma" + flags: + title: "Jelölések" + xaxis: "Nap" + yaxis: "Jelölések száma" + bookmarks: + title: "KönyvjelzÅ‘k" + xaxis: "Nap" + yaxis: "Új könyvjelzÅ‘k száma" + starred: + title: "Csillagozott" + xaxis: "Nap" + yaxis: "Új csillagozott témák száma" + users_by_trust_level: + title: "Felhasználok láma bizalmi szintenként" + xaxis: "Bizalmi szint" + yaxis: "Felhasználók száma" + labels: + level: Szint + trending_search: + labels: + searches: Keresések + emails: + title: "Kiküldött levelek" + xaxis: "Nap" + yaxis: "Levelek száma" + user_to_user_private_messages: + xaxis: "Nap" + yaxis: "Üzenetek száma" + system_private_messages: + title: "Rendszer" + xaxis: "Nap" + yaxis: "Üzenetek száma" + moderator_warning_private_messages: + title: "Moderátori figyelmeztetés" + xaxis: "Nap" + yaxis: "Üzenetek száma" + notify_moderators_private_messages: + title: "Moderátorok értesítése" + xaxis: "Nap" + yaxis: "Üzenetek száma" + notify_user_private_messages: + title: "Felhasználó értesítése" + xaxis: "Nap" + yaxis: "Üzenetek száma" + top_referrers: + xaxis: "Felhasználó" + num_clicks: "Kattintások" + num_topics: "Témák" + top_traffic_sources: + xaxis: "Domain" + num_clicks: "Kattintások" + num_topics: "Témák" + num_users: "Felhasználók" + labels: + domain: Domain + num_clicks: Kattintások + num_topics: Témák + top_referred_topics: + title: "Legtöbbet Hivatkozott Témák" + labels: + num_clicks: "Kattintások" + topic: "Témák" + page_view_anon_reqs: + title: "Névtelen" + xaxis: "Nap" + page_view_logged_in_reqs: + title: "Bejelentkezve" + xaxis: "Nap" + page_view_crawler_reqs: + title: "KeresÅ‘ Robotok" + xaxis: "Nap" + page_view_total_reqs: + title: "Oldalmegtekintések" + xaxis: "Nap" + yaxis: "Összes Oldalmegtekintés" + page_view_logged_in_mobile_reqs: + title: "Bejelentkezett Oldalmegtekintések" + xaxis: "Nap" + yaxis: "Mobilos Bejelentkezett Oldalmegtekintések" + page_view_anon_mobile_reqs: + xaxis: "Nap" + http_background_reqs: + title: "Háttér" + xaxis: "Nap" + http_2xx_reqs: + title: "Ãllapot 2xx (OK)" + xaxis: "Nap" + yaxis: "Sikeres kérések (Ãllapot 2xx)" + http_3xx_reqs: + title: "HTTP 3xx (Ãtirányítás)" + xaxis: "Nap" + http_4xx_reqs: + title: "HTTP 4xx (Kliens Hiba)" + xaxis: "Nap" + yaxis: "Kliens Hibák (Ãllapot 4xx)" + http_5xx_reqs: + title: "HTTP 5xx (Szerver Hiba)" + xaxis: "Nap" + yaxis: "Szerver Hibák (Ãllapot 5xx)" + http_total_reqs: + title: "Összes" + xaxis: "Nap" + yaxis: "Összes kérés" + time_to_first_response: + title: "ElsÅ‘ válasz ideje" + xaxis: "Nap" + yaxis: "Ãtlagos idÅ‘ (óra)" + topics_with_no_response: + title: "Témák hozzászólás nélkül" + xaxis: "Nap" + yaxis: "Összes" + mobile_visits: + xaxis: "Nap" + yaxis: "Látogatások száma" + web_crawlers: + labels: + user_agent: "User Agent" + page_views: "Oldalmegtekintések" + dashboard: + rails_env_warning: "A szerver jelenleg %{env} módban fut." + host_names_warning: "A config/database.yml file az alapértelmezett 'localhost' domaint használja. Ãllítsd be az oldalad saját domain nevét." + gc_warning: 'A szerver az alapértelmezett ruby memóriakezelést használja, ami nem a legoptimálisabb teljesítmény szempontjából. Olvasd el ezt a teljesítmény fokozásáról: Tuning Ruby and Rails for Discourse.' + memory_warning: 'A kiszolgálód kevesebb mint 1GB memóriával rendelkezik. Minimum 1GB memória ajánlott.' + site_settings: + allow_moderators_to_create_categories: "Új kategóriák létrehozásának engedélyezése a moderátorok számára" + enable_badges: "A jelvény-rendszer engedélyezése" + min_password_length: "Minimum jelszó hossz." + block_common_passwords: "A 10,000 leggyakoribb jelszó tiltása." + reply_by_email_enabled: "E-mail válaszok engedélyezése." + enable_emoji: "Emoji-k engedélyezése" + errors: + invalid_email: "Érvénytelen e-mail cím." + invalid_username: "Nincs ilyen nevű felhasználó." + invalid_integer_min_max: "Az értéknek %{min} és %{max} között kell lennie." + invalid_integer_min: "Az érték nem lehet kisebn, mint %{min}." + invalid_integer_max: "Az érték nem lehet nagyobb, mint %{max}." + invalid_integer: "Az értéknek egész számnak kell lennie." + regex_mismatch: "Az érték nem felel meg az elvárt formának." + invalid_string: "Érvénytelen érték." + invalid_string_min_max: "%{min} és %{max} között kell lennie a karakterek számának." + invalid_string_min: "Nem lehet rövidebb, mint %{min} karakter." + invalid_string_max: "Nem lehet hosszabb, mint %{max} karakter." + search: + within_post: "#%{post_number}, általa: %{username}" + types: + category: 'Kategóriák' + topic: 'Eredmények' + user: 'Felhasználók' + original_poster: "Eredeti szerzÅ‘" + most_posts: "Legtöbb bejegyzés" + most_recent_poster: "Legutóbbi szerzÅ‘k" + frequent_poster: "Gyakori szerzÅ‘k" + redirected_to_top_reasons: + new_user: "Üdv a közösségünkben! Ezek a legnépszerűbb témakörök." + not_seen_in_a_month: "Üdv újra itt! Régóta nem láttunk. Ezek a legnépszerűbb témakörök, mióta nem látogattad az oldalt." + topic_statuses: + archived_enabled: "Ez a témakör jelenleg archíválva van. Be lett fagyasztva, szóval nem lehet megváltoztatni semmilyen módon." + archived_disabled: "Ez a topik jelenleg nincs archíválva. Már nincs befagyasztva, így lehet rajta változtatni." + closed_enabled: "A témakör le van zárva. Nem lehet mostantól válaszolni rá." + closed_disabled: "A témakör jelenleg nyitott. Mostantól lehet válaszolni rá." + login: + not_approved: "Még nem fogadták el a regisztrációs kérelmedet! Értesítve leszel, amint bejelentkezhetsz." + incorrect_username_email_or_password: "Hibás felhasználónév, e-mail vagy jelszó" + wait_approval: "Köszönjük, hogy regisztráltál! Értesíteni fogunk, amint elfogadták a kérelmedet." + active: "A fiókodat aktiváltuk és készen áll a használatra!" + suspended: "Nem jelentkezhetsz be eddig: %{date}." + suspended_with_reason: "A fiók felfüggesztve %{date} -ig: %{reason}" + errors: "%{errors}" + something_already_taken: "Valami félrecsúszott. Talán a felhasználónév vagy az e-mail cím már regisztrálva van. Próbáld meg az elfelejtett jelszó részt." + omniauth_error_unknown: "Valamiért nem sikerült bejelentkezned. Kérünk próbáld újra!" + new_registrations_disabled: "Az új fiókok létrehozása nem engedélyezett jelenleg." + password_too_long: "A jelszavak 200 karakter hosszúságúra vannak limitálva." + reserved_username: "Ez a felhasználónév nem engedélyezett." + missing_user_field: "Nem töltötted ki az összes felhasználói mezÅ‘t" + click_to_continue: "Kattints ide a folytatáshoz." + user: + username: + short: "nem lehet rövidebb, mint %{min} karakter" + long: "nem lehet hosszabb, mint %{max} karakter" + unique: "egyedi kell, hogy legyen" + blank: "megadása kötelezÅ‘" + must_begin_with_alphanumeric_or_underscore: "betűvel, számmal vagy aláhúzással kell kezdÅ‘dni." + must_end_with_alphanumeric: "betűvel vagy számmal kell, hogy végzÅ‘djön." + email: + blocked: "nincs engedélyezve." + flags_dispositions: + disagreed: "Köszönjük, hogy jelezted felénk! Utánanézünk!" + deferred: "Köszönjük, hogy jelezted felénk! Utánanézünk!" + deferred_and_deleted: "Köszönjük, hogy jelezted felénk! Eltávolítottuk a bejegyzést!" + system_messages: + welcome_user: + subject_template: "Üdvözlünk a %{site_name} oldalán!" + welcome_invite: + subject_template: "Üdvözlünk a %{site_name} oldalán!" + backup_succeeded: + subject_template: "Sikeresen befejezÅ‘dött a biztonsági mentés" + backup_failed: + title: "Sikertelen biztonsági mentés" + subject_template: "Sikertelen biztonsági mentés" + restore_succeeded: + subject_template: "Sikeresen befejezÅ‘dött a visszaállítás" + restore_failed: + title: "Sikertelen visszaállítás" + subject_template: "Sikertelen visszaállítás" + bulk_invite_succeeded: + subject_template: "Sikeresen végbement a csoportos felhasználó-meghívás" + text_body_template: "Sikeresen végbement a csoportos felhasználó-meghívás! %{sent} meghívó lett kiküldve." + bulk_invite_failed: + subject_template: "Hiba lépett fel a csoportos felhasználó-meghívás folyamán" + csv_export_failed: + title: "CSV exportálás sikertelen" + subject_template: "Az adatok exportálása sikertelen" + download_remote_images_disabled: + subject_template: "A távoli képek letöltése le lett tiltva" + text_body_template: "A `download_remote_images_to_local` beállítás le lett tiltva, mivel elértük az erre szánt `download_remote_image_threshold` tárhelylimitet." + subject_re: "Re: " + subject_pm: "[Privát Üzenet]" + user_notifications: + previous_discussion: "Régebbi válaszok" + in_reply_to: "Válasz" + unsubscribe: + title: "Leiratkozás" + description: "Nem szeretné ezeket az e-maileket megkapni? Nem probléma! Kattints ide és iratkozzon le azonnal:" + posted_by: "Beküldve %{username} által, ekkor: %{post_date}" + pm_participants: "RésztvevÅ‘k: %{participants}" + user_invited_to_private_message_pm_group: + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm_staged: + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_topic: + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_replied: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_quoted: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_mentioned: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_mentioned_pm: + subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm: + subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} + account_exists: + subject_template: "[%{email_prefix}] A fiók már létezik" + digest: + why: "Egy kis összefoglaló az oldalról - %{site_link} -, hogy mik történtek a legutóbbi látogatásod - %{last_seen_at} - óta" + since_last_visit: "Utolsó látogatásod óta" + new_topics: "Új témák" + unread_messages: "Olvasatlan üzenetek" + unread_notifications: "Olvasatlan értesítések" + liked_received: "Kapott kedvelések" + new_posts: "Új bejegyzések" + new_users: "Új felhasználók" + popular_topics: "Népszerű témák" + follow_topic: "Téma követése" + join_the_discussion: "Tovább" + popular_posts: "Népszerű bejegyzések" + subject_template: "[%{email_prefix}] Összefoglaló" + your_email_settings: "email beállításaid" + click_here: "kattints ide" + from: "%{site_name} összefoglaló" + forgot_password: + title: "Elfelejtett jelszó" + subject_template: "[%{email_prefix}] Jelszó visszaállítás" + admin_login: + subject_template: "[%{email_prefix}] Bejelentkezés" + signup: + title: "Feliratkozás" + page_not_found: + popular_topics: "Népszerű" + recent_topics: "Friss" + see_more: "Több" + search_title: "Keresés az oldalon" + deleted: 'törölt' + image: "kép" + upload: + images: + size_not_found: "Sajnáljuk, de nem tudtuk megállapítani a kép méretét. Lehetséges hogy megsérült?" + color_schemes: + light: "Light Scheme" + dark: "Dark Scheme" + neutral: "Neutral Scheme" + grey_amber: "Grey Amber Scheme" + shades_of_blue: "Shades of Blue Scheme" + latte: "Latte Scheme" + summer: "Summer Scheme" + dark_rose: "Dark Rose Scheme" + default_theme_name: "Light" + light_theme_name: "Light" + dark_theme_name: "Dark" + neutral_theme_name: "Neutral" + grey_amber_theme_name: "Grey Amber" + shades_of_blue_theme_name: "Shades of Blue" + latte_theme_name: "Latte" + summer_theme_name: "Summer" + dark_rose_theme_name: "Dark Rose" + about: "About" + guidelines: "Irányelvek" + privacy: "Adatvédelem" + csv_export: + boolean_yes: "Igen" + boolean_no: "Nem" + guidelines_topic: + title: "GYIK/Irányelvek" + tos_topic: + title: "Szolgáltatási feltételek" + privacy_topic: + title: "Adatvédelmi szabályzat" + badges: + member: + name: Tag + regular: + name: Ãltalános + leader: + name: VezetÅ‘ + welcome: + name: Üdvözöllek + reader: + name: Olvasó + thank_you: + name: Köszönöm + first_emoji: + name: ElsÅ‘ Emoji + first_mention: + name: ElsÅ‘ Megemlítés + admin_login: + errors: + unknown_email_address: "Ismertlen email cím" + invalid_token: "Érvénytelen token." + email_input: "Adminisztrátor Email" + submit_button: "Email küldése" + tags: + title: "Címkék" + minimum_required_tags: "Választanod kell legalább %{count} címkét." + rss_by_tag: "Téma meg lett jelölve %{tag}" + finish_installation: + congratulations: "Gratulálunk, telepítetted a Discourse-t!" + register: + button: "Regisztrálás" + title: "Adminisztrátor Fiók Regisztrálása" + confirm_email: + title: "ErÅ‘sítsd meg az Emailed" + resend_email: + title: "Aktiváló Email Újraküldése" + wizard: + step: + forum_title: + title: "Név" + introduction: + title: "Bemutatkozás" + privacy: + title: "Hozzáférés" + fields: + privacy: + choices: + open: + label: "Nyilvános" + restricted: + label: "Privát" + contact: + title: "Kapcsolat" + fields: + contact_email: + label: "Email" + placeholder: "name@example.com" + contact_url: + label: "Weboldal" + placeholder: "http://www.example.com/contact-us" + site_contact: + label: "Automatikus Üzenetek" + corporate: + title: "Szervezet" + fields: + company_short_name: + label: "Cég Neve (rövid)" + placeholder: "Initech" + company_full_name: + label: "Cég Neve (teljes)" + placeholder: "Initech, Inc." + company_domain: + label: "Cég Domain Neve" + placeholder: "initech.com" + colors: + title: "Téma" + fields: + theme_id: + choices: + default: + label: "Simple Light" + dark: + label: "Simple Dark" + logos: + title: "Logók" + fields: + logo_url: + label: "ElsÅ‘dleges logó" + logo_small_url: + label: "Kompakt logó" + icons: + title: "Ikonok" + fields: + favicon_url: + label: "Kicsi ikon" + apple_touch_icon_url: + label: "Nagy ikon" + homepage: + title: "FÅ‘oldal" + fields: + homepage_style: + choices: + latest: + label: "Legutóbbi témák" + categories_only: + label: "Csak kategóriák" + categories_with_featured_topics: + label: "Kategóriák kiemelt témákkal" + categories_and_latest_topics: + label: "Kategóriák és legutóbbi témák" + categories_and_top_topics: + label: "Kategóriák és top témák" + emoji: + title: "Emoji" + invites: + title: "Személyzet meghívása" + finished: + title: "A Discourse készen áll!" + joined: "Csatlakozott" + discourse_push_notifications: + popup: + confirm_title: 'Értesítések bekapcsolva - %{site_title}' + confirm_body: 'Siker! Értesítések engedélyezve.' + staff_action_logs: + not_found: "nem található" + unknown: "ismeretlen" + user_merged: "%{username} össze lett vonva ezzel a fiókkal" diff --git a/config/locales/server.id.yml b/config/locales/server.id.yml index 72259317ab..5aaaa11bff 100644 --- a/config/locales/server.id.yml +++ b/config/locales/server.id.yml @@ -95,32 +95,32 @@ id: reading_time: "Waktu bacaan" likes: "Suka" too_many_replies: - other: Maaft, bagi pengguna baru sementara ini hanya dibatasi hingga %{count} jawaban dalam topik yang sama. + other: "Maaft, bagi pengguna baru sementara ini hanya dibatasi hingga %{count} jawaban dalam topik yang sama." embed: start_discussion: "Mulai Diskusi" continue: "Lanjutkan Diskusi" more_replies: - other: '%{count} jawaban lainnya' + other: "%{count} jawaban lainnya" loading: "Sedang memuat diskusi..." imported_from: "Ini adalah topik diskusi tambahan untuk topik utama di %{link}" in_reply_to: "â–¶ %{username}" replies: - other: '%{count} balasan' + other: "%{count} balasan" no_mentions_allowed: "Maaf, Anda tidak dapat menyebut pengguna lain." too_many_mentions: - other: Maaf, Anda hanya diperbolehkan untuk menyebut %{count} pengguna dalam satu posting. + other: "Maaf, Anda hanya diperbolehkan untuk menyebut %{count} pengguna dalam satu posting." no_mentions_allowed_newuser: "Maaf, pengguna baru tidak diijinkan untuk menyebut pengguna lain." too_many_mentions_newuser: - other: Maaf, pengguna baru hanya diperbolehkan untuk menyebut %{count} pengguna dalam satu posting. + other: "Maaf, pengguna baru hanya diperbolehkan untuk menyebut %{count} pengguna dalam satu posting." no_images_allowed: "Maaf, pengguna baru tidak diperbolehkan untuk memasang gambar/foto dalam posting." too_many_images: - other: Maaf, pengguna baru hanya diperbolehkan untuk memasang %{count} gambar/foto dalam satu posting. + other: "Maaf, pengguna baru hanya diperbolehkan untuk memasang %{count} gambar/foto dalam satu posting." no_attachments_allowed: "Maaf, pengguna baru tidak diijinkan untuk mengunggah file/attachment dalam posting." too_many_attachments: - other: Maaf, pengguna baru hanya diijinkan untuk mengunggah %{count} file/attachment dalam satu posting. + other: "Maaf, pengguna baru hanya diijinkan untuk mengunggah %{count} file/attachment dalam satu posting." no_links_allowed: "Maaf, pengguna baru tidak diijinkan untuk menulis tautan dalam posting." too_many_links: - other: Maaf, pengguna baru hanya diijinkan untuk menulis %{count} tautan dalam satu posting. + other: "Maaf, pengguna baru hanya diijinkan untuk menulis %{count} tautan dalam satu posting." spamming_host: "Maaf, Anda tidak dapat mencantumkan tautan ke host tersebut." user_is_suspended: "Pengguna yang dalam masa suspensi tidak diperbolehkan untuk membuat posting." topic_not_found: "Ada yang salah. Mungkin topik ini ditutup atau dihapus ketika Anda sedang menjelajahinya?" @@ -166,7 +166,7 @@ id: trust_level_4: "trust_level_4" education: until_posts: - other: '%{count} post' + other: "%{count} post" activerecord: attributes: category: @@ -224,36 +224,36 @@ id: title: "pemimpin" rate_limiter: hours: - other: '%{count} jam' + other: "%{count} jam" minutes: - other: '%{count} menit' + other: "%{count} menit" seconds: - other: '%{count} detik' + other: "%{count} detik" datetime: distance_in_words_verbose: half_a_minute: "baru saja" less_than_x_seconds: - other: baru saja + other: "baru saja" x_seconds: - other: '%{count} detik yang lalu' + other: "%{count} detik yang lalu" less_than_x_minutes: - other: kurang dari %{count} menit yang lalu + other: "kurang dari %{count} menit yang lalu" x_minutes: - other: '%{count} menit yang lalu' + other: "%{count} menit yang lalu" about_x_hours: - other: '%{count} jam yang lalu' + other: "%{count} jam yang lalu" x_days: - other: '%{count} hari yang lalu' + other: "%{count} hari yang lalu" about_x_months: - other: sekitar %{count} bulan yang lalu + other: "sekitar %{count} bulan yang lalu" x_months: - other: '%{count} bulan yang lalu' + other: "%{count} bulan yang lalu" about_x_years: - other: sekitar %{count} tahun yang lalu + other: "sekitar %{count} tahun yang lalu" over_x_years: - other: lebih dari %{count} tahun yang lalu + other: "lebih dari %{count} tahun yang lalu" almost_x_years: - other: hampir %{count} tahun yang lalu + other: "hampir %{count} tahun yang lalu" password_reset: update: 'Perbaharui Kata Sandi' success: "Anda telah mengubah kata sandi dengan sukses dan sekarang telah login." @@ -372,9 +372,6 @@ id: num_clicks: "Klik" num_topics: "Topik" num_users: "Pengguna" - top_referred_topics: - xaxis: "Topik" - num_clicks: "Klik" page_view_anon_reqs: title: "Anonim" xaxis: "Hari" @@ -413,7 +410,6 @@ id: xaxis: "Hari" yaxis: "Total" mobile_visits: - title: "Kunjungan Pengguna" xaxis: "Hari" yaxis: "Jumlah kunjungan" dashboard: @@ -443,7 +439,7 @@ id: system_messages: pending_users_reminder: subject_template: - other: '%{count} pengguna sedang menunggu persetujuan' + other: "%{count} pengguna sedang menunggu persetujuan" user_notifications: previous_discussion: "Balasan Sebelumnya" posted_by: "Dipost oleh %{username} pada %{post_date}" @@ -454,9 +450,6 @@ id: upload: images: size_not_found: "Maaf, kami tidak dapat mendeteksi ukuran dari gambar. Apa berkas gambar yang Anda unggah rusak?" - email_log: - no_user: "Tidak dapat menemukan pengguna dengan id %{user_id}" - post_not_found: "Tidak dapat menemukan post dengan id %{post_id}" guidelines: "Petunjuk" privacy: "Privasi" tos_topic: diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 74f513bf30..293e36912b 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -29,24 +29,50 @@ it: loading: "Caricamento" powered_by_html: 'Fornito da Discourse, si consiglia di abilitare JavaScript' log_in: "Connetti" + submit: "Invia" purge_reason: "Account cancellato automaticamente perché abbandonato o disattivato" disable_remote_images_download_reason: "Lo scaricamento delle immagini remote è stato disabilitato perché non c'è abbastanza spazio disco disponibile." anonymous: "Anonimo" remove_posts_deleted_by_author: "Cancellato dall'autore" + redirect_warning: "Non è stato possibile verificare che il collegamento che hai selezionato sia stato effettivamente pubblicato sul forum. Se desideri procedere comunque, seleziona il collegamento qui sotto." themes: bad_color_scheme: "Impossibile aggiornare il tema, lo schema colori non è valido" other_error: "Qualcosa è andato storto durante l'aggiornamento del tema" + error_importing: "Errore nella clonazione del repository git, accesso negato o repository non trovato" + errors: + component_no_user_selectable: "I componenti del tema non possono essere selezionabili dall'utente" + component_no_default: "I componenti del tema non possono essere il tema predefinito" + no_multilevels_components: "I temi con temi figlio non possono essere essi stessi temi figlio" + settings_errors: + invalid_yaml: "Il codice YAML fornito è invalido." + data_type_not_a_number: "L'impostazione del tipo `%{name}` non è supportata. I tipi supportati sono `integer`, `bool`, `list` e `enum`" + name_too_long: "Una delle impostazioni ha un nome troppo lungo. La lunghezza massima è 255 caratteri" + default_value_missing: "L'impostazione `%{name}` non ha valore predefinito" + default_not_match_type: "L'impostazione del valore di `%{name}` valore predefinito non corrisponde al tipo di impostazione." + default_out_range: "L'impostazione del valore predefinito `%{name}` non è nell'intervallo specificato." + enum_value_not_valid: "Il valore selezionato non è una delle opzioni enum." + number_value_not_valid: "Il nuovo valore non è compreso nell'intervallo consentito." + number_value_not_valid_min_max: "Deve essere tra %{min} e %{max}." + number_value_not_valid_min: "Deve essere maggiore o uguale a %{min}." + number_value_not_valid_max: "Deve essere minore o uguale a %{max}." + string_value_not_valid: "La nuova lunghezza del valore non rientra nell'intervallo consentito." + string_value_not_valid_min_max: "Deve essere compreso tra %{min} e %{max} caratteri." + string_value_not_valid_min: "Deve contenere almeno %{min} caratteri." + string_value_not_valid_max: "Deve contenere al massimo %{max} caratteri." emails: incoming: default_subject: "L'argomento necessita di un titolo" show_trimmed_content: "Mostra contenuto tagliato" maximum_staged_user_per_email_reached: "E' stato raggiunto il numero massimo di utenti temporanei creati via email." + no_subject: "(nessun oggetto)" + no_body: "(nessun corpo del messaggio)" errors: empty_email_error: "Succede quando l'email ricevuta era vuota." no_message_id_error: "Succede quando l'email non ha l'intestazione 'Message-Id'." auto_generated_email_error: "Succede quando l'intestazione 'precedence' è impostata su: list, junk, bulk oppure auto_reply, oppure quando qualunque altra intestazione contiene: auto-submitted, auto-replied o auto-generated." no_body_detected_error: "Succede quando non si riesce ad estrapolare il corpo del messaggio e non ci sono allegati. " no_sender_detected_error: "Succede quando non abbiamo trovato un indirizzo email valido nell'intestazione From." + from_reply_by_address_error: "Accade quando l'intestazione From corrisponde alla risposta per indirizzo email." inactive_user_error: "Succede quando il mittente non è attivo." silenced_user_error: "Succede quando il mittente è stato silenziato." bad_destination_address: "Succede quando nessuno degli indirizzi email presenti nei campi A/Cc/Ccn corrisponde ad alcun indirizzo email entrante tra quelli configurati." @@ -88,6 +114,8 @@ it: not_an_integer: deve essere un intero odd: deve essere dispari record_invalid: 'Validazione fallita: %{errors}' + max_emojis: "non può avere più di %{max_emojis_count} emoji" + ip_address_already_screened: "è già incluso in una regola esistente" restrict_dependent_destroy: one: "Impossibile cancellare il record poiché ne esistono %{record} dipendenti" many: "Impossibile cancellare il record poiché esiste %{record} dipendente" @@ -109,17 +137,27 @@ it: embed: load_from_remote: "Si è verificato un errore nel caricamento del messaggio." site_settings: + invalid_choice: + one: 'Hai specificato la scelta non valida %{name}' + other: 'Hai specificato le scelte non valide %{name}' min_username_length_exists: "C'è almeno un utente con il nome più corto della lunghezza minima che stai cercando di impostare." min_username_length_range: "Non puoi impostare il minimo più grande del massimo." max_username_length_exists: "C'è almeno un utente con il nome più lungo della lunghezza massima che stai cercando di impostare." max_username_length_range: "Non puoi impostare il massimo inferiore al minimo." default_categories_already_selected: "Non puoi selezionare una categoria usata in un'altra lista." s3_upload_bucket_is_required: "Non è possibile attivare i caricamenti su S3 a meno che non imposti l'opzione 's3_upload_bucket'." + conflicting_google_user_id: 'Il Google Account ID per questo account è cambiato; l''intervento dello staff è richiesto per motivi di sicurezza. Si prega di contattare staff e puntarli a
https://meta.discourse.org/t/76575' activemodel: errors: <<: *errors invite: not_found: "Il tuo token di invito non è valido. Per favore contatta l'amministratore del sito." + not_found_template: | +

Il tuo invito a %{site_name} è già stato riscattato.

+ +

Se ricordi la tua password puoi effettuare il Login.

+ +

In caso contrario Reimposta la Password.

user_exists: "Non c'è bisogno di invitare %{email}, perché ha già un account!" bulk_invite: file_should_be_csv: "Il file caricato deve essere in formato csv." @@ -131,16 +169,20 @@ it: backup_file_should_be_tar_gz: "Il file di backup deve essere un archivio .tar.gz" not_enough_space_on_disk: "Non c'è abbastanza spazio su disco per caricare questo backup." invalid_filename: "Il nome del file di backup contiene caratteri non validi. I caratteri validi sono a-z 0-9 . - _." + invalid_params: "Hai fornito parametri non validi alla richiesta: %{message}" not_logged_in: "Devi essere connesso per far ciò." not_found: "L'URL o la risorsa richiesta non sono stati trovati." invalid_access: "Non hai il permesso di vedere la risorsa richiesta." - invalid_api_credentials: "Non è consentito visualizzare la risorsa richiesta. Il nome utente o la chiave API non sono validi." + authenticator_not_found: "Il metodo di autenticazione non esiste o è stato disabilitato." + invalid_api_credentials: "Non ti è consentito visualizzare la risorsa richiesta. Il nome utente o la chiave API non sono validi." + provider_not_enabled: "Non ti è consentito visualizzare la risorsa richiesta. Il provider di autenticazione non è abilitato." + provider_not_found: "Non ti è consentito visualizzare la risorsa richiesta. Il provider di autenticazione non esiste." read_only_mode_enabled: "Il sito è in modalità di sola lettura. Le interazioni sono disabilitate." reading_time: "Tempo di lettura" likes: "Mi piace" too_many_replies: - one: Spiacenti, ma i nuovi utenti possono inserire solo 1 risposta nello stesso argomento. - other: Spiacenti, ma i nuovi utenti possono inserire solo %{count} risposte nello stesso argomento. + one: "Spiacenti, ma i nuovi utenti possono inserire solo 1 risposta nello stesso argomento." + other: "Spiacenti, ma i nuovi utenti possono inserire solo %{count} risposte nello stesso argomento." embed: start_discussion: "Inizia Discussione" continue: "Continua Discussione" @@ -150,35 +192,38 @@ it: no_hosts: "Non sono stati configurati host per l'inclusione." configure: "Configura Inclusione" more_replies: - one: 1 ulteriore risposta - other: '%{count} ulteriori risposte' + one: "1 ulteriore risposta" + other: "%{count} ulteriori risposte" loading: "Caricamento Discussione..." - permalink: "Permalink" + permalink: "Collegamento permanente" imported_from: "Questo è un argomento collegato all'originale su: %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 risposta - other: '%{count} risposte' + one: "1 risposta" + other: "%{count} risposte" no_mentions_allowed: "Spiacenti, non puoi menzionare altri utenti." too_many_mentions: - one: Spiacenti, puoi menzionare al massimo un utente in un messaggio. - other: Spiacenti, puoi menzionare al massimo %{count} utenti in un messaggio. + one: "Spiacenti, puoi menzionare al massimo un utente in un messaggio." + other: "Spiacenti, puoi menzionare al massimo %{count} utenti in un messaggio." no_mentions_allowed_newuser: "Spiacenti, i nuovi utenti non possono menzionare altri utenti." too_many_mentions_newuser: - one: Spiacenti, i nuovi utenti possono menzionare al massimo un utente in un messaggio. - other: Spiacenti, i nuovi utenti possono menzionare al massimo %{count} utenti in un messaggio. + one: "Spiacenti, i nuovi utenti possono menzionare al massimo un utente in un messaggio." + other: "Spiacenti, i nuovi utenti possono menzionare al massimo %{count} utenti in un messaggio." + no_images_allowed_trust: "Spiacenti, non puoi inserire immagini in un messaggio" no_images_allowed: "Spiacenti, i nuovi utenti non possono inserire immagini nei messaggi." too_many_images: - one: Spiacenti, i nuovi utenti possono inserire al massimo un'immagine in un messaggio. - other: Spiacenti, i nuovi utenti possono inserire al massimo %{count} immagini in un messaggio. + one: "Spiacenti, i nuovi utenti possono inserire al massimo un'immagine in un messaggio." + other: "Spiacenti, i nuovi utenti possono inserire al massimo %{count} immagini in un messaggio." no_attachments_allowed: "Spiacenti, i nuovi utenti non possono inserire allegati nei messaggi." too_many_attachments: - one: Spiacenti, i nuovi utenti possono inserire al massimo un allegato in un messaggio. - other: Spiacenti, i nuovi utenti possono inserire al massimo %{count} allegati in un messaggio. + one: "Spiacenti, i nuovi utenti possono inserire al massimo un allegato in un messaggio." + other: "Spiacenti, i nuovi utenti possono inserire al massimo %{count} allegati in un messaggio." no_links_allowed: "Spiacenti, i nuovi utenti non possono inserire collegamenti nei messaggi." + links_require_trust: "Spiacenti, non puoi includere collegamenti nei tuoi messaggi." too_many_links: - one: Spiacenti, i nuovi utenti possono inserire al massimo un collegamento in un messaggio. - other: Spiacenti, i nuovi utenti possono inserire al massimo %{count} collegamenti in un messaggio. + one: "Spiacenti, i nuovi utenti possono inserire al massimo un collegamento in un messaggio." + other: "Spiacenti, i nuovi utenti possono inserire al massimo %{count} collegamenti in un messaggio." + contains_blocked_words: "Il tuo messaggio contiene una parola non consentita: %{word}" spamming_host: "Spiacenti, non puoi inserire un collegamento verso quel dominio." user_is_suspended: "Agli utenti sospesi non è permesso creare messaggi." topic_not_found: "Quancosa non ha funzionato. Forse questo argomento è stato chiuso o cancellato mentre lo leggevi." @@ -210,20 +255,30 @@ it: top_weekly: "Argomenti di punta settimanali" top_daily: "Argomenti di punta giornalieri" posts: "Ultimi messaggi" + private_posts: "Ultimi messaggi personali" group_posts: "Ultimi messaggi da %{group_name}" group_mentions: "Ultime menzioni da %{group_name}" user_posts: "Ultimi messaggi di @%{username}" user_topics: "Ultimi argomenti di @%{username}" tag: "Argomenti etichettati" - badge: "%{display_name} distintivo su %{site_title}" - too_late_to_edit: "Questo messaggio è stato creato troppo tempo fa. Non può più essere modificato né cancellato." + badge: "distintivo %{display_name} su %{site_title}" + too_late_to_edit: "Quel messaggio è stato creato troppo tempo fa. Non può più essere modificato né cancellato." revert_version_same: "La versione attuale è la stessa versione che stai cercando di ripristinare." excerpt_image: "immagine" queue: delete_reason: "Cancellato attraverso la coda di moderazione" + not_found: "Messggio non trovato o già aggiornato" groups: + success: + bulk_add: + one: "%{count} utente è stato aggiunto al gruppo." + other: "%{count} utenti sono stati aggiunti al gruppo." errors: + grant_trust_level_not_valid: "'%{trust_level}' non è un livello di esperienza valido." can_not_modify_automatic: "Non puoi modificare un gruppo automatico" + member_already_exist: + one: "'%{username}' è già membro di questo gruppo." + other: "I seguenti utenti sono già membri di questo gruppo: %{username}" invalid_domain: "'%{domain}' non è un dominio valido." invalid_incoming_email: "'%{email}' non è un indirizzo email valido." email_already_used_in_group: "L'indirizzo '%{email}' è stato già usato dal gruppo '%{group_name}'." @@ -243,20 +298,20 @@ it: title: "Richesta di Adesione per @%{group_name}" education: until_posts: - one: 1 messaggio - other: '%{count} messaggi' + one: "1 messaggio" + other: "%{count} messaggi" 'new-topic': | - Benvenuto in %{site_name} — **grazie per iniziare una nuova conversazione!** + Benvenuto su %{site_name} — **grazie per voler iniziare una nuova conversazione!** - - Il titolo sembra interessante? E' un buon riassunto? + - Il titolo ti sembra interessante se lo leggi ad alta voce? E' un buon riassunto? - - Chi potrebbe essere interessato a questo argomento? Perché è importante? Che risposte speri di ricevere? + - Chi potrebbe esserne interessato? Perché è importante? Che tipo di risposte vorresti? - Includi delle buone parole di ricerca nell'argomento così gli altri lo potranno *trovare*. Per raggruppare questo argomento con altri argomenti correlati, seleziona una categoria. - Per maggiori informazioni, [leggi le linee guida della comunità](/guidelines). Questo pannello sarà visualizzato solo per i primi %{education_posts_text}. + Per maggiori informazioni, [leggi le linee guida della comunità](/guidelines). Questo pannello sarà visualizzato solo per i tuoi primi %{education_posts_text}. 'new-reply': | - Benvenuto in %{site_name} — **grazie per il tuo contributo !** + Benvenuto su %{site_name} — **grazie per il tuo contributo!** - La tua risposta migliora in qualche modo la conversazione? @@ -264,9 +319,9 @@ it: - Le critiche costruttive sono benvenute, ma critica le *idee* non le persone. - Per maggiori informazioni, [leggi le linee guida della nostra comunità](/guidelines). Questo pannello sarà visualizzato soltanto per i primi %{education_posts_text}. + Per maggiori informazioni, [leggi le linee guida della nostra comunità](/guidelines). Questo pannello sarà visualizzato soltanto per i tuoi primi %{education_posts_text}. avatar: | - ### Che ne dici di un'immagine per il tuo account? + ### Che ne dici di aggiungere un'immagine al tuo account? Hai pubblicato alcuni argomenti e risposte, ma l'immagine del tuo profilo non è speciale quanto te -- è solo una lettera. @@ -303,13 +358,20 @@ it: Invece di aggiungere un'altra risposta, per favore considera di modificare le tue precedenti risposte o di visitare altri argomenti. + reviving_old_topic: |+ + ### Resuscitare questo argomento? + + L'ultima risposta a questo argomento risale a **%{time_ago}**. La tua risposta farà tornare l'argomento in cima alla lista e tutti gli utenti coinvolti verranno notificati. + + Sei sicuro di voler continuare questa vecchia discussione? + activerecord: attributes: category: name: "Nome Categoria" topic: title: 'Titolo' - featured_link: 'Collegamento in evidenza' + featured_link: 'Collegamento Evidenziato' post: raw: "Contenuto" user_profile: @@ -320,9 +382,12 @@ it: topic: attributes: base: + warning_requires_pm: "Puoi allegare solo avvertimenti ai messaggi personali." too_many_users: "Puoi inviare avvertimenti ad un solo utente per volta." - no_user_selected: "Seleziona un utente valido." + cant_send_pm: "Spiacenti! Non puoi mandare messaggi personali a questo utente." + no_user_selected: "Devi selezionare un utente valido." reply_by_email_disabled: "La risposta via email è stata disabilitata." + target_user_not_found: "Non è stato possibile trovare uno degli utenti a cui stai inviando questo messaggio." featured_link: invalid: "è invalido. Un URL dovrebbe includere http:// o https://." invalid_category: "non può essere modificato in questa categoria." @@ -332,10 +397,14 @@ it: common: "è una delle 10000 password più comuni. Usa una password più sicura." same_as_username: "è la stessa del tuo nome utente. Per favore usa una password più sicura." same_as_email: "coincide con la tua email. Per favore scegli una password più sicura." - same_as_current: "è la stessa della tua password attuale." + same_as_current: "è la tua stessa password attuale." unique_characters: "ha troppi caratteri ripetuti. Per favore usa una password più sicura." ip_address: signup_not_allowed: "L'iscrizione non è permessa da questo account." + user_email: + attributes: + user_id: + reassigning_primary_email: "La riassegnazione di una email principale a un altro utente non è consentita." color_scheme_color: attributes: hex: @@ -346,7 +415,7 @@ it: web_hook: attributes: payload_url: - invalid: "La URL non è valida. La URL dovrebbe iniziare per http:// o https:// e nessuno spazio non è ammesso. " + invalid: "La URL non è valida. La URL dovrebbe iniziare per http:// o https:// e gli spazi non sono ammessi. " custom_emoji: attributes: name: @@ -355,6 +424,10 @@ it: attributes: execute_at: in_the_past: "deve essere in data futura." + translation_overrides: + attributes: + value: + invalid_interpolation_keys: 'Le seguenti chiavi(e) di interpolazione non sono valide: "%{keys}"' watched_word: attributes: word: @@ -362,71 +435,72 @@ it: user_profile: no_info_me: "
il campo \"Su di me\" del tuo profilo è vuoto, vuoi compilarlo?
" no_info_other: "
%{name} non ha ancora compilato il campo \"Su di me\" del suo profilo
" - vip_category_name: "Lounge" + vip_category_name: "Salotto" vip_category_description: "Una categoria esclusiva per i membri con livello di esperienza 3 o superiore." meta_category_name: "Feedback Sito" - meta_category_description: "Discussioni su questo sito, la sua organizzazione, come funziona e come come noi possiamo migliorarlo." + meta_category_description: "Discussioni su questo sito, la sua organizzazione, come funziona e su come possiamo migliorarlo." staff_category_name: "Staff" staff_category_description: "Categoria privata per discussioni dello staff. Gli argomenti sono visibili solo agli amministratori e ai moderatori." assets_topic_title: "Risorse per il design del sito" - assets_topic_body: "Questo argomento, visibile solo allo staff, è per l'archiviazione di immagini e file utilizzati nel disegn del sito. Non eliminarlo!\n\n\nEcco come fare:\n\n\n1. Rispondi a questo argomento.\n2. Carica tutte le immagini che desideri utilizzare per loghi, favicon e così via. (Utilizza l'icona di caricamento nella barra degli strumenti sull'editor del messaggio, oppure trascina o incolla le immagini.)\n3. Invia la tua risposta per pubblicarla.\n4. Fai clic con il pulsante destro sulle immagini nel nuovo messaggio per ottenere il percorso delle immagini caricate oppure fai clic sull'icona di modifica per modificare il tuo messaggio e recuperare il percorso delle immagini. Copia i percorsi delle immagini.\n5. Incolla i percorsi delle immagini nelle [impostazioni di base](/admin/site_settings/category/required).\n\n\nSe è necessario abilitare il caricamento di file di tipo diverso, modifica `authorized_extensions` nelle [impostazioni dei file](/admin/site_settings/category/files)." + assets_topic_body: "Questo argomento, visibile solo allo staff, è per l'archiviazione di immagini e file utilizzati nel disegno del sito. Non eliminarlo!\n\n\nEcco come fare:\n\n\n1. Rispondi a questo argomento.\n2. Carica tutte le immagini che desideri utilizzare per loghi, favicon e così via (usa l'icona di caricamento nella barra degli strumenti sull'editor del messaggio, oppure trascina o incolla le immagini).\n3. Invia la risposta per pubblicarla.\n4. Fai clic con il pulsante destro sulle immagini nel nuovo messaggio per ottenere il percorso delle immagini caricate, oppure fai clic sull'icona di modifica per modificare il messaggio e recuperare il percorso delle immagini. Copia i percorsi delle immagini.\n5. Incolla i percorsi delle immagini nelle [impostazioni di base](/admin/site_settings/category/required).\n\n\nSe è necessario abilitare il caricamento di file di tipo diverso, modifica `authorized_extensions` nelle [impostazioni dei file](/admin/site_settings/category/files)." discourse_welcome_topic: title: "Benvenuto in Discourse" body: |2 - Il primo paragrafo di questo argomento puntato sarà visibile come messaggio di benvenuto a tutti i nuovi visitatori sulla tua homepage. È importante! + Il primo paragrafo di questo argomento puntato sarà visibile come messaggio di benvenuto a tutti i nuovi visitatori sulla tua homepage. È importante! - **Modificalo** con una breve descrizione della tua comunità: + **Modificalo** con una breve descrizione della tua comunità: - - A chi è rivolto? - - Cosa possono trovare qui? - - Perchè dovrebbero venire qui? - - Dove possono leggere di più (collegamenti, risorse, ecc)? + - A chi è rivolto? + - Cosa possono trovare qui? + - Perché dovrebbero venire qui? + - Dove possono leggere di più (collegamenti, risorse, ecc)? - + - Puoi chiudere questo argomento tramite la :wrench: per amministratori (in alto a destra e in basso), in modo che le risposte non si accumulino all'annuncio. + Potresti voler chiudere questo argomento tramite la :wrench: per amministratori (in alto a destra e in basso), in modo che le risposte non si accumulino all'annuncio. lounge_welcome: - title: "Benvenuto nel Lounge" + title: "Benvenuto nel Salotto" body: |2 - Congratulazioni! :confetti_ball: + Congratulazioni! :confetti_ball: - Se vedi questo argomento, sei stato recentemente promosso a **esperto** (livello di esperienza 3). + Se vedi questo messaggio, significa che sei stato promosso ad **Assiduo** (Livello Esperienza 3). - Adesso puoi … + Da ora sarai in grado di: … - * Modificare il titolo di qualunque argomento - * Cambiare la categoria di qualunque argomento - * Seguire tutti i tuoi collegamenti (è rimosso il [nofollow automatico](http://it.wikipedia.org/wiki/Nofollow) ) - * Accedere alla categoria privata Lounge visibile solo agli utenti con livello di esperienza 3 o superiore - * Cancellare i messaggi spam con un singolo clic + * Cambiare il titolo a qualsiasi Argomento + * Cambiare la Categoria di qualsiasi Argomento + * I tuoi collegamenti saranno seguibili ([il nofollow automatico](http://en.wikipedia.org/wiki/Nofollow) è stato rimosso) + * Accedere alla categoria privata Lounge visibile ai soli utenti che hanno raggiunto il Livello Esperienza 3 o superiore + * Nascondere messaggi spam con una sola segnalazione - Ecco l'elenco degli altri [utenti esperti](/badges/3/regular). Vai a salutarli. + Ecco la [lista degli attuali utenti con Livello Esperienza 3](/badges/3/regular). Lascia loro un saluto. - Grazie per essere una parte importante di questa comunità! + Grazie per essere un importante membro della nostra community! - (Per maggiori informazioni sui livelli di esperienza, [leggi questa discussione][trust]. Nota che possono rimanere utenti esperti solo quegli utenti che continuano a soddisfare i criteri di selezione) + (Per ulteriori informazioni sui Livelli Esperienza dai [uno sguardo a questo Argomento][trust]. Tieni presente che solo gli utenti che continuano a rispettare i requisiti resteranno Assidui nel tempo.) - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: topic_prefix: "Definizione della categoria %{category}" replace_paragraph: "(Sostituisci questo primo paragrafo con una breve descrizione della nuova categoria. Questa guida apparirà nell'area di selezione della categoria, perciò cerca di stare sotto i 200 caratteri. **Finché non modifichi questo testo o non crei argomenti, questa categoria non apparirà sulla pagina delle categorie.**)" post_template: "%{replace_paragraph}\n\nUsa i seguenti paragrafi per una descrizione più estesa, ed anche per stabilire delle regole o linee guida per la categoria:\n\n- Perché la gente dovrebbe usare questa categoria? A che serve? \n\n- In cosa esattamente questa categoria è diversa dalle altre categorie già esistenti? \n\n- Cosa dovrebbero contenere gli argomenti in questa categoria? \n\n- C'è bisogno di questa categoria? Possiamo fonderla con un'altra categoria o sottocategoria?\n" errors: - uncategorized_parent: "La categoria \"Non classificato\" non può avere una categoria superiore." - self_parent: "La categoria-genitore di una sottocategoria non può essere se stessa." + not_found: "Categoria non trovata!" + uncategorized_parent: "La categoria \"Nessuna\" non può avere una categoria superiore" + self_parent: "La categoria-genitore di una sottocategoria non può essere se stessa" depth: "Non puoi annidare una sottocategoria sotto un'altra" invalid_email_in: "'%{email}' non è un indirizzo email valido." email_already_used_in_group: "L'indirizzo '%{email}' è stato già usato dal gruppo '%{group_name}'." email_already_used_in_category: "L'indirizzo '%{email}' è stato già usato dalla categoria '%{category_name}'." description_incomplete: "Il messaggio di descrizione della categoria deve avere almeno un paragrafo." cannot_delete: - uncategorized: "Non puoi eliminare la categoria \"Non classificato\"" + uncategorized: "Non puoi eliminare la categoria \"Nessuna\"" has_subcategories: "Non puoi cancellare questa categoria perché ha sotto-categorie." topic_exists: - one: Non puoi eliminare questa categoria perché ha 1 argomento. L'argomento più vecchio è %{topic_link}. - other: Non puoi cancellare questa categoria perché ha %{count} argomenti. L'argomento più vecchio è %{topic_link}. + one: "Non puoi cancellare questa categoria perché ha 1 argomento. L'argomento più vecchio è %{topic_link}." + other: "Non puoi cancellare questa categoria perché ha %{count} argomenti. L'argomento più vecchio è %{topic_link}." topic_exists_no_oldest: "Non puoi cancellare questa categoria perché il numero di argomenti è di %{count}." uncategorized_description: "Argomenti che non necessitano di una categoria, o che non ricadono in nessuna categoria esistente." trust_levels: @@ -440,91 +514,109 @@ it: title: "esperto" leader: title: "veterano" - change_failed_explanation: "Hai cercato di degradare %{user_name} a '%{new_trust_level}'. Comunque il suo livello di esperienza è già '%{current_trust_level}'. %{user_name} resterà a '%{current_trust_level}' - se vuoi degradarlo, prima blocca il suo livello di esperienza" + change_failed_explanation: "Hai cercato di degradare %{user_name} a '%{new_trust_level}'. Però il suo livello di esperienza è già '%{current_trust_level}'. %{user_name} resterà a '%{current_trust_level}' - se vuoi degradarlo, prima blocca il suo livello di esperienza" post: image_placeholder: broken: "Questa immagine è assente" rate_limiter: + slow_down: "Hai eseguito questa operazione troppe volte, riprova più tardi." + too_many_requests: "Hai eseguito questa operazione troppe volte. Attendi %{time_left} prima di riprovare." + by_type: + first_day_replies_per_day: "Hai raggiunto il massimo numero di risposte che può creare un nuovo utente il suo primo giorno. Per favore attendi %{time_left} prima di riprovare." + first_day_topics_per_day: "Hai raggiunto il massimo numero di argomenti che può creare un nuovo utente il suo primo giorno. Per favore attendi %{time_left} prima di riprovare." + create_topic: "Stai creando argomenti troppo rapidamente. Attendi %{time_left} prima di riprovare." + create_post: "Stai rispondendo troppo rapidamente. Attendi %{time_left} prima di riprovare." + delete_post: "Stai cancellando i messaggi troppo velocemente. Per favore attendi %{time_left} prima di riprovare." + public_group_membership: "Stai entrando/uscendo dai gruppi troppo di frequente. Per favore aspetta %{time_left} prima di riprovare." + topics_per_day: "Hai raggiunto il massimo numero di nuovi argomenti. Per favore attendi %{time_left} prima di riprovare." + pms_per_day: "Hai raggiunto il massimo numero di messaggi. Per favore attendi %{time_left} prima di riprovare." + create_like: "Hai raggiunto il massimo numero di \"Mi piace\". Per favore attendi %{time_left} prima di riprovare." + create_bookmark: "Hai raggiunto il massimo numero di segnalibri. Per favore attendi %{time_left} prima di riprovare." + edit_post: "Hai raggiunto il massimo numero di modifiche. Per favore attendi %{time_left} prima di riprovare." + live_post_counts: "Stai richiedendo troppo velocemente il conteggio dei messaggi attivi. Per favore attendi %{time_left} prima di riprovare." + unsubscribe_via_email: "Hai raggiunto il massimo numero di cancellazioni via email. Per favore aspetta %{time_left} prima di riprovare." + topic_invitations_per_day: "Hai raggiunto il numero massimo di inviti ad argomenti. Per favore aspetta %{time_left} prima di riprovare." hours: - one: 1 ora - other: '%{count} ore' + one: "1 ora" + other: "%{count} ore" minutes: - one: 1 minuto - other: '%{count} minuti' + one: "1 minuto" + other: "%{count} minuti" seconds: - one: 1 secondo - other: '%{count} secondi' + one: "1 secondo" + other: "%{count} secondi" + short_time: "qualche secondo" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1o - other: '%{count}o' + one: "1o" + other: "%{count}o" x_days: - one: 1g - other: '%{count}gg' + one: "1g" + other: "%{count}gg" about_x_months: - one: 1mese - other: '%{count}mesi' + one: "1mese" + other: "%{count}mesi" x_months: - one: 1mese - other: '%{count}mesi' + one: "1mese" + other: "%{count}mesi" about_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" over_x_years: - one: '> 1a' - other: '> %{count}a' + one: "> 1a" + other: "> %{count}a" almost_x_years: - one: 1a - other: '%{count}a' + one: "1a" + other: "%{count}a" distance_in_words_verbose: - half_a_minute: "adesso" + half_a_minute: "proprio ora" less_than_x_seconds: - one: adesso - other: adesso + one: "adesso" + other: "proprio ora" x_seconds: - one: 1 secondo fa - other: '%{count} secondi fa' + one: "1 secondo fa" + other: "%{count} secondi fa" less_than_x_minutes: - one: meno di 1 minuto fa - other: meno di %{count} minuti fa + one: "meno di 1 minuto fa" + other: "meno di %{count} minuti fa" x_minutes: - one: 1 minuto fa - other: '%{count} minuti fa' + one: "1 minuto fa" + other: "%{count} minuti fa" about_x_hours: - one: 1 ora fa - other: '%{count} ore fa' + one: "1 ora fa" + other: "%{count} ore fa" x_days: - one: 1 giorno fa - other: '%{count} giorni fa' + one: "1 giorno fa" + other: "%{count} giorni fa" about_x_months: - one: circa 1 mese fa - other: circa %{count} mesi fa + one: "circa 1 mese fa" + other: "circa %{count} mesi fa" x_months: - one: 1 mese fa - other: '%{count} mesi fa' + one: "1 mese fa" + other: "%{count} mesi fa" about_x_years: - one: circa 1 anno fa - other: circa %{count} anni fa + one: "circa 1 anno fa" + other: "circa %{count} anni fa" over_x_years: - one: più di 1 anno fa - other: più di %{count} anni fa + one: "più di 1 anno fa" + other: "più di %{count} anni fa" almost_x_years: - one: quasi 1 anno fa - other: quasi %{count} anni fa + one: "quasi 1 anno fa" + other: "quasi %{count} anni fa" password_reset: no_token: "Spiacenti, il collegamento per il cambio password è scaduto. Clicca su Connetti e poi su 'Ho dimenticato la password' per ricevere un nuovo collegamento." choose_new: "Scegli una nuova password" @@ -543,6 +635,8 @@ it: authorizing_old: title: "Grazie per aver confermato il tuo attuale indirizzo email" description: "Ti stiamo inviando una email al nuovo indirizzo per conferma." + associated_accounts: + revoke_failed: "Impossibile revocare il tuo account con %{provider_name}." activation: action: "Clicca qui per attivare il tuo account" already_done: "Spiacenti, questo collegamento di attivazione non è più valido. Forse il tuo account è già attivo?" @@ -554,14 +648,14 @@ it: activated: "Spiacenti, questo account è stato già attivato." admin_confirm: title: "Conferma Account Amministratore" - description: "Sei sicuro di volere che %{target_username} sia un amministratore?" + description: "Sei sicuro di volere rendere%{target_username} un amministratore?" grant: "Assegna Accesso Amministratore" complete: "%{target_username}è ora un amministratore." back_to: "Torna a %{title}" post_action_types: off_topic: title: 'Fuori Tema' - description: 'Questo messaggio è fuori tema rispetto al titolo e al primo messaggio e dovrà probabilmente essere spostato. ' + description: 'Questo messaggio è fuori tema rispetto al titolo e al primo messaggio e dovrebbe probabilmente essere spostato altrove. ' short_description: 'Non pertinente alla discussione' long_form: 'segnalato come fuori tema' spam: @@ -578,12 +672,14 @@ it: long_form: 'segnalato come inappropriato' notify_user: title: 'Invia un messaggio a @{{username}}' + description: 'Voglio parlare con questa persona direttamente a proposito del suo messaggio.' + short_description: 'Voglio parlare con questa persona direttamente a proposito del suo messaggio.' long_form: 'messaggio inviato' email_title: 'Il tuo messaggio su "%{title}"' email_body: "%{link}\n\n%{message}" notify_moderators: title: "Altro" - description: 'Questo messaggio richiede attenzione da parte dello staff per altri motivi non elencati.' + description: 'Questo messaggio richiede attenzione da parte dello staff per un altro motivo non elencato.' short_description: 'Richiede l''attenzione dello staff per un''altra ragione' long_form: 'segnalato all''attenzione dello staff' email_title: 'Un messaggio in "%{title}" richiede l''attenzione dello staff' @@ -598,17 +694,11 @@ it: description: 'Metti "Mi piace" a questo messaggio' short_description: 'Metti "Mi piace" a questo messaggio' long_form: 'hanno messo "Mi piace"' - vote: - title: 'Vota' - description: 'Vota questo messaggio' - short_description: 'Vota per questo messaggio' - long_form: 'hai votato questo messaggio' user_activity: no_default: self: "Non hai ancora nessuna attività." others: "Nessuna attività." no_bookmarks: - self: "Non hai aggiunto nessun segnalibro ai messaggi, farlo ti consentirà di ritrovarli facilmente più avanti. " others: "Nessun segnalibro." no_likes_given: self: "Non hai messo \"Mi piace\" ad alcun messaggio." @@ -673,12 +763,21 @@ it: read: "Leggi tutto" write: "Scrivi tutto" reports: + post_edits: + labels: + author: Autore visits: title: "Visite Utente" xaxis: "Giorno" - yaxis: "Numero visite" + yaxis: "Numero di visite" signups: + title: "Iscrizioni" xaxis: "Giorno" + yaxis: "Numero di iscrizioni" + daily_engaged_users: + xaxis: "Giorno" + yaxis: "Utenti Impegnati" + description: "Numero di utenti che hanno scritto o messo Mi piace nell'ultimo giorno" profile_views: title: "Visite Profilo Utente" xaxis: "Giorno" @@ -687,10 +786,12 @@ it: title: "Argomenti" xaxis: "Giorno" yaxis: "Numero di nuovi argomenti" + description: "Nuovi argomenti creati durante questo periodo" posts: title: "Messaggi" xaxis: "Giorno" yaxis: "Numero di nuovi messaggi" + description: "Nuovi messaggi creati durante questo periodo" likes: title: "Mi piace" xaxis: "Giorno" @@ -711,13 +812,36 @@ it: title: "Utenti per Livello Esperienza" xaxis: "Livello Esperienza" yaxis: "Numero Utenti" + labels: + level: Livello + users_by_type: + title: "Utenti per Tipo" + xaxis: "Tipo" + yaxis: "Numero di Utenti" + labels: + type: Tipo + xaxis_labels: + admin: Amministratore + moderator: Moderatore + suspended: Sospeso + silenced: Silenziato + trending_search: + title: Ricerche di tendenza + labels: + term: Termine + searches: Ricerche emails: title: "Email Inviate" xaxis: "Giorno" yaxis: "Numero di Email" user_to_user_private_messages: + title: "Utente-Utente (escluse le risposte)" xaxis: "Giorno" yaxis: "Numero di messaggi" + user_to_user_private_messages_with_replies: + title: "Utente-Utente (incluse le risposte)" + xaxis: "Giorno" + yaxis: "Numero di Messaggi" system_private_messages: title: "Sistema" xaxis: "Giorno" @@ -745,10 +869,15 @@ it: num_clicks: "Click" num_topics: "Argomenti" num_users: "Utenti" + labels: + domain: Dominio + num_clicks: Clic + num_topics: Argomenti top_referred_topics: title: "Migliori Argomenti Referenziati" - xaxis: "Argomento" - num_clicks: "Click" + labels: + num_clicks: "Clic" + topic: "Argomento" page_view_anon_reqs: title: "Anonimo" xaxis: "Giorno" @@ -762,6 +891,7 @@ it: xaxis: "Giorno" yaxis: "Visualizzazioni pagina da Spider web" page_view_total_reqs: + title: "Pagine viste" xaxis: "Giorno" yaxis: "Visualizzazioni pagina totali" page_view_logged_in_mobile_reqs: @@ -805,9 +935,13 @@ it: xaxis: "Giorno" yaxis: "Totali" mobile_visits: - title: "Visite Utente" + title: "Visite Utente (telefono)" xaxis: "Giorno" yaxis: "Numero di visite" + web_crawlers: + labels: + user_agent: "User Agent" + page_views: "Pagine viste" dashboard: rails_env_warning: "Il tuo server è in modalità %{env}." host_names_warning: "Il tuo file config/database.yml usa l'hostname di default: localhost. Aggiornalo con l'hostname del tuo sito." @@ -825,8 +959,9 @@ it: failing_emails_warning: 'Ci sono %{num_failed_jobs} job di email falliti. Controlla il file app.yml e assicurati che le impostazioni del mail server siano corrette. Vedi i job falliti in Sidekiq.' subfolder_ends_in_slash: "L'impostazione della sottocartella è errata; DISCOURSE_RELATIVE_URL_ROOT finisce con uno slash." email_polling_errored_recently: - one: Il polling delle email ha generato un errore nelle ultime 24 ore. Controlla i log per maggiori dettagli. - other: 'Il polling delle email ha generato %{count}errori nelle ultime 24 ore. Controlla i log per maggiori dettagli. ' + one: "Il polling delle email ha generato un errore nelle ultime 24 ore. Controlla i log per maggiori dettagli." + other: "Il polling delle email ha generato %{count}errori nelle ultime 24 ore. Controlla i log per maggiori dettagli. " + missing_mailgun_api_key: "Il server è configurato per inviare email via Mailgun ma non hai fornito la chiave API necessaria a verificare i messaggi webhook." bad_favicon_url: "La favicon non si carica. Verifica la configurazione della tua favicon_url in Impostazioni del sito." poll_pop3_timeout: "La connessione al server POP3 sta scadendo. Le email in entrata non sono state scaricate. Per favore verifica il la tua configurazione POP3 e il fornitore di servizi." poll_pop3_auth_error: "La connessione al server POP3 è fallita per un errore di autenticazione. Per favore verifica la tua configurazione POP3." @@ -936,16 +1071,15 @@ it: post_menu: "Determina quali elementi vengono mostrati nel menu del messaggio, e in quale ordine. Esempio like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Le voci di menu da nascondere per difetto nel menu di composizione del messaggio, a meno che non vengano premuti i punti di sospensione per espanderle." share_links: "Determina quali elementi appaiono nella finestra di condivisione e in quale ordine." - track_external_right_clicks: "Segui i collegamenti esterni sui quali viene fatto click destro (es: apri in una nuova tab). Disabilitato di default perché riscrive le URL" site_contact_username: "Un utente dello staff valido da cui inviare tutti i messaggi automatici. Se lasciato vuoto verrà usato l'account System di default." send_welcome_message: "Invia a tutti i nuovi utenti un messaggio di benvenuto con una guida di avvio rapido." suppress_reply_directly_below: "Non mostrare il conteggio espandibile delle risposte quando c'è una sola risposta sotto quel messaggio." suppress_reply_directly_above: "Non mostrare in-risposta-a espandibile in un messaggio quando c'è una sola risposta sopra quel messaggio. " suppress_reply_when_quoting: "Non mostrare in-risposta-a espandibile in un messaggio quando il messaggio include la citazione." max_reply_history: "Numero massimo di risposte da espandere quando si espande in-risposta-a" - topics_per_period_in_top_summary: "Numero di argomenti di punta mostrati nel riepilogo di default." - topics_per_period_in_top_page: "Numero di argomenti di punta mostrati nella vista espansa 'Mostra Altro'" - redirect_users_to_top_page: "Redirigi automaticamente i nuovi utenti e quelli assenti da tempo sulla pagina degli argomenti di punta." + topics_per_period_in_top_summary: "Numero di argomenti popolari mostrati nel riepilogo di default." + topics_per_period_in_top_page: "Numero di argomenti popolari mostrati nella vista espansa 'Mostra Altro'" + redirect_users_to_top_page: "Redirigi automaticamente i nuovi utenti e quelli assenti da tempo sulla pagina degli argomenti popolari." top_page_default_timeframe: "Lasso di tempo di default per la pagina principale." show_email_on_profile: "Mostra l'email di un utente nel suo profilo (visibile solo a se stesso e allo staff)" prioritize_username_in_ux: "Nella pagina utente mostra prima il nome utente, la sua scheda e i suoi messaggi (quando l'opzione è disabilitata viene mostrato prima il nome)" @@ -1001,6 +1135,7 @@ it: allow_restore: "Abilita il ripristino, che sostituisce TUTTI i dati del sito! Lascia a falso a meno che non hai intenzione di ripristinare un backup." maximum_backups: "Il numero massimo di backup da mantenere sul disco. I backup più vecchi vengono automaticamente cancellati." automatic_backups_enabled: "Esegui backup automatici come definito nella frequenza di backup" + backup_frequency: "Numero di giorni tra due backup." enable_s3_backups: "Carica i backup su S3 quando completati. IMPORTANTE: richiede che siano inserite valide credenziali S3 nelle impostazioni File." s3_backup_bucket: "Il bucket remoto che contiene i backup. ATTENZIONE: assicurati che sia un bucket privato." s3_disable_cleanup: "Disabilita la rimozione dei backup da S3 quando rimossi localmente." @@ -1022,6 +1157,7 @@ it: max_bookmarks_per_day: "Massimo numero di segnalibri per utente al giorno." max_edits_per_day: "Massimo numero di modifiche per utente al giorno." max_topics_per_day: "Massimo numero di argomenti che un utente può creare al giorno." + max_personal_messages_per_day: "Numero massimo di messaggi che gli utenti possono creare al giorno." max_invites_per_day: "Numero massimo di inviti che un utente può inviare in un giorno." max_topic_invitations_per_day: "Numero massimo di inviti ad argomenti che un utente può inviare al giorno." max_logins_per_ip_per_hour: "Numero massimo di accessi consentiti per indirizzo Ip per ora" @@ -1089,6 +1225,7 @@ it: newuser_max_replies_per_topic: "Numero massimo di risposte che un nuovo utente può inviare in un singolo argomento, prima che qualcuno risponda." max_mentions_per_post: "Numero massimo di menzioni ad un @nome che chiunque può fare in un messaggio." max_users_notified_per_group_mention: "Massimo numero di utenti che possono ricevere una notifica se un gruppo è menzionato (se la soglia è raggiunta, nessuna notifica verrà inviata)" + enable_mentions: "Permetti agli utenti di menzionare altri utenti." create_thumbnails: "Crea anteprime e lightbox delle immagini che sono troppo grandi per essere contenute in un messaggio." email_time_window_mins: "Aspetta (n) minuti prima di inviare email di notifica, per dare agli utenti la possibilità di modificare e completare i loro messaggi." email_posts_context: "Quante risposte precedenti inserire come contesto nelle email di notifica." @@ -1147,7 +1284,8 @@ it: reply_by_email_enabled: "Abilita la possibilità di rispondere ai messaggi tramite email." reply_by_email_address: "Modello per rispondere via email, per esempio: %{reply_key}@risposta.esempio.com o risposte+%{reply_key}@esempio.com" alternative_reply_by_email_addresses: "Elenco dei template alternativi per la risposta via email in arrivo da indirizzi email. Esempio: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "Evita che Discourse invii qualunque tipo di email" + incoming_email_prefer_html: "Usa HTML al posto del testo per le email in arrivo." + disable_emails: "Impedisci a Discourse di inviare qualsiasi tipo di email. Seleziona 'Sì' per disabilitare le email per tutti gli utenti. Seleziona 'non-staff' per disabilitare le email solo per gli utenti non staff." strip_images_from_short_emails: "Elimina le immagini dalle email aventi dimensione inferiore a 2800 Byte." short_email_length: "Lunghezza delle email brevi in Byte" display_name_on_email_from: "Mostra nomi completi per email dai campi" @@ -1191,7 +1329,6 @@ it: delete_user_max_post_age: "Non permettere di cancellare utenti il cui primo messaggio è più vecchio di (x) giorni." delete_all_posts_max: "Numero massimo di messaggi che possono essere eliminati contemporaneamente con il pulsante Cancella Tutti. Se un utente ha un numero maggiore di tali messaggi, questi non possono essere eliminati contemporaneamente e l'utente non può essere cancellato." email_editable: "Permetti agli utenti di cambiare l'indirizzo email dopo la registrazione." - logout_redirect: "Posizione per reindirizzare il browser dopo il logout (es: http://tuosito.com/logout)" allow_uploaded_avatars: "Permetti agli utenti di caricare immagini di profilo personalizzate." allow_animated_avatars: "Permetti agli utenti di utilizzare gif animate come immagini di profilo. ATTENZIONE: lanciare il comando rake \"avatars:refresh\" dopo aver cambiato questa impostazione." allow_animated_thumbnails: "Genera miniature animate delle gif animate." @@ -1255,6 +1392,7 @@ it: prevent_anons_from_downloading_files: "Impedire agli utenti anonimi di scaricare gli allegati. ATTENZIONE: questo impedirà a qualsiasi risorsa del sito pubblicata come allegato di funzionare ad eccezione delle immagini." slug_generation_method: "Scegli un metodo di generazione delle abbreviazioni. 'encoded' genererà la stringa di codifica percentuale. 'none' disattiverà completamente le abbreviazioni." enable_emoji: "Attiva gli emoji" + enable_emoji_shortcuts: "Smiley comuni come :) :p :( verranno convertiti in emoji" emoji_set: "Come ti piacerebbero le tue emoji?" enforce_square_emoji: "Forza tutte le emoji ad un aspetto di proporzioni quadrate." approve_post_count: "La quantità di messaggi di un utente nuovo o di base che deve essere approvata" @@ -1299,10 +1437,11 @@ it: max_tags_per_topic: "Il numero massimo di etichette che si possono applicare ad un argomento." max_tag_length: "La quantità massima di caratteri utilizzabili in un'etichetta." max_tag_search_results: "Il numero massimo di risultati da mostrare nella ricerca di etichette." - show_filter_by_tag: "Mostra un menu a discesa per filtrare un elenco di argomenti per etichetta." + show_filter_by_tag: "Mostra un menu a discesa per filtrare gli Argomenti per Etichetta." max_tags_in_filter_list: "Numero massimo di etichette da mostrare nell'elenco a discesa del filtro. Saranno mostrate le etichette più usate." tags_sort_alphabetically: "Mostra le etichette in ordine alfabetico. Per default vengono mostrate in ordine di popolarità." tag_style: "Stile grafico dei distintivi relativi alle etichette." + allow_staff_to_tag_pms: "Consenti ai membri dello staff di etichettare qualsiasi Messaggio Personale" min_trust_level_to_tag_topics: "Livello di esperienza minimo richiesto per etichettare argomenti" suppress_overlapping_tags_in_list: "Se le etichette corrispondono alle esatte parole nei titoli degli argomenti, non mostrare l'etichetta" remove_muted_tags_from_latest: "Non mostrare argomenti contrassegnati con etichette silenziate nella lista degli argomenti recenti." @@ -1351,77 +1490,74 @@ it: timeout_expired: "Il tempo di connessione dell'account è scaduto, prova a connetterti di nuovo." no_email: "Nessun indirizzo email è stato fornito. Si prega di contattare l'amministratore del sito." email_error: "Non è possibile registrare un account con l'indirizzo email %{email}. Si prega di contattare l'amministratore del sito." - original_poster: "Autore Iniziale" + original_poster: "Autore iniziale" most_posts: "Maggioranza Messaggi" - most_recent_poster: "Autore Più Recente" + most_recent_poster: "Autore più recente" frequent_poster: "Autore Assiduo" redirected_to_top_reasons: new_user: "Benvenuto nella nostra comunità! Questi sono gli argomenti recenti più popolari." not_seen_in_a_month: "Bentornato! Non ti si vede da un po'. Questi sono gli argomenti più popolari da quando sei stato via." merge_posts: edit_reason: - one: A post was merged in by %{username} - other: '%{count} messaggi sono stati fusi da %{username}' + one: "A post was merged in by %{username}" + other: "%{count} messaggi sono stati fusi da %{username}" errors: different_topics: "I messaggi appartenenti a diversi argomenti non possono essere fusi." different_users: "I messaggi appartenenti a diversi utenti non possono essere fusi." move_posts: new_topic_moderator_post: - one: 'Un messaggio è stato spostato in un nuovo argomento: %{topic_link}' - other: '%{count} messaggi sono stati spostati in un nuovo argomento: %{topic_link}' + one: "Un messaggio è stato spostato in un nuovo argomento: %{topic_link}" + other: "%{count} messaggi sono stati spostati in un nuovo argomento: %{topic_link}" existing_topic_moderator_post: - one: 'Un messaggio è stato fuso in un argomento esistente: %{topic_link}' - other: '%{count} messaggi sono stati fusi in un argomento esistente: %{topic_link}' - change_owner: - post_revision_text: "Proprietà trasferita da %{old_user} a %{new_user}" - deleted_user: "un utente eliminato" + one: "Un messaggio è stato fuso in un argomento esistente: %{topic_link}" + other: "%{count} messaggi sono stati fusi in un argomento esistente: %{topic_link}" topic_statuses: archived_enabled: "Questo argomento è stato archiviato. È congelato e non può più essere modificato." archived_disabled: "Questo argomento non è più archiviato. Non è più congelato e può essere modificato." closed_enabled: "Questo argomento è stato chiuso. Non è più possibile inviare risposte." closed_disabled: "Questo argomento è stato aperto. È di nuovo possibile rispondere." autoclosed_message_max_posts: - one: Questo messaggio è stato chiuso automaticamente per aver raggiunto il limite massimo di 1 risposta. - other: Questo messaggio è stato chiuso automaticamente per aver raggiunto il limite massimo di %{count} risposte. + one: "Questo messaggio è stato chiuso automaticamente per aver raggiunto il limite massimo di 1 risposta." + other: "Questo messaggio è stato chiuso automaticamente per aver raggiunto il limite massimo di %{count} risposte." autoclosed_topic_max_posts: - one: Questo argomento è stato chiuso automaticamente per aver raggiunto il limite massimo di 1 risposta. - other: Questo argomento è stato chiuso automaticamente per aver raggiunto il limite massimo di %{count} risposte. + one: "Questo argomento è stato chiuso automaticamente per aver raggiunto il limite massimo di 1 risposta." + other: "Questo argomento è stato chiuso automaticamente per aver raggiunto il limite massimo di %{count} risposte." autoclosed_enabled_days: - one: Questo argomento è stato automaticamente chiuso dopo un giorno. Non sono permesse altre risposte. - other: Questo argomento è stato automaticamente chiuso dopo %{count} giorni. Non sono permesse altre risposte. + one: "Questo argomento è stato automaticamente chiuso dopo un giorno. Non sono permesse altre risposte." + other: "Questo argomento è stato automaticamente chiuso dopo %{count} giorni. Non sono permesse altre risposte." autoclosed_enabled_hours: - one: Questo argomento è stato automaticamente chiuso dopo un'ora. Non sono permesse altre risposte. - other: Questo argomento è stato automaticamente chiuso dopo %{count} ore. Non sono permesse altre risposte. + one: "Questo argomento è stato automaticamente chiuso dopo un'ora. Non sono permesse altre risposte." + other: "Questo argomento è stato automaticamente chiuso dopo %{count} ore. Non sono permesse altre risposte." autoclosed_enabled_minutes: - one: Questo argomento è stato automaticamente chiuso dopo un minuto. Non sono permesse altre risposte. - other: Questo argomento è stato automaticamente chiuso dopo %{count} minuti. Non sono permesse altre risposte. + one: "Questo argomento è stato automaticamente chiuso dopo un minuto. Non sono permesse altre risposte." + other: "Questo argomento è stato automaticamente chiuso dopo %{count} minuti. Non sono permesse altre risposte." autoclosed_enabled_lastpost_days: - one: Questo argomento è stato automaticamente chiuso un giorno dopo l'ultima risposta. Non sono permesse altre risposte. - other: Questo argomento è stato automaticamente chiuso %{count} giorni dopo l'ultima risposta. Non sono permesse altre risposte. + one: "Questo argomento è stato automaticamente chiuso un giorno dopo l'ultima risposta. Non sono permesse altre risposte." + other: "Questo argomento è stato automaticamente chiuso %{count} giorni dopo l'ultima risposta. Non sono permesse altre risposte." autoclosed_enabled_lastpost_hours: - one: Questo argomento è stato automaticamente chiuso un'ora dopo l'ultima risposta. Non sono permesse altre risposte. - other: Questo argomento è stato automaticamente chiuso %{count} ore dopo l'ultima risposta. Non sono permesse altre risposte. + one: "Questo argomento è stato automaticamente chiuso un'ora dopo l'ultima risposta. Non sono permesse altre risposte." + other: "Questo argomento è stato automaticamente chiuso %{count} ore dopo l'ultima risposta. Non sono permesse altre risposte." autoclosed_enabled_lastpost_minutes: - one: Questo argomento è stato automaticamente chiuso un minuto dopo l'ultima risposta. Non sono permesse altre risposte. - other: Questo argomento è stato automaticamente chiuso %{count} minuti dopo l'ultima risposta. Non sono permesse altre risposte. + one: "Questo argomento è stato automaticamente chiuso un minuto dopo l'ultima risposta. Non sono permesse altre risposte." + other: "Questo argomento è stato automaticamente chiuso %{count} minuti dopo l'ultima risposta. Non sono permesse altre risposte." autoclosed_disabled_days: - one: This topic was automatically opened after 1 day. - other: Questo argomento è stato aperto automaticamente dopo %{count} giorni. + one: "This topic was automatically opened after 1 day." + other: "Questo argomento è stato aperto automaticamente dopo %{count} giorni." autoclosed_disabled_hours: - one: This topic was automatically opened after 1 hour. - other: Questo argomento è stato aperto automaticamente dopo %{count} ore. + one: "This topic was automatically opened after 1 hour." + other: "Questo argomento è stato aperto automaticamente dopo %{count} ore." autoclosed_disabled_minutes: - one: This topic was automatically opened after 1 minute. - other: Questo argomento è stato aperto automaticamente dopo %{count} minuti. + one: "This topic was automatically opened after 1 minute." + other: "Questo argomento è stato aperto automaticamente dopo %{count} minuti." autoclosed_disabled_lastpost_days: - one: This topic was automatically opened 1 day after the last reply. - other: Questo argomento è stato aperto automaticamente %{count} giorni dopo l'ultima risposta. + one: "This topic was automatically opened 1 day after the last reply." + other: "Questo argomento è stato aperto automaticamente %{count} giorni dopo l'ultima risposta." autoclosed_disabled_lastpost_hours: - one: This topic was automatically opened 1 hour after the last reply. - other: Questo argomento è stato aperto automaticamente %{count} ore dopo l'ultima risposta. + one: "This topic was automatically opened 1 hour after the last reply." + other: "Questo argomento è stato aperto automaticamente %{count} ore dopo l'ultima risposta." autoclosed_disabled_lastpost_minutes: - one: Questo argomento è stato aperto automaticamente 1 minuto dopo l'ultima risposta. - other: This topic was automatically opened %{count} minutes after the last reply. + one: "Questo argomento è stato aperto automaticamente 1 minuto dopo l'ultima risposta." + other: "This topic was automatically opened %{count} minutes after the last reply." autoclosed_disabled: "Questo argomento è ora aperto. Sono permesse altre risposte." autoclosed_disabled_lastpost: "Questo argomento è ora aperto. Sono permesse altre risposte." pinned_enabled: "Questo argomento è stato puntato. Sarà mostrato in cima alla sua categoria finché non sarà spuntato da un membro dello staff - e allora varrà per tutti - oppure dai singoli utenti - e varrà solo per loro stessi." @@ -1434,6 +1570,7 @@ it: login: not_approved: "Il tuo account non è ancora stato approvato. Verrai avvertito via mail quando potrai collegarti." incorrect_username_email_or_password: "Nome utente, email o password errati" + incorrect_password: "Password errata" wait_approval: "Grazie per esserti iscritto. Ti avvertiremo quando il tuo account sarà approvato." active: "Il tuo account è attivo e pronto all'uso." activate_email: "

Ci siamo quasi! Abbiamo mandato una email di attivazione a %{email}. Per favore segui le istruzioni contenute nell'email per attivare il tuo account.

Se l'email non ti arriva, controlla la tua cartella spam.

" @@ -1456,8 +1593,9 @@ it: auth_complete: "L'autenticazione è completa" click_to_continue: "Clicca qui per continuare." already_logged_in: "Oops, sembra che tu stai tentando di accettare un invito per un altro utente. Se non sei %{current_user}, disconnettiti e prova di nuovo." + second_factor_title: "Autenticazione a due fattori" + second_factor_description: "Per favore, inserisci il codice di autenticazione della tua app:" user: - no_accounts_associated: "Nessun account associato" deactivated: "È stata disattivata a causa di troppe email rimbalzate a '%{email}'." deactivated_by_staff: "Disattivato dallo staff" activated_by_staff: "Attivato dallo staff" @@ -1488,11 +1626,11 @@ it: fixed_primary_email: "Risolto il problema dell'email principale per l'utente temporaneo" flags_reminder: flags_were_submitted: - one: Flags were submitted over 1 hour ago. [Please review them](/admin/flags). - other: Delle segnalazioni sono state inviate oltre %{count} ore fa. [Per favore, revisionale](/admin/flags). + one: "Flags were submitted over 1 hour ago. [Please review them](/admin/flags)." + other: "Delle segnalazioni sono state inviate oltre %{count} ore fa. [Per favore, revisionale](/admin/flags)." subject_template: - one: 1 segnalazione in attesa di essere revisionata - other: '%{count} segnalazioni in attesa di essere revisionate' + one: "1 segnalazione in attesa di essere revisionata" + other: "%{count} segnalazioni in attesa di essere revisionate" unsubscribe_mailer: title: "Annullare Iscrizione Mailer" subject_template: "Conferma che non desideri più ricevere aggiornamenti via email da %{site_title}" @@ -1561,8 +1699,8 @@ it: deferred: "Grazie per averci informato. Stiamo provvedendo." deferred_and_deleted: "Grazie per averci informato. Abbiamo rimosso il messaggio." temporarily_closed_due_to_flags: - one: 'Questo argomento resterà temporaneamente chiuso per 1 ora per via di un elevato numero di segnalazioni da parte della comunità. ' - other: 'Questo argomento resterà temporaneamente chiuso per %{count}ore per via di un elevato numero di segnalazioni da parte della comunità. ' + one: "Questo argomento resterà temporaneamente chiuso per 1 ora per via di un elevato numero di segnalazioni da parte della comunità. " + other: "Questo argomento resterà temporaneamente chiuso per %{count}ore per via di un elevato numero di segnalazioni da parte della comunità. " system_messages: private_topic_title: "Argomento #%{id}" contents_hidden: "Visita il messaggio per vederne i contenuti." @@ -1571,9 +1709,9 @@ it: subject_template: "Messaggio nascosto a causa di segnalazioni dalla comunità" usage_tips: text_body_template: | - Per alcuni suggerimenti veloci per iniziare come nuovo utente, [consulta questo post sul blog](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). + Per leggere alcuni veloci suggerimenti su come iniziare se sei un nuovo utente [dai una lettura a questo articolo](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/) - Man mano che parteciperai, ti conosceremo meglio e le limitazioni temporanee per i nuovi utenti verranno rimosse. Con il tempo potrai raggiungere [livelli di esperienza](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) che includono abilità speciali per aiutarci a gestire insieme la nostra comunità. + Partecipando ti conosceremo meglio, e le limitazioni temporanee per i nuovi utenti saranno rimosse. Col tempo incrementerai il tuo [Livello Esperienza](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/), sbloccando ulteriori funzionalità che ci aiuteranno a gestire insieme la comunità. welcome_user: title: "Benvenuto Utente" subject_template: "Benvenuto su %{site_name}!" @@ -1842,14 +1980,6 @@ it: too_many_spam_flags: title: "Troppe Segnalazioni Spam" subject_template: "Nuovo account sospeso" - text_body_template: | - Ciao, - - questo è un messaggio automatico da %{site_name} per informarti che il tuo account è stato bloccato a causa di un gran numero di segnalazioni da parte della comunità. - - Come misura precauzionale, il tuo nuovo account è stato silenziato e non può creare altre risposte o argomenti finché non verrà revisionato da un membro dello staff. Ci scusiamo per l'inconveniente - - Per maggiori dettagli, fai riferimento alle [linee guida della comunità](%{base_url}/guidelines). too_many_tl3_flags: title: "Troppe Segnalazioni Da TL3" subject_template: "Nuovo account sospeso" @@ -1883,6 +2013,8 @@ it: Per favore [controlla le segnalazioni](%{base_url}/admin/flags). Se %{username} è stato silenziato per errore, clicca sul tasto di sblocco nella [pagina di amministrazione di questo utente](%{user_url}). Questa impostazione può essere modificata tramite l'impostazione del sito `silence_new_user`. + spam_post_blocked: + title: "Messaggio di Spam bloccato" unsilenced: title: "Non silenziato" subject_template: "Account non più sospeso" @@ -1895,8 +2027,8 @@ it: pending_users_reminder: title: "Promemoria Utenti in Sospeso" subject_template: - one: 1 utente in attesa di approvazione - other: '%{count} utenti in attesa di approvazione' + one: "1 utente in attesa di approvazione" + other: "%{count} utenti in attesa di approvazione" text_body_template: | Ci sono nuove iscrizioni in attesa di essere approvate (o rifiutate) prima che possano accedere a questo forum. @@ -1924,8 +2056,8 @@ it: queued_posts_reminder: title: "Promemoria Messaggi in Coda" subject_template: - one: 'messaggi in attesa di essere revisionati ' - other: '%{count} messaggi in attesa di essere revisionati' + one: "messaggi in attesa di essere revisionati " + other: "%{count} messaggi in attesa di essere revisionati" text_body_template: | Ciao, @@ -1943,17 +2075,15 @@ it: user_notifications: previous_discussion: "Risposte Precedenti" 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.' - other: 'Avvertimento: Inviamo un massimo di %{count} email giornaliere. Controlla il sito per vedere quelle che potrebbero essere state trattenute. PS grazie per essere popolare!' + one: "Heads up: We send a maximum of 1 daily email. Check the site to see the ones that might be held back." + other: "Avvertimento: Inviamo un massimo di %{count} email giornaliere. Controlla il sito per vedere quelle che potrebbero essere state trattenute. PS grazie per essere popolare!" in_reply_to: "In Risposta A" unsubscribe: title: "Annulla iscrizione" description: "Non vuoi ricevere queste email? Nessun problema! Clicca qui sotto per annullare l'iscrizione:" reply_by_email: "[Visita Argomento](%{base_url}%{url}) o rispondi a questa email per replicare." - reply_by_email_pm: "[Visita Messaggio](%{base_url}%{url}) o rispondi a questa email per replicare." only_reply_by_email: "Rispondi a questa email per replicare." visit_link_to_respond: "[Visita Argomento](%{base_url}%{url}) per replicare." - visit_link_to_respond_pm: "[Visita Messaggio](%{base_url}%{url}) per replicare." posted_by: "Pubblicato da %{username} il %{post_date}" invited_group_to_private_message_body: | %{username} ha invitato @%{group_name} a partecipare al messaggio @@ -2155,6 +2285,8 @@ it: Se non hai cercato di creare un account per %{email} o di cambiare il tuo indirizzo email, non ti preoccupare – puoi tranquillamente ignorare questo messaggio. Se hai delle domande, [contatta il nostro amichevole staff](%{base_url}/about). + account_second_factor_disabled: + title: "Autenticazione a due fattori disabilitata" digest: why: "Un breve sommario di %{site_link} dalla tua ultima visita il %{last_seen_at}" since_last_visit: "Dalla tua ultima visita" @@ -2260,7 +2392,6 @@ it: recent_topics: "Recenti" see_more: "Altro" search_title: "Cerca nel sito" - search_google: "Google" offline: title: "Impossibile caricare l'app" offline_page_message: "Sembra che tu sia offline! Controlla la tua connessione di rete e riprova." @@ -2293,32 +2424,11 @@ it: flag_reason: sockpuppet: "Un nuovo utente ha creato un argomento, e un altro nuovo utente ha risposto dallo stesso indirizzo IP (%{ip_address}). Vedi l'impostazione del sito `flag_sockpuppets`." spam_hosts: "Questo nuovo utente ha provato a creare più messaggi con collegamenti allo stesso dominio (%{domain}). Vedi l'impostazione del sito `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "L'utente del messaggio è stato eliminato." - no_user: "Non trovo l'utente con l'id %{user_id}" - anonymous_user: "L'utente è anonimo" - suspended_not_pm: "L'utente è sospeso, non è un messaggio" - seen_recently: "L'utente è stato visto di recente" - post_not_found: "Non trovo un messaggio con id %{post_id}" - notification_already_read: "La notifica per cui è stata inviata questa mail è già stata letta" - topic_nil: "post.topic è nil" - post_deleted: "il messaggio è stato cancellato dal suo autore" - user_suspended: "l'utente è stato sospeso" - already_read: "l'utente ha già letto questo messaggio" - exceeded_emails_limit: "Ha superato max_emails_per_day_per_user" - exceeded_bounces_limit: "Ha superato bounce_score_threshold" - message_blank: "il messaggio è vuoto" - message_to_blank: "message.to è vuoto" - text_part_body_blank: "text_part.body è vuoto" - body_blank: "il corpo è vuoto" - no_echo_mailing_list_mode: "Notifiche della mailing list disattivate per i propri messaggi" color_schemes: base_theme_name: "Base" - default: "Combinazione Chiara" dark: "Combinazione Scura" - default_theme_name: "Predefinito" - dark_theme_name: "Scuro" light_theme_name: "Chiaro" + dark_theme_name: "Scuro" about: "Informazioni su" guidelines: "Linee Guida" privacy: "Privacy" @@ -2519,72 +2629,68 @@ it: name: Redattore description: Prima modifica ad un messaggio long_description: | - Questo distintivo viene assegnato la prima volta che modifichi uno dei tuoi messaggi. Anche se non potrai modificare i tuoi messaggi indefinitamente, la modifica è sempre una buona idea — puoi migliorare i tuoi messaggi, correggere piccoli errori o aggiungere qualcosa che avevi tralasciato nel momento della prima stesura. Effettua modifiche per migliorare i tuoi messaggi! + Questo Distintivo è assegnato la prima volta che modifichi uno dei tuoi messaggi. Anche se non potrai modificare i messaggi per sempre, eventuali aggiornamenti sono incoraggiati: puoi migliorare la punteggiatura, sistemare errori di battitura, o aggiungere dettagli omessi nel primo invio. Modifica pure, e rendi i tuoi messaggi ancora migliori! basic_user: name: Base - description: "Assegnate tutte le funzionalità essenziali della comunità " long_description: | - Questo distintivo viene assegnato quando raggiungi il livello di esperienza 1. Grazie per essere stato nei paraggi per un po' a leggere qualche argomento e a imparare di cosa tratta la nostra comunità. Le restrizioni iniziali che avevi come nuovo utente sono state allentate; ti sono ora state assegnate tutte le capacità essenziali, come ad esempio i messaggi personali, le segnalazioni, la modifica delle wiki e la possibilità di inviare più immagini e collegamenti. + Questo Distintivo è assegnato quando si raggiunge il Livello Esperienza 1. Grazie per essere rimasto nei paraggi e per aver letto alcune discussioni, per capire meglio di cosa si occupa la nostra comunità. Le limitazioni imposte ai nuovi utenti sono state rimosse, e ti sono state attivate alcune funzioni essenziali come l'invio di messaggi personali, la segnalazione di messaggi dubbi, la creazione di messaggi Wiki e la possibilità di inviare immagini multiple e collegamenti. member: name: Membro - description: "Assegnati inviti, messaggi multipli, maggiori \"Mi piace\"" long_description: | - Questo distintivo viene assegnato quando raggiungi il livello di esperienza 2. Grazie per esserti unito e per aver partecipato per qualche settimana alla nostra comunità. Puoi inviare inviti dalla tua pagina utente o dai singoli argomenti, creare messaggi personali di gruppo, a mettere un numero maggiore di "Mi piace" al giorno. + Questo Distintivo viene assegnato quando si raggiunge il Livello Esperienza 2. Grazie per aver essere stato partecipe per varie settimane, diventando veramente parte della comunità. Ora puoi mandare inviti dalla tua pagina utente, creare messaggi personali di gruppo, e lasciare più "Mi Piace" per giorno. regular: name: Assiduo - description: "Assegnato ricategorizza, rinomina, collegamenti seguiti, wiki, maggiori \"Mi piace\"" long_description: | - Questo distintivo viene assegnato quando raggiungi il livello di esperienza 3. Grazie per essere stato parte attiva della nostra comunità per qualche mese. Ora sei uno dei lettori più attivi e un collaboratore affidabile che rende grande la nostra comunità. Ora puoi ricategorizzare e rinominare gli argomenti, usare le segnalazioni spam più potenti, accedere a un'area Lounge privata, e puoi mettere un numero ancora maggiore di "Mi piace" al giorno. + Questo Distintivo viene assegnato al raggiungimento del Livello Esperienza 3. Grazie per aver partecipato in modo assiduo alla nostra comunità per vari mesi. Ora sei uno dei nostri lettori più attivi, un contributore affidabile che rende la comunità sempre migliore. Ora puoi cambiare la categoria degli argomenti, trarre vantaggio da segnalazioni di spam più potenti, hai accesso all'esclusiva area Lounge, e potrai avere molti più "Mi piace" al giorno. leader: name: Veterano - description: "Assegnato modifica globale, puntare, chiudere, archiviare, suddividere e riunire, maggiori \"Mi piace\"" long_description: | - Questo distintivo è assegnato quando si raggiunge il livello di esperienza 4. Sei un veterano in questa comunità selezionato dallo staff, e qui sei un esempio positivo per il resto della comunità con le tue azioni e parole. Hai la possibilità di modificare tutti i messaggi, agire come un moderatore con azioni comuni quali puntare, chiudere, rendere invisibile, archiviare, dividere e unire, e hai tonnellate di mi piace al giorno. + Questo Distintivo viene assegnato quando si raggiunge il Livello Esperienza 4. Sei ormai un leader di questa comunità scelto dallo Staff, e rappresenti un esempio positivo per il resto del gruppo per come agisci e come ti esprimi. Hai ora la capacità di modificare tutti i messaggi e di compiere azioni di moderazione quali mettere in evidenza, chiudere, archiviare, dividere e unire messaggi. welcome: name: Benvenuto description: Ha ricevuto un "Mi piace" long_description: | - Questo distintivo è assegnato quando ricevi il tuo primo mi piace su un messaggio. Congratulazioni, hai pubblicato qualcosa che i membri della tua comunità hanno trovato interessante, eccezionale o utile! + Questo Distintivo viene assegnato quando ricevi il tuo primo "Mi piace". Congratulazioni, hai pubblicato qualcosa che gli altri membri della comunità hanno trovato interessante, utile o semplicemente cool! autobiographer: name: Autobiografo description: "Ha compilato le informazioni del profilo" long_description: | - Questo distintivo è assegnato per aver compilato il tuo profilo utente e selezionato un'immagine per il profilo. Lasciare che gli altri sappiano di più su chi sei e a cosa sei interessato rende la comunità migliore e più connessa. Unisciti a noi! + Questo Distintivo viene assegnato per aver compilato il tuo Profilo utente e aver impostato un'immagine di profilo. Far sì che la comunità sappia qualcosa di te e dei tuoi interessi aiuta a creare un gruppo migliore e più coeso. Unisciti a noi! anniversary: name: Compleanno description: "Membro attivo per un anno, ha scritto almeno una volta" long_description: | - Questo distintivo è assegnato a chi è membro da un anno con almeno un messaggio scritto durante quell'anno. Grazie per esserci e contribuire alla nostra comunità. Non potremmo farcela senza di te. + Questo Distintivo è assegnato a chi è membro della comunità da almeno un anno e ha scritto, in quel periodo, almeno un messaggio. Grazie per essere rimasto nei paraggi e per aver contribuito alla comunità. Non esisterebbe senza persone come te. nice_post: name: Risposta Piacevole description: Ha ricevuto 10 mi piace su una risposta long_description: | - Questo distintivo è assegnato quando una risposta riceve 10 mi piace. La tua risposta ha fatto davvero impressione sulla comunità e ha aiutato a portare la conversazione avanti! + Questo Distintivo viene assegnato quando una tua risposta ottiene 10 "Mi piace". Il tuo messaggio ha colpito la comunità e aiutato a portare avanti la discussione. good_post: name: Buona Risposta description: Ha ricevuto 25 mi piace su una risposta long_description: | - Questo distintivo è assegnato quando una risposta riceve 25 mi piace. La tua risposta è stata eccezionale e ha reso la conversazione migliore per tutti! + Questo Distintivo viene assegnato quando una tua risposta ottiene 25 "Mi piace". Il tuo messaggio è stato eccezionale e ha reso la conversazione molto più interessante. great_post: name: Grande Risposta description: Ha ricevuto 50 mi piace su una risposta long_description: | - Questo distintivo è assegnato quando una risposta riceve 50 mi piace. Wow! La tua risposta è stata ispiratrice, affascinante, divertente, o penetrante e la comunità l'ha amata. + Questo Distintivo viene assegnato quando una tua risposta ottiene 50 "Mi piace". Il tuo messaggio si è rivelato affascinante, simpatico, ha dato ispirazione e particolarmente sul punto, e la comunità lo ha davvero gradito! nice_topic: name: Argomento Piacevole description: Ha ricevuto 10 mi piace su un argomento long_description: | - Questo distintivo è assegnato quando un argomento riceve 10 mi piace. Hey, hai iniziato una conversazione interessante che la comunità ha apprezzato! + Questo Distintivo viene assegnato quando un tuo Argomento ha ricevuto 10 "Mi piace". Hai iniziato una conversazione interessante che la comunità ha gradito. good_topic: name: Buon Argomento description: Ha ricevuto 25 mi piace su un argomento long_description: | - Questo distintivo è assegnato quando il tuo argomento riceve 25 mi piace. Hai lanciato una conversazione vibrante che ha radunato la comunità! + Questo Distintivo viene assegnato quando un tuo Argomento ha ricevuto 25 "Mi piace". Hai iniziato una conversazione interessante che ha attratto molto interesse nella comunità. great_topic: name: Grande Argomento description: Ha ricevuto 50 "Mi piace" in un argomento long_description: | - Questo distintivo è assegnato quando un argomento riceve 50 mi piace. Hai avviato una conversazione affascinante e la comunità ha apprezzato la discussione dinamica che è seguita! + Questo Distintivo viene assegnato quando un tuo Argomento ha ricevuto 50 "Mi piace". Hai iniziato una conversazione affascinante e la comunità è stata entusiasta dell'animata conversazione che ne è scaturita. nice_share: name: Piacevole Condivisione description: Ha condiviso un messaggio con 25 visitatori unici @@ -2594,12 +2700,12 @@ it: name: Buona Condivisione description: Ha condiviso un messaggio con 300 visitatori unici long_description: | - Questo distintivo è assegnato per aver condiviso un collegamento che è stato cliccato da 300 visitatori esterni. Buon lavoro! Hai mostrato una grande discussione ad un gruppo di persone nuove e hai aiutato questa comunità a crescere. + Questo distintivo è assegnato per aver condiviso un collegamento che è stato cliccato da 300 visitatori esterni. Ottimo lavoro! Hai mostrato una bella discussione a un bel mucchio di persone e aiutato la crescita della comunità. great_share: name: Grande Condivisione description: Ha condiviso un messaggio con 1000 visitatori unici long_description: | - Questo distintivo è assegnato per aver condiviso un collegamento che è stato cliccato da 1000 visitatori esterni. Wow! Hai promosso un'interessante discussione ad un pubblico enorme e ci hai aiutato a far crescere la nostra comunità in grande stile! + Questo distintivo è assegnato per aver condiviso un collegamento che è stato cliccato da 1000 visitatori esterni. Hai promosso un'interessante discussione per un'audience enorme, e aiutato tantissimo la crescita di questa comunità. first_like: name: Primo "Mi piace" description: Ha messo "Mi piace" a un messaggio @@ -2608,21 +2714,15 @@ it: first_flag: name: Prima Segnalazione description: Segnalato un messaggio - long_description: | - Questo distintivo è assegnato la prima volta che segnali un messaggio. La segnalazione serve per contribuire a mantenere questo luogo pulito e piacevole per tutti. Se noti dei messaggi che richiedono l'attenzione di un moderatore per qualsiasi motivo, non esitate a contrassegnarli. Puoi anche contrassegnare per inviare messaggi personali ad altri utenti se vedi un problema con i loro messaggi. Se vedi un problema, :flag_black: segnalalo! promoter: name: Promotore description: Ha invitato un utente campaigner: name: Attivista description: Ha invitato 3 utenti - long_description: | - Questo distintivo è assegnato quando hai invitato 3 persone che hanno successivamente trascorso abbastanza tempo sul sito per diventare utenti base. Una comunità vivace ha bisogno di un'infusione regolare di nuovi arrivati che partecipano regolarmente e aggiungono nuove voci alle conversazioni. champion: name: Campione description: Ha invitato 5 membri - long_description: | - Questo distintivo è assegnato quando hai invitato 5 persone che hanno successivamente trascorso abbastanza tempo sul sito per diventare membri a tutti gli effetti. Wow! Grazie per aver ampliato la diversità della nostra comunità con nuovi membri! first_share: name: Prima Condivisione description: Ha condiviso un messaggio @@ -2637,12 +2737,12 @@ it: name: Prima Citazione description: Ha citato un messaggio long_description: | - Questo distintivo è assegnato la prima volta che citi un messaggio nella tua risposta. Citare le sezioni rilevanti di messaggi precedenti nella tua risposta aiuta a mantenere le discussioni connesse insieme e in argomento. Il modo più semplice per citare è evidenziare una sezione di un messaggio e quindi premere il pulsante rispondi. Cita generosamente! + Questo Distintivo è assegnato la prima volta che citi un messaggio in una tua risposta. Citare le parti rilevanti di un messaggio precedente nelle tue risposte aiuta a mantenere coese e in tema le discussioni. Il modo più semplice di citare è selezionare una sezione di un messaggio e cliccare sul pulsante Rispondi. Cita a volontà! read_guidelines: name: Linee Guida description: "Ha letto le linee guida della comunità" long_description: | - Questo distintivo è assegnato per aver letto le linee guida della comunità. Seguendo e condividendo queste semplici linee guida aiuti a costruire una comunità sicura, divertente e sostenibile per tutti. Ricorda sempre che c'è un altro essere umano, molto simile a te, dall'altro lato dello schermo. Sii carino! + Questo Distintivo è assegnato a chi legge le linee guida della comunità. Seguire e condividere queste semplici regole aiuta a costruire una comunità che sia sicura, divertente e sostenibile per tutti. Ricorda sempre che dall'altra parte dello schermo ci sono esseri umani proprio come te. Sii sempre gentile! reader: name: Lettore description: Ha letto ogni risposta in un argomento con più di 100 risposte @@ -2692,7 +2792,7 @@ it: name: Pazzo d’Amore description: Ha messo 50 mi piace al giorno per 20 volte long_description: | - Questo distintivo è assegnato quando usi tutti i 50 mi piace giornalieri per 20 giorni. Wow! Sei un modello di regolarità nel cercare di incoraggiare i membri della tua comunità! + Questo distintivo è assegnato quando usi tutti i 50 mi piace giornalieri per 20 giorni. Wow, sei davvero un modello di comportamento per tutti i tuoi compagni di comunità! thank_you: name: Grazie description: Ha ricevuto 20 mi piace sui messaggi e dato 10 mi piace @@ -2706,19 +2806,19 @@ it: empathetic: name: Empatico description: Ha ricevuto 500 mi piace sui messaggi e dato 1000 mi piace - long_description: | - Questo distintivo è assegnato quando hai ricevuto 500 mi piace sui messaggi e hai dato 1000 o più mi piace in cambio. Sei un modello di generosità e di apprezzamento reciproco : due_hearts :. first_emoji: name: Prima Emoji description: Ha usato una Emoji in un messaggio first_mention: name: Prima Menzione description: Ha menzionato un utente in un messaggio - long_description: "Questo distintivo è assegnato la prima volta che menzioni lo @username di qualcuno nel tuo messaggio. Ogni menzione genera una notifica a quella persona, così verrà a conoscenza del tuo messaggio. Inizia a digitare @ (il simbolo) per menzionare qualsiasi utente o, se è consentito, un gruppo - è un modo conveniente per portare qualcosa alla loro attenzione." + long_description: | + Questo Distintivo viene assegnato la prima volta che menzioni lo @username di un altro utente in un tuo messaggio. Ogni menzione genera una notifica a quella persona, così che siano informati del tuo messaggio. Inizia col digitare il simbolo @ (il simbolo "at") per menzionare un altro utente o, se consentito, un gruppo. Si tratta di un modo semplice di portare qualcosa alla loro attenzione. first_onebox: name: Prima Onebox description: ha inserito un collegamento che ha generato una onebox - long_description: "Questo distintivo è assegnato la prima volta che inserisci un collegamento su una riga da solo, il quale viene automaticamente espanso in un'anteprima con un breve riassunto del collegamento, un titolo e (quando disponibile) un'immagine." + long_description: | + Questo Distintivo viene assegnato la prima volta che pubblichi un collegamento scrivendolo su una riga a sé stante, in modo che venga incorporato dalla funzione onebox insieme ad un sommario, un titolo e, se disponibile, ad un'immagine. first_reply_by_email: name: Prima Risposta Da Email description: Ha risposto ad un messaggio tramite email @@ -2732,18 +2832,24 @@ it: enthusiast: name: Appassionato description: 10 giorni di frequenza - long_description: Questo distintivo è assegnato per aver frequentato il sito per 10 giorni consecutivi. Grazie per essere stato con noi per più di una settimana! + long_description: | + Questo Distintivo è assegnato per aver visitato il sito per 10 giorni consecutivi. Grazie per essere rimasto nei paraggi per oltre una settimana! aficionado: name: Amatoriale description: 100 giorni di frequenza - long_description: Questo distintivo è assegnato per aver frequentato il sito per 100 giorni consecutivi. Sono più di tre mesi! + long_description: | + Questo Distintivo viene assegnato per aver visitato il sito per oltre 100 giorni consecutivi. Si tratta di oltre tre mesi! devotee: name: Devoto description: 365 giorni di frequenza - long_description: "Questo distintivo è assegnato per aver frequentato il sito per 365 giorni consecutivi. Wow, un anno intero!" + long_description: | + Questo Distintivo è assegnato per aver visitato il sito per 365 giorni consecutivi. Wow, un intero anno! badge_title_metadata: "%{display_name}distintivo su %{site_title}" admin_login: success: "email Inviata" + errors: + unknown_email_address: "Indirizzo email sconosciuto." + invalid_token: "Token non valido." email_input: "Email Amministratore" submit_button: "Invia Email" performance_report: @@ -2753,6 +2859,7 @@ it: title: "Etichette" staff_tag_disallowed: "L'etichetta \"%{tag}\" può essere applicata solo dallo staff." staff_tag_remove_disallowed: "L'etichetta \"%{tag}\" può essere cancellata soltanto dallo staff." + minimum_required_tags: "Devi selezionare almeno %{count} Etichette." rss_by_tag: "Argomenti etichettati %{tag}" finish_installation: congratulations: "Congratulazioni, hai installato Discourse!" @@ -2760,7 +2867,6 @@ it: button: "Registrare" title: "Registrare Account Amministratore" help: "registrare un nuovo account per cominciare" - no_emails: "Purtroppo non è stata definita alcuna email di amministratore durante l'installazione, per cui la configurazione potrebbe risultare difficoltosa." confirm_email: title: "Conferma la tua Email" message: "

Abbiamo inviato una email di attivazione a %{email}. Segui le istruzioni nella email per attivare il tuo account.

Se non arriva assicurati di aver impostato correttamente l'email per Discourse e di aver controllato la cartella di spam.

" @@ -2863,10 +2969,8 @@ it: fields: favicon_url: label: "Icona Piccola" - description: "Immagine dell'icona utilizzata per rappresentare il tuo sito nei browser web che sembra buona a piccole dimensioni, ad esempio 32px per 32px." apple_touch_icon_url: label: "Icona Grande" - description: "Immagine dell'icona utilizzata per rappresentare il tuo sito su dispositivi moderni che sembra buona a dimensioni più grandi. La dimensione consigliata è almeno 144px per 144px." homepage: description: "Ti consigliamo di mostrare gli ultimi argomenti nella tua homepage, ma puoi anche visualizzare le categorie (gruppi di argomenti) sulla homepage, se preferisci." title: "Homepage" @@ -2875,8 +2979,14 @@ it: choices: latest: label: "Ultimi Argomenti" - categories: - label: "Categorie" + categories_only: + label: "Solo Categorie" + categories_with_featured_topics: + label: "Categorie con Argomenti in Evidenza" + categories_and_latest_topics: + label: "Categorie e Argomenti Recenti" + categories_and_top_topics: + label: "Categorie e Argomenti Popolari" emoji: title: "Emoji" description: "Quale stile di emoji preferisci per la tua comunità? Puoi aggiungere più Emoji personalizzate in seguito tramite Amministrazione, Personalizza, Emoji." @@ -2888,3 +2998,9 @@ it: description: |

Se te la senti di cambiare queste impostazioni, visita la tua sezione amministrazione; la trovi accanto all'icona della chiave inglese nel menu hamburger del sito.

Divertiti e buona fortuna nel costruire la tua nuova comunità!

+ discourse_push_notifications: + popup: + confirm_body: 'Successo! Le notifiche sono state abilitate.' + staff_action_logs: + not_found: "non trovato" + unknown: "sconosciuto" diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index e18b205fcd..c6bcb75d95 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -100,18 +100,18 @@ ja: reading_time: "閲覧時間" likes: "ã„ã„ã­ï¼" too_many_replies: - other: 申ã—訳ã‚りã¾ã›ã‚“ã€æ–°ã—ã„ユーザーã®åŒã˜ãƒˆãƒ”ックã¸ã®è¿”ä¿¡ã¯ã€ä¸€æ™‚的㫠%{count} 回ã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ + other: "申ã—訳ã‚りã¾ã›ã‚“ã€æ–°ã—ã„ユーザーã®åŒã˜ãƒˆãƒ”ックã¸ã®è¿”ä¿¡ã¯ã€ä¸€æ™‚的㫠%{count} 回ã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚" embed: start_discussion: "会話をã™ã‚‹" continue: "会話を続ã‘ã‚‹" more_replies: - other: '%{count} 以上ã®è¿”ä¿¡' + other: "%{count} 以上ã®è¿”ä¿¡" loading: "会話を読ã¿è¾¼ã‚“ã§ã„ã¾ã™â€¦" permalink: "パーマリンク" imported_from: "ã“れã¯ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã‚¨ãƒ³ãƒˆãƒª%{link}ã«å¯¾ã™ã‚‹ãƒ‡ã‚£ã‚¹ã‚«ãƒƒã‚·ãƒ§ãƒ³ãƒˆãƒ”ックã§ã™" in_reply_to: "â–¶ %{username}" replies: - other: '%{count} 通ã®è¿”ä¿¡' + other: "%{count} 通ã®è¿”ä¿¡" no_mentions_allowed: "ã‚ãªãŸã¯ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¸ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" no_images_allowed: "æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æŠ•稿ã«ç”»åƒã‚’付ã‘る事ã¯ã§ãã¾ã›ã‚“。" spamming_host: "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ã“ã®ãƒ›ã‚¹ãƒˆã¸ã®ãƒªãƒ³ã‚¯ã‚’貼るã“ã¨ã¯ã§ãã¾ã›ã‚“。" @@ -157,7 +157,7 @@ ja: trust_level_4: "トラストレベル4" education: until_posts: - other: '%{count} 投稿' + other: "%{count} 投稿" 'new-topic': | %{site_name} ã¸ã‚ˆã†ã“ãï¼— **æ–°ãŸãªãƒˆãƒ”ックã®ä½œæˆã‚りãŒã¨ã†ã”ã–ã„ã¾ã™!** @@ -243,7 +243,7 @@ ja: uncategorized: "未分類カテゴリã¯å‰Šé™¤å‡ºæ¥ã¾ã›ã‚“" has_subcategories: "サブカテゴリをæŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚«ãƒ†ã‚´ãƒªã‚’削除ã§ãã¾ã›ã‚“。" topic_exists: - other: '%{count}個ã®ãƒˆãƒ”ックをæŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚«ãƒ†ã‚´ãƒªã‚’削除ã§ãã¾ã›ã‚“。一番å¤ã„トピックã¯%{topic_link}ã§ã™ã€‚' + other: "%{count}個ã®ãƒˆãƒ”ックをæŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚«ãƒ†ã‚´ãƒªã‚’削除ã§ãã¾ã›ã‚“。一番å¤ã„トピックã¯%{topic_link}ã§ã™ã€‚" topic_exists_no_oldest: "%{count}個ã®ãƒˆãƒ”ックをæŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚«ãƒ†ã‚´ãƒªã‚’削除ã§ãã¾ã›ã‚“。" trust_levels: newuser: @@ -253,60 +253,60 @@ ja: change_failed_explanation: "%{user_name} ã‚’ '%{new_trust_level}' ã«ä¸‹ã’よã†ã¨ã—ã¾ã—ãŸãŒã€æ—¢ã«ãƒˆãƒ©ã‚¹ãƒˆãƒ¬ãƒ™ãƒ«ãŒ '%{current_trust_level}' ã§ã™ã€‚%{user_name} 㯠'%{current_trust_level}' ã®ã¾ã¾ã«ãªã‚Šã¾ã™ - ã‚‚ã—ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’é™æ ¼ã•ã›ãŸã„å ´åˆã¯ã€ãƒˆãƒ©ã‚¹ãƒˆãƒ¬ãƒ™ãƒ«ã‚’ロックã—ã¦ãã ã•ã„" rate_limiter: hours: - other: '%{count} 時間' + other: "%{count} 時間" minutes: - other: '%{count} 分' + other: "%{count} 分" seconds: - other: '%{count} ç§’' + other: "%{count} ç§’" datetime: distance_in_words: half_a_minute: "1分å‰" less_than_x_seconds: - other: < %{count} ç§’ + other: "< %{count} ç§’" x_seconds: - other: '%{count} ç§’' + other: "%{count} ç§’" less_than_x_minutes: - other: '%{count}分å‰' + other: "%{count}分å‰" x_minutes: - other: '%{count}分' + other: "%{count}分" about_x_hours: - other: '%{count} 時間' + other: "%{count} 時間" x_days: - other: '%{count} æ—¥' + other: "%{count} æ—¥" about_x_months: - other: '%{count}ヶ月' + other: "%{count}ヶ月" x_months: - other: '%{count}ヶ月' + other: "%{count}ヶ月" about_x_years: - other: '%{count} å¹´' + other: "%{count} å¹´" over_x_years: - other: '> %{count} å¹´' + other: "> %{count} å¹´" almost_x_years: - other: '%{count} å¹´' + other: "%{count} å¹´" distance_in_words_verbose: half_a_minute: "ãŸã£ãŸä»Š" less_than_x_seconds: - other: ç¾åœ¨ + other: "ç¾åœ¨" x_seconds: - other: '%{count} ç§’å‰' + other: "%{count} ç§’å‰" less_than_x_minutes: - other: '%{count}分未満' + other: "%{count}分未満" x_minutes: - other: '%{count}分å‰' + other: "%{count}分å‰" about_x_hours: - other: '%{count} 時間å‰' + other: "%{count} 時間å‰" x_days: - other: '%{count} æ—¥å‰' + other: "%{count} æ—¥å‰" about_x_months: - other: ç´„ %{count}ãƒ¶æœˆå‰ + other: "ç´„ %{count}ヶ月å‰" x_months: - other: '%{count}ヶ月å‰' + other: "%{count}ヶ月å‰" about_x_years: - other: ç´„ %{count} å¹´å‰ + other: "ç´„ %{count} å¹´å‰" over_x_years: - other: '%{count} 年以上å‰' + other: "%{count} 年以上å‰" almost_x_years: - other: ã ã„ãŸã„ %{count} å¹´å‰ + other: "ã ã„ãŸã„ %{count} å¹´å‰" password_reset: no_token: "申ã—訳ã‚りã¾ã›ã‚“。パスワード変更ã®ãŸã‚ã®ãƒªãƒ³ã‚¯ã¯å¤ã„よã†ã§ã™ã€‚ãƒ­ã‚°ã‚¤ãƒ³ãƒœã‚¿ãƒ³ã‚’é¸æŠžã—ã€å†åº¦ãƒ‘スワード変更を行ã£ã¦ãã ã•ã„" update: 'パスワード更新' @@ -528,7 +528,6 @@ ja: xaxis: "æ—¥" yaxis: "åˆè¨ˆ" mobile_visits: - title: "アクセスユーザー" xaxis: "æ—¥" yaxis: "アクセス数" dashboard: @@ -753,7 +752,6 @@ ja: min_first_post_typing_time: "最åˆã®æŠ•稿ã«å¿…è¦ãªã‚¿ã‚¤ãƒ”ング時間。閾値以下ã®å ´åˆã€æŠ•稿ã¯è‡ªå‹•çš„ã«æ‰¿èªã‚­ãƒ¥ãƒ¼ã«è¿½åŠ ã•れã¾ã™ã€‚0を設定ã™ã‚‹ã¨ç„¡åŠ¹åŒ–ã•れã¾ã™(推奨ã•れã¾ã›ã‚“)" reply_by_email_enabled: "メールã§ã®ãƒˆãƒ”ックã¸ã®è¿”信を有効化ã™ã‚‹" reply_by_email_address: "メールアドレスã«ã‚ˆã‚‹å›žç­”ã®ãƒ†ãƒ³ãƒ—レート。例: %{reply_key}@reply.myforum.com" - disable_emails: "Discourseã‹ã‚‰ã®å…¨ã¦ã®ç¨®é¡žã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã‚’æ­¢ã‚ã‚‹" strip_images_from_short_emails: "メールã®ã‚µã‚¤ã‚ºãŒ2800 Bytesã‚’è¶…ãˆãªã„よã†ã«ç”»åƒã‚’削除ã™ã‚‹" short_email_length: "ショートメールã®ãƒã‚¤ãƒˆæ•°" pop3_polling_enabled: "メール回答ã®ãŸã‚ã« POP3 ã‚’ãƒãƒ¼ãƒªãƒ³ã‚°ã™ã‚‹" @@ -842,9 +840,9 @@ ja: not_seen_in_a_month: "ãŠå¸°ã‚Šãªã•ã„ï¼ã€€æœ€è¿‘見ã‹ã‘ã¾ã›ã‚“ã§ã—ãŸã­ã€‚ ã“れらãŒã‚ãªãŸãŒé›¢ã‚Œã¦ã‹ã‚‰æœ€ã‚‚人気ã®ãƒˆãƒ”ックã§ã™" move_posts: new_topic_moderator_post: - other: '%{count}ä»¶ã®æŠ•ç¨¿ã‚’æ–°ã—ã„トピックã«åˆ†å‰²ã—ã¾ã—ãŸ: %{topic_link}' + other: "%{count}ä»¶ã®æŠ•ç¨¿ã‚’æ–°ã—ã„トピックã«åˆ†å‰²ã—ã¾ã—ãŸ: %{topic_link}" existing_topic_moderator_post: - other: '%{count} ä»¶ã®ãƒã‚¹ãƒˆã‚’既存ã®ãƒˆãƒ”ックã«ãƒžãƒ¼ã‚¸ã—ã¾ã—ãŸ: %{topic_link}' + other: "%{count} ä»¶ã®ãƒã‚¹ãƒˆã‚’既存ã®ãƒˆãƒ”ックã«ãƒžãƒ¼ã‚¸ã—ã¾ã—ãŸ: %{topic_link}" change_owner: post_revision_text: "%{old_user} ã‹ã‚‰ %{new_user}ã«ownershipを移動ã•ã›ã¾ã—ãŸ" deleted_user: "削除ã•れãŸãƒ¦ãƒ¼ã‚¶" @@ -854,17 +852,17 @@ ja: closed_enabled: "ã“ã®ãƒˆãƒ”ックã¯ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚返信ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" closed_disabled: "ã“ã®ãƒˆãƒ”ックã¯ã‚ªãƒ¼ãƒ—ンã•れã¾ã—ãŸã€‚æ–°ãŸã«å›žç­”を投稿ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" autoclosed_enabled_days: - other: ã“ã®ãƒˆãƒ”ックã¯%{count}æ—¥ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + other: "ã“ã®ãƒˆãƒ”ックã¯%{count}æ—¥ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" autoclosed_enabled_hours: - other: ã“ã®ãƒˆãƒ”ックã¯%{count}時間ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + other: "ã“ã®ãƒˆãƒ”ックã¯%{count}時間ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" autoclosed_enabled_minutes: - other: ã“ã®ãƒˆãƒ”ックã¯%{count}分ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + other: "ã“ã®ãƒˆãƒ”ックã¯%{count}分ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" autoclosed_enabled_lastpost_days: - other: ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€å¾Œã®è¿”ä¿¡ã‹ã‚‰%{count}æ—¥ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + other: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€å¾Œã®è¿”ä¿¡ã‹ã‚‰%{count}æ—¥ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" autoclosed_enabled_lastpost_hours: - other: ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€å¾Œã®è¿”ä¿¡ã‹ã‚‰%{count}時間ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + other: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€å¾Œã®è¿”ä¿¡ã‹ã‚‰%{count}時間ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" autoclosed_enabled_lastpost_minutes: - other: ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€å¾Œã®è¿”ä¿¡ã‹ã‚‰%{count}分ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + other: "ã“ã®ãƒˆãƒ”ãƒƒã‚¯ã¯æœ€å¾Œã®è¿”ä¿¡ã‹ã‚‰%{count}分ãŒçµŒéŽã—ãŸã®ã§è‡ªå‹•çš„ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸã€‚æ–°ãŸã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" autoclosed_disabled: "ã“ã®ãƒˆãƒ”ックã¯å†ã‚ªãƒ¼ãƒ—ンã•れã¾ã—ãŸã€‚æ–°ã—ã„å›žç­”ãŒæŠ•ç¨¿ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚。" autoclosed_disabled_lastpost: "ã“ã®ãƒˆãƒ”ックã¯å†ã‚ªãƒ¼ãƒ—ンã•れã¾ã—ãŸã€‚æ–°ã—ã„å›žç­”ãŒæŠ•ç¨¿ã§ãã¾ã™" pinned_enabled: "ã“ã®ãƒˆãƒ”ックã¯ãƒ”ン留ã‚ã•れã¾ã—ãŸã€‚スタッフã«ã‚ˆã£ã¦å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã®ãƒ”ン留ã‚ãŒè§£é™¤ã•れるã‹ã€ãƒ¦ãƒ¼ã‚¶è‡ªèº«ãŒãƒ”ン留ã‚解除ã™ã‚‹ã¾ã§ã€ã‚«ãƒ†ã‚´ãƒªã®ãƒˆãƒƒãƒ—ã«è¡¨ç¤ºã•れã¾ã™" @@ -908,7 +906,7 @@ ja: max_new_accounts_per_registration_ip: "ã‚ãªãŸã®IPアドレスã‹ã‚‰ã®æ–°è¦ç™»éŒ²ã¯è¡Œãˆã¾ã›ã‚“(登録å¯èƒ½ãªæ•°ã‚’è¶…ãˆã¦ã„ã¾ã™)。スタッフã¸ãŠå•ã„åˆã‚ã›ãã ã•ã„。" flags_reminder: subject_template: - other: '%{count}ä»¶ã®é€šå ±ãŒå¯¾å¿œå¾…ã¡ã§ã™' + other: "%{count}ä»¶ã®é€šå ±ãŒå¯¾å¿œå¾…ã¡ã§ã™" invite_password_instructions: subject_template: "%{site_name} アカウントã®ãƒ‘スワードを設定" flag_reasons: @@ -949,7 +947,7 @@ ja: メールã‹ã‚‰å›žç­”を見ã¤ã‘る事ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚返信ã¯ãƒ¡ãƒ¼ãƒ«ã®ãƒˆãƒƒãƒ—ã«ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。インライン回答を見ã¤ã‘る事ã¯ã§ãã¾ã›ã‚“。 pending_users_reminder: subject_template: - other: '%{count} 人ã®ãƒ¦ãƒ¼ã‚¶ã‹æ‰¿èªã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚' + other: "%{count} 人ã®ãƒ¦ãƒ¼ã‚¶ã‹æ‰¿èªã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚" text_body_template: | æ–°ãŸãªãƒ¦ãƒ¼ã‚¶ãŒã€ãƒ•ォーラムå‚加ã®ãŸã‚ã®æ‰¿èªï¼ˆã‚‚ã—ãã¯æ‹’å¦ï¼‰å¾…ã¡çŠ¶æ…‹ã«ãªã£ã¦ã„ã¾ã™ã€‚ @@ -973,7 +971,6 @@ ja: description: "メールã«èˆˆå‘³ãŒã‚りã¾ã›ã‚“ã‹? 下ã®ãƒªãƒ³ã‚¯ã‚’クリックã™ã‚‹ã¨ã€å³åº§ã«ãƒ¡ãƒ¼ãƒ«è§£é™¤ãŒã§ãã¾ã™:" reply_by_email: "回答ã™ã‚‹ã«ã¯ã“ã®ãƒ¡ãƒ¼ãƒ«ã«è¿”ä¿¡ã™ã‚‹ã‹ã€ (%{base_url}%{url}) ã«[ブラウザã§ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„]。" visit_link_to_respond: "回答ã™ã‚‹ã«ã¯(%{base_url}%{url})ã«[ブラウザã§ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„]。" - visit_link_to_respond_pm: "回答ã™ã‚‹ã«ã¯(%{base_url}%{url})ã«[ブラウザã§ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„]。" posted_by: "%{post_date} ã« %{username} ãŒæŠ•ç¨¿" digest: why: "ã‚ãªãŸãŒæœ€å¾Œã«ã‚¢ã‚¯ã‚»ã‚¹ã—㟠%{last_seen_at} 以é™ã® %{site_link} ã®ã¾ã¨ã‚ã§ã™" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index a0c99eb58e..9506c7f054 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -29,6 +29,7 @@ ko: loading: "로딩중" powered_by_html: 'Discourse 으로 호스팅ë˜ê³  있습니다. JavaScript ê°€ 활성화ë˜ì–´ ìžˆì„ ë•Œ 가장 멋지게 보입니다.' log_in: "로그ì¸" + submit: "제출" purge_reason: "ìžë™ì ìœ¼ë¡œ ë¹„í™œì„±í™”ëœ ê³„ì •ì„ ì‚­ì œí•˜ì˜€ìŠµë‹ˆë‹¤." disable_remote_images_download_reason: "디스í¬ì €ìž¥ê³µê°„ì´ ë¶€ì¡±í•˜ì—¬ ì›ê²© ì´ë¯¸ì§€ 다운로드 ê¸°ëŠ¥ì´ ë¹„í™œì„±í™” ë˜ì—ˆìŠµë‹ˆë‹¤." anonymous: "ìµëª…" @@ -36,6 +37,11 @@ ko: themes: bad_color_scheme: "색 스케마가 잘못ë˜ì–´ì„œ 테마를 ì—…ë°ì´íŠ¸í•  수 없습니다" other_error: "테마를 ì—…ë°ì´íŠ¸í•  수 없습니다" + settings_errors: + number_value_not_valid_min_max: "반드시 ê°’ì€ %{min}와 %{max}사ì´ì–´ì•¼ 합니다." + number_value_not_valid_min: "%{min}ê³¼ 같거나 커야합니다." + number_value_not_valid_max: "%{max}ê³¼ 같거나 작아야합니다." + string_value_not_valid: "새로운 ê°’ì˜ ê¸¸ì´ê°€ í—ˆìš©ëœ ë²”ìœ„ë¥¼ 벗어났습니다." emails: incoming: default_subject: "토픽ì—는 ì œëª©ì´ í•„ìš”í•©ë‹ˆë‹¤" @@ -58,6 +64,7 @@ ko: unrecognized_error: "ì¸ì‹ë˜ì§€ ì•Šì€ ì—러" errors: &errors format: '%{attribute} %{message}' + format_with_full_message: '%{attribute}:%{message}' messages: too_long_validation: "%{length}ìžë¥¼ 입력하셨습니다. 최대 %{max}ìžê¹Œì§€ ìž…ë ¥ 가능합니다. " invalid_boolean: "ìž˜ëª»ëœ ë¶€ìš¸ë¦°ê°’ìž…ë‹ˆë‹¤." @@ -83,6 +90,7 @@ ko: not_an_integer: 정수여야 함 odd: 홀수여야 함 record_invalid: '유효성검사 실패: %{errors}' + max_emojis: "가질수있는 ì´ëª¨í‹°ì½˜ 개수가%{max_emojis_count}를 넘ì„수 없습니다." restrict_dependent_destroy: one: "ì—°ê´€ëœ %{record} 레코드가 존재하므로 레코드를 지울 수 ì—†ìŒ." many: "ì—°ê´€ëœ %{record} 레코드가 존재하므로 레코드를 지울 수 ì—†ìŒ." @@ -129,7 +137,7 @@ ko: reading_time: "ì½ì€ 시간" likes: "좋아요" too_many_replies: - other: 죄송합니다. ì‹ ê·œ 가입ìžëŠ” 글 í•˜ë‚˜ì— %{count}개까지만 ëŒ“ê¸€ì„ ë‹¬ 수 있습니다. + other: "죄송합니다. ì‹ ê·œ 가입ìžëŠ” 글 í•˜ë‚˜ì— %{count}개까지만 ëŒ“ê¸€ì„ ë‹¬ 수 있습니다." embed: start_discussion: "토론 시작" continue: "토론 계ì†í•˜ê¸°" @@ -139,28 +147,29 @@ ko: no_hosts: "ìž„ë² ë”©ì„ ìœ„í•œ 호스트가 설정ë˜ì§€ 않았습니다." configure: "삽입 설정" more_replies: - other: 추가 %{count} ê°œ 댓글 + other: "추가 %{count} ê°œ 댓글" loading: "토론 불러오는 중..." permalink: "Permalink" imported_from: "%{link}ì— ìžˆëŠ” ì›ê¸€ê³¼ 유사한 토론 글입니다." in_reply_to: "â–¶ %{username}" replies: - other: 답글 %{count}ê°œ + other: "답글 %{count}ê°œ" no_mentions_allowed: "죄송합니다, 다른 사용ìžë¥¼ 언급할 수 없습니다." too_many_mentions: - other: 죄송합니다, ì´ í¬ìŠ¤íŠ¸ì—서 %{count}ëª…ì˜ ì‚¬ìš©ìžë§Œ 언급할 수 있습니다. + other: "죄송합니다, ì´ í¬ìŠ¤íŠ¸ì—서 %{count}ëª…ì˜ ì‚¬ìš©ìžë§Œ 언급할 수 있습니다." no_mentions_allowed_newuser: "죄송합니다. 새로운 사용ìžëŠ” 다른 사용ìžë¥¼ 언급할 수 없습니다." too_many_mentions_newuser: - other: 죄송합니다. ì‹ ê·œ 회ì›ì€ %{count}ëª…ì˜ ì‚¬ìš©ìžë§Œ 언급할 수 있습니다. + other: "죄송합니다. ì‹ ê·œ 회ì›ì€ %{count}ëª…ì˜ ì‚¬ìš©ìžë§Œ 언급할 수 있습니다." + no_images_allowed_trust: "죄송합니다, í¬ìŠ¤íŠ¸ì— ì´ë¯¸ì§€ë¥¼ ë„£ì„수 없습니다." no_images_allowed: "죄송합니다. ì‹ ê·œ 회ì›ì€ ê¸€ì— ì´ë¯¸ì§€ë¥¼ ë„£ì„ ìˆ˜ 없습니다." too_many_images: - other: 죄송합니다. 신규회ì›ì€ 글 í•˜ë‚˜ì— %{count}ê°œì˜ ì´ë¯¸ì§€ë§Œ ë„£ì„ ìˆ˜ 있습니다. + other: "죄송합니다. 신규회ì›ì€ 글 í•˜ë‚˜ì— %{count}ê°œì˜ ì´ë¯¸ì§€ë§Œ ë„£ì„ ìˆ˜ 있습니다." no_attachments_allowed: "죄송합니다. 신규회ì›ì€ ê¸€ì— íŒŒì¼ì„ 첨부할 수 없습니다." too_many_attachments: - other: 죄송합니다. 신규회ì›ì€ 글 í•˜ë‚˜ì— %{count}ê°œì˜ íŒŒì¼ë§Œ 첨부할 수 있습니다. + other: "죄송합니다. 신규회ì›ì€ 글 í•˜ë‚˜ì— %{count}ê°œì˜ íŒŒì¼ë§Œ 첨부할 수 있습니다." no_links_allowed: "죄송합니다. 신규회ì›ì€ ê¸€ì— ë§í¬ë¥¼ ë„£ì„ ìˆ˜ 없습니다." too_many_links: - other: 죄송합니다. 신규회ì›ì€ 글 í•˜ë‚˜ì— ë§í¬ë¥¼ %{count}개까지 ë„£ì„ ìˆ˜ 있습니다. + other: "죄송합니다. 신규회ì›ì€ 글 í•˜ë‚˜ì— ë§í¬ë¥¼ %{count}개까지 ë„£ì„ ìˆ˜ 있습니다." spamming_host: "죄송합니다. 회ì›ë‹˜ì€ ë§í¬ë¥¼ 첨부할 수 없습니다." user_is_suspended: "ê°€ìž…ì´ ë³´ë¥˜ëœ íšŒì›ì€ ê¸€ì„ ì“¸ 수 없습니다." topic_not_found: "뭔가 잘못ë네요. 아마 ì½ë ¤ëŠ” ë„ì¤‘ì— í† í”½ì´ ë‹«í˜”ê±°ë‚˜ 지워진 ê±´ ì•„ë‹ê¹Œìš”?" @@ -225,7 +234,7 @@ ko: title: "@%{group_name}ê·¸ë£¹ì— ê°€ìž… ì‹ ì²­" education: until_posts: - other: 글 %{count}ê°œ + other: "글 %{count}ê°œ" 'new-topic': | %{site_name}ì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤ — **새로운 대화를 시작해서 ê°ì‚¬í•©ë‹ˆë‹¤.** @@ -367,14 +376,12 @@ ko: ì´ í† í”½ì— ë‹µê¸€ì´ ìŒ“ì´ëŠ” 게 싫다면, 관리기능 :wrench:(우측 ìƒë‹¨ì— 있어요)ì„ í†µí•´ ì´ í† í”½ì„ ë‹«ì„ ìˆ˜ 있습니다. lounge_welcome: title: "ë¼ìš´ì§€ì— 오신 ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤." - body: |2 - - 축하합니다! :confetti_ball: ë‹¹ì‹ ì˜ íšŒì›ë“±ê¸‰ì´ **ì§€ë„ìž** (회ì›ë“±ê¸‰ 3등급)로 올ë¼ê°”기 ë•Œë¬¸ì— ì´ í† í”½ì„ ë³¼ 수 있게 ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ì œë¶€í„° ì•„ëž˜ì˜ í–‰ë™ë“¤ì„ í•  수 있습니다 … * 토픽 ì œëª©ì„ ìˆ˜ì •í•  수 있습니다 * í† í”½ì˜ ì¹´í…Œê³ ë¦¬ë¥¼ 수정할 수 있습니다 * ë§í¬ê°€ follow로 처리ë©ë‹ˆë‹¤ ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) ê°€ 제거ë©ë‹ˆë‹¤) * 회ì›ë“±ê¸‰ 3 ì´ìƒì¸ 사용ìžê°€ 접근할 수 있는 비공개 ì¹´í…Œê³ ë¦¬ì¸ ë¼ìš´ì§€ì— 접근할 수 있습니다 * 좋아요와 ì‹ ê³ ì˜ ê°€ì¤‘ì¹˜ê°€ 높아집니다 [ì •ê·œ 멤버 목ë¡](/badges/3/regular)ì„ í™•ì¸í•  수 있습니다. ì¸ì‚¬í•˜ëŠ” ê²ƒì„ ìžŠì§€ë§ˆì„¸ìš”. ì´ ì»¤ë®¤ë‹ˆí‹°ì˜ ì¤‘ìš”í•œ ì—­í• ì„ í•´ì£¼ì‹  ê²ƒì— ê°ì‚¬ë“œë¦½ë‹ˆë‹¤! (회ì›ë“±ê¸‰ì— 관한 ë” ìžì„¸í•œ 정보를 보시려면, [ì´ í† í”½ 확ì¸í•˜ì„¸ìš”][trust]. ê¸°ì¤€ì— ë§žëŠ” 사람만 ì •ê·œ 회ì›ìœ¼ë¡œ ìžê²©ì´ 유지ë©ë‹ˆë‹¤.) [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "'%{category}' ì¹´í…Œê³ ë¦¬ì˜ ì„¤ëª…" replace_paragraph: "(ì´ ë¬¸ë‹¨ì„ ìƒˆë¡œìš´ 카테고리를 간단히 설명하는 내용으로 대체하세요. ì´ ê°€ì´ë“œëŠ” 카테고리 섹션 ì˜ì—­ì— 표시ë˜ë¯€ë¡œ, 200ìž ì´í•˜ë¡œ 유지하는 게 좋습니다. **ì´ ì„¤ëª…ì„ íŽ¸ì§‘í•˜ê±°ë‚˜ í† í”½ì„ ìƒì„±í•˜ê¸° 전까지는, ì´ ì¹´í…Œê³ ë¦¬ëŠ” 카테고리 페ì´ì§€ì— 표시ë˜ì§€ 않습니다.**)" post_template: "%{replace_paragraph}\n\në‹¤ìŒ ë¬¸ë‹¨ì„ ê¸´ ì„¤ëª…ì„ ì“°ëŠ”ë° í™œìš©í•˜ì„¸ìš”. ì¹´í…Œê³ ë¦¬ì˜ ê°€ì´ë“œë¼ì¸ì´ë‚˜ ê·œì¹™ì„ ì“°ì‹¤ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.\n\n- 왜 ì´ ì¹´í…Œê³ ë¦¬ë¥¼ 사용해야하나요? ìš©ë„ê°€ 무엇ì¸ê°€ìš”?\n\n- ê¸°ì¡´ì˜ ë‹¤ë¥¸ 카테고리와 정확히 어떻게 다른가요?\n\n- ì´ ì¹´í…Œê³ ë¦¬ì— ì†í•œ í† í”½ë“¤ì€ ëŒ€ì²´ë¡œ ë¬´ì—‡ì„ ë‹¤ë£¨ë‚˜ìš”?\n\n- ì´ ì¹´í…Œê³ ë¦¬ê°€ 필요한가요? 다른 카테고리와 병합하거나 서브 카테고리로 만들면 안ë˜ë‚˜ìš”?\n" errors: + not_found: "카테고리를 ì°¾ì„수 없습니다!" uncategorized_parent: "Uncategorized 카테고리는 부모 카테고리를 가질 수 없습니다." self_parent: "하위 ì¹´í…Œê³ ë¦¬ì˜ ë¶€ëª¨ëŠ” ìžì‹ ì´ ë  ìˆ˜ 없습니다." depth: "하위 카테고리는 계층 구조로 사용할 수 없습니다." @@ -385,8 +392,6 @@ ko: cannot_delete: uncategorized: "Uncategorized는 삭제할 수 없습니다." has_subcategories: "하위 카테고리가 있어, 삭제할 수 없습니다." - topic_exists: - other: '%{count}ê°œì˜ ê¸€íƒ€ëž˜ê°€ ì´ ì¹´í…Œê³ ë¦¬ ë‚´ì— ìžˆì–´ 삭제할 수 없습니다. 가장 ì˜¤ëž˜ëœ ê¸€íƒ€ëž˜ëŠ” %{topic_link}입니다.' topic_exists_no_oldest: "%{count}ê°œì˜ ê¸€íƒ€ëž˜ê°€ ì´ ì¹´í…Œê³ ë¦¬ ë‚´ì— ìžˆì–´ 삭제할 수 없습니다." uncategorized_description: "카테고리가 필요없는 토픽ì´ê±°ë‚˜, í† í”½ì— ë¶€í•©í•˜ëŠ” 카테고리가 없습니다." trust_levels: @@ -401,62 +406,65 @@ ko: leader: title: "리ë”" change_failed_explanation: "ë‹¹ì‹ ì€ %{user_name} 사용ìžë¥¼ '%{new_trust_level}'으로 강등시키려 하였습니다. 하지만 해당 사용ìžì˜ 회ì›ë“±ê¸‰ëŠ” ì´ë¯¸ '%{current_trust_level}'입니다. %{user_name} 사용ìžì˜ 회ì›ë“±ê¸‰ëŠ” '%{current_trust_level}'으로 유지ë©ë‹ˆë‹¤. - if you wish to demote user lock trust level first" + post: + image_placeholder: + broken: "ì´ë¯¸ì§€ë¥¼ 표시할수없ìŒ" rate_limiter: hours: - other: '%{count}시간' + other: "%{count}시간" minutes: - other: '%{count}ë¶„' + other: "%{count}ë¶„" seconds: - other: '%{count}ì´ˆ' + other: "%{count}ì´ˆ" datetime: distance_in_words: half_a_minute: "<1ë¶„" less_than_x_seconds: - other: < %{count}ì´ˆ + other: "< %{count}ì´ˆ" x_seconds: - other: '%{count}ì´ˆ' + other: "%{count}ì´ˆ" less_than_x_minutes: - other: < %{count}ë¶„ + other: "< %{count}ë¶„" x_minutes: - other: '%{count}ë¶„' + other: "%{count}ë¶„" about_x_hours: - other: '%{count}시간' + other: "%{count}시간" x_days: - other: '%{count}ì¼' + other: "%{count}ì¼" about_x_months: - other: '%{count}달' + other: "%{count}달" x_months: - other: '%{count}달' + other: "%{count}달" about_x_years: - other: '%{count}ë…„' + other: "%{count}ë…„" over_x_years: - other: '%{count}ë…„ 보다 ì „' + other: "%{count}ë…„ 보다 ì „" almost_x_years: - other: 약 %{count}ë…„ + other: "약 %{count}ë…„" distance_in_words_verbose: half_a_minute: "방금 ì „" less_than_x_seconds: - other: 방금 ì „ + other: "방금 ì „" x_seconds: - other: '%{count}ì´ˆ ì „' + other: "%{count}ì´ˆ ì „" less_than_x_minutes: - other: '%{count}ë¶„ 보다 ì´ì „' + other: "%{count}ë¶„ 보다 ì´ì „" x_minutes: - other: '%{count}ë¶„ ì „' + other: "%{count}ë¶„ ì „" about_x_hours: - other: '%{count}시간 ì „' + other: "%{count}시간 ì „" x_days: - other: '%{count}ì¼ ì „' + other: "%{count}ì¼ ì „" about_x_months: - other: 약 %{count}달 ì „ + other: "약 %{count}달 ì „" x_months: - other: ${count}달 ì „ + other: "${count}달 ì „" about_x_years: - other: 약 %{count}ë…„ ì „ + other: "약 %{count}ë…„ ì „" over_x_years: - other: '%{count}ë…„ 보다 ì´ì „' + other: "%{count}ë…„ 보다 ì´ì „" almost_x_years: - other: 약 %{count}ë…„ ì „ + other: "약 %{count}ë…„ ì „" password_reset: no_token: "죄송하지만, 해당 비밀번호 변경 ë§í¬ëŠ” 너무 오래ë습니다. ë¡œê·¸ì¸ ë²„íŠ¼ì„ ëˆŒëŸ¬ì„œ '비밀번호를 잊어버렸어요'를 사용하여 새로운 ë§í¬ë¥¼ 받으세요." choose_new: "새로운 비밀번호를 입력하세요" @@ -530,14 +538,10 @@ ko: description: '좋아요' short_description: '좋아요' long_form: 'ì´ê²ƒì„ 좋아함' - vote: - title: '투표' - description: '투표하기' - short_description: '투표하기' - long_form: '투표 ë¨' user_activity: + no_default: + others: "í™œë™ ì—†ìŒ." no_bookmarks: - self: "ë¶ë§ˆí¬í•œ í¬ìŠ¤íŠ¸ê°€ 없습니다. í¬ìŠ¤íŠ¸ë¥¼ ë¶ë§ˆí¬í•˜ë©´ ë‚˜ì¤‘ì— ì‰½ê²Œ 확ì¸í•  수 있습니다." others: "ë¶ë§ˆí¬ê°€ 없습니다" no_likes_given: self: "좋아요한 ê²Œì‹œê¸€ì´ ì—†ìŠµë‹ˆë‹¤" @@ -677,8 +681,6 @@ ko: num_users: "사용ìžë“¤" top_referred_topics: title: "가장 ë§Žì´ ì°¸ì¡°ëœ ê¸€íƒ€ëž˜ë“¤" - xaxis: "글타래" - num_clicks: "í´ë¦­" page_view_anon_reqs: title: "ìµëª…" xaxis: "ì¼" @@ -735,7 +737,6 @@ ko: xaxis: "ì¼" yaxis: "ì´" mobile_visits: - title: "ì‚¬ìš©ìž ë°©ë¬¸íšŸìˆ˜" xaxis: "ì¼" yaxis: "방문 횟수" dashboard: @@ -755,7 +756,7 @@ ko: failing_emails_warning: '실패한 ì´ë©”ì¼ ìž‘ì—…ì´ %{num_failed_jobs} ê°œ 있습니다. app.yml ì„ ì—´ì–´ì„œ ë©”ì¼ ì„œë²„ ì„¤ì •ì´ ì •í™•í•œì§€ 확ì¸í•´ë³´ì„¸ìš”. Sidekiqì—서 실패한 작업 보기.' subfolder_ends_in_slash: "서브í´ë” ì„¤ì •ì´ ì •í™•í•˜ì§€ 않습니다. DISCOURSE_RELATIVE_URL_ROOT 다ìŒì— 슬래시가 있습니다." email_polling_errored_recently: - other: ì´ë©”ì¼ í´ë§ì—서 지난 24시간 ë™ì•ˆ%{count}ê°œì˜ ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. 세부 정보는 로그ì—서 확ì¸í•˜ì„¸ìš”. + other: "ì´ë©”ì¼ í´ë§ì—서 지난 24시간 ë™ì•ˆ%{count}ê°œì˜ ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. 세부 정보는 로그ì—서 확ì¸í•˜ì„¸ìš”." bad_favicon_url: "파비콘 불러오기가 실패했습니다. 사ì´íЏ 설정ì—서 favicon_url ì„¤ì •ì„ í™•ì¸í•´ë³´ì„¸ìš”." poll_pop3_timeout: "타임아웃으로 POP3 ì—°ê²°ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. 수신 ì´ë©”ì¼ì„ 가져올 수 없습니다. POP3 설정 ê³¼ 서비스 제공ìžë¥¼ 확ì¸í•˜ì„¸ìš”." poll_pop3_auth_error: "ì¸ì¦ 실패로 POP3 ì—°ê²°ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. POP3 ì„¤ì •ì„ í™•ì¸í•˜ì„¸ìš”." @@ -851,7 +852,6 @@ ko: post_menu: "글 ë©”ë‰´ì— ì–´ë–¤ ì‚¬í•­ë“¤ì´ ë¬´ìŠ¨ 순서로 올ë¼ì˜¬ì§€ 결정합니다. 예: like(좋아요)|edit(수정)|flag(ì‹ ê³ )|delete(ì‚­ì œ)|share(공유)|bookmark(ë¶ë§ˆí¬)|reply(답글)" post_menu_hidden_items: "게시 메뉴ì—서 기본으로 숨길 메뉴 ì•„ì´í…œë“¤" share_links: "공유 다ì´ì–¼ë¡œê·¸ì— ì–´ë–¤ ì•„ì´í…œì´ ì–´ë–¤ 순서로 나올지 ê²°ì •" - track_external_right_clicks: "ìš°í´ë¦­í•œ 외부 ë§í¬ë¥¼ ì¶”ì í•œë‹¤ (ì—: 새 탭 열기) ì´ ì„¤ì •ì„ ìœ„í•´ì„  해당 URL를 다시 ì¨ì•¼í•˜ëŠ” ì´ìœ ë¡œ ê¸°ë³¸ê°’ì€ ë¹„í™œì„±í™”ì´ë‹¤." site_contact_username: "ìžë™ 메세지를 보낼 올바른 스태프 ì•„ì´ë””. 빈칸으로 놔ë‘ë©´ 기본 시스템 ê³„ì •ì´ ì‚¬ìš©ë©ë‹ˆë‹¤." send_welcome_message: "모든 ì‹ ê·œ 유저들ì—게 시작 매뉴얼과 함께 í™˜ì˜ ë©”ì„¸ì§€ 보내기" suppress_reply_directly_below: "ê¸€ì˜ ë°”ë¡œ ì•„ëž˜ì— ë‹¨ í•˜ë‚˜ì˜ ëŒ“ê¸€ë§Œ 있는 경우 '댓글 수'를 보여주지 않ìŒ" @@ -1055,7 +1055,6 @@ ko: reply_by_email_enabled: "ì´ë©”ì¼ì„ 통해 ì£¼ì œì— ë‹µê¸€ì„ ë‹¬ 수 있ìŒ." reply_by_email_address: "ì´ë©”ì¼ ì£¼ì†Œë¡œ ë‹µê¸€ì„ ë‹¤ëŠ” 템플릿. 예: %{reply_key}@reply.myforum.com" alternative_reply_by_email_addresses: "ìˆ˜ì‹ ëœ ì´ë©”ì¼ì— 대한 답장메ì¼ì˜ 대체 템플릿 목ë¡. 예: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "Discourseê°€ ì–´ë–¤ ë©”ì¼ë¡œ ë³´ë‚´ì§€ 못하ë„ë¡ í•©ë‹ˆë‹¤." strip_images_from_short_emails: "2800ë°”ì´íЏ, 즉 2.73 KB ì´ë‚´ 사ì´ì¦ˆë¥¼ 가지ë„ë¡ ì´ë¯¸ì§€ë¥¼ 빼주세요." short_email_length: "ì§¦ì€ ì´ë©”ì¼ ë°”ì´íЏ 길ì´" display_name_on_email_from: "ì´ë©”ì¼ ë³´ë‚¸ì‚¬ëžŒ í•„ë“œì— ì „ì²´ ì´ë¦„ì„ í‘œì‹œ" @@ -1097,7 +1096,6 @@ ko: delete_user_max_post_age: "(x)ì¼ ì´ì „ì˜ ì²« 글가 있는 유저는 삭제할 수 ì—†ìŒ." delete_all_posts_max: "ì „ì²´ 글 지우기 ë²„íŠ¼ì„ í†µí•´ í•œë²ˆì— ì‚­ì œí•  수 있는 최대 글 수. 만약 사용ìžê°€ ì´ê²ƒë³´ë‹¤ ë§Žì€ ê¸€ì„ ê°€ì§€ê³  있으면 í•œë²ˆì— ì‚­ì œ í•  수 없다." email_editable: "가입 후 ì´ë©”ì¼ ì£¼ì†Œ 변경 허용" - logout_redirect: "로그아웃 í›„ì— ë¦¬ë””ë ‰ì…˜í•  위치 (예: http://somesite.com/logout)" allow_uploaded_avatars: "사용ìžê°€ 커스텀 프로필 ì‚¬ì§„ì„ ì˜¬ë¦´ 수 있ë„ë¡ í—ˆìš©." allow_animated_avatars: "사용ìžê°€ 프로필 사진으로 애니메ì´ì…˜ GIF 파ì¼ì„ 올릴 수 있ë„ë¡ í—ˆìš©. 경고: ì´ ì„¤ì •ì„ ë°”ê¾¼ 후 avatars:refresh rake task 를 실행." allow_animated_thumbnails: "움ì§ì´ëŠ” gif로 ì¸ë„¤ì¼ì„ 만듭니다." @@ -1194,26 +1192,23 @@ ko: redirected_to_top_reasons: new_user: "우리 ì»¤ë®¤ë‹ˆí‹°ì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤! 다ìŒì€ 우리 사ì´íЏì—서 가장 ì¸ê¸° ë§Žì€ ìµœê·¼ 글타래들입니다." not_seen_in_a_month: "잘 ëŒì•„오셨습니다. 다ìŒì€ ë‹¹ì‹ ì´ ì˜¤ì§€ ì•Šì€ ë™ì•ˆ 가장 ì¸ê¸°ìžˆë˜ 글타래들입니다." - change_owner: - post_revision_text: "ì†Œìœ ê¶Œì´ %{old_user}ì—서 %{new_user}으로 ì´ì „ë˜ì—ˆìŠµë‹ˆë‹¤." - deleted_user: "ì‚­ì œëœ ì‚¬ìš©ìž" topic_statuses: archived_enabled: "ì´ ê¸€íƒ€ëž˜ëŠ” ë³´ê´€ë˜ì—ˆê³  ë”ì´ìƒ 변경하실 수 없습니다." archived_disabled: "ì´ ê¸€íƒ€ëž˜ì˜ ë³´ê´€ì´ í’€ë ¸ê³  ì´ì œ 변경하실 수 있습니다." closed_enabled: "ì´ ê¸€íƒ€ëž˜ëŠ” ì´ì œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다." closed_disabled: "ì´ ê¸€íƒ€ëž˜ëŠ” ì´ì œ 열렸습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 있습니다." autoclosed_enabled_days: - other: ì´ ê¸€íƒ€ëž˜ëŠ” %{count}ì¼ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다. + other: "ì´ ê¸€íƒ€ëž˜ëŠ” %{count}ì¼ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다." autoclosed_enabled_hours: - other: ì´ ê¸€íƒ€ëž˜ëŠ” %{count}시간 ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다. + other: "ì´ ê¸€íƒ€ëž˜ëŠ” %{count}시간 ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다." autoclosed_enabled_minutes: - other: ì´ ê¸€íƒ€ëž˜ëŠ” %{count}ë¶„ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다. + other: "ì´ ê¸€íƒ€ëž˜ëŠ” %{count}ë¶„ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다." autoclosed_enabled_lastpost_days: - other: ì´ ê¸€íƒ€ëž˜ëŠ” 마지막 ë‹µê¸€ì´ ë‹¬ë¦¬ê³  %{count}ì¼ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다. + other: "ì´ ê¸€íƒ€ëž˜ëŠ” 마지막 ë‹µê¸€ì´ ë‹¬ë¦¬ê³  %{count}ì¼ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다." autoclosed_enabled_lastpost_hours: - other: 마지막 댓글로부터 %{count} ì‹œê°„ì´ ì§€ë‚˜ 글타래가 ìžë™ìœ¼ë¡œ 닫혔습니다. 새로운 ëŒ“ê¸€ì„ ë‹¤ì‹¤ 수 없습니다. + other: "마지막 댓글로부터 %{count} ì‹œê°„ì´ ì§€ë‚˜ 글타래가 ìžë™ìœ¼ë¡œ 닫혔습니다. 새로운 ëŒ“ê¸€ì„ ë‹¤ì‹¤ 수 없습니다." autoclosed_enabled_lastpost_minutes: - other: ì´ ê¸€íƒ€ëž˜ëŠ” 마지막 ë‹µê¸€ì´ ë‹¬ë¦¬ê³  %{count}ë¶„ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다. + other: "ì´ ê¸€íƒ€ëž˜ëŠ” 마지막 ë‹µê¸€ì´ ë‹¬ë¦¬ê³  %{count}ë¶„ ë’¤ ìžë™ì ìœ¼ë¡œ 닫혔습니다. 새로운 ë‹µê¸€ì„ ë‹¤ì‹¤ 수 없습니다." autoclosed_disabled: "ì´ ê¸€íƒ€ëž˜ëŠ” ì´ì œ 열렸습니다. 새로운 ë‹µê¸€ì„ í—ˆìš©í•©ë‹ˆë‹¤." autoclosed_disabled_lastpost: "ì´ ê¸€íƒ€ëž˜ëŠ” ì´ì œ 열렸습니다. 새로운 ë‹µê¸€ì„ í—ˆìš©í•©ë‹ˆë‹¤." pinned_enabled: "ì´ ê¸€íƒ€ëž˜ëŠ” ê³ ì •ë˜ì—ˆìŠµë‹ˆë‹¤. ê³ ì •ì´ í•´ì œë˜ê¸° 전까지 ì¹´í…Œê³ ë¦¬ì˜ ìƒë‹¨ì— 나타납니다." @@ -1242,7 +1237,6 @@ ko: password_too_long: "비밀번호는 200ê¸€ìž ì´ë‚´ë§Œ 허용ë©ë‹ˆë‹¤." missing_user_field: "ì‚¬ìš©ìž ì •ë³´ ìž…ë ¥ì„ ëœ ë마쳤습니다." user: - no_accounts_associated: "ì—°ê³„ëœ ê³„ì •ì´ ì—†ìŒ" deactivated_by_staff: "ìš´ì˜ì§„ì— ì˜í•´ 비활성화ë¨" activated_by_staff: "ìš´ì˜ì§„ì— ì˜í•´ 활성화ë¨" new_user_typed_too_fast: "타ì´í•‘ì´ ë„ˆë¬´ 빠른 ì‹ ê·œ 사용ìž" @@ -1267,7 +1261,7 @@ ko: domain_not_allowed: "유효하지 ì•Šì€ ì›¹ì‚¬ì´íŠ¸ìž…ë‹ˆë‹¤. 허용ë˜ëŠ” ë„ë©”ì¸ ëª©ë¡: %{domains}" flags_reminder: subject_template: - other: '%{count}ê°œì˜ ì‹ ê³ ê°€ 접수 대기 중' + other: "%{count}ê°œì˜ ì‹ ê³ ê°€ 접수 대기 중" unsubscribe_mailer: title: "ë©”ì¼ë§ 구ë…í•´ì§€" invite_password_instructions: @@ -1315,7 +1309,7 @@ ko: subject_template: "ëŒ€ê¸°ì¤‘ì¸ ì‹ ê·œ 계정" pending_users_reminder: subject_template: - other: '%{count}ëª…ì˜ ìƒˆë¡œìš´ 사용ìžê°€ 가입 ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ 입니다.' + other: "%{count}ëª…ì˜ ìƒˆë¡œìš´ 사용ìžê°€ 가입 ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ 입니다." text_body_template: | 가입 ìŠ¹ì¸ ëŒ€ê¸°ì¤‘(ë˜ëŠ” ê±°ì ˆëœ)ì¸ ìƒˆë¡œìš´ 사용ìžê°€ 있습니다. @@ -1399,7 +1393,6 @@ ko: recent_topics: "최근" see_more: "ë”" search_title: "ì´ ì‚¬ì´íЏ 검색" - search_google: "Google" terms_of_service: title: "서비스 ì´ìš©ì•½ê´€" signup_form_message: 'I have read and accept the Terms of Service.' @@ -1417,31 +1410,11 @@ ko: images: too_large: "죄송합니다, 업로드하려는 ì´ë¯¸ì§€ê°€ 너무 í½ë‹ˆë‹¤. (최대 í¬ê¸° %{max_size_kb}KB). í¬ê¸°ë¥¼ 줄여서 다시 시ë„해보세요." size_not_found: "죄송합니다. ì´ë¯¸ì§€ 사ì´ì¦ˆê°€ 잘못 ë˜ì—ˆìŠµë‹ˆë‹¤. 혹시 깨진 ì´ë¯¸ì§€ê°€ 아닌가요?" - email_log: - post_user_deleted: "ì´ í¬ìŠ¤íŠ¸ë¥¼ ì“´ 사용ìžê°€ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤" - no_user: "ID %{user_id} ì¸ ì‚¬ìš©ìžë¥¼ ì°¾ì„ ìˆ˜ 없습니다" - anonymous_user: "유저가 ìµëª…ìž„" - suspended_not_pm: "메세지가 ì•„ë‹ˆë¼ ì‚¬ìš©ìžê°€ ì •ì§€ë습니다." - seen_recently: "최근 보여진 사용ìž" - post_not_found: "해당하는 ID %{post_id} ì„ ì°¾ì„ ìˆ˜ 없습니다. " - notification_already_read: "ì´ ì•Œë¦¼ ì´ë¯¸ ì½ì€ ê²ƒì— ëŒ€í•œ ì´ë©”ì¼ ìž…ë‹ˆë‹¤." - topic_nil: "글 ì œëª©ì´ ì—†ìŒ" - post_deleted: "글쓴ì´ì— ì˜í•´ ì‚­ì œëœ ê¸€" - user_suspended: "ì •ì§€ëœ ì‚¬ìš©ìž" - already_read: "ì´ë¯¸ ì½ì€ 글" - exceeded_emails_limit: "max_emails_per_day_per_user 초과" - exceeded_bounces_limit: "bounce_score_threshold 초과" - message_blank: "메세지가 비어있ìŒ" - message_to_blank: "메세지가 비어있ìŒ" - text_part_body_blank: "ë³¸ë¬¸ì´ ë¹„ì–´ìžˆìŒ" - body_blank: "ë³¸ë¬¸ì´ ë¹„ì–´ìžˆìŒ" color_schemes: base_theme_name: "기본 테마 색ìƒ" - default: "ë¼ì´íЏ Scheme" dark: "ë‹¤í¬ Scheme" - default_theme_name: "기본값" - dark_theme_name: "다í¬" light_theme_name: "ë¼ì´íЏ" + dark_theme_name: "다í¬" about: "소개" guidelines: "ê°€ì´ë“œë¼ì¸" privacy: "ê°œì¸ì •보처리방침" @@ -1462,70 +1435,40 @@ ko: editor: name: ì—디터 description: 첫 í¬ìŠ¤íŠ¸ 편집 - long_description: | - ì´ ë°°ì§€ëŠ” 처ìŒìœ¼ë¡œ í¬ìŠ¤íŠ¸ë¥¼ íŽ¸ì§‘í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. ê¸€ì„ ê³ ì¹˜ëŠ” ê²ƒì€ ì–¸ì œë‚˜ ì¢‹ì€ ì¼ì´ì£ . í¬ìŠ¤íŠ¸ë¥¼ ë” ë‚«ê²Œ 만들 ìˆ˜ë„ ìžˆê³ , ìž‘ì€ ì‹¤ìˆ˜ë¥¼ ê³ ì¹  ìˆ˜ë„ ìžˆê³ , ì²˜ìŒ í¬ìŠ¤íŠ¸ë¥¼ ì˜¬ë ¸ì„ ë•Œ 깜빡하고 ëª»ì˜¬ë ¸ë˜ ê±¸ 추가할 ìˆ˜ë„ ìžˆìœ¼ë‹ˆê¹Œìš”. 편집으로 ë‹¹ì‹ ì˜ í¬ìŠ¤íŠ¸ë¥¼ ë” ì¢‹ê²Œ 만들어보세요! basic_user: name: ì´ˆë³´íšŒì› - description: "모든 기본ì ì¸ 커뮤니티 ê¸°ëŠ¥ì´ ìˆ˜ì—¬ë˜ì—ˆìŠµë‹ˆë‹¤" - long_description: | - ì´ ë°°ì§€ëŠ” ì‹ ë¢°ë„ 1ì— ë„ë‹¬í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 잠시 ë™ì•ˆ 머물러서 몇 가지 í† í”½ì„ ì½ê³  ì´ ì»¤ë®¤ë‹ˆí‹°ê°€ ì–´ë–¤ ê³³ì¸ì§€ íƒêµ¬í•´ì£¼ì…”서 ê°ì‚¬í•©ë‹ˆë‹¤. ë‹¹ì‹ ì˜ ì‹ ê·œ ì‚¬ìš©ìž ì œí•œì€ ì‚¬ë¼ì¡ŒìŠµë‹ˆë‹¤. ì´ì œ ê°œì¸ ë©”ì‹œì§€ 보내기, 신고하기, 위키 편집하기, ì´ë¯¸ì§€ë‚˜ ë§í¬ë¥¼ 여러 ê°œ 올리기와 ê°™ì€ ê¸°ë³¸ì ì¸ 커뮤니티 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì‹¤ 수 있습니다. member: name: ì¤€íšŒì› - description: "초대장 보내기, 그룹 메시징, ë” ë§Žì€ ì¢‹ì•„ìš” 보내기가가능합니다" - long_description: | - ì´ ë°°ì§€ëŠ” ì‹ ë¢°ë„ 2ì— ë„ë‹¬í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 몇 주가 넘ë„ë¡ ì°¸ì—¬í•˜ì‹œë©´ì„œ 우리 커뮤니티와 함께해주셔서 ê°ì‚¬í•©ë‹ˆë‹¤. ì´ì œ ê°œì¸ í† í”½ì´ë‚˜ ì‚¬ìš©ìž íŽ˜ì´ì§€ì—서 ì´ˆëŒ€ìž¥ì„ ë³´ë‚¼ 수 있고, 그룹 ê°œì¸ ë©”ì‹œì§€ë¥¼ ë³´ë‚´ê³  í•˜ë£¨ì— ë” ë§Žì€ ì¢‹ì•„ìš”ë¥¼ 보낼 수 있습니다. regular: name: ì •íšŒì› - description: "카테고리 재조정, ì´ë¦„바꾸기, ë§í¬ 팔로우, 위키, ë” ë§Žì€ ì¢‹ì•„ìš”ê°€ 가능합니다." - long_description: | - ì´ ë°°ì§€ëŠ” ì‹ ë¢°ë„ 4ì— ë„ë‹¬í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 여러 ë‹¬ì´ ë„˜ë„ë¡ ìš°ë¦¬ ì»¤ë®¤ë‹ˆí‹°ì˜ ì¤‘ìš”ë©¤ë²„ê°€ ë˜ì–´ì£¼ì…”서 ê°ì‚¬í•©ë‹ˆë‹¤. ë‹¹ì‹ ì€ ê°€ìž¥ 활ë™ì ì¸ 구ë…ìžì´ê³  우리 커뮤니티를 훌륭하게 만드는 믿ì„만한 기여ìžì´ê¸°ë„ 합니다. ì´ì œ ë‹¹ì‹ ì€ í† í”½ì˜ ì´ë¦„ì„ ë°”ê¾¸ê±°ë‚˜ 카테고리 ìž¬ì¡°ì •ì„ í•  수 있고, ë” ê°•ë ¥í•œ ì‹ ê³  기능과 ê°œì¸ ë¼ìš´ì§€ì˜ ì‚¬ìš©ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. 그리고 í•˜ë£¨ì— ë” ë§Žì€ ì¢‹ì•„ìš”ë¥¼ 보낼 수 있습니다. leader: name: ì§€ë„ìž - description: "ì „ì—­ 편집, í•€ ê³ ì •, 닫기, ì•„ì¹´ì´ë¸Œ, ìžë¥´ê³  ë¶™ì´ê¸°, ë” ë§Žì€ ì¢‹ì•„ìš”ê°€ê°€ëŠ¥í•©ë‹ˆë‹¤" - long_description: | - ì´ ë°°ì§€ëŠ” ì‹ ë¢°ë„ 4ì— ë„ë‹¬í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. ë‹¹ì‹ ì€ ìš´ì˜ì§„ì—게 ì„ íƒë°›ì€ ì´ ì»¤ë®¤ë‹ˆí‹°ì˜ ë¦¬ë”입니다. ë‹¹ì‹ ì˜ ë§ê³¼ í–‰ë™ì€ ì´ ì»¤ë®¤ë‹ˆí‹°ì˜ ë‹¤ë¥¸ 사용ìžì—게 ì¢‹ì€ ëª¨ë²”ì´ ë˜ê³  있습니다. ì´ì œ ë‹¹ì‹ ì€ ëª¨ë“  í¬ìŠ¤íŠ¸ë¥¼ 편집할 수 있는 권한과 í•€ ê³ ì •, 닫기, 목ë¡í•´ì œ, ì•„ì¹´ì´ë¸Œ, ìžë¥´ê¸°, ë¶™ì´ê¸° ê°™ì€ ê³µí†µ 토픽 ìš´ì˜ê¶Œí•œì„ 가지게 ë©ë‹ˆë‹¤. 그리고 í•˜ë£¨ì— ì—„ì²­ë‚˜ê²Œ ë§Žì€ ì¢‹ì•„ìš”ë¥¼ 보낼 수 있습니다. welcome: name: ì›°ì»´ description: 좋아요를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” ë‹¹ì‹ ì´ ì“´ í¬ìŠ¤íŠ¸ì— ì¢‹ì•„ìš”ë¥¼ 처ìŒë°›ì•˜ì„ 때 수여ë©ë‹ˆë‹¤. 축하드립니다. ë™ë£Œ 커뮤니티 사용ìžë“¤ì´ í¥ë¯¸ë¥¼ ëŠë¼ëŠ” 훌륭한 í¬ìŠ¤íŠ¸ë¥¼ 올리셨군요! autobiographer: name: ìžì„œì „ 작가 anniversary: name: 1주년 description: 1ë…„ë™ì•ˆ 활ë™í•˜ê³  ê¸€ë„ 1ê°œì´ìƒ ì¼ìŠµë‹ˆë‹¤ - long_description: | - ì´ ë°°ì§€ëŠ” 한 í•´ë™ì•ˆ 회ì›ìœ¼ë¡œ 활ë™í•˜ê³  ê·¸ ë™ì•ˆ ê¸€ë„ í•˜ë‚˜ ì´ìƒ ì¼ì„ 때 수여ë©ë‹ˆë‹¤. ì´ ì»¤ë®¤ë‹ˆí‹°ì— ë¨¸ë¬¼ë©´ì„œ 기여해주셔서 ê°ì‚¬í•©ë‹ˆë‹¤. 당신 ì—†ì´ëŠ” 안ëì„거예요. nice_post: name: ë©‹ì§„ 답글 description: ë‹µê¸€ì— ì¢‹ì•„ìš” 10개를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” ë‹¹ì‹ ì´ ì“´ ë‹µê¸€ì— ì¢‹ì•„ìš” 10개가 ë‹¬ë ¸ì„ ë•Œ 수여ë©ë‹ˆë‹¤. ë‹¹ì‹ ì˜ ë‹µê¸€ì€ ì»¤ë®¤ë‹ˆí‹°ì— ì¸ìƒì„ 남기고, í† ë¡ ì´ ì›í™œížˆ ì§„í–‰ë˜ëŠ”ë° ë„ì›€ì´ ë˜ì—ˆìŠµë‹ˆë‹¤! good_post: name: 훌륭한 답글 description: ë‹µê¸€ì— ì¢‹ì•„ìš” 25개를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” ë‹¹ì‹ ì´ ì“´ ë‹µê¸€ì— ì¢‹ì•„ìš” 25개가 ë‹¬ë ¸ì„ ë•Œ 수여ë©ë‹ˆë‹¤. ì¨ì£¼ì‹  ë‹µê¸€ì€ ë…ì°½ì ì´ê³  모ë‘ì˜ ëŒ€í™”ì˜ ìˆ˜ì¤€ì„ ì˜¬ë¦¬ëŠ” ë° ê¸°ì—¬í–ˆìŠµë‹ˆë‹¤! great_post: name: 위대한 답글 description: ë‹µê¸€ì— ì¢‹ì•„ìš” 50개를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” ë‹¹ì‹ ì´ ì“´ ë‹µê¸€ì— ì¢‹ì•„ìš” 50개가 ë‹¬ë ¸ì„ ë•Œ 수여ë©ë‹ˆë‹¤. ì“°ì‹  ë‹µê¸€ì€ ë§¤ìš° ì˜ê° 넘치며, í¥ë¯¸ìžˆìœ¼ë©°, 재미있고, 마ìŒì„ 움ì§ì´ëŠ” 답글ì´ì–´ì„œ 커뮤니티가 ì´ ë‹µê¸€ì„ ë§¤ìš° 좋아합니다. nice_topic: name: ë©‹ì§„ 토픽 description: í† í”½ì— ì¢‹ì•„ìš” 10개를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” 올린 í† í”½ì— ì¢‹ì•„ìš” 10개가 ë‹¬ë ¸ì„ ë•Œ 수여ë©ë‹ˆë‹¤. 우와, 커뮤니티가 ì¦ê¸°ëŠ” ì¢‹ì€ ëŒ€í™”ê±°ë¦¬ë¥¼ 올리셨군요! good_topic: name: 훌륭한 토픽 description: í† í”½ì— ì¢‹ì•„ìš” 25개를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” 올린 í† í”½ì— ì¢‹ì•„ìš” 25개가 ë‹¬ë ¸ì„ ë•Œ 수여ë©ë‹ˆë‹¤. 커뮤니티가 활발히 움ì§ì´ê²Œë” 하는 활기찬 í† ë¡ ì„ ì‹œìž‘í•˜ì…¨êµ°ìš”! great_topic: name: 위대한 토픽 description: í† í”½ì— ì¢‹ì•„ìš” 50개를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” 올린 í† í”½ì´ ì¢‹ì•„ìš” 50개를 ë°›ì•˜ì„ ë•Œ 수여ë©ë‹ˆë‹¤. 온 커뮤니티가 좋아하는 활ë™ì ì¸ ì´ì•¼ê¸°ê°€ 오고가는 ë©‹ì§„ 대화를 시작하셨군요! nice_share: name: ë©‹ì§„ 공유 description: 공유한 í¬ìŠ¤íŠ¸ë¡œ 외부 ë°©ë¬¸ìž 25ëª…ì´ ë“¤ì–´ì™”ìŠµë‹ˆë‹¤ @@ -1534,13 +1477,9 @@ ko: good_share: name: 훌륭한 공유 description: 공유한 í¬ìŠ¤íŠ¸ë¡œ 외부 ë°©ë¬¸ìž 300ëª…ì´ ë“¤ì–´ì™”ìŠµë‹ˆë‹¤ - long_description: | - ì´ ë°°ì§€ëŠ” 공유한 í¬ìŠ¤íŠ¸ ë§í¬ë¡œ 외부 ë°©ë¬¸ìž 300ëª…ì´ ë“¤ì–´ì™”ì„ ë•Œ 수여ë©ë‹ˆë‹¤. 잘하셨어요! 여러 사람ì—게 ìš°ë¦¬ì˜ í›Œë¥­í•œ í† ë¡ ì„ ë³´ì—¬ì£¼ê³  ì´ ì»¤ë®¤ë‹ˆí‹°ê°€ ì„±ìž¥í•˜ëŠ”ë° ë„ì›€ì„ ì£¼ì…¨ìŠµë‹ˆë‹¤. great_share: name: 위대한 공유 description: 공유한 í¬ìŠ¤íŠ¸ë¡œ 외부 ë°©ë¬¸ìž 1000ëª…ì´ ë“¤ì–´ì™”ìŠµë‹ˆë‹¤ - long_description: | - ì´ ë°°ì§€ëŠ” 공유한 í¬ìŠ¤íŠ¸ ë§í¬ë¡œ 외부 ë°©ë¬¸ìž 1000ëª…ì´ ë“¤ì–´ì™”ì„ ë•Œ 수여ë©ë‹ˆë‹¤. 우와! 엄청나게 ë§Žì€ ì‚¬ëžŒì„ ë°ë¦¬ê³  와서 ì´ í† ë¡ ì„ ë” í¥ë¯¸ë¡­ê²Œ 만드셨네요. 우리 ì»¤ë®¤ë‹ˆí‹°ì˜ ì„±ìž¥ì— ì•„ì£¼ í° ê¸°ì—¬ë¥¼ 하셨습니다! first_like: name: 첫 좋아요 description: í¬ìŠ¤íŠ¸ì— ì¢‹ì•„ìš”ë¥¼ 보냈습니다 @@ -1549,21 +1488,15 @@ ko: first_flag: name: 첫 ì‹ ê³  description: í¬ìŠ¤íŠ¸ë¥¼ 신고했습니다 - long_description: | - ì´ ë°°ì§€ëŠ” 처ìŒìœ¼ë¡œ í¬ìŠ¤íŠ¸ë¥¼ ì‹ ê³ í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 신고를 하는 ê²ƒì€ ì´ ì»¤ë®¤ë‹ˆí‹°ë¥¼ 깨ë—하고 ë°ê²Œ 만드는 방법입니다. ì´ìœ ë¥¼ 불문하고 ìš´ì˜ì§„ì´ ì²´í¬í•´ì•¼í•  필요가 있다고ìƒê°ë˜ë©´ 주저하지 ë§ê³  신고를 해주세요. ê¸€ì„ ì“´ 사용ìžì—게 í¬ìŠ¤íŠ¸ì— ë¬¸ì œê°€ 있는 것 같다고 ê°œì¸ ë©”ì‹œì§€ë¥¼ 보낼 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. 문제를 발견했다면 :flag_black: 신고하세요! promoter: name: 후ì›ìž description: 사용ìžë¥¼ 초청했습니다 campaigner: name: 사회운ë™ê°€ description: 기본 ì‚¬ìš©ìž 3ëª…ì„ ì´ˆì²­í–ˆìŠµë‹ˆë‹¤ - long_description: | - ì´ ë°°ì§€ëŠ” 초대한 ì‚¬ìš©ìž 3ëª…ì´ ê¸°ë³¸ 사용ìžê°€ ë˜ëŠ” 충분한 ì‹œê°„ì„ ë³´ëƒˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 활기찬 커뮤니티가 ë˜ë ¤ë©´ ëŒ€í™”ì— ê¾¸ì¤€ížˆ 참여하며 새로운 목소리를 ë”하는 새로운 ì‚¬ëžŒì´ ëŠ˜ 필요하지요. champion: name: 챔피언 description: íšŒì› 5ëª…ì„ ì´ˆëŒ€í–ˆìŠµë‹ˆë‹¤ - long_description: | - ì´ ë°°ì§€ëŠ” 초대한 ì‚¬ìš©ìž 5ëª…ì´ ì •íšŒì›ì´ ë˜ëŠ” 충분한 ì‹œê°„ì„ ë³´ëƒˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 우와! 우리 ì»¤ë®¤ë‹ˆí‹°ì— ìƒˆë¡œìš´ 멤버를 초대해서 ë‹¤ì–‘ì„±ì„ ë„“í˜€ì£¼ì‹  ê²ƒì— ê°ì‚¬ë“œë¦½ë‹ˆë‹¤! first_share: name: ì²˜ìŒ ê³µìœ í•´ìš” description: í¬ìŠ¤íŠ¸ë¥¼ 공유했습니다 @@ -1577,8 +1510,6 @@ ko: first_quote: name: ì²˜ìŒ ì¸ìš©í•´ìš” description: í¬ìŠ¤íŠ¸ë¥¼ ì¸ìš©í•¨ - long_description: | - ì´ ë°°ì§€ëŠ” ë‹µê¸€ì„ ì“¸ 때 처ìŒìœ¼ë¡œ ì¸ìš©ì„ í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. 앞선 í¬ìŠ¤íŠ¸ì˜ ê´€ë ¨ìžˆëŠ” ë¶€ë¶„ì„ ì¸ìš©í•˜ë©´ 대화가 토픽과 다른 í¬ìŠ¤íŠ¸ë¼ë¦¬ ì—°ê²°ë˜ëŠ”ë° ë„ì›€ì´ ë©ë‹ˆë‹¤. ì¸ìš©ì„ 하는 가장 쉬운 ë°©ë²•ì€ í¬ìŠ¤íŠ¸ì˜ íŠ¹ì • ë‚´ìš©ì„ ë§ˆìš°ìŠ¤ë¡œ 드래그하고 답글 ë²„íŠ¼ì„ ëˆ„ë¥´ëŠ” 것입니다. ì•„ë‚Œì—†ì´ ì¸ìš©í•´ë³´ì„¸ìš”! read_guidelines: name: ê°€ì´ë“œë¼ì¸ì„ ì½ì—ˆì–´ìš” reader: @@ -1629,8 +1560,6 @@ ko: crazy_in_love: name: ì‚¬ëž‘ë°–ì— ëª¨ë¥´ëŠ” 바보 description: 20번ì´ë‚˜ 좋아요 50개를 보냈습니다 - long_description: | - ì´ ë°°ì§€ëŠ” 50ê°œì˜ ì¢‹ì•„ìš”ë¥¼ 사용한 ë‚ ì´ 20ì¼ ì´ìƒì¼ 때 수여ë©ë‹ˆë‹¤. 와우! ë™ë£Œ 사용ìžë¥¼ 어떻게 ì‘ì›í•´ì•¼í•˜ëŠ”ì§€ì˜ ëª¨ë²” ê·¸ ìžì²´ì‹œë„¤ìš”! thank_you: name: 고마워요 description: 10ê°œì˜ í¬ìŠ¤íŠ¸ë¥¼ '좋아요'하고 20ê°œì˜ '좋아요'를 받았습니다 @@ -1644,19 +1573,15 @@ ko: empathetic: name: 대ì¸ë°° description: 1000ê°œì˜ ê²Œì‹œê¸€ì„ '좋아요'하고 500ê°œì˜ '좋아요'를 받았습니다 - long_description: | - ì´ ë°°ì§€ëŠ” 500ê°œì˜ ì¢‹ì•„ìš”ë¥¼ 받고 1000ê°œ ì´ìƒì˜ 좋아요를 ë˜ëŒë ¤ì¤¬ì„ 때 수여ë©ë‹ˆë‹¤. 우와! ë‹¹ì‹ ì€ ê´€ëŒ€í•¨ê³¼ ìƒí˜¸ ì¡´ì¤‘ì˜ ëª¨ë²”ìž…ë‹ˆë‹¤ :two_hearts:. first_emoji: name: 첫 Emoji description: ê²Œì‹œê¸€ì— Emoji를 사용했습니다 first_mention: name: 첫 멘션 description: 처ìŒìœ¼ë¡œ í¬ìŠ¤íŠ¸ì—서 다른 사용ìžë¥¼ 멘션했습니다 - long_description: "ì´ ë°°ì§€ëŠ” í¬ìŠ¤íŠ¸ì—서 다른 ì‚¬ëžŒì˜ @ì•„ì´ë”” 를 처ìŒìœ¼ë¡œ ë©˜ì…˜í–ˆì„ ë•Œ 수여ë©ë‹ˆë‹¤. ê°ê°ì˜ ë©˜ì…˜ë“¤ì€ í•´ë‹¹ 사용ìžì—게 ì•Œë¦¼ì„ ìƒì„±í•´ì„œ ë‹¹ì‹ ì´ ì“´ í¬ìŠ¤íŠ¸ì— ëŒ€í•´ 알게 í•´ì¤ë‹ˆë‹¤. 그냥 @ 를 친 후 ì‚¬ìš©ìž ì•„ì´ë””를 입력하거나, í—ˆìš©ì´ ë˜ì–´ìžˆë‹¤ë©´ ê·¸ë£¹ì„ ìž…ë ¥í•  수 있습니다. ê´€ì‹¬ì„ ëŒ ìˆ˜ 있는 아주 간편한 방법ì´ì£ ." first_onebox: name: 첫 박스 ë§í¬ description: 박스 ë§í¬ë¥¼ 처ìŒìœ¼ë¡œ í¬ìŠ¤íŒ…í–ˆìŠµë‹ˆë‹¤ - long_description: "ì´ ë°°ì§€ëŠ” í¬ìŠ¤íŠ¸ì˜ ë§í¬ë§Œìœ¼ë¡œ ì´ë£¨ì–´ì§„ 글 í•œì¤„ì„ ë‚¨ê²¨ì„œ 박스ë§í¬ë¥¼ 만들 때 수여ë©ë‹ˆë‹¤. 박스ë§í¬ì—는 ë§í¬ì˜ 간략한 요약과 타ì´í‹€, (ë§Œì•½ì— ìžˆë‹¤ë©´) ê·¸ë¦¼ì´ ì‹¤ë¦¬ê²Œ ë©ë‹ˆë‹¤." first_reply_by_email: name: 첫 ì´ë©”ì¼ ë‹µê¸€ description: í¬ìŠ¤íŠ¸ì— ì´ë©”ì¼ë¡œ ë‹µê¸€ì„ ë‹¬ì•˜ìŠµë‹ˆë‹¤ @@ -1686,7 +1611,6 @@ ko: button: "등ë¡í•˜ê¸°" title: "ê´€ë¦¬ìž ê³„ì • 등ë¡" help: "시작하려면 새로운 ê³„ì •ì„ ë“±ë¡í•˜ì„¸ìš”" - no_emails: "안타ê¹ê²Œë„, ì„¤ì¹˜ì¤‘ì— ìž…ë ¥ëœ ê´€ë¦¬ìž ì´ë©”ì¼ì´ 없습니다. 그래서 ì„¤ì •ì„ ì™„ë£Œí•˜ëŠ” 것ì´ì–´ë ¤ìš¸ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." confirm_email: title: "ì´ë©”ì¼ì„ 확ì¸í•˜ì„¸ìš”" message: "

활성화 ë©”ì¼ì„ %{email}로 보냈습니다. ì•ˆë‚´ì— ë”°ë¼ ê³„ì •ì„ í™œì„±í™” 하세요.

만약 ë©”ì¼ì´ ë„착하지 않았다면, Discourse를 위한 ì´ë©”ì¼ ì„¤ì •ì„ ì •í™•ížˆ 했는지 확ì¸í•˜ì‹œê³  스팸í´ë”를 확ì¸í•´ 보세요.

" @@ -1787,10 +1711,8 @@ ko: fields: favicon_url: label: "ìž‘ì€ ì•„ì´ì½˜" - description: "가로 세로 32px 와 ê°™ì€ ìž‘ì€ ì‚¬ì´ì¦ˆì˜ ì•„ì´ì½˜ì„ 쓸 때 예ì˜ê²Œ ë³´ì´ëŠ” 웹 브ë¼ìš°ì €ì—서 사ì´íŠ¸ë¥¼ 대표할 ì•„ì´ì½˜ ì´ë¯¸ì§€" apple_touch_icon_url: label: "í° ì•„ì´ì½˜" - description: "ë” í° ì‚¬ì´ì¦ˆì˜ ì•„ì´ì½˜ì„ 쓸 때 예ì˜ê²Œ ë³´ì´ëŠ” ëª¨ë˜ ê¸°ê¸°ì—서 사ì´íŠ¸ë¥¼ 대표할 ì•„ì´ì½˜ ì´ë¯¸ì§€. 사ì´ì¦ˆëŠ” 최소 가로 세로 144px 권장." homepage: description: "ì €í¬ëŠ” 최근 í† í”½ì„ í™ˆíŽ˜ì´ì§€ì— 노출하는 ê²ƒì„ ì¶”ì²œí•©ë‹ˆë‹¤. 하지만, ì›í•˜ì‹ ë‹¤ë©´ 홈페ì´ì§€ì— 카테고리(í† í”½ì˜ ê·¸ë£¹)를 ë³´ì´ê²Œ í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." title: "홈페ì´ì§€" @@ -1799,8 +1721,6 @@ ko: choices: latest: label: "최신 토픽" - categories: - label: "카테고리" emoji: title: "Emoji" description: "ë‹¹ì‹ ì˜ ì»¤ë®¤ë‹ˆí‹°ì—는 ì–´ë–¤ 스타ì¼ì˜ Emoji를 ì“°ê³  싶으세요? 관리ìž, 커스터마ì´ì§•, Emoji 메뉴ì—서 사용ìžì •ì˜ Emoji를 ë” ì¶”ê°€í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." diff --git a/config/locales/server.lv.yml b/config/locales/server.lv.yml index bf0dd8bf8d..056e2bc92a 100644 --- a/config/locales/server.lv.yml +++ b/config/locales/server.lv.yml @@ -25,15 +25,15 @@ lv: start_discussion: "SÄkt Diskusiju" continue: "TurpinÄt Diskusiju" more_replies: - one: vel 1 atbilde - other: vel %{count} atbildes - zero: vel %{count} atbildes + zero: "vel %{count} atbildes" + one: "vel 1 atbilde" + other: "vel %{count} atbildes" loading: "Diskusijas IelÄdēšana..." in_reply_to: "â–¶ %{username}" replies: - one: 1 atbilde - other: '%{count} atbildes' - zero: '%{count} atbildes' + zero: "%{count} atbildes" + one: "1 atbilde" + other: "%{count} atbildes" next_page: "nÄkoÅ¡o lapu →" prev_page: "↠iepriekšējo lapu" page_num: "Lapa %{num}" @@ -56,9 +56,9 @@ lv: trust_level_4: "trust_level_4" education: until_posts: - one: 1 raksts - other: '%{count} raksti' - zero: '%{count} raksti' + zero: "%{count} raksti" + one: "1 raksts" + other: "%{count} raksti" activerecord: attributes: user_profile: @@ -103,8 +103,6 @@ lv: num_topics: "TÄ“mas" top_traffic_sources: xaxis: "DomÄ“ns" - top_referred_topics: - xaxis: "TÄ“mas" site_settings: errors: invalid_email: "Nepareiza e-pasta adrese." @@ -113,7 +111,6 @@ lv: recent_topics: "Neseni" see_more: "VairÄk" search_title: "MeklÄ“t Å¡ajÄ vietnÄ“" - search_google: "Google" terms_of_service: title: "Pakalpojuma noteikumi" guidelines: "VadlÄ«nijas" diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index d574ab2160..0ec9df8d83 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -39,6 +39,10 @@ nb_NO: bad_color_scheme: "Kan ikke oppdatere drakt, ugyldig fargepalett" other_error: "Noe gikk galt under oppdateringen av drakten" error_importing: "En feil oppstod under kloning av git repository, tilgang ble nektet eller repository ikke funnet." + errors: + component_no_user_selectable: "Draktkomponenter kan ikke gjøres valgbare for brukere" + component_no_default: "Draktkomponenter kan ikke være standard drakt" + no_multilevels_components: "Drakter som inneholder underdrakter kan ikke selv være en underdrakt" settings_errors: invalid_yaml: "YAML koden er ikke gyldig." data_type_not_a_number: "Innstilling `%{name}` typen er ikke støttet. Støttede typer er `integer`, `bool`, `list` og `enum`" @@ -68,6 +72,7 @@ nb_NO: auto_generated_email_error: "Skjer nÃ¥r «Presedens»-hodet er satt til list, junk, bulk eller auto_reply eller nÃ¥r en annen header inneholder auto-submitted, auto-replied eller auto-generated." no_body_detected_error: "Skjer nÃ¥r vi ikke kunne trekke ut meldingskroppen eller det ikke var noen vedlegg." no_sender_detected_error: "Skjer nÃ¥r vi ikke kunne finne en gyldig adresse i Fra-hodet." + from_reply_by_address_error: "Skjer nÃ¥r avsender i meldingshodet er identisk med den konfigurerte adressen for svar via e-post." inactive_user_error: "Skjer nÃ¥r senderen ikke er aktiv." silenced_user_error: "Skjer nÃ¥r senderen er dempet." bad_destination_address: "Skjer nÃ¥r ingen av adressene i To-, Cc- eller Bcc-feltene passer med en konfigurert innkommende e-postadresse." @@ -133,8 +138,8 @@ nb_NO: load_from_remote: "Det oppstod et problem med innlastingen av innlegget." site_settings: invalid_choice: - one: Du spesifiserte det ugyldige valget %{name} - other: Du spesifiserte de ugyldige valgene %{name} + one: 'Du spesifiserte det ugyldige valget %{name}' + other: 'Du spesifiserte de ugyldige valgene %{name}' min_username_length_exists: "Du kan ikke sette minimumslengden pÃ¥ brukernavn over det korteste brukernavnet." min_username_length_range: "Du kan ikke sette minimum høyere enn maksimum." max_username_length_exists: "Du kan ikke sette maksimallengden for brukernavn under det lengste brukernavnet." @@ -168,13 +173,16 @@ nb_NO: not_logged_in: "Du mÃ¥ være innlogget for Ã¥ gjøre det." not_found: "Den etterspurte URL eller ressurs ble ikke funnet" invalid_access: "Du har ingen tilgang til denne resurssen." + authenticator_not_found: "Autentiseringsmetoden finnes ikke eller er deaktivert." invalid_api_credentials: "Du har ikke tillatelse til Ã¥ se denne forespurte ressuresen. API-brukernavnet eller -nøkkelen er ikke gyldig." + provider_not_enabled: "Du har ikke tillatelse til Ã¥ lese denne ressursen. Autentiseringsmetoden er ikke aktivert. " + provider_not_found: "Du har ikke tillatelse til Ã¥ lese denne ressursen. Autentiseringsmetoden eksisterer ikke." read_only_mode_enabled: "Siden er i skrivebeskyttet modus. Alle interaksjoner er utilgjengelige." reading_time: "Lesetid" likes: "Likes" too_many_replies: - one: Vi beklager, men nye brukere er midlertidig begrenset til 1 svar i det samme trÃ¥den. - other: Vi beklager, men nye brukere er midlertidig begrenset til %{count} svar i samme trÃ¥d. + one: "Vi beklager, men nye brukere er midlertidig begrenset til 1 svar i det samme trÃ¥den." + other: "Vi beklager, men nye brukere er midlertidig begrenset til %{count} svar i samme trÃ¥d." embed: start_discussion: "Start diskusjon" continue: "Fortsett diskusjon" @@ -184,37 +192,37 @@ nb_NO: no_hosts: "Vertsnavn for innbygging." configure: "Sett opp innbygging" more_replies: - one: 1 svar til - other: '%{count} svar til' + one: "1 svar til" + other: "%{count} svar til" loading: "Laster inn diskusjon…" permalink: "Permalink" imported_from: "Dette er en relatert diskusjon ved siden av det originale innlegget ved %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 svar - other: '%{count} svar' + one: "1 svar" + other: "%{count} svar" no_mentions_allowed: "Beklager, du kan ikke nevne andre brukere." too_many_mentions: - one: 'Beklager, du kan bare nevne en bruker i et innlegg. ' - other: 'Beklager, du kan bare nevne %{count} brukere i et innlegg. ' + one: "Beklager, du kan bare nevne en bruker i et innlegg. " + other: "Beklager, du kan bare nevne %{count} brukere i et innlegg. " no_mentions_allowed_newuser: "Beklager, nye brukere kan ikke nevne andre brukere." too_many_mentions_newuser: - one: Beklager, nye brukere kan bare nevne én annen bruker i et innlegg. - other: Beklager, nye brukere kan bare nevne %{count} brukere i et innlegg. + one: "Beklager, nye brukere kan bare nevne én annen bruker i et innlegg." + other: "Beklager, nye brukere kan bare nevne %{count} brukere i et innlegg." no_images_allowed_trust: "Beklager, du kan ikke legge til bilder i et innlegg." no_images_allowed: "Beklager, nye brukere kan ikke legge til bilder i et innlegg." too_many_images: - one: Beklager, nye brukere kan bare legge til ett bilde i et innlegg. - other: Beklager, nye brukere kan bare legge til %{count} bilder i et innlegg. + one: "Beklager, nye brukere kan bare legge til ett bilde i et innlegg." + other: "Beklager, nye brukere kan bare legge til %{count} bilder i et innlegg." no_attachments_allowed: "Beklager, nye brukere kan ikke laste opp vedlegg til et innlegg." too_many_attachments: - one: Beklager, nye brukere kan bare laste opp ett vedlegg til et innlegg. - other: Beklager, nye brukere kan bare laste opp %{count} vedlegg til et innlegg. + one: "Beklager, nye brukere kan bare laste opp ett vedlegg til et innlegg." + other: "Beklager, nye brukere kan bare laste opp %{count} vedlegg til et innlegg." no_links_allowed: "Beklager, nye brukere kan ikke publisere innlegg med lenker." links_require_trust: "Beklager, du kan ikke legge til lenker i et innlegg." too_many_links: - one: Beklager, nye brukere kan bare legge til én lenke i et innlegg. - other: Beklager, nye brukere kan bare legge til %{count} lenker i et innlegg. + one: "Beklager, nye brukere kan bare legge til én lenke i et innlegg." + other: "Beklager, nye brukere kan bare legge til %{count} lenker i et innlegg." contains_blocked_words: "Innlegget ditt inneholder et ord som ikke er tillatt: %{word}" spamming_host: "Beklager, du kan ikke lenke til det domenet." user_is_suspended: "Utestengte brukere kan ikke skrive innlegg." @@ -263,14 +271,14 @@ nb_NO: groups: success: bulk_add: - one: '%{count} bruker ble lagt til i gruppen.' - other: '%{count} brukere ble lagt til i gruppen.' + one: "%{count} bruker ble lagt til i gruppen." + other: "%{count} brukere ble lagt til i gruppen." errors: grant_trust_level_not_valid: "'%{trust_level}' er ikke et gyldig tillitsnivÃ¥." can_not_modify_automatic: "Du kan ikke modifisere en automatisk gruppe" member_already_exist: - one: '''%{username}'' er allerede medlem av denne gruppen.' - other: 'Følgende brukere er allerede medlemmer av denne gruppen: %{username}' + one: "'%{username}' er allerede medlem av denne gruppen." + other: "Følgende brukere er allerede medlemmer av denne gruppen: %{username}" invalid_domain: "'%{domain}' er ikke et gyldig domene." invalid_incoming_email: "'%{email}' er ikke en gyldig e-postadresse." email_already_used_in_group: "'%{email}' er allerede i bruk av gruppa '%{group_name}'." @@ -290,8 +298,8 @@ nb_NO: title: "Ønske om medlemskap i gruppen @%{group_name}" education: until_posts: - one: 1 innlegg - other: '%{count} innlegg' + one: "1 innlegg" + other: "%{count} innlegg" 'new-topic': | Velkommen til %{site_name}. **Takk for at du starter en ny samtale!** @@ -452,25 +460,25 @@ nb_NO: title: "Velkommen til salongen" body: |2 - Gratulerer! :confetti_ball: + Gratulerer! :confetti_ball: - Hvis du kan se denne trÃ¥den, er du nylig blitt forfremmet til **aktivt medlem** (tillitsnivÃ¥ 3). + Hvis du kan se dette emnet betyr det at du nylig ble forfremmet til **trofast** (tillitsnivÃ¥ 3). - Du kan nÃ¥ … + Du kan nÃ¥ … - * Endre tittelen til hvilken som helst trÃ¥d - * Endre kategorien til hvilken som helst trÃ¥d - * FÃ¥ lenkene dine fulgt opp ([automatisk nofollow](http://en.wikipedia.org/wiki/Nofollow) er fjernet) - * Se og delta i diskusjonene i en privat salong-kategori som bare er synlig for brukere med tillitsnivÃ¥ 3 eller høyere. - * Skjule søppelpost med ett flagg. + * Redigere tittelen pÃ¥ alle emner + * Endre kategorien pÃ¥ alle emner + * Tillate søkemotorer Ã¥ følge lenkene dine ([automatisk nofollow](http://en.wikipedia.org/wiki/Nofollow) er fjernet) + * Delta i en privat Lounge kategori som kun er synlig for brukere med tillitsnivÃ¥ 3 og høyere + * Skjule spam med et enkelt flagg - Her er den [oppdaterte listen over andre trofaste](/badges/3/regular). Si gjerne hei! + Her er [hele listen over trofaste brukere](/badges/3/regular). Si gjerne hei til dem! - Takk for at du er en viktig del av fellesskapet vÃ¥rt. + Takk for at du er en viktig del av dette brukersamfunnet! - (For mer informasjon om tillitsnivÃ¥ [se denne trÃ¥den][tillit]. Merk deg at bare medlemmer som fortsetter Ã¥ oppfylle kravene over tid, vil forbli *trofaste*.) + (For mer informasjon om forskjellige tillitsnivÃ¥, [se dette emnet][trust]. Vær klar over at brukere mÃ¥ fortsette Ã¥ oppfylle kravene over tid for Ã¥ forbli i gruppen for trofaste.) - [tillit]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: topic_prefix: "Om kategorien %{category} " replace_paragraph: "(Erstatt dette første avsnittet med en kort beskrivelse av den nye kategorien din. Denne teksten vil vises i oversikten over kategorier, sÃ¥ prøv Ã¥ holde lengden under 200 bokstaver. **Inntil du endrer denne beskrivelsen eller oppretter trÃ¥der, vil denne kategorien ikke vises pÃ¥ kategorier-siden.**)" @@ -488,8 +496,8 @@ nb_NO: uncategorized: "Kan ikke slette Ukategorisert" has_subcategories: "Kan ikke slette denne kategorien fordi den har underkategorier." topic_exists: - one: Kan ikke slette denne kategorien fordi den har 1 trÃ¥d. Eldste trÃ¥d er %{topic_link}. - other: Kan ikke slette denne kategorien fordi den har %{count} trÃ¥der. Eldste trÃ¥d er %{topic_link}. + one: "Kan ikke slette denne kategorien fordi den har 1 emne. Eldste emne er %{topic_link}." + other: "Kan ikke slette denne kategorien fordi den har %{count} emner. Eldste emne er %{topic_link}." topic_exists_no_oldest: "Kan ikke slette denne kategorien fordi antall trÃ¥der er %{count}." uncategorized_description: "TrÃ¥der som ikke trenger en kategori eller som ikke passer i noen av de eksisterende kategoriene." trust_levels: @@ -526,85 +534,86 @@ nb_NO: unsubscribe_via_email: "Du har nÃ¥dd grensen for antall avmeldinger via e-post. Vennligst vent %{time_left} før du prøver igjen." topic_invitations_per_day: "Du har nÃ¥dd grensen for invitasjoner til emner. Vennligst vent %{time_left} før du prøver igjen." hours: - one: 1 time - other: '%{count} timer' + one: "1 time" + other: "%{count} timer" minutes: - one: 1 minutt - other: '%{count} minutter' + one: "1 minutt" + other: "%{count} minutter" seconds: - one: 1 sekund - other: '%{count} sekunder' + one: "1 sekund" + other: "%{count} sekunder" + short_time: "noen fÃ¥ sekunder" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mnd - other: '%{count}mnd' + one: "1mnd" + other: "%{count}mnd" x_months: - one: 1mnd - other: '%{count}mnd' + one: "1mnd" + other: "%{count}mnd" about_x_years: - one: 1Ã¥ - other: '%{count}Ã¥' + one: "1Ã¥" + other: "%{count}Ã¥" over_x_years: - one: '> 1Ã¥r' - other: '> %{count}y' + one: "> 1Ã¥r" + other: "> %{count}y" almost_x_years: - one: 1Ã¥r - other: '%{count}Ã¥r' + one: "1Ã¥r" + other: "%{count}Ã¥r" distance_in_words_verbose: half_a_minute: "NÃ¥ nettopp" less_than_x_seconds: - one: nÃ¥ nettopp - other: nÃ¥ nettopp + one: "nÃ¥ nettopp" + other: "nÃ¥ nettopp" x_seconds: - one: 1 sekund siden - other: '%{count} sekunder siden' + one: "1 sekund siden" + other: "%{count} sekunder siden" less_than_x_minutes: - one: mindre enn 1 minutt siden - other: mindre enn %{count} minutter siden + one: "mindre enn 1 minutt siden" + other: "mindre enn %{count} minutter siden" x_minutes: - one: 1 minutt siden - other: '%{count} minutter siden' + one: "1 minutt siden" + other: "%{count} minutter siden" about_x_hours: - one: 1 time siden - other: '%{count} timer siden' + one: "1 time siden" + other: "%{count} timer siden" x_days: - one: 1 dag siden - other: '%{count} dager siden' + one: "1 dag siden" + other: "%{count} dager siden" about_x_months: - one: ca 1 mÃ¥ned siden - other: ca %{count} mÃ¥neder siden + one: "ca 1 mÃ¥ned siden" + other: "ca %{count} mÃ¥neder siden" x_months: - one: 1 mÃ¥ned siden - other: '%{count} mÃ¥neder siden' + one: "1 mÃ¥ned siden" + other: "%{count} mÃ¥neder siden" about_x_years: - one: omtrent 1 Ã¥r siden - other: omtrent %{count} Ã¥r siden + one: "omtrent 1 Ã¥r siden" + other: "omtrent %{count} Ã¥r siden" over_x_years: - one: over et Ã¥r siden - other: over %{count} Ã¥r siden + one: "over et Ã¥r siden" + other: "over %{count} Ã¥r siden" almost_x_years: - one: nesten 1 Ã¥r siden - other: nesten %{count} Ã¥r siden + one: "nesten 1 Ã¥r siden" + other: "nesten %{count} Ã¥r siden" password_reset: no_token: "Beklager, den lenken for Ã¥ endre passord er for gammel. Velg logg inn-knappen bruk 'Jeg glemte passordet mitt' for Ã¥ motta en ny lenke." choose_new: "Velg et nytt passord" @@ -626,6 +635,8 @@ nb_NO: authorizing_old: title: "Takk for at du bekreftet din nÃ¥værende e-postadresse" description: "Vi sender deg en e-post til din nye adresse for bekreftelse." + associated_accounts: + revoke_failed: "Klarte ikke Ã¥ oppheve kontotilknytningen til %{provider_name}." activation: action: "Klikk her for Ã¥ aktivere din konto" already_done: "Beklager, denne bekreftelseslenken er ikke lenger gyldig. Kanskje er kontoen din allerede aktivert?" @@ -683,17 +694,12 @@ nb_NO: description: 'Liker dette innlegget' short_description: 'Lik dette innlegget' long_form: 'likte dette' - vote: - title: 'Stem' - description: 'Stem pÃ¥ dette innlegget' - short_description: 'Stem pÃ¥ dette innlegget' - long_form: 'stemte for dette innlegget' user_activity: no_default: self: "Du har ingen aktivitet enda." others: "Ingen aktivitet." no_bookmarks: - self: "Du har ingen bokmerker, hvis du lager bokmerker for innlegg er det lettere Ã¥ finne dem igjen senere." + self: "Du har ingen bokmerkede innlegg; bokmerker lar deg raskt slÃ¥ opp spesifike innlegg." others: "Ingen bokmerker." no_likes_given: self: "Du har ikke likt noen innlegg." @@ -701,19 +707,24 @@ nb_NO: no_replies: self: "Du har ikke svart pÃ¥ noen innlegg." others: "Ingen svar." + no_drafts: + self: "Du har ingen utkast; nÃ¥r du begynner Ã¥ forfatte et svar pÃ¥ et emne vil det automatisk lagres som et nytt utkast." topic_flag_types: spam: title: 'Spam' description: 'Dette innlegget er reklame. Det er ikke nyttig eller relevant for dette nettstedet, men av promoterende karakter.' long_form: 'rapporterte dette som spam' + short_description: 'Dette er en reklame' inappropriate: title: 'Upassende' description: 'Dette innlegget har innhold som en fornuftig person vil anslÃ¥ Ã¥ være fornærmende, nedverdigende eller brudd pÃ¥ retningslinjene til denne gemenskapen.' long_form: 'markerte dette som upassende' + short_description: 'Et brudd pÃ¥ retningslinjene for samfunnet' notify_moderators: title: "Noe annet" description: 'Emnet krever oppfølging av staben basert pÃ¥ retningslinjene, brukeravtale, eller en annen grunn ikke i listen over.' long_form: 'Markert for mederering' + short_description: 'Krever handling fra staben av en annen grunn' email_title: 'TrÃ¥den "%{title}" krever oppmerksomhet fra en moderator' email_body: "%{link}\n\n%{message}" flagging: @@ -759,12 +770,50 @@ nb_NO: read: "Les alt" write: "Skriv alt" reports: + default: + labels: + count: Antall + percent: Prosent + day: Dag + post_edits: + title: "Innlegg redigert" + labels: + post: Innlegg + editor: Tekstbehandler + author: Forfatter + edit_reason: Begrunnelse + moderators_activity: + title: "Moderatoraktivitet" + labels: + moderator: Moderator + flag_count: Flagg vurdert + time_read: Lesetid + topic_count: Emner opprettet + post_count: Innlegg skrevet + pm_count: Meldinger opprettet + revision_count: Revisjoner + flags_status: + title: "Flagg status" + values: + agreed: Enig + disagreed: Uenig + deferred: Utsatt + no_action: Ingen handling + labels: + flag: Type + assigned: Tildelt + poster: Forfatter + flagger: Flagger + time_to_resolution: Løsningstid visits: title: "Brukerbesøk" xaxis: "Dag" yaxis: "Antall besøk" signups: + title: "Nye brukere" xaxis: "Dag" + yaxis: "Antall nye brukere" + description: "Nyregistrerte brukere i denne perioden" new_contributors: title: "Nye Bidragsytere" xaxis: "Dag" @@ -814,10 +863,14 @@ nb_NO: title: "Brukere per tillitsnivÃ¥" xaxis: "TillitsnivÃ¥" yaxis: "Antall brukere" + labels: + level: NivÃ¥ users_by_type: title: "Brukere per Type" xaxis: "Type" yaxis: "Antall Brukere" + labels: + type: Type xaxis_labels: admin: Admin moderator: Moderator @@ -868,10 +921,15 @@ nb_NO: num_clicks: "Klikk" num_topics: "TrÃ¥der" num_users: "Brukere" + labels: + domain: Domene + num_clicks: Klikk + num_topics: Emner top_referred_topics: title: "Topp henviste trÃ¥der" - xaxis: "TrÃ¥d" - num_clicks: "Klikk" + labels: + num_clicks: "Klikk" + topic: "Emne" page_view_anon_reqs: title: "Anonym" xaxis: "Dag" @@ -929,13 +987,14 @@ nb_NO: xaxis: "Dag" yaxis: "Totalt" mobile_visits: - title: "Brukerbesøk" + title: "Brukerbesøk (mobil)" xaxis: "Dag" yaxis: "Antall besøk" web_crawlers: title: "Forespørsler fra Søkeroboter" - xaxis: "Brukeragent" - yaxis: "Sidevisninger" + labels: + user_agent: "Brukeragent" + page_views: "Sidevisninger" dashboard: rails_env_warning: "Serveren din kjører i %{env] modus." host_names_warning: "Din config/database.yml-fil bruker forvalgt lokalvert-vertsnavn. Oppdater det til Ã¥ bruke din sides vertsnavn." @@ -953,13 +1012,14 @@ nb_NO: failing_emails_warning: 'Det er %{num_failed_jobs} e-postjobber som har feilet. Sjekk instillingene i app.yml og verifiser at serverinstillingene for e-post er riktige. Se de feilede jobbene i Sidekiq.' subfolder_ends_in_slash: "Oppsettet av undermappe er feil; variablen DISCOURSE_RELATIVE_URL_ROOT slutter med en skrÃ¥strek." email_polling_errored_recently: - one: Henting av e-post har generert en feil de siste 24 timene. Se i loggene for mer detaljer. - other: Henting av e-post har generert %{count} feil de siste 24 timene. Se i loggene for mer detaljer. + one: "Henting av e-post har generert en feil de siste 24 timene. Se i loggene for mer detaljer." + other: "Henting av e-post har generert %{count} feil de siste 24 timene. Se i loggene for mer detaljer." missing_mailgun_api_key: "Serveren er konfigurert til Ã¥ sende e-post via Mailgun men du har ikke satt API-nøkkelen som brukes til Ã¥ verifisere webhook meldinger." bad_favicon_url: "Favicon filen blir ikke lastet inn. Sjekk instillingen for favicon_url i Instillingene for nettstedet." poll_pop3_timeout: "Tilkoblingen til POP3 serveren fÃ¥r timeout. Vi fÃ¥r ikke hentet innkommende e-post. Vennligst sjekk instillingene for POP3 eller leverandøren av posttjenesten." poll_pop3_auth_error: "Tilkoblingen til POP3 serveren feiler pÃ¥ grunn av problemer med autentisering. Vennligst sjekk POP3 instillingene. " force_https_warning: "Nettstedet ditt bruker SSL. Men `force_https` er ikke aktivert enda i instillingene." + out_of_date_themes: "Oppdateringer er tilgjengelig for følgende drakter:" site_settings: censored_words: "Ord som automatisk vil bli erstattet med ■■■■" delete_old_hidden_posts: "Slett automatisk skjulte innlegg som har vært skjult i mer enn 30 dager." @@ -983,6 +1043,7 @@ nb_NO: search_recent_posts_size: "Hvor mange innlegg som beholdes i indeksen" log_search_queries: "Logg søkeord som benyttes av brukerne" search_query_log_max_size: "Maksimalt antall søkeord som beholdes" + search_query_log_max_retention_days: "Maksimal tid Ã¥ beholde søkeord, i dager." allow_uncategorized_topics: "Tillat opprettelse av ukategoriserte emner. ADVARSEL: Hvis det finnes ukategoriserte emner, mÃ¥ du sette en kategori pÃ¥ dem før du skrur denne instillingen av." allow_duplicate_topic_titles: "Tillat flere trÃ¥der med identisk tittel." unique_posts_mins: "Hvor mange minutter før en bruker kan lage et innlegg med det samme innholdet igjen" @@ -1032,6 +1093,7 @@ nb_NO: summary_score_threshold: "Minste score for at et innlegg skal inkluderes i 'Sammendrag for Emnet'" summary_posts_required: "Minste antall innlegg før 'Sammendrag for Emnet' aktiveres" summary_likes_required: "Minste antall 'likes' i et emne før 'Sammendrag for Emnet' aktiveres" + summary_percent_filter: "NÃ¥r en bruker klikker 'Summér Dette Emnet', vis topp % av innlegg" summary_max_results: "Maksimalt antall innlegg som returneres av 'Oppsummer denne trÃ¥den'" num_spam_flags_to_silence_new_user: "Hvis en ny brukers innlegg flagges som spam av minst num_users_to_silence_new_user forskjellige brukere, skjul den nye brukerens innlegg og stans fremtidige innlegg. 0 for Ã¥ deaktivere." num_users_to_silence_new_user: "Hvis en ny brukers innlegg flagges som spam num_spam_flags_to_silence_new_user ganger av dette antallet brukere, skjul den nye brukerens innlegg og stans fremtidige innlegg. 0 for Ã¥ deaktivere." @@ -1111,31 +1173,29 @@ nb_NO: redirected_to_top_reasons: new_user: "Velkommen til forumet vÃ¥rt! Dette er de mest populære trÃ¥dene for tiden. " not_seen_in_a_month: "Velkommen tilbake! Vi har ikke sett deg pÃ¥ en stund. Dette er de mest populære trÃ¥dene siden du var her sist." - change_owner: - deleted_user: "en slettet bruker" topic_statuses: archived_enabled: "Denne trÃ¥den er nÃ¥ arkivert. Den er fryst og kan ikke endres pÃ¥ noen mÃ¥te. " archived_disabled: "Denne trÃ¥den er ikke lenger arkivert. Den er ikke lenger fryst, og kan endres." closed_enabled: "Denne trÃ¥den er nÃ¥ lukket. Nye svar er ikke lenger tillatt." closed_disabled: "Denne trÃ¥den er nÃ¥ Ã¥pen. Nye svar er tillatt." autoclosed_enabled_days: - one: 'Denne trÃ¥den ble automatisk lukket etter 1 dag. Nye svar er ikke lenger tillatt. ' - other: 'Denne trÃ¥den ble automatisk lukket etter %{count} dager. Nye svar er ikke lenger tillatt. ' + one: "Denne trÃ¥den ble automatisk lukket etter 1 dag. Nye svar er ikke lenger tillatt. " + other: "Denne trÃ¥den ble automatisk lukket etter %{count} dager. Nye svar er ikke lenger tillatt. " autoclosed_enabled_hours: - one: 'Denne trÃ¥den ble automatisk lukket etter 1 time. Nye svar er ikke lenger tillatt. ' - other: 'Denne trÃ¥den ble automatisk lukket etter %{count} timer. Nye svar er ikke lenger tillatt. ' + one: "Denne trÃ¥den ble automatisk lukket etter 1 time. Nye svar er ikke lenger tillatt. " + other: "Denne trÃ¥den ble automatisk lukket etter %{count} timer. Nye svar er ikke lenger tillatt. " autoclosed_enabled_minutes: - one: 'Denne trÃ¥den ble automatisk lukket etter 1 minutt. Nye svar er ikke lenger tillatt. ' - other: 'Denne trÃ¥den ble automatisk lukket etter %{count} minutter. Nye svar er ikke lenger tillatt. ' + one: "Denne trÃ¥den ble automatisk lukket etter 1 minutt. Nye svar er ikke lenger tillatt. " + other: "Denne trÃ¥den ble automatisk lukket etter %{count} minutter. Nye svar er ikke lenger tillatt. " autoclosed_enabled_lastpost_days: - one: 'Denne trÃ¥den ble automatisk lukket 1 dag etter siste innlegg. Nye svar er ikke lenger tillatt. ' - other: 'Denne trÃ¥den ble automatisk lukket %{count} dager etter siste svar. Nye svar er ikke lenger tillatt. ' + one: "Denne trÃ¥den ble automatisk lukket 1 dag etter siste innlegg. Nye svar er ikke lenger tillatt. " + other: "Denne trÃ¥den ble automatisk lukket %{count} dager etter siste svar. Nye svar er ikke lenger tillatt. " autoclosed_enabled_lastpost_hours: - one: 'Denne trÃ¥den ble automatisk lukket 1 time etter siste innlegg. Nye svar er ikke lenger tillatt. ' - other: 'Denne trÃ¥den ble automatisk lukket %{count} timer etter siste svar. Nye svar er ikke lenger tillatt. ' + one: "Denne trÃ¥den ble automatisk lukket 1 time etter siste innlegg. Nye svar er ikke lenger tillatt. " + other: "Denne trÃ¥den ble automatisk lukket %{count} timer etter siste svar. Nye svar er ikke lenger tillatt. " autoclosed_enabled_lastpost_minutes: - one: 'Denne trÃ¥den ble automatisk lukket 1 minutt etter siste innlegg. Nye svar er ikke lenger tillatt. ' - other: 'Denne trÃ¥den ble automatisk lukket %{count} minutter etter siste svar. Nye svar er ikke lenger tillatt. ' + one: "Denne trÃ¥den ble automatisk lukket 1 minutt etter siste innlegg. Nye svar er ikke lenger tillatt. " + other: "Denne trÃ¥den ble automatisk lukket %{count} minutter etter siste svar. Nye svar er ikke lenger tillatt. " autoclosed_disabled: "Denne trÃ¥den er nÃ¥ Ã¥pen. TrÃ¥den kan svares pÃ¥. " autoclosed_disabled_lastpost: "Denne trÃ¥den er Ã¥pne. Nye svar er tillatt." pinned_enabled: "Denne trÃ¥den er nÃ¥ festet. Den vil vises øverst i kategorien sin inntil festet fjernes for alle av en administrator eller for individuelle brukere av dem selv." @@ -1158,7 +1218,6 @@ nb_NO: missing_user_field: "Du har ikke fylt ut alle brukerfeltene." already_logged_in: "Oisann, ser ut som du prøver Ã¥ akseptere en invitasjon for en en annen bruker. Hvis du ikke er %{current_user}, logg ut og prøv igjen." user: - no_accounts_associated: "Ingen tilknyttede kontoer" username: short: "mÃ¥ være pÃ¥ minst %{min} tegn" long: "kan ikke være mer enn %{max} tegn" @@ -1240,7 +1299,6 @@ nb_NO: recent_topics: "Nylig" see_more: "Mer" search_title: "Søk i denne siden" - search_google: "Google" terms_of_service: title: "BruksvilkÃ¥r" signup_form_message: 'Jeg har lest og akseptert BruksvilkÃ¥rene.' @@ -1251,21 +1309,10 @@ nb_NO: pasted_image_filename: "Limt inn bilde" images: size_not_found: "Beklager, vi kunne ikke fastslÃ¥ størrelsen pÃ¥ bildet ditt. Kanskje bildet ditt er blitt ødelagt?" - email_log: - no_user: "Finner ikke brukeren med id %{user_id}" - anonymous_user: "Brukeren er anonym" - suspended_not_pm: "Bruker er utestengt, ikke en beskjed" - seen_recently: "Brukeren ble sett nylig" - post_deleted: "innlegget var " - user_suspended: "Brukeren var utestengt" - already_read: "bruker har allerede lest dette innlegget" - message_blank: "meldingen er tom" color_schemes: - default: "Lys drakt" dark: "Mørk drakt" - default_theme_name: "Forvalg" - dark_theme_name: "Mørk" light_theme_name: "Lys" + dark_theme_name: "Mørk" about: "Om" guidelines: "Retningslinjer" privacy: "Personvern" @@ -1368,8 +1415,6 @@ nb_NO: name: Medlem regular: name: Aktivt medlem - long_description: | - Dette merket tildeles nÃ¥r du nÃ¥r tillitsnivÃ¥ 3. Takk for at du har vært en aktivt medlem av fellesskapet vÃ¥rt gjennom flere mÃ¥neder. Du er nÃ¥ en av de mest aktive leserne og en pÃ¥litelig bidragsyter som gjør fellesskapet vÃ¥rt storartet. Du kan nÃ¥ endre kategori og navn pÃ¥ trÃ¥der, fjerne søppelpost med ett flagg, delta i diskusjoner i en privat kategori bare for medlemmer med tillitsnivÃ¥ 3 eller høyere , og du vil ogsÃ¥ fÃ¥ mange flere likes per dag. welcome: name: Velkommen anniversary: @@ -1395,8 +1440,6 @@ nb_NO: name: Takk skal du ha gives_back: name: Gir tilbake - first_onebox: - long_description: "Dette merket tildeles den første gangen du publiserer et innlegg med en lenke pÃ¥ en egen linje, som deretter automatisk blir utvidet til en miniboks med en kort oppsummering av lenken, en tittel og (dersom tilgjengelig) et bilde." admin_login: success: "E-post sendt" submit_button: "Send e-post" @@ -1467,10 +1510,8 @@ nb_NO: fields: favicon_url: label: "Lite ikon" - description: "Et ikon som representerer nettstedet ditt i nettlesere. Bør se bra ut i sÃ¥ liten størrelse som 32 ganger 32 piksler." apple_touch_icon_url: label: "Stort ikon" - description: "Et ikon som representerer nettstedet ditt pÃ¥ moderne enheter og ser bra ut i større størrelser. Anbefalt størrelse er minst 144 ganger 144 piksler." homepage: title: "Hjemmeside" fields: @@ -1478,7 +1519,5 @@ nb_NO: choices: latest: label: "Siste trÃ¥der" - categories: - label: "Kategorier" emoji: title: "Emoji" diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 3f10fed8e2..531b25b983 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -133,8 +133,8 @@ nl: reading_time: "Leestijd" likes: "Likes" too_many_replies: - one: Sorry, maar nieuwe gebruikers mogen tijdelijk maar 1 antwoord in hetzelfde topic plaatsen. - other: Sorry, maar nieuwe gebruikers mogen tijdelijk maar %{count} antwoorden in hetzelfde topic plaatsen. + one: "Sorry, maar nieuwe gebruikers mogen tijdelijk maar 1 antwoord in hetzelfde topic plaatsen." + other: "Sorry, maar nieuwe gebruikers mogen tijdelijk maar %{count} antwoorden in hetzelfde topic plaatsen." embed: start_discussion: "Discussie starten" continue: "Discussie voortzetten" @@ -144,35 +144,35 @@ nl: no_hosts: "Er zijn geen hosts ingesteld voor embedding." configure: "Embedden configureren" more_replies: - one: Nog 1 antwoord - other: Nog %{count} antwoorden + one: "Nog 1 antwoord" + other: "Nog %{count} antwoorden" loading: "Discussie laden..." permalink: "Permalink" imported_from: "Dit discussietopic is een voortzetting van het oorspronkelijke topic op %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 antwoord - other: '%{count} antwoorden' + one: "1 antwoord" + other: "%{count} antwoorden" no_mentions_allowed: "Sorry, u kunt geen andere gebruikers noemen." too_many_mentions: - one: Sorry, u kunt maar één andere gebruiker in een bericht noemen. - other: Sorry, u kunt maar %{count} gebruikers in een bericht noemen. + one: "Sorry, u kunt maar één andere gebruiker in een bericht noemen." + other: "Sorry, u kunt maar %{count} gebruikers in een bericht noemen." no_mentions_allowed_newuser: "Sorry, nieuwe gebruikers kunnen geen andere gebruikers noemen." too_many_mentions_newuser: - one: Sorry, nieuwe gebruikers kunnen maar één andere gebruiker in een bericht noemen. - other: Sorry, nieuwe gebruikers kunnen maar %{count} gebruikers in een bericht noemen. + one: "Sorry, nieuwe gebruikers kunnen maar één andere gebruiker in een bericht noemen." + other: "Sorry, nieuwe gebruikers kunnen maar %{count} gebruikers in een bericht noemen." no_images_allowed: "Sorry, nieuwe gebruikers kunnen geen afbeeldingen in berichten plaatsen." too_many_images: - one: Sorry, nieuwe gebruikers kunnen maar één afbeelding in een bericht plaatsen. - other: Sorry, nieuwe gebruikers kunnen maar %{count} afbeeldingen in een bericht plaatsen. + one: "Sorry, nieuwe gebruikers kunnen maar één afbeelding in een bericht plaatsen." + other: "Sorry, nieuwe gebruikers kunnen maar %{count} afbeeldingen in een bericht plaatsen." no_attachments_allowed: "Sorry, nieuwe gebruikers kunnen geen bijlagen in berichten plaatsen." too_many_attachments: - one: Sorry, nieuwe gebruikers kunnen maar één bijlage in een bericht plaatsen. - other: Sorry, nieuwe gebruikers kunnen maar %{count} bijlagen in een bericht plaatsen. + one: "Sorry, nieuwe gebruikers kunnen maar één bijlage in een bericht plaatsen." + other: "Sorry, nieuwe gebruikers kunnen maar %{count} bijlagen in een bericht plaatsen." no_links_allowed: "Sorry, nieuwe gebruikers kunnen geen koppelingen in berichten plaatsen." too_many_links: - one: Sorry, nieuwe gebruikers kunnen maar één koppeling in een bericht plaatsen. - other: Sorry, nieuwe gebruikers kunnen maar %{count} koppelingen in een bericht plaatsen. + one: "Sorry, nieuwe gebruikers kunnen maar één koppeling in een bericht plaatsen." + other: "Sorry, nieuwe gebruikers kunnen maar %{count} koppelingen in een bericht plaatsen." spamming_host: "Sorry, u kunt geen koppeling naar die host plaatsen." user_is_suspended: "Geschorste gebruikers mogen geen berichten plaatsen." topic_not_found: "Er is iets fout gegaan. Misschien is het topic gesloten of verwijderd terwijl u het bekeek?" @@ -235,8 +235,8 @@ nl: title: "Lidmaatschapsverzoek voor @%{group_name}" education: until_posts: - one: 1 bericht - other: '%{count} berichten' + one: "1 bericht" + other: "%{count} berichten" 'new-topic': | Welkom op %{site_name} – **bedankt voor het starten van een nieuwe conversatie!** @@ -378,27 +378,6 @@ nl: Mogelijk wilt u dit topic sluiten via de :wrench: voor beheer (rechtsboven en -beneden), zodat er bij een aankondiging geen antwoorden opstapelen. lounge_welcome: title: "Welkom in de Lounge" - body: |2 - - Gefeliciteerd! :confetti_ball: - - Als u dit bericht kunt zien, bent u onlangs gepromoveerd naar **vaste gebruiker** (vertrouwensniveau 3). - - U kunt nu … - - * De titel van elk topic bewerken - * De categorie van elk topic wijzigen - * Al uw koppelingen laten volgen ([automatische nofollow](http://nl.wikipedia.org/wiki/Nofollow) is verwijderd) - * Een privécategorie Lounge benaderen, die alleen zichtbaar is voor gebruikers met vertrouwensniveau 3 en hoger - * Spam verbergen met één markering - - Hier is de [huidige lijst van vaste gebruikers](/badges/3/regular). Zeg zeker even hallo. - - Bedankt dat u een belangrijk onderdeel bent van deze gemeenschap! - - ([Bekijk dit topic][trust] voor meer informatie over vertrouwensniveaus. Let erop dat alleen leden die na verloop van tijd aan de voorwaarden blijven voldoen vaste gebruikers blijven.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Over de categorie %{category}" replace_paragraph: "(Vervang deze eerste alinea door een korte beschrijving van uw nieuwe categorie. Deze leidraad verschijnt in het categorieselectiegebied, dus probeer deze onder de 200 tekens te houden. **Voordat u deze beschrijving bewerkt of topics aanmaakt, verschijnt deze categorie niet op de categoriepagina.**)" @@ -414,9 +393,6 @@ nl: cannot_delete: uncategorized: "Ongecategoriseerd kan niet worden verwijderd" has_subcategories: "Deze categorie kan niet worden verwijderd, omdat deze subcategorieën bevat" - topic_exists: - one: Deze categorie kan niet worden verwijderd, omdat deze 1 topic bevat. Het oudste topic is %{topic_link}. - other: Deze categorie kan niet worden verwijderd, omdat deze %{count} topics bevat. Het oudste topic is %{topic_link}. topic_exists_no_oldest: "Deze categorie kan niet worden verwijderd, omdat het aantal topics %{count} is." uncategorized_description: "Topics die geen categorie nodig hebben of niet in een andere bestaande categorie passen." trust_levels: @@ -433,85 +409,85 @@ nl: change_failed_explanation: "U probeerde %{user_name} naar '%{new_trust_level}' te degraderen. Zijn of haar vertrouwensniveau is echter al '%{current_trust_level}'. %{user_name} blijft op vertrouwensniveau '%{current_trust_level}'. Als u de gebruiker wil degraderen, vergrendel dan eerst het vertrouwensniveau." rate_limiter: hours: - one: 1 uur - other: '%{count} uur' + one: "1 uur" + other: "%{count} uur" minutes: - one: 1 minuut - other: '%{count} minuten' + one: "1 minuut" + other: "%{count} minuten" seconds: - one: 1 seconde - other: '%{count} seconden' + one: "1 seconde" + other: "%{count} seconden" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1u - other: '%{count}u' + one: "1u" + other: "%{count}u" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mnd - other: '%{count}mnd' + one: "1mnd" + other: "%{count}mnd" x_months: - one: 1mnd - other: '%{count}mnd' + one: "1mnd" + other: "%{count}mnd" about_x_years: - one: 1j - other: '%{count}j' + one: "1j" + other: "%{count}j" over_x_years: - one: '> 1j' - other: '> %{count}j' + one: "> 1j" + other: "> %{count}j" almost_x_years: - one: 1j - other: '%{count}j' + one: "1j" + other: "%{count}j" distance_in_words_verbose: half_a_minute: "zojuist" less_than_x_seconds: - one: zojuist - other: zojuist + one: "zojuist" + other: "zojuist" x_seconds: - one: 1 seconde geleden - other: '%{count} seconden geleden' + one: "1 seconde geleden" + other: "%{count} seconden geleden" less_than_x_minutes: - one: minder dan 1 minuut geleden - other: minder dan %{count} minuten geleden + one: "minder dan 1 minuut geleden" + other: "minder dan %{count} minuten geleden" x_minutes: - one: 1 minuut geleden - other: '%{count} minuten geleden' + one: "1 minuut geleden" + other: "%{count} minuten geleden" about_x_hours: - one: 1 uur geleden - other: '%{count} uur geleden' + one: "1 uur geleden" + other: "%{count} uur geleden" x_days: - one: 1 dag geleden - other: '%{count} dagen geleden' + one: "1 dag geleden" + other: "%{count} dagen geleden" about_x_months: - one: ongeveer 1 maand geleden - other: ongeveer %{count} maanden geleden + one: "ongeveer 1 maand geleden" + other: "ongeveer %{count} maanden geleden" x_months: - one: 1 maand geleden - other: '%{count} maanden geleden' + one: "1 maand geleden" + other: "%{count} maanden geleden" about_x_years: - one: ongeveer 1 jaar geleden - other: ongeveer %{count} jaar geleden + one: "ongeveer 1 jaar geleden" + other: "ongeveer %{count} jaar geleden" over_x_years: - one: meer dan 1 jaar geleden - other: meer dan %{count} jaar geleden + one: "meer dan 1 jaar geleden" + other: "meer dan %{count} jaar geleden" almost_x_years: - one: bijna 1 jaar geleden - other: bijna %{count} jaar geleden + one: "bijna 1 jaar geleden" + other: "bijna %{count} jaar geleden" password_reset: no_token: "Sorry, die koppeling voor het wijzigen van uw wachtwoord is te oud. Selecteer de knop Aanmelden en gebruik 'Ik ben mijn wachtwoord vergeten' om een nieuwe koppeling te ontvangen." choose_new: "Een nieuw wachtwoord kiezen" @@ -585,14 +561,8 @@ nl: description: 'Dit bericht leuk vinden' short_description: 'Like dit bericht' long_form: 'vindt dit bericht leuk' - vote: - title: 'Stemmen' - description: 'Stemmen op dit bericht' - short_description: 'Stemmen op dit bericht' - long_form: 'heeft op dit bericht gestemd' user_activity: no_bookmarks: - self: "U hebt geen bladwijzers voor berichten; door bladwijzers voor berichten te maken, kunt u deze later makkelijk terugvinden." others: "Geen bladwijzers." no_likes_given: self: "U hebt geen berichten geliket." @@ -729,8 +699,6 @@ nl: num_users: "Gebruikers" top_referred_topics: title: "Top doorverwezen topics" - xaxis: "Topic" - num_clicks: "Klikken" page_view_anon_reqs: title: "Anoniem" xaxis: "Dag" @@ -787,7 +755,6 @@ nl: xaxis: "Dag" yaxis: "Totaal" mobile_visits: - title: "Gebruikersbezoeken" xaxis: "Dag" yaxis: "Aantal bezoeken" dashboard: @@ -807,8 +774,8 @@ nl: failing_emails_warning: 'Er zijn %{num_failed_jobs} mislukte e-mailtaken. Controleer uw bestand app.yml en zorg ervoor dat de mailserverinstellingen juist zijn. Bekijk de mislukte taken in Sidekiq.' subfolder_ends_in_slash: "Uw submapconfiguratie is onjuist; de DISCOURSE_RELATIVE_URL_ROOT eindigt met een schuine streep." email_polling_errored_recently: - one: E-mailpolling heeft de afgelopen 24 uur een fout gegenereerd. Bekijk de logboeken voor meer details. - other: E-mailpolling heeft de afgelopen 24 uur %{count} fouten gegenereerd. Bekijk de logboeken voor meer details. + one: "E-mailpolling heeft de afgelopen 24 uur een fout gegenereerd. Bekijk de logboeken voor meer details." + other: "E-mailpolling heeft de afgelopen 24 uur %{count} fouten gegenereerd. Bekijk de logboeken voor meer details." bad_favicon_url: "De favicon wordt niet geladen. Controleer uw favicon_url-instelling in de Website-instellingen." poll_pop3_timeout: "Time-out voor verbinding met de POP3-server. Binnenkomende e-mail kon niet worden opgehaald. Controleer uw POP3-instellingen en serviceprovider." poll_pop3_auth_error: "Verbinding met de POP3-server is mislukt met een authenticatiefout. Controleer uw POP3-instellingen." @@ -893,7 +860,6 @@ nl: post_menu: "De volgorde en selectie van items in het berichtmenu. Bijvoorbeeld like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "De menu-items die standaard verborgen moeten worden in het post menu totdat er op de uitbreidings-ellips is geklikt." share_links: "Bepaal de volgorde en selectie van items in het deelmenu." - track_external_right_clicks: "Houd bij welke externe links met de rechtermuisknop worden aangeklikt (bijv: open in nieuwe tab). Dit staat standaard uit, gezien het de URLs moet herschrijven, waardoor het gebruiksgemak afneemt" site_contact_username: "Een geldige gebruikersnaam van een staflid waarvandaan alle automatische berichten worden verzonden. Wanneer leeg gelaten, wordt de standaardaccount van het systeem gebruikt." send_welcome_message: "Stuur alle nieuwe gebruikers een welkomstbericht met een snel-start-gids." suppress_reply_directly_below: "Verberg de uitklapbare reactieteller bij een post als er maar één reactie direct onder staat." @@ -1068,7 +1034,6 @@ nl: min_first_post_typing_time: "Minimum tijd in milliseconden dat een gebruiker moet typen tijdens een eerste post, als de drempelwaarde niet wordt bereikt zal de post automatisch in de wachtrij voor goedkeuring gezet worden. Zet op 0 om uit te schakelen (niet aanbevolen)" reply_by_email_enabled: "Mogelijk inschakelen om te antwoorden per e-mail." reply_by_email_address: "Template voor antwoorden per e-mail, bijvoorbeeld: %{reply_key}@reageer.mijnforum.nl" - disable_emails: "Voorkomt dat Discourse e-mails van welke soort dan ook verstuurd." strip_images_from_short_emails: "Verwijder afbeeldingen met grootte van minder dan 2800 Bytes uit e-mails." short_email_length: "Korte e-mail lengte in Bytes" display_name_on_email_from: "Toon de volledige naam in het afzenderveld van e-mails." @@ -1202,61 +1167,58 @@ nl: not_seen_in_a_month: "Welkom terug! We hebben u een tijdje niet gezien. Dit zijn de meest populaire topics sinds uw afwezigheid." move_posts: new_topic_moderator_post: - one: 'Een bericht is gesplitst naar een nieuw topic: %{topic_link}' - other: '%{count} berichten zijn gesplitst naar een nieuw topic: %{topic_link}' + one: "Een bericht is gesplitst naar een nieuw topic: %{topic_link}" + other: "%{count} berichten zijn gesplitst naar een nieuw topic: %{topic_link}" existing_topic_moderator_post: - one: 'Een bericht is samengevoegd in een bestaand topic: %{topic_link}' - other: '%{count} berichten zijn samengevoegd in een bestaand topic: %{topic_link}' - change_owner: - post_revision_text: "Eigendom overgezet van %{old_user} naar %{new_user}" - deleted_user: "een verwijderde gebruiker" + one: "Een bericht is samengevoegd in een bestaand topic: %{topic_link}" + other: "%{count} berichten zijn samengevoegd in een bestaand topic: %{topic_link}" topic_statuses: archived_enabled: "Dit topic is nu gearchiveerd. Het is bevroren en kan op geen enkele manier worden gewijzigd." archived_disabled: "Dit topic is nu niet meer gearchiveerd. Het is niet meer bevroren en kan worden gewijzigd." closed_enabled: "Dit topic is nu gesloten. Nieuwe antwoorden zijn niet meer toegestaan." closed_disabled: "Dit topic is nu geopend. Nieuwe antwoorden zijn toegestaan." autoclosed_message_max_posts: - one: Dit bericht is na het bereiken van de maximumlimiet van 1 antwoord automatisch gesloten. - other: Dit bericht is na het bereiken van de maximumlimiet van %{count} antwoorden automatisch gesloten. + one: "Dit bericht is na het bereiken van de maximumlimiet van 1 antwoord automatisch gesloten." + other: "Dit bericht is na het bereiken van de maximumlimiet van %{count} antwoorden automatisch gesloten." autoclosed_topic_max_posts: - one: Dit topic is na het bereiken van de maximumlimiet van 1 antwoord automatisch gesloten. - other: Dit topic is na het bereiken van de maximumlimiet van %{count} antwoorden automatisch gesloten. + one: "Dit topic is na het bereiken van de maximumlimiet van 1 antwoord automatisch gesloten." + other: "Dit topic is na het bereiken van de maximumlimiet van %{count} antwoorden automatisch gesloten." autoclosed_enabled_days: - one: Dit topic is na 1 dag automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. - other: Dit topic is na %{count} dagen automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. + one: "Dit topic is na 1 dag automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." + other: "Dit topic is na %{count} dagen automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." autoclosed_enabled_hours: - one: Dit topic is na 1 uur automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. - other: Dit topic is na %{count} uur automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. + one: "Dit topic is na 1 uur automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." + other: "Dit topic is na %{count} uur automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." autoclosed_enabled_minutes: - one: Dit topic is na 1 minuut automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. - other: Dit topic is na %{count} minuten automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. + one: "Dit topic is na 1 minuut automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." + other: "Dit topic is na %{count} minuten automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." autoclosed_enabled_lastpost_days: - one: Dit topic is 1 dag na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. - other: Dit topic is %{count} dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. + one: "Dit topic is 1 dag na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." + other: "Dit topic is %{count} dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." autoclosed_enabled_lastpost_hours: - one: Dit topic is 1 uur na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. - other: Dit topic is %{count} uur na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. + one: "Dit topic is 1 uur na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." + other: "Dit topic is %{count} uur na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." autoclosed_enabled_lastpost_minutes: - one: Dit topic is 1 minuut na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. - other: Dit topic is %{count} minuten na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan. + one: "Dit topic is 1 minuut na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." + other: "Dit topic is %{count} minuten na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan." autoclosed_disabled_days: - one: Dit topic is na 1 dag automatisch geopend. - other: Dit topic is na %{count} dagen automatisch geopend. + one: "Dit topic is na 1 dag automatisch geopend." + other: "Dit topic is na %{count} dagen automatisch geopend." autoclosed_disabled_hours: - one: Dit topic is na 1 uur automatisch geopend. - other: Dit topic is na %{count} uur automatisch geopend. + one: "Dit topic is na 1 uur automatisch geopend." + other: "Dit topic is na %{count} uur automatisch geopend." autoclosed_disabled_minutes: - one: Dit topic is na 1 minuut automatisch geopend. - other: Dit topic is na %{count} minuten automatisch geopend. + one: "Dit topic is na 1 minuut automatisch geopend." + other: "Dit topic is na %{count} minuten automatisch geopend." autoclosed_disabled_lastpost_days: - one: Dit topic is 1 dag na het laatste antwoord automatisch geopend. - other: Dit topic is %{count} dagen na het laatste antwoord automatisch geopend. + one: "Dit topic is 1 dag na het laatste antwoord automatisch geopend." + other: "Dit topic is %{count} dagen na het laatste antwoord automatisch geopend." autoclosed_disabled_lastpost_hours: - one: Dit topic is 1 uur na het laatste antwoord automatisch geopend. - other: Dit topic is %{count} uur na het laatste antwoord automatisch geopend. + one: "Dit topic is 1 uur na het laatste antwoord automatisch geopend." + other: "Dit topic is %{count} uur na het laatste antwoord automatisch geopend." autoclosed_disabled_lastpost_minutes: - one: Dit topic is 1 minuut na het laatste antwoord automatisch geopend. - other: Dit topic is %{count} minuten na het laatste antwoord automatisch geopend. + one: "Dit topic is 1 minuut na het laatste antwoord automatisch geopend." + other: "Dit topic is %{count} minuten na het laatste antwoord automatisch geopend." autoclosed_disabled: "Dit topic is nu geopend. Nieuwe antwoorden zijn toegestaan." autoclosed_disabled_lastpost: "Dit topic is nu geopend. Nieuwe reacties worden weer geaccepteerd." pinned_enabled: "Dit topic is nu vastgemaakt. Het verschijnt bovenaan de categorie ervan totdat het door een staflid wordt losgemaakt voor iedereen, of door individuele gebruikers voor henzelf." @@ -1287,7 +1249,6 @@ nl: reserved_username: "Die gebruikersnaam is niet toegestaan." missing_user_field: "U hebt niet alle gebruikersvelden ingevuld" user: - no_accounts_associated: "Geen accounts gekoppeld" username: short: "moet ten minste %{min} tekens zijn" long: "moet niet meer dan %{max} tekens zijn" @@ -1305,8 +1266,8 @@ nl: max_new_accounts_per_registration_ip: "Nieuwe registraties vanaf uw IP-adres zijn niet toegestaan (maximumlimiet bereikt). Neem contact op met een staflid." flags_reminder: subject_template: - one: Eén vlag af te handelen - other: '%{count} vlaggen af te handelen' + one: "Eén vlag af te handelen" + other: "%{count} vlaggen af te handelen" invite_password_instructions: subject_template: "Geeft wachtwoord voor je %{site_name} account" flag_reasons: @@ -1389,8 +1350,8 @@ nl: De plaatsingsactie werd niet herkend. Probeer het opnieuw of plaats je bericht via de website als het nog steeds niet lukt. pending_users_reminder: subject_template: - one: 1 gebruiker wacht op goedkeuring - other: '%{count} gebruikers wachten op goedkeuring' + one: "1 gebruiker wacht op goedkeuring" + other: "%{count} gebruikers wachten op goedkeuring" text_body_template: | Er zijn nieuwe gebruikers die zich hebben ingeschreven en wachten op goedkeuring (of afwijzing) voor zij het forum op kunnen. @@ -1442,7 +1403,6 @@ nl: recent_topics: "Recent" see_more: "Meer" search_title: "Zoeken op deze website" - search_google: "Google" terms_of_service: title: "Servicevoorwaarden" signup_form_message: 'Ik heb de Servicevoorwaarden gelezen en ga hiermee akkoord.' @@ -1463,25 +1423,6 @@ nl: flag_reason: sockpuppet: "Een nieuwe gebruiker heeft een topic aangemaakt, en een andere nieuwe gebruiker op hetzelfde IP-adres (%{ip_address}) heeft geantwoord. Bekijk de website-instelling 'flag_sockpuppets'." spam_hosts: "Deze nieuwe gebruiker heeft geprobeerd meerdere berichten met koppelingen naar hetzelfde domein (%{domain}) aan te maken. Bekijk de website-instelling newuser_spam_host_threshold." - email_log: - post_user_deleted: "Gebruiker van het bericht is verwijderd." - no_user: "Kan geen gebruiker met id %{user_id} vinden" - anonymous_user: "Gebruiker is anoniem" - suspended_not_pm: "Gebruiker is geschorst, geen bericht" - seen_recently: "Gebruiker is onlangs nog gezien" - post_not_found: "Kan geen bericht met id %{post_id} vinden" - notification_already_read: "De melding waar deze e-mail over gaat is al gelezen" - topic_nil: "bericht.topic is leeg" - post_deleted: "bericht is verwijderd door de schrijver" - user_suspended: "gebruiker was geschorst" - already_read: "gebruiker heeft dit bericht al gelezen" - exceeded_emails_limit: "max_emails_per_day_per_user overschreden" - exceeded_bounces_limit: "bounce_score_threshold overschreden" - message_blank: "bericht is leeg" - message_to_blank: "message.to is leeg" - text_part_body_blank: "text_part.body is leeg" - body_blank: "geen tekst" - no_echo_mailing_list_mode: "Mailinglijstmeldingen voor eigen berichten van gebruiker uitgeschakeld" color_schemes: base_theme_name: "Basis" about: "Over" @@ -1552,8 +1493,6 @@ nl: choices: latest: label: "Nieuwste topics" - categories: - label: "Categorieën" emoji: title: "Emoji" invites: diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 280b002edc..07942d334d 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -87,27 +87,27 @@ pl_PL: one: "Nie można usunąć wpisu, ponieważ zależny %{record} istnieje" many: "Nie można usunąć wpisu, ponieważ zależny %{record} istnieje" too_long: + one: jest za dÅ‚uga (maksymalnie 1 znak) few: jest za dÅ‚uga (maksymalnie %{count} znaków) many: jest za dÅ‚uga (maksymalnie %{count} znaków) - one: jest za dÅ‚uga (maksymalnie 1 znak) other: jest za dÅ‚uga (maksymalnie %{count} znaków) too_short: + one: jest za krótka (minimalnie 1 znak) few: jest za krótka (minimalnie %{count} znaków) many: jest za dÅ‚uga (minimum to %{count} znaków) - one: jest za krótka (minimalnie 1 znak) other: jest za dÅ‚uga (minimum to %{count} znaków) wrong_length: + one: ma nieprawidÅ‚owÄ… dÅ‚ugość (powinna być 1 znakiem) few: jest nieprawidÅ‚owej dÅ‚ugoÅ›ci (powinna mieć %{count} znaków) many: jest nieprawidÅ‚owej dÅ‚ugoÅ›ci (powinna mieć %{count} znaków) - one: ma nieprawidÅ‚owÄ… dÅ‚ugość (powinna być 1 znakiem) other: jest nieprawidÅ‚owej dÅ‚ugoÅ›ci (powinna mieć %{count} znaków) other_than: "musi być różna od %{count}" template: body: 'WystÄ…piÅ‚y problemy z nastÄ™pujÄ…cymi polami:' header: + one: 1 błąd uniemożliwiÅ‚ zapisanie %{model} few: '%{count} błędy uniemożliwiÅ‚y zapisanie %{model}' many: '%{count} błędów uniemożliwiÅ‚o zapisanie %{model}' - one: 1 błąd uniemożliwiÅ‚ zapisanie %{model} other: '%{count} błędów uniemożliwiÅ‚o zapisanie %{model}' embed: load_from_remote: "WystÄ…piÅ‚ błąd podczas wczytywania tego wpisu." @@ -142,10 +142,10 @@ pl_PL: reading_time: "Czas odczytu" likes: "Lajki" too_many_replies: - few: Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu. - many: Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu. - one: Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do 1 odpowiedzi w ramach jednego tematu. - other: Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu. + one: "Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do 1 odpowiedzi w ramach jednego tematu." + few: "Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu." + many: "Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu." + other: "Przepraszamy, ale nowi użytkownicy sÄ… tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu." embed: start_discussion: "Rozpocznij dyskusjÄ™" continue: "Kontynuuj dyskusjÄ™" @@ -155,19 +155,19 @@ pl_PL: no_hosts: "Brak ustawionych hostów do osadzenia." configure: "Konfiguracja osadzenia" more_replies: - few: '%{count} odpowiedzi wiÄ™cej' - many: '%{count} odpowiedzi wiÄ™cej' - one: 1 odpowiedź wiÄ™cej - other: '%{count} odpowiedzi wiÄ™cej' + one: "1 odpowiedź wiÄ™cej" + few: "%{count} odpowiedzi wiÄ™cej" + many: "%{count} odpowiedzi wiÄ™cej" + other: "%{count} odpowiedzi wiÄ™cej" loading: "WczytujÄ™ dyskusję…" permalink: "Link bezpoÅ›redni" imported_from: "Ten temat jest powiÄ…zany ze źródÅ‚owÄ… dyskusjÄ…: %{link}" in_reply_to: "â–¶ %{username}" replies: - few: '%{count} odpowiedzi' - many: '%{count} odpowiedzi' - one: 1 odpowiedź - other: '%{count} odpowiedzi' + one: "1 odpowiedź" + few: "%{count} odpowiedzi" + many: "%{count} odpowiedzi" + other: "%{count} odpowiedzi" no_mentions_allowed: "Przepraszamy, nie możesz odwoÅ‚ywać siÄ™ do innych użytkowników." no_mentions_allowed_newuser: "Przepraszamy, nowi użytkownicy nie mogÄ… odwoÅ‚ywać siÄ™ do innych użytkowników." no_images_allowed: "Przepraszamy, nowi użytkownicy nie mogÄ… dodawać zdjęć do postów." @@ -238,10 +238,10 @@ pl_PL: title: "ProÅ›ba o czÅ‚onkostwo w grupie @%{group_name}" education: until_posts: - few: '%{count} wpisy' - many: '%{count} wpisów' - one: 1 wpis - other: '%{count} wpisów' + one: "1 wpis" + few: "%{count} wpisy" + many: "%{count} wpisów" + other: "%{count} wpisów" 'new-topic': |+ Witaj na %{site_name} — **dziÄ™kujemy za rozpoczÄ™cie nowej dyskusji!** @@ -386,27 +386,6 @@ pl_PL: Rozważ zamkniÄ™cie tego tematu poprzez administracyjny :wrench: (w prawym górnym i dolnym rogu), aby zapobiec niepotrzebnym odpowiedziom do ogÅ‚oszenia. lounge_welcome: title: "Witaj w Salonie" - body: |2 - - Gratulacje! :confetti_ball: - - JeÅ›li widzisz ten temat, twoje konto osiÄ…gnęło trzeci poziom zaufania. - - Od teraz możesz … - - * Edytować tytuÅ‚ każdego tematu - * Przenieść temat do innej kategorii - * Twoje linki nie bÄ™dÄ… posiadać już atrybutu [nofollow](http://en.wikipedia.org/wiki/Nofollow) - * Korzystać z prywatnego Salonu, kategorii która jest widoczna jedynie dla użytkowników na 3 poziomie zaufania lub wyższym - * Przyznawać polubienia i flagi o wiÄ™kszej wadze - - Możesz zobaczyć [wszystkie osoby z tym poziomem zaufania](/badges/3/regular). Nie zapomnij siÄ™ przywitać. - - DziÄ™kujemy, że jesteÅ› tak aktywnÄ… częściÄ… naszej spoÅ‚ecznoÅ›ci! - - (WiÄ™cej informacji o poziomach zaufania znajduje siÄ™ [pod tym adresem][trust]. PamiÄ™taj, że trzeci poziom zaufania zależy od utrzymywania aktywnoÅ›ci danego konta na okreÅ›lonym poziomie.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "O kategorii %{category}" replace_paragraph: "(ZamieÅ„ ten pierwszy paragraf na krótki opis nowej kategorii. Opis ten bÄ™dzie wyÅ›wietlany na karcie wyboru kategorii, wiÄ™c postaraj siÄ™ utrzymać go krótszego niż 200 znaków. **Dopóki nie zmienisz tego opisu, ani nie utworzysz tematu, kategoria nie bÄ™dzie wyÅ›wietlana na liÅ›cie kategorii.**)" @@ -422,11 +401,6 @@ pl_PL: cannot_delete: uncategorized: "Nie można usunąć kategorii Inne" has_subcategories: "Nie można usunąć tej kategorii ponieważ posiada podkategorie. " - topic_exists: - few: 'Nie można usunąć tej kategorii ponieważ zawiera %{count} tematy. Najstarszy z nich: %{topic_link}.' - many: 'Nie można usunąć tej kategorii ponieważ zawiera %{count} tematów. Najstarszy z nich: %{topic_link}.' - one: 'Nie można usunąć tej kategorii ponieważ zawiera temat: %{topic_link}.' - other: 'Nie można usunąć tej kategorii ponieważ zawiera %{count} tematów. Najstarszy z nich: %{topic_link}.' topic_exists_no_oldest: "Nie można usunąć tej kategorii z uwagi na liczbÄ™ tematów: %{count}." uncategorized_description: "Tematy które nie potrzebujÄ… kategorii, albo nie nadają się do żadnej innej." trust_levels: @@ -446,135 +420,135 @@ pl_PL: broken: "Ten obraz jest uszkodzony" rate_limiter: hours: - few: '%{count} godziny' - many: '%{count} godzin' - one: 1 godzina - other: '%{count} godzin' + one: "1 godzina" + few: "%{count} godziny" + many: "%{count} godzin" + other: "%{count} godzin" minutes: - few: '%{count} minuty' - many: '%{count} minut' - one: 1 minuta - other: '%{count} minut' + one: "1 minuta" + few: "%{count} minuty" + many: "%{count} minut" + other: "%{count} minut" seconds: - few: '%{count} sekundy' - many: '%{count} sekund' - one: 1 sekunda - other: '%{count} sekund' + one: "1 sekunda" + few: "%{count} sekundy" + many: "%{count} sekund" + other: "%{count} sekund" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - many: < %{count}s - one: < %{count}s - other: < %{count}s + one: "< %{count}s" + few: "< %{count}s" + many: "< %{count}s" + other: "< %{count}s" x_seconds: - few: '%{count}s' - many: '%{count}s' - one: 1s - other: '%{count}s' + one: "1s" + few: "%{count}s" + many: "%{count}s" + other: "%{count}s" less_than_x_minutes: - few: < %{count}m - many: < %{count}m - one: < 1m - other: < %{count}m + one: "< 1m" + few: "< %{count}m" + many: "< %{count}m" + other: "< %{count}m" x_minutes: - few: '%{count}m' - many: '%{count}m' - one: 1m - other: '%{count}m' + one: "1m" + few: "%{count}m" + many: "%{count}m" + other: "%{count}m" about_x_hours: - few: '%{count}h' - many: '%{count}h' - one: 1h - other: '%{count}h' + one: "1h" + few: "%{count}h" + many: "%{count}h" + other: "%{count}h" x_days: - few: '%{count}d' - many: '%{count}d' - one: 1d - other: '%{count}d' + one: "1d" + few: "%{count}d" + many: "%{count}d" + other: "%{count}d" about_x_months: - few: '%{count}mie' - many: '%{count}mie' - one: 1mie - other: '%{count}mie' + one: "1mie" + few: "%{count}mie" + many: "%{count}mie" + other: "%{count}mie" x_months: - few: '%{count}mie' - many: '%{count}mie' - one: 1mie - other: '%{count}mie' + one: "1mie" + few: "%{count}mie" + many: "%{count}mie" + other: "%{count}mie" about_x_years: - few: '%{count}l' - many: '%{count}l' - one: 1r - other: '%{count}l' + one: "1r" + few: "%{count}l" + many: "%{count}l" + other: "%{count}l" over_x_years: - few: '> %{count}l' - many: '> %{count}l' - one: '> 1r' - other: '> %{count}l' + one: "> 1r" + few: "> %{count}l" + many: "> %{count}l" + other: "> %{count}l" almost_x_years: - few: '%{count}l' - many: '%{count}l' - one: 1r - other: '%{count}l' + one: "1r" + few: "%{count}l" + many: "%{count}l" + other: "%{count}l" distance_in_words_verbose: half_a_minute: "przed chwilÄ…" less_than_x_seconds: - few: przed chwilÄ… - many: przed chwilÄ… - one: przed chwilÄ… - other: przed chwilÄ… + one: "przed chwilÄ…" + few: "przed chwilÄ…" + many: "przed chwilÄ…" + other: "przed chwilÄ…" x_seconds: - few: '%{count} sekundy temu' - many: '%{count} sekund temu' - one: 1 sekundÄ™ temu - other: '%{count} sekund temu' + one: "1 sekundÄ™ temu" + few: "%{count} sekundy temu" + many: "%{count} sekund temu" + other: "%{count} sekund temu" less_than_x_minutes: - few: mniej niż %{count} minuty temu - many: mniej niż %{count} minut temu - one: mniej niż 1 minutÄ™ temu - other: mniej niż %{count} minut temu + one: "mniej niż 1 minutÄ™ temu" + few: "mniej niż %{count} minuty temu" + many: "mniej niż %{count} minut temu" + other: "mniej niż %{count} minut temu" x_minutes: - few: '%{count} minuty temu' - many: '%{count} minut temu' - one: 1 minutÄ™ temu - other: '%{count} minut temu' + one: "1 minutÄ™ temu" + few: "%{count} minuty temu" + many: "%{count} minut temu" + other: "%{count} minut temu" about_x_hours: - few: '%{count} godziny temu' - many: '%{count} godzin temu' - one: godzinÄ™ temu - other: '%{count} godzin temu' + one: "godzinÄ™ temu" + few: "%{count} godziny temu" + many: "%{count} godzin temu" + other: "%{count} godzin temu" x_days: - few: '%{count} dni temu' - many: '%{count} dni temu' - one: 1 dzieÅ„ temu - other: '%{count} dni temu' + one: "1 dzieÅ„ temu" + few: "%{count} dni temu" + many: "%{count} dni temu" + other: "%{count} dni temu" about_x_months: - few: okoÅ‚o %{count} miesiÄ…ce temu - many: okoÅ‚o %{count} miesiÄ™cy temu - one: okoÅ‚o 1 miesiÄ…ca temu - other: okoÅ‚o %{count} miesiÄ™cy temu + one: "okoÅ‚o 1 miesiÄ…ca temu" + few: "okoÅ‚o %{count} miesiÄ…ce temu" + many: "okoÅ‚o %{count} miesiÄ™cy temu" + other: "okoÅ‚o %{count} miesiÄ™cy temu" x_months: - few: '%{count} miesiÄ…ce temu' - many: '%{count} miesiÄ™cy temu' - one: 1 miesiÄ…c temu - other: '%{count} miesiÄ™cy temu' + one: "1 miesiÄ…c temu" + few: "%{count} miesiÄ…ce temu" + many: "%{count} miesiÄ™cy temu" + other: "%{count} miesiÄ™cy temu" about_x_years: - few: okoÅ‚o %{count} lata temu - many: okoÅ‚o %{count} lat temu - one: okoÅ‚o 1 rok temu - other: okoÅ‚o %{count} lat temu + one: "okoÅ‚o 1 rok temu" + few: "okoÅ‚o %{count} lata temu" + many: "okoÅ‚o %{count} lat temu" + other: "okoÅ‚o %{count} lat temu" over_x_years: - few: ponad %{count} lata temu - many: ponad %{count} lat temu - one: ponad 1 rok temu - other: ponad %{count} lat temu + one: "ponad 1 rok temu" + few: "ponad %{count} lata temu" + many: "ponad %{count} lat temu" + other: "ponad %{count} lat temu" almost_x_years: - few: prawie %{count} lata temu - many: prawie %{count} lat temu - one: prawie 1 rok temu - other: prawie %{count} lat temu + one: "prawie 1 rok temu" + few: "prawie %{count} lata temu" + many: "prawie %{count} lat temu" + other: "prawie %{count} lat temu" password_reset: no_token: "Przepraszamy, ten link do zmiany hasÅ‚a jest zbyt stary. Wybierz przycisk \"Zaloguj\", a nastÄ™pnie \"ZapomniaÅ‚em hasÅ‚a\", by uzyskać nowy link." choose_new: "Wprowadź nowe hasÅ‚o" @@ -648,17 +622,11 @@ pl_PL: description: 'Polub ten wpis' short_description: 'Polub ten wpis' long_form: 'polubiono to' - vote: - title: 'GÅ‚osuj' - description: 'GÅ‚osuj za tym wpisem' - short_description: 'ZagÅ‚osuj na ten wpis' - long_form: 'zagÅ‚osowano za tym wpisem' user_activity: no_default: self: "Nie masz jeszcze żadnej aktywnoÅ›ci." others: "Brak aktywnoÅ›ci" no_bookmarks: - self: "Nie masz postów dodanych do zakÅ‚adek, posty w zakÅ‚adkach pozwalajÄ… ci na Å‚atwiejszy dostÄ™p do nich w późniejszym czasie." others: "Brak zakÅ‚adek." no_likes_given: self: "Nie masz lajkowanych postów." @@ -796,8 +764,6 @@ pl_PL: num_users: "Użytkownicy" top_referred_topics: title: "Najczęściej linkowane tematy" - xaxis: "Temat" - num_clicks: "Kliki" page_view_anon_reqs: title: "Anonimowy" xaxis: "DzieÅ„" @@ -854,7 +820,6 @@ pl_PL: xaxis: "DzieÅ„" yaxis: "ÅÄ…cznie" mobile_visits: - title: "Wizyty użytkowników" xaxis: "DzieÅ„" yaxis: "Liczba wizyt" dashboard: @@ -874,10 +839,10 @@ pl_PL: failing_emails_warning: '%{num_failed_jobs} prac emailowych nie powiodÅ‚o siÄ™. Sprawdź plik app.yml i upewnij siÄ™, że ustawienia serwera poczty sÄ… poprawne. Zobacz nieudane prace w Sidekiqu.' subfolder_ends_in_slash: "Twoje ustawienie podfolderu jest niepoprawne; DISCOURSE_RELATIVE_URL_ROOT koÅ„czy siÄ™ slashem." email_polling_errored_recently: - few: Email polling wygenerowaÅ‚ %{count} błędy w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach. - many: Email polling wygenerowaÅ‚ %{count} błędów w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach. - one: Email polling wygenerowaÅ‚ 1 błąd w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach. - other: Email polling wygenerowaÅ‚ %{count} błędów w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach. + one: "Email polling wygenerowaÅ‚ 1 błąd w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach." + few: "Email polling wygenerowaÅ‚ %{count} błędy w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach." + many: "Email polling wygenerowaÅ‚ %{count} błędów w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach." + other: "Email polling wygenerowaÅ‚ %{count} błędów w przeciÄ…gu ostatniej doby. WiÄ™cej szczegółów w logach." bad_favicon_url: "Nie można zaÅ‚adować favikony. Sprawdź ustawiony favicon_url w Ustawieniach Strony." poll_pop3_timeout: "Połączenie z serwerem POP3 zostaÅ‚o zerwane. PrzychodzÄ…ca wiadomość mogÅ‚a nie zostać odebrany. Proszę sprawdź swoje i dostawcÄ™ usÅ‚ug." poll_pop3_auth_error: "Połączenie z serwerem POP3 nie powiodÅ‚o siÄ™ przez błąd uwierzytelnienia. ProszÄ™ sprawdź swoje ustawienia POP3." @@ -977,7 +942,6 @@ pl_PL: post_menu: "OkreÅ›l które elementy menu wpisu powinny być widoczne i w jakiej kolejnoÅ›ci. PrzykÅ‚ad like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Elementy w menu, które w menu posta bÄ™dÄ… ukryte, chyba że klikniÄ™ty zostanie przycisk rozwijania." share_links: "OkreÅ›l które elementy menu udostÄ™pniania powinny być widoczne i w jakiej kolejnoÅ›ci. " - track_external_right_clicks: "Åšledź zewnÄ™trzne linki klikniÄ™te prawym klawiszem (np. otwierane w nowej zakÅ‚adce). DomyÅ›lnie wyłączone, gdyż wymaga nadpisywania URLi." site_contact_username: "Nazwa użytkownika, spod której wysyÅ‚ane bÄ™dÄ… automatyczne wiadomoÅ›ci. JeÅ›li pusta, użyte bÄ™dzie domyÅ›lne konto System." send_welcome_message: "WyÅ›lij wszystkim nowym użytkownikom powitalnÄ… wiadomość z krótkim przewodnikiem." suppress_reply_directly_below: "Nie pokazuj rozwijanej liczby odpowiedzi przy poÅ›cie, gdy jest tylko jedna odpowiedź bezpoÅ›rednio pod tym postem." @@ -1182,7 +1146,6 @@ pl_PL: reply_by_email_enabled: "Włącz możliwość odpowiadania na wpisy poprzez email." reply_by_email_address: "Template for reply by email incoming email address, for example: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Lista alternatywnych szablonów do odpowiedzi przez adres email. PrzykÅ‚ad: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "Powstrzymaj Discourse przed wysyÅ‚aniem jakichkolwiek emaili." strip_images_from_short_emails: "Pasek zdjęć z emaila o rozmiarze mniejszym niż 2800 bajtów" short_email_length: "DÅ‚ugość krótkiego emaila w bajtach" display_name_on_email_from: "WyÅ›wietl peÅ‚ne nazwy na emailach z pól" @@ -1225,7 +1188,6 @@ pl_PL: delete_user_max_post_age: "Nie pozwalaj na usuwanie użytkowników których pierwszy post jest starszy niż (x) dni." delete_all_posts_max: "The maximum number of posts that can be deleted at once with the Delete All Posts button. If a user has more than this many posts, the posts cannot all be deleted at once and the user can't be deleted." email_editable: "Allow users to change their e-mail address after registration." - logout_redirect: "Adres, na jaki użytkownik zostanie przekierowany po wylogowaniu (np. http://jakasstrona.pl/logout)" allow_uploaded_avatars: "Zezwól użytkownikom na przesyÅ‚anie niestandardowych zdjęć profilowych." allow_animated_avatars: "Zezwól na używanie animowanych plików GIF jako zdjęć profilowych. UWAGA: po zmianie tego ustawienia uruchom zadanie avatars:refresh rake." allow_animated_thumbnails: "Generowanie miniatur animowanych gifów." @@ -1386,72 +1348,69 @@ pl_PL: not_seen_in_a_month: "Witamy ponownie! DÅ‚ugo tu nie zaglÄ…daÅ‚eÅ›. Oto najpopularniejsze tematy z czasów, kiedy ciÄ™ tu nie byÅ‚o." merge_posts: edit_reason: - few: '%{username} dołączyÅ‚ %{count} posty' - many: '%{username} dołączyÅ‚ %{count} postów' - one: '%{username} dołączyÅ‚ 1 post' - other: '%{username} dołączyÅ‚ %{count} postów' + one: "%{username} dołączyÅ‚ 1 post" + few: "%{username} dołączyÅ‚ %{count} posty" + many: "%{username} dołączyÅ‚ %{count} postów" + other: "%{username} dołączyÅ‚ %{count} postów" errors: different_topics: "Nie można połączyć postów z różnych wÄ…tków." different_users: "Nie można połączyć postów różnych użytkowników." move_posts: new_topic_moderator_post: - few: 'Wydzielono %{count} posty tworzÄ…c nowy wÄ…tek: %{topic_link}' - many: 'Wydzielono %{count} postów tworzÄ…c nowy wÄ…tek: %{topic_link}' - one: 'Wydzielono 1 post tworzÄ…c nowy wÄ…tek: %{topic_link}' - other: 'Wydzielono %{count} postów tworzÄ…c nowy wÄ…tek: %{topic_link}' + one: "Wydzielono 1 post tworzÄ…c nowy wÄ…tek: %{topic_link}" + few: "Wydzielono %{count} posty tworzÄ…c nowy wÄ…tek: %{topic_link}" + many: "Wydzielono %{count} postów tworzÄ…c nowy wÄ…tek: %{topic_link}" + other: "Wydzielono %{count} postów tworzÄ…c nowy wÄ…tek: %{topic_link}" existing_topic_moderator_post: - few: '%{count} posty przeniesiono do wÄ…tku: %{topic_link}' - many: '%{count} postów przeniesiono do wÄ…tku: %{topic_link}' - one: '1 post przeniesiono do wÄ…tku: %{topic_link}' - other: '%{count} postów przeniesiono do wÄ…tku: %{topic_link}' - change_owner: - post_revision_text: "Zmieniono wÅ‚aÅ›ciciela z %{old_user} na %{new_user}" - deleted_user: "usuniÄ™ty użytkownik" + one: "1 post przeniesiono do wÄ…tku: %{topic_link}" + few: "%{count} posty przeniesiono do wÄ…tku: %{topic_link}" + many: "%{count} postów przeniesiono do wÄ…tku: %{topic_link}" + other: "%{count} postów przeniesiono do wÄ…tku: %{topic_link}" topic_statuses: archived_enabled: "Temat zostaÅ‚ zarchiwizowany. ZostaÅ‚ zablokowany i nie może być zmieniany. " archived_disabled: "Temat zostaÅ‚ przywrócony z archiwum. ZostaÅ‚ odblokowany i może ponownie być zmieniany." closed_enabled: "Temat zostaÅ‚ zamkniÄ™ty. Dodawanie nowych odpowiedzi nie jest możliwe." closed_disabled: "Temat zostaÅ‚ otwarty. Dodawanie odpowiedzi jest ponownie możliwe." autoclosed_message_max_posts: - few: Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi. - many: Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi. - one: Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby 1 odpowiedzi. - other: Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi. + one: "Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby 1 odpowiedzi." + few: "Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi." + many: "Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi." + other: "Wiadomość zostaÅ‚a automatycznie zamkniÄ™ta po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi." autoclosed_topic_max_posts: - few: WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi. - many: WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi. - one: WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby 1 odpowiedzi. - other: WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi. + one: "WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby 1 odpowiedzi." + few: "WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi." + many: "WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi." + other: "WÄ…tek zostaÅ‚ automatycznie zamkniÄ™ty po osiÄ…gniÄ™ciu maksymalnej liczby %{count} odpowiedzi." autoclosed_enabled_days: - few: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} dniach. Tworzenie nowych odpowiedzi nie jest możliwe. - many: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} dniach. Tworzenie nowych odpowiedzi nie jest już możliwe. - one: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po 1 dniu. Tworzenie nowych odpowiedzi nie jest możliwe. - other: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} dniach. Tworzenie nowych odpowiedzi nie jest już możliwe. + one: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po 1 dniu. Tworzenie nowych odpowiedzi nie jest możliwe." + few: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} dniach. Tworzenie nowych odpowiedzi nie jest możliwe." + many: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} dniach. Tworzenie nowych odpowiedzi nie jest już możliwe." + other: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} dniach. Tworzenie nowych odpowiedzi nie jest już możliwe." autoclosed_enabled_hours: - few: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} godzinach. Tworzenie nowych odpowiedzi nie jest już możliwe. - many: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} godzinach. Tworzenie nowych odpowiedzi nie jest już możliwe. - one: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po 1 godzinie. Tworzenie nowych odpowiedzi nie jest już możliwe. - other: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} godzinach. Tworzenie nowych odpowiedzi nie jest już możliwe. + one: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po 1 godzinie. Tworzenie nowych odpowiedzi nie jest już możliwe." + few: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} godzinach. Tworzenie nowych odpowiedzi nie jest już możliwe." + many: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} godzinach. Tworzenie nowych odpowiedzi nie jest już możliwe." + other: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} godzinach. Tworzenie nowych odpowiedzi nie jest już możliwe." autoclosed_enabled_minutes: - few: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} minutach. Tworzenie nowych odpowiedzi nie jest już możliwe. - many: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} minutach. Tworzenie nowych odpowiedzi nie jest już możliwe. - one: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po 1 minucie. Tworzenie nowych odpowiedzi nie jest już możliwe. - other: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} minutach. Tworzenie nowych odpowiedzi nie jest już możliwe. + one: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po 1 minucie. Tworzenie nowych odpowiedzi nie jest już możliwe." + few: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} minutach. Tworzenie nowych odpowiedzi nie jest już możliwe." + many: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} minutach. Tworzenie nowych odpowiedzi nie jest już możliwe." + other: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty po %{count} minutach. Tworzenie nowych odpowiedzi nie jest już możliwe." autoclosed_enabled_lastpost_days: - few: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - many: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - one: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty 1 dzieÅ„ po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - other: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. + one: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty 1 dzieÅ„ po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + few: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + many: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + other: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." autoclosed_enabled_lastpost_hours: - few: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} godziny po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - many: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} godzin po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - one: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty 1 godzinÄ™ po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - other: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} godzin po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. + one: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty 1 godzinÄ™ po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + few: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} godziny po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + many: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} godzin po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + other: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} godzin po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." autoclosed_enabled_lastpost_minutes: - few: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} minuty po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - many: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} minut po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - one: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty 1 minutÄ™ po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. - other: Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} minut po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe. + one: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty 1 minutÄ™ po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + few: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} minuty po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + many: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} minut po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." + other: "Ten temat zostaÅ‚ automatycznie zamkniÄ™ty %{count} minut po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe." autoclosed_disabled: "Temat zostaÅ‚ otwarty. Dodawanie odpowiedzi jest ponownie możliwe." autoclosed_disabled_lastpost: "Temat zostaÅ‚ otwarty. Pisanie odpowiedzi jest możliwe." pinned_enabled: "Temat zostaÅ‚ przypiÄ™ty. BÄ™dzie pojawiać siÄ™ na poczÄ…tku swojej kategorii dopóki nie zostanie odpiÄ™ty przez obsÅ‚ugÄ™ lub prywatnie przez użytkownika." @@ -1486,7 +1445,6 @@ pl_PL: click_to_continue: "Kliknij tutaj aby kontynuować." already_logged_in: "Próbujesz zaakceptować zaproszenie przeznaczone dla innego użytkownika. JeÅ›li %{current_user} to nie ty, wyloguj siÄ™ i zaloguj ponownie." user: - no_accounts_associated: "Brak powiÄ…zanych kont" deactivated: "ZostaÅ‚ dezaktywowany w zwiÄ…zku ze zbyt dużą liczbÄ… odrzuconych emaili na '%{email}'." deactivated_by_staff: "Wyłączone przez personel" activated_by_staff: "Aktywowane przez personel" @@ -1512,10 +1470,10 @@ pl_PL: domain_not_allowed: "Błędny adres strony internetowej. Dozwolone domeny: %{domains}" flags_reminder: subject_template: - few: '%{count} flagi oczekujÄ… na reakcjÄ™' - many: '%{count} flagi oczekujÄ… na reakcjÄ™' - one: 1 flaga oczekuje na reakcjÄ™ - other: '%{count} flagi oczekujÄ… na reakcjÄ™' + one: "1 flaga oczekuje na reakcjÄ™" + few: "%{count} flagi oczekujÄ… na reakcjÄ™" + many: "%{count} flagi oczekujÄ… na reakcjÄ™" + other: "%{count} flagi oczekujÄ… na reakcjÄ™" unsubscribe_mailer: title: "Unsubscribe Mailer" subject_template: "Potwierdź, że nie chcesz już otrzymywać powiadomieÅ„ mailowych ze strony %{site_title}" @@ -1595,11 +1553,6 @@ pl_PL: post_hidden: title: "Ukryty post" subject_template: "Wpis zostaÅ‚ ukryty z powodu oflagowania przez spoÅ‚eczność" - usage_tips: - text_body_template: | - Dla kilku szybkich wskazówek dotyczÄ…cych rozpoczÄ™cia użytkowania strony dla nowych użytkowników [sprawdź ten blog] (https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). - - JeÅ›li bÄ™dziesz siÄ™ udzielaÅ‚, poznamy ciebie i zniesiemy tymczasowe ograniczenia dla nowych użytkowników. Z biegiem czasu uzyskasz [poziomy zaufania] (https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), które zawierajÄ… specjalne zdolnoÅ›ci, aby pomóc nam zarzÄ…dzać naszÄ… spoÅ‚ecznoÅ›ciÄ…. welcome_user: title: "Witaj Użytkowniku" subject_template: "Witaj na %{site_name}!" @@ -1862,10 +1815,10 @@ pl_PL: pending_users_reminder: title: "OczekujÄ…cy użytkownicy przypomnienie" subject_template: - few: '%{count} użytkowników czeka na zatwierdzenie' - many: '%{count} użytkowników czeka na zatwierdzenie' - one: 1 użytkownik czeka na zatwierdzenie - other: '%{count} użytkowników czeka na zatwierdzenie' + one: "1 użytkownik czeka na zatwierdzenie" + few: "%{count} użytkowników czeka na zatwierdzenie" + many: "%{count} użytkowników czeka na zatwierdzenie" + other: "%{count} użytkowników czeka na zatwierdzenie" text_body_template: |+ SÄ… nowi zarejestrowani użytkownicy, oczekujÄ…cy na zaakceptowanie (lub odrzucenie) przed rozpoczÄ™ciem użytkowania forum. @@ -1903,10 +1856,8 @@ pl_PL: title: "Wypisz" description: "Nie chcesz otrzymywać tych emaili? Nie ma problemu! Kliknij poniżej by wypisać siÄ™ natychmiast:" reply_by_email: "[Zobacz Temat](%{base_url}%{url}) lub odpowiedz na ten email aby odpowiedzieć" - reply_by_email_pm: "[Zobacz Temat](%{base_url}%{url}) lub odpowiedz na ten email aby odpowiedzieć." only_reply_by_email: "Powtórz ten email dla odpowiedzi." visit_link_to_respond: "[Zobacz Temat](%{base_url}%{url}) aby odpowiedzieć." - visit_link_to_respond_pm: "[Zobacz wiadomość](%{base_url}%{url}) aby odpowiedzieć." posted_by: "Dodany przez %{username} w dniu %{post_date}" invited_to_private_message_body: | %{username} zaprosiÅ‚ ciÄ™ do wiadomÅ›ci @@ -2168,7 +2119,6 @@ pl_PL: recent_topics: "Ostatnie" see_more: "WiÄ™cej" search_title: "Szukaj w serwisie" - search_google: "Google" login_required: welcome_message: |+ #[Witamy na %{title}](#welcome) @@ -2198,32 +2148,11 @@ pl_PL: flag_reason: sockpuppet: "Nowy użytkownik stworzyÅ‚ temat, a inny nowy użytkownik z tym samym adresem IP (%{ip_address}) odpowiedziaÅ‚. 'flag_sockpuppets' ustawienia strony." spam_hosts: "Ten nowy użytkownik próbowaÅ‚ stworzyć wiele postów z linkami do tej samej domeny (%{domain}). Zobacz `newuser_spam_host_threshold ustawienia strony." - email_log: - post_user_deleted: "Użytkownik tego wpisu zostaÅ‚ usuniÄ™ty." - no_user: "Nie można znaleźć użytkownika z ID %{user_id}" - anonymous_user: "Użytkownik anonimowy" - suspended_not_pm: "Użytkownik jest zawieszony, nie wiadomość" - seen_recently: "Użytkownik byÅ‚ widziany niedawno" - post_not_found: "Nie można odnaleźć wpisu z numerem %{post_id}" - notification_already_read: "Powiadomienie o czym jest ten e-mailu już zostaÅ‚o przeczytane" - topic_nil: "wpis.temat jest zerowy" - post_deleted: "Wpis zostaÅ‚ usuniÄ™ty przez autora" - user_suspended: "użytkownik zostaÅ‚ zawieszony" - already_read: "użytkownik przeczytaÅ‚ ten post" - exceeded_emails_limit: "Przekroczono maksymalnÄ…, dziennÄ… liczbÄ™ emaili dla użytkownika" - exceeded_bounces_limit: "Przekroczono bounce_score_threshold " - message_blank: "wiadomość jest pusta" - message_to_blank: "wiadomość.do jest pusta" - text_part_body_blank: "text_part.body jest pusta" - body_blank: "Wiadomość jest pusta" - no_echo_mailing_list_mode: "Powiadomienia listy mailingowej wyłączone dla postów wÅ‚asnych użytkowników." color_schemes: base_theme_name: "Podstawa" - default: "Jasny motyw" dark: "Ciemny motyw" - default_theme_name: "DomyÅ›lny" - dark_theme_name: "Ciemny" light_theme_name: "Jasny" + dark_theme_name: "Ciemny" about: "O stronie" guidelines: "Przewodnik" privacy: "Prywatność" @@ -2425,70 +2354,40 @@ pl_PL: editor: name: Edytor description: Pierwsza edycja - long_description: | - Ta odznaka jest przyznawana, gdy po raz pierwszy dokonasz edycji jednego z twoich postów. Nie bÄ™dziesz miaÅ‚ możliwoÅ›ci dokonywania zmian w postach na zawsze, edytowanie to jest zawsze dobry pomysÅ‚ - możesz dokonać ulepszenia swoich postów, naprawić maÅ‚e błędy, lub dodać tekst, który przez przypadek pominÄ…Å‚eÅ› w oryginalnym poÅ›cie. Edytuj by twoje posty stawaÅ‚y siÄ™ coraz lepsze! basic_user: name: Podstawowy - description: "Przyznano wszystkie podstawowe funkcje" - long_description: | - To odznaka jest przyznawana, gdy osiÄ…gniesz poziom zaufania 1. DziÄ™kujemy, że z nami jesteÅ› i czytasz różne wÄ…tki, aby dowiedzieć siÄ™ jak dziaÅ‚a nasza spoÅ‚eczność. Ograniczenia dla nowego użytkownika zostaÅ‚y usuniÄ™te; przyznano ci wszystkie niezbÄ™dne funkcjÄ™ spoÅ‚ecznoÅ›ciowe, jak na przykÅ‚ad wysyÅ‚anie wiadomoÅ›ci prywatnych, edytowanie wiki, flagowanie i możliwość dodawania wielu obrazków i linków w postach. member: name: ZwykÅ‚y - description: "Przyznano zaproszenia, wysyÅ‚anie wiadomoÅ›ci do grup, wiÄ™cej lajków" - long_description: | - Ta odznaka jest przyznawana, gdy osiÄ…gniesz poziom zaufania 2. DziÄ™kujemy za to, że udzielasz siÄ™ przez czas kilku tygodni, aby w peÅ‚ni dołączyć do spoÅ‚ecznoÅ›ci. Możesz teraz wysyÅ‚ać zaproszenia ze strony użytkownika lub z wÄ…tków, tworzyć konwersacje grupowe i mieć kilka polubieÅ„ wiÄ™cej na dzieÅ„. regular: name: Regularny - description: "Przyznano możliwość zmiany kategorii, nazwy, linków oraz salon, wiÄ™cej lajków" - long_description: | - Ta odznaka jest przyznawana, gdy osiÄ…gniesz poziom zaufania 3. DziÄ™kujemy, że regularnie udzielasz siÄ™ w naszej spoÅ‚ecznoÅ›ci od miesiÄ™cy. JesteÅ› teraz jednym z najbardziej aktywnych czytelników i masz realny wkÅ‚ad w tworzenie tej spoÅ‚ecznoÅ›ci. Możesz teraz dokonywać zmian kategorii i zmieniać nazwy tematów, wykorzystaj bardziej skuteczne oflagowania, dostÄ™p do obszaru prywatnego pokoju i możliwość dawania dużo wiÄ™kszej liczby polubieÅ„ na dzieÅ„. leader: name: Weteran - description: "Przyznano możliwość globalnej edycji, przypinania, zamykania, archiwizacji, podziaÅ‚u i scalania, wiÄ™cej lajków" - long_description: | - Ta odznaka jest przyznawana, gdy osiÄ…gniesz poziom zaufania 4. ObsÅ‚uga ocenia, że jesteÅ› liderem w tej spoÅ‚ecznoÅ›ci i dajesz dobry przykÅ‚ad reszcie spoÅ‚ecznoÅ›ci poprzez swoje akcje i wypowiedzi. Masz możliwość edycji wszystkich postów, dokonywania akcji zarezerwowanych dla moderatorów takich jak przypinanie, zamykanie, usuwanie z katalogu, archiwizowanie, rozdzielanie i łącznie, jak również otrzymujesz caÅ‚e tony polubieÅ„ do rozdania dziennie. welcome: name: Powitanie description: Otrzymano polubienie - long_description: | - Ta odznaka jest przyznawana, kiedy dostajesz pierwszego lajka przy poÅ›cie. Gratulacje, napisaÅ‚eÅ› coÅ›, co inni użytkownicy uznali za interesujÄ…ce, fajne lub użyteczne! autobiographer: name: Autobiograf anniversary: name: Rocznica description: "Aktywność przez rok, co najmniej jeden wpis" - long_description: | - Ta odznaka jest przyznawana w momencie, gdy jesteÅ› czÅ‚onkiem przynajmniej rok i napisaÅ‚eÅ› przynajmniej jeden post przez rok. DziÄ™kujemy, że z nami jesteÅ› i udzielasz siÄ™ w naszej spoÅ‚ecznoÅ›ci. Nie moglibyÅ›my funkcjonować bez ciebie. nice_post: name: MiÅ‚a odpowiedź description: Otrzymano 10 polubieÅ„ w odpowiedzi - long_description: | - Ta odznaka jest przyznawana, gdy uzyskasz 10 polubieÅ„ twojej odpowiedzi. Twoja odpowiedź zrobiÅ‚a wrażenie na spoÅ‚ecznoÅ›ci i pomogÅ‚a siÄ™ jej rozwinąć! good_post: name: Dobra odpowiedź description: Otrzymano 25 polubieÅ„ w odpowiedzi - long_description: | - Ta odznaka jest przyznawana, gdy uzyskasz 25 polubieÅ„ twojej odpowiedzi. Twoja odpowiedź byÅ‚a znakomita i sprawiÅ‚a, że caÅ‚a konwersacja staÅ‚a siÄ™ dla wszystkich lepsza! great_post: name: Åšwietna odpowiedź description: Otrzymano 50 polubieÅ„ w odpowiedzi - long_description: | - Ta odznaka jest przyznawana, gdy uzyskasz 50 polubieÅ„ twojej odpowiedzi. Twoja odpowiedź byÅ‚a inspirujÄ…ca, fascynujÄ…ca, zabawna lub wnikliwa i przede wszystkim podobaÅ‚a siÄ™ spoÅ‚ecznoÅ›ci. nice_topic: name: MiÅ‚y Temat description: Otrzymano 10 polubieÅ„ w temacie. - long_description: | - Ta odznaka jest przyznawana, gdy uzyskasz 10 polubieÅ„ twojej odpowiedzi. Hej, rozpoczÄ…Å‚eÅ› interesujÄ…cÄ… konwersacje, która podoba siÄ™ spoÅ‚ecznoÅ›ci! good_topic: name: Dobry Temat description: Otrzymano 25 polubieÅ„ w temacie. - long_description: | - Ta odznaka jest przyznawana, gdy uzyskasz 25 polubieÅ„. StworzyÅ‚eÅ› ekscytujÄ…cÄ… konwersacjÄ™, która spodobaÅ‚a siÄ™ spoÅ‚ecznoÅ›ci! great_topic: name: Åšwietny Temat description: Otrzymano 50 polubieÅ„ w temacie. - long_description: | - Ta odznaka jest przyznawana, gdy twój wÄ…tek otrzymaÅ‚ 50 polubieÅ„. RozpoczÄ…Å‚eÅ› fascynujÄ…cÄ… konwersacjÄ™, a spoÅ‚eczeÅ„stwu spodobaÅ‚a siÄ™ dynamiczna dyskusja, która z tego wynikÅ‚a. nice_share: name: MiÅ‚e udostÄ™pnienie description: "UdostÄ™pniono post z 25 unikalnymi odwiedzajÄ…cymi. " @@ -2497,13 +2396,9 @@ pl_PL: good_share: name: Dobre udostÄ™pnienie description: "UdostÄ™pniono post z 300 unikalnymi odwiedzajÄ…cymi. " - long_description: | - Ta odznaka jest przyznawana za udostÄ™pnienie linku, który zostaÅ‚ naciÅ›niÄ™ty przez co najmniej 300 osób. Dobra robota! PokazaÅ‚eÅ› jak wyglÄ…da prawdziwa dyskusja grupie nowych osób i wspomogÅ‚eÅ› rozrost tej spoÅ‚ecznoÅ›ci. great_share: name: Åšwietne udostÄ™pnienie description: "UdostÄ™pniono post z 1000 unikalnych odwiedzajÄ…cych. " - long_description: | - Ta odznaka jest przyznawana za udostÄ™pnienie linku, który zostaÅ‚ naciÅ›niÄ™ty przez co najmniej 1000 osób. Wow! DokonaÅ‚eÅ› promocji naprawdÄ™ interesujÄ…cej dyskusji w dużym gronie odbiorców i wspomogÅ‚eÅ› w istotny sposób rozrost naszej spoÅ‚ecznoÅ›ci! first_like: name: Pierwsze polubienie description: Polubiono wpis @@ -2512,21 +2407,15 @@ pl_PL: first_flag: name: Pierwsza flaga description: ZgÅ‚oszenie wpisu - long_description: | - Ta odznaka jest przyznawana, gdy po raz pierwszy oflagujesz post. Flagowanie to metoda, która pozwala na utrzymanie forum na jak najwyższym poziomie merytorycznym. JeÅ›li zobaczysz jakieÅ› posty, które wymagajÄ… uwagi moderatora z jakiegokolwiek powodu, nie wahaj siÄ™ aby oflagować tÄ… wiadomość. Możesz również oflagować, aby wysÅ‚ać prywatnÄ… wiadomość do innych użytkowników, jeÅ›li zauważysz problem z ich postem. JeÅ›li zauważysz problem :flag_black:, oflaguj go! promoter: name: Promotor description: Zaproszenie użytkownika campaigner: name: DziaÅ‚acz description: "Zaproszenie 3 użytkowników " - long_description: | - Ta odznaka jest przyznawana, gdy zaprosisz przynajmniej 3 osoby, które później spÄ™dzÄ… wystarczajÄ…co dużo czasu na stronie, aby zostać regularnymi użytkownikami. Å»yjÄ…ca spoÅ‚eczność potrzebuje regularnego wpÅ‚ywu nowych użytkowników, którzy regularnie udzielajÄ… siÄ™ na forum i przedstawiajÄ… swój nowy punkt widzenia w konwersacjach. champion: name: Mistrz description: Zaproszono 5 użytkowników - long_description: | - Ta odznaka jest przyznawana, gdy zaprosisz przynajmniej 5 osób, które nastÄ™pnie spÄ™dzÄ… wystarczajÄ…co dużo czasu, aby zostać peÅ‚noprawnymi użytkownikami. Wow! DziÄ™kujemy za rozszerzanie różnorodnoÅ›ci naszej spoÅ‚ecznoÅ›ci. first_share: name: Pierwsze udostÄ™pnienie description: UdostÄ™pniono wpis @@ -2540,9 +2429,6 @@ pl_PL: first_quote: name: Pierwszy cytat description: Zacytowano wpis - long_description: |+ - Ta odznaka jest przyznawana, kiedy po raz pierwszy cytujesz jakiÅ› post w swojej odpowiedzi. Cytowanie powiÄ…zanych fragmentów wczeÅ›niejszych postów w odpowiedziach pozwala na prowadzenie dyskusji na temat. - read_guidelines: name: Przeczytany przewodnik reader: @@ -2593,8 +2479,6 @@ pl_PL: crazy_in_love: name: SzaleÅ„czo zakochany description: Użyto 50 polubieÅ„ w dzieÅ„ 20 razy - long_description: | - Ta odznaka jest przyznawana, gdy wykorzystasz wszystkie 50 polubieÅ„ w 20 dni. Wow! JesteÅ› naprawdÄ™ regularnym użytkownikiem i starasz siÄ™ caÅ‚y czas zachÄ™cać osoby z twojej spoÅ‚ecznoÅ›ci! thank_you: name: DziÄ™kuje description: Ma 20 polubionych postów i daÅ‚ 10 polubieÅ„ @@ -2608,19 +2492,15 @@ pl_PL: empathetic: name: Empatyczny description: Ma 500 polubionych postów i daÅ‚ 1000 polubieÅ„ - long_description: | - Ta odznaka jest przyznawana, gdy masz co najmniej 500 polubionych postów i daÅ‚eÅ› w zamian 1000 lub wiÄ™cej polubieÅ„. Wow! JesteÅ› przykÅ‚adem hojnoÅ›ci i wzajemnego uznania :two_hearts:. first_emoji: name: Pierwszy Emoji description: Użyto Emoji w PoÅ›cie first_mention: name: Pierwsze Wspomnienie description: Wspomniano o użytkowniku w poÅ›cie - long_description: "Ta odznaka jest przyznawana, gdy po raz pierwszy wspomnisz o którymÅ› użytkowniku *nazwa użytkownika w swoim poÅ›cie. Każde wspomnienie powoduje wysÅ‚anie powiadomienia do tej osoby, tak aby wiedziaÅ‚ o twoim poÅ›cie. Po prostu rozpocznij pisanie od @(symbolu) aby wspomnieć o użytkowniku lub jeÅ›li można o grupie - jest to wygodny sposób, aby zwrócić czyjÄ…Å› uwagÄ™." first_onebox: name: Pierwszy Onebox description: Dodany link zostaÅ‚ poddany funkcji oneboxe - long_description: "Ta odznaka jest przyznawana, gdy po raz pierwszy umieÅ›cisz link w swoim poÅ›cie, który zostaÅ‚ automatycznie rozszerzony przez funkcjÄ™ onebox z krótkim podsumowaniem linku; tytuÅ‚ i (jeÅ›li dozwolone) zdjÄ™cie." first_reply_by_email: name: Pierwsza Odpowiedz przez Email description: OdpowiedziaÅ‚ na post poprzez email @@ -2650,7 +2530,6 @@ pl_PL: button: "Zarejestruj" title: "Zarejestrowano konto administratora" help: "zarejestruj nowe konto aby rozpocząć" - no_emails: "Niestety, żaden email administratora nie zostaÅ‚ okreÅ›lony podczas instalacji, wiÄ™c finalizacja konfiguracji może być trudna." confirm_email: title: "Potwierdzenie przez email" message: "

Wysłaliśmy email aktywacyjny na %{email}. Proszę postępować zgodnie z instrukcjami w emailu, tak aby dokonać aktywacji konta,

Jeśli email nie doszedł, upewnij się, że adres został ustawiony poprawnie i sprawdź folder spam w twojej skrzynce.

" @@ -2752,10 +2631,8 @@ pl_PL: fields: favicon_url: label: "MaÅ‚a ikona" - description: "Ikona obrazu używana, aby reprezentować twojÄ… stronÄ™ w przeglÄ…darkach internetowych. WyglÄ…da dobrze w maÅ‚ych rozmiarach jak na przykÅ‚ad 32px na 32px." apple_touch_icon_url: label: "Duża ikona" - description: "Ikona obrazu używana, aby reprezentować twojÄ… stronÄ™ na nowoczesnych urzÄ…dzeniach. WyglÄ…da dobrze w wiÄ™kszych rozmiarach jak na przykÅ‚ad 144px na 144px." homepage: description: "Polecamy wyÅ›wietlanie ostatnich tematów na twojej stronie domowej, ale jeÅ›li wolisz możesz również wyÅ›wietlić kategorie (grupy tematów) na stronie domowej." title: "Strona Główna" @@ -2764,8 +2641,6 @@ pl_PL: choices: latest: label: "Ostatnie Tematy" - categories: - label: "Kategorie" emoji: title: "Emotikony" description: "Który styl emoji preferujesz dla twojej spoÅ‚ecznoÅ›ci? Możesz dodać wiÄ™cej niestandardowym emoji poprzez Admin, Dostosuj, Emoji." diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 30a3b9f9c2..63912df65d 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -137,8 +137,8 @@ pt: reading_time: "Tempo de leitura" likes: "Gostos" too_many_replies: - one: Pedimos desculpa mas novos utilizadores estão temporariamente limitados a 1 resposta no mesmo tópico. - other: Pedimos desculpa mas novos utilizadores estão temporariamente limitados a %{count} respostas no mesmo tópico. + one: "Pedimos desculpa mas novos utilizadores estão temporariamente limitados a 1 resposta no mesmo tópico." + other: "Pedimos desculpa mas novos utilizadores estão temporariamente limitados a %{count} respostas no mesmo tópico." embed: start_discussion: "Iniciar Discussão" continue: "Continuar Discussão" @@ -146,35 +146,35 @@ pt: no_hosts: "Não foram configurados anfitriões para incorporar." configure: "Configurar Integração" more_replies: - one: mais 1 resposta - other: mais %{count} respostas + one: "mais 1 resposta" + other: "mais %{count} respostas" loading: "A carregar Discussão..." permalink: "Hiperligação Permanente" imported_from: "Este é um tópico de discussão de acompanhamento para a entrada original em %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 resposta - other: '%{count} respostas' + one: "1 resposta" + other: "%{count} respostas" no_mentions_allowed: "Pedimos desculpa, não pode mencionar outros utilizadores." too_many_mentions: - one: Pedimos desculpa, pode mencionar apenas 1 outro utilizador numa mensagem. - other: Pedimos desculpa, pode mencionar apenas %{count} outros utilizadores numa mensagem. + one: "Pedimos desculpa, pode mencionar apenas 1 outro utilizador numa mensagem." + other: "Pedimos desculpa, pode mencionar apenas %{count} outros utilizadores numa mensagem." no_mentions_allowed_newuser: "Pedimos desculpa, novos utilizadores não podem mencionar outros utilizadores." too_many_mentions_newuser: - one: Pedimos desculpa, novos utilizadores podem mencionar apenas 1 outro utilizador numa mensagem. - other: Pedimos desculpa, novos utilizadores podem mencionar apenas %{count} utilizadores numa mensagem. + one: "Pedimos desculpa, novos utilizadores podem mencionar apenas 1 outro utilizador numa mensagem." + other: "Pedimos desculpa, novos utilizadores podem mencionar apenas %{count} utilizadores numa mensagem." no_images_allowed: "Pedimos desculpa, novos utilizadores não podem colocar imagens nas mensagens." too_many_images: - one: Pedimos desculpa, novos utilizadores podem colocar apenas 1 imagem numa mensagem. - other: Pedimos desculpa, novos utilizadores podem colocar apenas %{count} imagens numa mensagem. + one: "Pedimos desculpa, novos utilizadores podem colocar apenas 1 imagem numa mensagem." + other: "Pedimos desculpa, novos utilizadores podem colocar apenas %{count} imagens numa mensagem." no_attachments_allowed: "Pedimos desculpa, novos utilizadores não podem colocar anexos nas mensagens." too_many_attachments: - one: Pedimos desculpa, novos utilizadores podem colocar apenas 1 anexo numa mensagem. - other: Pedimos desculpa, novos utilizadores podem colocar apenas %{count} anexos numa mensagem. + one: "Pedimos desculpa, novos utilizadores podem colocar apenas 1 anexo numa mensagem." + other: "Pedimos desculpa, novos utilizadores podem colocar apenas %{count} anexos numa mensagem." no_links_allowed: "Pedimos desculpa, novos utilizadores não podem colocar hiperligações nas mensagens." too_many_links: - one: Pedimos desculpa, novos utilizadores podem colocar apenas 1 hiperligação numa mensagem. - other: Pedimos desculpa, novos utilizadores podem colocar apenas %{count} hiperligações numa mensagem. + one: "Pedimos desculpa, novos utilizadores podem colocar apenas 1 hiperligação numa mensagem." + other: "Pedimos desculpa, novos utilizadores podem colocar apenas %{count} hiperligações numa mensagem." spamming_host: "Pedimos desculpa, não pode colocar uma hiperligação para esse servidor." user_is_suspended: "Utilizadores suspensos não têm permissão para publicar." topic_not_found: "Algo de errado ocorreu. Talvez este tópico tenha sido fechado ou eliminado enquanto olhava para ele?" @@ -238,8 +238,8 @@ pt: title: "Pedido de Adesão para @%{group_name}" education: until_posts: - one: 1 mensagem - other: '%{count} mensagens' + one: "1 mensagem" + other: "%{count} mensagens" 'new-topic': | Bem-vindo a %{site_name} — **obrigado por começar uma nova conversação!** @@ -328,28 +328,6 @@ pt: title: "Bem-vindo ao Discourse" lounge_welcome: title: "Bem-vindo ao Salão" - body: |2+ - - Parabéns! :confetti_ball: - - Se consegue ver este tópico, então é porque foi recentemente promovido a **habitual** (Nível de Confiança 3). - - Pode agora … - - * Editar o título de qualquer tópico - * Modificar a categoria de qualquer tópico - * Ter todas as suas hiperligações a serem seguidas ([nãoseguimento automático](http://en.wikipedia.org/wiki/Nofollow) é removido) - * Aceder a um salão privado de categorias, apenas visível a utilizadores com Nível de Confiança 3 ou superior - * Esconder spam com uma única sinalização - - Aqui está a [lista actual de membros habituais](/badges/3/regular). Certifique-se que diz olá. - - Obrigado por ser uma parte importante na nossa comunidade! - - (Para mais informação acerca dos Níveis de Confiança, [veja este tópico][confiança]. Por favor tenha conhecimento que apenas membros que continuam a corresponder aos requisitos ao longo do tempo, irão manter-se habituais.) - - [confiança]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 - category: topic_prefix: "Acerca da categoria %{category}" replace_paragraph: "(Substitua este primeiro parágrafo com uma breve descrição da sua nova categoria. Este guia irá aparecer na área de seleção da categoria, por isso tente mantê-lo abaixo dos 200 caracteres. **Até editar esta descrição ou criar tópicos, esta categoria não irá aparecer na página das categorias.**)" @@ -364,9 +342,6 @@ pt: cannot_delete: uncategorized: "Não é possível eliminar Sem Categoria" has_subcategories: "Não é possível eliminar esta categoria porque contém sub-categorias." - topic_exists: - one: Não é possível eliminar esta categoria porque contém 1 tópico. O tópico mais antigo é %{topic_link}. - other: Não é possível eliminar esta categoria porque contém %{count} tópicos. O tópico mais antigo é %{topic_link}. topic_exists_no_oldest: "Não é possível eliminar esta categoria porque a contagem de tópicos é de %{count}." uncategorized_description: "Tópicos que não precisam de uma categoria ou que não se encaixam em nenhuma outra categoria existente." trust_levels: @@ -383,85 +358,85 @@ pt: change_failed_explanation: "Tentou despromover %{user_name} para '%{new_trust_level}'. Contudo o Nível de Confiança é atualmente '%{current_trust_level}'. %{user_name} irá permanecer em '%{current_trust_level}' - se deseja despromover o utilizador, bloqueie o Nível de Confiança primeiro" rate_limiter: hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" minutes: - one: 1 minuto - other: '%{count} minutos' + one: "1 minuto" + other: "%{count} minutos" seconds: - one: 1 segundo - other: '%{count} segundos' + one: "1 segundo" + other: "%{count} segundos" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mês - other: '%{count}mês' + one: "1mês" + other: "%{count}mês" x_months: - one: 1mês - other: '%{count}mês' + one: "1mês" + other: "%{count}mês" about_x_years: - one: 1ano - other: '%{count}anos' + one: "1ano" + other: "%{count}anos" over_x_years: - one: '> 1ano' - other: '> %{count}anos' + one: "> 1ano" + other: "> %{count}anos" almost_x_years: - one: 1ano - other: '%{count}anos' + one: "1ano" + other: "%{count}anos" distance_in_words_verbose: half_a_minute: "mesmo agora" less_than_x_seconds: - one: mesmo agora - other: mesmo agora + one: "mesmo agora" + other: "mesmo agora" x_seconds: - one: 1 segundo atrás - other: '%{count} segundos atrás' + one: "1 segundo atrás" + other: "%{count} segundos atrás" less_than_x_minutes: - one: menos de 1 minuto atrás - other: menos de %{count} minutos atrás + one: "menos de 1 minuto atrás" + other: "menos de %{count} minutos atrás" x_minutes: - one: 1 minuto atrás - other: '%{count} minutos atrás' + one: "1 minuto atrás" + other: "%{count} minutos atrás" about_x_hours: - one: 1 hora atrás - other: '%{count} horas atrás' + one: "1 hora atrás" + other: "%{count} horas atrás" x_days: - one: 1 dia atrás - other: '%{count} dias atrás' + one: "1 dia atrás" + other: "%{count} dias atrás" about_x_months: - one: há cerca de 1 mês atrás - other: há cerca de %{count} meses atrás + one: "há cerca de 1 mês atrás" + other: "há cerca de %{count} meses atrás" x_months: - one: 1 mês atrás - other: '%{count} meses atrás' + one: "1 mês atrás" + other: "%{count} meses atrás" about_x_years: - one: há cerca de 1 ano atrás - other: há cerca %{count} anos atrás + one: "há cerca de 1 ano atrás" + other: "há cerca %{count} anos atrás" over_x_years: - one: há mais de 1 ano atrás - other: há mais de %{count} anos atrás + one: "há mais de 1 ano atrás" + other: "há mais de %{count} anos atrás" almost_x_years: - one: há quase 1 ano atrás - other: há quase %{count} anos atrás + one: "há quase 1 ano atrás" + other: "há quase %{count} anos atrás" password_reset: no_token: "Desculpe, essa hiperligação para alterar a palavra-passe é muito antiga. Selecione o botão Iniciar Sessão e utilize 'Esqueci a minha palavra-passe' para obter uma nova hiperligação." choose_new: "Escolha uma nova palavra-passe" @@ -534,14 +509,8 @@ pt: description: 'Gostar desta mensagem' short_description: 'Gostar desta publicação' long_form: 'gostou disto' - vote: - title: 'Votar' - description: 'Votar nesta mensagem' - short_description: 'Vote para esta publicação' - long_form: 'votou nesta mensagem' user_activity: no_bookmarks: - self: "Não tem publicações marcadas, marcar publicações permite-lhe aceder-lhes facilmente mais tarde." others: "Sem marcadores." no_likes_given: self: "Ainda não gostou de nenhuma publicação." @@ -675,8 +644,6 @@ pt: num_users: "Utilizadores" top_referred_topics: title: "Os Melhores Tópicos Referenciados" - xaxis: "Tópico" - num_clicks: "Cliques" page_view_anon_reqs: title: "Anónimo" xaxis: "Dia" @@ -733,7 +700,6 @@ pt: xaxis: "Dia" yaxis: "Total" mobile_visits: - title: "Visitas de Utilizadores" xaxis: "Dia" yaxis: "Número de visitas" dashboard: @@ -751,8 +717,8 @@ pt: failing_emails_warning: 'Há %{num_failed_jobs} tarefas de email que falharam. Verifique o seu app.yml e assegure-se que as configurações do servidor de email estão corretas. Veja as tarefas que falharam no Sidekiq.' subfolder_ends_in_slash: "A configuração da sua sub-página está incorreta; o DISCOURSE_RELATIVE_URL_ROOT termina com um traço." email_polling_errored_recently: - one: A consulta automática de emails gerou um erro nas últimas 24 horas. Consulte em os registos para mais detalhes. - other: A consulta automática de emails gerou %{count} erros nas últimas 24 horas. Consulte em os registos para mais detalhes. + one: "A consulta automática de emails gerou um erro nas últimas 24 horas. Consulte em os registos para mais detalhes." + other: "A consulta automática de emails gerou %{count} erros nas últimas 24 horas. Consulte em os registos para mais detalhes." bad_favicon_url: "Não estamos a conseguir carregar o favicon. Por favor, confirme a sua configuração favicon_url nas Configurações do sítio." poll_pop3_timeout: "A tentativa de ligação ao servidor POP3 está a ultrapassar o tempo máximo. O email da caixa de entrada não pôde ser obtido. Por favor verifique a sua configuração de POP3 e fornecedor de serviço internet." poll_pop3_auth_error: "A tentativa de ligação ao servidor POP3 está a falhar por motivos de erro de autenticação. Por favor verifique a sua configuração de POP3." @@ -843,7 +809,6 @@ pt: post_menu: "Determine que itens irão aparecer no menu de mensagens, e em que ordem. Exemplo\ngostar|editar|sinalizar|eliminar|partilhar|marcar|responder" post_menu_hidden_items: "Os elementos do menu a serem escondidos por defeito no menu de mensagens a não ser que se clique na elipse de expansão." share_links: "Determinar que elementos aparecem no diálogo de partilha, e em que ordem." - track_external_right_clicks: "Acompanhar cliques externos que são clicados com o botão direito (ex: abrir num novo separador) desativado por padrão pois este reescreve URLs" site_contact_username: "Um nome de utilizador válido de um membro do pessoal de onde enviar todas as mensagens automatizadas. Quando deixado em branco, a conta padrão do Sistema será usada." send_welcome_message: "Enviar a todos os novos utilizadores uma mensagem de boas-vindas com um guia de início rápido." suppress_reply_directly_below: "Não mostrar a contagem de respostas expansível quando há apenas uma única resposta diretamente abaixo desta publicação." @@ -1035,7 +1000,6 @@ pt: reply_by_email_enabled: "Ativar respostas aos tópicos por email." reply_by_email_address: "Modelo para endereços emails recebidos com função resposta por email, por exemplo: %{reply_key}@resposta.exemplo.com ou resposta+%{reply_key}@exemplo.com" alternative_reply_by_email_addresses: "Lista de modelos alternativos para respostas via email. Exemplo: %{reply_key}@resposta.exemplo.com ou resposta+%{reply_key}@exemplo.com" - disable_emails: "Impedir que Discourse envie qualquer tipo de emails" strip_images_from_short_emails: "Remover imagens de emails cujo tamanho seja inferior a 2800 Bytes" short_email_length: "Comprimento de email curto, em Bytes" display_name_on_email_from: "Exibir nomes completos em campos do formulário de email" @@ -1077,7 +1041,6 @@ pt: delete_user_max_post_age: "Não permitir eliminação de utilizadores cuja primeira mensagem é mais antiga que (x) dias." delete_all_posts_max: "Número máximo de mensagens que podem ser eliminadas de uma única vez com o botão Eliminar Todas as Mensagens. Se um utilizador tem mais mensagens do que este número, estas não podem ser eliminadas de uma única vez e o utilizador não pode ser eliminado." email_editable: "Permitir que os utilizadores alterem o seu endereço de email após o registo." - logout_redirect: "Localização de redireccionamento do navegador após encerramento da sessão. EX: (http://somesite.com/logout)" allow_uploaded_avatars: "Permitir que os utilizadores carreguem fotografias de perfil personalizadas." allow_animated_avatars: "Permitir que os utilizadores utilizem fotografias de perfil com gifs animados. AVISO: executar avatars:atualizar após mudança desta configuração." allow_animated_thumbnails: "Gera miniaturas de imagens ou gifs animados." @@ -1226,50 +1189,47 @@ pt: not_seen_in_a_month: "Bem-vindo novamente! Não o vemos há algum tempo. Estes são os tópicos mais populares desde que esteve ausente." merge_posts: edit_reason: - one: Uma publicação foi unida por %{username} - other: '%{count} publicações foram unidas por %{username}' + one: "Uma publicação foi unida por %{username}" + other: "%{count} publicações foram unidas por %{username}" errors: different_topics: "Publicações pertencentes a tópicos diferentes não podem ser unidas." different_users: "Publicações pertencentes a utilizadores diferentes não podem ser unidas." move_posts: new_topic_moderator_post: - one: 'Uma mensagem foi dividida em um novo tópico: %{topic_link}' - other: '%{count} mensagens foram divididas em um novo tópico: %{topic_link}' + one: "Uma mensagem foi dividida em um novo tópico: %{topic_link}" + other: "%{count} mensagens foram divididas em um novo tópico: %{topic_link}" existing_topic_moderator_post: - one: 'Uma mensagem foi unida em um tópico existente: %{topic_link}' - other: '%{count} mensagens foram unidas em um tópico existente: %{topic_link}' - change_owner: - post_revision_text: "Direito de posse transferido de %{old_user} para %{new_user}" - deleted_user: "um utilizador eliminado" + one: "Uma mensagem foi unida em um tópico existente: %{topic_link}" + other: "%{count} mensagens foram unidas em um tópico existente: %{topic_link}" topic_statuses: archived_enabled: "Este tópico está agora arquivado. Está congelado e não pode ser alterado de qualquer maneira." archived_disabled: "Este tópico foi agora desarquivado. Já não está congelado, e pode ser alterado." closed_enabled: "Este tópico está agora fechado. Novas respostas não são aceites." closed_disabled: "Este tópico está agora aberto. Novas respostas serão aceites." autoclosed_message_max_posts: - one: Esta mensagem foi automaticamente fechada após atingir o limite máximo de 1 resposta. - other: Esta mensagem foi automaticamente fechada após atingir o limite máximo de %{count} respostas. + one: "Esta mensagem foi automaticamente fechada após atingir o limite máximo de 1 resposta." + other: "Esta mensagem foi automaticamente fechada após atingir o limite máximo de %{count} respostas." autoclosed_topic_max_posts: - one: Este tópico foi automaticamente fechado após atingir o limite máximo de 1 resposta. - other: Este tópico foi automaticamente fechado após atingir o limite máximo de %{count} respostas. + one: "Este tópico foi automaticamente fechado após atingir o limite máximo de 1 resposta." + other: "Este tópico foi automaticamente fechado após atingir o limite máximo de %{count} respostas." autoclosed_enabled_days: - one: Este tópico foi automaticamente encerrado após 1 dia. Novas respostas não são permitidas. - other: Este tópico foi automaticamente encerrado após %{count} dias. Novas respostas não são permitidas. + one: "Este tópico foi automaticamente encerrado após 1 dia. Novas respostas não são permitidas." + other: "Este tópico foi automaticamente encerrado após %{count} dias. Novas respostas não são permitidas." autoclosed_enabled_hours: - one: Este tópico foi automaticamente encerrado após 1 hora. Novas respostas não são permitidas. - other: Este tópico foi automaticamente encerrado após %{count} horas. Novas respostas não são permitidas. + one: "Este tópico foi automaticamente encerrado após 1 hora. Novas respostas não são permitidas." + other: "Este tópico foi automaticamente encerrado após %{count} horas. Novas respostas não são permitidas." autoclosed_enabled_minutes: - one: Este tópico foi automaticamente fechado após 1 minuto. Novas respostas não são permitidas. - other: Este tópico foi automaticamente fechado após %{count} minutos. Novas respostas não são permitidas. + one: "Este tópico foi automaticamente fechado após 1 minuto. Novas respostas não são permitidas." + other: "Este tópico foi automaticamente fechado após %{count} minutos. Novas respostas não são permitidas." autoclosed_enabled_lastpost_days: - one: Este tópico foi automaticamente fechado 1 dia após a última resposta. Novas respostas não são permitidas. - other: Este tópico foi automaticamente fechado %{count} dias após a última resposta. Novas respostas não são permitidas. + one: "Este tópico foi automaticamente fechado 1 dia após a última resposta. Novas respostas não são permitidas." + other: "Este tópico foi automaticamente fechado %{count} dias após a última resposta. Novas respostas não são permitidas." autoclosed_enabled_lastpost_hours: - one: Este tópico foi automaticamente fechado 1 hora após a última resposta. Novas respostas não são permitidas. - other: Este tópico foi automaticamente fechado %{count} horas após a última resposta. Novas respostas não são permitidas. + one: "Este tópico foi automaticamente fechado 1 hora após a última resposta. Novas respostas não são permitidas." + other: "Este tópico foi automaticamente fechado %{count} horas após a última resposta. Novas respostas não são permitidas." autoclosed_enabled_lastpost_minutes: - one: Este tópico foi automaticamente fechado 1 minuto após a última resposta. Novas respostas não são permitidas. - other: Este tópico foi automaticamente fechado %{count} minutos após a última resposta. Novas respostas não são permitidas. + one: "Este tópico foi automaticamente fechado 1 minuto após a última resposta. Novas respostas não são permitidas." + other: "Este tópico foi automaticamente fechado %{count} minutos após a última resposta. Novas respostas não são permitidas." autoclosed_disabled: "Este tópico está aberto agora. Novas respostas são permitidas." autoclosed_disabled_lastpost: "Este tópico está agora aberto. Novas respostas são permitidas." pinned_enabled: "Este tópico está agora fixado. Irá aparecer no topo da sua categoria até ser desafixado pelo pessoal para todas as pessoas, ou por utilizadores individuais para si próprios." @@ -1301,7 +1261,6 @@ pt: missing_user_field: "Não completou todos os campos de utilizador." already_logged_in: "Oops, parece que tentou aceitar um convite para outro utilizador. Se não é o %{current_user}, por favor saia e tente novamente." user: - no_accounts_associated: "Sem contas associadas" deactivated: "Conta desactivada devido a demasiados emails redirecionados para '%{email}'." username: short: "deve ter pelo menos %{min} caracteres" @@ -1321,8 +1280,8 @@ pt: max_new_accounts_per_registration_ip: "Novos registos não são permitidos a partir do seu endereço IP (limite máximo atingido).Contacte um membro do pessoal." flags_reminder: subject_template: - one: 1 sinalização à espera de ser tratada - other: '%{count} sinalizações à espera de serem tratadas' + one: "1 sinalização à espera de ser tratada" + other: "%{count} sinalizações à espera de serem tratadas" unsubscribe_mailer: subject_template: "Confirme que não quer receber emails com actualizações de %{site_title}" invite_password_instructions: @@ -1480,8 +1439,8 @@ pt: subject_template: "Nova conta suspensa" pending_users_reminder: subject_template: - one: 1 utilizador espera a aprovação - other: '%{count} utilizadores esperam a aprovação' + one: "1 utilizador espera a aprovação" + other: "%{count} utilizadores esperam a aprovação" text_body_template: | Há registos de novos utilizadores à espera de serem aprovados (ou rejeitados) antes de poderem aceder a este fórum. @@ -1513,10 +1472,8 @@ pt: title: "Cancelar a Subscrição" description: "Não está interessado em receber estes emails? Não há problema! Clique em baixo para cancelar a subscrição instantaneamente:" reply_by_email: "[Visitar Tópico](%{base_url}%{url}) ou responda a este email para responder." - reply_by_email_pm: "[Visitar Mensagem](%{base_url}%{url}) ou responda a este email para responder." only_reply_by_email: "Responda a este email para responder." visit_link_to_respond: "[Visitar Tópico](%{base_url}%{url}) para responder." - visit_link_to_respond_pm: "[Visitar Mensagem](%{base_url}%{url}) para responder." posted_by: "Publicado por %{username} em %{post_date}" user_invited_to_private_message_pm: text_body_template: | @@ -1657,7 +1614,6 @@ pt: recent_topics: "Recente" see_more: "Mais" search_title: "Pesquisar neste sítio" - search_google: "Google" terms_of_service: title: "Termos de Serviço" signup_form_message: 'Li e aceito os Termos de Serviço.' @@ -1678,25 +1634,6 @@ pt: flag_reason: sockpuppet: "Um novo utilizador criou um tópico, no qual um outro novo utilizador com o mesmo IP (%{ip_address}) respondeu. Veja as configurações de `flag_sockpuppets` nas configurações do sítio." spam_hosts: "Este novo utilizador tentou criar múltiplas publicações com ligações ao mesmo domínio (%{domain}). Verifique as configurações do sítio de `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "O utilizador do publicação foi eliminado." - no_user: "Não foi possível encontrar o utilizador com o id %{user_id}" - anonymous_user: "Utilizador é anónimo" - suspended_not_pm: "O utilizador está suspenso, sem mensagens" - seen_recently: "O utilizador foi visto recentemente" - post_not_found: "Não foi possível encontrar a mensagem com o id %{post_id}" - notification_already_read: "A notificação sobre o qual este email se trata já foi lida" - topic_nil: "post.topic está vazio" - post_deleted: "a mensagem foi eliminada pelo autor" - user_suspended: "o utilizador foi suspenso" - already_read: "o utilizador já leu esta mensagem" - exceeded_emails_limit: "Excedeu max_emails_per_day_per_user" - exceeded_bounces_limit: "Ultrapassou bounce_score_threshold" - message_blank: "a mensagem está em branco" - message_to_blank: "message.to está em branco" - text_part_body_blank: "text_part.body está em branco" - body_blank: "corpo está em branco" - no_echo_mailing_list_mode: "Notificações via lista de distribuição desativadas para as publicações do próprio utilizador " color_schemes: base_theme_name: "Base" about: "Sobre" @@ -1800,71 +1737,40 @@ pt: editor: name: Editor description: Primeira edição de publicação - long_description: | - Este distintivo é concedido pela primeira vez que edita uma das suas publicações. Apesar de não ser possível editar as suas publicações após um tempo limite, editar é sempre uma boa ideia - pode melhorar as suas publicações, corrigir pequenos erros, ou acrescentar algo que tenha esquecido quando criou a sua publicação. Edite para tornar as suas publicações ainda melhores! basic_user: name: Básico - description: "Atribuídas todas as funções comunitárias essenciais" - long_description: | - Este distintivo é concedido quando atinge o nível de confiança 1. Obrigado por ficar por cá durante algum tempo e por ler alguns tópicos para aprender do que trata a nossa comunidade. As suas restrições de novo utilizador foram removidas, e foram-lhe atribuídas habilidades essenciais da comunidade, tais como mensagens pessoais, denúncias, edição de wikis, e a habilidade de publicar múltiplas imagens e ligações. member: name: Membro - description: "Concedido convites, mensagens de grupo, mais gostos" - long_description: | - Este distintivo é concedido quando atinge o nível de confiança 2. Obrigado por participar durante um período de semanas para se juntar à nossa comunidade. Agora pode enviar convites pessoais da sua página de utilizador ou tópicos individuais, criar mensagens de grupo, e mais alguns gostos por dia! regular: name: Regular - description: "Concedido re-categorização, renomeação, wiki, ligações seguidas, mais gostos" - long_description: | - Este distintivo é concedido quando atingir o nível de confiança 3. Obrigado por ser uma parte regular da nossa comunidade por um período de meses. É de momento um dos leitores mais activos, que contribui regularmente para tornar esta comunidade excelente. Agora pode re-categorizar e renomear tópicos, aceder à área privada do salão, tomar partido de denúncias de spam mais poderosas, e muitos mais gostos por dia. leader: name: Líder - description: "Concedido edição global, afixar, fechar, arquivar, separar e unir, mais gostos" - long_description: | - Este distintivo é concedido quando atinge o nível de confiança 4. É um líder nesta comunidade, como tal seleccionado pela equipa de apoio, e define um exemplo positivo para a comunidade nos seus actos e palavras. Tem a habilidade de editar todas as publicações, realizar acções de moderador de tópicos comuns tais como afixar, fechar, arquivar, separar e unir, e toneladas de gostos por dia. welcome: name: Bem-vindo description: Recebeu um gosto - long_description: | - Este distintivo é concedido quando recebe o seu primeiro gosto numa publicação. Parabéns, publicou algo que os colegas membros da comunidade acham interessante, giro, ou útil! autobiographer: name: Autobiógrafo anniversary: name: Aniversário description: "Membro ativo há um ano, publicou pelo menos uma vez" - long_description: | - Este distintivo é concedido quando tiver sido membro por um ano com pelo menos uma mensagem nesse ano. Obrigado por ficar por cá e por contribuir para a nossa comunidade. Não o podíamos fazer sem você. nice_post: name: Boa Resposta description: Recebeu 10 gostos numa resposta - long_description: | - Este distintivo é concedido ao criar uma resposta que obtém 10 gostos. A sua resposta realmente causou uma boa impressão na comunidade e ajudou a conversa a seguir a frente! good_post: name: Boa Resposta description: Recebeu 25 gostos numa resposta - long_description: | - Este distintivo é concedido ao criar uma resposta que obtém 25 gostos. A sua resposta foi excepcional e tornou a discussão muito melhor para todos! great_post: name: Excelente Resposta description: Recebeu 50 gostos numa resposta - long_description: | - Este distintivo é concedido ao criar uma mensagem que obtém 50 gostos. Uau! A sua resposta foi inspiradora, fascinante, hilariante, ou perspicaz e a comunidade adorou. nice_topic: name: Bom Tópico description: Recebeu 10 gostos num tópico - long_description: | - Este distintivo é concedido ao criar um tópico que obtém 10 gostos. Hey, iniciou uma discussão interessante que a comunidade gostou! good_topic: name: Ótimo Tópico description: Recebeu 25 gostos num tópico - long_description: |+ - Este distintivo é concedido ao criar um tópico que obtém 25 gostos. Iniciou uma discussão vibrante em torno da qual a comunidade se juntou e amou! - great_topic: name: Excelente Tópico description: Recebeu 50 gostos num tópico - long_description: | - Este distintivo é concedido ao criar uma resposta que obtém 50 gostos. Uau! Iniciou uma discussão fascinante e a comunidade adorou a dinâmica da discussão que daí resultou! nice_share: name: Boa Partilha description: Partilhou uma publicação com 25 visitantes únicos @@ -1873,13 +1779,9 @@ pt: good_share: name: Ótima Partilha description: Partilhou uma publicação com 300 visitantes únicos - long_description: | - Este distintivo é concedido por partilhar uma ligação que foi clicada por 300 visitantes externos. Bom trabalho! Mostrou uma discussão interessante a um monte de pessoas novas e ajudou esta comunidade a crescer. great_share: name: Excelente Partilha description: Partilhou uma publicação com 1000 visitantes únicos - long_description: | - Este distintivo é concedido por partilhar uma ligação que foi clicada por 1000 visitantes externos. Uau! Promoveu uma discussão interessante junto de uma enorme nova audiência para esta comunidade, e ajudou-nos a crescer esta comunidade em grande! first_like: name: Primeiro Gosto description: Gostou de uma publicação @@ -1888,21 +1790,15 @@ pt: first_flag: name: Primeira Denúncia description: Denunciou uma publicação - long_description: | - Este distintivo é concedido pela primeira vez que denuncia uma publicação. Denunciar ajuda a manter isto um sítio limpo, bem mantido para todos. Se reparar nalguma publicação que necessite de atenção da moderação por favor não hesite em denunciá-la. Pode também denúncias para enviar mensagens pessoais para colegas utilizadores se notar algum problema com publicações deles. Se vir um problema, :flag_black: denuncio-o! promoter: name: Promotor description: Convidou um utilizador campaigner: name: Ativista description: Convidou 3 utilizadores básicos - long_description: | - Este distintivo é concedido quando tiver convidado 3 pessoas que subsequentemente tenham passado tempo suficiente no site para se tornarem utilizadores básicos. Uma comunidade vibrante precisa de uma infusão regular de novos utilizadores que participem regularmente e adicionem novas vozes à conversa. champion: name: Campeão description: Convidou 5 membros - long_description: | - Este distintivo é concedido quando tiver convidado 5 pessoas que subsequentemente tenham passado tempo suficiente no site para se tornarem utilizadores completos. Uau! Obrigado por expandir a diversidade da nossa comunidade com novos membros! first_share: name: Primeira Partilha description: Partilhou uma publicação @@ -1916,8 +1812,6 @@ pt: first_quote: name: Primeira Citação description: Citou uma publicação - long_description: | - Este distintivo é concedido pela primeira vez que cita uma publicação numa resposta sua. Citar secções relevantes de publicações anteriores na sua resposta ajuda a manter as discussões coesas e focadas. Cite generosamente! read_guidelines: name: Ler Orientações reader: @@ -1968,8 +1862,6 @@ pt: crazy_in_love: name: Amando Loucamente description: Utilizou 50 gostos num dia 20 vezes - long_description: | - Este distintivo é concedido quando utiliza todos os seus 50 gostos diários durante 20 dias. Uau! É um modelo do encorajamento diário dos seus colegas na comunidade! thank_you: name: Obrigado description: Tem 20 publicações gostadas e deu 10 gostos @@ -1983,18 +1875,14 @@ pt: empathetic: name: Empático description: Tem 500 publicações gostadas e deu 1000 gostos - long_description: | - Este distintivo é concedido quando tem 500 publicações gostadas e deu 1000 ou mais gostos de volta. Uau! Você é um modelo da generosidade e apreciação mútua :two_hearts:. first_emoji: name: Primeiro Emoji description: Usou um Emoji numa Publicação first_mention: name: Primeira Menção - long_description: "Este distintivo é concedido pela primeira vez que menciona o @nome-de-utilizador de alguém numa publicação sua. Cada menção gera uma notificação para o mencionado, de maneira a que saibam da sua publicação. Simplesmente comece por escrever @ (símbolo arroba) para mencionar qualquer utilizador, ou, se permitido, um grupo – é uma maneira conveniente de chamar a atenção de alguém." first_onebox: name: Primeira Pré-visualização description: Publicou uma ligação que foi pré-visualizada - long_description: "Este distintivo é concedido pela primeira vez que publica uma ligação numa linha por si próprio, que foi então automaticamente expandido numa pré-visualização com um breve sumário da ligação, um titulo, e (quando disponível) uma imagem." first_reply_by_email: name: Primeira Resposta por Email long_description: | @@ -2017,7 +1905,6 @@ pt: button: "Registar" title: "Registar Conta de Administração" help: "registe uma conta nova para começar" - no_emails: "Infelizmente, nenhuns emails de administrador foram definidos durante a configuração inicial, por isso finalizar a configuração poderá ser difícil." confirm_email: title: "Confirme o seu Email" message: "

Enviámos um email de ativação para %{email}. Por favor siga as instruções no email para ativar a sua conta.

Se não receber o email, verifique que configurou correctamente o email no Discourse e verifique a sua pasta de spam.

" @@ -2113,10 +2000,8 @@ pt: fields: favicon_url: label: "Ãcone Pequeno" - description: "Imagem do ícone usado para representar o seu sítio em navegadores da internet que têm bom aspecto em tamanhos pequenos como 32px por 32px." apple_touch_icon_url: label: "Ãcone Grande" - description: "Imagem do ícone usado para representar o seu sítio em navegadores da internet que têm bom aspecto em tamanhos grandes como 144px por 144px." homepage: title: "Página de início" fields: @@ -2124,8 +2009,6 @@ pt: choices: latest: label: "Tópicos recentes" - categories: - label: "Categorias" emoji: title: "Emoji" invites: diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index b8b7b423a6..5c8b246457 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -27,24 +27,50 @@ pt_BR: topics: "Tópicos" posts: "mensagens" loading: "Carregando" + powered_by_html: 'Desenvolvido porDiscurso, melhor visualizado com JavaScript habilitado' log_in: "Entrar" + submit: "Enviar" purge_reason: "Automaticamente eliminada por ser uma conta abandonada, não ativada" disable_remote_images_download_reason: "Download de imagens remotas foi desativado porque não havia espaço suficiente em disco disponível." anonymous: "Anônimo" remove_posts_deleted_by_author: "Deletado pelo autor" + redirect_warning: "Não foi possível confirmar se o link selecionado foi publicado no fórum. Se você deseja continuar mesmo assim, selecione o link abaixo." themes: + bad_color_scheme: "Não é possível atualizar o tema, esquema de cores inválido" other_error: "Algo de errado aconteceu ao atualizar o tema" + error_importing: "Erro ao clonar o repositório git, o acesso foi negado ou o repositório não foi encontrado" + settings_errors: + invalid_yaml: "O YAML fornecido é inválido." + data_type_not_a_number: "Definindo`%{name}` tipo não é suportado. Tipos suportados são `integer`,` bool`, `list` e` enum`" + name_too_long: "Aqui está uma configuração com um nome muito longo. Comprimento máximo é de 255" + default_value_missing: "Definindo `%{name}` não tem valor padrão" + default_not_match_type: "Definindo `%{name}` o tipo de valor padrão não corresponde ao tipo de configuração." + default_out_range: "Definindo `%{name}` o valor padrão não está no intervalo especificado." + enum_value_not_valid: "O valor selecionado não é uma das opções de enumeração." + number_value_not_valid: "O novo valor não está dentro do intervalo permitido." + number_value_not_valid_min_max: "Deve estar entre %{min}e %{max}." + number_value_not_valid_min: "Deve ser maior ou igual a%{min}." + number_value_not_valid_max: "Deve ser menor ou igual a%{max}." + string_value_not_valid: "O novo valor não está dentro do intervalo permitido." + string_value_not_valid_min_max: "Deve estar entre%{min} e %{max}character long." + string_value_not_valid_min: "Deve ser pelo menos%{min} characters long." + string_value_not_valid_max: "Deve ser no máximo%{max} characters long." emails: incoming: default_subject: "Este tópico precisa de um título" show_trimmed_content: "Exibir conteúdo abreviado" maximum_staged_user_per_email_reached: "Atingido número máximo de usuários de teste criados por email." + no_subject: "(sem assunto)" + no_body: "(sem corpo)" errors: empty_email_error: "Ocorre quando o email bruto recebido estiver em branco." no_message_id_error: "Ocorre quando o email não possui cabeçalho 'id-mensagem'." auto_generated_email_error: "Ocorre quando o cabeçalho 'precedência' estiver definido como: lista, lixo eletrônico, lote ou resposta_automática, ou quando outro cabeçalho contiver: enviado_automaticamente, respondido_automaticamente ou gerado_automaticamente." no_body_detected_error: "Ocorre quando não conseguimos extrair um corpo e não há anexos." + no_sender_detected_error: "Acontece quando não conseguimos encontrar um endereço de e-mail válido no cabeçalho \"De\"." + from_reply_by_address_error: "Acontece quando o cabeçalho De corresponde à resposta por endereço de e-mail." inactive_user_error: "Ocorre quando o remetente não está ativo." + silenced_user_error: "Acontece quando o remetente foi silenciado." bad_destination_address: "Ocorre quando nenhum dos endereços de email nos campos Para/Cc/Cco era correspondente ao endereço de email recebido." strangers_not_allowed_error: "Ocorre quando um usuário tentou criar um novo tópico em uma categoria da qual não é membro." insufficient_trust_level_error: "Ocorre quando um usuário tenta criar um novo tópico em uma categoria onde não possui nível de confiança necessário." @@ -53,9 +79,12 @@ pt_BR: topic_closed_error: "Ocorre quando uma resposta foi enviada mas o tópico relacionado foi fechado." bounced_email_error: "O e-mail é um relatório de e-mail devolvido." screened_email_error: "Acontece quando o endereço de e-mail do remetente já foi examinado." + unsubscribe_not_allowed: "Acontece quando cancelar a inscrição por e-mail não é permitida para este usuário" + email_not_allowed: "Acontece quando o endereço de e-mail não está na lista de permissões ou está na lista negra." unrecognized_error: "Erro Desconhecido" errors: &errors format: '%{attribute} %{message}' + format_with_full_message: '%{attribute}: %{message}' messages: too_long_validation: "está limitado para %{max} caracteres; você entrou com %{length}." invalid_boolean: "Boleano inválido." @@ -81,6 +110,8 @@ pt_BR: not_an_integer: deve ser um inteiro odd: deve ser ímpar record_invalid: 'A validação falhou: %{errors}' + max_emojis: "não pode ter mais que %{max_emojis_count} emojis" + ip_address_already_screened: "já está incluído em uma regra existente" restrict_dependent_destroy: one: "Não foi possível excluir o registro porque um %{record} dependente existe" many: "Não foi possível excluir o registro porque %{record} dependentes existem" @@ -102,17 +133,27 @@ pt_BR: embed: load_from_remote: "Houve um erro ao carregar essa mensagem." site_settings: + invalid_choice: + one: 'Você especificou a escolha inválida %{name}' + other: 'Você especificou a escolha inválida %{name}' min_username_length_exists: "Você não pode definir o comprimento mínimo de nome de usuário como maior do que o nome de usuário mais curto." min_username_length_range: "Você não pode colocar o mínimo acima do máximo." max_username_length_exists: "Você não pode definir o comprimento máximo de nome de usuário como abaixo do nome de usuário mais longo." max_username_length_range: "Você não pode definir o máximo abaixo no mínimo." default_categories_already_selected: "Você não pode selecionar uma categoria usada noutra lista." s3_upload_bucket_is_required: "Você não pode habilitar uploads para o S3 a não ser que tenha provido o 's3_upload_bucket'." + conflicting_google_user_id: 'O ID da Conta do Google para esta conta foi alterado. A intervenção do pessoal é necessária por razões de segurança. Por favor contate a equipe e aponte-os para
https://meta.discourse.org/t/76575' activemodel: errors: <<: *errors invite: not_found: "O token do seu convite é inválido. Por favor entre em contato com o administrador do site." + not_found_template: | +

Seu convite para %{site_name}já foi resgatado. +

Se você lembrar de sua senha, você pode Login.

+ +

Caso contrário, por favorRedefinir Senha.

+ user_exists: "Não há necessidade de convidar %{email}, eles já tem uma conta!" bulk_invite: file_should_be_csv: "O arquivo atualizado deve ter o formato csv." error: "Houve um erro ao tentar enviar esse arquivo. Por favor tente novamente mais tarde." @@ -123,53 +164,66 @@ pt_BR: backup_file_should_be_tar_gz: "O arquivo de backup deve ser um arquivo .tar.gz." not_enough_space_on_disk: "Não há espaço suficiente no disco para carregar este backup." invalid_filename: "O nome do arquivo de backup contém caracteres inválidos. Os caracteres válidos são a-z 0-9 . - _." + invalid_params: "Você forneceu parâmetros inválidos para a solicitação %{message}" not_logged_in: "Você precisa estar conectado para fazer isso." not_found: "A URL ou recurso solicitado não pôde ser encontrado." invalid_access: "Você não tem permissão para ver o recurso solicitado." + authenticator_not_found: "O método de autenticação não existe ou foi desativado." + invalid_api_credentials: "Você não tem permissão para visualizar o recurso solicitado. O nome de usuário ou a chave da API é inválido." + provider_not_enabled: "Você não tem permissão para visualizar o recurso solicitado. O provedor de autenticação não está ativado." + provider_not_found: "Você não tem permissão para visualizar o recurso solicitado. O provedor de autenticação não existe." read_only_mode_enabled: "O site está em modo somente leitura. As interações estão desativadas." reading_time: "Tempo de leitura" likes: "Curtidas" too_many_replies: - one: Lamentamos, mas usuários novos estão temporariamente limitados a 1 resposta no mesmo tópico. - other: Lamentamos, mas usuários novos estão temporariamente limitados a %{count} respostas no mesmo tópico. + one: "Lamentamos, mas usuários novos estão temporariamente limitados a 1 resposta no mesmo tópico." + other: "Lamentamos, mas usuários novos estão temporariamente limitados a %{count} respostas no mesmo tópico." embed: start_discussion: "Começar Discussão" continue: "Continuar Discussão" error: "Erro na Incorporação" + referer: "Referer:" + mismatch: "O referenciador não encontrou nenhum dos seguintes hosts:" + no_hosts: "Nenhum host foi configurado para incorporação." + configure: "Configurar incorporação" more_replies: - one: 1 resposta a mais - other: '%{count} respostas a mais' + one: "1 resposta a mais" + other: "%{count} respostas a mais" loading: "Carregando Discussão..." permalink: "Permalink" imported_from: "Este é um tópico de discussão companheiro para a mensagem original em %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 resposta - other: '%{count} respostas' + one: "1 resposta" + other: "%{count} respostas" no_mentions_allowed: "Desculpe, você não pode mencionar outros usuários." too_many_mentions: - one: Desculpe, você pode mencionar apenas %{count} usuário em um post. - other: Desculpe, você pode mencionar apenas %{count} usuários em uma mensagem. + one: "Desculpe, você pode mencionar apenas %{count} usuário em um post." + other: "Desculpe, você pode mencionar apenas %{count} usuários em uma mensagem." no_mentions_allowed_newuser: "Desculpe, usuários novos não podem mencionar outros usuários." too_many_mentions_newuser: - one: Desculpe, usuários novos podem mencionar apenas um usuário em uma mensagem. - other: Desculpe, usuários novos podem mencionar apenas %{count} usuários em uma mensagem. + one: "Desculpe, usuários novos podem mencionar apenas um usuário em uma mensagem." + other: "Desculpe, usuários novos podem mencionar apenas %{count} usuários em uma mensagem." + no_images_allowed_trust: "Desculpe, você não pode colocar imagens em um post" no_images_allowed: "Desculpe, usuários novos não podem colocar imagens nas mensagens." too_many_images: - one: Desculpe, usuários novos podem colocar apenas %{count} imagem nas postagens. - other: Desculpe, usuários novos podem colocar apenas %{count} imagens nas mensagens. + one: "Desculpe, usuários novos podem colocar apenas %{count} imagem nas postagens." + other: "Desculpe, usuários novos podem colocar apenas %{count} imagens nas mensagens." no_attachments_allowed: "Desculpe, novos usuários não podem colocar anexos nas mensagens." too_many_attachments: - one: Desculpe, novos usuários podem colocar apenas %{count} anexo nas suas postagens. - other: Desculpe, novos usuários podem colocar apenas %{count} anexos nas suas mensagens. + one: "Desculpe, novos usuários podem colocar apenas %{count} anexo nas suas postagens." + other: "Desculpe, novos usuários podem colocar apenas %{count} anexos nas suas mensagens." no_links_allowed: "Desculpe, usuários novos não podem colocar links nas postagens." + links_require_trust: "Desculpe, você não pode incluir links em suas postagens." too_many_links: - one: Desculpe, usuários novos podem colocar apenas %{count} link nas postagens. - other: Desculpe, usuários novos podem colocar apenas %{count} links nas postagens. + one: "Desculpe, usuários novos podem colocar apenas %{count} link nas postagens." + other: "Desculpe, usuários novos podem colocar apenas %{count} links nas postagens." + contains_blocked_words: "Sua postagem contém uma palavra que não é permitida:%{word}" spamming_host: "Desculpe, você não pode colocar um link para este site." user_is_suspended: "Usuários suspensos não tem permissão para postar." topic_not_found: "Ocorreu um erro. Talvez este tópico foi fechado ou removido enquanto você estava visualizando?" not_accepting_pms: "Desculpe, %{username} não está aceitando mensagens no momento." + max_pm_recepients: "Desculpe, você pode enviar uma mensagem para o máximo %{recipients_limit} destinatários." just_posted_that: "é demasiado similar ao que postaste recentemente" invalid_characters: "contém caracteres inválidos" is_invalid: "parece pouco claro; é uma frase completa?" @@ -189,24 +243,42 @@ pt_BR: latest: "Últimos tópicos" hot: "Tópicos quentes" top: "Principais tópicos" + top_all: "Todos os tópicos principais" + top_yearly: "Tópicos principais anuais" + top_quarterly: "Principais tópicos trimestrais" + top_monthly: "Tópicos principais mensais" + top_weekly: "Tópicos principais semanais" + top_daily: "Tópicos principais diários" posts: "Últimos tópicos" + private_posts: "Últimas mensagens pessoais" group_posts: "Últimos posts de %{group_name}" group_mentions: "Últimas citações de %{group_name}" user_posts: "Últimos posts por @%{username}" user_topics: "Últimos tópicos por @%{username}" tag: "Tópicos marcados" + badge: "%{display_name} emblema em %{site_title}" too_late_to_edit: "Essa mensagem foi criada há muito tempo. Ela não pode mais ser editada ou apagada." revert_version_same: "A versão atual é a mesma versão para a qual você está tentando reverter." excerpt_image: "imagem" queue: delete_reason: "Deletado pela fila de moderação" + not_found: "Post não encontrado ou já atualizado." groups: + success: + bulk_add: + one: "%{count}usuário foram adicionados ao grupo." + other: "%{count}usuários foram adicionados ao grupo." errors: + grant_trust_level_not_valid: "'%{trust_level}' não é um nível de confiança válido." can_not_modify_automatic: "Você não pode modificar um grupo automático" + member_already_exist: + one: "'%{username}' já é membro deste grupo." + other: "Os seguintes usuários já são membros deste grupo:%{username}" invalid_domain: "'%{domain}' não é um domínio válido." invalid_incoming_email: "'%{email}' não é um endereço de e-mail válido." email_already_used_in_group: "'%{email}' já é utilizado pelo grupo '%{group_name}'." email_already_used_in_category: "'%{email}' já é utilizado pela categoria '%{category_name}'." + cant_allow_membership_requests: "Você não pode permitir solicitações de associação para um grupo sem nenhum proprietário." default_names: everyone: "todos" admins: "admins" @@ -217,10 +289,12 @@ pt_BR: trust_level_2: "nivel_de_confianca_2" trust_level_3: "nivel_de_confianca_3" trust_level_4: "nivel_de_confianca_4" + request_membership_pm: + title: "Pedido de associação para @%{group_name}" education: until_posts: - one: 1 mensagem - other: '%{count} mensagens' + one: "1 mensagem" + other: "%{count} mensagens" 'new-topic': | Bem vindo ao %{site_name} — **obrigado por iniciar uma nova conversa!** @@ -263,12 +337,26 @@ pt_BR: Este tópico claramente é importante para você – você postou mais de %{percent}% das respostas aqui. Tem certeza que você está dando tempo para que outras pessoas também compartilhem seus pontos de vista? + get_a_room: | + ### Considere responder a mais pessoas + + Você já respondeu %{count} vezes à @%{reply_username} neste tópico particular. + + Você já pensou em responder a * outras * pessoas na discussão? Uma grande discussão envolve muitas vozes e perspectivas. + + Se você quiser continuar sua conversa com esse usuário em particular, [envie-lhes uma mensagem pessoal](/u/%{reply_username}). too_many_replies: | ### Você atingiu o limite de respostas para este tópico Sentimos muito, mas novos usuários são temporariamente limitados a %{newuser_max_replies_per_topic} respostas no mesmo tópico. Em vez de adicionar outra resposta, por favor considere editar suas respostas anteriores, ou visite outros tópicos. + reviving_old_topic: | + ### Reviver este tópico? + + A última resposta para esse tópico foi **%{time_ago}**. Sua resposta colocará o tópico no topo da sua lista e notificará qualquer pessoa anteriormente envolvida na conversa. + + Tem certeza de que deseja continuar esta conversa antiga? activerecord: attributes: category: @@ -286,8 +374,12 @@ pt_BR: topic: attributes: base: + warning_requires_pm: "Você só pode anexar avisos a mensagens pessoais." too_many_users: "Você só pode enviar avisos para um usuário de cada vez." + cant_send_pm: "Desculpe, você não pode enviar uma mensagem pessoal para esse usuário." no_user_selected: "Você deve escolher um usuário válido." + reply_by_email_disabled: "Responder por e-mail foi desativado." + target_user_not_found: "Um dos usuários para os quais você está enviando esta mensagem não foi encontrado." featured_link: invalid: "é inválida. A URL deve conter http:// ou https://." invalid_category: "não pode ser editado nesta categoria." @@ -298,25 +390,42 @@ pt_BR: same_as_username: "é igual o seu nome de usuário. Por favor use uma senha mais segura." same_as_email: "é igual o seu email. Por favor use uma senha mais segura." same_as_current: "A senha inserida é a mesma que a sua atual senha. Favor inserir uma nova e mais segura." + unique_characters: "tem muitos caracteres repetidos. Por favor, use uma senha mais segura." ip_address: signup_not_allowed: "Cadastro não é permitido a partir desta conta." + user_email: + attributes: + user_id: + reassigning_primary_email: "A reatribuição de um e-mail principal a outro usuário não é permitida." color_scheme_color: attributes: hex: invalid: "Não é uma cor válida" + post_reply: + base: + different_topic: "Postar e responder devem pertencer ao mesmo tópico." web_hook: attributes: payload_url: invalid: "URL inválida. A URL deve conter http:// ou https://. Espaço em branco não é permitido." + custom_emoji: + attributes: + name: + taken: já está em uso por outro emoji topic_timer: attributes: execute_at: in_the_past: "deve estar no futuro." + translation_overrides: + attributes: + value: + invalid_interpolation_keys: 'As seguintes chave(s) de interpolação são inválidas: "%{keys}"' watched_word: attributes: word: too_many: "Muitas palavras para esta ação" user_profile: + no_info_me: "
o campo Sobre mim do seu perfil está em branco,você gostaria de preenchê-lo?
" no_info_other: "
%{name} ainda não colocou nada no campo Sobre Mim
" vip_category_name: "Salão" vip_category_description: "Uma categoria exclusiva para membros com nível de confiança 3 e superior." @@ -324,6 +433,8 @@ pt_BR: meta_category_description: "Discussão sobre este fórum, sua organização, como ele funciona e como podemos melhorá-lo." staff_category_name: "Equipe" staff_category_description: "Categoria particular para as discussões da equipe. Tópicos só são visíveis para os administradores e moderadores." + assets_topic_title: "Ativos para o design do site" + assets_topic_body: "Este tópico, visível apenas para a equipe, é para armazenar imagens e arquivos usados ​​no design do site. Não exclua!\n\nVeja como:\n\n\n1. Responder a este tópico.\n2. Carregue todas as imagens que você deseja usar para logotipos, favicons e assim por diante. (Use o ícone da barra de ferramentas de upload no editor de postagem ou arraste e solte ou cole imagens.)\n3. Envie sua resposta para postá-lo.\n4.Clique com o botão direito do mouse nas imagens da nova postagem para obter o caminho para as imagens enviadas ou clique na edição ícone para editar sua postagem e recuperar o caminho para as imagens. Copie os caminhos da imagem.\n5. Cole esses caminhos de imagem em [configurações básicas] (/ admin / site_settings / category / required).\n\n\nSe você precisar ativar uploads de tipos de arquivos diferentes, edite `authorized_extensions` em [configurações do arquivo] (/ admin / site_settings / category / files)." discourse_welcome_topic: title: "Bem vindo ao Discourse" body: |2 @@ -344,42 +455,44 @@ pt_BR: title: "Bem-vindo ao Salão" body: |2 - Parabéns! :confetti_ball: + Parabéns! : confetti_ball: - Se você pode ver neste tópico, você foi recentemente promovido a **regular** (nível de confiança 3). + Se você puder ver este tópico, você foi promovido recentemente para ** regular ** (nível de confiança 3). - Agora você pode … + Você pode agora & hellip; - * Editar o título de qualquer tópico - * Alterar a categoria de qualquer assunto - * Ter todos os seus links seguidos ([nofollow automática] (http://en.wikipedia.org/wiki/Nofollow) é removido) - * Acesso a categoria privada Sala visíveis apenas para os utilizadores a nível de confiança 3 e superior - * Esconder o spam com uma única sinalização + * Edite o título de qualquer tópico + * Mude a categoria de qualquer tópico + * Tenha todos os seus links seguidos ([nofollow automático] (http://en.wikipedia.org/wiki/Nofollow) é removido) + * Acessar uma categoria de salão privado visível apenas para usuários no nível de confiança 3 e superior + *Ocultar spam com um único sinalizador - Aqui está o [lista atual de companheiros regulares] (/badges/3/regular). Não se esqueça de dizer oi. + Aqui está a [lista atual de companheiros regulares] (/ badges / 3 / regular). Não deixe de dizer oi. - Obrigado por ser uma parte importante dessa comunidade! + Obrigado por ser uma parte importante desta comunidade! - (Para obter mais informações sobre os níveis de confiança, [veja este tópico][trust]. Por favor note que somente os membros que continuam a atender aos requisitos ao longo do tempo permanecerá regulares.) + (Para mais informações sobre os níveis de confiança, [veja este tópico] [confiança]. Observe que somente os membros que continuarem a cumprir os requisitos ao longo do tempo permanecerão regulares.) - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 + [trust]: https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/ category: topic_prefix: "Sobre a categoria %{category} " replace_paragraph: "(Substitua este primeiro parágrafo por uma curta descrição da sua nova categoria. Este guia vai aparecer na área de seleção de categoria, então tente usar menos que 200 caracteres. **Até você editar essa descrição ou criar tópicos, esta categoria não aparece na página de categorias.**)" post_template: "%{replace_paragraph}\n\nUse os parágrafos a seguir para uma descrição mais longa, ou para estabelecer as instruções ou regras da categoria:\n\n- Por que as pessoas devem usar essa categoria? Para que ela serve?\n\n- Como exatamente ela é diferente das outras categorias que já existem?\n\n- O que os tópicos nessa categoria devem conter, em geral?\n\n- Precisamos dessa categoria? Podemos juntá-la com outra categoria ou subcategoria?\n" errors: + not_found: "Categoria não encontrada!" uncategorized_parent: "Sem categoria não pode ter uma categoria pai" self_parent: "A subcategoria mãe não pode ser ela mesma" depth: "Você não pode aninhar uma subcategoria sob outra" invalid_email_in: "'%{email}' não é um endereço de e-mail válido." email_already_used_in_group: "'%{email}' já é utilizado pelo grupo '%{group_name}'." email_already_used_in_category: "'%{email}' já é utilizado pela categoria '%{category_name}'." + description_incomplete: "A postagem da descrição da categoria deve ter pelo menos um parágrafo." cannot_delete: uncategorized: "Não é possível excluir Sem categoria" has_subcategories: "Não é possível excluir essa categoria porque tem subcategorias." topic_exists: - one: Não é possível excluir esta categoria porque ela tem um tópico. O tópico mais velho é %{topic_link}. - other: Não é possível excluir essa categoria porque ela tem %{count} tópicos. O tópico mais velho é %{topic_link}. + one: "Não é possível excluir esta categoria porque tem 1 tópico. O tópico mais antigo é%{topic_link}." + other: "Não é possível excluir esta categoria porque tem %{count} tópicos. O tópico mais antigo é %{topic_link}." topic_exists_no_oldest: "Não é possível excluir esta categoria porque contagem tópico é %{count}." uncategorized_description: "Tópicos que não precisam de uma categoria, ou que não se encaixam em nenhuma outra categoria existente." trust_levels: @@ -398,86 +511,104 @@ pt_BR: image_placeholder: broken: "Esta imagem está danificada" rate_limiter: + slow_down: "Você executou essa ação muitas vezes. Tente novamente mais tarde." + too_many_requests: "Você já executou essa ação muitas vezes. Por favor, espere%{time_left} antes de tentar novamente." + by_type: + first_day_replies_per_day: "Você atingiu o número máximo de respostas que um novo usuário pode criar no primeiro dia. Por favor, espere %{time_left} antes de tentar novamente." + first_day_topics_per_day: "Você atingiu o número máximo de tópicos que um novo usuário pode criar no primeiro dia. Por favor, espere%{time_left} antes de tentar novamente." + create_topic: "Você está criando tópicos muito rapidamente. Por favor, espere%{time_left} antes de tentar novamente." + create_post: "Você está respondendo rápido demais. Por favor, espere %{time_left} antes de tentar novamente." + delete_post: "Você está excluindo as postagens muito rapidamente. Por favor, espere%{time_left} antes de tentar novamente." + public_group_membership: "Você está entrando / saindo de grupos com muita frequência. Por favor, espere %{time_left} antes de tentar novamente." + topics_per_day: "Você atingiu o número máximo de novos tópicos. Por favor, espere%{time_left}ates de tentar novamente." + pms_per_day: "Você atingiu o número máximo de mensagens. Por favor, espere %{time_left} antes de tentar novamente." + create_like: "Você atingiu o número máximo de curtidas. Por favor, espere%{time_left} antes de tentar novamente." + create_bookmark: "Você atingiu o número máximo de marcadores. Por favor, espere %{time_left} antes de tentar de novo." + edit_post: "Você atingiu o número máximo de edições. Por favor, espere%{time_left} antes de tentar de novo." + live_post_counts: "Você está pedindo contagens de post em tempo real muito rapidamente. Por favor, espere %{time_left} antes de tentar novamente." + unsubscribe_via_email: "Você atingiu o número máximo de descadastradas por e-mail. Por favor, espere%{time_left} antes de tentar novamente." + topic_invitations_per_day: "Você atingiu o número máximo de convites por tópico. Por favor, espere %{time_left} antes de tentar novamente." hours: - one: 1 hora - other: '%{count} horas' + one: "1 hora" + other: "%{count} horas" minutes: - one: 1 minuto - other: '%{count} minutos' + one: "1 minuto" + other: "%{count} minutos" seconds: - one: 1 segundo - other: '%{count} segundos' + one: "1 segundo" + other: "%{count} segundos" + short_time: "alguns segundos" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mês - other: '%{count}mon' + one: "1mês" + other: "%{count}mon" x_months: - one: 1mês - other: '%{count}mon' + one: "1mês" + other: "%{count}mon" about_x_years: - one: 1ano - other: '%{count}anos' + one: "1ano" + other: "%{count}anos" over_x_years: - one: '> 1ano' - other: '> %{count}anos' + one: "> 1ano" + other: "> %{count}anos" almost_x_years: - one: 1ano - other: '%{count}anos' + one: "1ano" + other: "%{count}anos" distance_in_words_verbose: half_a_minute: "mesmo agora" less_than_x_seconds: - one: mesmo agora - other: mesmo agora + one: "mesmo agora" + other: "mesmo agora" x_seconds: - one: 1 segundo atrás - other: '%{count} segundos atrás' + one: "1 segundo atrás" + other: "%{count} segundos atrás" less_than_x_minutes: - one: menos de 1 minuto atrás - other: menos de %{count} minutos atrás + one: "menos de 1 minuto atrás" + other: "menos de %{count} minutos atrás" x_minutes: - one: 1 minuto atrás - other: '%{count} minutos atrás' + one: "1 minuto atrás" + other: "%{count} minutos atrás" about_x_hours: - one: 1 hora atrás - other: '%{count} horas atrás' + one: "1 hora atrás" + other: "%{count} horas atrás" x_days: - one: 1 dia atrás - other: '%{count} dias atrás' + one: "1 dia atrás" + other: "%{count} dias atrás" about_x_months: - one: há cerca de 1 mês atrás - other: há cerca de %{count} meses atrás + one: "há cerca de 1 mês atrás" + other: "há cerca de %{count} meses atrás" x_months: - one: 1 mês atrás - other: '%{count} meses atrás' + one: "1 mês atrás" + other: "%{count} meses atrás" about_x_years: - one: há cerca de 1 ano atrás - other: há cerca %{count} anos atrás + one: "há cerca de 1 ano atrás" + other: "há cerca %{count} anos atrás" over_x_years: - one: há mais de 1 ano atrás - other: há mais de %{count} anos atrás + one: "há mais de 1 ano atrás" + other: "há mais de %{count} anos atrás" almost_x_years: - one: há quase 1 ano atrás - other: há quase %{count} anos atrás + one: "há quase 1 ano atrás" + other: "há quase %{count} anos atrás" password_reset: no_token: "Desculpe, essa alteração de senha é muito antiga. Selecione o botão Login e use 'Esqueci minha senha' para obter um novo link." choose_new: "Escolha uma nova senha" @@ -487,6 +618,9 @@ pt_BR: title: 'Redefinir Senha' success: "Sua senha foi modificado com sucesso e você está conectado agora." success_unapproved: "Senha modificada com sucesso." + email_login: + invalid_token: "Desculpe, esse link de login de e-mail é muito antigo. Selecione o botão Login e use 'Esqueci minha senha' para obter um novo link." + title: "E-mail login" change_email: confirmed: "O seu email foi atualizado." please_continue: "Continuar no %{site_name}" @@ -496,6 +630,8 @@ pt_BR: authorizing_old: title: "Obrigado por confirmar o seu endereço de e-mail atual." description: "Estamos enviando um e-mail ao seu novo endereço para confirmação." + associated_accounts: + revoke_failed: "Falha ao revogar sua conta com %{provider_name}." activation: action: "Clique aqui para ativar sua conta" already_done: "Desculpe, este link de confirmação não está mais válido. Talvez a sua conta já esteja ativa?" @@ -504,8 +640,13 @@ pt_BR: welcome_to: "Bem-vindo a %{site_name}!" approval_required: "Um moderador tem que aprovar a sua conta para que você possa acessar este fórum. Você receberá um email quando sua conta for aprovada!" missing_session: "Não conseguimos detectar se sua conta foi criada. Por favor, certifique-se de que você está com os cookies do navegador habilitados." + activated: "Desculpe, esta conta já foi ativada." admin_confirm: title: "Confirmar Conta de Administrador" + description: "Tem certeza de que quer %{target_username} ser um administrador?" + grant: "Conceder acesso de administrador" + complete: "%{target_username} é agora um administrador." + back_to: "Retornar para %{title}" post_action_types: off_topic: title: 'Off-Topic' @@ -514,6 +655,7 @@ pt_BR: long_form: 'sinalizou isto como off-topic' spam: title: 'Spam' + description: 'Este post é um anúncio ou vandalismo. Não é útil ou relevante para o tópico atual.' short_description: 'Isto é uma propaganda ou vandalismo' long_form: 'sinalizado como spam' email_title: '"%{title}" foi sinalizado como spam' @@ -521,15 +663,19 @@ pt_BR: inappropriate: title: 'Inapropriado' description: 'Este post contém conteúdo que uma pessoa razoável consideraria ofensivo, abusivo, ou uma violação das nossas diretrizes da comunidade.' + short_description: 'Uma violação de nossas diretrizes da comunidade' long_form: 'sinalizado como inapropriado' notify_user: title: 'Envie ao(à) @ {{nome de usuário}} uma mensagem' + description: 'Eu quero falar com essa pessoa diretamente e pessoalmente sobre o seu post.' + short_description: 'Eu quero falar com essa pessoa diretamente e pessoalmente sobre o seu post.' long_form: 'mensagem privada' email_title: 'Sobre a sua postagem "%{title}"' email_body: "%{link}\n\n%{message}" notify_moderators: title: "Algo mais" description: 'Esta postagem requer atenção da moderação por outra razão não listada acima.' + short_description: 'Requer atenção da equipe por outro motivo' long_form: 'sinalizou isto para a atenção da equipe' email_title: 'Um post em "%{title}" requer a atenção da equipe' email_body: "%{link}\n\n%{message}" @@ -543,10 +689,6 @@ pt_BR: description: 'Curtir esta postagem' short_description: 'Curtir esta publicação' long_form: 'curtiu isto' - vote: - title: 'Vote' - description: 'Votar nesta postagem' - long_form: 'voto computado para esta postagem' user_activity: no_default: self: "Você não tem nenhuma atividade ainda." @@ -555,22 +697,32 @@ pt_BR: others: "Nenhum favorito." no_likes_given: self: "Você não curtiu nenhuma publicação." + others: "Sem publicações curtidas." + no_replies: + self: "Você não respondeu a nenhuma postagem." + others: "Sem Respostas." + no_drafts: + others: "Você não tem permissão para ver rascunhos desse usuário." topic_flag_types: spam: title: 'Spam' description: 'Este tópico é uma propaganda. Não é útil ou relevante a este site mas de natureza promocional.' long_form: 'sinalizar como spam' + short_description: 'Este é um anúncio' inappropriate: title: 'Impróprio' description: 'Este tópico contém um conteúdo que uma pessoa razoável consideraria ofensivo, abusivo, ou violação de nossas diretrizes da comunidade.' long_form: 'sinalizar como impróprio' + short_description: 'Uma violação de nossas diretrizes da comunidade' notify_moderators: title: "Algo mais" description: 'Este tópico requer a atenção geral da equipe baseado nas diretrizes da comunidade, no Termos de Serviço, ou em outra razão não listada acima.' long_form: 'sinalizar isso para atenção da moderação' + short_description: 'Requer atenção da equipe por outro motivo' email_title: 'O tópico "%{title}" requer atenção do moderador' email_body: "%{link}\n\n%{message}" flagging: + you_must_edit: '

Sua postagem foi sinalizada pela comunidade. Por favorveja suas mensagens.

' user_must_edit: '

Conteúdo sinalizado escondido.

' archetypes: regular: @@ -582,7 +734,9 @@ pt_BR: remove: "Este tópico não é mais um banner. Ela deixará de aparecer no topo de todas as páginas." unsubscribed: title: "Desinscrito!" + description: "%{email} foi anulado. Para alterar suas configurações de e-mailvisite suas preferências de usuário. " topic_description: "Para se reinscrever a %{link}, use o controle de notificações no fim ou no canto direito do tópico." + private_topic_description: "Para se inscrever novamente, use o controle de notificação na parte inferior ou à direita do tópico" unsubscribe: title: "Desinscrever" stop_watching_topic: "Parar de observar este tópico, %{link}" @@ -610,12 +764,65 @@ pt_BR: read: "Ler tudo" write: "Escrever tudo" reports: + default: + labels: + count: Contagem + percent: Porcento + day: Dia + post_edits: + title: "Publicar edições" + labels: + post: Publicar + editor: Editor + author: Autor + edit_reason: Razão + moderators_activity: + title: "Atividade de moderadores" + labels: + moderator: Moderador + flag_count: sinalizações revisadas + time_read: Leitura do tempo + topic_count: Tópicos criados + post_count: Publicações criadas + pm_count: MPs criadas + revision_count: Revisões + flags_status: + title: " status de Sinalização" + values: + agreed: Acordado + disagreed: Discordado + deferred: Diferido + no_action: Sem Ação + labels: + flag: Tipo + assigned: Atribuído + poster: Poster + flagger: Sinalizador + time_to_resolution: Tempo de Resolução visits: title: "Visitas do Usuário" xaxis: "Dia" yaxis: "Número de visitas" signups: + title: "Inscrições" xaxis: "Dia" + yaxis: "Número de Inscrições" + description: "Novos registros de conta para este período" + new_contributors: + title: "Novos contribuidores" + xaxis: "Dia" + yaxis: "Número de novos colaboradores" + description: "Número de usuários que fizeram sua primeira postagem durante esse período" + dau_by_mau: + title: "DAU/MAU" + xaxis: "Dia" + yaxis: "DAU/MAU" + description: "Número de membros que se conectaram no último dia dividido por nenhum dos membros que efetuaram login no último mês - retorna um% que indica a 'rigidez' da comunidade. Apontar para> 30%." + daily_engaged_users: + title: "Usuários engajados diariamente" + xaxis: "Dia" + yaxis: "Usuários Engajados" + description: "Número de usuários que curtiram ou postaram no último dia" profile_views: title: "Visualizações de Perfil de Usuário" xaxis: "Dia" @@ -624,10 +831,12 @@ pt_BR: title: "Tópicos" xaxis: "Dia" yaxis: "Número de tópicos novos" + description: "Novos tópicos criados durante este período" posts: title: "Posts" xaxis: "Dia" yaxis: "Número de posts novos" + description: "Novos tópicos criados durante este período" likes: title: "Curtidas" xaxis: "Dia" @@ -648,13 +857,37 @@ pt_BR: title: "Usuários por Nível de Confiança" xaxis: "Nível de Confiança" yaxis: "Número de Usuários" + labels: + level: Nível + users_by_type: + title: "Usuários por tipo" + xaxis: "Tipo" + yaxis: "Número de usuários" + labels: + type: Tipo + xaxis_labels: + admin: Administrador + moderator: Moderador + suspended: Suspenso + silenced: Silenciado + trending_search: + title: Pesquisa em tendência + labels: + term: Termo + searches: Pesquisas + click_through: CTR emails: title: "Emails Enviados" xaxis: "Dia" yaxis: "Número de Emails" user_to_user_private_messages: + title: "usuário-para-usuário (excluindo respostas)" xaxis: "Dia" yaxis: "Número de mensagens particulares" + user_to_user_private_messages_with_replies: + title: "usuário-para-usuário (com respostas)" + xaxis: "Dia" + yaxis: "Número de Mensagens" system_private_messages: title: "Sistema" xaxis: "Dia" @@ -682,10 +915,15 @@ pt_BR: num_clicks: "Clicks" num_topics: "Tópicos" num_users: "Usuários" + labels: + domain: Domínio + num_clicks: Cliques + num_topics: Tópicos top_referred_topics: title: "Top Tópicos Citados" - xaxis: "Tópico" - num_clicks: "Clicks" + labels: + num_clicks: "Cliques" + topic: "Tópico" page_view_anon_reqs: title: "Anônimo" xaxis: "Dia" @@ -699,6 +937,7 @@ pt_BR: xaxis: "Dia" yaxis: "Visualizações por indexadores web" page_view_total_reqs: + title: "Visualizações da Página" xaxis: "Dia" yaxis: "Visualizações totais" page_view_logged_in_mobile_reqs: @@ -742,9 +981,14 @@ pt_BR: xaxis: "Dia" yaxis: "Total" mobile_visits: - title: "Visitas de Usuários" + title: "Visitas de usuários (móveis)" xaxis: "Dia" yaxis: "Número de visitas" + web_crawlers: + title: "Solicitações de rastreador da Web" + labels: + user_agent: "Agente de usuário" + page_views: "Visualizações de página" dashboard: rails_env_warning: "Seu servidor está rodando no modo %{env}." host_names_warning: "O arquivo config/database.yml está usando hostname padrão localhost. Modifique para usar o hostname do seu site." @@ -756,35 +1000,50 @@ pt_BR: facebook_config_warning: 'O servidor está configurado para permitir o signup e login com Facebook (enable_facebook_logins), mas os valores do App Id e App Secret não estão configurados. Vá para as Configurações do Site e atualize as configurações. Veja este guia e aprenda mais.' twitter_config_warning: 'O servidor está configurado para permitir o signup e login com Twitter (enable_twitter_logins), mas os valores de Key e Secret não estão configurados. Vá para as Configurações do Site e atualize as configurações. Veja este guia e aprenda mais.' github_config_warning: 'O servidor está configurado para permitir o signup e login com GitHub (enable_twitter_logins), mas os valores de Cliend Id e Secret não estão configurados. Vá para the Site Settings e atualize as configurações. Veja este guia e aprenda mais.' + s3_config_warning: "O servidor está configurado para fazer upload de arquivos para s3, mas pelo menos uma das seguintes configurações não está configurada: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile ou s3_upload_bucket. Vamos para the Site Settings \ne atualize as configurações.Consulte \"Como configurar uploads de imagens para o S3?\" aprender mais." + s3_backup_config_warning: 'O servidor está configurado para fazer upload de backups para s3, mas pelo menos uma das seguintes configurações não está configurada: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile ou s3_backup_bucket. Vá para as configurações do site e atualize as configurações. Consulte "Como configurar uploads de imagens para o S3?" aprender mais.' image_magick_warning: 'O servidor está configurado para criar miniaturas de imagens grandes, mas o ImageMagick não está instalado. Instale o ImageMagick usando seu gerenciador de pacotes preferido ou acesse para fazer download da última versão.' failing_emails_warning: 'Existem %{num_failed_jobs} tarefas de email que falharam. Verifique seu app.yml e se assegure que as configurações do servidor de email estão corretas. Veja as tarefas que falharam no Sidekiq.' subfolder_ends_in_slash: "Sua configuração de subdiretórios está incorreta; DISCOURSE_RELATIVE_URL_ROOT termina com uma barra." email_polling_errored_recently: - one: A apuração de email gerou um erro nas últimas 24 horas. Veja os logs para mais detalhes. - other: A apuração de email gerou %{count} erros nas últimas 24 horas. Veja os logs para mais detalhes. + one: "A apuração de email gerou um erro nas últimas 24 horas. Veja os logs para mais detalhes." + other: "A apuração de email gerou %{count} erros nas últimas 24 horas. Veja os logs para mais detalhes." + missing_mailgun_api_key: "O servidor está configurado para enviar e-mails por meio do Mailgun, mas você não forneceu uma chave de API usada para verificar as mensagens do webhook." bad_favicon_url: "O carregamento do favicon está falhando. Verifique a sua configuração de favicon_url nas Configurações do Site." poll_pop3_timeout: "A conexão com o servidor POP3 está atingindo o tempo limite. Por favor, verifique suas configurações de POP3 e selecione um servidor de serviço." poll_pop3_auth_error: "A conexão com o servidor POP3 está falhando com um erro de autenticação. Por favor, verifique suas configurações de POP3." + force_https_warning: "Seu site está usando SSL. Mas `force_https` ainda não está ativado nas configurações do seu site." site_settings: censored_words: "Palavras que serão substituídos automaticamente por ■■■■" delete_old_hidden_posts: "Auto-apagar todas as mensagens ocultas que ficar oculta por mais de 30 dias." + default_locale: "O idioma padrão desta instância do Discourse" allow_user_locale: "Permitir que os usuários escolham suas próprias preferências de idioma de interface" set_locale_from_accept_language_header: "define a língua da interface para os usuários anônimos de acordo com os cabeçalhos de língua de seus navegadores. (EXPERIMENTAL, não funciona com cache anônimo)" + support_mixed_text_direction: "Suporta direções de texto misturadas da esquerda para a direita e da direita para a esquerda." min_post_length: "Comprimento mínimo permitido do post em caracteres" min_first_post_length: "Comprimento mínimo de caracteres permitido para primeira mensagem (corpo do tópico)" + min_personal_message_post_length: "Tamanho mínimo permitido da postagem em caracteres para mensagens" max_post_length: "Comprimento máximo permitido para o post em caracteres" + topic_featured_link_enabled: "Habilitar postagem de um link com tópicos." + show_topic_featured_link_in_digest: "Mostrar o link do tópico em destaque no e-mail de resumo." min_topic_title_length: "Comprimento mínimo permitido para o título do post em caracteres" max_topic_title_length: "Comprimento máximo permitido para o título do post em caracteres" + min_personal_message_title_length: "Tamanho mínimo do título permitido para uma mensagem em caracteres" + max_emojis_in_title: "Emojis permitidos máximos no título do tópico" min_search_term_length: "Comprimento mínimo válido para o termo de pesquisa em caracteres" search_tokenize_chinese_japanese_korean: "Força a busca a tokenizar Mandarim/Japonês/Coreano até para sites que não são nesses idiomas" search_prefer_recent_posts: "Se buscar o seu fórum está lento, essa opção tenta indexar as publicações mais recentes primeiro" search_recent_posts_size: "Quantas postagens recentes a ser mantidas no íncide" + log_search_queries: "Registrar consultas de pesquisa realizadas pelos usuários" + search_query_log_max_size: "Quantidade máxima de consultas de pesquisa a serem mantidas" + search_query_log_max_retention_days: "Quantidade máxima de tempo para manter as consultas de pesquisa em dias." allow_uncategorized_topics: "Permitir criação de tópicos sem uma categoria. NOTA: Se existe algum tópico sem nenhuma categoria, você deve movê-los para uma categoria antes de desabilitar esta opção." allow_duplicate_topic_titles: "Permitir tópicos com títulos duplicados, idênticos." unique_posts_mins: "Quantos minutos antes para um utilizador poder criar uma postagem com o mesmo conteúdo outra vez?" educate_until_posts: "Quando o usuário começa a digitar suas primeiras (n) novos posts, mostrar o novo painel pop-up de educação do usuário no compositor." title: "O nome deste site, como usado na tag de título." site_description: "Descreva este site com uma frase, como usado na tag de meta description." + contact_email: "Endereço de e-mail do contato principal responsável por este site. Usado para notificações críticas, bem como no formulário de contato para assuntos urgentes." contact_url: "URL de contato para este site. Usada no formulário de contato /about para assuntos urgentes." crawl_images: "Recupere imagens de URLs remotas para inserir as dimensões de largura e altura corretos." download_remote_images_to_local: "Converta imagens remotas para imagens locais, transferindo-as; isto evita imagens quebradas." @@ -792,6 +1051,9 @@ pt_BR: download_remote_images_max_days_old: "Não baixe fotos remotas para publicações que tem mais de n dias." disabled_image_download_domains: "Imagens hospedadas nestes domínios nunca serão baixadas. \nLista delimitada por |" editing_grace_period: "Por (n) segundos após a publicação, as edições não criarão uma nova versão ho histórico da publicação." + editing_grace_period_max_diff: "Número máximo de alterações de caracteres permitidas no período de carência de edição, se mais alterações forem armazenadas, outra revisão de publicação (nível de confiança 0 e 1)" + editing_grace_period_max_diff_high_trust: "Número máximo de alterações de caracteres permitidas no período de carência de edição, se mais alterações forem armazenadas, outra revisão de postagem (nível de confiança 2 e superior)" + staff_edit_locks_post: "As postagens não serão editadas se forem editadas por membros da equipe" post_edit_time_limit: "O autor pode editar ou apagar o seu post para (n) minutos após a postagem. Defina como 0 para sempre." edit_history_visible_to_public: "Permitir que todos vejam as versões anteriores de uma postagem editada. Quando desativado, somente membros da equipe podem ver o histórico de alterações." delete_removed_posts_after: "Postagens removidas pelo autor serão automaticamente deletadas depois de (n) horas. Se o valor definido for 0, as postagens serão deletadas imediatamente." @@ -800,26 +1062,34 @@ pt_BR: fixed_category_positions: "Se selecionado, você será capaz de organizar as categorias em uma ordem fixa. Se nada for feito, as categorias serão listadas em ordem de atividade." fixed_category_positions_on_create: "Se ativado, a ordenação das categorias vai ser mantida no formulário de criação de tópico. (requer fixed_category_positions)" add_rel_nofollow_to_user_content: "Adicionar \"nofollow\" para todo conteúdo incluído por um usuário, exceto links internos (incluindo sub domínios). Para que as mudanças façam efeito é necessário rodar \"rake posts:rebake\"." + exclude_rel_nofollow_domains: "Uma lista de domínios onde o nofollow não deve ser adicionado aos links. example.com também permitirá automaticamente sub.example.com. No mínimo, você deve adicionar o domínio deste site para ajudar os rastreadores da web a encontrar todo o conteúdo. Se outras partes do seu site estiverem em outros domínios, adicione-as também." post_excerpt_maxlength: "Limite de caracteres para o resumo de um post." show_pinned_excerpt_mobile: "Mostrar excerto de tópicos fixos na exibição para celular." show_pinned_excerpt_desktop: "Mostrar excerto de tópicos fixos na exibição para desktop." post_onebox_maxlength: "Tamanho máximo para um Post em caracteres" onebox_domains_blacklist: "Uma lista de domínios que nunca serão transformados em oneboxes." + inline_onebox_domains_whitelist: "Uma lista de domínios que serão colocados em miniatura se vinculados sem um título" + enable_inline_onebox_on_all_domains: "Ignore a configuração de site inline_onebox_domain_whitelist e permita onebox in-line em todos os domínios." max_oneboxes_per_post: "Número máximos de oneboxes em uma publicação." logo_url: "O logotipo ao lado superior esquerdo de seu site deve ser um retângulo largo. Se for deixado em branco, o que aparecerá será o nome do site. " digest_logo_url: "A imagem de logo alternativa usada no topo do email de resumo do seu site. Ela deve ter um formato retangular alongado e não deve ser uma imagem SVG. Se deixado em branco, `logo_url` será usado." logo_small_url: "A pequena imagem de logo no topo à esquerda do seu site, vista quando rolando a página abaixo. Se deixado em branco, um símbolo de casa será mostrado." favicon_url: "Um favicon para seu site, veja http://en.wikipedia.org/wiki/Favicon. Para funcionar corretamente por um CDN, ele deve ser um png" + mobile_logo_url: "URL de logotipo personalizado usado na versão para celular do seu site. Se deixado em branco, o `logo_url` será usado. por exemplo: http://example.com/uploads/default/logo.png" + large_icon_url: "Imagem usada como logotipo / imagem inicial no Android. O tamanho recomendado é de 512 px por 512 px." apple_touch_icon_url: "Ãcone usado para dispositivos Apple. Tamanho recomendado é 144px por 144px." notification_email: "O endereço de email utilizado quando enviado emails do sistema. O domínio especificado deve ter registros SPF, DKIM e PTR, devidamente configurados para que os email funcionem corretamente." email_custom_headers: "A lista delimitada por barras verticais de cabeçalhos de e-mail personalizados" email_subject: "Customizar o formato do assunto dos emails padrões. \nRef https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" force_https: "Force seu site a usar apenas HTTPS. AVISO: NÃO ative até que você tenha verificado que o HTTPS está completamente configurado e funcionando em absolutamente todos os lugares! Você verificou se seu CDN, todos os logins sociais e quaisquer logos e dependências externos são todos compatíveis com HTTPS, também?" + same_site_cookies: "Use os mesmos cookies do site, eles eliminam todos os vetores Cross Site Request Forgery nos navegadores suportados (Lax ou Strict). Aviso: o Strict funcionará apenas em sites que forçam o login e usem o SSO." summary_score_threshold: "A pontuação mínima requerida para uma postagem ser incluída no \"Resuma este tópico\" " summary_posts_required: "Mensagens mínimas em um tópico antes de 'Resumir este tópico' ficar habilitado" summary_likes_required: "Curtidas mínimas em um tópico antes de 'Resumir este tópico, ficar habilitado" summary_percent_filter: "Quando um usuário clicar em 'Resumor este tópico', mostrar os melhores % mensagens" summary_max_results: "Máximo número de posts quando resumidos por Categoria " + enable_personal_messages: "Permitir que o nível de confiança 1 (configurável por meio do nível mínimo de confiança para enviar mensagens) os usuários criem mensagens e respondam a mensagens. Note que a equipe sempre pode enviar mensagens, não importa o quê." + enable_system_message_replies: "Permite que os usuários respondam às mensagens do sistema, mesmo se as mensagens pessoais estiverem desativadas" enable_long_polling: "O sistema de mensagens das notificações pode fazer solicitações longas." long_polling_base_url: "URL Utilizada para \"long polling\" ( Quando um CDN for configurado, tenha certeza que essa configuração seja a padrão) ex: http://origin.site.com" long_polling_interval: "Tempo que o servidor deve aguardar antes de responder quando não existe nenhum dado para ser enviado. (apenas usuários logados)" @@ -833,25 +1103,42 @@ pt_BR: tl2_additional_likes_per_day_multiplier: "Aumentar limite de likes por dia para tl2 (membros) multiplicando por esse número" tl3_additional_likes_per_day_multiplier: "Aumentar limite de likes por dia para tl3 (regular) multiplicando por esse número" tl4_additional_likes_per_day_multiplier: "Aumentar limite de likes por dia para tl4 (lideres) multiplicando por esse número" + num_spam_flags_to_silence_new_user: "Se as postagens de um novo usuário receberem muitos sinalizadores de spam de num_users_to_silence_new_user usuários diferentes, oculte todas as postagens e evite postagens futuras. 0 para desabilitar." + num_users_to_silence_new_user: "Se as postagens de um novo usuário receberem um sinal num_spam_flags_to_silence_new_user spam de vários usuários diferentes, oculte todas as postagens e evite postagens futuras. 0 para desabilitar." + num_tl3_flags_to_silence_new_user: "Se as postagens de um novo usuário obtiverem muitos sinalizadores de num_tl3_users_to_silence_new_user diferentes usuários do nível de confiança 3, oculte todos os posts e evite postagens futuras. 0 para desabilitar." + num_tl3_users_to_silence_new_user: "Se as postagens de um novo usuário obtiverem sinalizadores num_tl3_flags_to_silence_new_user a partir dos vários usuários diferentes do nível de confiança 3, oculte todas as postagens e evite postagens futuras. 0 para desativar." + notify_mods_when_user_silenced: "Se um usuário for silenciado automaticamente, envie uma mensagem para todos os moderadores." flag_sockpuppets: "Se um novo usuário responder um tópico usando o mesmo endereço de IP do novo usário que começou o tópico, sinalize as duas publicações como um potencial spam." traditional_markdown_linebreaks: "Use quebras de linhas tradicionais em Markdown, as quais requerem dois espaços à direita para uma quebra de linha." + enable_markdown_typographer: "Use as regras de tipografia para melhorar a legibilidade do texto: substitua as aspas normais por \"aspas curvas\", (c) (tm) pelos símbolos, - pelo emdash -, etc." + enable_markdown_linkify: "Tratar automaticamente o texto que se parece com um link como um link: www.site.com e http://site.com serão vinculados automaticamente" + markdown_linkify_tlds: "Lista de domínios de nível superior que são tratados automaticamente como links" post_undo_action_window_mins: "Número de minutos permitidos aos usuários para desfazerem uma ação recente em uma publicação (curtir, sinalizar, etc)" must_approve_users: "Os moderadores devem aprovar todas novas contas antes que elas sejam permitidas acessarem o site. CUIDADO: habilitar esta opção para um site já em funcionamento irá revogar o acesso para todos usuários já cadastrados que não são moderadores." + pending_users_reminder_delay: "Notifique os moderadores se novos usuários estiverem aguardando aprovação por mais tempo que muitas horas. Defina como -1 para desativar as notificações." maximum_session_age: "Usuário continuará logado por n horas desde a última visita" ga_universal_tracking_code: "Código de monitoramento Google Universal Analytics (analytics.js), ex: UA-12345678-9; veja http://google.com/analytics" ga_universal_domain_name: "Nome de domínio do Google Universal Analytics (analytics.js), ex: meusite.com; veja http://google.com/analytics" + ga_universal_auto_link_domains: "Habilitar o acompanhamento de vários domínios do Google Universal Analytics (analytics.js). Os links de saída para esses domínios terão o ID do cliente adicionado a eles. Veja o Guia de acompanhamento de vários domínios do Google." gtm_container_id: "ID do container do Gerenciador de Tags do Google. eg: GTM-ABCDEF" enable_escaped_fragments: "Voltar à API de Ajax-Crawling do Google se nenhum webcrawler for detectado. Veja https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" allow_moderators_to_create_categories: "Permitir a criação de categorias por moderadores" cors_origins: "Origens permitidas para pedidos de origem-cruzada (CORS). Cada origem deve incluir http:// ou https://. A variável de ambiente DISCOURSE_ENABLE_CORS deve ser definida como true para habilitar CORS." use_admin_ip_whitelist: "Administradores só podem logar se estiverem na lista de IPs Filtrados (Administração > Logs > IPs Filtrados)." + blacklist_ip_blocks: "Uma lista de blocos IP privados que nunca devem ser rastreados pelo Discourse" + whitelist_internal_hosts: "Uma lista de hosts internos que o discurso pode rastrear com segurança para o oneboxing e outros fins" + allowed_iframes: "Uma lista de prefixos de domínio iframe src que o discurso pode permitir com segurança em postagens" + whitelisted_crawler_user_agents: 'Agentes do usuário de rastreadores da Web que devem ter permissão para acessar o site.' + blacklisted_crawler_user_agents: 'Palavra insensível a maiúsculas e minúsculas na sequência do agente do usuário que identifica os rastreadores da Web que não devem ter permissão para acessar o site. Não se aplica se a lista de permissões estiver definida.' + slow_down_crawler_user_agents: 'Agentes do usuário de rastreadores da web que devem ter uma taxa limitada em robots.txt usando a diretiva de rastreamento atrasado' + slow_down_crawler_rate: 'Se slow_down_crawler_user_agents for especificado, essa taxa será aplicada a todos os rastreadores (número de segundos de atraso entre as solicitações)' top_menu: "Determina quais items aparecem na navegação da homepage, e em qual ordem. Exemplo latest|new|unread|categories|top|read|posted|bookmarks" - post_menu: "A ordem dos items no menu da postagem." + post_menu: "Determine quais itens aparecem no menu de postagem e em qual ordem. Exemplo como | editar | sinalizar | excluir | compartilhar | marcador | resposta" post_menu_hidden_items: "Os items de menu a ser escondidos por padrão no menu de postagem, a menos que uma elipse de expansão seja clicada." share_links: "Determine quais itens aparecem na caixa de diálogo de compartilhamento, e em qual ordem." - track_external_right_clicks: "Monitorar cliques externos que são clicados com o botão direito (ex: abrir em nova aba) desativado por padrão, pois tem que reescrever urls, quebrando a usabilidade" site_contact_username: "Um nome de usuário válido de membro da equipe para enviar todas mensagens automáticas por ele. Se deixado em branco a conta padrão System será utilizada." send_welcome_message: "Enviar a todos novos usuários uma mensagem de boas vindas com um guia de início rápido." + send_tl1_welcome_message: "Envie aos novos usuários do nível de confiança 1 uma mensagem de boas-vindas." suppress_reply_directly_below: "Não mostrar a contagem de respostas expansível em um post quando há apenas uma única resposta diretamente abaixo deste post." suppress_reply_directly_above: "Não mostrar a em-resposta-à expansível em um post quando há apenas uma única resposta diretamente acima deste post." suppress_reply_when_quoting: "Não mostrar a em-resposta-à expansível em um post quando o post cita a resposta." @@ -862,18 +1149,26 @@ pt_BR: top_page_default_timeframe: "Intervalo de tempo padrão para a página de melhores publicações. " show_email_on_profile: "Mostrar o email de um usuário em seus perfis (apenas visível a eles mesmos e staff)" prioritize_username_in_ux: "Mostrar primeiro o nome de usuário na página do usuário, cartão do usuário e publicações (quando desabilitado, o nome será mostrado primeiro) " + enable_rich_text_paste: "Ative a conversão automática de HTML para Markdown ao colar texto no compositor. (Experimental)" email_token_valid_hours: "Tokens de Esqueceu senha / ativar conta são válidas por (n) horas." enable_badges: "Habilita o sistema de emblemas" + enable_whispers: "Permitir a comunicação pessoal da equipe nos tópicos." allow_index_in_robots_txt: "Especificar no robots.txt que este site é permitido de ser indexado por sistemas de busca na web." email_domains_blacklist: "Lista delimitada por barras (|) de domínios de email que não são permitidos registros de contas. Exemplo: mailinator.com|trashmail.net" email_domains_whitelist: "Lista separada por barra (|) de domínios de email que usuários DEVEM usar para registrar contas. CUIDADO: Usuário com domínio de email diferentes da lista não serão permitidos!" + hide_email_address_taken: "Não informe os usuários de que existe uma conta com um determinado endereço de e-mail durante a inscrição e o formulário de senha esquecida." log_out_strict: "Quando deslogando, deslogar TODAS as sessões do usuário em todos os dispositivos" version_checks: "Pingar Discourse Hub para atualizações de versão e exibir mensagens de versão no Painel em /admin" new_version_emails: "Enviar um email para o endereço contact_email quando uma nova versão do Discourse estiver disponível." invite_expiry_days: "Quantos dias as chaves de convite são válidas." + invite_only: "O registro público está desativado, todos os novos usuários devem ser convidados explicitamente pela equipe." login_required: "Exigir autenticação para ler conteúdo neste site, desabilitar acesso anônimo." + min_username_length: "Tamanho mínimo de nome de usuário em caracteres. ATENÇÃO: se algum usuário ou grupo existente tiver nomes menores que isso, seu site irá quebrar!" + max_username_length: "Tamanho máximo de nome de usuário em caracteres. ATENÇÃO: se algum usuário ou grupo existente tiver nomes maiores que isso, seu site irá quebrar!" + reserved_usernames: "Nomes de usuário para os quais a inscrição não é permitida. O símbolo curinga * pode ser usado para corresponder a qualquer caractere zero ou mais vezes." min_password_length: "Comprimento mínimo da senha." min_admin_password_length: "Tamanho de senha mínima para Administradores." + password_unique_characters: "Número mínimo de caracteres únicos que uma senha deve ter." block_common_passwords: "Não permitir senhas que estiverem entre as 10,000 senhas mais comuns." enable_sso: "Permite autenticação única atráves de site externo (AVISO: OS ENDEREÇOS DE E-MAIL *DEVEM* SER VALIDADOS PELO SITE EXTERNO!)" verbose_sso_logging: "Logar diagnósticos verbosos relacionado ao SSO nos /logs" @@ -881,11 +1176,17 @@ pt_BR: sso_url: "URL do ponto final do logon único (SSO) (deve incluir http:// ou https://)" sso_secret: "String secreta usada para autenticar criptograficamente informação de SSO, esteja certo de que possui 10 ou mais caracteres" sso_overrides_bio: "Sobrescreve a bio de usuário e impede o usuário de mudá-la." + sso_overrides_groups: "Sincronize todos os membros do grupo manual com grupos especificados no atributo sso do grupo (ATENÇÃO: se você não especificar grupos, todos os membros do grupo manual serão limpos para o usuário)" sso_overrides_email: "Substitui endereço de e-mail local pelo fornecido no site externo através de cada informação de login, e previne mudanças locais. (AVISO: discrepâncias podem ocorrer devido a normalização de e-mails locais)" sso_overrides_username: "Substitui nome de usuário local com o fornecido pelo site externo através da informação de cada login, e previne mudanças locais. (AVISO: discrepâncias podem ocorrer devido a diferenças ao tamanho e pré-requisitos de nomes de usuário)" sso_overrides_name: "Substitui nome completo local com nome completo do site externo através da informação de login, e previne mudanças locais." sso_overrides_avatar: "Substitui o avatar do usuário pelo avatar do site externo de SSO. Se habilitado, desabilitar allow_uploaded_avatars é altamente recomendado" + sso_overrides_profile_background: "Substitui o plano de fundo do perfil do usuário pelo avatar do site externo da carga útil do SSO." + sso_overrides_card_background: "Substitui o plano de fundo do cartão do usuário pelo avatar do site externo da carga útil do SSO." sso_not_approved_url: "Redireciona contas não aprovadas no login externo para este endereço" + sso_allows_all_return_paths: "Não restrinja o domínio para return_paths fornecidos pelo SSO (por padrão, o caminho de retorno deve estar no site atual)" + enable_local_logins: "Ativar contas locais de login com nome de usuário e senha. Isso deve estar ativado para convites para o trabalho. ATENÇÃO: se estiver desabilitado, você pode não conseguir fazer o login se você não configurou anteriormente pelo menos um método de login alternativo." + enable_local_logins_via_email: "Permitir que os usuários solicitem um link de login com um clique para serem enviados por e-mail." allow_new_registrations: "Permitir registro de novos usuários. Desmarque isso para prevenir quem quer que seja de criar uma nova conta." enable_signup_cta: "Mostra um aviso aos usuários anônimos que retornem, solicitando que criem uma conta." enable_yahoo_logins: "Ativar autenticação pelo Yahoo" @@ -893,6 +1194,8 @@ pt_BR: google_oauth2_client_id: "Client ID da sua aplicação Google." google_oauth2_client_secret: "Client secret da sua aplicação Google." enable_twitter_logins: "Ativar autenticação pelo Twitter, requer twitter_consumer_key e twitter_consumer_secret" + twitter_consumer_key: "Chave do consumidor para autenticação do Twitter, registrada em https://apps.twitter.com/" + twitter_consumer_secret: "Segredo do consumidor para autenticação do Twitter, registrado em https://apps.twitter.com/" enable_instagram_logins: "Habilitar autenticação via Instagram. Requer instagram_consumer_key e instagram_consumer_secret" instagram_consumer_key: "Chave de consumidor para autenticação via Instagram" instagram_consumer_secret: "Segredo de consumidor para autenticação via Instagram" @@ -903,11 +1206,15 @@ pt_BR: github_client_id: "Client id para autenticação via Github, registrado em https://github.com/settings/applications" github_client_secret: "Client secret para autenticação via Github, registrado em https://github.com/settings/applications" readonly_mode_during_backup: "Habilitar modo de apenas leitura quando estiver realizando um backup" + enable_backups: "Permitir que administradores criem backups do fórum" allow_restore: "Permitir restauração, que pode substituir todos os dados do site! Deixe falsa, a menos que você pretenda restaurar um backup" maximum_backups: "A quantidade máxima de backups para manter no disco. Backups mais antigos são excluídos automaticamente" automatic_backups_enabled: "Realizar backups automáticos, como definido na frequência de backup" + backup_frequency: "O número de dias entre os backups." enable_s3_backups: "Fazer upload dos backups para o S3 quando completado. IMPORTANTE: exige credenciais válidas do S3 configuradas nas Configurações de Arquivos." s3_backup_bucket: "O repositório remoto para realizar backups. AVISO: Certifique-se de que é um repositório privado." + s3_endpoint: "O endpoint pode ser modificado para fazer backup em um serviço compatível com S3, como DigitalOcean Spaces ou Minio. AVISO: use o padrão se estiver usando o AWS S3" + s3_force_path_style: "Implemente o endereçamento de estilo de caminho para seu endpoint personalizado. IMPORTANTE: Necessário para usar uploads e backups do Minio." s3_disable_cleanup: "Desabilitar a remoção de backups na S3 quando removidos localmente." backup_time_of_day: "Hora do dia, em UTC, quando o backup deve ocorrer." backup_with_uploads: "Incluir uploads nos backups programados. Desabilite para copiar apenas a base de dados. " @@ -918,6 +1225,7 @@ pt_BR: top_topics_formula_first_post_likes_multiplier: "valor do multiplicador de curtidas do primeiro post (n) na fórmula dos melhores tópicos: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" top_topics_formula_least_likes_per_post_multiplier: "valor do multiplicador da menor quantidade de curtidas por publicação (n) na fórmula de melhores tópicos: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" rebake_old_posts_count: "Número de publicações antigas a serem renderizadas novamente a cada 15 minutos." + enable_safe_mode: "Permitir que os usuários insiram o modo de segurança para depurar plug-ins." rate_limit_create_topic: "Após criar um tópico, os usuários devem aguardar (n) segundos antes de criar um outro tópico." rate_limit_create_post: "Após postar, os usuários devem aguardar (n) segundos antes de criar um outro post." rate_limit_new_user_create_topic: "Após criar um tópico, novos usuários devem aguardar (n) segundos antes de criar um outro tópico." @@ -927,8 +1235,13 @@ pt_BR: max_bookmarks_per_day: "Número máximo de novos favoritos por usuário por dia." max_edits_per_day: "Número máximo de edições que um usuário pode fazer por dia." max_topics_per_day: "Número máximo de postagens que um usuário pode criar por dia." + max_personal_messages_per_day: "Número máximo de mensagens que os usuários podem criar por dia." max_invites_per_day: "Número máximo de convites que um usuário pode enviar por dia." max_topic_invitations_per_day: "Número máximo de convites para tópicos que um usuário pode enviar por dia." + max_logins_per_ip_per_hour: "Número máximo de logins permitidos por endereço IP por hora" + max_logins_per_ip_per_minute: "Número máximo de logins permitidos por endereço IP por minuto" + max_post_deletions_per_minute: "Número máximo de postagens que um usuário pode excluir por minuto." + max_post_deletions_per_day: "Número máximo de postagens que um usuário pode excluir por dia." alert_admins_if_errors_per_minute: "Número de erros por minutos para desencadear um alerta aos administradores. Um valor igual a 0 desabilita esse recurso. NOTA: requer reinicialização." alert_admins_if_errors_per_hour: "Número de erros por hora para desencadear um alerta aos administradores. Um valor igual a 0 desabilita esse recurso. NOTA: requer reinicialização." categories_topics: "Números de tópicos a serem mostrados na página /categorias." @@ -938,7 +1251,9 @@ pt_BR: clean_up_uploads: "Remover envios sem referência para evitar hospedagem ilegal. AVISO: você pode querer fazer um backup do seu diretório de /uploads antes de habilitar essa configuração." clean_orphan_uploads_grace_period_hours: "Carência (em horas) antes de um upload órfão ser removido." purge_deleted_uploads_grace_period_days: "Carência (em dias) antes que um upload excluído seja apagado." + purge_unactivated_users_grace_period_days: "Período de carência (em dias) antes que um usuário que não tenha ativado sua conta seja excluído. Defina como 0 para nunca eliminar usuários não ativados." enable_s3_uploads: "Colocar uploads no armazenamento da Amazon S3. IMPORTANTE: exige credenciais válidas da S3 (ambos id da chave de acesso & segredo da chave de acesso)." + s3_use_iam_profile: 'Use um AWS EC2 instance profile para conceder acesso ao bucket S3. NOTA: habilitar isso requer que o Discourse esteja sendo executado em uma instância EC2 apropriadamente configurada, e sobrescreve as configurações "s3 access key key" e "s3 secret access key".' s3_upload_bucket: "Nome do bucket da Amazon S3 no qual os arquivos serão enviados. AVISO: precisa ser em minúsculas, sem pontos, sem underscores." s3_access_key_id: "A id da chave de acesso da Amazon S3 que será usada para fazer upload de imagens." s3_secret_access_key: "O segredo da chave de acesso da Amazon S3 que será usada para fazer upload de imagens." @@ -947,9 +1262,15 @@ pt_BR: avatar_sizes: "Lista de tamanhos de avatar gerados automaticamente." external_system_avatars_enabled: "Usar serviço de avatar externo." external_system_avatars_url: "URL do sistema externo do serviço de avatares. Substituições permitidas são {username} {first_letter} {color} {size}" + selectable_avatars_enabled: "Force os usuários a escolher um avatar da lista." + selectable_avatars: "Lista de usuários avatares podem escolher." default_opengraph_image_url: "URL da imagem opengraph padrão." twitter_summary_large_image_url: "URL da imagem do cartão de resumo padrão do Twitter (deve ter pelo menos 280px de largura e pelo menos 150px de altura)." allow_all_attachments_for_group_messages: "Permitir todos os anexos de e-mail para mensagens de grupo." + png_to_jpg_quality: "Qualidade do arquivo JPG convertido (1 é a qualidade mais baixa, 99 é a melhor qualidade, 100 a desabilitar)." + allow_staff_to_upload_any_file_in_pm: "Permitir que membros da equipe façam upload de arquivos no PM." + strip_image_metadata: "Retire os metadados da imagem." + min_ratio_to_crop: "Taxa usada para cortar imagens altas. Digite o resultado da largura / altura." enable_flash_video_onebox: "Habilitar o embutir de links swf e flv (Adobe Flash) em oneboxes. AVISO: pode introduzir riscos de segurança." default_invitee_trust_level: "Nível de confiança (0-4) padrão para usuários convidados." default_trust_level: "Nível de confiança (0-4) para todos novos usuários. CUIDADO! Mudar irá colocar em sérios riscos de spam." @@ -964,34 +1285,58 @@ pt_BR: tl2_requires_likes_given: "Quantos likes um usuário deve dar antes de ser promovido a nível de confiança 2." tl2_requires_topic_reply_count: "Quantos tópicos um usuário deve responder antes de ser promovido a nível de confiança 2." tl3_time_period: "Período de tempo (em dias) requerido para o Nível de Confiança 3" + tl3_requires_days_visited: "Número mínimo de dias que um usuário precisa ter visitado o site nos últimos (tl3 período de tempo) dias para se qualificar para promoção ao nível de confiança 3. Defina um período de tempo maior que tl3 para desabilitar as promoções para tl3. (0 ou superior)" + tl3_requires_topics_replied_to: "Número mínimo de tópicos para os quais um usuário precisa responder no último (tl3 período de tempo) dias para se qualificar para promoção ao nível de confiança 3. (0 ou superior)" + tl3_requires_topics_viewed: "A porcentagem de tópicos criados no último (tl3 período de tempo) dias que um usuário precisa ter visto para se qualificar para promoção para o nível de confiança 3. (0 a 100)" + tl3_requires_topics_viewed_cap: "O número máximo necessário de tópicos visualizados nos últimos (tl3 período de tempo) dias." + tl3_requires_posts_read: "A porcentagem de postagens criadas no último (tl3 período de tempo) dias que um usuário precisa ter visto para se qualificar para a promoção para o nível de confiança 3. (0 a 100)" + tl3_requires_posts_read_cap: "O número máximo necessário de postagens lidas nos últimos (tl3 período de tempo) dias." tl3_requires_topics_viewed_all_time: "O mínimo total de tópicos que um usuário precisa ter visto para se qualificar a promoção ao nível de confiança 3." tl3_requires_posts_read_all_time: "O mínimo total de postagens que um usuário precisa ter lido para se qualificar a promoção ao nível de confiança 3." + tl3_requires_max_flagged: "O usuário não deve ter mais de x postagens sinalizadas por x usuários diferentes nos últimos (tl3 período de tempo) dias para se qualificar para promoção ao nível de confiança 3, onde x é o valor dessa configuração. (0 ou superior)" tl3_promotion_min_duration: "O número mínimo de dias que uma promoção ao nível 3 dura antes que um usuário possa ser rebaixado novamente ao nível de confiança 2." + tl3_requires_likes_given: "O número mínimo de curtidas que deve ser dado no último (tl3 período de tempo) dias para se qualificar para a promoção para o nível de confiança 3." + tl3_requires_likes_received: "O número mínimo de curtidas que devem ser recebidas no último (tl3 período de tempo) dias para se qualificarem para a promoção para o nível de confiança 3." tl3_links_no_follow: "Não remover rel=nofollow de links postados por usuários do nível de confiança 3." + trusted_users_can_edit_others: "Permitir que usuários com altos níveis de confiança editem conteúdo de outros usuários" min_trust_to_create_topic: "O nível de confiança mínimo necessário para criar um novo tópico." + allow_flagging_staff: "Se ativado, os usuários podem sinalizar postagens de contas de equipe." min_trust_to_edit_wiki_post: "O nível de confiança mínimo necessário para editar uma postagem marcada como wiki." min_trust_to_edit_post: "O nível mínimo de confiança requerido para editar posts. " + min_trust_to_allow_self_wiki: "O nível de confiança mínimo necessário para criar o próprio wiki do usuário." + min_trust_to_send_messages: "O nível de confiança mínimo necessário para criar novas mensagens pessoais." + min_trust_to_flag_posts: "O nível de confiança mínimo necessário para sinalizar postagens" + min_trust_to_post_links: "O nível de confiança mínimo necessário para incluir links em postagens" + min_trust_to_post_images: "O nível de confiança mínimo necessário para incluir imagens em uma postagem" + whitelisted_link_domains: "Domínios aos quais os usuários podem vincular, mesmo que não tenham o nível de confiança apropriado para postar links" newuser_max_links: "Quandos links um usuário novo pode adicionar a um post." newuser_max_images: "Quantas imagens um usuário novo pode adicionar a um post." newuser_max_attachments: "Quantos arquivos anexos um usuário novo pode adicionar a um post." newuser_max_mentions_per_post: "Número máximo de notificações @nome que um usuário novo pode usar em um post." newuser_max_replies_per_topic: "Número máximo de respostas que um usuário novo pode fazer em um único tópico até que alguém os responda." max_mentions_per_post: "Número máximo de notificações @nome que quem quer que seja pode usar em um post." + max_users_notified_per_group_mention: "Número máximo de usuários que podem receber uma notificação se um grupo for mencionado (se o limite for atingido, nenhuma notificação será gerada)" + enable_mentions: "Permitir que os usuários mencionem outros usuários." create_thumbnails: "Criar thumbnails e lightbox para imagens que são muito largas para caber em uma postagem." email_time_window_mins: "Aguardar (n) minutos antes de enviar quaisquer emails de notificação, para dar aos usuários uma chance de editarem e finalizarem seus posts." + personal_email_time_window_seconds: "Aguarde (n) segundos antes de enviar qualquer e-mail de notificação de mensagem pessoal, para dar aos usuários a chance de editar e finalizar suas mensagens." email_posts_context: "Quantas respostas prévias incluir como contexto em emails de notificação." flush_timings_secs: "Frequência, em segundos, que irá descarregar dados de tempo para o servidor." title_max_word_length: "Comprimento máximo, em caracteres, de uma palavra permitida no título de um tópico." title_min_entropy: "A entropia mínima (caracteres únicos, não inglês contam mais) necessária para um título de tópico." body_min_entropy: "A entropia mínima (caracteres únicos, não inglês contam mais) necessária para o corpo de uma mensagem." + allow_uppercase_posts: "Permitir todas as maiúsculas em um título de tópico ou em um corpo de postagem." title_fancy_entities: "Converter caracteres ASCII comuns em entidades HTML nos títulos dos tópicos, ala SmartyPants http://daringfireball.net/projects/smartypants/" min_title_similar_length: "O tamanho mínimo de um título antes que ele seja checado por tópicos semelhantes." min_body_similar_length: "O tamanho mínimo do corpo de conteúdo de um post antes que ele seja checado por tópicos semelhantes." + desktop_category_page_style: "Estilo visual para a página / categorias." category_colors: "Uma lista de valores hexadecimais de cor permitidos para categorias." category_style: "Estilo visual para emblemas de categoria." max_image_size_kb: "O tamanho máximo de upload de imagem em kB. Isso precisa ser configurado no nginx (client_max_body_size) / apache ou também proxy." max_attachment_size_kb: "O tamanho máximo de upload de arquivos anexos em kB. Isso precisa ser configurado no nginx (client_max_body_size) / apache ou também proxy." authorized_extensions: "Uma lista de extensões de arquivo permitidas para upload (use '*' para permitir todos os tipos de arquivos)" + authorized_extensions_for_staff: "Uma lista de extensões de arquivo permitidas para upload para usuários da equipe, além da lista definida na configuração do site `authorized_extensions`. (use '*' para ativar todos os tipos de arquivo)" + theme_authorized_extensions: "Uma lista de extensões de arquivo permitidas para uploads de temas (use '*' para ativar todos os tipos de arquivos)" max_similar_results: "Quantos tópicos semelhantes exibir acima do editor quando compondo um novo tópico. A comparação é baseada no título e no corpo." max_image_megapixels: "Número máximo de megapixels permitidos em uma imagem." title_prettify: "Prevenir erros comuns em títulos, incluindo caps-lock ligado, primeira letra minúscula, excesso de ! e ?, pontos extras no final, etc." @@ -1010,8 +1355,12 @@ pt_BR: faq_url: "Se você possui um FAQ hospedado em outro local e que você queira usar, forneça a URL completa aqui." tos_url: "Se você tem um documento de Termos de Serviço hospedado em algum outro local que você queira usar, forneça a URL completa aqui." privacy_policy_url: "Se você tem um documento de Política de Privacidade hospedado em algum outro local que você queira usar, forneça a URL completa aqui." + log_anonymizer_details: "Se deseja manter os detalhes de um usuário no log depois de ser anonimizado. Ao cumprir com o GDPR, você precisará desativá-lo." + newuser_spam_host_threshold: "Quantas vezes um novo usuário pode postar um link para o mesmo host em suas postagens `newuser_spam_host_threshold` antes de ser considerado spam." white_listed_spam_host_domains: "Uma lista de domínios excluídas do teste de spam. Usuários novos nunca serão restringidos de criar posts com links para estes domínios." staff_like_weight: "Qual o fator de ênfase extra a dar para likes da staff." + topic_view_duration_hours: "Conte uma nova visualização de tópico uma vez por IP / Usuário a cada N horas" + user_profile_view_duration_hours: "Conte uma nova visualização de perfil de usuário uma vez por IP / Usuário a cada N horas" levenshtein_distance_spammer_emails: "Ao equiparar emails de spammers, o número da diferença de caracteres que ainda assim irá permitir uma equiparação imprecisa." max_new_accounts_per_registration_ip: "Se já houver (n) contas com o nível de confiança 0 deste IP (e nenhum for membro da staff ou tiver NC2 ou mais alto), parar de aceitar novas assinaturas daquele IP." min_ban_entries_for_roll_up: "Ao clicar no botão Combinar, criará uma entrada de banimento de subrede se houverem ao menos (N) entradas." @@ -1019,48 +1368,114 @@ pt_BR: max_age_unmatched_ips: "Excluir entradas de IPs filtrados não combinadas após (N) dias." num_flaggers_to_close_topic: "Número mínimo de usuários sinalizadores únicos que são exigidos para que um tópico seja automaticamente pausado por intervenção" num_flags_to_close_topic: "Número mínimo de sinalizações ativas que são exigidas para que um tópico seja automaticamente pausado por intervenção" + num_hours_to_close_topic: "Número de horas para pausar um tópico para intervenção." auto_respond_to_flag_actions: "Habilitar resposta automática quando eliminada marcação." + min_first_post_typing_time: "Quantidade mínima de tempo, em milissegundos, que um usuário deve digitar durante a primeira postagem; se o limite não for atingido, a postagem entrará automaticamente na fila de aprovação de necessidades. Defina como 0 para desativar (não recomendado)" + auto_silence_fast_typers_on_first_post: "Silenciar automaticamente usuários que não atendem a min_first_post_typing_time" + auto_silence_fast_typers_max_trust_level: "Nível máximo de confiança para silenciar automaticamente os tipos rápidos" + auto_silence_first_post_regex: "Regex insensitivo a maiúsculas e minúsculas que, se for transmitido, fará com que o primeiro post do usuário seja silenciado e enviado para a fila de aprovação. Exemplo: raging | a [bc] a, fará com que todas as mensagens contendo raging ou aba ou aca sejam silenciadas primeiro. Aplica-se apenas ao primeiro post." + flags_default_topics: "Mostrar os tópicos sinalizados por padrão na seção admin" + min_flags_staff_visibility: "A quantidade mínima de sinalizadores em uma postagem deve ter antes que a equipe possa vê-la na seção administrativa" reply_by_email_enabled: "Habilitar responder tópicos via email" reply_by_email_address: "Template de resposta por email, por exemplo: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "Impedir o Discourse de enviar qualquer tipo de emails." + alternative_reply_by_email_addresses: "Lista de modelos alternativos para responder por e-mail a endereços de e-mail recebidos. Exemplo:%{reply_key}@reply.example.com|replies+%{reply_key}@example.com" + incoming_email_prefer_html: "Use HTML em vez de texto para email recebido." + disable_emails: "Evite Discurso de enviar qualquer tipo de e-mails. Selecione \"sim\" para desativar os e-mails de todos os usuários. Selecione \"não pessoal\" para desativar os e-mails apenas para usuários que não são funcionários." strip_images_from_short_emails: "Arrancar imagens de emails cujo tamanho seja menor que 2800 Bytes" short_email_length: "Tamanho de email curto em Bytes" + display_name_on_email_from: "Exibir nomes completos no e-mail dos campos" + unsubscribe_via_email: "Permitir que os usuários cancelem a inscrição de e-mails enviando um e-mail com \"cancelamento de inscrição\" no assunto ou no corpo" + unsubscribe_via_email_footer: "Anexar um cancelamento de inscrição via email mailto: link para o rodapé dos emails enviados" + delete_email_logs_after_days: "Apagar logs de e-mail depois de (n) dias. 0 para mantê-lo definitivamente." + max_emails_per_day_per_user: "Número máximo de emails para enviar usuários por dia. 0 para desabilitar o limite" + enable_staged_users: "Crie automaticamente usuários temporários durante o processamento de emails recebidos." + maximum_staged_users_per_email: "Número máximo de usuários preparados usando o processamento de um e-mail recebido." + auto_generated_whitelist: "Lista de endereços de e-mail que não serão verificados quanto a conteúdo gerado automaticamente. Exemplo: foo@bar.com | discourse@bar.com" + block_auto_generated_emails: "Bloqueie os e-mails recebidos identificados como gerados automaticamente." + ignore_by_title: "Ignore os e-mails recebidos com base no título deles." + mailgun_api_key: "A chave da API Secreta do Mailgun é usada para verificar as mensagens do webhook." + soft_bounce_score: "Pontuação de rejeição adicionada ao usuário quando ocorre uma rejeição temporária." + hard_bounce_score: "Pontuação de rejeição adicionada ao usuário quando ocorre uma rejeição permanente." + bounce_score_threshold: "Pontuação máxima de rejeição antes de deixarmos de enviar um email a um usuário." + bounce_score_threshold_deactivate: "Pontuação máxima de rejeição antes de desativarmos um usuário." + reset_bounce_score_after_days: "Redefinir automaticamente a pontuação de rejeição após X dias." + attachment_content_type_blacklist: "Lista de palavras-chave usadas para anexos de lista negra com base no tipo de conteúdo." + attachment_filename_blacklist: "Lista de palavras-chave usadas para anexos de lista negra com base no nome do arquivo." + enable_forwarded_emails: "[BETA] Permitir que os usuários criem um tópico encaminhando um e-mail para." + always_show_trimmed_content: "Sempre mostre a parte aparada dos emails recebidos. AVISO: pode revelar endereços de e-mail." + private_email: "Não inclua conteúdo de postagens ou tópicos em e-mails para privacidade extra." + manual_polling_enabled: "Enviar e-mails usando a API para respostas por e-mail." pop3_polling_enabled: "POLLar via POP3 por respostas via email." pop3_polling_ssl: "Usar SSL ao conectar ao servidor POP3. (Recomendado)" + pop3_polling_openssl_verify: "Verifique o certificado do servidor TLS (Padrão: ativado)" pop3_polling_period_mins: "O período em minutos para checar a conta de POP3 por emails. NOTA: exige reinício." pop3_polling_port: "A porta em que conectar a uma conta POP3." pop3_polling_host: "O host no qual conectar via POP3 para pegar emails." pop3_polling_username: "O nome de usuário para a conta POP3 na qual pegar emails." pop3_polling_password: "A senha para a conta POP3 na qual pegar emails." + pop3_polling_delete_from_server: "Apagar e-mails do servidor. NOTA: Se você desabilitar isso, você deve limpar manualmente sua caixa de entrada" + log_mail_processing_failures: "Registre todas as falhas de processamento de e-mail em http://yoursitename.com/logs" + email_in: "Permitir que os usuários postem novos tópicos por e-mail (requer pesquisa manual ou POP3). Configure os endereços na guia \"Configurações\" de cada categoria." email_in_min_trust: "O nível de confiança mínimo que um usuário necessita ter para ser permitido a postar novos tópicos via email." + email_in_spam_header: "O cabeçalho do email para detectar spam." email_prefix: "A [etiqueta] usada no assunto dos emails. Ele será por padrão 'título' se não configurada." email_site_title: "O título do site usado como o enviador dos emails do site. Por padrão será 'título' se não for configurado. Se o seu 'título' contiver caracteres que não são permitidos em strings de enviador de emails, utilize esta configuração." + find_related_post_with_key: "Use somente a \"chave de resposta\" para encontrar a postagem respondida. AVISO: desativar isso permite a representação do usuário com base no endereço de e-mail." minimum_topics_similar: "Quantos tópicos devem existir antes que tópicos semelhantes sejam apresentados ao compor novos tópicos." relative_date_duration: "Número de dias após postar quando datas de postagem serão mostradas como relativas (7d) ao invés de absolutas (20 Fev)." delete_user_max_post_age: "Não permitir deletar usuários cujo primeiro post for mais antigo do que (x) dias." delete_all_posts_max: "Número máximo de postagens que podem ser apagadas de uma vez com o botão Remover Todos Postagens. Se um usuário tiver mais postagens do que este número, as postagens não poderão ser todas removidas de uma vez e o usuário não poderá ser removido." + username_change_period: "O número máximo de dias após o registro que as contas podem alterar seu nome de usuário (0 para não permitir a mudança de nome de usuário)." email_editable: "Permitir que os usuários alterem o seu endereço de e-mail após o registro." + logout_redirect: "Local para redirecionar o navegador para depois do logout (por exemplo: http://example.com/logout)" allow_uploaded_avatars: "Permitir aos usuários carregar fotos em seu perfil personalizado." allow_animated_avatars: "Permitir que os usuários usem GIF animados na foto do perfil. ATENÇÃO: executar os avatares: atualizar tarefa rake após alterar essa configuração." allow_animated_thumbnails: "Gera thumbnails animados a partir de gifs animados." default_avatars: "URLs para avatars que serão usadas por padrão para novos usuários até que sejam alteradas por eles." automatically_download_gravatars: "Fazer download de Gravatars dos usuários ao criar conta ou mudança de email." + digest_topics: "O número máximo de tópicos populares a serem exibidos no resumo de e-mail." + digest_posts: "O número máximo de postagens populares a serem exibidas no resumo de e-mail." + digest_other_topics: "O número máximo de tópicos a serem exibidos na seção \"Novos tópicos e categorias que você segue\" do resumo por e-mail." + digest_min_excerpt_length: "Trecho de postagem mínima no resumo de e-mail, em caracteres." + suppress_digest_email_after_days: "Suprima e-mails de resumo para usuários não vistos no site por mais de (n) dias." + digest_suppress_categories: "Suprima essas categorias dos emails de resumo." + disable_digest_emails: "Desabilitar e-mails de resumo para todos os usuários." + email_accent_bg_color: "A cor de destaque a ser usada como plano de fundo de alguns elementos em emails HTML. Digite um nome de cor ('vermelho') ou valor hexadecimal ('# FF0000')." + email_accent_fg_color: "A cor do texto renderizado na cor do e-mail bg em emails HTML. Digite um nome de cor ('branco') ou valor hexadecimal ('#FFFFFF')." + email_link_color: "A cor dos links em e-mails HTML. Digite um nome de cor ('azul') ou valor hexadecimal ('# 0000FF')." + detect_custom_avatars: "Se deve ou não verificar se os usuários enviaram imagens de perfil personalizadas." max_daily_gravatar_crawls: "Número máximo de vezes que o Discourse irá checar o Gravatar por avatares personalizados em um dia" public_user_custom_fields: "Um conjunto de campos personalizados para um usuário que podem ser apresentados publicamente." staff_user_custom_fields: "Um conjunto de campos personalizados para um usuário que pode ser mostrado para membros da equipe." enable_user_directory: "Fornece um diretório de usuários para navegar" + enable_group_directory: "Fornecer um diretório de grupos para navegação" + group_in_subject: "Definir %{optional_pm}no assunto do e-mail ao nome do primeiro grupo no MP, veja:https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" allow_anonymous_posting: "Permitir usuários trocar para modo anônimo" anonymous_posting_min_trust_level: "Nível de confiança mínimo necessária para habilitar mensagens anônimas" anonymous_account_duration_minutes: "Para proteger anonimidade cria uma conta anônima a cada N minutos para cada usuário. Exemplo: se configurado para 600, assim que passar 600 minutos da última mensagem E o usuário trocar para anônimo, uma nova conta anônima será criada." hide_user_profiles_from_public: "Desativar cartões de usuários, perfis de usuário e diretório de usuário para usuários anônimos." + show_inactive_accounts: "Permitir que usuários conectados naveguem em perfis de contas inativas." + hide_suspension_reasons: "Não exiba razões de suspensão publicamente nos perfis de usuário." + log_personal_messages_views: "Registre visualizações de mensagens pessoais pelo administrador para outros usuários / grupos." + user_website_domains_whitelist: "O website do usuário será verificado em relação a esses domínios. Lista delimitada por pipe." allow_profile_backgrounds: "Permitir usuários de fazerem upload de backgrounds para o perfil" + sequential_replies_threshold: "Número de postagens que um usuário precisa fazer em uma linha em um tópico antes de ser lembrado sobre muitas respostas sequenciais." + get_a_room_threshold: "Número de postagens que um usuário precisa fazer para a mesma pessoa no mesmo tópico antes de ser avisado." enable_mobile_theme: "Os dispositivos móveis usam um tema mobile-friendly, com a possibilidade de mudar para o site completo. Desative isso se você quiser usar um estilo personalizado que é totalmente responsivo." dominating_topic_minimum_percent: "Qual o percentual de postagens que um usuário precisa fazer em um tópico antes de ser relembrado sobre ser excessivamente dominante em um tópico." + disable_avatar_education_message: "Desabilitar mensagem de educação para mudar de avatar." suppress_uncategorized_badge: "Não mostrar emblema para assuntos não categorizados em listas de tópicos" + header_dropdown_category_count: "Quantas categorias podem ser exibidas no menu suspenso do cabeçalho." + permalink_normalizations: "Aplique o seguinte regex antes de combinar permalinks, por exemplo: /(topic.*)\\?.*/\\1 irá retirar as strings de consulta das rotas de tópicos. Formato é regex + string use \\ 1 etc. para acessar capturas" global_notice: "Mostrar um banner global URGENTE, de EMERGÊNCIA para todos os visitantes, mude para branco para esconder (HTML permitido)." disable_edit_notifications: "Desabilitar modificação de notificações pelo sistema quando 'download_remote_images_to_local' estiver ativado." automatically_unpin_topics: "Desafixar automaticamente os tópicos quando o usuário atinge o fundo." read_time_word_count: "Palavras por minuto para calcular o tempo estimado de leitura." + topic_page_title_includes_category: "O título da página do tópico inclui o nome da categoria." + native_app_install_banner: "Solicita aos visitantes recorrentes que instalem o aplicativo nativo do Discourse." + share_anonymized_statistics: "Compartilhar estatísticas de uso anônimas." + auto_handle_queued_age: "Lidar automaticamente com os registros que estão aguardando revisão após vários dias. Sinalizadores serão ignorados. Postagens enfileiradas e usuários serão rejeitados. Defina como 0 para desabilitar esse recurso." + max_prints_per_hour_per_user: "Número máximo de impressões de páginas / impressão (definido como 0 para desativar)" full_name_required: "Nome completo é um campo obrigatório do perfil do usuário." enable_names: "Mostrar o nome completo do usuário em seu perfil, cartão de usuário, e emails. Desabilitar para esconder o nome completo em todos os lugares." display_name_on_posts: "Também exibir o nome completo do usuário em suas mensagens" @@ -1069,25 +1484,84 @@ pt_BR: default_code_lang: "Realce de sintaxe padrão da linguagem de programação aplicada a blocos de código GitHub (lang-auto, Ruby, Python, etc)" warn_reviving_old_topic_age: "Quando alguém começa a responder a um tópico mais velho do que este número de dias, um aviso será exibido para desencorajar o usuário de reviver uma velha discussão. Desabilite definindo para 0." autohighlight_all_code: "Aplicar código destacando todos os blocos de código pré-formatados, mesmo quando não for específica o idioma" + highlighted_languages: "Regras de destaque de sintaxe incluídas. (Atenção: incluir muitos idiomas pode afetar o desempenho) veja: https://highlightjs.org/static/demo/ para uma demonstração" embed_truncate: "Cortar os posts embutidos." + embed_support_markdown: "Suporte Markdown formatação para posts incorporados." + allowed_href_schemes: "Esquemas permitidos em links, além de http e https." embed_post_limit: "Número máximo de respostas para embutir" embed_username_required: "Nome de usuário para criação do tópico é obrigatório." + notify_about_flags_after: "Se houver bandeiras que não foram tratadas depois de muitas horas, envie uma mensagem pessoal para os moderadores. Defina como 0 para desativar." show_create_topics_notice: "Se o site tem menos de 5 tópicos públicos, mostrar um aviso pedindo para os administradores criarem alguns tópicos." delete_drafts_older_than_n_days: Apagar rascunhos mais antigos do que (N) dias. + bootstrap_mode_min_users: "Número mínimo de usuários necessários para desativar o modo de bootstrap (definido como 0 para desativado)" prevent_anons_from_downloading_files: "Impedir que usuários anônimos façam download de arquivos anexados. AVISO: isso irá impedir quaisquer componentes do site que não sejam imagens, tendo sido postados como anexos, de funcionar." slug_generation_method: "Escolha um método para geração de slug. 'Codificado' irá gerar strings com '%'. 'Nenhum' irá desabilitar a geração de slugs." enable_emoji: "Habilitar emoji" + enable_emoji_shortcuts: "Texto em smiley comum como :): p :( será convertido em emojis" emoji_set: "Como você gostaria do seu emoji?" enforce_square_emoji: "Forçar proporção quadrangular para todos emojis." + emoji_autocomplete_min_chars: "Número mínimo de caracteres necessários para acionar o pop-up de emoji de preenchimento automático" + approve_post_count: "A quantidade de postagens de um usuário novo ou básico que deve ser aprovado" approve_unless_trust_level: "Mensagens para os usuários abaixo deste nível de confiança devem ser aprovados" approve_new_topics_unless_trust_level: "Mensagens para os usuários abaixo deste nível de confiança devem ser aprovados." + approve_unless_staged: "Novos tópicos e postagens para usuários temporários devem ser aprovados" + notify_about_queued_posts_after: "Se houver postagens que estão aguardando revisão por mais que muitas horas, envie uma notificação a todos os moderadores. Defina como 0 para desativar essas notificações." + auto_close_messages_post_count: "Número máximo de postagens permitidas em uma mensagem antes de ser automaticamente fechada (0 para desativar)" + auto_close_topics_post_count: "Número máximo de postagens permitidas em um tópico antes de ser automaticamente fechado (0 para desativar)" + code_formatting_style: "Botão de código no compositor será o padrão para este estilo de formatação de código" + max_allowed_message_recipients: "Máximo de destinatários permitidos em uma mensagem." + watched_words_regular_expressions: "Palavras assistidas são expressões regulares." + default_email_digest_frequency: "Com que frequência os usuários recebem e-mails de resumo por padrão." + default_include_tl0_in_digests: "Inclua mensagens de novos usuários em e-mails de resumo por padrão. Os usuários podem mudar isso em suas preferências." + default_email_personal_messages: "Envie um e-mail quando alguém enviar uma mensagem ao usuário por padrão." + default_email_direct: "Envie um e-mail quando alguém citar / responder / mencionar ou convidar o usuário por padrão." + default_email_mailing_list_mode: "Envie um e-mail para cada nova postagem por padrão." + default_email_mailing_list_mode_frequency: "Os usuários que ativam o modo de lista de e-mails receberão e-mails com frequência por padrão." + disable_mailing_list_mode: "Não permitir que os usuários ativem o modo de lista de discussão." + default_email_always: "Envie uma notificação por e-mail mesmo quando o usuário estiver ativo por padrão." + default_email_previous_replies: "Inclua respostas anteriores em e-mails por padrão." + default_email_in_reply_to: "Incluir trecho de resposta para postar em e-mails por padrão." + default_other_new_topic_duration_minutes: "Condição padrão global para a qual um tópico é considerado novo." + default_other_auto_track_topics_after_msecs: "Tempo padrão global antes de um tópico ser rastreado automaticamente." + default_other_notification_level_when_replying: "Nível de notificação padrão global quando o usuário responde a um tópico." default_other_external_links_in_new_tab: "Abrir links externos em uma nova aba por padrão." + default_other_enable_quoting: "Ative a resposta de cotação para texto realçado por padrão." + default_other_dynamic_favicon: "Mostrar contagem de tópicos novos / atualizados no ícone do navegador por padrão." + default_other_disable_jump_reply: "Não pule para a postagem do usuário depois que ela responder por padrão." default_other_like_notification_frequency: "Notificar usuários de curtidas por padrão" + default_topics_automatic_unpin: "Desvincular tópicos automaticamente quando o usuário alcança a parte inferior por padrão." default_categories_watching: "Lista de categorias que são observadas por padrão." default_categories_tracking: "Lista de categorias que são monitoradas por padrão." default_categories_muted: "Lista de categorias que são silenciadas por padrão." + default_categories_watching_first_post: "Lista de categorias nas quais a primeira postagem em cada novo tópico será assistida por padrão." + retain_web_hook_events_period_days: "Número de dias para reter registros de eventos do web hook." + retry_web_hook_events: "Repita automaticamente os eventos com falha do web hook por 4 vezes. Os intervalos de tempo entre as tentativas são de 1, 5, 25 e 125 minutos." + allow_user_api_keys: "Permitir geração de chaves de API do usuário" + allow_user_api_key_scopes: "Lista de escopos permitidos para chaves de API do usuário" + max_api_keys_per_user: "Número máximo de chaves da API do usuário por usuário" + min_trust_level_for_user_api_key: "Nível de confiança necessário para geração de chaves de API do usuário" + allowed_user_api_auth_redirects: "URL permitido para o redirecionamento de autenticação para chaves da API do usuário" + allowed_user_api_push_urls: "URLs permitidos para push de servidor para API do usuário" tagging_enabled: "Habilitar etiquetas em tópicos?" + min_trust_to_create_tag: "O nível de confiança mínimo necessário para criar uma tag." + max_tags_per_topic: "As tags máximas que podem ser aplicadas a um tópico." + max_tag_length: "A quantidade máxima de caracteres que podem ser usados ​​em uma tag." + max_tag_search_results: "Ao pesquisar por tags, o número máximo de resultados a serem exibidos." + show_filter_by_tag: "Mostrar uma lista suspensa para filtrar uma lista de tópicos por tag." + max_tags_in_filter_list: "Número máximo de tags para mostrar no menu suspenso do filtro. As tags mais usadas serão mostradas." + tags_sort_alphabetically: "Mostrar as tags em ordem alfabética. O padrão é mostrar em ordem de popularidade." + tags_listed_by_group: "Listar tags por grupo de tags na página Tags (/ tags)." + tag_style: "Estilo visual para crachás." + allow_staff_to_tag_pms: "Permitir que os membros da equipe marquem qualquer mensagem pessoal" + min_trust_level_to_tag_topics: "Nível de confiança mínimo necessário para marcar tópicos" + suppress_overlapping_tags_in_list: "Se as tags corresponderem a palavras exatas em títulos de tópicos, não mostre a tag" remove_muted_tags_from_latest: "Não exibir na lista de tópicos recentes os tópicos com a etiqueta de Silenciado." + company_short_name: "Nome da empresa (curto)" + company_full_name: "Nome da empresa (completo)" + company_domain: "Domínio da empresa" + shared_drafts_category: "Ative o recurso Rascunhos Compartilhados, designando uma categoria para rascunhos de tópicos." + push_notifications_prompt: "Exibir o prompt de consentimento do usuário." + push_notifications_icon_url: "O ícone do emblema que aparece no canto de notificação. O tamanho recomendado é 96 px por 96 px." errors: invalid_email: "Endereço de email inválido" invalid_username: "Não há nenhum usuário com esse nome de usuário." @@ -1102,18 +1576,36 @@ pt_BR: invalid_string_min: "Precisa ter no mínimo %{min} caracteres." invalid_string_max: "Deve ser não mais que %{max} caracteres." invalid_reply_by_email_address: "O valor deve conter '%{reply_key}' e ser diferente do email de notificação." + invalid_alternative_reply_by_email_addresses: "Todos os valores devem conter '%{reply_key}' e ser diferente do e-mail de notificação." + pop3_polling_host_is_empty: "Você deve definir um 'host de pesquisa pop3' antes de ativar a consulta POP3." + pop3_polling_username_is_empty: "Você deve definir um 'nome de usuário de pesquisa pop3' antes de ativar a consulta POP3." + pop3_polling_password_is_empty: "Você deve definir uma 'senha de pesquisa pop3' antes de ativar a consulta POP3." + pop3_polling_authentication_failed: "A autenticação POP3 falhou. Por favor, verifique suas credenciais pop3." + reply_by_email_address_is_empty: "Você deve definir uma 'resposta por endereço de e-mail' antes de ativar a resposta por e-mail." + email_polling_disabled: "Você deve ativar a pesquisa manual ou POP3 antes de ativar a resposta por e-mail." + user_locale_not_enabled: "Você deve primeiro habilitar 'permitir localidade do usuário' antes de habilitar essa configuração." invalid_regex: "Expressão regular inválida ou não permitida." + email_editable_enabled: "Você deve desativar o \"e-mail editável\" antes de ativar essa configuração." + enable_sso_disabled: "Você deve primeiro habilitar 'enable sso' antes de ativar esta configuração." + staged_users_disabled: "Você deve primeiro ativar os \"usuários preparados\" antes de ativar essa configuração." + reply_by_email_disabled: "Você deve primeiro ativar \"responder por e-mail\" antes de ativar essa configuração." + sso_url_is_empty: "Você deve definir um 'sso url' antes de habilitar essa configuração." + enable_local_logins_disabled: "Você deve primeiro habilitar 'habilitar logins locais' antes de ativar esta configuração." search: within_post: "#%{post_number} por %{username}" types: category: 'Categorias' topic: 'Resultados' user: 'Utilizadores' + results_page: "Buscar resultados para '%{term}'" sso: + login_error: "Erro de Login" not_found: "Sua conta não pode ser encontrada. Por favor, entre em contato com o administrador do site." account_not_approved: "Sua conta está aguardando aprovação. Você receberá uma notificação por email quando ela for aprovada." unknown_error: "Há um problema com sua conta. Por favor, entre em contato com o administrador do site." timeout_expired: "O login de sua conta expirou, por favor tente logar novamente." + no_email: "Nenhum endereço de e-mail foi fornecido. Por favor, entre em contato com o administrador do site." + email_error: "Uma conta não pôde ser registrada com o endereço de e-mail %{email}. Por favor, entre em contato com o administrador do site." original_poster: "Postador original" most_posts: "Maior parte das postagens" most_recent_poster: "Maior parte das Postagens Recentes" @@ -1123,44 +1615,65 @@ pt_BR: not_seen_in_a_month: "Bem-vindo de volta! Nós não o vemos a um tempo. Estes são os principais tópicos de discussão desde que você foi embora." merge_posts: edit_reason: - one: Uma publicação foi combinada por %{username} - other: '%{count} publicações foram combinadas por %{username}' + one: "Uma publicação foi combinada por %{username}" + other: "%{count} publicações foram combinadas por %{username}" errors: different_topics: "Publicações que pertencem a tópicos diferentes não podem ser combinadas." different_users: "Publicações que pertencem a usuários diferentes não podem ser combinadas." move_posts: new_topic_moderator_post: - one: 'Uma publicação foi dividida em um novo tópico : %{topic_link}' - other: '%{count} publicações foram divididas em um novo tópico: %{topic_link}' + one: "Uma publicação foi dividida em um novo tópico : %{topic_link}" + other: "%{count} publicações foram divididas em um novo tópico: %{topic_link}" existing_topic_moderator_post: - one: 'Uma publicação foi combinada em um tópico existente: %{topic_link}' - other: '%{count} publicações foram combinadas em um tópico existente: %{topic_link}' - change_owner: - post_revision_text: "Autoria transferida de %{old_user} para %{new_user}" - deleted_user: "um usuário deletado" + one: "Uma publicação foi combinada em um tópico existente: %{topic_link}" + other: "%{count} publicações foram combinadas em um tópico existente: %{topic_link}" topic_statuses: archived_enabled: "Este tópico está agora arquivado. Está congelado e não pode ser alterado de qualquer forma." archived_disabled: "Este tópico foi agora desarquivado. Já não está congelado, e pode ser alterado." closed_enabled: "Este tópico está agora fechado. Novas respostas não são aceitas." closed_disabled: "Este tópico está agora aberto. Novas respostas serão aceitas." + autoclosed_message_max_posts: + one: "Esta mensagem foi fechada automaticamente depois de atingir o limite máximo de 1 resposta." + other: "Esta mensagem foi fechada automaticamente após atingir o limite máximo de %{count} respostas." + autoclosed_topic_max_posts: + one: "Este tópico foi fechado automaticamente depois de atingir o limite máximo de 1 resposta." + other: "Este tópico foi fechado automaticamente após atingir o limite máximo de%{count} respostas." autoclosed_enabled_days: - one: Este tópico foi automaticamente fechado após 1 dia. Novas respostas não são mais permitidas. - other: Este tópico foi automaticamente fechado após %{count} dias. Novas respostas não são mais permitidas. + one: "Este tópico foi automaticamente fechado após 1 dia. Novas respostas não são mais permitidas." + other: "Este tópico foi automaticamente fechado após %{count} dias. Novas respostas não são mais permitidas." autoclosed_enabled_hours: - one: Este tópico foi fechado automaticamente após 1 hora. Novas respostas não são mais permitidas. - other: Este tópico foi fechado automaticamente após %{count} horas. Novas respostas não são mais permitidas. + one: "Este tópico foi fechado automaticamente após 1 hora. Novas respostas não são mais permitidas." + other: "Este tópico foi fechado automaticamente após %{count} horas. Novas respostas não são mais permitidas." autoclosed_enabled_minutes: - one: Este tópico foi fechado automaticamente após 1 minuto. Novas respostas não são mais permitidas. - other: Este tópico foi fechado automaticamente após %{count} minutos. Novas respostas não são mais permitidas. + one: "Este tópico foi fechado automaticamente após 1 minuto. Novas respostas não são mais permitidas." + other: "Este tópico foi fechado automaticamente após %{count} minutos. Novas respostas não são mais permitidas." autoclosed_enabled_lastpost_days: - one: Este tópico foi fechado automaticamente 1 dia depois da úlima resposta. Novas respostas não são mais permitidas. - other: Este tópico foi fechado automaticamente %{count} dias depois da úlima resposta. Novas respostas não são mais permitidas. + one: "Este tópico foi fechado automaticamente 1 dia depois da úlima resposta. Novas respostas não são mais permitidas." + other: "Este tópico foi fechado automaticamente %{count} dias depois da úlima resposta. Novas respostas não são mais permitidas." autoclosed_enabled_lastpost_hours: - one: Este tópico foi fechado automaticamente 1 hora depois da úlima resposta. Novas respostas não são mais permitidas. - other: Este tópico foi fechado automaticamente %{count} horas depois da úlima resposta. Novas respostas não são mais permitidas. + one: "Este tópico foi fechado automaticamente 1 hora depois da úlima resposta. Novas respostas não são mais permitidas." + other: "Este tópico foi fechado automaticamente %{count} horas depois da úlima resposta. Novas respostas não são mais permitidas." autoclosed_enabled_lastpost_minutes: - one: Este tópico foi fechado automaticamente após 1 minuto após a última resposta. Novas respostas não são mais permitidas. - other: Este tópico foi fechado automaticamente após %{count} minutos depois da última resposta. Novas respostas não são mais permitidas. + one: "Este tópico foi fechado automaticamente após 1 minuto após a última resposta. Novas respostas não são mais permitidas." + other: "Este tópico foi fechado automaticamente após %{count} minutos depois da última resposta. Novas respostas não são mais permitidas." + autoclosed_disabled_days: + one: "Este tópico foi aberto automaticamente após 1 dia." + other: "Este tópico foi aberto automaticamente após %{count} dias." + autoclosed_disabled_hours: + one: "Este tópico foi aberto automaticamente após 1 hora." + other: "Este tópico foi aberto automaticamente após %{count} horas." + autoclosed_disabled_minutes: + one: "Este tópico foi aberto automaticamente após 1 minuto." + other: "Este tópico foi aberto automaticamente após%{count} minutos." + autoclosed_disabled_lastpost_days: + one: "Este tópico foi aberto automaticamente 1 dia depois da última resposta." + other: "Este tópico foi aberto automaticamente %{count} dias após a última resposta." + autoclosed_disabled_lastpost_hours: + one: "Este tópico foi aberto automaticamente 1 hora após a última resposta." + other: "Este tópico foi aberto automaticamente %{count} horas após a última resposta." + autoclosed_disabled_lastpost_minutes: + one: "Este tópico foi aberto automaticamente 1 minuto após a última resposta." + other: "Este tópico foi aberto automaticamente %{count} minutos após a última resposta." autoclosed_disabled: "Este tópico está aberto agora. Novas respostas estão permitidas." autoclosed_disabled_lastpost: "Este tópico está aberto agora. Novas respostas estão permitidas." pinned_enabled: "Este tópico está agora afixado. Irá aparecer no topo das suas categorias" @@ -1169,11 +1682,14 @@ pt_BR: pinned_globally_disabled: "Esse tópico está desafixado agora. Não irá mais aparecer no topo dessa categoria." visible_enabled: "Este tópico está agora listado. Ele será exibido na listas de tópicos." visible_disabled: "Este tópico está agora oculto. Ela deixará de ser exibida em qualquer lista de tópicos. A única maneira de acessar esse tópico é via link direto." + auto_deleted_by_timer: "Excluído automaticamente pelo temporizador." login: not_approved: "A sua conta ainda não foi aprovada. Vais ser notificado por email assim que estiver pronto para fazeres log in." incorrect_username_email_or_password: "Usuário, email ou senha incorretos" + incorrect_password: "senha incorreta" wait_approval: "Obrigado por se registar. Você será notificado por email quando a sua conta for aprovada." active: "A sua conta está ativa e pronta." + activate_email: "

Você está quase pronto! Enviamos um email de ativação para %{email}. Por favor, siga as instruções no e-mail para ativar sua conta.

Se não chegar, verifique sua pasta de spam." not_activated: "Ainda não podes fazer log in. Enviamos um email de ativação para você. Por favor siga as instruções no email para ativar a sua conta." not_allowed_from_ip_address: "Você não pode entrar como %{username} a partir deste endereço IP." admin_not_allowed_from_ip_address: "Você não pode entrar como administrador a partir deste endereço IP." @@ -1184,16 +1700,33 @@ pt_BR: something_already_taken: "Algo deu errado, talvez o nome de usuário ou o email já estejam registrados. Tente o link Esqueci minha Senha." omniauth_error: "Desculpe, houve um erro ao autorizar a sua conta. Talvez você não aprovou a autorização?" omniauth_error_unknown: "Algo deu errado no processamento do seu login, por favor tente novamente." + authenticator_error_no_valid_email: "Nenhum endereço de e-mail associado a%{account} são autorizados. Você pode precisar configurar sua conta com um endereço de e-mail diferente." new_registrations_disabled: "Novas contas não são permitidas neste momento." password_too_long: "Senhas são limitadas a 200 caracteres." email_too_long: "O email fornecido é muito longo. Os endereços de email não devem ter mais de 254 caracteres e nomes de domínio devem ter no máximo 253 caracteres." reserved_username: "Este nome de usuário não é permitido." missing_user_field: "Você não completou todos campos de usuário" + auth_complete: "A autenticação está completa." + click_to_continue: "Clique aqui para continuar." + already_logged_in: "Ops, parece que você está tentando aceitar um convite para outro usuário. Se você não está%{current_user}, por favor, saia e tente novamente." + second_factor_title: "Autenticação de dois fatores" + second_factor_description: "Insira o código de autenticação necessário no seu aplicativo:" + second_factor_backup_description: "Por favor, insira um dos seus códigos de backup:" + second_factor_backup_title: "Código de Backup de Dois Fatores" + invalid_second_factor_code: "Código de autenticação inválido. Cada código só pode ser usado uma vez." + second_factor_toggle: + totp: "Use um aplicativo autenticador" + backup_code: "Use um código de backup" user: - no_accounts_associated: "Nenhuma conta associada" + deactivated: "Foi desativado devido a muitos e-mails devolvidos para '%{email}'." + deactivated_by_staff: "Desativado pela equipe" + activated_by_staff: "Ativado pela equipe" + new_user_typed_too_fast: "Novo usuário digitado muito rápido" + content_matches_auto_block_regex: "Conteúdo corresponde a regex de bloco automático" username: short: "deve ter no mínimo %{min} caracteres" long: "precisa ter não mais que ${max} caracteres" + characters: "deve incluir apenas números, letras, traços e sublinhados" unique: "tem que ser único" blank: "tem que ser preenchido" must_begin_with_alphanumeric_or_underscore: "deve começar com uma letra, número ou um underline" @@ -1203,15 +1736,207 @@ pt_BR: email: not_allowed: "este provedor de emails não é permitido. Por favor utilize outro endereço de email." blocked: "não é permitido." + revoked: "Não vai estar enviando e-mails para '%{email}' até %{date}." ip_address: blocked: "Novos registros não são permitidos a partir do seu endereço de IP." max_new_accounts_per_registration_ip: "Novos registros não são permitidos a partir do seu endereço de IP (quantidade máxima alcançada). Contate um membro da equipe." + website: + domain_not_allowed: "O site é inválido. Domínios permitidos são: %{domains}" + auto_rejected: "Rejeitado automaticamente devido à idade. Veja a configuração do site auto_handle_queued_age." + destroy_reasons: + unused_staged_user: "Usuário encenado sem uso" + fixed_primary_email: "E-mail principal fixo para usuário testado" + same_ip_address: "Mesmo endereço IP (%{ip_address}) como outros usuários" flags_reminder: + flags_were_submitted: + one: "As sinalizações foram enviadas há mais de 1 hora. [Por favor, revise-as](/admin/flags)." + other: "As sinalizações foram submetidas%{count} horas atrás. [Por favor, revise-as](/admin/flags)." subject_template: - one: 1 sinalização aguardando a ser controlada - other: '%{count} sinalizações aguardando a ser controladas' + one: "1 sinalização aguardando a ser controlada" + other: "%{count} sinalizações aguardando a ser controladas" + unsubscribe_mailer: + title: "Cancelar mensagem do remetente" + subject_template: "Confirme que você não deseja mais receber atualizações de e-mail de %{site_title}" + text_body_template: | + Alguém (possivelmente você?) solicitou a não enviar mais atualizações de e-mail de%{site_domain_name} para esse endereço. + Se você deseja confirmar isto, por favor clique no link: + + %{confirm_unsubscribe_link} + + + Se você deseja continuar recebendo atualizações de e-mail, você deve ignorar este e-mail. + invite_mailer: + title: "Convidar remetente" + subject_template: "%{inviter_name} te convidou para '%{topic_title}' no%{site_domain_name}" + text_body_template: | + %{inviter_name} te convidou para uma discussão + + > **%{topic_title}** + > + > %{topic_excerpt} + + no + + > %{site_title} -- %{site_description} + + Se te interessou, clique no link abaixo: + + %{invite_link} + custom_invite_mailer: + title: "convite de remetente personalizado" + subject_template: "%{inviter_name} te convidou para '%{topic_title}' no %{site_domain_name}" + text_body_template: | + %{inviter_name} te convidou para uma discussão + + > **%{topic_title}** + > + > %{topic_excerpt} + + no + + > %{site_title} -- %{site_description} + + Com essa nota + + > %{user_custom_message} + + Se te interessou, clique no link abaixo: + + %{invite_link} + invite_forum_mailer: + title: "Convidar remetente do Fórum" + subject_template: "%{inviter_name}convidou você para se juntar à %{site_domain_name}" + text_body_template: | + %{inviter_name} convidou você para se juntar + + > **%{site_title}** + > + > %{site_description} + + Se te interessou, clique no link abaixo: + + %{invite_link} + custom_invite_forum_mailer: + title: "Convite personalizado de remetente do fórum" + subject_template: "%{inviter_name}convidou você a se juntar%{site_domain_name}" + text_body_template: | + %{inviter_name} convidou você a se juntar + + > **%{site_title}** + > + > %{site_description} + + com essa nota + + > %{user_custom_message} + + Se está interessado, clique no link abaixo: + + %{invite_link} invite_password_instructions: + title: "Convidar instruções de senha" subject_template: "Defina uma senha para a sua %{site_name} conta" + text_body_template: | + Obrigado por aceitar o convite para %{site_name} -- bem-vindo! + + Clique nesse link para escolher uma senha agora: + %{base_url}/u/password-reset/%{email_token} + + (Se o link acima espirou, escolha "Esqueci minha senha" quando logar com seu endereço de e-mail) + download_backup_mailer: + title: "Faça o download do Mailer de Backup" + subject_template: "[%{email_prefix}] Download do Backup do Site" + text_body_template: | + Aqui está o [ download de backup do site](%{backup_file_path}) que você requeriu. + + Nós enviamos este link de download para seu e-mail validado por razões de segurança. + + (Se você não requeriu este download, você deveria estar seriamente preocupado -- alguém tem acesso de administrador ao seu site.) + no_token: | + Desculpe, este link de download de backup já foi usado ou expirou. + admin_confirmation_mailer: + title: "Confirmação do administrador" + subject_template: "[%{email_prefix}] Confirmar nova conta de administrador" + text_body_template: | + Por favor, confirme se você gostaria de adicionar **%{target_username}** como um administrador para seu fórum. + + [Confirmar Conta de Administrador](%{admin_confirm_url}) + test_mailer: + title: "Teste de remetente" + subject_template: "[%{email_prefix}] Teste de entrega de e-mail" + text_body_template: | + Este é um e-mail teste de: + + [**%{base_url}**][0] + + A entrega de emails é complicada. Aqui estão algumas coisas importantes que você deve verificar primeiro: + + - Tenha * * certeza de definir o `e-mail de notificação` de: address corretamente nas configurações do seu site. ** O domínio especificado no endereço "de" dos e-mails que você envia é o domínio em que seu e-mail será validado**. + + - Saiba como visualizar a origem bruta do email em seu cliente de email, para que você possa examinar os cabeçalhos de email em busca de dicas importantes. No Gmail, é a opção "mostrar original" no menu suspenso no canto superior direito de cada e-mail. + + - ** IMPORTANTE: ** Seu ISP possui um registro DNS reverso inserido para associar os nomes de domínio e os endereços IP dos quais você envia e-mails? [Teste seu registro PTR reverso] [2] aqui. Se o seu ISP não inserir o registro de ponteiro DNS reverso adequado, é muito improvável que qualquer um de seus e-mails seja entregue. + + - O [registro SPF] do seu domínio [8] está correto? [Teste seu registro SPF] [1] aqui. Observe que o TXT é o tipo de registro oficial correto para o SPF. + + - O registro [DKIM] do seu domínio [3] está correto? Isso aumentará significativamente a capacidade de entrega de e-mail. [Teste seu registro DKIM] [7] aqui. + + - Se você executar seu próprio servidor de e-mail, verifique se os IPs do seu servidor de e-mail não estão em listas negras de e-mail [4]. Também verifique se ele está enviando definitivamente um nome de host totalmente qualificado que resolve no DNS em sua mensagem HELO. Caso contrário, isso fará com que seu email seja rejeitado por muitos serviços de e-mail. + + - É altamente recomendável que você ** envie um e-mail de teste para [mail-tester.com] [mt] ** para verificar se todos os itens acima estão funcionando corretamente. + + (A maneira * easy * é criar uma conta gratuita no [SendGrid] [sg], [SparkPost] [sp], [Mailgun] [mg] ou [Mailjet] [mj], que têm planos generosos de correspondência gratuita e que estarão bem para pequenas comunidades. Você ainda precisará configurar os registros SPF e DKIM no seu DNS, embora! + + Esperamos que você tenha recebido este teste de entrega de e-mail OK! + + Boa sorte, + + Seus amigos em [Discourse](http://www.discourse.org) + + [0]: %{base_url} + [1]: http://www.kitterman.com/spf/validate.html + [2]: http://mxtoolbox.com/ReverseLookup.aspx + [3]: http://www.dkim.org/ + [4]: http://whatismyipaddress.com/blacklist-check + [7]: https://www.mail-tester.com/spf-dkim-check + [8]: http://www.openspf.org/SPF_Record_Syntax + [sg]: https://goo.gl/r1WMF6 + [sp]: https://www.sparkpost.com/ + [mg]: http://www.mailgun.com/ + [mj]: https://www.mailjet.com/pricing + [mt]: http://www.mail-tester.com/ + new_version_mailer: + title: "Nova versão do remetente" + subject_template: "[%{email_prefix}] Nova versão do discurso, atualização disponível" + text_body_template: | + Hooray, uma nova versão do [Discourse] (http://www.discourse.org) está disponível! + + Sua versão: %{installed_version} + Nova versão: **%{new_version}** + + - Atualize usando nosso fácil ** [upgrade de navegador com um clique](%{base_url}/admin/upgrade)** + + - Veja o que há de novo nas [notas de lançamento] (https://meta.discourse.org/tags/release-notes) ou veja o [changelog bruto do GitHub] (https://github.com/discourse/discourse/commits/master ) + + - Visite [meta.discurso.org] (https://meta.discourse.org) para notícias, discussão e apoio ao Discurso. + new_version_mailer_with_notes: + title: "Nova versão do remetente com notas" + subject_template: "[%{email_prefix}] atualização disponível" + text_body_template: | + Hooray, uma nova versão do [Discourse] (http://www.discourse.org) está disponível! + + Sua versão: %{installed_version} + Nova versão: **%{new_version}** + + - Atualize usando nosso fácil ** [upgrade de navegador com um clique](/admin/upgrade)** + + - Veja o que há de novo nas [notas de lançamento] (https://meta.discourse.org/tags/release-notes) ou veja o [changelog bruto do GitHub] (https://github.com/discourse/discourse/commits/master ) + + -Visite [meta.discurso.org] (https://meta.discourse.org) para notícias, discussão e apoio ao Discourse + + ### Notas de lançamento + + %{notes} flag_reasons: off_topic: "Sua postagem foi sinalizada como **off-topic**: a comunidade sente que não é uma boa adequação ao tópico, como atualmante definido de acordo com o título e o primeiro post." inappropriate: "Sua postagem foi sinalizada como **não apropriada**: a comunidade sente que ela é ofensiva, abusiva, ou uma violação das [nossas orientações da comunidade](/guidelines)." @@ -1223,67 +1948,502 @@ pt_BR: disagreed: "Obrigado por nos avisar. Nós estamos olhando nele." deferred: "Obrigado por nos avisar. Nós estamos olhando nele." deferred_and_deleted: "Obrigado por nos avisar. Nós removemos o post." + temporarily_closed_due_to_flags: + one: "Este tópico está temporariamente fechado por 1 hora devido a um grande número de sinalizadores da comunidade." + other: "Este tópico está temporariamente fechado para %{count} horas devido a um grande número de sinalizações da comunidade." system_messages: + private_topic_title: "Tópico #%{id}" + contents_hidden: "Por favor, visite o post para ver o seu conteúdo." + post_hidden: + title: "Post oculto" + subject_template: "Post oculto pelas sinalizações da comunidade" + text_body_template: | + Olá, + + Esta é uma mensagem automatizada de %{site_name}para que você saiba que sua postagem estava oculta. + + <%{base_url}%{url}> + + %{flag_reason} + + Vários membros da comunidade sinalizaram esta postagem antes que ela estivesse oculta. Por isso, considere como você pode revisar sua postagem para refletir o feedback dela. ** Você pode editar sua postagem depois de %{edit_delay} minutos, e será automaticamente reexibido. ** + + No entanto, se a postagem estiver oculta pela comunidade uma segunda vez, ela permanecerá oculta até ser tratada pela equipe. + + Para orientações adicionais, consulte nossas [diretrizes da comunidade](%{base_url}/diretrizes). + post_hidden_again: + title: "Posto oculto novamente" + subject_template: "Post escondido por sinalizações da comunidade, equipe notificada" + text_body_template: | + Olá, + + Essa é uma mensagem automatizada de %{site_name}para que você saiba que sua postagem foi ocultada novamente. + + <%{base_url}%{url}> + + %{flag_reason} + + Vários membros da comunidade sinalizaram esta postagem antes que ela estivesse oculta. ** Como esta postagem foi ocultada mais de uma vez, sua postagem permanecerá oculta até que seja manipulada por um membro da equipe. ** + + Para orientação adicional, por favor consulte as nossas [diretrizes da comunidade](%{base_url}/diretrizes). + flags_agreed_and_post_deleted: + title: "Postagem sinalizada removida pela equipe" + subject_template: "Postagem sinalizada removida pela equipe" + text_body_template: | + Olá, + + Essa é uma mensagem automatizada de %{site_name} para que você saiba que sua postagem foi removida. + + <%{base_url}%{url}> + + %{flag_reason} + + Este post foi sinalizado pela comunidade e um membro da equipe optou por removê-lo. + + Por favor, reveja nossas [diretrizes da comunidade](%{base_url}/diretrizes) para detalhes. + usage_tips: + text_body_template: | + Para algumas dicas rápidas sobre como começar como um novo usuário, [confira este post no blog](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). + + À medida que você participa aqui, nós vamos conhecê-lo e as novas limitações temporárias do usuário serão suspensas. Com o tempo, você ganhará [níveis de confiança] (https://blog.discourse.org/20/20/entrevista-conhecimento-disco-trustes-levels/) que incluem habilidades especiais para nos ajudar a administrar nossa comunidade juntos. welcome_user: + title: "Usuário de boas-vindas" subject_template: "Bem-vindo ao %{site_name}!" + text_body_template: | + obrigado por se juntar à %{site_name}, e bem-vindo! + + %{new_user_tips} + + Nós acreditamos em [comportamento comunitário civilizado](%{base_url}/guidelines) em todo o tempo. + + Aproveite sua estadia! + welcome_tl1_user: + title: "Bem vindo Usuário TL1" + subject_template: "Obrigado por passar tempo conosco" + text_body_template: | + Olá. Vimos que você tem lido muito, o que é fantástico, por isso, promovemos um [nível de confiança!] (Https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) + + Estamos muito felizes por você estar passando tempo conosco e adoraríamos saber mais sobre você. Tire um momento para [preencher seu perfil] (/ my / preferences / profile) ou sinta-se à vontade para [iniciar um novo tópico] (/ categories). welcome_invite: + title: "Convite de boas-vindas" subject_template: "Bem-vindo ao %{site_name}!" + text_body_template: | + Obrigado por aceitar o seu convite para %{site_name} -- bem-vindo! + + - Nós criamos esta nova conta **%{username}** para você. Altere seu nome ou senha visitando [seu perfil de usuário] [prefs]. + + - Quando você fizer login, ** use o mesmo endereço de e-mail do seu convite original **. Caso contrário, não poderemos dizer que é você! + + %{new_user_tips} + + Nós acreditamos em [comportamento comunitário civilizado](%{base_url}/diretrizes) em todos os momentos. + + Aproveite sua estadia! + + [prefs]: %{user_preferences_url} backup_succeeded: + title: "Backup foi bem-sucedido" subject_template: "Backup completado com sucesso" + text_body_template: | + O backup foi bem sucedido. + + Visite o [admin > backup section](%{base_url}/admin/backups) para baixar seu novo backup. + + Aqui está o log: + + ```texto + %{logs} + ``` backup_failed: + title: "Backup Falhou" subject_template: "O backup falhou" + text_body_template: | + O backup falhou. + + Aqui está o log: + + ```texto + %{logs} + ``` restore_succeeded: + title: "Restauração com Sucesso" subject_template: "Restauração terminada com sucesso" + text_body_template: | + A restauração foi bem sucedida. + + Aqui está o log: + + ```texto + %{logs} + ``` restore_failed: + title: "Restauração falhou" subject_template: "A restauração falhou" + text_body_template: | + A restauração falhou. + + Aqui está o log: + + ```texto + %{logs} + ``` bulk_invite_succeeded: + title: "Convite em massa foi bem-sucedido" subject_template: "Seus convites foram enviados com sucesso." text_body_template: "Seus convites foram enviados com sucesso: %{sent}." bulk_invite_failed: + title: "Convite em massa falhou" subject_template: "Seus convites não forma enviados, contate os moderadores." + text_body_template: | + Seu arquivo de convite do usuário em massa foi processado, %{sent} convite enviado pelo correio com%{failed} erro(s). + + Aqui está o log: + + ```texto + %{logs} + ``` + csv_export_succeeded: + title: "Exportação CSV foi bem-sucedida" + subject_template: "[%{export_title}] Exportação de dados completa" + text_body_template: | + Sua exportação de dados foi bem sucedida! :DVD: + + %{file_name} (%{file_size}) + + O link de download acima será válido por 48 horas. + + Os dados são compactados como um arquivo gzip. Se o arquivo não se extrair quando você o abrir, use as ferramentas recomendadas aqui: http://www.gzip.org/#faq4 csv_export_failed: + title: "Falha na exportação de CSV" subject_template: "A exportação de dados falhou" + text_body_template: "Desculpe, mas sua exportação de dados falhou. Por favor, verifique os registros ou [contate um membro da equipe] (%{base_url}/about)." + email_reject_insufficient_trust_level: + title: "E-mail Rejeitado, nível de confiabilidade insuficiente" + subject_template: "[%{email_prefix}] Problema de email - nível de confiança insuficiente" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulado %{former_title}) não fucionou. + + Sua conta não tem o nível de confiança requerido para postar novos tópicos para esse endereço de e-mail. Se acredita que é um erro, [contate um membro da equipe](%{base_url}/sobre isso). + email_reject_user_not_found: + title: "Email rejeitado, usuário não encontrado" + subject_template: "[%{email_prefix}] Problema de e-mail - Usuário não encontrado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + Sua resposta foi enviada por um endereço de e-mail desconhecido. Tente enviar por outro endereço de e-mail, ou [contate um membro da equipe](%{base_url}/sobre isso). + email_reject_screened_email: + title: "E-mail Rejeitar E-mail Filtrado" + subject_template: "[%{email_prefix}] Problema de e-mail - e-mail bloqueado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail %{destination} (intitulado %{former_title}) não funcionou + + Sua resposta foi enviada de um endereço de e-mail bloqueado. Tente enviar de um outro endereço de e-mail, ou [contate um membro da equipe](%{base_url}/sobre isso). + email_reject_not_allowed_email: + title: "E-mail rejeitado não permitido E-mail" + subject_template: "[%{email_prefix}] Problema de e-mail - e-mail bloqueado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail %{destination} (intitulada%{former_title}) não funcionou. + + Sua resposta foi enviada de um endereço de e-mail bloqueado. Tente enviar de outro endereço de e-mail, ou [contate um membro da equipe](%{base_url}/sobre isso). + email_reject_inactive_user: + title: "E-mail Rejeitar Usuário Inativo" + subject_template: "[%{email_prefix}] Problema de e-mail - usuário inativo" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada%{former_title}) não funcionou + + Sua conta associada a este endereço de e-mail não está ativada. Por favor, ative sua conta antes de enviar e-mails. + email_reject_silenced_user: + title: "E-mail Rejeitar Usuário Silenciado" + subject_template: "[%{email_prefix}] Problema de e-mail - Usuário Silenciado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + Sua conta associada a este endereço de e-mail foi silenciada. + email_reject_reply_user_not_matching: + title: "E-mail Rejeitar Usuário Não Correspondente" + subject_template: "[%{email_prefix}] Problema de e-mail - Endereço de resposta inesperado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intulada %{former_title}) não funcionou. + + Sua resposta foi enviada de um endereço de e-mail diferente daquele que esperávamos, por isso não temos certeza se essa é a mesma pessoa. Tente enviar de outro endereço de e-mail, ou[contate um membro da equipe](%{base_url}/sobre isso). + email_reject_no_account: + title: "E-mail Rejeitado, Nenhuma Conta" + subject_template: "[%{email_prefix}] Problema de e-mail - conta desconhecida" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intulada %{former_title}) não funcionou. + + Não conseguimos encontrar nenhuma conta que corresponda ao seu endereço de e-mail. Tente enviar de um endereço de e-mail diferente ou [contate um membro da equipe](%{base_url}/sobre isso). + email_reject_empty: + title: "E-mail Rejeitado, Vazio" + subject_template: "[%{email_prefix}] Problema de e-mail - sem conteúdo" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + Não conseguimos encontrar qualquer conteúdo de resposta no seu e-mail. + + Se você está recebendo isso e você _disse_ uma resposta, tente novamente com formatação mais simples. email_reject_parsing: + title: "E-mail Rejeitado, Análise" + subject_template: "[%{email_prefix}] Problema por e-mail - conteúdo não reconhecido" text_body_template: | Nos desculpamos, mas sua mensagem de email para %{destination} (intitulada %{former_title}) não funcionou. Não pudemos encontrar seu resposta no email. **Certifique-se que sua resposta está no topo do email** -- não conseguimos processar respostas em linha. + email_reject_invalid_access: + title: "E-mail Rejeitado, acesso inválido" + subject_template: "[%{email_prefix}] Problema de e-mail - Acesso inválido" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intulada %{former_title}) não furcionou. + + Sua conta não tem os privilégios para postar novos tópicos nessa categoria. Se você acredita que isso é um erro, [contate um membro da equipe](%{base_url}/sobre isso). + email_reject_strangers_not_allowed: + title: "E-mail Rejeitado, Estranhos Não Permitidos" + subject_template: "[%{email_prefix}] Problema de e-mail - Acesso inválido" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + A categoria para a qual você enviou este e-mail permite somente respostas de usuários com contas válidas e endereços de e-mail conhecidos. Se você acredita que isso é um erro, [entre em contato com um funcionário](%{base_url}/sobre isso). + email_reject_invalid_post: + title: "E-mail Rejeitado, Post inválido" + subject_template: "[%{email_prefix}] Problema de e-mail - erro de postagem" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + Algumas causas possíveis são: formatação complexa, mensagem muito grande, mensagem muito pequena. Por favor, tente novamente, ou poste através do site, se isso continuar. + email_reject_invalid_post_specified: + title: "E-mail Rejeitado, especificado inválido do post" + subject_template: "[%{email_prefix}] Problema de e-mail - erro de postagem" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para%{destination} (intitulada %{former_title}) não funcionou. + + Razão: + + %{post_error} + + Se você puder corrigir o problema, tente novamente + email_reject_invalid_post_action: + title: "E-mail Rejeitado por Publicação de Ação Inválida" + subject_template: "[%{email_prefix}] Problema por e-mail - ação de postagem inválida" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada%{former_title}) não funcionou. + A ação de postagem não foi reconhecida. Por favor, tente novamente, ou poste através do site, se isso continuar. + email_reject_reply_key: + title: "E-mail Rejeitado por Chave de Resposta" + subject_template: "[%{email_prefix}] Problema de e-mail - chave de resposta desconhecida" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + A chave de resposta no e-mail é inválida ou desconhecida, por isso não podemos descobrir em que este e-mail está em resposta. [Entre em contato com um membro da equipe](%{base_url}/sobre). + email_reject_bad_destination_address: + title: "E-mail Rejeitado por endereço de destino inválido" + subject_template: "[%{email_prefix}] Problema de e-mail - desconhecido para: endereço" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + Nenhum dos endereços de e-mail de destino é reconhecido ou o cabeçalho do ID da mensagem no e-mail foi modificado. Por favor, certifique-se de que você está enviando para o endereço de e-mail correto fornecido pela equipe. + email_reject_old_destination: + title: "E-mail Rejeitado por Destino Antigo" + subject_template: "[%{email_prefix}] Problema de e-mail: você está tentando responder a uma notificação antiga" + email_reject_topic_not_found: + title: "E-mail Rejeitado por Tópico Não Encontrado" + subject_template: "[%{email_prefix}] Problema de e-mail - Tópico não encontrado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulada %{former_title}) não funcionou. + + O tópico para o qual você está respondendo não existe mais - talvez tenha sido excluído? Se você acredita que isso é um erro, [contate um membro da equipe](%{base_url}/sobre). + email_reject_topic_closed: + title: "E-mail Rejeitado por Tópico fechado" + subject_template: "[%{email_prefix}] Problema de e-mail - Tópico fechado" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para%{destination} (intitulada %{former_title}) não funcionou. + + O tópico para o qual você está respondendo está atualmente fechado e não aceita mais respostas. Se você acredita que isso é um erro, [contate um membro da equipe](%{base_url}/sobre). + email_reject_auto_generated: + title: "E-mail Rejeitado Gerado automaticamente" + subject_template: "[%{email_prefix}] Problema de e-mail - Resposta gerada automaticamente" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulado %{former_title}) não funcionou. + + Seu e-mail foi marcado como "gerado automaticamente", o que significa que foi criado automaticamente por um computador em vez de ser digitado por um ser humano; não podemos aceitar esses tipos de e-mails. Se você acredita que isso é um erro, [entre em contato com um funcionário](%{base_url}/sobre). + email_reject_unrecognized_error: + title: "E-mail Rejeitado Erro não reconhecido" + subject_template: "[%{email_prefix}] Problema de e-mail - erro não reconhecido" + text_body_template: | + Desculpe, mas sua mensagem de e-mail para %{destination} (intitulado %{former_title}) não funcionou. + + Ocorreu um erro não reconhecido ao processar seu e-mail e não foi publicado. Você deve tentar novamente ou [contatar um membro da equipe](%{base_url}/sobre). + email_error_notification: + title: "Notificação de erro por e-mail" + subject_template: "[%{email_prefix}] Problema de e-mail - erro de autenticação POP" + text_body_template: | + Infelizmente, houve um erro de autenticação ao pesquisar e-mails do servidor POP. + + Certifique-se de ter configurado corretamente as credenciais POP em [as configurações do site](%{base_url}/admin/site_settings/category/email). + + Se houver uma interface de usuário da web para a conta de e-mail POP, talvez seja necessário fazer login na web e verificar suas configurações lá. too_many_spam_flags: + title: "Muitas Sinalizações de Spam" subject_template: "Nova conta suspensa" too_many_tl3_flags: + title: "Muitas Sinalizações TL3" subject_template: "Nova conta suspensa" + text_body_template: | + Olá, + + Essa é uma mensagem automatizada de %{site_name} para informá-lo de que sua conta foi colocada em espera devido a um grande número de sinalizações da comunidade. + + Como medida de precaução, sua nova conta foi silenciada para criar novas respostas ou tópicos até que um membro da equipe possa revisar sua conta. Pedimos desculpas pela inconveniência. + + Para orientações adicionais, consulte nossas [diretrizes da comunidade](%{base_url}/diretrizes). + silenced_by_staff: + title: "Silenciado pelo Staff" + subject_template: "Conta temporariamente em espera" + text_body_template: | + Olá, + + Esta é uma mensagem automatizada de %{site_name} para informá-lo de que sua conta foi temporariamente suspensa como medida de precaução. + + Por favor, continue a navegar, mas você não poderá responder ou criar tópicos até que um [membro da equipe](%{base_url}/sobre) analisa seus posts mais recentes. Pedimos desculpas pela inconveniência. + + Para orientações adicionais, consulte nossas [diretrizes da comunidade](%{base_url}/diretrizes). + user_automatically_silenced: + title: "Usuário Silenciado Automaticamente" + subject_template: "Novo usuário %{username} silenciado por bandeiras da comunidade" + text_body_template: | + Está é uma mensagem automática. + + O novo usuário [%{username}](%{user_url}) foi automaticamente silenciado porque vários usuários sinalizaram %{username}seus post(s). + + Por favor [revise as sinalizações](%{base_url}/admin/flags). Se %{username} foi silenciada incorretamente na postagem, clique no botão de inatividade na [página de administração desse usuário](%{user_url}). + + Este limite pode ser alterado através das configurações do site `silence_new_user` + spam_post_blocked: + title: "Postagem de spam bloqueada" + subject_template: "Novo usuário%{username} postagens bloqueadas devido a links repetidos" + text_body_template: | + Essa é uma mensagem automatizada. + + O novo usuário [%{username}](%{user_url}) tentou criar vários posts com links para%{domains}, mas essas postagens foram bloqueadas para evitar spam. O usuário ainda pode criar novas postagens que não vinculam a %{domains}. + + Por favor, [revise o usuário](%{user_url}). + + Isso pode ser modificado através das configurações do site `newuser_spam_host_threshold` e` white_listed_spam_host_domains`. + unsilenced: + title: "Não silenciado" + subject_template: "Conta não está mais em espera" + text_body_template: | + Olá, + + Esta é uma mensagem automatizada de %{site_name} para que você saiba que sua conta não está mais em espera após a revisão da equipe. + + Agora você pode criar novas respostas e tópicos novamente. Obrigado pela sua paciência. pending_users_reminder: + title: "Lembrete de usuários pendentes" subject_template: - one: 1 usuário aguardando aprovação - other: '%{count} usuários aguardando aprovação' + one: "1 usuário aguardando aprovação" + other: "%{count} usuários aguardando aprovação" text_body_template: | Há novos cadastros de usuários à espera de serem aprovados (ou rejeitados), antes de poderem acessar este fórum. [Por favor, analisá-los na seção de administração] ( %{base_url}/admin/users/list/pending). download_remote_images_disabled: + title: "Baixar imagens remotas desativadas" subject_template: "Baixar imagens remotas desativado" text_body_template: "A configuração `download_remote_images_to_local` está desativada porque o espaço limite no disco configurado em `download_remote_images_threshold` foi alcançado." dashboard_problems: + title: "Problemas do painel" subject_template: "Problemas foram encontrados" + text_body_template: | + Alguns problemas estão sendo relatados no seu painel de administração. + + [Por favor, revise e corrija-os](%{base_url}/admin). + new_user_of_the_month: + title: "Você é um novo usuário do mês!" + subject_template: "Você é um novo usuário do mês!" + text_body_template: | + Parabéns, você ganhou o prêmio ** Novo Usuário do Mês para %{month_year}**. :troféu: + + Este prêmio é concedido apenas a dois novos usuários por mês e ficará permanentemente visível na [página de crachás].(%{url}). + + Você rapidamente se tornou um membro valioso da nossa comunidade. Obrigado por se juntar e manter o excelente trabalho! + queued_posts_reminder: + title: "Lembrete de postagens enfileiradas" + subject_template: + one: "1 post esperando para ser revisado" + other: "%{count} postagens esperando para serem revisadas" + text_body_template: | + Olá, + + Mensagens de novos usuários foram mantidas para moderação e estão atualmente aguardando revisão. [Aprovar ou rejeitá-los aqui](%{base_url}/postagens enfileiradas). unsubscribe_link: | Para cancelar a subscrição destes e-mails, [clique aqui](%{unsubscribe_url}). unsubscribe_link_and_mail: | Para cancelar a subscrição destes e-mails, [clique aqui](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Você está recebendo isso porque ativou o modo de lista de discussão. + + Para cancelar a inscrição desses e-mails, clique [aqui](%{unsubscribe_url}). subject_re: "Re:" subject_pm: "[PM]" user_notifications: previous_discussion: "Respostas Anteriores" + reached_limit: + one: "Atenção: enviamos no máximo 1 e-mail diário. Verifique o site para ver os que podem ser retidos." + other: "Atenção: enviamos no máximo %{count} e-mails diários. Verifique o site para ver os que podem ser retidos. PS obrigado por ser popular!" in_reply_to: "Em réplica a" unsubscribe: title: "Desinscrever" description: "Não está interessado em receber estes emails? Não tem problema! Clique em baixo para se desinscrever instantaneamente:" reply_by_email: "[Visite o Tópico](%{base_url}%{url}) ou responda este email para responder." - reply_by_email_pm: "[Visite o Mensagem](%{base_url}%{url}) ou responda este email para responder." + reply_by_email_pm: "[Visite a mensagem](%{base_url}%{url}) ou responda a este e-mail para responder a %{participants}." only_reply_by_email: "Responda a este email para responder." + only_reply_by_email_pm: "Responda a este e-mail para responder a %{participants}." visit_link_to_respond: "[Visite o Tópico](%{base_url}%{url}) para responder." - visit_link_to_respond_pm: "[Visite o Mensagem](%{base_url}%{url}) para responder." + visit_link_to_respond_pm: "[Visite a Mensagem](%{base_url}%{url}) para responder a %{participants}." posted_by: "Postado por %{username} em %{post_date}" + pm_participants: "Participantes: %{participants}" + invited_group_to_private_message_body: | + %{username} convidou @%{group_name} para uma mensagem + + > **%{topic_title}** + > + > %{topic_excerpt} + + em + + > %{site_title} -- %{site_description} + invited_to_private_message_body: | + %{username} convidou você para uma mensagem + + > **%{topic_title}** + > + > %{topic_excerpt} + + em + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} te convidou para uma discussão + + > **%{topic_title}** + > + > %{topic_excerpt} + + em + + > %{site_title} -- %{site_description} + user_invited_to_private_message_pm_group: + title: "Grupo Convidado do Usuário para MP" + subject_template: "[%{email_prefix}] %{username} convidou @%{group_name} para a mensagem'%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_invited_to_private_message_pm: + title: "Usuário Convidado para MP" + subject_template: "[%{email_prefix}] %{username}convidou você para uma mensagem '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1291,6 +2451,8 @@ pt_BR: %{respond_instructions} user_invited_to_private_message_pm_staged: + title: "Usuário Convidado para o Encaminhamento MP" + subject_template: "[%{email_prefix}] %{username} convidou você para uma mensagem '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1298,6 +2460,8 @@ pt_BR: %{respond_instructions} user_invited_to_topic: + title: "Usuário convidado para o tópico" + subject_template: "[%{email_prefix}] %{username} te convidou para '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1305,6 +2469,8 @@ pt_BR: %{respond_instructions} user_replied: + title: "Usuário Respondido" + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1314,6 +2480,8 @@ pt_BR: %{respond_instructions} user_replied_pm: + title: "Usuário respondido MP" + subject_template: "[%{email_prefix}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1323,6 +2491,8 @@ pt_BR: %{respond_instructions} user_quoted: + title: "Citações do usuário" + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1332,6 +2502,8 @@ pt_BR: %{respond_instructions} user_linked: + title: "Usuário vinculado" + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1341,6 +2513,19 @@ pt_BR: %{respond_instructions} user_mentioned: + title: "Usuário mencionado" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_mentioned_pm: + title: "MP mencionada pelo usuário" + subject_template: "[%{email_prefix}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1350,6 +2535,8 @@ pt_BR: %{respond_instructions} user_group_mentioned: + title: "Grupo de usuários mencionado" + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1359,6 +2546,8 @@ pt_BR: %{respond_instructions} user_posted: + title: "Usuário Postado" + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1368,6 +2557,8 @@ pt_BR: %{respond_instructions} user_watching_first_post: + title: "Usuário assistindo primeiro post" + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1377,6 +2568,8 @@ pt_BR: %{respond_instructions} user_posted_pm: + title: "Usuário Postado MP" + subject_template: "[%{email_prefix}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1386,28 +2579,125 @@ pt_BR: %{respond_instructions} user_posted_pm_staged: + title: "Usuário Postado por PM Staged" subject_template: "%{optional_re}%{topic_title}" text_body_template: |2 %{message} + account_suspended: + title: "Conta Suspença" + subject_template: "[%{email_prefix}] A sua conta foi suspensa" + text_body_template: | + Você foi suspenso do fórum até %{suspended_till}. + + %{reason} + + %{message} + account_silenced: + title: "Conta Silenciada" + subject_template: "[%{email_prefix}] Sua conta foi silenciada" + text_body_template: | + Você foi silenciado do fórum até %{silenced_till}. + + %{reason} + + %{message} + account_exists: + title: "essa conta já existe" + subject_template: "[%{email_prefix}] essa conta já existe" + text_body_template: | + Você acabou de tentar criar uma conta em %{site_name}, ou tentou alterar o e-mail de uma conta para %{email}. No entanto, já existe uma conta para %{email}. + + Se você esqueceu sua senha, [redefina agora](%{base_url}/password-reset). + + Se você não tentou criar uma conta para %{email} ou altere seu endereço de e-mail, não se preocupe. Você pode ignorar essa mensagem com segurança. + + Se você tiver alguma dúvida, [entre em contato com nossa equipe amigável](%{base_url}/sobre). + account_second_factor_disabled: + title: "Autenticação de dois fatores desativada" + subject_template: "[%{email_prefix}] Autenticação de dois fatores desativada" + text_body_template: | + A autenticação de dois fatores foi desativada na sua conta em %{site_name}. Agora você pode fazer o login apenas com sua senha; um código de autenticação adicional não é mais necessário. + + Se você não optou por desativar a autenticação de dois fatores, alguém pode ter comprometido sua conta. + + Se você tiver alguma dúvida, [entre em contato com nossa equipe amigável](%{base_url}/sobre). digest: why: "Um breve resumo de %{site_link} desde que viu pela última vez em %{last_seen_at}." since_last_visit: "Desde a sua última visita" new_topics: "Novos Tópicos" unread_messages: "Mensagens Não-lidas" unread_notifications: "Notificações Não-lidas" + liked_received: "Curtidas Recebidas" new_posts: "Novas Mensagens" new_users: "Usuários Novos" popular_topics: "Tópicos Populares" follow_topic: "Seguir esse tópico" join_the_discussion: "Leia Mais" popular_posts: "Publicações Populares" + more_new: "Novo para você" + subject_template: "[%{email_prefix}] Resumo" + unsubscribe: "Este resumo é enviado de %{site_link} quando não te vemos há algum tempo. Mude%{email_preferences_link}, ou%{unsubscribe_link} para cancelar a inscrição." + your_email_settings: "suas configurações de e-mail" click_here: "clique aqui" from: "resumo do site %{site_name} " preheader: "Um breve resumo do que aconteceu no fórum desde a sua última visita no dia %{last_seen_at}" + forgot_password: + title: "Esqueceu a senha" + subject_template: "[%{email_prefix}] Resetar a senha" + text_body_template: | + Alguém pediu para redefinir sua senha [%{site_name}](%{base_url}). + + Se não foi você, você pode ignorar com segurança este e-mail. + + Clique no link a seguir para escolher uma nova senha: + %{base_url}/u/password-reset/%{email_token} + email_login: + title: "Faça o login via link" + subject_template: "[%{email_prefix}] Faça o login via link" + text_body_template: | + Aqui está o seu link para entrar em [%{site_name}](%{base_url}). + + Se você não solicitou este link, pode ignorar esse e-mail com segurança. + + Clique no link a seguir para fazer login: + %{base_url}/session/email-login/%{email_token} + set_password: + title: "Configurar senha" + subject_template: "[%{email_prefix}] Configurar senha" + text_body_template: "Alguém pediu para adicionar uma senha à sua conta em [%{site_name}](%{base_url}). \nComo alternativa, você pode fazer login usando qualquer serviço online suportado (Google, Facebook, etc.) associado a esse endereço de e-mail validado.\n\nSe você não fez essa solicitação, pode ignorar esse e-mail com segurança.\n\nClique no link a seguir para escolher uma senha:\n%{base_url}/u/password-reset/%{email_token}\n" + admin_login: + title: "Login de administrador" + subject_template: "[%{email_prefix}] Login" + text_body_template: | + Alguém pediu para fazer login na sua conta [%{site_name}](%{base_url}). + + Se você não fez essa solicitação, pode ignorar esse e-mail com segurança. + + Clique no link a seguir para fazer o login: + %{base_url}/u/admin-login/%{email_token} + account_created: + title: "Conta Criada" + subject_template: "[%{email_prefix}] Sua Nova Conta" + text_body_template: | + Uma nova conta foi criada para você em%{site_name} + + Clique no link a seguir para escolher uma senha para sua nova conta: + %{base_url}/u/password-reset/%{email_token} confirm_new_email: title: "Confirmar novo e-mail" + subject_template: "[%{email_prefix}] Confirme seu novo endereço de e-mail" + text_body_template: | + Confirme seu novo endereço de e-mail para %{site_name} clicando no seguinte link: + + %{base_url}/u/authorize-email/%{email_token} + confirm_old_email: + title: "Confirmar Antigo e-mail" + subject_template: "[%{email_prefix}] Confirme seu endereço de e-mail atual" + text_body_template: "Antes que possamos alterar seu endereço de e-mail, precisamos que você confirme que você controla a conta de e-mail atual. \nDepois de concluir esta etapa, você terá que confirmar\no novo endereço de e-mail.\n\nConfirme seu endereço de e-mail atual para %{site_name} clicando no seguinte link:\n\n%{base_url}/u/authorize-email/%{email_token}\n" notify_old_email: + title: "Notificar e-mail antigo" + subject_template: "[%{email_prefix}] Seu endereço de e-mail foi alterado" text_body_template: | Esta é uma mensagem automática para lhe avisar que seu endereço de email para %{site_name} foi modificado. Se isso foi um erro, por favor entre em contato @@ -1417,55 +2707,109 @@ pt_BR: %{new_email} signup_after_approval: + title: "Inscrição Após Aprovação" subject_template: "Você foi aprovado no %{site_name}!" + text_body_template: | + Bem-vindo ao %{site_name}! + + Um membro da equipe aprovou sua conta em %{site_name}. + + Agora você pode acessar sua nova conta fazendo login em: + %{base_url} + + Se o link acima não for clicável, tente copiá-lo e colá-lo na barra de endereços do seu navegador da Web.. + + %{new_user_tips} + + Nós acreditamos em [comportamento comunitário civilizado](%{base_url}/diretrizes) em todos os momentos. + + Aproveite sua estadia! + signup: + title: "Inscrever-se" + subject_template: "[%{email_prefix}] Confirme sua nova conta" + text_body_template: | + Bem-vindo(a) %{site_name}! + + Clique no link a seguir para confirmar e ativar sua nova conta: + %{base_url}/u/activate-account/%{email_token} + + Se o link acima não for clicável, tente copiá-lo e colá-lo na barra de endereços do seu navegador da Web.. page_not_found: title: "Oops! Essa página não existe ou é privada." popular_topics: "Popular" recent_topics: "Recente" see_more: "Mais" search_title: "Procurar neste site" - search_google: "Google" + offline: + title: "Não é possível carregar o aplicativo" + offline_page_message: "Parece que você está off-line! Por favor, verifique sua conexão de rede e tente novamente." + login_required: + welcome_message: | + ## [Bem-vindo à %{title}](#bem-vindo) + Uma conta é necessária. Por favor, crie uma conta ou faça o login para continuar. terms_of_service: title: "Termos de Serviço" signup_form_message: 'Eu li e aceito os Termos de Serviço.' deleted: 'removido' + image: "imagem" upload: edit_reason: "cópias baixadas das imagens remotas" unauthorized: "Desculpe-nos, o arquivo que você está tentando enviar não é autorizado (extensões autorizadas: %{authorized_extensions})." pasted_image_filename: "Imagem colada" store_failure: "Falha ao arquivar o upload #%{upload_id} do usuário #%{user_id}." file_missing: "Desculpe, você deve fornecer um arquivo para upload." + empty: "Desculpe, mas o arquivo que você forneceu está vazio." + png_to_jpg_conversion_failure_message: "Ocorreu um erro ao converter de PNG para JPG." attachments: too_large: "Desculpe, o arquivo que você está tentando enviar é muito grande (o tamanho máximo é %{max_size_kb}KB)." images: too_large: "Desculpe, a imagem que você está tentando enviar é muito grande (o tamanho máximo é %{max_size_kb}KB), por favor a redimensione e tente novamente." + larger_than_x_megapixels: "Desculpe, a imagem que você está tentando enviar é muito grande (a dimensão máxima é %{max_image_megapixels}-megapixels), redimensione e tente novamente." size_not_found: "Desculpe, mas não conseguimos determinar o tamanho da imagem. É possível que seu arquivo de imagem esteja corrompido?" + placeholders: + too_large: "(imagem mais larga que%{max_size_kb}KB)" avatar: missing: "Desculpe! Não conseguimos achar nenhum avatar associado a esse endereço de email. Você pode tentar novamente?" flag_reason: sockpuppet: "Um novo usuário criou um tópico, e um outro novo usuário no mesmo endereço IP (%{ip_address}) respondeu. Veja a configuração `flag_sockpuppets` do site." spam_hosts: "Esse novo usuário tentou criar múltiplas publicações com links para o mesmo domínio (%{domain}). Veja a configuração `newuser_spam_host_threshold` do site." - email_log: - post_user_deleted: "Usuário da publicação foi apagado." - no_user: "Não foi possível encontrar usuário com id %{user_id}" - anonymous_user: "Usuário é anônimo" - suspended_not_pm: "Usuário está suspenso, não é uma mensagem" - seen_recently: "Usuário viu recentemente" - post_not_found: "Não foi possível encontrar uma mensagem com id %{post_id}" - notification_already_read: "A notificação deste e-mail é sobre já foi lido" - topic_nil: "post.topic é nulo" - post_deleted: "mensagem foi excluida pelo autor" - user_suspended: "usuário foi suspenso" - already_read: "usuário já leu esta mensagem" - exceeded_emails_limit: "max_emails_per_day_per_user excedido" - exceeded_bounces_limit: "bounce_score_threshold excedida" - message_blank: "message está em branco" - message_to_blank: "message.to está em branco" - text_part_body_blank: "text_part.body está em branco" - body_blank: "body está em branco" - no_echo_mailing_list_mode: "Notificações pela lista de emails desabilitadas para as publicações do próprio usuário" + skipped_email_log: + exceeded_emails_limit: "Excedido max_emails_per_day_per_user" + exceeded_bounces_limit: "Excedido bounce_score_threshold" + mailing_list_no_echo_mode: "Notificações da lista de discussão desativadas para as próprias postagens do usuário" + user_email_no_user: "Não é possível encontrar usuário com id %{user_id}" + user_email_post_not_found: "Não é possível encontrar uma postagem com o ID%{post_id}" + user_email_anonymous_user: "Usuário é anônimo" + user_email_user_suspended_not_pm: "Usuário está suspenso, não é uma mensagem" + user_email_seen_recently: "Usuário foi visto recentemente" + user_email_notification_already_read: "A notificação deste e-mail já foi lida" + user_email_notification_topic_nil: "post.topic é nulo" + user_email_post_user_deleted: "O usuário da postagem foi excluído." + user_email_post_deleted: "post foi excluído pelo autor" + user_email_user_suspended: "usuário foi suspenso" + user_email_already_read: "usuário já leu este post" + sender_message_blank: "mensagem está em branco" + sender_message_to_blank: "message.to está em branco" + sender_text_part_body_blank: "text_part.body está em branco" color_schemes: base_theme_name: "Base" + light: "Esquema de Luz" + dark: "Esquema Escuro" + neutral: "Esquema Neutro" + grey_amber: "Esquema Âmbar Cinzento" + shades_of_blue: "Sombras do Esquema Azul" + latte: "Esquema Latte" + summer: "Esquema De Verão" + dark_rose: "Esquema de Rosa Escura" + default_theme_name: "Claro" + light_theme_name: "Claro" + dark_theme_name: "Escuro" + neutral_theme_name: "Neutro" + grey_amber_theme_name: "Âmbar cinzento" + shades_of_blue_theme_name: "Tons de azul" + latte_theme_name: "Latte" + summer_theme_name: "Verão" + dark_rose_theme_name: "Rosa Escura" about: "Sobre" guidelines: "Diretrizes" privacy: "Privacidade" @@ -1477,103 +2821,380 @@ pt_BR: Altere o primeiro post desse tópico para mudar seu conteúdo na página de %{page_name} guidelines_topic: title: "Perguntas frequentes/Diretrizes" + body: "\n\n## [Este é um lugar civilizado para discussão pública] (#civilizado)\n\nPor favor, trate este fórum de discussão com o mesmo respeito que você faria com um parque público. Nós também somos um recurso da comunidade compartilhada & mdash; um lugar para compartilhar habilidades, conhecimento e interesses por meio de conversas contínuas.\n\nEssas não são regras rígidas e rápidas, meras diretrizes para ajudar o julgamento humano de nossa comunidade e manter esse lugar limpo e bem iluminado para o discurso público civilizado.\n\n\n\n## [Melhore a discussão] (#melhorar) \n\nAjude-nos a fazer deste um ótimo lugar para discussão, sempre trabalhando para melhorar a discussão de alguma forma, por menor que seja. Se você não tiver certeza de que sua postagem será adicionada à conversa, pense no que deseja dizer e tente novamente mais tarde.\n\nOs tópicos discutidos aqui são importantes para nós e queremos que você aja como se eles também fossem importantes para você. Seja respeitoso com os tópicos e as pessoas que os discutem, mesmo que você discorde de algo do que está sendo dito.\n\nUma maneira de melhorar a discussão é descobrindo aquelas que já estão acontecendo. Passe algum tempo navegando pelos tópicos aqui antes de responder ou iniciar o seu, e você terá mais chances de conhecer outras pessoas que compartilham seus interesses.\n\n\n\n## [Seja agradável, mesmo quando você discordar] (#agradável)\n\nVocê pode querer responder a algo discordando dele. Isso é bom. Mas lembre-se de _criticizar idéias, não pessoas_. Por favor, evite:\n\n* Xingamento\n* Ataques ad hominem\n* Respondendo ao tom de uma postagem em vez de seu conteúdo real\n* Contradição do joelho-empurrão\n\nEm vez disso, forneça contra-argumentos fundamentados que melhorem a conversa.\n\n\n\n## [Sua participação conta](#participe)\n\nAs conversas que temos aqui dão o tom para cada nova chegada. Ajude-nos a influenciar o futuro desta comunidade escolhendo participar de discussões que tornem este fórum um lugar interessante para ser & mdash; e evitando aqueles que não o fazem.\n\nO discurso fornece ferramentas que permitem à comunidade identificar coletivamente as melhores (e piores) contribuições: favoritos, marcações, sinalizações, respostas, edições e assim por diante. Use essas ferramentas para melhorar sua própria experiência e a das outras pessoas também.\n\nVamos deixar nossa comunidade melhor do que a encontramos.\n\n\n\n## [Se você ver um problema, sinalize-o] (#SinalizçãoDeProblemas)\n\nModeradores têm autoridade especial; eles são responsáveis ​​por este fórum. Mas você também. Com a sua ajuda, os moderadores podem ser facilitadores da comunidade, não apenas zeladores ou policiais.\n\nQuando você vir um mau comportamento, não responda. Ele encoraja o mau comportamento reconhecendo-o, consome sua energia e desperdiça o tempo de todos. _Apenas sinalize_ Se houver sinalizadores suficientes, ações serão tomadas, automaticamente ou por intervenção do moderador.\n\nPara manter nossa comunidade, os moderadores reservam-se o direito de remover qualquer conteúdo e qualquer conta de usuário por qualquer motivo a qualquer momento. Os moderadores não visualizam novas postagens; os moderadores e os operadores do site não se responsabilizam por nenhum conteúdo postado pela comunidade.\n\n\n\n## [Seja sempre civil] (#seja civil)\n\nNada sabota uma conversa saudável como grosseria:\n\n* Seja civilizado. Não poste nada que uma pessoa razoável consideraria ofensiva, abusiva ou de incitação ao ódio.\n* Mantenha-se limpo. Não publique nada de obsceno ou sexualmente explícito.\n* Respeitar-se mutuamente. Não assedie nem lamente ninguém, personifique pessoas ou exponha suas informações pessoais.\n* Respeite o nosso fórum. Não publique spam nem ofusque o fórum.\n\nEstes não são termos concretos com definições precisas & mdash; evite até mesmo a aparência de qualquer uma dessas coisas. Se você não tiver certeza, pergunte-se como se sentiria se sua publicação fosse publicada na primeira página do New York Times..\n\nEste é um fórum público e os mecanismos de pesquisa indexam essas discussões. Mantenha o idioma, links e imagens seguros para familiares e amigos.\n\n\n\n## [Mantenha-o arrumado] (#manter-arrumado)\n\nFaça o esforço para colocar as coisas no lugar certo, para que possamos passar mais tempo discutindo e menos limpando, assim:\n\n* Não comece um tópico na categoria errada.\n* Não publique a mesma coisa em vários tópicos.\n* Não publique respostas sem conteúdo.\n* Não desvie um tópico alterando-o no meio do caminho.\n* Não assine suas postagens & mdash; cada post tem suas informações de perfil anexadas.\n\nEm vez de postar \"+1\" ou \"Concordo\", use o botão Curtir. Em vez de usar um tópico existente em uma direção radicalmente diferente, use Responder como um tópico vinculado.\n\n\n\n## [Post apenas seu próprio material] (#roubar)\n\nVocê não pode postar nada digital que pertença a outra pessoa sem permissão. Você não pode postar descrições, links ou métodos para roubar propriedade intelectual de alguém (software, vídeo, áudio, imagens) ou violar qualquer outra lei.\n\n\n\n## [Empoderado por você] (#poder)\n\nEste site é operado por sua [equipe local amigável] (/ sobre) e * você *, a comunidade. Se você tiver outras dúvidas sobre como as coisas devem funcionar aqui, abra um novo tópico na [categoria de feedback do site] (/ c / feedback do site) e vamos discutir! Se houver um problema crítico ou urgente que não possa ser tratado por um meta tópico ou sinalizador, entre em contato conosco através da [página pessoal] (/ about).\n\n\n\n## [Termos de Serviço] (#tds)\n\nSim, legalês é chato, mas devemos nos proteger & ndash; e por extensão, você e seus dados & ndash; contra pessoas hostis. Temos um [Termos de Serviço] (/ tos) descrevendo seu (e nosso) comportamento e direitos relacionados a conteúdo, privacidade e leis. Para usar este serviço, você deve concordar em cumprir nossos [TOS] (/ tos).\n" tos_topic: title: "Termos de Serviço" + body: | + Os seguintes termos e condições regem todo o uso do %{company_domain} site e todo o conteúdo, serviços e produtos disponíveis no site ou através dele, incluindo, mas não se limitando a, %{company_domain} Software do Fórum, %{company_domain} Fóruns de Suporte e o %{company_domain}Serviço de hospedagem ("Hospedagem"), (em conjunto, o site). O site é de propriedade e operado por %{company_full_name} ("%{company_name}"). O Site é oferecido sujeito a sua aceitação sem modificação de todos os termos e condições aqui contidos e todas as outras regras operacionais, políticas (incluindo, sem limitação, %{company_domain} [Política de Privacidade] (/ privacidade) e [Diretrizes da Comunidade] (/ faq) e procedimentos que podem ser publicados de tempos em tempos neste Site por %{company_name} (coletivamente, o "Acordo"). + + Por favor, leia este Acordo cuidadosamente antes de acessar ou usar o Site. Ao acessar ou usar qualquer parte do site, você concorda em ficar vinculado aos termos e condições deste contrato. Se você não concordar com todos os termos e condições deste contrato, você não poderá acessar o site ou usar quaisquer serviços. Se estes termos e condições forem considerados uma oferta por %{company_name}, aceitação é expressamente limitada a estes termos. O site está disponível apenas para indivíduos com pelo menos 13 anos de idade. + + + ## [1. Sua %{company_domain} Conta](#1) + + Se você criar uma conta no site, será responsável por manter a segurança da sua conta e será totalmente responsável por todas as atividades que ocorram na conta. Você deve notificar imediatamente %{company_name} de qualquer uso não autorizado de sua conta ou qualquer outra violação de segurança. %{company_name} não será responsável por quaisquer atos ou omissões por você, incluindo quaisquer danos de qualquer natureza incorridos como resultado de tais atos ou omissões. + + + + ## [2. Responsabilidade dos Colaboradores](#2) + + Se você postar material no site, postar links no site, ou de outra forma fazer (ou permitir que qualquer terceiro faça) material disponível por meio do site (qualquer material, "conteúdo"), você é inteiramente responsável pelo conteúdo e qualquer dano resultante desse Conteúdo. Esse é o caso, independentemente de o Conteúdo em questão constituir texto, gráficos, arquivo de áudio ou software de computador. Ao disponibilizar o Conteúdo, você representa e garante que: + + * o download, a cópia e o uso do Conteúdo não infringirão os direitos de propriedade, incluindo, mas não se limitando aos direitos autorais, patente, marca registrada ou direitos de segredo comercial, de qualquer terceiro; + * se o seu empregador tiver direitos de propriedade intelectual que você criou, você (i) recebeu permissão do seu empregador para publicar ou disponibilizar o Conteúdo, incluindo, mas não se limitando a, qualquer software, ou (ii) garantiu ao seu empregador uma isenção de todos os direitos no ou para o Conteúdo; + * você cumpriu integralmente quaisquer licenças de terceiros relacionadas ao Conteúdo e fez todos os esforços necessários para transmitir aos usuários finais todos os termos necessários; + * o Conteúdo não contém ou instala vírus, worms, malware, cavalos de Tróia ou outro conteúdo nocivo ou destrutivo; + * o Conteúdo não é spam, não é gerado por computador ou aleatoriamente e não contém conteúdo comercial indesejado ou antiético destinado a direcionar tráfego para sites de terceiros ou aumentar a classificação dos mecanismos de pesquisa de sites de terceiros ou a outros atos ilícitos (como como phishing) ou enganar os destinatários quanto à origem do material (como spoofing); + * o Conteúdo não é pornográfico, não contém ameaças ou incita a violência e não viola os direitos de privacidade ou publicidade de terceiros; + * seu conteúdo não está sendo anunciado por meio de mensagens eletrônicas indesejadas, como links de spam em grupos de notícias, listas de e-mail, blogs e sites da Web, e métodos promocionais não solicitados semelhantes; + * seu conteúdo não é nomeado de uma maneira que induza seus leitores a pensar que você é outra pessoa ou empresa; e + * você tem, no caso de Conteúdo que inclui código de computador, categorizou com precisão e / ou descreveu o tipo, natureza, usos e efeitos dos materiais, se solicitado a fazê-lo por%{company_name} ou de outra maneira. + + + + ## [3. Licenças de Conteúdo do Usuárioe](#3) + + Contribuições do usuário são licenciadas sob uma [Licença Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported] (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). Sem limitar nenhuma dessas representações ou garantias, %{company_name} tem o direito (embora não a obrigação) de, em descrição de %{company_name} (i) recusar ou remover qualquer conteúdo que, em opinião razoável de%{company_name}, viola %{company_name} de qualquer forma prejudicial ou censurável, ou (ii) encerrar ou negar acesso e uso do Site a qualquer indivíduo ou entidade por qualquer motivo, em critério exclusivo de %{company_name}. %{company_name} Não terá obrigação de fornecer um reembolso de quaisquer valores pagos anteriormente. + + + + + ## [4. Pagamento e Renovação](#4) + + ### Termos Geral + + Serviços pagos opcionais ou upgrades podem estar disponíveis no site. Ao utilizar um serviço pago ou upgrade opcional, você concorda em pagar %{company_name} as taxas de assinatura mensais ou anuais indicadas. Os pagamentos serão cobrados em uma base pré-paga no dia em que você começar a utilizar o serviço ou upgrade e cobrirá o uso desse serviço ou upgrade por um período de assinatura mensal ou anual, conforme indicado. Estas taxas não são reembolsáveis. + + ### Renovação automática + + A menos que você notifique %{company_name} antes do final do período de assinatura aplicável que você deseja cancelar um serviço ou atualização, sua assinatura será renovada automaticamente e você nos autoriza a cobrar a taxa de assinatura anual ou mensal aplicável (assim como todos os impostos) usando qualquer cartão de crédito ou outro mecanismo de pagamento que temos registrado para você. As assinaturas podem ser canceladas a qualquer momento. + + + + ## [5. Serviços](#5) + + ### Hospedagem, Serviços de Suporte + + Os serviços opcionais de hospedagem e suporte podem ser fornecidos por %{company_name} nos termos e condições de cada serviço. Ao se inscrever para uma conta de serviços de hospedagem / suporte ou suporte, você concorda em obedecer a esses termos e condições. + + ### HTTPS + + Oferecemos HTTPS como um complemento pago. Ao inscrever-se e usar um domínio personalizado em %{company_domain}, você nos autoriza a agir em nome do registrante do nome de domínio (solicitando os certificados necessários, por exemplo) com o único propósito de fornecer HTTPS em seu site. + + ### Empresa + + Os serviços de hospedagem empresarial são fornecidos por %{company_name} nos termos e condições de cada serviço, que são determinados por um contrato específico do cliente. Ao inscrever-se em uma conta de hospedagem corporativa, você concorda em obedecer a esses termos e condições. + + + + ## [6. Responsabilidade dos visitantes do site](#6) + + %{company_name} não analisou e não pode revisar todo o material, incluindo software de computador, publicado no site e, portanto, não pode ser responsável pelo conteúdo, uso ou efeitos do material. Ao operar o site, %{company_name} não representa ou implica que endossa o material ali publicado, ou que acredita que esse material seja preciso, útil ou não prejudicial. Você é responsável por tomar as precauções necessárias para proteger a si e aos seus sistemas de computador contra vírus, worms, cavalos de Tróia e outros conteúdos prejudiciais ou destrutivos. O site pode conter conteúdo ofensivo, indecente ou censurável, bem como conteúdo que contenha imprecisões técnicas, erros tipográficos e outros erros. O Site também pode conter material que viola os direitos de privacidade ou publicidade, ou infringe a propriedade intelectual e outros direitos de propriedade de terceiros, ou o download, cópia ou uso dos mesmos está sujeito a termos e condições adicionais, declarados ou não declarados. %{company_name} se exime de qualquer responsabilidade por qualquer dano resultante do uso pelos visitantes do site, ou de qualquer download por aqueles visitantes de conteúdo lá publicado. + + + + ## [7. Conteúdo publicado em outros sites](#7) + + Não revisamos e não podemos revisar todo o material, incluindo software de computador, disponibilizado através dos sites e páginas da Web para os quais %{company_domain} links, e esse link para %{company_domain}. %{company_name} não tem nenhum controle sobre esses não-%{company_domain} sites e páginas da Web, e não é responsável por seu conteúdo ou seu uso. Ligando a um não-%{company_domain} website ou páginas da web, %{company_name} não representa ou implica que endossa tal site ou página da web. Você é responsável por tomar as precauções necessárias para proteger a si e seus sistemas de computador contra vírus, worms, cavalos de Tróia e outros conteúdos prejudiciais ou destrutivos. %{company_name} se exime de qualquer responsabilidade por qualquer dano resultante do uso de-%{company_domain} sites e páginas da web. + + + + ## [8. Violação de direitos autorais e política de DMCA](#8) + + Como %{company_name} pede aos outros que respeitem os seus direitos de propriedade intelectual, respeita os direitos de propriedade intelectual de terceiros. Se você acredita que o material localizado ou vinculado por %{company_domain} viola os seus direitos de autor e, se este website residir nos EUA, deverá notificar %{company_name} em concordância com a Lei [Digital Millennium Copyright Act] (http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) ("DMCA") de %{company_name} . %{company_name} responderá a todos esses avisos, inclusive conforme necessário ou apropriado, removendo o material infrator ou desativando todos os links para o material infrator. %{company_name} terminará o acesso de um visitante e o uso do Website se, em circunstâncias apropriadas, o visitante estiver determinado a ser um infrator reincidente dos direitos autorais ou outros direitos de propriedade intelectual de %{company_name} ou outros. No caso de tal rescisão, %{company_name} não terá obrigação de fornecer um reembolso de quaisquer valores pagos anteriormente %{company_name}. + + + + ## [9. Propriedade intelectual](#9) + + Este Contrato não transfere de %{company_name} para você qualquer %{company_name} ou propriedade intelectual de terceiros, e todos os direitos, títulos e interesses relativos a essa propriedade permanecerão (entre as partes) unicamente com %{company_name}. %{company_name}, %{company_domain}, o %{company_domain} logotipo, e todas as outras marcas registradas, marcas de serviço, gráficos e logotipos usados ​​em conexão com %{company_domain}, ou o site são marcas comerciais ou marcas registradas da%{company_name} ou os licenciadores de%{company_name}. Outras marcas comerciais, marcas de serviço, gráficos e logotipos utilizados em conexão com o site podem ser marcas registradas de terceiros. Seu uso do site não lhe concede nenhum direito ou licença para reproduzir ou usar qualquer %{company_name} ou marcas registradas de terceiros. + + + + ## [10. Atribuição](#10) + + %{company_name} reserva-se o direito de exibir links de atribuição como "Distribuído por%{company_domain},’ Autor do tema e atribuição de fonte em seu rodapé de conteúdo. + + + + ## [11. Alterar](#11) + + %{company_name} se reserva o direito, a seu exclusivo critério, de modificar ou substituir qualquer parte deste Contrato. É de sua responsabilidade verificar este Contrato periodicamente quanto a mudanças. Seu uso continuado ou acesso ao site após a publicação de quaisquer alterações a este Contrato constitui aceitação dessas alterações. %{company_name} poderá também, no futuro, oferecer novos serviços e / ou recursos através do Site (incluindo o lançamento de novas ferramentas e recursos). Tais novos recursos e / ou serviços estarão sujeitos aos termos e condições deste Contrato. + + + + ## [12. Terminação](#12) + + %{company_name} pode rescindir o seu acesso a toda ou qualquer parte do site a qualquer momento, com ou sem motivo, com ou sem aviso prévio, com efeito imediato. Se você deseja rescindir este Acordo ou sua %{company_domain} conta (se você tiver uma), você pode simplesmente interromper o uso do site. Todas as disposições deste Contrato, que por sua natureza devem sobreviver ao término, sobreviverão à rescisão, incluindo, sem limitação, disposições de propriedade, isenções de garantia, indenização e limitações de responsabilidade.. + + + + ## [13. Isenção de Garantias](#13) + + O site é fornecido "como está". %{company_name} e seus fornecedores e licenciantes renunciam todas as garantias de qualquer tipo, expressas ou implícitas, incluindo, sem limitação, as garantias de comercialização, adequação a uma finalidade específica e não violação. Nem %{company_name} nem seus fornecedores e licenciadores, faz qualquer garantia de que o site estará livre de erros ou que o acesso a ele será contínuo ou ininterrupto. Se você está realmente lendo isso, aqui está [um prazer] (http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html) . Você entende que você faz o download ou obtém conteúdo ou serviços através do Site por sua própria conta e risco. + + + + ## [14. Limitação de responsabilidade](#14) + + Em nenhum caso %{company_name}, ou seus fornecedores ou licenciadores, devem ser responsáveis ​​com relação a qualquer assunto deste contrato sob qualquer contrato, negligência, responsabilidade estrita ou outra teoria legal ou eqüitativa para: (i) quaisquer danos especiais, incidentais ou consequências; (ii) o custo de aquisição de produtos ou serviços substitutos; (iii) por interrupção de uso ou perda ou corrupção de dados; ou (iv) por quaisquer valores que excedam as taxas pagas por você para %{company_name} sob este contrato durante o período de 12 (doze) meses antes da causa da ação. %{company_name} não terá nenhuma responsabilidade por qualquer falha ou atraso devido a questões além de seu controle razoável. O acima exposto não se aplica na medida proibida pela lei aplicável. + + + + ## [15. General Representation and Warranty](#15) + + Você declara e garante que (i) seu uso do Website estará em estrita conformidade com o %{company_name} [Política de Privacidade] (/ privacidade), [Diretrizes da comunidade] (/ diretrizes), com este Contrato e com todas as leis e regulamentações aplicáveis ​​(incluindo, sem limitação, quaisquer leis ou regulamentos locais em seu país, estado, cidade ou outra área governamental, em relação à conduta on-line e conteúdo aceitável, e incluindo todas as leis aplicáveis ​​relativas à transmissão de dados técnicos exportados do país em que este site reside ou do país em que você reside) e (ii) seu uso do Site não infringirá ou utilizará indevidamente direitos de propriedade intelectual de terceiros. + + + + ## [16. Indemnification](#16) + + Você concorda em indenizar e inocentar %{company_name}, seus contratados e seus licenciadores e seus respectivos diretores, executivos, funcionários e agentes de e contra todas e quaisquer reivindicações e despesas, incluindo honorários advocatícios, decorrentes do uso do Website, incluindo, mas não se limitando à sua violação deste Acordo. + + + + ## [17. Diversos](#17) + + Este Contrato constitui o acordo integral entre %{company_name} e você sobre o assunto em questão, e eles só podem ser modificados por uma emenda escrita assinada por um executivo autorizado da %{company_name}, ou pela postagem por %{company_name} de uma versão revisada. Exceto na medida em que a lei aplicável, caso exista, em contrário, este Contrato, qualquer acesso ou uso do Site será regido pelas leis do estado da Califórnia, EUA, excluindo o conflito de provisões legais e o local adequado para quaisquer disputas decorrentes de ou relacionadas a qualquer um dos mesmos serão os tribunais estaduais e federais localizados no Condado de San Francisco, Califórnia. Exceto por reivindicações por medidas cautelares ou equitativas ou reclamações referentes a direitos de propriedade intelectual (que podem ser trazidas em qualquer tribunal competente sem a publicação de uma fiança), qualquer disputa que surja sob este Acordo será finalmente resolvida de acordo com as Regras de Arbitragem Abrangentes da Arbitragem Judicial e Serviço de Mediação, Inc. (“JAMSâ€) por três árbitros indicados de acordo com tais Regras. A arbitragem será realizada em São Francisco, Califórnia, no idioma inglês, e a decisão arbitral poderá ser executada em qualquer tribunal. A parte prevalecente em qualquer ação ou processo para fazer cumprir este Contrato terá direito a custos e honorários advocatícios. Se qualquer parte deste Contrato for considerada inválida ou inexequível, essa parte será interpretada de forma a refletir a intenção original das partes e as partes restantes permanecerão em pleno vigor e efeito. Uma renúncia por qualquer das partes de qualquer termo ou condição deste Contrato ou qualquer violação do mesmo, em qualquer instância, não renunciará a tal termo ou condição ou qualquer violação subseqüente do mesmo. Você pode ceder seus direitos sob este Contrato a qualquer parte que consente e concorda em ficar vinculada aos seus termos e condições.; %{company_name} pode ceder seus direitos sob este Contrato sem condição. Este Contrato será vinculativo e terá efeito em benefício das partes, seus sucessores e cessionários permitidos. + + Este documento é CC-BY-SA. Última atualização: 1 de janeiro de 2018. + + Originalmente adaptado dos [Termos de Serviço do WordPress] (http://en.wordpress.com/tos/). privacy_topic: title: "Política de Privacidade" + body: | + + + ## [Quais informações coletamos?] (# Coletar) + + Coletamos informações de você quando você se registra em nosso site e coletamos dados quando você participa do fórum lendo, escrevendo e avaliando o conteúdo compartilhado aqui. + + Ao se registrar em nosso site, você pode ser solicitado a digitar seu nome e endereço de e-mail. Você pode, no entanto, visitar o nosso site sem se registrar. Seu endereço de e-mail será verificado por um e-mail contendo um link exclusivo. Se esse link for visitado, sabemos que você controla o endereço de e-mail. + + Quando registrado e postando, nós registramos o endereço IP de onde a postagem se originou. Também podemos reter logs do servidor, que incluem o endereço IP de cada solicitação para o nosso servidor. + + + + ## [Para que usamos suas informações?] (# Use) + + Qualquer informação que coletamos de você pode ser usada de uma das seguintes formas: + + * Para personalizar sua experiência & mdash; suas informações nos ajudam a responder melhor às suas necessidades individuais. + * Para melhorar nosso site & mdash; nos esforçamos continuamente para melhorar nossas ofertas de sites com base nas informações e comentários que recebemos de você. + * Para melhorar o atendimento ao cliente & mdash; suas informações nos ajudam a responder com mais eficácia às suas solicitações de atendimento ao cliente e às necessidades de suporte. + * Para enviar emails periódicos & mdash; O endereço de e-mail que você fornece pode ser usado para enviar informações, notificações que você solicita sobre alterações em tópicos ou em resposta ao seu nome de usuário, responder a perguntas e / ou outras solicitações ou perguntas. + + + + ## [Como protegemos suas informações?] (# Protect) + + Implementamos uma variedade de medidas de segurança para manter a segurança de suas informações pessoais quando você insere, envia ou acessa suas informações pessoais.. + + + + ## [Qual é a sua política de retenção de dados?] (# Retenção de dados) + + Faremos um esforço de boa fé para: + + * Manter logs do servidor contendo o endereço IP de todas as solicitações para esse servidor por no máximo 90 dias. + * Manter os endereços IP associados aos usuários registrados e suas postagens não mais que 5 anos. + + + + ## [Nós usamos cookies?] (# Cookies) + + Sim. Cookies são pequenos arquivos que um site ou seu provedor de serviços transfere para o disco rígido do seu computador através do navegador da Web (se você permitir). Esses cookies permitem que o site reconheça seu navegador e, se você tiver uma conta registrada, associe-a à sua conta registrada. + + Usamos cookies para entender e salvar suas preferências para futuras visitas e compilar dados agregados sobre o tráfego do site e a interação no site para que possamos oferecer melhores experiências e ferramentas ao site no futuro. Podemos contratar prestadores de serviços terceirizados para nos ajudar a entender melhor os visitantes do nosso site. Esses provedores de serviços não têm permissão para usar as informações coletadas em nosso nome, exceto para nos ajudar a conduzir e melhorar nossos negócios. + + + + ## [Nós divulgamos qualquer informação a terceiros?] (# Divulgue) + + Nós não vendemos, comercializamos ou transferimos de outra forma para terceiros suas informações pessoalmente identificáveis. Isso não inclui terceiros confiáveis ​​que nos auxiliam a operar nosso site, conduzir nossos negócios ou prestar serviços a você, desde que essas partes concordem em manter essas informações confidenciais. Também podemos liberar suas informações quando acreditarmos que a divulgação é apropriada para cumprir a lei, aplicar as políticas do nosso site ou proteger os direitos, propriedade ou segurança da nossa empresa ou de terceiros. No entanto, informações de visitantes não pessoalmente identificáveis ​​podem ser fornecidas a terceiros para fins de marketing, publicidade ou outros usos. + + + + ## [Links de terceiros] (# terceiros) + + Ocasionalmente, a nosso critério, podemos incluir ou oferecer produtos ou serviços de terceiros em nosso site. Esses sites de terceiros possuem políticas de privacidade separadas e independentes. Portanto, não temos responsabilidade nem obrigação pelo conteúdo e atividades desses sites vinculados. No entanto, procuramos proteger a integridade do nosso site e agradecemos qualquer feedback sobre esses sites. + + + + ## [Cumprimento da Lei de Proteção à Privacidade Online das Crianças] (#coppa) + + Nosso site, produtos e serviços são direcionados para pessoas com pelo menos 13 anos de idade ou mais. Se este servidor estiver nos EUA e você tiver menos de 13 anos, de acordo com os requisitos da COPPA (https://en.wikipedia.org/wiki/Children_Online_Privacy_Privection_Act), não use esse site. + + + + ## [Política de Privacidade Online Apenas] (#online) + + Esta política de privacidade on-line se aplica somente a informações coletadas por meio de nosso site e não a informações coletadas off-line. + + + + ## [Seu consentimento] (#consentimento) + + Ao utilizar o nosso site, você concorda com a política de privacidade do nosso site.. + + + + ## [Alterações à nossa Política de Privacidade] (#alterações) + + Se decidirmos alterar nossa política de privacidade, publicaremos essas alterações nesta página. + + Este documento é CC-BY-SA. Última atualização em 31 de maio de 2013. badges: editor: name: Editor description: Primeira edição de mensagem + long_description: | + Esse selo é concedido na primeira vez que você edita uma de suas postagens. Embora você não possa editar suas postagens para sempre, a edição é incentivada. Você pode melhorar a formatação, corrigir pequenos erros ou adicionar qualquer coisa que tenha perdido quando postou originalmente. Edite para tornar suas postagens ainda melhores! basic_user: name: Básico - description: "Concedido o acesso a todas as funções essenciais da comunidade" + description: "Concedido todas as funções essenciais da comunidade" + long_description: | + Este selo é concedido quando você atinge o nível de confiança 1. Obrigado por ficar por perto e ler alguns tópicos para aprender sobre o que é a nossa comunidade. Novas restrições de usuários foram levantadas; você recebeu todas as habilidades essenciais da comunidade, como mensagens pessoais, sinalização, edição de wiki e a capacidade de postar várias imagens e links. member: name: Membro - description: "Concedido o acesso a enviar convites, mensagens em grupo e mais curtidas" + description: "Concedidoconvites, mensagens de grupo, mais curtidas" + long_description: | + Este selo é concedido quando você atinge o nível de confiança 2. Obrigado por participar durante um período de semanas para realmente se juntar à nossa comunidade. Agora você pode enviar convites a partir de sua página de usuário ou tópicos individuais, criar mensagens pessoais de grupo e ter mais curtidas por dia. regular: name: Habitual - description: "Concedido o acesso a recategorizar, renomear, seguir links, wiki e mais curtidas" + description: "Concedidorecategorize, renomeie, links seguidos, wiki, mais curtidas" + long_description: | + Este crachá é concedido quando você atinge o nível de confiança 3. Obrigado por ser uma parte regular de nossa comunidade durante um período de meses. Agora você é um dos leitores mais ativos e um colaborador confiável que torna nossa comunidade excelente. Agora você pode recategorizar e renomear tópicos, aproveitar os sinalizadores de spam mais poderosos, acessar uma área de espera privada e também aproveitar muito mais curtidas por dia. leader: name: Líder - description: "Concedido o acesso para editar globalmente, fixar, fechar, arquivar, desmembrar e unificar tópicos, além de mais curtidas" + description: "Concedido editar global, pin, fechar, arquivar, dividir e mesclar, mais curtidas" long_description: | - Este emblema é concedido quando você alcança o nível de confiança 4. Você é um líder desta comunidade selecionado pela equipe, e define um exemplo positivo em suas ações e palavras. Você tem habilidade de editar todos tópicos, agir como moderador nas ações como fixar, fechar, delistar, arquivar, separar, agrupar e vários curtidas a mais por dia. + Esse selo é concedido quando você atinge o nível de confiança 4. Você é um líder nessa comunidade, conforme selecionado pela equipe, e você define um exemplo positivo para o restante da comunidade em suas ações e palavras aqui. Você pode editar todas as postagens, realizar ações comuns de moderador de tópicos, como pin, close, unlist, archive, split e merge. welcome: name: Bem-Vindo description: Recebeu uma curtida long_description: | - Este emblema é concedido quando você recebe sua primeira curtida numa mensagem. Parabéns, você postou algo que sua comunidade achou interessante, legal ou divertido! + Este crachá é concedido quando você recebe seu primeiro como em um post. Parabéns, você postou algo que seus colegas da comunidade acharam interessante, interessante ou útil. autobiographer: name: Autobiógrafo + description: "Preencher Perfil informação" + long_description: | + Este crachá é concedido para preenchimento seu perfil de usuário e selecionando uma foto de perfil. Permitir que a comunidade saiba um pouco mais sobre quem você é e sobre o que você está interessado contribui para uma comunidade melhor e mais conectada. Junte-se a nós! anniversary: name: Aniversário description: "Membro ativo por um ano, postou ao menos uma vez" + long_description: | + Este selo é concedido quando você faz parte de um ano com pelo menos uma postagem nesse ano. Obrigado por ficar por aqui e contribuir para a nossa comunidade. Nós não poderíamos fazer isso sem você. nice_post: name: Resposta Interessante description: Recebeu 10 curtidas em uma resposta + long_description: | + Esse selo é concedido quando sua resposta recebe 10 curtidas. Sua resposta causou uma boa impressão na comunidade e ajudou a levar a conversa adiante. good_post: name: Boa Resposta description: Recebeu 25 curtidas em uma resposta + long_description: | + Esse selo é concedido quando sua resposta recebe 25 curtidas. Sua resposta foi excepcional e tornou a conversa muito mais interessante. great_post: name: Excelente Resposta description: Recebeu 50 curtidas em uma resposta + long_description: | + Esse selo é concedido quando sua resposta recebe 50 curtidas. Uau! Sua resposta foi inspiradora, fascinante, hilariante ou perspicaz e a comunidade adorou! nice_topic: name: Tópico Interessante description: Recebeu 10 curtidas em um tópico + long_description: | + Esse selo é concedido quando seu tópico recebe 10 curtidas. Você começou uma conversa interessante que a comunidade gostou. good_topic: name: Bom Tópico description: Recebeu 25 curtidas em um tópico + long_description: | + Esse selo é concedido quando seu tópico recebe 25 curtidas. Você lançou uma conversa vibrante em que a comunidade se reuniu. great_topic: name: Excelente Tópico description: Recebeu 50 curtidas em um tópico + long_description: | + Esse selo é concedido quando seu tópico recebe 50 curtidas. Você iniciou uma conversa fascinante e a comunidade amou a discussão animada que resultou! nice_share: name: Compartilhamento Interessante description: Compartilhou uma postagem com 25 visitas únicas + long_description: | + Este selo é concedido para compartilhar um link que foi clicado por 25 visitantes externos. Obrigado por divulgar nossas discussões e esta comunidade. good_share: name: Bom Compartilhamento description: Compartilhou uma postagem com 300 visitas únicas + long_description: | + Esse selo é concedido para compartilhar um link que foi clicado por 300 visitantes externos. Bom trabalho! Você mostrou uma ótima discussão para várias pessoas novas e ajudou essa comunidade a crescer. great_share: name: Excelente Compartilhamento description: Compartilhou uma postagem com 1000 visitas únicas + long_description: | + Este selo é concedido para compartilhar um link que foi clicado por 1.000 visitantes externos. Uau! Você promoveu uma discussão interessante para um grande público novo e ajudou-nos a crescer em grande escala em nossa comunidade! first_like: name: Primeira Curtida description: Curtiu uma mensagem + long_description: | + Este emblema é concedido na primeira vez que você gostar de uma postagem usando o botão: heart:. Gostar de postagens é uma ótima maneira de mostrar aos outros membros da comunidade que o que eles postaram era interessante, útil, legal ou divertido. Compartilhe o amor! first_flag: name: Primeira Sinalização description: Sinalizou uma mensagem + long_description: | + Este emblema é concedido na primeira vez que você sinaliza uma postagem. Sinalizar é como todos nós ajudamos a manter este local agradável para todos. Se você perceber qualquer postagem que exija atenção do moderador por qualquer motivo, não hesite em sinalizar. Se você encontrar um problema,: flag_black: sinalize! promoter: name: Promotor description: Convidou um usuário + long_description: | + Esse selo é concedido quando você convida alguém para participar da comunidade por meio do botão de convite na sua página de usuário ou na parte inferior de um tópico. Convidar amigos que possam estar interessados ​​em discussões específicas é uma ótima maneira de apresentar novas pessoas à nossa comunidade, então, obrigado! campaigner: name: Ativista description: Convidou 3 usuários básicos + long_description: | + Este selo é concedido quando você convidou três pessoas que, posteriormente, passaram bastante tempo no site para se tornarem usuários básicos. Uma comunidade vibrante precisa de uma infusão regular de recém-chegados que participem regularmente e adicionem novas vozes às conversas. champion: name: Campeão description: Convidou 5 membros + long_description: | + Este selo é concedido quando você convidou cinco pessoas que, posteriormente, passaram bastante tempo no site para se tornarem membros plenos. Uau! Obrigado por expandir a diversidade da nossa comunidade com novos membros! first_share: name: Primeiro Compartilhamento description: Compartilhou uma mensagem + long_description: | + Esse selo é concedido na primeira vez que você compartilha um link para uma resposta ou um tópico usando o botão de compartilhamento. Compartilhar links é uma ótima maneira de mostrar discussões interessantes com o resto do mundo e aumentar sua comunidade. first_link: name: Primeiro Link description: Adicionou um link para outro tópico + long_description: | + Esse selo é concedido na primeira vez que você adiciona um link a outro tópico. A vinculação de tópicos ajuda colegas leitores a encontrar conversas relacionadas interessantes, mostrando as conexões entre os tópicos em ambas as direções. Link livremente! first_quote: name: Primeira Citação description: Citou uma mensagem + long_description: | + Esse selo é concedido na primeira vez que você citar uma postagem na sua resposta. Citar partes relevantes de postagens anteriores na sua resposta ajuda a manter as discussões conectadas juntas e no tópico. A maneira mais fácil de citar é destacar uma seção de uma postagem e, em seguida, pressionar qualquer botão de resposta. Cite generosamente! read_guidelines: name: Leu as regras + description: "Leia as diretrizes da comunidade" + long_description: | + Este crachá é concedido porter lido as diretrizes da comunidade. Seguir e compartilhar essas diretrizes simples ajuda a criar uma comunidade segura, divertida e sustentável para todos. Lembre-se sempre de que há outro ser humano, um muito parecido com você, do outro lado da tela. Seja legal! reader: name: Leitor description: Leu todas as respostas em um tópico com mais de 100 respostas + long_description: | + Esse selo é concedido na primeira vez que você lê um tópico longo com mais de 100 respostas. Ler uma conversa de perto ajuda você a acompanhar a discussão, entender diferentes pontos de vista e levar a conversas mais interessantes. Quanto mais você lê, melhor a conversa fica. Como gostamos de dizer, a leitura é fundamental! : slight_smile: popular_link: name: Link Popular description: Postou um link externo com 50 clicks + long_description: | + Este selo é concedido quando um link compartilhado recebe 50 cliques. Obrigado por postar um link útil que adicionou contexto interessante para a conversa! hot_link: name: Link Quente description: Postou um link externo com 300 clicks + long_description: | + Esse selo é concedido quando um link compartilhado recebe 300 cliques. Obrigado por postar um link fascinante que levou a conversa adiante e iluminou a discussão! famous_link: name: Link Famoso description: Postou um link externo com 1000 clicks + long_description: | + Esse selo é concedido quando um link compartilhado recebe 1.000 cliques. Uau! Você postou um link que melhorou significativamente a conversa adicionando detalhes, contexto e informações essenciais. Ótimo trabalho! appreciated: name: Agradecido description: Teve 20 mensagens curtidas @@ -1587,38 +3208,84 @@ pt_BR: admired: name: Admirado description: Recebeu 5 curtidas em 300 mensagens + long_description: | + Esse selo é concedido quando você recebe pelo menos cinco curtidas em 300 postagens diferentes. Uau! A comunidade admira suas contribuições freqüentes e de alta qualidade para as conversas aqui. out_of_love: name: Por Amor description: Usou 50 likes no mesmo dia + long_description: | + Este emblema é concedido quando você usa todos os 50 dos seus gostos diários. Lembrar-se de ter um momento e gostar das postagens que você aprecia e aprecia incentiva os membros da sua comunidade a criarem ainda mais discussões importantes no futuro. higher_love: name: Amor Maior description: Deu 50 curtidas no mesmo dia 5 vezes + long_description: | + Esse selo é concedido quando você usa todos os 50 gostos diários por cinco dias. Obrigado por tomar o tempo ativamente incentivando as melhores conversas todos os dias! crazy_in_love: name: Apaixonado description: Deu 50 curtidas no mesmo dia 20 vezes + long_description: | + Esse selo é concedido quando você usa todos os 50 gostos diários por 20 dias. Uau! Você é um exemplo para incentivar os membros de sua comunidade! thank_you: name: Obrigado description: Teve 20 mensagens curtidas e curtiu 10 mensagens + long_description: | + Esse selo é concedido quando você tem 20 postagens curtidas e dá 10 ou mais curtidas em troca. Quando alguém gosta de suas postagens, você encontra tempo para gostar do que os outros estão postando também. gives_back: name: Retribuidor description: Curtiu 100 mensagens e teve 100 mensagens curtidas + long_description: | + Esse selo é concedido quando você tem 100 postagens curtidas e dá 100 ou mais curtidas em troca. Obrigado por pagá-lo para a frente! empathetic: name: Empático description: Curtiu 1000 mensagens e teve 500 mensagens curtidas + long_description: | + Esse selo é concedido quando você tem 500 postagens e recebe 1.000 ou mais curtidas em troca. Uau! Você é um modelo de generosidade e apreciação mútua: two_hearts :. first_emoji: name: Primeiro emoji description: Utilizou um emoji em uma publicação + long_description: | + Este emblema é concedido na primeira vez que você adicionar um Emoji à sua postagem: thumbsup :. Emoji permite que você transmita emoção em seus posts, da felicidade: smiley: à tristeza: angustiado: à raiva: irritado: e todo o resto: óculos de sol :. Basta digitar a: (dois pontos) ou pressionar o botão da barra de ferramentas Emoji no editor para selecionar centenas de opções: ok_hand: first_mention: name: Primeira menção - long_description: "Este emblema é concedido na primeira vez em que você menciona o @nomedeusuaio de alguém em uma publicação. Cada menção gera uma notificação para a pessoa de forma que ela saiba o que você publicou. Simplesmente comece a digitar \"@\" (arroba) para mencionar qualquer usuário ou, caso permitido, um grupo -- é uma maneira conveniente de chamar a atenção de alguém." + description: Mencionou um usuário em uma postagem + long_description: | + Este selo é concedido na primeira vez em que você menciona o @nome de usuário de alguém na sua postagem. Cada menção gera uma notificação para essa pessoa, para que eles saibam sobre sua postagem. Basta começar a digitar @ (no símbolo) para mencionar qualquer usuário ou, se permitido, o grupo - é uma maneira conveniente de chamar a atenção deles para algo. first_onebox: name: Primeiro Onebox description: Postou um link que foi embutido na mensagem - long_description: "Esse emblema é concedido na primeira vez em que você posta um link que é convertido automaticamente em uma caixa com um título, sumário e uma imagem (se disponível) sumarizando o link. " + long_description: | + Esse selo é concedido na primeira vez em que você publica um link em uma linha sozinho, que é automaticamente expandido para uma caixa de ferramentas com um resumo, título e (quando disponível) imagem. first_reply_by_email: name: Primeira Resposta por email + description: Respondeu a uma postagem por email + long_description: | + Este emblema é concedido na primeira vez que você responder a uma postagem por email: e-mail :. + new_user_of_the_month: + name: "Novo usuário do mês" + description: Contribuições pendentes no primeiro mês + long_description: | + Este selo é concedido para parabenizar dois novos usuários a cada mês por suas excelentes contribuições gerais, conforme a medida de quantas pessoas gostaram de suas postagens e por quem. + enthusiast: + name: Entusiasta + description: Visitado 10 dias + long_description: | + Este crachá é concedido para visitas de 10 dias consecutivos. Obrigado por ficar com a gente por mais de uma semana! + aficionado: + name: Aficionado + description: Visitado 100 dias + long_description: | + Este distintivo é concedido para visitas de 100 dias consecutivos. Isso é mais do que três meses! + devotee: + name: Devoto + description: Visitado 365 dias + long_description: | + Este selo é concedido para visitas de 365 dias consecutivos. Uau, um ano inteiro! + badge_title_metadata: "%{display_name}emblema em %{site_title}" admin_login: success: "Email Enviado" + errors: + unknown_email_address: "endereço de e-mail desconhecido." + invalid_token: "token inválido" email_input: "Email do Administrador" submit_button: "Enviar Email" performance_report: @@ -1628,6 +3295,7 @@ pt_BR: title: "Marcações" staff_tag_disallowed: "A marcação \"%{tag}\" pode ser aplicada somente pelo pessoal de apoio." staff_tag_remove_disallowed: "A marcação \"%{tag}\" pode ser removida somente pelo pessoal de apoio." + minimum_required_tags: "Você deve selecionar pelo menos %{count} tags." rss_by_tag: "Tópicos marcados com %{tag}" finish_installation: congratulations: "Parabéns, você instalou o Discourse!" @@ -1635,13 +3303,21 @@ pt_BR: button: "Registro" title: "Registro da Conta Administradora" help: "registro de uma nova conta para ser iniciado" + no_emails: "Infelizmente, nenhum e-mail de administrador foi definido durante a configuração, portanto, a finalização da configuração pode ser difícil. Por favor, adicione o e-mail no arquivo de configuração ou criar uma conta de administrador a partir do console." confirm_email: title: "Confirme seu email" + message: "

Enviamos um e-mail de ativação para %{email}. Por favor, siga as instruções no e-mail para ativar sua conta.

Se ele não chegar, verifique se você configurou o e-mail corretamente para seu Discurso e verifique sua pasta de spam.

" resend_email: title: "Reenviar Email de Confirmação" message: "

Reenviamos o email de confirmação para %{email}" safe_mode: + title: "Entre no modo de segurança" + description: "O modo de segurança permite que você teste seu site sem carregar plug-ins ou personalizações de site." + no_customizations: "Desabilitar tema atual" + only_official: "Desabilitar plugins não oficiais" no_plugins: "Desabilitar todos os plugins" + enter: "Entre no modo de segurança" + must_select: "Você deve selecionar pelo menos uma opção para entrar no modo de segurança." wizard: title: "Configuração do Discourse" step: @@ -1652,9 +3328,11 @@ pt_BR: description: "Qual é o idioma padrão para sua comunidade?" forum_title: title: "Nome" + description: "Seu nome é um sinal visível à distância, a primeira coisa que os potenciais visitantes notarão sobre a sua comunidade. O que seu nome e título dizem sobre sua comunidade?" fields: title: label: "O nome de sua comunidade" + placeholder: "Hangout de Jane" site_description: label: "Descreva sua comunidade numa frase curta." placeholder: "Um lugar para Jane e seus amigos discutirem coisas legais." @@ -1663,9 +3341,11 @@ pt_BR: fields: welcome: label: "Tópico de Boas Vindas" + description: "

Como você descreveria sua comunidade para um estranho em um elevador em cerca de 1 minuto?

  • Para quem são essas discussões ?
  • O que posso encontrar aqui?
  • Por que eu deveria visitar?

Seu tópico de boas vindas é a primeira coisa que os recém-chegados vão ler. Pense nisso como seuum parágrafo arremesso de elevador' ou 'declaração de missão'." one_paragraph: "Por favor, reduza sua mensagem de boas-vindas para um parágrafo." privacy: title: "Acesso" + description: "

Sua comunidade está aberta a todos ou é restrita por associação, convite ou aprovação? Se preferir, pode definir as coisas de forma privada e depois mudar para o público mais tarde.

Você sempre pode enviar convites de tópicos ou da sua página de perfil de usuário também.

" fields: privacy: choices: @@ -1681,12 +3361,17 @@ pt_BR: contact_email: label: "E-mail" placeholder: "nome@exemplo.com" + description: "Endereço de e-mail da pessoa ou grupo responsável por essa comunidade. Usado para notificações críticas, como sinalizadores não tratados, atualizações de segurança e sua sobre a página para contato urgente da comunidade." contact_url: + label: "Página da Web" placeholder: "http://www.example.com/contact-us" + description: "Página de contato geral para você ou sua organização. Será exibido no sua sobre a página." site_contact: label: "Mensagens Automatizadas" + description: "Todas as mensagens pessoais do Discourse automatizadas serão enviadas a partir desse usuário, como avisos de sinalização e avisos de conclusão de backup." corporate: title: "Organização" + description: "Estes nomes serão inseridos no seu Política de Privacidade e Termos de Serviço, Estes são tópicos que você pode editar na categoria Staff. Se você não tem uma empresa, sinta-se à vontade para pular esta etapa por enquanto." fields: company_short_name: label: "Nome da Empresa (curto)" @@ -1701,6 +3386,7 @@ pt_BR: title: "Tema" fields: theme_id: + description: "Você prefere um esquema de cores claras ou escuras para começar? Você pode personalizar ainda mais a aparência do seu site por meio do Admin, Personalizar." choices: default: label: "Claro Simples" @@ -1720,22 +3406,53 @@ pt_BR: fields: favicon_url: label: "Ãcone pequeno" - description: "Ãcone usado para representar seu site em navegadores, que tenha boa aparência em tamanhos pequenos, como 32px por 32px." + description: "Imagem de ícone usada para representar seu site em navegadores da Web que parecem bons em tamanhos pequenos, como 32 x 32 pixels. As extensões de imagem recomendadas são PNG ou JPG." apple_touch_icon_url: label: "Ãcone Largo" - description: "Ãcone usado para representar seu site em dispositivos modernos, que tenha boa aparência em tamanhos maiores. O tamanho recomendado é pelo menos 144px por 144px." + description: "Imagem de ícone usada para representar seu site em dispositivos modernos com boa aparência em tamanhos maiores. O tamanho recomendado é de pelo menos 512 px por 512 px." homepage: + description: "Recomendamos que você mostre os tópicos mais recentes em sua página inicial, mas também pode mostrar categorias (grupos de tópicos) na página inicial, se preferir." title: "Página Inicial" fields: homepage_style: choices: latest: label: "Últimos tópicos" - categories: - label: "Categorias" + categories_only: + label: "Apenas categorias" + categories_with_featured_topics: + label: "Categorias com tópicos em destaque" + categories_and_latest_topics: + label: "Categorias e Tópicos Mais Recentes" + categories_and_top_topics: + label: "Categorias e tópicos principais" emoji: title: "Emoji" + description: "Qual estilo Emoji você prefere para sua comunidade? Você pode adicionar mais Emoji personalizado posteriormente via Admin, Personalizar, Emoji." invites: title: "Convidar um grupo" + description: "Você está quase pronto! Vamos convidar algumas pessoas para ajudar \nsemear suas discussões com tópicos e respostas interessantes para iniciar sua comunidade." finished: title: "Seu Discourse está pronto!" + description: | +

Se você sentir vontade de alterar essas configurações, visite sua seção administrativa; encontre-o ao lado do ícone de chave inglesa no menu do site.

+

Divirta-se e boa sorte construindo sua nova comunidade!

+ search_logs: + graph_title: "Contagem de pesquisa" + joined: "Ingressou" + discourse_push_notifications: + popup: + mentioned: '%{username} mencionei você em "%{topic}" - %{site_title}' + group_mentioned: '%{username} mencionei você em "%{topic}" - %{site_title}' + quoted: '%{username} citou você em "%{topic}" - %{site_title}' + replied: '%{username} respondeu-lhe em "%{topic}" - %{site_title}' + posted: '%{username} publicado em "%{topic}" - %{site_title}' + private_message: '%{username} enviou-lhe uma mensagem privada em "%{topic}" - %{site_title}' + linked: '%{username}ligado ao seu post de "%{topic}" - %{site_title}' + confirm_title: 'Notificações ativadas -%{site_title}' + confirm_body: 'Sucesso! Notificações foram ativadas.' + staff_action_logs: + not_found: "não encontrado" + unknown: "desconhecido" + user_merged: "%{username} foi mesclado nessa conta" + user_delete_self: "Excluído por si mesmo de %{url}" diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index 4470c411aa..950558c1d5 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -81,23 +81,23 @@ ro: one: "ÃŽnregistrarea nu poate fi ÅŸtearsă pentru că există %{record} (de) înregistrări dependente" many: "ÃŽnregistrarea nu poate fi ÅŸtearsă pentru că există %{record} (de) înregistrări dependente" too_long: - few: este prea lung (maximum %{count} caractere) one: este prea lung (maximum un caracter) + few: este prea lung (maximum %{count} caractere) other: este prea lung (maximum %{count} de caractere) too_short: - few: este prea scurt (minimum %{count} caractere) one: este prea scurt (minimum un caracter) + few: este prea scurt (minimum %{count} caractere) other: este prea scurt (minimum %{count} de caractere) wrong_length: - few: are lungimea greÅŸită (trebuie sa fie %{count} caractere) one: are lungimea greÅŸită (trebuie sa fie un caracter) + few: are lungimea greÅŸită (trebuie sa fie %{count} caractere) other: are lungimea greÅŸită (trebuie sa fie %{count} de caractere) other_than: "trebuie sa fie diferit de %{count}" template: body: 'Au apărut probleme cu următoarele câmpuri:' header: - few: '%{count} erori au împiedicat acest %{model} să fie salvat' one: O eroare a împiedicat acest %{model} să fie salvat + few: '%{count} erori au împiedicat acest %{model} să fie salvat' other: '%{count} de erori au împiedicat acest %{model} să fie salvat' embed: load_from_remote: "A apărut o eroare la încărcarea postării." @@ -128,9 +128,9 @@ ro: reading_time: "Durata citirii" likes: "Aprecieri" too_many_replies: - few: Ne pare rău, dar utilizatorii noi sunt limitaÈ›i la %{count} răspunsuri pe discuÈ›ie. - one: Ne pare rău, dar utilizatorii noi sunt limitaÈ›i la 1 răspuns pe discuÈ›ie. - other: Ne pare rău, dar utilizatori noi sunt limitaÈ›i la %{count} de răspunsuri pe discuÈ›ie. + one: "Ne pare rău, dar utilizatorii noi sunt limitaÈ›i la 1 răspuns pe discuÈ›ie." + few: "Ne pare rău, dar utilizatorii noi sunt limitaÈ›i la %{count} răspunsuri pe discuÈ›ie." + other: "Ne pare rău, dar utilizatori noi sunt limitaÈ›i la %{count} de răspunsuri pe discuÈ›ie." embed: start_discussion: "PorneÈ™te discuÈ›ie" continue: "Continuă discuÈ›ie" @@ -140,42 +140,42 @@ ro: no_hosts: "Nu s-a setat nicio gazdă pentru încorporare." configure: "Configurează încorporarea" more_replies: - few: ÃŽncă %{count} răspunsuri - one: ÃŽncă un răspuns - other: ÃŽncă %{count} de răspunsuri + one: "ÃŽncă un răspuns" + few: "ÃŽncă %{count} răspunsuri" + other: "ÃŽncă %{count} de răspunsuri" loading: "ÃŽncarcă discuÈ›ia..." permalink: "Link permanent" imported_from: "Acesta este un subiect de discuÈ›ie adăugat la discuÈ›ia originală de la %{link}" in_reply_to: "â–¶ %{username}" replies: - few: '%{count} răspunsuri' - one: Un răspuns - other: '%{count} de răspunsuri' + one: "Un răspuns" + few: "%{count} răspunsuri" + other: "%{count} de răspunsuri" no_mentions_allowed: "Ne pare rău, nu poÈ›i menÈ›iona alÈ›i utilizatori." too_many_mentions: - few: Ne pare rău, poÈ›i menÈ›iona doar %{count} utilizatori într-o postare. - one: Ne pare rău, poÈ›i menÈ›iona doar un utilizator într-o postare. - other: Ne pare rău, poÈ›i menÈ›iona doar %{count} de utilizatori într-o postare. + one: "Ne pare rău, poÈ›i menÈ›iona doar un utilizator într-o postare." + few: "Ne pare rău, poÈ›i menÈ›iona doar %{count} utilizatori într-o postare." + other: "Ne pare rău, poÈ›i menÈ›iona doar %{count} de utilizatori într-o postare." no_mentions_allowed_newuser: "Ne pare rău, noii utilizatori nu pot menÈ›iona alÈ›i utilizatori." too_many_mentions_newuser: - few: Ne pare rău, noii utilizatori pot menÈ›iona doar %{count} utilizatori într-o postare. - one: Ne pare rău, noii utilizatori pot menÈ›iona doar un utilizator într-o postare. - other: Ne pare rău, noii utilizatori pot menÈ›iona doar %{count} de utilizatori într-o postare. + one: "Ne pare rău, noii utilizatori pot menÈ›iona doar un utilizator într-o postare." + few: "Ne pare rău, noii utilizatori pot menÈ›iona doar %{count} utilizatori într-o postare." + other: "Ne pare rău, noii utilizatori pot menÈ›iona doar %{count} de utilizatori într-o postare." no_images_allowed: "Ne pare rău, nu poÈ›i pune imagini în postări." too_many_images: - few: Ne pare rău, noii utilizatori pot pune numai %{count} imagini într-o postare. - one: Ne pare rău, noii utilizatori pot pune numai o imagine într-o postare. - other: Ne pare rău, noii utilizatori pot pune numai %{count} de imagini într-o postare. + one: "Ne pare rău, noii utilizatori pot pune numai o imagine într-o postare." + few: "Ne pare rău, noii utilizatori pot pune numai %{count} imagini într-o postare." + other: "Ne pare rău, noii utilizatori pot pune numai %{count} de imagini într-o postare." no_attachments_allowed: "Ne pare rău, noii utilizatori nu pot pune ataÈ™amente la postări." too_many_attachments: - few: Ne pare rău, noii utilizatori pot pune doar %{count} ataÈ™amente la o postare. - one: Ne pare rău, noii utilizatori pot pune doar un ataÈ™ament la o postare. - other: Ne pare rău, noii utilizatori pot pune doar %{count} de ataÈ™amente la o postare. + one: "Ne pare rău, noii utilizatori pot pune doar un ataÈ™ament la o postare." + few: "Ne pare rău, noii utilizatori pot pune doar %{count} ataÈ™amente la o postare." + other: "Ne pare rău, noii utilizatori pot pune doar %{count} de ataÈ™amente la o postare." no_links_allowed: "Ne pare rău, noii utilizatori nu pot pune link-uri în postări." too_many_links: - few: Ne pare rău, noii utilizatori pot pune doar %{count} link-uri într-o postare. - one: Ne pare rău, noii utilizatori pot pune doar un link într-o postare. - other: Ne pare rău, noii utilizatori pot pune doar %{count} de link-uri într-o postare. + one: "Ne pare rău, noii utilizatori pot pune doar un link într-o postare." + few: "Ne pare rău, noii utilizatori pot pune doar %{count} link-uri într-o postare." + other: "Ne pare rău, noii utilizatori pot pune doar %{count} de link-uri într-o postare." spamming_host: "Nu poÈ›i adăuga un link pentru acest domeniu." user_is_suspended: "Utilizatorii suspendaÈ›i nu au dreptul de a posta." topic_not_found: "Ceva n-a mers bine. Poate că acest subiect a fost închis sau È™ters în timp ce te uitai la el?" @@ -229,9 +229,9 @@ ro: trust_level_4: "nivel_de_încredere_4" education: until_posts: - few: '%{count} postări' - one: o postare - other: '%{count} de postări' + one: "o postare" + few: "%{count} postări" + other: "%{count} de postări" 'new-topic': | Bun venit pe %{site_name} — **îți mulÈ›umim că ai început o nouă conversaÈ›ie!** @@ -314,27 +314,6 @@ ro: staff_category_description: "Categorie privată pentru discuÈ›iile personalului. Subiectele sunt vizibile numai pentru admini È™i moderatori." lounge_welcome: title: "Bine ai venit în sufragerie" - body: |2 - - Felicitări! :confetti_ball: - - Dacă poÈ›i vedea acest subiect, ai fost promovat recent la **utilizator frecvent** (nivel de încredere 3). - - Acum poÈ›i să … - - * Editezi titlul oricărui subiect - * Schimbi categoria oricărui subiect - * Setezi ca toate link-urile tale să fie urmărite ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) este dezactivat) - * Accesezi secÈ›iunea privată din categoria Sufragerie unde au acces numai utilizatorii de nivel 3 sau mai mare - * Ascunzi spam-ul folosind un singur marcaj de avertizare - - Aici este [lista colegilor utilizatori ce au ajuns la nivelul de încredere 3](/badges/3/regular). Salută-i! - - ÃŽÈ›i mulÈ›umim că eÈ™ti o parte importantă a acestei comunități! - - (Pentru mai multe informaÈ›ii cu privire la nivelurile de încredere, [vezi subiectul ăsta][încredere]. Èšine aminte că doar membrii ce vor îndeplini constant criteriile cerute vor rămâne la nivelul de încredere 3.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Despre categoria %{category}" replace_paragraph: "(ÃŽnlocuieÈ™te acest prim paragraf cu o scurtă descriere a noii tale categorii. Acest îndreptar va apărea în zona de selecÈ›ie a categoriei, aÈ™a că încearcă să îl limitezi la maxim 200 de caractere. **Această categorie nu va apărea în pagina categoriilor până ce nu editezi această descriere sau până ce nu creezi subiecte**)" @@ -349,10 +328,6 @@ ro: cannot_delete: uncategorized: "Nu se poate È™terge Necategorizat" has_subcategories: "Nu putem È™terge categoria aceasta pentru că are sub-categorii." - topic_exists: - few: Nu poÈ›i È™terge categoria aceasta pentru că are %{count} subiecte. Cel mai vechi subiect este %{topic_link}. - one: Nu poÈ›i È™terge categoria aceasta pentru că are un subiect. Cel mai vechi subiect este %{topic_link}. - other: Nu poÈ›i È™terge categoria aceasta pentru că are %{count} de subiecte. Cel mai vechi subiect este %{topic_link}. topic_exists_no_oldest: "Nu poÈ›i È™terge categoria fiindcă numărul subiectelor este de %{count}." uncategorized_description: "Subiecte care nu au nevoie de o categorie, sau care nu se potrivesc în nicio categorie deja existentă." trust_levels: @@ -369,110 +344,110 @@ ro: change_failed_explanation: "Ai încercat să retrogradezi utilizatorul %{user_name} la nivelul '%{new_trust_level}'. ÃŽnsă nivelul este deja '%{current_trust_level}'. %{user_name} va rămâne la '%{current_trust_level}' - dacă doreÈ™ti să retrogradezi utilizatorul, trebuie să îi blochezi întâi nivelul de încredere." rate_limiter: hours: - few: '%{count} ore' - one: o oră - other: '%{count} de ore' + one: "o oră" + few: "%{count} ore" + other: "%{count} de ore" minutes: - few: '%{count} minute' - one: un minut - other: '%{count} de minute' + one: "un minut" + few: "%{count} minute" + other: "%{count} de minute" seconds: - few: '%{count} secunde' - one: o secundă - other: '%{count} de secunde' + one: "o secundă" + few: "%{count} secunde" + other: "%{count} de secunde" datetime: distance_in_words: half_a_minute: "de < 1m" less_than_x_seconds: - few: de < %{count}s - one: de < 1s - other: de < %{count}s + one: "de < 1s" + few: "de < %{count}s" + other: "de < %{count}s" x_seconds: - few: de %{count}s - one: de 1s - other: de %{count}s + one: "de 1s" + few: "de %{count}s" + other: "de %{count}s" less_than_x_minutes: - few: ' < %{count}m' - one: de < 1m - other: de < %{count}m + one: "de < 1m" + few: " < %{count}m" + other: "de < %{count}m" x_minutes: - few: ' de %{count}m' - one: de 1m - other: de %{count}m + one: "de 1m" + few: " de %{count}m" + other: "de %{count}m" about_x_hours: - few: ' %{count}h' - one: de 1h - other: de %{count}h + one: "de 1h" + few: " %{count}h" + other: "de %{count}h" x_days: - few: ' %{count}z' - one: de 1z - other: de %{count}z + one: "de 1z" + few: " %{count}z" + other: "de %{count}z" about_x_months: - few: ' de %{count} luni' - one: de o lună - other: de %{count} de luni + one: "de o lună" + few: " de %{count} luni" + other: "de %{count} de luni" x_months: - few: de %{count} luni - one: de o lună - other: de %{count} de luni + one: "de o lună" + few: "de %{count} luni" + other: "de %{count} de luni" about_x_years: - few: de %{count} ani - one: de %{count}an - other: de %{count} de ani + one: "de %{count}an" + few: "de %{count} ani" + other: "de %{count} de ani" over_x_years: - few: de > %{count}ani - one: de > 1an - other: de > %{count} de ani + one: "de > 1an" + few: "de > %{count}ani" + other: "de > %{count} de ani" almost_x_years: - few: de %{count} ani - one: de un an - other: de %{count} de ani + one: "de un an" + few: "de %{count} ani" + other: "de %{count} de ani" distance_in_words_verbose: half_a_minute: "chiar acum" less_than_x_seconds: - few: chiar acum - one: chiar acum - other: chiar acum + one: "chiar acum" + few: "chiar acum" + other: "chiar acum" x_seconds: - few: cu %{count} secunde în urmă - one: cu o secundă în urmă - other: cu %{count} de secunde în urmă + one: "cu o secundă în urmă" + few: "cu %{count} secunde în urmă" + other: "cu %{count} de secunde în urmă" less_than_x_minutes: - few: cu mai puÈ›in de %{count} minute în urmă - one: cu mai puÈ›in de 1 minut în urmă - other: mai puÈ›in de %{count} de minute în urmă + one: "cu mai puÈ›in de 1 minut în urmă" + few: "cu mai puÈ›in de %{count} minute în urmă" + other: "mai puÈ›in de %{count} de minute în urmă" x_minutes: - few: acum %{count} minute - one: acum un minut - other: acum %{count} de minute + one: "acum un minut" + few: "acum %{count} minute" + other: "acum %{count} de minute" about_x_hours: - few: acum %{count} ore - one: acum o ora - other: acum %{count} de ore + one: "acum o ora" + few: "acum %{count} ore" + other: "acum %{count} de ore" x_days: - few: acum %{count} zile - one: acum o zi - other: acum %{count} de zile + one: "acum o zi" + few: "acum %{count} zile" + other: "acum %{count} de zile" about_x_months: - few: cu aproape %{count} luni în urmă - one: cu aproape o lună în urmă - other: cu aproape %{count} de luni în urmă + one: "cu aproape o lună în urmă" + few: "cu aproape %{count} luni în urmă" + other: "cu aproape %{count} de luni în urmă" x_months: - few: acum %{count} luni - one: acum o lună - other: acum %{count} de luni + one: "acum o lună" + few: "acum %{count} luni" + other: "acum %{count} de luni" about_x_years: - few: cu aproape %{count} ani în urmă - one: cu aproape un an în urmă - other: cu aproape %{count} de ani în urmă + one: "cu aproape un an în urmă" + few: "cu aproape %{count} ani în urmă" + other: "cu aproape %{count} de ani în urmă" over_x_years: - few: cu peste %{count} ani în urmă - one: cu peste un an în urmă - other: cu peste %{count} de ani în urmă + one: "cu peste un an în urmă" + few: "cu peste %{count} ani în urmă" + other: "cu peste %{count} de ani în urmă" almost_x_years: - few: cu aproape %{count} ani în urmă - one: cu aproape un an în urmă - other: cu aproape %{count} de ani în urmă + one: "cu aproape un an în urmă" + few: "cu aproape %{count} ani în urmă" + other: "cu aproape %{count} de ani în urmă" password_reset: no_token: "Ne pare rău, dar link-ul de schimbare a parolei este prea vechi. Selectează butonul ÃŽnregistrare È™i foloseÈ™te 'Mi-am uitat parola' pentru a obÈ›ine un nou link." choose_new: "Alege o parolă nouă" @@ -539,13 +514,8 @@ ro: title: 'Apreciere' description: 'Apreciază această postare' long_form: 'a apreciat asta' - vote: - title: 'Votează' - description: 'Votează pentru această postare' - long_form: 'a votat pentru această postare' user_activity: no_bookmarks: - self: "Nu ai nicio postare cu semn de carte. Folosirea semnelor de carte pentru postări permite accesarea lor ulterioară într-un mod facil. " others: "Nu există semne de carte." no_likes_given: self: "Nu ai apreciat nicio postare." @@ -679,8 +649,6 @@ ro: num_users: "Utilizatori" top_referred_topics: title: "Top subiecte la care se face referire" - xaxis: "Subiect" - num_clicks: "Click-uri" page_view_anon_reqs: title: "Anonimi" xaxis: "Zi" @@ -737,7 +705,6 @@ ro: xaxis: "Zi" yaxis: "Total" mobile_visits: - title: "Vizite utilizator" xaxis: "Zi" yaxis: "Număr de vizite" dashboard: @@ -755,9 +722,9 @@ ro: failing_emails_warning: 'Există %{num_failed_jobs} (de) sarcini email care au eÈ™uat. Verifică app.yml È™i asigură-te că setările serverului de mail sunt corecte. Vizualizează sarcini eÈ™uate în Sidekiq.' subfolder_ends_in_slash: "Setările subfolderului sunt incorecte; DISCOURSE_RELATIVE_URL_ROOT se termină cu slash." email_polling_errored_recently: - few: Email polling a generat %{count} erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii. - one: Email polling a generat o eroare în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii. - other: Retragerea de emailuri generat %{count} de erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii. + one: "Email polling a generat o eroare în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + few: "Email polling a generat %{count} erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + other: "Retragerea de emailuri generat %{count} de erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." bad_favicon_url: "Eroare la încărcarea Favicon. Verifică setarea favicon_url în Setările site-ului." poll_pop3_timeout: "Conexiunea la serverul POP3 a dat time-out. Mailurile primite nu au putut fi accesate. Te rugăm să verifici setările POP3 È™i furnizorul de servicii." poll_pop3_auth_error: "Conexiunea la serverul POP3 a eÈ™uat cu o eroare de autentificare. Te rugăm să verifici setările POP3." @@ -848,7 +815,6 @@ ro: post_menu: "Determină ce elemente apar în meniul de postare È™i în ce ordine . Exemplu: apreciere|editează|marchează|È™terge|distribuie|semne de carte|răspunde" post_menu_hidden_items: "Elemente de meniu care să fie ascunse implicit în meniul de postări dacă nu se dă click pe partea de extindere a meniului." share_links: "Determină ce elemente apar în dialogul de distribuire È™i în ce ordine." - track_external_right_clicks: "UrmăreÈ™te link-urile externe care sunt dezactivate prin click-dreapta (ex: deschide în tab nou) în mod implicit fiindcă rescriu URL-uri" site_contact_username: "Un nume utilizator valid al unui membru al echipei de la care să se trimită toate mesajele. Dacă e lăsat liber se va folosi contul implicit System." send_welcome_message: "Trimite tuturor utilizatorilor un mesaj de bun venit cu un ghid rapid de iniÈ›iere." suppress_reply_directly_below: "Nu arăta contorul expandabil de răspunsuri la o postare atunci când nu există decât un singur răspuns direct sub această postare." @@ -1040,7 +1006,6 @@ ro: reply_by_email_enabled: "Activează răspunsurile către subiecte prin email." reply_by_email_address: "È™ablon pentru răspuns prin email de intrare, de exemplu: %{reply_key}@reply.example.com sau răspunsuri+%{reply_key}@example.com" alternative_reply_by_email_addresses: "Listă de È™abloane alternative pentru adresele de email primite cu răspunsuri prin email. Exemplu: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "OpreÈ™te Discourse să trimite absolut orice fel de emailuri" strip_images_from_short_emails: "Scoate imaginile din emailurile care au mai puÈ›in de 2800 de Bytes" short_email_length: "Lungime de email scurt în Bytes" display_name_on_email_from: "AfiÈ™ează numele complete în câmpul From din email" @@ -1081,7 +1046,6 @@ ro: delete_user_max_post_age: "Nu permite È™tergerea utilizatorilor a căror prima postare e mai veche de (x) de zile." delete_all_posts_max: "Numărul maxim de postări ce pot fi È™terse deodată folosind butonul È™terge toate postările. Dacă un utilizator are mai multe postări decât această valoare, postările sale nu pot fi È™terse dintr-o dată È™i utilizatorul nu poate fi È™ters." email_editable: "Permite utilizatorilor să își schimbe adresa de email după înregistrare." - logout_redirect: "URL-ul spre care să fie redirecÈ›ionat browserul după ieÈ™ire (ex: http://somesite.com/logout)" allow_uploaded_avatars: "Permite utilizatorilor să încarce o poză de profil personalizate." allow_animated_avatars: "Permite utilizatorilor să folosească gif-uri animate în pozele de profil. ATENÈšIE: după schimbarea acestei opÈ›iuni trebuie să lansezi un rake task specific, respectiv - avatars:refresh " allow_animated_thumbnails: "Generează thumbnails animate pentru gif-uri animate." @@ -1230,61 +1194,58 @@ ro: not_seen_in_a_month: "Bun venit! Nu te-am mai văzut de ceva vreme. Aici sunt cele mai populare subiecte ce au apărut în timpul absenÈ›ei tale." merge_posts: edit_reason: - few: '%{count} postări au fost comasate de către %{username}' - one: o postare a fost comasată de către %{username} - other: '%{count} de postări au fost comasate de către %{username}' + one: "o postare a fost comasată de către %{username}" + few: "%{count} postări au fost comasate de către %{username}" + other: "%{count} de postări au fost comasate de către %{username}" errors: different_topics: "Postările care aparÈ›in unor subiecte diferite nu pot fi comasate." different_users: "Postările care aparÈ›in unor utilizatori diferiÈ›i nu pot fi comasate." move_posts: new_topic_moderator_post: - few: '%{count} postări au fost mutate într-un nou subiect: %{topic_link}' - one: 'o postare a fost mutată într-un nou subiect: %{topic_link}' - other: '%{count} de postări au fost mutate într-un nou subiect: %{topic_link}' + one: "o postare a fost mutată într-un nou subiect: %{topic_link}" + few: "%{count} postări au fost mutate într-un nou subiect: %{topic_link}" + other: "%{count} de postări au fost mutate într-un nou subiect: %{topic_link}" existing_topic_moderator_post: - few: '%{count} postări au fost comasate într-un subiect existent: %{topic_link}' - one: 'o postare a fost comasată într-un subiect existent: %{topic_link}' - other: '%{count} de postări au fost comasate într-un subiect existent: %{topic_link}' - change_owner: - post_revision_text: "Autor schimbat din %{old_user} în %{new_user}" - deleted_user: "un utilizator È™ters" + one: "o postare a fost comasată într-un subiect existent: %{topic_link}" + few: "%{count} postări au fost comasate într-un subiect existent: %{topic_link}" + other: "%{count} de postări au fost comasate într-un subiect existent: %{topic_link}" topic_statuses: archived_enabled: "Acest subiect este acum arhivat. Este îngheÈ›at È™i nu mai poate fi schimbat în nici un fel." archived_disabled: "Acest subiect este acum dezarhivat. Nu mai este îngheÈ›at È™i poate fi modificat." closed_enabled: "Acest subiect este acum închis. Nu mai sunt permise răspunsuri noi." closed_disabled: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." autoclosed_message_max_posts: - few: Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} răspunsuri. - one: Acest mesaj va fi închis automat după ce atinge limita de maximă de un răspuns. - other: Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} de răspunsuri. + one: "Acest mesaj va fi închis automat după ce atinge limita de maximă de un răspuns." + few: "Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} răspunsuri." + other: "Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} de răspunsuri." autoclosed_topic_max_posts: - few: Acest subiect a fost închis automat după ce a atins limita maximă de %{count} răspunsuri. - one: Acest subiect a fost închis automat după ce a atins limita maximă de un răspuns. - other: Acest subiect a fost închis automat după ce a atins limita maximă de %{count} de răspunsuri. + one: "Acest subiect a fost închis automat după ce a atins limita maximă de un răspuns." + few: "Acest subiect a fost închis automat după ce a atins limita maximă de %{count} răspunsuri." + other: "Acest subiect a fost închis automat după ce a atins limita maximă de %{count} de răspunsuri." autoclosed_enabled_days: - few: Acest subiect a fost închis automat după %{count} zile. Nu mai sunt permise răspunsuri noi. - one: Acest subiect a fost închis automat după o zi. Nu mai sunt permise răspunsuri noi. - other: Acest subiect a fost închis automat după %{count} de zile. Nu mai sunt permise răspunsuri noi. + one: "Acest subiect a fost închis automat după o zi. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} zile. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de zile. Nu mai sunt permise răspunsuri noi." autoclosed_enabled_hours: - few: Acest subiect a fost închis automat după %{count} ore. Nu mai sunt permise răspunsuri noi. - one: Acest subiect a fost închis automat după o oră. Nu mai sunt permise răspunsuri noi. - other: Acest subiect a fost închis automat după %{count} de ore. Nu mai sunt permise răspunsuri noi. + one: "Acest subiect a fost închis automat după o oră. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} ore. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de ore. Nu mai sunt permise răspunsuri noi." autoclosed_enabled_minutes: - few: Acest subiect a fost închis automat după %{count} minute. Nu mai sunt permise răspunsuri noi. - one: Acest subiect a fost închis automat după un minut. Nu mai sunt permise răspunsuri noi. - other: Acest subiect a fost închis automat după %{count} de minute. Nu mai sunt permise răspunsuri noi. + one: "Acest subiect a fost închis automat după un minut. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} minute. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de minute. Nu mai sunt permise răspunsuri noi." autoclosed_enabled_lastpost_days: - few: Acest subiect a fost închis automat după %{count} zile de la primul răspuns. Nu mai sunt permise răspunsuri noi. - one: Acest subiect a fost închis automat după o zi de la primul răspuns. Nu mai sunt permise răspunsuri noi. - other: Acest subiect a fost închis automat după %{count} de zile de la primul răspuns. Nu mai sunt permise răspunsuri noi. + one: "Acest subiect a fost închis automat după o zi de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} zile de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de zile de la primul răspuns. Nu mai sunt permise răspunsuri noi." autoclosed_enabled_lastpost_hours: - few: Acest subiect a fost închis automat după %{count} ore de la primul răspuns. Nu mai sunt permise răspunsuri noi. - one: Acest subiect a fost închis automat după o oră de la primul răspuns. Nu mai sunt permise răspunsuri noi. - other: Acest subiect a fost închis automat după %{count} de ore de la primul răspuns. Nu mai sunt permise răspunsuri noi. + one: "Acest subiect a fost închis automat după o oră de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} ore de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de ore de la primul răspuns. Nu mai sunt permise răspunsuri noi." autoclosed_enabled_lastpost_minutes: - few: Acest subiect a fost închis automat după %{count} minute de la primul răspuns. Nu mai sunt permise răspunsuri noi. - one: Acest subiect a fost închis automat după un minut de la primul răspuns. Nu mai sunt permise răspunsuri noi. - other: Acest subiect a fost închis automat după %{count} de minute de la primul răspuns. Nu mai sunt permise răspunsuri noi. + one: "Acest subiect a fost închis automat după un minut de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} minute de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de minute de la primul răspuns. Nu mai sunt permise răspunsuri noi." autoclosed_disabled: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." autoclosed_disabled_lastpost: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." pinned_enabled: "Acest subiect este fixat. Va apărea în vârful listei de categorii până când echipa îl va dezactiva opÈ›iunea de fixare pentru toată lumea odată, sau până când utilizatorii vor dezactiva opÈ›iunea, individual, pentru ei înÈ™iÈ™i." @@ -1316,7 +1277,6 @@ ro: missing_user_field: "Nu ai completat toate câmpurile utilizatorului" already_logged_in: "Oops, se pare că încerci să accepÈ›i o invitaÈ›ie de la un alt utilizator. Dacă nu eÈ™ti %{current_user}, te rugăm ieÈ™i È™i intră din nou." user: - no_accounts_associated: "Nu sunt conturi asociate" deactivated: "A fost dezactivat din cauza pre a multor emailuri ricoÈ™ate la '%{email}'." username: short: "trebuie să fie cel puÈ›in %{min} de caractere" @@ -1336,9 +1296,9 @@ ro: max_new_accounts_per_registration_ip: "Nu sunt permise noi înregistrări de la adresa ta de IP (limita maximă a fost atinsă). Contactează un membru al echipei." flags_reminder: subject_template: - few: '%{count} marcaje de avertizare aÈ™teptând să fie gestionate' - one: un marcaj de avertizare aÈ™teptând să fie gestionat - other: '%{count} de marcaje de avertizare aÈ™teptând să fie gestionate' + one: "un marcaj de avertizare aÈ™teptând să fie gestionat" + few: "%{count} marcaje de avertizare aÈ™teptând să fie gestionate" + other: "%{count} de marcaje de avertizare aÈ™teptând să fie gestionate" unsubscribe_mailer: subject_template: "Confirmă că nu mai vrei să primeÈ™ti actualizări pe email de la %{site_title}" invite_password_instructions: @@ -1469,14 +1429,6 @@ ro: Dacă există interfață utilizator web pentru contul tău POP, ar trebui să te autentifici pe ea È™i să îți verifici acolo setările. too_many_spam_flags: subject_template: "Cont nou suspendat" - text_body_template: | - Salut, - - Acesta este un mesaj automat de pe %{site_name} pentru a te informa că postările tale au fost temporar ascunse pentru că au fost marcate cu marcaje de avertizare de către comunitate.. - - Ca măsura de precauÈ›ie, noului tău cont i s-a blocat posibilitatea de a crea noi răspunsuri sau subiecte până ce un un membru al echipei nu îl va verifica. Ne cerem scuze pentru inconveniență. - - Pentru informaÈ›ii suplimentare, te rugăm să citeÈ™ti [ghidul comunității](%{base_url}/guidelines). too_many_tl3_flags: subject_template: "Cont nou suspendat" text_body_template: | @@ -1506,9 +1458,9 @@ ro: Acum puteÈ›i crea discuÈ›ii È™i răspunsuri noi. pending_users_reminder: subject_template: - few: '%{count} utilizatori în aÈ™teptarea aprobării' - one: un utilizator în aÈ™teptarea aprobării - other: '%{count} de utilizatori în aÈ™teptarea aprobării' + one: "un utilizator în aÈ™teptarea aprobării" + few: "%{count} utilizatori în aÈ™teptarea aprobării" + other: "%{count} de utilizatori în aÈ™teptarea aprobării" text_body_template: | Exista înscrieri de noi utilizatori ce aÈ™teaptă să fie aprobate (sau respinse) înainte de a putea accesa forumul. @@ -1522,6 +1474,13 @@ ro: Anumite probleme îți sunt raportate pe spaÈ›ul de lucru al adminului. [Te rugăm să le verifici È™i să le rezolvi](%{base_url}/admin). + new_user_of_the_month: + text_body_template: | + Felicitări, ai primit ecusonul **Premiul pentru utilizatorul nou al lunii %{month_year}**. :trophy: + + ÃŽn fiecare lună, doi utilizatori noi primesc acest premiu ce va fi vizibil permanent pe [pagina de ecusoane](%{url}) + + Ai devenit un membru valoros al comunității noastre. MulÈ›umim pentru participare! unsubscribe_link: | Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). unsubscribe_link_and_mail: | @@ -1539,10 +1498,8 @@ ro: title: "Dezabonare" description: "Nu eÈ™ti interesat în a primi aceste email-uri? Nicio problemă! Fă click dedesubt pentru a te dezabona imediat:" reply_by_email: "[Vizitează subiect](%{base_url}%{url}) sau dă reply la acest email pentru a răspunde." - reply_by_email_pm: "[Vizitează mesaj](%{base_url}%{url}) sau dă reply la acest email pentru a răspunde." only_reply_by_email: "Dă reply la acest email pentru a răspunde." visit_link_to_respond: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde." - visit_link_to_respond_pm: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde." posted_by: "Postat de %{username} pe data %{post_date}" user_invited_to_private_message_pm: text_body_template: | @@ -1682,7 +1639,6 @@ ro: recent_topics: "Recente" see_more: "Mai multe" search_title: "Caută în site" - search_google: "Google" terms_of_service: title: "CondiÈ›iile generale de utilizare" signup_form_message: 'Am citit È™i accept CondiÈ›iile generale de utilizare.' @@ -1703,25 +1659,6 @@ ro: flag_reason: sockpuppet: "Un utilizator nou a creat un subiect, È™i un alt utilizator nou de la aceeaÈ™i adresă de IP (%{ip_address}) a răspuns. Vezi `flag_sockpuppets` la setările site-ului." spam_hosts: "Acest nou utilizator a încrecat să creeze postări multiple cu link-uri către acelasi domeniu (%{domain}). Vezi `newuser_spam_host_threshold` la setările site-ului." - email_log: - post_user_deleted: "Utilizatorul acestei postări a fost È™ters." - no_user: "Nu s-a găsit utilizatorul cu id-ul %{user_id}" - anonymous_user: "Utilizatorul este anonim" - suspended_not_pm: "Utilizatorul este suspendat, nici un mesaj" - seen_recently: "Utilizatorul a fost văzut recent" - post_not_found: "Nu s-a găsit postarea cu id-ul %{post_id}" - notification_already_read: "Notificarea ce face obiectul acestui email a fost deja citită" - topic_nil: "post.topic este nil" - post_deleted: "postarea a fost È™tearsă de către autor" - user_suspended: "utilizatorul a fost suspendat" - already_read: "utilizatorul a citit deja această postare" - exceeded_emails_limit: "Depășit max_emails_per_day_per_user" - exceeded_bounces_limit: "Depășit bounce_score_threshold" - message_blank: "mesajul este gol" - message_to_blank: "message.to este gol" - text_part_body_blank: "text_part.body e gol" - body_blank: "conÈ›inutul este gol" - no_echo_mailing_list_mode: "Notificările pe mail dezactivate pentru postările proprii ale utilizatorului" color_schemes: base_theme_name: "Bază" about: "Despre" @@ -1824,70 +1761,40 @@ ro: editor: name: Editor description: Prima postare editată - long_description: | - Acest ecuson se acordă când, pentru prima dată, îți editezi una din postări. DeÈ™i nu poÈ›i să îți editezi postările la infinit, editarea este întotdeauna o idee buna: poÈ›i să îți îmbunătățeÈ™ti postările, să corectezi micile greÈ™eli sau să adaugi chestii pe care le-ai uitat când ai postat prima dată. Editează ca să îți faci postările să strălucească. basic_user: name: Simplu utilizator - description: "Èši-au fost acordate toate funcÈ›iile esenÈ›iale ale comunității" - long_description: | - Acest ecuson se acordă când ai ajuns la nivelul de încredere 1. ÃŽÈ›i mulÈ›umim că stai niÈ›el pe aici ca să citeÈ™ti câteva subiecte È™i să înveÈ›i despre ce anume e comunitatea noastră. RestricÈ›iile de utilizator nou È›i-au fost ridicate; È›i-au fost acordate toate capacitățile esenÈ›iale, precum trimiterea de mesaje personale, marcarea cu marcaje de avertizare, editare wiki, È™i capacitatea de a posta imagini È™i link-uri multiple. member: name: Membru - description: "Èši s-au acordat invitaÈ›ii, mesaje în grup, mai multe aprecieri" - long_description: | - Acest ecuson se acordă când ajungi la nivelul de încredere 2. ÃŽÈ›i mulÈ›umim că încerci de câteva săptămâni să te alături cu adevărat comunității noastre. regular: name: Utilizator frecvent - description: "Èši s-au acordat recategorizare, redenumire, link-uri urmărite, wiki, mai multe aprecieri" - long_description: | - Acest ecuson se acordă atunci când ai atins nivelul de încredere 3. ÃŽÈ›i mulÈ›umim că eÈ™ti un utilizator frecvent, „adevărat client al casei†în comunitatea noastră, deja de câteva luni de zile. Acum eÈ™ti unul dintre cei mai activi cititori È™i un contributor de încredere care ne ridică întreaga comunitate. Acum vei avea posibilitatea să recategoriseÈ™ti È™i redenumeÈ™ti subiecte, să utilizezi marcaje de avertizare spam mai puternice, să ai acces la zona privată de sufragerie, È™i o să primeÈ™ti mult mai multe aprecieri în fiecare zi. leader: name: Lider - description: "Èši s-au acordat editare globală, fixare, închidere, arhivare, divizare È™i comasare, mai multe aprecieri" - long_description: | - Acest ecuson se acordă când ajungi la nivelul de încredere 4. EÈ™ti un lider al acestei comunități, după cum te-a selectat echipa È™i, reprezinÈ›i un exemplu pozitiv prin acÈ›iunile È™i cuvintele tale. Ai capacitatea să editezi toate postările, să aplici acÈ›iuni de moderare obiÈ™nuite precum fixare, închidere, delistare, arhivare, divizare È™i comasare, È™i ai tone de aprecieri pe zi. welcome: name: Bun venit description: Ai primit o apreciere - long_description: | - Acest ecuson se acordă atunci când primeÈ™ti prima apreciere la o postare. Felicitări, ai postat ceva ce colegii tăi membri ai comunității au găsit a fi interesant, miÈ™to È™i folositor! autobiographer: name: Autobiograf anniversary: name: Aniversare description: "EÈ™ti membru activ de un an, ai postat cel puÈ›in odată" - long_description: | - Acest ecuson se acordă când ai împlinit un an de când eÈ™ti membru È™i ai avut cel puÈ›in o postare în acest timp. ÃŽÈ›i mulÈ›umim că stai prin zonă È™i contribui la comunitatea noastră. Nu ne-am putea descurca fără tine. nice_post: name: Răspuns fain description: Ai primit 10 aprecieri la un răspuns - long_description: | - Acest ecuson se acordă când un răspuns de-al tău primeÈ™te 10 aprecieri. Răspunsul tău a făcut impresie în comunitate È™i a împins conversaÈ›ia înainte! good_post: name: Răspuns miÈ™to description: Ai primit 25 de aprecieri la un răspuns - long_description: | - Acest ecuson se acordă când un răspuns de-al tău primeÈ™te 25 de aprecieri. Răspunsul tău a fost excepÈ›ional È™i a făcut conversaÈ›ia mult mai bună pentru toată lumea! great_post: name: Răspuns beton description: Ai primit 50 de aprecieri la un răspuns - long_description: | - Acest ecuson se acordă când un răspuns de-al tău primeÈ™te 50 de aprecieri. Wow! Răspunsul tău a fost inspirat, fascinant, amuzant sau expert È™i comunitatea l-a iubit. nice_topic: name: Subiect fain description: Ai primit 10 de aprecieri la un subiect - long_description: | - Acest ecuson se acordă când unul din subiectele tale primeÈ™te 10 aprecieri. Hei, ai început o conversaÈ›ie care i-a plăcut comunității! good_topic: name: Subiect miÈ™to description: Ai primit 25 de aprecieri la un subiect - long_description: | - Acest ecuson este acordat când un subiect de-al tău primeÈ™te 25 de aprecieri. Ai lansat o conversaÈ›ie vibrantă È™i în jurul căreia s-a adunat comunitatea È™i pe care au iubit-o. great_topic: name: Subiect beton description: Ai primit 50 de aprecieri la un subiect - long_description: | - Acest ecuson se acordă când un subiect de-al tău primeÈ™te 50 de aprecieri. Ai iniÈ›iat o conversaÈ›ie fascinantă È™i comunitatea s-a bucurat de discuÈ›ia dinamică ce a rezultat! nice_share: name: DistribuÈ›ie faină description: Ai distribuit o postare care a atras 25 de vizitatori unici @@ -1896,13 +1803,9 @@ ro: good_share: name: DistribuÈ›ie miÈ™to description: Ai distribuit o postare care a atras 300 de vizitatori unici - long_description: | - Acest ecuson se acordat pentru distribuirea unui link care a fost accesat de 300 de vizitatori externi. Bună treabă! Ai arătat o discuÈ›ie fantastică unei mulÈ›imi de oameni noi È™i ai ajutat această comunitate să crească. great_share: name: DistribuÈ›ie beton description: Ai distribuit o postare ce a atras 1000 de vizitatori unici - long_description: | - Acest ecuson este acordat pentru distribuirea unui link care a fost accesat de 1000 de vizitatori externi. Wow! A promovat o discuÈ›ie interesantă în faÈ›a unei audienÈ›e enorme È™i ai ajutat mult comunitatea noastră să crească! first_like: name: Prima apreciere description: Ai apreciat o postare @@ -1911,21 +1814,15 @@ ro: first_flag: name: Primul marcaj de avertizare description: Marcat postare cu marcaj de avertizare - long_description: | - Acest ecuson se acordă când, pentru prima dată, ai marcat o postare cu marcaj de avertizare. Marcarea cu marcaj de avertizare este metoda prin care cu toÈ›ii ajutăm la menÈ›inerea acestui site în condiÈ›ii de curățenie È™i luminozitate pentru toată lumea. Dacă observi vreo postare care, indiferent de motiv, necesită atenÈ›ia moderatorilor, te rugăm să nu eziÈ›i să îl marchezi. PoÈ›i de asemenea să marchezi cu marcaj de avertizare spre trimiterea de mesaj personal către un coleg utilizator, dacă vezi vreo problemă cu postarea lui. Dacă vezi vreo problemă, :flag_black: semnalează-o! promoter: name: Promotor description: Ai invitat un utilizator campaigner: name: È™ef de campanie description: Ai invitat 3 utilizatori simpli - long_description: | - Acest ecuson se acordă după ce ai invitat 3 persoane care apoi au petrecut suficient timp pe site pentru a deveni utilizatori simpli. O comunitate vibrantă are nevoie de o infuzie regulată de noi-veniÈ›i care sa participe în mod obiÈ™nuit È™i care să adauge noi voci la conversaÈ›ii. champion: name: Campion description: Ai invitat 5 membri - long_description: | - Acest ecuson se acordă când ai invitat 5 membri care ulterior au petrecut suficient timp pe site pentru a deveni membri deplini. Wow! ÃŽÈ›i mulÈ›umim că ne sporeÈ™ti diversitatea comunității cu noi membri. first_share: name: Prima distribuire description: Ai distribuit o postare @@ -1939,8 +1836,6 @@ ro: first_quote: name: Prima citare description: Ai citat o postare - long_description: | - Acest ecuson se acordă când, pentru prima dată, citezi o postare precedentă în cadrul propriului tău răspuns È™i ajută la conexarea discuÈ›iilor în cadrul unui subiect. Cel mai simplu mod să citezi este să selectezi o secÈ›iune a unei postări È™i apoi să apeÈ™i orice buton de răspuns. Citează generos! read_guidelines: name: Ghid Citit reader: @@ -1991,8 +1886,6 @@ ro: crazy_in_love: name: Maximă stimă description: Ai folosit de 20 de ori 50 de aprecieri pe zi - long_description: | - Acest ecuson se acordă atunci când foloseÈ™ti toate cele 50 de aprecieri la care ai zilnic dreptul, de-a lungul a 20 zile. Wow! EÈ™ti un model de încurajare pentru colegii din comunitate! thank_you: name: MulÈ›umesc description: Ai 20 de postări apreciate È™i ai dat 10 apreiceri @@ -2006,18 +1899,14 @@ ro: empathetic: name: Empatic description: Ai 500 de postări apreciate È™i ai oferit 1000 de aprecieri - long_description: | - Acest ecuson se acordă când È›i-au fost apreciate 500 de postări È™i ai acordat la rândul tău 1000 sau mai multe aprecieri. Wow! EÈ™ti un model de generozitate È™i apreciere reciprocă :two_hearts:. first_emoji: name: Primul emoji description: Ai folosit un emoji într-o postare. first_mention: name: Prima menÈ›iune - long_description: "Acest ecuson se acordă când, pentru prima oară, ai menÈ›ionat @numele de utilizator al cuiva într-o postare de-a ta. Fiecare menÈ›ionare generează o notificare către acea persoană, astfel încât ea să È™tie despre postarea ta. ÃŽncepi prin a apăsa tasta @ (simbolul at) ca să menÈ›ionezi orice utilizator sau, dacă îți este permis, grup. E o metodă convenabilă să atragi atenÈ›ia cuiva." first_onebox: name: Primul onebox description: Ai postat un link care a devenit onebox - long_description: "Acest ecuson se acordă când, pentru prima data, ai postat un link singur pe line, ceea ce a făcut ca automat să fie expandat într-un onebox cu un scurt rezumat al link-ului, un titlu È™i (dacă e disponibilă) cu o poză." first_reply_by_email: name: Forum prin email long_description: | @@ -2040,7 +1929,6 @@ ro: button: "ÃŽnregistrare" title: "ÃŽnregistrare cont administrator" help: "înregistrează un cont nou ca să începi" - no_emails: "Din păcate, niciun email de administrator nu a fost setat pe parcursul instalării, aÈ™a că finalizarea configurării poate fi dificilă." confirm_email: title: "Confirmare email" message: "

Am trimis un email de activare la %{email}. Urmează instrucțiunile din email ca să-ți activezi contul.

Dacă nu primești email, verifică dacă l-ai introdus corect și verifică și dosarul de spam.

" @@ -2136,10 +2024,8 @@ ro: fields: favicon_url: label: "Iconiță mică" - description: "Imagine iconiță folosită la reprezentarea site-ului tău în web browsere È™i care arată bine la mărimi mici, ca de ex 32px pe 32px." apple_touch_icon_url: label: "Iconiță mare" - description: "Iconiță utilizata pentru a-È›i reprezenta site-ul pe dispozitive moderne È™i care arată bine la dimensiuni mai mari. Dimensiunea recomandată este de 144px pe 144px." homepage: title: "Pagina principală" fields: @@ -2147,8 +2033,6 @@ ro: choices: latest: label: "Subiecte recente" - categories: - label: "Categorii" emoji: title: "Emoji" invites: diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index c03072a3b2..bef3d2209b 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -84,6 +84,11 @@ ru: restrict_dependent_destroy: one: "Ðевозможно удалить запиÑÑŒ, Ñ‚.к. ÑущеÑтвует завиÑÐ¸Ð¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: %{record}" many: "Ðевозможно удалить запиÑÑŒ, Ñ‚.к. ÑущеÑтвует завиÑÐ¸Ð¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: %{record}" + too_short: + one: Ñлишком короткое (минимум 1 Ñимвол) + few: Ñлишком короткое (минимум %{count} Ñимволов) + many: Ñлишком короткое (минимум %{count} Ñимволов) + other: Ñлишком короткое (минимум %{count} Ñимволa) other_than: "не должно быть равно %{count}" template: body: 'Обнаружены ошибки в Ñледующих полÑÑ…:' @@ -119,10 +124,10 @@ ru: reading_time: "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° прочтение" likes: "Лайков" too_many_replies: - few: Извините, новые пользователи могут оÑтавлÑть только %{count} ответов к одной теме. - many: Извините, новые пользователи могут оÑтавлÑть только %{count} ответов к одной теме. - one: Извините, новые пользователи могут оÑтавлÑть только один ответ к теме. - other: Извините, новые пользователи могут оÑтавлÑть только %{count} ответ(ов) к одной теме. + one: "Извините, новые пользователи могут оÑтавлÑть только один ответ к теме." + few: "Извините, новые пользователи могут оÑтавлÑть только %{count} ответов к одной теме." + many: "Извините, новые пользователи могут оÑтавлÑть только %{count} ответов к одной теме." + other: "Извините, новые пользователи могут оÑтавлÑть только %{count} ответ(ов) к одной теме." embed: start_discussion: "Ðачать обÑуждение" continue: "Продолжить обÑуждение" @@ -132,50 +137,50 @@ ru: no_hosts: "Ðикаких хоÑтов не наÑтроено Ð´Ð»Ñ Ð²ÑтраиваниÑ." configure: "ÐаÑтроить Ð’Ñтраивание" more_replies: - few: Еще %{count} ответа - many: Еще %{count} ответов - one: Еще 1 ответ - other: Еще %{count} ответов + one: "Еще 1 ответ" + few: "Еще %{count} ответа" + many: "Еще %{count} ответов" + other: "Еще %{count} ответов" loading: "Загрузка обÑуждениÑ..." permalink: "ПоÑтоÑÐ½Ð½Ð°Ñ ÑÑылка" imported_from: "Это обÑуждение публикации %{link}" in_reply_to: "â–¶ %{username}" replies: - few: '%{count} ответа' - many: '%{count} ответов' - one: 1 ответ - other: '%{count} ответов' + one: "1 ответ" + few: "%{count} ответа" + many: "%{count} ответов" + other: "%{count} ответов" no_mentions_allowed: "Извините, но вы не можете упоминать других пользователей." too_many_mentions: - few: Извините, но вы можете упоминать только %{count} пользователей в Ñообщении. - many: Извините, но вы можете упоминать только %{count} пользователей в Ñообщении. - one: Извините, но вы можете упоминать только одного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Ñообщении. - other: Извините, но вы можете упоминать только %{count} пользователей в Ñообщении. + one: "Извините, но вы можете упоминать только одного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Ñообщении." + few: "Извините, но вы можете упоминать только %{count} пользователей в Ñообщении." + many: "Извините, но вы можете упоминать только %{count} пользователей в Ñообщении." + other: "Извините, но вы можете упоминать только %{count} пользователей в Ñообщении." no_mentions_allowed_newuser: "Извините, новые пользователи не могут упоминать других пользователей." too_many_mentions_newuser: - few: Извините, новые пользователи могут упоминать только %{count} пользователей в Ñообщении. - many: Извините, новые пользователи могут упоминать только %{count} пользователей в Ñообщении. - one: Извините, новые пользователи могут упоминать только одного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² каждом Ñообщении. - other: Извините, новые пользователи могут упоминать только %{count} пользователей в Ñообщении. + one: "Извините, новые пользователи могут упоминать только одного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² каждом Ñообщении." + few: "Извините, новые пользователи могут упоминать только %{count} пользователей в Ñообщении." + many: "Извините, новые пользователи могут упоминать только %{count} пользователей в Ñообщении." + other: "Извините, новые пользователи могут упоминать только %{count} пользователей в Ñообщении." no_images_allowed: "Извините, новые пользователи не могут прикреплÑть изображениÑ." too_many_images: - few: Извините, новые пользователи могут прикреплÑть только %{count} изображений к Ñообщению. - many: Извините, новые пользователи могут прикреплÑть только %{count} изображений к Ñообщению. - one: Извините, новые пользователи могут прикреплÑть только одно изображение к Ñообщению. - other: Извините, новые пользователи могут прикреплÑть только %{count} изображений к Ñообщению. + one: "Извините, новые пользователи могут прикреплÑть только одно изображение к Ñообщению." + few: "Извините, новые пользователи могут прикреплÑть только %{count} изображений к Ñообщению." + many: "Извините, новые пользователи могут прикреплÑть только %{count} изображений к Ñообщению." + other: "Извините, новые пользователи могут прикреплÑть только %{count} изображений к Ñообщению." no_attachments_allowed: "К Ñожалению, загрузка файлов недоÑтупна новым пользователÑм." too_many_attachments: - few: К Ñожалению, новые пользователи могут добавить только %{count} вложений в Ñообщение. - many: К Ñожалению, новые пользователи могут добавить только %{count} вложений в Ñообщение. - one: К Ñожалению, новые пользователи могут добавить только одно вложение в Ñообщение. - other: К Ñожалению, новые пользователи могут добавить только %{count} вложений в Ñообщение. + one: "К Ñожалению, новые пользователи могут добавить только одно вложение в Ñообщение." + few: "К Ñожалению, новые пользователи могут добавить только %{count} вложений в Ñообщение." + many: "К Ñожалению, новые пользователи могут добавить только %{count} вложений в Ñообщение." + other: "К Ñожалению, новые пользователи могут добавить только %{count} вложений в Ñообщение." no_links_allowed: "Извините, новые пользователи не могут размещать ÑÑылки." links_require_trust: "Извините, Ð’Ñ‹ не можете включать ÑÑылки в Ваши ÑообщениÑ." too_many_links: - few: Извините, новые пользователи могут размещать только %{count} ÑÑылок в Ñообщении. - many: Извините, новые пользователи могут размещать только %{count} ÑÑылок в Ñообщении. - one: Извините, новые пользователи могут размещать только одну ÑÑылку в Ñообщении. - other: Извините, новые пользователи могут размещать только %{count} ÑÑылок в Ñообщении. + one: "Извините, новые пользователи могут размещать только одну ÑÑылку в Ñообщении." + few: "Извините, новые пользователи могут размещать только %{count} ÑÑылок в Ñообщении." + many: "Извините, новые пользователи могут размещать только %{count} ÑÑылок в Ñообщении." + other: "Извините, новые пользователи могут размещать только %{count} ÑÑылок в Ñообщении." spamming_host: "Извините, вы не можете размеÑтить ÑÑылку в Ñтом Ñообщении." user_is_suspended: "Заблокированным пользователÑм запрещено пиÑать." topic_not_found: "Что-то пошло не так. Возможно, Ñта тема была закрыта или заархивирована, пока вы ее читали?" @@ -241,10 +246,10 @@ ru: title: "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° учаÑтие в группе %{group_name}" education: until_posts: - few: '%{count} ÑообщениÑ' - many: '%{count} Ñообщений' - one: 1 Ñообщение - other: '%{count} Ñообщений' + one: "1 Ñообщение" + few: "%{count} ÑообщениÑ" + many: "%{count} Ñообщений" + other: "%{count} Ñообщений" 'new-topic': | Добро пожаловать на Ñайт %{site_name} — **СпаÑибо за открытие новой темы!** @@ -340,27 +345,6 @@ ru: title: "Добро пожаловать в Discourse" lounge_welcome: title: "Добро пожаловать в Фойе" - body: |2 - - ПоздравлÑем! :confetti_ball: - - ЕÑли вы видите данное Ñообщение, вы доÑтигли ÑƒÑ€Ð¾Ð²Ð½Ñ **regular** (уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ 3). - - Ð£Ð²Ð°Ñ Ð¿Ð¾ÑвилиÑÑŒ новые возможноÑти … - - * Ð’Ñ‹ можете редактировать заголовок любого обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ - * Ð’Ñ‹ можете менÑть категорию обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ - * С ваших ÑÑылок ÑнимаетÑÑ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ nofollow ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) is removed) - * Ð’Ñ‹ получили доÑтуп к закрытым категориÑм, которые доÑтупны только Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ 3 и выше - * Ð’Ñ‹ можете Ñкрывать нежелательные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² один клик - - С полным ÑпиÑком привелегий вы можете ознакомитьÑÑ Ñ‚ÑƒÑ‚ [current list of fellow regulars](/badges/3/regular). ПожалуйÑта прочитайте Ñто. - - СпаÑибо Вам за то что ÑвлÑетеÑÑŒ важным членом нашего ÑообщеÑтва! - - (Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ детальной информации об уронÑÑ… Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ð¾Ñмотрите тут [see this topic][trust]. Ðапоминаем что данный уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ ÑохранÑетÑÑ Ð´Ð¾ тех пор пока вы придерживаетеÑÑŒ Ñтих правил.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "ОпиÑание раздела %{category}" replace_paragraph: "(Замените первый параграф лаконичным опиÑанием новой категории. Данное опиÑание будет отражено в облаÑти выбора категории, поÑтому желательно ограничитьÑÑ 200 Ñимволами. ** Пока вы не измените данное опиÑание или Ñоздадите темы, Ð´Ð°Ð½Ð½Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð½Ðµ поÑвитÑÑ Ð½Ð° Ñтранице категорий.**)" @@ -376,11 +360,6 @@ ru: cannot_delete: uncategorized: "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ раздел, предназначенный Ð´Ð»Ñ Ñ‚ÐµÐ¼ вне разделов" has_subcategories: "Ðевозможно удалить Ñтот раздел, Ñ‚.к. в нем еÑть подразделы." - topic_exists: - few: Ðевозможно удалить Ñтот раздел, Ñ‚.к. в нем ÑодержатÑÑ %{count} тем(Ñ‹). Ð¡Ð°Ð¼Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ - %{topic_link}. - many: Ðевозможно удалить Ñтот раздел, Ñ‚.к. в нем ÑодержатÑÑ %{count} тем(Ñ‹). Ð¡Ð°Ð¼Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ - %{topic_link}. - one: Ðевозможно удалить Ñтот раздел, Ñ‚.к. в нем ÑодержитÑÑ Ñ‚ÐµÐ¼Ð° - %{topic_link}. - other: Ðевозможно удалить Ñтот раздел, Ñ‚.к. в нем ÑодержатÑÑ %{count} тем(Ñ‹). Ð¡Ð°Ð¼Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ - %{topic_link}. topic_exists_no_oldest: "Ðевозможно удалить Ñтот раздел, Ñ‚.к. количеÑтво тем в нем равно %{count}." uncategorized_description: "Темы, которым не нужен раздел, или которые не попадают ни в один из ÑущеÑтвующих разделов." trust_levels: @@ -397,135 +376,135 @@ ru: change_failed_explanation: "Ð’Ñ‹ пытаетеÑÑŒ понизить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{user_name} до ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ '%{new_trust_level}'. Однако, его уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ ÑƒÐ¶Ðµ '%{current_trust_level}'. %{user_name} оÑтанетÑÑ Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ '%{current_trust_level}'. ЕÑли вы вÑе же хотите понизить пользователÑ, заблокируйте вначале уровень довериÑ." rate_limiter: hours: - few: 1 чаÑа - many: '%{count} чаÑов' - one: 1 Ñ‡Ð°Ñ - other: '%{count} чаÑов' + one: "1 чаÑ" + few: "1 чаÑа" + many: "%{count} чаÑов" + other: "%{count} чаÑов" minutes: - few: 1 минуты - many: '%{count} минут' - one: 1 минута - other: '%{count} минут' + one: "1 минута" + few: "1 минуты" + many: "%{count} минут" + other: "%{count} минут" seconds: - few: 1 Ñекунды - many: '%{count} Ñекунд' - one: 1 Ñекунда - other: '%{count} Ñекунд' + one: "1 Ñекунда" + few: "1 Ñекунды" + many: "%{count} Ñекунд" + other: "%{count} Ñекунд" datetime: distance_in_words: half_a_minute: "< 1 мин" less_than_x_seconds: - few: < %{count} Ñек - many: < %{count} Ñек - one: < 1 Ñек - other: < %{count} Ñек + one: "< 1 Ñек" + few: "< %{count} Ñек" + many: "< %{count} Ñек" + other: "< %{count} Ñек" x_seconds: - few: '%{count} Ñек' - many: '%{count} Ñек' - one: 1 Ñек - other: '%{count} Ñек' + one: "1 Ñек" + few: "%{count} Ñек" + many: "%{count} Ñек" + other: "%{count} Ñек" less_than_x_minutes: - few: < %{count} мин - many: < %{count} мин - one: < 1 мин - other: < %{count} мин + one: "< 1 мин" + few: "< %{count} мин" + many: "< %{count} мин" + other: "< %{count} мин" x_minutes: - few: '%{count} мин' - many: '%{count} мин' - one: 1 мин - other: '%{count} мин' + one: "1 мин" + few: "%{count} мин" + many: "%{count} мин" + other: "%{count} мин" about_x_hours: - few: '%{count} ч' - many: '%{count} ч' - one: 1 ч - other: '%{count} ч' + one: "1 ч" + few: "%{count} ч" + many: "%{count} ч" + other: "%{count} ч" x_days: - few: '%{count} дн' - many: '%{count} дн' - one: 1 дн - other: '%{count} дн' + one: "1 дн" + few: "%{count} дн" + many: "%{count} дн" + other: "%{count} дн" about_x_months: - few: '%{count} меÑ' - many: '%{count} меÑ' - one: 1 Ð¼ÐµÑ - other: '%{count} меÑ' + one: "1 меÑ" + few: "%{count} меÑ" + many: "%{count} меÑ" + other: "%{count} меÑ" x_months: - few: '%{count} меÑ' - many: '%{count} меÑ' - one: 1 Ð¼ÐµÑ - other: '%{count} меÑ' + one: "1 меÑ" + few: "%{count} меÑ" + many: "%{count} меÑ" + other: "%{count} меÑ" about_x_years: - few: '%{count} года' - many: '%{count} лет' - one: 1 год - other: '%{count} лет' + one: "1 год" + few: "%{count} года" + many: "%{count} лет" + other: "%{count} лет" over_x_years: - few: '> %{count} года' - many: '> %{count} лет' - one: '> 1 года' - other: '> %{count} лет' + one: "> 1 года" + few: "> %{count} года" + many: "> %{count} лет" + other: "> %{count} лет" almost_x_years: - few: '%{count} года' - many: '%{count} лет' - one: 1 год - other: '%{count} лет' + one: "1 год" + few: "%{count} года" + many: "%{count} лет" + other: "%{count} лет" distance_in_words_verbose: half_a_minute: "только что" less_than_x_seconds: - few: только что - many: только что - one: только что - other: только что + one: "только что" + few: "только что" + many: "только что" + other: "только что" x_seconds: - few: '%{count} Ñекунды назад' - many: '%{count} Ñекунд назад' - one: 1 Ñекунду назад - other: '%{count} Ñекунд назад' + one: "1 Ñекунду назад" + few: "%{count} Ñекунды назад" + many: "%{count} Ñекунд назад" + other: "%{count} Ñекунд назад" less_than_x_minutes: - few: менее %{count} минут назад - many: менее %{count} минут назад - one: менее 1 минуты назад - other: менее %{count} минут назад + one: "менее 1 минуты назад" + few: "менее %{count} минут назад" + many: "менее %{count} минут назад" + other: "менее %{count} минут назад" x_minutes: - few: '%{count} минуты назад' - many: '%{count} минут назад' - one: 1 минуту назад - other: '%{count} минут назад' + one: "1 минуту назад" + few: "%{count} минуты назад" + many: "%{count} минут назад" + other: "%{count} минут назад" about_x_hours: - few: '%{count} чаÑа назад' - many: '%{count} чаÑов назад' - one: 1 Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´ - other: '%{count} чаÑов назад' + one: "1 Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´" + few: "%{count} чаÑа назад" + many: "%{count} чаÑов назад" + other: "%{count} чаÑов назад" x_days: - few: '%{count} Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´' - many: '%{count} дней назад' - one: 1 день назад - other: '%{count} дней назад' + one: "1 день назад" + few: "%{count} Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´" + many: "%{count} дней назад" + other: "%{count} дней назад" about_x_months: - few: около %{count} меÑÑцев назад - many: около %{count} меÑÑцев назад - one: около 1 меÑÑца назад - other: около %{count} меÑÑцев назад + one: "около 1 меÑÑца назад" + few: "около %{count} меÑÑцев назад" + many: "около %{count} меÑÑцев назад" + other: "около %{count} меÑÑцев назад" x_months: - few: '%{count} меÑÑца назад' - many: '%{count} меÑÑцев назад' - one: 1 меÑÑц назад - other: '%{count} меÑÑцев назад' + one: "1 меÑÑц назад" + few: "%{count} меÑÑца назад" + many: "%{count} меÑÑцев назад" + other: "%{count} меÑÑцев назад" about_x_years: - few: около %{count} лет назад - many: около %{count} лет назад - one: около 1 года назад - other: около %{count} лет назад + one: "около 1 года назад" + few: "около %{count} лет назад" + many: "около %{count} лет назад" + other: "около %{count} лет назад" over_x_years: - few: более %{count} лет назад - many: более %{count} лет назад - one: более 1 года назад - other: более %{count} лет назад + one: "более 1 года назад" + few: "более %{count} лет назад" + many: "более %{count} лет назад" + other: "более %{count} лет назад" almost_x_years: - few: почти %{count} года назад - many: почти %{count} лет назад - one: почти 1 год назад - other: почти %{count} лет назад + one: "почти 1 год назад" + few: "почти %{count} года назад" + many: "почти %{count} лет назад" + other: "почти %{count} лет назад" password_reset: no_token: "К Ñожалению, Ð´Ð°Ð½Ð½Ð°Ñ ÑÑылка на изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ ÑƒÑтарела. Ðажмите на кнопку \"Войти\", а затем на \"Я забыл Ñвой пароль\", чтобы Ñгенерировать новую ÑÑылку Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ." choose_new: "Введите новый пароль" @@ -587,13 +566,8 @@ ru: description: 'Мне нравитÑÑ Ñто Ñообщение' short_description: 'Мне нравитÑÑ' long_form: 'понравилоÑÑŒ Ñто' - vote: - title: 'ПроголоÑовать' - description: 'ПроголоÑовать за Ñто Ñообщение' - long_form: 'проголоÑовало за Ñто Ñообщение' user_activity: no_bookmarks: - self: "Ð’Ñ‹ не добавили в закладки никаких Ñообщений. Закладки позволÑÑ‚ Вам получить быÑтрый доÑтуп к ÑообщениÑм позже." others: "Закладок нет." no_likes_given: self: "Вам не понравилиÑÑŒ никакие ÑообщениÑ." @@ -723,8 +697,6 @@ ru: num_users: "Пользователей" top_referred_topics: title: "Топ тем, на которые ÑÑылаютÑÑ" - xaxis: "Тема" - num_clicks: "Заходов" page_view_anon_reqs: title: "Ðнонимы" xaxis: "Дата" @@ -781,7 +753,6 @@ ru: xaxis: "Дата" yaxis: "Ð’Ñего" mobile_visits: - title: "Визиты форумчан" xaxis: "Дата" yaxis: "КоличеÑтво визитов" dashboard: @@ -859,7 +830,6 @@ ru: post_menu: "Определите, какие Ñлементы должны отображатьÑÑ Ð² меню у ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ в какой поÑледовательноÑти. Пример: like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Пункты меню дейÑтвий над Ñообщением, которые должны быть ÑпрÑтаны и поÑвлÑтьÑÑ Ð¿Ð¾ нажатию на кнопку Ñ Ñ‚Ñ€Ð¾ÐµÑ‚Ð¾Ñ‡Ð¸ÐµÐ¼." share_links: "Определите, какие Ñлементы должны отображатьÑÑ Ð² окне 'ПоделитьÑÑ' и в какой поÑледовательноÑти." - track_external_right_clicks: "ОтÑлеживать внешние ÑÑылки, открытые правой кнопкой мыши (например: открыть в новой вкладке), по умолчанию отключено, так как Ñто перезапиÑывает пути" site_contact_username: "Ð’Ñе автоматичеÑкие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отправлÑтьÑÑ Ð¾Ñ‚ имени Ñтого пользователÑ. ЕÑли оÑтавить пуÑтым, то будет иÑпользован ÑиÑтемный пользователь по умолчанию - System." send_welcome_message: "ОтправлÑть вÑем новым пользователÑм приветÑтвенное Ñообщение Ñ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¾Ð¹ инÑтрукцией о возможноÑÑ‚ÑÑ… форума." suppress_reply_directly_below: "Ðе показывать разворачиваемое количеÑтво ответов на Ñообщение, еÑли еÑть вÑего лишь один ответ непоÑредÑтвенно ниже." @@ -964,6 +934,7 @@ ru: newuser_max_mentions_per_post: "МакÑимальное чиÑло упоминаний других пользователей (@name), которое новый пользователь может Ñделать в одном Ñообщении." newuser_max_replies_per_topic: "МакÑимальное количеÑтво ответов нового Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² одной теме до того, как кто-нибудь напишет ответ." max_mentions_per_post: "МакÑимальное количеÑтво упоминаний по @пÑевдониму одним пользователем в одном Ñообщении." + enable_mentions: "Разрешить пользователÑм упоминать других пользователей." create_thumbnails: "Создавать миниатюры Ñлишком больших картинок в ÑообщениÑÑ…, показывать большие оригиналы в отдельно открывающемÑÑ Ð¾ÐºÐ½Ðµ." email_time_window_mins: "Подождать (n) минут перед отÑылкой каких-либо уведомлений почтой, чтобы дать автору возможноÑть перечитать и отредактировать Ñвоё Ñообщение." email_posts_context: "Сколько предыдущих ответов включать Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑта в ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ e-mail." @@ -1006,9 +977,9 @@ ru: num_flaggers_to_close_topic: "Минимальное колличеÑтво уникальных человек, пожаловавшихÑÑ Ð½Ð° топик, которое требуетÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой временной блокировки топика" num_flags_to_close_topic: "Минимальное колличеÑтво жалоб которое требуетÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой временной блокировки топика" auto_respond_to_flag_actions: "Включить автоматичеÑкий ответ при иÑпользовании флагов на Ñайте." + min_flags_staff_visibility: "Минимальное количеÑтво флагов на поÑÑ‚, прежде чем перÑонал может видеть его в разделе админиÑтратора" reply_by_email_enabled: "Разрешить отвечать в темах Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлектронным пиÑем." reply_by_email_address: "Шаблон Ð´Ð»Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° по email в формате: %{reply_key}@reply.example.com или replies+%{reply_key}@example.com" - disable_emails: "Запретить форуму отÑылать какие-либо пиÑьма." strip_images_from_short_emails: "УдалÑть картинки из пиÑем размером менее 2800 байт" short_email_length: "Какие пиÑьма Ñчитать короткими, в байтах" delete_email_logs_after_days: "УдалÑть журнал e-mail ÑпуÑÑ‚Ñ (N) дней. 0, чтобы хранить неограниченное количеÑтво времени" @@ -1129,72 +1100,69 @@ ru: not_seen_in_a_month: "С возвращением! Т.к. Ð²Ð°Ñ Ð½Ðµ было какое-то времÑ, мы Ñобрали ÑпиÑок популÑрных тем за Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ отÑутÑвиÑ. Вот они." merge_posts: edit_reason: - few: '%{count} Ñообщений было объединено пользователем %{username}' - many: '%{count} Ñообщений было объединено пользователем %{username}' - one: Сообщение было объединено пользователем %{username} - other: '%{count} Ñообщений было объединено пользователем %{username}' + one: "Сообщение было объединено пользователем %{username}" + few: "%{count} Ñообщений было объединено пользователем %{username}" + many: "%{count} Ñообщений было объединено пользователем %{username}" + other: "%{count} Ñообщений было объединено пользователем %{username}" errors: different_topics: "СообщениÑ, принадлежащие другой теме, не могут быть объединены." different_users: "СообщениÑ, принадлежащие разным пользователÑм, не могут быть объединены." move_posts: new_topic_moderator_post: - few: '%{count} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑены в новую тему: %{topic_link}' - many: '%{count} Ñообщений перенеÑены в новую тему: %{topic_link}' - one: 'Сообщение перенеÑено в новую тему: %{topic_link}' - other: '%{count} Ñообщений перенеÑены в новую тему: %{topic_link}' + one: "Сообщение перенеÑено в новую тему: %{topic_link}" + few: "%{count} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑены в новую тему: %{topic_link}" + many: "%{count} Ñообщений перенеÑены в новую тему: %{topic_link}" + other: "%{count} Ñообщений перенеÑены в новую тему: %{topic_link}" existing_topic_moderator_post: - few: '%{count} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑены в тему %{topic_link}' - many: '%{count} Ñообщений перенеÑены в тему %{topic_link}' - one: Сообщение перенеÑено в тему %{topic_link} - other: '%{count} Ñообщений перенеÑены в тему %{topic_link}' - change_owner: - post_revision_text: "Владелец Ñменен Ñ %{old_user} на %{new_user}" - deleted_user: "Удаленный пользователь" + one: "Сообщение перенеÑено в тему %{topic_link}" + few: "%{count} ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑены в тему %{topic_link}" + many: "%{count} Ñообщений перенеÑены в тему %{topic_link}" + other: "%{count} Ñообщений перенеÑены в тему %{topic_link}" topic_statuses: archived_enabled: "Эта тема отправлена в Ðрхив. Она заморожена и не может быть изменена." archived_disabled: "Эта тема разархивирована. Она более не заморожена, и может быть изменена." closed_enabled: "Эта тема закрыта. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." closed_disabled: "Эта тема открыта. Ð’ ней можно отвечать." autoclosed_message_max_posts: - few: 'Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: %{count}.' - many: 'Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: %{count}.' - one: 'Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: 1.' - other: 'Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: %{count}.' + one: "Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: 1." + few: "Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: %{count}." + many: "Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: %{count}." + other: "Это Ñообщение было автоматичеÑки закрыто, когда количеÑтво ответов доÑтигло макÑимума: %{count}." autoclosed_topic_max_posts: - few: 'Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: %{count}.' - many: 'Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: %{count}.' - one: 'Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: 1.' - other: 'Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: %{count}.' + one: "Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: 1." + few: "Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: %{count}." + many: "Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: %{count}." + other: "Эта тема была автоматичеÑки закрыта, когда количеÑтво ответов доÑтигло макÑимума: %{count}." autoclosed_enabled_days: - few: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} днÑ. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - many: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} дней. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - one: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ 1 день. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - other: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} дней. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. + one: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ 1 день. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + few: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} днÑ. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + many: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} дней. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + other: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} дней. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." autoclosed_enabled_hours: - few: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} чаÑа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - many: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} чаÑов. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - one: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ 1 чаÑ. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - other: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} чаÑов. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. + one: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ 1 чаÑ. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + few: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} чаÑа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + many: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} чаÑов. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + other: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} чаÑов. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." autoclosed_enabled_minutes: - few: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} минуты. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - many: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} минут. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - one: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ 1 минуту. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - other: Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} минут. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. + one: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ 1 минуту. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + few: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} минуты. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + many: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} минут. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + other: "Эта тема была автоматичеÑки закрыта ÑпуÑÑ‚Ñ %{count} минут. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." autoclosed_enabled_lastpost_days: - few: Эта тема была автоматичеÑки закрыта через %{count} Ð´Ð½Ñ Ð¿Ð¾Ñле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - many: Эта тема была автоматичеÑки закрыта через %{count} дней поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - one: Эта тема была автоматичеÑки закрыта через 1 день поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - other: Эта тема была автоматичеÑки закрыта через %{count} дней поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. + one: "Эта тема была автоматичеÑки закрыта через 1 день поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + few: "Эта тема была автоматичеÑки закрыта через %{count} Ð´Ð½Ñ Ð¿Ð¾Ñле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + many: "Эта тема была автоматичеÑки закрыта через %{count} дней поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + other: "Эта тема была автоматичеÑки закрыта через %{count} дней поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." autoclosed_enabled_lastpost_hours: - few: Эта тема была автоматичеÑки закрыта через %{count} чаÑа поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - many: Эта тема была автоматичеÑки закрыта через %{count} чаÑов поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - one: Эта тема была автоматичеÑки закрыта через 1 Ñ‡Ð°Ñ Ð¿Ð¾Ñле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - other: Эта тема была автоматичеÑки закрыта через %{count} чаÑов поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. + one: "Эта тема была автоматичеÑки закрыта через 1 Ñ‡Ð°Ñ Ð¿Ð¾Ñле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + few: "Эта тема была автоматичеÑки закрыта через %{count} чаÑа поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + many: "Эта тема была автоматичеÑки закрыта через %{count} чаÑов поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + other: "Эта тема была автоматичеÑки закрыта через %{count} чаÑов поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." autoclosed_enabled_lastpost_minutes: - few: Эта тема была автоматичеÑки закрыта через %{count} минуты поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - many: Эта тема была автоматичеÑки закрыта через %{count} минут поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - one: Эта тема была автоматичеÑки закрыта через 1 минуту поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. - other: Эта тема была автоматичеÑки закрыта через %{count} минут поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. + one: "Эта тема была автоматичеÑки закрыта через 1 минуту поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + few: "Эта тема была автоматичеÑки закрыта через %{count} минуты поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + many: "Эта тема была автоматичеÑки закрыта через %{count} минут поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." + other: "Эта тема была автоматичеÑки закрыта через %{count} минут поÑле поÑледнего ответа. Ð’ ней больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ." autoclosed_disabled: "Эта тема открыта. Ð’ ней можно отвечать." autoclosed_disabled_lastpost: "Эта тема теперь открыта, и в ней можно отвечать." pinned_enabled: "Ð”Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° закреплена. Тема будет находитьÑÑ Ð½Ð°Ð²ÐµÑ€Ñ…Ñƒ ÑпиÑка тем раздела, пока кто нибудь из админиÑтраторов не открепит ее." @@ -1206,6 +1174,7 @@ ru: login: not_approved: "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ еще не одобрена. Ð’Ñ‹ получите Ñлектронное пиÑьмо, когда поÑвитÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñть войти под Ñвоей учетной запиÑью." incorrect_username_email_or_password: "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, Ð°Ð´Ñ€ÐµÑ Ñлектронной почты или пароль" + incorrect_password: "Ðеверный пароль" wait_approval: "СпаÑибо за региÑтрацию. Мы оповеÑтим ваÑ, когда ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ будет одобрена." active: "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ активирована и готова к иÑпользованию." activate_email: "

Почти готово! Мы выÑлали пиÑьмо на %{email}. ПожалуйÑта, Ñледуйте инÑтрукциÑм в Ñтом пиÑьме Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ вашей учетной запиÑи.

ЕÑли пиÑьмо не пришло, пожалуйÑта, проверьте папку \"Ñпам\", или попробуйте войти еще раз, чтобы выÑлать активационное пиÑьмо повторно.

" @@ -1227,7 +1196,6 @@ ru: missing_user_field: "Ð’Ñ‹ не заполнили вÑе Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" already_logged_in: "Ой, кажетÑÑ, Ð’Ñ‹ пытаетеÑÑŒ принÑть приглашение Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ пользователÑ. ЕÑли Ð’Ñ‹ не %{current_user}, пожалуйÑта, выйдите из учётной запиÑи и попробуйте Ñнова." user: - no_accounts_associated: "Ðет аÑÑоциированных учетных запиÑей" deactivated_by_staff: "Выключено перÑоналом" activated_by_staff: "Включено перÑоналом" username: @@ -1250,10 +1218,10 @@ ru: domain_not_allowed: "Сайт недейÑтвителен. ДопуÑтимые домены: %{domains}" flags_reminder: subject_template: - few: '%{count} жалобы ожидают раÑÑмотрениÑ' - many: '%{count} жалоб ожидают раÑÑмотрениÑ' - one: 1 жалоба ожидает раÑÑÐ¼Ð¾Ñ‚Ñ€ÐµÐ½Ð¸Ñ - other: '%{count} жалоб ожидают раÑÑмотрениÑ' + one: "1 жалоба ожидает раÑÑмотрениÑ" + few: "%{count} жалобы ожидают раÑÑмотрениÑ" + many: "%{count} жалоб ожидают раÑÑмотрениÑ" + other: "%{count} жалоб ожидают раÑÑмотрениÑ" unsubscribe_mailer: subject_template: "Подтвердите, что вы больше не желаете получать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте от %{site_title}" invite_password_instructions: @@ -1306,10 +1274,10 @@ ru: СиÑтема не Ñмогла обнаружить тект ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² теле пиÑьма. Советуем убедитÑÑ Ð² том, что вы напиÑали желаемый текÑÑ‚ **в Ñамом верху пиÑьма**. pending_users_reminder: subject_template: - few: '%{count} Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑŽÑ‚ раÑÑмотрениÑ' - many: '%{count} пользователей ожидают раÑÑмотрениÑ' - one: 1 пользователь ожидает раÑÑмотрение - other: '%{count} пользователей ожидают раÑÑмотрениÑ' + one: "1 пользователь ожидает раÑÑмотрение" + few: "%{count} Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑŽÑ‚ раÑÑмотрениÑ" + many: "%{count} пользователей ожидают раÑÑмотрениÑ" + other: "%{count} пользователей ожидают раÑÑмотрениÑ" text_body_template: | Ðовые пользователи ожидают Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ (или отказа) перед тем, как они получат доÑтуп до форума. @@ -1333,10 +1301,11 @@ ru: title: "ОтпиÑатьÑÑ" description: "Ðе заинтереÑованы в получении данных пиÑем? Ðет проблем! Ðажмите на ÑÑылку ниже, чтобы мгновенно отпиÑатьÑÑ Ð¾Ñ‚ раÑÑылки:" visit_link_to_respond: "[ПоÑетите тему](%{base_url}%{url}) чтобы ответить." - visit_link_to_respond_pm: "[ПоÑетите Ñообщение](%{base_url}%{url}) чтобы ответить." posted_by: "Отправлено %{username} %{post_date}" user_posted_pm_staged: subject_template: "%{optional_re}%{topic_title}" + account_exists: + title: "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже ÑущеÑтвует" digest: why: "Сводка обÑуждений на Ñайте %{site_link} Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° вашего поÑледнего визита %{last_seen_at}" since_last_visit: "За Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ отÑутÑтвиÑ" @@ -1371,7 +1340,7 @@ ru: recent_topics: "Ðедавние" see_more: "Еще" search_title: "ИÑкать на Ñтом Ñайте" - search_google: "Google" + search_button: "ПоиÑк" terms_of_service: title: "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑлуг" signup_form_message: 'Я прочитал(а) и ÑоглаÑен(а) Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑким Ñоглашением.' @@ -1392,21 +1361,6 @@ ru: flag_reason: sockpuppet: "Ðовый пользователь Ñоздал тему, а другой новый пользователь ответил Ñ Ñтого же IP адреÑа (%{ip_address}). Смотрите параметр `flag_sockpuppets` Ñайта." spam_hosts: "Этот новый пользователь пыталÑÑ Ñоздать множеÑтво Ñообщений Ñ ÑÑылками на один и тот же домен (%{domain}). Смотрите параметр `newuser_spam_host_threshold` Ñайта." - email_log: - no_user: "Ðе найти Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ id %{user_id}" - anonymous_user: "ГоÑть" - suspended_not_pm: "пользователь заблокирован" - seen_recently: "Ðедавно видели пользователÑ" - post_not_found: "Ðе найти Ñообщение Ñ id %{post_id}" - notification_already_read: "Уведомление, о котором говоритÑÑ Ð² Ñтом пиÑьме, уже прочтено" - topic_nil: "Тема ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ€Ð°Ð²Ð½Ð° nil" - post_deleted: "Ñообщение уделено его автором" - user_suspended: "пользователь заблокирован" - already_read: "пользователь уже прочитал Ñто Ñообщение" - message_blank: "пуÑтое Ñообщение" - message_to_blank: "ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð¿ÑƒÑто" - text_part_body_blank: "ТекÑÑ‚Ð¾Ð²Ð°Ñ Ñ‡Ð°Ñть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñьма пуÑта" - body_blank: "CÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñьма пуÑто" color_schemes: base_theme_name: "БазоваÑ" about: "О наÑ" @@ -1428,14 +1382,10 @@ ru: editor: name: Редактор description: Первое редактирование ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ - long_description: | - Эта награда даруетÑÑ, когда Ð’Ñ‹ впервые редактируете одно из Ñвоих Ñообщений. Ð¥Ð¾Ñ‚Ñ Ð’Ñ‹ не можете править ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑтоÑнно, редактирование - неизменно Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¸Ð´ÐµÑ - вы можете улучшать Ваши ÑообщениÑ, иÑправлÑть небольшие ошибки или добавлÑть что-то, что Ð’Ñ‹ пропуÑтили ранее. Редактируйте, чтобы Ñделать Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐµÑ‰Ñ‘ лучше! basic_user: name: Ðовичок member: name: УчаÑтник - long_description: | - Эта награда даруетÑÑ, когда Ð’Ñ‹ доÑтигаете ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ 2. Благодарим за учаÑтие на протÑжении недель, чтобы дейÑтвительно приÑоединитьÑÑ Ðº нашему ÑообщеÑтву. Теперь Ð’Ñ‹ можете отправлÑть Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñо Ñвоей пользовательÑкой Ñтраницы или отдельных тем, Ñоздавать групповые личные беÑеды и иметь немного больше Ñимпатий ежедневно. regular: name: ПоÑтоÑлец leader: @@ -1538,7 +1488,6 @@ ru: description: ИÑпользовал Ñмайлик в Ñообщении first_mention: name: Первое обращение - long_description: "Эта награда выдаетÑÑ, когда вы впервые вÑтавлÑете чей-то @пÑевдоним в Ñвое Ñообщение. Каждое такое обращение отправит уведомление Ñтому человеку, чтобы они были в курÑе вашего ÑообщениÑ. Чтобы вÑтавить обращение к человеку по его пÑевдониму, или к целой группе по ее названию (еÑли Ñто разрешено), начните Ñ Ñимвола @ - Ñто удобный ÑпоÑоб привлечь их внимание." first_onebox: name: ÐŸÐµÑ€Ð²Ð°Ñ Ð£Ð¼Ð½Ð°Ñ Ð’Ñтавка first_reply_by_email: @@ -1658,10 +1607,8 @@ ru: fields: favicon_url: label: "ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð¸ÐºÐ¾Ð½ÐºÐ°" - description: "Изображение иконки Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ Ñайта в веб-браузерах. Должна хорошо ваглÑдеть в маленьких размерах, таких как 32 на 32 пикÑелÑ." apple_touch_icon_url: label: "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð¸ÐºÐ¾Ð½ÐºÐ°" - description: "Изображение иконки Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ Ñайта на Ñовременных уÑтройÑтвах. Должно хорошо выглÑдеть в больших размерах. Рекомендуемый размер не менее 144 на 144 пикÑелÑ." homepage: description: "Мы рекомендуем показывать поÑледние темы на Вашей домашней Ñтранице, но Ð’Ñ‹ также можете показывать разделы (группы тем), еÑли предпочтёте." title: "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница" @@ -1670,8 +1617,6 @@ ru: choices: latest: label: "ПоÑледние темы" - categories: - label: "Разделы" emoji: title: "Смайлы" description: "Выберите Ñтиль Ñмайлов Ð´Ð»Ñ ÑообщеÑтва. Ð’ дальнейшем, вы Ñможете добавить другие Ñтили Ñмайлов в Ðдминке, в Ñекции Оформление / Смайлы." @@ -1682,3 +1627,6 @@ ru: description: |

ЕÑли вы когда-либо захотите изменить Ñти наÑтройки, зайдите в Вашу админку; ÑÑылка находитÑÑ Ð½Ð°Ð¿Ñ€Ð¾Ñ‚Ð¸Ð² иконки гаечного ключа в меню Ñайта.

Удачи в Ñоздании Вашего нового ÑообщеÑтва!

+ staff_action_logs: + not_found: "не найдено" + unknown: "неизвеÑтно" diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml index e0881ec5ac..41aed31a73 100644 --- a/config/locales/server.sk.yml +++ b/config/locales/server.sk.yml @@ -26,15 +26,21 @@ sk: topics: "Témy" posts: "príspevky" loading: "NaÄítava sa" + powered_by_html: 'Beží na Discourse, najlepÅ¡ie so zapnutým JavaScriptom' log_in: "Prihlásenie" submit: "odoÅ¡li" purge_reason: "Automaticky zmazaný ako opustený, dezaktivovaný úÄet" disable_remote_images_download_reason: "SÅ¥ahovanie vzdialených obrázkov je vypnuté kvôli nedostatku diskového priestoru." anonymous: "Anonymný" remove_posts_deleted_by_author: "Zmazané autorom" + redirect_warning: "Neboli sme schopní overiÅ¥, Äi vami vybraný link bol pridaný na fórum. Ak chcete aj tak pokraÄovaÅ¥, vyberte link nižšie." themes: bad_color_scheme: "Nepodarilo sa aktualizovaÅ¥ tému, neplatná farebná schéma" other_error: "poÄas aktualizácie tému sa nieÄo nepodarilo" + error_importing: "Nastala chyba pri klonovaní git repozitára. Prístup bol odmietnuty, alebo repozitár nebol nájdený." + settings_errors: + invalid_yaml: "Tento YAML nie je validný." + data_type_not_a_number: "Hodnota nastavenia typu `%{name}` nie je podporovaná. Podporované typy sú `integer`, `bool`, `list` a `enum`" emails: incoming: default_subject: "Táto téma musí maÅ¥ názov" @@ -82,27 +88,27 @@ sk: one: "Nedá sa zmazaÅ¥ záznam pretože existuje %{record} závislých záznamov" many: "Záznam nemôže byÅ¥ zmazaný z dôvodu zavislosti na zázname: %{record} " too_long: + one: príliÅ¡ dlhé (maximálne 1 znak) few: príliiÅ¡ dlhé (maximum je %{count} znaky) many: príliiÅ¡ dlhé (maximum je %{count} znakov) - one: príliÅ¡ dlhé (maximálne 1 znak) other: príliiÅ¡ dlhé (maximum je %{count} znakov) too_short: + one: príliiÅ¡ krátke (minimum je 1 znak) few: príliiÅ¡ krátke (minimum je %{count} znaky) many: príliiÅ¡ krátke (minimum je %{count} znakov) - one: príliiÅ¡ krátke (minimum je 1 znak) other: príliiÅ¡ krátke (minimum je %{count} znakov) wrong_length: + one: nesprávna dĺžka (musí byÅ¥ 1 znak) few: nesprávna dĺžka (musí byÅ¥ %{count} znaky) many: nesprávna dĺžka (musí byÅ¥ %{count} znakov) - one: nesprávna dĺžka (musí byÅ¥ 1 znak) other: nesprávna dĺžka (musí byÅ¥ %{count} znakov) other_than: "musí byÅ¥ iný než %{count}" template: body: 'Nastal problém s nasledujúcimi položkami:' header: - few: Uloženie %{model} zlyhalo kôli %{count} chybám - many: 'Uloženie %{model} zlyhalo kôli %{count} chybám ' one: Uloženie %{model} zlyhalo kôli chybe + few: 'Uloženie %{model} zlyhalo kôli %{count} chybám' + many: 'Uloženie %{model} zlyhalo kôli %{count} chybám ' other: 'Uloženie %{model} zlyhalo kôli %{count} chybám ' embed: load_from_remote: "Nastala chyba pri naÄítaní príspevku" @@ -132,58 +138,58 @@ sk: reading_time: "Doba Äítania" likes: "PáÄi sa mi" too_many_replies: - few: Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na %{count} v rámci jednej témy. - many: Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na %{count} v rámci jednej témy. - one: Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na jeden v rámci jednej témy. - other: Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na %{count} v rámci jednej témy. + one: "Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na jeden v rámci jednej témy." + few: "Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na %{count} v rámci jednej témy." + many: "Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na %{count} v rámci jednej témy." + other: "Ľutujeme, noví používatelia majú doÄasne obmedzený poÄet príspevkov na %{count} v rámci jednej témy." embed: start_discussion: "ZaÄaÅ¥ diskusiu" continue: "PokraÄovaÅ¥ v diskusii" more_replies: - few: '%{count} ÄalÅ¡ie odpovede' - many: '%{count} Äalších odpovedí' - one: 1 ÄalÅ¡ia odpoveÄ - other: '%{count} Äalších odpovedí' + one: "1 ÄalÅ¡ia odpoveÄ" + few: "%{count} ÄalÅ¡ie odpovede" + many: "%{count} Äalších odpovedí" + other: "%{count} Äalších odpovedí" loading: "Nahrávanie Diskusie ..." permalink: "Trvalý odkaz" imported_from: "Toto je sprievodná diskusia k pôvodnej téme na %{link}" in_reply_to: "â–¶ %{username}" replies: - few: '%{count} odpovede' - many: '%{count} odpovedí' - one: 1 odpoveÄ - other: '%{count} odpovedí' + one: "1 odpoveÄ" + few: "%{count} odpovede" + many: "%{count} odpovedí" + other: "%{count} odpovedí" no_mentions_allowed: "Ľutujeme, nesmiete zmieňovaÅ¥ iných používateľov" too_many_mentions: - few: Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne %{count} používatelov. - many: Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne %{count} používatelov. - one: Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne jedného používateľa. - other: Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne %{count} používatelov. + one: "Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne jedného používateľa." + few: "Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne %{count} používatelov." + many: "Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne %{count} používatelov." + other: "Ľutujeme, v príspevku môžete zmieniÅ¥ maximálne %{count} používatelov." no_mentions_allowed_newuser: "Ľutujeme, noví používatelia nesmú zmieňovaÅ¥ iných použivateľov" too_many_mentions_newuser: - few: Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne %{count} používatelov. - many: Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne %{count} používatelov. - one: Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne jedného používateľa. - other: Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne %{count} používatelov. + one: "Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne jedného používateľa." + few: "Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne %{count} používatelov." + many: "Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne %{count} používatelov." + other: "Ľutujeme, noví používatelia môžu zmieniÅ¥ v príspevku maximálne %{count} používatelov." no_images_allowed_trust: "Ľutujeme, do príspevku nemôžete vložiÅ¥ obrázok" no_images_allowed: "Ľutujeme, noví používatelia nemôžu vkladaÅ¥ obrázky do príspevkov." too_many_images: - few: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} obrázky do príspevku. - many: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} obrázkov do príspevku. - one: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne jeden obrázok do príspevku. - other: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} obrázkov do príspevku. + one: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne jeden obrázok do príspevku." + few: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} obrázky do príspevku." + many: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} obrázkov do príspevku." + other: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} obrázkov do príspevku." no_attachments_allowed: "Ľutujeme, noví používatelia nemôžu vkladaÅ¥ prílohy do príspevkov." too_many_attachments: - few: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} prílohy do príspevku. - many: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} príloh do príspevku. - one: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne jednu prílohu do príspevku. - other: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} príloh do príspevku. + one: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne jednu prílohu do príspevku." + few: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} prílohy do príspevku." + many: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} príloh do príspevku." + other: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} príloh do príspevku." no_links_allowed: "Ľutujeme, noví používatelia nemôžu vkladaÅ¥ odkazy do príspevkov." too_many_links: - few: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} odkazy do príspevku. - many: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} odkazov do príspevku. - one: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne jeden odkaz do príspevku. - other: Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} odkazov do príspevku. + one: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne jeden odkaz do príspevku." + few: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} odkazy do príspevku." + many: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} odkazov do príspevku." + other: "Ľutujeme, noví používatelia môžu vložiÅ¥ maximálne %{count} odkazov do príspevku." spamming_host: "Ľutujeme, nemôžete publikovaÅ¥ odkaz na tento zdroj" user_is_suspended: "Suspendovaní používatelia nemôžu vkladaÅ¥ príspevky" topic_not_found: "NieÄo sa pokazilo. Téma mohla byÅ¥ napríklad uzavretá, alebo zmazaná kým ste ju prezerali." @@ -237,10 +243,10 @@ sk: trust_level_4: "stupen_dovery_4" education: until_posts: - few: '%{count} príspevky' - many: '%{count} príspevkov' - one: jeden príspevok - other: '%{count} príspevkov' + one: "jeden príspevok" + few: "%{count} príspevky" + many: "%{count} príspevkov" + other: "%{count} príspevkov" 'new-topic': | Víitajte na %{site_name} — **ÄŽakujeme za založenie novej konverzácie!** @@ -316,27 +322,6 @@ sk: title: "Vitajte v Discourse" lounge_welcome: title: "Vítajte v Salóne" - body: |2 - - Gratulácia! :confetti_ball: - - Ak vidíte túto tému, boli ste nedávno povýšený na **pravidelný** (úroveň dôvery 3). - - Teraz môžete … - - * UpravovaÅ¥ nadpis akejkoľvek témy - * MeniÅ¥ kategóriu akejkoľvek témy - * MaÅ¥ sledované vÅ¡etky VaÅ¡e odkazy ([automatické nofollow](http://en.wikipedia.org/wiki/Nofollow) je odstránené) - * Prístup do privátnej katogógie Lounge prístupnej iba Älenom s úrovňou dôvery 3 a vyššou - * SkryÅ¥ spam pomocou vlajky - - Tu je [aktuálny zoznam pravidelných Älenov](/badges/3/regular). UrÄite ich pozdravte. - - ÄŽakujeme, že ste dôležitou súÄasÅ¥ou naÅ¡ej komunity! - - (Pre viac informácií o úrovniach dôvery, [pozrite túto tému][trust]. Prosím nezabudnite, že iba Älenovia, ktorý neustále spĺňajú požiadavky zostanú platnými Älenmy.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "O kategórii: %{category} " replace_paragraph: "(NahraÄte tento prvý odstavec struÄným popisom VaÅ¡ej novej kategórie. Tento návod sa objaví v zozname kategórií, tak sa snažte ho udržaÅ¥ pod 200 znakov. **Kategória sa neobjaví v zozname kategórií pokým neupravíte tento popis alebo v nej nevytvoríte témy.**)" @@ -351,11 +336,6 @@ sk: cannot_delete: uncategorized: "Nemôžete vymazaÅ¥ kategóriu nezaradených" has_subcategories: "Nemôžete vymazaÅ¥ kategóriu pretože obsahuje podkategórie." - topic_exists: - few: Nemôžete vymazaÅ¥ kategóriu pretože obsahuje %{count} témy. NajstarÅ¡ia téma je %{topic_link}. - many: Nemôžete vymazaÅ¥ kategóriu pretože obsahuje %{count} tém. NajstarÅ¡ia téma je %{topic_link}. - one: Nemôžete vymazaÅ¥ kategóriu pretože obsahuje tému %{topic_link}. - other: Nemôžete vymazaÅ¥ kategóriu pretože obsahuje %{count} tém. NajstarÅ¡ia téma je %{topic_link}. topic_exists_no_oldest: "Nemôžete vymazaÅ¥ túto kategóriu pretože obsahuje %{count} tém." uncategorized_description: "Témy, ktoré nepotrebujú kategóriu, alebo sa do žiadnej existujúcej nehodia." trust_levels: @@ -375,135 +355,135 @@ sk: broken: "Tento obrázok je poÅ¡kodený" rate_limiter: hours: - few: '%{count} hodiny' - many: '%{count} hodín' - one: 1 hodina - other: '%{count} hodín' + one: "1 hodina" + few: "%{count} hodiny" + many: "%{count} hodín" + other: "%{count} hodín" minutes: - few: '%{count} minúty' - many: '%{count} minút' - one: 1 minútu - other: '%{count} minút' + one: "1 minútu" + few: "%{count} minúty" + many: "%{count} minút" + other: "%{count} minút" seconds: - few: '%{count} sekundy' - many: '%{count} sekúnd' - one: ' 1 sekundu' - other: '%{count} sekúnd' + one: " 1 sekundu" + few: "%{count} sekundy" + many: "%{count} sekúnd" + other: "%{count} sekúnd" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - few: < %{count}s - many: < %{count}s - one: < 1s - other: < %{count}s + one: "< 1s" + few: "< %{count}s" + many: "< %{count}s" + other: "< %{count}s" x_seconds: - few: '%{count}s' - many: '%{count}s' - one: 1s - other: '%{count}s' + one: "1s" + few: "%{count}s" + many: "%{count}s" + other: "%{count}s" less_than_x_minutes: - few: < %{count}m - many: < %{count}m - one: < 1m - other: < %{count}m + one: "< 1m" + few: "< %{count}m" + many: "< %{count}m" + other: "< %{count}m" x_minutes: - few: '%{count}m' - many: '%{count}m' - one: 1m - other: '%{count}m' + one: "1m" + few: "%{count}m" + many: "%{count}m" + other: "%{count}m" about_x_hours: - few: '%{count}h' - many: '%{count}h' - one: 1h - other: '%{count}h' + one: "1h" + few: "%{count}h" + many: "%{count}h" + other: "%{count}h" x_days: - few: '%{count}d' - many: '%{count}d' - one: 1d - other: '%{count}d' + one: "1d" + few: "%{count}d" + many: "%{count}d" + other: "%{count}d" about_x_months: - few: '%{count}mes' - many: '%{count}mes' - one: ' 1mes' - other: '%{count}mes' + one: " 1mes" + few: "%{count}mes" + many: "%{count}mes" + other: "%{count}mes" x_months: - few: '%{count}mes' - many: '%{count}mes' - one: 1mes - other: '%{count}mes' + one: "1mes" + few: "%{count}mes" + many: "%{count}mes" + other: "%{count}mes" about_x_years: - few: '%{count}r' - many: '%{count}r' - one: 1r - other: '%{count}r' + one: "1r" + few: "%{count}r" + many: "%{count}r" + other: "%{count}r" over_x_years: - few: '> %{count}r' - many: '> %{count}r' - one: '> 1r' - other: '> %{count}r' + one: "> 1r" + few: "> %{count}r" + many: "> %{count}r" + other: "> %{count}r" almost_x_years: - few: '%{count}r' - many: '%{count}r' - one: 1r - other: '%{count}r' + one: "1r" + few: "%{count}r" + many: "%{count}r" + other: "%{count}r" distance_in_words_verbose: half_a_minute: "práve teraz" less_than_x_seconds: - few: práve teraz - many: práve teraz - one: práve teraz - other: práve teraz + one: "práve teraz" + few: "práve teraz" + many: "práve teraz" + other: "práve teraz" x_seconds: - few: pred %{count} sekundami - many: pred %{count} sekundami - one: pred sekundou - other: pred %{count} sekundami + one: "pred sekundou" + few: "pred %{count} sekundami" + many: "pred %{count} sekundami" + other: "pred %{count} sekundami" less_than_x_minutes: - few: menej ako pred %{count} minútami - many: menej ako pred %{count} minútami - one: menej ako pred minútou - other: menej ako pred %{count} minútami + one: "menej ako pred minútou" + few: "menej ako pred %{count} minútami" + many: "menej ako pred %{count} minútami" + other: "menej ako pred %{count} minútami" x_minutes: - few: pred %{count} minútami - many: pred %{count} minútami - one: pred minútou - other: pred %{count} minútami + one: "pred minútou" + few: "pred %{count} minútami" + many: "pred %{count} minútami" + other: "pred %{count} minútami" about_x_hours: - few: pred %{count} hodinami - many: pred %{count} hodinami - one: pred hodinou - other: pred %{count} hodinami + one: "pred hodinou" + few: "pred %{count} hodinami" + many: "pred %{count} hodinami" + other: "pred %{count} hodinami" x_days: - few: pred %{count} dňami - many: pred %{count} dňami - one: vÄera - other: pred %{count} dňami + one: "vÄera" + few: "pred %{count} dňami" + many: "pred %{count} dňami" + other: "pred %{count} dňami" about_x_months: - few: približne pred %{count} mesiacmi - many: približne pred %{count} mesiacmi - one: približne pred mesiacom - other: približne pred %{count} mesiacmi + one: "približne pred mesiacom" + few: "približne pred %{count} mesiacmi" + many: "približne pred %{count} mesiacmi" + other: "približne pred %{count} mesiacmi" x_months: - few: pred %{count} mesiacmi - many: pred %{count} mesiacmi - one: pred mesiacom - other: pred %{count} mesiacmi + one: "pred mesiacom" + few: "pred %{count} mesiacmi" + many: "pred %{count} mesiacmi" + other: "pred %{count} mesiacmi" about_x_years: - few: približne pred %{count} rokmi - many: približne pred %{count} rokmi - one: približne pred rokom - other: približne pred %{count} rokmi + one: "približne pred rokom" + few: "približne pred %{count} rokmi" + many: "približne pred %{count} rokmi" + other: "približne pred %{count} rokmi" over_x_years: - few: pred vyÅ¡e %{count} rokmi - many: pred vyÅ¡e %{count} rokmi - one: pred vyÅ¡e rokom - other: pred vyÅ¡e %{count} rokmi + one: "pred vyÅ¡e rokom" + few: "pred vyÅ¡e %{count} rokmi" + many: "pred vyÅ¡e %{count} rokmi" + other: "pred vyÅ¡e %{count} rokmi" almost_x_years: - few: pred takmer %{count} rokmi - many: pred takmer %{count} rokmi - one: pred takmer rokom - other: pred takmer %{count} rokmi + one: "pred takmer rokom" + few: "pred takmer %{count} rokmi" + many: "pred takmer %{count} rokmi" + other: "pred takmer %{count} rokmi" password_reset: no_token: "Ľutujeme, tento odkaz na zmenu hesla je už príliÅ¡ starý. StlaÄte tlaÄidlo PrihlásiÅ¥ a použite \"Zabudol som heslo\" pre vytvorenie nového odkazu." choose_new: "Napíš nové heslo" @@ -561,10 +541,6 @@ sk: title: 'PáÄi sa mi' description: 'PáÄi sa mi tento príspevok' long_form: 'páÄilo sa' - vote: - title: 'HlasovaÅ¥' - description: 'HlasovaÅ¥ pre tento príspevok' - long_form: 'hlasoval pre tento príspevok' user_activity: no_default: others: "Žiadna aktivita" @@ -687,8 +663,6 @@ sk: num_users: "Používatelia" top_referred_topics: title: "NajlepÅ¡ie témy" - xaxis: "Témy" - num_clicks: "Klinutia" page_view_anon_reqs: title: "Anonymný" xaxis: "Deň" @@ -737,7 +711,6 @@ sk: xaxis: "Deň" yaxis: "Celkovo" mobile_visits: - title: "Používateľské návÅ¡tevy" xaxis: "Deň" yaxis: "PoÄet návÅ¡tev" dashboard: @@ -823,7 +796,6 @@ sk: post_menu: "UrÄuje, ktoré položky sa objavia v menu príspevku a v akom poradí. Napríklad páÄi sa mi|upraviÅ¥|oznaÄiÅ¥|vymazaÅ¥|zdieľaÅ¥|záložka|odpovedaÅ¥" post_menu_hidden_items: "Položky vo východzích nastaveniach menu schované pri príspevkovom menu, dokiaľ neni kliknuté na rozbaľovaciu elipsu." share_links: "UveÄte, ktoré položky sa maju zobraziÅ¥ v zdieľacom dialógu a v akom poradí." - track_external_right_clicks: "SledovaÅ¥ externé odkazy na ktoré sa klkne pravým tlaÄidlom (napr. otvorenie na novej karte) Vypnuté vo východzích nastaveniach, pretože to prepisuje URL adresy" site_contact_username: "Platné používateľské meno obsluhy, ktorá bude posielaÅ¥ automatizované správy. Pokiaľ je vynechané, použije sa východzí systémový úÄet. " send_welcome_message: "PoslaÅ¥ vÅ¡etkým novým používateľom uvítaciu správu s návodom ako zaÄaÅ¥. " suppress_reply_directly_below: "NezobrazovaÅ¥ rozbaľovacie tlaÄidlo s poÄtom odpovedí ak je k príspevku len jedna odpoveÄ priamo pod ním." @@ -983,7 +955,6 @@ sk: min_first_post_typing_time: "Minimalny Äas písania prvého príspevku v milisekundách, ak je Äas kratší ako je limit, príspevok bude automaticky zaradený do fronty na schválenie. Nastav 0 pre vypnutie (NeoporúÄa sa)" reply_by_email_enabled: "PovoliÅ¥ odpoveÄ na tému prostredníctvom emailu." reply_by_email_address: "Å ablóna pre príchodziu emailovú adresu emailových odpovedí. Napríklad : %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "ZabrániÅ¥ Discoursu v odosielaní akýchkoľvek e-mailov" strip_images_from_short_emails: "OdobraÅ¥ obrázky z e-mailov s veľkosÅ¥ou menÅ¡ou ako 2800 bajtov" short_email_length: "Dĺžka krátkeho emailu v bytoch." display_name_on_email_from: "V emailovom poli Od zobraziÅ¥ plné mená" @@ -1099,63 +1070,60 @@ sk: not_seen_in_a_month: "Vitajte späť! Nevideli sme Vás už nejaký Äas. Toto sú najpopulárnejÅ¡ie témy odkedy ste boli preÄ." move_posts: new_topic_moderator_post: - few: '%{count} príspevky boli oddelené do novej témy: %{topic_link}' - many: '%{count} príspevkov bolo oddelených do novej témy: %{topic_link}' - one: 'Príspevok bol oddelený do novej témy: %{topic_link}' - other: '%{count} príspevkov bolo oddelených do novej témy: %{topic_link}' + one: "Príspevok bol oddelený do novej témy: %{topic_link}" + few: "%{count} príspevky boli oddelené do novej témy: %{topic_link}" + many: "%{count} príspevkov bolo oddelených do novej témy: %{topic_link}" + other: "%{count} príspevkov bolo oddelených do novej témy: %{topic_link}" existing_topic_moderator_post: - few: '%{count} príspevky boli pripojené k existujúcej téme: %{topic_link}' - many: '%{count} príspevkov bolo pripojených k existujúcej téme: %{topic_link}' - one: 'Príspevok bol pripojený k existujúcej téme: %{topic_link}' - other: '%{count} príspevkov bolo pripojených k existujúcej téme: %{topic_link}' - change_owner: - post_revision_text: "Vlástníctvo bolo prenesené z %{old_user} na %{new_user}" - deleted_user: "vymazaný užívateľ" + one: "Príspevok bol pripojený k existujúcej téme: %{topic_link}" + few: "%{count} príspevky boli pripojené k existujúcej téme: %{topic_link}" + many: "%{count} príspevkov bolo pripojených k existujúcej téme: %{topic_link}" + other: "%{count} príspevkov bolo pripojených k existujúcej téme: %{topic_link}" topic_statuses: archived_enabled: "Táto téma je archivovaná. Je zmrazená a už sa nedá nijako meniÅ¥. " archived_disabled: "Táto téma je vyňatá z archivu. Už nie je zmrazená a môže sa opäť meniÅ¥. " closed_enabled: "Táto téma je už uzavretá. Nové odpovede už nie sú povolené." closed_disabled: "Táto téma je teraz otvorená. Nové odpovede sú povolené." autoclosed_message_max_posts: - few: Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí. - many: Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí. - one: Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu 1 odpovede. - other: Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí. + one: "Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu 1 odpovede." + few: "Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí." + many: "Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí." + other: "Táto správa bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí." autoclosed_topic_max_posts: - few: Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí. - many: Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí. - one: Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu 1 odpovede. - other: Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí. + one: "Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu 1 odpovede." + few: "Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí." + many: "Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí." + other: "Táto téma bola automaticky uzavretá po dosiahnutí maximálneho limitu %{count} odpovedí." autoclosed_enabled_days: - few: Táto téma bola automaticky uzavretá po %{count} dňoch . Nové odpovede už nie sú povolené. - many: Táto téma bola automaticky uzavretá po %{count} dňoch . Nové odpovede už nie sú povolené. - one: Táto téma bola automaticky uzavretá po 1 dni . Nové odpovede už nie sú povolené. - other: Táto téma bola automaticky uzavretá po %{count} dňoch . Nové odpovede už nie sú povolené. + one: "Táto téma bola automaticky uzavretá po 1 dni . Nové odpovede už nie sú povolené." + few: "Táto téma bola automaticky uzavretá po %{count} dňoch . Nové odpovede už nie sú povolené." + many: "Táto téma bola automaticky uzavretá po %{count} dňoch . Nové odpovede už nie sú povolené." + other: "Táto téma bola automaticky uzavretá po %{count} dňoch . Nové odpovede už nie sú povolené." autoclosed_enabled_hours: - few: Táto téma bola automaticky uzavretá po %{count} hodinách. Nové odpovede už nie sú povolené. - many: Táto téma bola automaticky uzavretá po %{count} hodinách. Nové odpovede už nie sú povolené. - one: Táto téma bola automaticky uzavretá po hodine. Nové odpovede už nie sú povolené. - other: Táto téma bola automaticky uzavretá po %{count} hodinách. Nové odpovede už nie sú povolené. + one: "Táto téma bola automaticky uzavretá po hodine. Nové odpovede už nie sú povolené." + few: "Táto téma bola automaticky uzavretá po %{count} hodinách. Nové odpovede už nie sú povolené." + many: "Táto téma bola automaticky uzavretá po %{count} hodinách. Nové odpovede už nie sú povolené." + other: "Táto téma bola automaticky uzavretá po %{count} hodinách. Nové odpovede už nie sú povolené." autoclosed_enabled_minutes: - few: Táto téma bola automaticky uzavretá po %{count} minútach. Nové odpovede už nie sú povolené. - many: Táto téma bola automaticky uzavretá po %{count} minútach. Nové odpovede už nie sú povolené. - one: Táto téma bola automaticky uzavretá po minúte. Nové odpovede už nie sú povolené. - other: Táto téma bola automaticky uzavretá po %{count} minútach. Nové odpovede už nie sú povolené. + one: "Táto téma bola automaticky uzavretá po minúte. Nové odpovede už nie sú povolené." + few: "Táto téma bola automaticky uzavretá po %{count} minútach. Nové odpovede už nie sú povolené." + many: "Táto téma bola automaticky uzavretá po %{count} minútach. Nové odpovede už nie sú povolené." + other: "Táto téma bola automaticky uzavretá po %{count} minútach. Nové odpovede už nie sú povolené." autoclosed_enabled_lastpost_days: - few: Táto téma bola automaticky uzavretá po %{count} dňoch od poslednej odpovede. Nové odpovede už nie sú povolené. - many: Táto téma bola automaticky uzavretá po %{count} dňoch od poslednej odpovede. Nové odpovede už nie sú povolené. - one: Táto téma bola automaticky uzavretá po 1 dni od poslednej odpovede. Nové odpovede už nie sú povolené. - other: Táto téma bola automaticky uzavretá po %{count} dňoch od poslednej odpovede. Nové odpovede už nie sú povolené. + one: "Táto téma bola automaticky uzavretá po 1 dni od poslednej odpovede. Nové odpovede už nie sú povolené." + few: "Táto téma bola automaticky uzavretá po %{count} dňoch od poslednej odpovede. Nové odpovede už nie sú povolené." + many: "Táto téma bola automaticky uzavretá po %{count} dňoch od poslednej odpovede. Nové odpovede už nie sú povolené." + other: "Táto téma bola automaticky uzavretá po %{count} dňoch od poslednej odpovede. Nové odpovede už nie sú povolené." autoclosed_enabled_lastpost_hours: - few: Táto téma bola automaticky uzavretá po %{count} hodinách od poslednej odpovede. Nové odpovede už nie sú povolené. - many: Táto téma bola automaticky uzavretá po %{count} hodinách od poslednej odpovede. Nové odpovede už nie sú povolené. - one: Táto téma bola automaticky uzavretá po1 hodine od poslednej odpovede. Nové odpovede už nie sú povolené. - other: Táto téma bola automaticky uzavretá po %{count} hodinách od poslednej odpovede. Nové odpovede už nie sú povolené. + one: "Táto téma bola automaticky uzavretá po1 hodine od poslednej odpovede. Nové odpovede už nie sú povolené." + few: "Táto téma bola automaticky uzavretá po %{count} hodinách od poslednej odpovede. Nové odpovede už nie sú povolené." + many: "Táto téma bola automaticky uzavretá po %{count} hodinách od poslednej odpovede. Nové odpovede už nie sú povolené." + other: "Táto téma bola automaticky uzavretá po %{count} hodinách od poslednej odpovede. Nové odpovede už nie sú povolené." autoclosed_enabled_lastpost_minutes: - few: Táto téma bola automaticky uzavretá po %{count} minútach od poslednej odpovede. Nové odpovede už nie sú povolené. - many: Táto téma bola automaticky uzavretá po %{count} minútach od poslednej odpovede. Nové odpovede už nie sú povolené. - one: Táto téma bola automaticky uzavretá po 1 minúte od poslednej odpovede. Nové odpovede už nie sú povolené. - other: Táto téma bola automaticky uzavretá po %{count} minútach od poslednej odpovede. Nové odpovede už nie sú povolené. + one: "Táto téma bola automaticky uzavretá po 1 minúte od poslednej odpovede. Nové odpovede už nie sú povolené." + few: "Táto téma bola automaticky uzavretá po %{count} minútach od poslednej odpovede. Nové odpovede už nie sú povolené." + many: "Táto téma bola automaticky uzavretá po %{count} minútach od poslednej odpovede. Nové odpovede už nie sú povolené." + other: "Táto téma bola automaticky uzavretá po %{count} minútach od poslednej odpovede. Nové odpovede už nie sú povolené." autoclosed_disabled: "Táto téma je teraz otvorená. Nové odpovede sú povolené." autoclosed_disabled_lastpost: "Táto téma je teraz otvorená. Nové odpovede sú povolené." pinned_enabled: "Táto téma je teraz pripnutá. Bude zobrazená na vrchu danej kategórie pokiaľ ju neodopnú zamestnanci pre vÅ¡etkých alebo samostatne každý používateľ." @@ -1185,7 +1153,6 @@ sk: reserved_username: "Toto užívateľské meno nie je povolené." missing_user_field: "Nevyplnili ste vÅ¡etky užívateľké polia." user: - no_accounts_associated: "Žiadne pripojené úÄty " username: short: "musí maÅ¥ minimálne %{min} znakov" long: "nesmie byÅ¥ dlhší než %{max} znakov" @@ -1201,10 +1168,10 @@ sk: max_new_accounts_per_registration_ip: "Nové registrácie nie sú povolené z VaÅ¡ej IP adresy (dosiahnutý limit). Kontaktujte Älena obsluhy. " flags_reminder: subject_template: - few: '%{count} znaÄky Äakajú na zpracovanie' - many: '%{count} znaÄiek Äaká na zpracovanie' - one: 1 znaÄká Äaká na zpracovanie - other: '%{count} znaÄiek Äaká na zpracovanie' + one: "1 znaÄká Äaká na zpracovanie" + few: "%{count} znaÄky Äakajú na zpracovanie" + many: "%{count} znaÄiek Äaká na zpracovanie" + other: "%{count} znaÄiek Äaká na zpracovanie" unsubscribe_mailer: subject_template: "PotvrÄte, že už Äalej nechcete dostávaÅ¥ aktualizácie z %{site_title}" invite_password_instructions: @@ -1278,10 +1245,10 @@ sk: Akcia uverejnenia nebola rozpoznaná. Prosíme skúste znovu alebo, ak sa chovanie opakuje, uverejnite pomocou webstránky. pending_users_reminder: subject_template: - few: '%{count} užívateľia Äakajú na schválenie' - many: '%{count} užívateľov Äaká na schválenie' - one: 1 užívateľ Äaká na schválenie - other: '%{count} užívateľov Äaká na schválenie' + one: "1 užívateľ Äaká na schválenie" + few: "%{count} užívateľia Äakajú na schválenie" + many: "%{count} užívateľov Äaká na schválenie" + other: "%{count} užívateľov Äaká na schválenie" download_remote_images_disabled: subject_template: "SÅ¥ahovanie vzdialených obrázkov je zablokované." subject_re: "Re:" @@ -1306,7 +1273,6 @@ sk: recent_topics: "Nedávne" see_more: "Viac" search_title: "PrehľadaÅ¥ tieto stránky" - search_google: "Google" terms_of_service: title: "Podmienky používania" signup_form_message: 'PreÄítal som si Podmienky používania a súhlasím s nimi.' @@ -1324,21 +1290,6 @@ sk: size_not_found: "Ľutujeme, ale nepodarilo sa nám zistiÅ¥ veľkosÅ¥ obrázku. Nie je nahodou poÅ¡kodený?" avatar: missing: "Ľutujeme, ale nemôžeme nájsÅ¥ žiaden avatar asociovaný s touto emailovou adresou. Môžete ho skúsiÅ¥ nahraÅ¥ znova?" - email_log: - no_user: "Nepodarilo sa nájsÅ¥ užívateľa s id %{user_id}" - anonymous_user: "Používateľ je anonymný" - suspended_not_pm: "Užívateľ je suspendovaný, správa nebude poslaná" - seen_recently: "Používateľ bol nedávno online" - post_not_found: "Nepodarilo sa nájsÅ¥ príspevok s id %{post_id}" - notification_already_read: "Upozornenie o ktorom je tento email už bolo preÄítané" - topic_nil: "post.topic je prázdny" - post_deleted: "príspevok bol zmazaný autorom" - user_suspended: "užívateľ bol suspendovaný" - already_read: "používateľ si už preÄítal tento príspevok" - message_blank: "správa je prázdna" - message_to_blank: "message.to je prázdne" - text_part_body_blank: "text_part.body je prázdne" - body_blank: "telo je prázdne" color_schemes: base_theme_name: "Základ" about: "O stránke" @@ -1352,14 +1303,245 @@ sk: Upravte prvý príspevok v téme pre zmenu obsahu %{page_name} stránky. guidelines_topic: title: "FAQ/Pravidlá" + body: | + + + ## [Toto je civilizované miesto na verejnú diskusiu](#civilized) + + Prosím, správajte sa k tomuto diskusnému fóru s rovnakým reÅ¡pektom ako k verejnému parku. Aj my sme spoloÄným zdrojom komunity – miesto, kde sa prostredníctvom neutíchajúcej diskusie delíme o zruÄnosti, vedomosti a záujmy. + + Tieto pravidlá nie sú presne dané a nemenné, sú to len usmernenia, ktoré majú pomôcÅ¥ úsudku Älenov naÅ¡ej komunity a udržaÅ¥ toto miesto na civilizovanú verejnú diskusiu Äisté a prehľadné. + + + + ## [ZlepÅ¡ujte diskusiu](#improve) + + Pomôžte nám tu vytvoriÅ¥ skvelé miesto na diskusiu tým, že sa vždy budete snažiÅ¥ diskusiu posunúť k lepÅ¡iemu, aj keÄ len o málo. Ak si nie ste istí, Äi váš príspevok nieÄím prispeje k diskusii, premyslite si, Äo chcete povedaÅ¥ a skúste to neskôr. + + Záleží nám na témach, o ktorých sa tu diskutuje, a chceme, aby ste sa správali tak, že na nich záleží aj vám. ReÅ¡pektujte témy a ľudí, ktorí o nich diskutujú, a to aj v prípade, že s nieÄím, Äo niekto povedal, nesúhlasíte. + + Jedným zo spôsobov zlepÅ¡enia diskusie je objavovanie tých, ktoré prebiehajú. Skôr, než odpoviete alebo vytvoríte vlastnú tému, prezrite si témy, ktoré tu už sú, a budete maÅ¥ lepÅ¡iu Å¡ancu nájsÅ¥ iných ľudí s rovnakými záujmami. + + + + ## [BuÄte milí, aj keÄ nesúhlasíte](#agreeable) + + Možno budete chcieÅ¥ s niÄím vyjadriÅ¥ svoj nesúhlas. To je v poriadku. Ale majte na pamäti, že máte kritizovaÅ¥ myÅ¡lienky, nie ľudí. Prosím, vyhýbajte sa: + + * nadávkam + * útokom ad hominem + * odpovediam na tón príspevku a nie na jeho obsah + * neuváženému oponovaniu + + Namiesto toho ponúknite podložené protiargumenty, ktoré konverzáciu posunú dopredu. + + + + ## [Na vaÅ¡ej úÄasti záleží](#participate) + + Konverzácie, ktoré tu máme, udávajú tón pre nových Älenov. Pomôžte nám ovplyvniÅ¥ budúcnosÅ¥ tejto komunity tým, že sa zapojíte do diskusií, ktoré robia toto fórum zaujímavým, a vyhnete sa tým, ktoré nie. + + V diskusii sú k dispozícii nástroje, ktoré umožňujú, aby komunita spoloÄne vybrala najlepÅ¡ie (a najhorÅ¡ie) príspevky: záložky, tlaÄidlá „PáÄi sa mi“, nahlásenie nevhodných príspevkov, odpovede, úprava príspevkov a tak Äalej. Používajte tieto nástroje na zlepÅ¡enie vlastného zážitku, ale aj zážitku ostatných. + + Zanechajme komunitu lepÅ¡iu, než sme ju naÅ¡li. + + + + ## [Ak uvidíte problém, nahláste ho.](#flag-problems) + + Moderátori diskusií majú Å¡peciálne právomoci – sú za toto fórum zodpovední. No vy tiež. S vaÅ¡ou pomocou môžu byÅ¥ moderátori v komunite sprostredkovateľmi, nie len správcami Äi políciou. + + Ak si vÅ¡imnete zlé správanie, nereagujte naň. OdpoveÄ zlé správanie podporuje tým, že ho prijme za rovnocenné, a navyÅ¡e vám berie energiu a ostatným Äas. Jednoducho ho nahláste. Ak takéto správanie nahlásia viacerí, budú proti nemu podniknuté kroky, Äi už automaticky alebo zásahom moderátora. + + Aby bolo možné komunitu udržaÅ¥, moderátori si vyhradzujú právo kedykoľvek a z akéhokoľvek dôvodu vymazaÅ¥ akýkoľvek obsah alebo úÄet. Moderátori nekontrolujú nové príspevky. Moderátori a prevádzkovatelia webovej lokality nenesú žiadnu zodpovednosÅ¥ za akýkoľvek obsah pridaný komunitou. + + + + ## [Stále buÄte zdvorilí](#be-civil) + + NiÄ nenarúša zdravú diskusiu tak ako hrubosÅ¥. + * BuÄte zdvorilí. Nepridávajte niÄ, Äo môže rozumný Älovek považovaÅ¥ za urážlivé, hanlivé, alebo za prejav nenávisti. + * Zachovávajte sluÅ¡nosÅ¥. Nepridávajte niÄ nemravné Äi so sexuálnym podtónom. + * Navzájom sa reÅ¡pektujte. Nikoho neobÅ¥ažujte, nekritizujte, nenapodobňujte a nezverejňujte ich súkromné informácie. + * ReÅ¡pektujte naÅ¡e fórum. Neuverejňujte spam ani inak fórum úmyselne nepoÅ¡kodzujte. + + Toto nie sú konkrétne výrazy s presnou definíciou – no vyhýbajte sa vÅ¡etkému, Äo takto môže Äo i len pôsobiÅ¥. Ak si nie ste istí, opýtajte sa sami seba, ako by ste sa cítili, keby váš príspevok uverejnili na titulnej strane New York Times. + + Toto je verejné fórum a vyhľadávaÄe naÅ¡e diskusie indexujú. Používajte taký jazyk, prepojenia a obrázky, ktoré budú prístupné pre vaÅ¡u rodinu a priateľov. + + + + ## [Udržujte poriadok](#keep-tidy) + + Usilujte sa umiestniÅ¥ veci na správne miesto, aby sme mohli stráviÅ¥ diskutovaním viac Äasu než upratovaním. Preto: + + * NezaÄínajte novú tému v nesprávnej kategórii. + * Neuverejňujte rovnaké veci vo viacerých témach. + * Neuverejňujte odpovede bez obsahu. + * Neodkláňajte tému tým, že ju v strede zmeníte. + * Príspevky nepodpisujte – ku každému príspevku sú pripojené informácie z vášho profilu. + + Nepridávajte príspevky s textom „+1“ Äi „súhlasím“. RadÅ¡ej použite tlaÄidlo „PáÄi sa mi“. Nemeňte príliÅ¡ smerovanie existujúcej témy, radÅ¡ej použite možnosÅ¥ odpovedaÅ¥ prostredníctvom súvisiacej témy. + + + + ## [Uverejňujte len vlastné veci](#stealing) + + Bez povolenia nesmiete uverejňovaÅ¥ niÄ digitálne, Äo patrí niekomu inému. Nesmiete uverejňovaÅ¥ opis a metódy krádeže duÅ¡evného vlastníctva niekoho iného (softvéru, videí, audio nahrávok, obrázkov) alebo iného poruÅ¡enia zákona, Äi na ne odkazovaÅ¥. + + + + ## [Poháňané Vami](#power) + + Túto webovú lokalitu spravuje [priateľský kolektív adminov a moderátorov](/about) spolu s *vami*, komunitou. Ak máte akékoľvek otázky o tom, ako by to tu malo fungovaÅ¥, otvorte novú tému v kategórii [O tejto stránke](/c/site-feedback) a môžeme o tom podiskutovaÅ¥! Ak sa vyskytne kritická alebo naliehavá záležitosÅ¥, ktorú nie je možné vyrieÅ¡iÅ¥ metatémou alebo nahlásením, kontaktujte nás prostredníctvom stránky [O fóre](/about). + + + + ## [Podmienky používania](#tos) + + Ãno, právne záležitosti sú nudné, no my musíme chrániÅ¥ seba a následne aj vás a vaÅ¡e údaje proti „tým zlým“. Máme [Podmienky používania](/tos), ktoré opisujú vaÅ¡e (a naÅ¡e) správanie a práva súvisiace s obsahom, súkromím a právnymi predpismi. Aby ste mohli túto službu využívaÅ¥, musíte súhlasiÅ¥ s naÅ¡imi [Podmienkami používania](/tos). tos_topic: title: "Podmienky používania" + body: | + Nasledujúce pravidlá a podmienky platia pre akékoľvek používanie webovej lokality %{company_domain} a jej obsahu, služieb a produktov, ktoré sú sprístupnené na tejto webovej lokalite vrátane (ale nie výhradne) softvéru fór %{company_domain}, podporných fór %{company_domain} a služieb hostingu %{company_domain} (Äalej ako „hosting“, vÅ¡etky menované spolu ako „webová lokalita“). Majiteľom a prevádzkovateľom webovej lokality je %{company_full_name} ("%{company_name}"). Webovú lokalitu môžete používaÅ¥ len za predpokladu bezvýhradného súhlasu so vÅ¡etkými pravidlami a podmienkami, ktoré sú tu obsiahnuté, a so vÅ¡etkými ostatnými pravidlami prevádzkovania (vrátane [pravidiel o ochrane súkromia](/privacy) a [pravidiel komunity webovej lokality](/faq) %{company_domain}) a procesmi, ktoré môžu byÅ¥ uverejnené na webovej lokalite (spolu ako „dohoda†). + + Prosíme vás, aby ste si poriadne preÄítali túto dohodu predtým, ako webovú lokalitu navÅ¡tívite alebo ju zaÄnete používaÅ¥. NavÅ¡tívením alebo používaním akejkoľvek Äasti webovej lokality súhlasíte s dodržiavaním vÅ¡etkých jej ustanovení. V prípade, že nesúhlasíte so vÅ¡etkými pravidlami a podmienkami používania webovej lokality, nemôžete ju navÅ¡tevovaÅ¥ alebo využívaÅ¥ jej služby. Ak sa tieto pravidlá a podmienky používania považujú za ponuku %{company_name}, jej prijatie je obmedzené na tieto podmienky. Webovú lokalitu majú dovolené navÅ¡tevovaÅ¥ iba osoby starÅ¡ie ako 13 rokov. + + + + ## [1. VaÅ¡e konto na %{company_domain}](#1) + + Ak si na tejto webovej lokalite vytvoríte konto, preberáte zodpovednosÅ¥ za zachovanie jeho bezpeÄnosti a máte plnú zodpovednosÅ¥ za Äinnosti, ktoré sa pod týmto kontom realizujú. %{company_name} musíte okamžite informovaÅ¥ o akomkoľvek neoprávnenom použití vášho konta alebo iných naruÅ¡eniach bezpeÄnosti. %{company_name} nebude niesÅ¥ zodpovednosÅ¥ za konanie ani opomenutie z vaÅ¡ej strany, teda ani za akékoľvek Å¡kody vzniknuté následkom takéhoto konania Äi opomenutia. + + + + ## [2. ZodpovednosÅ¥ prispievateľov](#2) + + Ak na tejto webovej lokalite prispievate materiálmi, uverejňujete na nej prepojenia alebo ju iným spôsobom využívate (alebo umožňujete tretej strane ju využívaÅ¥) na zverejňovanie materiálov (akýchkoľvek materiálov, teda „obsahu“), nesiete plnú zodpovednosÅ¥ za takýto obsah a Å¡kody ním spôsobené. Toto ustanovenie platí nezávisle od toho, Äi ide o textový obsah, grafický obsah, zvukový súbor alebo poÄítaÄový softvér. Zverejnením obsahu poskytujete záruku, že: + + sÅ¥ahovanie, kopírovanie a používanie obsahu neporuÅ¡uje vlastnícke práva, vrátane, nie vÅ¡ak výluÄne, autorských práv, patentov, obchodných znaÄiek alebo obchodných tajomstiev akejkoľvek tretej strany; + ak je váš zamestnávateľ držiteľom práva na vaÅ¡e duÅ¡evné vlastníctvo, buÄ (i) ste od svojho zamestnávateľa získali povolenie zverejniÅ¥ tento obsah, vrátane, nie vÅ¡ak výluÄne, akéhokoľvek softvéru, alebo (ii) sa váš zamestnávateľ vzdal vÅ¡etkých práv na tento obsah; + zabezpeÄili ste plný súlad s akýmikoľvek licenciami tretích strán, ktoré sa týkajú tohto obsahu, a vykonali ste vÅ¡etky kroky potrebné na to, aby ste koncovým používateľom oznámili vÅ¡etky požiadavky; + tento obsah neobsahuje ani neinÅ¡taluje žiadne vírusy, Äervy, malvér, trójske kone alebo iný Å¡kodlivý obsah; + obsah nie je spam, nie je generovaný náhodne alebo strojom a neobsahuje neetický alebo nevyžiadaný komerÄný obsah navrhnutý tak, aby hromadne smeroval návÅ¡tevníkov na externé webové lokality alebo zlepÅ¡il postavenie externých webových lokalít vo vyhľadávaÄoch, prípadne aby vykonával ÄalÅ¡ie nezákonné Äinnosti (napríklad prostredníctvom phishingu) alebo zavádzal príjemcov o zdroji materiálov (napríklad prostredníctvom spoofingu); + obsah nie je pornografickej povahy, neobsahuje vyhrážky, nepodnecuje k násiliu a nenarúša súkromie ani práva na ochranu osobnosti žiadnej tretej strany; + váš obsah nepropagujú nevyžiadané elektronické správy, buÄ v podobe spamových prepojení v diskusných skupinách, poÅ¡tových zoznamoch, blogoch Äi webových lokalitách, prípadne rozosielané inými spôsobmi nevyžiadanej propagácie; + váš obsah nenesie názov, ktorý by navádzal vaÅ¡ich Äitateľov k tomu, aby vás považovali za inú osobu Äi spoloÄnosÅ¥; a + v prípade obsahu, ktorý zahŕňa aj poÄítaÄový kód, ste presne zatriedili a/alebo opísali druh, povahu, použitie a dôsledky použitia materiálov, Äi už vás o to %{company_name} požiadala alebo nie. + + + + ## [3. Licencia na obsah od používateľov](#3) + + Príspevky používateľov sa uverejňujú pod licenciou [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). Bez toho, aby doÅ¡lo k obmedzeniu vyhlásení alebo záruk vychádzajúcich z tejto licencie, %{company_name} má právo (no nie povinnosÅ¥) (i) na základe vlastného uváženia odmietnuÅ¥ alebo odstrániÅ¥ akýkoľvek obsah, ktorý podľa %{company_name} poruÅ¡uje zásady %{company_name} alebo je akýmkoľvek spôsobom Å¡kodlivý Äi nežiaduci, alebo (ii) na základe vlastného uváženia zruÅ¡iÅ¥ alebo zamietnuÅ¥ jednotlivcovi alebo subjektu prístup k webovej lokalite. %{company_name} nie je povinná vrátiÅ¥ žiadne uhradené Äiastky. + + + + ## [4. Platba a obnovenie](#4) + + ### VÅ¡eobecné podmienky + + Na webovej lokalite môžu byÅ¥ dostupné voliteľné platené služby alebo inovácie. Pri využívaní voliteľných platených služieb alebo inovácií súhlasíte s tým, že %{company_name} uhradíte uvedené mesaÄné alebo roÄné poplatky. Poplatky sa uhrádzajú vopred na nasledujúce obdobie v deň, keÄ zaÄnete využívaÅ¥ službu alebo inováciu, a zabezpeÄujú používanie služby alebo inovácie na mesiac alebo rok podľa uvedených podmienok. Nie je možné požiadaÅ¥ o vrátenie týchto poplatkov. + + ### Automatické obnovenie + + Pokiaľ %{company_name} pred skonÄením predplateného obdobia neoznámite, že chcete službu alebo inováciu zruÅ¡iÅ¥, vaÅ¡e predplatné sa automaticky obnoví a udeľujete svoj súhlas s uhradením poplatku za roÄné alebo mesaÄné predplatné (vrátane prísluÅ¡ných daní) prostredníctvom kreditnej karty alebo akéhokoľvek iného platobného mechanizmu, ktorý máme vo vaÅ¡om prípade zaznaÄený. Predplatné môžete kedykoľvek zruÅ¡iÅ¥. + + + + ## [5. Služby](#5) + + ### Hostingové služby a služby podpory + + %{company_name} môže poskytnúť aj voliteľné služby webhostingu a podpory na základe podmienok používania každej takejto služby. Registrovaním konta na služby podpory alebo služby hostingu/podpory súhlasíte, že sa týmito podmienkami používania budete riadiÅ¥. + + + + ## [6. ZodpovednosÅ¥ návÅ¡tevníkov webovej lokality](#6) + + %{company_name} nekontroluje a ani nemá možnosÅ¥ kontrolovaÅ¥ vÅ¡etok materiál, vrátane poÄítaÄového softvéru, ktorý sa na webovej lokalite uverejní, a teda nemôže byÅ¥ zodpovedná za obsah, použitie a dôsledky používania takýchto materiálov. Prevádzkovaním webovej lokality %{company_name} nevyjadruje podporu pre materiál, ktorý je na nej uverejnený, ani to, že by tento materiál považovala za presný, užitoÄný Äi bezpeÄný. Je vaÅ¡ou zodpovednosÅ¥ou podniknúť potrebné kroky na to, aby ste seba a svoje poÄítaÄové systémy ochránili pred vírusmi, Äervmi, trójskymi koňmi a iným nebezpeÄným Äi Å¡kodlivým obsahom. Na webovej lokalite sa môže nachádzaÅ¥ urážlivý, vulgárny Äi inak nevhodný obsah, ale aj obsah s technickými nepresnosÅ¥ami a typografickými Äi inými chybami. Webová lokalita môže obsahovaÅ¥ aj materiál, ktorý narúša súkromie a právo na ochranu osobnosti, poÅ¡kodzuje autorské práva a iné vlastnícke práva tretích strán, prípadne sa na jeho sÅ¥ahovanie, kopírovanie a používanie vzÅ¥ahujú dodatoÄné podmienky používania, Äi už explicitne uvedené alebo nie. %{company_name} sa vzdáva akejkoľvek zodpovednosti za Å¡kody, ktoré návÅ¡tevníkom webovej lokality vzniknú jej používaním alebo sÅ¥ahovaním obsahu na nej uverejneného. + + + + ## [7. Obsah uverejnený na iných webových lokalitách](#7) + + Nekontrolujeme a ani nemáme možnosÅ¥ kontrolovaÅ¥ vÅ¡etok materiál, vrátane poÄítaÄového softvéru, ktorý sa uverejní na webovej lokalite a webových lokalitách, na ktoré %{company_domain} odkazuje a ktoré odkazujú na %{company_domain}. Nad týmito webovými lokalitami a webovými stránkami, ktoré nie sú zverejnené na doméne %{company_domain}, %{company_name} nemá kontrolu a nie je zodpovedná za ich obsah ani použitie. Odkazovaním na webovú lokalitu alebo webovú stránku mimo domény %{company_domain} %{company_name} nevyjadruje podporu pre takúto webovú lokalitu alebo webovú stránku. Je vaÅ¡ou zodpovednosÅ¥ou podniknúť potrebné kroky na to, aby ste seba a svoje poÄítaÄové systémy ochránili pred vírusmi, Äervmi, trójskymi koňmi a iným nebezpeÄným Äi Å¡kodlivým obsahom. %{company_name} sa vzdáva akejkoľvek zodpovednosti za Å¡kody, ktoré vám vzniknú používaním webových lokalít a webových stránok mimo domény %{company_domain}. + + + + ## [8.PoruÅ¡enie autorských práv a politika DMCA](#8) + + %{company_name} žiada ostatných, aby reÅ¡pektovali jej právo duÅ¡evného vlastníctva, a preto aj ona reÅ¡pektuje právo duÅ¡evného vlastníctva ostatných. Ak si myslíte, že materiály, ktoré sú uverejnené na webovej lokalite %{company_domain} alebo na ktoré webová lokalita odkazuje, poruÅ¡ujú vaÅ¡e autorské práva a ak má táto webová lokalita sídlo v USA, neváhajte to oznámiÅ¥ %{company_name} v súlade s jej pravidlami súvisiacimi s americkým autorským zákonom [Digital Millenium Copyright Act](http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) („DMCA“). %{company_name} bude na vÅ¡etky takéto oznámenia reagovaÅ¥ a zároveň, ak to bude potrebné alebo vhodné, odstráni materiál poruÅ¡ujúci autorské práva alebo znefunkÄní vÅ¡etky prepojenia naň. %{company_name} ukonÄí prístup návÅ¡tevníka a jeho používanie webovej lokality, ak za urÄitých okolností opakovane poruÅ¡uje autorské práva alebo iné práva duÅ¡evného vlastníctva %{company_name} alebo ostatných. V prípade takéhoto ukonÄenia prístupu nebude %{company_name} povinná návÅ¡tevníkovi vrátiÅ¥ poplatky, ktoré jej pred tým uhradil. + + + + ## [9. DuÅ¡evné vlastníctvo](#9) + + Táto dohoda na vás z %{company_name} nepresúva žiadne jej duÅ¡evné vlastníctvo a ani duÅ¡evné vlastníctvo tretích strán. VÅ¡etky práva, právne nároky a právny záujem, ktoré sa na toto duÅ¡evné vlastníctvo viažu, zostávajú (pokiaľ ide o zúÄastnené strany) %{company_name}. %{company_name}, %{company_domain}, logo %{company_domain} a vÅ¡etky ostatné ochranné známky, servisné znaÄky, grafika a logá použité v súvislosti s %{company_domain}, alebo webovou lokalitou sú ochrannými známkami alebo registrovanými ochrannými známkami %{company_name} alebo jej poskytovateľov licencie. Iné ochranné známky, servisné znaÄky, grafika a logá použité v súvislosti s webovou lokalitou môžu byÅ¥ ochrannými známkami tretích strán. VaÅ¡e využívanie webovej lokality vám nedáva právo ani licenciu na rozÅ¡irovanie alebo iné používanie akýchkoľvek ochranných známok %{company_name} alebo tretích strán. + + + + ## [10. Reklama](#10) + + %{company_name} si vyhradzuje právo zobrazovaÅ¥ reklamné informácie v rámci vášho obsahu s výnimkou situácií, keÄ ste si zakúpili službu odstránenia reklamy (Ad-Free Upgrade) alebo konto služieb (Services). + + + + ## [11. Autorstvo](#11) + + %{company_name} si vyhradzuje právo zobrazovaÅ¥ informácie o autorstve a prepojenia ako napríklad „Poháňa %{company_domain}“, meno autora témy Äi písiem v päte alebo paneli nástrojov v rámci vášho obsahu. Informácie o autorstve a panel nástrojov %{company_domain} nemožno odstrániÅ¥ bez ohľadu na zakúpené služby. + + + + ## [12. Úpravy](#12) + + %{company_name} si vyhradzuje právo podľa vlastného uváženia upravovaÅ¥ alebo nahrádzaÅ¥ akékoľvek Äasti tejto dohody. Je na vás, aby ste pravidelne kontrolovali prípadné zmeny tejto dohody. Používaním tejto webovej lokality a prístupom k nej po zverejnení akýchkoľvek úprav tejto dohody vyjadrujete súhlas s danými úpravami. %{company_name} môže v budúcnosti ponúkaÅ¥ nové služby alebo funkcie prostredníctvom webovej lokality (vrátane zverejnenia nových nástrojov a prostriedkov). Na nové funkcie alebo služby sa vzÅ¥ahujú ustanovenia tejto dohody. + + + + ## [13. Zánik prístupu, odstúpenie](#13) + + %{company_name} má právo s okamžitou platnosÅ¥ou, bez uvedenia dôvodu a bez predchádzajúceho upozornenia vám kedykoľvek odobraÅ¥ možnosÅ¥ prístupu k celej webovej lokalite, prípadne jej Äasti. Ak si želáte odstúpiÅ¥ od tejto dohody alebo zruÅ¡iÅ¥ konto %{company_domain} (ak takýto úÄet máte), staÄí len, aby ste prestali využívaÅ¥ webovú lokalitu. VÅ¡etky ustanovenia tejto dohody, ktoré majú zostaÅ¥ v platnosti aj po zániku resp. odstúpení od tejto dohody ostanú v platnosti, vrátane ustanovení vo veci vlastníctva, odopretia záruky, nároku na odÅ¡kodné a obmedzenie zodpovednosti. + + + + ## [14. Odopretie záruky](#14) + + Webová lokalita sa poskytuje „tak, ako je,“ a jej dodávatelia a poskytovatelia licencií týmto odopierajú akýkoľvek druh záruky, Äi už výslovnej, alebo vyplývajúcej, vrátane (nie vÅ¡ak výluÄne) záruk obchodovateľnosti, vhodnosti použitia na konkrétny úÄel a neporuÅ¡ovania práv. %{company_name} a ani jeho dodávatelia Äi poskytovatelia licencií nezaruÄujú, že obsah webovej lokality je bezchybný a že prístup k nemu bude nepretržitý. Ak tento text naozaj Äítate, tu je pre vás malá [pozornosÅ¥](http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html). Majte na pamäti, že obsah alebo služby sÅ¥ahujete Äi inak získavate z webovej lokality podľa vlastného uváženia a na vlastné riziko. + + + + ## [15. Obmedzenie zodpovednosti](#15) + + %{company_name}, jeho dodávatelia ani poskytovatelia licencií vo veci predmetu tejto dohody a vo vzÅ¥ahu k akejkoľvek zmluve, nedbanlivosti, objektívnej zodpovednosti alebo inej právnej teórii v žiadnom prípade nepreberajú zodpovednosÅ¥ za: (i) žiadne Å¡peciálne Äi neúmyselné Å¡kody alebo Å¡kody v dôsledku použitia poskytovaných služieb a obsahu; (ii) obstaranie náhradných výrobkov a služieb a s tým spojené náklady; (iii) za preruÅ¡enie prevádzky alebo poÅ¡kodenie údajov; ani (iv) za akékoľvek výdavky presahujúce sumy poplatkov, ktoré ste zaplatili %{company_name} poÄas obdobia dvanástich (12) mesiacov od vzniku pohľadávky. %{company_name} nemá žiadnu zodpovednosÅ¥ za akékoľvek zlyhanie alebo zdržanie spôsobené faktormi, na ktoré nemá relevantný vplyv. PlatnosÅ¥ vyššie uvedeného je obmedzená v súlade s prísluÅ¡nou právnou úpravou. + + + + ## [16. Výslovný súhlas](#16) + + Týmto vyjadrujete výslovný súhlas s tým, že (i) webovú lokalitu budete používaÅ¥ len v súlade s [pravidlami o ochrane súkromia](/privacy) %{company_name}, [pravidlami komunity](/guidelines), touto dohodou a vÅ¡etkými súvisiacimi právnymi predpismi (vrátane, nie vÅ¡ak výluÄne, akýchkoľvek zákonov a právnych predpisov vo vaÅ¡ej krajine, Å¡táte, meste Äi inej správnej jednotke súvisiacich so zásadami správania v online komunikácii a prijateľným obsahom, vrátane právnych predpisov vzÅ¥ahujúcich sa na prenos údajov z krajiny, v ktorej je umiestnené sídlo tejto webovej lokality alebo krajiny vášho bydliska) a zároveň (ii) používaním webovej lokality neporušíte autorské práva alebo neodcudzíte duÅ¡evné vlastníctvo akejkoľvek tretej strany. + + + + ## [17. Náhrada Å¡kody](#17) + + Týmto vyjadrujete súhlas s poskytnutím náhrady Å¡kody a ochranou pred stratou vo vzÅ¥ahu k %{company_name}, jej dodávateľom a poskytovateľom licencií a prísluÅ¡ným riaditeľom, pracovníkom, zamestnancom a zástupcom vo veci pohľadávok a nákladov, vrátane platieb za služby advokátskej kancelárie, vzniknutých pri používaní webovej lokality najmä (nie vÅ¡ak výluÄne) takým spôsobom, ktorý poruÅ¡uje ustanovenia tejto dohody. + + + + ## [18. ZávereÄné ustanovenia](#18) + + Táto dohoda predstavuje v celosti dohodu medzi %{company_name} a vami vo veci predmetu uvedeného v tejto dohode. Podmienky tejto dohody možno upraviÅ¥ len prostredníctvom písomného dodatku podpísaného povereným výkonným pracovníkom %{company_name}, alebo uverejnením revidovanej verzie tejto dohody %{company_name}. Ak prísluÅ¡né právne predpisy (ak také existujú) neustanovujú inak, táto dohoda, akýkoľvek prístup k webovej lokalite podlieha zákonom Å¡tátu Kalifornia, Spojené Å¡táty americké, s výnimkou ustanovení v rozpore s právnou úpravou, a akékoľvek vzniknuté spory vo veci uvedeného podliehajú jurisdikcii Å¡tátnych a federálnych súdov, ktoré sa nachádzajú v kraji San Francisco County Å¡tátu Kalifornia. S výnimkou vznesenia nároku na spravodlivé zaobchádzanie a prikázané úľavy alebo nárokov na duÅ¡evné vlastníctvo (ktoré môžu byÅ¥ vznesené na akomkoľvek súde s touto kompetenciou bez zloženia zábezpeky), akékoľvek spory, ktoré vzniknú v súvislosti s touto dohodou budú s koneÄnou platnosÅ¥ou prebiehaÅ¥ a rozhodnutia o nich sa uskutoÄnia v súlade s dokumentom Comprehensive Arbitration Rules of the Judical Arbitration and Mediation Service, Inc. („JAMS“) a rozhodovaÅ¥ bude komisia troch rozhodcov pridelených v súlade s týmto dokumentom. Rozhodcovské konanie sa uskutoÄní v meste San Francisco v Å¡táte Kalifornia a bude prebiehaÅ¥ v anglickom jazyku, priÄom rozhodnutie z tohto konania možno uplatňovaÅ¥ na akomkoľvek súde. ÚspeÅ¡ná strana pri akomkoľvek konaní alebo procese súvisiacom s uplatnením tejto dohody má nárok na náhradu nákladov a súdnych trov. Ak sa akákoľvek ÄasÅ¥ tejto dohody považuje za neplatnú alebo neuplatniteľnú, daná ÄasÅ¥ sa vykladá v súlade s pôvodným zámerom zúÄastnených strán, priÄom platnosÅ¥ a úÄinnosÅ¥ zvyÅ¡ných Äastí zostáva zachovaná.  Deklarácia o oslobodení ktorejkoľvek zo strán od akéhokoľvek ustanovenia tejto dohody alebo akéhokoľvek poruÅ¡enia neoslobodzuje od danej podmienky Äi jej poruÅ¡enia. Svoje práva v rámci tejto dohody môžete prenechaÅ¥ akejkoľvek strane, ktorá súhlasí s týmto úkonom a prijíma záväzky z toho vyplývajúce, priÄom %{company_name} môže svoje práva v súvislosti s touto dohodou prenechaÅ¥ inej strane bez podmienok. Táto dohoda zaväzuje a platí pre zúÄastnené strany, ich nástupnícke subjekty a osoby Äi subjekty, ktorým zúÄastnené strany prenechali svoje práva. + + Tento dokument je zverejnený s licenciou CC-BY-SA. Posledná úprava bola vykonaná dňa 31. mája 2013. + + Tento dokument vychádza z [Podmienok používania služby WordPress]((http://en.wordpress.com/tos/)). privacy_topic: title: "Ochrana súkromia" + body: "\n\n## [Aký druh údajov získavame?](#collect)\n\nPo tom, ako sa zaregistrujete na tejto webovej lokalite, získavame vaÅ¡e údaje, keÄ sa zúÄastňujete fóra Äítaním, prispievaním, písaním a hodnotením zdieľaného obsahu. \nPri registrácií na naÅ¡ej webovej lokalite vás môžeme požiadaÅ¥ o zadanie vášho mena a e-mailovej adresy. NaÅ¡u webovú lokalitu je možné navÅ¡tevovaÅ¥ aj bez registrácie. VaÅ¡a e-mailová adresa bude overená potvrdzovacím e-mailom, ktorý bude obsahovaÅ¥ jednorazový odkaz. Kliknutím naň potvrdíte, že ste používateľom zadanej e-mailovej adresy. \nPri registrácií a uverejňovaní príspevkov zaznamenávame IP adresu, z ktorej bol príspevok odoslaný. Rovnako môžeme uchovaÅ¥ údaje zo serverov, ktoré obsahujú IP adresu pre každú žiadosÅ¥ odoslanú na náš server.\n\n\n\n## [Na Äo tieto údaje využívame?](#use)\n\nAkékoľvek údaje, ktoré o vás získame, môžu byÅ¥ využité nasledovne:\n\n* Na personalizáciu obsahu – údaje o vás nám pomáhajú lepÅ¡ie reagovaÅ¥ na vaÅ¡e individuálne potreby\n* Na vylepÅ¡enie webovej lokality – neustále pracujeme na zlepÅ¡ovaní ponuky naÅ¡ej webovej lokality na základe vaÅ¡ich údajov a spätnej väzby\n* Na zlepÅ¡enie zákazníckych služieb – vaÅ¡e údaje nám pomáhajú efektívnejÅ¡ie reagovaÅ¥ na používateľské požiadavky a prípadnú zákaznícku podporu\n* Na odosielanie pravidelných e-mailov – vami uvedená e-mailová adresa môže byÅ¥ použitá na rozposielanie informácií, vami zvolených upozornení na zmeny v obsahu jednotlivých tém, prípadne na správy smerujúce na vaÅ¡e používateľské konto, odpovede na vaÅ¡e otázky alebo požiadavky. \n\n\n\n## [Ako u nás funguje ochrana údajov?](#protect)\n\nVyužívame rôzne ochranné opatrenia, aby sme zaruÄili ochranu vaÅ¡ich osobných údajov po tom, ako ich uvediete alebo si k nim vyžiadate prístup.\n\n\n\n## [Ako osobné údaje uchovávame?](#data-retention)\n\nBudeme sa snažiÅ¥: \nUchovaÅ¥ údaje zo servera, ktoré obsahujú IP adresu vÅ¡etkých žiadostí na tento server, maximálne po dobu 90 dní.\nUchovaÅ¥ IP adresy spojené s registrovanými používateľmi a ich príspevkami maximálne po dobu 5 rokov. \n\n\n\n## [Používame cookies?](#cookies)\n\nÃno. Cookies sú malé súbory, ktoré webová lokalita alebo jej poskytovateľ služieb uloží na harddisk vášho poÄítaÄa pomocou internetového prehliadaÄa (pokiaľ to povolíte). Cookies umožňujú webovej lokalite rozpoznaÅ¥ váš prehliadaÄ a pokiaľ máte založený úÄet, tak ho s ním prepoja. \nPoužívame cookies by sme mohli identifikovaÅ¥ a uložiÅ¥ vaÅ¡e preferencie pre budúce návÅ¡tevy webovej lokality a zhromaždiÅ¥ súbor údajov o návÅ¡tevnosti a interakciách webovej lokality, aby sme v budúcnosti mohli zabezpeÄiÅ¥ lepÅ¡iu používateľskú skúsenosÅ¥ a nástroje. Môžeme tiež kontaktovaÅ¥ poskytovateľa služieb, ktorý nám ako tretia strana pomôže lepÅ¡ie porozumieÅ¥ preferenciám návÅ¡tevníkom naÅ¡ej webovej lokality. Takýto poskytovateľ služieb má dovolené v naÅ¡om mene narábaÅ¥ s nami získanými údajmi výhradne za úÄelom zlepÅ¡enia naÅ¡ich služieb. \n\n\n\n## [Sprístupňujeme informácie tretím stranám?](#disclose)\n\nNeobchodujeme, nevymieňame a žiadnym iným spôsobom neposúvame tretím stranám informácie, ktoré je možné priradiÅ¥ k vaÅ¡ej osobe. Výnimkou sú dôverné tretie strany, ktoré nám pomáhajú s prevádzkovaním naÅ¡ej webovej aktivity, naÅ¡imi aktivitami alebo s poskytovaním služieb používateľom a ktoré sa zaviazali, že s týmito údajmi budú zaobchádzaÅ¥ dôverne. Informácie môžeme uverejniÅ¥ v prípadoch, keÄ je to v súlade so zákonom, vymáhaním pravidiel naÅ¡ich stránok, s ochranou naÅ¡ich práv alebo práv iných, ako aj s ochranou majetku a bezpeÄnosti. Údaje, ktoré nemožno spojiÅ¥ s konkrétnou osobou môžu byÅ¥ poskytnuté tretím stranám na marketingové, reklamné alebo iné úÄely. \n\n\n\n## [Prepojenia tretích strán](#third-party)\n\nPríležitostne a podľa nášho uváženia môžeme na naÅ¡ej webovej lokalite uverejňovaÅ¥ produkty a služby tretích strán. Tieto tretie strany majú svoje vlastné, nezávislé podmienky o ochrane údajov a preto nenesieme žiadnu zodpovednosÅ¥ za obsah a aktivity týchto strán. V každom prípade nám vÅ¡ak ide o ochranu integrity naÅ¡ej webovej lokality a preto uvítame akúkoľvek spätnú väzbu týkajúcu sa týchto strán. \n\n\n\n## [ReÅ¡pektovanie zákona o ochrane súkromia detí v rámci online režimov](#coppa)\n\nVÅ¡etky produkty a služby na naÅ¡ej webovej lokalite sú urÄené osobám vo veku minimálne 13 rokov. Pokiaľ je tento server v USA a vy máte menej ako 13 rokov, vzhľadom na [Zákon o ochrane súkromia detí v rámci online režimov](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act) nesmiete používaÅ¥ túto webovú lokalitu. \n\n\n\n## [Súkromie je chránené len online](#online)\n\nTieto pravidlá ochrany súkromia online platia iba pre informácie, ktoré zozbierala naÅ¡a webová lokalita a nevzÅ¥ahuje sa na informácie zozbierané v offline režime.\n\n\n\n## [Váš súhlas](#consent)\n\nPoužívaním naÅ¡ich stránok súhlasíte s naÅ¡imi pravidlami o ochrane súkromia. \n\n\n\n## [Zmeny pravidiel o ochrane súkromia](#changes)\n\nAk sa rozhodneme zaviesÅ¥ akékoľvek zmeny v oblasti ochrany súkromia, uverejníme túto informáciu na naÅ¡ej webovej lokalite. \nTento dokument je zverejnený s licenciou CC-BY-SA. Posledná úprava bola vykonaná dňa 31. mája 2013.\n" badges: first_mention: name: Prvá zmienka - long_description: "Tento odznak je udelený, keÄ prvýkrát zmienite niekoho @meno vo VaÅ¡om príspevku. Každá zmienka generuje upozornenie danej osobe, takže bude vedieÅ¥ o VaÅ¡om príspevku. Jednoducho zaÄnite písaÅ¥ @ (zavináÄ) aby ste zmienili používateľa alebo, ak je to povolené, skupinu - Je to pohodlný spôsob ako upútaÅ¥ ich pozornosÅ¥." admin_login: success: "Email odoslaný" email_input: "Email administrátora" diff --git a/config/locales/server.sl.yml b/config/locales/server.sl.yml index fc9c6dc901..62834bc7af 100644 --- a/config/locales/server.sl.yml +++ b/config/locales/server.sl.yml @@ -40,15 +40,15 @@ sl: not_an_integer: mora biti celo Å¡tevilo odd: mora biti liho Å¡tevilo too_long: - few: je predolgo (najveÄ %{count} znakov) one: je predolgo (najveÄ 1 znak) - other: je predolgo (najveÄ %{count} znakov) two: je predolgo (najveÄ 2 znaka) + few: je predolgo (najveÄ %{count} znakov) + other: je predolgo (najveÄ %{count} znakov) too_short: - few: je prekratko (minimum je %{count} znakov) one: je prekratko (minimum je 1 znak) - other: je prekratko (minimum je %{count} znakov) two: je prekratko (minimum sta 2 znaka) + few: je prekratko (minimum je %{count} znakov) + other: je prekratko (minimum je %{count} znakov) activemodel: errors: <<: *errors diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index 71baba1a3d..28550a07c9 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -76,18 +76,18 @@ sq: start_discussion: "Fillo Diskutim" continue: "Vazhdo Diskutimin" more_replies: - one: 'edhe 1 përgjigje ' - other: janë %{count} përgjigje + one: "edhe 1 përgjigje " + other: "janë %{count} përgjigje" loading: "Duke Ngarkuar Diskutimin..." permalink: "Permalink" in_reply_to: "â–¶ %{username}" replies: - one: 1 përgjigje - other: '%{count} përgjigje' + one: "1 përgjigje" + other: "%{count} përgjigje" no_mentions_allowed_newuser: "Na vjen keq, anëtarët e rinj nuk mund të citojnë anëtarë të tjerë." too_many_mentions_newuser: - one: Na vjen keq, anëtarët e rinj mund të citojnë vetëm 1 anëtar në një postim. - other: Na vjen keq, anëtarët e rinj mund të citojnë vetëm %{count} anëtarë në një postim. + one: "Na vjen keq, anëtarët e rinj mund të citojnë vetëm 1 anëtar në një postim." + other: "Na vjen keq, anëtarët e rinj mund të citojnë vetëm %{count} anëtarë në një postim." no_images_allowed: "Na vjen keq, anëtarët e rinj nuk kanë të drejtë të vendosin imazhe në një postim." spamming_host: "Na vjen keq, you cannot post a link to that host." invalid_characters: "përmban karaktere jo të vlefshëm" @@ -120,8 +120,8 @@ sq: trust_level_4: "trust_level_4" education: until_posts: - one: 1 postim - other: '%{count} postime' + one: "1 postim" + other: "%{count} postime" 'new-topic': | Mirë se vini te %{site_name} — **faleminderit që nisët një bisedë të re!** @@ -169,27 +169,6 @@ sq: staff_category_name: "Stafi" lounge_welcome: title: "Mirë se vini në Lounge" - body: |2 - - Congratulations! :confetti_ball: - - If you can see this topic, you were recently promoted to **regular** (trust level 3). - - You can now … - - * Edit the title of any topic - * Change the category of any topic - * Have all your links followed ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) is removed) - * Access a private Lounge category only visible to users at trust level 3 and higher - * Hide spam with a single flag - - Here's the [current list of fellow regulars](/badges/3/regular). Be sure to say hi. - - Thanks for being an important part of this community! - - (For more information on trust levels, [see this topic][trust]. Please note that only members who continue to meet the requirements over time will remain regulars.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Rreth kategorisë %{category}" errors: @@ -200,9 +179,6 @@ sq: cannot_delete: uncategorized: "Nuk fshij dot kategorinë \"Uncategorized\"" has_subcategories: "Nuk e fshini dot këtë kategori sepse ajo ka nënkategori. " - topic_exists: - one: Nuk e fshini dot këtë kategori sepse këtu ka 1 temë. Tema më e vjetër është %{topic_link}. - other: Nuk e fshini dot këtë kategori sepse këtu ka %{count} tema. Tema më e vjetër është %{topic_link}. topic_exists_no_oldest: "Nuk e fshini dot këtë kategori sepse numri i temave është %{count}." trust_levels: newuser: @@ -217,85 +193,85 @@ sq: title: "udhëheqës" rate_limiter: hours: - one: 1 orë - other: '%{count} orë' + one: "1 orë" + other: "%{count} orë" minutes: - one: 1 minutë - other: '%{count} minuta' + one: "1 minutë" + other: "%{count} minuta" seconds: - one: 1 sekondë - other: '%{count} sekonda' + one: "1 sekondë" + other: "%{count} sekonda" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1muaj - other: '%{count}muaj' + one: "1muaj" + other: "%{count}muaj" x_months: - one: 1muaj - other: '%{count}muaj' + one: "1muaj" + other: "%{count}muaj" about_x_years: - one: 1y - other: '%{count}y' + one: "1y" + other: "%{count}y" over_x_years: - one: '> 1v' - other: '> %{count}v' + one: "> 1v" + other: "> %{count}v" almost_x_years: - one: 1v - other: '%{count}v' + one: "1v" + other: "%{count}v" distance_in_words_verbose: half_a_minute: "tani" less_than_x_seconds: - one: tani - other: tani + one: "tani" + other: "tani" x_seconds: - one: 1 sekondë më parë - other: '%{count} sekonda më parë' + one: "1 sekondë më parë" + other: "%{count} sekonda më parë" less_than_x_minutes: - one: më pak se 1 minutë më parë - other: më pak se %{count} minuta më parë + one: "më pak se 1 minutë më parë" + other: "më pak se %{count} minuta më parë" x_minutes: - one: 1 minutë më parë - other: '%{count} minuta më parë' + one: "1 minutë më parë" + other: "%{count} minuta më parë" about_x_hours: - one: para 1 ore - other: para %{count} orësh + one: "para 1 ore" + other: "para %{count} orësh" x_days: - one: para 1 dite - other: para %{count} ditësh + one: "para 1 dite" + other: "para %{count} ditësh" about_x_months: - one: rreth 1 muaj më parë - other: rreth %{count} muaj më parë + one: "rreth 1 muaj më parë" + other: "rreth %{count} muaj më parë" x_months: - one: 1 muaj më parë - other: '%{count} muaj më parë' + one: "1 muaj më parë" + other: "%{count} muaj më parë" about_x_years: - one: rreth 1 vit më parë - other: rreth %{count} vjet më parë + one: "rreth 1 vit më parë" + other: "rreth %{count} vjet më parë" over_x_years: - one: mbi 1 vit më parë - other: mbi %{count} vite më parë + one: "mbi 1 vit më parë" + other: "mbi %{count} vite më parë" almost_x_years: - one: pothuajse 1 vit më parë - other: pothuajse %{count} vite më parë + one: "pothuajse 1 vit më parë" + other: "pothuajse %{count} vite më parë" password_reset: no_token: "Ndjesë, kjo lidhje për ndryshimin e fjalëkalimit është shumë e vjetër. Kliko butonin 'Identifikohu' dhe përdorni 'Kam harruar fjalëkalimin' për të marrë një lidhje të re." update: 'Rifresko Fjalëkalimin' @@ -348,10 +324,6 @@ sq: title: 'Pëlqe' description: 'Më pëlqen ky postim' long_form: 'pëlqeu këtë' - vote: - title: 'Voto' - description: 'Voto për këtë postim' - long_form: 'votoi për këtë postim' topic_flag_types: spam: title: 'Spam' @@ -464,8 +436,6 @@ sq: num_users: "Users" top_referred_topics: title: "Top Referred Topics" - xaxis: "Topic" - num_clicks: "Clicks" page_view_anon_reqs: title: "Anonim" xaxis: "Ditë" @@ -514,7 +484,6 @@ sq: xaxis: "Day" yaxis: "Total" mobile_visits: - title: "User Visits" xaxis: "Ditë" yaxis: "Numri i vizitave" dashboard: @@ -594,7 +563,6 @@ sq: post_menu: "Determine which items appear on the post menu, and in what order. Example like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "The menu items to hide by default in the post menu unless an expansion ellipsis is clicked on." share_links: "Determine which items appear on the share dialog, and in what order." - track_external_right_clicks: "Track external links that are right clicked (eg: open in new tab) disabled by default because it rewrites URLs" site_contact_username: "A valid staff username to send all automated messages from. If left blank the default System account will be used." send_welcome_message: "Send all new users a welcome message with a quick start guide." suppress_reply_directly_below: "Don't show the expandable reply count on a post when there is only a single reply directly below this post." @@ -737,7 +705,6 @@ sq: min_first_post_typing_time: "Minimum amount of time in milliseconds a user must type during first post, if threshold is not met post will automatically enter the needs approval queue. Set to 0 to disable (not recommended)" reply_by_email_enabled: "Enable replying to topics via email." reply_by_email_address: "Template for reply by email incoming email address, for example: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "Prevent Discourse from sending any kind of emails" strip_images_from_short_emails: "Strip images from emails having size less than 2800 Bytes" short_email_length: "Short email length in Bytes" pop3_polling_enabled: "Poll via POP3 for email replies." @@ -826,43 +793,40 @@ sq: not_seen_in_a_month: "Welcome back! We haven't seen you in a while. These are the most popular topics since you've been away." move_posts: new_topic_moderator_post: - one: 'A post was split to a new topic: %{topic_link}' - other: '%{count} posts were split to a new topic: %{topic_link}' + one: "A post was split to a new topic: %{topic_link}" + other: "%{count} posts were split to a new topic: %{topic_link}" existing_topic_moderator_post: - one: 'A post was merged into an existing topic: %{topic_link}' - other: '%{count} posts were merged into an existing topic: %{topic_link}' - change_owner: - post_revision_text: "Ownership transferred from %{old_user} to %{new_user}" - deleted_user: "a deleted user" + one: "A post was merged into an existing topic: %{topic_link}" + other: "%{count} posts were merged into an existing topic: %{topic_link}" topic_statuses: archived_enabled: "This topic is now archived. It is frozen and cannot be changed in any way." archived_disabled: "This topic is now unarchived. It is no longer frozen, and can be changed." closed_enabled: "This topic is now closed. New replies are no longer allowed." closed_disabled: "This topic is now opened. New replies are allowed." autoclosed_message_max_posts: - one: Ky mesazh u mbyll automatikisht pasi arriti kufirin e lejueshëm të 1 përgjigjeje. - other: Ky mesazh u mbyll automatikisht pasi arriti kufirin e lejueshëm të %{count} përgjigjeve. + one: "Ky mesazh u mbyll automatikisht pasi arriti kufirin e lejueshëm të 1 përgjigjeje." + other: "Ky mesazh u mbyll automatikisht pasi arriti kufirin e lejueshëm të %{count} përgjigjeve." autoclosed_topic_max_posts: - one: Kjo temë është mbyllur automatikisht pasi arriti kufirin e lejueshëm të 1 përgjigjeje. - other: Kjo temë është mbyllur automatikisht pasi arriti kufirin e lejueshëm të %{count} përgjigjeve. + one: "Kjo temë është mbyllur automatikisht pasi arriti kufirin e lejueshëm të 1 përgjigjeje." + other: "Kjo temë është mbyllur automatikisht pasi arriti kufirin e lejueshëm të %{count} përgjigjeve." autoclosed_enabled_days: - one: This topic was automatically closed after 1 day. New replies are no longer allowed. - other: This topic was automatically closed after %{count} days. New replies are no longer allowed. + one: "This topic was automatically closed after 1 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. - other: This topic was automatically closed after %{count} hours. New replies are no longer allowed. + one: "This topic was automatically closed after 1 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. - other: This topic was automatically closed after %{count} minutes. New replies are no longer allowed. + one: "This topic was automatically closed after 1 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. - other: This topic was automatically closed %{count} days after the last reply. New replies are no longer allowed. + one: "This topic was automatically closed 1 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. - other: This topic was automatically closed %{count} hours after the last reply. New replies are no longer allowed. + one: "This topic was automatically closed 1 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. - other: This topic was automatically closed %{count} minutes after the last reply. New replies are no longer allowed. + one: "This topic was automatically closed 1 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: "This topic is now opened. New replies are allowed." autoclosed_disabled_lastpost: "This topic is now opened. New replies are allowed." pinned_enabled: "This topic is now pinned. It will appear at the top of its category until it is unpinned by staff for everyone, or by individual users for themselves." @@ -883,7 +847,6 @@ sq: reserved_username: "Ky emër nuk lejohet." missing_user_field: "You have not completed all the user fields" user: - no_accounts_associated: "No accounts associated" username: short: "must be at least %{min} characters" long: "must be no more than %{max} characters" @@ -897,8 +860,8 @@ sq: max_new_accounts_per_registration_ip: "New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member." flags_reminder: subject_template: - one: 1 sinjalizim në pritje për t'u trajtuar - other: '%{count} sinjalizime në pritje për t''u trajtuar' + one: "1 sinjalizim në pritje për t'u trajtuar" + other: "%{count} sinjalizime në pritje për t'u trajtuar" invite_password_instructions: subject_template: "Vendos fjalëkalimin për llogarinë tek %{site_name}" admin_confirmation_mailer: @@ -946,8 +909,8 @@ sq: We couldn't find your reply in the email. **Make sure your reply is at the top of the email** -- we can't process inline replies. pending_users_reminder: subject_template: - one: 1 user waiting for approval - other: '%{count} users waiting for approval' + one: "1 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. @@ -977,10 +940,8 @@ sq: title: "Çregjistrohuni" description: "Nuk të interesojnë këto emaila? S'ka problem! Kliko më poshtë për të anuluar abonimin:" reply_by_email: "[Shiko Temën](%{base_url}%{url}) ose përgjigjju këtij email-i për të postuar." - reply_by_email_pm: "[Shiko Mesazhin](%{base_url}%{url}) ose përgjigjju këtij email-i për të vazhduar bisedën." only_reply_by_email: "Përgjigjju këtij email-i për të vazhduar." visit_link_to_respond: "[Shiko Temën](%{base_url}%{url}) për tu përgjigjur." - visit_link_to_respond_pm: "[Shiko Mesazhin](%{base_url}%/{url}) për tu përgjigjur." posted_by: "Postuar nga %{username} më %{post_date}" user_invited_to_private_message_pm: text_body_template: | @@ -1127,7 +1088,6 @@ sq: recent_topics: "Më të fundit" see_more: "Më shumë" search_title: "Kërko në këtë faqe" - search_google: "Google" terms_of_service: title: "Kushtet e shërbimit" signup_form_message: 'I have read and accept the Terms of Service.' @@ -1142,22 +1102,6 @@ sq: images: too_large: "Sorry, the image you are trying to upload is too big (maximum size is %{max_size_kb}KB), please resize it and try again." size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?" - email_log: - post_user_deleted: "Përdoruesi i këtij postimi është fshirë." - no_user: "Can't find user with id %{user_id}" - anonymous_user: "User is anonymous" - suspended_not_pm: "User is suspended, not a message" - seen_recently: "User was seen recently" - post_not_found: "Can't find a post with id %{post_id}" - notification_already_read: "The notification this email is about has already been read" - topic_nil: "post.topic is nil" - post_deleted: "autori e ka fshirë postimin" - user_suspended: "user was suspended" - already_read: "user has already read this post" - message_blank: "message is blank" - message_to_blank: "message.to is blank" - text_part_body_blank: "text_part.body is blank" - body_blank: "përmbajtja është bosh" color_schemes: base_theme_name: "Baza" about: "Rreth" @@ -1179,70 +1123,40 @@ sq: editor: name: Redaktor description: Redaktori i parë i postimit - long_description: | - Kjo stemë jepet kur ndryshoni një nga postimet tuaja për herë të parë. Ndërkohë që nuk do jetë e mundur të ndryshoni postimet tuaja përgjithmonë, ndryshimi është gjithmonë një ide e mirë - ju mund të përmirësoni postimet tuaja, të korigjoni gabime të vogla, apo të shtoni çdo gjë që mungonte nga postimi i parë. Ndryshojini postimet që t'i bëni akoma më të mira! basic_user: name: Anëtar i Thjeshtë - description: "Ka të drejtat bazë të një anëtari në këtë komunitet Informacion shtesë në anglisht" - long_description: | - Kjo stemë jepet kur ju arrini nivelin e bisedës 1. Falemindeit që jeni përreth prej ca kohësh dhe që lexoni disa tema për të mësuar më tepër rreth komunitetit tonë. Limitet e përdoruesit të ri janë hequr, keni mundësi të përdorni të gjitha aftësitë kryesore të komunitetit, si mesazhet private, sinjalizimet, ndryshim për wiki, dhe aftësinë për të postuar disa imazhe njëherazi dhe lidhje. member: name: Anëtar - description: "U dha mundësia për ftesa, mesazhe në grup, më shumë pëlqime" - long_description: | - Kjo stemë jepet kur ju arrini nivelin e besimit 2. Faleminderit që jeni pjesë prej më shumë se disa javësh e komunitetit tonë. Ju tashmë mund të dërgoni ftesa nga faqja juaj e përdoruesit ose nga tema të veçanta, të krijoni mesazhe në grup, dhe të keni ca pëlqime më shumë në ditë. regular: name: I zakonshëm - description: "U dha mundësia për ri-kategorizim, ri-emërtim, lidhje ndjekëse, wiki, dhe më shumë pëlqime" - long_description: | - Kjo stemë jepet kur ju arrini nivelin e besimit 3. Faleminderit që jeni pjesë e komutetit tonë prej disa muajsh. Ju jeni tashmë një prej lexuesve më aktivë, dhe një bashkëpunëtor i besueshëm që përmirëson komunitetin tonë. Ju mundet tashmë të ri-kategorizoni dhe ri-emëroni temat, të keni cilësime të mëtejshme për sinjalizime spam-esh, të keni hyrje në zona private të faqes, gjithashtu dhe më tepër pëlqime ditore. leader: name: Udhëheqës - description: "Dhënë mundësia për ndryshim të gjithanshëm, ngjitje në krye, mbyllje, arkivim, ndarje dhe ngjitje, më tepër pëlqime" - long_description: | - Kjo stemë jepet kur ju arrini nivelin e besimit 4. Jeni një udhëheqës në këtë komunitet si i përzgjedhur nga stafi, dhe ju jeni një shembull për pjesën tjetër të anëtarëve me veprimet dhe fjalët tuaja këtu. Ju keni mundësinë të ndryshoni të gjitha postimet, të aftë për moderime të tjera siç janë ngjitja në krye, mbyllja, çlistimi, arkivimi, ndarja dhe ngjitja, dhe ju keni tonelata pëlqimesh ditore. welcome: name: Mirë se vini description: Mori një pëlqim - long_description: | - Kjo stemë jepet kur merrni pëlqimin e parë për një postim. Urime, keni postuar diçka të cilën anëtarët e komunitetit e gjetën interesante, fantastike apo të dobishme! autobiographer: name: Autobiograf anniversary: name: Përvjetor description: "Anëtar aktiv për një vit, postoi të paktën një herë" - long_description: | - Kjo stemë jepet kur keni qenë një anëtar për një vit me të paktën një postim për atë vit. Faleminderit që jeni përreth dhe jepni ndihmën tuaj për komunitetin tonë. Ne nuk mund t'ia dilnim pa ju. nice_post: name: Përgjigje e mirë description: Mori 10 pëlqime në një përgjigje - long_description: | - Kjo stemë jepet kur përgjigja juaj merr 10 pëlqime. Përgjigja juaj ishte vërtet e goditur për komunitetit dhe ndihmoi në ecjen e bisedës më tej! good_post: name: Përgjigje goxha e mirë description: Mori 25 pëlqime në një përgjigje - long_description: | - Kjo stemë jepet kur përgjigja juaj merr 25 pëlqime. Përgjigja juaj ishte e jashtëzakonshme dhe e shndërroi bisedën më të pëlqyeshme për këdo! great_post: name: Përgjigje shumë e mirë description: Mori 50 pëlqime në një përgjigje - long_description: | - Kjo stemë jepet kur përgjigja juaj merr 50 pëlqime. Uau! Përgjigja juaj ishte frymëzuese, interesante, për të qeshur, ose e mprehtë dhe komuniteti e pëlqeu jashtë mase! nice_topic: name: Temë e mirë description: Mori 10 pëlqime në një temë - long_description: | - Kjo stemë jepet kur tema juaj merr 10 pëlqime. Hej, ju nisët një bisedë interesante që komuniteti e shijoi! good_topic: name: Temë goxha e mirë description: Mori 25 pëlqime në një temë - long_description: | - Kjo stemë jepet kur tema juaj merr 25 pëlqime. Ju nisët një bisedë të zjarrtë për të cilën komuniteti u mblodh përreth dhe e pëlqeu! great_topic: name: Temë shumë e mirë description: Mori 50 pëlqime në një temë - long_description: | - Kjo stemë jepet kur tema juaj merr 50 pëlqime. Ju nisët një bisedë interesante dhe komuniteti e shijoi bisedën dinamike që ndoqi! nice_share: name: Shpërndarje e mirë description: Ndau një postim me 25 vizitorë unikë @@ -1251,13 +1165,9 @@ sq: good_share: name: Shpërndarje goxha e mirë description: Ndau një postim me 300 vizitorë unikë - long_description: | - Kjo stemë jepet kur shpërdan një lidhje që është klikuar nga 300 vizitorë të jashtëm. Punë e paqme! Keni reklamuar një diskutim të mire tek një grup njerëzish të panjohur dhe keni ndihmuar në rritjen e këtij komuniteti. great_share: name: Shpërndarje shumë e mirë description: Ndau një postim me 1000 vizitorë unikë - long_description: | - Kjo stemë jepet kur shpërdan një lidhje që është klikuar nga 1000 vizitorë të jashtëm. Uau! Keni reklamuar një bisedë interesante tek një lexues i shumtë dhe i ri, dhe ndihmuat mjaft në rritjen e komunitetit! first_like: name: Pëlqimi i Parë description: Pëlqeu një postim @@ -1266,21 +1176,15 @@ sq: first_flag: name: Sinjalizimi i parë description: Sinjalizoi një postim - long_description: | - Kjo stemë jepet kur për herë të parë sinjalizoni një postim. Sinjalizimi është mënyra se si ndihmojmë në mbajtjen pastër të faqes për këdo. Nëse vini re ndonjë postim që ka nevojë për vëmendjen e një moderatori për cilëndo arsye, ju lutem mos ngurroni të sinjalizoni. Gjithashtu mund të sinjalizoni duke u nisur një mesazh personal përdoruesve nëse shihni diçka që nuk shkon me postimin e tyre. Nëse shihni një problem, :flag_black: sinjalizojeni! promoter: name: Promotor description: Ftoi një anëtar të ri në faqe campaigner: name: Ambasador description: Ftoi 3 anëtarë të thjeshtë - long_description: | - Kjo stemë jepet kur ke ftuar 3 persona që në vazhdim, kanë shpenzuar kohë mjaftueshëm në faqe për t'u bërë anëtarë të thjeshtë. Një komunitet kumbues ka nevojë për anëtarë të rinj që marrin pjesë rregullisht dhe i shtojnë zëra të rinj bisedave. champion: name: Mega-ambasador description: Ftoi 5 anëtarë - long_description: | - Kjo stemë jepet kur ke ftuar 5 persona që në vazhdim, kanë shpenzuar kohë mjaftueshëm në faqe për t'u bërë anëtarë të plotë. Uau! Faleminderit për zgjerimin e komunitetit tonë me anëtarë të rinj! first_share: name: Shpërndarja e parë description: Shpërndau një postim @@ -1294,8 +1198,6 @@ sq: first_quote: name: Citimi i parë description: Citoi një postim - long_description: | - Kjo stemë jepet kur për herë të parë citoni një postim në përgjigjen tuaj. Të cituarit në përgjigjen tuaj e pjesëve të rëndësishme prej postimeve të mëparshme, ndihmon në mbajtjen e bisedave të lidhura me njëra-tjetrën dhe brenda tematikës. Mënyra më e lehtë për të cituar është duke theksuar pjesë të një postimi, dhe duke shtypur më pas butonin përgjigju. Citoni me bollëk! read_guidelines: name: Lexoi Udhëzimet reader: @@ -1347,8 +1249,6 @@ sq: crazy_in_love: name: Zemërluan description: Ka dhënë 50 pëlqime në ditë mbi 20 herë - long_description: | - Kjo stemë jepet kur ju pëlqeni 50 postime brenda 20 ditëve. Uau! Ju jeni një shembull nxitjeje të rregullt të anëtarëve të komunitetit! thank_you: name: Faleminderit description: Ka pëlqyer 20 postime dhe ka dhënë 10 pëlqime @@ -1362,18 +1262,14 @@ sq: empathetic: name: Empatik description: Ka pëlqyer 500 postime dhe ka dhënë 1000 pëlqime - long_description: | - Kjo stemë jepet kur ju keni 500 postime të pëlqyera dhe kur jepni 1000 apo më tepër pëlqime në këmbim. Uau! Qenkeni shembulli i zemërgjërit dhe vlerësimit të dyanshëm :two_hearts:. first_emoji: name: Emoji i parë description: Përdori Emoji në një postim first_mention: name: Përmendja e parë - long_description: "Kjo stemë jepet herën e parë kur ju përmendni @username e dikujt në një postim. Secila përmendje krijon një njoftim për atë person, që të vihen në dijeni për postimin tuaj. Thjesht filloni të shtypni @ (simbolin te) për të përmendur çdo përdorues ose, nëse e mundur, çdo grup - është një mënyrë e volitshme për të patur vëmendjen e dikujt." first_onebox: name: Onebox i Parë description: Postoi një lidhje në onebox - long_description: "Kjo stemë jepet herën e parë kur postoni një lidhje në një rresht të vetëm, i cili shpaloset automatikisht në një onebox me një përmbledhje të shkurtër të lidhjes, një titull, dhe (kur është e mundur) një imazh." first_reply_by_email: name: Përgjigja e parë me email long_description: | diff --git a/config/locales/server.sr.yml b/config/locales/server.sr.yml index 8811398ce7..d2b553851d 100644 --- a/config/locales/server.sr.yml +++ b/config/locales/server.sr.yml @@ -129,7 +129,6 @@ sr: topic_views_heat_high: "Nakon ovoliko pregleda, polje pregleda je jako oznaÄeno." num_hours_to_close_topic: "Broj sati za pauziranje teme radi intervencije." reply_by_email_enabled: "Omogući odgovore na teme putem email poruka." - disable_emails: "SpreÄi Discourse da Å¡alje bilo kakve email poruke" delete_email_logs_after_days: "ObriÅ¡i email logove posle (N) dana. Uneti 0 za neograniÄeno Äuvanje." block_auto_generated_emails: "Blokiraj dolazne email poruke prepoznate kao automatski generisane." ignore_by_title: "IgnoriÅ¡i dolazne email poruke na osnovu njihovog naslova" diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 54ba030b12..07d4b22155 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -127,8 +127,8 @@ sv: reading_time: "Lästid" likes: "Gillningar" too_many_replies: - one: Vi är ledsna men nya användare är tillfälligt begränsade till 1 svar i samma ämne. - other: Vi är ledsna men nya användare är tillfälligt begränsade till &{count} svar i samma ämne. + one: "Vi är ledsna men nya användare är tillfälligt begränsade till 1 svar i samma ämne." + other: "Vi är ledsna men nya användare är tillfälligt begränsade till &{count} svar i samma ämne." embed: start_discussion: "Starta diskussion" continue: "Fortsätt diskussion" @@ -138,35 +138,35 @@ sv: no_hosts: "Inga värdar var uppsatta för textinbäddningen" configure: "konfigurera inbäddningen" more_replies: - one: 1 till svar - other: '%{count} till svar' + one: "1 till svar" + other: "%{count} till svar" loading: "Laddar diskussion..." permalink: "Permalänk" imported_from: "Detta är ett kopplat diskussionsämne till det ursprungliga inlägget pÃ¥ %{link}" in_reply_to: "â–¶ %{username}" replies: - one: 1 svar - other: '%{count} svar' + one: "1 svar" + other: "%{count} svar" no_mentions_allowed: "Tyvärr, du kan inte omnämna andra användare." too_many_mentions: - one: Tyvärr, du kan bara omnämna en annan användare i ett inlägg. - other: Tyvärr, du kan bara omnämna %{count} användare i ett inlägg. + one: "Tyvärr, du kan bara omnämna en annan användare i ett inlägg." + other: "Tyvärr, du kan bara omnämna %{count} användare i ett inlägg." no_mentions_allowed_newuser: "Tyvärr, nya användare kan inte omnämna andra användare." too_many_mentions_newuser: - one: Tyvärr, besökare kan bara omnämna en annan användare i ett inlägg. - other: Tyvärr, besökare kan bara omnämna %{count} användare i ett inlägg. + one: "Tyvärr, besökare kan bara omnämna en annan användare i ett inlägg." + other: "Tyvärr, besökare kan bara omnämna %{count} användare i ett inlägg." no_images_allowed: "Tyvärr, nya användare kan inte infoga bilder i inlägg." too_many_images: - one: Tyvärr, nya användare kan bara infoga en bild i ett inlägg. - other: Tyvärr, nya användare kan bara infoga %{count} bilder i ett inlägg. + one: "Tyvärr, nya användare kan bara infoga en bild i ett inlägg." + other: "Tyvärr, nya användare kan bara infoga %{count} bilder i ett inlägg." no_attachments_allowed: "Tyvärr, nya användare kan inte bifoga filer i inlägg." too_many_attachments: - one: Tyvärr, nya användare kan bara bifoga en filer i ett inlägg. - other: Tyvärr, nya användare kan bara bifoga %{count} filer i ett inlägg. + one: "Tyvärr, nya användare kan bara bifoga en filer i ett inlägg." + other: "Tyvärr, nya användare kan bara bifoga %{count} filer i ett inlägg." no_links_allowed: "Tyvärr, nya användare kan inte ha länkar i inlägg." too_many_links: - one: Tyvärr, besökare kan bara ha en länk i ett inlägg. - other: Tyvärr, nya användare kan bara ha %{count} länkar i ett inlägg. + one: "Tyvärr, besökare kan bara ha en länk i ett inlägg." + other: "Tyvärr, nya användare kan bara ha %{count} länkar i ett inlägg." spamming_host: "Tyvärr, du kan inte posta en länk till det värdnamnet." user_is_suspended: "Avstängda användare är inte tillÃ¥tna att göra inlägg" topic_not_found: "NÃ¥got har gÃ¥tt fel. Kanske har ämnet stängts eller raderats medan du tittade pÃ¥ det?" @@ -220,8 +220,8 @@ sv: trust_level_4: "trust_level_4" education: until_posts: - one: 1 inlägg - other: '%{count} inlägg' + one: "1 inlägg" + other: "%{count} inlägg" 'new-topic': | Välkommen till %{site_name} — **tack för att du startade en ny konversation!** @@ -297,27 +297,6 @@ sv: title: "Välkommen till diskussionen" lounge_welcome: title: "Välkommen till loungen" - body: |2 - - Grattis! :confetti_ball: - - Om du kan se det här ämnet sÃ¥ har du nyligen blivit upphöjd till **regelbunden** användare (förtroendenivÃ¥ 3). - - Du kan nu … - - * Redigera rubriken för alla ämnen - * Ändra kategorin för alla ämnen - * FÃ¥ alla dina länkar följda ([automatiskt nofollow](http://en.wikipedia.org/wiki/Nofollow) är borttagna) - * FÃ¥ Ã¥tkomst till en privat Lounge-kategori som endast är synlig för användare som har förtroendenivÃ¥ 3 eller högre - * Gömma spam med en enda flagga - - Här är den [aktuella listan över regelbundna användare](/badges/3/regular). Glöm inte att hälsa. - - Tack för att du är en viktig del av det här forumet! - - (För mer information om förtroendenivÃ¥er, [se det här ämnet][trust]. Notera att endast medlemmar som fortsätter att tillfredställa kraven över tid kommer att fortsätta vara regelbundna medlemmar.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Om kategorin %{category}" replace_paragraph: "(Byt ut den här första paragrafen med en sammanfattad beskrivning av din nya kategori. Den här vägledningen kommer att dyka upp i kategorins urvalsomrÃ¥de, sÃ¥ försök att hÃ¥lla det kortare än 200 tecken. **Tills du har redigerat den här beskrivningen eller skapat nya ämnen sÃ¥ kommer den här kategorin inte att synas pÃ¥ kategorisidan.**)" @@ -332,9 +311,6 @@ sv: cannot_delete: uncategorized: "Du kan inte ta bort kategorin \"Okategoriserat\"" has_subcategories: "Du kan inte ta bort den här kategorin för att den har underkategorier." - topic_exists: - one: Kan inte ta bort den här kategorien eftersom den innehÃ¥ller ett ämne. Ämnet är %{topic_link}. - other: Kan inte ta bort den här kategorien eftersom den innehÃ¥ller %{count} ämnen. Äldsta ämnet är %{topic_link}. topic_exists_no_oldest: "Kan inte ta bort den här kategorin eftersom antalet ämnen är %{count}." uncategorized_description: "Ämnen som inte behöver en kategori, eller som inte passar in i nÃ¥gon annan befintlig kategori." trust_levels: @@ -351,85 +327,85 @@ sv: change_failed_explanation: "Du försökte degradera %{user_name} till '%{new_trust_level}'. Användarens förtroendenivÃ¥ är redan '%{current_trust_level}'. %{user_name} kommer behÃ¥lla '%{current_trust_level}'. Om du vill degradera användaren, lÃ¥s förtroendenivÃ¥n först" rate_limiter: hours: - one: 1 timme - other: '%{count} timmar' + one: "1 timme" + other: "%{count} timmar" minutes: - one: 1 minut - other: '%{count} minuter' + one: "1 minut" + other: "%{count} minuter" seconds: - one: 1 sekund - other: '%{count} sekunder' + one: "1 sekund" + other: "%{count} sekunder" datetime: distance_in_words: half_a_minute: "< 1m" less_than_x_seconds: - one: < 1s - other: < %{count}s + one: "< 1s" + other: "< %{count}s" x_seconds: - one: 1s - other: '%{count}s' + one: "1s" + other: "%{count}s" less_than_x_minutes: - one: < 1m - other: < %{count}m + one: "< 1m" + other: "< %{count}m" x_minutes: - one: 1m - other: '%{count}m' + one: "1m" + other: "%{count}m" about_x_hours: - one: 1h - other: '%{count}h' + one: "1h" + other: "%{count}h" x_days: - one: 1d - other: '%{count}d' + one: "1d" + other: "%{count}d" about_x_months: - one: 1mÃ¥n - other: '%{count}mÃ¥n' + one: "1mÃ¥n" + other: "%{count}mÃ¥n" x_months: - one: 1mÃ¥n - other: '%{count}mÃ¥n' + one: "1mÃ¥n" + other: "%{count}mÃ¥n" about_x_years: - one: 1Ã¥r - other: '%{count}Ã¥r' + one: "1Ã¥r" + other: "%{count}Ã¥r" over_x_years: - one: '> 1Ã¥r' - other: '> %{count}Ã¥r' + one: "> 1Ã¥r" + other: "> %{count}Ã¥r" almost_x_years: - one: 1Ã¥r - other: '%{count}Ã¥r' + one: "1Ã¥r" + other: "%{count}Ã¥r" distance_in_words_verbose: half_a_minute: "nyss" less_than_x_seconds: - one: nyss - other: nyss + one: "nyss" + other: "nyss" x_seconds: - one: 1 sekund sedan - other: '%{count} sekunder sedan' + one: "1 sekund sedan" + other: "%{count} sekunder sedan" less_than_x_minutes: - one: mindre än 1 minut sedan - other: mindre än %{count} minuter sedan + one: "mindre än 1 minut sedan" + other: "mindre än %{count} minuter sedan" x_minutes: - one: 1 minut sedan - other: '%{count} minuter sedan' + one: "1 minut sedan" + other: "%{count} minuter sedan" about_x_hours: - one: 1 timme sedan - other: '%{count} timmar sedan' + one: "1 timme sedan" + other: "%{count} timmar sedan" x_days: - one: 1 dag sedan - other: '%{count} dagar sedan' + one: "1 dag sedan" + other: "%{count} dagar sedan" about_x_months: - one: ungefär 1 mÃ¥nad sedan - other: ungefär %{count} mÃ¥nader sedan + one: "ungefär 1 mÃ¥nad sedan" + other: "ungefär %{count} mÃ¥nader sedan" x_months: - one: 1 mÃ¥nad sedan - other: '%{count} mÃ¥nader sedan' + one: "1 mÃ¥nad sedan" + other: "%{count} mÃ¥nader sedan" about_x_years: - one: ungefär 1 Ã¥r sedan - other: ungefär %{count} Ã¥r sedan + one: "ungefär 1 Ã¥r sedan" + other: "ungefär %{count} Ã¥r sedan" over_x_years: - one: över 1 Ã¥r sedan - other: över %{count} Ã¥r sedan + one: "över 1 Ã¥r sedan" + other: "över %{count} Ã¥r sedan" almost_x_years: - one: nästan 1 Ã¥r sedan - other: nästan %{count} Ã¥r sedan + one: "nästan 1 Ã¥r sedan" + other: "nästan %{count} Ã¥r sedan" password_reset: no_token: "Tyvärr, din lösenordslänk har löpt ut. Klicka pÃ¥ inloggningsknappen och välj \"jag har glömt mitt lösenord\" för att fÃ¥ en ny länk." choose_new: "Välj ett nytt lösenord" @@ -491,13 +467,8 @@ sv: title: 'Gilla' description: 'Gilla detta inlägg' long_form: 'gillade detta inlägg' - vote: - title: 'Rösta' - description: 'Rösta för detta inlägg' - long_form: 'röstade för detta inlägg' user_activity: no_bookmarks: - self: "Du har inga märkta inlägg, märkta inlägg möjliggör att du enkelt nÃ¥r dem vid ett senare tillfälle." others: "Inga bokmärken." no_likes_given: self: "Du har inte gillat nÃ¥gra inlägg." @@ -630,8 +601,6 @@ sv: num_users: "Användare" top_referred_topics: title: "Mest refererade ämnen" - xaxis: "Ämne" - num_clicks: "Klick" page_view_anon_reqs: title: "Anonym" xaxis: "Dag" @@ -688,7 +657,6 @@ sv: xaxis: "Dag" yaxis: "Totalt" mobile_visits: - title: "Användarbesök" xaxis: "Dag" yaxis: "Antal besök" dashboard: @@ -706,8 +674,8 @@ sv: failing_emails_warning: 'Det finns %{num_failed_jobs} e-postutskick som har misslyckats. Kontrollera din app.yml-fil för att säkerställa att serverinställningarna för e-post är korrekta. Se alla misslyckade utskick i Sidekiq.' subfolder_ends_in_slash: "Inställningarna för dina undermappar är inte korrekt; DISCOURSE_RELATIV_URL_ROOT slutar med ett snedstreck." email_polling_errored_recently: - one: E-postpolling har genererat ett fel de senaste 24 timmarna. Se loggarna för mer detaljer. - other: E-postpolling har genererat %{count} fel de senaste 24 timmarna. Se loggarna för mer detaljer. + one: "E-postpolling har genererat ett fel de senaste 24 timmarna. Se loggarna för mer detaljer." + other: "E-postpolling har genererat %{count} fel de senaste 24 timmarna. Se loggarna för mer detaljer." bad_favicon_url: "Uppladdningen av favoritikonen misslyckas. Kontrollera inställningen favicon_url i webbplatsinställningarna." poll_pop3_timeout: "Anslutningen till POP3-servern har nÃ¥tt tidsgränsen. Inkommande e-postmeddelanden kunde inte mottas. Var vänlig kontrollera dina POP3-inställningar och tjänsteleverantör." poll_pop3_auth_error: "Anslutning till POP3-servern misslyckas med ett autentiseringsfel. Var vänlig kontrollera dina POP3-inställningar." @@ -796,7 +764,6 @@ sv: post_menu: "Bestäm vilka objekt som visas i inläggsmenyn och i vilken ordning. Exempel: like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Standardinställning för vilka menyobjekt som döljs i inläggsmenyn om inte utvidgnings-ellipsen har klickats pÃ¥." share_links: "Bestäm vilka objekt som syns i den delade dialogen, och i vilken ordning." - track_external_right_clicks: "Följ externa länkar som högerklickas (ex: öppna i en ny flik) inaktiverat som standard eftersom det skriver över URL:er." site_contact_username: "Ett giltigt personalanvändarnamn att skicka alla automatiserade meddelanden ifrÃ¥n. Om lämnad blank används det System-kontot." send_welcome_message: "Skicka ett välkomstmeddelande till alla nya användare tillsammans med en snabbstartsguide." suppress_reply_directly_below: "Visa inte den utvidgade inläggsräknaren pÃ¥ ett inlägg när det bara finns ett svar direkt nedanför det här inlägget. " @@ -985,7 +952,6 @@ sv: min_first_post_typing_time: "Minsta tid i millisekunder en användare mÃ¥ste skriva vid komponerandet av sitt första inlägg. Om gränsen inte är uppnÃ¥dd sÃ¥ kommer inlägget automatiskt att hamna i kön av saker som behöver granskas. Ange 0 för att inaktivera (rekommenderas ej)" reply_by_email_enabled: "Aktivera möjlighet att svara pÃ¥ ämnen via e-post." reply_by_email_address: "Mall för inkommande e-postadress för svar via e-post, till exempel: %{reply_key}@svar.exempel.se eller svar+%{reply_key}@exempel.se" - disable_emails: "Förhindra Discourse frÃ¥n att skicka nÃ¥gon form av e-post" strip_images_from_short_emails: "Rensa bilder frÃ¥n e-post som har mindre storlek än 2800 bytes." short_email_length: "Kort e-postlängd i bytes." display_name_on_email_from: "Visa fullständiga namn pÃ¥ e-post frÃ¥n fält." @@ -1175,43 +1141,40 @@ sv: different_users: "Inlägg som hör till olika användare kan inte lägga ihop." move_posts: new_topic_moderator_post: - one: 'Ett inlägg har delats in i ett nytt ämne: %{topic_link}' - other: '%{count} inlägg delades in i ett nytt ämne: %{topic_link}' + one: "Ett inlägg har delats in i ett nytt ämne: %{topic_link}" + other: "%{count} inlägg delades in i ett nytt ämne: %{topic_link}" existing_topic_moderator_post: - one: 'Ett inlägg har sammanfogats med ett existerande ämne: %{topic_link}' - other: '%{count} inlägg har sammanfogats med ett existerande ämne: %{topic_link}' - change_owner: - post_revision_text: "Ägarbyte frÃ¥n %{old_user} till %{new_user}" - deleted_user: "en raderad användare" + one: "Ett inlägg har sammanfogats med ett existerande ämne: %{topic_link}" + other: "%{count} inlägg har sammanfogats med ett existerande ämne: %{topic_link}" topic_statuses: archived_enabled: "Detta ämne är nu arkiverat. Det är fryst och kan inte förändras pÃ¥ nÃ¥got sätt." archived_disabled: "Detta ämne är nu oarkiverat. Det är inte längre fruset, och kan ändras." closed_enabled: "Detta ämne är nu stängt. Nya svar tillÃ¥ts inte längre." closed_disabled: "Detta ämne är nu öppnat. Nya svar är tillÃ¥tna." autoclosed_message_max_posts: - one: Det här ämnet stängdes automatiskt efter att ha nÃ¥tt den övre gränsen av 1 inlägg. - other: 'Det här ämnet stängdes automatiskt efter att ha uppnÃ¥tt den övre gränsen av %{count} inlägg. ' + one: "Det här ämnet stängdes automatiskt efter att ha nÃ¥tt den övre gränsen av 1 inlägg." + other: "Det här ämnet stängdes automatiskt efter att ha uppnÃ¥tt den övre gränsen av %{count} inlägg. " autoclosed_topic_max_posts: - one: Det här ämnet stängdes automatiskt efter att ha uppnÃ¥tt den övre gränsen av 1 inlägg. - other: 'Det här ämnet stängdes automatiskt efter att ha uppnÃ¥tt den övre gränsen av %{count} inlägg. ' + one: "Det här ämnet stängdes automatiskt efter att ha uppnÃ¥tt den övre gränsen av 1 inlägg." + other: "Det här ämnet stängdes automatiskt efter att ha uppnÃ¥tt den övre gränsen av %{count} inlägg. " autoclosed_enabled_days: - one: Detta ämne stängdes automatiskt efter 1 dag. Nya svar är ej längre tillÃ¥tet. - other: Detta ämne stängdes automatiskt efter %{count} dagar. Nya svar är ej längre tillÃ¥tna. + one: "Detta ämne stängdes automatiskt efter 1 dag. Nya svar är ej längre tillÃ¥tet." + other: "Detta ämne stängdes automatiskt efter %{count} dagar. Nya svar är ej längre tillÃ¥tna." autoclosed_enabled_hours: - one: Detta ämne stängdes automatiskt efter 1 timme. Nya svar är ej längre tillÃ¥tna. - other: Detta ämne stängdes automatiskt efter %{count} timmar. Nya svar är ej längre tillÃ¥tna. + one: "Detta ämne stängdes automatiskt efter 1 timme. Nya svar är ej längre tillÃ¥tna." + other: "Detta ämne stängdes automatiskt efter %{count} timmar. Nya svar är ej längre tillÃ¥tna." autoclosed_enabled_minutes: - one: Detta ämne stängdes automatiskt efter 1 minut. Nya svar är ej längre tillÃ¥tna. - other: Detta ämne stängdes automatiskt efter %{count} minuter. Nya svar är ej längre tillÃ¥tna. + one: "Detta ämne stängdes automatiskt efter 1 minut. Nya svar är ej längre tillÃ¥tna." + other: "Detta ämne stängdes automatiskt efter %{count} minuter. Nya svar är ej längre tillÃ¥tna." autoclosed_enabled_lastpost_days: - one: Detta ämne stängdes automatiskt 1 dag efter det senaste svaret. Nya svar är ej längre tillÃ¥tna. - other: Detta ämne stängdes automatiskt %{count} dagar efter det senaste svaret. Nya svar är ej längre tillÃ¥tna. + one: "Detta ämne stängdes automatiskt 1 dag efter det senaste svaret. Nya svar är ej längre tillÃ¥tna." + other: "Detta ämne stängdes automatiskt %{count} dagar efter det senaste svaret. Nya svar är ej längre tillÃ¥tna." autoclosed_enabled_lastpost_hours: - one: Detta ämne stängdes automatiskt 1 timme efter det senaste svaret. Nya svar är ej längre tillÃ¥tna. - other: Detta ämne stängdes automatiskt %{count} timmar efter det senaste svaret. Nya svar är ej längre tillÃ¥tna. + one: "Detta ämne stängdes automatiskt 1 timme efter det senaste svaret. Nya svar är ej längre tillÃ¥tna." + other: "Detta ämne stängdes automatiskt %{count} timmar efter det senaste svaret. Nya svar är ej längre tillÃ¥tna." autoclosed_enabled_lastpost_minutes: - one: Detta ämne stängdes automatiskt 1 minut efter det senaste svaret. Nya svar är ej längre tillÃ¥tna. - other: Detta ämne stängdes automatiskt %{count} minuter efter det senaste svaret. Nya svar är ej längre tillÃ¥tna. + one: "Detta ämne stängdes automatiskt 1 minut efter det senaste svaret. Nya svar är ej längre tillÃ¥tna." + other: "Detta ämne stängdes automatiskt %{count} minuter efter det senaste svaret. Nya svar är ej längre tillÃ¥tna." autoclosed_disabled: "Detta ämne är nu öppet. Nya svar är tillÃ¥tna." autoclosed_disabled_lastpost: "Detta ämne är nu öppnat. Nya svar är tillÃ¥tna." pinned_enabled: "Detta ämne är nu klistrat. Det dyker upp i toppen av dess kategori tills den blir avklistrad av personal för alla, eller av enskilda användare för de själva." @@ -1243,7 +1206,6 @@ sv: missing_user_field: "Du har inte fyllt i alla användarfält" already_logged_in: "Hoppsan, det ser ut som att du försöker acceptera en inbjudan för en annan användare. Logga ut och försök igen om du inte är %{current_user}. " user: - no_accounts_associated: "Inga kopplade konton" deactivated_by_staff: "Avaktiverades av personalen" activated_by_staff: "Aktiverades av personalen" username: @@ -1263,8 +1225,8 @@ sv: max_new_accounts_per_registration_ip: "Nya registreringar är inte tillÃ¥tna frÃ¥n din IP-adress (maxgräns uppnÃ¥dd). Kontakta personal." flags_reminder: subject_template: - one: 1 flagga väntar pÃ¥ att bli hanterad - other: '%{count} flaggor väntar pÃ¥ att bli hanterade' + one: "1 flagga väntar pÃ¥ att bli hanterad" + other: "%{count} flaggor väntar pÃ¥ att bli hanterade" unsubscribe_mailer: title: "stäng av mail skrivaren" subject_template: "Bekräfta att du inte längre vill motta e-postuppdateringar frÃ¥n %{site_title}" @@ -1409,8 +1371,8 @@ sv: pending_users_reminder: title: "PÃ¥minnelse om väntande användare" subject_template: - one: 1 användare väntar pÃ¥ godkännande - other: '%{count} användare väntar pÃ¥ godkännande' + one: "1 användare väntar pÃ¥ godkännande" + other: "%{count} användare väntar pÃ¥ godkännande" text_body_template: | Det finns nya användarregistreringar att godkänna (eller avvisa) innan de kan fÃ¥ tillträde till forumet. @@ -1439,10 +1401,8 @@ sv: title: "Unsubscribe" description: "Inte intresserad av att fÃ¥ dessa mejl? Inga problem! Klicka nedan för att avprenumerera." reply_by_email: "[Besök ämnet](%{base_url}%{url}) eller svara pÃ¥ det här e-postmeddelandet för att ge din respons. " - reply_by_email_pm: "[Besök meddelanden](%{base_url}%{url}) eller svara pÃ¥ det här e-postmeddelandet för att ge din respons." only_reply_by_email: "Besvara det här e-postmeddelandet för att ge din respons. " visit_link_to_respond: "[Besök ämnet](%{base_url}%{url}) för att ge din respons. " - visit_link_to_respond_pm: "[Besök meddelanden](%{base_url}%{url}) för att ge din respons." posted_by: "Postat av %{username} den %{post_date}" user_invited_to_private_message_pm: title: "Användare invitera personligt" @@ -1616,7 +1576,6 @@ sv: recent_topics: "Senaste" see_more: "Mer" search_title: "Sök pÃ¥ hemsidan" - search_google: "Google" terms_of_service: title: "Användarvillkor" signup_form_message: 'Jag har läst och accepterat Användarvillkoren.' @@ -1637,25 +1596,6 @@ sv: flag_reason: sockpuppet: "En ny användare skapade ett ämne, och en annan ny användare pÃ¥ samma IP-adress (%{ip_address}) svarade. Granska webbplatsinställningen `flag_sockpuppets`." spam_hosts: "Den här nya användaren försökte skapa flera inlägg med länkar till samma domän (%{domain}). Granska webbplatsinställningen `newuser_spam_host_threshold`." - email_log: - post_user_deleted: "Användaren som skrivit inlägget har raderats." - no_user: "Kan inte hitta användare med id %{user_id}" - anonymous_user: "Användare är anonym" - suspended_not_pm: "Användaren är avstängd, inte ett meddelande" - seen_recently: "Användare sÃ¥gs senast" - post_not_found: "Kan inte hitta ett inlägg med id %{post_id}" - notification_already_read: "Notificieringen som e-posten handlar om har redan blivit läst" - topic_nil: "post.topic är nil" - post_deleted: "inlägg raderades av författaren" - user_suspended: "användare blev avstängd" - already_read: "användaren har redan läst det här inlägget" - exceeded_emails_limit: "Översteg max_emails_per_day_per_user" - exceeded_bounces_limit: "Översteg bounce_score_threshold" - message_blank: "meddelande är tomt" - message_to_blank: "message.to är tomt" - text_part_body_blank: "text_part.body är tomt" - body_blank: "body är tom" - no_echo_mailing_list_mode: "Email list meddelande är inaktiverat för användarens egna meddelanden" color_schemes: base_theme_name: "Bas" about: "Om" @@ -1677,70 +1617,40 @@ sv: editor: name: Redigerare description: Första inläggsredigeringen - long_description: | - Den här utmärkelsen beviljas första gÃ¥ngen som du redigerar nÃ¥got av dina inlägg. Även om du inte kan redigera dina inlägg förevigt sÃ¥ är redigering alltid en god idé — du kan förbättra dina inlägg, fixa smÃ¥ misstag eller lägga till nÃ¥got som du missade när du först skrev inlägget. Redigera dina inlägg för att göra dem ännu bättre! basic_user: name: Grundläggande - description: "Beviljad alla väsentliga forumfunktioner" - long_description: | - Den här utmärkelsen beviljas när du uppnÃ¥r förtroendenivÃ¥ 1. Tack för att du har följt med en stund och läst nÃ¥gra ämnen för att lära dig vad vÃ¥rt forum handlar om. Dina användarrestriktioner som ny användare har lyfts och du har nu tillgÃ¥ng till alla väsentliga forumfunktioner, bland annat personliga meddelanden, flaggningar, redigering av wikin och möjligheten att posta flertalet bilder och länkar member: name: Medlem - description: "Beviljad inbjudningar, gruppmeddelanden, fler gillningar" - long_description: | - Den här utmärkelsen beviljas när du nÃ¥r förtroendenivÃ¥ 2. Tack för att har varit en del av forumet de senaste veckorna. Du kan nu skicka inbjudningar frÃ¥n din användarsida eller frÃ¥n individuella ämnen, skicka gruppmeddelanden och ha nÃ¥gra fler gillningar varje dag. regular: name: Regelbunden - description: "Beviljad omkategorisera, döpa om, följa länkar, wiki, fler gillningar" - long_description: | - Den här utmärkelsen beviljas när du nÃ¥r förtroendenivÃ¥ 3. Tack för att du regelbundet har varit en del av forumet de senaste mÃ¥naderna. Du är nu en av vÃ¥ra mest aktiva läsare och en tillförlitlig bidragsgivare som gör forumet fantastiskt. Du kan nu omkategorisera och döpa om ämnen, använda mer kraftfulla verktyg som skräppost-flaggor, fÃ¥ tillgÃ¥ng till ett privat delforum och du fÃ¥r ocksÃ¥ massor av fler gillningar varje dag. leader: name: Ledare - description: "Beviljad globala redigeringar, klistra, stänga, arkivera, splitta och sammanfoga, fler gillningar" - long_description: | - Den här utmärkelsen beviljas när du nÃ¥r förtroendenivÃ¥ 4. Du är en ledare för det här forumet speciellt utvald av personalen och du är en fin förebild genom dina handlingar och ord här. Du har möjlighet att ändra alla inlägg, använda vanliga moderingsverktyg för ämnen sÃ¥som att klistra, stänga, olista, arkivera, splitta och sammanfoga, och du har massor av fler gillningar varje dag. welcome: name: Välkommen description: Mottog en gillning - long_description: | - Den här utmärkelsen beviljas när du fÃ¥r din första gillning pÃ¥ ett inlägg. Grattis, du har skrivit nÃ¥got som en av medlemmarna pÃ¥ forumet tyckte var intressant, coolt eller användbart! autobiographer: name: Självbiograf anniversary: name: Ã…rsdag description: "Aktiv medlem ett Ã¥r, har skrivit minst en gÃ¥ng" - long_description: | - Den här utmärkelsen beviljas när du har varit en medlem i ett Ã¥r med minst ett inlägg under det Ã¥ret. Tack för att du har varit en del av och bidragit till forumet. Vi kunde inte ha gjort det utan dig. nice_post: name: Bra svar description: Fick 10 gillningar pÃ¥ ett inlägg - long_description: | - Den här utmärkelsen beviljas när ett av dina inlägg fÃ¥r 10 gillningar. Ditt inlägg gjorde verkligen ett intryck pÃ¥ forumet och hjälpte konversationen! good_post: name: Jättebra svar description: Fick 25 gillningar pÃ¥ ett inlägg - long_description: | - Den här utmärkelsen beviljas när ett av dina inlägg fÃ¥r 25 gillningar. Ditt inlägg var exceptionellt och gjorde den här konversationen mycket bättre för alla! great_post: name: Fantastiskt svar description: Fick 50 gillningar pÃ¥ ett inlägg - long_description: | - Den här utmärkelsen beviljas när ett inlägg fÃ¥r 50 gillningar. Wow! Ditt inlägg var inspirerande, fascinerande, superroligt eller insiktsfullt och forumet älskade det. nice_topic: name: Bra ämne description: Fick 10 gillningar pÃ¥ ett ämne - long_description: | - Den här utmärkelsen beviljas när ditt ämne fÃ¥r 10 gillningar. Du startade en intressant konversation som forumet uppskattade! good_topic: name: Jättebra ämne description: Fick 25 gillningar pÃ¥ ett ämne - long_description: | - Den här utmärkelsen beviljas när ditt ämne fÃ¥r 25 gillningar. Du startade en livfull konversation som forumet flockades kring och älskade! great_topic: name: Fantastiskt ämne description: Fick 50 gillningar pÃ¥ ett ämne - long_description: | - Den här utmärkelsen beviljas när ditt ämne fÃ¥r 50 gillningar. Du startade en fascinerande konversation och forumet uppskattade den dynamiska konversationen som följde! nice_share: name: Bra delning description: Delade ett inlägg med 25 unika besökare @@ -1749,13 +1659,9 @@ sv: good_share: name: Jättebra delning description: Delade ett inlägg med 300 unika besökare - long_description: | - Den här utmärkelsen beviljas för att du delade en länk som klickades pÃ¥ av 300 besökare. Bra jobbat! Du har visat upp en fantastisk diskussion för en hel grupp nya människor och hjälpt forumet växa. great_share: name: Fantastisk delning description: Delade ett inlägg med 1000 unika besökare - long_description: | - Den här utmärkelsen beviljas för att du delade en länk som klickades pÃ¥ av 1000 besökare. Wow! Du har visat upp en intressant diskussion för en helt ny public och hjälpt forumet växa enormt! first_like: name: Första gillning description: Gillade ett inlägg @@ -1764,21 +1670,15 @@ sv: first_flag: name: Första flaggning description: Flaggade ett inlägg - long_description: | - Den här utmärkelsen beviljas första gÃ¥ngen du flaggar ett inlägg. Flaggning är det sätt som vi alla hjälps Ã¥t att hÃ¥lla det här forumet rent för alla användare. Om du upptäcker nÃ¥got inlägg som bör granskas av moderatorer av nÃ¥gon anledning sÃ¥ tveka inte att flagga det. Du kan ocksÃ¥ flagga för att skicka personliga meddelanden till medlemmar om du ser nÃ¥got problematiskt med deras inlägg. Om du ser ett problem, :flag_black: flagga det! promoter: name: Främjare description: Bjöd in en användare campaigner: name: FöresprÃ¥kare description: Bjöd in 3 grundläggande användare - long_description: | - Den här utmärkelsen beviljas när du bjudit in 3 personer som sedan tillbringat tillräckligt mycket tid pÃ¥ webbplatsen för att bli grundläggande användare. Ett levande forum behöver ständig tillförsel av nykomlingar som regelbundet deltar och förnyar konversationerna. champion: name: Förkämpe description: Bjöd in 5 medlemmar - long_description: | - Den här utmärkelsen beviljas när du bjudit in 5 personer som sedan tillbringat tillräckligt mycket tid pÃ¥ webbplatsen för att bli fullvärdiga medlemmar. Wow! Tack för att du berikar mÃ¥ngfalden i vÃ¥rt forum med nya medlemmar! first_share: name: Första delning description: Delade ett inlägg @@ -1792,8 +1692,6 @@ sv: first_quote: name: Första citation description: Citerade ett inlägg - long_description: | - Den här utmärkelsen beviljas första gÃ¥ngen du citerar ett inlägg i ditt svar. Att citera relevanta delar av tidigare inlägg i ditt svar hjälper att hÃ¥lla diskussionen sammankopplad och relevant för ämnet. Det lättaste sättet att citera är att markera en del av ett inlägg och sedan klicka pÃ¥ svara-knappen. Citera generöst! read_guidelines: name: Läst riktlinjer reader: @@ -1844,8 +1742,6 @@ sv: crazy_in_love: name: Galet kär description: Använde 50 gillningar pÃ¥ en dag 20 gÃ¥nger - long_description: | - Den här utmärkelsen beviljas när du använder alla dina 50 gillningar för en dag pÃ¥ 20 olika dagar. Wow! Du är en förebild som regelbundet uppmuntrar medlemmarna pÃ¥ forumet! thank_you: name: Tack description: Har 20 gillade inlägg och gav 10 gillningar @@ -1859,18 +1755,14 @@ sv: empathetic: name: Empatisk description: Har 500 gillade inlägg och gav 1000 gillningar - long_description: | - Den här utmärkelsen beviljas när du har 500 gillade inlägg och i gengäld har gillat 1000 eller fler inlägg. Wow! Du är en förebild av generositet och ömsesidig uppskattning :two_hearts:. first_emoji: name: Första emoji description: Använde en emoji i ett inlägg first_mention: name: Första omnämningen - long_description: "Den här utmärkelsen beviljas när du nämner nÃ¥gons @användarnamn i ett inlägg. Varje omnämnande genererar en notifiering till den personen, sÃ¥ att det känner till ditt inlägg. Börja skriva @ (snabel-a) för att nämna en användare, eller, om det tillÃ¥ts, en grupp - det är ett bekvämt sätt att uppmärksamma dem pÃ¥ nÃ¥got. " first_onebox: name: "Första onebox:en" description: "Lade upp en länk som var onebox:ad" - long_description: "Den här utmärkelsen beviljas när du för första gÃ¥ngen lägger upp en länk pÃ¥ en rad för sig själv, vilken sedan automatiskt utvidgas och blir en onebox med en kort sammanfattning av länken, en rubrik och (när det finns tillgängligt) även en bild. " first_reply_by_email: name: Första svaret via e-post long_description: | @@ -1988,8 +1880,6 @@ sv: choices: latest: label: "Senaste ämnen" - categories: - label: "Kategorier" emoji: title: "Emojer" description: "Vilken emoj stil föredrar du för din grupp? Du kan addera fler personliga Emojer senare via Admin, Customize, Emoj." diff --git a/config/locales/server.sw.yml b/config/locales/server.sw.yml new file mode 100644 index 0000000000..5527268797 --- /dev/null +++ b/config/locales/server.sw.yml @@ -0,0 +1,2391 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + dates: + short_date_no_year: "S MMM" + short_date: "S MMM, MMMM" + long_date: "MMMM S, MMM s:mma" + datetime_formats: &datetime_formats + formats: + short: "%m-%d-%M" + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [~, Mwezi wa kwanza, Mwezi wa pili, Mwezi wa tatu, Mwezi wa nne, Mwezi wa tano, Mwezi wa sita, Mwezi wa saba, Mwezi wa nane, Mwezi wa tisa, Mwezi wa kumi, Mwezi wa kumi na moja, Mwezi wa kumi na mbili] + <<: *datetime_formats + time: + <<: *datetime_formats + am: "Asubuhi" + pm: "jioni " + title: "Discourse" + topics: "Mada" + posts: "machapisho" + loading: "Inapakuliwa" + powered_by_html: 'Imetengenezwa na Discourse, inaonekana vizuri ukiruhusu JavaScript' + log_in: "Ingia" + submit: "Wasilisha" + purge_reason: "Roboti ameifuta kwa sababu haishughulikiwi, akaunti mkondoni haiko hewani" + disable_remote_images_download_reason: "Upakiaji wa picha kutoka sehemu nyingine umesitishwa kwa sababu hakuna nafasi ya kutosha" + anonymous: "Mtumiaji Asiyejulikana" + remove_posts_deleted_by_author: "Imefutwa na Mwandishi" + redirect_warning: "Tumeshindwa kuthibitisha kua kiungo ulichokichagua kipo kwenye hii jamii. Kama ungependa kuendelea, chagua kiungo hapo chini." + themes: + bad_color_scheme: "Hauwezi kusasisha mandhari, mpango wa rangi batili" + other_error: "Tatizo limetokea kwenye kusasisha mandhari" + error_importing: "Tatizo limetokea wakati wa kunakili weko la git, hauna ruhusa au weko haijapatikana" + settings_errors: + invalid_yaml: "YAML iliyowekwa ni batili." + data_type_not_a_number: "Aina ya mpangilio `%{name}` hauruhusiwi. Aina zinazoruhusiwa ni `namba kamili`, `bool`, `orodha` na `enum`" + name_too_long: "Kuna mpangilio wenye jina lefu sana. Kiwango cha juu cha urefu ni 255" + default_value_missing: "Mpangilio wa `%{name}` hauna thamani" + default_out_range: "Mpangilio `%{name}` chaguo-msingi haupo kwenye namba zilizotajwa." + number_value_not_valid: "Namba uliyoiandika haipo kwenye eneo linaloruhusiwa." + number_value_not_valid_min_max: "Lazima iwe kati ya %{min} na %{max}." + number_value_not_valid_min: "Lazima iwe na ukubwa wa au zaidi ya %{min}." + number_value_not_valid_max: "Lazima iwe ndogo au sawa na %{max}" + string_value_not_valid_min_max: "Herufi lazima ziwe kati ya %{min} na %{max}" + string_value_not_valid_min: "Lazima iwe au izidi %{min} maneno." + string_value_not_valid_max: "Isizidi maneno %{max}." + emails: + incoming: + default_subject: "Hii mada inaitaji kichwa cha maneno" + show_trimmed_content: "Onyesha taarifa zilizopunguzwa" + maximum_staged_user_per_email_reached: "Umefika kiwango cha juu cha watumiaji waliotengenezwa kwa kila barua pepe." + no_subject: "(hakuna somo)" + no_body: "(hakuna kiwiliwili cha ujumbe)" + errors: + empty_email_error: "Inatokea kama ujumbe uliotumwa ulikuwa hauna taarifa." + no_message_id_error: "Inatokea kama ujumbe hauna 'Utambulisho wa Ujumbe'." + no_body_detected_error: "Inatokea kama hatuwezi kusoma taarifa na hakuna vitu vilivyo ambatananishwa." + no_sender_detected_error: "Inatokea tukishindwa kupata barua pepe halali kutoka kwenye sehemu uliyoandika barua pepe." + inactive_user_error: "Inatokea kama mtumiaji hayuko hewani." + silenced_user_error: "Inatokea mtumaji akiwa amenyamazishwa." + bad_destination_address: "Inatokea kama hakuna barua pepe kwenye nafasi za Kwenda/Cc/Bcc haziendani na barua pepe inayoingia." + strangers_not_allowed_error: "Inatokea wakati mtumiaji akijaribu kutengeneza mada mpya ndani ya kategoria ambayo sio mwanyamachama." + insufficient_trust_level_error: "Inatokea wakati mtumiaji akijaribu kutengeneza mada mpya ndani ya kategoria ambacho hana kiwango cha uaminifu." + reply_user_not_matching_error: "Inatokea kama jibu limetoka kwenye barua pepe tofauti na barua pepe iliyopokea taarifa." + topic_not_found_error: "Inatokea jibu likiandikwa lakina mada inayoongelewa ikiwa imefutwa." + topic_closed_error: "Inatokea kama jibu limekuja lakini mada inayoongelewa imefungwa." + bounced_email_error: "Barua pepe ni ripoti ya barua pepe iliyoshindwa kufika." + screened_email_error: "Inatokea kama barua pepe ya mtumaji imezuiwa." + unsubscribe_not_allowed: "Inatokea kama kujiengua kupitia barua pepe hakuruhusiwi kwa mtumiaji huyu." + email_not_allowed: "Inatokea kama barua pepe imewekwa kwenye orodha ya kukubaliwa au kukataliwa." + unrecognized_error: "Tatizo lilisoeleweka" + errors: &errors + format: '%{attribute}%{message}' + format_with_full_message: '%{attribute} : %{message}' + messages: + too_long_validation: "Unaruhusiwa kuandika herufi%{max}; umeandika %{length}" + taken: "imekwisha chukuliwa" + accepted: lazima ikubaliwe + blank: haiwezi kubaki wazi + present: lazima iwe wazi + confirmation: "haiendani na %{attribute}" + empty: haiwezi kuachwa wazi + equal_to: "lazima iwe sawa na %{count}" + even: lazima ziwe sawa + exclusion: imehifadhiwa + greater_than: "izidi %{count}" + greater_than_or_equal_to: "izidi au iwe sawa na %{count}" + has_already_been_used: "imeshatumika" + inclusion: haijaorodheshwa + invalid: ni batili + is_invalid: "haieleweki vizuri, je hii sentensi iko kamili?" + contains_censored_words: "ina maneno yafuatayo ambayo hayaruhusiwi: %{censored_words}" + less_than: "lazima iwe chini ya %{count}" + less_than_or_equal_to: "lazima iwe chini ya au sawa na %{count}" + not_a_number: sio namba + not_an_integer: lazima iwe namba + odd: lazima igawanyike kwa mbili + record_invalid: 'Uthibitisho umeshindikana: %{errors}' + max_emojis: "hauwezi ukawa na emoji, vikatuni vya kuonyesha hisia zaidi ya %{max_emojis_count}" + ip_address_already_screened: "tayari ipo ndani ya kanuni iliyopo" + restrict_dependent_destroy: + one: "Hauwezi kufuta kumbukumbu kwa sababu %{record}inayoitegemea ipo" + many: "Hauwezi kufuta kumbukumbu kwa sababu %{record} inayoitegemea ipo" + other_than: "lazima iwe nyingine zaidi ya %{count}" + template: + body: 'Matatizo yametokea kwenye sehemu zifuatazo:' + embed: + load_from_remote: "Hitilafu imetokea wakati wa kupakua taarifa." + site_settings: + min_username_length_range: "Hauwezi ukaseti kiwango cha chini kiwe zaidi ya kiwango cha juu." + max_username_length_range: "Hauwezi ukaweka kiwango cha juu kiwe kidogo ya kiwango cha chini." + default_categories_already_selected: "Hauwezi kuchagua kikundi kinachotumika kwenye orodha nyingine." + conflicting_google_user_id: 'Utambulisho wa Akaunti ya Google imebadilishwa; msaidizi ataipitia kwa ajili ya sababu za ulinzi. Tafadhali wasiliana na msaidizi na waonyeshe
https://meta.discourse.org/t/76575' + activemodel: + errors: + <<: *errors + invite: + not_found: "Mwaliko wako sio sahihi. Tafadhali wasiliana na msimazi wa tovuti." + user_exists: "Hakuna haja ya kumualika %{email}, tayaru wana miliki akaunti!" + bulk_invite: + file_should_be_csv: "Faili unalopakia inabidi liwe na csv umbizo " + error: "Tatizo limetokea wakati wa kupakia faili. Tafadhali jaribu tena." + topic_invite: + user_exists: "Samahani, mtumiaji huyo alikaribishwa. Unaweza kualika mtumiaji kwenye mada mara moja." + backup: + operation_already_running: "Kuna operesheni inayoendelea. Hauwezi kuanzisha kazi mpya sasa." + backup_file_should_be_tar_gz: "Faili la chelezo inabidi lihifadhiwe kwenye nyaraka za .tar.gz." + not_enough_space_on_disk: "Hakuna nafasi ya kutosha kupakia chelezo hichi." + invalid_filename: "Faili la chelezo lina herufi batili. Herufi sahihi ni a-z 0-9 . - _" + invalid_params: "Umeandika kipengele batili kwenye ombi: %{message}" + not_logged_in: "Unahitaji uwe umeingia kufanya hivyo." + invalid_access: "Hauna ruhusa kuona rasilimali uliyoomba kuona." + invalid_api_credentials: "Hauruhusiwi kufikia raslimali uliyoomba. Ufunguo wa API ni batili" + read_only_mode_enabled: "Unaweza kusoma tu kwenye tovuti. Majadiliano yamesitishwa." + reading_time: "Mda wa kusoma" + likes: "Upendo" + embed: + start_discussion: "Anzisha Majadiliano" + continue: "Endelea Kujadiliana" + error: "Hitilafu ya Uambatanishi" + loading: "Inapakua Majadiliano..." + permalink: "Kiungo cha mtandao cha Mda Mrefu" + in_reply_to: "â–¶ %{username}" + no_mentions_allowed: "Samahani, hauwezi kutaja watumiaji wengine." + no_mentions_allowed_newuser: "Samahani, watumiaji wapya hawawezi kutaja watumiaji wengine." + no_images_allowed_trust: "Samahani, hauwezi kuweka picha ndani ya chapisho" + no_images_allowed: "Samahani watumiaji wapya hawawezi kuweka picha kwenye machapisho." + no_attachments_allowed: "Samahani watumiaji wapya hawawezi kuambatanisha picha, sauti, video au dokument kwenye machapisho." + no_links_allowed: "Samahani watumiaji wapya hawawezi kuweka viungo kwenye machapisho." + links_require_trust: "Samahani, hauwezi kuweka viungo kwenye machapisho yako." + contains_blocked_words: "Chapisho lako lina neno lisiloruhusiwa: %{word}" + spamming_host: "Samahani hauwezi kuchapisha kiungo kwenye computer hiyo." + user_is_suspended: "Watumiaji waliosimamishwa hawaruhusiwi kuchapisha." + topic_not_found: "Kuna tatizo limetokea. Labda hii mada ilifungwa au kufutwa ukiwa unaangalia?" + not_accepting_pms: "Samahani, %{username}haikubali jumbe kwa sasa" + max_pm_recepients: "Samahani, unaweza tuma jumbe kwa kiwango cha %{recipients_limit}kwa wapokeaji" + just_posted_that: "inalingana na chapisho ulilotuma hivi karibuni" + invalid_characters: "ina herufi batili" + is_invalid: "haieleweki, je hii sentensi iko kamili?" + next_page: "Ukurasa ujao →" + prev_page: "↠ukurasa uliopita" + page_num: "Karatasi ya %{num}" + home_title: "Nyumbani" + topics_in_category: "Mada ndani ya kategoria '%{category}'" + rss_posts_in_topic: "Mlisho wavuti wa '%{topic}'" + rss_topics_in_category: "Mlisho wavuti wa mada za kategoria '%{category}'" + author_wrote: "%{author} ameandika:" + num_posts: "Machapisho:" + num_participants: "Mshiriki:" + read_full_topic: "Soma mada yote" + private_message_abbrev: "Msg" + rss_description: + latest: "Mada za hivi karibuni" + hot: "Mada kali" + top: "Mada za juu" + top_all: "Mada za juu Mda Wote" + top_yearly: "Mada za Juu za Kila Mwaka" + top_quarterly: "Mada za juu za Robo Mwaka" + top_monthly: "Mada za juu za Mwezi" + top_weekly: "Mada za juu za wiki" + top_daily: "Mada za juu za siku" + posts: "Machapisho Mapya" + private_posts: "Ujumbe binafsi wa hiki karibuni" + group_posts: "Machapisho Mapya kutoka %{group_name}" + group_mentions: "%{group_name}imetaja hivi karibuni" + user_posts: "Machapisho mapya kutoka kwa @%{username}" + user_topics: "Mada za hivi karibuni za @%{username}" + tag: "Mada zilizotajwa" + badge: "%{display_name} beji kwenye %{site_title}" + too_late_to_edit: "Chapisho lilitengenezwa kitambo sana. Haiwezi kufanyiwa uhariri au kufutwa." + revert_version_same: "Toleo la sasa ni sawa na toleo unalo jaribu kurudisha." + excerpt_image: "Picha" + queue: + not_found: "Chapisho halijaonwa au limesasishwa." + groups: + errors: + grant_trust_level_not_valid: "'%{trust_level}' sio kiwango cha uaminifu." + can_not_modify_automatic: "Hauwezi kutohoa kikundi kilicho-otomatiki" + invalid_domain: "'%{domain}' ni kikoa batili" + invalid_incoming_email: "'%{email}' ni barua pepe batili." + email_already_used_in_group: "'%{email}' tayari inatumika kwenye kikundi '%{group_name}'." + email_already_used_in_category: "'%{email}' tayari inatumika kwenye kategoria '%{group_name}'." + cant_allow_membership_requests: "Hauwezi kuruhusu ombi la uanachama kwenye kikundi ambacho hakina wamiliki wowote." + default_names: + everyone: "kila mtu" + admins: "viongozi" + moderators: "wasimamizi" + staff: "wasaidizi" + trust_level_0: "kiwango_cha_uaminifu_0" + trust_level_1: "kiwango_cha_uaminifu_1" + trust_level_2: "kiwango_cha_uaminifu_2" + trust_level_3: "kiwango_cha_uaminifu_3" + trust_level_4: "kiwango_cha_uaminifu_4" + request_membership_pm: + title: "Ombi la Uanachama wa @%{group_name}" + education: + 'new-topic': | + Karibu kwenye %{site_name} — **asante kwa kuanzisha majadiliano mapya!** + + - Je kichwa cha habari ni kizuri ukikisoma kwa sauti? Je Muhtasari ni nzuri? + + - Nani angependa kusoma hiki? Kwa nini ni muhimu? Unategemea upate majibu ya aina gani? + + - Tumia maneno ambayo yanatumika mara kwa mara kwenye mada zako ili watu wengine waweze *kupata* ulichoandika. Kuweka mada yako pamoja na zingine zinazoendana na yako, chagua kategoria. + + Kwa taarifa zaidi, [angalia mwongozo wa jamii yetu](/mwongozo). Paneli hii itatokea wakati wa %{education_posts_text} ya kwanza tu. + 'new-reply': | + Karibu kwenye %{site_name} — **asante kwa kuchangia!** + + - Jibu lako linaendeleza majadiliano kwa njia moja au nyingine? + + - Kuwa mstaarabu na wanachama wenzako. + + - Ukosoaji Unaendeleza unakaribishwa, ila kosoa *fikra au wazo*, sio watu. + + Kwa mengine zaidi, [angalia mwongozo wa jamii](/mwongozo). Paneli hii itatokea wakati wa %{education_posts_text} tu. + avatar: |2 + ### Unaonaje ukiongeza picha kwenye akaunti yako? + + Umechapisha mada na majibu machache, lakini picha ya umbo lako sio ya kipekee kama wewe - ni herufi tu. + + Je umefikiria kuhusu **[kutembelea umbo lako la mtumiaji](%{profile_path})** na kupakia picha inayokuwakilisha wewe? + + Ni rahisi na kufuatilia majadiliano na kuona watu wengi kwenye maongezi kama kila mtu anapicha ya kipekee ya umbo! + sequential_replies: | + ### Kujibu machapisho mengi kwa wakati mmoja + + Badala ya kujibu mada kwa mara kadhaa kwa wakati mmoja, unaweza kutuma jibu moja lenye nukulu kutoka kwenye machapisho yaliyopita au @kumbukumbu la jina. + + Unaweza kuhariri machapisho yaliyopita kuongeza nukulu kwa kufanya yafuatayo, bainisha nakala na chagua kitufe cha nukulu jibukitakachotokea. + + Ni rahisi kwa watu wote kusoma mada ambazo zina majibu machache ukilinganisha na majibu madogo, mafupi na ya kibinafsi. + dominating_topic: | + ### Ruhusu wengine wajiunge kwenye maongezi + + Mada hii ni muhimu kwako – umechapisha zaidi ya %{percent}% ya majibu hapa. + + Una uhakika unatoa mda wa kutosha kwa watu wengine kutoa maoni yao, pia? + get_a_room: | + ### Fikia kujibu kwa watu wengi + + Umejibu mara %{count} kwenye @%{reply_username} kwenye mada hii. + + Umefikiria kuhusu kujibu watu *wengine* kwenye majadiliano, pia? Majadiliano mazuri yanashirikisha sauti na mtazamo mwingi. + + Kama ungependa, kuendelea na maongezi yako na mtumiaji huyu kwa krefu, [watumie ujumbe binafsi](/u/%{reply_username}). + too_many_replies: | + ### Umefika kiwango cha juu cha kujibu kwenye mada hii + + Tunaomba radhi, lakini watumiaji wapya wana vizuizi vya mda mfupi vya majibu %{newuser_max_replies_per_topic} kwenye mada moja. + + Badala ya kuongeza jibu lingine, unaweza kuhariri majibu uliyochapisha, au kutembelea mada zingine. + reviving_old_topic: | + ### Rudisha mada hii? + + Jibu la mwisho la mada hii lilikuwa **%{time_ago}**. Jibu lako litafanya mada ipande orodha na mtu yoyote aliyehusika kwenye maongezi. + + Una uhakika unataka kuendelea na maongezi ya mda? + activerecord: + attributes: + category: + name: "Jina la Kategoria" + topic: + title: 'Kichwa cha Habari' + post: + raw: "Mwili" + user_profile: + bio_raw: "Kuhusu Mimi" + errors: + <<: *errors + models: + topic: + attributes: + base: + warning_requires_pm: "Maonyo yanaweza kutolewa kwenye ujumbe binafsi tu." + too_many_users: "Unaweza kutuma maonyo kwa mtumiaji mmoja kwa wakati mmoja." + cant_send_pm: "Samahani, hauwezi kutuma ujumbe binafsi kwa mtumiaji huyo." + no_user_selected: "Chagua mtumiaji halali." + reply_by_email_disabled: "Kujibu kupitia barua pepe kumesitishwa." + target_user_not_found: "Mtumiaji mmoja unaejaribu kumtumia ujumbe hajapatikana." + featured_link: + invalid: "ni batili. Anwani inahitaji kuwa na http:// or https://." + invalid_category: "haiwezi kufanyiwa uhariri kwenye kategoria hii." + user: + attributes: + password: + common: "ni moja kati ya nywila 10000 zinazotumika sana. Tafadhali tumia nywila iliyo salama zaidi." + same_as_username: "ni sawa na jina la mtumiaji. Labda tumia nywila iliyo salama zaidi." + same_as_email: "ni sawa na barua pepe yako. Labda tumia nywila iliyo salama zaidi." + same_as_current: "ni sawa na nywila unayotumia sasa." + unique_characters: "ina herufi zilizorudiwa sana. Tafadhali tumia nywila iliyo salama zaidi." + ip_address: + signup_not_allowed: "Hauruhusiwi kujiunga kupitia akaunti hii." + user_email: + attributes: + user_id: + reassigning_primary_email: "Ukabidhi wa barua pepe ya msingi kwa mtu mwingine hairuhusiwi." + color_scheme_color: + attributes: + hex: + invalid: "ni rangi batili" + post_reply: + base: + different_topic: "Chapisho na jibu lazima ziwe kwenye mada moja." + web_hook: + attributes: + payload_url: + invalid: "Anwani ya mtandao ni batili. Anwani inahitaji kuwa na http:// or https://. Na wazi hairuhusiwi." + custom_emoji: + attributes: + name: + taken: tayari inatumika kwenye ishara nyingine + topic_timer: + attributes: + execute_at: + in_the_past: "lazima iwe siku ya baadae." + watched_word: + attributes: + word: + too_many: "Maneno mengi sana kwa ajili ya shughuli hiyo" + user_profile: + no_info_me: "
nafasi ya Kuhusu Mimi iko wazi,ungependa kuijaza?
" + no_info_other: "
%{name} hajaandika chochote kwenye sehemu ya Kuhusu Mimi kwenye maelezo mafupi yao
" + vip_category_name: "Majilisi" + vip_category_description: "Kategoria ya wanachama wa kiwango cha 3 cha uaminifu au zaidi." + meta_category_name: "Majibu ya Mtandao" + meta_category_description: "Majadiliano kuhusu tovuti, shirika, jinsi inavyofanya kazi, na jinsi tunaweza kuiboresha." + staff_category_name: "Wasaidizi" + staff_category_description: "Kategoria binafsi kwa ajili ya majadiliano ya wasaidizi. Mada zitaonwa na wasimamizi na viongozi tu." + assets_topic_title: "Vifaa kwa ajili ya kutengeneza tovuti" + discourse_welcome_topic: + title: "Karibu kwenye Discourse" + lounge_welcome: + title: "Karibu kwenye Majilisi" + category: + topic_prefix: "Kuhusu kategoria %{category}" + errors: + not_found: "Kategoria haijapatikana!" + uncategorized_parent: "Haiwezi kuwekwa kwenye kategoria " + self_parent: "Kategoria mtoto haiwezi kuwa mzazi yenyewe" + depth: "Hauwezi kuweka kategoria mtoto chini ya nyingine" + invalid_email_in: "'%{email}' ni barua pepe batili." + email_already_used_in_group: "'%{email}' tayari inatumika kwenye kikundi '%{group_name}'." + email_already_used_in_category: "'%{email}' tayari inatumika kwenye kategoria '%{group_name}'." + description_incomplete: "Chapisho la maelezo kwenye kategoria lazima ziwe na aya moja au zaidi." + cannot_delete: + uncategorized: "Hauwezi Kufuta Mada Ambazo Hazina Kategoria" + has_subcategories: "Hauwezi kufuta kategoria kwa sababu ina kategoria zingine." + topic_exists_no_oldest: "Hauwezi kufuta kategoria hii kwa sababu ina idadi ya mada %{count}." + uncategorized_description: "Mada ambazo hazina kategoria, au haziwezi kuwekwa kwenye kategoria zingine." + trust_levels: + newuser: + title: "mtumiaji mpya" + basic: + title: "mtumiaji wa kawaida" + member: + title: "mwanachama" + regular: + title: "kawaida" + leader: + title: "kiongozi" + change_failed_explanation: "Ulijaribu kumshusha daraja %{user_name} kwenda '%{new_trust_level}'. Lakini kiwango chake cha uaminifu tayari ni '%{current_trust_level}'. %{user_name} atabaki kwenye '%{current_trust_level}' - kama unataka kumshusha daraja loki kiwango cha uaminifu kwanza." + post: + image_placeholder: + broken: "Picha ina matatizo" + rate_limiter: + slow_down: "Umefanya kitendo hiki mara nyingi sana, tafadhali jaribu tena baadae." + too_many_requests: "Umefanya kitendo hiki mara nyingi sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + by_type: + first_day_replies_per_day: "Umefika kiwango cha juu cha majibu mtumiaji mpya anaweza kutengeneza ndani ya siku yake ya kwanza. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + first_day_topics_per_day: "Umefika kiwango cha juu cha mada mtumiaji mpya anaweza kutengeneza ndani ya siku yake ya kwanza. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + create_topic: "Unatengeneza machapisho kwa haraka sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + create_post: "Unajibu machapisho kwa haraka sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + delete_post: "Unafuta machapisho kwa haraka sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + public_group_membership: "Unajiunga/kuacha vikundi kwa haraka sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + topics_per_day: "Umefika kiwango cha juu cha kutengeneza mada mpya. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + pms_per_day: "Umefika kiwango cha juu cha ujumbe. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + create_like: "Umefika kiwango cha juu cha upendo. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + create_bookmark: "Umefika kiwango cha juu cha mialamisho. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + edit_post: "Umefika kiwango cha juu cha uhariri. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + live_post_counts: "Unaomba idadi ya chapisho zilizo hewani kwa haraka sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + unsubscribe_via_email: "Umefika kiwango cha juu cha kujitoa kupitia barua pepe. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + topic_invitations_per_day: "Umefika kiwango cha juu cha kualika watu kwenye mada. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + datetime: + distance_in_words: + half_a_minute: "< 1d" + distance_in_words_verbose: + half_a_minute: "sasa hivi" + password_reset: + no_token: "Samahani, kiungo hicho cha kuingia kupitia barua pepe ni cha mda sana. Bonyeza kitufe cha Kuingia na tumia 'Nimesahau nywila' ili upate kiungo kipya." + choose_new: "Chagua nywila" + choose: "Chagua nywila" + update: 'Sasisha Nywila' + save: 'Seti Nywila' + title: 'Weka Upya Nywila' + success: "Umebadilisha nywila yako kwa mafanikio na sasa umeingia." + success_unapproved: "Umebadilisha nywila yako kwa mafanikio." + email_login: + invalid_token: "Samahani, kiungo hicho cha kuingia kupitia barua pepe ni cha mda sana. Bonyeza kitufe cha Kuingia na tumia 'Nimesahau nywila' ili upate kiungo kipya." + title: "Ingia kupitia barua pepe" + change_email: + confirmed: "Barua pepe yako imesasishwa." + please_continue: "Endelea kwenye %{site_name}" + error: "Hitilafu imetokea wakati wa kubadilisha barua pepe yako. Labda barua pepe tayari inatumika?" + error_staged: "Hitilafu imetokea wakati wa kubadilisha barua pepe yako. Barua pepe inatumika na mtumiaji aliyekuwa staged." + already_done: "Samahani, kiungo cha uthibitisho cha akaunti ni batili. Labda barua pepe yako imeshabadilishwa??" + authorizing_old: + title: "Asante kwa kuthibitisha barua pepe yako" + description: "Tunakutumia barua pepe mpya ya kuthibitisha." + activation: + action: "Bonyeza hapa kuanzisha akkaunti yako" + already_done: "Samahani, kiungo cha uthibitisho cha akaunti ni batili. Labda akaunti yako tayari ipo hewani?" + please_continue: "Akaunti yako imethibitishwa; utapelekwa kwenye ukurasa wa nyumbani." + continue_button: "Endelea kwenye %{site_name}" + welcome_to: "Karibu kwenye %{site_name}" + approval_required: "Msimamizi lazima aipe kibali akaunti yako mpya kabla haujaanza kutumia jukwaa. Utatumiwa barua pepe akaunti yako ikipata kibali!" + missing_session: "Tumeshindwa kuona kama akaunti yako ilitengenezwa, tafadhali akikisha cookies zimeruhusiwa." + activated: "Samahani, akaunti hii imeshaanzishwa." + admin_confirm: + title: "Thibitisha Akaunti ya Kiongozi" + description: "Una uhakika unataka %{target_username}kuwa msimamizi?" + grant: "Toa ufikivu wa Kiongozi" + complete: "%{target_username}ni msimamizi." + back_to: "Rudi kwenye %{title}" + post_action_types: + off_topic: + title: 'Mada Isiyohusika' + description: 'Mada hii sio muhimu kwenye majadiliano kama kichwa na chapisho la kwanza linavyoongelea, na inabidi ihamishwe kwenda sehemu nyingine.' + short_description: 'Haina umuhimu kwenye majadiliano' + long_form: 'imeripotiwa kama haihusiki ' + spam: + title: 'Barua Taka' + description: 'Hili ni tangazo, au uharibifu. Sio muhimu kwenye mada ya sasa.' + short_description: 'Hili ni tangazo au uharibifu' + long_form: 'ameripoti hii kuwa barua taka' + email_title: '"%{title}" imeripotiwa kuwa barua taka' + email_body: "%{link}\n\n%{message}" + inappropriate: + title: 'Haifai' + description: 'Chapisho hili lina maandishi ambayo mtu mwenye akili timamu anaweza kuona ni matusi, ubaguzi, au kukiuka mwongozo wa jumuiya.' + short_description: 'Ukiukaji wa miongozo ya jukwaa letu' + long_form: 'imeripotiwa kuwa haiko sawa' + notify_user: + title: 'Mtumie @{{username}} ujumbe' + description: 'Nataka kuongea na huyu mtu moja kwa moja kuhusiana na chapisho lao.' + short_description: 'Nataka kuongea na huyu mtu moja kwa moja kuhusiana na chapisho lao.' + long_form: 'mtumiaji aliepokea ujumbe' + email_title: 'Chapisho lako ndani ya "%{title}"' + email_body: "%{link}\n\n%{message}" + notify_moderators: + title: "Kitu Kingine" + description: 'Chapisho hili linahitaji kupitiwa na msaidizi kwa sababu ambayo haijaandikwa juu.' + short_description: 'Inahitaji kupitiwa na msaidizi kwa sababu nyingine' + long_form: 'imeripotiwa ili ipitiwe na msaidizi' + email_title: 'Chapisho ndani ya "%{title}" linahitaji kupitiwa na mfanyakazi' + email_body: "%{link}\n\n%{message}" + bookmark: + title: 'Alamisha' + description: 'Alamisha chapisho hili' + short_description: 'Alamisha chapisho hili' + long_form: 'chapisho hili lilialamishwa' + like: + title: 'Penda' + description: 'Penda chapisho hili' + short_description: 'Penda chapisho hili' + long_form: 'ameipenda hii' + user_activity: + no_default: + self: "Bado hauna shughuli." + others: "Hakuna shughuli." + no_bookmarks: + others: "Hakuna mialamisho." + no_likes_given: + self: "Haujapenda machapisho yoyote." + others: "Hakuna machapisho yaliyopendwa." + no_replies: + self: "Haujajibu machapisho yoyote." + others: "Hakuna majibu." + topic_flag_types: + spam: + title: 'Barua Taka' + description: 'Hii mada ni tangazo. Sio muhimu kwenye tovuti hii, lakini inalenga kuhusu biashara.' + long_form: 'imeripotiwa kama barua taka' + inappropriate: + title: 'Haifai' + description: 'Mada hii ina maandishi ambayo mtu mwenye akili timamu anaweza kuona ni matusi, ubaguzi, au kukiuka mwongozo wa jumuiya.' + long_form: 'imeripotiwa kuwa haiko sawa' + notify_moderators: + title: "Kitu Kingine" + description: 'Mada hii inahitaji kupitiwa na msaidizi kwa sababu za mwongozo, TOS, au kwa sababu nyingine ambayo haijaorodheshwa.' + long_form: 'imeripotiwa na itapitiwa na msimamizi' + email_title: 'Mada "%{title}" inahitaji kupitiwa na msimamizi' + email_body: "%{link}\n\n%{message}" + flagging: + you_must_edit: '

Chapisho lako limeripotiwa na jumuiya. Tafadhali ona ujumbe wako.

' + user_must_edit: '

Chapisho lako limeripotiwa na jumuiya na limefichwa kwa sasa.

' + archetypes: + regular: + title: "Mada ya Kawaida" + banner: + title: "Mada ya Bango" + message: + make: "Mada hii sasa ni bango. Itaonekana juu ya kila ukurasa mpaka itakapo ondolewa na mtumiaji." + remove: "Mada hii sio bango tena. Haitatokea tena juu ya kila ukurasa." + unsubscribed: + title: "Ametolewa!" + description: "%{email} amejitoa. Kubadilisha mipangilio ya barua pepe tembelea mapendekezo yako ya mtumiaji." + topic_description: "Kuendelea kupata taarifa za %{link}, tumia kidhibiti cha taarifa kilichopo chini au kulia kwa mada." + private_topic_description: "Kuendelea kupata taarifa, tumia kidhibiti cha taarifa kilichopo chini au kulia kwa mada." + unsubscribe: + title: "Jiengua" + stop_watching_topic: "Acha kuangalia mada hii, %{link}" + mute_topic: "Nyamazisha taarifa zote za mada hii, %{link}" + unwatch_category: "Acha kuangalia mada zote kwenye %{category}" + disable_digest_emails: "Acha kunitumia muhtasari wa barua pepe" + all: "Usinitumie barua yoyote kutoka %{sitename}" + different_user_description: "Umeingia kama mtu mwingine tofauti na mtu tuliyemtumia barua pepe. Tafadhali toka, au ingia kwenye hali-tumizi ya mtu asiyejulikana, na jaribu tena." + not_found_description: "Samahani hatujaona kujiengua. Inawezekana kiungo kwenye barua pepe yako kimepita mda?" + log_out: "Toka" + user_api_key: + title: "Idhini ufikivu wa programu-tumizi" + authorize: "Idhini" + read: "soma" + read_write: "soma/andika" + description: "\"%{application_name}\" anaomba ufikivu ufuatao kwenye akaunti yako:" + no_trust_level: "Samahani, hauna kiwango cha uaminifu kinachohitajika kufikia API ya mtumiaji" + scopes: + message_bus: "Masashisho yaliyo hai" + notifications: "Soma na futa taarifa" + session_info: "Soma taarifa za kipindi cha mtumiaji" + read: "Soma zote" + write: "Andika zote" + reports: + visits: + title: "Mtumiaji Ametembelea" + xaxis: "Siku" + yaxis: "Idadi ya utembeleaji" + signups: + xaxis: "Siku" + description: "Akaunti mpya zilizosajiliwa katika kipindi hiki" + new_contributors: + title: "Wachangiaji Wapya" + xaxis: "Siku" + yaxis: "Idadi ya wachangiaji wapya" + profile_views: + title: "Umbo la Mtumiaji Limetembelewa" + xaxis: "Siku" + yaxis: "Idadi ya maumbo ya watumiaji yaliyoangaliwa" + topics: + title: "Mada" + xaxis: "Siku" + yaxis: "Idadi ya mada mpya" + description: "Mada mpya zilizotengenezwa katika kipindi hiki" + posts: + title: "Machapisho" + xaxis: "Siku" + yaxis: "Namba ya machapisho mapya" + description: "Machapisho mapya yaliyotengenezwa kwenye kipindi hiki" + likes: + title: "Upendo" + xaxis: "Siku" + yaxis: "Idadi ya upendo mpya" + flags: + title: "Bendera" + xaxis: "Siku" + yaxis: "Idadi ya bendera" + bookmarks: + title: "Mialamisho" + xaxis: "Siku" + yaxis: "Idadi ya mialamisho mapya" + starred: + title: "Wekewa nyota" + xaxis: "Siku" + yaxis: "Idadi ya mada mpya zenye nyota" + users_by_trust_level: + title: "Watumiaji kwenye Kila Kiwango cha Uaminifu" + xaxis: "Kiwango cha Uaminifu" + yaxis: "Idadi ya Watumiaji" + users_by_type: + title: "Watumiaji wa kila aina" + xaxis: "Aina" + yaxis: "Idadi ya Watumiaji" + xaxis_labels: + admin: Kiongozi + moderator: Msimamizi + suspended: Alisitishwa + silenced: Amenyamazishwa + trending_search: + title: Utafiti maarufu + labels: + term: Neno + searches: Utafiti + emails: + title: "Barua pepe zilizotumwa" + xaxis: "Siku" + yaxis: "Idadi ya barua pepe" + user_to_user_private_messages: + xaxis: "Siku" + yaxis: "Idadi ya ujumbe" + user_to_user_private_messages_with_replies: + xaxis: "Siku" + yaxis: "Idadi ya ujumbe" + system_private_messages: + title: "Mfumo" + xaxis: "Siku" + yaxis: "Idadi ya ujumbe" + moderator_warning_private_messages: + title: "Onyo kwa Msimamizi" + xaxis: "Siku" + yaxis: "Idadi ya ujumbe" + notify_moderators_private_messages: + title: "Wajulishe Wasimamizi" + xaxis: "Siku" + yaxis: "Idadi ya ujumbe" + notify_user_private_messages: + title: "Mjulishe Mtumiaji" + xaxis: "Siku" + yaxis: "Idadi ya ujumbe" + top_referrers: + title: "Warejeshaji wa Juu" + xaxis: "Mtumiaji" + num_clicks: "Imebonyezwa" + num_topics: "Mada" + top_traffic_sources: + title: "Chanzo cha Msongamano Kwenye Mtandao" + xaxis: "Kikoa" + num_clicks: "Imebonyezwa" + num_topics: "Mada" + num_users: "Watumiaji" + top_referred_topics: + title: "Mada za Juu za Kurejesha" + page_view_anon_reqs: + title: "Asiyejulikana" + xaxis: "Siku" + yaxis: "Ukurasa umeonwa na Wasiojulikana Mara" + page_view_logged_in_reqs: + title: "Ameingia" + xaxis: "Siku" + page_view_crawler_reqs: + title: "Vidudu vya Kuchunza Mitandao" + xaxis: "Siku" + page_view_total_reqs: + xaxis: "Siku" + yaxis: "Karatasi imeonwa Mara" + page_view_logged_in_mobile_reqs: + xaxis: "Siku" + yaxis: "Karatasi imeonwa Kupitia Kifaa cha kiganjani" + page_view_anon_mobile_reqs: + xaxis: "Siku" + http_background_reqs: + title: "Mandharinyuma" + xaxis: "Siku" + http_2xx_reqs: + title: "Hali 2xx (SAWA)" + xaxis: "Siku" + yaxis: "Maombi yamekubaliwa (Hali 2xx)" + http_3xx_reqs: + title: "HTTP 3xx (Badilisha)" + xaxis: "Siku" + yaxis: "Badilisha Maombi (Hali 3xx)" + http_4xx_reqs: + title: "HTTP 4xx ( Hitilafu la Mteja)" + xaxis: "Siku" + yaxis: "Hitilafu ya Wateja (Hali 4xx)" + http_5xx_reqs: + title: "HTTP 5xx (Hitilafu ya Seva)" + xaxis: "Siku" + yaxis: "Hitilafu za Seva (Hali 5xx)" + http_total_reqs: + title: "Jumla" + xaxis: "Siku" + yaxis: "Jumla ya Maombi" + time_to_first_response: + title: "Mda wa kupata jibu la kwanza" + xaxis: "Siku" + yaxis: "Wastani wa Mda (Saa)" + topics_with_no_response: + title: "Mada ambazo hazina majibu" + xaxis: "Siku" + yaxis: "Jumla" + mobile_visits: + xaxis: "Siku" + yaxis: "Namba ya watu waliyotembelea" + web_crawlers: + title: "Vidudu vya kuchunza mitandao vina maombi" + dashboard: + rails_env_warning: "Seva inafanyakazi ndani ya %{env} halitumizi." + host_names_warning: "Fili lako la config/database.yml linatumia localhost hostname. Sasisha ili itumie hostname ya tovuti yako." + gc_warning: 'Seva yako inatumia ruby garbage collection parameters, ambayo haiwezi kukupa utendaji mzuri. Soma mada kuhusiana na kufanya utendaji uwe vizuri: Tuning Ruby and Rails for Discourse' + sidekiq_warning: 'Sidekiq haifanyi kazi. Shughuli nyingi kama kutuma barua pepe, zinashughulikiwa na sidekiq. Tafadhali hakikisha kuwa mfumo wa sidekiq unafanya kazi. Jifunza kuhusu Sidekiq hapa.' + queue_size_warning: 'Namba za kazi zilizopangwa ni %{queue_size}, ambazo ni nyingi. Hii inaweza kusababishwa na tatizo na m(i)fumo wa Sidekiq, au inabidi uongeze wafanyakazi wa Sidekiq.' + memory_warning: 'Seva yako inatumia chini ya GB 1 ya kumbukumbu. Tunakushauri utumie kumbukumbu zaidi ya GB 1.' + google_oauth2_config_warning: 'Seva inaruhusu watu kujiunga au kuingia kwa kutumia Google OAuth2 (enable_google_oauth2_logins), lakini taarifa za client id and client secret hazijaandikwa. Nenda kwenye Mipangilio ya Tovuti na sasisha mipangilio. Tembelea mwongozo kwa taarifa zaidi.' + facebook_config_warning: 'Seva inaruhusu watu kujiunga au kuingia kwa kutumia Facebook (enable_facebook_logins), lakini taarifa za client id and client secret hazijaandikwa. Nenda kwenye Mipangilio ya Tovuti na sasisha mipangilio. Tembelea mwongozo kwa taarifa zaidi.' + twitter_config_warning: 'Seva inaruhusu watu kujiunga au kuingia kwa kutumia Twitter (enable_twitter_logins), lakini taarifa za client id and client secret hazijaandikwa. Nenda kwenye Mipangilio ya Tovuti na sasisha mipangilio. Tembelea mwongozo kwa taarifa zaidi.' + github_config_warning: 'Seva inaruhusu watu kujiunga au kuingia kwa kutumia Github (enable_github_logins), lakini taarifa za client id and client secret hazijaandikwa. Nenda kwenye Mipangilio ya Tovuti na sasisha mipangilio. Tembelea mwongozo kwa taarifa zaidi.' + s3_config_warning: 'Seva imeruhusiwa kupakia mafile kwenye s3, lakini kuna mipangilio ambayo haina taarifa: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile, au s3_upload_bucket. Nenda kwenye Mipangilio ya Tovutina sasisha mipangilio. Tembelea "Jinsi ya kuwezesha upakiaji wa picha kwenye S3?" kwa ajili ya taarifa zaidi.' + s3_backup_config_warning: 'Seva imeruhusiwa kupakia chelezo kwenye s3, lakini kuna mipangilio ambayo haina taarifa: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile, au s3_upload_bucket. Nenda kwenye Mipangilio ya Tovuti na sasisha mipangilio. Tembelea "Jinsi ya kuwezesha upakiaji wa picha kwenye S3?" kwa ajili ya taarifa zaidi.' + image_magick_warning: 'Seva imesanidiwa kutengeneza vijipicha vya picha kubwa, lakini ImageMagick haijasanikisha. Sanikisha ImageMagick kwa kutumia paketi meneja au pakua toleo jipya.' + failing_emails_warning: 'Kuna kazi %{num_failed_jobs} za barua pepe ambazo zimeshindwa. Angalia file la app.yml na hakikisha mipangilio ya seva za barua ziko sawa. Ona kazi zilizoshindwa ndani ya Sidekiq.' + missing_mailgun_api_key: "Seva imesanidiwa kutuma barua pepe kwa kutumia Mailgun lakini haujaweka ufunguo wa Mailgun unaotumika kuthibitisha ujumbe." + bad_favicon_url: "Ishara unayoipenda imeshindwa kuonekana. Angalia mipangilio ya favicon_url ndani ya Mipangilio ya Tovuti." + force_https_warning: "Tovuti yako inatumia SSL. Lakini `force_https` haijaruhusiwa kwenye mipangilio ya tovuti yako." + site_settings: + censored_words: "Maneno ambayo yatabadilishwa kuwa ■■■■" + delete_old_hidden_posts: "Futa machapisho yote ambayo yatakuwa yamefichwa baada ya siku 30." + default_locale: "Lugha ya Discourse" + allow_user_locale: "Waruhusu watumiaji wachague lugha ya kutumia au kuwasiliana" + support_mixed_text_direction: "ruhusu mchanganyiko wa mwelekeo wa maneno wa kushoto-kwenda-kulia na kulia-kwenda-kushoto" + min_post_length: "Kiwango cha chini cha herufi za chapisho zinazokubaliwa" + min_first_post_length: "Kiwango cha chini cha herufi za chapisho la kwanza (mwili wa mada) zinazokubaliwa" + min_personal_message_post_length: "Kiwango cha chini cha herufi za chapisho zinazokubaliwa kwenye ujumbe" + max_post_length: "Kiwango cha juu cha herufi za chapisho zinazokubaliwa" + topic_featured_link_enabled: "Ruhusu uchapishaji wa kiungo pamoja na mada." + show_topic_featured_link_in_digest: "Onyesha kiungo cha mada kwenye barua pepe." + min_topic_title_length: "Kichwa cha mada kinatakiwa kuwa na zaidi ya herufi" + max_emojis_in_title: "Kiwango cha juu cha emojis zinazoruhusiwa kwenye kichwa cha mada" + min_search_term_length: "Kiwango cha chini cha herufi za neno linalotafutwa" + search_prefer_recent_posts: "Iwapo upekuzi wa jukwaa ni kokotevu, chaguo hili litajaribu farihisi ya machapisho ya karibuni" + search_recent_posts_size: "Machapisho mangapi ya hivi karibuni yabaki kwenye kielezo" + log_search_queries: "hifadhi utafiti wa watumiaji" + search_query_log_max_size: "Kiwango cha juu cha utafiti kuhifadhiwa" + allow_uncategorized_topics: "Ruhusu mada zitengenezwe bila kategoria. ONYO: Kama kuna mada ambazo hazina kategoria, itakubidi uziweke kwenye kategoria kabla ya kuzima hii." + allow_duplicate_topic_titles: "Ruhusu mada zenye vichwa vya habari vinavyofanana au vinavyojirudia." + unique_posts_mins: "Dakika ngapi zipite kabla mtumiaji ajachapisha mada yenye maandishi yale yale tena." + educate_until_posts: "Mtumiaji akianza kuandika machapisho mapya (n), onyesha paneli ya ufundishaji kwenye sehemu ya kuandika maneno." + title: "jina kwenye tovuti, kama linalotumika kwenye kichwa cha lebo." + site_description: "Elezea tovuti hii kwenye sentensi moja, kama ilivyo kwenye maelezo ya lebo ya meta" + contact_email: "Barua pepe ya mtu muhimu anayesimamia tovuti hii. Inatumika kwa ajili ya taarifa muhimu sana, na kwa ajili ya mawasiliano muhimu /kuhusiana" + contact_url: "Anwani ya mawasiliano ya tovuti. Itatumika kwenye /kuhusu fomu ya mawasiliano kwa ajili ya dharura." + download_remote_images_max_days_old: "Usipakue picha kutoka ufikivu kutoka mbali kwa ajili ya machapisho ambayo ni zaidi ya siku n." + editing_grace_period: "Kwa sekundi (n) baada ya kuchapisha, uhariri hautatengeneza nakala mpya kwenye historia ya chapisho." + staff_edit_locks_post: "Machapisho hayataweza kufanyiwa uhariri kama yakihaririwa na wafanyakazi" + edit_history_visible_to_public: "Ruhusu kila mtu aone matoleo ya kabla ya chapisho lililofanyiwa uhariri. Ikisitishwa, wasaidizi tu wataweza kuona." + delete_removed_posts_after: "Machapisho yaliyofutwa na mwandishi yataondolewa baada ya masaa (n). Kama ikiwaset kwenye 0, machapisho yataondolewa hapo hapo." + max_image_width: "Kiwango cha juu cha upana wa kijipicha za picha kwenye chapisho" + max_image_height: "Kiwango cha juu cha urefu wa kijipicha za picha kwenye chapisho" + add_rel_nofollow_to_user_content: "Ongeza rel nofollow kwenye maandishi yote mtumiaji aliyotoa, isipokuwa viungo vya ndani (pamoja na kikoa baba). Ukibadilisha hii, lazima urebake machapisho yote na: \"rake machapishi:rebake\"" + onebox_domains_blacklist: "Orodha ya anwani za mitandao ambazo hazijawekwa kwenye boxi." + inline_onebox_domains_whitelist: "Orodha za anwani za mtandao ambazo zitawekwa kwenye boxi kama zikiunganishwa bila kichwa cha habari" + summary_score_threshold: "Alama ya chini ambayo mada inahitaji kabla ya kuwekwa ndani ya 'Fupisha Hii Mada' " + summary_posts_required: "Kiwango cha chini cha machapisho ndani ya mada kabla 'Fupisha Mada' haijaonyeshwa" + summary_likes_required: "Kiwango cha chini cha likes ndani ya mada kabla 'Mada kufupishwa' haijaruhusiwa" + summary_percent_filter: "Mtumiaji akibonyeza 'Fupisha Hii Mada', onyesha % machapisho ya juu" + summary_max_results: "Kiwango cha juu cha machapisho zinazoonyeshwa kutoka kwa 'Muhtasari wa Hii Mada'" + enable_personal_messages: "Ruhusu watumiaji wenye kiwango cha 1 cha uaminifu (inasanidiwa kwa kupitia kiwango cha chini cha uaminifu kutuma ujumbe) kutuma ujumbe wa barua pepe. Wasaidizi wataweza kutuma ujumbe mda kila wakati." + enable_system_message_replies: "Waruhusu watumiaji wajibu ujumbe wa mfumo,hata kama ujumbe binafsi umezuiliwa." + notify_mods_when_user_silenced: "Kama mtumiaji akinyamazishwa, tuma ujumbe kwa wasimamizi wote." + enable_markdown_linkify: "Otomatikali maneno yanayofanana na kiungo ni kiungo: www.site.com na http://site.com zitakuwa viungo otomatikali." + markdown_linkify_tlds: "Orodha ya vikoa vya hali ya juu ambavyo otomatikali ni viungo." + post_undo_action_window_mins: "Dakika watumiaji wanaruhusiwa kutendua vitendo vya hivi karibuni kwenye chapisho (kupenda, bendera, etc)." + must_approve_users: "Wasaidizi lazima wathibitishe akaunti zote mpya za watumiaji kabla hawajaruhusiwa kufikia tovuti. ONYO: ukiruhusu hii kwenye tovuti iliyo hewani, itasitisha ufikivu wa watumiaji ambao sio wasaidizi!" + pending_users_reminder_delay: "Wajulishe wasimamizi kama watumiaji wapya wamekuwa wanasubiria kibali kwa mda zaidi ya masaa haya. Seti -1 kusitisha taarifa." + maximum_session_age: "mtumiaji ataendelea kuwa ndani kwa masaa n toka mara ya mwisho alipotembelea" + ga_universal_tracking_code: "Google Universal Analytics (analytics.js) inafuatilia kodi kodi, mfano: UA-12345678-9; tembelea http://google.com/analytics" + allow_moderators_to_create_categories: "Waruhusu wasimamizi watengeneze mada mpya" + site_contact_username: "Jina la msaidizi lililo sahihi litakalotuma ujumbe otomatikali. Kama ikiachwa wazi chaguo-msingi la akaunti ya mfumo litatumika." + send_welcome_message: "Watumie watumiaji wapya ujumbe wa kuwakaribisha na muongozo mfupi wa kuanzia." + topics_per_period_in_top_summary: "Namba ya mada za juu zitakazo onyeshwa kama chaguo-msingi la muhtasari wa mada za juu." + topics_per_period_in_top_page: "Idadi ya mada za juu zitakazo onyeshwa kwenye upande wa 'Onyesha Zaidi' mada za juu." + redirect_users_to_top_page: "Otomatikali watumiaji wapya na wale ambao hawapo watapelekwa juu ya ukurasa." + top_page_default_timeframe: "Chaguo-msingi la mda wa fremu kwa ajili ya kurasa wa juu wa kuangalia." + show_email_on_profile: "Onyesha barua pepe za mtumiaji kwenye umbo lao (wataona wao na wasaidizi)" + email_token_valid_hours: "Nimesahau nywila / tokens za kuanzisha akaunti zina kibali cha masaa (n)" + enable_badges: "Ruhusu mfumo wa beji" + enable_whispers: "Ruhusu mawasiliano binafsi kati ya wasaidizi ndani ya mada." + new_version_emails: "Tuma barua pepe kwa barua pepe_mawasiliano toleo jipya la Discourse likitolewa." + invite_expiry_days: "Funguo za mualiko ni sahihi, kwa siku ngapi" + invite_only: "Usajili wa umma umesitishwa, watumiaji wapya inabidi waalikwe na wasaidizi." + min_password_length: "Kiwango cha chini cha urefu wa nywila" + min_admin_password_length: "Kiwango cha chini cha urefu wa nywila ya Kiongozi." + password_unique_characters: "Idadi ya chini ya herufi pekee nywila inahitaji." + block_common_passwords: "Usiruhusu nywila amabazo zipo kati ya nywila 10,000 zinazotumika mara kwa mara." + enable_sso: "Ruhusu uingiaji kwa kupitia tovuti ya nje (ONYO: BARUA PEPE ZA WATUMIAJI *LAZIMA* ZITHIBITISHWE NA TOVUTI YA NJE!)" + enable_local_logins_via_email: "Ruhusu watumiaji kuomba kuingia kupitia kiungo ambacho kitatumwa kupitia barua pepe." + allow_new_registrations: "Ruhusu usajili wa watumiaji wapya. Ondoa hii kusitisha mtu yoyote kutengeneza akaunti mpya." + enable_signup_cta: "Onyesha ilani kwa watumiaji wasiojulikana itakayowaambia watengeneze akaunti." + enable_yahoo_logins: "Ruhusu Uhalalishaji wa Yahoo" + google_oauth2_client_id: "Utambulisho wa Mtumiaji kwa ajili ya Programu-timizi ya Google" + google_oauth2_client_secret: "Siri ya Mtumiaji kwa ajili ya Programu-timizi ya Google" + enable_twitter_logins: "Ruhusu Uhalalishaji wa Twitter, inahitaji twitter_consumer_key na twitter_consumer_secret" + twitter_consumer_key: "Ufunguo wa Mtumiaji kwa ajili ya Uhalalishaji wa Twitter, umesajiliwa kwenye https://apps.twitter.com/" + twitter_consumer_secret: "Ufunguo wa siri kwa ajili ya Uhalalishaji wa Twitter, umesajiliwa kwenye https://apps.twitter.com/" + enable_instagram_logins: "Ruhusu Uhalalishaji wa Instagram, inahitaji instagram_consumer_key na instagram_consumer_secret" + instagram_consumer_key: "Ufunguo wa uhalalishaji wa Mtumiaji kupitia Instagram" + instagram_consumer_secret: "Uhalalishaji wa Siri wa Mtumiaji kupitia Instagram" + enable_facebook_logins: "Ruhusu Uhalalishaji wa Facebook, inahitaji facebook_app_id na facebook_app_secret" + facebook_app_id: "Utambulisho wa Progamu-Jalizi kwa ajili ya Uhalalishaji wa Facebook, umesajiliwa kwenye https://developers.facebook.com/apps" + facebook_app_secret: "Ufunguo wa siri wa kibali kwa ajili ya Uhalalishaji wa Facebook, umesajiliwa kwenye https://developers.facebook.com/apps" + enable_github_logins: "Ruhusu Uhalalishaji wa Github, inahitaji github_client_id and github_client_secret" + github_client_id: "Utambulisho wa Mtumiaji kwa ajili ya Uhalalishaji wa Github, umesajiliwa kwenye https://github.com/settings/applications" + github_client_secret: "Utambulisho wa Siri wa Mtumiaji kwa ajili ya Uhalalishaji wa Github, umesajiliwa kwenye https://github.com/settings/applications" + readonly_mode_during_backup: "Ruhusu hali-tumizi ya usomaji tu kipindi cha chelezo" + enable_backups: "Ruhusu wasimamizi watengeneze machelezo ya jamii" + allow_restore: "ruhusu urejeshaji, itabadilisha taarifa zote za tovuti! Acha iwe hapana, badilisha kama unataka kurejesha chelezo" + maximum_backups: "Kiwango cha juu cha chelezo kutunza kwenye diski. Machelezo ya mda yatafutwa otomatikali" + backup_frequency: "idadi ya siku kati ya machelezo." + rate_limit_create_topic: "Baada ya kutengeneza mada, watumiaji wasubiri sekunde (n) kabla ya kutengeneza mada nyingine." + rate_limit_create_post: "Baada ya kuchapisha, watumiaji wasubiri sekunde (n) kabla ya kutengeneza mada nyingine." + rate_limit_new_user_create_topic: "Baada ya kutengeneza mada, watumiaji wapya wasubiri sekunde (n) kabla ya kutengeneza mada nyingine." + rate_limit_new_user_create_post: "Baada ya kuchapisha, watumiaji wapya wasubiri sekunde (n) kabla ya kutengeneza mada nyingine." + max_likes_per_day: "Kiwango cha juu cha upendo kwa kila mtumiaji kwa siku." + max_flags_per_day: "Kiwango cha juu cha bendera kwa kila mtumiaji kwa siku." + max_bookmarks_per_day: "Kiwango cha juu cha mialamisho kwa kila mtumiaji kwa siku." + max_edits_per_day: "Kiwango cha juu cha uhariri kwa kila mtumiaji kwa siku." + max_topics_per_day: "Kiwango cha juu cha mada mtumiaji anaweza kutengeneza kwa siku." + max_personal_messages_per_day: "Kiwango cha juu cha ujumbe mtumiaji anaweza kutengeneza na kutuma kwa siku." + max_invites_per_day: "Kiwango cha juu cha mialiko mtumiaji anaweza kutuma kwa siku." + max_topic_invitations_per_day: "Kiwango cha juu cha mialiko ya mada mtumiaji anaweza kutuma kwa siku." + max_logins_per_ip_per_hour: "Kiwango cha juu cha uingiaji mtumiaji anaruhusiwa kuendana na anwani yake ya mtandao kila saa" + max_logins_per_ip_per_minute: "Kiwango cha juu cha uingiaji mtumiaji anaruhusiwa kuendana na anwani yake ya mtandao kila dakika" + alert_admins_if_errors_per_minute: "Idadi ya hitilafu kila dakika itakayomfanya kiongozi apate taarifa. Namba ya 0 inasitisha kipengele hichi. NOTI: inahitaji uanzishaji upya." + alert_admins_if_errors_per_hour: "Idadi ya hitilafu kila saa itakayomfanya kiongozi apate taarifa. Namba ya 0 inasitisha kipengele hichi. NOTI: inahitaji uanzishaji upya." + categories_topics: "Idadi ya mada kuonyeshwa ndani ya ukurasa wa /kategoria." + suggested_topics: "Idadi ya mada zilizo chini ya mada watumiaji wanazo shauriwa kutembelea. " + limit_suggested_to_category: "Onyesha mada pekee kutoka kwenye kategoria za hivi karibuni ndani ya mada wanazo shauriwa kutembelea." + suggested_topics_max_days_old: "Mada wanazo shauriwa kutembelea ziwe na umri wa siku n." + allow_staff_to_upload_any_file_in_pm: "Waruhusu wafanyakazi kupakia mafaili kwenye PM" + default_invitee_trust_level: "Chaguo-msingi la Kiwango cha Uaminifu (0-4) kwa watumiaji walioalikwa." + default_trust_level: "Chaguo-msingi la Kiwango cha Uaminifu (0-4) kwa watumiaji wapya. ONYO! Ukibadilisha hii utajiweka kwenye hatari ya kupata barua au ujumbe taka." + tl1_requires_topics_entered: "Mada ngapi inabidi ziandikwe na mtumiaji kabla ya kupanda cheo kufika kiwango cha uaminifu cha 1." + tl1_requires_read_posts: "Mtumiaji Mpya inabidi asome machapisho mangapi kabla ya kufika daraja la 1 la uaminifu." + tl1_requires_time_spent_mins: "Mtumiaji Mpya inabidi asome machapisho kwa mda gani kabla ya kufika daraja la 1 la uaminifu." + tl2_requires_topics_entered: "Mada ngapi inabidi ziandikwe na mtumiaji kabla ya kupanda cheo kufika kiwango cha uaminifu cha 2." + tl2_requires_read_posts: "Mtumiaji Mpya inabidi asome machapisho mangapi kabla ya kufika daraja la 2 la uaminifu." + tl2_requires_time_spent_mins: "Mtumiaji Mpya inabidi asome machapisho kwa mda gani kabla ya kufika daraja la 2 la uaminifu." + tl2_requires_days_visited: "Siku ngapi lazima zipite kabla mtumiaji hajapanda cheo kufika kiwango cha 2 cha uaminifu." + tl2_requires_likes_received: "Mada ngapi inabidi ziandikwe na mtumiaji kabla ya kupanda cheo kufika kiwango cha 2 cha uaminifu." + tl2_requires_likes_given: "Mtumiaji inabidi atoe upendo mngapi kabla ya kupanda cheo kufika kiwango cha 2 cha uaminifu." + tl2_requires_topic_reply_count: "Mada ngapi inabidi zijiibiwe na mtumiaji kabla ya kupanda cheo kufika kiwango cha 2 cha uaminifu." + tl3_time_period: "Kiwango cha 3 cha uaminifu kipindi cha mda (siku)" + tl3_requires_days_visited: "Kiwango " + tl3_requires_posts_read: "Asilimia ya machapisho yaliyotengenezwa ndani ya siku (mda wa kiwango cha 3 cha uaminifu) ambazo mtumiaji anahitaji kuangalia kabla ya kufika kiwango cha 3 (0 mpaka 100)" + tl3_requires_posts_read_cap: "Kiwango cha juu cha machapisho yanayotakiwa kusomwa ndani ya siku (mda wa kiwango cha 3 cha uaminifu)." + tl3_requires_topics_viewed_all_time: "Kiwango cha chini cha machapisho yanayotakiwa kuangaliwa na mtumiaji ili afuzu kiwango cha 3 cha uaminifu." + tl3_requires_posts_read_all_time: "Kiwango cha chini cha machapisho yanayotakiwa kufuzu kiwango cha 3 cha uaminifu." + tl3_requires_max_flagged: "Mtumiaji lazima asiwe na machapisho x yaliyopewa bendera na watumiaji x tofauti ndani ya siku (mda wa kiwango cha 3 cha uaminifu) kufuzu kiwango cha tatu cha uaminifu, ambapo x ni namba ya mpangalio. (0 na juu)" + tl3_promotion_min_duration: "Siku ambazo lazima zipite kwa mtumiaji aliyepanda cheo kufika kiwango cha 3 cha uaminifu kabla hajarudishwa kwenye kiwango cha 2 cha uaminifu." + tl3_requires_likes_given: "Kiwango cha chini cha upendo unaotakiwa kutolewa ndani ya siku (tl3 time period) ili mtu afuzu kufika kiwango cha 3 cha uaminifu." + tl3_requires_likes_received: "Kiwango cha chini cha upendo unaotakiwa kupokelewa ndani ya siku (tl3 time period) ili mtu afuzu kufika kiwango cha 3 cha uaminifu." + trusted_users_can_edit_others: "Ruhusu watumiaji wenye viwango vya juu vya uaminifu kuhariri maandishi ya watumiaji wengine" + min_trust_to_create_topic: "kiwango cha chini cha uaminifu kinachohitajika kabla ya kutengeneza mada mpya." + allow_flagging_staff: "Kama ikiruhusiwa, watumiaji wanaweza kuweka bendera kwenye machapisho kutoka kwenye akaunti za wasaidizi." + min_trust_to_edit_wiki_post: "Kiwango cha chini cha uaminifu kinachohitajika kuhariri machapisho ambayo ni wiki." + min_trust_to_edit_post: "Kiwango cha chini cha uaminifu kinachohitajika kabla ya kuhariri machapisho." + min_trust_to_allow_self_wiki: "Kiwango cha chini cha uaminifu kinachohitajika na mtumiaji kuweza kufanya chapisho lake liwe wiki." + min_trust_to_send_messages: "kiwango cha chini cha uaminifu kinachohitajika kabla ya kuandika ujumbe mpya binafsi." + min_trust_to_flag_posts: "Kiwango cha chini cha uaminifu kinachohitajika kabla ya kuweka bendera kwenye machapisho." + min_trust_to_post_links: "Kiwango cha chini cha uaminifu kinachohitajika kabla ya kuweka viungo kwenye machapisho." + min_trust_to_post_images: "Kiwango cha chini cha uaminifu kinachohitajika kuweka picha kwenye chapisho" + newuser_max_links: "Viungo vingapi mtumiaji mpya anaweza kuongeza kwenye chapisho." + newuser_max_images: "Picha ngapi mtumiaji mpya anaweza kuweka kwenye chapisho." + newuser_max_attachments: "Viambatanisho vingapi mtumiaji mpya anaweza kuweka kwenye chapisho." + newuser_max_mentions_per_post: "Namba ya taarifa za @jina mtumiaji mpya anaweza kutumia kwenye chapisho." + newuser_max_replies_per_topic: "Namba ya majibu mtumiaji mpya anaruhusiwa kuandika kwenye mada moja mpaka mtu atakapomjibu" + max_mentions_per_post: "Namba ya taarifa za @jina mtumiaji yoyote anaweza kutumia kwenye chapisho." + enable_mentions: "Waruhusu watumiaji waweze kutaja watumiaji wengine." + email_time_window_mins: "Subiri dakika (n) kabla ya kutuma barua pepe zenye taarifa, kuwapa mda watumiaji nafasi ya kuhariri na kumalizia machapisho yao." + personal_email_time_window_seconds: "Subiria sekunde (n) kabla ya kutuma ujumbe binafsi barua pepe za taarifa, kuwapa watumiaji nafasi kuhariri na kumalizia ujumbe wao." + title_max_word_length: "Kiwango cha juu cha urefu wa neno, kwenye herufi, kwenye kichwa cha mada inachoruhusiwa." + allow_uppercase_posts: "Ruhusu herufi kubwa kwenye kichwa cha mada au mwili wa chapisho." + topic_views_heat_low: "Baada ya kuangaliwa na namba fulani ya watu, namba ya watu walioiangalia itaangaza kwa kiasi kidogo." + topic_views_heat_medium: "Baada ya kuangaliwa na namba fulani ya watu, namba ya watu walioiangalia itaangaza kwa wastani." + topic_views_heat_high: "Baada ya kuangaliwa na namba fulani ya watu, namba ya watu walioiangalia itaangaza kwa kiasi kikubwa." + cold_age_days_low: "Baada ya siku nyingi za majadiliano, tarehe ya mwisho ya shughuli itaangaza kiasi." + cold_age_days_medium: "Baada ya siku nyingi za majadiliano, tarehe ya mwisho ya shughuli itaangaza kiasi." + cold_age_days_high: "Baada ya siku hizi nyingi za majadiliano, tarehe ya mwisho ya shughuli itaangaza kiasi." + newuser_spam_host_threshold: "Mara ngapi mtumiaji mpya anaweza kuchapisha kiungo kwenye komputa mwenyeji ndani ya machapisho ya `newuser_spam_host_threshold` kabla ya taarifa kuitwa barua taka." + white_listed_spam_host_domains: "Orodha ya vikoa vilivyotengwa kutoka kwenye majaribio ya komputa mwenyeji ya barua taka. Watumiaji wapya hawatazuiliwa kutengeneza machapisho yenye viungo kwenda kwenye vikoa hivi." + topic_view_duration_hours: "Hesabu utembezi wa mada mpya mara moja kuendana na anwani ya mtandao/Mtumiaji kila baada ya masaa N" + user_profile_view_duration_hours: "Hesabu utembezi wa mada mpya mara moja kuendana na anwani ya mtandao/Mtumiaji kila baada ya masaa N" + max_new_accounts_per_registration_ip: "Kama kuna akaunti 0 zenye kiwango (n) cha uaminifu kutoka kwenye anwani hii ya mtandao (na hakuna hata mmoja ambaye ni msaidizi or kwenye kiwango cha 2 cha uaminifu au zaidi), kataa usajili kutoka kwenye anwani hiyo." + num_hours_to_close_topic: "Mda wa masaa kusitisha mada ili kuingilia." + auto_silence_fast_typers_max_trust_level: "Kiwango cha juu cha uaminifu kunyamazisha wanaochapa haraka sana otomatikali" + auto_silence_first_post_regex: "Taarifa zilizo ndani ya mabano hazitapewa kipaumbele kama herufi ni kubwa au ndogo, kama zikipitishwa zitasababisha chapisho la kwanza linyamazishwe na lisubirishwe. Mfano raging|a[bc]a , itasababisha machapisho yote yenye raging au aba au aca yamazishwe mara ya kwanza. Kanuni hii inatokea kwenye chapisho la kwanza tu." + flags_default_topics: "Onyesha mada zilizoripotiwa kama chaguo-msingi upande wa kiongozi" + reply_by_email_enabled: "Ruhusu majibu ya mada kupitia barua pepe." + private_email: "Usiweke ndani maandishi ya machapisho au mada kwenye barua pepe kwa ajili ya ulinzi zaidi." + delete_all_posts_max: "Kiwango cha juu cha machapisho yanayoweza kufutwa mara moja na kitufe cha Futa Machapisho Yote. Kama mtumiaji ana namba fulani ya machapisho, machapisho hayawezi kufutwa mara moja na mtumiaji hawezi kufutwa. " + digest_topics: "Kiwango cha juu cha mada maarufu kuonyeshwa kwenye muhtasari wa barua pepe." + digest_posts: "Kiwango cha juu cha machapisho kitakacho onyeshwa kwenye muhtasari ya barua pepe." + digest_other_topics: "Kiwango cha juu cha mada maarufu kuonyeshwa ndani ya 'Mada na kategoria mpya ' kwenye muhtasari wa barua pepe." + suppress_digest_email_after_days: "Husuru muhtasari wa barua pepe kwa watumiaji ambao hawajaonekana kwenye tovuti zaidi ya siku (n)" + digest_suppress_categories: "Husuru kategoria hizi kutokea kwenye muhtasari wa barua pepe." + disable_digest_emails: "Sitisha muhtasari wa barua pepe za watumiaji wote." + sequential_replies_threshold: "Namba ya machapisho mtumiaji anaruhusiwa kuandika kabla ya kukumbushwa kuwa ameandika majibu mengi yanayofuatana." + get_a_room_threshold: "Namba ya machapisho mtumiaji anaruhusiwa kuandika kwa mtu mmoja kwenye mada moja kabla ya kupata onyo." + dominating_topic_minimum_percent: "Namba ya machapisho mtumiaji anaruhusiwa kuandika kwenye mada kabla ya kukumbushwa kuwa anamiliki mada sana." + native_app_install_banner: "Waulize wageni wa mara kwa mara kusanikisha Discourse programu-tumizi." + auto_handle_queued_age: "Shughulikia rekodi zinazosubirishwa baada ya siku hizi. Bendera zitapuuzwa . Machapisho kwenye foleni na watumiaji watakataliwa. Weka namba 0 kusitisha hiki kipengele." + display_name_on_posts: "Onyesha jina lote kwenye machapisho zaidi ya @jinalamtumiaji" + show_time_gap_days: "Kama machapisho mawili yametengenezwa baada ya siku hizi kupita, onyesha utofauti wa mda kwenye mada." + short_progress_text_threshold: "Baada ya namba za machapisho kupita namba hii, indiketa ya maendeleo kijaonyesha namba ya machapisho ya karibuni tu. Ukibadilisha upana wa indiketa ya maendeleo, itabidi ubadilishe hii namba." + embed_truncate: "Fupisha machapisho yaliyo ambatanishwa." + embed_support_markdown: "Ruhusu umbizo wa Markdown kwa ajili ya machapisho yaliyoambatanishwa." + embed_post_limit: "Kiwango cha juu cha machapisho yakuambatanisha." + embed_username_required: "Jina la mtumiaji kwa ajili ya kutengeneza mada linahitajika." + show_create_topics_notice: "Kama tovuti ina machapisho chini ya 5, onyesha notisi kuwaambia viongozi kutengeneza mada mpya." + delete_drafts_older_than_n_days: Futa mswadajaribio zenye umri zaidi ya siku (n). + enable_emoji: "Ruhusu ishara" + emoji_set: "Ungependa ishara yako iwe vipi?" + approve_post_count: "Namba za machapisho kutoka kwa mtumiaji mpya au wa msingi ambazo lazima zipate kibali" + approve_unless_trust_level: "Namba za machapisho kutoka kwa mtumiaji mwenye kiwango hichi cha uaminifu lazima zipate kibali" + approve_new_topics_unless_trust_level: "Mada mpya za watumiaji wenge kiwango cha chini cha uaminifu lazima zipate kibali" + approve_unless_staged: "Mada na machapisho kwa ajili ya watumiaji waliokuwa staged lazima zipate kibali" + notify_about_queued_posts_after: "Kama kuna machapisho ambayo yamekuwa yanasubirishwa kwa zaidi ya masaa haya, tuma taarifa kwa wasimamizi wote. Andika 0 kuzima hizi taarifa." + auto_close_topics_post_count: "Idadi ya juu ya machapisho yanayoruhusiwa kwenye mada kabla haijafungwa (0 kuzima)" + max_allowed_message_recipients: "Kiwango cha juu cha wapokeaji wanaoruhusiwa kwenye ujumbe." + default_email_digest_frequency: "Mara ngapi watumiaji watapata muhtasari wa barua pepe kama chaguo-msingi." + default_include_tl0_in_digests: "Tia ndani machapisho ya watumiaji wapya kwenye muhtasari wa barua pepe kama chapio-msingi. Watumiaji wanaweza kubadilisha hii kwenye mapendekezo yao." + default_email_personal_messages: "tuma barua pepe mtumiaji akitumiwa ujumbe kama chaguo-msingi." + default_email_direct: "tuma barua pepe mtu akinukulu/kujibu kwa/akitaja au mualika mtumiaji kama chaguo-msingi." + default_email_mailing_list_mode: "Tuma barua pepe kwa ajili ya kila chapisho jipya kama chaguo-msingi." + default_email_always: "Tuma taarifa kwa njia ya barua pepe hata kama mtumiaji ni amilifu kama chaguo-msingi." + default_email_previous_replies: "Weka ndani majibu ya awali kwenye barua pepe kama chaguo-msingi" + default_other_enable_quoting: "Ruhusu jibu nukulu kwenye neno lenye angaza kama chaguo-msingi." + default_other_disable_jump_reply: "Usifikie chapisho la mtumiaji baada ya kujibiwa kama chaguo-msingi." + default_other_like_notification_frequency: "Wajulishe watumiaji kuhusu upendo kama chaguo-msingi" + default_topics_automatic_unpin: "Otomatikali ondoa mada zilizobandikwa mtumiaji akifika mwisho wa ukurasa kama chaguo-msingi." + default_categories_watching: "Orodha ya kategoria zinazoangaliwa kama chaguo-msingi." + default_categories_tracking: "Orodha ya kategoria zinazofuatiliwa kama chaguo-msingi." + default_categories_muted: "Orodha ya kategoria zinazonyamazishwa kama chaguo-msingi." + max_api_keys_per_user: "Kiwango cha juu cha funguo za API za mtumiaji kwa kila mtumiaji" + min_trust_level_for_user_api_key: "Kiwango cha uaminifu kinachohitajika kutengeneza funguo za API za mtumiaji" + tagging_enabled: "Ruhusu lebo kwenye mada?" + min_trust_to_create_tag: "kiwango cha chini cha uaminifu kinachohitajika kutengeneza lebo." + max_tags_per_topic: "Kiwango cha juu cha lebo ambazo zinaweza kuwekwa kwenye mada." + max_tag_length: "kiwango cha juu cha herufi zinazoweza kutumika kwenye lebo." + max_tag_search_results: "Utafutaji wa lebo, utaonyesha kiwango hiki cha juu cha majibu." + tags_listed_by_group: "Orodhesha lebo kwenye kikundi cha lebo ndani ya ukurasa wa Lebo (/lebo)." + allow_staff_to_tag_pms: "Ruhusu wasaidizi walebo ujumbe wowote binafsi" + min_trust_level_to_tag_topics: "Kiwango cha chini kabisa kinachohitajika kulebo mada" + suppress_overlapping_tags_in_list: "Kama lebo zina maneno ambayo yapo kwenye vichwa vya mada, usionyeshe lebo" + remove_muted_tags_from_latest: "Usionyeshe mada zenye lebo za kunyamazishwa kwenye orodha ya mada za hivi karibuni." + company_short_name: "Jina la Kampuni (fupi)" + company_full_name: "Jina la Kampuni (lote)" + company_domain: "Kikoa cha Kampuni" + errors: + invalid_email: "Barua pepe batili." + invalid_username: "Hakuna mtumiaji mwenye hilo jina." + invalid_integer_min_max: "Namba lazima ziwe kati ya %{min}na %{max}" + invalid_integer_min: "Namba lazima iwe %{min}au zaidi." + invalid_integer_max: "Namba haiwezi kuwa zaidi ya %{max}" + invalid_integer: "Namba lazima iwe namba kamili." + must_include_latest: "Menyu ya juu itaweka kichupo cha 'hivi karibuni'." + invalid_string: "Namba batili." + invalid_string_min_max: "Lazima iwe kati ya herufi %{min} na %{max}." + invalid_string_min: "Lazima iwe na herufi%{min}au zaidi." + invalid_string_max: "Lazima iwe chini ya herufi %{max}. " + reply_by_email_address_is_empty: "Lazima uweke 'jibu kupitia barua pepe' kabla ya kuruhusu jibu kupitia barua pepe." + enable_sso_disabled: "Kwanza ruhusu 'ruhusu sso' kabla ya kuruhusu mpangilio huu." + staged_users_disabled: "Kwanza ruhusu 'watumiaji walio staged' kabla ya kuruhusu mpangilio huu." + reply_by_email_disabled: "Kwanza ruhusu 'jibu kupitia barua pepe' kabla ya kuruhusu mpangilio huu." + sso_url_is_empty: "Kwanza ruhusu 'sso url' kabla ya kuruhusu mpangilio huu." + enable_local_logins_disabled: "Kwanza ruhusu 'ruhusu programu-jalizi ' kabla ya kuruhusu mpangilio huu." + search: + within_post: "#%{post_number} za %{username}" + types: + category: 'Kategoria' + topic: 'Majibu' + user: 'Watumiaji' + results_page: "Majibu ya utafiti ya '%{term}'" + sso: + login_error: "Hitilafu Wakati wa Kuingia." + not_found: "Akaunti yako haijapatikana. Tafadhali wasiliana na msimamizi wa tovuti." + account_not_approved: "Akaunti yako inasubiria kuthibitishwa. Utapata taarifa kwa barua pepe ukithibitishwa." + unknown_error: "Kuna tatizo na akaunti yako. Tafadhali wasiliana na msimamizi wa tovuti." + timeout_expired: "Mda wa kuwa ndani ya akaunti yako umeisha, tafadhali jaribu kuingia tena." + no_email: "Hakuna barua pepe iliyoandikwa. Tafadhali wasiliana na msimamizi wa tovuti." + email_error: "Akaunti haijaweza kusajiliwa na barua pepe%{email}Tafadhali wasiliana na msimamizi wa tovuti." + original_poster: "Muandishi wa Kwanza" + most_posts: "Machapisho Mengi" + most_recent_poster: "Mwandishi wa hivi karibuni" + frequent_poster: "Mwandishi wa mara kwa mara" + redirected_to_top_reasons: + new_user: "Karibu kwenye jumuiya yetu! Hizi ni mada maarufu za hivi karibuni." + not_seen_in_a_month: "Karibu tena! Hatujakuona kwa mda sasa. Tunatumaini unaendelea vizuri. Hizi ni mada maarufu za hivi karibuni toka kipindi ulivyokua mbali na sisi." + merge_posts: + errors: + different_topics: "Machapisho kutoka mada tofauti hayawezi kuunganishwa." + different_users: "Machapisho kutoka watumiaji tofauti hayawezi kuunganishwa." + topic_statuses: + archived_enabled: "Mada hii ni nyaraka. Imesimamishwa na haiwezi kubadilishwa." + archived_disabled: "Mada hii sio nyaraka. Haijasimamishwa na inaweza kubadilishwa." + closed_enabled: "Mada hii imefungwa. Majibu mapya hayaruhusiwi." + closed_disabled: "Hii mada imefunguliwa. Majibu mapya yanaruhusiwa." + autoclosed_disabled: "Mada hii imefunguliwa. Majibu mapya yanaruhusiwa." + autoclosed_disabled_lastpost: "Hii mada iko wazi. Majibu mapya yanakaribishwa." + pinned_enabled: "Mada hii imebandikwa. Itatokea juu ya kategoria yake mpaka itakapobanduliwa na msaidizi, au mtumiaji mwenyewe." + pinned_disabled: "Mada hii imebanduliwa. Haitatokea juu ya kategoria yake. " + pinned_globally_enabled: "Mada hii imebandikwa. Itatokea juu ya kategoria yake na kategoria zingine mpaka itakapobanduliwa na msaidizi, au mtumiaji mwenyewe." + pinned_globally_disabled: "Mada hii imebanduliwa. Haitatokea juu ya kategoria yake. " + visible_enabled: "Mada hii imeorodheshwa. Itaonyeshwa juu ya orodha za mada." + visible_disabled: "Mada hii imeondolewa kwenye orodha. Haitaonyeshwa juu ya orodha za mada.Njia pekee ya kuona hii mada ni kwa kupitia kiungo chake." + auto_deleted_by_timer: "Imefutwa na saa." + login: + not_approved: "Akaunti yako bado haijathibitishwa. Utapata ujumbe kwa barua pepe ukiwa tayari kuingia." + incorrect_username_email_or_password: "Jina la mtumiaji, barua pepe au nywila imekosewa" + incorrect_password: "Nywila sio sahihi" + wait_approval: "Asante kwa kujiunga. Tutakutumia ujumbe akaunti yako ikithibitishwa." + active: "Akaunti yako imeanzishwa na iko tayari kutumika." + activate_email: "

Bado kidogo tu kumaliza! Tumekutumia barua pepe ya uanzisho kwenye %{email}. Tafadhali fuatiia maelezo kwenye barua pepe kuanzisha akaunti yako.

Kama haijafika, angalia folda la barua taka au spam.

" + not_activated: "Bado hauwezi kuingia. Tumekutumia barua pepe ya uanzisho. Tafadhali fuatilia maelezo kwenye barua pepe kuanzisha akaunti yako." + not_allowed_from_ip_address: "Hauwezi kuingia kama%{username} kupitia anwani hiyo ya mtandao." + admin_not_allowed_from_ip_address: "Hauwezi kuingia kama kiongozi kupitia anwani hiyo ya mtandao." + suspended: "Hauwezi kuingia mpaka %{date}." + suspended_with_reason: "Akaunti imesitishwa mpaka %{date}:%{reason}" + errors: "%{errors}" + not_available: "Haipatikani. Jaribu %{suggestion}?" + something_already_taken: "Tatizo limetokea, labda jina la mtumiaji au barua pepe imesajiliwa tayari. Jaribu kiungo cha kusahau nywila." + omniauth_error: "Samahani, tatizo limetokea wakati wa kuthibitisha akaunti yako. Labda haujatoa kibali ya kuthibitisha?" + omniauth_error_unknown: "Tatizo limetokea kwenye mfumo wa kuingia, tafadhali jaribu tena." + authenticator_error_no_valid_email: "Barua pepe zinazoendana na %{account}haziruhusiwi. Itakubidi usanidi akaunti yako kupitia barua pepe nyingine." + new_registrations_disabled: "Usajili wa akaunti mpya hauruhusiwi kwa sasa." + password_too_long: "Nywila haziruhusiwi kuwa na herufi zaidi ya 200." + email_too_long: "Barua pepe uliandika ni ndefu sana. Majina ya boxi la ujumbe hayatakiwi kuwa zaidi ya herufi 254, na majina ya kikoa hayaruhusiwi kuwa zaidi ya herufi 253." + reserved_username: "Hilo jina la mtumiaji haliruhusiwi." + missing_user_field: "Haujajaza sehemu zote za mtumiaji" + auth_complete: "Uthibitisho umekamilika." + click_to_continue: "Bofya hapa kuendelea." + already_logged_in: "Inaonekana kuwa unajaribu kukubali mualiko kwa ajili ya mtumiaji mwingine. Kama wewe sio %{current_user}, tafadhali toka nje ya akaunti yako alafu jaribu kuingia tena." + second_factor_title: "Uthibitisho wa Vipengele Viwili" + second_factor_description: "Tafadhali andika kodi ya uthibitisho kutoka kwenye programu-tumizi:" + user: + deactivated: "Imesitishwa kwa sababu barua pepe nyingi hazifikii '%{email}'." + deactivated_by_staff: "Imesitishwa na msimamizi" + activated_by_staff: "Imeanzishwa na msaidizi" + new_user_typed_too_fast: "Mtumiaji mpya amechapa kwa haraka sana" + username: + short: "lazima ziwe herufi %{min} au zaidi" + long: "isizidi herufi %{max}" + characters: "lazima ziwe namba, herufi, deshi, na mistari chini pekee" + unique: "lazima iwe ya kipekee" + blank: "lazima iwepo" + must_begin_with_alphanumeric_or_underscore: "lazima ianze na herufi, namba au mstari chini pekee" + must_end_with_alphanumeric: "lazima iishe na herufi au namba" + must_not_end_with_confusing_suffix: "haiwezi kuishia na kiambishi tamati kisichoeleweka kama .json au .png etc" + email: + not_allowed: "hairuhusiwi kutoka kwa mtoaji barua pepe. Tafadhali tumia barua pepe nyingine." + blocked: "hairuhusiwi." + revoked: "hatutatuma barua pepe kwenda kwa '%{email}' mpaka %{date}." + ip_address: + blocked: "Usajili mpya hauruhusiwi kutoka kwenye anwani hio ya mtandao." + max_new_accounts_per_registration_ip: "Usajili mpya hauruhusiwi kutoka kwenye anwani hio ya mtandao (kiwango cha juu kimefika). Wasiliana na mfanyakazi." + website: + domain_not_allowed: "Tovuti ni batili. Vikoa vinavyoruhusiwa ni: %{domains}" + auto_rejected: "Imekataliwa otomatikali kwa sababu ya umri. Ona mpangilio wa tovuti wa auto_handle_queued_age" + destroy_reasons: + same_ip_address: "Anwani ya mtandao (%{ip_address}) ni sawa na ya watumiaji wengine." + unsubscribe_mailer: + title: "Ondoa Mtumaji wa Barua" + subject_template: "Thibitisha kuwa hautaki kupokea tena sasisha za barua pepe kutoka kwa %{site_title}" + text_body_template: | + Kuna mtu (labda wewe?) aliyeomba kutokupokea tena sasisha za barua pepe kutoka kwa %{site_domain_name} kwenda kwenye anwani hii. + Kama ungependa kuthibitisha hili, tafadhali bofya kiungo hiki: + + %{confirm_unsubscribe_link} + + + Kama ungependa kuendelea kupokea sasisha za barua pepe, unaweza kupuuzia barua pepe hii. + invite_mailer: + title: "Mualike Mtuma Barua" + subject_template: "%{inviter_name} amekualika kwenye '%{topic_title}' iliyo ndani ya %{site_domain_name}" + text_body_template: | + %{inviter_name} amekukaribisha kwenye majadiliano + + > **%{topic_title}** + > + > %{topic_excerpt} + + kwenye + + > %{site_title} -- %{site_description} + + Kama umevutiwa, bofya kiungo hapo chini: + + %{invite_link} + custom_invite_mailer: + subject_template: "%{inviter_name} amekualika kwenye '%{topic_title}' iliyo ndani ya %{site_domain_name}" + text_body_template: | + %{inviter_name} amekualika kwenye majadiliano + + > **%{topic_title}** + > + > %{topic_excerpt} + + kwenye + + > %{site_title} -- %{site_description} + + Ameambatanisha noti hii + + >%{user_custom_message} + + Kama umevutiwa, bofya kiungo hapo chini: + + %{invite_link} + invite_forum_mailer: + subject_template: "%{inviter_name} amekualika ujiunge %{site_domain_name}" + text_body_template: | + %{inviter_name} amekukaribisha ujiunge kwenye + > **%{site_title}** + > + > %{site_description} + + Kama umevutiwa, bofya kiungo hapo chini: + + %{invite_link} + custom_invite_forum_mailer: + subject_template: "%{inviter_name} amekualika ujiunge %{site_domain_name}" + text_body_template: | + %{inviter_name} amekualika ujiunge + + > **%{site_title}** + > + > %{site_description} + + Ameambatanisha noti hii + + >%{user_custom_message} + + Kama umevutiwa, bofya kiungo hapo chini: + + %{invite_link} + invite_password_instructions: + title: "Maelezo ya Nywila Mualiko" + subject_template: "Seti nywila kwa ajili ya akaunti yako %{site_name}" + text_body_template: | + Asante kwa kukubali mualiko wa %{site_name} -- karibu! + + Bofya kiungo hiki kuchagua nywila yako sasa hivi: + %{base_url}/u/nywila-reset/%{email_token} + + (Kama kiungo kilichopo juu kimeisha mda, chagua "Nimesahau nywila yangu" wakati wa kuingia kwa kutumia barua pepe yako.) + download_backup_mailer: + subject_template: "[%{email_prefix}] Chelezo cha Tovuti Upakuajii" + text_body_template: | + [Chelezo cha tovuti upakuaji] uliyoomba (%{backup_file_path}). + + Tumekutumia kiungo cha upakuaji kwenye barua pepe iliyo halali sababu ya ulinzi. + + (Kama *hauku* omba upakuaji huu, itakubidi uwe na wasiwasi sana - kuna mtu ana ufikivu wa kiongozi kwenye tovuti yako.) + admin_confirmation_mailer: + title: "Uthibitisho wa Kiongozi" + subject_template: "[%{email_prefix}] Thibitisha akaunti mpya ya Kiongozi" + text_body_template: | + Tafadhali thibitisha kuwa ungependa kumuongeza **%{target_username}** kama msimazi wa jukwaa lako. + + [Thibitisha Akaunti ya Msimamizi](%{admin_confirm_url}) + test_mailer: + subject_template: "[%{email_prefix}] Majaribio ya Kuwasilisha Barua Pepe" + new_version_mailer: + text_body_template: | + Furaha tele, kuna toleo jipya la [Discourse](http://www.discourse.org)! + + Toleo lako: %{installed_version} + Toleo jipya: **%{new_version}** + + -Boresha kupitia njia rahisi **[bofya-mara moja kuboresha kupitia kivinjari](%{base_url}/kiongozi/boresha)** + + - Ona kipi ni kipya kwenye [madokezo yaliotolewa](https://meta.discourse.org/tags/release-notes) au angalia [raw GitHub changelog](https://github.com/discourse/discourse/commits/master) + + - Tembelea [meta.discourse.org](https://meta.discourse.org) kwa ajili ya habari, majadiliano, na msaada wa Discourse + new_version_mailer_with_notes: + subject_template: "[%{email_prefix}] sasisho linapatikana" + text_body_template: | + Furaha tele, kuna toleo jipya la [Discourse](http://www.discourse.org)! + + Toleo lako: %{installed_version} + Toleo jipya: **%{new_version}** + + -Boresha kupitia njia rahisi **[bofya-mara moja kuboresha kupitia kivinjari](%{base_url}/kiongozi/boresha)** + + - Ona kipi ni kipya kwenye [madokezo yaliotolewa](https://meta.discourse.org/tags/release-notes) au angalia [raw GitHub changelog](https://github.com/discourse/discourse/commits/master) + + - Tembelea [meta.discourse.org](https://meta.discourse.org) kwa ajili ya habari, majadiliano, na msaada wa Discourse + ###Madokezo yaliyotolewa + + %{notes} + flag_reasons: + off_topic: "Mada yako imeripotiwa kuwa **haihusiki**: jumuiya inaona kuwa haiko sawa kuwa mada, kulingana na kichwa cha habari na chapisho lake la kwanza." + inappropriate: "Chapisho hili limeripotiwa kuwa **halifai**: jumuiya inaona kuwa ni matusi, ubaguzi, au inakauka [mwongozo wa jumuiya](/mwongozo)." + spam: "Chapisho lako limeripotiwa kuwa ni **taka**: jumuiya inaona kuwa ni tangazo, kitu ambacho kinatanganaza badala ya kuwa muhimu au na faida kwenye mada kama ilivyotarajiwa." + notify_moderators: "Chapisho lako limeripotiwa **kupitiwa na msimamizi**: jukwaa limeona kuwa kuna kitu kuhusu chapisho lako kinachohitaji kupitiwa na msaidizi." + flags_dispositions: + agreed: "Asante kwa kutujulisha. Tunakubali kuwa kuna tatizo na tunaifuatilia." + agreed_and_deleted: "Asante kwa kutujulisha. Tunakubali kuwa kuna tatizo na tumeondoa chapisho." + disagreed: "Asante kwa kutujulisha. Tutaifuatilia." + deferred: "Asante kwa kutujulisha. Tutaifuatilia." + deferred_and_deleted: "Asante kwa kutujulisha. Tumeondoa chapisho." + system_messages: + private_topic_title: "Mada #%{id}" + contents_hidden: "Tafadhali tembelea chapisho kuona taarifa zake." + post_hidden: + title: "Chapisho Limefichwa" + subject_template: "Chapisho limefichwa sababu ya ripoti nyingi za jumuiya" + text_body_template: | + Habari, + + Ujumbe huu ni otomatiki kutoka kwa %{site_name} kukujulisha kuwa chapisho lako limefichwa. + + <%{base_url}%{url}> + + %{flag_reason} + + Wanachama wengi kwenye jumuiya wameripoti chapisho hili kabla ya kufichwa, kwa hiyo gikiria vizuri kabla ya kusahihisha chapisho lako. **Unaweza kuhariri chapisho baada ya dakika %{edit_delay}, na chapisho litarejeshwa.** + + Kama chapisho likifichwa tena, litabaki kwenye maficho mpaka msaidizi akilipitia. + + Kwa maelezo zaidi, tafadhali pitia [mwongozo wa jumuiya](%{base_url}/mwongozo). + post_hidden_again: + title: "Chapisho Limefichwa tena" + subject_template: "Chapisho limefichwa sababu ya ripoti nyingi za jumuiya, msaidizi amejulishwa" + text_body_template: | + Habari, + + Ujumbe huu ni otomatiki kutoka kwa %{site_name} kukujulisha kuwa chapisho lako limefichwa tena. + + <%{base_url}%{url}> + + %{flag_reason} + + Wanachama wengi kwenye jumuiya wameripoti chapisho hili kabla ya kufichwa. **Kwa vile chapisho limefichwa zaidi ya mara moja, chapisho litabaki kwenye maficho mpaka litakapopitiwa na msaidizi.** + + Kwa maelezo zaidi, tafadhali pitia [mwongozo wa jumuiya](%{base_url}/mwongozo). + welcome_user: + title: "Karibu Mtumiaji" + subject_template: "Karibu kwenye %{site_name}!" + text_body_template: | + Asante kwa jujiunga %{site_name}, na karibu! + + %{new_user_tips} + + Mda wote Tunaamini kwenye [jumuiya ya ustaarabu na mwenendo mzuri](%{base_url}/muongozo). + Karibu Sana! + welcome_invite: + title: "Muaiko wa Ukaribisho" + subject_template: "Karibu kwenye %{site_name}!" + text_body_template: | + Asante kwa kukubali mualiko kutoka kwa %{site_name} -- karibu! + + - Tumetengeneza akaunti hii mpya**%{username}** kwa ajili yako. Badilisha jina au nywila yako kwa kutembelea [umbo lako la mtumiaji][mapendekezo]. + + - Ukiingia, tafadhali **tumia barua pepe uliyotumia kwenye mualiko** -- au la tutashindwa kukutambua! + + %{new_user_tips} + Tuna amini kwenye [jumuiya yenye tabia ya kistaarabu](%{base_url}/mwongozo) mda wote. + + Kila la kheri! + + [mapendekezo]: %{user_preferences_url} + backup_succeeded: + title: "Chelezo Imefanikiwa" + subject_template: "Chelezo imefanikiwa kumaliza" + text_body_template: | + Chelezo imemaliza kwa mafanikio. + + Tembelea [kiongozi>eneo la chelezo](%{base_url}/kiongozi/machelezo) kupakua chelezo chako jipya. + + Batli hii hapa: + + ````neno + %{logs} + ```` + backup_failed: + title: "Chelezo Imeshindikana" + subject_template: "Chelezo imeshindikana" + text_body_template: | + Urejeshaji umeshindikana. + + Batli hii hapa: + + ```neno + %{logs} + ``` + restore_succeeded: + title: "Urejeshaji Umefanikiwa" + subject_template: "Urejeshaji umalizika kwa mafanikio" + text_body_template: | + Urejeshaji umefanikiwa. + + Batli hii hapa: + + ```neno + %{logs} + ``` + restore_failed: + title: "Urejeshaji Umeshindikana" + subject_template: "Urejeshaji umeshindikana" + text_body_template: | + Urejeshaji umeshindikana. + + Batli hii hapa: + + ```neno + %{logs} + ``` + bulk_invite_succeeded: + title: "Mualiko wa Watumiaji Wengi Umefanikiwa" + subject_template: "Mualiko wa Watumiaji Wengi umefanikiwa" + text_body_template: "Mualiko wa Watumiaji Wengi wa faili umefanyiwa uchakataji, mialiko %{sent} imetumwa." + bulk_invite_failed: + title: "Mualiko wa Watumiaji Wengi Umeshindikana" + subject_template: "Mualiko wa Watumiaji Wengi umepata hitilafu" + text_body_template: | + Faili la mialiko ya watu limepitia mfumo, mialiko %{sent} imetumwa ikiwa na (h)itilafu %{failed}. + + Batli hii hapa: + + ```neno + %{logs} + ``` + csv_export_succeeded: + title: "Uhamishaji wa CSV Umefanikiwa" + text_body_template: | + Uhamishaji wa taarifa umemalizika kwa mafanikio! :dvd: + +
%{file_name}(%{file_size}) + + kiungo cha upakuaji kitakuwa sahihi kwa masaa 48. + + Taarifa hizi zimewekwa kwenye nyaraka ya gzip. Kama nyaraka haitajifungua yenyewe ukiifungua, tunakushauri utumie: http://www.gzip.org/#faq4 + csv_export_failed: + title: "Uhamishaji wa CSV Umeshindikana" + subject_template: "Uhamishaji wa taarifa umeshindikana" + text_body_template: "Tunaomba radhi, lakini uhamishaji wa taarifa umeshindikana. Tafadhali angalia batli au [wasiliana na msaidizi](%{base_url}/kuhusu)." + email_reject_insufficient_trust_level: + title: "Barua Pepe Imekataliwa Hauna Kiwango Kinachohitajika cha Uaminifu" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Hauna Kiwango Kinachohitajika cha Uaminifu" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Akaunti yako haina kiwango cha uaminifu kinachohitajika kuchapisha mada mpya kwenda kwenye barua pepe hii. Kama unaamini hii ni hitilafu, [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_user_not_found: + title: "Barua Pepe Kataza Mtumiaji Hajapatikana" + subject_template: "[%{email_prefix}] Tatizo na Barua Pepe -- Mtumiaji Hajapatikana" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Jibu lako limetumwa kwa kutumia barua pepe tusioijua. Jaribu kutumia barua pepe nyingine, au [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_screened_email: + title: "Barua Pepe Kataza Barua Pepe Hairuhusiwi " + subject_template: "[%{email_prefix}] Issue ya Barua Pepe -- Barua Pepe Imezuiliwa" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Jibu lako limetumwa kwa kutumia barua pepe iliyozuiliwa. Jaribu kutumia barua pepe nyingine, au [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_not_allowed_email: + title: "Barua Pepe Kataza Barua Pepe Hairuhusiwi " + subject_template: "[%{email_prefix}] Tatizo la Barua -- Barua Pepe Imezuiliwa" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Jibu lako limetumwa kwa kutumia barua pepe iliyozuiliwa. Jaribu kutumia barua pepe nyingine, au [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_inactive_user: + title: "Barua Pepe Kataa Mtumiaji Asiyetembelea Tovuti" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Mtumiaji Asiyetembelea Tovuti" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Akaunti yako haijaanzishwa. Tafadhali anzisha akaunti yako kabla ya kutuma barua pepe. Kuanzisha, angalia barua pepe yako utakuta ujumbe kutoka kwetu wenye kiungo cha kuanzisha akaunti yako. + email_reject_silenced_user: + title: "Barua Pepe Kataa Mtumiaji Aliyenyamazishwa" + subject_template: "[%{email_prefix}] Issue ya Barua Pepe -- Mtumiaji Aliyenyamazishwa" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Akaunti yako ambayo imeshirikishwa na barua pepe hii imenyamazishwa. + email_reject_reply_user_not_matching: + title: "Barua Pepe Kataa Mtumiaji Haendani" + subject_template: "[%{email_prefix}] Tatizo a Barua Pepe -- Anwani ya Jibu Haikutegemewa" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Jibu lako limetumwa kwa kutumia barua pepe tofauti ambayo hatukuitegemea, kwa hiyo hatuna uhakika kuwa ni mtu mmoja. Jaribu kutumia barua pepe nyingine, au [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_no_account: + title: "Barua Pepe Kataza Akaunti Haipo" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Akaunti Haijulikani" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Jibu lako limetumwa kwa kutumia barua pepe iliyojulikana. Jaribu kutumia barua pepe nyingine, au [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_empty: + title: "Barua Pepe Kataa Wazi" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Hakuna Maandishi" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Hatujaona maandishi ya majibu kwenye barua pepe yako. + + Kama unapata hii barua na uli_weka_jibu, jaribu tena kwa kutumia umbizo mrahisi zaidi. + email_reject_parsing: + title: "Barua Pepe Kataa Changanua" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Maandashi Hayatambuliki" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Hatujaona maandishi ya majibu kwenye barua pepe yako.**Hakikisha jibu lako lipo juu ya barua pepe** --mfumo wetu hauwezi kushughulikia majibu yaliyo ndani ya mistari. + email_reject_invalid_access: + title: "Barua Pepe Kataa Ufikivu Batili" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Ufikivu Batili" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Akaunti yako haina haki inayohitajika kuchapisha mada mpya kwenda kwenye barua pepe hii. Kama unaamini hii ni hitilafu, [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_strangers_not_allowed: + title: "Barua Pepe Kataa Wageni Hawaruhusiwi" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Ufikivu Batili" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Kategoria uliyoitumia barua pepe hii inakubali majibu kutoka kwa watumiaji na barua pepe zilizosajiliwa tu. Kama unaamini hii ni hitilafu, [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_invalid_post: + title: "Barua Pepe Kataa Chapisho Batili" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- hitilafu ya Uchapishaji" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Kati ya vitu vilivyosababisha ni: umbizo wa hali ya juu, ujumbe ni mkubwa sana, ujumbe ni mdogo sana. Tafadhali jaribu tena, au chapisha kupitia tovuti kama tatizo likiendelea. + email_reject_invalid_post_specified: + title: "Barua Pepe Kataa Chapisho Batili" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Hitilafu ya Uchapishaji" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + Sababu: + + %{post_error} + + Kama unaweza kurekebisha tatizo hili, tafadhali jaribu tena. + email_reject_invalid_post_action: + title: "Barua Pepe Kataa Kitendo cha Chapisho Batili" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Kitendo Batili cha Chapisho" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Kitendo cha Chapisho hakijatambuliwa. Tafadhali jaribu tena, au chapisha kupitia tovuti kama tatizo likiendelea. + email_reject_reply_key: + title: "Barua Pepe Kataa Ufunguo wa Jibu" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Ufunguo wa Jibu Usiojulikana" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Ufunguo wa jibu kwenye barua pepe ni batili au haujulikani, tumeshindwa kujua unamjibu nani.[wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_bad_destination_address: + title: "Barua Pepe Kataa Anwani ya Mpokeaji Sio Sawa" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Haijulikani Inapoenda: Anwani" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Barua pepe zote za kupokea ujumbe hazijulikani, au Utambulisho wa Kichwa cha Ujumbe kwenye barua pepe umebadilishwa. Tafadhali hakikisha unatuma kwenda kwa barua pepe zilizotolewa na wasaidizi wetu. + email_reject_topic_not_found: + title: "Barua Pepe Kataza Mada Hajapatikana" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Mada Haijapatikana" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Mada uliyojibu haipo tena -- labda imefutwa? Kama unaamini hii ni hitilafu, [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_topic_closed: + title: "Barua Pepe Kataza Mada Imefungwa" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Mada Imefungwa" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Mada uliyoitumia barua pepe hii imefungwa na haikubali tena majibu. Kama unaamini hii ni hitilafu, [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_auto_generated: + title: "Barua Pepe Kataza Akaunti Imejitengeneza" + subject_template: "[%{email_prefix}] Tatizo a Barua Pepe -- Jibu Limejitengeneza" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Barua pepe yako imepewa alama ya ''kujitengeneza'', kwa hiyo otomatikali ilitengenezwa na kompyuta badala ya kuchapishwa na binadamu; haturuhusu aina hizo za barua pepe. Kama unaamini hii ni hitilafu, [wasiliana na msaidizi](%{base_url}/kuhusu). + email_reject_unrecognized_error: + title: "Barua Pepe Kataza Hitilafu Lilisojulikana" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Hitilafu Lilisojulikana" + text_body_template: | + Tunaomba radhi, ila ujumbe wa barua pepe kwenda kwa %{destination} (jina la %{former_title}) haujafika. + + Hitilafu Isiyojulikana limetokea kwenye mchakato wa barua pepe yako na haijachapishwa. Tafadhali, jaribu tena, au [wasiliana na msaidizi](%{base_url}/kuhusu). + email_error_notification: + title: "Hitilafu ya Taarifa za Barua Pepe" + subject_template: "[%{email_prefix}] Tatizo la Barua Pepe -- Tatizo la Uhalalishaji wa POP" + text_body_template: | + Kwa bahati mbaya, hitilafu ya uthibitisho limetokea wakati wa kupata barua kutoka kwenye seva ya POP. + + Tafadhali hakikisha umesanidi taarifa za POP [mipangilio ya tovuti](%{base_url}/admin/site_settings/category/email). + + Kama kuna sehemu nyingine yenye akaunti ya barua pepe ya POP, itabidi uingie kwenye tovuti hiyo na kuangalia mipangilio. + too_many_spam_flags: + title: "Bendera Nyingi Sana za Taka" + subject_template: "Akaunti mpya inasubirishwa" + too_many_tl3_flags: + title: "Bendera Nyingi za Kiwango cha Uaminifu cha 3" + subject_template: "Akaunti mpya inasubirishwa" + text_body_template: | + Habari, + + Ujumbe huu ni otomatiki kutoka %{site_name} kukujulisha kuwa akaunti yako imesimamishwa kwa mda kwa sababu ya ripoti nyingi kutoka kwenye jumuiya. + + Kama kujihadhari, akaunti yako imenyamazishwa na haitaweza kutengeneza majibu au mada mpaka msaidizi atakapo kagua akaunti yako. Tunaomba radhi kwa usumbufu utakao tokea. + + Kwa usaidizi zaidi, tembelea [mwongozo wa jumuiya](%{base_url}/mwongozo). + silenced_by_staff: + title: "Imenyamazishwa na Msaidizi" + subject_template: "Akaunti imesimamishwa kwa mda" + text_body_template: | + Habari, + + Huu ni ujumbe wa roboti kutoka kwa %{site_name} kukujulisha kuwa akaunti yako imesitishwa kwa mda kama tahadhari. + + Tafadhali endelea kuvinjari, lakini hautaweza kujibu au kutengeneza mada mpaka [msaidizi](%{base_url}/kuhusu) akikagua machapisho yako ya hivi karibuni. Tunaomba radhi kwa usumbufu utakao tokea. + + Kwa mwongozo zaidi, tembelea [mwongozo wa jukwaa](%{base_url}/mwongozo). + user_automatically_silenced: + title: "Mtumiaji Amenyamazishwa" + subject_template: "Mtumiaji mpya %{username} amenyamazishwa na bendera za jumuia" + text_body_template: | + Ujumbe huu ni otomatiki. + + Mtumiaji mpya [%{username}](%{user_url}) alinyamazishwa kwa sababu watumiaji wengi wameripoti (ma)chapisho ya %{username}. + + Tafadhali [kagua ripoti](%{base_url}/admin/flags), Kama %{username} alinyamazishwa kimakosa, bonyeza kitufe cha kuondoa ukimya kwenye [ukurasa wa kiongozi kwa ajili ya mtumiaji](%{user_url}). + + Kizingiti hiki kinaweza kubadilishwa kwenye mipangilio ya `nyamazisha_mtumiaji_mpya` kwenye tovuti. + spam_post_blocked: + title: "Chapisho Taka Limezuiliwa" + subject_template: "Machapisho ya mtumiaji mpya %{username} yamezuiliwa kwa sababu ya viungo vinavyojirudia" + text_body_template: | + Huu ni ujumbe kutoka kwa roboti. + + Mtumiaji mpya [%{username}](%{user_url}) amejaribu kuandika maandishi mapya mengi yenye viungo kwenda kwa %{domains}, lakini zimezuiliwa kukwepa barua taka. Bado mtumiaji anaweza kutengeneza machapisho ambayo hayana viungo kwenda kwa %{domains}. + + Tafadhali [kagua mtumiaji](%{user_url}). + + Tohoa kwa kupitia `newuser_spam_host_threshold` na `white_listed_spam_host_domains` mipangilio ya tovuti. + unsilenced: + title: "Hajanyamazishwa Tena" + subject_template: "Akaunti haijasimamishwa tena" + text_body_template: | + Habari, + + Huu ni ujumbe kutoka kwa %{site_name}kukujulisha kuwa akaunti yako haijasimamishwa tena baada ya kukaguliwa na msaidizi. + + Unaweza kuandika majibu na mada tena. Asante kwa uvumilivu wako. + pending_users_reminder: + title: "Ukumbusho wa Watumiaji Waliosubirishwa" + text_body_template: | + Kuna watumiaji wapya waliojiunga wanaosubiria kupata kibali (au kukataliwa) kabla hawajafikia jumuia hii. + + [Tafadhali kagua kwenye upande wa kiongozi](%{base_url}/admin/users/list/pending). + dashboard_problems: + title: "Matatizo ya Ubao" + subject_template: "Matatizo yamepatikana" + text_body_template: | + Kuna matatizo yameripotiwa kwenye ubao wa kiongozi. + + [Tafadhali kagua na tatua](%{base_url}/kiongozi). + new_user_of_the_month: + title: "Wewe ni Mtumiaji Mpya wa Mwezi!" + subject_template: "Wewe ni Mtumiaji Mpya wa Mwezi!" + text_body_template: | + Hongera, umepata tunzo ya **Mtumiaji Mpya wa Mwezi wa %{month_year}**. :trophy: + + Tunzo hii inatolewa kwa watumiaji wawili wapya kila mwezi, na itaendelea kuonekana kwenye [kurasa ya beji](%{url}). + + Kwa haraka sana, umekuwa mwanachama muhimu sana kwenye jumuia yetu. Asante sana kwa kujiunga, na endelea kufanya kazi nzuri! + queued_posts_reminder: + title: "Ukumbusho wa Machapisho Yalipangwa" + text_body_template: | + Habari, + + Machapisho kutoka kwa mtumiaji mpya yamesimamishwa kwa ajili ya ukaguzi na yanasubiria kukaguliwa. [Thibitisha au Kataa hapa](%{base_url}/subirishwa-machapisho). + unsubscribe_link: | + Kujitoa kwenye barua pepe hizi, [bofya hapa](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Kujitoa kwenye hizi barua pepe, [bofya hapa](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Unapokea hii kwa sababu uliruhusu orodha ya hali-tumizi ya barua pepe. + + Kujiondoa ili usipokee barua hizi, [bofya hapa](%{unsubscribe_url}). + subject_re: "Re: " + subject_pm: "[PM] " + user_notifications: + previous_discussion: "Majibu Yaliyopita" + in_reply_to: "Jibu Kuendana Na" + unsubscribe: + title: "Jitoe" + description: "Hautaki kupata hizi barua pepe? Hamna tatizo! Bofya hapa chini kujitoa mara moja:" + reply_by_email: "[Tembelea Mada](%{base_url}%{url}) au jibu barua pepe hii kutoa maoni." + only_reply_by_email: "Jibu barua pepe hii kutoa maoni." + visit_link_to_respond: "[Tembelea Mada](%{base_url}%{url}) kutoa maoni." + posted_by: "Imeandikwa na %{username}tarehe %{post_date}" + invited_group_to_private_message_body: | + %{username} amekaribishwa @%{group_name} kwenye ujumbe + > **%{topic_title}** + > + > %{topic_excerpt} + + kwenye + + > %{site_title} -- %{site_description} + invited_to_private_message_body: | + %{username} amekukaribisha kwenye ujumbe + + > **%{topic_title}** + > + > %{topic_excerpt} + + kwenye + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} amekukaribisha kwenye majadiliano + > **%{topic_title}** + > + > %{topic_excerpt} + + kwenye + + > %{site_title} -- %{site_description} + user_invited_to_private_message_pm_group: + title: "Mtumiaji Amekaribishwa kwenye PM" + subject_template: "[%{email_prefix}] %{username} amemkaribisha @%{group_name} kwenye ujumbe '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm: + title: "Mtumiaji Amekaribishwa kwenye PM" + subject_template: "[%{email_prefix}] %{username} amekukaribisha kwenye ujumbe '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm_staged: + subject_template: "[%{email_prefix}] %{username} amekukaribisha kwenye ujumbe '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_topic: + title: "Mtumiaji Amekaribishwa kwenye Mada" + subject_template: "[%{email_prefix}] %{username} amekukaribisha kwenye '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_replied: + title: "Mtumiaji Amejibu" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + title: "Mtumiaji Amejibu PM" + subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_quoted: + title: "Mtumiaji Amenukulu" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + title: "Mtumiaji Ameungwa" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_mentioned: + title: "Mtumiaji Ametajwa" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + title: "Kikundi cha Watumiaji Kimetajwa" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted: + title: "Mtumiaji Amechapisha" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + title: "Mtumiaji Anaangalia Chapisho la Kwanza" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm: + title: "Mtumiaji Amechapisha PM" + subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} + account_suspended: + title: "Akaunti Imesimamishwa" + subject_template: "[%{email_prefix}] Akaunti yako imesimamishwa" + text_body_template: | + Umesimamishwa kwenye jumuia mpaka %{suspended_till} + + %{reason} + + %{message} + account_silenced: + title: "Akaunti imenyamazishwa" + subject_template: "[%{email_prefix}] Akaunti yako imenyamazishwa" + text_body_template: | + Umenyamazishwa kwenye jumuia mpaka %{silenced_till}. + + %{reason} + + %{message} + account_exists: + title: "Akaunti tayari ipo" + subject_template: "[%{email_prefix}] Akaunti tayari ipo" + text_body_template: | + Umejaribu kutengeneza akaunti kwenye %{site_name}, au umejaribu kubadilisha barua pepe ya akaunti kuwa %{email}. Lakini, hiyo akaunti ya %{email} tayari ipo. + + Kama umesahau nywila yako, [weka upya sasa hivi](%{base_url}/nywila-reset). + + Kama haujajaribu kutengeneza akaunti ya %{email} au kujaribu kubadilisha barua pepe yako, usijali - unaweza kupuuzia ujumbe huu. + + Kama una maswali yoyote, [wasiliana na wasaidizi wetu](%{base_url}/about). + account_second_factor_disabled: + title: "Uthibitisho wa Pili umesitishwa" + subject_template: "Uhalalalishaji wa Viwango Viwili umesitishwa [%{email_prefix}]" + text_body_template: | + Njia mbili za uthibitisho zimesitishwa kwenye akaunti yako iliyopo %{site_name}. Unaweza kutumia nywila tu kuingia; kodi zaidi ya uthibitisho haihitajiki tna. + + Kama haukuchagua usitisho, kuna mtu atakuwa amepenya na kuingia kwenye akaunti yako. + + Kama una swali lolote, [wasiliana na wasaidizi wetu](%{base_url}/kuhusu). + digest: + why: "Muhtasari Mfupi wa %{site_link} toka mara ya mwisho ulivyotembelea %{last_seen_at}" + since_last_visit: "Kutoka mara ya mwisho ulivyotembelea" + new_topics: "Mada Mpya" + unread_messages: "Ujumbe ambao Haujasomwa" + unread_notifications: "Taarifa ambazo Hazijasomwa" + liked_received: "Upendo Uliopokelewa" + new_posts: "Machapisho Mapya" + new_users: "Watumiaji Wapya" + popular_topics: "Mada Maarufu" + follow_topic: "Fuatilia mada" + join_the_discussion: "Soma Zaidi" + popular_posts: "Machapisho Maarufu" + more_new: "Mpya kwako" + subject_template: "Muhtasari wa [%{email_prefix}]" + unsubscribe: "Muhtasari huu umetumwa kutoka kwa %{site_link} kama hatujakuona kwa mda fulani. Badilisha %{email_preferences_link}, au %{unsubscribe_link} kujiengua." + your_email_settings: "mipangilio yako ya barua pepe" + click_here: "bofya hapa" + from: "Muhtasari wa %{site_name}" + preheader: "Muhtasari mfupi toka mara ya mwisho ulivyotembelea %{last_seen_at}" + forgot_password: + title: "Nimesahau Nywila" + subject_template: "Weka Upya Nywila [%{email_prefix}]" + text_body_template: | + Kuna mtu ameomba kuweka upya nywila yako kwenye [%{site_name}](%{base_url}). + + Kama sio wewe, unaweza kupuuzia hii barua pepe. + + Bofya kwenye kiungo kuchagua nywila mpya: + %{base_url}/u/nywila-wekaupya/%{email_token} + email_login: + title: "Ingia kupitia kiungo" + subject_template: "Ingia kupitia kiungo [%{email_prefix}] " + text_body_template: | + Hiki ni kiungo cha kuingia kwenye [%{site_name}](%{base_url}). + + Kama haukuomba hiki kiungo, unaweza kupuuzia hii barua pepe. + + Bofya kiungo kifuatacho kuingia: + %{base_url}/session/email-login/%{email_token} + set_password: + title: "Tengeneza Nywila" + subject_template: "Weka Nywila [%{email_prefix}]" + text_body_template: | + Mtu anataka kutengeneza nywila ya akaunti yako[%{site_name}](%{base_url}). Au unaweza kuingia kwa kutumia njia nyingine (Google, Facebook au njia nyingine) kupitia barua pepe iliyothibitishwa. + + Kama haujaanzisha ombi hili, unaweza kupuuzia barua pepe hii. + + Bofya kiungo kifuatacho kuingia: + %{base_url}/u/admin-kuingia/%{email_token} + admin_login: + title: "Ingia Kiongozi" + subject_template: "[%{email_prefix}] Ingia" + text_body_template: | + Mtu anataka kuingia kwenye akaunti yako kwenye [%{site_name}](%{base_url}). + + Kama haujaanzisha ombi hili, unaweza kupuuzia barua pepe hii. + + Bofya kiungo kifuatacho kuingia: + %{base_url}/u/admin-kuingia/%{email_token} + account_created: + title: "Akaunti Imetengenezwa" + subject_template: "[%{email_prefix}] Akaunti Yako Mpya" + text_body_template: | + Akaunti yako mpya imetengenezwa kwa ajili yako kwenye %{site_name} + + Bofya kiungo kifuatacho kuchagua nywila kwa ajili ya akaunti yako mpya: + %{base_url}/u/nywila-reset/%{email_token} + confirm_new_email: + title: "Thibitisha Barua Pepe Mpya" + subject_template: "[%{email_prefix}] Thibitisha barua pepe mpya" + text_body_template: | + Thibitisha barua pepe yako kwenye %{site_name} kwa kubofya kiungo kifuatacho: + + %{base_url}/u/authorize-baruapepe/%{email_token} + confirm_old_email: + title: "Thibitisha Barua pepe ya Zamani" + subject_template: "[%{email_prefix}] Thibitisha barua pepe ya sasa" + text_body_template: | + Kabla hatujabadilisha barua pepe yako, tunahitaji kuthibitisha kuwa unamiliki + barua pepe yako ya sasa. Baada ya kumaliza hatua hii, tutathibitisha + barua pepe yako mpya. + + Thibitisha barua pepe yako ya sasa kwenye %{site_name} kwa kubonyeza kiungo kifuatacho: + + %{base_url}/u/authorize-barua pepe/%{email_token} + notify_old_email: + title: "Ijulishe Barua Pepe ya Zamani" + subject_template: "[%{email_prefix}] Barua pepe yako imebadilishwa" + text_body_template: | + Huu ni ujumbe kutoka kwa roboti kukujulisha kuwa barua pepe yako ya + %{site_name} imebadilishwa. Kama imefanywa kimakosa, wasiliana na + msimazi wa tovuti. + + Barua pepe yako imebadilishwa kuwa: + + %{new_email} + signup_after_approval: + title: "Kujiunga Baada ya Kupata Kibali" + subject_template: "Umepata kibali kwenye %{site_name}!" + text_body_template: | + Karibu kwenye %{site_name}! + + Msaidizi amethibitisha akaunti yako kwenye %{site_name}. + + Unaweza kuingia kwenye akaunti yako kupitia: + %{base_url} + + Kama kiungo hakiwezi kubonyezwa, jaribu kunakili na kubandika kwenye sehemu ya kuandika anwani ya mtandao ndani ya kivinjari. + + %{new_user_tips} + + Tuamini [utaonyesha tabia ya kistaarabu kwenye jumuia hii](%{base_url}/muongozo) mda wote. + + Tunakutakia mda mwema na sisi! + signup: + title: "Jiunge" + subject_template: "[%{email_prefix}] Thibitisha akaunti mpya" + text_body_template: | + Karibu kwenye %{site_name}! + + Bofya kiungo kifuatacho kuthibitisha na anzisha akaunti mpya: + %{base_url}/u/activate-akaunti/%{email_token} + + Kama kiungo cha juu hakibonyezeki, jaribu kunakili na kubandika kwenye sehemu ya kuandika anwani ya mtandao kwenye kivinjari. + page_not_found: + title: "Samahani! Ukurasa huu haupo au ni wa siri." + popular_topics: "Maarufu" + recent_topics: "Hivi Karibuni" + see_more: "Zaidi" + search_title: "Tafuta tovuti hii" + offline: + title: "Haiwezi kupakia programu-tumizi" + offline_page_message: "Inaonekana kuwa hauko hewani! Tafadhali angalia muunganisho wa mtandao na jaribu tena." + login_required: + welcome_message: | + ## [Karibu kwenye %{title}](#karibu) + Akaunti inahitajika. Tafadhali tengeneza akaunti au ingia kuendelea. + deleted: 'imefutwa' + image: "picha" + upload: + unauthorized: "Samahani, faili unalo jaribu kupakia halina kibali (authorized extensions: %{authorized_extensions})." + pasted_image_filename: "Picha Iliyobandikwa" + store_failure: "Tumeshindwa kutunza upakiaji #%{upload_id} wa mtumiaji #%{user_id}." + file_missing: "Samahani, inabidi uweke faili la kupakiwa." + empty: "Samahani, ila faili uliloweka halina kitu." + png_to_jpg_conversion_failure_message: "Hitilafu imetokea wakati wa kubadilisha kutoka PNG kwenda JPG." + attachments: + too_large: "Samahani, faili unalojaribu kupakia ni kubwa sana (kiwangu cha juu ni KB %{max_size_kb})." + images: + too_large: "Samahani, picha unayojaribu kupakia ni kubwa sana (kiwangu cha juu ni KB %{max_size_kb}),tafadhali badilisha ukubwa na jaribu tena." + larger_than_x_megapixels: "Samahani, picha unayojaribu kupakia ni kubwa sana (kipimo cha juu ni %{max_image_megapixels} - megapixels),t afadhali badilisha ukubwa na jaribu tena." + size_not_found: "Samahani ila hatujaweza kujua kipimo cha picha. Labda picha yako ina tatizo?" + placeholders: + too_large: "(picha kubwa zaidi ya KB %{max_size_kb})" + avatar: + missing: "Samahani, tumeshindwa kuona picha inayoendana na barua pepe hiyo. Unaweza kuipakia tena?" + flag_reason: + sockpuppet: "Mtumiaji mpya ametengeneza mada, na mtumiaji mpya mwenye anwani ya mtandao hiyo hiyo (%{ip_address}) amejibu. Angalia mpangilio wa tovuti `flag_sockpuppets`." + spam_hosts: "Mtumiaji mpya amejaribu kutengeneza machapisho mengi yenye viungo kwenda kwa kikoa (%{domain}). Tembelea `newuser_spam_host_threshold` mpangilio wa tovuti." + color_schemes: + light_theme_name: "Hafifu" + dark_theme_name: "Nyeusi" + about: "Kuhusu" + guidelines: "Miongozo" + privacy: "Siri" + edit_this_page: "Hariri ukurasa huu" + csv_export: + boolean_yes: "Ndiyo" + boolean_no: "Hapana" + static_topic_first_reply: | + Hariri chapisho la kwanza la mada hii kubadilisha maandishi ya ukurasa %{page_name}. + guidelines_topic: + title: "Maswali ya Mara kwa Mara/Muongozo" + body: | + ## + + [Hii ni Sehemu ya Kistaarabu kwa ajili ya Majadiliano ya Umma](#ustaarabu) + + Tafadhali onyesha heshima kama unavyojiheshimu ukiwa kwenye jumuiya ya watu wengi. Sisi pia ni raslimali ya jumuiya — sehemu ya kusambaza ujuzi, maarifa na vivutio kupitia majadiliano yanayoendelea. + + Kanuni hizi sio ngumu na ni za haraka, ni miongozo kusaidia maamuzi ya kibinadamu kwenye jumuiya na kuweka mazingira kuwa mazuri kwa ajili ya majadiliano ya kistaarabu ya discourse. + + + + ##[Boresha Mazungumzo](#boresha) + + Tusaidie kuhahikisha hii ni sehemu nzuri kwa ajili ya mazungumzo kwa kujitahidi kuboresha mazungumzo, kwa njia moja au nyingine, hata kama ni kidogo sana. Kama hauna uhakika kuwa chapisho lako linaongeza kitu chochote, fikiria vizuri na jaribu tena kuchapisha. + + Mada zinazozungumzwa hapa ni muhimu kwetu sisi, na tunataka na wewe ufanye kuwa ni muhimu kwako pia. Heshimu mada na watu wanajadiliana, hata kama haukubaliani na wanachokisema. + + Njia moja ya kuboresha mazungumzo ni kugundua yale ambayo tayari yanaendelea. Tumia mda kupitia mada hapa kabla ya kujibu au kuanzisha za kwako, na utakuwa na fursa za kukutana na wale ambao wanavutiwa na vitu sawa na wewe. + + + + ## [Kubali, hata kama Unakataa](#kubali) + + Unaweza kutaka kujibu kwa kukataa. Hiyo ni sawa. Kumbuka _kuchambua mawazo, sio watu_. Tafadhali epuka: + + *Kuita watu-majina + *kushambulia tabia, rangi, jinsia, urefu, ufupi, umbo na vinginevyo + * Kujibu kuendana na toni badala ya maandishi yaliondikwa + *Kujibu bila kufikiria kwa sababu ya hasira + + Badala yake andika majibu yenye busara, hekima na heshima ambayo yataboresha mazungumzo. + + + + ##[Ushirikiano Wako ni Muhimu](#shiriki) + + Mazungumzo tunayoyafanya hapa ndio yatakayoonwa na mtumiaji mpya. Tusaidie kuathiri siku za baadae za jumuiya yetu, kwa kuchagua kushiriki kwenye majadiliano ambayo yanafanya jumuiya iwe sehemu ya kuvuita — na epuka na zile mbaya. + + Discourse inatoa vifaa vinavyosaidia jumuiya kujua ushiriki mzuri sana (na mbaya): mialamisho, upendo, bendera, majibu, uhariri, na vinginevyo. Tumia vifaa hivi kuboresha uzoefu wako na wa wengine. Tuiache jumuiya yetu ikiwa vizuri zaidi ya tulivyoikuta. + + + + ## [Ukiona tatizo, Ripoti kwa kubonyeza Bendera](#ripoti-matatizo) + + Wasimamizi wana mamlaka ya kipekee; kama wewe, wana wajibu wa jumuiya hii. Kwa msaada, wasimamizi wanaweza kuwa wasahalisha wa jumuiya, sio tu mapolisi na walinzi. + + Ukiona kitu kibaya kimeandikwa, usijibu. Itaendeleza tabia mbaya, itatumia nguzu yako na kupoteza mda wa kila mtu._Bonyeza tu Bendera_. Kama bendera nyingi zitabonyezwa, kitendo kitafanyika, kama sio otomatikali, msimamizi ataingilia kati. + + Ili kuhakikisha jumuiya ipo vizuri, wasimamizi wana uwezo wa kuondoa au kufuta maandishi na akaunti ya mtumiaji mda wowote. Wasimamizi hawahakiki machapisho mapya; wasimamizi na wasaidizi wa tovuti hawana majukumu yoyote juu ya maandishi yanayochapishwa na wanajumuiya. + + + + ## [Kuwa Mstaarabu Mda Wote] (#kuwa-mstaarabu) + + Hakuna kitu kinachoharibu mazungumzo yenye afya kama jeuri: + + Kuwa mstaarabu. Usichapishe kitu chochote ambacho mtumiaji mwenye akili timamu atakiona kuwa kina matusi, kukejeli, kukera au kuchochea matatizo. + * Usichapishe vitu vichafu au ngono + * Jiheshimu na heshimu wengine. Usisumbue au kusababisha huzuni, usijifanye kuwa mtu mwingine, au kuchapisha kwa umma taarifa binafsi za watu wengine. + *Heshimu jumuiya yetu. Usichapishe taarifa taka au kuchafua jumuiya . + + Haya siyo maneno pekee na maelezo yake — epuka _kuonyesha_ kitu chochote kinachoendana na hivi. Kama hauna uhakika, jiulize ungejisikiaje kama chapisho lako likitokea kwenye ukurasa wa kwanza wa gazeti. Hakikisha lugha, viungo, na picha ni safi kuonwa na familia na marafiki. + + + + ## [Hakikisha ni Maridadi](#hakikisha-maridadi) + + Jitahidi kuweka vitu sehemu vinavyotakiwa kuwepo, ili tuweze kutumia mda mwingi tukijadiliana badala ya kusafisha. Kwa hiyo: + + Usikosee na kuanzisha mada kwenye kategoria nyingine badala ya kategoria sawa. + *Usiandike chapisho moja kwenye mada nyingi. + *Usichapishe majibu ambayo hayana maneno. + *Usibadilishe mada kwa kuibadilisha katikati. + *Usiweke sahihi kwenye machapisho yako — kila chapisho lina taarifa zako za umbo ambazo zimeambatanishwa. + + Badala ya kuchapisha "+1" au "Nimekubali", tumia kitufe cha upendo. Badala ya kuifanya mada iende njia nyingine kabisa, tumia Jibu kama Kiungo cha Mada. + + + + ## [Chapisha Vitu Vyako tu](#kuiba) + + Hautachapisha kitu chochote abacho kina milikiwa na mtu mwingine bila ruhusa yake. Hautachapisha maelezo ya, kiungo kwenda, au njia ya kuiba haki za uvumbuzi (programu, filamu, sauti, picha), au kuvunja sheria yoyote nyingine. + + + + ## [Inaendeshwa na Wewe](#endeshwa) + + Tovuti hii inaendeshwa na [wasaidizi binafsi](/kuhusu) na *wewe*, jumuiya. Kama una swali lolote kuhusu jinsi vitu vinavyofanya kazi hapa, tengeneza mada mpya ndani ya [kategoria ya maoni ya tovuti](/c/tovuti-maoni) na tutajadiliana! Kama kuna kitu cha wasiwasi au muhimu sana ambacho kinahitaji ufumbuzi wa haraka sana, hakiwezi kujibiwa kwa kubonyeza bendera au mada, wasiliana nasi kupitia [ukurasa wa wasaidizi](/kuhusu). + + + + ## [Sheria na Masharti](#tos) + + Ndio, sheria hinikiza, ila inabidi tujilinde – na watumiaji wenye tabia mbaya. Tuna [Sheria na Masharti](/tos) yanayoelezea tabia yako (na yetu) na haki za maandishi, faragha, na sheria. Kutumia huduma hizi, inabidi ukubaliane na [TOS](/tos) zetu. + badges: + editor: + name: Mhariri + description: Uhariri wa chapisho la kwanza + basic_user: + name: Kawaida + member: + name: Mwanachama + regular: + name: Kawaida + leader: + name: Kiongozi + welcome: + name: Karibu + description: Pokea upendo + autobiographer: + name: Muandishi wa maisha ya mtu + description: "Amejaza maandishi mafupiya mtu" + anniversary: + name: Siku ya kumbukumbu + description: "Mwanachama kwa mwaka mmoja, amechapisha mara moja" + nice_post: + name: Jibu Zuri + description: Umepokea upendo 10 kwenye jibu + good_post: + name: Jibu Zuri + description: Umepokea upendo 25 kwenye jibu + great_post: + name: Jibu Zuri + description: Umepokea upendo 50 kwenye jibu + nice_topic: + name: Mada Nzuri + description: Umepokea upendo 10 kwenye mada + good_topic: + name: Mada Nzuri + description: Umepokea upendo 25 kwenye mada + great_topic: + name: Mada Nzuri + description: Umepokea upendo 50 kwenye mada + nice_share: + name: Gawiza Zuri + description: Gawizo la chapisho kwa watumiaji 25 wa kipekee + long_description: | + Beji hii inatolewa gawizo la kiungo kikibonyezwa na watu 25 kutoka nje. Asante kwa kusambaza neno kuhusu majadiliano, na jumuiya yetu! + good_share: + name: Gawizo Zuri + description: Gawizo la chapisho kwa watu 300 wa kipekee + great_share: + name: Gawiza Zuri + description: Gawizo la chapisho kwa watu 1000 wa kipekee + first_like: + name: Upendo wa Kwanza + description: Amependa chapisho + long_description: | + Beji hii inatolewa ukipenda chapisho kwa kutumia kitufe cha :heart:. Kuonyesha upendo wa machapisho ni njia moja ya kuonyesha wanachama wenzako kuwa machapisho yao ni mazuri, muhimu, yanavutia, au yamekufurahisha. Endelea kutoa upendo! + first_flag: + name: Bendera ya Kwanza + description: Chapisho limeripotiwa + promoter: + name: Mpambe + description: Mtumiaji amekaribishwa + long_description: | + Beji hii inatolewa ukimkaribisha mtu ajiunge na jumuiya kupitia kitufe cha mualiko kwenye ukurasa wakoo, au chini ya mada. Ukaribishaji wa marafiki ambao wanaweza kuvutiwa na majadiliano ni njia nzuri ya kuwajulisha watu wapya kuhusu jumuiya yetu, kwa hiyo asante! + campaigner: + name: Mwanaharakati + description: Watumiaji 3 wa kawaida wamekaribishwa + champion: + name: Mshindi + description: Wanachama 5 wamekaribishwa + first_share: + name: Gawizo la Kwanza + description: Chapisho lililogawizwa + long_description: | + Beji hii inatolewa mara ya kwanza ukisambaza kiungo chenye jibu au mada kwa kutumia kitufe cha kusambaza. Usambazaji wa viungo ni njia nzuri ya kuonyesha dunia majadiliano yanayovutia na kusaidia kwenye ukuzaji wa jumuiya. + first_link: + name: Kiungo cha Kwanza + description: kiungo kimeongezwa kwenye mada nyingine + long_description: | + Beji hii inatolewa mara ya kwanza ukiongeza kiungo kwenye mada nyingine. Kitendo hicho kinasaidia wasomaji wengine waone mazungumzo ya kuvutia, kwa kuwaonyesha muunganisho kati ya mada kwenye njia zote. Endelea kuunga! + first_quote: + name: Nukulu ya Kwanza + description: Chapisho lina nukulu + read_guidelines: + name: Soma Muongozo + description: "Soma muongozo wa jumuiya" + reader: + name: Msomaji + description: Soma kila jibu kwenye mada lenye majibu zaidi ya 100 + popular_link: + name: Kiungo Maarufu + description: Amechapisha kiungo cha nje chenye upendo 50 + hot_link: + name: Kiungo Maarufu Sana + description: Amechapisha kiungo cha nje chenye upendo 300 + famous_link: + name: Kiungo Kinachojulikana Sana + description: Amechapisha kiungo cha nje kilichobonyezwa mara 1000 + appreciated: + name: Imepewa Shukuru + description: Umepata upendo mmoja 1 kwenye machapisho 20 + long_description: | + Hii beji inatolewa ukipata upendo mmoja au zaidi kwenye machapisho 20 tofauti. Jukwaa linafurahia mchango wako kwenye majadiliano hapa! + respected: + name: Imepewa Heshima + description: Umepata upendo 2 kwenye machapisho 100 + long_description: | + Hii beji inatolewa ukipata upendo 2 au zaidi kwenye machapisho 100 tofauti. Jukwaa linaanza kuheshimu mchango wako kwenye majadiliano hapa! + admired: + name: Imesifiwa + description: Umepata upendo 5 kwenye machapisho 300 + long_description: | + Hii beji inatolewa ukipata upendo 5 au zaidi kwenye machapisho 300 tofauti. Jukwaa linasifu na kuheshimu mchango wako mkubwa kwenye majadiliano hapa! + out_of_love: + name: Haina Upendo + description: Umetumia upendo 50 ndani ya siku moja + long_description: | + Hii bei inatolewa ukitumia upendo wako 50 wa siku. Kumbuka kuchukua mda na kupenda machapisho unayoyafurahia na kushukuru, vitendo hivi vinatia moyo wengine kwenye jukwaa kutengeneza majadiliano mengine mazuri zaidi ya baadae. + higher_love: + name: Upendo wa Hali ya Juu + description: Umetumia upendo 50 mara 5 ndani ya siku moja + long_description: | + Hii beji inatolewa ukitumia upendo wako 50 mara 5 kwa siku. Asante kwa kuchukua mda kuchochea maongezi mazuri kila siku! + crazy_in_love: + name: Imejaa Upendo + description: Umetumia upendo 50 mara 20 ndani ya siku moja + thank_you: + name: Asante + description: ana upendo 20 kwenye machapisho na ametoa upendo 10 + long_description: | + Beji hii inatolewa ukipata upendo 20 kwenye chapisho na ukitoa upendo 10 au zaidi. Mtu akipenda machapisho yako, ni vizuri na wewe ukipenda machapisho yao pia. + gives_back: + name: Toa Tena + description: ana upendo 100 kwenye machapisho na ametoa upendo 100 + long_description: | + Beji hii inatolewa ukipata upendo 100 kwenye chapisho na ukitoa upendo 100 au zaidi. Asante kwa ushirikiano wako! + empathetic: + name: Huruma na Uelewa + description: ana upendo 500 kwenye machapisho na ametoa upendo 1000 + first_emoji: + name: Emoji ya Kwanza + description: Umetumia Emoji kwenye Chapisho + long_description: | + Beji hii inatolewa mara ya kwanza ukiongeza Emoji kwenye chapisho lako :thumbsup:. Emoji inasaidia kuonyesha hisia kwenye machapisho yako, kuanzia furaha :smiley: mpaka huzuni :anguished: mpaka hasira :angry: na kila kitu katikati :sunglasses:. Andika tu : (nukta mbili) au bonyeza kitufe cha mwambaa zana za Emoji iliyopo kwenye sehemu ya kuhariri kuchagua kati ya machaguo mia moja na zaidi :ok_hand: + first_mention: + name: Kutajwa kwa Mara ya Kwanza + description: Amemtaja mtumiaji ndani ya chapisho + first_onebox: + name: Onebox ya Kwanza + description: Chapisha kiungo kilichokuwa onebox + first_reply_by_email: + name: Jibu la Kwanza Kupitia Barua Pepe + description: Amejibu chapisho kupitia barua pepe + long_description: | + Beji hii inatolewa mara ya kwanza ukijibu chapisho kupitia barua pepe :barua pepe: + new_user_of_the_month: + name: "Mtumiaji Mpya wa Mwezi" + description: Mchango Bora Sana ndani ya mwezi wao wa kwanza + long_description: | + Beji hii inatolewa kwa watumiaji wawili wapya kila mwezi kuwapongeza kwa mchango wao, inapimwa kulingana na machapisho mangapi yalipendwa, na nani. + enthusiast: + name: Mwenye Motisha + description: Ametembelea siku 10 + aficionado: + name: Aficionado + description: Ametembelea siku 100 + devotee: + name: Mshiriki + description: Ametembelea siku 365 + badge_title_metadata: "beji %{display_name} kwenye %{site_title} " + admin_login: + success: "Barua Pepe Imetumwa" + errors: + unknown_email_address: "Barua pepe isiyojulikana." + email_input: "Barua Pepe ya Kiongozi" + submit_button: "Tuma Barua Pepe" + performance_report: + initial_post_raw: mada hii ina ripoti za utendaji wa tovuti yako. + initial_topic_title: Ripoti za Utendaji wa Tovuti + tags: + title: "Lebo" + staff_tag_disallowed: "lebo ya \"%{tag}\" inatumiwa na wasaidizi pekee." + staff_tag_remove_disallowed: "lebo ya \"%{tag}\" inaweza kuondolewa na wasaidizi tu." + minimum_required_tags: "Chagua lebo %{count} au zaidi." + rss_by_tag: "Mada zenye lebo %{tag}" + finish_installation: + congratulations: "Hongera, umesakinisha Discourse!" + register: + button: "Jisajili" + title: "Sajili Akaunti ya Kiongozi" + help: "sajili akaunti mpya kuanza" + confirm_email: + title: "Thibitisha Barua pepe yako" + message: "

Tumekutumia barua pepe ya uanzisho kwenye %{email}. Tafadhali fuatiia maelezo kwenye barua pepe kuanzisha akaunti yako.

Kama haijafika, hakikisha umeandika barua pepe sawa kwenye Discourse yako na angalia folda la barua taka au spam.

" + resend_email: + title: "Tuma Tena Barua Pepe ya Uanzisho" + message: "

Tumekutumia tena barua ya uanzishaji%{email}" + safe_mode: + no_customizations: "Sitisha dhima ya sasa" + only_official: "Sitisha programu-jalizi zisizo rasmi" + no_plugins: "Sitisha programu-jalizi zote" + enter: "Ingia Hali-tumizi iliyo salama" + wizard: + title: "Mpangilio wa Discourse" + step: + locale: + title: "Karibu kwenye Discourse yako!" + fields: + default_locale: + description: "Lugha ipi ni chaguo-msingi ya jumuia yako?" + forum_title: + title: "Jina" + description: "Jina lako ni ishara ya kwanza kuonwa kutoka mbali, kitu cha kwanzakuonwa kuhusiana na jamii yako. Jina na cheo chako vinasema nini kuhusiana na jumuia yako?" + fields: + title: + label: "Jina la Jumuia" + placeholder: "Sehemu ya Jeni ya Kuburudika" + site_description: + label: "Elezea jamii yako ndani ya sentensi moja" + placeholder: "Sehemu ya Jeni na marafiki zake kujadili vitu vizuri" + introduction: + title: "Utambulisho" + fields: + welcome: + label: "Mada ya Kukaribisha" + description: "

Unawezaje kuelezea jamii yako kwa mtu usiyemjua kwenye lifti ndani ya dakika 1?

  • Majadiliano ni ya nani?
  • Nitakutana na nini?
  • Kwa nini nitembelee?

Mada ya kukaribisha ni kitu cha kwanza kitakachosomwa na waalikwa wapya. Ifikirie kama ankra moja'msemo mfupi' au 'kauli ya vitu vya kutimizwa'.

" + one_paragraph: "Tafadhali hakikisha ujumbe wa kukaribisha ni aya moja." + privacy: + title: "Kufikia" + description: "

Je jamii yako inapatikana kwa kila mtu, au ni kwa wanachama, mualiko, au uthibitisho? Kama ungependa, unaweza kuseti vitu viwe binafsi, kama ya kuonyesha kwa umma baadae.

Unaweza kutuma mialiko kutoka kwenye mada, au kutoka kwenye ukurasa binafsi wa mtumiaji, pia.

" + fields: + privacy: + choices: + open: + label: "Umma" + description: "Mtu yoyote anaweza kuifikia jamii hii na kujiunga." + restricted: + label: "Binafsi" + description: "Watu pekee waliopata mualiko au kuthibitishwa wanaweza kuona jamii" + contact: + title: "Wasiliana" + fields: + contact_email: + label: "Tuma Ujumbe" + placeholder: "jina@mfano.com" + description: "Barua pepe ya mtu au kikundi anayesimamia jumuiya hii. Inatumika kwa ajili ya taarifa muhimu sana, mfano ripoti ambazo hazijashughulikiwa, masasisho ya ulinzi, na ukurasa kuhusu wewe kwa ajili ya mawasiliano muhimu /kuhusiana" + contact_url: + label: "Ukurasa wa Tovuti" + placeholder: "http://www.example.com/contact-us" + description: "Ukurasa wa mawasiliano wa shirika lako. Utaonyeshwa kwenye kurasa wa kuhusu wewe." + site_contact: + label: "Ujumbe uliotomatiki" + description: "Ujumbe wote wa kibinafsi utatumwa kutoka kwa mtumiaji huyu, kama ripoti za onyo na ilani ya umalizaji wa chelezo." + corporate: + title: "Shirika" + fields: + company_short_name: + label: "Jina la Kampuni (fupi)" + placeholder: "Initech" + company_full_name: + label: "Jina la Kampuni (lote)" + placeholder: "Initech, Inc." + company_domain: + label: "Jina la Kikoa cha Kampuni" + placeholder: "initech.com" + colors: + title: "Mandhari" + logos: + title: "Nembo" + fields: + logo_url: + label: "Nembo Msingi" + icons: + title: "Ikoni" + fields: + favicon_url: + label: "Ikoni Ndogo" + apple_touch_icon_url: + label: "Ikoni Kubwa" + homepage: + description: "Tunakushauri uonyeshe mada za hivi karibuni kwenye ukurasa wa kwanza, lakini unaweza kuonyesha kategoria (vikundi vya mada) kwenye ukurasa wa kwanza kama ungependelea." + title: "Ukurasa mkuu" + fields: + homepage_style: + choices: + latest: + label: "Mada za hivi Karibuni" + emoji: + title: "Emoji" + invites: + title: "Alika Wasaidizi" + description: "Una karibia kumaliza! Karibisha watu kadhaa kusaidia kuanzisha majadilianona mada nzuri na majibu kufanya jumuiya yako ianze." + finished: + title: "Discourse yako iko Tayari!" + description: | +

Kama unataka kubadilisha mipangilio hii, tembelea kifungu cha kiongozi; utaiona pembeni ya ikoni ya spana kwenye menyu ya tovuti.

+

Kila la kherikwenye ujengaji wa jumuiya yako mpya!

+ search_logs: + graph_title: "Idadi ya Utafiti" + joined: "Alijiunga" diff --git a/config/locales/server.te.yml b/config/locales/server.te.yml index 4b8dde9331..318fcfef85 100644 --- a/config/locales/server.te.yml +++ b/config/locales/server.te.yml @@ -74,21 +74,21 @@ te: invalid_access: "à°…à°­à±à°¯à°°à±à°¥à°¿à°‚à°šà°¿à°¨ వనరౠవీకà±à°·à°¿à°‚చడానికి మీకౠఅనà±à°®à°¤à°¿ లేదà±." read_only_mode_enabled: "సైటౠకేవలం చదివే రీతిలో ఉంది. à°šà°°à±à°šà°²à± ఇపà±à°ªà±à°¡à± అచేతనం." too_many_replies: - one: à°•à±à°·à°®à°¿à°‚చాలి. కొతà±à°¤ సభà±à°¯à±à°²à± తాతà±à°•ాలికంగా à°’à°• విషయానికి à°’à°• జవాబà±à°•ౠమాతà±à°°à°®à±‡ పరిమితం చేయబడà±à°¡à°¾à°°à± - other: à°•à±à°·à°®à°¿à°‚చాలి. కొతà±à°¤ సభà±à°¯à±à°²à±, తాతà±à°•ాలికంగా à°’à°• విషయానికి %{count} జవాబà±à°²à°•ౠమాతà±à°°à°®à±‡ పరిమితం చెయà±à°¯à°¬à°¡à±à°¡à°¾à°°à±. + one: "à°•à±à°·à°®à°¿à°‚చాలి. కొతà±à°¤ సభà±à°¯à±à°²à± తాతà±à°•ాలికంగా à°’à°• విషయానికి à°’à°• జవాబà±à°•ౠమాతà±à°°à°®à±‡ పరిమితం చేయబడà±à°¡à°¾à°°à±" + other: "à°•à±à°·à°®à°¿à°‚చాలి. కొతà±à°¤ సభà±à°¯à±à°²à±, తాతà±à°•ాలికంగా à°’à°• విషయానికి %{count} జవాబà±à°²à°•ౠమాతà±à°°à°®à±‡ పరిమితం చెయà±à°¯à°¬à°¡à±à°¡à°¾à°°à±." embed: start_discussion: "à°šà°°à±à°š మొదలà±à°ªà±†à°Ÿà±à°Ÿà±" continue: "à°šà°°à±à°š కొనసాగించà±" more_replies: - one: మరో జవాబౠఉంది - other: ఇంకా %{count} జవాబà±à°²à± ఉనà±à°¨à°¾à°¯à°¿ + one: "మరో జవాబౠఉంది" + other: "ఇంకా %{count} జవాబà±à°²à± ఉనà±à°¨à°¾à°¯à°¿" loading: "à°šà°°à±à°š లోడవà±à°¤à±‹à°‚ది" permalink: "శాసà±à°µà°¤ లంకె" imported_from: "%{link} వదà±à°¦ మూల పదà±à°¦à±à°•ౠజోడౠచరà±à°šà°¾ విషయం ఉంది." in_reply_to: "â–¶ %{username}" replies: - one: à°’à°• జవాబౠ- other: '%{count} జవాబà±à°²à±' + one: "à°’à°• జవాబà±" + other: "%{count} జవాబà±à°²à±" spamming_host: "à°•à±à°·à°®à°¿à°‚చాలి. à°† అతిధికి మీరౠలంకె టపా చెయà±à°¯à°²à±‡à°°à±." user_is_suspended: "ససà±à°ªà±†à°‚డైన సభà±à°¯à±à°²à± టపా రాయà±à°Ÿ వీలవదà±" topic_not_found: "à°à°¦à±‹ తపà±à°ªà± జరిగింది. బహà±à°¶à°¾ à°ˆ à°…à°‚à°¶à°‚ à°®à±à°—ిసింది లేదా మీరౠచూసà±à°¤à±‚ ఉండగా తొలగించబడింది?" @@ -121,8 +121,8 @@ te: trust_level_4: "నమà±à°®à°•à°‚_à°¸à±à°¥à°¾à°¯à°¿_4" education: until_posts: - one: à°’à°• టపా - other: '%{count} టపాలà±' + one: "à°’à°• టపా" + other: "%{count} టపాలà±" 'new-reply': | à°¸à±à°µà°¾à°—తం %{site_name} — **పాలà±à°—ొనà±à°¨à°‚à°¦à±à°•à± à°§à°¨à±à°¯à°µà°¾à°¦à°¾à°²à±!** @@ -180,9 +180,6 @@ te: cannot_delete: uncategorized: "అవరà±à°—ీకృతానà±à°¨à°¿ తొలగించలేరà±" has_subcategories: "à°ˆ వరà±à°—ానà±à°¨à°¿ తొలగించలేరà±. à°Žà°‚à°¦à±à°•ంటే దీనికి ఉప వరà±à°—ాలౠఉనà±à°¨à°¾à°¯à°¿." - topic_exists: - one: à°ˆ వరà±à°—ానà±à°¨à°¿ తొలగించలేరà±. à°Žà°‚à°¦à±à°•ంటే దీనిలో à°’à°• విషయం ఉంది. à°ªà±à°°à°¾à°¤à°¨ విషయం %{topic_link}. - other: à°ˆ వరà±à°—ానà±à°¨à°¿ తొలగించలేరà±. à°Žà°‚à°¦à±à°•ంటే దీనిలో %[count] విషయాలౠఉనà±à°¨à°¾à°¯à°¿. à°ªà±à°°à°¾à°¤à°¨ విషయం %{topic_link}. topic_exists_no_oldest: "à°ˆ వరà±à°—ానà±à°¨à°¿ తొలగించలేరà±. à°Žà°‚à°¦à±à°•ంటే దీనిలో %{count} విషయాలౠఉనà±à°¨à°¾à°¯à°¿." trust_levels: newuser: @@ -191,85 +188,85 @@ te: title: "à°ªà±à°°à°¾à°¥à°®à°¿à°• సభà±à°¯à±à°¡à±" rate_limiter: hours: - one: à°’à°• à°—à°‚à°Ÿ - other: '%{count} à°—à°‚à°Ÿà°²à±' + one: "à°’à°• à°—à°‚à°Ÿ" + other: "%{count} à°—à°‚à°Ÿà°²à±" minutes: - one: à°’à°• నిమిషం - other: '%{count} నిమిషాలà±' + one: "à°’à°• నిమిషం" + other: "%{count} నిమిషాలà±" seconds: - one: à°’à°• సెకనౠ- other: '%{count} సెకనà±à°²à±' + one: "à°’à°• సెకనà±" + other: "%{count} సెకనà±à°²à±" datetime: distance_in_words: half_a_minute: "< 1ని" less_than_x_seconds: - one: < 1సె - other: <%{count}సె + one: "< 1సె" + other: "<%{count}సె" x_seconds: - one: 1సె - other: '%{count}సె' + one: "1సె" + other: "%{count}సె" less_than_x_minutes: - one: < 1ని - other: < %{count}ని + one: "< 1ని" + other: "< %{count}ని" x_minutes: - one: 1ని - other: '%{count}ని' + one: "1ని" + other: "%{count}ని" about_x_hours: - one: 1à°—à°‚ - other: '%{count}à°—à°‚' + one: "1à°—à°‚" + other: "%{count}à°—à°‚" x_days: - one: 1రో - other: '%{count}రో' + one: "1రో" + other: "%{count}రో" about_x_months: - one: 1నెల - other: '%{count}నెల' + one: "1నెల" + other: "%{count}నెల" x_months: - one: 1నెల - other: '%{count}నెల' + one: "1నెల" + other: "%{count}నెల" about_x_years: - one: 1సం - other: '%{count}సం' + one: "1సం" + other: "%{count}సం" over_x_years: - one: '> 1సం' - other: '> %{count}సం' + one: "> 1సం" + other: "> %{count}సం" almost_x_years: - one: 1సం - other: '%{count}సం' + one: "1సం" + other: "%{count}సం" distance_in_words_verbose: half_a_minute: "ఇపà±à°ªà±à°¡à±‡" less_than_x_seconds: - one: ఇపà±à°ªà±à°¡à±‡ - other: ఇపà±à°ªà±à°¡à±‡ + one: "ఇపà±à°ªà±à°¡à±‡" + other: "ఇపà±à°ªà±à°¡à±‡" x_seconds: - one: 1 సెకనౠవెనà±à°• - other: '%{count} సెకనà±à°² వెనà±à°•' + one: "1 సెకనౠవెనà±à°•" + other: "%{count} సెకనà±à°² వెనà±à°•" less_than_x_minutes: - one: à°’à°•à±à°• నిమిషం à°®à±à°‚దౠ- other: '%{count} నిమిషాల à°®à±à°‚à°¦à±' + one: "à°’à°•à±à°• నిమిషం à°®à±à°‚à°¦à±" + other: "%{count} నిమిషాల à°®à±à°‚à°¦à±" x_minutes: - one: à°’à°•à±à°• నిమిషం à°®à±à°‚దౠ- other: '%{count} నిమిషాలౠమà±à°‚à°¦à±' + one: "à°’à°•à±à°• నిమిషం à°®à±à°‚à°¦à±" + other: "%{count} నిమిషాలౠమà±à°‚à°¦à±" about_x_hours: - one: 1 à°—à°‚à°Ÿ à°®à±à°‚దౠ- other: '%{count} à°—à°‚à°Ÿà°² à°®à±à°‚à°¦à±' + one: "1 à°—à°‚à°Ÿ à°®à±à°‚à°¦à±" + other: "%{count} à°—à°‚à°Ÿà°² à°®à±à°‚à°¦à±" x_days: - one: 1 రోజౠమà±à°‚దౠ- other: '%{count} రోజà±à°² à°®à±à°‚à°¦à±' + one: "1 రోజౠమà±à°‚à°¦à±" + other: "%{count} రోజà±à°² à°®à±à°‚à°¦à±" about_x_months: - one: రమారమీ à°’à°• మాసం à°®à±à°‚దౠ- other: రమారమీ %{count} నెలల à°®à±à°‚దౠ+ one: "రమారమీ à°’à°• మాసం à°®à±à°‚à°¦à±" + other: "రమారమీ %{count} నెలల à°®à±à°‚à°¦à±" x_months: - one: à°’à°• మాసం à°®à±à°‚దౠ- other: '%{count} నెలల వెనà±à°•' + one: "à°’à°• మాసం à°®à±à°‚à°¦à±" + other: "%{count} నెలల వెనà±à°•" about_x_years: - one: రమారమీ à°’à°• సంవతà±à°¸à°°à°‚ à°®à±à°‚దౠ- other: రమారమీ %{count} సంవతà±à°¸à°°à°¾à°² à°•à±à°°à°¿à°¤à°‚ + one: "రమారమీ à°’à°• సంవతà±à°¸à°°à°‚ à°®à±à°‚à°¦à±" + other: "రమారమీ %{count} సంవతà±à°¸à°°à°¾à°² à°•à±à°°à°¿à°¤à°‚" over_x_years: - one: à°’à°• సంవతà±à°¸à°°à°‚ పైబడి - other: '%{count} సవంతà±à°¸à°°à°¾à°²à°•ౠపైబడి' + one: "à°’à°• సంవతà±à°¸à°°à°‚ పైబడి" + other: "%{count} సవంతà±à°¸à°°à°¾à°²à°•ౠపైబడి" almost_x_years: - one: అటో ఇటో à°’à°• సంవతà±à°¸à°°à°‚ వెనà±à°• - other: అటోఇటో %{count} సంవతà±à°¸à°°à°¾à°² à°®à±à°‚దౠ+ one: "అటో ఇటో à°’à°• సంవతà±à°¸à°°à°‚ వెనà±à°•" + other: "అటోఇటో %{count} సంవతà±à°¸à°°à°¾à°² à°®à±à°‚à°¦à±" password_reset: update: 'సంకేతపదం ఉనà±à°¨à°¤à±€à°•à°°à°¿à°‚à°šà°‚à°¡à°¿' save: 'సంకేతపదం అమరà±à°šà°‚à°¡à°¿' @@ -314,10 +311,6 @@ te: title: 'ఇషà±à°Ÿà°‚' description: 'à°ˆ టపానౠఇషà±à°Ÿà°ªà°¡à±' long_form: 'à°ˆ టపానౠఇషà±à°Ÿà°ªà°¡à±à°¡à°¾à°°à±' - vote: - title: 'వోటà±' - description: 'à°ˆ టపాకౠఓటౠవేయి' - long_form: 'à°ˆ టపాకౠవోటౠవేసారà±' topic_flag_types: spam: title: 'à°¸à±à°ªà°¾à°®à±' @@ -407,8 +400,6 @@ te: num_users: "సభà±à°¯à±à°²à±" top_referred_topics: title: "à°…à°—à±à°° రిఫరరౠవిషయాలà±" - xaxis: "విషయం" - num_clicks: "నొకà±à°•à±à°²à±" page_view_anon_reqs: title: "అనామక" xaxis: "రోజà±" @@ -518,7 +509,6 @@ te: password_too_long: "సంకేతపదాలౠ200 à°…à°•à±à°·à°°à°¾à°²à°•ౠపరిమితం" missing_user_field: "మీరౠఅనà±à°¨à°¿ సభà±à°¯ à°•à±à°·à±‡à°¤à±à°°à°¾à°²à±‚ నింపలేదà±" user: - no_accounts_associated: "à°Žà°Ÿà±à°µà°‚à°Ÿà°¿ ఖాతాలౠభాగమవలేదà±" username: short: "కనీసం %[min] à°…à°•à±à°·à°°à°¾à°²à± ఉండాలి" long: "à°—à°°à°¿à°·à±à°Ÿà°‚ %{max} à°…à°•à±à°·à°°à°¾à°²à± ఉండాలి" @@ -541,7 +531,6 @@ te: recent_topics: "తాజా" see_more: "ఇంకా" search_title: "à°ˆ సైటౠవెదà±à°•à±" - search_google: "గూగà±à°²à±" terms_of_service: title: "సేవా నియమాలà±" signup_form_message: 'నేనౠసేవా నియమాలనౠచదివానà±, వాటికి అంగీకరిసà±à°¤à±à°¨à±à°¨à°¾à°¨à±.' @@ -549,14 +538,6 @@ te: upload: images: size_not_found: "à°•à±à°·à°®à°¿à°‚à°šà°‚à°¡à°¿, కానీ మేమౠచితà±à°°à°‚ యొకà±à°• పరిమాణం నిరà±à°£à°¯à°¿à°‚చలేదà±. బహà±à°¶à°¾ మీ à°šà°¿à°¤à±à°°à°‚ పాడై ఉండవచà±à°šà±?" - email_log: - seen_recently: "వినియోగదారౠకొతà±à°¤à°—à°¾ చూశారà±" - notification_already_read: "à°ˆ ఈమెయిలౠగà±à°°à°¿à°‚à°šà°¿ à°ªà±à°°à°•à°Ÿà°¨ ఇపà±à°ªà°Ÿà°¿à°•ే చదివబడింది" - post_deleted: "టపా రచయితచే తొలగింపబడింది" - user_suspended: "వినియోగదారౠనిలిపివేయబడà±à°¡à°¾à°°à±" - already_read: "వినియోగదారౠఇపà±à°ªà°Ÿà°¿à°•ే à°ˆ టపా చదివారà±" - message_blank: "ఖాళీ సందేశం" - body_blank: "à°®à±à°–à±à°¯à°­à°¾à°—à°‚ ఖాళీగా ఉంది" color_schemes: base_theme_name: "ఆధారం" about: "à°—à±à°°à°¿à°‚à°šà°¿" diff --git a/config/locales/server.th.yml b/config/locales/server.th.yml index 1eaf3d4bc4..f3c4a9fd65 100644 --- a/config/locales/server.th.yml +++ b/config/locales/server.th.yml @@ -61,7 +61,7 @@ th: staff: "ทีมงาน" education: until_posts: - other: '%{count} โพส' + other: "%{count} โพส" activerecord: errors: <<: *errors @@ -107,4 +107,3 @@ th: %{message} page_not_found: see_more: "อื่น" - search_google: "à¸à¸¹à¹€à¸à¸´à¹‰à¸¥" diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index 5c970ce234..475e5a604b 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -112,42 +112,42 @@ tr_TR: reading_time: "Okuma Zamanı" likes: "BeÄŸeniler" too_many_replies: - one: 'Üzgünüz, yeni kullanıcılar geçici olarak aynı konu içinde sadece %{count} cevap ile sınırlılar. ' - other: 'Üzgünüz, yeni kullanıcılar geçici olarak aynı konu içinde sadece %{count} cevap ile sınırlılar. ' + one: "Üzgünüz, yeni kullanıcılar geçici olarak aynı konu içinde sadece %{count} cevap ile sınırlılar. " + other: "Üzgünüz, yeni kullanıcılar geçici olarak aynı konu içinde sadece %{count} cevap ile sınırlılar. " embed: start_discussion: "Tartışma BaÅŸlat" continue: "Tartışmaya Devam Et" referer: "Yönlendiren:" more_replies: - one: '%{count} cevap daha' - other: '%{count} cevap daha' + one: "%{count} cevap daha" + other: "%{count} cevap daha" loading: "Tartışma Yükleniyor..." permalink: "Kalıcı BaÄŸlantı" imported_from: "Bu ilave bir tartışmadır, asıl konu adresi %{link}" in_reply_to: "â–¶ %{username}" replies: - one: '%{count} cevap' - other: '%{count} cevap' + one: "%{count} cevap" + other: "%{count} cevap" no_mentions_allowed: "Üzgünüz, diÄŸer kullanıcılardan bahsedemezsiniz." too_many_mentions: - one: Üzgünüz, bir gönderide sadece %{count} kullanıcıdan bahsedebilirsiniz. - other: Üzgünüz, bir gönderide sadece %{count} kullanıcıdan bahsedebilirsiniz. + one: "Üzgünüz, bir gönderide sadece %{count} kullanıcıdan bahsedebilirsiniz." + other: "Üzgünüz, bir gönderide sadece %{count} kullanıcıdan bahsedebilirsiniz." no_mentions_allowed_newuser: "Üzgünüz, yeni kullanıcılar diÄŸer kullanıcılardan bahsedemezler." too_many_mentions_newuser: - one: Üzgünüz, yeni kullanıcılar bir gönderide sadece %{count} kullanıcıdan bahsedebilirler. - other: Üzgünüz, yeni kullanıcılar bir gönderide sadece %{count} kullanıcıdan bahsedebilirler. + one: "Üzgünüz, yeni kullanıcılar bir gönderide sadece %{count} kullanıcıdan bahsedebilirler." + other: "Üzgünüz, yeni kullanıcılar bir gönderide sadece %{count} kullanıcıdan bahsedebilirler." no_images_allowed: "Üzgünüz, yeni kullanıcılar gönderilere resim koyamazlar." too_many_images: - one: 'Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} resim koyabilirler. ' - other: 'Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} resim koyabilirler. ' + one: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} resim koyabilirler. " + other: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} resim koyabilirler. " no_attachments_allowed: "Üzgünüz, yeni kullanıcılar gönderilere bir ÅŸey ekleyemezler." too_many_attachments: - one: Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} eklenti koyabilirler. - other: Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} eklenti koyabilirler. + one: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} eklenti koyabilirler." + other: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} eklenti koyabilirler." no_links_allowed: "Üzgünüz, yeni kullanıcılar gönderilere baÄŸlantı ekleyemezler." too_many_links: - one: Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} baÄŸlantı ekleyebilirler. - other: Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} baÄŸlantı ekleyebilirler. + one: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} baÄŸlantı ekleyebilirler." + other: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} baÄŸlantı ekleyebilirler." spamming_host: "Üzgünüz bu sunucuya baÄŸlantı veremezsiniz." user_is_suspended: "UzaklaÅŸtırılmış kullanıcılar gönderi yapamazlar." topic_not_found: "Bir ÅŸeyler ters gitti. Muhtemelen siz konuya bakarken bu konu kapatıldı ya da silindi." @@ -205,8 +205,8 @@ tr_TR: trust_level_4: "güven_seviyesi_4" education: until_posts: - one: '%{count} gönderi' - other: '%{count} gönderi' + one: "%{count} gönderi" + other: "%{count} gönderi" 'new-topic': | %{site_name} topluluÄŸuna hoÅŸ geldiniz — **yeni bir sohbet baÅŸlattığınız için teÅŸekkür ederiz! ** @@ -268,27 +268,6 @@ tr_TR: staff_category_description: "Görevliler arası konuÅŸmalar için özel kategori. Konular sadece yönetici ve moderatörlere gözükür." lounge_welcome: title: "Lobiye hoÅŸ geldiniz" - body: |2 - - Tebrikler! :confetti_ball: - - Bu konuyu görebiliyorsanız, yakın süre önce **müdavim** (güven seviyesi 3) seviyesine terfi etmiÅŸsiniz demektir. - - Artık … - - * Herhangi bir konunun baÅŸlık bilgisini düzenleyebilirsiniz - * Herhangi bir konunun kategorisini deÄŸiÅŸtirebilirsiniz - * EklediÄŸiniz linkler takip edilebilir durumunda olacaktır ([otomatik nofollow] (http://en.wikipedia.org/wiki/Nofollow) kaldırıldı) - * Sadece 3. güven seviyesi ve üzerindekilere gözüken özel lobi kategorisine eriÅŸebilirsiniz - * Tek bildirmeyle istenmeyen içerikli iletileri gizleyebilirsiniz - - [Åžu anki müdavim seviyedeki kiÅŸilerin listesi](/badges/3/regular). Merhaba demeyi unutmayın. - - Bu topluluÄŸun önemli bir parçası olduÄŸunuz için teÅŸekkür ederiz! - - (Güven seviyeleriyle ilgili daha fazla bilgi için, [bu konuya bakın][trust]. Lütfen, sadece sürekli olarak kriterlere uyan üyelerin standart seviyede kalacağını unutmayın.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "%{category} kategorisi hakkında " replace_paragraph: "(Bu paragrafın yerine yeni kategorinizin kısa bir açıklamasını girin. Buraya yazılanlar kategori seçim alanında görüneceÄŸi için, açıklamanızı 200 karakterin altında tutmaya çalışın.**Siz bu metni düzenleyene veya herhangi bir konu oluÅŸturana kadar bu kategori, kategori sayfasında gözükmeyecek.**)" @@ -303,9 +282,6 @@ tr_TR: cannot_delete: uncategorized: "Kategorisiz silinemez" has_subcategories: "Alt kategorileri bulunduÄŸu için bu kategori silinemez." - topic_exists: - one: 'Bu kategoriyi silemezsiniz çünkü %{count} konusu bulunuyor. En eski konu: %{topic_link}.' - other: 'Bu kategoriyi silemezsiniz çünkü %{count} konusu bulunuyor. En eski konu: %{topic_link}.' topic_exists_no_oldest: "Bu kategoriyi silemezsiniz çünkü %{count} konusu bulunuyor." uncategorized_description: "Kategoriye ihtiyacı olmayan, ya da diÄŸer kategorilere uymayan konular." trust_levels: @@ -322,85 +298,85 @@ tr_TR: change_failed_explanation: " %{user_name} adlı kullanıcıyı '%{new_trust_level}' seviyesine düşürmeye çalıştınız. Ancak, halihazırda kullanıcının güven seviyesi zaten '%{current_trust_level}'. %{user_name} '%{current_trust_level}' seviyesinde kalacak - eÄŸer seviyesini düşürmek istiyorsanız öncelikle güven seviyesini kilitlemelisiniz" rate_limiter: hours: - one: '%{count} saat' - other: '%{count} saat' + one: "%{count} saat" + other: "%{count} saat" minutes: - one: '%{count} dakika' - other: '%{count} dakika' + one: "%{count} dakika" + other: "%{count} dakika" seconds: - one: '%{count} saniye' - other: '%{count} saniye' + one: "%{count} saniye" + other: "%{count} saniye" datetime: distance_in_words: half_a_minute: "< 1dk" less_than_x_seconds: - one: < %{count}sn - other: < %{count}sn + one: "< %{count}sn" + other: "< %{count}sn" x_seconds: - one: '%{count}sn' - other: '%{count}sn' + one: "%{count}sn" + other: "%{count}sn" less_than_x_minutes: - one: < %{count}dk - other: < %{count}dk + one: "< %{count}dk" + other: "< %{count}dk" x_minutes: - one: '%{count}dk' - other: '%{count}dk' + one: "%{count}dk" + other: "%{count}dk" about_x_hours: - one: '%{count}sa' - other: '%{count}sa' + one: "%{count}sa" + other: "%{count}sa" x_days: - one: '%{count}gün' - other: '%{count}gün' + one: "%{count}gün" + other: "%{count}gün" about_x_months: - one: '%{count}ay' - other: '%{count}ay' + one: "%{count}ay" + other: "%{count}ay" x_months: - one: '%{count}ay' - other: '%{count}ay' + one: "%{count}ay" + other: "%{count}ay" about_x_years: - one: '%{count}yıl' - other: '%{count}yıl' + one: "%{count}yıl" + other: "%{count}yıl" over_x_years: - one: '> %{count}yıl' - other: '> %{count}yıl' + one: "> %{count}yıl" + other: "> %{count}yıl" almost_x_years: - one: '%{count}yıl' - other: '%{count}yıl' + one: "%{count}yıl" + other: "%{count}yıl" distance_in_words_verbose: half_a_minute: "hemen ÅŸimdi" less_than_x_seconds: - one: hemen ÅŸimdi - other: hemen ÅŸimdi + one: "hemen ÅŸimdi" + other: "hemen ÅŸimdi" x_seconds: - one: '%{count} saniye önce' - other: '%{count} saniye önce' + one: "%{count} saniye önce" + other: "%{count} saniye önce" less_than_x_minutes: - one: son %{count} dakika içerisinde - other: son %{count} dakika içerisinde + one: "son %{count} dakika içerisinde" + other: "son %{count} dakika içerisinde" x_minutes: - one: '%{count} dakika önce' - other: '%{count} dakika önce' + one: "%{count} dakika önce" + other: "%{count} dakika önce" about_x_hours: - one: '%{count} saat önce' - other: '%{count} saat önce' + one: "%{count} saat önce" + other: "%{count} saat önce" x_days: - one: '%{count} gün önce' - other: '%{count} gün önce' + one: "%{count} gün önce" + other: "%{count} gün önce" about_x_months: - one: yaklaşık %{count} ay önce - other: yaklaşık %{count} ay önce + one: "yaklaşık %{count} ay önce" + other: "yaklaşık %{count} ay önce" x_months: - one: '%{count} ay önce' - other: '%{count} ay önce' + one: "%{count} ay önce" + other: "%{count} ay önce" about_x_years: - one: yaklaşık %{count} yıl önce - other: yaklaşık %{count} yıl önce + one: "yaklaşık %{count} yıl önce" + other: "yaklaşık %{count} yıl önce" over_x_years: - one: '%{count} yıldan daha fazla önce' - other: '%{count} yıldan daha fazla önce' + one: "%{count} yıldan daha fazla önce" + other: "%{count} yıldan daha fazla önce" almost_x_years: - one: neredeyse %{count} yıl önce - other: neredeyse %{count} yıl önce + one: "neredeyse %{count} yıl önce" + other: "neredeyse %{count} yıl önce" password_reset: no_token: "Üzgünüz, bu parola deÄŸiÅŸtirme baÄŸlantısı çok eski. Yeni bir baÄŸlantı almak için lütfen 'GiriÅŸ Yap' tuÅŸuna basın ve 'Parolamı unuttum'u seçin." update: 'Parolayı Güncelle' @@ -459,10 +435,6 @@ tr_TR: description: 'Bu gönderiyi beÄŸen' short_description: 'Bu gönderiyi beÄŸen' long_form: 'bu beÄŸenildi' - vote: - title: 'Oyla' - description: 'Bu gönderiyi oyla' - long_form: 'bu gönderi oylandı' topic_flag_types: spam: title: 'İstenmeyen' @@ -581,8 +553,6 @@ tr_TR: num_users: "Kullanıcılar" top_referred_topics: title: "En çok atıfta bulunulan konular" - xaxis: "Konu" - num_clicks: "Tıklamalar" page_view_anon_reqs: title: "Anonim" xaxis: "Gün" @@ -638,7 +608,6 @@ tr_TR: xaxis: "Gün" yaxis: "Toplam" mobile_visits: - title: "Kullanıcı Ziyaretleri" xaxis: "Gün" yaxis: "Ziyaret sayısı" dashboard: @@ -738,7 +707,6 @@ tr_TR: post_menu: "Gönderi menüsündeki öğelerin hangi sırada yer alacağını belirleyin. Örnek: beÄŸen|düzenle|bildir|sil|paylaÅŸ|imle|cevapla" post_menu_hidden_items: "Gönderi menüsündeki maddeler, geniÅŸletme üç noktasına tıklanmadığı takdirde otomatik olarak gizlenir. " share_links: "Paylaşım penceresinde hangi maddelerin ne sırada gözükeceÄŸini belirleyin." - track_external_right_clicks: "URL'leri tekrar yazdığı için, saÄŸ tıklanan dış baÄŸlantıların (ör: yeni bir sekmede aç) takibi öntanımlı ayarlarda devre dışı bırakılmıştır." site_contact_username: "Tüm otomatik iletiler için gönderen kiÅŸi olarak gözükecek geçerli bir görevli kullanıcı adı. BoÅŸ bırakılırsa öntanımlı Sistem hesabı kullanılacak." send_welcome_message: "Tüm yeni kullanıcılara bir hoÅŸ geldiniz iletisi ile beraber hızlı baÅŸlangıç kılavuzu gönderin." suppress_reply_directly_below: "Bu gönderinin direk altında sadece tek bir cevap varsa, gönderideki açılabilir cevap sayısı bölümünü gösterme." @@ -911,7 +879,6 @@ tr_TR: min_first_post_typing_time: "Milisaniye olarak bir kullanıcının ilk gönderisini yazarken geçmesi gereken en küçük süre, bu süre geçmezse gönderi otomatik olarak onaylanma kuyruÄŸuna girer. Devre dışı bırakmak için 0'a ayarlayın (tavsiye edilmez)." reply_by_email_enabled: "Konulara e-posta üzerinden cevap yazmayı etkinleÅŸtir." reply_by_email_address: "Email ile cevapla özelliÄŸi için gelen e-posta adresi ÅŸablonu, örnek: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "Discourse'un herhangi bir e-posta göndermesine izin verme" strip_images_from_short_emails: "2800 Byte boyutundan küçük e-postalardan resimleri çıkar" short_email_length: "Kısa e-postanın uzunluÄŸu, Byte olarak" unsubscribe_via_email: "Kullanıcıların konu veya içerik alanında 'unsubscribe' olan bir e-posta göndererek e-postalara abonelikten çıkmasına izin ver" @@ -934,7 +901,6 @@ tr_TR: delete_user_max_post_age: "İlk gönderisi (x) günden eski olan kullanıcıların silinmesine izin verme." delete_all_posts_max: "Tüm Gönderileri Sil düğmesine basıldığında tek seferde silinebilecek en fazla gönderi sayısı. EÄŸer bir kullanıcının gönderi sayısı bu sayıdan fazlaysa, gönderilerin hepsi tek seferde silinemez ve bu kullanıcı silinemez." email_editable: "Kullanıcıların kayıt olduktan sonra e-posta adreslerini deÄŸiÅŸtirmesine izin ver." - logout_redirect: "Çıkış yaptıktan sonra tarayıcının yönlendirileceÄŸi adres (ör: http://bitanesite.com/cikis)" allow_uploaded_avatars: "Kullanıcıların özel profil resimleri yüklemelerine izin ver." allow_animated_avatars: "Kullanıcıların hareketli gif profil resimleri kullanmalarına izin ver. UYARI: Bu ayarı deÄŸiÅŸtirdikten sonra avatars:refresh rake görevini çalıştırın." allow_animated_thumbnails: "Animasyonlu giflerin, animasyonlu küçük resmini oluÅŸturur." @@ -1047,50 +1013,47 @@ tr_TR: not_seen_in_a_month: "HoÅŸ geldiniz! Bir süredir yoktunuz. Bunlar sizin yokluÄŸunuzda en gözde olan konular." merge_posts: edit_reason: - one: '%{count} gönderi %{username} tarafından birleÅŸtirildi' - other: '%{count} gönderi %{username} tarafından birleÅŸtirildi' + one: "%{count} gönderi %{username} tarafından birleÅŸtirildi" + other: "%{count} gönderi %{username} tarafından birleÅŸtirildi" errors: different_topics: "Farklı konulara ait gönderiler birleÅŸtirilemez." different_users: "Farklı kullanıcılara ait gönderiler birleÅŸtirilemez." move_posts: new_topic_moderator_post: - one: '%{count} gönderi yeni bir konu için ayıklandı: %{topic_link}' - other: '%{count} gönderi yeni bir konu için ayıklandı: %{topic_link}' + one: "%{count} gönderi yeni bir konu için ayıklandı: %{topic_link}" + other: "%{count} gönderi yeni bir konu için ayıklandı: %{topic_link}" existing_topic_moderator_post: - one: '%{count} gönderi var olan bir konu içinde birleÅŸtirildi: %{topic_link}' - other: '%{count} gönderi var olan bir konu içinde birleÅŸtirildi: %{topic_link}' - change_owner: - post_revision_text: "Sahiplik %{old_user} hesabından %{new_user} hesabına aktarıldı" - deleted_user: "silinmiÅŸ kullanıcı" + one: "%{count} gönderi var olan bir konu içinde birleÅŸtirildi: %{topic_link}" + other: "%{count} gönderi var olan bir konu içinde birleÅŸtirildi: %{topic_link}" topic_statuses: archived_enabled: "Konu ÅŸimdi arÅŸivlendi. Donduruldu ve herhangi bir ÅŸekilde deÄŸiÅŸiklik yapılamaz." archived_disabled: "Konu ÅŸimdi arÅŸivden çıkarıldı. Artık donmuÅŸ deÄŸil, deÄŸiÅŸtirilebilir." closed_enabled: "Konu ÅŸimdi kapatıldı. Artık yeni cevap yazılmasına izin yok. " closed_disabled: "Konu ÅŸimdi açıldı. Yeni cevaplara izin var." autoclosed_message_max_posts: - one: Bu ileti %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı. - other: Bu ileti %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı. + one: "Bu ileti %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı." + other: "Bu ileti %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı." autoclosed_topic_max_posts: - one: Bu konu %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı. - other: Bu konu %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı. + one: "Bu konu %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı." + other: "Bu konu %{count} olan en fazla cevap limitini aÅŸtığı için otomatik olarak kapatıldı." autoclosed_enabled_days: - one: Bu konu %{count} gün sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. - other: Bu konu %{count} gün sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. + one: "Bu konu %{count} gün sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." + other: "Bu konu %{count} gün sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_hours: - one: '%{count} saat sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor.' - other: '%{count} saat sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor.' + one: "%{count} saat sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." + other: "%{count} saat sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_minutes: - one: '%{count} dakika sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor.' - other: '%{count} dakika sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor.' + one: "%{count} dakika sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." + other: "%{count} dakika sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_lastpost_days: - one: Bu konu son cevaptan %{count} gün sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. - other: Bu konu son cevaptan %{count} gün sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. + one: "Bu konu son cevaptan %{count} gün sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." + other: "Bu konu son cevaptan %{count} gün sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_lastpost_hours: - one: Bu konu son cevaptan %{count} saat sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. - other: Bu konu son cevaptan %{count} saat sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. + one: "Bu konu son cevaptan %{count} saat sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." + other: "Bu konu son cevaptan %{count} saat sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_lastpost_minutes: - one: Bu konu son cevaptan %{count} dakika sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. - other: Bu konu son cevaptan %{count} dakika sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor. + one: "Bu konu son cevaptan %{count} dakika sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." + other: "Bu konu son cevaptan %{count} dakika sonra otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_disabled: "Konu ÅŸimdi açıldı. Yeni cevaplara izin var." autoclosed_disabled_lastpost: "Konu ÅŸimdi açıldı. Yeni cevaplara izin var." pinned_enabled: "Bu konu baÅŸa tutturuldu. Görevli tarafından herkes için ya da kullanıcı tarafından kendisi için baÅŸtan kaldırılmadığı sürede bulunduÄŸu kategorinin en üstünde yer alacak." @@ -1120,7 +1083,6 @@ tr_TR: reserved_username: "Bu kullanıcı adını kullanamazsın." missing_user_field: "Kullanıcı alanlarının tamamını doldurmadınız" user: - no_accounts_associated: "İlgili hesap yok" username: short: "en az %{min} karakter olmalı" long: "%{max} karakterden fazla olmamalı" @@ -1138,8 +1100,8 @@ tr_TR: max_new_accounts_per_registration_ip: "Mevcut IP adresiniz üzerinden yeni kayıt iÅŸlemine izin verilmiyor. (Belirlenen sınır aşıldı.) Bir görevli ile iletiÅŸime geçin." flags_reminder: subject_template: - one: İlgilenilmesi gereken %{count} bildirim var - other: İlgilenilmesi gereken %{count} bildirim var + one: "İlgilenilmesi gereken %{count} bildirim var" + other: "İlgilenilmesi gereken %{count} bildirim var" unsubscribe_mailer: subject_template: "%{site_title} üzerinden daha fazla e-posta güncellemesi almak istemediÄŸinizi onaylayın" invite_password_instructions: @@ -1227,8 +1189,8 @@ tr_TR: subject_template: "Yeni hesap askıda" pending_users_reminder: subject_template: - one: '%{count} kullanıcı onay bekliyor' - other: '%{count} kullanıcı onay bekliyor' + one: "%{count} kullanıcı onay bekliyor" + other: "%{count} kullanıcı onay bekliyor" text_body_template: | Bu foruma giriÅŸ yapabilmek için onayınızı (ya da reddinizi) bekleyen yeni kullanıcı kayıtları var. @@ -1259,10 +1221,8 @@ tr_TR: title: "AboneliÄŸi İptal Et" description: "Bu e-postalarla ilgilenmiyor musunuz? Sorun deÄŸil! AÅŸağıya tıklayarak aboneliÄŸinizi hemen iptal edebilirsiniz:" reply_by_email: "Yanıtlamak için [konuyu ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." - reply_by_email_pm: "Yanıtlamak için [iletiyi ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." only_reply_by_email: "Cevap vermek için bu e-postayı cevaplayın." visit_link_to_respond: "Cevaplamak için [konuyu ziyaret edin](%{base_url}%{url})." - visit_link_to_respond_pm: "Cevaplamak için [iletiyi ziyaret edin](%{base_url}%{url})." posted_by: "%{post_date} tarihinde %{username} tarafından gönderildi" user_invited_to_private_message_pm: text_body_template: | @@ -1401,7 +1361,6 @@ tr_TR: recent_topics: "Yeni" see_more: "Daha fazla" search_title: "Bu sitede ara" - search_google: "Google" terms_of_service: title: "Üyelik SözleÅŸmesi" signup_form_message: 'Üyelik SözleÅŸmesini okudum ve kabul ediyorum.' @@ -1419,24 +1378,6 @@ tr_TR: size_not_found: "Üzgünüz, resminizin büyüklüğünü tespit edemedik. Dosya bozuk olabilir mi?" avatar: missing: "Üzgünüz, bu e-posta adresiyle iliÅŸkilendirilmiÅŸ bir avatar bulamadık. Tekrar yüklemeyi deneyebilir misiniz?" - email_log: - post_user_deleted: "Konunun kullanıcısı silindi." - no_user: "%{user_id} id'sine sahip bir kullanıcı bulunamadı" - anonymous_user: "Kullanıcı anonim" - suspended_not_pm: "Kullanıcı uzaklaÅŸtırıldı, ileti deÄŸil" - seen_recently: "Kullanıcı kısa süre önce görüldü" - post_not_found: "%{post_id} id'sine sahip bir gönderi bulunamadı" - notification_already_read: "Bu e-postanın içerdiÄŸi bildiri önceden okundu" - topic_nil: "post.topic boÅŸ" - post_deleted: "gönderi sahibi tarafından silindi" - user_suspended: "kullanıcı uzaklaÅŸtırıldı" - already_read: "kullanıcı bu gönderiyi önceden okumuÅŸ" - exceeded_emails_limit: "max_emails_per_day_per_user aşıldı" - exceeded_bounces_limit: "bounce_score_threshold aşıldı" - message_blank: "ileti boÅŸ" - message_to_blank: "message.to boÅŸ" - text_part_body_blank: "text_part.body boÅŸ" - body_blank: "içerik boÅŸ" color_schemes: base_theme_name: "Baz" about: "Hakkında" @@ -1458,70 +1399,40 @@ tr_TR: editor: name: Düzenleyici description: İlk gönderini düzenledin - long_description: | - Bu rozet gönderilerinizden birini düzenlediÄŸinizde verilecektir. Gönderilerinizi düzenlemek her zaman için iyidir — gönderilerinizi geliÅŸtirebilir, küçük hataları düzeltebilir, ya da unuttuÄŸunuz ayrıntıları ekleyebilirsiniz. Daha iyi gönderi oluÅŸturabilmek için düzenleyin. basic_user: name: Acemi - description: "Bütün esas forum uygulamalarını kullanabilmeye hak kazanılmıştır" - long_description: | - Bu rozet 1. güven seviyesine ulaÅŸtığın için verildi. Forumda neler olduÄŸunu takip ettiÄŸin için ve konuları okuduÄŸun için teÅŸekkürler. Artık yeni özelliklere sahipsin; özel iletiler, bildirme, düzenleme, ve çoklu resim ve baÄŸlantı paylaÅŸabilme gibi. member: name: Üye - description: "Davetler, grup iletileri, ve daha fazla beÄŸeni hakkı kazanılmıştır" - long_description: | - Bu rozet 2. güven seviyesine ulaÅŸtığın için verildi. Birkaç haftadır aramızda zaman geçirdiÄŸin için teÅŸekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kiÅŸisel grup iletileri oluÅŸturabilirsin ve günlük daha fazla beÄŸeni yapabilirsin. regular: name: Müdavim - description: "Yeniden kategorize etme, yeniden isimlendirme, takip edilen baÄŸlantılar, ve daha fazla beÄŸeni hakkı kazanılmıştır" - long_description: | - Bu rozet 3. güven seviyesine ulaÅŸtığın için verildi. Bir kaç aydır düzenli katılımcımız olduÄŸun için teÅŸekkür ederiz. Forumumuzun en etkin okuyucularından ve güvenilir katılımcılarından birisisin. Artık konuları tekrar kategorize edip, isimlendirebilirsin, bazı özel alanlara da girebilirsiniz ve günlük daha fazla beÄŸeni yapabilirsin. leader: name: Lider - description: "Genel düzenleme, baÅŸa tutturma, kapama, arÅŸivleme, ayırma ve birleÅŸtirme, daha fazla beÄŸeni hakkı kazanılmıştır" - long_description: | - Bu rozet 4. güven seviyesine ulaÅŸtığın için verildi. Forumda yönetim tarafından seçilmiÅŸ bir lidersiniz ve yaptığınız paylaşımlarla diÄŸer üyelere örnek oluyorsunuz. Bütün gönderileri düzenleme hakkına sahipsiniz. Moderatörlerin yapabileceÄŸi, baÅŸa tutturma, kapama, arÅŸivleme, ayırma ve birleÅŸtirme gibi iÅŸlemleri yapabilirsiniz. Artık günlük çok daha fazla beÄŸeni yapabilirsiniz. welcome: name: HoÅŸ geldiniz description: İlk beÄŸeni alma - long_description: | - Bu rozet gönderine ilk beÄŸenini aldığın için verildi. Tebrikler forumda diÄŸer üyelerin ilgisini çeken, yararlı bir paylaşımda bulundun! autobiographer: name: Güncel Profil anniversary: name: Yıldönümü description: "Bir sene içerisinde, en az bir kere gönderi yazmış etkin üye" - long_description: | - Bu rozet en az bir gönderi yazarak bir yıllık üyeliÄŸinizi tamamladığınız için size verilmiÅŸtir. Forumda zaman geçirdiÄŸiniz ve bizlere katkıda bulunduÄŸunuz için teÅŸekkür ederiz. Sizler olmasanız yapamazdık. nice_post: name: HoÅŸ Cevap description: Cevaba 10 beÄŸeni alındı - long_description: | - Bu rozet cevabınıza aldığınız 10 beÄŸeniden dolayı verilmiÅŸtir. Cevabınız forumda etki yarattı ve sohbetin ilerlemesine yardımcı oldu. good_post: name: Çok İyi Cevap description: Cevaba 25 beÄŸeni alındı - long_description: | - Bu rozet cevabınıza aldığınız 25 beÄŸeniden dolayı verilmiÅŸtir. Cevabın çok iyiydi ve forumda herkes için faydalı oldu. great_post: name: MuhteÅŸem Cevap description: Cevaba 50 beÄŸeni alındı - long_description: | - Bu rozet cevabınıza aldığınız 50 beÄŸeniden dolayı verilmiÅŸtir.Süper! Cevabın muhteÅŸem, büyüleyici ve ilham verici. Forum üyeleri cevabına bayıldı! nice_topic: name: HoÅŸ Konu description: Konu 10 beÄŸeni topladı - long_description: | - Bu rozet açtığınız konuya yapılan 10 beÄŸeniden dolayı verilmiÅŸtir. Forum üyelerinin beÄŸendiÄŸi ilginç bir konu baÅŸlattınız. good_topic: name: Çok İyi Konu description: Konu 25 beÄŸeni topladı - long_description: | - Bu rozet açtığınız konuya yapılan 25 beÄŸeniden dolayı verilmiÅŸtir. Forum üyeleri tarafından çok beÄŸenilen hareketli bir konu açtınız. great_topic: name: MuhteÅŸem Konu description: Konu 50 beÄŸeni topladı - long_description: | - Bu rozet açtığınız konuya yapılan 50 beÄŸeniden dolayı size verilmiÅŸtir. Forum üyelerini harekete geçiren muhteÅŸem bir konu baÅŸlattınız. Tebrikler! nice_share: name: HoÅŸ Paylaşım description: Bir gönderiniz 25 tekil ziyaretci tarafından paylaşıldı @@ -1530,13 +1441,9 @@ tr_TR: good_share: name: Çok İyi Paylaşım description: Bir gönderiniz 300 tekil ziyaretci tarafından paylaşıldı - long_description: | - Bu rozeti paylaÅŸtığınız baÄŸlantı forum dışından 300 kiÅŸi tarafından tıklandığı için kazandınız. Çok iyi iÅŸ baÅŸardın! Paylaşımların daha fazla kiÅŸiye ulaÅŸmasını ve forumun geliÅŸmesini saÄŸladın. great_share: name: "MuhteÅŸem Paylaşım " description: Bir gönderiniz 1000 tekil ziyaretci tarafından paylaşıldı - long_description: | - Bu rozeti paylaÅŸtığınız baÄŸlantı forum dışından 1000 kiÅŸi tarafından tıklandığı için kazandınız.Süper! Tartışmayı çok büyük kitlelere ulaÅŸtırdın ve forumun büyümesine muhteÅŸem bir katkı yaptın. first_like: name: İlk BeÄŸeni description: Bir gönderiyi beÄŸendin @@ -1545,21 +1452,15 @@ tr_TR: first_flag: name: İlk Bildirim description: Gönderiyi bildirdi - long_description: | - Bu rozet ilk kez bir gönderiyi bildirdiÄŸiniz için verilmiÅŸtir. Bildirme daha huzurlu bir ortam oluÅŸturmaya yardımcı olmak açısından oldukça önemlidir. EÄŸer herhangi bir gönderinin yönetici tarafından incelenmesini istiyorsanız, lütfen bildirmekten çekinmeyin. EÄŸer gönderileriyle ilgili bir sorun fark ederseniz, diÄŸer üyelere de kiÅŸisel iletiler gönderebilirsiniz. EÄŸer bir problem fark ederseniz, :flag_black: ÅŸikayet edin! promoter: name: Destekçi description: Kullanıcı davet etme campaigner: name: Mücadeleci description: 3 Acemi kullanıcı davet edildi - long_description: | - Bu rozet davet ettiÄŸiniz 3 kiÅŸi sitede vakit geçirerek acemi üye seviyesine ulaÅŸtığı için size verilmiÅŸtir. Hareketli bir forumun düzenli katkıda bulunan katılımcıları ve destekçileri olmalıdır. champion: name: Åžampiyon description: 5 üye davet edildi - long_description: | - Bu rozet davet ettiÄŸiniz 5 kiÅŸi sitede vakit geçirerek üye seviyesine ulaÅŸtığı için size verilmiÅŸtir. Süper! Yeni üyelerle tanışmamıza sebep olduÄŸunuz için teÅŸekkürler! first_share: name: İlk Paylaşım description: Bir gönderi paylaÅŸma @@ -1573,8 +1474,6 @@ tr_TR: first_quote: name: İlk Alıntı description: Bir gönderiyi alıntıladı - long_description: | - Bu rozet cevabınızda baÅŸkasından alıntı yaptığınız için verilmiÅŸtir. BaÅŸka konulardan ve gönderilerden alıntı yapmak mesajlar arasındaki baÄŸlantıyı kuvvetlendirir. En kolay alıntı yapma yolu alıntı yapacağınız bölümü seçip cevap düğmesine basmaktır. read_guidelines: name: Yönergeleri Okuma reader: @@ -1623,8 +1522,6 @@ tr_TR: crazy_in_love: name: BeÄŸeni Delisi description: "20 gün boyunca, günde 50 beÄŸeni hakkını kullanma " - long_description: | - Bu rozet 20 gün boyunca 50 beÄŸeni hakkınızı kullandığınız için verilmiÅŸtir. Süper! DiÄŸer üyelere tam bir örneksin. Tebrik ederiz! thank_you: name: TeÅŸekkürler description: "20 beÄŸeni sahibi olma ve 10 beÄŸenme " @@ -1638,14 +1535,11 @@ tr_TR: empathetic: name: Empatik description: 500 beÄŸeni sahibi olma ve 1000 beÄŸeni - long_description: | - Bu rozet 500 beÄŸenilmiÅŸ gönderisahibi olduÄŸunuz ve bunun karşılığında 1000 ya da daha fazla beÄŸeni yaptığınızdan dolayı size verilmiÅŸtir. Süper! CömetliÄŸin ve takdirin örneÄŸisin :two_hearts:. first_emoji: name: İlk Emoji description: "Bir gönderide emoji kullanma " first_mention: name: İlk Bahsetme - long_description: "Bu rozet ilk defa gönderinizde baÅŸka bir kullanıcıdan bahsettiÄŸiniz için verilmiÅŸtir. Her bahsetme bahsi geçen kullanıcıya bildirim gitmesini saÄŸlar, böylece bu kullanıcı sizin gönderinizden haberdar olur. Sadece bahsi geçen kullanıcı adına @ gerekir." first_onebox: name: İlk Kutulama description: Kutulanmış bir baÄŸlantı gönderdi @@ -1768,8 +1662,6 @@ tr_TR: choices: latest: label: "Son Konular" - categories: - label: "Kategoriler" emoji: title: "Emoji" invites: diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index daacd8082f..2e482f4f6d 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -29,9 +29,9 @@ uk: not_a_number: це не цифра not_an_integer: має бути цілим чиÑлом too_long: + one: надто довге (макÑимум 1 Ñимвол) few: надто довге (макÑимум %{count} Ñимволів) many: надто довге (макÑимум %{count} Ñимволів) - one: надто довге (макÑимум 1 Ñимвол) other: надто довге (макÑимум %{count} Ñимволів) other_than: "має бути іншим ніж %{count}" template: @@ -53,36 +53,36 @@ uk: start_discussion: "Розпочати ДиÑкуÑÑ–ÑŽ" continue: "Продовжити ДиÑкуÑÑ–ÑŽ" more_replies: - few: '%{count} більше відповідей' - many: '%{count} більше відповідей' - one: 1 більше відповідей - other: '%{count} більше відповідей' + one: "1 більше відповідей" + few: "%{count} більше відповідей" + many: "%{count} більше відповідей" + other: "%{count} більше відповідей" loading: "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ..." permalink: "ПоÑтійне поÑиланнÑ" imported_from: "Discussion topic for the original blog entry at: %{link}" replies: - few: '%{count} відповідей' - many: '%{count} відповідей' - one: 1 відповідь - other: '%{count} відповідей' + one: "1 відповідь" + few: "%{count} відповідей" + many: "%{count} відповідей" + other: "%{count} відповідей" no_images_allowed: "Даруйте, нові кориÑтувачі не можуть вÑтавлÑти Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² допиÑи." too_many_images: - few: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} зображень в допиÑ. - many: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} зображень в допиÑ. - one: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки одне Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² допиÑ. - other: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} зображень в допиÑ. + one: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки одне Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² допиÑ." + few: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} зображень в допиÑ." + many: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} зображень в допиÑ." + other: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} зображень в допиÑ." no_attachments_allowed: "Даруйте, нові кориÑтувачі не можуть вÑтавлÑти Ð¿Ñ€Ð¸ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð² допиÑи." too_many_attachments: - few: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} прикріплень в допиÑ. - many: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} прикріплень в допиÑ. - one: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки одне Ð¿Ñ€Ð¸ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð² допиÑ. - other: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} прикріплень в допиÑ. + one: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки одне Ð¿Ñ€Ð¸ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð² допиÑ." + few: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} прикріплень в допиÑ." + many: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} прикріплень в допиÑ." + other: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} прикріплень в допиÑ." no_links_allowed: "Даруйте, нові кориÑтувачі не можуть вÑтавлÑти поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² допиÑи." too_many_links: - few: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} поÑилань в допиÑ. - many: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} поÑилань в допиÑ. - one: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки одне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² допиÑ. - other: Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} поÑилань в допиÑ. + one: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки одне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² допиÑ." + few: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} поÑилань в допиÑ." + many: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} поÑилань в допиÑ." + other: "Даруйте, нові кориÑтувачі можуть вÑтавлÑти тільки %{count} поÑилань в допиÑ." spamming_host: "Даруйте, Ви не можете вÑтавити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° цей хоÑÑ‚." topic_not_found: "ЩоÑÑŒ пішло не так. Можливо цей Ð´Ð¾Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ закрито або видалено, під Ñ‡Ð°Ñ Ñ‚Ð¾Ð³Ð¾ Ñк ви його переглÑдали?" just_posted_that: "це дуже Ñхоже на те, що ви нещодавно допиÑували" @@ -155,30 +155,30 @@ uk: title: "учаÑник" rate_limiter: hours: - few: '%{count} години' - many: '%{count} годин' - one: 1 година - other: '%{count} годин' + one: "1 година" + few: "%{count} години" + many: "%{count} годин" + other: "%{count} годин" minutes: - few: '%{count} хвилини' - many: '%{count} хвилин' - one: 1 хвилина - other: '%{count} хвилин' + one: "1 хвилина" + few: "%{count} хвилини" + many: "%{count} хвилин" + other: "%{count} хвилин" seconds: - few: '%{count} Ñекунди' - many: '%{count} Ñекунд' - one: 1 Ñекунда - other: '%{count} Ñекунд' + one: "1 Ñекунда" + few: "%{count} Ñекунди" + many: "%{count} Ñекунд" + other: "%{count} Ñекунд" datetime: distance_in_words: half_a_minute: "< 1 хв" distance_in_words_verbose: half_a_minute: "щойно" x_seconds: - few: '%{count} Ñекунд тому' - many: '%{count} Ñекунд тому' - one: 1 Ñекунда тому - other: '%{count} Ñекунд тому' + one: "1 Ñекунда тому" + few: "%{count} Ñекунд тому" + many: "%{count} Ñекунд тому" + other: "%{count} Ñекунд тому" password_reset: update: 'Оновити пароль' save: 'Ð’Ñтановити пароль' @@ -214,10 +214,6 @@ uk: title: 'Вподобати' description: 'Like this post' long_form: 'liked this' - vote: - title: 'ПроголоÑувати' - description: 'Vote for this post' - long_form: 'voted for this post' topic_flag_types: spam: title: 'Spam' @@ -298,8 +294,6 @@ uk: num_users: "КориÑтувачі" top_referred_topics: title: "Ðайбільше поÑилаютьÑÑ Ð½Ð°" - xaxis: "Тема" - num_clicks: "Переходи" dashboard: rails_env_warning: "Your server is running in %{env} mode." host_names_warning: "Your config/database.yml file is using the default localhost hostname. Update it to use your site's hostname." @@ -323,7 +317,6 @@ uk: ga_universal_tracking_code: "Код відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Google Universal Analytics (analytics.js), напр.: UA-12345678-9; див. http://google.com/analytics" ga_universal_domain_name: "Доменне ім'Ñ Google Universal Analytics (analytics.js), напр.: mysite.com; див. http://google.com/analytics" post_menu: "Визначає, Ñкі елементи з'ÑвлÑютьÑÑ Ð² меню допиÑу, та в Ñкому порÑдку. Ðаприклад, like|edit|flag|delete|share|bookmark|reply" - track_external_right_clicks: "Track external links that are right clicked (eg: open in new tab) disabled by default because it rewrites URLs" invite_expiry_days: "Скільки днів ключі Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів лишаютьÑÑ Ñ‡Ð¸Ð½Ð½Ð¸Ð¼Ð¸" min_password_length: "Мінімальна довжина паролÑ." enable_yahoo_logins: "Увімкнути вхід через Yahoo" @@ -373,8 +366,6 @@ uk: most_posts: "Ðайбільше допиÑів" most_recent_poster: "Ðвтор оÑтаннього допиÑу" frequent_poster: "ЧаÑтий допиÑувач" - change_owner: - post_revision_text: "Ð’Ð¾Ð»Ð¾Ð´Ñ–Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð½Ð¾ від %{old_user} до %{new_user}" topic_statuses: archived_enabled: "Цю тему тепер заархівовано. Вона заморожена Ñ– Ñ—Ñ— жодним чином не можна змінити." archived_disabled: "Цю тему тепер розархівовано. Вона більше не заморожена, Ñ– Ñ—Ñ— можна змінювати." @@ -432,7 +423,6 @@ uk: recent_topics: "ОÑтанні" see_more: "Більше" search_title: "Пошук на цьому Ñайті" - search_google: "Google" terms_of_service: title: "Умови ВикориÑтаннÑ" signup_form_message: 'I have read and accept the Terms of Service.' @@ -444,19 +434,6 @@ uk: store_failure: "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ #%{upload_id} Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача #%{user_id}." images: size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?" - email_log: - no_user: "Can't find user with id %{user_id}" - seen_recently: "User was seen recently" - post_not_found: "Can't find a post with id %{post_id}" - notification_already_read: "The notification this email is about has already been read" - topic_nil: "post.topic is nil" - post_deleted: "post was deleted by the author" - user_suspended: "user was suspended" - already_read: "user has already read this post" - message_blank: "message is blank" - message_to_blank: "message.to is blank" - text_part_body_blank: "text_part.body is blank" - body_blank: "body is blank" guidelines: "ІнÑтрукції" privacy: "КонфіденційніÑть" edit_this_page: "Редагувати цю Ñторінку" diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index c68947603c..3e5de752c7 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -164,8 +164,8 @@ ur: reading_time: "Ù¾Ú‘Ú¾Ù†Û’ کیلئے وقت" likes: "لائیکس" too_many_replies: - one: ÛÙ… معذرت Ø®ÙˆØ§Û Ûیں، لیکن نئے صارÙین Ú©Ùˆ عارضی طور پر ایک ٹاپک میں 1 جواب تک محدود کیا گیا ÛÛ’Û” - other: ÛÙ… معذرت Ø®ÙˆØ§Û Ûیں، لیکن نئے صارÙین Ú©Ùˆ عارضی طور پر ایک ٹاپک میں %{count} جوابات تک محدود کیا گیا ÛÛ’Û” + one: "ÛÙ… معذرت Ø®ÙˆØ§Û Ûیں، لیکن نئے صارÙین Ú©Ùˆ عارضی طور پر ایک ٹاپک میں 1 جواب تک محدود کیا گیا ÛÛ’Û”" + other: "ÛÙ… معذرت Ø®ÙˆØ§Û Ûیں، لیکن نئے صارÙین Ú©Ùˆ عارضی طور پر ایک ٹاپک میں %{count} جوابات تک محدود کیا گیا ÛÛ’Û”" embed: start_discussion: "بحث شروع کریں" continue: "بحث جاری رکھیں" @@ -175,37 +175,37 @@ ur: no_hosts: "اَیمبَیڈ کرنے کیلئے کوئی Ûوسٹس سَیٹ Ù†Ûیں کیے گئے۔" configure: "اَیمبَیڈ کرنا ترتیب دیں" more_replies: - one: 1 مزید جواب - other: '%{count}مزید جوابات ' + one: "1 مزید جواب" + other: "%{count}مزید جوابات " loading: "بحث Ù„ÙŽÙˆÚˆ ÛÙˆ رÛÛŒ ÛÛ’..." permalink: "دائمی Ù„ÙÙ†Ú©" imported_from: "%{link}پر اصل اندراج کیلئے ÛŒÛ Ø§ÛŒÚ© ساتھی بحث ٹاپک ÛÛ’ " in_reply_to: "â—€ %{username}" replies: - one: 1 جواب - other: '%{count}جوابات ' + one: "1 جواب" + other: "%{count}جوابات " no_mentions_allowed: "معذرت، آپ دوسرے صارÙین کا ذکر Ù†Ûیں کر سکتے۔" too_many_mentions: - one: معذرت، آپ ایک پوسٹ میں صر٠ایک صار٠کا ذکر کر سکتے Ûیں۔ - other: معذرت، آپ ایک پوسٹ میں صر٠%{count} صارÙین کا ذکر کر سکتے Ûیں۔ + one: "معذرت، آپ ایک پوسٹ میں صر٠ایک صار٠کا ذکر کر سکتے Ûیں۔" + other: "معذرت، آپ ایک پوسٹ میں صر٠%{count} صارÙین کا ذکر کر سکتے Ûیں۔" no_mentions_allowed_newuser: "معذرت، نئے صارÙین دوسرے صارÙین کا ذکر Ù†Ûیں کر سکتے۔" too_many_mentions_newuser: - one: معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک دوسرے صار٠کا ذکر کر سکتے Ûیں۔ - other: معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} صارÙین کا ذکر کر سکتے Ûیں۔ + one: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک دوسرے صار٠کا ذکر کر سکتے Ûیں۔" + other: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} صارÙین کا ذکر کر سکتے Ûیں۔" no_images_allowed_trust: "معذرت، آپ پوسٹ میں تصاویر Ù†Ûیں ڈال سکتے" no_images_allowed: "معذرت، نئے صارÙین پوسٹس میں تصاویر Ù†Ûیں ڈال سکتے۔" too_many_images: - one: معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک تصویر ڈال سکتے Ûیں۔ - other: معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} تصاویر ڈال سکتے Ûیں۔ + one: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک تصویر ڈال سکتے Ûیں۔" + other: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} تصاویر ڈال سکتے Ûیں۔" no_attachments_allowed: "معذرت، نئے صارÙین پوسٹس میں اَٹَیچمنٹس Ù†Ûیں ڈال سکتے۔" too_many_attachments: - one: معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک اَٹَیچمنٹ ڈال سکتے Ûیں۔ - other: معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} اَٹَیچمنٹس ڈال سکتے Ûیں۔ + one: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک اَٹَیچمنٹ ڈال سکتے Ûیں۔" + other: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} اَٹَیچمنٹس ڈال سکتے Ûیں۔" no_links_allowed: "معذرت، نئے صارÙین پوسٹس میں Ù„Ùنکس Ù†Ûیں ڈال سکتے۔" links_require_trust: "معذرت، آپ اپنی پوسٹس میں Ù„Ùنکس شامل Ù†Ûیں کر سکتے۔" too_many_links: - one: معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک Ù„ÙÙ†Ú© ڈال سکتے Ûیں۔ - other: معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} Ù„Ùنکس ڈال سکتے Ûیں۔ + one: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠ایک Ù„ÙÙ†Ú© ڈال سکتے Ûیں۔" + other: "معذرت، نئے صارÙین ایک پوسٹ میں صر٠%{count} Ù„Ùنکس ڈال سکتے Ûیں۔" contains_blocked_words: "آپ Ú©ÛŒ پوسٹ میں ایک ایسا Ù„ÙØ¸ شامل ÛÛ’ جس Ú©ÛŒ اجازت Ù†Ûیں ÛÛ’: %{word}" spamming_host: "معذرت، آپ اس Ûَوسٹ کیلئے Ù„ÙÙ†Ú© پوسٹ Ù†Ûیں کر سکتے۔" user_is_suspended: "معطل صارÙین Ú©Ùˆ پوسٹ کرنے Ú©ÛŒ اجازت Ù†Ûیں ÛÛ’Û”" @@ -273,8 +273,8 @@ ur: title: "@%{group_name} کیلئے رکنیت Ú©ÛŒ درخواست" education: until_posts: - one: 1 پوسٹ - other: '%{count} پوسٹس' + one: "1 پوسٹ" + other: "%{count} پوسٹس" 'new-topic': | %{site_name}پر خوش آمدید &mdashØ› **نئی بات چیت شروع کرنے کیلئے شکریÛ!** @@ -433,27 +433,6 @@ ur: آپ اَیڈمن :wrench: (اوپری دائیں اور سب سے نیچے) Ú©Û’ Ø°Ø±ÛŒØ¹Û Ø§ÙØ³ ٹاپک Ú©Ùˆ بند کرنا چاÛیں Ú¯Û’ØŒ ØªØ§Ú©Û Ø§ÛŒÚ© اعلان پر جوابات کا ڈھیر Ù†Û Ù„Ú¯ جائے۔ lounge_welcome: title: "لاؤنج میں خوش آمدید" - body: |2 - - مبارک باد! :confetti_ball: - - اگر آپ Ø§ÙØ³ ٹاپک Ú©Ùˆ دیکھ سکتے Ûیں، تو آپ Ú©Ùˆ حال ÛÛŒ میں **رَیگولر** (ٹرسٹ لَیول 3) پر ترقی دے دی گئی ÛÛ’Û” - - اب آپ … - - * کسی بھی ٹاپک Ú©Û’ عنوان میں ترمیم کر سکتے Ûیں - * کسی بھی ٹاپک کا زÙÙ…Ø±Û ØªØ¨Ø¯ÛŒÙ„ کر سکتے Ûیں - * اپنے تمام Ù„Ùنکس Ùَولَو کروا سکتے Ûیں ([خود کار طریقے سےغیر Ùَولَو](http://en.wikipedia.org/wiki/Nofollow) is removed) Ûٹا دیا جاتا ÛÛ’) - * ایک ذاتی لاؤنج زÙÙ…Ø±Û Ø¬Ùˆ صر٠ٹرسٹ لَیول 3 یا Ø§ÙØ³ سے Ø²ÛŒØ§Ø¯Û ÙˆØ§Ù„Û’ صارÙین Ú©Ùˆ نظر آتا ÛÛ’ تک رسائی کر سکتے Ûیں - * ایک ÛÛŒ Ùلَیگ سے سپَیم چھپا سکتے Ûیں - - ÛŒÛØ§Úº [ساتھی رَیگولرز Ú©ÛŒ Ù…ÙˆØ¬ÙˆØ¯Û ÙÛØ±Ø³Øª](/badges/3/regular) ÛÛ’Û” Ûیلو Ú©Ûنا Ù†Û Ø¨Ú¾ÙˆÙ„ÛŒÛ’ گا۔ - - Ø§ÙØ³ کمیونٹی کا ایک اÛÙ… Ø­ØµÛ Ûونے کا شکریÛ! - - (ٹرسٹ لَیول پر مزید معلومات کیلئے، [ÛŒÛ Ù¹Ø§Ù¾Ú© دیکھیے][اعتماد]Û” Ø¨Ø±Ø§Û Ú©Ø±Ù… نوٹ کریں Ú©Û ØµØ±Ù Ø§ÛŒØ³Û’ ممبران جو وقت Ú©Û’ ساتھ شرائط Ú©Ùˆ پورا کرتے رÛیں Ú¯Û’ صر٠وÛÛŒ رَیگولرز میں شامل رÛیں Ú¯Û’Û”) - - [اعتماد]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "%{category} زÙÙ…Ø±Û Ú©Û’ بارے میں" replace_paragraph: "(اس Ù¾ÛÙ„Û’ پیراگرا٠کو اپنے نئے زÙÙ…Ø±Û Ú©Û’ بارے میں ایک مختصر وضاحت Ú©Û’ ساتھ تبدیل کریں۔ ÛŒÛ ÛØ¯Ø§ÛŒØ§Øª زÙÙ…Ø±Û Ú©Û’ انتخاب Ú©Û’ والی Ø¬Ú¯Û Ù¾Ø± نظر آئے گا، Ù„Ûٰذا Ø§ÙØ³Û’ 200 حرو٠سے نیچے رکھنے Ú©ÛŒ کوشش کریں۔ **جب تک آپ Ø§ÙØ³ وضاحت میں ترمیم یا ٹاپک Ù†Ûیں بنائیں Ú¯Û’ØŒ ÛŒÛ Ø²ÙÙ…Ø±Û Ø²ÙÙ…Ø±Û Ø¬Ø§Øª Ú©Û’ ØµÙØ­Û پر Ù†Ûیں دکھایا جائے گا۔**)" @@ -470,9 +449,6 @@ ur: cannot_delete: uncategorized: "بÙلا زÙÙ…Ø±Û ÙˆØ§Ù„ÙˆÚº Ú©Ùˆ حذ٠نÛیں کیا جا سکتا" has_subcategories: "Ø§ÙØ³ زÙÙ…Ø±Û Ú©Ùˆ حذ٠نÛیں کیا جا سکتا Ú©ÛŒÙˆÙ†Ú©Û Ø§ÙØ³ Ú©Û’ ذیلی زÙÙ…Ø±Û Ûیں۔" - topic_exists: - one: Ø§ÙØ³ زÙÙ…Ø±Û Ú©Ùˆ حذ٠نÛیں کیا جا سکتا Ú©ÛŒÙˆÙ†Ú©Û Ø§ÙØ³ میں 1 ٹاپک ÛÛ’Û” سب سے پرانا ٹاپک %{topic_link} ÛÛ’Û” - other: Ø§ÙØ³ زÙÙ…Ø±Û Ú©Ùˆ حذ٠نÛیں کیا جا سکتا Ú©ÛŒÙˆÙ†Ú©Û Ø§ÙØ³ میں %{count} ٹاپک Ûیں۔ سب سے پرانا ٹاپک %{topic_link} ÛÛ’Û” topic_exists_no_oldest: "Ø§ÙØ³ زÙÙ…Ø±Û Ú©Ùˆ حذ٠نÛیں کیا جا سکتا Ú©ÛŒÙˆÙ†Ú©Û Ù¹Ø§Ù¾Ú© تعداد %{count} ÛÛ’Û”" uncategorized_description: "ÙˆÛ Ù¹Ø§Ù¾Ú© جنÛیں کسی زÙÙ…Ø±Û Ú©ÛŒ ضرورت Ù†Ûیں، یا جو کسی اور Ù…ÙˆØ¬ÙˆØ¯Û Ø²ÙÙ…Ø±Û Ù…ÛŒÚº ÙÙÙ¹ Ù†Ûیں Ûوتے۔" trust_levels: @@ -509,85 +485,85 @@ ur: unsubscribe_via_email: "آپ ای میل Ú©Û’ Ø°Ø±ÛŒØ¹Û Ø±Ú©Ù†ÛŒØª ختم کرنے Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û ØªØ¹Ø¯Ø§Ø¯ تک Ù¾ÛÙ†Ú† گئے Ûیں۔ Ø¨Ø±Ø§Û Ú©Ø±Ù… Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کرنے سے قبل %{time_left} انتظار کریں۔" topic_invitations_per_day: "آپ ٹاپک کیلئے دعوت ناموں Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û ØªØ¹Ø¯Ø§Ø¯ تک Ù¾ÛÙ†Ú† گئے Ûیں۔ Ø¨Ø±Ø§Û Ú©Ø±Ù… Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کرنے سے قبل %{time_left} انتظار کریں۔" hours: - one: 1 گھنٹا - other: '%{count} گھنٹے' + one: "1 گھنٹا" + other: "%{count} گھنٹے" minutes: - one: 1 منٹ - other: '%{count} منٹس' + one: "1 منٹ" + other: "%{count} منٹس" seconds: - one: 1 سیکنڈ - other: '%{count} سیکنڈ' + one: "1 سیکنڈ" + other: "%{count} سیکنڈ" datetime: distance_in_words: half_a_minute: "< 1منٹ" less_than_x_seconds: - one: < 1سیکنڈ - other: < %{count}سیکنڈ + one: "< 1سیکنڈ" + other: "< %{count}سیکنڈ" x_seconds: - one: 1سیکنڈ - other: '%{count}سیکنڈ' + one: "1سیکنڈ" + other: "%{count}سیکنڈ" less_than_x_minutes: - one: '< 1منٹ ' - other: '< %{count}منٹ ' + one: "< 1منٹ " + other: "< %{count}منٹ " x_minutes: - one: 1منٹ - other: '%{count}منٹ ' + one: "1منٹ" + other: "%{count}منٹ " about_x_hours: - one: 1گھنٹا - other: '%{count}گھنٹے' + one: "1گھنٹا" + other: "%{count}گھنٹے" x_days: - one: 1دن - other: '%{count}دن' + one: "1دن" + other: "%{count}دن" about_x_months: - one: 1Ù…Ø§Û - other: '%{count}Ù…Ûینے' + one: "1ماÛ" + other: "%{count}Ù…Ûینے" x_months: - one: 1Ù…Ø§Û - other: '%{count}Ù…Ûینے' + one: "1ماÛ" + other: "%{count}Ù…Ûینے" about_x_years: - one: 1سال - other: '%{count}سال' + one: "1سال" + other: "%{count}سال" over_x_years: - one: '> 1سال' - other: '> %{count}سال' + one: "> 1سال" + other: "> %{count}سال" almost_x_years: - one: 1سال - other: '%{count}سال' + one: "1سال" + other: "%{count}سال" distance_in_words_verbose: half_a_minute: "ابھی" less_than_x_seconds: - one: ابھی - other: ابھی + one: "ابھی" + other: "ابھی" x_seconds: - one: 1 سیکنڈ قبل - other: '%{count} سیکنڈ قبل' + one: "1 سیکنڈ قبل" + other: "%{count} سیکنڈ قبل" less_than_x_minutes: - one: قبل از 1 منٹ سے بھی Ú©Ù… - other: قبل از %{count} منٹ + one: "قبل از 1 منٹ سے بھی Ú©Ù…" + other: "قبل از %{count} منٹ" x_minutes: - one: 1 منٹ قبل - other: '%{count} منٹ قبل' + one: "1 منٹ قبل" + other: "%{count} منٹ قبل" about_x_hours: - one: قبل از 1 Ú¯Ú¾Ù†Ù¹Û - other: ' %{count} گھنٹے قبل' + one: "قبل از 1 گھنٹÛ" + other: " %{count} گھنٹے قبل" x_days: - one: قبل از 1 دن - other: '%{count} دن قبل' + one: "قبل از 1 دن" + other: "%{count} دن قبل" about_x_months: - one: تقریباً 1 Ù…Ø§Û Ù‚Ø¨Ù„ - other: تقریباً %{count} Ù…Ûینے قبل + one: "تقریباً 1 Ù…Ø§Û Ù‚Ø¨Ù„" + other: "تقریباً %{count} Ù…Ûینے قبل" x_months: - one: 1 Ù…Ø§Û Ù‚Ø¨Ù„ - other: ' %{count} Ù…Ûینے قبل ' + one: "1 Ù…Ø§Û Ù‚Ø¨Ù„" + other: " %{count} Ù…Ûینے قبل " about_x_years: - one: تقریباً 1 سال قبل - other: تقریباً %{count} سال قبل + one: "تقریباً 1 سال قبل" + other: "تقریباً %{count} سال قبل" over_x_years: - one: 1 سال سے Ø²ÛŒØ§Ø¯Û Ù¾ÛÙ„Û’ - other: '%{count} سال سے Ø²ÛŒØ§Ø¯Û Ù¾ÛÙ„Û’' + one: "1 سال سے Ø²ÛŒØ§Ø¯Û Ù¾ÛÙ„Û’" + other: "%{count} سال سے Ø²ÛŒØ§Ø¯Û Ù¾ÛÙ„Û’" almost_x_years: - one: تقریباً 1 سال قبل - other: تقریباً %{count} سال قبل + one: "تقریباً 1 سال قبل" + other: "تقریباً %{count} سال قبل" password_reset: no_token: "معذرت، ÙˆÛ Ù¾Ø§Ø³ÙˆØ±Úˆ تبدیل کرنے کا Ù„ÙÙ†Ú© Ø¨ÛØª پرانا ÛÛ’Û” لاگ ان Ú©Û’ بٹن Ú©Ùˆ منتخب کریں اور ایک نیا Ù„ÙÙ†Ú© حاصل کرنے کیلئے 'میں اپنا پاسورڈ بھول گیا' کا استعمال کریں۔" choose_new: "نیا پاسورڈ منتخب کریں" @@ -666,17 +642,11 @@ ur: description: ' Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کریں' short_description: ' Ø§ÙØ³ پوسٹ Ú©Ùˆ لائیک کریں' long_form: 'Ø§ÙØ³ Ú©Ùˆ لائیک کیا' - vote: - title: 'ووٹ' - description: 'Ø§ÙØ³ پوسٹ کیلیے ووٹ کریں' - short_description: 'Ø§ÙØ³ پوسٹ کیلیے ووٹ کریں' - long_form: 'Ø§ÙØ³ پوسٹ Ú©Û’ لیے ووٹ کیا' user_activity: no_default: self: "ابھی تک آپ Ú©ÛŒ کوئی سرگرمی Ù†Ûیں ÛÛ’." others: "کوئی سرگرمی Ù†Ûیں۔" no_bookmarks: - self: "آپ Ú©Û’ پاس کوئی بÙÚ© مارک Ú©ÛŒ Ûوئی پوسٹس Ù†Ûیں Ûیں، پوسٹس بÙÚ© مارک کرنے سے آپ بعد میں اÙÙ† تک آسانی سے رسائی حاصل کرپاتے Ûیں۔" others: "کوئی بÙÚ© مارکس Ù†Ûیں" no_likes_given: self: "آپ Ù†Û’ کوئی پوسٹس لائیک Ù†Ûیں کیں۔" @@ -818,8 +788,6 @@ ur: num_users: "صارÙین" top_referred_topics: title: "ٹاپ تجویز Ú©Ø±Ø¯Û Ù¹Ø§Ù¾Ú©" - xaxis: "ٹاپک" - num_clicks: "Ú©Ù„Ùکس" page_view_anon_reqs: title: "گمنام" xaxis: "دن" @@ -876,13 +844,10 @@ ur: xaxis: "دن" yaxis: "Ú©ÙÙ„" mobile_visits: - title: "ØµØ§Ø±Ù ÙˆÙØ²Ùٹس" xaxis: "دن" yaxis: "ÙˆÙØ²Ùٹس Ú©ÛŒ تعداد" web_crawlers: title: "وَیب کرالر درخواستیں" - xaxis: "صار٠ایجنٹ" - yaxis: "ØµÙØ­Û ملاحظات" dashboard: rails_env_warning: "آپ کا سرور %{env} Ù…ÙŽÙˆÚˆ میں Ú†Ù„ Ø±ÛØ§ ÛÛ’Û”" host_names_warning: "آپ Ú©ÛŒ config/database.yml ÙØ§Ø¦Ù„ ÚˆÛŒÙØ§Ù„Ù¹ localhost نام استعمال کر Ø±ÛØ§ ÛÛ’Û” Ø§ÙØ³Û’ اپنے سائیٹ Ûوسٹ Ú©Û’ نام پر اپ ڈیٹ کریں۔" @@ -900,8 +865,8 @@ ur: failing_emails_warning: 'ناکام Ûونے والی %{num_failed_jobs} اÙÛŒ مَیل جابز موجود Ûیں۔ اپنا app.yml چیک کریں اور ÛŒÛ ÛŒÙ‚ÛŒÙ†ÛŒ بنائیں Ú©Û Ù…ÛŒÙ„ سرور Ú©ÛŒ ترتیبات درست Ûیں۔ Sidekiq میں ناکام جابز Ù…Ù„Ø§Ø­Ø¸Û Ú©Ø±ÛŒÚºÛ”' subfolder_ends_in_slash: "آپ کا سب-Ùولڈر سیٹ اپ غلط ÛÛ’Ø› DISCOURSE_RELATIVE_URL_ROOT ایک سلَیش میں ختم Ûوتا ÛÛ’Û”" email_polling_errored_recently: - one: Ú¯Ø²Ø´ØªÛ 24 گھنٹوں میں ای میل پولÙÙ†Ú¯ Ù†Û’ ایک خرابی دکھائی ÛÛ’Û” مزید ØªÙØµÛŒÙ„ات کیلئے لاگز کا Ù…Ù„Ø§Ø­Ø¶Û Ú©Ø±ÛŒÚºÛ” - other: Ú¯Ø²Ø´ØªÛ 24 گھنٹوں میں ای میل پولÙÙ†Ú¯ Ù†Û’ %{count} خرابیاں دکھائی Ûیں۔ مزید ØªÙØµÛŒÙ„ات کیلئے لاگز کا Ù…Ù„Ø§Ø­Ø¶Û Ú©Ø±ÛŒÚºÛ” + one: "Ú¯Ø²Ø´ØªÛ 24 گھنٹوں میں ای میل پولÙÙ†Ú¯ Ù†Û’ ایک خرابی دکھائی ÛÛ’Û” مزید ØªÙØµÛŒÙ„ات کیلئے لاگز کا Ù…Ù„Ø§Ø­Ø¶Û Ú©Ø±ÛŒÚºÛ”" + other: "Ú¯Ø²Ø´ØªÛ 24 گھنٹوں میں ای میل پولÙÙ†Ú¯ Ù†Û’ %{count} خرابیاں دکھائی Ûیں۔ مزید ØªÙØµÛŒÙ„ات کیلئے لاگز کا Ù…Ù„Ø§Ø­Ø¶Û Ú©Ø±ÛŒÚºÛ”" missing_mailgun_api_key: "سرور Ú©Ùˆ Ø¨Ø°Ø±ÛŒØ¹Û Ù…ÙŽÛŒÙ„Ú¯ÙŽÙ† ای میل بھیجنے کیلئے ترتیب دیا گیا ÛÛ’ØŒ لیکن آپ Ù†Û’ وَیب Ú¾ÙÙˆÚ©Ù˜ پیغامات Ú©ÛŒ توثیق کرنے کیلئے API کلید ÙØ±Ø§ÛÙ… Ù†Ûیں Ú©ÛŒ ÛÛ’Û”" bad_favicon_url: "ÙَیوÙکان لوڈ Ù†Ûیں ÛÙˆ Ø±ÛØ§ ÛÛ’Û” سائٹ ترتیبات میں اپنی favicon_url Ú©ÛŒ ترتیبات چیک کریں۔" poll_pop3_timeout: "POP3 سرور Ú©Û’ ساتھ Ú©Ù†Ùکشن کا وقت ختم Ûوا جا Ø±ÛØ§ ÛÛ’Û” آنے والی ای میل حاصل Ù†Ûیں Ú©ÛŒ جاسکی۔ Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ اپنی POP3 ترتیبات اور سروس ÙØ±Ø§ÛÙ… کرنے والے Ú©Ùˆ چیک کریں۔" @@ -982,7 +947,6 @@ ur: summary_max_results: "'Ø§ÙØ³ ٹاپک کا Ø®Ù„Ø§ØµÛ Ú©Ø±ÛŒÚº' Ú©ÛŒ طر٠سے لوٹائی جانے والی Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ù¾ÙˆØ³Ù¹Ø³" enable_personal_messages: "ٹرسٹ لَیول 1 (پیغامات بھیجنے کیلئے Ú©Ù… از Ú©Ù… ٹرسٹ لَیول Ú©Û’ Ø°Ø±ÛŒØ¹Û ØªØ±ØªÛŒØ¨ دے سکتے Ûیں) والے صارÙین Ú©Ùˆ پیغامات بنانے اور پیغامات کا جواب دینے Ú©ÛŒ اجازت دیں۔ نوٹ کریں Ú©Û Ø¬ÙˆØ¨Ú¾ÛŒ Ûو، اسٹا٠ÛÙ…ÛŒØ´Û Ù¾ÛŒØºØ§Ù…Ø§Øª بھیج سکتا ÛÛ’Û”" enable_system_message_replies: "صارÙین Ú©Ùˆ Ø³ÙØ³Ù¹Ù… پیغامات کا جواب دینے Ú©ÛŒ اجازت دیں، ÛŒÛØ§Úº تک Ú©Û Ø§Ú¯Ø± ذاتی پیغامات بھی غیر ÙØ¹Ø§Ù„ ÛÙˆÚº" - enable_personal_email_messages: "ٹرسٹ لَیول 4 (پیغامات بھیجنے کیلئے Ú©Ù… از Ú©Ù… ٹرسٹ لَیول Ú©Û’ Ø°Ø±ÛŒØ¹Û ØªØ±ØªÛŒØ¨ دے سکتے Ûیں) والے صارÙین Ú©Ùˆ ذاتی ای میل پیغامات Ú©ÛŒ اجازت دیں۔ نوٹ کریں Ú©Û Ø¬ÙˆØ¨Ú¾ÛŒ Ûو، اسٹا٠ÛÙ…ÛŒØ´Û Ù¾ÛŒØºØ§Ù…Ø§Øª بھیج سکتا ÛÛ’Û”" enable_long_polling: "نوٹیÙکیشن کیلئے مَیسج بس استعمال ÛÙˆ Ø±ÛØ§ ÛÛ’ØŒ لانگ پولÙÙ†Ú¯ کا استعمال کیا جا سکتا ÛÛ’" long_polling_base_url: "لانگ پولÙÙ†Ú¯ کیلئے استعمال Ûونے والا بَیس URL (جب ایک CDN متحرک مواد ÙØ±Ø§ÛÙ… کر Ø±ÛØ§ Ûو، تو Ø§ÙØ³ Ú©Ùˆ Ø§ÙˆØ±ÛŒÙØ¬ÙÙ† Ù¾ÙÙ„ پر سَیٹ کرنا یقینی بنائیں) مثال: http://origin.site.com" long_polling_interval: "جب بھیجنے کیلئے کوئی ڈیٹا Ù†Û ÛÙˆ تو کلائینٹس کوجواب دینے سے Ù¾ÛÙ„Û’ سرور Ú©Ùˆ کتنا وقت انتظار کرنا Ú†Ø§ÛØ¦Û’ (صر٠لاگ Ûوئے صارÙین)" @@ -1026,7 +990,6 @@ ur: post_menu: "Ø§ÙØ³ بات کا تعین کریں Ú©Û Ù¾ÙˆØ³Ù¹ مَینÙیو پر کونسی، اور کس ترتیب Ú©Û’ ساتھ اشیاء Ø¸Ø§ÛØ± ÛÙˆÚºÛ” مثال Ú©Û’ طور پر لائیک|ترمیم| Ùلَیگ|حذÙ|شئیر|بÙکمارک|جواب" post_menu_hidden_items: "پوسٹ مینیو میں ÚˆÛŒÙØ§Ù„Ù¹ Ú©Û’ طور پرچھپائی جانے والی اشیاء جب تک کسی توسیعی ellipsis پر Ú©Ù„ÙÚ© Ù†Û Ú©ÛŒØ§ جائے۔" share_links: "Ø§ÙØ³ بات کا تعین کریں Ú©Û Ø´ÛŒØ¦Ø± ڈائیلاگ پر کونسی، اور کس ترتیب Ú©Û’ ساتھ اشیاء Ø¸Ø§ÛØ± ÛÙˆÚºÛ”" - track_external_right_clicks: "بیرونی Ù„Ùنکس جن پر دائیاں Ú©Ù„Ú© کیا جائے اÙÙ† Ú©Ùˆ ٹریک کریں (مثال: نئے ٹیب میں کھولیں) ÚˆÛŒÙØ§Ù„Ù¹ Ú©Û’ طور پر غیر ÙØ¹Ø§Ù„ØŒ Ú©ÛŒÙˆÙ†Ú©Û ÛŒÛ URLs Ú©Ùˆ رÙیرائیٹ کر دیتا ÛÛ’" site_contact_username: "ایک درست سٹا٠صار٠نام جس Ú©ÛŒ طر٠سے تمام خود کار طریقے سے پیغامات بھیجے جائیں۔ اگر خالی Ú†Ú¾ÙˆÚ‘ دیا گیا ÛÙˆ تو ÚˆÛŒÙØ§Ù„Ù¹ Ø³ÙØ³Ù¹Ù… اکاؤنٹ استعمال کیا جائے گا۔" send_welcome_message: "تمام نئے صارÙین Ú©Ùˆ Ùوری شروعات Ú©Û’ گائیڈ Ú©Û’ ساتھ خوش آمدید کا پیغام بھیجیں۔" suppress_reply_directly_below: "پوسٹ پر وسیع ÛÙˆ سکنے والا جوابات Ú©ÛŒ تعداد مت دکھائیں جب Ø§ÙØ³ پوسٹ Ú©Û’ Ø¨Ø±Ø§Û Ø±Ø§Ø³Øª نیچے ایک ÛÛŒ واحد جواب موجود ÛÙˆÛ”" @@ -1079,8 +1042,6 @@ ur: enable_google_oauth2_logins: "Ú¯ÙÙˆÚ¯Ù„ Oauth2 توثیق Ú©Ùˆ ÙØ¹Ø§Ù„ کریں۔ Ú¯ÙÙˆÚ¯Ù„ ÙÛŒ الحال Ø§ÙØ³ توثیق Ú©Û’ Ø·Ø±ÛŒÙ‚Û Ú©ÛŒ اجازت دیتا ÛÛ’Û” کلید اور سیکرٹ Ú©ÛŒ ضرورت ÛÛ’Û”" google_oauth2_client_id: "آپ Ú©ÛŒ Ú¯ÙÙˆÚ¯Ù„ ایپلی کیشن Ú©ÛŒ کلائنٹ آئی ÚˆÛŒ." google_oauth2_client_secret: "آپ Ú©ÛŒ Ú¯ÙÙˆÚ¯Ù„ ایپلی کیشن کا کلائنٹ سیکرٹ." - google_oauth2_prompt: "خالی Ø¬Ú¯Û Ø³Û’ Ø¹Ù„ÛŒØ­Ø¯Û Ú©Ø±Ø¯Û Ø³Ù¹Ø±Ù†Ú¯ وَیلÙیوز Ú©ÛŒ ÙÛØ±Ø³Øª جو Ø§ÙØ³ بات Ú©ÛŒ وضاحت کرتی ÛÛ’ Ú©Û Ø§ÙŽÙˆØªÚ¾Ø±Ø§Ø¦Ø²ÛŒØ´Ù† سرور صار٠کو Ø¯ÙˆØ¨Ø§Ø±Û ØªØµØ¯ÛŒÙ‚ اور رضامندی کیلئے پوچھتا ÛÛ’ Ú©Û Ù†Ûیں۔ Ù…Ù…Ú©Ù†Û Ø§Ù‚Ø¯Ø§Ø± کیلئے https://developers.google.com/identity/protocols/OpenIDConnect#prompt دیکھیں۔" - google_oauth2_hd: "Ú¯ÙÙˆÚ¯Ù„ اَیپس ÛوسٹÙÚˆ ڈومَین جس تک Ú©Û Ø³Ø§Ø¦Ù† اÙÙ† محدود ÛÙˆ گا۔ مزید ØªÙØµÛŒÙ„ات کیلئے https://developers.google.com/identity/protocols/OpenIDConnect#hd-param Ù…Ù„Ø§Ø­Ø¸Û Ú©Ø±ÛŒÚºÛ”" enable_twitter_logins: "ٹویٹر توثیق Ú©Ùˆ ÙØ¹Ø§Ù„ کریں، twitter_consumer_key اور twitter_consumer_secret Ú©ÛŒ ضرورت ÛÛ’" twitter_consumer_key: "ٹویٹر توثیق کیلئے کنزÙÛŒÙومر کلید، https://apps.twitter.com/ پر رجسٹر کردÛ" twitter_consumer_secret: "ٹویٹر توثیق کیلئے کنزÙÛŒÙومر سیکرٹ، https://apps.twitter.com/ پر رجسٹر کردÛ" @@ -1185,7 +1146,6 @@ ur: min_trust_to_edit_post: "پوسٹس میں ترمیم کرنے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول۔" min_trust_to_allow_self_wiki: "صار٠کی طر٠سے اپنی پوسٹ ÙˆÙیکی بنانے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول۔" min_trust_to_send_messages: "نئے ذاتی پیغامات بنانے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول۔" - min_trust_to_send_email_messages: "ای میل Ú©Û’ Ø°Ø±ÛŒØ¹Û Ù†Ø¦Û’ ذاتی پیغامات (سٹَیجڈ صارÙین Ú©Ùˆ) بھیجنے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول۔" min_trust_to_flag_posts: "پوسٹس Ùلَیگ کرنے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول" min_trust_to_post_links: "پوسٹس میں Ù„Ùنکس شامل کرنے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول۔" min_trust_to_post_images: "ایک پوسٹ میں تصاویر شامل کرنے کیلئے Ú©Ù… از Ú©Ù… Ù…Ø·Ù„ÙˆØ¨Û Ù¹Ø±Ø³Ù¹ لَیول۔" @@ -1259,7 +1219,6 @@ ur: reply_by_email_address: "جواب Ø¨Ø°Ø±ÛŒØ¹Û Ø§ÛŒ میل کا آنے والا ای میل ایڈریس کیلئے ٹَیمپلیٹ، مثال Ú©Û’ طور پر: %{reply_key}@reply.example.com یا replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "جواب Ø¨Ø°Ø±ÛŒØ¹Û Ø§ÛŒ میل Ú©Û’ آنے والا ای میل ایڈریس کیلئے متبادل ٹیمپلیٹس، مثال: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" incoming_email_prefer_html: "آنے والے ای میل کیلئے ٹیکسٹ Ú©Û’ بجائے HTML کا استعمال کریں۔" - disable_emails: "ÚˆÙØ³Ú©ÙˆØ±Ø³ Ú©Ùˆ کسی بھی قسم Ú©Û’ ای میل بھیجنے سے روکیں" strip_images_from_short_emails: "2800 بائٹس سے Ú©Ù… سائز والے ای میلز سے تصاویر Ûٹا دیں" short_email_length: "بائٹس میں مختصر ای میل Ú©ÛŒ لمبائی" display_name_on_email_from: "ای میل Ú©ÛŒ \"سے\" Ùیلڈ پر مکمل نام دکھائیں" @@ -1304,7 +1263,6 @@ ur: delete_all_posts_max: "تمام پوسٹس حذ٠کریں والے بٹن سے ایک وقت میں حذ٠کیے جانے والی پوسٹس Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û ØªØ¹Ø¯Ø§Ø¯Û” اگر ایک صار٠کی Ø§ÙØ³ سے Ø²ÛŒØ§Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں ØŒ تو سبھی پوسٹس ایک ÛÛŒ وقت میں حذ٠نÛیں Ûوسکتیں اور صار٠کو حذ٠نÛیں کیا جا سکتا۔" username_change_period: "رجسٹریشن Ú©Û’ بعد دنوں Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û ØªØ¹Ø¯Ø§Ø¯ جب تک Ú©Û Ø§Ú©Ø§Ø¤Ù†Ù¹Ø³ اپنا صار٠نام تبدیل کرسکتے Ûیں (صار٠نام Ú©ÛŒ تبدیلی Ú©Ùˆ غیر ÙØ¹Ø§Ù„ کرنے کیلئے 0)Û”" email_editable: "رجسٹریشن Ú©Û’ بعد صارÙین Ú©Ùˆ اپنا ای میل ایڈریس تبدیل کرنے Ú©ÛŒ اجازت دیں۔" - logout_redirect: "لاگ آؤٹ Ú©Û’ بعد براؤزر Ú©Ùˆ ریڈائرَیکٹ کرنے کا مقام (مثال: http://somesite.com/logout)" allow_uploaded_avatars: "صارÙین Ú©Ùˆ اپنی مرضی Ú©ÛŒ Ù¾Ø±ÙˆÙØ§Ø¦Ù„ تصاویر اَپ لوڈ کرنے Ú©ÛŒ اجازت دیں۔" allow_animated_avatars: "صارÙین Ú©Ùˆ اَینیمَیٹÙÚˆ GIF Ù¾Ø±ÙˆÙØ§Ø¦Ù„ تصاویر استعمال کرنے Ú©ÛŒ اجازت دیں۔ انتباÛ: Ø§ÙØ³ ترتیب Ú©Ùˆ تبدیل کرنے Ú©Û’ بعد avatars:refresh رَیک ٹاسک چلائیں۔" allow_animated_thumbnails: "اَینیمَیٹÙÚˆ GIFs Ú©Û’ اَینیمَیٹÙÚˆ تھَمب نَیل پیدا کریں۔" @@ -1486,68 +1444,65 @@ ur: not_seen_in_a_month: "واپسی Ú©ÛŒ خوش آمدید! ÛÙ… Ù†Û’ Ú©Ú†Ú¾ دیر سے آپ Ú©Ùˆ ÛŒÛØ§Úº Ù†Ûیں دیکھا۔ جب سے آپ دور رÛÛ’ Ûیں، ÛŒÛ Ø§ÙØ³ Ø¯ÙˆØ±Ø§Ù†ÛŒÛ Ú©Û’ سب سے Ø²ÛŒØ§Ø¯Û Ù…Ù‚Ø¨ÙˆÙ„ ترین ٹاپک Ûیں۔" merge_posts: edit_reason: - one: ایک پوسٹ Ú©Ùˆ %{username} Ú©ÛŒ طر٠سے ضم کیا گیا تھا - other: '%{count} پوسٹس Ú©Ùˆ %{username} Ú©ÛŒ طر٠سے ضم کیا گیا تھا' + one: "ایک پوسٹ Ú©Ùˆ %{username} Ú©ÛŒ طر٠سے ضم کیا گیا تھا" + other: "%{count} پوسٹس Ú©Ùˆ %{username} Ú©ÛŒ طر٠سے ضم کیا گیا تھا" errors: different_topics: "مختل٠ٹاپکس Ú©ÛŒ پوسٹس Ú©Ùˆ ضم Ù†Ûیں کیا جا سکتا۔" different_users: "مختل٠صارÙین Ú©ÛŒ پوسٹس Ú©Ùˆ ضم Ù†Ûیں کیا جا سکتا۔" move_posts: new_topic_moderator_post: - one: 'پوسٹ Ú©Ùˆ ایک نئے ٹاپک پر تقسیم کر دیا گیا تھا: %{topic_link}' - other: '%{count} پوسٹس Ú©Ùˆ ایک نئے ٹاپک پر تقسیم کر دیا گیا تھا: %{topic_link}' + one: "پوسٹ Ú©Ùˆ ایک نئے ٹاپک پر تقسیم کر دیا گیا تھا: %{topic_link}" + other: "%{count} پوسٹس Ú©Ùˆ ایک نئے ٹاپک پر تقسیم کر دیا گیا تھا: %{topic_link}" existing_topic_moderator_post: - one: 'پوسٹ Ú©Ùˆ ایک Ù…ÙˆØ¬ÙˆØ¯Û Ù¹Ø§Ù¾Ú© میں ضم کر دیا گیا تھا: %{topic_link}' - other: '%{count} پوسٹس Ú©Ùˆ ایک Ù…ÙˆØ¬ÙˆØ¯Û Ù¹Ø§Ù¾Ú© میں ضم کر دیا گیا تھا: %{topic_link}' - change_owner: - post_revision_text: "%{old_user} سے %{new_user} Ú©Ùˆ مالکیت منتقل کر دی گئی" - deleted_user: "ایک Ø­Ø°Ù Ø´Ø¯Û ØµØ§Ø±Ù" + one: "پوسٹ Ú©Ùˆ ایک Ù…ÙˆØ¬ÙˆØ¯Û Ù¹Ø§Ù¾Ú© میں ضم کر دیا گیا تھا: %{topic_link}" + other: "%{count} پوسٹس Ú©Ùˆ ایک Ù…ÙˆØ¬ÙˆØ¯Û Ù¹Ø§Ù¾Ú© میں ضم کر دیا گیا تھا: %{topic_link}" topic_statuses: archived_enabled: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب آرکائیو کیا Ûوا ÛÛ’Û” ÛŒÛ Ù…Ù†Ø¬Ù…Ø¯ ÛÛ’ اور کسی طرح سے بھی تبدیل Ù†Ûیں کیا جاسکتا۔" archived_disabled: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب غیر آرکائیو Ø´Ø¯Û ÛÛ’Û” ÛŒÛ Ø§Ø¨ منجمد Ù†Ûیں اور تبدیل کیا جاسکتا ÛÛ’Û”" closed_enabled: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب بند کر دیا گیا ÛÛ’Û” نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" closed_disabled: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب کھول دیا گیا ÛÛ’. نئے جوابات Ú©ÛŒ اجازت ÛÛ’Û”" autoclosed_message_max_posts: - one: 1 جواب Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¾ÛŒØºØ§Ù… خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔ - other: '%{count} جوابات Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¾ÛŒØºØ§Ù… خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔' + one: "1 جواب Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¾ÛŒØºØ§Ù… خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔" + other: "%{count} جوابات Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¾ÛŒØºØ§Ù… خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔" autoclosed_topic_max_posts: - one: 1 جواب Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔ - other: '%{count} جوابات Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔' + one: "1 جواب Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔" + other: "%{count} جوابات Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û Ø­Ø¯ تک Ù¾ÛÙ†Ú†Ù†Û’ Ú©Û’ بعد ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کر دیا گیا تھا۔" autoclosed_enabled_days: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 دن Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} دنوں Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 دن Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} دنوں Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" autoclosed_enabled_hours: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 گھنٹے Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} گھنٹوں Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 گھنٹے Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} گھنٹوں Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" autoclosed_enabled_minutes: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 منٹ Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} منٹوں Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 منٹ Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} منٹوں Ú©Û’ بعد بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" autoclosed_enabled_lastpost_days: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 دن بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} دنوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 دن بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} دنوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" autoclosed_enabled_lastpost_hours: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 گھنٹے بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} گھنٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 گھنٹے بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} گھنٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" autoclosed_enabled_lastpost_minutes: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 منٹ بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} منٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 منٹ بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} منٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ بند کردیا گیا تھا۔ نئے جوابات Ú©ÛŒ اب اجازت Ù†Ûیں ÛÛ’Û”" autoclosed_disabled_days: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 دن Ú©Û’ بعد کھول دیا گیا تھا۔ - other: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} دنوں Ú©Û’ بعد کھول دیا گیا تھا۔ + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 دن Ú©Û’ بعد کھول دیا گیا تھا۔" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} دنوں Ú©Û’ بعد کھول دیا گیا تھا۔" autoclosed_disabled_hours: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 گھنٹے Ú©Û’ بعد کھول دیا گیا تھا۔ - other: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} گھنٹوں Ú©Û’ بعد کھول دیا گیا تھا۔ + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 گھنٹے Ú©Û’ بعد کھول دیا گیا تھا۔" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} گھنٹوں Ú©Û’ بعد کھول دیا گیا تھا۔" autoclosed_disabled_minutes: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 منٹ Ú©Û’ بعد کھول دیا گیا تھا۔ - other: ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} منٹوں Ú©Û’ بعد کھول دیا گیا تھا۔ + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ 1 منٹ Ú©Û’ بعد کھول دیا گیا تھا۔" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ %{count} منٹوں Ú©Û’ بعد کھول دیا گیا تھا۔" autoclosed_disabled_lastpost_days: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 دن بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔ - other: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} دنوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔ + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 دن بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} دنوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔" autoclosed_disabled_lastpost_hours: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 گھنٹے بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔ - other: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} گھنٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔ + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 گھنٹے بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} گھنٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔" autoclosed_disabled_lastpost_minutes: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 منٹ بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔ - other: ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} منٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔ + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ 1 منٹ بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© آخری جواب Ú©Û’ %{count} منٹوں بعد خود کار Ø·Ø±ÛŒÙ‚Û Ø³Û’ کھول دیا گیا تھا۔" autoclosed_disabled: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب کھول دیا گیا ÛÛ’. نئے جوابات Ú©ÛŒ اجازت ÛÛ’Û”" autoclosed_disabled_lastpost: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب کھول دیا گیا ÛÛ’. نئے جوابات Ú©ÛŒ اجازت ÛÛ’Û”" pinned_enabled: "ÛŒÛ Ù¹Ø§Ù¾Ú© اب Ù¾ÙÙ† کیا یوا ÛÛ’Û” ÛŒÛ Ø§Ù¾Ù†Û’ زÙÙ…Ø±Û Ù…ÛŒÚº سب سے اوپر Ø¸Ø§ÛØ± ÛÙˆ گا جب تک Ú©Û Ø³Ù¹Ø§Ù Ú©ÛŒ طر٠سے سب کیلئے ÛŒÛ Ù¾ÙÙ† Ûٹا دی Ù†Û Ø¬Ø§Ø¦Û’ یا صارÙین Ú©ÛŒ طر٠سے Ø§Ù†ÙØ±Ø§Ø¯ÛŒ طور پر صر٠اپنے آپ کیلئے۔" @@ -1585,9 +1540,7 @@ ur: already_logged_in: "اÙÙˆÛØŒ لگتا ÛÛ’ Ú©Û Ø¢Ù¾ کسی اور صار٠کیلئے دعوت نامے Ú©Ùˆ قبول کرنے Ú©ÛŒ کوشش کر رÛÛ’ Ûیں۔ اگر آپ %{current_user} Ù†Ûیں Ûیں تو، Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ لاگ Ø¢Ùوٹ کریں اور Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کریں۔" second_factor_title: "دو Ùیکٹر توثیق" second_factor_description: "Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ اپنی اَیپ میں سے Ù…Ø·Ù„ÙˆØ¨Û ØªÙˆØ«ÛŒÙ‚ÛŒ Ú©ÙŽÙˆÚˆ درج کریں:" - invalid_second_factor_code: "غلط توثیقی Ú©ÙŽÙˆÚˆ" user: - no_accounts_associated: "کوئی اکاؤنٹس ÙˆØ§Ø¨Ø³ØªÛ Ù†Ûیں" deactivated: "Ø¨ÛØª سے '%{email}' پر باؤنس٠Ûوئے ای میل Ú©ÛŒ ÙˆØ¬Û Ø³Û’ غیر ÙØ¹Ø§Ù„ کر دیا گیا تھا۔" deactivated_by_staff: "سٹا٠نے غیر ÙØ¹Ø§Ù„ کیا" activated_by_staff: "سٹا٠نے ÙØ¹Ø§Ù„ کیا" @@ -1619,11 +1572,11 @@ ur: same_ip_address: "دوسرے صارÙین Ú©ÛŒ طرح ایک ÛÛŒ IP ایڈریس (%{ip_address})" flags_reminder: flags_were_submitted: - one: Ùلَیگز 1 گھنٹے سے Ù¾ÛÙ„Û’ جمع کیے گئے تھے۔ [Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ ان کا Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÚº](/admin/flags)Û” - other: Ùلَیگز %{count} گھنٹوں سے Ù¾ÛÙ„Û’ جمع کیے گئے تھے۔ [Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ ان کا Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÚº](/admin/flags)Û” + one: "Ùلَیگز 1 گھنٹے سے Ù¾ÛÙ„Û’ جمع کیے گئے تھے۔ [Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ ان کا Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÚº](/admin/flags)Û”" + other: "Ùلَیگز %{count} گھنٹوں سے Ù¾ÛÙ„Û’ جمع کیے گئے تھے۔ [Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ ان کا Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÚº](/admin/flags)Û”" subject_template: - one: نمٹائے جانے کا منتظر 1 Ùلَیگ - other: نمٹائے جانے Ú©Û’ منتظر %{count} Ùلَیگز + one: "نمٹائے جانے کا منتظر 1 Ùلَیگ" + other: "نمٹائے جانے Ú©Û’ منتظر %{count} Ùلَیگز" unsubscribe_mailer: title: "مَیلر غیر سَبسکرائب کریں" subject_template: "تصدیق کریں Ú©Û Ø§Ø¨ آپ %{site_title} سے ای میل اَپ ڈیٹس حاصل Ù†Ûیں کرنا Ú†Ø§ÛØªÛ’ Ûیں" @@ -1818,8 +1771,8 @@ ur: deferred: "Ûمیں بتانے کیلئے شکریÛÛ” ÛÙ… Ø§ÙØ³ سے نمٹ رÛÛ’ Ûیں۔" deferred_and_deleted: "Ûمیں بتانے کیلئے شکریÛÛ” ÛÙ… Ù†Û’ پوسٹ Ûٹا دی ÛÛ’Û”" temporarily_closed_due_to_flags: - one: ÛŒÛ Ù¹Ø§Ù¾Ú© کمیونٹی Ùلَیگز Ú©ÛŒ بڑی تعداد Ú©ÛŒ ÙˆØ¬Û Ø³Û’ 1 گھنٹے کیلئے عارضی طور پر بند کردیا گیا ÛÛ’Û” - other: ÛŒÛ Ù¹Ø§Ù¾Ú© کمیونٹی Ùلَیگز Ú©ÛŒ بڑی تعداد Ú©ÛŒ ÙˆØ¬Û Ø³Û’ %{count} گھنٹوں کیلئے عارضی طور پر بند کردیا گیا ÛÛ’Û” + one: "ÛŒÛ Ù¹Ø§Ù¾Ú© کمیونٹی Ùلَیگز Ú©ÛŒ بڑی تعداد Ú©ÛŒ ÙˆØ¬Û Ø³Û’ 1 گھنٹے کیلئے عارضی طور پر بند کردیا گیا ÛÛ’Û”" + other: "ÛŒÛ Ù¹Ø§Ù¾Ú© کمیونٹی Ùلَیگز Ú©ÛŒ بڑی تعداد Ú©ÛŒ ÙˆØ¬Û Ø³Û’ %{count} گھنٹوں کیلئے عارضی طور پر بند کردیا گیا ÛÛ’Û”" system_messages: private_topic_title: "ٹاپک #%{id}" contents_hidden: "Ø§ÙØ³ Ú©Û’ مواد Ú©Ùˆ دیکھنے کیلئے Ø¨Ø±Ø§Û Ú©Ø±Ù… پوسٹ پر جائیں۔" @@ -1842,11 +1795,6 @@ ur: اضاÙÛŒ رÛنمائی کیلئے، Ø¨Ø±Ø§Û Ú©Ø±Ù… Ûماری [کمیونٹی Ú©ÛŒ رÛنما ÛØ¯Ø§ÛŒØ§Øª](%{base_url}/guidelines) دیکھیے۔ post_hidden_again: title: "پوسٹ Ø¯ÙˆØ¨Ø§Ø±Û Ú†Ú¾Ø§Ù¾ÛŒ دی گئی" - usage_tips: - text_body_template: | - نئے صار٠کے طور پر شروعات کرنے پر چند Ùوری تجاویز کیلئے، [Ø§ÙØ³ بلاگ پوسٹ Ú©Ùˆ دیکھیں](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/)Û” - - جیسے جیسے Ú©Û Ø¢Ù¾ ÛŒÛØ§Úº شرکت کریں Ú¯Û’ØŒ ÛÙ… آپ Ú©Ùˆ جان پائیں Ú¯Û’ØŒ اور نئے صار٠پر عارضی پابندیاں اٹھا دی جائیں گی۔ وقت Ú©Û’ ساتھ ساتھ آپ [ٹرسٹ لَیول](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) حاصل کر سکیں Ú¯Û’ØŒ جن میں Ø§ÙØ³ کمیونٹی Ú©Ùˆ مل کر مینیج کرنے کیلئے خصوصی صلاحیتیں شامل ÛÙˆÚº گی۔ welcome_user: title: "خوش آمدید صارÙ" subject_template: "%{site_name} پر خوش آمدید!" @@ -2115,14 +2063,6 @@ ur: too_many_spam_flags: title: "Ø¨ÛØª Ø²ÛŒØ§Ø¯Û Ø³Ù¾ÙŽÛŒÙ… Ùلَیگز" subject_template: "نیا اکاؤنٹ Ûَولڈ پر" - text_body_template: | - Ûیلو، - - ÛŒÛ %{site_name} Ú©ÛŒ طر٠سے ایک خود کار پیغام ÛÛ’ ØªØ§Ú©Û Ø¢Ù¾ Ú©Ùˆ بتایا جاسکے Ú©Û Ø¢Ù¾ Ú©ÛŒ پوسٹس عارضی طور پر چھپا دیا گیا ÛÛ’ Ú©ÛŒÙˆÙ†Ú©Û ÙˆÛ Ú©Ù…ÛŒÙˆÙ†Ù¹ÛŒ Ú©ÛŒ طر٠سے Ùلَیگ Ú©ÛŒ گئی تھیں۔ - - احتیاطی تدابیر Ú©Û’ طور پر، آپ کا نیا اکاؤنٹ نئے جوابات یا ٹاپک تخلیق کرنے سے خاموش کر دیا گیا ÛÛ’ جب تک Ú©Û Ø§ÛŒÚ© سٹا٠ممبر آپ Ú©Û’ اکاؤنٹ کا Ø¬Ø§Ø¦Ø²Û Ù„Û’ سکے۔ ÛÙ… تکلی٠کے لیے معذرت Ø®ÙˆØ§Û Ûیں۔ - - اضاÙÛŒ رÛنمائی کیلئے، Ø¨Ø±Ø§Û Ú©Ø±Ù… Ûماری [کمیونٹی Ú©ÛŒ رÛنما ÛØ¯Ø§ÛŒØ§Øª](%{base_url}/guidelines) دیکھیے۔ too_many_tl3_flags: title: "Ø¨ÛØª Ø²ÛŒØ§Ø¯Û Ù¹.Ù„.3 Ùلَیگز" subject_template: "نیا اکاؤنٹ Ûَولڈ پر" @@ -2179,8 +2119,8 @@ ur: pending_users_reminder: title: "زیر٠اÙلتواء صارÙین کیلئے یاد Ø¯ÛØ§Ù†ÛŒ" subject_template: - one: 1 صار٠منظوری کا منتظر ÛÛ’ - other: '%{count} صارÙین منظوری Ú©Û’ منتظر Ûیں' + one: "1 صار٠منظوری کا منتظر ÛÛ’" + other: "%{count} صارÙین منظوری Ú©Û’ منتظر Ûیں" text_body_template: | Ø§ÙØ³ Ùورم تک رسائی حاصل کرنے سے Ù¾ÛÙ„Û’ نئے صار٠سائن اَپ منظور (یا مسترد) Ûونے Ú©Û’ منتظر Ûیں۔ [Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ اَیڈمن سیکشن میں اÙÙ† کا Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÚº](%{base_url}/admin/users/list/pending)Û” @@ -2207,8 +2147,8 @@ ur: queued_posts_reminder: title: "قطار Ø´Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ یاد Ø¯ÛØ§Ù†ÛŒ" subject_template: - one: Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÛ’ جانے Ú©ÛŒ منتظر 1 پوسٹ - other: Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÛ’ جانے Ú©ÛŒ منتظر %{count} پوسٹس + one: "Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÛ’ جانے Ú©ÛŒ منتظر 1 پوسٹ" + other: "Ø¬Ø§Ø¦Ø²Û Ù„ÛŒÛ’ جانے Ú©ÛŒ منتظر %{count} پوسٹس" text_body_template: | Ûیلو، @@ -2226,17 +2166,15 @@ ur: user_notifications: previous_discussion: "Ù¾Ú†Ú¾Ù„Û’ جوابات" reached_limit: - one: 'جان لیں Ú©Û: ÛÙ… Ø±ÙˆØ²Ø§Ù†Û Ú©ÛŒ 1 ای میل بھیجتے Ûیں۔ جو ممکنی روک دی گئی Ûوں، اÙÙ† Ú©Ùˆ دیکھنے کیلئے سائٹ Ú©Ùˆ چیک کریں۔ اور ÛØ§ÚºØŒ مقبول Ûونے کیلئے شکریÛ!' - other: 'جان لیں Ú©Û: ÛÙ… Ø±ÙˆØ²Ø§Ù†Û Ú©ÛŒ %{count} ای میل بھیجتے Ûیں۔ جو ممکنی روک دی گئی Ûوں، اÙÙ† Ú©Ùˆ دیکھنے کیلئے سائٹ Ú©Ùˆ چیک کریں۔ اور ÛØ§ÚºØŒ مقبول Ûونے کیلئے شکریÛ!' + one: "جان لیں Ú©Û: ÛÙ… Ø±ÙˆØ²Ø§Ù†Û Ú©ÛŒ 1 ای میل بھیجتے Ûیں۔ جو ممکنی روک دی گئی Ûوں، اÙÙ† Ú©Ùˆ دیکھنے کیلئے سائٹ Ú©Ùˆ چیک کریں۔ اور ÛØ§ÚºØŒ مقبول Ûونے کیلئے شکریÛ!" + other: "جان لیں Ú©Û: ÛÙ… Ø±ÙˆØ²Ø§Ù†Û Ú©ÛŒ %{count} ای میل بھیجتے Ûیں۔ جو ممکنی روک دی گئی Ûوں، اÙÙ† Ú©Ùˆ دیکھنے کیلئے سائٹ Ú©Ùˆ چیک کریں۔ اور ÛØ§ÚºØŒ مقبول Ûونے کیلئے شکریÛ!" in_reply_to: "Ú©Û’ جواب میں" unsubscribe: title: "غیر سَبسکرائب" description: "اÙÙ† ای میلز Ú©Ùˆ موصول کرنے میں دلچسپی Ù†Ûیں ÛÛ’ØŸ کوئی Ù…Ø³Ø¦Ù„Û Ù†Ûیں! Ùوری طور پر غیر سَبسکرائب کرنے کیلئے ذیل میں Ú©Ù„ÙÚ© کریں:" reply_by_email: "[ٹاپک ÙˆÙØ²ÙÙ¹ کریں](%{base_url}%{url}) یا جواب دینے کیلئے اس ای میل کا جواب دیں۔" - reply_by_email_pm: "[پیغام ÙˆÙØ²ÙÙ¹ کریں](%{base_url}%{url}) یا جواب دینے کیلئے اس ای میل کا جواب دیں۔" only_reply_by_email: "جواب دینے کیلئے اس ای میل کا جواب دیں۔" visit_link_to_respond: "جواب دینے کیلئے [ٹاپک ÙˆÙØ²ÙÙ¹ کریں](%{base_url}%{url})Û”" - visit_link_to_respond_pm: "جواب دینے کیلئے [پیغام ÙˆÙØ²ÙÙ¹ کریں](%{base_url}%{url})Û”" posted_by: "%{post_date} Ú©Ùˆ %{username} Ù†Û’ پوسٹ کیا" invited_group_to_private_message_body: | %{inviter_name} Ù†Û’ %{group_name} Ú©Ùˆ ایک پیغام پر مدعو کیا @@ -2578,7 +2516,6 @@ ur: recent_topics: "حالیÛ" see_more: "مذید" search_title: "Ø§ÙØ³ سائٹ میں تلاش کریں" - search_google: "Ú¯ÙÙˆÚ¯ÙŽÙ„" offline: title: "اَیپ Ú©Ùˆ لوڈ Ù†Ûیں کیا جا سکا" offline_page_message: "لگتا ÛÛ’ Ú©Û Ø¢Ù¾ آ٠لائن Ûیں! Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ اپنا نیٹ وَرک کنکشن چیک کریں اور Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کیجیے۔" @@ -2612,32 +2549,11 @@ ur: flag_reason: sockpuppet: "ایک نئے صار٠نے ایک ٹاپک بنایا، اور Ø§ÙØ³ÛŒ IP ایڈریس (%{ip_address}) پر ایک نئے صار٠نے جواب دیا۔ `flag_sockpuppets` سائٹ ترتیب دیکھیے۔" spam_hosts: "Ø§ÙØ³ نئے صار٠ایک ÛÛŒ ڈومَین (%{domain}) Ú©Û’ Ù„Ùنکس Ú©Û’ ساتھ کئی پوسٹس تخلیق کرنے Ú©ÛŒ کوشش کی۔ `newuser_spam_host_threshold` سائٹ Ú©ÛŒ ترتیب دیکھیے۔" - email_log: - post_user_deleted: "پوسٹ کا صار٠حذ٠کردیا گیا ÛÛ’Û”" - no_user: "آئی ÚˆÛŒ %{user_id} Ú©Û’ ساتھ صار٠کو تلاش Ù†Ûیں کیا جا سکا" - anonymous_user: "صار٠گمنام ÛÛ’" - suspended_not_pm: "صار٠معطل ÛÛ’ØŒ پیغام Ù†Ûیں ÛÛ’" - seen_recently: "صار٠کو حال ÛÛŒ میں دیکھا گیا تھا" - post_not_found: "آئی ÚˆÛŒ %{post_id} Ú©Û’ ساتھ پوسٹ Ú©Ùˆ تلاش Ù†Ûیں کیا جا سکا" - notification_already_read: "ÛŒÛ Ø§ÛŒ میل جس اطلاع Ú©Û’ بارے میں ÛÛ’ØŒ ÙˆÛ Ù¾ÛÙ„Û’ ÛÛŒ Ù¾Ú‘Ú¾ Ù„ÛŒ گئی ÛÛ’" - topic_nil: "پوسٹ.ٹاپک Ù†ÙÙ„ ÛÛ’" - post_deleted: "پوسٹ مصن٠کی طر٠سے حذ٠کر دی گئی" - user_suspended: "صار٠معطل کردیا گیا تھا" - already_read: "صار٠نے Ø§ÙØ³ پوسٹ Ú©Ùˆ Ù¾ÛÙ„Û’ ÛÛŒ Ù¾Ú‘Ú¾ لیا ÛÛ’" - exceeded_emails_limit: "max_emails_per_day_per_user سے تجاوز کر گیا" - exceeded_bounces_limit: "bounce_score_threshold سے تجاوز کر گیا" - message_blank: "پیغام خالی ÛÛ’" - message_to_blank: "پیغام.کیلئے خالی ÛÛ’" - text_part_body_blank: "text_part.body خالی ÛÛ’" - body_blank: "متن خالی ÛÛ’" - no_echo_mailing_list_mode: "صار٠کی اپنے پوسٹس کیلئے مَیلنگ Ù„ÙØ³Ù¹ اطلاعات غیر ÙØ¹Ø§Ù„ Ûیں" color_schemes: base_theme_name: "بَیس" - default: "لائٹ سکیم" dark: "ڈارک سکیم" - default_theme_name: "ÚˆÙÛŒÙØ§Ù„Ù¹" - dark_theme_name: "ڈارک" light_theme_name: "لائٹ" + dark_theme_name: "ڈارک" about: "بارے میں" guidelines: "ÛØ¯Ø§ÛŒØ§Øª" privacy: "پرائیوÙیسی" @@ -2974,74 +2890,41 @@ ur: editor: name: ترمیم Ú©Ù†Ù†Ø¯Û description: Ù¾ÛÙ„ÛŒ پوسٹ ترمیم - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ Ù¾ÛÙ„ÛŒ Ø¯ÙØ¹Û اپنی اشاعتوں میں سے ایک میں ترمیم کرنے پر دیا جاتا ÛÛ’Û” تاÛÙ… آپ ÛÙ…ÛŒØ´Û Ú©ÛŒÙ„Ø¦Û’ اپنی اشاعتوں میں ترمیم Ù†Ûیں کر سکیں Ú¯Û’ØŒ ترامیم کرنا ÛÙ…ÛŒØ´Û Ø§ÛŒÚ© اچھا خیال Ûوتا ÛÛ’ — آپ اپنے پیغامات Ú©Ùˆ Ø¨ÛØªØ± بنا سکتے Ûیں، چھوٹی غلطیوں Ú©Ùˆ درست کر سکتے Ûیں، یا ایسا Ú©Ú†Ú¾ بھی شامل کریں جو آپ Ù¾ÛÙ„ÛŒ Ø¯ÙØ¹Û میں شامل کرنا بھول گئے تھے۔ اپنی اشاعتیں Ú©Ùˆ مذید Ø¨ÛØªØ± بنانے کیلئے اÙÙ† Ú©Ùˆ ترمیم کیجیے! basic_user: name: بَیسÙÚ© - description: "تمام لازمی کمیونٹی Ú©Û’ Ø§ÙØ¹Ø§Ù„ عطا کر دیے گئے" - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ٹرسٹ لَیول 1 تک Ù¾ÛÙ†Ú†Ù†Û’ پر دیا جاتا ÛÛ’Û” تھوڑی دیر کیلئے ÛŒÛØ§Úº رکنے اور Ûماری کمیونٹی Ú©Û’ بارے میں جاننے کیلئے چند ٹاپک Ù¾Ú‘Ú¾Ù†Û’ کیلئے شکریÛÛ” آپ پر نئے صار٠کی پابندیاں Ûٹا دی گئیں Ûیں؛ آپ Ú©Ùˆ تمام لازمی کمیونٹی صلاحیات، جیسے Ú©Û Ø°Ø§ØªÛŒ پیغام رسانی، Ùلَیگ سازی، ÙˆÙیکی ترمیم، اور ایک سے Ø²ÛŒØ§Ø¯Û ØªØµØ§ÙˆÛŒØ± اور Ù„Ùنکس شائع کرنا، عطا کر دی گئیں Ûیں۔ member: name: ممبر - description: "دعوت نامے، گروپ پیغام رسانی، مزید لائیکس عطا کر دیے گئے" - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ Ú©Û’ آپ ٹرسٹ لَیول 2 تک Ù¾ÛÙ†Ú†Ù†Û’ پر دیا جاتا ÛÛ’Û” Ûماری کمیونٹی میں واقعی شامل Ûونے کیلئے چند ÛÙØªÙˆÚº کیلئے Ø­ØµÛ Ù„ÛŒÙ†Û’ کیلئے شکریÛÛ” اَب آپ اپنے ØµØ§Ø±Ù ØµÙØ­Û’ یا Ø§Ù†ÙØ±Ø§Ø¯ÛŒ ٹاپکس سے دعوت Ù†Ø§Ù…Û Ø¨Ú¾ÛŒØ¬ سکتے Ûیں، گروپ ذاتی پیغامات تشکیل دے سکتے Ûیں، اور آپ Ú©Ùˆ ÙÛŒ دن Ú©Ú†Ú¾ مذید لائیکس حاصل ÛÙˆ گئے Ûیں۔ regular: name: رَیگولر - description: "زÙÙ…Ø±Û Ø¯ÙˆØ¨Ø§Ø±Û Ø¯Ø±Ø¬ کرنا، نام تبدیل کرنا، Ùَولَو Ú©Ø±Ø¯Û Ù„Ùنکس، ÙˆÙیکی، مذید لائیکس عطا کر دیے گئے" - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ٹرسٹ لَیول 3 تک Ù¾ÛÙ†Ú†Ù†Û’ پر دیا جاتا ÛÛ’Û” Ù…Ûینوں Ú©ÛŒ مدت کیلئے Ûماری کمیونٹی باقاعدگی سے Ø­ØµÛ Ø¨Ù†Ù†Û’ کیلئے شکریÛÛ” اَب آپ سب سے Ø²ÛŒØ§Ø¯Û Ø³Ø±Ú¯Ø±Ù… Ù¾Ú‘Ú¾Ù†Û’ والوں میں سے ایک Ûیں، اور ایک قابل اعتماد شراکت دار Ûیں جو Ûماری کمیونٹی Ú©Ùˆ زبردست بنا دیتے Ûیں۔ اَب آپ ٹاپکس Ú©Û’ زÙÙ…Ø±Û Ø¬Ø§Øª اور نام تبدیل کر سکتے Ûیں، مزید طاقتور سپَیم Ùلَیگز کا ÙØ§Ø¦Ø¯Û اٹھا سکتے Ûیں، ایک ذاتی لاؤنج تک رسائی حاصل کرسکتے Ûیں اور آپ Ú©Ùˆ ÙÛŒ دن کئی Ø²ÛŒØ§Ø¯Û Ù„Ø§Ø¦ÛŒÚ©Ø³ بھی حاصل ÛÙˆ گئے Ûیں۔ leader: name: Ù„Ùیڈر - description: "گلَوبل ترمیم، Ù¾Ùن، بند، آرکائیو، تقسیم اور ضم کرنا، مزید لائیکس عطا کر دیے گئے" - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ٹرسٹ لَیول 4 تک Ù¾ÛÙ†Ú†Ù†Û’ پر دیا جاتا ÛÛ’Û” آپ Ø§ÙØ³ کمیونٹی میں سٹا٠کی طر٠سے منتخب Ú©Ø±Ø¯Û Ø§ÛŒÚ© رÛنما Ú©ÛŒ حیثیت رکھتے Ûیں، اور آپ Ù†Û’ اپنے اعمال اور Ø§Ù„ÙØ§Ø¸ سے باقی کمیونٹی کیلئے ایک مثبت مثال قائم Ú©ÛŒ ÛÛ’Û” آپ Ú©Û’ پاس تمام پوسٹس میں ترمیم کرنے Ú©ÛŒ صلاحیت ÛÛ’ØŒ ٹاپک پر ماڈریٹر Ú©Û’ عام Ø§ÙØ¹Ø§Ù„ جیسے Ú©Û Ù¾Ùن، بند، غیر ÙÛØ±Ø³Øª Ø´Ø¯ÛØŒ آرکائیو، تقسیم، اور ضم کرنا، اور آپ Ú©Û’ پاس ÙÛŒ دن ٹنَوں لائیکس Ûیں۔ welcome: name: خوش آمدید description: لائیک موصول Ûوا - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ اپنی پوسٹ پر Ù¾Ûلا لائیک موصول Ûونے پر دیا جاتا ÛÛ’Û” مبارک Ûو، آپ Ù†Û’ Ú©Ú†Ú¾ شائع کیا ÛÛ’ جو آپ Ú©Û’ ساتھی کمیونٹی ممبران Ú©Ùˆ دلچسپ، زبردست، یا Ù…Ùید معلوم Ûوا ÛÛ’! autobiographer: name: آپ بيتی نويس description: "Ù¾Ø±ÙˆÙØ§Ø¦Ù„ معلومات Ú©Ùˆ Ù¾ÙØ± کر دیا" - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ اپنی ØµØ§Ø±Ù Ù¾Ø±ÙˆÙØ§Ø¦Ù„ بھرنے اور Ù¾Ø±ÙˆÙØ§Ø¦Ù„ تصویر منتخب کرنے پر عطا کیا جاتا ÛÛ’Û” کمیونٹی Ú©Ùˆ بتانے سے Ú©Û Ø¢Ù¾ کون Ûیں اور Ú©Ù† چیزوں میں دلچسپی رکھتے Ûیں، ایک Ø¨ÛØªØ±ØŒ مذید Ù…Ø´ØªØ±Ú©Û Ú©Ù…ÛŒÙˆÙ†Ù¹ÛŒ بنانے میں مدد دیتا ÛÛ’Û” Ûمارے ساتھ شامل ÛÙˆÚº! anniversary: name: Ø³Ø§Ù„Ú¯Ø±Ù°Û description: ایک سال کیلئے سرگرم رکن، Ú©Ù… از Ú©Ù… ایک Ø¯ÙØ¹Û پوسٹ کیا - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ایک سال کیلئے رکن Ûونے Ú©Û’ ساتھ ساتھ Ø§ÙØ³ÛŒ سال Ú©Ù… از Ú©Ù… ایک پوسٹ شائع کرنے پر عطا کیا جاتا ÛÛ’Û” ÛŒÛØ§Úº رکنے اور Ûماری کمیونٹی میں Ø­ØµÛ Ù„ÛŒÙ†Û’ کیلئے آپ کا شکریÛÛ” ÛÙ… آپ Ú©Û’ بغیر ÛŒÛ Ù†Ûیں کر سکتے تھے۔ nice_post: name: اچھا جواب description: ایک جواب پر 10 لائیکس موصول Ûوئے - long_description: |+ - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ جواب پر 10 لائیکس موصول Ûونے پر عطا کیا جاتا ÛÛ’Û” آپ کا جواب کمیونٹی پر واقعی اثر انداز Ûوا اور Ú¯ÙØªÚ¯Ùˆ Ú©Ùˆ Ø¢Ú¯Û’ بڑھانے میں مدد کا بائث بنا! - good_post: name: Ø¹Ù…Ø¯Û Ø¬ÙˆØ§Ø¨ description: ایک جواب پر 25 لائیکس موصول Ûوئے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ جواب پر 25 لائیکس موصول Ûونے پر عطا کیا جاتا ÛÛ’Û” آپ کا جواب غیر معمولی تھا اور Ú¯ÙØªÚ¯Ùˆ Ú©Ùˆ سب کیلئے Ø¨ÛØªØ± بنانے کا بائث بنا! great_post: name: زبردست جواب description: ایک جواب پر 50 لائیکس موصول Ûوئے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ جواب پر 50 لائیکس موصول Ûونے پر عطا کیا جاتا ÛÛ’Û” زبردست! آپ کا جواب Ø­ÙˆØµÙ„Û Ø§ÙØ²Ø§Ù†Û’ والا، Ø§Ù†ØªÛØ§Ø¦ÛŒ دلچسپ، Ù…Ø²Ø§Ø­ÛŒÛ ÛŒØ§ بصیرت شعار تھا اور کمیونٹی Ù†Û’ Ø§ÙØ³Û’ Ø¨ÛØª پسند کیا۔ nice_topic: name: اچھا ٹاپک description: ایک ٹاپک پر 10 لائیکس موصول Ûوئے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ٹاپک پر 10 لائیکس موصول Ûونے پر عطا کیا جاتا ÛÛ’Û” ارے، آپ Ù†Û’ ایک دلچسپ Ú¯ÙØªÚ¯Ùˆ شروع Ú©ÛŒ جس سے کمیونٹی لط٠اندوز Ûوئی! good_topic: name: Ø¹Ù…Ø¯Û Ù¹Ø§Ù¾Ú© description: ایک ٹاپک پر 25 لائیکس موصول Ûوئے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ٹاپک پر 25 لائیکس موصول Ûونے پر عطا کیا جاتا ÛÛ’Û” آپ Ù†Û’ ایک متحرک Ú¯ÙØªÚ¯Ùˆ شروع Ú©ÛŒ جس میں کمیونٹی Ù†Û’ بھرپور Ø­ØµÛ Ù„ÛŒØ§ اور جس سے Ø¨ÛØª پسند کیا گیا! great_topic: name: زبردست ٹاپک description: ایک ٹاپک پر 50 لائیکس موصول Ûوئے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ ٹاپک پر 50 لائیکس موصول Ûونے پر عطا کیا جاتا ÛÛ’Û” آپ Ù†Û’ ایک Ø§Ù†ØªÛØ§Ø¦ÛŒ دلچسپ Ú¯ÙØªÚ¯Ùˆ کا آغاز کیا اور کمیونٹی Ù†Û’ Ø§ÙØ³ Ú©Û’ نتیجے میں چلنے والی متحرک بحث کا لط٠اٹھایا! nice_share: name: اچھا شیئر description: 25 Ù…Ù†ÙØ±Ø¯ زائرین Ú©Û’ ساتھ ایک اشاعت شیئر Ú©ÛŒ @@ -3050,13 +2933,9 @@ ur: good_share: name: Ø¹Ù…Ø¯Û Ø´ÛŒØ¦Ø± description: 300 Ù…Ù†ÙØ±Ø¯ زائرین Ú©Û’ ساتھ ایک اشاعت شیئر Ú©ÛŒ - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ ایک ایسا Ù„ÙÙ†Ú© جس پر 300 بیرونی زائرین Ù†Û’ Ú©Ù„ÙÚ© کیا ÛÙˆ شیئر کرنے پر عطا کیا جاتا ÛÛ’Û” Ø¹Ù…Ø¯Û Ú©Ø§Ù…! آپ Ù†Û’ نئے لوگوں Ú©Û’ ایک گروپ Ú©Ùˆ ایک شاندار بحث دکھائی اور Ø§ÙØ³ کمیونٹی Ú©Ùˆ بڑھنے میں مدد دی ÛÛ’Û” great_share: name: زبردست شیئر description: 1000 Ù…Ù†ÙØ±Ø¯ زائرین Ú©Û’ ساتھ ایک اشاعت شیئر Ú©ÛŒ - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ ایک ایسا Ù„ÙÙ†Ú© جس پر 1000 بیرونی زائرین Ù†Û’ Ú©Ù„ÙÚ© کیا ÛÙˆ شیئر کرنے پر عطا کیا جاتا ÛÛ’Û” زبردست! آپ Ù†Û’ نیا ناظرین Ú©ÛŒ ایک Ø¨ÛØª بڑی تعداد میں ایک دلچسپ بحث Ú©Ùˆ ÙØ±ÙˆØº دیا ÛÛ’ØŒ اور Ûماری کمیونٹی Ú©Ùˆ بڑے پیمانے پر بڑھانے میں مدد دی ÛÛ’! first_like: name: Ù¾Ûلا لائیک description: ایک پوسٹ Ú©Ùˆ لائیک کیا @@ -3065,8 +2944,6 @@ ur: first_flag: name: Ù¾Ûلا Ùلَیگ description: ایک پوسٹ Ú©Ùˆ Ùلَیگ کیا - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Ùˆ Ù¾ÛÙ„ÛŒ Ù…Ø±ØªØ¨Û Ù¾ÙˆØ³Ù¹ Ùلَیگ کرنے پر عطا کیا جاتا ÛÛ’Û” Ùلَیگز Ú©Û’ Ø°Ø±ÛŒØ¹Û ÛÙ… مل کر ÛØ± ایک کیلئے Ø§ÙØ³ Ø¬Ú¯Û Ú©Ùˆ ØµØ§ÙØŒ اور اچھی طرح سے روشن Ø¬Ú¯Û Ø±Ú©Ú¾Ù†Û’ میں مدد دیتے Ûیں۔ اگر آپ کسی بھی ایسی پوسٹ Ú©Ùˆ نوٹس کرتے Ûیں جس پر کسی بھی ÙˆØ¬Û Ø³Û’ ماڈریٹر Ú©ÛŒ ØªÙˆØ¬Û Ú©ÛŒ ضرورت Ûوتی ÛÛ’ تو Ø¨Ø±Ø§Û Ú©Ø±Ù… Ùلَیگ کرنے سے Ù†Û Ûچکچائیں۔ اگر آپ ساتھی صارÙین Ú©ÛŒ پوسٹس Ú©Û’ ساتھ کوئی Ù…Ø³Ø¦Ù„Û Ø¯ÛŒÚ©Ú¾ØªÛ’ Ûیں تو آپ اÙÙ†Ûیں ایک ذاتی پیغام بھیجنے کیلئے بھی Ùلَیگ کرسکتے Ûیں۔ اگر آپ Ú©Ùˆ کوئی Ù…Ø³Ø¦Ù„Û Ù†Ø¸Ø± آتا ÛÛ’ØŒ تو Ø§ÙØ³Û’ :flag_black: Ùلَیگ کریں! promoter: name: پروموٹر description: ایک صار٠کو دعوت دی @@ -3075,13 +2952,9 @@ ur: campaigner: name: Ù…ÛÙ… چلانے والا description: 3 بَیسÙÚ© صارÙین Ú©Ùˆ مدعو کیا - long_description: | - جب آپ Ù†Û’ 3 ایسے لوگوں Ú©Ùˆ Ù…Ø¯Ø¹Û Ú©ÛŒØ§ ÛÙˆ جنÛÙˆÚº Ù†Û’ بعد میں بَیسÙÚ© صارÙین بننے کیلئے سائٹ پر کاÙÛŒ وقت گزارا Ûو، تو ÛŒÛ Ø¨ÙŽÛŒØ¬ عطا کیا جاتا ÛÛ’Û” ایک متحرک کمیونٹی Ú©Ùˆ باقاعدگی سے نئے آنے والوں کی، جو باقاعدگی سے شرکت اور Ú¯ÙØªÚ¯Ùˆ میں نئی آوازیں شامل کرتے Ûیں، Ú©ÛŒ ضرورت Ûوتی ÛÛ’Û” champion: name: چَیمپیئن description: 5 ممبران Ú©Ùˆ دعوت دی - long_description: | - جب آپ Ù†Û’ 5 ایسے لوگوں Ú©Ùˆ Ù…Ø¯Ø¹Û Ú©ÛŒØ§ ÛÙˆ جنÛÙˆÚº Ù†Û’ بعد میں مکمل ممبر بننے کیلئے سائٹ پر کاÙÛŒ وقت گزارا Ûو، تو ÛŒÛ Ø¨ÙŽÛŒØ¬ عطا کیا جاتا ÛÛ’Û” زبردست! نئے اراکین Ú©Û’ ساتھ Ûماری کمیونٹی Ú©ÛŒ جداگانیت Ú©Ùˆ بڑھانے کیلئے شکریÛ! first_share: name: Ù¾Ûلا شیئر description: ایک پوسٹ شیئر Ú©ÛŒ @@ -3095,13 +2968,9 @@ ur: first_quote: name: Ù¾Ûلا اقتباس description: ایک پوسٹ کا اقتباس کیا - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Ùˆ اپنے جواب میں Ù¾ÛÙ„ÛŒ Ø¯ÙØ¹Û کسی پوسٹ کا اقتباس کرنے پر عطا کیا جاتا ÛÛ’Û” اپنے جواب میں Ù¾Ú†Ú¾Ù„ÛŒ پوسٹس Ú©Û’ Ù…ØªØ¹Ù„Ù‚Û Ø­ØµÙˆÚº کا Ø­ÙˆØ§Ù„Û Ø¯ÛŒÙ†Û’ سے مباحثوں Ú©Ùˆ ایک دوسرے سے منسلک اور موضوع پر رÛÙ†Û’ میں مدد ملتی ÛÛ’Û” اقتباس کرنے کا سب سے آسان Ø·Ø±ÛŒÙ‚Û Ø§ÛŒÚ© پوسٹ Ú©Û’ سیکشن Ú©Ùˆ اجاگر کرنا، اور پھر کسی بھی جواب Ú©Û’ بٹن Ú©Ùˆ دبانا ÛÛ’Û” Ù„ کھول کر اقتباس کریں! read_guidelines: name: ÛØ¯Ø§ÛŒØ§Øª Ù¾Ú‘Ú¾Ùیں description: "کمیونٹی Ú©Û’ قواعد Ùˆ ضوابط پڑھیں" - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ کمیونٹی Ú©Û’ قواعد Ùˆ ضوابط Ù¾Ú‘Ú¾Ù†Û’ پر عطا کیا جاتا ÛÛ’Û” اÙÙ† Ø³Ø§Ø¯Û ÛØ¯Ø§ÛŒØ§Øª پر عمل اور اÙÙ†Ûیں شیئر کرنے سے ÛØ± ایک کیلئے ایک محÙوظ، Ù¾ÙØ± لط٠اور پائیدار کمیونٹی بنانے میں مدد ملتی ÛÛ’Û” ÛÙ…ÛŒØ´Û ÛŒØ§Ø¯ رکھیے Ú©Û Ø§ÙØ³ سکرین Ú©ÛŒ دوسری طر٠بھی ایک، آپ سے کاÙÛŒ ملتا جلتا، انسان ÛÛ’Û” Ù„ÛØ§Ø² رکھیے! reader: name: پڑهنے والا description: 100 سے زائد جوابات Ú©Û’ ساتھ ٹاپک میں ÛØ± جواب پڑھا @@ -3150,8 +3019,6 @@ ur: crazy_in_love: name: محبت میں Ø¯ÛŒÙˆØ§Ù†Û description: ایک دن میں 50 لائیکس 20 Ù…Ø±ØªØ¨Û Ø§Ø³ØªØ¹Ù…Ø§Ù„ کر لیے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ اپنے ÙÛŒ دن Ú©Û’ تمام 50 لائیکس 20 دنوں کیلئے استعمال کرلینے پر عطا کیا جاتا ÛÛ’Û” زبردست! آپ باقاعدگی سے آپنے ساتھی کمیونٹی ممبران Ú©ÛŒ Ø­ÙˆØµÙ„Û Ø§ÙØ²Ø§Ø¦ÛŒ کرنے Ú©ÛŒ ایک مثال Ûیں! thank_you: name: آپ کا Ø´Ú©Ø±ÛŒÛ description: 20 لائیک Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں اور 10 لائیکس دیے @@ -3165,8 +3032,6 @@ ur: empathetic: name: خیال رکھنے والا description: 500 لائیک Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûیں اور 1000 لائیکس دیے - long_description: | - ÛŒÛ Ø¨ÙŽÛŒØ¬ آپ Ú©Û’ پاس 500 لائیک Ú©Ø±Ø¯Û Ù¾ÙˆØ³Ù¹Ø³ Ûونے اور جواب میں 1000 یا Ø§ÙØ³ سے زائد لائیکس دینے پر عطا کیا جاتا ÛÛ’Û” زبردست! آپ سخاوت اور باÛÙ…ÛŒ تعری٠کی ایک مثال Ûیں :two_hearts:Û” first_emoji: name: Ù¾ÛÙ„ÛŒ اÙیمَوجی description: ایک پوسٹ میں اÙیمَوجی کا استعمال کیا @@ -3175,11 +3040,9 @@ ur: first_mention: name: Ù¾Ûلا ذکر description: پوسٹ میں ایک صار٠کا ذکر کیا - long_description: اس بَیج آپ Ú©Û’ اپنی پوسٹ میں Ù¾ÛÙ„ÛŒ Ù…Ø±ØªØ¨Û Ú©Ø³ÛŒ کا @صارÙنام ذکر کرنے پر عطا کیا جاتا ÛÛ’Û” ÛØ± ذکر Ø§ÙØ³ شخص کیلئے ایک اطلاع پیدا کرتا ÛÛ’ØŒ ØªØ§Ú©Û Ø§ÙÙ†Ûیں آپ Ú©ÛŒ پوسٹ Ú©Û’ بارے میں Ù¾ØªÛ Ú†Ù„ سکے۔ کسی بھی ØµØ§Ø±ÙØŒ یا اگر اجازت ÛÙˆ تو، گروپ کا ذکر کرنے کیلئے صر٠@ (at کا نشان) ٹائپ کرنا شروع کریں – ÛŒÛ Ø§ÙÙ† Ú©ÛŒ ØªÙˆØ¬Û Ù…ÛŒÚº Ú©Ú†Ú¾ لانے کا آسان Ø·Ø±ÛŒÙ‚Û ÛÛ’Û” first_onebox: name: Ù¾Ûلا ÙˆÙŽÙ† باکس description: ایک ÙˆÙŽÙ† باکس Ú©Ø±Ø¯Û Ù„ÙÙ†Ú© شائع کیا - long_description: ÛŒÛ Ø¨ÙŽÛŒØ¬ عطا کیا جاتا ÛÛ’ جب آپ Ù¾ÛÙ„ÛŒ Ù…Ø±ØªØ¨Û Ø§ÛŒÚ© Ù„ÙÙ†Ú© Ú©Ùˆ لائین میں اکیلا شائع کرتے Ûیں، جس Ú©Û’ بعد ÙˆÛ Ø®ÙˆØ¯ بخود ایک مختصر Ø®Ù„Ø§ØµÛØŒ ایک عنوان، اور (جب دستیاب ÛÙˆ) ایک تصویر Ú©Û’ ساتھ ایک ÙˆÙŽÙ† باکس میں Ú©Ú¾Ù„ جاتا ÛÛ’Û” first_reply_by_email: name: Ø¨Ø°Ø±ÛŒØ¹Û Ø§ÛŒ میل Ù¾Ûلا جواب description: ایک پوسٹ پر Ø¨Ø°Ø±ÛŒØ¹Û Ø§ÛŒ میل جواب دیا @@ -3193,15 +3056,12 @@ ur: enthusiast: name: پرجوش description: 10 دن ÙˆÙØ²ÙÙ¹ کیا - long_description: ÛŒÛ Ø¨ÙŽÛŒØ¬ مسلسل 10 دنوں تک ÙˆÙØ²ÙÙ¹ کرنے پر عطا کیا جاتا ÛÛ’Û” Ûمارے ساتھ ایک ÛÙØªÛ’ سے زائد رکنے کیلئے شکریÛ! aficionado: name: اَÙیشیاناڈو description: 100 دن ÙˆÙØ²ÙÙ¹ کیا - long_description: ÛŒÛ Ø¨ÙŽÛŒØ¬ مسلسل 100 دنوں تک ÙˆÙØ²ÙÙ¹ کرنے پر عطا کیا جاتا ÛÛ’Û” ÛŒÛ ØªÛŒÙ† Ù…Ø§Û Ø³Û’ زائد ÛÛ’! devotee: name: جاں نثار description: 365 دن ÙˆÙØ²ÙÙ¹ کیا - long_description: ÛŒÛ Ø¨ÙŽÛŒØ¬ مسلسل 365 دنوں تک ÙˆÙØ²ÙÙ¹ کرنے پر عطا کیا جاتا ÛÛ’Û” ÙˆØ§ÛØŒ ایک پورا سال! badge_title_metadata: "%{site_title}پر %{display_name} بَیج " admin_login: success: "ای میل بھیج دی گئ" @@ -3224,7 +3084,6 @@ ur: button: "رجسٹر" title: "رجسٹر ایڈمن اکاؤنٹ" help: "شروع کرنے Ú©Û’ لئے ایک نیا اکاؤنٹ رجسٹر کریں" - no_emails: "بدقسمتی سے، سَیٹ اَپ Ú©Û’ دوران کوئی ایڈمÙÙ†ÙØ³Ù¹Ø±ÛŒÙ¹Ø± ای میل واضح Ù†Ûیں Ú©ÛŒ گئیں، Ù„Ûٰذا ترتیب Ú©Ùˆ حتمی Ø´Ú©Ù„ دینا مشکل Ûوسکتا ÛÛ’Û”" confirm_email: title: "اپنے ای میل Ú©ÛŒ تصدیق کریں" message: "

ÛÙ… Ù†Û’
%{email}
پر ایک ایکٹیویشن میل بھیج دی ÛÛ’Û” Ø¨Ø±Ø§Û Ù…ÛØ±Ø¨Ø§Ù†ÛŒ اپنے اکاؤنٹ Ú©Ùˆ چالو کرنے کیلئے میل میں دی گئی ÛØ¯Ø§ÛŒØ§Øª پر عمل کریں۔

اگر ÛŒÛ Ø¢Ù¾ Ú©Ùˆ موصول Ù†Û Ûو، تو یقینی بنائیں Ú©Û Ø¢Ù¾ Ù†Û’ ÚˆÙØ³Ú©ÙˆØ±Ø³ کیلئے صحیح Ø·Ø±ÛŒÙ‚Û Ø³Û’ ای میل سَیٹ کر Ù„ÛŒ ÛÛ’ اور اپنا سپَیم Ùولڈر چیک کریں۔

" @@ -3327,10 +3186,8 @@ ur: fields: favicon_url: label: "چھوٹا آئیکن" - description: "آئیکن Ú©ÛŒ تصویر جو وَیب براؤزروں میں آپ Ú©ÛŒ ویب سائٹ Ú©ÛŒ نمائندگی کرنے کیلئے استعمال Ú©ÛŒ جاتی ÛÛ’ اور جو چھوٹے سائزوں جیسے Ú©Û 32px by 32px پر اچھی لگتی ÛÛ’Û”" apple_touch_icon_url: label: "بڑا آئیکن" - description: "آئیکن Ú©ÛŒ تصویر جو جدید ÚˆÙÛŒÙˆØ§Ø¦ÛŒØ³ÙØ² پر آپ Ú©ÛŒ سائٹ Ú©ÛŒ نمائندگی کرنے کیلئے استعمال Ú©ÛŒ جاتی ÛÛ’ اور جو بڑے سائزوں پر اچھی لگتی ÛÛ’Û” تجویز Ú©Ø±Ø¯Û Ø³Ø§Ø¦Ø² Ú©Ù… از Ú©Ù… 144px by 144px ÛÛ’Û”" homepage: description: "ÛÙ… آپ Ú©Û’ Ûَوم پَیج پر ØªØ§Ø²Û ØªØ±ÛŒÙ† ٹاپک پیش کرنے Ú©Ùˆ تجویز کرتے Ûیں، لیکن اگر آپ چاÛیں تو Ûَوم پَیج پر زÙÙ…Ø±Û Ø¬Ø§Øª (ٹاپکس Ú©Û’ گروپوں) Ú©Ùˆ بھی دکھا سکتے Ûیں۔" title: "Ûَوم پَیج" @@ -3339,8 +3196,6 @@ ur: choices: latest: label: "ØªØ§Ø²Û ØªØ±ÛŒÙ† ٹاپک" - categories: - label: "زÙÙ…Ø±ÙŽÛ Ø¬Ø§Øª" emoji: title: "اÙیمَوجی" description: "آپ اپنی کمیونٹی کیلئے کونسا اÙیمَوجی سڑائل پسند کریں Ú¯Û’ØŸ آپ ایڈمن، مرضی Ú©Û’ مطابق بنائیں، اÙیمَوجی Ú©Û’ Ø°Ø±ÛŒØ¹Û Ø¨Ø¹Ø¯ میں مزید اپنی مرضی Ú©Û’ اÙیمَوجی شامل کرسکتے Ûیں۔" diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index 12bb1ad386..20a35869a9 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -107,33 +107,33 @@ vi: reading_time: "Thá»i gian Ä‘á»c" likes: "Lượt Thích" too_many_replies: - other: Xin lá»—i bạn, ngưá»i dùng má»›i tạm thá»i bị giá»›i hạn vá»›i %{count} câu trả lá»i trong má»™t chá»§ Ä‘á». + other: "Xin lá»—i bạn, ngưá»i dùng má»›i tạm thá»i bị giá»›i hạn vá»›i %{count} câu trả lá»i trong má»™t chá»§ Ä‘á»." embed: start_discussion: "Bắt đầu cuá»™c thảo luận" continue: "Tiếp tục cuá»™c thảo luận" more_replies: - other: còn %{count} câu trả lá»i + other: "còn %{count} câu trả lá»i" loading: "Äang tải cuá»™c thảo luận" permalink: "Liên kết cố định" imported_from: "Äây là cuá»™c thảo luận Ä‘i kèm chá»§ đỠgốc tại %{link}" in_reply_to: "â–¶ %{username}" replies: - other: '%{count} câu trả lá»i' + other: "%{count} câu trả lá»i" no_mentions_allowed: "Xin lá»—i, bạn không thể nhắc tá»›i thành viên khác." too_many_mentions: - other: Xin lá»—i, bạn chỉ có thể nhắc tá»›i %{count} thành viên trong má»™t bài viết. + other: "Xin lá»—i, bạn chỉ có thể nhắc tá»›i %{count} thành viên trong má»™t bài viết." no_mentions_allowed_newuser: "Xin lá»—i, thành viên má»›i không thể nhắc tá»›i thành viên khác." too_many_mentions_newuser: - other: Xin lá»—i, thành viên má»›i chỉ có thể nhắc tá»›i %{count} thành viên khác trong má»™t bài viết. + other: "Xin lá»—i, thành viên má»›i chỉ có thể nhắc tá»›i %{count} thành viên khác trong má»™t bài viết." no_images_allowed: "Xin lá»—i, thành viên má»›i chưa được chèn hình ảnh vào bài viết." too_many_images: - other: Xin lá»—i, thành viên má»›i chỉ có thể chèn %{count} hình ảnh trong má»™t bài viết. + other: "Xin lá»—i, thành viên má»›i chỉ có thể chèn %{count} hình ảnh trong má»™t bài viết." no_attachments_allowed: "Xin lá»—i, thành viên má»›i chưa được chèn tập tin trong bài viết." too_many_attachments: - other: Xin lá»—i, thành viên má»›i chỉ được chèn %{count} file đính kèm trong má»™t bài viết. + other: "Xin lá»—i, thành viên má»›i chỉ được chèn %{count} file đính kèm trong má»™t bài viết." no_links_allowed: "Xin lá»—i, thành viên má»›i chưa được chèn liên kết trong bài viết." too_many_links: - other: Xin lá»—i, thành viên má»›i chỉ được chèn %{count} liên kết trong má»™t bài viết. + other: "Xin lá»—i, thành viên má»›i chỉ được chèn %{count} liên kết trong má»™t bài viết." spamming_host: "Xin lá»—i bạn không thể chèn liên kết tá»›i trang đó." user_is_suspended: "Ngưá»i dùng Ä‘ang bị treo không được phép đăng bài." topic_not_found: "Có gì đó đã sai. Có lẽ chá»§ đỠnày đã bị đóng hoặc bị xóa trong khi bạn Ä‘ang xem?" @@ -185,7 +185,7 @@ vi: trust_level_4: "trust_level_4" education: until_posts: - other: '%{count} bài đăng' + other: "%{count} bài đăng" 'new-topic': | Chào mừng bạn đến vá»›i %{site_name} — **cảm Æ¡n vì đã đăng cuá»™c thảo luận má»›i!** @@ -246,27 +246,6 @@ vi: staff_category_description: "Chuyên mục riêng dành cho nhân viên. Các chá»§ đỠchỉ hiển thị vá»›i quản trị viên và Ä‘iá»u hành viên." lounge_welcome: title: "Chào mừng bạn đến vá»›i Phòng khách" - body: |2 - - Chúc mừng! :confetti_ball: - - Nếu bạn có thể xem chá»§ đỠnày, bạn đã được thăng lên bậc **thưá»ng xuyên** (bậc tin tưởng 3). - - Bạn có thể … - - * Sá»­a tiêu đỠcá»§a bất kì chá»§ đỠnào - * Sá»­a chuyên mục cá»§a bất kì chá»§ đỠnào - * Tất cả liên kết ở trạng thái follow ([những liên kết nofollow](http://en.wikipedia.org/wiki/Nofollow) sẽ được loại bá») - * Truy cập vào phòng khách dành riêng cho thành viên vá»›i bậc tin tưởng 3 hoặc cao hÆ¡n - * Ẩn bài viết spam vá»›i 1 lần đánh dấu. - - Äây là danh sách [cá»§a các thành viên thưá»ng xuyên](/badges/3/regular). Hãy chào há» Ä‘i nào. - - Cảm Æ¡n vì đã trở thành má»™t phần không thể thiếu đối vá»›i cá»™ng đồng. - - (Äể biết thêm chi tiết vá» bậc tin tưởng, [xem chá»§ đỠnày][trust]. Hãy nhá»› rằng bạn phải tiếp tục đạt được các yêu cầu để duy trì bậc tin tưởng cá»§a mình.) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Giá»›i thiệu chuyên mục %{category}" replace_paragraph: "(Thay thế Ä‘oạn này vá»›i miêu tả vá» category má»›i. Bản hướng dẫn này sẽ được xuất hiện trong vùng chá»n cá»§a category, vì thế nó chỉ giá»›i hạn trong 200 kí tá»±. **Cho đến khi bạn chỉnh sá»­a phần miêu tả này hoặc tạo topic cho nó, category này sẽ không xuất hiện trên trang web.**)" @@ -281,8 +260,6 @@ vi: cannot_delete: uncategorized: "Không thể xoá mục Chưa phân loại" has_subcategories: "Không thể xoá chuyên mục này được vì nó có chuyên mục con." - topic_exists: - other: Không thể xoá phân loại này được bởi vì nó có %{count} chá»§ Ä‘á». Các chá»§ đỠcÅ© là %{topic_link}. topic_exists_no_oldest: "Không thể xoá chuyên mục này vì nó có %{count} chá»§ để." uncategorized_description: "Chá»§ đỠkhông cần chuyên mục, hoặc không phù hợp vá»›i bất kỳ chuyên mục nào hiện có." trust_levels: @@ -299,60 +276,60 @@ vi: change_failed_explanation: "Bạn đã cố gắng để giảm hạng %{user_name} xuống '%{new_trust_level}'. Tuy nhiên cấp độ tin cậy hiện tại cá»§a hỠđã là '%{current_trust_level}'. %{user_name} sẽ được giữ lại ở cấp độ '%{current_trust_level}' - nếu bạn muốn giảm hạng thành viên, trước tiên hãy khóa cấp độ tin cậy" rate_limiter: hours: - other: '%{count} giá»' + other: "%{count} giá»" minutes: - other: '%{count} phút' + other: "%{count} phút" seconds: - other: '%{count} giây' + other: "%{count} giây" datetime: distance_in_words: half_a_minute: "< 1 phút" less_than_x_seconds: - other: < %{count} giây + other: "< %{count} giây" x_seconds: - other: '%{count} giây' + other: "%{count} giây" less_than_x_minutes: - other: < %{count} phút + other: "< %{count} phút" x_minutes: - other: '%{count} phút' + other: "%{count} phút" about_x_hours: - other: '%{count} giá»' + other: "%{count} giá»" x_days: - other: '%{count} ngày' + other: "%{count} ngày" about_x_months: - other: '%{count} tháng' + other: "%{count} tháng" x_months: - other: '%{count} tháng' + other: "%{count} tháng" about_x_years: - other: '%{count} năm' + other: "%{count} năm" over_x_years: - other: '> %{count} năm' + other: "> %{count} năm" almost_x_years: - other: '%{count} năm' + other: "%{count} năm" distance_in_words_verbose: half_a_minute: "ngay bây giá»" less_than_x_seconds: - other: ngay bây giá» + other: "ngay bây giá»" x_seconds: - other: '%{count} giây trước' + other: "%{count} giây trước" less_than_x_minutes: - other: ít hÆ¡n %{count} phút trước + other: "ít hÆ¡n %{count} phút trước" x_minutes: - other: '%{count} phút trước' + other: "%{count} phút trước" about_x_hours: - other: '%{count} giá» trước' + other: "%{count} giá» trước" x_days: - other: '%{count} ngày trước' + other: "%{count} ngày trước" about_x_months: - other: khoảng %{count} tháng trước + other: "khoảng %{count} tháng trước" x_months: - other: ' %{count} tháng trước' + other: " %{count} tháng trước" about_x_years: - other: khoảng %{count} năm trước + other: "khoảng %{count} năm trước" over_x_years: - other: hÆ¡n %{count} năm trước + other: "hÆ¡n %{count} năm trước" almost_x_years: - other: gần %{count} năm trước + other: "gần %{count} năm trước" password_reset: no_token: "Xin lá»—i, liên kết đổi mật khẩu đã cÅ©. Chá»n \"Äăng nhập\" và sá»­ dụng chức năng \"Quên mật khẩu\" để lấy liên kết má»›i." update: 'Cập nhật mật khẩu' @@ -409,10 +386,6 @@ vi: title: 'Thích' description: 'Thích bài viết này' long_form: 'đã thích cái này' - vote: - title: 'Bầu chá»n' - description: 'Bầu cho bài viết này' - long_form: 'bầu cho bài viết này' topic_flag_types: spam: title: 'Rác' @@ -518,8 +491,6 @@ vi: num_users: "Ngưá»i dùng" top_referred_topics: title: "Top chá»§ đỠgiá»›i thiệu" - xaxis: "Chá»§ Ä‘á»" - num_clicks: "Clicks" page_view_anon_reqs: title: "Ẩn danh" xaxis: "Ngày" @@ -569,7 +540,6 @@ vi: xaxis: "Ngày" yaxis: "Tổng số" mobile_visits: - title: "Các thành viên truy cập" xaxis: "Ngày" yaxis: "Số lần truy cập" dashboard: @@ -587,7 +557,7 @@ vi: failing_emails_warning: 'Có %{num_failed_jobs} email jobs thấ bại. Kiểm tra app.yml và chắc chắn rằng cấu hình máy chá»§ email đúng. Xem jobs thất bại ở Sidekiq.' subfolder_ends_in_slash: "Thư mục con cá»§a bạn được thiết lập không đúng, DISCOURSE_RELATIVE_URL_ROOT phải được kết thúc bằng dấu gạch chéo." email_polling_errored_recently: - other: Email đã tạo %{count} lá»—i trong 24 giá» qua, xem nhật ký để biết thêm chi tiết. + other: "Email đã tạo %{count} lá»—i trong 24 giá» qua, xem nhật ký để biết thêm chi tiết." bad_favicon_url: "Favicon không tải được, bạn hãy kiểm tra lại favicon_url trong Thiết Lập Website." poll_pop3_timeout: "Không thể kết nối vá»›i POP3 server, sẽ không nhận được email gá»­i đến. Bạn hãy kiểm tra thiết lập POP3 và nhà cung cấp dịch vụ." poll_pop3_auth_error: "Không thể kết nối vá»›i POP3 server do lá»—i chứng thá»±c. Bạn hãy kiểm tra thiết lập POP3." @@ -662,7 +632,6 @@ vi: post_menu: "Xác định các mục nào hiển thị trên menu bài viết, và theo thứ tá»± nào. Ví dụ like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Các mục được để ẩn theo mặc định trong menu bài viết trừ khi click vào dấu '...' để mở rá»™ng." share_links: "Xác định các mục nào hiển thị trên há»™p thoại chia sẻ, và theo thứ tá»± nào." - track_external_right_clicks: "Theo dõi các liên kết ngoài được click đúng (vd: mở trong tab má»›i) bị vô hiệu hóa theo mặc định do Rewrite URL." site_contact_username: "Tên tài khoản quản trị viên hợp lệ để gá»­i tất cả các thông báo tá»± động. Nếu để trống, tài khoản mặc định cá»§a hệ thống sẽ được sá»­ dụng." send_welcome_message: "Gá»­i tất cả các thành viên má»›i má»™t thông Ä‘iệp chào mừng kèm theo hướng dẫn nhanh." suppress_reply_directly_below: "Không hiện bá»™ đếm trả lá»i mở rá»™ng cho bài viết chỉ có duy nhất má»™t trả lá»i trá»±c tiếp bên dưới bài viết này." @@ -837,7 +806,6 @@ vi: min_first_post_typing_time: "Số lượng thá»i gian tối thiểu theo phần ngàn giây mà thành viên phải nhập trong bài viết đầu tiên, nếu ngưỡng không được đáp ứng sẽ tá»± động nhập vào hàng chá» duyệt. Äặt là 0 để tắt (không khuyến nghị)" reply_by_email_enabled: "Cho phép trả lá»i chá»§ đỠqua email." reply_by_email_address: "Mẫu để trả lá»i cho các địa chỉ email đến, ví dụ: %{reply_key}@reply.example.com hoặc replies+%{reply_key}@example.com" - disable_emails: "Ngăn chặn Discourse gá»­i thêm bất kỳ email nào" strip_images_from_short_emails: "Tất cả các ảnh từ email phải có kích cỡ nhá» hÆ¡n 2800 Bytes" short_email_length: "Äá»™ dài email ngắn theo Bytes" display_name_on_email_from: "Hiển thị tên đầy đủ trên email từ trưá»ng" @@ -965,29 +933,26 @@ vi: not_seen_in_a_month: "Chào mừng quay trở lại! Chúng tôi thấy bạn truy cập má»™t khoảng thá»i gian. Ở đây có những bài viết phổ biến từ lúc bạn Ä‘." move_posts: new_topic_moderator_post: - other: '%{count} bài viết đã được chia thành chá»§ đỠmá»›i: %{topic_link}' + other: "%{count} bài viết đã được chia thành chá»§ đỠmá»›i: %{topic_link}" existing_topic_moderator_post: - other: '%{count} bài viết đã được hợp nhất vào chá»§ Ä‘á»: %{topic_link}' - change_owner: - post_revision_text: "Chuyển quyá»n sở hữu từ %{old_user} sang %{new_user}" - deleted_user: "xóa ngưá»i dùng" + other: "%{count} bài viết đã được hợp nhất vào chá»§ Ä‘á»: %{topic_link}" topic_statuses: archived_enabled: "Chá»§ đỠnày được đưa vào lưu trữ. Nó sẽ không được sá»­a đổi nữa. " archived_disabled: "Chá»§ đỠnày được đưa khá»i lưu trữ. Nó có thể được sá»­a đổi." closed_enabled: "Chá»§ đỠnày được đóng lại. Các trả lá»i má»›i sẽ không được chấp nhận." closed_disabled: "Chá»§ đỠnày được mở ra. Các trả lá»i má»›i sẽ được chấp nhận." autoclosed_enabled_days: - other: Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} ngày, sẽ không được gá»­i trả lá»i. + other: "Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} ngày, sẽ không được gá»­i trả lá»i." autoclosed_enabled_hours: - other: Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} giá», sẽ không được gá»­i trả lá»i. + other: "Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} giá», sẽ không được gá»­i trả lá»i." autoclosed_enabled_minutes: - other: Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} phút, sẽ không được gá»­i trả lá»i. + other: "Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} phút, sẽ không được gá»­i trả lá»i." autoclosed_enabled_lastpost_days: - other: Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} ngày sau lần trả lá»i cuối, sẽ không được gá»­i trả lá»i. + other: "Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} ngày sau lần trả lá»i cuối, sẽ không được gá»­i trả lá»i." autoclosed_enabled_lastpost_hours: - other: Chá»§ đỠnày đã được đóng tá»± động %{count} giá» sau phản hồi cuối cùng. Không còn cho phép phản hồi má»›i. + other: "Chá»§ đỠnày đã được đóng tá»± động %{count} giá» sau phản hồi cuối cùng. Không còn cho phép phản hồi má»›i." autoclosed_enabled_lastpost_minutes: - other: Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} phút sau lần trả lá»i cuối, sẽ không được gá»­i trả lá»i. + other: "Chá»§ đỠnày sẽ được tá»± động đóng sau %{count} phút sau lần trả lá»i cuối, sẽ không được gá»­i trả lá»i." autoclosed_disabled: "Chá»§ đỠnày đã được mở. Bạn có thể bình luận" autoclosed_disabled_lastpost: "Chá»§ đỠnày đã được mở. Bạn có thể bình luận" pinned_enabled: "Chá»§ đỠnày Ä‘ang được ghim, nó sẽ hiển thị ở trên cùng chuyên mục cho đến khi được BQT bá» ghim, hoặc bởi chính thành viên cá nhân." @@ -1018,7 +983,6 @@ vi: missing_user_field: "Bạn không hoàn tất tất cả các trưá»ng ngưá»i dùng" already_logged_in: "Rất tiếc, có vẻ như bạn Ä‘ang cố gắng để chấp nhận lá»i má»i cá»§a má»™t ngưá»i dùng khác. Nếu bạn không phải là %{current_user}, xin vui lòng đăng xuất và thá»­ lại." user: - no_accounts_associated: "Không có tài khoản liên quan" username: short: "phải dài ít nhất %{min} ký tá»±" long: "không được dài hÆ¡n %{max} ký tá»±" @@ -1036,7 +1000,7 @@ vi: max_new_accounts_per_registration_ip: "Äăng ký tài khoản má»›i không được chấp nhận từ địa chỉ IP cá»§a bạn (đã đạt giá»›i hạn tối), xin hãy liên hệ vá»›i BQT." flags_reminder: subject_template: - other: '%{count} đánh dấu Ä‘ang đợi xá»­ lý' + other: "%{count} đánh dấu Ä‘ang đợi xá»­ lý" unsubscribe_mailer: subject_template: "Xác nhận bạn không còn muốn nhận email cập nhật từ %{site_title}" invite_password_instructions: @@ -1117,7 +1081,7 @@ vi: Nếu có má»™t giao diện web cho các tài khoản email POP, bạn có thể cần phải đăng nhập vào website và kiểm tra các thiết lập này. pending_users_reminder: subject_template: - other: '%{count} thành viên Ä‘ang chá» duyệt' + other: "%{count} thành viên Ä‘ang chá» duyệt" text_body_template: | Có tài khoản má»›i đăng ký Ä‘ang chá» duyệt (hoặc từ chối) trước khi há» có thể truy cập diá»…n đàn. @@ -1161,7 +1125,6 @@ vi: recent_topics: "Gân đây" see_more: "Thêm" search_title: "Tìm trang này" - search_google: "Goole" terms_of_service: title: "Äiá»u khoản Dịch vụ" signup_form_message: 'Tôi đã Ä‘á»c và đồng ý vá»›i Äiá»u khoản dịch vụ.' @@ -1179,21 +1142,6 @@ vi: size_not_found: "Xin lá»—i, không thể xác định kích thước hình. Có thể hình cá»§a bạn bị lá»—i?" avatar: missing: "Xin lá»—i, chúng tôi không thể tìm thấy avatar liên kết vá»›i email đó. Bạn có thể thá»­ upload lại má»™t lần nữa?" - email_log: - no_user: "không tìm thấy ngưá»i dùng vá»›i id %{user_id}" - anonymous_user: "Ngưá»i dùng là nặc danh" - suspended_not_pm: "Tài khoản bị tạm khóa, không có tin nhắn" - seen_recently: "Tài khoản đã xem gần đây" - post_not_found: "Không tìm thấy bài viết vá»›i id %{post_id}" - notification_already_read: "Thông báo email này đã được Ä‘á»c" - topic_nil: "post.topic is nil" - post_deleted: "bài viết đã bị xóa bởi tác giả" - user_suspended: "ngưá»i dùng đã bị tạm khóa" - already_read: "ngưá»i dùng đã Ä‘á»c bài viết này" - message_blank: "tin nhắn rá»—ng" - message_to_blank: "message.to rá»—ng" - text_part_body_blank: "text_part.body rá»—ng" - body_blank: "ná»™i dung rá»—ng" color_schemes: base_theme_name: "CÆ¡ bản" about: "Giá»›i thiệu" @@ -1215,70 +1163,40 @@ vi: editor: name: Biên tập description: Sá»­a lần đầu - long_description: | - Huy hiệu này được trao lần đầu tiên khi bạn chỉnh sá»­a má»™t trong những bài viết cá»§a mình. Chỉnh sá»­a luôn luôn là má»™t ý tưởng tốt — bạn có thể cải thiện bài viết cá»§a mình, sá»­a chữa những lá»—i nhá», hoặc thêm bất cứ Ä‘iá»u gì còn thiếu. Chỉnh sá»­a có thể làm cho bài viết cá»§a bạn thậm chí còn tốt hÆ¡n! basic_user: name: CÆ¡ bản - description: "Các cấp chức năng cần thiết cá»§a cá»™ng đồng" - long_description: | - Huy hiệu này được cấp khi bạn đạt cấp độ tin cậy 1. Cám Æ¡n bạn đã nán lại má»™t chút Ä‘á»c má»™t vài chá»§ đỠđể tìm hiểu vá» cá»™ng đồng cá»§a chúng tôi. Hạn chế đối vá»›i thành viên má»›i cá»§a bạn đã được dỡ bá»; bạn đã được cấp tất cả các khả năng cần thiết cá»§a cá»™ng đồng, chẳng hạn như tin nhắn cá nhân, gắn cá», chỉnh sá»­a wiki, và khả năng gá»­i nhiá»u ảnh và liên kết. member: name: Thành viên - description: "Các cấp lá»i má»i, nhắn tin nhóm, và thêm lượt like" - long_description: | - Huy hiệu này được cấp khi bạn đạt cấp độ tin cậy 2. Cám Æ¡n bạn đã tham gia trong má»™t thá»i gian vài tuần để thá»±c sá»± gia nhập cá»™ng đồng cá»§a chúng tôi. Bây giá» bạn có thể gá»­i lá»i má»i từ trang tài khoản hay tạo chá»§ đỠcá nhân, tạo nhóm tin nhắn cá nhân, và có thể thêm má»™t vài lượt like má»—i ngày. regular: name: Thưá»ng xuyên - description: "Cấp độ phân hạng, đổi tên, theo Ä‘uôi liên kết, wiki, và thêm lượt like" - long_description: | - Huy hiệu này được cấp khi bạn đạt cấp độ tin cậy 3. Cám Æ¡n bạn đã tham gia cá»™ng đồng cá»§a chúng tôi trong thá»i gian vài tháng. Bây giá» bạn đã là má»™t trong những độc giả tích cá»±c nhất, và là má»™t đóng góp tin cậy giúp cho cá»™ng đồng cá»§a chúng tôi tuyệt vá»i hÆ¡n. Bây giá» bạn có thể phân loại và đổi tên chá»§ Ä‘á», tận dụng lợi thế để gắn cá» spam mạnh mẽ hÆ¡n, truy cập vào má»™t khu vá»±c phòng riêng, và bạn cÅ©ng có thể nhận được nhiá»u lượt like hÆ¡n má»—i ngày. leader: name: Lãnh đạo - description: "Cấp độ sá»­a toàn trang, ghim, đóng, lưu trữ, tách và hợp nhất, và thêm lượt like" - long_description: | - Huy hiệu này được cấp khi bạn đạt cấp độ tin cậy 4. Bạn là má»™t nhà lãnh đạo trong cá»™ng đồng theo sá»± lá»±a chá»n cá»§a BQT, bạn là má»™t ví dụ vá» sá»± tích cá»±c cho phần còn lại cá»§a cá»™ng đồng trong hành động và lá»i nói. Bạn có khả năng chỉnh sá»­a tất cả các bài viết, thá»±c hiện hành động quản trị như ghim, đóng, lưu trữ, tách và hợp nhất, và bạn có thể có hàng ngàn lượt like má»—i ngày. welcome: name: Chào mừng description: Äã nhận 1 like - long_description: | - Huy hiệu này được cấp khi bạn nhận được like đầu tiên. Xin chúc mừng, bạn đã đăng ná»™i dung mà các thành viên cá»§a cá»™ng đồng cảm thấy thú vị, hấp dẫn, hoặc có ích! autobiographer: name: Tá»± truyện anniversary: name: Ngày ká»· niệm description: "Thành viên hoạt động trong má»™t năm, gá»­i bài ít nhất má»™t lần" - long_description: | - Huy hiệu này được cấp khi bạn đã là thành viên cá»§a cá»™ng đồng trong má»™t năm và gá»­i ít nhất má»™t bài trong năm đó. Cám Æ¡n bạn đã nán lại và đóng góp cho cá»™ng đồng cá»§a chúng tôi. Chúng tôi không thể làm Ä‘iá»u đó mà không có bạn. nice_post: name: Trả Lá»i Hay description: Nhận được 10 like cho má»™t trả lá»i - long_description: | - Huy hiệu này được cấp khi trả lá»i cá»§a bạn nhận được 10 like. Trả lá»i cá»§a bạn thá»±c sá»± đã gây ấn tượng đối vá»›i cá»™ng đồng và giúp đưa các cuá»™c há»™i thoại tiến lên trước! good_post: name: Trả Lá»i Tốt description: Nhận được 25 like cho má»™t trả lá»i - long_description: | - Huy hiệu này được cấp khi trả lá»i cá»§a bạn nhận được 25 like. Trả lá»i cá»§a bạn rất đặc biệt và làm cho các cuá»™c há»™i thoại tốt hÆ¡n nhiá»u cho tất cả má»i ngưá»i! great_post: name: Trả Lá»i Tuyệt Vá»i description: Nhận được 50 like cho má»™t trả lá»i - long_description: | - Huy hiệu này được cấp khi trả lá»i cá»§a bạn nhận được 50 like. Tuyệt vá»i! Trả lá»i cá»§a bạn là cảm hứng, hấp dẫn, vui nhá»™n, hoặc sâu sắc và cá»™ng đồng yêu thích nó. nice_topic: name: Chá»§ Äá» Hay description: Nhận được 10 like cho má»™t chá»§ đỠ- long_description: | - Huy hiệu này được cấp khi chá»§ đỠcá»§a bạn nhận được 10 like. Bạn đã bắt đầu má»™t cuá»™c trò chuyện thú vị mà cá»™ng đồng rất thích! good_topic: name: Chá»§ Äá» Tốt description: Nhận được 25 like cho má»™t chá»§ đỠ- long_description: | - Huy hiệu này được cấp khi chá»§ đỠcá»§a bạn nhận được 25 like. Bạn đã phát động má»™t cuá»™c trò chuyện sôi nổi và cá»™ng đồng yêu thích nó! great_topic: name: Chá»§ Äá» Tuyệt Vá»i description: Nhận được 50 like cho má»™t chá»§ đỠ- long_description: | - Huy hiệu này được cấp khi chá»§ đỠcá»§a bạn nhận được 50 like. Bạn đã phát động má»™t cuá»™c trò chuyện thú vị và được cá»™ng đồng hưởng ứng thảo luận sôi nổi! nice_share: name: Chia Sẻ Hay description: Chia sẻ má»™t bài viết có 25 lượt truy cập @@ -1287,13 +1205,9 @@ vi: good_share: name: Chia Sẻ Tốt description: Chia sẻ má»™t bài viết có 300 lượt truy cập - long_description: | - Huy hiệu này được cấp khi liên kết chia sẻ cá»§a bạn nhận được 300 lượt truy cập. Làm tốt lắm! Bạn đã thu hút những ngưá»i má»›i tham gia thảo luận và giúp cá»™ng đồng phát triển. great_share: name: Chia Sẻ Tuyệt Vá»i description: Chia sẻ má»™t bài viết có 1000 lượt truy cập - long_description: | - Huy hiệu này được cấp khi liên kết chia sẻ cá»§a bạn nhận được 1000 lượt truy cập. Tuyệt vá»i! Bạn đã thúc đẩy má»™t cuá»™c thảo luận thú vị cho má»™t lượng lá»›n độc giả, và giúp chúng tôi phát triển cá»™ng đồng theo số lá»›n! first_like: name: Like Äầu Tiên description: Äã like má»™t bài viết @@ -1302,8 +1216,6 @@ vi: first_flag: name: Gắn Cá» Äầu Tiên description: Äã gắn cá» má»™t bài viết - long_description: | - Huy hiệu này được cấp cho lần đầu tiên bạn gắn cá» má»™t bài viết. Gắn cá» là cách chúng ta làm để giúp nÆ¡i này sạch sẽ cho tất cả má»i ngưá»i. Nếu bạn nhận thấy bất kỳ má»™t bài viết nào cần BQT chú ý xem xét, đừng ngần ngại gắn cá». Bạn cÅ©ng có thể gắn cỠđể gá»­i tin nhắn riêng cho thành viên khác, nếu bạn thấy có vấn đỠvá»›i bài cá»§a há». Nếu bạn thấy má»™t nguy cÆ¡ thá»±c sá»±, hãy gắn cá» Ä‘en :flag_black: vào đó! promoter: name: Ngưá»i Khởi Xướng description: Äã má»i 1 ngưá»i dùng @@ -1313,8 +1225,6 @@ vi: champion: name: Quán Quân description: Äã má»i 5 thành viên - long_description: | - Huy hiệu này được cấp khi bạn đã má»i 5 ngưá»i và sau đó những ngưá»i này đã trở thành thành viên chính thức. Tuyệt vá»i! Cám Æ¡n bạn đã mở rá»™ng sá»± Ä‘a dạng cá»§a cá»™ng đồng đến vá»›i các thành viên má»›i! first_share: name: Chia Sẻ Äầu Tiên description: Chia sẻ 1 bài viết @@ -1376,8 +1286,6 @@ vi: crazy_in_love: name: Thích nhiệt tình description: Sá»­ dụng 50 like má»™t ngày trong 20 ngày - long_description: | - Huy hiệu này được cấp khi bạn sá»­ dụng 50 lượt like má»™t ngày trong 20 ngày liên tiếp. Tuyệt vá»i! Bạn là má»™t tấm gương thưá»ng xuyên khuyến khích các thành viên trong cá»™ng đồng! thank_you: name: Cám Æ¡n bạn description: Nhận được 20 like và đã like 10 lần diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 54dd7c3769..f3778fbbaf 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -104,7 +104,7 @@ zh_CN: template: body: '有下列问题:' header: - other: 有 %{count} 个错误使得%{model}无法被ä¿å­˜ + other: '有 %{count} 个错误使得%{model}无法被ä¿å­˜' embed: load_from_remote: "è½½å…¥å¸–å­æ—¶å‡ºé”™äº†ã€‚" site_settings: @@ -138,7 +138,7 @@ zh_CN: reading_time: "阅读时间" likes: "赞" too_many_replies: - other: 我们éžå¸¸æŠ±æ­‰ï¼Œä½†æ˜¯æ–°ç”¨æˆ·æœ‰å‘帖é™åˆ¶ã€‚在åŒä¸€ä¸»é¢˜åªèƒ½å›žå¤ %{count} 次。 + other: "我们éžå¸¸æŠ±æ­‰ï¼Œä½†æ˜¯æ–°ç”¨æˆ·æœ‰å‘帖é™åˆ¶ã€‚在åŒä¸€ä¸»é¢˜åªèƒ½å›žå¤ %{count} 次。" embed: start_discussion: "开始讨论" continue: "继续讨论" @@ -148,29 +148,29 @@ zh_CN: no_hosts: "嵌入没有设置任何主机地å€ã€‚" configure: "é…置嵌入" more_replies: - other: '%{count} 个更多回å¤' + other: "%{count} 个更多回å¤" loading: "正在载入讨论中..." permalink: "永久链接" imported_from: "这是一个已从原 %{link} 中分离的主题" in_reply_to: "â–¶ %{username}" replies: - other: '%{count} 个回å¤' + other: "%{count} 个回å¤" no_mentions_allowed: "抱歉,你无法æåˆ°å…¶ä»–用户。" too_many_mentions: - other: 抱歉,你一次仅能æåˆ° %{count} 个用户。 + other: "抱歉,你一次仅能æåˆ° %{count} 个用户。" no_mentions_allowed_newuser: "抱歉,访客无法@用户。" too_many_mentions_newuser: - other: 抱歉,访客一次仅能@ %{count} 个用户。 + other: "抱歉,访客一次仅能@ %{count} 个用户。" no_images_allowed_trust: "抱歉,你无法在这个帖å­é‡Œè´´å›¾" no_images_allowed: "抱歉,访客无法贴图。" too_many_images: - other: 抱歉,访客一次仅能贴 %{count} 张图。 + other: "抱歉,访客一次仅能贴 %{count} 张图。" no_attachments_allowed: "抱歉,新用户无法上传附件。" too_many_attachments: - other: 抱歉,新用户一次仅能上传 %{count} 个附件。 + other: "抱歉,新用户一次仅能上传 %{count} 个附件。" no_links_allowed: "抱歉,访客无法贴链接。" too_many_links: - other: 抱歉,访客一次仅能贴 %{count} æ¡é“¾æŽ¥ã€‚ + other: "抱歉,访客一次仅能贴 %{count} æ¡é“¾æŽ¥ã€‚" spamming_host: "抱歉,你ä¸èƒ½æ·»åŠ ä¸€ä¸ªé“¾æŽ¥åˆ°é‚£ä¸ªåœ°å€çš„链接。" user_is_suspended: "被å°ç¦çš„用户ä¸å…许å‘贴。" topic_not_found: "出现问题。或许这个主题在你看的时候已ç»è¢«å…³é—­æˆ–删除了。" @@ -236,7 +236,7 @@ zh_CN: title: "%{group_name}çš„æˆå‘˜è¯·æ±‚" education: until_posts: - other: '%{count} 个帖å­' + other: "%{count} 个帖å­" 'new-topic': | 欢迎æ¥åˆ°%{site_name} — **衷心感谢你å‚与讨论ï¼** @@ -382,27 +382,6 @@ zh_CN: ä½ å¯èƒ½æƒ³è¦åœ¨ç®¡ç† :wrench: (å³ä¸Šè§’)中关闭这个主题,这样回å¤å°±ä¸ä¼šç§¯åŽ‹åœ¨è¿™ä¸ªé€šå‘Šä¸‹ã€‚ lounge_welcome: title: "欢迎æ¥åˆ°è´µå®¾å®¤" - body: |2 - - æ­å–œï¼ :confetti_ball: - - 如果你看到了这个主题,说明你已ç»è¢«æå‡è‡³**常规**(信任等级3)了。 - - 你现在å¯ä»¥… - - * 编辑任何主题的标题 - * 改å˜ä»»ä½•主题的分类 - * 让你的链接设置为 follow 属性([自动 nofollow](http://en.wikipedia.org/wiki/Nofollow)é™åˆ¶å·²ç»ç§»é™¤ï¼‰ - * è®¿é—®ä¸€ä¸ªåªæœ‰ä¿¡ä»»ç­‰çº§3åŠæ›´é«˜æ‰èƒ½è§åˆ°çš„贵宾室分类 - * 一次标记å³å¯éšè—åžƒåœ¾ä¿¡æ¯ - - 这里是[ç›®å‰è¾¾åˆ°å¸¸è§„的用户列表](/badges/3/regular)ã€‚ä¸€å®šè¦æ¥é—®ä¸ªå¥½ï¼ - - 感谢æˆä¸ºç¤¾åŒºçš„é‡è¦ä¸€å‘˜ï¼ - - (想了解关于信任等级的更多信æ¯ï¼Œ[å‚è§è¿™ä¸ªä¸»é¢˜][trust]ã€‚è¯·æ³¨æ„æˆå‘˜éœ€è¦åœ¨å°†æ¥ä¹Ÿç»´æŒä¸€å®šçš„选择æ¡ä»¶çš„æˆå‘˜æ‰èƒ½ä¿æŒåœ¨å¸¸è§„。) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "关于“%{category}â€åˆ†ç±»" replace_paragraph: "(将第一段è¯ä¿®æ”¹æˆä½ çš„æ–°åˆ†ç±»çš„简述。这段文字将出现在用户选择分类的地方,所以å°è¯•ä¿æŒåœ¨ 200 个字符内。 **除éžä½ ç¼–辑了这段文字或者在这分类中创建了主题,这个分类ä¸ä¼šå‡ºçŽ°åœ¨åˆ†ç±»é¡µé¢ä¸­ã€‚**)" @@ -418,8 +397,6 @@ zh_CN: cannot_delete: uncategorized: "ä¸èƒ½åˆ é™¤æœªåˆ†ç±»ã€‚" has_subcategories: "ä¸èƒ½åˆ é™¤è¯¥åˆ†ç±»ï¼Œå› ä¸ºå®ƒæœ‰å­åˆ†ç±»" - topic_exists: - other: ä¸èƒ½åˆ é™¤è¯¥åˆ†ç±»ï¼Œå› ä¸ºå®ƒæœ‰ %{count} 个主题。最è€çš„主题是 %{topic_link}。 topic_exists_no_oldest: "ä¸èƒ½åˆ é™¤è¯¥åˆ†ç±»ï¼Œå› ä¸ºä¸»é¢˜æ•°é‡ä¸º %{count}。" uncategorized_description: "ä¸éœ€è¦åˆ†ç±»æˆ–者ä¸é€‚åˆæ”¾åœ¨çŽ°åœ¨çš„ä»»ä½•åˆ†ç±»ä¸­çš„ä¸»é¢˜ã€‚" trust_levels: @@ -439,60 +416,60 @@ zh_CN: broken: "此图片已æŸå" rate_limiter: hours: - other: '%{count}å°æ—¶' + other: "%{count}å°æ—¶" minutes: - other: '%{count}分' + other: "%{count}分" seconds: - other: '%{count}ç§’' + other: "%{count}ç§’" datetime: distance_in_words: half_a_minute: "< 1分" less_than_x_seconds: - other: < %{count}ç§’ + other: "< %{count}ç§’" x_seconds: - other: '%{count}ç§’' + other: "%{count}ç§’" less_than_x_minutes: - other: < %{count}分 + other: "< %{count}分" x_minutes: - other: '%{count}分' + other: "%{count}分" about_x_hours: - other: '%{count}å°æ—¶' + other: "%{count}å°æ—¶" x_days: - other: '%{count}天' + other: "%{count}天" about_x_months: - other: '%{count}分钟' + other: "%{count}分钟" x_months: - other: '%{count}分钟' + other: "%{count}分钟" about_x_years: - other: '%{count}å¹´' + other: "%{count}å¹´" over_x_years: - other: '> %{count}å¹´' + other: "> %{count}å¹´" almost_x_years: - other: '%{count}å¹´' + other: "%{count}å¹´" distance_in_words_verbose: half_a_minute: "刚刚" less_than_x_seconds: - other: 刚刚 + other: "刚刚" x_seconds: - other: '%{count}秒之å‰' + other: "%{count}秒之å‰" less_than_x_minutes: - other: 少于%{count}åˆ†é’Ÿå‰ + other: "少于%{count}分钟å‰" x_minutes: - other: '%{count}分钟å‰' + other: "%{count}分钟å‰" about_x_hours: - other: '%{count}å°æ—¶å‰' + other: "%{count}å°æ—¶å‰" x_days: - other: '%{count}天å‰' + other: "%{count}天å‰" about_x_months: - other: 大约%{count}åˆ†é’Ÿå‰ + other: "大约%{count}分钟å‰" x_months: - other: '%{count}分钟å‰' + other: "%{count}分钟å‰" about_x_years: - other: 大约%{count}å¹´å‰ + other: "大约%{count}å¹´å‰" over_x_years: - other: 超过%{count}å¹´å‰ + other: "超过%{count}å¹´å‰" almost_x_years: - other: 将近%{count}å¹´å‰ + other: "将近%{count}å¹´å‰" password_reset: no_token: "抱歉,密ç ä¿®æ”¹é“¾æŽ¥å·²è¿‡æœŸã€‚选择登录按钮å†ä½¿ç”¨â€œæˆ‘忘记了密ç â€èŽ·å¾—ä¸€ä¸ªæ–°é“¾æŽ¥ã€‚" choose_new: "选择一个新密ç " @@ -566,17 +543,11 @@ zh_CN: description: '赞本帖' short_description: '赞该贴' long_form: '赞本帖内容' - vote: - title: '投票' - description: '给本帖投票' - short_description: '为该贴投票' - long_form: '已给本帖投票' user_activity: no_default: self: "你还没有活动。" others: "无活动。" no_bookmarks: - self: "你没有收è—帖å­ï¼Œæ”¶è—帖å­èƒ½è®©ä½ ä¹‹åŽè½»æ¾æ‰¾åˆ°ä»–们。" others: "没有收è—。" no_likes_given: self: "你还没有赞任何帖å­ã€‚" @@ -725,8 +696,6 @@ zh_CN: num_users: "用户数" top_referred_topics: title: "最多引用主题" - xaxis: "主题" - num_clicks: "点击数" page_view_anon_reqs: title: "匿å" xaxis: "天" @@ -783,7 +752,6 @@ zh_CN: xaxis: "天" yaxis: "总é‡" mobile_visits: - title: "用户访问" xaxis: "天" yaxis: "访问次数" web_crawlers: @@ -805,7 +773,7 @@ zh_CN: failing_emails_warning: '有 %{num_failed_jobs} 个邮件任务失败。请检查 app.yml æ–‡ä»¶æ˜¯å¦æ­£ç¡®é…置了邮件æœåŠ¡å™¨ã€‚æŸ¥çœ‹ Sidekiq 中失败的任务。' subfolder_ends_in_slash: "ä½ çš„å­ç›®å½•è®¾ç½®ä¸æ­£ç¡®ï¼›DISCOURSE_RELATIVE_URL_ROOT以斜æ ç»“尾。" email_polling_errored_recently: - other: 邮件轮询在过去的 24 å°æ—¶å†…出现了 %{count} 个错误。看一看日志寻找详情。 + other: "邮件轮询在过去的 24 å°æ—¶å†…出现了 %{count} 个错误。看一看日志寻找详情。" bad_favicon_url: "网站图标无法载入。检查站点设置中的 favicon_url。" poll_pop3_timeout: "至 POP3 æœåŠ¡å™¨çš„è¿žæŽ¥è¶…æ—¶ã€‚æ— æ³•èŽ·å–进站邮件。请检查POP3 设置和æœåŠ¡å•†ã€‚" poll_pop3_auth_error: "至 POP3 æœåŠ¡å™¨çš„è¿žæŽ¥éªŒè¯å¤±è´¥ã€‚请检查POP3 设置。" @@ -914,7 +882,6 @@ zh_CN: post_menu: "确定在帖å­èœå•æ¡åŒ…å«å“ªäº›æ¡ç›®ï¼Œä»¥åŠæŽ’åˆ—é¡ºåºã€‚例如:like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "帖å­èœå•中默认éšè—的按钮,点击çœç•¥å·åŽæ˜¾ç¤ºã€‚" share_links: "å†³å®šåˆ†äº«å¯¹è¯æ¡†ä¸­å‡ºçŽ°çš„æŒ‰é’®åŠæ˜¾ç¤ºé¡ºåºã€‚" - track_external_right_clicks: "追踪外部链接的å³é”®ç‚¹å‡»ï¼ˆä¾‹å¦‚:在æµè§ˆå™¨æ–°æ ‡ç­¾æ‰“å¼€ï¼‰ï¼Œç¼ºçœæ˜¯ç¦ç”¨çš„,因为它会é‡å†™URL" site_contact_username: "论å›ç»™ç”¨æˆ·è‡ªåЍå‘é€ç§ä¿¡æ—¶ä½¿ç”¨çš„用户å;如果留空将使用默认的系统账户。" send_welcome_message: "给所有用户å‘é€å¿«é€Ÿå¼€å§‹æŒ‡å¯¼çš„ç§ä¿¡" suppress_reply_directly_below: "当一个帖å­åªæœ‰ä¸€ä¸ªå›žå¤æ—¶ï¼Œä¸æ˜¾ç¤ºå¸–å­å›žå¤æ•°é‡ã€‚" @@ -1126,7 +1093,6 @@ zh_CN: reply_by_email_enabled: "å¯ç”¨é€šè¿‡é‚®ä»¶å›žå¤ã€‚" reply_by_email_address: "通过邮件回å¤çš„回å¤åœ°å€æ¨¡æ¿ï¼Œä¾‹å¦‚:%{reply_key}@reply.example.com 或 replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "通过邮件回å¤çš„回å¤åœ°å€æ¨¡æ¿ï¼Œä¾‹å¦‚:%{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "ç¦æ­¢ Discourse å‘é€ä»»ä½•邮件" strip_images_from_short_emails: "忽略邮件中å°äºŽ 2800 字节的图片" short_email_length: "短邮件地å€é•¿åº¦ï¼ˆä»¥æ¯”特作为å•ä½ï¼‰" display_name_on_email_from: "在邮件的æ¥è‡ªæ æ˜¾ç¤ºæ˜µç§°" @@ -1170,7 +1136,6 @@ zh_CN: delete_user_max_post_age: "ä¸å…许删除第一个帖å­å‘表于(x)天å‰çš„用户。" delete_all_posts_max: "é€šè¿‡åˆ é™¤æ‰€æœ‰å¸–å­æŒ‰é’®å¯ä»¥åˆ é™¤çš„æœ€å¤§å¸–å­æ•°é‡ã€‚如果用户有比这更多的帖å­ï¼Œè¿™äº›å¸–å­ä¸èƒ½ä¸€æ¬¡æ€§åˆ é™¤å¹¶ä¸”这个用户ä¸èƒ½è¢«åˆ é™¤ã€‚" email_editable: "å…è®¸ç”¨æˆ·åœ¨æ³¨å†ŒåŽæ”¹å˜ä»–们的邮箱地å€ã€‚" - logout_redirect: "登出åŽé‡å®šå‘至的地å€ã€‚(如:http://somesite.com/logout)" allow_uploaded_avatars: "å…许用户上传自定义个人头åƒã€‚" allow_animated_avatars: "å…许用户使用动画个人头åƒã€‚警告:更改设置åŽè¿è¡Œ avatars:refresh 这个 rake 任务。" allow_animated_thumbnails: "为动画 gif 生æˆåЍæ€ç¼©ç•¥å›¾ã€‚" @@ -1340,51 +1305,48 @@ zh_CN: not_seen_in_a_month: "欢迎回æ¥ï¼æˆ‘们已ç»å¥½ä¹…没è§åˆ°ä½ äº†ã€‚这些是你ä¸åœ¨æ—¶çš„æœ€çƒ­é—¨ä¸»é¢˜ã€‚" merge_posts: edit_reason: - other: '%{username}åˆå¹¶äº† %{count} 个帖å­' + other: "%{username}åˆå¹¶äº† %{count} 个帖å­" errors: different_topics: "无法åˆå¹¶ä¸åŒä¸»é¢˜çš„帖å­ã€‚" different_users: "无法åˆå¹¶ä¸åŒç”¨æˆ·çš„帖å­ã€‚" move_posts: new_topic_moderator_post: - other: '%{count} 个帖å­è¢«åˆ†ç¦»åˆ°äº†æ–°ä¸»é¢˜ï¼š%{topic_link}' + other: "%{count} 个帖å­è¢«åˆ†ç¦»åˆ°äº†æ–°ä¸»é¢˜ï¼š%{topic_link}" existing_topic_moderator_post: - other: '%{count} 个帖å­è¢«åˆå¹¶åˆ°çŽ°å­˜ä¸»é¢˜ï¼š%{topic_link}' - change_owner: - post_revision_text: "所有æƒä»Ž %{old_user} 转移至 %{new_user}" - deleted_user: "å·²ç»åˆ é™¤çš„用户" + other: "%{count} 个帖å­è¢«åˆå¹¶åˆ°çŽ°å­˜ä¸»é¢˜ï¼š%{topic_link}" topic_statuses: archived_enabled: "本主题已归档,å³å·²ç»å†»ç»“,无法修改。" archived_disabled: "本主题已被解除归档,å³ä¸å†å†»ç»“,å¯ä»¥ä¿®æ”¹ã€‚" closed_enabled: "该主题现已关闭,ä¸å†å…许新的回å¤ã€‚" closed_disabled: "本主题已开放,å¯ä»¥å‘表新的回å¤ã€‚" autoclosed_message_max_posts: - other: ç§ä¿¡ä¸­å›žå¤å·²ç»è¾¾åˆ°ä¸Šé™ %{count},自动é”定。 + other: "ç§ä¿¡ä¸­å›žå¤å·²ç»è¾¾åˆ°ä¸Šé™ %{count},自动é”定。" autoclosed_topic_max_posts: - other: 主题中回å¤å·²ç»è¾¾åˆ°ä¸Šé™ %{count},自动关闭。 + other: "主题中回å¤å·²ç»è¾¾åˆ°ä¸Šé™ %{count},自动关闭。" autoclosed_enabled_days: - other: 该主题在创建%{count}天åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许添加新回å¤ã€‚ + other: "该主题在创建%{count}天åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许添加新回å¤ã€‚" autoclosed_enabled_hours: - other: 该主题在创建%{count}å°æ—¶åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许新的回å¤ã€‚ + other: "该主题在创建%{count}å°æ—¶åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许新的回å¤ã€‚" autoclosed_enabled_minutes: - other: 该主题在创建%{count}分钟åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许新的回å¤ã€‚ + other: "该主题在创建%{count}分钟åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许新的回å¤ã€‚" autoclosed_enabled_lastpost_days: - other: 该主题在最åŽä¸€ä¸ªå›žå¤åˆ›å»ºåŽ%{count}天åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许新的回å¤ã€‚ + other: "该主题在最åŽä¸€ä¸ªå›žå¤åˆ›å»ºåŽ%{count}天åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许新的回å¤ã€‚" autoclosed_enabled_lastpost_hours: - other: 该主题在最åŽä¸€ä¸ªå›žå¤åˆ›å»ºåŽ%{count}å°æ—¶åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许添加新回å¤ã€‚ + other: "该主题在最åŽä¸€ä¸ªå›žå¤åˆ›å»ºåŽ%{count}å°æ—¶åŽè‡ªåŠ¨å…³é—­ã€‚ä¸å†å…许添加新回å¤ã€‚" autoclosed_enabled_lastpost_minutes: - other: 本主题在最åŽä¸€ä¸ªå›žå¤åˆ›å»ºåŽ%{count}分钟åŽè‡ªåЍé”定。ä¸å†å…许添加新回å¤ã€‚ + other: "本主题在最åŽä¸€ä¸ªå›žå¤åˆ›å»ºåŽ%{count}分钟åŽè‡ªåЍé”定。ä¸å†å…许添加新回å¤ã€‚" autoclosed_disabled_days: - other: è¯¥ä¸»é¢˜å¼€å¯ %{count} 天åŽå°†è‡ªåŠ¨å…³é—­ã€‚ + other: "è¯¥ä¸»é¢˜å¼€å¯ %{count} 天åŽå°†è‡ªåŠ¨å…³é—­ã€‚" autoclosed_disabled_hours: - other: è¯¥ä¸»é¢˜å¼€å¯ %{count} å°æ—¶åŽå°†è‡ªåŠ¨å…³é—­ã€‚ + other: "è¯¥ä¸»é¢˜å¼€å¯ %{count} å°æ—¶åŽå°†è‡ªåŠ¨å…³é—­ã€‚" autoclosed_disabled_minutes: - other: è¯¥ä¸»é¢˜å¼€å¯ %{count} 分钟åŽå°†è‡ªåŠ¨å…³é—­ã€‚ + other: "è¯¥ä¸»é¢˜å¼€å¯ %{count} 分钟åŽå°†è‡ªåŠ¨å…³é—­ã€‚" autoclosed_disabled_lastpost_days: - other: 该主题将在最åŽä¸€ä¸ªå›žå¤ %{count} 天åŽè‡ªåŠ¨å…³é—­ã€‚ + other: "该主题将在最åŽä¸€ä¸ªå›žå¤ %{count} 天åŽè‡ªåŠ¨å…³é—­ã€‚" autoclosed_disabled_lastpost_hours: - other: 该主题将在最åŽä¸€ä¸ªå›žå¤ %{count} å°æ—¶åŽè‡ªåŠ¨å…³é—­ã€‚ + other: "该主题将在最åŽä¸€ä¸ªå›žå¤ %{count} å°æ—¶åŽè‡ªåŠ¨å…³é—­ã€‚" autoclosed_disabled_lastpost_minutes: - other: 该主题将在最åŽä¸€ä¸ªå›žå¤ %{count} 分钟åŽè‡ªåŠ¨å…³é—­ã€‚ + other: "该主题将在最åŽä¸€ä¸ªå›žå¤ %{count} 分钟åŽè‡ªåŠ¨å…³é—­ã€‚" autoclosed_disabled: "本主题是开放的,å¯ä»¥æ·»åŠ æ–°çš„å›žå¤ã€‚" autoclosed_disabled_lastpost: "本主题现在开放了。å¯ä»¥æ·»åŠ æ–°çš„å›žå¤ã€‚" pinned_enabled: "本主题已置顶,它将始终显示在它所属分类的顶部。å¯ç”±ç®¡ç†äººå‘˜å¯¹æ‰€æœ‰äººè§£é™¤ç½®é¡¶ï¼Œæˆ–è€…ç”±ç”¨æˆ·è‡ªå·±å–æ¶ˆç½®é¡¶ã€‚" @@ -1420,7 +1382,6 @@ zh_CN: click_to_continue: "点击这里继续。" already_logged_in: "喔,看起æ¥ä½ æ­£å°è¯•查看给å¦ä¸€ä¸ªç”¨æˆ·çš„é‚€è¯·é“¾æŽ¥ã€‚å¦‚æžœä½ ä¸æ˜¯%{current_user},请退出å†é‡è¯•。" user: - no_accounts_associated: "æ— å…³è”账户" deactivated: "å› å‘é€è‡³â€œ%{email}â€çš„é‚®ä»¶è¢«å¤šæ¬¡é€€ä¿¡ï¼Œå–æ¶ˆæ¿€æ´»" deactivated_by_staff: "被管ç†äººå‘˜ç¦ç”¨" activated_by_staff: "被管ç†äººå‘˜æ¿€æ´»" @@ -1452,9 +1413,9 @@ zh_CN: same_ip_address: "åŒä¸€IP地å€(%{ip_address})如其他用户" flags_reminder: flags_were_submitted: - other: æ ‡å¿—å·²ç»æäº¤%{count}å°æ—¶å‰ã€‚[请审核他们](/admin/flags)。 + other: "æ ‡å¿—å·²ç»æäº¤%{count}å°æ—¶å‰ã€‚[请审核他们](/admin/flags)。" subject_template: - other: '%{count} 个标记需è¦è¢«å¤„ç†' + other: "%{count} 个标记需è¦è¢«å¤„ç†" unsubscribe_mailer: title: "å–æ¶ˆè®¢é˜…å‘件人" subject_template: "ç¡®è®¤ä½ ä¸æƒ³è¦æ”¶åˆ°%{site_title}的电å­é‚®ä»¶æ›´æ–°" @@ -1610,18 +1571,13 @@ zh_CN: deferred: "感谢通知我们。我们正在调查情况。" deferred_and_deleted: "感谢通知我们。我们已ç»åˆ é™¤äº†å¸–å­ã€‚" temporarily_closed_due_to_flags: - other: 因为大é‡ç¤¾åŒºæˆå‘˜çš„æ ‡è®°ï¼Œè¿™ä¸ªä¸»é¢˜è¢«ä¸´æ—¶å…³é—­ %{count} å°æ—¶ã€‚ + other: "因为大é‡ç¤¾åŒºæˆå‘˜çš„æ ‡è®°ï¼Œè¿™ä¸ªä¸»é¢˜è¢«ä¸´æ—¶å…³é—­ %{count} å°æ—¶ã€‚" system_messages: private_topic_title: "主题 #%{id}" contents_hidden: "请访问帖å­ä»¥æŸ¥çœ‹å†…容。" post_hidden: title: "帖å­éšè—" subject_template: "帖å­å› ç¤¾åŒºæ ‡è®°éšè—" - usage_tips: - text_body_template: | - è¦æŸ¥çœ‹ç»™æ–°ç”¨æˆ·çš„ç®€è¦æŠ€å·§ï¼Œ[(英文)看看这篇åšå®¢æ–‡ç« ](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/)。 - - åªè¦ä½ ä¸æ–­å‚与,我们将更了解你,并且新用户的临时é™åˆ¶å°†è¢«ç§»é™¤ã€‚一段时间åŽä½ å°†èŽ·å¾—[信任等级](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924),这将æä¾›ä¸€äº›ç‰¹æ®ŠåŠŸèƒ½æ¥å¸®åŠ©æˆ‘ä»¬æ›´å¥½åœ°ç®¡ç†ç¤¾ç¾¤ã€‚ welcome_user: title: "欢迎用户" subject_template: "欢迎æ¥åˆ° %{site_name}ï¼" @@ -1891,16 +1847,6 @@ zh_CN: too_many_spam_flags: title: "太多垃圾标记" subject_template: "新账户被暂时å°ç¦" - text_body_template: | - 你好, - - 这是%{site_name}自动å‘出的邮件。你的帖å­å› ç¤¾åŒºæ ‡è®°è€Œè¢«ä¸´æ—¶éšè— - - 。 - - 出于谨慎的考虑,在管ç†äººå‘˜å®¡æ ¸é€šè¿‡å‰ï¼Œä½ çš„æ–°è´¦æˆ·ä¸èƒ½å†å‘è¡¨æ–°çš„å›žå¤æˆ–者主题。我们对此带æ¥çš„ä¸ä¾¿è¡¨ç¤ºæ­‰æ„。 - - è¦æŸ¥çœ‹æ›´å¤šæŒ‡å¼•,请å‚考我们的[社区指引](%{base_url}/guidelines)。 too_many_tl3_flags: title: "太多信任等级3用户标记" subject_template: "新账户被暂时å°ç¦" @@ -1957,7 +1903,7 @@ zh_CN: pending_users_reminder: title: "待审核用户æé†’" subject_template: - other: '%{count} 个用户等待批准' + other: "%{count} 个用户等待批准" text_body_template: | 有新注册的用户在访问论å›å‰éœ€è¦è¢«ç¡®è®¤ï¼ˆæˆ–者拒ç»ï¼‰ã€‚ @@ -1985,7 +1931,7 @@ zh_CN: queued_posts_reminder: title: "待处ç†å¸–孿醒" subject_template: - other: '%{count} 个帖å­ç­‰å¾…审核' + other: "%{count} 个帖å­ç­‰å¾…审核" text_body_template: | 你好, @@ -2003,16 +1949,14 @@ zh_CN: user_notifications: previous_discussion: "之å‰çš„回å¤" reached_limit: - other: 注æ„:我们æ¯å¤©æœ€å¤šå‘é€ %{count} 邮件。访问站点看看没被å‘é€çš„æ¶ˆæ¯ã€‚还有你很ç«ï¼ + other: "注æ„:我们æ¯å¤©æœ€å¤šå‘é€ %{count} 邮件。访问站点看看没被å‘é€çš„æ¶ˆæ¯ã€‚还有你很ç«ï¼" in_reply_to: "回å¤ç»™" unsubscribe: title: "å–æ¶ˆè®¢é˜…" description: "ä¸å†å¯¹è¿™äº›é‚®ä»¶æ„Ÿå…´è¶£ï¼Ÿæ²¡é—®é¢˜ï¼ç‚¹å‡»ä¸‹é¢æŒ‰é’®æ¥ç«‹å³å–消订阅:" reply_by_email: "[访问主题](%{base_url}%{url})或者å‘邮件回å¤ã€‚" - reply_by_email_pm: "[访问ç§ä¿¡](%{base_url}%{url})或者å‘邮件回å¤ã€‚" only_reply_by_email: "å‘邮件回å¤ã€‚" visit_link_to_respond: "[访问主题](%{base_url}%{url})以回å¤." - visit_link_to_respond_pm: "[访问ç§ä¿¡](%{base_url}%{url})以回å¤." posted_by: "%{username}å‘表于%{post_date}" invited_group_to_private_message_body: | %{username} 邀请 @%{group_name} 至ç§ä¿¡äº¤æµï¼š @@ -2320,7 +2264,6 @@ zh_CN: recent_topics: "最近" see_more: "更多" search_title: "æœç´¢è¯¥ç½‘页" - search_google: "Google" offline: title: "无法载入应用" offline_page_message: "看起æ¥ä½ æŽ‰çº¿äº†ï¼è¯·æ£€æŸ¥ç½‘络连接并é‡è¯•。" @@ -2353,32 +2296,11 @@ zh_CN: flag_reason: sockpuppet: "新用户创建了主题,而å¦ä¸€ä¸ªæ–°ç”¨æˆ·ä»¥åŒä¸€ä¸ª IP 在该主题回å¤ã€‚查看站点设置的 `flag_sockpuppets`。" spam_hosts: "新用户试图在多个创建帖å­ä¸­å‘表链接到åŒä¸€ä¸ªåŸŸå的内容。查看站点设置的 `newuser_spam_host_threshold`。" - email_log: - post_user_deleted: "帖å­çš„用户已被删除。" - no_user: "ä¸èƒ½æ‰¾åˆ°ç”¨æˆ· ID 为 %{user_id} 的用户" - anonymous_user: "这是匿å用户" - suspended_not_pm: "用户被å°ç¦ï¼Œè¿™ä¸æ˜¯ç§ä¿¡" - seen_recently: "用户最近活跃" - post_not_found: "ä¸èƒ½æ‰¾åˆ°å¸–å­ ID 为 %{post_id} 的帖å­" - notification_already_read: "è¿™å°é‚®ä»¶ä¸­çš„通知已ç»è¢«é˜…读了" - topic_nil: "post.topic 为空" - post_deleted: "主题被作者删除" - user_suspended: "用户被å°ç¦" - already_read: "用户已ç»é˜…读了主题" - exceeded_emails_limit: "超过 max_emails_per_day_per_user" - exceeded_bounces_limit: "超过 bounce_score_threshold" - message_blank: "ç§ä¿¡ä¸ºç©º" - message_to_blank: "message.to 为空" - text_part_body_blank: "text_part.body 为空" - body_blank: "body 为空" - no_echo_mailing_list_mode: "邮件列表通知已对用户自己的帖å­ç¦ç”¨" color_schemes: base_theme_name: "基础" - default: "亮色方案" dark: "暗色方案" - default_theme_name: "默认" - dark_theme_name: "æš—" light_theme_name: "亮" + dark_theme_name: "æš—" about: "关于" guidelines: "指导" privacy: "éšç§" @@ -2577,73 +2499,41 @@ zh_CN: editor: name: 编辑 description: é¦–æ¬¡ç¼–è¾‘å¸–å­ - long_description: | - 该徽章授予给第一次编辑自己帖å­çš„你。虽然你ä¸èƒ½æ°¸è¿œåœ¨ç¼–辑自己的帖å­ï¼Œä½†æ˜¯ç¼–辑他们总是一个好办法——你å¯ä»¥æ”¹è¿›ä½ çš„帖å­ã€ä¿®æ­£å°é”™è¯¯ï¼Œæˆ–è€…æ˜¯å¢žè¡¥ä½ åŽŸæ¥æ²¡æœ‰å†™çš„内容。编辑能让你的帖å­è´¨é‡å˜å¾—æ›´å¥½ï¼ basic_user: name: åˆçº§ç”¨æˆ· - description: "授予所有常用社区功能" - long_description: | - 该徽章授予给用户等级达到 1 çš„æˆå‘˜ã€‚感谢你在社区里花了一些时间并且阅读了一些帖å­ï¼Œäº†è§£äº†æˆ‘们的社区。你的新用户é™åˆ¶å·²ç»è¢«å–消;并且你已ç»è¢«æŽˆäºˆäº†æ‰€æœ‰åŸºæœ¬çš„社区æƒé™ï¼Œå¿…须个人ç§ä¿¡ã€æ ‡è®°ã€ç»´åŸºç¼–辑和å‘布多张图片和多个链接的能力。 member: name: æˆå‘˜ - description: "授予邀请ã€ç¾¤ç»„ç§ä¿¡å’Œæ›´å¤šçš„赞" - long_description: | - 该徽章授予给达到用户等级 2 的你。感谢你在社区待了几周,真正èžå…¥åˆ°äº†ç¤¾åŒºä¸­ã€‚你现在å¯ä»¥åœ¨ä½ çš„用户页或者主题中邀请他人或者创建群组ç§ä¿¡äº†ã€‚æ¯å¤©ä½ ä¹Ÿå¯ä»¥ç‚¹æ›´å¤šæ¬¡èµžäº†ã€‚ regular: name: 活跃用户 - description: "授予é‡åˆ†ç±»ã€é‡å‘½åã€è·Ÿè¸ªé“¾æŽ¥ã€ç»´åŸºåŠŸèƒ½å’Œæ›´å¤šçš„èµž" - long_description: | - 该徽章授予给达到用户等级 3 的你。感谢你在这几个月æŒç»­åœ°å‚与社区。你现在是我们之中最活跃的读者之一了,你æŒç»­çš„贡献æžå¤§åœ°å¸®åŠ©äº†æˆ‘ä»¬çš„ç¤¾åŒºã€‚ä½ çŽ°åœ¨å¯ä»¥ç¤¾åŒºå¾…了几周,真正èžå…¥åˆ°äº†ç¤¾åŒºä¸­ã€‚你现在å¯ä»¥é‡æ–°åˆ†ç±»æˆ–者é‡å‘½å主题ã€ä½¿ç”¨èƒ½åŠ›å¼ºå¤§çš„åžƒåœ¾æ ‡è®°åŠŸèƒ½ä»¥åŠè®¿é—®éšè—的贵宾分类了。而且æ¯å¤©ä½ å¯ä»¥ç‚¹æ›´å¤šæ¬¡èµžäº†ã€‚ leader: name: 资深 - description: "授予全局编辑ã€å›ºå®šã€é”定ã€å­˜æ¡£ã€åˆ†å‰²ã€åˆå¹¶å’Œæ›´å¤šçš„赞" - long_description: | - 该徽章授予给达到用户等级 4 的你。你被管ç†äººå‘˜é€‰ä½œäº†ç¤¾åŒºçš„领导力é‡ï¼Œä½ ç”¨ä½ çš„行动和言辞为社区树立了正é¢çš„形象。你现在å¯ä»¥ä¿®æ”¹æ‰€æœ‰å¸–å­ï¼Œä½¿ç”¨å¸¸è§çš„版主的主题管ç†åŠŸèƒ½ï¼Œæ¯”å¦‚ç½®é¡¶ã€é”定ã€éšè—ã€å­˜æ¡£ã€åˆ†å‰²å’Œåˆå¹¶åŠŸèƒ½ã€‚ä½ æ¯å¤©å¯ä»¥ç‚¹æ›´å¤šçš„赞了。 welcome: name: 欢迎 description: 得到一个赞 - long_description: | - è¯¥å¾½ç« æŽˆäºˆç»™å¸–å­æ”¶åˆ°äº†ç¬¬ä¸€ä¸ªèµžçš„æˆå‘˜ã€‚æ­å–œï¼Œæœ‰ç¤¾åŒºæˆå‘˜å‘现你å‘è¡¨çš„å†…å®¹æœ‰æ„æ€ã€é…·ç‚«æˆ–è€…æœ‰ç”¨ï¼ autobiographer: name: 自传作者 description: "填写用户资料信æ¯" - long_description: | - 该徽章授予给填写了用户资料页并设置了用户头åƒçš„你。让社群æˆå‘˜ä»¬å¤šäº†è§£ä½ ä¸€ç‚¹ä»¥åŠä½ æ„Ÿå…´è¶£çš„å†…å®¹ï¼Œèƒ½å¸®åŠ©æˆ‘ä»¬æ‰“é€ ä¸€ä¸ªæ›´å¥½ã€æ›´å›¢ç»“çš„ç¤¾ç¾¤ã€‚è®©æˆ‘ä»¬ä¸€èµ·åŠªåŠ›ï¼ anniversary: name: 年度纪念日 description: 一年活跃用户,至少å‘äº†ä¸€ä¸ªå¸–å­ - long_description: | - 该徽章授予给在社区注册一年并超至少å‘布了一个帖å­çš„你。感谢你的æŒç»­å…³æ³¨å’Œå¯¹æˆ‘ä»¬ç¤¾åŒºçš„è´¡çŒ®ï¼æˆ‘们希望你继续å‚与我们的社区。 nice_post: name: ä¸é”™çš„å›žå¤ description: 回å¤è¢«èµžäº† 10 次 - long_description: | - 该徽章授予给回å¤è¢«èµžäº† 10 次的你。你的回å¤ç»™ç¤¾åŒºæˆå‘˜ä»¬ç•™ä¸‹äº†å°è±¡ï¼Œå¹¶ä¸”ä½ æŽ¨åŠ¨äº†è®¨è®ºçš„è¿›ç¨‹ï¼ good_post: name: å¾ˆå¥½çš„å›žå¤ description: 回å¤è¢«èµžäº† 25 次 - long_description: | - 该徽章授予给回å¤è¢«èµžäº† 25 次的你。你的回å¤å¾ˆæ°å‡ºï¼Œè¿™ä¸ªè®¨è®ºå¯¹æ¯ä¸ªäººéƒ½å˜å¾—更有æ„ä¹‰äº†ï¼ great_post: name: ç²¾å½©çš„å›žå¤ description: 回å¤è¢«èµžäº† 50 次 - long_description: | - 该徽章授予给回å¤è¢«èµžäº† 50 次的你。哇ï¼ä½ çš„回å¤å¾ˆæœ‰å¯å‘ã€å¼•ç»æ®å…¸ã€ä»¤äººå†·ä¿Šä¸ç¦æˆ–者å分有内涵,整个社区都喜欢它。 nice_topic: name: ä¸é”™çš„主题 description: 主题被赞了 10 次 - long_description: | - 该徽章授予给主题获得 10 个赞的你。嗨,你开å¯äº†ä¸€ä¸ªç¤¾åŒºæˆå‘˜è§‰å¾—æœ‰æ„æ€çš„è®¨è®ºï¼ good_topic: name: 很好的主题 description: 主题被赞了 25 次 - long_description: | - 该徽章授予给主题获得 25 个赞的你。你开å¯äº†ä¸€ä¸ªæœ‰æ„义的主题,整个社区都在积æžå“åº”ï¼Œè€Œä¸”å¤§å®¶å–œæ¬¢ä½ çš„ä¸»é¢˜ï¼ great_topic: name: 精彩的主题 description: 主题被赞了 50 次 - long_description: | - 该徽章授予给主题获得 50 个赞的你。你开å¯äº†ä¸€ä¸ªå¼•人入胜的主题,整个社区都沉浸于讨论之中。 nice_share: name: ä¸é”™çš„分享 description: 分享了一个有 25 ä¸ªç‹¬ç«‹è®¿é—®è€…çš„å¸–å­ @@ -2652,14 +2542,9 @@ zh_CN: good_share: name: 很棒的分享 description: 分享了一个有 300 ä¸ªç‹¬ç«‹è®¿é—®è€…çš„å¸–å­ - long_description: | - 该徽章授予给分享链接给 300 个其他访客的你。干得漂亮ï¼ä½ æŠŠä¸€ä¸ªæœ‰æ„æ€çš„讨论介ç»ç»™äº†è®¸å¤šæ–°çš„æœ‹å‹ï¼Œå¹¶ä¸”帮助社区å‰è¿›äº†ä¸€æ­¥ã€‚ great_share: name: 精彩的分享 description: 分享了一个有 1000 ä¸ªç‹¬ç«‹è®¿é—®è€…çš„å¸–å­ - long_description: |+ - 该徽章授予给分享链接给 1000 个其他访客的你。哇ï¼ä½ æŠŠä¸€ä¸ªæœ‰æ„æ€çš„讨论推广给了广大的读者们,并且帮助社区å‰è¿›äº†ä¸€å¤§æ­¥ï¼ - first_like: name: 首次赞 description: å·²èµžè¿‡äº†ä¸€ä¸ªå¸–å­ @@ -2668,22 +2553,15 @@ zh_CN: first_flag: name: 首次标记 description: å·²æ ‡è®°è¿‡äº†ä¸€ä¸ªå¸–å­ - long_description: | - 该徽章授予给第一次标记帖å­çš„ä½ ã€‚æ ‡è®°æ˜¯å¸®åŠ©æˆ‘ä»¬å¸®åŠ©ç¤¾åŒºä¿æŒå¥åº·ã€åˆå®œçš„工具。如果你注æ„到哪个帖å­éœ€è¦ç‰ˆä¸»çš„æ³¨æ„,ä¸ç”¨åœ¨ä¹Žä»€ä¹ˆåŽŸå› ï¼Œç›´æŽ¥æ ‡è®°ã€‚å¦‚æžœä½ æ³¨æ„到别人帖å­é‡Œçš„æŸä¸ªé—®é¢˜ï¼Œä½ ä¹Ÿå¯ç”¨æ ‡è®°åŠŸèƒ½å‘é€ç§ä¿¡ç»™è¯¥æˆå‘˜ã€‚如果你å‘现了问题,:flag_black: 标记å§ï¼ promoter: name: 推广者 description: 已邀请了 1 个用户 campaigner: name: 活动家 description: 已邀请了 3 个åˆçº§ç”¨æˆ· - long_description: |+ - 该徽章授予给邀请了 3 人加入社区的你,你的朋å‹åœ¨ç«™ç‚¹ä¸Šåº¦è¿‡äº†å¾ˆé•¿çš„æ—¶é—´ï¼Œå·²ç»æˆä¸ºäº†åŸºç¡€ç”¨æˆ·ã€‚æ´»è·ƒçš„ç¤¾åŒºéœ€è¦æ–°é²œçš„血液日常å‚与,并为交æµå¸¦æ¥å¤šå…ƒè§†ç‚¹ã€‚ - champion: name: 外交官 description: 已邀请了 5 个æˆå‘˜ - long_description: | - 该徽章授予给邀请了 5 人加入社区的你,你的朋å‹åœ¨ç«™ç‚¹ä¸Šåº¦è¿‡äº†å¾ˆé•¿çš„æ—¶é—´ï¼Œå·²ç»æˆä¸ºäº†æˆå‘˜ã€‚å“‡ï¼æ„Ÿè°¢ä½ å¸®åŠ©ç¤¾åŒºæˆé•¿ï¼Œç¤¾åŒºå› æ­¤å˜å¾—æ›´å¤šå…ƒäº†ï¼ first_share: name: 首次分享 description: å·²åˆ†äº«äº†ä¸€ä¸ªå¸–å­ @@ -2697,13 +2575,9 @@ zh_CN: first_quote: name: 首次引用 description: å·²å¼•ç”¨è¿‡ä¸€ä¸ªå¸–å­ - long_description: | - 该徽章授予给第一次在回å¤ä¸­å¼•用帖å­çš„你。在你的回å¤ä¸­å¼•用之å‰å¸–å­ä¸­çš„相关的段è½å°†æŠŠä¸»é¢˜å…³è”在一起并切题。åªè¦é€‰ä¸­åˆ«çš„帖å­ä¸­çš„任何文字,然åŽç‚¹å‡»å›žå¤æŒ‰é’®å°†å¯ä»¥å¼•用啦。多引用一些å§ï¼ read_guidelines: name: 阅读指引 description: "阅读社群指引" - long_description: | - 该徽章授予给阅读了社群指引的你。éµå®ˆå’Œåˆ†äº«ç®€å•çš„æŒ‡å¼•èƒ½è®©æˆ‘ä»¬æ‰“é€ ä¸€ä¸ªç¨³å®šã€æœ‰è¶£å’Œå¯æŒç»­çš„社群。永远记ä½åˆ«äººï¼Œä¸€ä¸ªå’Œä½ æœ‰å¾ˆå¤šå…±åŒç‚¹çš„人,就在å±å¹•的那一侧。å‹å¥½ä¸€äº›ï¼ reader: name: 读者 description: 阅读了有至少 100 个回å¤çš„ä¸»é¢˜ä¸­çš„æ‰€æœ‰å›žå¤ @@ -2752,8 +2626,6 @@ zh_CN: crazy_in_love: name: 狂热 description: 20 天都赞过 50 次 - long_description: | - 该徽章授予给 20 天赞过 50 次的你。哇ï¼ä½ ä¸ºç¤¾åŒºæˆå‘˜ä»¬æ ‘ç«‹äº†ä¸€ä¸ªä»¤äººé¼“èˆžçš„æ¨¡èŒƒï¼ thank_you: name: 感谢你 description: 有 20 个被赞的帖å­ï¼Œç»™å‡ºè¿‡ 10 个赞 @@ -2767,19 +2639,15 @@ zh_CN: empathetic: name: 感性 description: 有 500 个被赞的帖å­ï¼Œç»™å‡ºè¿‡ 1000 个赞 - long_description: | - 该徽章授予给收到了 500 个赞,且赞过别人至少 1000 次的你。哇ï¼ä½ æ˜¯ä¸€ä¸ªå¯Œæœ‰åŒæƒ…心且会æ¢ä½æ€è€ƒçš„æ¨¡èŒƒã€‚ :two_hearts: first_emoji: name: 首个表情 description: 在帖å­ä¸­ä½¿ç”¨è¡¨æƒ…ç¬¦å· first_mention: name: 首次æåŠ description: 帖å­ä¸­æåŠç”¨æˆ· - long_description: 该徽章授予给第一次在帖å­ä¸­@别人的你。æ¯ä¸ªæåŠéƒ½å°†é€šçŸ¥å¯¹æ–¹ï¼Œè®©ä»–们知é“ä½ å‘了贴。输入 @ æåŠä»»ä½•用户,如果å¯ä»¥çš„è¯ï¼Œä¹Ÿå¯ä»¥æåŠç¾¤ç»„——这是个获得他们注æ„的好办法。 first_onebox: name: 首个Onebox description: å‘布过 oneboxed 链接 - long_description: 该徽章授予给第一次在空行中å‘è¡¨é“¾æŽ¥çš„ä½ ï¼Œé“¾æŽ¥å°†è¢«å±•å¼€æˆ onebox。其中有链接摘è¦ã€æ ‡é¢˜å’Œï¼ˆå¦‚果有)图片。 first_reply_by_email: name: é¦–æ¬¡é‚®ä»¶å›žå¤ description: é€šè¿‡é‚®ä»¶å›žå¤ @@ -2793,15 +2661,12 @@ zh_CN: enthusiast: name: åå…¨å美 description: 连续 10 天访问 - long_description: 连续 10 天访问论å›ä¼šè¢«æŽˆäºˆè¯¥å‹‹ç« ã€‚æ„Ÿè°¢ä¸Žæˆ‘ä»¬å…±åº¦è¶…è¿‡ä¸€å‘¨çš„æ—¶å…‰ï¼ aficionado: name: 百尺竿头 description: 连续 100 天访问 - long_description: 连续 100 天访问论å›ä¼šè¢«æŽˆäºˆè¯¥å‹‹ç« ã€‚è¿™å¯æ˜¯è¶…è¿‡ä¸‰ä¸ªæœˆçš„æ—¶é—´ï¼ devotee: name: 全年ä¸è½ description: 连续 365 天访问 - long_description: 连续365 天访问论å›ä¼šè¢«æŽˆäºˆè¯¥å‹‹ç« ã€‚å“‡å“¦ï¼Œä¸€æ•´å¹´äº†ï¼ badge_title_metadata: "%{site_title}çš„%{display_name}徽章" admin_login: success: "邮件已å‘é€" @@ -2821,7 +2686,6 @@ zh_CN: button: "注册" title: "注册管ç†å‘˜è´¦æˆ·" help: "注册新账户以开始" - no_emails: "ä¸å¹¸çš„æ˜¯ï¼Œåœ¨å‘导中你没有设置管ç†å‘˜é‚®ä»¶åœ°å€ï¼Œæ‰€ä»¥å®Œå–„é…ç½®å¯èƒ½æœ‰ç‚¹å›°éš¾ã€‚" confirm_email: title: "é…置你的邮件" message: "

我们å‘é€äº†ä¸€å°æ¿€æ´»é‚®ä»¶åˆ°%{email}ã€‚è¯·æŒ‰ç…§é‚®ä»¶ä¸­çš„æ­¥éª¤æ¥æ¿€æ´»ä½ çš„å¸å·ã€‚

如果你没有收到邮件,请检查你正确设置了 Discourse 邮件é…ç½®ï¼Œç„¶åŽæŸ¥çœ‹ä½ çš„垃圾邮件收件箱。

" @@ -2924,10 +2788,8 @@ zh_CN: fields: favicon_url: label: "å°å›¾æ ‡" - description: "æµè§ˆå™¨ä¸­ä½ ç«™ç‚¹æ˜¾ç¤ºçš„图标,è¦åœ¨å°å°ºå¯¸çš„æƒ…况下表现出色,例如 32px X 32px。" apple_touch_icon_url: label: "大图标" - description: "现代设备中你站点显示的图标,è¦åœ¨å¤§ä¸€ç‚¹å°ºå¯¸çš„æƒ…况下表现出色。推è的尺寸至少è¦è¾¾åˆ°144px X 144px。" homepage: description: "我们建议你在主页显示最åŽå‘点的主题,但你也å¯ä»¥é€‰æ‹©åœ¨ä¸»é¡µæ˜¾ç¤ºä¸»é¢˜åˆ†ç±»åˆ—表。" title: "主页" @@ -2936,8 +2798,6 @@ zh_CN: choices: latest: label: "最新主题" - categories: - label: "分类" emoji: title: "Emoji" description: "ä½ æƒ³ä½¿ç”¨å“ªç§æ ·å¼çš„表情符å·ï¼Ÿä½ å¯ä»¥ä»¥åŽåœ¨\"管ç†å‘˜/定制/表情符å·ï¼ˆEmoji)\"界é¢å¢žåŠ æ›´å¤šå®šåˆ¶çš„è¡¨æƒ…ç¬¦å·ã€‚" diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index f2ac0db693..8cbcf3595e 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -125,7 +125,7 @@ zh_TW: reading_time: "閱讀時間" likes: "個讚" too_many_replies: - other: 我們éžå¸¸æŠ±æ­‰ï¼Œæ–°ç”¨æˆ¶è¢«è‡¨æ™‚é™åˆ¶åœ¨åŒä¸€å€‹ä¸»é¡Œä¸Šï¼Œåªèƒ½å›žè¦† %{count} 次 + other: "我們éžå¸¸æŠ±æ­‰ï¼Œæ–°ç”¨æˆ¶è¢«è‡¨æ™‚é™åˆ¶åœ¨åŒä¸€å€‹ä¸»é¡Œä¸Šï¼Œåªèƒ½å›žè¦† %{count} 次" embed: start_discussion: "開始討論" continue: "繼續討論" @@ -135,28 +135,28 @@ zh_TW: no_hosts: "未設置內嵌用的主機。" configure: "é…置嵌入" more_replies: - other: '%{count} 個更多回覆' + other: "%{count} 個更多回覆" loading: "討論串載入中⋯" permalink: "永久連çµ" imported_from: "這是一個已從原 %{link} 中分離的主題" in_reply_to: "â–¶ %{username}" replies: - other: '%{count} 個回覆' + other: "%{count} 個回覆" no_mentions_allowed: "抱歉,您無法æåŠå…¶ä»–用戶。" too_many_mentions: - other: 抱歉,您的文章中åªèƒ½æåŠ %{count} ä½ç”¨æˆ¶ã€‚ + other: "抱歉,您的文章中åªèƒ½æåŠ %{count} ä½ç”¨æˆ¶ã€‚" no_mentions_allowed_newuser: "抱歉,新用戶ä¸èƒ½æåŠå…¶ä»–用戶。" too_many_mentions_newuser: - other: 抱歉,新使用者在文章中åªèƒ½æåŠ %{count} ä½ç”¨æˆ¶ã€‚ + other: "抱歉,新使用者在文章中åªèƒ½æåŠ %{count} ä½ç”¨æˆ¶ã€‚" no_images_allowed: "抱歉,新用戶ä¸èƒ½åœ¨è²¼æ–‡ä¸­æ”¾ç½®åœ–片。" too_many_images: - other: 抱歉,新使用者åªèƒ½åœ¨æ–‡ç« ä¸­æ”¾ç½® %{count} 張圖片。 + other: "抱歉,新使用者åªèƒ½åœ¨æ–‡ç« ä¸­æ”¾ç½® %{count} 張圖片。" no_attachments_allowed: "抱歉,新用戶ä¸èƒ½åœ¨è²¼æ–‡ä¸­æ”¾ç½®é™„件。" too_many_attachments: - other: 抱歉,新使用者åªèƒ½åœ¨æ–‡ç« ä¸­æ”¾ç½® %{count} 個附件。 + other: "抱歉,新使用者åªèƒ½åœ¨æ–‡ç« ä¸­æ”¾ç½® %{count} 個附件。" no_links_allowed: "抱歉,新用戶ä¸èƒ½åœ¨è²¼æ–‡ä¸­æ”¾ç½®é€£çµã€‚" too_many_links: - other: 抱歉,新使用者åªèƒ½åœ¨æ–‡ç« ä¸­æ”¾ç½® %{count} 個連çµã€‚ + other: "抱歉,新使用者åªèƒ½åœ¨æ–‡ç« ä¸­æ”¾ç½® %{count} 個連çµã€‚" spamming_host: "抱歉,你ä¸èƒ½å¼µè²¼è©²ç¶²ç«™ä¹‹é€£çµã€‚" user_is_suspended: "è¢«åœæ¬Šçš„用戶無法張貼文章。" topic_not_found: "出ç¾å•題。也許這個話題被關閉或刪除。" @@ -211,7 +211,7 @@ zh_TW: trust_level_4: "信任等級 4" education: until_posts: - other: '%{count} 篇文章' + other: "%{count} 篇文章" 'new-topic': | 歡迎來到%{site_name} — **衷心感è¬ä½ åƒèˆ‡è¨Žè«–ï¼** @@ -342,27 +342,6 @@ zh_TW: ä½ å¯èƒ½æƒ³è¦åœ¨ç®¡ç† :wrench: (å³ä¸Šè§’ï¼‰ä¸­é—œé–‰é€™å€‹ä¸»é¡Œï¼Œé€™æ¨£å›žè¦†å°±ä¸æœƒç©å£“在這個通告下。 lounge_welcome: title: "歡迎來到貴賓室" - body: |2 - - æ­å–œï¼ :confetti_ball: - - 如果你看到了這個主題,說明你已經被æå‡è‡³**常è¦**(信任等級3)了。 - - ä½ ç¾åœ¨å¯ä»¥… - - * 編輯任何主題的標題 - * 改變任何主題的分類 - * 讓你的連çµè¨­ç½®ç‚º follow 屬性([自動 nofollow](http://en.wikipedia.org/wiki/Nofollow)é™åˆ¶å·²ç¶“移除) - * 訪å•ä¸€å€‹åªæœ‰ä¿¡ä»»ç­‰ç´š3åŠæ›´é«˜æ‰èƒ½è¦‹åˆ°çš„貴賓室分類 - * 一次標記å³å¯éš±è—åžƒåœ¾ä¿¡æ¯ - - 這裡是[ç›®å‰é”到常è¦çš„用戶列表](/badges/3/regular)。一定è¦ä¾†å•å€‹å¥½ï¼ - - æ„Ÿè¬æˆç‚ºç¤¾ç¾¤çš„é‡è¦ä¸€å“¡ï¼ - - (想瞭解關於信任等級的更多信æ¯ï¼Œ[åƒè¦‹é€™å€‹ä¸»é¡Œ][trust]ã€‚è«‹æ³¨æ„æˆå“¡éœ€è¦åœ¨å°‡ä¾†ä¹Ÿç¶­æŒä¸€å®šçš„鏿“‡æ¢ä»¶çš„æˆå“¡æ‰èƒ½ä¿æŒåœ¨å¸¸è¦ã€‚) - - [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "å°æ–¼åˆ†é¡žï¼š%{category} 的定義" replace_paragraph: "(將第一段話修改æˆä½ çš„æ–°åˆ†é¡žçš„簡述。這段文字將出ç¾åœ¨ç”¨æˆ¶é¸æ“‡åˆ†é¡žçš„åœ°æ–¹ï¼Œæ‰€ä»¥å˜—è©¦ä¿æŒåœ¨ 200 個字元內。 **除éžä½ ç·¨è¼¯äº†é€™æ®µæ–‡å­—æˆ–è€…åœ¨é€™åˆ†é¡žä¸­å‰µå»ºäº†ä¸»é¡Œï¼Œé€™å€‹åˆ†é¡žä¸æœƒå‡ºç¾åœ¨åˆ†é¡žé é¢ä¸­ã€‚**)" @@ -377,8 +356,6 @@ zh_TW: cannot_delete: uncategorized: "ä¸èƒ½åˆªé™¤è©²åˆ†é¡ž" has_subcategories: "ä¸èƒ½åˆªé™¤è©²åˆ†é¡žï¼Œå› ç‚ºå®ƒæœ‰å­åˆ†é¡ž" - topic_exists: - other: ä¸èƒ½åˆªé™¤è©²åˆ†é¡žï¼Œå› ç‚ºå®ƒæœ‰ %{count} 個話題,最è€çš„話題是 %{topic_link} topic_exists_no_oldest: "ä¸èƒ½åˆªé™¤è©²åˆ†é¡žï¼Œå› ç‚ºæœ‰ %{count} 個話題" uncategorized_description: "ä¸éœ€è¦åˆ†é¡žæˆ–者ä¸é©åˆæ”¾åœ¨ç¾åœ¨çš„任何分類中的主題。" trust_levels: @@ -395,60 +372,60 @@ zh_TW: change_failed_explanation: "你嘗試將%{user_name}é™è‡³%{new_trust_level}。然而他們的信任等級已經是%{current_trust_level}。%{user_name}å°‡ä»è™•于%{current_trust_level}——如果你想è¦é™ç´šç”¨æˆ¶ï¼Œå…ˆéŽ–å®šä¿¡ä»»ç­‰ç´šã€‚" rate_limiter: hours: - other: '%{count} å°æ™‚' + other: "%{count} å°æ™‚" minutes: - other: '%{count} 分' + other: "%{count} 分" seconds: - other: '%{count} ç§’' + other: "%{count} ç§’" datetime: distance_in_words: half_a_minute: "< 1分" less_than_x_seconds: - other: < %{count} ç§’é˜ + other: "< %{count} ç§’é˜" x_seconds: - other: '%{count} ç§’' + other: "%{count} ç§’" less_than_x_minutes: - other: < %{count} åˆ†é˜ + other: "< %{count} 分é˜" x_minutes: - other: '%{count} 分é˜' + other: "%{count} 分é˜" about_x_hours: - other: '%{count} å°æ™‚' + other: "%{count} å°æ™‚" x_days: - other: '%{count} 天' + other: "%{count} 天" about_x_months: - other: '%{count} 月' + other: "%{count} 月" x_months: - other: '%{count} 月' + other: "%{count} 月" about_x_years: - other: '%{count} å¹´' + other: "%{count} å¹´" over_x_years: - other: '> %{count} å¹´' + other: "> %{count} å¹´" almost_x_years: - other: '%{count} å¹´' + other: "%{count} å¹´" distance_in_words_verbose: half_a_minute: "剛剛" less_than_x_seconds: - other: å‰›æ‰ + other: "剛æ‰" x_seconds: - other: '%{count} ç§’å‰' + other: "%{count} ç§’å‰" less_than_x_minutes: - other: ä¸åˆ° %{count} 分é˜å‰ + other: "ä¸åˆ° %{count} 分é˜å‰" x_minutes: - other: '%{count} 分é˜å‰' + other: "%{count} 分é˜å‰" about_x_hours: - other: '%{count} å°æ™‚å‰' + other: "%{count} å°æ™‚å‰" x_days: - other: '%{count} 天å‰' + other: "%{count} 天å‰" about_x_months: - other: ç´„ %{count} å€‹æœˆå‰ + other: "ç´„ %{count} 個月å‰" x_months: - other: '%{count} 個月å‰' + other: "%{count} 個月å‰" about_x_years: - other: ç´„ %{count} å¹´å‰ + other: "ç´„ %{count} å¹´å‰" over_x_years: - other: è¶…éŽ %{count} å¹´å‰ + other: "è¶…éŽ %{count} å¹´å‰" almost_x_years: - other: ç´„ %{count} å¹´å‰ + other: "ç´„ %{count} å¹´å‰" password_reset: no_token: "抱歉,密碼修改連çµå·²éŽæœŸã€‚鏿“‡ç™»éŒ„按鈕å†ä½¿ç”¨â€œæˆ‘忘記了密碼â€ç²å¾—一個新連çµã€‚" choose_new: "鏿“‡ä¸€å€‹æ–°å¯†ç¢¼" @@ -512,13 +489,8 @@ zh_TW: title: '讚' description: '給此文章按讚' long_form: '已按讚' - vote: - title: '投票' - description: '投票給此文章' - long_form: '已投票給此文章' user_activity: no_bookmarks: - self: "你沒有收è—帖å­ï¼Œæ”¶è—帖å­èƒ½è®“你之後輕鬆找到他們。" others: "沒有書籤。" no_likes_given: self: "你沒有å°ä»»ä½•文章按讚。" @@ -653,8 +625,6 @@ zh_TW: num_users: "用戶數é‡" top_referred_topics: title: "最常引用的討論話題" - xaxis: "討論話題" - num_clicks: "點擊率" page_view_anon_reqs: title: "匿å" xaxis: "天" @@ -711,7 +681,6 @@ zh_TW: xaxis: "天" yaxis: "總é‡" mobile_visits: - title: "用戶訪å•" xaxis: "天" yaxis: "è¨ªå•æ¬¡æ•¸" dashboard: @@ -731,7 +700,7 @@ zh_TW: failing_emails_warning: '有 %{num_failed_jobs} 個郵件任務失敗。請檢查 app.yml æª”æ¡ˆæ˜¯å¦æ­£ç¢ºé…置了郵件伺æœå™¨ã€‚查看 Sidekiq 中失敗的任務。' subfolder_ends_in_slash: "ä½ çš„å­ç›®éŒ„è¨­ç½®ä¸æ­£ç¢ºï¼›DISCOURSE_RELATIVE_URL_ROOT以斜æ çµå°¾ã€‚" email_polling_errored_recently: - other: 郵件輪詢在éŽåŽ»çš„ 24 å°æ™‚內出ç¾äº† %{count} 個錯誤。看一看日誌尋找詳情。 + other: "郵件輪詢在éŽåŽ»çš„ 24 å°æ™‚內出ç¾äº† %{count} 個錯誤。看一看日誌尋找詳情。" bad_favicon_url: "網站表徵圖無法載入。檢查站點設置中的 favicon_url。" poll_pop3_timeout: "至 POP3 伺æœå™¨çš„連接超時。無法ç²å–進站郵件。請檢查POP3 設置和æœå‹™å•†ã€‚" poll_pop3_auth_error: "至 POP3 伺æœå™¨çš„連接驗證失敗。請檢查POP3 設置。" @@ -824,7 +793,6 @@ zh_TW: post_menu: "確定在文章功能表æ¢åŒ…å«å“ªäº›æ¢ç›®ï¼Œä»¥åŠæŽ’åˆ—é †åºã€‚例如:like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "帖å­èœå–®ä¸­é»˜èªéš±è—的按鈕,點擊çœç•¥è™Ÿå¾Œé¡¯ç¤ºã€‚" share_links: "決定在分享å°è©±æ–¹å¡Šè£¡é¡¯ç¤ºå“ªäº›é …ç›®ã€ä»¥ä»€éº¼é †åºé¡¯ç¤ºã€‚" - track_external_right_clicks: "追蹤外部連çµçš„å³éµé»žæ“Š ( 例如:開啟於ç€è¦½å™¨çš„æ–°é é¢ ),é è¨­æ˜¯é—œé–‰çš„,因為它會é‡å¯«URLs" site_contact_username: "è«–å£‡çµ¦ç”¨æˆ¶è‡ªå‹•ç™¼é€æ¶ˆæ¯æ™‚使用的用戶å;如果留空將使用é è¨­çš„系統賬戶。" send_welcome_message: "給所有用戶發é€å¿«é€Ÿé–‹å§‹æŒ‡å°Žçš„æ¶ˆæ¯" suppress_reply_directly_below: "當帖å­åªæœ‰ä¸€å€‹å›žè¦†æ™‚,ä¸é¡¯ç¤ºå¸–å­çš„回覆數é‡ã€‚" @@ -1019,7 +987,6 @@ zh_TW: reply_by_email_enabled: "啟用通éŽé›»éƒµå›žè¦†ã€‚" reply_by_email_address: "通éŽéƒµä»¶å›žè¦†çš„å›žè¦†åœ°å€æ¨¡æ¿ï¼Œä¾‹å¦‚:%{reply_key}@reply.example.com 或 replies+%{reply_key}@example.com" alternative_reply_by_email_addresses: "通éŽéƒµä»¶å›žè¦†çš„å›žè¦†åœ°å€æ¨¡æ¿ï¼Œä¾‹å¦‚:%{reply_key}@reply.example.com|replies+%{reply_key}@example.com" - disable_emails: "ç¦æ­¢ Discourse 發é€ä»»ä½•郵件" strip_images_from_short_emails: "éƒµä»¶å°æ–¼ 2800 ä½å…ƒçµ„時去除圖片" short_email_length: "短郵件地å€é•·åº¦ï¼ˆä»¥æ¯”特作為單ä½ï¼‰" display_name_on_email_from: "在郵件的來自欄顯示暱稱" @@ -1060,7 +1027,6 @@ zh_TW: delete_user_max_post_age: "ä¸å…è¨±åˆªé™¤é¦–ç™¼è¡¨æ–‡ç« è¶…éŽ (x) 天的用戶" delete_all_posts_max: "通éŽåˆªé™¤æ‰€æœ‰å¸–å­æŒ‰éˆ•å¯ä»¥åˆªé™¤çš„æœ€å¤§å¸–å­æ•¸é‡ã€‚如果用戶有比這更多的帖å­ï¼Œé€™äº›å¸–å­ä¸èƒ½ä¸€æ¬¡æ€§åˆªé™¤ä¸¦ä¸”這個用戶ä¸èƒ½è¢«åˆªé™¤ã€‚" email_editable: "å…許用戶在註冊後改變他們的 EMail" - logout_redirect: "登出後é‡å®šå‘至的地å€ã€‚(如:http://somesite.com/logout)" allow_uploaded_avatars: "å…許用戶上傳自定義個人頭åƒã€‚" allow_animated_avatars: "å…許用戶使用動畫個人頭åƒã€‚警告:更改設置後é‹è¡Œ avatars:refresh 這個 rake 任務。" allow_animated_thumbnails: "為 gif 動畫生æˆå‹•態縮略圖。" @@ -1213,15 +1179,15 @@ zh_TW: not_seen_in_a_month: "æ­¡è¿Žå›žä¾†ï¼æˆ‘們已經好久沒見到你了。這些是你ä¸åœ¨æ™‚的最熱門主題。" merge_posts: edit_reason: - other: '%{username}åˆä½µäº† %{count} 個帖å­' + other: "%{username}åˆä½µäº† %{count} 個帖å­" errors: different_topics: "無法åˆä¸¦ä¸åŒä¸»é¡Œçš„帖å­ã€‚" different_users: "無法åˆä¸¦ä¸åŒç”¨æˆ¶çš„帖å­ã€‚" move_posts: new_topic_moderator_post: - other: '%{count} 個帖å­è¢«åˆ†é›¢åˆ°äº†æ–°ä¸»é¡Œï¼š%{topic_link}' + other: "%{count} 個帖å­è¢«åˆ†é›¢åˆ°äº†æ–°ä¸»é¡Œï¼š%{topic_link}" existing_topic_moderator_post: - other: '%{count} 個帖å­è¢«åˆä½µåˆ°ç¾å­˜ä¸»é¡Œï¼š%{topic_link}' + other: "%{count} 個帖å­è¢«åˆä½µåˆ°ç¾å­˜ä¸»é¡Œï¼š%{topic_link}" change_owner: post_revision_text: "所有權從 %{old_user} 轉移至 %{new_user}" deleted_user: "已經刪除的用戶" @@ -1231,21 +1197,21 @@ zh_TW: closed_enabled: "此討論話題已關閉,ä¸å†æŽ¥å—新的回覆。" closed_disabled: "此討論話題已開放,å¯ä»¥ç™¼è¡¨æ–°çš„回覆。" autoclosed_message_max_posts: - other: 消æ¯ä¸­å›žè¦†å·²ç¶“é”åˆ°ä¸Šé™ %{count},自動鎖定。 + other: "消æ¯ä¸­å›žè¦†å·²ç¶“é”åˆ°ä¸Šé™ %{count},自動鎖定。" autoclosed_topic_max_posts: - other: 主題中回覆已經é”åˆ°ä¸Šé™ %{count},自動關閉。 + other: "主題中回覆已經é”åˆ°ä¸Šé™ %{count},自動關閉。" autoclosed_enabled_days: - other: 該主題在創建%{count}天åŽè‡ªå‹•關閉。ä¸å†å…許添加新回覆。 + other: "該主題在創建%{count}天åŽè‡ªå‹•關閉。ä¸å†å…許添加新回覆。" autoclosed_enabled_hours: - other: 該主題在創建%{count}å°æ™‚後自動關閉。ä¸å†å…許新的回覆。 + other: "該主題在創建%{count}å°æ™‚後自動關閉。ä¸å†å…許新的回覆。" autoclosed_enabled_minutes: - other: 該主題在創建%{count}分é˜å¾Œè‡ªå‹•關閉。ä¸å†å…許新的回覆。 + other: "該主題在創建%{count}分é˜å¾Œè‡ªå‹•關閉。ä¸å†å…許新的回覆。" autoclosed_enabled_lastpost_days: - other: 該主題在最後一個回覆創建後%{count}天åŽè‡ªå‹•關閉。ä¸å†å…許新的回覆。 + other: "該主題在最後一個回覆創建後%{count}天åŽè‡ªå‹•關閉。ä¸å†å…許新的回覆。" autoclosed_enabled_lastpost_hours: - other: 該主題在最後一個回覆創建後%{count}å°æ™‚後自動關閉。ä¸å†å…許添加新回覆。 + other: "該主題在最後一個回覆創建後%{count}å°æ™‚後自動關閉。ä¸å†å…許添加新回覆。" autoclosed_enabled_lastpost_minutes: - other: 本主題在最後一個回覆創建後%{count}分é˜å¾Œè‡ªå‹•鎖定。ä¸å†å…許添加新回覆。 + other: "本主題在最後一個回覆創建後%{count}分é˜å¾Œè‡ªå‹•鎖定。ä¸å†å…許添加新回覆。" autoclosed_disabled: "此討論話題已開放,å¯ä»¥ç™¼è¡¨æ–°çš„回覆。" autoclosed_disabled_lastpost: "本主題ç¾åœ¨é–‹æ”¾äº†ã€‚å¯ä»¥æ·»åŠ æ–°çš„å›žè¦†ã€‚" pinned_enabled: "本主題已置頂,它將始終顯示在它所屬分類的頂部。å¯ç”±ç®¡ç†äººå“¡å°æ‰€æœ‰äººè§£é™¤ç½®é ‚ï¼Œæˆ–è€…ç”±ç”¨æˆ¶è‡ªå·±å–æ¶ˆç½®é ‚。" @@ -1278,7 +1244,6 @@ zh_TW: missing_user_field: "你還沒有填寫完所有用戶字段" already_logged_in: "喔,看起來你正嘗試查看給å¦ä¸€å€‹ç”¨æˆ¶çš„邀請連çµã€‚å¦‚æžœä½ ä¸æ˜¯%{current_user},請退出å†é‡è©¦ã€‚" user: - no_accounts_associated: "ç„¡é—œè¯çš„帳戶" deactivated: "因發é€è‡³â€œ%{email}â€çš„éƒµä»¶è¢«å¤šæ¬¡é€€ä¿¡ï¼Œå–æ¶ˆæ¿€æ´»" deactivated_by_staff: "已由管ç†å“¡æ’¤éŠ·" activated_by_staff: "已由管ç†å“¡å•Ÿå‹•" @@ -1302,7 +1267,7 @@ zh_TW: domain_not_allowed: "網站無效。å…è¨±çš„åŸŸåæœ‰ï¼š%{domains}" flags_reminder: subject_template: - other: '%{count} 個標記需è¦è¢«è™•ç†' + other: "%{count} 個標記需è¦è¢«è™•ç†" unsubscribe_mailer: title: "å–æ¶ˆè¨‚é–± Mailer" subject_template: "確èªä½ ä¸æƒ³è¦æ”¶åˆ°%{site_title}的電å­éƒµä»¶æ›´æ–°" @@ -1356,7 +1321,7 @@ zh_TW: deferred: "感è¬ä½ è®“我們知é“。我們正在調查。" deferred_and_deleted: "感è¬é€šçŸ¥æˆ‘們。我們已經刪除了帖å­ã€‚" temporarily_closed_due_to_flags: - other: 這個話題因為大é‡çš„社群投訴暫時關閉 %{count} å°æ™‚。 + other: "這個話題因為大é‡çš„社群投訴暫時關閉 %{count} å°æ™‚。" system_messages: post_hidden: title: "文章已隱è—" @@ -1546,7 +1511,7 @@ zh_TW: pending_users_reminder: title: "待審用戶æé†’" subject_template: - other: '%{count} 個用戶等待審核' + other: "%{count} 個用戶等待審核" text_body_template: | 有新註冊的用戶在訪å•論壇å‰éœ€è¦è¢«ç¢ºèªï¼ˆæˆ–者拒絶)。 @@ -1578,16 +1543,14 @@ zh_TW: user_notifications: previous_discussion: "之å‰çš„回覆" reached_limit: - other: 注æ„:你é”åˆ°äº†æ¯æ—¥éƒµä»¶é™é¡ï¼ˆ%{count}),到網站看看哪些訊æ¯å¯èƒ½è¢«å»¶é²äº†ã€‚BTW,感è¬ä½ ç¶“ç‡Ÿçš„é€™éº¼ç†±çµ¡ï¼ + other: "注æ„:你é”åˆ°äº†æ¯æ—¥éƒµä»¶é™é¡ï¼ˆ%{count}),到網站看看哪些訊æ¯å¯èƒ½è¢«å»¶é²äº†ã€‚BTW,感è¬ä½ ç¶“營的這麼熱絡ï¼" in_reply_to: "回覆給" unsubscribe: title: "å–æ¶ˆè¨‚é–±" description: "ä¸å†å°é€™äº›éƒµä»¶æ„Ÿèˆˆè¶£ï¼Ÿæ²’å•題ï¼é»žæ“Šä»¥ç«‹å³å–消訂閱:" reply_by_email: "[訪å•主題](%{base_url}%{url})或者發郵件回覆。" - reply_by_email_pm: "[è¨ªå•æ¶ˆæ¯](%{base_url}%{url})或者發郵件回覆。" only_reply_by_email: "發郵件回覆。" visit_link_to_respond: "[訪å•主題](%{base_url}%{url})以回覆。" - visit_link_to_respond_pm: "[訪å•\"ç§è¨Š\"](%{base_url}%{url})以回覆。" posted_by: "ç”± %{username} 張貼於 %{post_date}" invited_to_topic_body: | %{username}邀請你åƒèˆ‡ @@ -1836,7 +1799,6 @@ zh_TW: recent_topics: "最近" see_more: "更多" search_title: "æœå°‹è©²ç¶²é " - search_google: "Google" login_required: welcome_message: | ## [歡迎來到 %{title}](#welcome) @@ -1862,25 +1824,6 @@ zh_TW: flag_reason: sockpuppet: "新用戶創建了主題,而å¦ä¸€å€‹æ–°ç”¨æˆ¶ä»¥åŒä¸€å€‹ IP 在該主題回覆。查看站點設置的 `flag_sockpuppets`。" spam_hosts: "新用戶試圖在多個創建帖å­ä¸­ç™¼éŒ¶éˆæŽ¥åˆ°åŒä¸€å€‹åŸŸå的內容。查看站點設置的 `newuser_spam_host_threshold`。" - email_log: - post_user_deleted: "帖å­çš„用戶已被刪除。" - no_user: "無法找到 ID 為 %{user_id} 的使用者" - anonymous_user: "匿å用戶" - suspended_not_pm: "ä½¿ç”¨è€…å·²è¢«åœæ¬Šï¼Œä¸æ˜¯è¨Šæ¯" - seen_recently: "用戶最近活èº" - post_not_found: "無法找到 ID 為 %{post_id} 的文章" - notification_already_read: "這å°é€šçŸ¥ EMail 已被讀å–" - topic_nil: "post.topic 為空" - post_deleted: "文章已被åšåˆªé™¤" - user_suspended: "ç”¨æˆ¶è¢«åœæ¬Š" - already_read: "此文章用戶已讀" - exceeded_emails_limit: "è¶…éŽ max_emails_per_day_per_user" - exceeded_bounces_limit: "è¶…éŽ bounce_score_threshold" - message_blank: "訊æ¯ç©ºç™½" - message_to_blank: "message.to 為空" - text_part_body_blank: "text_part.body is 為空" - body_blank: "內容空白" - no_echo_mailing_list_mode: "郵件列表通知已å°ç”¨æˆ¶è‡ªå·±çš„帖å­ç¦ç”¨" color_schemes: base_theme_name: "基礎" about: "關於" @@ -2082,70 +2025,40 @@ zh_TW: editor: name: 編輯 description: é¦–æ¬¡ç·¨è¼¯å¸–å­ - long_description: | - 該徽章授予給第一次編輯自己帖å­çš„你。雖然你ä¸èƒ½æ°¸é åœ¨ç·¨è¼¯è‡ªå·±çš„帖å­ï¼Œä½†æ˜¯ç·¨è¼¯ä»–們總是一個好辦法——你å¯ä»¥æ”¹é€²ä½ çš„帖å­ã€ä¿®æ­£å°éŒ¯èª¤ï¼Œæˆ–者是增補你原來沒有寫的內容。編輯能讓你的帖å­è³ªé‡è®Šå¾—æ›´å¥½ï¼ basic_user: name: åˆç´šç”¨æˆ¶ - description: "授予所有常用社群功能" - long_description: | - 該徽章授予給用戶等級é”到 1 çš„æˆå“¡ã€‚感è¬ä½ åœ¨ç¤¾ç¾¤è£¡èŠ±äº†ä¸€äº›æ™‚é–“ä¸¦ä¸”é–²è®€äº†ä¸€äº›å¸–å­ï¼Œçž­è§£äº†æˆ‘們的社群。你的新用戶é™åˆ¶å·²ç¶“è¢«å–æ¶ˆï¼›ä¸¦ä¸”你已經被授予了所有基本的社群權é™ï¼Œå¿…須個人消æ¯ã€æ¨™è¨˜ã€ç¶­åŸºç·¨è¼¯å’Œç™¼ä½ˆå¤šå¼µåœ–片和多個連çµçš„能力。 member: name: æˆå“¡ - description: "授予邀請ã€ç¾¤çµ„消æ¯å’Œæ›´å¤šçš„è´Š" - long_description: | - 該徽章授予給é”到用戶等級 2 的你。感è¬ä½ åœ¨ç¤¾ç¾¤å¾…了幾周,真正èžå…¥åˆ°äº†ç¤¾ç¾¤ä¸­ã€‚ä½ ç¾åœ¨å¯ä»¥åœ¨ä½ çš„ç”¨æˆ¶é æˆ–者主題中邀請他人或者創建群組消æ¯äº†ã€‚æ¯å¤©ä½ ä¹Ÿå¯ä»¥é»žæ›´å¤šæ¬¡è®šäº†ã€‚ regular: name: æ´»èºç”¨æˆ¶ - description: "授予é‡åˆ†é¡žã€é‡å‘½åã€è·Ÿè¹¤é€£çµã€ç¶­åŸºåŠŸèƒ½å’Œæ›´å¤šçš„è´Š" - long_description: | - 該徽章授予給é”到用戶等級 3 的你。感è¬ä½ åœ¨é€™å¹¾å€‹æœˆæŒçºŒåœ°åƒèˆ‡ç¤¾ç¾¤ã€‚ä½ ç¾åœ¨æ˜¯æˆ‘們之中最活èºçš„讀者之一了,你æŒçºŒçš„è²¢ç»æ¥µå¤§åœ°å¹«åŠ©äº†æˆ‘å€‘çš„ç¤¾ç¾¤ã€‚ä½ ç¾åœ¨å¯ä»¥ç¤¾ç¾¤å¾…了幾周,真正èžå…¥åˆ°äº†ç¤¾ç¾¤ä¸­ã€‚ä½ ç¾åœ¨å¯ä»¥é‡æ–°åˆ†é¡žæˆ–者é‡å‘½å主題ã€ä½¿ç”¨èƒ½åŠ›å¼·å¤§çš„åžƒåœ¾æ¨™è¨˜åŠŸèƒ½ä»¥åŠè¨ªå•éš±è—的貴賓分類了。而且æ¯å¤©ä½ å¯ä»¥é»žæ›´å¤šæ¬¡è®šäº†ã€‚ leader: name: 資深 - description: "授予全局編輯ã€å›ºå®šã€éŽ–å®šã€å­˜æª”ã€åˆ†å‰²ã€åˆä½µå’Œæ›´å¤šçš„è´Š" - long_description: | - 該徽章授予給é”到用戶等級 4 的你。你被管ç†äººå“¡é¸ä½œäº†ç¤¾ç¾¤çš„領導力é‡ï¼Œä½ ç”¨ä½ çš„行動和言辭為社群樹立了正é¢çš„形象。你ç¾åœ¨å¯ä»¥ä¿®æ”¹æ‰€æœ‰å¸–å­ï¼Œä½¿ç”¨å¸¸è¦‹çš„版主的主題管ç†åŠŸèƒ½ï¼Œæ¯”å¦‚ç½®é ‚ã€éŽ–å®šã€éš±è—ã€å­˜æª”ã€åˆ†å‰²å’Œåˆä½µåŠŸèƒ½ã€‚ä½ æ¯å¤©å¯ä»¥é»žæ›´å¤šçš„讚了。 welcome: name: 歡迎 description: 得到一個贊 - long_description: | - è©²å¾½ç« æŽˆäºˆçµ¦å¸–å­æ”¶åˆ°äº†ç¬¬ä¸€å€‹è®šçš„æˆå“¡ã€‚æ­å–œï¼Œæœ‰ç¤¾ç¾¤æˆå“¡ç™¼ç¾ä½ ç™¼è¡¨çš„å…§å®¹æœ‰æ„æ€ã€é…·ç‚«æˆ–è€…æœ‰ç”¨ï¼ autobiographer: name: 自傳作者 anniversary: name: 年度紀念日 description: 一年活èºç”¨æˆ¶ï¼Œè‡³å°‘ç™¼äº†ä¸€å€‹å¸–å­ - long_description: | - 該徽章授予給在社群註冊一年並超至少發佈了一個帖å­çš„你。感è¬ä½ çš„æŒçºŒé—œæ³¨å’Œå°æˆ‘們社群的貢ç»ï¼æˆ‘們希望你繼續åƒèˆ‡æˆ‘們的社群。 nice_post: name: ä¸éŒ¯çš„回覆 description: 回覆被讚了 10 次 - long_description: | - 該徽章授予給回覆被讚了 10 次的你。你的回覆給社群æˆå“¡å€‘留下了å°è±¡ï¼Œä¸¦ä¸”ä½ æŽ¨å‹•äº†è¨Žè«–çš„é€²ç¨‹ï¼ good_post: name: 很好的回覆 description: 回覆被讚了 25 次 - long_description: | - 該徽章授予給回覆被讚了 25 æ¬¡çš„ä½ ã€‚ä½ çš„å›žè¦†å¾ˆå‚‘å‡ºï¼Œé€™å€‹è¨Žè«–å°æ¯å€‹äººéƒ½è®Šå¾—更有æ„ç¾©äº†ï¼ great_post: name: 精彩的回覆 description: 回覆被讚了 50 次 - long_description: | - 該徽章授予給回覆被讚了 50 次的你。哇ï¼ä½ çš„回覆很有啟發ã€å¼•經據典ã€ä»¤äººå†·ä¿Šä¸ç¦æˆ–者å分有內涵,整個社群都喜歡它。 nice_topic: name: ä¸éŒ¯çš„主題 description: 主題被讚了 10 次 - long_description: | - 該徽章授予給主題ç²å¾— 10 個讚的你。嗨,你開啟了一個社群æˆå“¡è¦ºå¾—æœ‰æ„æ€çš„è¨Žè«–ï¼ good_topic: name: 很好的主題 description: 主題被讚了 25 次 - long_description: | - 該徽章授予給主題ç²å¾— 25 個讚的你。你開啟了一個有æ„ç¾©çš„ä¸»é¡Œï¼Œæ•´å€‹ç¤¾ç¾¤éƒ½åœ¨ç©æ¥µéŸ¿æ‡‰ï¼Œè€Œä¸”å¤§å®¶å–œæ­¡ä½ çš„ä¸»é¡Œï¼ great_topic: name: 精彩的主題 description: 主題被讚了 50 次 - long_description: | - 該徽章授予給主題ç²å¾— 50 個讚的你。你開啟了一個引人入å‹çš„主題,整個社群都沉浸于討論之中。 nice_share: name: ä¸éŒ¯çš„分享 description: 分享了一個有 25 個ç¨ç«‹è¨ªå•è€…çš„å¸–å­ @@ -2154,14 +2067,9 @@ zh_TW: good_share: name: 很棒的分享 description: 分享了一個有 300 個ç¨ç«‹è¨ªå•è€…çš„å¸–å­ - long_description: | - 該徽章授予給分享連çµçµ¦ 300 個其他訪客的你。幹得漂亮ï¼ä½ æŠŠä¸€å€‹æœ‰æ„æ€çš„討論介紹給了許多新的朋å‹ï¼Œä¸¦ä¸”幫助社群å‰é€²äº†ä¸€æ­¥ã€‚ great_share: name: 精彩的分享 description: 分享了一個有 1000 個ç¨ç«‹è¨ªå•è€…çš„å¸–å­ - long_description: |+ - 該徽章授予給分享連çµçµ¦ 1000 個其他訪客的你。哇ï¼ä½ æŠŠä¸€å€‹æœ‰æ„æ€çš„討論推廣給了廣大的讀者們,並且幫助社群å‰é€²äº†ä¸€å¤§æ­¥ï¼ - first_like: name: 首次贊 description: 已讚éŽäº†ä¸€å€‹å¸–å­ @@ -2170,22 +2078,15 @@ zh_TW: first_flag: name: 首次標記 description: 已標記éŽäº†ä¸€å€‹å¸–å­ - long_description: | - 該徽章授予給第一次標記帖å­çš„ä½ ã€‚æ¨™è¨˜æ˜¯å¹«åŠ©æˆ‘å€‘å¹«åŠ©ç¤¾ç¾¤ä¿æŒå¥åº·ã€åˆå®œçš„工具。如果你注æ„到哪個帖å­éœ€è¦ç‰ˆä¸»çš„æ³¨æ„,ä¸ç”¨åœ¨ä¹Žä»€éº¼åŽŸå› ï¼Œç›´æŽ¥æ¨™è¨˜ã€‚å¦‚æžœä½ æ³¨æ„到別人帖å­è£¡çš„æŸå€‹å•題,你也å¯ç”¨æ¨™è¨˜åŠŸèƒ½ç™¼é€ç§ä¿¡çµ¦è©²æˆå“¡ã€‚如果你發ç¾äº†å•題,:flag_black: 標記å§ï¼ promoter: name: 推廣者 description: 已邀請了 1 個用戶 campaigner: name: 活動家 description: 已邀請了 3 個åˆç´šç”¨æˆ¶ - long_description: |+ - 該徽章授予給邀請了 3 人加入社群的你,你的朋å‹åœ¨ç«™é»žä¸Šåº¦éŽäº†å¾ˆé•·çš„æ™‚間,已經æˆç‚ºäº†åŸºç¤Žç”¨æˆ¶ã€‚æ´»èºçš„社å€éœ€è¦æ–°é®®çš„血液日常åƒèˆ‡ï¼Œä½µç‚ºäº¤æµå¸¶ä¾†å¤šå…ƒè¦–點。 - champion: name: 外交官 description: 已邀請了 5 個æˆå“¡ - long_description: | - 該徽章授予給邀請了 5 人加入社群的你,你的朋å‹åœ¨ç«™é»žä¸Šåº¦éŽäº†å¾ˆé•·çš„æ™‚間,已經æˆç‚ºäº†æˆå“¡ã€‚å“‡ï¼æ„Ÿè¬ä½ å¹«åŠ©ç¤¾ç¾¤æˆé•·ï¼Œç¤¾ç¾¤å› æ­¤è®Šå¾—æ›´å¤šå…ƒäº†ï¼ first_share: name: 首次分享 description: å·²åˆ†äº«äº†ä¸€å€‹å¸–å­ @@ -2199,8 +2100,6 @@ zh_TW: first_quote: name: 首次引用 description: 已引用éŽä¸€å€‹å¸–å­ - long_description: | - 該徽章授予給第一次在回覆中引用帖å­çš„你。在你的回覆中引用之å‰å¸–å­ä¸­çš„相關的段è½å°‡æŠŠä¸»é¡Œé—œè¯åœ¨ä¸€èµ·ä¸¦åˆ‡é¡Œã€‚åªè¦é¸ä¸­åˆ¥çš„帖å­ä¸­çš„任何文字,然後點擊回覆按鈕將å¯ä»¥å¼•用啦。多引用一些å§ï¼ read_guidelines: name: 閲讀指引 reader: @@ -2251,8 +2150,6 @@ zh_TW: crazy_in_love: name: 狂熱 description: 20 å¤©éƒ½è®šéŽ 50 次 - long_description: | - 該徽章授予給 20 å¤©è®šéŽ 50 次的你。哇ï¼ä½ ç‚ºç¤¾ç¾¤æˆå“¡å€‘æ¨¹ç«‹äº†ä¸€å€‹ä»¤äººé¼“èˆžçš„æ¨¡ç¯„ï¼ thank_you: name: 感è¬ä½  description: 有 20 個被讚的帖å­ï¼Œçµ¦å‡ºéŽ 10 個贊 @@ -2266,18 +2163,14 @@ zh_TW: empathetic: name: 感性 description: 有 500 個被讚的帖å­ï¼Œçµ¦å‡ºéŽ 1000 個贊 - long_description: | - 該徽章授予給收到了 500 個贊,且讚éŽåˆ¥äººè‡³å°‘ 1000 次的你。哇ï¼ä½ æ˜¯ä¸€å€‹å¯Œæœ‰åŒæƒ…心且會æ›ä½æ€è€ƒçš„æ¨¡ç¯„。 :two_hearts: first_emoji: name: 首個表情 description: 在文章中使用表情符號 first_mention: name: 首次æåŠ - long_description: 該徽章授予給第一次在帖å­ä¸­@別人的你。æ¯å€‹æåŠéƒ½å°‡é€šçŸ¥å°æ–¹ï¼Œè®“他們知é“你發了貼。輸入 @ æåŠä»»ä½•用戶,如果å¯ä»¥çš„話,也å¯ä»¥æåŠç¾¤çµ„——這是個ç²å¾—他們注æ„的好辦法。 first_onebox: name: 首個連çµé è¦½ description: 張貼éŽå…·é€£çµé è¦½çš„é€£çµ - long_description: 該徽章授予給第一次發表單行連çµçš„你。連çµå°‡è¢«å±•é–‹æˆé€£çµé è¦½ï¼ŒåŒ…還摘è¦ã€æ¨™é¡Œå’Œåœ–片(如果有的話)。 first_reply_by_email: name: 首次郵件回覆 long_description: | @@ -2305,7 +2198,6 @@ zh_TW: button: "註冊" title: "註冊管ç†å“¡è³¬æˆ¶" help: "註冊新賬戶以開始" - no_emails: "ä¸å¹¸çš„æ˜¯ï¼Œåœ¨åš®å°Žä¸­ä½ æ²’有設置管ç†å“¡éƒµä»¶åœ°å€ï¼Œæ‰€ä»¥å®Œå–„é…ç½®å¯èƒ½æœ‰é»žå›°é›£ã€‚" confirm_email: title: "é…置你的郵件" message: "

我們已寄é€äº†ä¸€å°å•Ÿç”¨ä¿¡ä»¶åˆ° %{email},請按照信中的步驟來啟用你的帳號。

如果你沒有收到郵件,請檢查你的 Discourse 郵件設定正確,並檢查你的垃圾郵件收件夾。

" @@ -2405,10 +2297,8 @@ zh_TW: fields: favicon_url: label: "å°è¡¨å¾µåœ–" - description: "ç€è¦½å™¨ä¸­ä½ ç«™é»žé¡¯ç¤ºçš„表徵圖,è¦åœ¨å°å°ºå¯¸çš„æƒ…æ³ä¸‹è¡¨ç¾å‡ºè‰²ï¼Œä¾‹å¦‚ 32px X 32px。" apple_touch_icon_url: label: "大表徵圖" - description: "ç¾ä»£è¨­å‚™ä¸­ä½ ç«™é»žé¡¯ç¤ºçš„表徵圖,è¦åœ¨å¤§ä¸€é»žå°ºå¯¸çš„æƒ…æ³ä¸‹è¡¨ç¾å‡ºè‰²ã€‚推薦的尺寸至少è¦é”到144px X 144px。" homepage: description: "我們推薦在你的主é é¡¯ç¤ºæœ€æ–°ä¸»é¡Œï¼Œä½†è‹¥ä½ å–œæ­¡ä¹Ÿå¯ä»¥é¡¯ç¤ºåˆ†é¡ž ( 一組主題 )。" title: "主é " @@ -2417,8 +2307,6 @@ zh_TW: choices: latest: label: "最新主題" - categories: - label: "分類" emoji: title: "Emoji" description: "你喜歡你的社群使用哪一種 Emoji 樣å¼ï¼Ÿä½ å¯ä»¥åœ¨ç®¡ç†-自定義-Emoji中增加更多的定製 Emoji。" diff --git a/config/locales/transliterate.ar.yml b/config/locales/transliterate.ar.yml new file mode 100644 index 0000000000..4470b59cbc --- /dev/null +++ b/config/locales/transliterate.ar.yml @@ -0,0 +1,61 @@ +# encoding: utf-8 +# +# This file contains transliteration rules for Arabic +# +# To validate this YAML file after you change it, please paste it into +# http://yamllint.com/ + +ar: + i18n: + transliterate: + rule: + Ø¡: e + Ø¢: a + Ø£: a + ؤ: w + Ø¥: i + ئ: "y" + ا: a + ب: b + Ø©: t + ت: t + Ø«: th + ج: j + Ø­: h + Ø®: kh + د: d + ذ: dh + ر: r + ز: z + س: s + Ø´: sh + ص: s + ض: d + Ø·: t + ظ: z + ع: e + غ: gh + Ù€: _ + Ù: f + Ù‚: q + Ùƒ: k + Ù„: l + Ù…: m + Ù†: "n" + Ù‡: h + Ùˆ: w + Ù‰: a + ÙŠ: "y" + َ‎: a + Ù: u + Ù‎: i + Ù : 0 + Ù¡: 1 + Ù¢: 2 + Ù£: 3 + Ù¤: 4 + Ù¥: 5 + Ù¦: 6 + Ù§: 7 + Ù©: 9 + Û¸: 8 diff --git a/config/routes.rb b/config/routes.rb index 1ee17cc3e1..c661b0a727 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ require "sidekiq/web" -require_dependency "scheduler/web" +require "mini_scheduler/web" require_dependency "admin_constraint" require_dependency "staff_constraint" require_dependency "homepage_constraint" @@ -54,6 +54,7 @@ Discourse::Application.routes.draw do get "site/basic-info" => 'site#basic_info' get "site/statistics" => 'site#statistics' + get "site/selectable-avatars" => "site#selectable_avatars" get "srv/status" => "forums#status" @@ -74,6 +75,8 @@ Discourse::Application.routes.draw do end end + get "reports" => "reports#index" + get "reports/bulk" => "reports#bulk" get "reports/:type" => "reports#show" resources :groups, constraints: AdminConstraint.new do @@ -213,11 +216,13 @@ Discourse::Application.routes.draw do get 'themes/:id' => 'themes#index' # They have periods in their URLs often: - get 'site_texts' => 'site_texts#index' - get 'site_texts/:id' => 'site_texts#show', constraints: { id: /[\w.\-\+]+/i } - put 'site_texts/:id.json' => 'site_texts#update', constraints: { id: /[\w.\-\+]+/i } - put 'site_texts/:id' => 'site_texts#update', constraints: { id: /[\w.\-\+]+/i } - delete 'site_texts/:id' => 'site_texts#revert', constraints: { id: /[\w.\-\+]+/i } + get 'site_texts' => 'site_texts#index' + get 'site_texts/:id.json' => 'site_texts#show', constraints: { id: /[\w.\-\+]+/i } + get 'site_texts/:id' => 'site_texts#show', constraints: { id: /[\w.\-\+]+/i } + put 'site_texts/:id.json' => 'site_texts#update', constraints: { id: /[\w.\-\+]+/i } + put 'site_texts/:id' => 'site_texts#update', constraints: { id: /[\w.\-\+]+/i } + delete 'site_texts/:id.json' => 'site_texts#revert', constraints: { id: /[\w.\-\+]+/i } + delete 'site_texts/:id' => 'site_texts#revert', constraints: { id: /[\w.\-\+]+/i } get 'email_templates' => 'email_templates#index' get 'email_templates/(:id)' => 'email_templates#show', constraints: { id: /[0-9a-z_.]+/ } @@ -232,7 +237,10 @@ Discourse::Application.routes.draw do get "version_check" => "versions#show" - get "dashboard-next" => "dashboard_next#index" + get "dashboard" => "dashboard_next#index" + get "dashboard/general" => "dashboard_next#general" + get "dashboard/moderation" => "dashboard_next#moderation" + get "dashboard-old" => "dashboard#index" resources :dashboard, only: [:index] do @@ -285,7 +293,6 @@ Discourse::Application.routes.draw do get "memory_stats" => "diagnostics#memory_stats", constraints: AdminConstraint.new get "dump_heap" => "diagnostics#dump_heap", constraints: AdminConstraint.new - get "dump_statement_cache" => "diagnostics#dump_statement_cache", constraints: AdminConstraint.new end # admin namespace get "email_preferences" => "email#preferences_redirect", :as => "email_preferences_redirect" @@ -322,6 +329,7 @@ Discourse::Application.routes.draw do get "password-reset" => "static#show", id: "password_reset", constraints: { format: /(json|html)/ } get "faq" => "static#show", id: "faq", constraints: { format: /(json|html)/ } get "guidelines" => "static#show", id: "guidelines", as: 'guidelines', constraints: { format: /(json|html)/ } + get "rules" => "static#show", id: "rules", as: 'rules', constraints: { format: /(json|html)/ } get "tos" => "static#show", id: "tos", as: 'tos', constraints: { format: /(json|html)/ } get "privacy" => "static#show", id: "privacy", as: 'privacy', constraints: { format: /(json|html)/ } get "signup" => "static#show", id: "signup", constraints: { format: /(json|html)/ } @@ -343,6 +351,8 @@ Discourse::Application.routes.draw do post "#{root_path}/second_factors" => "users#create_second_factor" put "#{root_path}/second_factor" => "users#update_second_factor" + put "#{root_path}/second_factors_backup" => "users#create_second_factor_backup" + put "#{root_path}/update-activation-email" => "users#update_activation_email" get "#{root_path}/hp" => "users#get_honeypot_value" post "#{root_path}/email-login" => "users#email_login" @@ -398,8 +408,12 @@ Discourse::Application.routes.draw do get "#{root_path}/:username/preferences/username" => "users#preferences", constraints: { username: RouteFormat.username } put "#{root_path}/:username/preferences/username" => "users#username", constraints: { username: RouteFormat.username } get "#{root_path}/:username/preferences/second-factor" => "users#preferences", constraints: { username: RouteFormat.username } + get "#{root_path}/:username/preferences/second-factor-backup" => "users#preferences", constraints: { username: RouteFormat.username } delete "#{root_path}/:username/preferences/user_image" => "users#destroy_user_image", constraints: { username: RouteFormat.username } put "#{root_path}/:username/preferences/avatar/pick" => "users#pick_avatar", constraints: { username: RouteFormat.username } + put "#{root_path}/:username/preferences/avatar/select" => "users#select_avatar", constraints: { username: RouteFormat.username } + post "#{root_path}/:username/preferences/revoke-account" => "users#revoke_account", constraints: { username: RouteFormat.username } + post "#{root_path}/:username/preferences/revoke-auth-token" => "users#revoke_auth_token", constraints: { username: RouteFormat.username } get "#{root_path}/:username/staff-info" => "users#staff_info", constraints: { username: RouteFormat.username } get "#{root_path}/:username/summary" => "users#summary", constraints: { username: RouteFormat.username } get "#{root_path}/:username/invited" => "users#invited", constraints: { username: RouteFormat.username } @@ -450,6 +464,7 @@ Discourse::Application.routes.draw do get "posts" => "posts#latest", id: "latest_posts" get "private-posts" => "posts#latest", id: "private_posts" get "posts/by_number/:topic_id/:post_number" => "posts#by_number" + get "posts/by-date/:topic_id/:date" => "posts#by_date" get "posts/:id/reply-history" => "posts#reply_history" get "posts/:id/reply-ids" => "posts#reply_ids" get "posts/:id/reply-ids/all" => "posts#all_reply_ids" @@ -469,6 +484,7 @@ Discourse::Application.routes.draw do get 'logs' => 'groups#histories' collection do + get "check-name" => 'groups#check_name' get 'custom/new' => 'groups#new', constraints: AdminConstraint.new get "search" => "groups#search" end @@ -614,6 +630,7 @@ Discourse::Application.routes.draw do put "t/:id/convert-topic/:type" => "topics#convert_topic" put "t/:id/publish" => "topics#publish" put "t/:id/shared-draft" => "topics#update_shared_draft" + put "t/:id/reset-bump-date" => "topics#reset_bump_date" put "topics/bulk" put "topics/reset-new" => 'topics#reset_new' post "topics/timings" @@ -675,6 +692,7 @@ Discourse::Application.routes.draw do get "t/:slug/:topic_id/:post_number" => "topics#show", constraints: { topic_id: /\d+/, post_number: /\d+/ } get "t/:slug/:topic_id/last" => "topics#show", post_number: 99999999, constraints: { topic_id: /\d+/ } get "t/:topic_id/posts" => "topics#posts", constraints: { topic_id: /\d+/ }, format: :json + get "t/:topic_id/post_ids" => "topics#post_ids", constraints: { topic_id: /\d+/ }, format: :json get "t/:topic_id/excerpts" => "topics#excerpts", constraints: { topic_id: /\d+/ }, format: :json post "t/:topic_id/timings" => "topics#timings", constraints: { topic_id: /\d+/ } post "t/:topic_id/invite" => "topics#invite", constraints: { topic_id: /\d+/ } @@ -721,6 +739,7 @@ Discourse::Application.routes.draw do get "message-bus/poll" => "message_bus#poll" + resources :drafts, only: [:index] get "draft" => "draft#show" post "draft" => "draft#update" delete "draft" => "draft#destroy" @@ -745,7 +764,8 @@ Discourse::Application.routes.draw do get "robots.txt" => "robots_txt#index" get "robots-builder.json" => "robots_txt#builder" get "offline.html" => "offline#index" - get "manifest.json" => "metadata#manifest", as: :manifest + get "manifest.webmanifest" => "metadata#manifest", as: :manifest + get "manifest.json" => "metadata#manifest" get "opensearch" => "metadata#opensearch", format: :xml scope "/tags" do @@ -797,7 +817,7 @@ Discourse::Application.routes.draw do get "/safe-mode" => "safe_mode#index" post "/safe-mode" => "safe_mode#enter", as: "safe_mode_enter" - get "/themes/assets/:key" => "themes#assets" + get "/themes/assets/:ids" => "themes#assets" if Rails.env == "test" || Rails.env == "development" get "/qunit" => "qunit#index" diff --git a/config/site_settings.yml b/config/site_settings.yml index 6686036b76..153ecac96f 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -8,6 +8,7 @@ # regex - A regex that the value must match. # validator - The name of the class that will be use to validate the value of the setting. # allow_any - For choice settings allow items not specified in the choice list (default true) +# secret - Set to true if input type should be password and value needs to be scrubbed from logs (default false). # enum - The setting has a fixed set of allowed values, and only one can be chosen. # Set to the class name that defines the set. # shadowed_by_global - "Shadow" a site setting with a GlobalSetting. If the GlobalSetting @@ -97,9 +98,6 @@ basic: default: 365 min: 7 max: 10000 - track_external_right_clicks: - client: true - default: false ga_universal_tracking_code: client: true default: '' @@ -118,6 +116,7 @@ basic: client: true refresh: true type: list + list_type: compact default: "latest|new|unread|top|categories" regex: "latest" regex_error: "site_settings.errors.must_include_latest" @@ -178,7 +177,8 @@ basic: category_colors: client: true type: list - default: 'BF1E2E|F1592A|F7941D|9EB83B|3AB54A|12A89D|25AAE2|0E76BD|652D90|92278F|ED207B|8C6238|231F20|808281|B3B5B4|283890' + list_type: compact + default: 'BF1E2E|F1592A|F7941D|9EB83B|3AB54A|12A89D|25AAE2|0E76BD|652D90|92278F|ED207B|8C6238|231F20|808281|B3B5B4|E45735' category_style: client: true default: 'bullet' @@ -191,8 +191,8 @@ basic: enable_mobile_theme: client: true default: true - default_theme_key: - default: '' + default_theme_id: + default: -1 hidden: true relative_date_duration: client: true @@ -271,10 +271,11 @@ login: client: true default: true enable_google_oauth2_logins: - client: true default: false google_oauth2_client_id: '' - google_oauth2_client_secret: '' + google_oauth2_client_secret: + default: '' + secret: true google_oauth2_prompt: default: '' type: list @@ -286,10 +287,8 @@ login: google_oauth2_hd: default: '' enable_yahoo_logins: - client: true default: false enable_twitter_logins: - client: true default: false twitter_consumer_key: default: '' @@ -297,8 +296,8 @@ login: twitter_consumer_secret: default: '' regex: "^[\\w+-]+$" + secret: true enable_instagram_logins: - client: true default: false instagram_consumer_key: default: '' @@ -306,8 +305,8 @@ login: instagram_consumer_secret: default: '' regex: "^[a-z0-9]+$" + secret: true enable_facebook_logins: - client: true default: false facebook_app_id: default: '' @@ -315,8 +314,8 @@ login: facebook_app_secret: default: '' regex: "^[a-f0-9]+$" + secret: true enable_github_logins: - client: true default: false github_client_id: default: '' @@ -324,6 +323,7 @@ login: github_client_secret: default: '' regex: "^[a-f0-9]+$" + secret: true enable_sso: client: true default: false @@ -337,7 +337,9 @@ login: sso_url: default: '' regex: '^https?:\/\/.+[^\/]$' - sso_secret: '' + sso_secret: + default: '' + secret: true sso_overrides_groups: false sso_overrides_bio: false sso_overrides_email: @@ -379,6 +381,7 @@ users: max: 60 reserved_usernames: type: list + list_type: compact default: "admin|moderator|administrator|mod|sys|system|community|info|you|name|username|user|nickname|discourse|discourseorg|discourseforum|support|hp|account-created|password-reset|admin-login|confirm-admin|account-created|activate-account|confirm-email-token|authorize-email" min_password_length: client: true @@ -502,6 +505,7 @@ posting: body_min_entropy: default: 7 locale_default: + ja: 3 zh_CN: 3 zh_TW: 3 min_topic_title_length: @@ -519,12 +523,17 @@ posting: title_min_entropy: default: 10 locale_default: + ja: 3 zh_CN: 3 zh_TW: 3 - allow_uppercase_posts: false + allow_uppercase_posts: + default: false + locale_default: + ja: false title_prettify: default: true locale_default: + ja: false zh_CN: false zh_TW: false title_fancy_entities: true @@ -550,6 +559,7 @@ posting: enable_system_message_replies: default: true enable_personal_email_messages: + hidden: true default: false client: true validator: "EnablePrivateEmailMessagesValidator" @@ -582,9 +592,10 @@ posting: client: true type: list default: 'com|net|org|io|co|tv|ru|cn|us|uk|me|de|fr|fi|gov' + list_type: compact enable_rich_text_paste: client: true - default: false + default: true suppress_reply_directly_below: client: true default: true @@ -605,6 +616,9 @@ posting: newuser_max_replies_per_topic: 3 newuser_max_mentions_per_post: 2 title_max_word_length: 30 + whitelisted_link_domains: + default: '' + type: list newuser_max_links: 2 newuser_max_images: client: true @@ -645,6 +659,7 @@ posting: choices: 'HighlightJs.languages' type: list client: true + list_type: compact delete_old_hidden_posts: true enable_emoji: default: true @@ -658,6 +673,11 @@ posting: enum: 'EmojiSetSiteSetting' enforce_square_emoji: default: true + emoji_autocomplete_min_chars: + client: true + default: 0 + locale_default: + fr: 1 approve_post_count: default: 0 approve_unless_trust_level: @@ -691,6 +711,7 @@ posting: client: true default: '' type: list + list_type: compact max_allowed_message_recipients: default: 30 min: 1 @@ -763,6 +784,7 @@ email: pop3_polling_port: 995 pop3_polling_username: '' pop3_polling_password: '' + pop3_polling_delete_from_server: true log_mail_processing_failures: false incoming_email_prefer_html: true email_in: @@ -771,11 +793,23 @@ email: email_in_min_trust: default: 2 enum: 'TrustLevelSetting' + email_in_spam_header: + type: enum + default: 'none' + choices: + - none + - X-Spam-Flag + - X-Spam-Status email_prefix: '' email_site_title: '' disable_emails: - default: false client: true + type: enum + default: 'no' + choices: + - 'no' + - 'yes' + - 'non-staff' strip_images_from_short_emails: true short_email_length: 2800 display_name_on_email_from: @@ -784,6 +818,9 @@ email: default: true unsubscribe_via_email_footer: default: false + disallow_reply_by_email_after_days: + default: 90 + shadowed_by_global: true delete_email_logs_after_days: default: 90 shadowed_by_global: true @@ -799,12 +836,15 @@ email: default: '' mailgun_api_key: default: '' - regex: '^key-\h{32}$' + regex: '^(key-\h{32}|\h{32}-\h{8}-\h{8})$' bounce_score_threshold: client: true default: 4 min: 1 bounce_score_threshold_deactivate: 30 + bounce_score_erode_on_send: + default: 0.1 + hidden: true soft_bounce_score: default: 1 min: 1 @@ -816,9 +856,11 @@ email: attachment_content_type_blacklist: type: list default: "pkcs7|x-vcard" + list_type: compact attachment_filename_blacklist: type: list default: "smime.p7s|signature.asc|winmail.dat" + list_type: compact enable_forwarded_emails: false always_show_trimmed_content: false private_email: false @@ -826,33 +868,41 @@ email: files: max_image_size_kb: client: true - default: 3072 + default: 4096 max: 102400 max_attachment_size_kb: client: true - default: 3072 + default: 4096 max: 1024000 max_image_megapixels: default: 40 min: 5 max: 150 + max_export_file_size_kb: + hidden: true + default: 50000 + max: 1024000 theme_authorized_extensions: default: 'jpg|jpeg|png|woff|woff2|svg|eot|ttf|otf|gif' type: list + list_type: compact authorized_extensions: client: true default: 'jpg|jpeg|png|gif' refresh: true type: list + list_type: compact authorized_extensions_for_staff: client: true default: '' refresh: true type: list + list_type: compact export_authorized_extensions: hidden: true default: 'gz' type: list + list_type: compact crawl_images: default: true max_image_width: @@ -883,17 +933,29 @@ files: default: false client: true s3_use_iam_profile: false - s3_access_key_id: '' - s3_secret_access_key: '' + s3_access_key_id: + default: '' + secret: true + shadowed_by_global: true + s3_secret_access_key: + default: '' + secret: true + shadowed_by_global: true s3_region: default: 'us-east-1' enum: 'S3RegionSiteSetting' s3_upload_bucket: default: '' regex: '^[a-z0-9\-\/]+$' # can't use '.' when using HTTPS + s3_endpoint: + default: 'https://s3.amazonaws.com' + regex: '^https?:\/\/.+[^\/]$' + shadowed_by_global: true s3_cdn_url: default: '' regex: '^https?:\/\/.+[^\/]$' + s3_force_path_style: + default: false allow_profile_backgrounds: client: true default: true @@ -912,6 +974,7 @@ files: avatar_sizes: default: '20|25|32|45|60|120' type: list + list_type: compact external_system_avatars_enabled: default: true client: true @@ -921,6 +984,12 @@ files: client: true regex: '^((https?:)?\/)?\/.+[^\/]' shadowed_by_global: true + selectable_avatars_enabled: + default: false + client: true + selectable_avatars: + default: '' + type: uploaded_image_list allow_all_attachments_for_group_messages: false png_to_jpg_quality: default: 95 @@ -930,6 +999,11 @@ files: default: true client: true strip_image_metadata: true + min_ratio_to_crop: + type: float + default: 0.45 # 90% of 18:9 + min: 0 + max: 1 trust: default_trust_level: @@ -954,6 +1028,7 @@ trust: default: 1 enum: 'TrustLevelSetting' min_trust_to_send_email_messages: + hidden: true default: 4 enum: 'TrustLevelSetting' min_trust_to_flag_posts: @@ -966,6 +1041,7 @@ trust: default: 0 enum: 'TrustLevelSetting' allow_flagging_staff: true + send_tl1_welcome_message: true tl1_requires_topics_entered: 5 tl1_requires_read_posts: default: 30 @@ -1035,10 +1111,15 @@ security: hidden: true default: 'trident|webkit|gecko|chrome|safari|msie|opera|goanna' type: list + list_type: compact crawler_user_agents: hidden: true default: 'rss|bot|spider|crawler|facebook|archive|wayback|ping|monitor' type: list + list_type: compact + crawler_check_bypass_agents: + hidden: true + default: 'cubot' cors_origins: default: '' type: list @@ -1048,23 +1129,27 @@ security: blacklist_ip_blocks: default: '' type: list + list_type: compact shadowed_by_global: true whitelist_internal_hosts: default: '' type: list allowed_iframes: - default: 'https://www.google.com/maps/embed?|https://www.openstreetmap.org/export/embed.html?|https://calendar.google.com/calendar/embed?' + default: 'https://www.google.com/maps/embed?|https://www.openstreetmap.org/export/embed.html?|https://calendar.google.com/calendar/embed?|https://codepen.io/' type: list client: true whitelisted_crawler_user_agents: type: list default: '' + list_type: compact blacklisted_crawler_user_agents: type: list - default: '' + default: 'mauibot' + list_type: compact slow_down_crawler_user_agents: type: list default: 'bingbot' + list_type: compact slow_down_crawler_rate: 60 onebox: @@ -1077,12 +1162,14 @@ onebox: onebox_domains_blacklist: default: '' type: list + list_type: compact max_oneboxes_per_post: default: 50 client: true inline_onebox_domains_whitelist: default: '' type: list + list_type: compact enable_inline_onebox_on_all_domains: default: false @@ -1158,6 +1245,12 @@ rate_limits: max_logins_per_ip_per_minute: min: 1 default: 6 + max_post_deletions_per_minute: + min: 1 + default: 2 + max_post_deletions_per_day: + min: 1 + default: 10 developer: force_hostname: @@ -1338,6 +1431,9 @@ search: search_query_log_max_size: default: 1000000 max: 1000000 + search_query_log_max_retention_days: + default: 365 # 1 year + max: 1825 # 5 years uncategorized: version_checks: @@ -1351,6 +1447,10 @@ uncategorized: client: true default: true + header_dropdown_category_count: + client: true + default: 8 + slug_generation_method: default: 'ascii' enum: 'SlugSetting' @@ -1571,6 +1671,8 @@ user_preferences: api: retain_web_hook_events_period_days: default: 30 + retry_web_hook_events: + default: false user_api: allow_user_api_keys: @@ -1593,6 +1695,8 @@ user_api: allowed_user_api_auth_redirects: default: 'https://api.discourse.org/api/auth_redirect|discourse://auth_redirect' type: list + expire_user_api_keys_days: + default: 180 tags: tagging_enabled: @@ -1615,11 +1719,11 @@ tags: default: 20 client: true min_trust_to_create_tag: - default: 3 - enum: 'TrustLevelSetting' + default: '3' + enum: 'TrustLevelAndStaffSetting' min_trust_level_to_tag_topics: - default: 0 - enum: 'TrustLevelSetting' + default: '0' + enum: 'TrustLevelAndStaffSetting' client: true max_tag_search_results: client: true diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb index 3faf9f584b..9944a17d0e 100644 --- a/config/unicorn.conf.rb +++ b/config/unicorn.conf.rb @@ -5,9 +5,6 @@ if ENV["LOGSTASH_UNICORN_URI"] logger DiscourseLogstashLogger.logger(uri: ENV['LOGSTASH_UNICORN_URI'], type: :unicorn) end -# enable out of band gc out of the box, it is low risk and improves perf a lot -ENV['UNICORN_ENABLE_OOBGC'] ||= "1" - discourse_path = File.expand_path(File.expand_path(File.dirname(__FILE__)) + "/../") # tune down if not enough ram @@ -18,17 +15,26 @@ working_directory discourse_path # listen "#{discourse_path}/tmp/sockets/unicorn.sock" listen (ENV["UNICORN_PORT"] || 3000).to_i -# nuke workers after 30 seconds instead of 60 seconds (the default) -timeout 30 +if !File.exist?("#{discourse_path}/tmp/pids") + FileUtils.mkdir_p("#{discourse_path}/tmp/pids") +end # feel free to point this anywhere accessible on the filesystem pid (ENV["UNICORN_PID_PATH"] || "#{discourse_path}/tmp/pids/unicorn.pid") -# By default, the Unicorn logger will write to stderr. -# Additionally, some applications/frameworks log to stderr or stdout, -# so prevent them from going to /dev/null when daemonized here: -stderr_path "#{discourse_path}/log/unicorn.stderr.log" -stdout_path "#{discourse_path}/log/unicorn.stdout.log" +if ENV["RAILS_ENV"] == "development" || !ENV["RAILS_ENV"] + logger Logger.new($stdout) + # we want a longer timeout in dev cause first request can be really slow + timeout (ENV["UNICORN_TIMEOUT"] && ENV["UNICORN_TIMEOUT"].to_i || 60) +else + # By default, the Unicorn logger will write to stderr. + # Additionally, some applications/frameworks log to stderr or stdout, + # so prevent them from going to /dev/null when daemonized here: + stderr_path "#{discourse_path}/log/unicorn.stderr.log" + stdout_path "#{discourse_path}/log/unicorn.stdout.log" + # nuke workers after 30 seconds instead of 60 seconds (the default) + timeout 30 +end # important for Ruby 2.0 preload_app true @@ -118,16 +124,11 @@ before_fork do |server, worker| puts "Starting up #{sidekiqs} supervised sidekiqs" require 'demon/sidekiq' - if @stats_socket_dir - Demon::Sidekiq.after_fork do - start_stats_socket(server) - DiscourseEvent.trigger(:sidekiq_fork_started) - end - else - Demon::Sidekiq.after_fork do - DiscourseEvent.trigger(:sidekiq_fork_started) - end + Demon::Sidekiq.after_fork do + start_stats_socket(server) if @stats_socket_dir + DiscourseEvent.trigger(:sidekiq_fork_started) end + Demon::Sidekiq.start(sidekiqs) Signal.trap("SIGTSTP") do @@ -210,10 +211,6 @@ before_fork do |server, worker| end - RailsMultisite::ConnectionManagement.each_connection do - ActiveRecord::Base.connection_pool.disconnect! - end - $redis._client.disconnect # Throttle the master from forking too quickly by sleeping. Due diff --git a/db/fixtures/000_delayed_drops.rb b/db/fixtures/000_delayed_drops.rb new file mode 100644 index 0000000000..a46bfed42e --- /dev/null +++ b/db/fixtures/000_delayed_drops.rb @@ -0,0 +1,226 @@ +# Delayed migration steps + +require 'migration/table_dropper' +require 'migration/column_dropper' +require 'badge_posts_view_manager' + +Migration::ColumnDropper.drop( + table: 'user_profiles', + after_migration: 'DropUserCardBadgeColumns', + columns: ['card_image_badge_id'], + on_drop: ->() { + STDERR.puts "Removing user_profiles column card_image_badge_id" + }, + delay: 3600 +) + +Migration::ColumnDropper.drop( + table: 'categories', + after_migration: 'AddSuppressFromLatestToCategories', + columns: ['logo_url', 'background_url', 'suppress_from_homepage'], + on_drop: ->() { + STDERR.puts 'Removing superflous categories columns!' + } +) + +Migration::ColumnDropper.drop( + table: 'groups', + after_migration: 'SplitAliasLevels', + columns: %w[visible public alias_level], + on_drop: ->() { + STDERR.puts 'Removing superflous visible group column!' + } +) + +Migration::ColumnDropper.drop( + table: 'theme_fields', + after_migration: 'AddUploadIdToThemeFields', + columns: ['target'], + on_drop: ->() { + STDERR.puts 'Removing superflous theme_fields target column!' + } +) + +Migration::ColumnDropper.drop( + table: 'user_stats', + after_migration: 'DropUnreadTrackingColumns', + columns: %w{ + first_topic_unread_at + }, + on_drop: ->() { + STDERR.puts "Removing superflous user stats columns!" + DB.exec "DROP FUNCTION IF EXISTS first_unread_topic_for(int)" + } +) + +Migration::ColumnDropper.drop( + table: 'topics', + after_migration: 'DropVoteCountFromTopicsAndPosts', + columns: %w{ + auto_close_at + auto_close_user_id + auto_close_started_at + auto_close_based_on_last_post + auto_close_hours + inappropriate_count + bookmark_count + off_topic_count + illegal_count + notify_user_count + last_unread_at + vote_count + }, + on_drop: ->() { + STDERR.puts "Removing superflous topic columns!" + } +) + +Migration::ColumnDropper.drop( + table: 'posts', + after_migration: 'DropVoteCountFromTopicsAndPosts', + columns: %w{ + vote_count + }, + on_drop: ->() { + STDERR.puts "Removing superflous post columns!" + BadgePostsViewManager.drop! + }, + after_drop: -> () { + BadgePostsViewManager.create! + } +) + +Migration::ColumnDropper.drop( + table: 'users', + after_migration: 'DropEmailFromUsers', + columns: %w[ + email + email_always + mailing_list_mode + email_digests + email_direct + email_private_messages + external_links_in_new_tab + enable_quoting + dynamic_favicon + disable_jump_reply + edit_history_public + automatically_unpin_topics + digest_after_days + auto_track_topics_after_msecs + new_topic_duration_minutes + last_redirected_to_top_at + auth_token + auth_token_updated_at + ], + on_drop: ->() { + STDERR.puts 'Removing superflous users columns!' + } +) + +Migration::ColumnDropper.drop( + table: 'users', + after_migration: 'RenameBlockedSilence', + columns: %w[ + blocked + ], + on_drop: ->() { + STDERR.puts 'Removing user blocked column!' + } +) + +Migration::ColumnDropper.drop( + table: 'users', + after_migration: 'AddSilencedTillToUsers', + columns: %w[ + silenced + ], + on_drop: ->() { + STDERR.puts 'Removing user silenced column!' + } +) + +Migration::ColumnDropper.drop( + table: 'users', + after_migration: 'AddTrustLevelLocksToUsers', + columns: %w[ + trust_level_locked + ], + on_drop: ->() { + STDERR.puts 'Removing user trust_level_locked!' + } +) + +Migration::ColumnDropper.drop( + table: 'user_auth_tokens', + after_migration: 'RemoveLegacyAuthToken', + columns: %w[ + legacy + ], + on_drop: ->() { + STDERR.puts 'Removing user_auth_token legacy column!' + } +) + +Migration::TableDropper.delayed_rename( + old_name: 'topic_status_updates', + new_name: 'topic_timers', + after_migration: 'RenameTopicStatusUpdatesToTopicTimers', + on_drop: ->() { + STDERR.puts "Dropping topic_status_updates. It was moved to topic_timers." + } +) + +Migration::TableDropper.delayed_drop( + table_name: 'category_featured_users', + after_migration: 'DropUnusedTables', + on_drop: ->() { + STDERR.puts "Dropping category_featured_users. It isn't used anymore." + } +) + +Migration::TableDropper.delayed_drop( + table_name: 'versions', + after_migration: 'DropUnusedTables', + on_drop: ->() { + STDERR.puts "Dropping versions. It isn't used anymore." + } +) + +Migration::ColumnDropper.drop( + table: 'user_options', + after_migration: 'DropKeyColumnFromThemes', + columns: %w[ + theme_key + ], + on_drop: ->() { + STDERR.puts 'Removing theme_key column from user_options table!' + } +) + +Migration::ColumnDropper.drop( + table: 'themes', + after_migration: 'DropKeyColumnFromThemes', + columns: %w[ + key + ], + on_drop: ->() { + STDERR.puts 'Removing key column from themes table!' + } +) + +Migration::ColumnDropper.drop( + table: 'email_logs', + after_migration: 'DropReplyKeySkippedSkippedReasonFromEmailLogs', + columns: %w{ + topic_id + reply_key + skipped + skipped_reason + }, + on_drop: ->() { + STDERR.puts "Removing superflous email_logs columns!" + } +) + +Discourse.reset_active_record_cache diff --git a/db/fixtures/001_categories.rb b/db/fixtures/001_categories.rb index f21181180e..397b7f3201 100644 --- a/db/fixtures/001_categories.rb +++ b/db/fixtures/001_categories.rb @@ -10,27 +10,18 @@ uncat_id = -1 unless Numeric === uncat_id if uncat_id == -1 || !Category.exists?(uncat_id) puts "Seeding uncategorized category!" - result = Category.exec_sql "SELECT 1 FROM categories WHERE lower(name) = 'uncategorized'" + count = DB.exec "SELECT 1 FROM categories WHERE lower(name) = 'uncategorized'" name = 'Uncategorized' - name << SecureRandom.hex if result.count > 0 + name << SecureRandom.hex if count > 0 - result = Category.exec_sql "INSERT INTO categories + result = DB.query_single "INSERT INTO categories (name,color,slug,description,text_color, user_id, created_at, updated_at, position, name_lower) - VALUES ('#{name}', 'AB9364', 'uncategorized', '', 'FFFFFF', -1, now(), now(), 1, '#{name.downcase}' ) + VALUES ('#{name}', '0088CC', 'uncategorized', '', 'FFFFFF', -1, now(), now(), 1, '#{name.downcase}' ) RETURNING id " - category_id = result[0]["id"].to_i + category_id = result.first.to_i - Category.exec_sql "DELETE FROM site_settings where name = 'uncategorized_category_id'" - Category.exec_sql "INSERT INTO site_settings(name, data_type, value, created_at, updated_at) + DB.exec "DELETE FROM site_settings where name = 'uncategorized_category_id'" + DB.exec "INSERT INTO site_settings(name, data_type, value, created_at, updated_at) VALUES ('uncategorized_category_id', 3, #{category_id}, now(), now())" end - -Migration::ColumnDropper.drop( - table: 'categories', - after_migration: 'AddSuppressFromLatestToCategories', - columns: ['logo_url', 'background_url', 'suppress_from_homepage'], - on_drop: ->() { - STDERR.puts 'Removing superflous categories columns!' - } -) diff --git a/db/fixtures/002_groups.rb b/db/fixtures/002_groups.rb index cbf32466c3..319bb30797 100644 --- a/db/fixtures/002_groups.rb +++ b/db/fixtures/002_groups.rb @@ -4,12 +4,3 @@ if g = Group.find_by(name: 'trust_level_5', id: 15) end Group.where(name: 'everyone').update_all(visibility_level: Group.visibility_levels[:owners]) - -Migration::ColumnDropper.drop( - table: 'groups', - after_migration: 'SplitAliasLevels', - columns: %w[visible public alias_level], - on_drop: ->() { - STDERR.puts 'Removing superflous visible group column!' - } -) diff --git a/db/fixtures/003_post_action_types.rb b/db/fixtures/003_post_action_types.rb index a9cafe763f..f0094764fa 100644 --- a/db/fixtures/003_post_action_types.rb +++ b/db/fixtures/003_post_action_types.rb @@ -27,13 +27,6 @@ PostActionType.seed do |s| s.position = 4 end -PostActionType.seed do |s| - s.id = PostActionType.types[:vote] - s.name_key = 'vote' - s.is_flag = false - s.position = 5 -end - PostActionType.seed do |s| s.id = PostActionType.types[:spam] s.name_key = 'spam' diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb index 18022ab451..eae24fec16 100644 --- a/db/fixtures/006_badges.rb +++ b/db/fixtures/006_badges.rb @@ -31,7 +31,7 @@ BadgeGrouping.seed do |g| end # BUGFIX -Badge.exec_sql <<-SQL.squish +DB.exec <<-SQL.squish UPDATE badges SET badge_grouping_id = -1 WHERE NOT EXISTS ( diff --git a/db/fixtures/007_web_hook_event_types.rb b/db/fixtures/007_web_hook_event_types.rb index 8aa0859160..7e94839fd4 100644 --- a/db/fixtures/007_web_hook_event_types.rb +++ b/db/fixtures/007_web_hook_event_types.rb @@ -32,3 +32,8 @@ WebHookEventType.seed do |b| b.id = WebHookEventType::FLAG b.name = "flag" end + +WebHookEventType.seed do |b| + b.id = WebHookEventType::QUEUED_POST + b.name = "queued_post" +end diff --git a/db/fixtures/009_users.rb b/db/fixtures/009_users.rb index fb6f6ee5ba..a2ca6f7dda 100644 --- a/db/fixtures/009_users.rb +++ b/db/fixtures/009_users.rb @@ -33,78 +33,6 @@ UserOption.where(user_id: -1).update_all( Group.user_trust_level_change!(-1, TrustLevel[4]) -Migration::ColumnDropper.drop( - table: 'users', - after_migration: 'DropEmailFromUsers', - columns: %w[ - email - email_always - mailing_list_mode - email_digests - email_direct - email_private_messages - external_links_in_new_tab - enable_quoting - dynamic_favicon - disable_jump_reply - edit_history_public - automatically_unpin_topics - digest_after_days - auto_track_topics_after_msecs - new_topic_duration_minutes - last_redirected_to_top_at - auth_token - auth_token_updated_at - ], - on_drop: ->() { - STDERR.puts 'Removing superflous users columns!' - } -) - -Migration::ColumnDropper.drop( - table: 'users', - after_migration: 'RenameBlockedSilence', - columns: %w[ - blocked - ], - on_drop: ->() { - STDERR.puts 'Removing user blocked column!' - } -) - -Migration::ColumnDropper.drop( - table: 'users', - after_migration: 'AddSilencedTillToUsers', - columns: %w[ - silenced - ], - on_drop: ->() { - STDERR.puts 'Removing user silenced column!' - } -) - -Migration::ColumnDropper.drop( - table: 'users', - after_migration: 'AddTrustLevelLocksToUsers', - columns: %w[ - trust_level_locked - ], - on_drop: ->() { - STDERR.puts 'Removing user trust_level_locked!' - } -) - -Migration::ColumnDropper.drop( - table: 'user_auth_tokens', - after_migration: 'RemoveLegacyAuthToken', - columns: %w[ - legacy - ], - on_drop: ->() { - STDERR.puts 'Removing user_auth_token legacy column!' - } -) - # User for the smoke tests if ENV["SMOKE"] == "1" UserEmail.seed do |ue| diff --git a/db/fixtures/500_lounge_category.rb b/db/fixtures/500_lounge_category.rb index 5fa93ddb1e..2aa42f21cc 100644 --- a/db/fixtures/500_lounge_category.rb +++ b/db/fixtures/500_lounge_category.rb @@ -36,7 +36,7 @@ unless Rails.env.test? end # Reset topic count because we don't count the description topic - Category.exec_sql "UPDATE categories SET topic_count = 0 WHERE id = #{lounge.id}" + DB.exec "UPDATE categories SET topic_count = 0 WHERE id = #{lounge.id}" end end end diff --git a/db/fixtures/501_meta_category.rb b/db/fixtures/501_meta_category.rb index 38ed96aaea..38f89856bb 100644 --- a/db/fixtures/501_meta_category.rb +++ b/db/fixtures/501_meta_category.rb @@ -25,7 +25,7 @@ unless Rails.env.test? end # Reset topic count because we don't count the description topic - Category.exec_sql "UPDATE categories SET topic_count = 0 WHERE id = #{meta.id}" + DB.exec "UPDATE categories SET topic_count = 0 WHERE id = #{meta.id}" end end end diff --git a/db/fixtures/502_staff_category.rb b/db/fixtures/502_staff_category.rb index 54faa6385b..18b5c54337 100644 --- a/db/fixtures/502_staff_category.rb +++ b/db/fixtures/502_staff_category.rb @@ -33,7 +33,7 @@ unless Rails.env.test? end # Reset topic count because we don't count the description topic - Category.exec_sql "UPDATE categories SET topic_count = 0 WHERE id = #{staff.id}" + DB.exec "UPDATE categories SET topic_count = 0 WHERE id = #{staff.id}" end end end diff --git a/db/fixtures/600_themes.rb b/db/fixtures/600_themes.rb index 84694a5ec0..be8ee222a8 100644 --- a/db/fixtures/600_themes.rb +++ b/db/fixtures/600_themes.rb @@ -2,9 +2,9 @@ if !Theme.exists? STDERR.puts "> Seeding dark and light themes" - name = I18n.t("wizard.step.colors.fields.theme_id.choices.dark.label") - dark_scheme = ColorScheme.find_by(base_scheme_id: "dark") - dark_scheme ||= ColorScheme.create_from_base(name: name, via_wizard: true, base_scheme_id: "dark") + name = I18n.t("color_schemes.dark_theme_name") + dark_scheme = ColorScheme.find_by(base_scheme_id: "Dark") + dark_scheme ||= ColorScheme.create_from_base(name: name, via_wizard: true, base_scheme_id: "Dark") name = I18n.t('color_schemes.dark_theme_name') _dark_theme = Theme.create(name: name, user_id: -1, @@ -17,12 +17,3 @@ if !Theme.exists? default_theme.set_default! end - -Migration::ColumnDropper.drop( - table: 'theme_fields', - after_migration: 'AddUploadIdToThemeFields', - columns: ['target'], - on_drop: ->() { - STDERR.puts 'Removing superflous theme_fields target column!' - } -) diff --git a/db/fixtures/999_settings.rb b/db/fixtures/990_settings.rb similarity index 100% rename from db/fixtures/999_settings.rb rename to db/fixtures/990_settings.rb diff --git a/db/fixtures/999_topics.rb b/db/fixtures/990_topics.rb similarity index 76% rename from db/fixtures/999_topics.rb rename to db/fixtures/990_topics.rb index 78ee61a92d..45bb8d4299 100644 --- a/db/fixtures/999_topics.rb +++ b/db/fixtures/990_topics.rb @@ -42,6 +42,7 @@ if seed_welcome_topics post = PostCreator.create(Discourse.system_user, raw: I18n.t('discourse_welcome_topic.body'), title: I18n.t('discourse_welcome_topic.title'), skip_validations: true) post.topic.update_pinned(true, true) + TopicCustomField.create(topic_id: post.topic.id, name: "is_welcome_topic", value: "true") lounge = Category.find_by(id: SiteSetting.lounge_category_id) if lounge @@ -61,49 +62,3 @@ if seed_welcome_topics skip_validations: true, category: staff ? staff.name : nil) end - -# run this later, cause we need to make sure new application controller resilience is in place first - -Migration::ColumnDropper.drop( - table: 'user_stats', - after_migration: 'DropUnreadTrackingColumns', - columns: %w{ - first_topic_unread_at - }, - on_drop: ->() { - STDERR.puts "Removing superflous user stats columns!" - ActiveRecord::Base.exec_sql "DROP FUNCTION IF EXISTS first_unread_topic_for(int)" - } -) - -Migration::ColumnDropper.drop( - table: 'topics', - after_migration: 'DropUnreadTrackingColumns', - columns: %w{ - inappropriate_count - bookmark_count - off_topic_count - illegal_count - notify_user_count - last_unread_at - }, - on_drop: ->() { - STDERR.puts "Removing superflous topic columns!" - } -) - -Migration::ColumnDropper.drop( - table: 'topics', - after_migration: 'RemoveAutoCloseColumnsFromTopics', - columns: %w{ - auto_close_at - auto_close_user_id - auto_close_started_at - auto_close_based_on_last_post - auto_close_hours - }, - on_drop: ->() { - STDERR.puts "Removing superflous topic columns!" - }, - delay: 3600 -) diff --git a/db/fixtures/999_delayed.rb b/db/fixtures/999_delayed.rb deleted file mode 100644 index 00f440f379..0000000000 --- a/db/fixtures/999_delayed.rb +++ /dev/null @@ -1,38 +0,0 @@ -# Delayed migration steps - -require 'migration/table_dropper' - -Migration::TableDropper.delayed_rename( - old_name: 'topic_status_updates', - new_name: 'topic_timers', - after_migration: 'RenameTopicStatusUpdatesToTopicTimers', - on_drop: ->() { - STDERR.puts "Dropping topic_status_updates. It was moved to topic_timers." - } -) - -Migration::TableDropper.delayed_drop( - table_name: 'category_featured_users', - after_migration: 'DropUnusedTables', - on_drop: ->() { - STDERR.puts "Dropping category_featured_users. It isn't used anymore." - } -) - -Migration::TableDropper.delayed_drop( - table_name: 'versions', - after_migration: 'DropUnusedTables', - on_drop: ->() { - STDERR.puts "Dropping versions. It isn't used anymore." - } -) - -Migration::ColumnDropper.drop( - table: 'user_profiles', - after_migration: 'DropUserCardBadgeColumns', - columns: ['card_image_badge_id'], - on_drop: ->() { - STDERR.puts "Removing user_profiles column card_image_badge_id" - }, - delay: 3600 -) diff --git a/db/migrate/20120712150500_create_categories.rb b/db/migrate/20120712150500_create_categories.rb index 90adb73d10..329afb22bc 100644 --- a/db/migrate/20120712150500_create_categories.rb +++ b/db/migrate/20120712150500_create_categories.rb @@ -2,7 +2,7 @@ class CreateCategories < ActiveRecord::Migration[4.2] def up create_table :categories do |t| t.string :name, limit: 50, null: false - t.string :color, limit: 6, null: false, default: 'AB9364' + t.string :color, limit: 6, null: false, default: '0088CC' t.integer :forum_thread_id, null: true t.integer :top1_forum_thread_id, null: true t.integer :top2_forum_thread_id, null: true diff --git a/db/migrate/20120816205538_add_starred_at_to_forum_thread_user.rb b/db/migrate/20120816205538_add_starred_at_to_forum_thread_user.rb index 2fc02d4287..c2643594d4 100644 --- a/db/migrate/20120816205538_add_starred_at_to_forum_thread_user.rb +++ b/db/migrate/20120816205538_add_starred_at_to_forum_thread_user.rb @@ -1,7 +1,7 @@ class AddStarredAtToForumThreadUser < ActiveRecord::Migration[4.2] def up add_column :forum_thread_users, :starred_at, :datetime - User.exec_sql 'update forum_thread_users f set starred_at = COALESCE(created_at, ?) + DB.exec 'update forum_thread_users f set starred_at = COALESCE(created_at, ?) from ( select f1.forum_thread_id, f1.user_id, t.created_at from forum_thread_users f1 diff --git a/db/migrate/20120928170023_add_sort_order_to_posts.rb b/db/migrate/20120928170023_add_sort_order_to_posts.rb index 6a0bf192ad..3965dc4a3a 100644 --- a/db/migrate/20120928170023_add_sort_order_to_posts.rb +++ b/db/migrate/20120928170023_add_sort_order_to_posts.rb @@ -3,11 +3,5 @@ class AddSortOrderToPosts < ActiveRecord::Migration[4.2] add_column :posts, :sort_order, :integer remove_index :posts, :user_id execute "UPDATE posts AS p SET sort_order = post_number FROM forum_threads AS ft WHERE ft.id = p.forum_thread_id AND ft.archetype_id = 1" - execute "UPDATE posts AS p SET sort_order = - CASE WHEN post_number = 1 THEN 1 - ELSE 2147483647 - p.vote_count - END - FROM forum_threads AS ft - WHERE ft.id = p.forum_thread_id AND ft.archetype_id = 2" end end diff --git a/db/migrate/20121113200844_bio_markdown_support.rb b/db/migrate/20121113200844_bio_markdown_support.rb index 1737b65449..6ccd73d023 100644 --- a/db/migrate/20121113200844_bio_markdown_support.rb +++ b/db/migrate/20121113200844_bio_markdown_support.rb @@ -2,12 +2,6 @@ class BioMarkdownSupport < ActiveRecord::Migration[4.2] def up rename_column :users, :bio, :bio_raw add_column :users, :bio_cooked, :text, null: true - - User.where("bio_raw is NOT NULL").each do |u| - u.send(:cook) - u.save - end - end def down diff --git a/db/migrate/20121123054127_make_post_number_distinct.rb b/db/migrate/20121123054127_make_post_number_distinct.rb index 695ac7392c..259cdbb915 100644 --- a/db/migrate/20121123054127_make_post_number_distinct.rb +++ b/db/migrate/20121123054127_make_post_number_distinct.rb @@ -1,7 +1,7 @@ class MakePostNumberDistinct < ActiveRecord::Migration[4.2] def up - Topic.exec_sql('update posts p + DB.exec('update posts p set post_number = calc from ( diff --git a/db/migrate/20131022045114_add_uncategorized_category.rb b/db/migrate/20131022045114_add_uncategorized_category.rb index 4055fefb05..21c3c74c98 100644 --- a/db/migrate/20131022045114_add_uncategorized_category.rb +++ b/db/migrate/20131022045114_add_uncategorized_category.rb @@ -9,7 +9,7 @@ class AddUncategorizedCategory < ActiveRecord::Migration[4.2] result = execute "INSERT INTO categories (name,color,slug,description,text_color, user_id, created_at, updated_at, position) - VALUES ('#{name}', 'AB9364', 'uncategorized', '', 'FFFFFF', -1, now(), now(), 0 ) + VALUES ('#{name}', '0088CC', 'uncategorized', '', 'FFFFFF', -1, now(), now(), 0 ) RETURNING id " category_id = result[0]["id"].to_i diff --git a/db/migrate/20140120155706_add_lounge_category.rb b/db/migrate/20140120155706_add_lounge_category.rb index 0dac6e7b29..fea475a7d3 100644 --- a/db/migrate/20140120155706_add_lounge_category.rb +++ b/db/migrate/20140120155706_add_lounge_category.rb @@ -3,25 +3,25 @@ class AddLoungeCategory < ActiveRecord::Migration[4.2] return if Rails.env.test? I18n.overrides_disabled do - result = Category.exec_sql "SELECT 1 FROM site_settings where name = 'lounge_category_id'" - if result.count == 0 + result = DB.exec "SELECT 1 FROM site_settings where name = 'lounge_category_id'" + if result == 0 description = I18n.t('vip_category_description') default_name = I18n.t('vip_category_name') - name = if Category.exec_sql("SELECT 1 FROM categories where name = '#{default_name}'").count == 0 + name = if DB.exec("SELECT 1 FROM categories where name = '#{default_name}'") == 0 default_name else "CHANGE_ME" end - result = Category.exec_sql "INSERT INTO categories + result = DB.query_single "INSERT INTO categories (name, color, text_color, created_at, updated_at, user_id, slug, description, read_restricted, position) - VALUES (:name, 'EEEEEE', '652D90', now(), now(), -1, '', :description, true, 3) + VALUES (:name, 'A461EF', '652D90', now(), now(), -1, '', :description, true, 3) RETURNING id", name: name, description: description - category_id = result[0]["id"].to_i + category_id = result.first.to_i - Category.exec_sql "UPDATE categories SET slug = :slug + DB.exec "UPDATE categories SET slug = :slug WHERE id = :category_id", slug: Slug.for(name, "#{category_id}-category"), category_id: category_id diff --git a/db/migrate/20140122043508_add_meta_category.rb b/db/migrate/20140122043508_add_meta_category.rb index 2b42b81643..c4ee6b6b6b 100644 --- a/db/migrate/20140122043508_add_meta_category.rb +++ b/db/migrate/20140122043508_add_meta_category.rb @@ -3,20 +3,20 @@ class AddMetaCategory < ActiveRecord::Migration[4.2] return if Rails.env.test? I18n.overrides_disabled do - result = Category.exec_sql "SELECT 1 FROM site_settings where name = 'meta_category_id'" - if result.count == 0 + result = DB.exec "SELECT 1 FROM site_settings where name = 'meta_category_id'" + if result == 0 description = I18n.t('meta_category_description') name = I18n.t('meta_category_name') - if Category.exec_sql("SELECT 1 FROM categories where name ilike :name", name: name).count == 0 - result = Category.exec_sql "INSERT INTO categories + if DB.exec("SELECT 1 FROM categories where name ilike :name", name: name) == 0 + result = DB.query_single "INSERT INTO categories (name, color, text_color, created_at, updated_at, user_id, slug, description, read_restricted, position) VALUES (:name, '808281', 'FFFFFF', now(), now(), -1, :slug, :description, true, 1) RETURNING id", name: name, slug: '', description: description - category_id = result[0]["id"].to_i + category_id = result.first.to_i - Category.exec_sql "UPDATE categories SET slug=:slug WHERE id=:category_id", + DB.exec "UPDATE categories SET slug=:slug WHERE id=:category_id", slug: Slug.for(name, "#{category_id}-category"), category_id: category_id execute "INSERT INTO site_settings(name, data_type, value, created_at, updated_at) diff --git a/db/migrate/20140227201005_add_staff_category.rb b/db/migrate/20140227201005_add_staff_category.rb index 67a8480601..9a990806b9 100644 --- a/db/migrate/20140227201005_add_staff_category.rb +++ b/db/migrate/20140227201005_add_staff_category.rb @@ -3,24 +3,24 @@ class AddStaffCategory < ActiveRecord::Migration[4.2] return if Rails.env.test? I18n.overrides_disabled do - result = Category.exec_sql "SELECT 1 FROM site_settings where name = 'staff_category_id'" - if result.count == 0 + result = DB.exec "SELECT 1 FROM site_settings where name = 'staff_category_id'" + if result == 0 description = I18n.t('staff_category_description') name = I18n.t('staff_category_name') - if Category.exec_sql("SELECT 1 FROM categories where name ilike :name", name: name).count == 0 + if DB.exec("SELECT 1 FROM categories where name ilike :name", name: name) == 0 - result = Category.exec_sql "INSERT INTO categories + result = DB.query_single "INSERT INTO categories (name, color, text_color, created_at, updated_at, user_id, slug, description, read_restricted, position) - VALUES (:name, '283890', 'FFFFFF', now(), now(), -1, '', :description, true, 2) + VALUES (:name, 'E45735', 'FFFFFF', now(), now(), -1, '', :description, true, 2) RETURNING id", name: name, description: description - category_id = result[0]["id"].to_i + category_id = result.first.to_i - Category.exec_sql "UPDATE categories SET slug=:slug WHERE id=:category_id", + DB.exec "UPDATE categories SET slug=:slug WHERE id=:category_id", slug: Slug.for(name, "#{category_id}-category"), category_id: category_id - execute "INSERT INTO site_settings(name, data_type, value, created_at, updated_at) + DB.exec "INSERT INTO site_settings(name, data_type, value, created_at, updated_at) VALUES ('staff_category_id', 3, #{category_id.to_i}, now(), now())" end end diff --git a/db/migrate/20140515220111_init_fixed_category_positions_value.rb b/db/migrate/20140515220111_init_fixed_category_positions_value.rb index f9f454848f..8b9a545b7a 100644 --- a/db/migrate/20140515220111_init_fixed_category_positions_value.rb +++ b/db/migrate/20140515220111_init_fixed_category_positions_value.rb @@ -1,10 +1,10 @@ class InitFixedCategoryPositionsValue < ActiveRecord::Migration[4.2] def up # Look at existing categories to determine if positions have been specified - result = Category.exec_sql("SELECT count(*) FROM categories WHERE position IS NOT NULL") + result = DB.query_single("SELECT count(*) FROM categories WHERE position IS NOT NULL") # Greater than 4 because uncategorized, meta, staff, lounge all have positions by default - if result[0]['count'].to_i > 4 + if result.first.to_i > 4 execute "INSERT INTO site_settings (name, data_type, value, created_at, updated_at) VALUES ('fixed_category_positions', 5, 't', now(), now())" end end diff --git a/db/migrate/20140521220115_google_openid_default_has_changed.rb b/db/migrate/20140521220115_google_openid_default_has_changed.rb index d76718c691..bea872001e 100644 --- a/db/migrate/20140521220115_google_openid_default_has_changed.rb +++ b/db/migrate/20140521220115_google_openid_default_has_changed.rb @@ -1,17 +1,17 @@ class GoogleOpenidDefaultHasChanged < ActiveRecord::Migration[4.2] def up - users_count_query = User.exec_sql("SELECT count(*) FROM users") - if users_count_query[0]['count'].to_i > 1 + users_count_query = DB.query_single("SELECT count(*) FROM users") + if users_count_query.first.to_i > 1 # This is an existing site. - result = User.exec_sql("SELECT count(*) FROM site_settings WHERE name = 'enable_google_logins'") - if result[0]['count'].to_i == 0 + result = DB.query_single("SELECT count(*) FROM site_settings WHERE name = 'enable_google_logins'") + if result.first.to_i == 0 # The old default was true, so add a row to keep it that way. execute "INSERT INTO site_settings (name, data_type, value, created_at, updated_at) VALUES ('enable_google_logins', 5, 't', now(), now())" end # Don't enable the new Google setting on an existing site. - result = User.exec_sql("SELECT count(*) FROM site_settings WHERE name = 'enable_google_oauth2_logins'") - if result[0]['count'].to_i == 0 + result = DB.query_single("SELECT count(*) FROM site_settings WHERE name = 'enable_google_oauth2_logins'") + if result.first.to_i == 0 execute "INSERT INTO site_settings (name, data_type, value, created_at, updated_at) VALUES ('enable_google_oauth2_logins', 5, 'f', now(), now())" end end diff --git a/db/migrate/20140604145431_disable_external_auths_by_default.rb b/db/migrate/20140604145431_disable_external_auths_by_default.rb index 8f47ba505e..2cd19018df 100644 --- a/db/migrate/20140604145431_disable_external_auths_by_default.rb +++ b/db/migrate/20140604145431_disable_external_auths_by_default.rb @@ -1,15 +1,15 @@ class DisableExternalAuthsByDefault < ActiveRecord::Migration[4.2] def enable_setting_if_default(name) - result = User.exec_sql("SELECT count(*) count FROM site_settings WHERE name = '#{name}'") - if result[0]['count'].to_i == 0 + result = DB.query_single("SELECT count(*) count FROM site_settings WHERE name = '#{name}'") + if result.first.to_i == 0 execute "INSERT INTO site_settings (name, data_type, value, created_at, updated_at) VALUES ('#{name}', 5, 't', now(), now())" end end def up - users_count_query = User.exec_sql("SELECT count(*) FROM users") - if users_count_query[0]['count'].to_i > 1 + users_count_query = DB.query_single("SELECT count(*) FROM users") + if users_count_query.first.to_i > 1 # existing site, so keep settings as they are enable_setting_if_default 'enable_yahoo_logins' enable_setting_if_default 'enable_google_oauth2_logins' diff --git a/db/migrate/20140711193923_remove_email_in_address_setting.rb b/db/migrate/20140711193923_remove_email_in_address_setting.rb index a82dbe4dd0..a14d44c763 100644 --- a/db/migrate/20140711193923_remove_email_in_address_setting.rb +++ b/db/migrate/20140711193923_remove_email_in_address_setting.rb @@ -1,16 +1,16 @@ class RemoveEmailInAddressSetting < ActiveRecord::Migration[4.2] def up - uncat_id = ActiveRecord::Base.exec_sql("SELECT value FROM site_settings WHERE name = 'uncategorized_category_id'").first - cat_id_r = ActiveRecord::Base.exec_sql("SELECT value FROM site_settings WHERE name = 'email_in_category'").first - email_r = ActiveRecord::Base.exec_sql("SELECT value FROM site_settings WHERE name = 'email_in_address'").first + uncat_id = DB.query_single("SELECT value FROM site_settings WHERE name = 'uncategorized_category_id'").first + cat_id_r = DB.query_single("SELECT value FROM site_settings WHERE name = 'email_in_category'").first + email_r = DB.query_single("SELECT value FROM site_settings WHERE name = 'email_in_address'").first if email_r category_id = uncat_id["value"].to_i category_id = cat_id_r["value"].to_i if cat_id_r email = email_r["value"] - ActiveRecord::Base.exec_sql("UPDATE categories SET email_in = ? WHERE id = ?", email, category_id) + DB.exec("UPDATE categories SET email_in = ? WHERE id = ?", email, category_id) end - ActiveRecord::Base.exec_sql("DELETE FROM site_settings WHERE name = 'email_in_category' OR name = 'email_in_address'") + DB.exec("DELETE FROM site_settings WHERE name = 'email_in_category' OR name = 'email_in_address'") end def down diff --git a/db/migrate/20141014191645_fix_tos_name.rb b/db/migrate/20141014191645_fix_tos_name.rb index 42daa0a150..16976a944d 100644 --- a/db/migrate/20141014191645_fix_tos_name.rb +++ b/db/migrate/20141014191645_fix_tos_name.rb @@ -1,7 +1,7 @@ class FixTosName < ActiveRecord::Migration[4.2] def up I18n.overrides_disabled do - execute ActiveRecord::Base.sql_fragment('UPDATE user_fields SET name = ? WHERE name = ?', I18n.t('terms_of_service.title'), I18n.t("terms_of_service.signup_form_message")) + execute DB.sql_fragment('UPDATE user_fields SET name = ? WHERE name = ?', I18n.t('terms_of_service.title'), I18n.t("terms_of_service.signup_form_message")) end end diff --git a/db/migrate/20141216112341_resolve_duplicate_group_names.rb b/db/migrate/20141216112341_resolve_duplicate_group_names.rb index c13b1f7b80..96cb718f8d 100644 --- a/db/migrate/20141216112341_resolve_duplicate_group_names.rb +++ b/db/migrate/20141216112341_resolve_duplicate_group_names.rb @@ -1,14 +1,14 @@ class ResolveDuplicateGroupNames < ActiveRecord::Migration[4.2] def up - results = Group.exec_sql 'SELECT id FROM groups + results = DB.query_single 'SELECT id FROM groups WHERE name ILIKE (SELECT lower(name) FROM groups GROUP BY lower(name) HAVING count(*) > 1);' - groups = Group.where id: results.map { |r| r['id'] } + groups = Group.where id: results groups.group_by { |g| g.name.downcase }.each do |key, value| value.each_with_index do |dup, index| dup.update! name: "#{dup.name[0..18]}_#{index + 1}" if index > 0 diff --git a/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb b/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb index a3fe7b251b..ea96cf0ee1 100644 --- a/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb +++ b/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb @@ -2,7 +2,7 @@ class FixCategoryLogoAndBackgroundUrls < ActiveRecord::Migration[4.2] def up return true if Discourse.asset_host.blank? - Category.exec_sql <<-SQL + DB.exec <<-SQL UPDATE categories SET logo_url = replace(logo_url, '#{Discourse.asset_host}', '') , background_url = replace(background_url, '#{Discourse.asset_host}', '') diff --git a/db/migrate/20170215151505_add_seen_at_to_user_auth_token.rb b/db/migrate/20170215151505_add_seen_at_to_user_auth_token.rb index 5044127321..4ed90b6223 100644 --- a/db/migrate/20170215151505_add_seen_at_to_user_auth_token.rb +++ b/db/migrate/20170215151505_add_seen_at_to_user_auth_token.rb @@ -1,7 +1,7 @@ class AddSeenAtToUserAuthToken < ActiveRecord::Migration[4.2] def up add_column :user_auth_tokens, :seen_at, :datetime - ActiveRecord::Base.exec_sql "UPDATE user_auth_tokens SET seen_at = :now WHERE auth_token_seen", now: Time.zone.now + DB.exec "UPDATE user_auth_tokens SET seen_at = :now WHERE auth_token_seen", now: Time.zone.now end def down diff --git a/db/migrate/20170313192741_add_themes.rb b/db/migrate/20170313192741_add_themes.rb index be8fa82e04..374d4abe2e 100644 --- a/db/migrate/20170313192741_add_themes.rb +++ b/db/migrate/20170313192741_add_themes.rb @@ -40,7 +40,7 @@ class AddThemes < ActiveRecord::Migration[4.2] RETURNING * SQL - sql = ActiveRecord::Base.sql_fragment(sql, now: Time.zone.now, key: theme_key) + sql = DB.sql_fragment(sql, now: Time.zone.now, key: theme_key) theme_id = execute(sql).to_a[0]["id"].to_i end @@ -62,7 +62,7 @@ SQL INSERT INTO site_settings(name, data_type, value, created_at, updated_at) VALUES('default_theme_key', 1, :key, :now, :now) SQL - sql = ActiveRecord::Base.sql_fragment(sql, now: Time.zone.now, key: theme_key) + sql = DB.sql_fragment(sql, now: Time.zone.now, key: theme_key) execute(sql) end diff --git a/db/migrate/20170728012754_split_public_in_groups.rb b/db/migrate/20170728012754_split_public_in_groups.rb index febb2f9779..688baaceff 100644 --- a/db/migrate/20170728012754_split_public_in_groups.rb +++ b/db/migrate/20170728012754_split_public_in_groups.rb @@ -3,7 +3,7 @@ class SplitPublicInGroups < ActiveRecord::Migration[4.2] add_column :groups, :public_exit, :boolean, default: false, null: false add_column :groups, :public_admission, :boolean, default: false, null: false - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL UPDATE groups SET public_exit = true, public_admission = true WHERE public = true diff --git a/db/migrate/20171220181249_change_user_emails_primary_index.rb b/db/migrate/20171220181249_change_user_emails_primary_index.rb new file mode 100644 index 0000000000..f78a5d7789 --- /dev/null +++ b/db/migrate/20171220181249_change_user_emails_primary_index.rb @@ -0,0 +1,11 @@ +class ChangeUserEmailsPrimaryIndex < ActiveRecord::Migration[5.1] + def up + remove_index :user_emails, [:user_id, :primary] + add_index :user_emails, [:user_id, :primary], unique: true, where: '"primary"' + end + + def down + remove_index :user_emails, [:user_id, :primary] + add_index :user_emails, [:user_id, :primary], unique: true + end +end diff --git a/db/migrate/20180308071922_drop_raise_read_only_function.rb b/db/migrate/20180308071922_drop_raise_read_only_function.rb index a90a2561c9..d756aa7e14 100644 --- a/db/migrate/20180308071922_drop_raise_read_only_function.rb +++ b/db/migrate/20180308071922_drop_raise_read_only_function.rb @@ -1,6 +1,6 @@ class DropRaiseReadOnlyFunction < ActiveRecord::Migration[5.1] def up - ActiveRecord::Base.exec_sql( + DB.exec( "DROP FUNCTION IF EXISTS raise_read_only() CASCADE;" ) end diff --git a/db/migrate/20180521175611_change_indexes_topic_view_item.rb b/db/migrate/20180521175611_change_indexes_topic_view_item.rb new file mode 100644 index 0000000000..21300d91f2 --- /dev/null +++ b/db/migrate/20180521175611_change_indexes_topic_view_item.rb @@ -0,0 +1,16 @@ +class ChangeIndexesTopicViewItem < ActiveRecord::Migration[5.1] + def up + remove_index :topic_views, + column: [:ip_address, :topic_id], + name: :ip_address_topic_id_topic_views, + unique: true + + remove_index :topic_views, + column: [:user_id, :topic_id], + name: :user_id_topic_id_topic_views, + unique: true + end + + def down + end +end diff --git a/db/migrate/20180521184439_allow_null_ip_search_log.rb b/db/migrate/20180521184439_allow_null_ip_search_log.rb new file mode 100644 index 0000000000..19566c4d9f --- /dev/null +++ b/db/migrate/20180521184439_allow_null_ip_search_log.rb @@ -0,0 +1,13 @@ +class AllowNullIpSearchLog < ActiveRecord::Migration[5.1] + def up + begin + Migration::SafeMigrate.disable! + change_column :search_logs, :ip_address, :inet, null: true + ensure + Migration::SafeMigrate.enable! + end + end + + def down + end +end diff --git a/db/migrate/20180607095414_migrate_disable_emails.rb b/db/migrate/20180607095414_migrate_disable_emails.rb new file mode 100644 index 0000000000..d679ba7eb7 --- /dev/null +++ b/db/migrate/20180607095414_migrate_disable_emails.rb @@ -0,0 +1,11 @@ +class MigrateDisableEmails < ActiveRecord::Migration[5.1] + def up + execute "UPDATE site_settings SET data_type = 7 WHERE name = 'disable_emails';" + execute "UPDATE site_settings SET value = 'yes' WHERE value = 't' AND name = 'disable_emails';" + execute "UPDATE site_settings SET value = 'no' WHERE value = 'f' AND name = 'disable_emails';" + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180619091608_drop_vote_count_from_topics_and_posts.rb b/db/migrate/20180619091608_drop_vote_count_from_topics_and_posts.rb new file mode 100644 index 0000000000..1e061449d6 --- /dev/null +++ b/db/migrate/20180619091608_drop_vote_count_from_topics_and_posts.rb @@ -0,0 +1,9 @@ +class DropVoteCountFromTopicsAndPosts < ActiveRecord::Migration[5.2] + def up + # Delayed drop + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180621013807_add_index_topic_id_percent_rank_on_posts.rb b/db/migrate/20180621013807_add_index_topic_id_percent_rank_on_posts.rb new file mode 100644 index 0000000000..d7a2f1f81d --- /dev/null +++ b/db/migrate/20180621013807_add_index_topic_id_percent_rank_on_posts.rb @@ -0,0 +1,9 @@ +class AddIndexTopicIdPercentRankOnPosts < ActiveRecord::Migration[5.2] + def up + add_index :posts, [:topic_id, :percent_rank], order: { percent_rank: :asc } + end + + def down + remove_index :posts, [:topic_id, :percent_rank] + end +end diff --git a/db/migrate/20180706054922_drop_key_column_from_themes.rb b/db/migrate/20180706054922_drop_key_column_from_themes.rb new file mode 100644 index 0000000000..6029520009 --- /dev/null +++ b/db/migrate/20180706054922_drop_key_column_from_themes.rb @@ -0,0 +1,32 @@ +class DropKeyColumnFromThemes < ActiveRecord::Migration[5.2] + def up + add_column :user_options, :theme_ids, :integer, array: true, null: false, default: [] + + execute( + "UPDATE user_options AS uo + SET theme_ids = ( + SELECT array_agg(themes.id) + FROM themes + INNER JOIN user_options + ON themes.key = user_options.theme_key + WHERE user_options.user_id = uo.user_id + ) WHERE uo.theme_key IN (SELECT key FROM themes)" + ) + + execute( + "INSERT INTO site_settings (name, data_type, value, created_at, updated_at) + SELECT 'default_theme_id', 3, id, now(), now() + FROM themes + WHERE key = (SELECT value FROM site_settings WHERE name = 'default_theme_key')" + ) + + execute("DELETE FROM site_settings WHERE name = 'default_theme_key'") + + # delayed drop for theme_key on user_options table + # delayed drop for key on themes table + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180710075119_add_index_topic_id_sort_order_on_posts.rb b/db/migrate/20180710075119_add_index_topic_id_sort_order_on_posts.rb new file mode 100644 index 0000000000..a85821914b --- /dev/null +++ b/db/migrate/20180710075119_add_index_topic_id_sort_order_on_posts.rb @@ -0,0 +1,5 @@ +class AddIndexTopicIdSortOrderOnPosts < ActiveRecord::Migration[5.2] + def change + add_index :posts, [:topic_id, :sort_order], order: { sort_order: :asc } + end +end diff --git a/db/migrate/20180710172959_disallow_multi_levels_theme_components.rb b/db/migrate/20180710172959_disallow_multi_levels_theme_components.rb new file mode 100644 index 0000000000..7567ed5988 --- /dev/null +++ b/db/migrate/20180710172959_disallow_multi_levels_theme_components.rb @@ -0,0 +1,68 @@ +class DisallowMultiLevelsThemeComponents < ActiveRecord::Migration[5.2] + def up + @handled = [] + top_parents = DB.query(" + SELECT parent_theme_id, child_theme_id + FROM child_themes + WHERE parent_theme_id NOT IN (SELECT child_theme_id FROM child_themes) + ") + + top_parents.each do |top_parent| + migrate_child(top_parent, top_parent) + end + + if @handled.size > 0 + execute(" + DELETE FROM child_themes + WHERE parent_theme_id NOT IN (#{top_parents.map(&:parent_theme_id).join(", ")}) + ") + end + + execute(" + UPDATE themes + SET user_selectable = false + FROM child_themes + WHERE themes.id = child_themes.child_theme_id + AND themes.user_selectable = true + ") + + default = DB.query_single("SELECT value FROM site_settings WHERE name = 'default_theme_id'").first + if default + default_child = DB.query("SELECT 1 AS one FROM child_themes WHERE child_theme_id = ?", default.to_i).present? + execute("DELETE FROM site_settings WHERE name = 'default_theme_id'") if default_child + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end + + private + + def migrate_child(parent, top_parent) + unless already_exists?(top_parent.parent_theme_id, parent.child_theme_id) + execute(" + INSERT INTO child_themes (parent_theme_id, child_theme_id, created_at, updated_at) + VALUES (#{top_parent.parent_theme_id}, #{parent.child_theme_id}, now(), now()) + ") + end + + @handled << [top_parent.parent_theme_id, parent.parent_theme_id, parent.child_theme_id] + + children = DB.query(" + SELECT parent_theme_id, child_theme_id + FROM child_themes + WHERE parent_theme_id = :child", child: parent.child_theme_id + ) + + children.each do |child| + unless @handled.include?([top_parent.parent_theme_id, child.parent_theme_id, child.child_theme_id]) + migrate_child(child, top_parent) + end + end + end + + def already_exists?(parent, child) + DB.query("SELECT 1 AS one FROM child_themes WHERE child_theme_id = :child AND parent_theme_id = :parent", child: child, parent: parent).present? + end +end diff --git a/db/migrate/20180716062012_add_index_user_id_on_user_second_factors.rb b/db/migrate/20180716062012_add_index_user_id_on_user_second_factors.rb new file mode 100644 index 0000000000..8618564490 --- /dev/null +++ b/db/migrate/20180716062012_add_index_user_id_on_user_second_factors.rb @@ -0,0 +1,5 @@ +class AddIndexUserIdOnUserSecondFactors < ActiveRecord::Migration[5.2] + def change + add_index :user_second_factors, :user_id + end +end diff --git a/db/migrate/20180716062405_add_navigate_to_first_post_after_read_to_categories.rb b/db/migrate/20180716062405_add_navigate_to_first_post_after_read_to_categories.rb new file mode 100644 index 0000000000..03a6cd1896 --- /dev/null +++ b/db/migrate/20180716062405_add_navigate_to_first_post_after_read_to_categories.rb @@ -0,0 +1,5 @@ +class AddNavigateToFirstPostAfterReadToCategories < ActiveRecord::Migration[5.2] + def change + add_column :categories, :navigate_to_first_post_after_read, :bool, null: false, default: false + end +end diff --git a/db/migrate/20180716072125_alter_bounce_key_on_email_logs.rb b/db/migrate/20180716072125_alter_bounce_key_on_email_logs.rb new file mode 100644 index 0000000000..e7c064eb8a --- /dev/null +++ b/db/migrate/20180716072125_alter_bounce_key_on_email_logs.rb @@ -0,0 +1,9 @@ +class AlterBounceKeyOnEmailLogs < ActiveRecord::Migration[5.2] + def up + change_column :email_logs, :bounce_key, 'uuid USING bounce_key::uuid' + end + + def down + change_column :email_logs, :bounce_key, :string + end +end diff --git a/db/migrate/20180716140323_add_uniq_ip_or_user_id_topic_views.rb b/db/migrate/20180716140323_add_uniq_ip_or_user_id_topic_views.rb new file mode 100644 index 0000000000..4b33877ee6 --- /dev/null +++ b/db/migrate/20180716140323_add_uniq_ip_or_user_id_topic_views.rb @@ -0,0 +1,15 @@ +class AddUniqIpOrUserIdTopicViews < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def change + unless index_exists?(:topic_views, [:user_id, :ip_address, :topic_id], + name: :uniq_ip_or_user_id_topic_views + ) + + add_index :topic_views, [:user_id, :ip_address, :topic_id], + name: :uniq_ip_or_user_id_topic_views, + unique: true, + algorithm: :concurrently + end + end +end diff --git a/db/migrate/20180716200103_add_theme_key_default.rb b/db/migrate/20180716200103_add_theme_key_default.rb new file mode 100644 index 0000000000..f3f6684cd5 --- /dev/null +++ b/db/migrate/20180716200103_add_theme_key_default.rb @@ -0,0 +1,11 @@ +class AddThemeKeyDefault < ActiveRecord::Migration[5.2] + def up + if column_exists?(:themes, :key) + execute("ALTER TABLE themes ALTER COLUMN key SET DEFAULT 'deprecated'") + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180717025038_drop_not_null_ip_address_on_topic_views.rb b/db/migrate/20180717025038_drop_not_null_ip_address_on_topic_views.rb new file mode 100644 index 0000000000..3428862961 --- /dev/null +++ b/db/migrate/20180717025038_drop_not_null_ip_address_on_topic_views.rb @@ -0,0 +1,10 @@ +class DropNotNullIpAddressOnTopicViews < ActiveRecord::Migration[5.2] + def change + begin + Migration::SafeMigrate.disable! + change_column_null :topic_views, :ip_address, true + ensure + Migration::SafeMigrate.enable! + end + end +end diff --git a/db/migrate/20180717084758_alter_reply_key_on_email_logs.rb b/db/migrate/20180717084758_alter_reply_key_on_email_logs.rb new file mode 100644 index 0000000000..0ace7e0567 --- /dev/null +++ b/db/migrate/20180717084758_alter_reply_key_on_email_logs.rb @@ -0,0 +1,9 @@ +class AlterReplyKeyOnEmailLogs < ActiveRecord::Migration[5.2] + def up + change_column :email_logs, :reply_key, 'uuid USING reply_key::uuid' + end + + def down + change_column :email_logs, :reply_key, :string + end +end diff --git a/db/migrate/20180718062728_create_post_reply_keys.rb b/db/migrate/20180718062728_create_post_reply_keys.rb new file mode 100644 index 0000000000..a7a0860b42 --- /dev/null +++ b/db/migrate/20180718062728_create_post_reply_keys.rb @@ -0,0 +1,53 @@ +require 'migration/column_dropper' + +class CreatePostReplyKeys < ActiveRecord::Migration[5.2] + def up + create_table :post_reply_keys do |t| + t.integer :user_id, null: false + t.integer :post_id, null: false + t.uuid :reply_key, null: false + t.timestamps null: false + end + + add_index :post_reply_keys, :reply_key, unique: true + + Migration::ColumnDropper.mark_readonly(:email_logs, :reply_key) + + sql = <<~SQL + DELETE FROM email_logs + WHERE id IN ( + SELECT id + FROM ( + SELECT + id, + ROW_NUMBER() OVER(PARTITION BY post_id, user_id ORDER BY id DESC) AS row_num + FROM email_logs + ) t + WHERE t.row_num > 1 + ) + SQL + + execute(sql) + + sql = <<~SQL + INSERT INTO post_reply_keys( + user_id, post_id, reply_key, updated_at, created_at + ) SELECT + user_id, + post_id, + reply_key, + updated_at, + created_at + FROM email_logs + WHERE reply_key IS NOT NULL AND post_id IS NOT NULL AND user_id IS NOT NULL + SQL + + execute(sql) + + add_index :post_reply_keys, [:user_id, :post_id], unique: true + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180719103905_alter_indexes_on_email_logs.rb b/db/migrate/20180719103905_alter_indexes_on_email_logs.rb new file mode 100644 index 0000000000..380021a185 --- /dev/null +++ b/db/migrate/20180719103905_alter_indexes_on_email_logs.rb @@ -0,0 +1,12 @@ +class AlterIndexesOnEmailLogs < ActiveRecord::Migration[5.2] + def change + remove_index :email_logs, + name: "index_email_logs_on_user_id_and_created_at", + column: [:user_id, :created_at] + + add_index :email_logs, :user_id + + remove_index :email_logs, [:skipped, :created_at] + add_index :email_logs, [:skipped, :bounced, :created_at] + end +end diff --git a/db/migrate/20180720054856_create_skipped_email_logs.rb b/db/migrate/20180720054856_create_skipped_email_logs.rb new file mode 100644 index 0000000000..2a4ee6ddbf --- /dev/null +++ b/db/migrate/20180720054856_create_skipped_email_logs.rb @@ -0,0 +1,47 @@ +require 'migration/column_dropper' + +class CreateSkippedEmailLogs < ActiveRecord::Migration[5.2] + def change + create_table :skipped_email_logs do |t| + t.string :email_type, null: false + t.string :to_address, null: false + t.integer :user_id + t.integer :post_id + t.integer :reason_type, null: false + t.text :custom_reason + t.timestamps + end + + add_index :skipped_email_logs, :created_at + add_index :skipped_email_logs, :user_id + add_index :skipped_email_logs, :post_id + add_index :skipped_email_logs, :reason_type + + sql = <<~SQL + INSERT INTO skipped_email_logs ( + email_type, + to_address, + user_id, + post_id, + reason_type, + custom_reason, + created_at, + updated_at + ) SELECT + email_type, + to_address, + user_id, + post_id, + 1, + skipped_reason, + created_at, + updated_at + FROM email_logs + WHERE skipped IS TRUE + SQL + + execute(sql) + + Migration::ColumnDropper.mark_readonly('email_logs', 'skipped_reason') + end +end diff --git a/db/migrate/20180724070554_drop_topic_id_on_email_logs.rb b/db/migrate/20180724070554_drop_topic_id_on_email_logs.rb new file mode 100644 index 0000000000..199c24bd43 --- /dev/null +++ b/db/migrate/20180724070554_drop_topic_id_on_email_logs.rb @@ -0,0 +1,5 @@ +class DropTopicIdOnEmailLogs < ActiveRecord::Migration[5.2] + def change + remove_index :email_logs, :topic_id + end +end diff --git a/db/migrate/20180727042448_drop_reply_key_skipped_skipped_reason_from_email_logs.rb b/db/migrate/20180727042448_drop_reply_key_skipped_skipped_reason_from_email_logs.rb new file mode 100644 index 0000000000..48905b0c25 --- /dev/null +++ b/db/migrate/20180727042448_drop_reply_key_skipped_skipped_reason_from_email_logs.rb @@ -0,0 +1,11 @@ +class DropReplyKeySkippedSkippedReasonFromEmailLogs < ActiveRecord::Migration[5.2] + def up + remove_index :email_logs, [:skipped, :bounced, :created_at] + remove_index :email_logs, name: 'idx_email_logs_user_created_filtered' + add_index :email_logs, [:user_id, :created_at] + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180729092926_remove_track_external_right_clicks.rb b/db/migrate/20180729092926_remove_track_external_right_clicks.rb new file mode 100644 index 0000000000..424804b477 --- /dev/null +++ b/db/migrate/20180729092926_remove_track_external_right_clicks.rb @@ -0,0 +1,9 @@ +class RemoveTrackExternalRightClicks < ActiveRecord::Migration[5.2] + def up + execute "DELETE FROM site_settings WHERE name = 'track_external_right_clicks'" + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180803085321_add_index_email_logs_on_bounced.rb b/db/migrate/20180803085321_add_index_email_logs_on_bounced.rb new file mode 100644 index 0000000000..549217abd0 --- /dev/null +++ b/db/migrate/20180803085321_add_index_email_logs_on_bounced.rb @@ -0,0 +1,6 @@ +class AddIndexEmailLogsOnBounced < ActiveRecord::Migration[5.2] + def change + add_index :email_logs, :bounced + remove_index :email_logs, [:user_id, :created_at] + end +end diff --git a/db/migrate/20180812150839_add_user_api_keys_last_used_at.rb b/db/migrate/20180812150839_add_user_api_keys_last_used_at.rb new file mode 100644 index 0000000000..fa8d608499 --- /dev/null +++ b/db/migrate/20180812150839_add_user_api_keys_last_used_at.rb @@ -0,0 +1,5 @@ +class AddUserApiKeysLastUsedAt < ActiveRecord::Migration[5.2] + def change + add_column :user_api_keys, :last_used_at, :datetime, null: false, default: -> { 'CURRENT_TIMESTAMP' } + end +end diff --git a/db/migrate/20180813074843_add_component_to_themes.rb b/db/migrate/20180813074843_add_component_to_themes.rb new file mode 100644 index 0000000000..54b2d39f9e --- /dev/null +++ b/db/migrate/20180813074843_add_component_to_themes.rb @@ -0,0 +1,26 @@ +class AddComponentToThemes < ActiveRecord::Migration[5.2] + def up + add_column :themes, :component, :boolean, null: false, default: false + + execute(" + UPDATE themes + SET component = true, color_scheme_id = NULL, user_selectable = false + WHERE id IN (SELECT child_theme_id FROM child_themes) + ") + + execute(" + UPDATE site_settings + SET value = -1 + WHERE name = 'default_theme_id' AND value::integer IN (SELECT id FROM themes WHERE component) + ") + + execute(" + DELETE FROM child_themes + WHERE parent_theme_id IN (SELECT id FROM themes WHERE component) + ") + end + + def down + remove_column :themes, :component + end +end diff --git a/db/migrate/20180827053514_add_filesize_to_optimized_images.rb b/db/migrate/20180827053514_add_filesize_to_optimized_images.rb new file mode 100644 index 0000000000..8840b57afe --- /dev/null +++ b/db/migrate/20180827053514_add_filesize_to_optimized_images.rb @@ -0,0 +1,7 @@ +class AddFilesizeToOptimizedImages < ActiveRecord::Migration[5.2] + def change + add_column :optimized_images, :filesize, :integer + add_column :uploads, :thumbnail_width, :integer + add_column :uploads, :thumbnail_height, :integer + end +end diff --git a/db/migrate/20180828065005_change_bounce_score_to_float.rb b/db/migrate/20180828065005_change_bounce_score_to_float.rb new file mode 100644 index 0000000000..b2cd5a4a71 --- /dev/null +++ b/db/migrate/20180828065005_change_bounce_score_to_float.rb @@ -0,0 +1,5 @@ +class ChangeBounceScoreToFloat < ActiveRecord::Migration[5.2] + def change + change_column :user_stats, :bounce_score, :float + end +end diff --git a/docs/ADMIN-QUICK-START-GUIDE.md b/docs/ADMIN-QUICK-START-GUIDE.md index 045b964c3a..bcd8ddb24d 100644 --- a/docs/ADMIN-QUICK-START-GUIDE.md +++ b/docs/ADMIN-QUICK-START-GUIDE.md @@ -73,7 +73,7 @@ To make (or remove) a pin or a banner, use the admin wrench at the top right or ### New User Sandbox and the Trust System -If your discussion area is be open to the public, new visitors will arrive that are initially strangers to the community. Discourse has a [trust system](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924/2) where users can, over time, earn the trust of the community and gain abilities to assist in governing their community. +If your discussion area is be open to the public, new visitors will arrive that are initially strangers to the community. Discourse has a [trust system](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) where users can, over time, earn the trust of the community and gain abilities to assist in governing their community. Discourse is designed to offer safe defaults for public communities, even with no active moderation. @@ -88,7 +88,7 @@ All new users start out in a sandbox with restrictions for everyone's safety. ** - have actual links in the "about me" field of their profile - @name mention more than 2 users in a post -Every action a user can take is rate limited for safety, and especially so for new users. But don't worry, new users can [transition to trust level 1](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924/2) in about 10 minutes of reading. +Every action a user can take is rate limited for safety, and especially so for new users. But don't worry, new users can [transition to trust level 1](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) in about 10 minutes of reading. These defaults are safe, but note that while in "bootstrap mode" after you set up your site, all new users will be granted trust level 1 until you reach 50 users. diff --git a/docs/DEVELOPER-ADVANCED.md b/docs/DEVELOPER-ADVANCED.md index 7a99b64395..9e0ac26a59 100644 --- a/docs/DEVELOPER-ADVANCED.md +++ b/docs/DEVELOPER-ADVANCED.md @@ -21,9 +21,9 @@ To get your Ubuntu 16.04 LTS install up and running to develop Discourse and Dis # exit the terminal and open it again to activate RVM - rvm install 2.3.4 - rvm --default use 2.3.4 # If this error out check https://rvm.io/integration/gnome-terminal - gem install bundler mailcatcher + rvm install 2.5.1 + rvm --default use 2.5.1 # If this error out check https://rvm.io/integration/gnome-terminal + gem install bundler mailcatcher rake # Postgresql sudo -u postgres -i diff --git a/docs/DEVELOPMENT-OSX-NATIVE.md b/docs/DEVELOPMENT-OSX-NATIVE.md index ec4ae1ecef..a162b70d6e 100644 --- a/docs/DEVELOPMENT-OSX-NATIVE.md +++ b/docs/DEVELOPMENT-OSX-NATIVE.md @@ -4,7 +4,7 @@ These instructions assume you have read and understood the **[Discourse Advanced OS X has become a popular platform for developing Ruby on Rails applications; as such, if you run OS X, you might find it more congenial to work on **[Discourse](http://discourse.org)** in your native environment. These instructions should get you there. -Obviously, if you **already** develop Ruby on OS X, a lot of this will be redundant, because you'll have already done it, or something like it. If that's the case, you may well be able to just install Ruby 2.3 using RVM and get started! Discourse has enough dependencies, however (note: not a criticism!) that there's a good chance you'll find **something** else in this document that's useful for getting your Discourse development started! +Obviously, if you **already** develop Ruby on OS X, a lot of this will be redundant, because you'll have already done it, or something like it. If that's the case, you may well be able to just install Ruby 2.4+ using RVM and get started! Discourse has enough dependencies, however (note: not a criticism!) that there's a good chance you'll find **something** else in this document that's useful for getting your Discourse development started! ## Quick Setup @@ -76,11 +76,11 @@ If you do already have RVM installed, this should make sure everything is up to # If autolibs is set to 0-2, it will give an error for things that are missing, instead. rvm requirements -Either way, you'll now want to install the 'turbo' version of Ruby 2.0. +Either way, you'll now want to install Ruby 2.4+ (we recommend 2.4.4 or higher). # Now, install Ruby - rvm install 2.3.4-turbo - rvm use 2.3.4 --default # Careful with this if you're already developing Ruby + rvm install 2.4.4 + rvm use 2.4.4 --default # Careful with this if you're already developing Ruby ## Git @@ -99,7 +99,6 @@ Atlassian has a free Git client for OS X called [SourceTree](http://www.sourcetr ## Postgres 9.3 OS X ships with Postgres 9.1.5, but you're better off going with the latest from Homebrew or [Postgres.app](http://postgresapp.com). -Note that we currently do not support Postgres 10 [due to an issue with seed-fu](https://meta.discourse.org/t/discourse-appears-to-be-broken-with-postgres-10/71723). ### Using Postgres.app @@ -191,11 +190,9 @@ Download from https://www.google.com/chrome/index.html ## ImageMagick -ImageMagick is used for generating avatars (including for test fixtures). Brew installs ImageMagick 7 by default, and this version -doesn't work with Discourse. +ImageMagick is used for generating avatars (including for test fixtures). - brew install imagemagick@6 - brew link --force imagemagick@6 + brew install imagemagick ImageMagick is going to want to use the Helvetica font to generate the letter-avatars: diff --git a/docs/INSTALL-cloud.md b/docs/INSTALL-cloud.md index 89a9a20e21..540b26de3c 100644 --- a/docs/INSTALL-cloud.md +++ b/docs/INSTALL-cloud.md @@ -79,13 +79,11 @@ Answer the following questions when prompted: SMTP password? [pa$$word]: Let's Encrypt account email? (ENTER to skip) [me@example.com]: -This will generate an `app.yml` configuration file on your behalf, and then kicks off bootstrap. Bootstrapping takes between **2-8 minutes** to set up your Discourse. If you need to change these settings after bootstrapping, you can run `./discourse-setup` again (it will read your old values from the file) or edit `/containers/app.yml` with `nano` and then `./launcher rebuild app`, otherwise your changes will not take effect. - -**NOTE:** You should not attempt to enable Let's Encrypt unless the DNS record for hostname resolves to your server. You can run `./discourse-setup` again later to make any changes. +This will generate an `app.yml` configuration file on your behalf, and then kicks off bootstrap. Bootstrapping takes between **2-8 minutes** to set up your Discourse. If you need to change these settings after bootstrapping, you can run `./discourse-setup` again (it will re-use your previous values from the file) or edit `/containers/app.yml` manually with `nano` and then `./launcher rebuild app`, otherwise your changes will not take effect. ### Start Discourse - Once bootstrapping is complete, your Discourse should be accessible in your web browser via the domain name `discourse.example.com` you entered earlier, provided you configured DNS. If not, you can visit the server IP directly, e.g. `http://192.168.1.1`. + Once bootstrapping is complete, your Discourse should be accessible in your web browser via the domain name `discourse.example.com` you entered earlier. diff --git a/docs/INSTALL-email.md b/docs/INSTALL-email.md index d62a669d8c..b70ddd3f29 100644 --- a/docs/INSTALL-email.md +++ b/docs/INSTALL-email.md @@ -14,7 +14,7 @@ Enter these values when prompted by `./discourse-setup` per the [install guide]( SMTP user name? [SMTP credentials for your domain under domains tab] SMTP password? [SMTP credentials for your domain under domains tab] -#### [Elastic Email][ee] — 150k emails/month +#### [Elastic Email][ee] — 150k emails/month (5k max/day) SMTP server address? smtp.elasticemail.com SMTP user name? [Your registered email address] diff --git a/docs/INSTALL.md b/docs/INSTALL.md index b58adc60d0..e297f2aaaa 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -23,7 +23,7 @@ Hosting Rails applications is complicated. Even if you already have Postgres, Re - [Postgres 9.5+](http://www.postgresql.org/download/) - [Redis 2.6+](http://redis.io/download) -- [Ruby 2.3+](http://www.ruby-lang.org/en/downloads/) (we recommend 2.3.1 or higher) +- [Ruby 2.4+](http://www.ruby-lang.org/en/downloads/) (we recommend 2.4.4 or higher) ## Security diff --git a/docs/PLUGINS.md b/docs/PLUGINS.md index b07268c05c..8cf2d332c7 100644 --- a/docs/PLUGINS.md +++ b/docs/PLUGINS.md @@ -3,6 +3,8 @@ If you just want to get some plugins for your Discourse instance, check out [the plugin category](https://meta.discourse.org/c/plugin) at meta. This is the most up to date place for plugin discussion and listing. +If you want to be safe, use only plugins on this list of [Official Plugins](https://github.com/discourse/discourse/blob/master/lib/plugin/metadata.rb): + ### Discourse Plugin Tutorials * [Part One: Getting Started](https://meta.discourse.org/t/beginners-guide-to-creating-discourse-plugins/30515) diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index adb391c367..719bfc0b2f 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -4,9 +4,9 @@ Are you having trouble setting up Discourse? Here are some basic things to check reaching out to the community for help: -1. Are you running Ruby 2.0 or later? +1. Are you running Ruby 2.4 or later? - Discourse is designed for Ruby 2.0 or later. We recommend 2.0.0 p353 or later. You can check your version by typing + Discourse is designed for Ruby 2.4 or later. We recommend 2.4.4 p296 or later. You can check your version by typing `ruby -v` and checking the response. @@ -31,12 +31,12 @@ reaching out to the community for help: 5. Have you migrated your database? Our schema changes fairly frequently. After checking out the source code, you should - run `rake db:migrate` + run `bundle exec rake db:migrate && RAILS_ENV=test bundle exec rake db:migrate` 7. Do the tests pass? If you are having other problems, it's useful to know if the test suite passes. You - can run it by first using `rake db:test:prepare` and then `rake spec`. If you + can run it by first using `RAILS_ENV=test bundle exec rake db:drop db:create db:migrate` and then `bundle exec rspec`. If you experience any failures, that's a bad sign! Our master branch should *always* pass every test. diff --git a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb index 0bdcda39f1..6016b162c0 100644 --- a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb +++ b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb @@ -16,9 +16,11 @@ class PostgreSQLFallbackHandler @mutex = Mutex.new @initialized = false - MessageBus.subscribe(DATABASE_DOWN_CHANNEL) do |payload| - RailsMultisite::ConnectionManagement.with_connection(payload.data['db']) do - clear_connections + MessageBus.subscribe(DATABASE_DOWN_CHANNEL) do |payload, pid| + if @initialized && pid != Process.pid + RailsMultisite::ConnectionManagement.with_connection(payload.data['db']) do + clear_connections + end end end end @@ -28,14 +30,11 @@ class PostgreSQLFallbackHandler @thread = Thread.new do while true do - begin - thread = Thread.new { initiate_fallback_to_master } - thread.join - break if synchronize { @masters_down.hash.empty? } - sleep 10 - ensure - thread.kill - end + thread = Thread.new { initiate_fallback_to_master } + thread.abort_on_exception = true + thread.join + break if synchronize { @masters_down.hash.empty? } + sleep 5 end end @@ -50,7 +49,7 @@ class PostgreSQLFallbackHandler synchronize do @masters_down[namespace] = true Sidekiq.pause! if !Sidekiq.paused? - MessageBus.publish(DATABASE_DOWN_CHANNEL, db: namespace) + MessageBus.publish(DATABASE_DOWN_CHANNEL, db: namespace, pid: Process.pid) end end @@ -59,28 +58,37 @@ class PostgreSQLFallbackHandler end def initiate_fallback_to_master - @masters_down.hash.keys.each do |key| - RailsMultisite::ConnectionManagement.with_connection(key) do - begin - logger.warn "#{log_prefix}: Checking master server..." - begin - connection = ActiveRecord::Base.postgresql_connection(config) - is_connection_active = connection.active? - ensure - connection.disconnect! if connection - end + begin + unless @initialized + @initialized = true + return + end - if is_connection_active - logger.warn "#{log_prefix}: Master server is active. Reconnecting..." - clear_connections - self.master_up(key) - disable_readonly_mode - Sidekiq.unpause! + @masters_down.hash.keys.each do |key| + RailsMultisite::ConnectionManagement.with_connection(key) do + begin + logger.warn "#{log_prefix}: Checking master server..." + begin + connection = ActiveRecord::Base.postgresql_connection(config) + is_connection_active = connection.active? + ensure + connection.disconnect! if connection + end + + if is_connection_active + logger.warn "#{log_prefix}: Master server is active. Reconnecting..." + self.master_up(key) + disable_readonly_mode + Sidekiq.unpause! + clear_connections + end + rescue => e + logger.warn "#{log_prefix}: Connection to master PostgreSQL server failed with '#{e.message}'" end - rescue => e - logger.warn "#{log_prefix}: Connection to master PostgreSQL server failed with '#{e.message}'" end end + rescue => e + logger.warn "#{e.class} #{e.message}: #{e.backtrace.join("\n")}" end end @@ -91,8 +99,7 @@ class PostgreSQLFallbackHandler end def clear_connections - ActiveRecord::Base.clear_active_connections! - ActiveRecord::Base.clear_all_connections! + ActiveRecord::Base.connection_pool.disconnect! end private diff --git a/lib/admin_user_index_query.rb b/lib/admin_user_index_query.rb index baf20275da..83bc4dc84a 100644 --- a/lib/admin_user_index_query.rb +++ b/lib/admin_user_index_query.rb @@ -63,7 +63,8 @@ class AdminUserIndexQuery if params[:stats].present? && params[:stats] == false klass.order(order.reject(&:blank?).join(",")) else - klass.includes(:user_stat, :user_second_factor).order(order.reject(&:blank?).join(",")) + klass.includes(:user_stat, :user_second_factors) + .order(order.reject(&:blank?).join(",")) end end diff --git a/lib/auth.rb b/lib/auth.rb index f94ba5cf43..7d0c47db99 100644 --- a/lib/auth.rb +++ b/lib/auth.rb @@ -1,5 +1,6 @@ module Auth; end +require_dependency 'auth/auth_provider' require_dependency 'auth/result' require_dependency 'auth/authenticator' require_dependency 'auth/facebook_authenticator' diff --git a/lib/auth/auth_provider.rb b/lib/auth/auth_provider.rb new file mode 100644 index 0000000000..5f74af2e44 --- /dev/null +++ b/lib/auth/auth_provider.rb @@ -0,0 +1,28 @@ +class Auth::AuthProvider + include ActiveModel::Serialization + + def initialize(params = {}) + params.each { |key, value| send "#{key}=", value } + end + + def self.auth_attributes + [:pretty_name, :title, :message, :frame_width, :frame_height, :authenticator, + :pretty_name_setting, :title_setting, :enabled_setting, :full_screen_login, :full_screen_login_setting, + :custom_url] + end + + attr_accessor(*auth_attributes) + + def name + authenticator.name + end + + def can_connect + authenticator.can_connect_existing_user? + end + + def can_revoke + authenticator.can_revoke? + end + +end diff --git a/lib/auth/authenticator.rb b/lib/auth/authenticator.rb index bd4861160f..b5d795662c 100644 --- a/lib/auth/authenticator.rb +++ b/lib/auth/authenticator.rb @@ -2,7 +2,17 @@ # an authentication system interacts with our database and middleware class Auth::Authenticator - def after_authenticate(auth_options) + def name + raise NotImplementedError + end + + def enabled? + raise NotImplementedError + end + + # run once the user has completed authentication on the third party system. Should return an instance of Auth::Result. + # If the user has requested to connect an existing account then `existing_account` will be set + def after_authenticate(auth_options, existing_account: nil) raise NotImplementedError end @@ -19,4 +29,31 @@ class Auth::Authenticator def register_middleware(omniauth) raise NotImplementedError end + + # return a string describing the connected account + # for a given user (typically email address). Used to list + # connected accounts under the user's preferences. Empty string + # indicates not connected + def description_for_user(user) + "" + end + + # can authorisation for this provider be revoked? + def can_revoke? + false + end + + # can exising discourse users connect this provider to their accounts + def can_connect_existing_user? + false + end + + # optionally implement the ability for users to revoke + # their link with this authenticator. + # should ideally contact the third party to fully revoke + # permissions. If this fails, return :remote_failed. + # skip remote if skip_remote == true + def revoke(user, skip_remote: false) + raise NotImplementedError + end end diff --git a/lib/auth/default_current_user_provider.rb b/lib/auth/default_current_user_provider.rb index 4d7521046c..671022deeb 100644 --- a/lib/auth/default_current_user_provider.rb +++ b/lib/auth/default_current_user_provider.rb @@ -75,26 +75,13 @@ class Auth::DefaultCurrentUserProvider @env[BAD_TOKEN] = true end - if current_user && should_update_last_seen? - u = current_user - Scheduler::Defer.later "Updating Last Seen" do - u.update_last_seen! - u.update_ip_address!(request.ip) - end - end - # possible we have an api call, impersonate if api_key current_user = lookup_api_user(api_key, request) raise Discourse::InvalidAccess.new(I18n.t('invalid_api_credentials'), nil, custom_message: "invalid_api_credentials") unless current_user raise Discourse::InvalidAccess if current_user.suspended? || !current_user.active @env[API_KEY_ENV] = true - - # we do not run this rate limiter while profiling - if Rails.env != "profile" - limiter_min = RateLimiter.new(nil, "admin_api_min_#{api_key}", GlobalSetting.max_admin_api_reqs_per_key_per_minute, 60) - limiter_min.performed! - end + rate_limit_admin_api_requests(api_key) end # user api key handling @@ -127,6 +114,14 @@ class Auth::DefaultCurrentUserProvider current_user = nil end + if current_user && should_update_last_seen? + u = current_user + Scheduler::Defer.later "Updating Last Seen" do + u.update_last_seen! + u.update_ip_address!(request.ip) + end + end + @env[CURRENT_USER_KEY] = current_user end @@ -258,7 +253,16 @@ class Auth::DefaultCurrentUserProvider raise Discourse::InvalidAccess end + api_key.update_columns(last_used_at: Time.zone.now) + if client_id.present? && client_id != api_key.client_id + + # invalidate old dupe api key for client if needed + UserApiKey + .where(client_id: client_id, user_id: api_key.user_id) + .where('id <> ?', api_key.id) + .destroy_all + api_key.update_columns(client_id: client_id) end @@ -287,4 +291,17 @@ class Auth::DefaultCurrentUserProvider end end + private + + def rate_limit_admin_api_requests(api_key) + return if Rails.env == "profile" + + RateLimiter.new( + nil, + "admin_api_min_#{api_key}", + GlobalSetting.max_admin_api_reqs_per_key_per_minute, + 60 + ).performed! + end + end diff --git a/lib/auth/facebook_authenticator.rb b/lib/auth/facebook_authenticator.rb index 50e717d739..01d86c7684 100644 --- a/lib/auth/facebook_authenticator.rb +++ b/lib/auth/facebook_authenticator.rb @@ -1,12 +1,52 @@ class Auth::FacebookAuthenticator < Auth::Authenticator - AVATAR_SIZE = 480 + AVATAR_SIZE ||= 480 def name "facebook" end - def after_authenticate(auth_token) + def enabled? + SiteSetting.enable_facebook_logins + end + + def description_for_user(user) + info = FacebookUserInfo.find_by(user_id: user.id) + info&.email || info&.username || "" + end + + def can_revoke? + true + end + + def revoke(user, skip_remote: false) + info = FacebookUserInfo.find_by(user_id: user.id) + raise Discourse::NotFound if info.nil? + + if skip_remote + info.destroy! + return true + end + + response = Excon.delete(revoke_url(info.facebook_user_id)) + + if response.status == 200 + info.destroy! + return true + end + + false + end + + def revoke_url(fb_user_id) + "https://graph.facebook.com/#{fb_user_id}/permissions?access_token=#{SiteSetting.facebook_app_id}|#{SiteSetting.facebook_app_secret}" + end + + def can_connect_existing_user? + true + end + + def after_authenticate(auth_token, existing_account: nil) result = Auth::Result.new session_info = parse_auth_token(auth_token) @@ -20,9 +60,16 @@ class Auth::FacebookAuthenticator < Auth::Authenticator user_info = FacebookUserInfo.find_by(facebook_user_id: facebook_hash[:facebook_user_id]) - result.user = user_info.try(:user) + if existing_account && (user_info.nil? || existing_account.id != user_info.user_id) + user_info.destroy! if user_info + result.user = existing_account + user_info = FacebookUserInfo.create!({ user_id: result.user.id }.merge(facebook_hash)) + else + result.user = user_info&.user + end + if !result.user && !email.blank? && result.user = User.find_by_email(email) - FacebookUserInfo.create({ user_id: result.user.id }.merge(facebook_hash)) + FacebookUserInfo.create!({ user_id: result.user.id }.merge(facebook_hash)) end user_info.update_columns(facebook_hash) if user_info @@ -42,7 +89,7 @@ class Auth::FacebookAuthenticator < Auth::Authenticator def after_create_account(user, auth) extra_data = auth[:extra_data] - FacebookUserInfo.create({ user_id: user.id }.merge(extra_data)) + FacebookUserInfo.create!({ user_id: user.id }.merge(extra_data)) retrieve_avatar(user, extra_data) retrieve_profile(user, extra_data) @@ -63,58 +110,58 @@ class Auth::FacebookAuthenticator < Auth::Authenticator protected - def parse_auth_token(auth_token) - raw_info = auth_token["extra"]["raw_info"] - info = auth_token["info"] + def parse_auth_token(auth_token) + raw_info = auth_token["extra"]["raw_info"] + info = auth_token["info"] - email = auth_token["info"][:email] + email = auth_token["info"][:email] - website = (info["urls"] && info["urls"]["Website"]) || nil + website = (info["urls"] && info["urls"]["Website"]) || nil - { - facebook: { - facebook_user_id: auth_token["uid"], - link: raw_info["link"], - username: raw_info["username"], - first_name: raw_info["first_name"], - last_name: raw_info["last_name"], - email: email, - gender: raw_info["gender"], - name: raw_info["name"], - avatar_url: info["image"], - location: info["location"], - website: website, - about_me: info["description"] - }, + { + facebook: { + facebook_user_id: auth_token["uid"], + link: raw_info["link"], + username: raw_info["username"], + first_name: raw_info["first_name"], + last_name: raw_info["last_name"], email: email, - email_valid: true - } + gender: raw_info["gender"], + name: raw_info["name"], + avatar_url: info["image"], + location: info["location"], + website: website, + about_me: info["description"] + }, + email: email, + email_valid: true + } + end + + def retrieve_avatar(user, data) + return unless user + return if user.user_avatar.try(:custom_upload_id).present? + + if (avatar_url = data[:avatar_url]).present? + url = "#{avatar_url}?height=#{AVATAR_SIZE}&width=#{AVATAR_SIZE}" + Jobs.enqueue(:download_avatar_from_url, url: url, user_id: user.id, override_gravatar: false) end + end - def retrieve_avatar(user, data) - return unless user - return if user.user_avatar.try(:custom_upload_id).present? + def retrieve_profile(user, data) + return unless user - if (avatar_url = data[:avatar_url]).present? - url = "#{avatar_url}?height=#{AVATAR_SIZE}&width=#{AVATAR_SIZE}" - Jobs.enqueue(:download_avatar_from_url, url: url, user_id: user.id, override_gravatar: false) - end - end - - def retrieve_profile(user, data) - return unless user - - bio = data[:about_me] || data[:about] - location = data[:location] - website = data[:website] - - if bio || location || website - profile = user.user_profile - profile.bio_raw = bio unless profile.bio_raw.present? - profile.location = location unless profile.location.present? - profile.website = website unless profile.website.present? - profile.save - end + bio = data[:about_me] || data[:about] + location = data[:location] + website = data[:website] + + if bio || location || website + profile = user.user_profile + profile.bio_raw = bio unless profile.bio_raw.present? + profile.location = location unless profile.location.present? + profile.website = website unless profile.website.present? + profile.save end + end end diff --git a/lib/auth/github_authenticator.rb b/lib/auth/github_authenticator.rb index 2d3f705cf3..aaf43fa1b2 100644 --- a/lib/auth/github_authenticator.rb +++ b/lib/auth/github_authenticator.rb @@ -6,6 +6,26 @@ class Auth::GithubAuthenticator < Auth::Authenticator "github" end + def enabled? + SiteSetting.enable_github_logins + end + + def description_for_user(user) + info = GithubUserInfo.find_by(user_id: user.id) + info&.screen_name || "" + end + + def can_revoke? + true + end + + def revoke(user, skip_remote: false) + info = GithubUserInfo.find_by(user_id: user.id) + raise Discourse::NotFound if info.nil? + info.destroy! + true + end + class GithubEmailChecker include ::HasErrors @@ -21,7 +41,7 @@ class Auth::GithubAuthenticator < Auth::Authenticator end - def after_authenticate(auth_token) + def after_authenticate(auth_token, existing_account: nil) result = Auth::Result.new data = auth_token[:info] @@ -37,6 +57,15 @@ class Auth::GithubAuthenticator < Auth::Authenticator user_info = GithubUserInfo.find_by(github_user_id: github_user_id) + if existing_account && (user_info.nil? || existing_account.id != user_info.user_id) + user_info.destroy! if user_info + user_info = GithubUserInfo.create( + user_id: existing_account.id, + screen_name: screen_name, + github_user_id: github_user_id + ) + end + if user_info # If there's existing user info with the given GitHub ID, that's all we # need to know. diff --git a/lib/auth/google_oauth2_authenticator.rb b/lib/auth/google_oauth2_authenticator.rb index e477c55edc..6498715ffc 100644 --- a/lib/auth/google_oauth2_authenticator.rb +++ b/lib/auth/google_oauth2_authenticator.rb @@ -4,7 +4,35 @@ class Auth::GoogleOAuth2Authenticator < Auth::Authenticator "google_oauth2" end - def after_authenticate(auth_hash) + def enabled? + SiteSetting.enable_google_oauth2_logins + end + + def description_for_user(user) + info = GoogleUserInfo.find_by(user_id: user.id) + info&.email || info&.name || "" + end + + def can_revoke? + true + end + + def revoke(user, skip_remote: false) + info = GoogleUserInfo.find_by(user_id: user.id) + raise Discourse::NotFound if info.nil? + + # We get a temporary token from google upon login but do not need it, and do not store it. + # Therefore we do not have any way to revoke the token automatically on google's end + + info.destroy! + true + end + + def can_connect_existing_user? + true + end + + def after_authenticate(auth_hash, existing_account: nil) session_info = parse_hash(auth_hash) google_hash = session_info[:google] @@ -16,7 +44,14 @@ class Auth::GoogleOAuth2Authenticator < Auth::Authenticator result.extra_data = google_hash user_info = ::GoogleUserInfo.find_by(google_user_id: google_hash[:google_user_id]) - result.user = user_info.try(:user) + + if existing_account && (user_info.nil? || existing_account.id != user_info.user_id) + user_info.destroy! if user_info + result.user = existing_account + user_info = GoogleUserInfo.create!({ user_id: result.user.id }.merge(google_hash)) + else + result.user = user_info&.user + end if !result.user && !result.email.blank? && result.email_valid result.user = User.find_by_email(result.email) diff --git a/lib/auth/instagram_authenticator.rb b/lib/auth/instagram_authenticator.rb index 507981ef2a..515616fbbc 100644 --- a/lib/auth/instagram_authenticator.rb +++ b/lib/auth/instagram_authenticator.rb @@ -4,9 +4,32 @@ class Auth::InstagramAuthenticator < Auth::Authenticator "instagram" end - # TODO twitter provides all sorts of extra info, like website/bio etc. - # it may be worth considering pulling some of it in. - def after_authenticate(auth_token) + def enabled? + SiteSetting.enable_instagram_logins + end + + def description_for_user(user) + info = InstagramUserInfo.find_by(user_id: user.id) + info&.screen_name || "" + end + + def can_revoke? + true + end + + def revoke(user, skip_remote: false) + info = InstagramUserInfo.find_by(user_id: user.id) + raise Discourse::NotFound if info.nil? + # Instagram does not have any way for us to revoke tokens on their end + info.destroy! + true + end + + def can_connect_existing_user? + true + end + + def after_authenticate(auth_token, existing_account: nil) result = Auth::Result.new @@ -23,7 +46,16 @@ class Auth::InstagramAuthenticator < Auth::Authenticator user_info = InstagramUserInfo.find_by(instagram_user_id: instagram_user_id) - result.user = user_info.try(:user) + if existing_account && (user_info.nil? || existing_account.id != user_info.user_id) + user_info.destroy! if user_info + user_info = InstagramUserInfo.create!( + user_id: existing_account.id, + screen_name: screen_name, + instagram_user_id: instagram_user_id + ) + end + + result.user = user_info&.user result end diff --git a/lib/auth/oauth2_authenticator.rb b/lib/auth/oauth2_authenticator.rb index cadd1022a7..e5288c29df 100644 --- a/lib/auth/oauth2_authenticator.rb +++ b/lib/auth/oauth2_authenticator.rb @@ -52,4 +52,8 @@ class Auth::OAuth2Authenticator < Auth::Authenticator ) end + def description_for_user(user) + info = Oauth2UserInfo.find_by(user_id: user.id, provider: @name) + info&.email || info&.name || info&.uid || "" + end end diff --git a/lib/auth/open_id_authenticator.rb b/lib/auth/open_id_authenticator.rb index 1bb17447c7..849ca6977a 100644 --- a/lib/auth/open_id_authenticator.rb +++ b/lib/auth/open_id_authenticator.rb @@ -2,13 +2,39 @@ class Auth::OpenIdAuthenticator < Auth::Authenticator attr_reader :name, :identifier - def initialize(name, identifier, opts = {}) + def initialize(name, identifier, enabled_site_setting, opts = {}) @name = name @identifier = identifier + @enabled_site_setting = enabled_site_setting @opts = opts end - def after_authenticate(auth_token) + def enabled? + SiteSetting.send(@enabled_site_setting) + end + + def description_for_user(user) + info = UserOpenId.where("url LIKE ?", "#{@identifier}%").find_by(user_id: user.id) + info&.email || "" + end + + def can_revoke? + true + end + + def revoke(user, skip_remote: false) + info = UserOpenId.where("url LIKE ?", "#{@identifier}%").find_by(user_id: user.id) + raise Discourse::NotFound if info.nil? + + info.destroy! + true + end + + def can_connect_existing_user? + true + end + + def after_authenticate(auth_token, existing_account: nil) result = Auth::Result.new data = auth_token[:info] @@ -23,6 +49,11 @@ class Auth::OpenIdAuthenticator < Auth::Authenticator user_open_id = UserOpenId.find_by_url(identity_url) + if existing_account && (user_open_id.nil? || existing_account.id != user_open_id.user_id) + user_open_id.destroy! if user_open_id + user_open_id = UserOpenId.create!(url: identity_url , user_id: existing_account.id, email: email, active: true) + end + if !user_open_id && @opts[:trusted] && user = User.find_by_email(email) user_open_id = UserOpenId.create(url: identity_url , user_id: user.id, email: email, active: true) end diff --git a/lib/auth/result.rb b/lib/auth/result.rb index 9f34d2c62e..e36d4638bd 100644 --- a/lib/auth/result.rb +++ b/lib/auth/result.rb @@ -69,6 +69,8 @@ class Auth::Result email_valid: !!email_valid, omit_username: !!omit_username } + result[:destination_url] = destination_url if destination_url.present? + if SiteSetting.enable_names? result[:name] = User.suggest_name(name || username || email) end diff --git a/lib/auth/twitter_authenticator.rb b/lib/auth/twitter_authenticator.rb index 36a16b1cf9..be591a0235 100644 --- a/lib/auth/twitter_authenticator.rb +++ b/lib/auth/twitter_authenticator.rb @@ -4,7 +4,35 @@ class Auth::TwitterAuthenticator < Auth::Authenticator "twitter" end - def after_authenticate(auth_token) + def enabled? + SiteSetting.enable_twitter_logins + end + + def description_for_user(user) + info = TwitterUserInfo.find_by(user_id: user.id) + info&.email || info&.screen_name || "" + end + + def can_revoke? + true + end + + def revoke(user, skip_remote: false) + info = TwitterUserInfo.find_by(user_id: user.id) + raise Discourse::NotFound if info.nil? + + # We get a token from twitter upon login but do not need it, and do not store it. + # Therefore we do not have any way to revoke the token automatically on twitter's end + + info.destroy! + true + end + + def can_connect_existing_user? + true + end + + def after_authenticate(auth_token, existing_account: nil) result = Auth::Result.new data = auth_token[:info] @@ -26,9 +54,21 @@ class Auth::TwitterAuthenticator < Auth::Authenticator user_info = TwitterUserInfo.find_by(twitter_user_id: twitter_user_id) - result.user = user_info.try(:user) + if existing_account && (user_info.nil? || existing_account.id != user_info.user_id) + user_info.destroy! if user_info + result.user = existing_account + user_info = TwitterUserInfo.create!( + user_id: result.user.id, + screen_name: result.username, + twitter_user_id: twitter_user_id, + email: result.email + ) + else + result.user = user_info&.user + end + if (!result.user) && result.email_valid && (result.user = User.find_by_email(result.email)) - TwitterUserInfo.create( + TwitterUserInfo.create!( user_id: result.user.id, screen_name: result.username, twitter_user_id: twitter_user_id, @@ -69,28 +109,28 @@ class Auth::TwitterAuthenticator < Auth::Authenticator protected - def retrieve_avatar(user, data) - return unless user - return if user.user_avatar.try(:custom_upload_id).present? + def retrieve_avatar(user, data) + return unless user + return if user.user_avatar.try(:custom_upload_id).present? - if (avatar_url = data[:twitter_image]).present? - url = avatar_url.sub("_normal", "") - Jobs.enqueue(:download_avatar_from_url, url: url, user_id: user.id, override_gravatar: false) - end + if (avatar_url = data[:twitter_image]).present? + url = avatar_url.sub("_normal", "") + Jobs.enqueue(:download_avatar_from_url, url: url, user_id: user.id, override_gravatar: false) end + end - def retrieve_profile(user, data) - return unless user + def retrieve_profile(user, data) + return unless user - bio = data[:twitter_description] - location = data[:twitter_location] + bio = data[:twitter_description] + location = data[:twitter_location] - if bio || location - profile = user.user_profile - profile.bio_raw = bio unless profile.bio_raw.present? - profile.location = location unless profile.location.present? - profile.save - end + if bio || location + profile = user.user_profile + profile.bio_raw = bio unless profile.bio_raw.present? + profile.location = location unless profile.location.present? + profile.save end + end end diff --git a/lib/autospec/manager.rb b/lib/autospec/manager.rb index 6e611a550a..b7810feffe 100644 --- a/lib/autospec/manager.rb +++ b/lib/autospec/manager.rb @@ -30,7 +30,15 @@ class Autospec::Manager def run Signal.trap("HUP") { stop_runners; exit } - Signal.trap("INT") { stop_runners; exit } + + Signal.trap("INT") do + begin + stop_runners + rescue => e + puts "FAILED TO STOP RUNNERS #{e}" + end + exit + end ensure_all_specs_will_run start_runners diff --git a/lib/autospec/rspec_runner.rb b/lib/autospec/rspec_runner.rb index 34e4043df3..e8848c6937 100644 --- a/lib/autospec/rspec_runner.rb +++ b/lib/autospec/rspec_runner.rb @@ -13,7 +13,9 @@ module Autospec watch(%r{^app/(.+)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" } watch(%r{^spec/.+_spec\.rb$}) watch(%r{^spec/support/.+\.rb$}) { "spec" } - watch("app/controllers/application_controller.rb") { "spec/controllers" } + watch("app/controllers/application_controller.rb") { "spec/requests" } + + watch(%r{app/controllers/(.+).rb}) { |m| "spec/requests/#{m[1]}_spec.rb" } watch(%r{^app/views/(.+)/.+\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" } diff --git a/lib/autospec/simple_runner.rb b/lib/autospec/simple_runner.rb index 2c1fe8e656..24150c96f5 100644 --- a/lib/autospec/simple_runner.rb +++ b/lib/autospec/simple_runner.rb @@ -3,11 +3,16 @@ require "autospec/rspec_runner" module Autospec class SimpleRunner < RspecRunner + def initialize + @mutex = Mutex.new + end def run(specs) puts "Running Rspec: " << specs # kill previous rspec instance - self.abort + @mutex.synchronize do + self.abort + end # we use our custom rspec formatter args = ["-r", "#{File.dirname(__FILE__)}/formatter.rb", "-f", "Autospec::Formatter", specs.split].flatten.join(" ") @@ -18,24 +23,42 @@ module Autospec env["LOAD_PLUGINS"] = "1" puts "Loading plugins while running specs" end - @pid = Process.spawn(env, "bin/rspec #{args}") - _, status = Process.wait2(@pid) + pid = + @mutex.synchronize do + @pid = Process.spawn(env, "bin/rspec #{args}") + end + + _, status = Process.wait2(pid) + status.exitstatus end end def abort - if @pid - Process.kill("INT", @pid) rescue nil - while (Process.getpgid(@pid) rescue nil) - sleep 0.001 - end - @pid = nil + if pid = @pid + Process.kill("TERM", pid) rescue nil + wait_for_done(pid) + pid = nil end end def stop - abort + # assume sigint on child will take care of this? + if pid = @pid + wait_for_done(pid) + end + end + + def wait_for_done(pid) + i = 3000 + while (i > 0 && Process.getpgid(pid) rescue nil) + sleep 0.001 + i -= 1 + end + if (Process.getpgid(pid) rescue nil) + STDERR.puts "Terminating rspec #{pid} by force cause it refused graceful termination" + Process.kill("KILL", pid) + end end end diff --git a/lib/avatar_lookup.rb b/lib/avatar_lookup.rb index f056e73696..8bfcd78fbe 100644 --- a/lib/avatar_lookup.rb +++ b/lib/avatar_lookup.rb @@ -12,7 +12,7 @@ class AvatarLookup private def self.lookup_columns - @lookup_columns ||= %i{id user_emails.email username uploaded_avatar_id} + @lookup_columns ||= %i{id user_emails.email username name uploaded_avatar_id} end def users diff --git a/lib/backup_restore/backup_restore.rb b/lib/backup_restore/backup_restore.rb index a0a217556e..0591b31fe1 100644 --- a/lib/backup_restore/backup_restore.rb +++ b/lib/backup_restore/backup_restore.rb @@ -76,7 +76,7 @@ module BackupRestore end def self.move_tables_between_schemas(source, destination) - User.exec_sql(move_tables_between_schemas_sql(source, destination)) + DB.exec(move_tables_between_schemas_sql(source, destination)) end def self.move_tables_between_schemas_sql(source, destination) @@ -196,7 +196,7 @@ module BackupRestore end def self.backup_tables_count - User.exec_sql("SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = 'backup'")[0]['count'].to_i + DB.query_single("SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = 'backup'").first.to_i end end diff --git a/lib/backup_restore/backuper.rb b/lib/backup_restore/backuper.rb index 491d2cf5c3..50b52e08c3 100644 --- a/lib/backup_restore/backuper.rb +++ b/lib/backup_restore/backuper.rb @@ -1,3 +1,5 @@ +require 'disk_space' + module BackupRestore class Backuper @@ -276,12 +278,18 @@ module BackupRestore unpause_sidekiq disable_readonly_mode if Discourse.readonly_mode? mark_backup_as_not_running + refresh_disk_space log "Finished!" end + def refresh_disk_space + log "Refreshing disk cache..." + DiskSpace.reset_cached_stats + end + def remove_tar_leftovers log "Removing '.tar' leftovers..." - system('rm', '-f', "#{@archive_directory}/*.tar") + Dir["#{@archive_directory}/*.tar"].each { |filename| File.delete(filename) } end def remove_tmp_directory diff --git a/lib/backup_restore/restorer.rb b/lib/backup_restore/restorer.rb index d2d46239be..a546a3072c 100644 --- a/lib/backup_restore/restorer.rb +++ b/lib/backup_restore/restorer.rb @@ -64,6 +64,7 @@ module BackupRestore wait_for_sidekiq BackupRestore.move_tables_between_schemas("public", "backup") + @db_was_changed = true restore_dump migrate_database @@ -379,14 +380,14 @@ module BackupRestore @db_was_changed = true - User.exec_sql(sql) + DB.exec(sql) end def migrate_database log "Migrating the database..." Discourse::Application.load_tasks ENV["VERSION"] = @current_version.to_s - User.exec_sql("SET search_path = public, pg_catalog;") + DB.exec("SET search_path = public, pg_catalog;") Rake::Task["db:migrate"].invoke end diff --git a/lib/badge_posts_view_manager.rb b/lib/badge_posts_view_manager.rb new file mode 100644 index 0000000000..8ec2138f9f --- /dev/null +++ b/lib/badge_posts_view_manager.rb @@ -0,0 +1,39 @@ +class BadgePostsViewManager + VIEW_NAME = "badge_posts".freeze + + def self.create! + sql = <<~SQL + CREATE VIEW #{VIEW_NAME} AS + SELECT p.* + FROM posts p + JOIN topics t ON t.id = p.topic_id + JOIN categories c ON c.id = t.category_id + WHERE c.allow_badges AND + p.deleted_at IS NULL AND + t.deleted_at IS NULL AND + NOT c.read_restricted AND + t.visible AND + p.post_type IN (1,2,3) + SQL + + DB.exec(sql) + raise "Failed to create '#{VIEW_NAME}' view" unless badge_posts_view_exists? + end + + def self.drop! + DB.exec("DROP VIEW #{VIEW_NAME}") + raise "Failed to drop '#{VIEW_NAME}' view" if badge_posts_view_exists? + end + + def self.badge_posts_view_exists? + sql = <<~SQL + SELECT 1 + FROM pg_catalog.pg_views + WHERE schemaname + IN ('public') + AND viewname = '#{VIEW_NAME}'; + SQL + + DB.exec(sql) == 1 + end +end diff --git a/lib/comment_migration.rb b/lib/comment_migration.rb index 79c1576dd7..bd00d58c37 100644 --- a/lib/comment_migration.rb +++ b/lib/comment_migration.rb @@ -13,10 +13,10 @@ class CommentMigration < ActiveRecord::Migration[4.2] comment = column[1] if column_name == :_table - ActiveRecord::Base.exec_sql "COMMENT ON TABLE #{table_name} IS ?", comment + DB.exec "COMMENT ON TABLE #{table_name} IS ?", comment puts " COMMENT ON TABLE #{table_name}" else - ActiveRecord::Base.exec_sql "COMMENT ON COLUMN #{table_name}.#{column_name} IS ?", comment + DB.exec "COMMENT ON COLUMN #{table_name}.#{column_name} IS ?", comment puts " COMMENT ON COLUMN #{table_name}.#{column_name}" end end @@ -35,10 +35,10 @@ class CommentMigration < ActiveRecord::Migration[4.2] comment = column[1] if column_name == :_table - ActiveRecord::Base.exec_sql "COMMENT ON TABLE #{table_name} IS ?", comment + DB.exec "COMMENT ON TABLE #{table_name} IS ?", comment puts " COMMENT ON TABLE #{table_name}" else - ActiveRecord::Base.exec_sql "COMMENT ON COLUMN #{table_name}.#{column_name} IS ?", comment + DB.exec "COMMENT ON COLUMN #{table_name}.#{column_name} IS ?", comment puts " COMMENT ON COLUMN #{table_name}.#{column_name}" end end diff --git a/lib/common_passwords/common_passwords.rb b/lib/common_passwords/common_passwords.rb index 0045cc8a36..bec6fca43f 100644 --- a/lib/common_passwords/common_passwords.rb +++ b/lib/common_passwords/common_passwords.rb @@ -23,32 +23,32 @@ class CommonPasswords private - class RedisPasswordList - def include?(password) - CommonPasswords.redis.sismember CommonPasswords::LIST_KEY, password - end + class RedisPasswordList + def include?(password) + CommonPasswords.redis.sismember CommonPasswords::LIST_KEY, password end + end - def self.password_list - @mutex.synchronize do - load_passwords unless redis.scard(LIST_KEY) > 0 - end - RedisPasswordList.new + def self.password_list + @mutex.synchronize do + load_passwords unless redis.scard(LIST_KEY) > 0 end + RedisPasswordList.new + end - def self.redis - $redis.without_namespace - end + def self.redis + $redis.without_namespace + end - def self.load_passwords - passwords = File.readlines(PASSWORD_FILE) - passwords.map!(&:chomp).each do |pwd| - # slower, but a tad more compatible - redis.sadd LIST_KEY, pwd - end - rescue Errno::ENOENT - # tolerate this so we don't block signups - Rails.logger.error "Common passwords file #{PASSWORD_FILE} is not found! Common password checking is skipped." + def self.load_passwords + passwords = File.readlines(PASSWORD_FILE) + passwords.map!(&:chomp).each do |pwd| + # slower, but a tad more compatible + redis.sadd LIST_KEY, pwd end + rescue Errno::ENOENT + # tolerate this so we don't block signups + Rails.logger.error "Common passwords file #{PASSWORD_FILE} is not found! Common password checking is skipped." + end end diff --git a/lib/composer_messages_finder.rb b/lib/composer_messages_finder.rb index 76c582dd57..23c58c6257 100644 --- a/lib/composer_messages_finder.rb +++ b/lib/composer_messages_finder.rb @@ -84,9 +84,10 @@ class ComposerMessagesFinder def check_sequential_replies return unless educate_reply?(:notified_about_sequential_replies) - # Count the topics made by this user in the last day + # Count the posts made by this user in the last day recent_posts_user_ids = Post.where(topic_id: @details[:topic_id]) .where("created_at > ?", 1.day.ago) + .where(post_type: Post.types[:regular]) .order('created_at desc') .limit(SiteSetting.sequential_replies_threshold) .pluck(:user_id) @@ -193,20 +194,20 @@ class ComposerMessagesFinder private - def educate_reply?(type) - replying? && - @details[:topic_id] && - (@topic.present? && !@topic.private_message?) && - (@user.post_count >= SiteSetting.educate_until_posts) && - !UserHistory.exists_for_user?(@user, type, topic_id: @details[:topic_id]) - end + def educate_reply?(type) + replying? && + @details[:topic_id] && + (@topic.present? && !@topic.private_message?) && + (@user.post_count >= SiteSetting.educate_until_posts) && + !UserHistory.exists_for_user?(@user, type, topic_id: @details[:topic_id]) + end - def creating_topic? - @details[:composer_action] == "createTopic" - end + def creating_topic? + @details[:composer_action] == "createTopic" + end - def replying? - @details[:composer_action] == "reply" - end + def replying? + @details[:composer_action] == "reply" + end end diff --git a/lib/cooked_post_processor.rb b/lib/cooked_post_processor.rb index 1dc0306dfb..c64edce285 100644 --- a/lib/cooked_post_processor.rb +++ b/lib/cooked_post_processor.rb @@ -35,12 +35,12 @@ class CookedPostProcessor post_process_oneboxes post_process_images post_process_quotes - keep_reverse_index_up_to_date optimize_urls update_post_image enforce_nofollow pull_hotlinked_images(bypass_bump) grant_badges + @post.link_post_uploads(fragments: @doc) DiscourseEvent.trigger(:post_process_cooked, @doc, @post) nil end @@ -58,26 +58,6 @@ class CookedPostProcessor BadgeGranter.grant(Badge.find(Badge::FirstReplyByEmail), @post.user, post_id: @post.id) if @post.is_reply_by_email? end - def keep_reverse_index_up_to_date - upload_ids = [] - - @doc.css("a/@href", "img/@src").each do |media| - if upload = Upload.get_from_url(media.value) - upload_ids << upload.id - end - end - - upload_ids |= downloaded_images.values.select { |id| Upload.exists?(id) } - - values = upload_ids.map { |u| "(#{@post.id},#{u})" }.join(",") - PostUpload.transaction do - PostUpload.where(post_id: @post.id).delete_all - if upload_ids.size > 0 - PostUpload.exec_sql("INSERT INTO post_uploads (post_id, upload_id) VALUES #{values}") - end - end - end - def post_process_images extract_images.each do |img| src = img["src"].sub(/^https?:/i, "") @@ -159,15 +139,25 @@ class CookedPostProcessor end def large_images - @large_images ||= JSON.parse(@post.custom_fields[Post::LARGE_IMAGES].presence || "[]") rescue [] + @large_images ||= + begin + JSON.parse(@post.custom_fields[Post::LARGE_IMAGES].presence || "[]") + rescue JSON::ParserError + [] + end end def broken_images - @broken_images ||= JSON.parse(@post.custom_fields[Post::BROKEN_IMAGES].presence || "[]") rescue [] + @broken_images ||= + begin + JSON.parse(@post.custom_fields[Post::BROKEN_IMAGES].presence || "[]") + rescue JSON::ParserError + [] + end end def downloaded_images - @downloaded_images ||= JSON.parse(@post.custom_fields[Post::DOWNLOADED_IMAGES].presence || "{}") rescue {} + @downloaded_images ||= @post.downloaded_images end def extract_images @@ -193,7 +183,7 @@ class CookedPostProcessor end def oneboxed_images - @doc.css(".onebox-body img, .onebox img") + @doc.css(".onebox-body img, .onebox img, img.onebox") end def limit_size!(img) @@ -257,23 +247,19 @@ class CookedPostProcessor return unless SiteSetting.crawl_images? || Discourse.store.has_been_uploaded?(url) @size_cache[url] = FastImage.size(absolute_url) - rescue Zlib::BufError, URI::InvalidURIError, URI::InvalidComponentError, OpenSSL::SSL::SSLError + rescue Zlib::BufError, URI::Error, OpenSSL::SSL::SSLError # FastImage.size raises BufError for some gifs, leave it. end def is_valid_image_url?(url) uri = URI.parse(url) %w(http https).include? uri.scheme - rescue URI::InvalidURIError + rescue URI::Error end - # only crop when the image is taller than 18:9 - # we only use 90% of that to allow for a small margin - MIN_RATIO_TO_CROP ||= (9.0 / 18.0) * 0.9 - def convert_to_link!(img) src = img["src"] - return if src.blank? || is_a_hyperlink?(img) + return if src.blank? || is_a_hyperlink?(img) || is_svg?(img) width, height = img["width"].to_i, img["height"].to_i # TODO: store original dimentions in db @@ -288,7 +274,10 @@ class CookedPostProcessor return if original_width <= width && original_height <= height return if original_width <= SiteSetting.max_image_width && original_height <= SiteSetting.max_image_height - if crop = (original_width.to_f / original_height.to_f < MIN_RATIO_TO_CROP) + crop = SiteSetting.min_ratio_to_crop > 0 + crop &&= original_width.to_f / original_height.to_f < SiteSetting.min_ratio_to_crop + + if crop width, height = ImageSizer.crop(original_width, original_height) img["width"] = width img["height"] = height @@ -328,7 +317,17 @@ class CookedPostProcessor # replace the image by its thumbnail w, h = img["width"].to_i, img["height"].to_i - img["src"] = upload.thumbnail(w, h).url if upload && upload.has_thumbnail?(w, h) + + if upload + thumbnail = upload.thumbnail(w, h) + + img["src"] = + if thumbnail && thumbnail.filesize.to_i < upload.filesize + upload.thumbnail(w, h).url + else + upload.url + end + end # then, some overlay informations meta = create_node("div", "meta") @@ -461,28 +460,14 @@ class CookedPostProcessor end def optimize_urls - # attachments can't be on the CDN when either setting is enabled - if SiteSetting.login_required || SiteSetting.prevent_anons_from_downloading_files - @doc.css("a.attachment[href]").each do |a| - href = a["href"].to_s - a["href"] = UrlHelper.schemaless UrlHelper.absolute_without_cdn(href) if UrlHelper.is_local(href) - end - end - - use_s3_cdn = SiteSetting.Upload.enable_s3_uploads && SiteSetting.Upload.s3_cdn_url.present? - %w{href data-download-href}.each do |selector| @doc.css("a[#{selector}]").each do |a| - href = a[selector].to_s - a[selector] = UrlHelper.schemaless UrlHelper.absolute(href) if UrlHelper.is_local(href) - a[selector] = Discourse.store.cdn_url(a[selector]) if use_s3_cdn + a[selector] = UrlHelper.cook_url(a[selector].to_s) end end @doc.css("img[src]").each do |img| - src = img["src"].to_s - img["src"] = UrlHelper.schemaless UrlHelper.absolute(src) if UrlHelper.is_local(src) - img["src"] = Discourse.store.cdn_url(img["src"]) if use_s3_cdn + img["src"] = UrlHelper.cook_url(img["src"].to_s) end end @@ -539,4 +524,17 @@ class CookedPostProcessor @doc.try(:to_html) end + private + + def is_svg?(img) + path = + begin + URI(img["src"]).path + rescue URI::Error + nil + end + + File.extname(path) == '.svg' if path + end + end diff --git a/lib/crawler_detection.rb b/lib/crawler_detection.rb index bf28c6c1aa..0c4a91573b 100644 --- a/lib/crawler_detection.rb +++ b/lib/crawler_detection.rb @@ -22,7 +22,12 @@ module CrawlerDetection if user_agent.match?(possibly_real) known_bots = (@matchers[SiteSetting.crawler_user_agents] ||= to_matcher(SiteSetting.crawler_user_agents)) - user_agent.match?(known_bots) + if user_agent.match?(known_bots) + bypass = (@matchers[SiteSetting.crawler_check_bypass_agents] ||= to_matcher(SiteSetting.crawler_check_bypass_agents)) + !user_agent.match?(bypass) + else + false + end else true end diff --git a/lib/db_helper.rb b/lib/db_helper.rb index 9d5e117696..08979cb510 100644 --- a/lib/db_helper.rb +++ b/lib/db_helper.rb @@ -8,10 +8,10 @@ class DbHelper AND (data_type LIKE 'char%' OR data_type LIKE 'text%') ORDER BY table_name, column_name" - def self.remap(from, to) + def self.remap(from, to, anchor_left = false, anchor_right = false) connection = ActiveRecord::Base.connection.raw_connection remappable_columns = connection.async_exec(REMAP_SQL).to_a - args = [from, to, "%#{from}%"] + args = [from, to, "#{anchor_left ? '' : "%"}#{from}#{anchor_right ? '' : "%"}"] remappable_columns.each do |rc| table_name = rc["table_name"] @@ -22,4 +22,21 @@ class DbHelper SiteSetting.refresh! end + def self.find(needle, anchor_left = false, anchor_right = false) + connection = ActiveRecord::Base.connection.raw_connection + text_columns = connection.async_exec(REMAP_SQL).to_a + args = ["#{anchor_left ? '' : "%"}#{needle}#{anchor_right ? '' : "%"}"] + found = {} + + text_columns.each do |rc| + table_name = rc["table_name"] + column_name = rc["column_name"] + result = connection.async_exec("SELECT #{column_name} FROM #{table_name} WHERE #{column_name} LIKE $1", args) rescue nil + if result&.ntuples > 0 + found["#{table_name}.#{column_name}"] = result.map { |r| r[column_name] } + end + end + found + end + end diff --git a/lib/demon/base.rb b/lib/demon/base.rb index af4a73bb3c..8cda80a0af 100644 --- a/lib/demon/base.rb +++ b/lib/demon/base.rb @@ -61,11 +61,14 @@ class Demon::Base end end + def stop_signal + "HUP" + end + def stop @started = false if @pid - # TODO configurable stop signal - Process.kill("HUP", @pid) + Process.kill(stop_signal, @pid) wait_for_stop = lambda { timeout = @stop_timeout @@ -82,7 +85,7 @@ class Demon::Base wait_for_stop.call if alive? - STDERR.puts "Process would not terminate cleanly, force quitting. pid: #{@pid}" + STDERR.puts "Process would not terminate cleanly, force quitting. pid: #{@pid} #{self.class}" Process.kill("KILL", @pid) end diff --git a/lib/demon/rails_autospec.rb b/lib/demon/rails_autospec.rb index 702876c87e..38444d4853 100644 --- a/lib/demon/rails_autospec.rb +++ b/lib/demon/rails_autospec.rb @@ -6,6 +6,10 @@ class Demon::RailsAutospec < Demon::Base "rails-autospec" end + def stop_signal + "TERM" + end + private def after_fork diff --git a/lib/discourse.rb b/lib/discourse.rb index 79e5984598..90c5faff19 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -25,7 +25,7 @@ module Discourse if !status.success? failure_message = "#{failure_message}\n" if !failure_message.blank? - raise "#{failure_message}#{stderr}" + raise "#{caller[0]}: #{failure_message}#{stderr}" end stdout @@ -43,6 +43,8 @@ module Discourse # other desired context. # See app/jobs/base.rb for the error_context function. def self.handle_job_exception(ex, context = {}, parent_logger = nil) + return if ex.class == Jobs::HandledExceptionWrapper + context ||= {} parent_logger ||= SidekiqExceptionHandler @@ -75,7 +77,18 @@ module Discourse end # When something they want is not found - class NotFound < StandardError; end + class NotFound < StandardError + attr_reader :status + attr_reader :check_permalinks + attr_reader :original_path + + def initialize(message = nil, status: 404, check_permalinks: false, original_path: nil) + @status = status + @check_permalinks = check_permalinks + @original_path = original_path + super(message) + end + end # When a setting is missing class SiteSettingMissing < StandardError; end @@ -198,25 +211,31 @@ module Discourse end end - def self.authenticators - # TODO: perhaps we don't need auth providers and authenticators maybe one object is enough - - # NOTE: this bypasses the site settings and gives a list of everything, we need to register every middleware - # for the cases of multisite - # In future we may change it so we don't include them all for cases where we are not a multisite, but we would - # require a restart after site settings change - Users::OmniauthCallbacksController::BUILTIN_AUTH + auth_providers.map(&:authenticator) - end + BUILTIN_AUTH ||= [ + Auth::AuthProvider.new(authenticator: Auth::FacebookAuthenticator.new, frame_width: 580, frame_height: 400), + Auth::AuthProvider.new(authenticator: Auth::GoogleOAuth2Authenticator.new, frame_width: 850, frame_height: 500), + Auth::AuthProvider.new(authenticator: Auth::OpenIdAuthenticator.new("yahoo", "https://me.yahoo.com", 'enable_yahoo_logins', trusted: true)), + Auth::AuthProvider.new(authenticator: Auth::GithubAuthenticator.new), + Auth::AuthProvider.new(authenticator: Auth::TwitterAuthenticator.new), + Auth::AuthProvider.new(authenticator: Auth::InstagramAuthenticator.new, frame_width: 1, frame_height: 1) + ] def self.auth_providers - providers = [] - plugins.each do |p| - next unless p.auth_providers - p.auth_providers.each do |prov| - providers << prov - end - end - providers + BUILTIN_AUTH + DiscoursePluginRegistry.auth_providers.to_a + end + + def self.enabled_auth_providers + auth_providers.select { |provider| provider.authenticator.enabled? } + end + + def self.authenticators + # NOTE: this bypasses the site settings and gives a list of everything, we need to register every middleware + # for the cases of multisite + auth_providers.map(&:authenticator) + end + + def self.enabled_authenticators + authenticators.select { |authenticator| authenticator.enabled? } end def self.cache @@ -251,7 +270,7 @@ module Discourse unless uri.is_a?(URI) uri = begin URI(uri) - rescue URI::InvalidURIError + rescue URI::Error end end @@ -294,10 +313,25 @@ module Discourse def self.keep_readonly_mode(key) # extend the expiry by 1 minute every 30 seconds unless Rails.env.test? - Thread.new do - while readonly_mode? - $redis.expire(key, READONLY_MODE_KEY_TTL) - sleep 30.seconds + @dbs ||= Set.new + @dbs << RailsMultisite::ConnectionManagement.current_db + @threads ||= {} + + unless @threads[key]&.alive? + @threads[key] = Thread.new do + while @dbs.size > 0 + sleep 30 + + @dbs.each do |db| + RailsMultisite::ConnectionManagement.with_connection(db) do + if readonly_mode?(key) + $redis.expire(key, READONLY_MODE_KEY_TTL) + else + @dbs.delete(db) + end + end + end + end end end end @@ -309,8 +343,8 @@ module Discourse true end - def self.readonly_mode? - recently_readonly? || $redis.mget(*READONLY_KEYS).compact.present? + def self.readonly_mode?(keys = READONLY_KEYS) + recently_readonly? || $redis.mget(*keys).compact.present? end def self.last_read_only @@ -435,9 +469,7 @@ module Discourse # after fork, otherwise Discourse will be # in a bad state def self.after_fork - # note: all this reconnecting may no longer be needed per https://github.com/redis/redis-rb/pull/414 - current_db = RailsMultisite::ConnectionManagement.current_db - RailsMultisite::ConnectionManagement.establish_connection(db: current_db) + # note: some of this reconnecting may no longer be needed per https://github.com/redis/redis-rb/pull/414 MessageBus.after_fork SiteSetting.after_fork $redis._client.reconnect @@ -457,6 +489,56 @@ module Discourse nil end + # you can use Discourse.warn when you want to report custom environment + # with the error, this helps with grouping + def self.warn(message, env = nil) + append = env ? (+" ") << env.map { |k, v|"#{k}: #{v}" }.join(" ") : "" + + if !(Logster::Logger === Rails.logger) + Rails.logger.warn("#{message}#{append}") + return + end + + loggers = [Rails.logger] + if Rails.logger.chained + loggers.concat(Rails.logger.chained) + end + + logster_env = env + + if old_env = Thread.current[Logster::Logger::LOGSTER_ENV] + logster_env = Logster::Message.populate_from_env(old_env) + + # a bit awkward by try to keep the new params + env.each do |k, v| + logster_env[k] = v + end + end + + loggers.each do |logger| + if !(Logster::Logger === logger) + logger.warn("#{message} #{append}") + next + end + + logger.store.report( + ::Logger::Severity::WARN, + "discourse", + message, + env: logster_env + ) + end + + if old_env + env.each do |k, v| + # do not leak state + logster_env.delete(k) + end + end + + nil + end + # report a warning maintaining backtrack for logster def self.warn_exception(e, message: "", env: nil) if Rails.logger.respond_to? :add_with_opts @@ -489,7 +571,7 @@ module Discourse while true begin sleep GlobalSetting.connection_reaper_interval - reap_connections(GlobalSetting.connection_reaper_age, GlobalSetting.connection_reaper_max_age) + reap_connections(GlobalSetting.connection_reaper_age) rescue => e Discourse.warn_exception(e, message: "Error reaping connections") end @@ -497,15 +579,40 @@ module Discourse end end - def self.reap_connections(idle, max_age) + def self.reap_connections(idle) pools = [] ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool) { |pool| pools << pool } pools.each do |pool| - pool.drain(idle.seconds, max_age.seconds) + # reap recovers connections that were aborted + # eg a thread died or a dev forgot to check it in + # flush removes idle connections + # after fork we have "deadpools" so ignore them, they have been discarded + # so @connections is set to nil + if pool.connections + pool.reap + pool.flush(idle) + end end end + def self.deprecate(warning) + location = caller_locations[1] + warning = "Deprecation Notice: #{warning}\nAt: #{location.label} #{location.path}:#{location.lineno}" + if Rails.env == "development" + STDERR.puts(warning) + end + + digest = Digest::MD5.hexdigest(warning) + redis_key = "deprecate-notice-#{digest}" + + if !$redis.without_namespace.get(redis_key) + Rails.logger.warn(warning) + $redis.without_namespace.setex(redis_key, 3600, "x") + end + warning + end + SIDEKIQ_NAMESPACE ||= 'sidekiq'.freeze def self.sidekiq_redis_config diff --git a/lib/discourse_hub.rb b/lib/discourse_hub.rb index cf6df955ee..bedcaeb7ce 100644 --- a/lib/discourse_hub.rb +++ b/lib/discourse_hub.rb @@ -39,23 +39,33 @@ module DiscourseHub end def self.singular_action(action, rel_url, params = {}) + connect_opts = connect_opts(params) JSON.parse(Excon.send(action, "#{hub_base_url}#{rel_url}", - headers: { 'Referer' => referer, 'Accept' => accepts.join(', ') }, - query: params, - omit_default_port: true + { + headers: { 'Referer' => referer, 'Accept' => accepts.join(', ') }, + query: params, + omit_default_port: true + }.merge(connect_opts) ).body) end def self.collection_action(action, rel_url, params = {}) + connect_opts = connect_opts(params) JSON.parse(Excon.send(action, "#{hub_base_url}#{rel_url}", - body: JSON[params], - headers: { 'Referer' => referer, 'Accept' => accepts.join(', '), "Content-Type" => "application/json" }, - omit_default_port: true + { + body: JSON[params], + headers: { 'Referer' => referer, 'Accept' => accepts.join(', '), "Content-Type" => "application/json" }, + omit_default_port: true + }.merge(connect_opts) ).body) end + def self.connect_opts(params = {}) + params.delete(:connect_opts)&.except(:body, :headers, :query) || {} + end + def self.hub_base_url if Rails.env.production? ENV['HUB_BASE_URL'] || 'https://api.discourse.org/api' diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index 547857838f..88197b0abd 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -5,6 +5,7 @@ class DiscoursePluginRegistry class << self attr_writer :javascripts + attr_writer :auth_providers attr_writer :service_workers attr_writer :admin_javascripts attr_writer :stylesheets @@ -26,6 +27,10 @@ class DiscoursePluginRegistry @javascripts ||= Set.new end + def auth_providers + @auth_providers ||= Set.new + end + def service_workers @service_workers ||= Set.new end @@ -87,6 +92,10 @@ class DiscoursePluginRegistry end end + def self.register_auth_provider(auth_provider) + self.auth_providers << auth_provider + end + def register_js(filename, options = {}) # If we have a server side option, add that too. self.class.javascripts << filename @@ -203,6 +212,10 @@ class DiscoursePluginRegistry self.class.javascripts end + def auth_providers + self.class.auth_providers + end + def service_workers self.class.service_workers end @@ -229,6 +242,7 @@ class DiscoursePluginRegistry def self.clear self.javascripts = nil + self.auth_providers = nil self.service_workers = nil self.stylesheets = nil self.mobile_stylesheets = nil @@ -240,6 +254,7 @@ class DiscoursePluginRegistry def self.reset! javascripts.clear + auth_providers.clear service_workers.clear admin_javascripts.clear stylesheets.clear diff --git a/lib/discourse_redis.rb b/lib/discourse_redis.rb index 800acd4980..00647242b8 100644 --- a/lib/discourse_redis.rb +++ b/lib/discourse_redis.rb @@ -27,7 +27,7 @@ class DiscourseRedis thread = Thread.new { initiate_fallback_to_master } thread.join break if synchronize { @master } - sleep 10 + sleep 5 ensure thread.kill end diff --git a/lib/disk_space.rb b/lib/disk_space.rb index 7a97348430..8c5e385cec 100644 --- a/lib/disk_space.rb +++ b/lib/disk_space.rb @@ -2,6 +2,9 @@ class DiskSpace extend ActionView::Helpers::NumberHelper + DISK_SPACE_STATS_CACHE_KEY = 'disk_space_stats'.freeze + DISK_SPACE_STATS_UPDATED_CACHE_KEY = 'disk_space_stats_updated'.freeze + def self.uploads_used_bytes # used(uploads_path) # temporary (on our internal setup its just too slow to iterate) @@ -37,21 +40,22 @@ class DiskSpace } end + def self.reset_cached_stats + Discourse.cache.delete(DISK_SPACE_STATS_UPDATED_CACHE_KEY) + Discourse.cache.delete(DISK_SPACE_STATS_CACHE_KEY) + end + def self.cached_stats - stats = $redis.get('disk_space_stats') - updated_at = $redis.get('disk_space_stats_updated') + stats = Discourse.cache.read(DISK_SPACE_STATS_CACHE_KEY) + updated_at = Discourse.cache.read(DISK_SPACE_STATS_UPDATED_CACHE_KEY) unless updated_at && (Time.now.to_i - updated_at.to_i) < 30.minutes - Scheduler::Defer.later "updated stats" do - $redis.set('disk_space_stats_updated', Time.now.to_i) - $redis.set('disk_space_stats', self.stats.to_json) - end + Jobs.enqueue(:update_disk_space) end if stats JSON.parse(stats) end - end protected @@ -63,5 +67,4 @@ class DiskSpace def self.used(path) `du -s #{path}`.to_i * 1024 end - end diff --git a/lib/distributed_cache.rb b/lib/distributed_cache.rb index 2c454526db..203bb2ae84 100644 --- a/lib/distributed_cache.rb +++ b/lib/distributed_cache.rb @@ -74,7 +74,7 @@ class DistributedCache def set(hash, key, value) # special support for set - marshal = (Set === value || Hash === value) + marshal = (Set === value || Hash === value || Array === value) value = Base64.encode64(Marshal.dump(value)) if marshal publish(hash, op: :set, key: key, value: value, marshalled: marshal) end diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb index e5007cae69..0d39cd5eff 100644 --- a/lib/email/message_builder.rb +++ b/lib/email/message_builder.rb @@ -17,6 +17,8 @@ module Email class MessageBuilder attr_reader :template_args + ALLOW_REPLY_BY_EMAIL_HEADER = 'X-Discourse-Allow-Reply-By-Email'.freeze + def initialize(to, opts = nil) @to = to @opts = opts || {} @@ -34,9 +36,11 @@ module Email if @opts[:include_respond_instructions] == false @template_args[:respond_instructions] = '' + @template_args[:respond_instructions] = I18n.t('user_notifications.pm_participants', @template_args) if @opts[:private_reply] else if @opts[:only_reply_by_email] string = "user_notifications.only_reply_by_email" + string << "_pm" if @opts[:private_reply] else string = allow_reply_by_email? ? "user_notifications.reply_by_email" : "user_notifications.visit_link_to_respond" string << "_pm" if @opts[:private_reply] @@ -64,6 +68,7 @@ module Email subject.gsub!("%{optional_re}", @opts[:add_re_to_subject] ? I18n.t('subject_re', @template_args) : '') subject.gsub!("%{optional_pm}", @opts[:private_reply] ? @template_args[:subject_pm] : '') subject.gsub!("%{optional_cat}", @template_args[:show_category_in_subject] ? "[#{@template_args[:show_category_in_subject]}] " : '') + subject.gsub!("%{optional_tags}", @template_args[:show_tags_in_subject] ? "#{@template_args[:show_tags_in_subject]} " : '') subject.gsub!("%{topic_title}", @template_args[:topic_title]) if @template_args[:topic_title] # must be last for safety else subject = @opts[:subject] @@ -96,13 +101,6 @@ module Email html_override.gsub!("%{respond_instructions}", "") end - if @template_args[:participants].present? - participants = PrettyText.cook(@template_args[:participants], sanitize: false).html_safe - html_override.gsub!("%{participants}", participants) - else - html_override.gsub!("%{participants}", "") - end - styled = Email::Styles.new(html_override, @opts) styled.format_basic if style = @opts[:style] @@ -119,12 +117,6 @@ module Email body = @opts[:body] body = I18n.t("#{@opts[:template]}.text_body_template", template_args).dup if @opts[:template] - if @template_args[:participants].present? - body << "\n" - body << @template_args[:participants] - body << "\n" - end - if @template_args[:unsubscribe_instructions].present? body << "\n" body << @template_args[:unsubscribe_instructions] @@ -157,7 +149,7 @@ module Email result['X-Auto-Response-Suppress'] = 'All' if allow_reply_by_email? - result['X-Discourse-Reply-Key'] = reply_key + result[ALLOW_REPLY_BY_EMAIL_HEADER] = true result['Reply-To'] = reply_by_email_address else result['Reply-To'] = from_value @@ -181,10 +173,6 @@ module Email protected - def reply_key - @reply_key ||= SecureRandom.hex(16) - end - def allow_reply_by_email? SiteSetting.reply_by_email_enabled? && reply_by_email_address.present? && @@ -206,7 +194,6 @@ module Email return nil unless SiteSetting.reply_by_email_address.present? @reply_by_email_address = SiteSetting.reply_by_email_address.dup - @reply_by_email_address.gsub!("%{reply_key}", reply_key) @reply_by_email_address = if private_reply? diff --git a/lib/email/processor.rb b/lib/email/processor.rb index 6bac32fe3a..27ae09b1b9 100644 --- a/lib/email/processor.rb +++ b/lib/email/processor.rb @@ -1,6 +1,7 @@ module Email class Processor + attr_reader :receiver def initialize(mail, retry_on_rate_limit = true) @mail = mail @@ -52,6 +53,7 @@ module Email when Email::Receiver::TopicNotFoundError then :email_reject_topic_not_found when Email::Receiver::TopicClosedError then :email_reject_topic_closed when Email::Receiver::InvalidPost then :email_reject_invalid_post + when Email::Receiver::TooShortPost then :email_reject_post_too_short when Email::Receiver::UnsubscribeNotAllowed then :email_reject_invalid_post when ActiveRecord::Rollback then :email_reject_invalid_post when Email::Receiver::InvalidPostAction then :email_reject_invalid_post_action @@ -69,6 +71,10 @@ module Email template_args[:post_error] = e.message end + if message_template == :email_reject_post_too_short + template_args[:count] = SiteSetting.min_post_length + end + if message_template == :email_reject_unrecognized_error msg = "Unrecognized error type (#{e.class}: #{e.message}) when processing incoming email" msg += "\n\nBacktrace:\n#{e.backtrace.map { |l| " #{l}" }.join("\n")}" @@ -79,6 +85,7 @@ module Email if message_template == :email_reject_old_destination template_args[:short_url] = e.message + template_args[:number_of_days] = SiteSetting.disallow_reply_by_email_after_days end if message_template diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index 09d6ca52fb..3419dbda06 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -31,6 +31,7 @@ module Email class TopicNotFoundError < ProcessingError; end class TopicClosedError < ProcessingError; end class InvalidPost < ProcessingError; end + class TooShortPost < ProcessingError; end class InvalidPostAction < ProcessingError; end class UnsubscribeNotAllowed < ProcessingError; end class EmailNotAllowed < ProcessingError; end @@ -111,6 +112,8 @@ module Email raise FromReplyByAddressError if is_from_reply_by_email_address? raise ScreenedEmailError if ScreenedEmail.should_block?(@from_email) + hidden_reason_id = is_spam? ? Post.hidden_reasons[:email_spam_header_found] : nil + user = find_user(@from_email) if user.present? @@ -149,6 +152,7 @@ module Email create_reply(user: user, raw: body, elided: elided, + hidden_reason_id: hidden_reason_id, post: post, topic: post.topic, skip_validations: user.staged?) @@ -157,7 +161,7 @@ module Email destinations.each do |destination| begin - process_destination(destination, user, body, elided) + process_destination(destination, user, body, elided, hidden_reason_id) rescue => e first_exception ||= e else @@ -167,8 +171,12 @@ module Email raise first_exception if first_exception - if post = find_related_post(force: true) - if Guardian.new(user).can_see_post?(post) && post.created_at < 90.days.ago + post = find_related_post(force: true) + + if post && Guardian.new(user).can_see_post?(post) + num_of_days = SiteSetting.disallow_reply_by_email_after_days + + if num_of_days > 0 && post.created_at < num_of_days.days.ago raise OldDestinationError.new("#{Discourse.base_url}/p/#{post.id}") end end @@ -228,9 +236,12 @@ module Email reason = I18n.t("user.deactivated", email: user.email) StaffActionLogger.new(Discourse.system_user).log_user_deactivate(user, reason) elsif range === SiteSetting.bounce_score_threshold - # NOTE: we check bounce_score before sending emails, nothing to do here other than log it happened. + # NOTE: we check bounce_score before sending emails + # So log we revoked the email... reason = I18n.t("user.email.revoked", email: user.email, date: user.user_stat.reset_bounce_score_after) StaffActionLogger.new(Discourse.system_user).log_revoke_email(user, reason) + # ... and PM the user + SystemMessage.create_from_system_user(user, :email_revoked) end end end @@ -243,6 +254,17 @@ module Email @mail.header.to_s[/auto[\-_]?(response|submitted|replied|reply|generated|respond)|holidayreply|machinegenerated/i] end + def is_spam? + case SiteSetting.email_in_spam_header + when 'X-Spam-Flag' + @mail[:x_spam_flag].to_s[/YES/i] + when 'X-Spam-Status' + @mail[:x_spam_status].to_s[/^Yes, /i] + else + false + end + end + def select_body text = nil html = nil @@ -301,7 +323,7 @@ module Email end HTML_EXTRACTERS ||= [ - [:gmail, /class="gmail_(?!default)/], + [:gmail, /class="gmail_(signature|extra)/], [:outlook, /id="(divRplyFwdMsg|Signature)"/], [:word, /class="WordSection1"/], [:exchange, /name="message(Body|Reply)Section"/], @@ -313,9 +335,8 @@ module Email ] def extract_from_gmail(doc) - # GMail adds a bunch of 'gmail_' prefixed classes like: gmail_signature, gmail_extra, gmail_quote - # Just elide them all except for 'gmail_default' - elided = doc.css("*[class^='gmail_']:not([class*='gmail_default'])").remove + # GMail adds a bunch of 'gmail_' prefixed classes like: gmail_signature, gmail_extra, gmail_quote, gmail_default... + elided = doc.css(".gmail_signature, .gmail_extra").remove to_markdown(doc.to_html, elided.to_html) end @@ -510,14 +531,16 @@ module Email end def sent_to_mailinglist_mirror? - destinations.each do |destination| - next unless destination[:type] == :category + @sent_to_mailinglist_mirror ||= begin + destinations.each do |destination| + next unless destination[:type] == :category - category = destination[:obj] - return true if category.mailinglist_mirror? + category = destination[:obj] + return true if category.mailinglist_mirror? + end + + false end - - false end def self.check_address(address) @@ -535,14 +558,14 @@ module Email if match && match.captures match.captures.each do |c| next if c.blank? - email_log = EmailLog.for(c) - return { type: :reply, obj: email_log } if email_log + post_reply_key = PostReplyKey.find_by(reply_key: c) + return { type: :reply, obj: post_reply_key } if post_reply_key end end nil end - def process_destination(destination, user, body, elided) + def process_destination(destination, user, body, elided, hidden_reason_id) return if SiteSetting.enable_forwarded_emails && has_been_forwarded? && process_forwarded_email(destination, user) @@ -550,7 +573,7 @@ module Email case destination[:type] when :group group = destination[:obj] - create_group_post(group, user, body, elided) + create_group_post(group, user, body, elided, hidden_reason_id) when :category category = destination[:obj] @@ -561,27 +584,31 @@ module Email create_topic(user: user, raw: body, elided: elided, + hidden_reason_id: hidden_reason_id, title: subject, category: category.id, skip_validations: user.staged?) when :reply - email_log = destination[:obj] + post_reply_key = destination[:obj] - if email_log.user_id != user.id && !forwarded_reply_key?(email_log, user) - raise ReplyUserNotMatchingError, "email_log.user_id => #{email_log.user_id.inspect}, user.id => #{user.id.inspect}" + if post_reply_key.user_id != user.id && !forwarded_reply_key?(post_reply_key, user) + raise ReplyUserNotMatchingError, "post_reply_key.user_id => #{post_reply_key.user_id.inspect}, user.id => #{user.id.inspect}" end + post = Post.with_deleted.find(post_reply_key.post_id) + create_reply(user: user, raw: body, elided: elided, - post: email_log.post, - topic: email_log.post.topic, + hidden_reason_id: hidden_reason_id, + post: post, + topic: post&.topic, skip_validations: user.staged?) end end - def create_group_post(group, user, body, elided) + def create_group_post(group, user, body, elided, hidden_reason_id) message_ids = Email::Receiver.extract_reply_message_ids(@mail, max_message_id_count: 5) post_ids = [] @@ -599,6 +626,7 @@ module Email create_reply(user: user, raw: body, elided: elided, + hidden_reason_id: hidden_reason_id, post: post, topic: post.topic, skip_validations: true) @@ -606,6 +634,7 @@ module Email create_topic(user: user, raw: body, elided: elided, + hidden_reason_id: hidden_reason_id, title: subject, archetype: Archetype.private_message, target_group_names: [group.name], @@ -614,11 +643,11 @@ module Email end end - def forwarded_reply_key?(email_log, user) + def forwarded_reply_key?(post_reply_key, user) incoming_emails = IncomingEmail .joins(:post) - .where('posts.topic_id = ?', email_log.topic_id) - .addressed_to(email_log.reply_key) + .where('posts.topic_id = ?', post_reply_key.post.topic_id) + .addressed_to(post_reply_key.reply_key) .addressed_to_user(user) .pluck(:to_addresses, :cc_addresses) @@ -626,8 +655,8 @@ module Email next unless contains_email_address_of_user?(to_addresses, user) || contains_email_address_of_user?(cc_addresses, user) - return true if contains_reply_by_email_address(to_addresses, email_log.reply_key) || - contains_reply_by_email_address(cc_addresses, email_log.reply_key) + return true if contains_reply_by_email_address(to_addresses, post_reply_key.reply_key) || + contains_reply_by_email_address(cc_addresses, post_reply_key.reply_key) end false @@ -807,13 +836,14 @@ module Email def create_reply(options = {}) raise TopicNotFoundError if options[:topic].nil? || options[:topic].trashed? + options[:post] = nil if options[:post]&.trashed? if post_action_type = post_action_for(options[:raw]) create_post_action(options[:user], options[:post], post_action_type) else raise TopicClosedError if options[:topic].closed? - options[:topic_id] = options[:post].try(:topic_id) - options[:reply_to_post_number] = options[:post].try(:post_number) + options[:topic_id] = options[:topic].id + options[:reply_to_post_number] = options[:post]&.post_number options[:is_group_message] = options[:topic].private_message? && options[:topic].allowed_groups.exists? create_post_with_attachments(options) end @@ -915,7 +945,14 @@ module Email user = options.delete(:user) result = NewPostManager.new(user, options).perform - raise InvalidPost, result.errors.full_messages.join("\n") if result.errors.any? + errors = result.errors.full_messages + if errors.any? do |message| + message.include?(I18n.t("activerecord.attributes.post.raw").strip) && + message.include?(I18n.t("errors.messages.too_short", count: SiteSetting.min_post_length).strip) + end + raise TooShortPost + end + raise InvalidPost, errors.join("\n") if result.errors.any? if result.post @incoming_email.update_columns(topic_id: result.post.topic_id, post_id: result.post.id) diff --git a/lib/email/renderer.rb b/lib/email/renderer.rb index be802b7a99..77721ab4c5 100644 --- a/lib/email/renderer.rb +++ b/lib/email/renderer.rb @@ -10,7 +10,7 @@ module Email def text return @text if @text - @text = (@message.text_part ? @message.text_part : @message).body.to_s.force_encoding('UTF-8') + @text = (+(@message.text_part ? @message.text_part : @message).body.to_s).force_encoding('UTF-8') @text = CGI.unescapeHTML(@text) end diff --git a/lib/email/sender.rb b/lib/email/sender.rb index 6ded4b88e9..c4daf17ec4 100644 --- a/lib/email/sender.rb +++ b/lib/email/sender.rb @@ -22,18 +22,26 @@ module Email end def send - return if SiteSetting.disable_emails && @email_type.to_s != "admin_login" + return if SiteSetting.disable_emails == "yes" && @email_type.to_s != "admin_login" return if ActionMailer::Base::NullMail === @message return if ActionMailer::Base::NullMail === (@message.message rescue nil) - return skip(I18n.t('email_log.message_blank')) if @message.blank? - return skip(I18n.t('email_log.message_to_blank')) if @message.to.blank? + return skip(SkippedEmailLog.reason_types[:sender_message_blank]) if @message.blank? + return skip(SkippedEmailLog.reason_types[:sender_message_to_blank]) if @message.to.blank? + + if SiteSetting.disable_emails == "non-staff" + return unless User.find_by_email(to_address)&.staff? + end if @message.text_part - return skip(I18n.t('email_log.text_part_body_blank')) if @message.text_part.body.to_s.blank? + if @message.text_part.body.to_s.blank? + return skip(SkippedEmailLog.reason_types[:sender_text_part_body_blank]) + end else - return skip(I18n.t('email_log.body_blank')) if @message.body.to_s.blank? + if @message.body.to_s.blank? + return skip(SkippedEmailLog.reason_types[:sender_body_blank]) + end end @message.charset = 'UTF-8' @@ -59,24 +67,31 @@ module Email @message.parts[0].body = @message.parts[0].body.to_s.gsub(/]*)>/, '![](' + url_prefix + '\1)') @message.text_part.content_type = 'text/plain; charset=UTF-8' + user_id = @user&.id # Set up the email log - email_log = EmailLog.new(email_type: @email_type, to_address: to_address, user_id: @user.try(:id)) + email_log = EmailLog.new( + email_type: @email_type, + to_address: to_address, + user_id: user_id + ) host = Email::Sender.host_for(Discourse.base_url) post_id = header_value('X-Discourse-Post-Id') topic_id = header_value('X-Discourse-Topic-Id') - reply_key = header_value('X-Discourse-Reply-Key') + reply_key = set_reply_key(post_id, user_id) # always set a default Message ID from the host @message.header['Message-ID'] = "<#{SecureRandom.uuid}@#{host}>" - if topic_id.present? - email_log.topic_id = topic_id + if topic_id.present? && post_id.present? + post = Post.find_by(id: post_id, topic_id: topic_id) - post = Post.find_by(id: post_id) - topic = Topic.find_by(id: topic_id) + # guards against deleted posts + return skip(SkippedEmailLog.reason_types[:sender_post_deleted]) unless post + + topic = post.topic first_post = topic.ordered_posts.first topic_message_id = first_post.incoming_email&.message_id.present? ? @@ -91,14 +106,14 @@ module Email .where(id: PostReply.where(reply_id: post_id).select(:post_id)) .order(id: :desc) - referenced_post_message_ids = referenced_posts.map do |post| - if post.incoming_email&.message_id.present? - "<#{post.incoming_email.message_id}>" + referenced_post_message_ids = referenced_posts.map do |referenced_post| + if referenced_post.incoming_email&.message_id.present? + "<#{referenced_post.incoming_email.message_id}>" else - if post.post_number == 1 + if referenced_post.post_number == 1 "" else - "" + "" end end end @@ -113,7 +128,7 @@ module Email end # https://www.ietf.org/rfc/rfc2919.txt - if topic && topic.category && !topic.category.uncategorized? + if topic&.category && !topic.category.uncategorized? list_id = "#{SiteSetting.title} | #{topic.category.name} <#{topic.category.name.downcase.tr(' ', '-')}.#{host}>" # subcategory case @@ -153,12 +168,14 @@ module Email end email_log.post_id = post_id if post_id.present? - email_log.reply_key = reply_key if reply_key.present? # Remove headers we don't need anymore - @message.header['X-Discourse-Topic-Id'] = nil if topic_id.present? - @message.header['X-Discourse-Post-Id'] = nil if post_id.present? - @message.header['X-Discourse-Reply-Key'] = nil if reply_key.present? + @message.header['X-Discourse-Topic-Id'] = nil if topic_id.present? + @message.header['X-Discourse-Post-Id'] = nil if post_id.present? + + if reply_key.present? + @message.header[Email::MessageBuilder::ALLOW_REPLY_BY_EMAIL_HEADER] = nil + end # pass the original message_id when using mailjet/mandrill/sparkpost case ActionMailer::Base.smtp_settings[:address] @@ -183,10 +200,9 @@ module Email begin @message.deliver_now rescue *SMTP_CLIENT_ERRORS => e - return skip(e.message) + return skip(SkippedEmailLog.reason_types[:custom], custom_reason: e.message) end - # Save and return the email log email_log.save! email_log end @@ -205,7 +221,7 @@ module Email begin uri = URI.parse(base_url) host = uri.host.downcase if uri.host.present? - rescue URI::InvalidURIError + rescue URI::Error end end host @@ -219,14 +235,16 @@ module Email header.value end - def skip(reason) - EmailLog.create!( + def skip(reason_type, custom_reason: nil) + attributes = { email_type: @email_type, to_address: to_address, - user_id: @user.try(:id), - skipped: true, - skipped_reason: "[Sender] #{reason}" - ) + user_id: @user&.id, + reason_type: reason_type + } + + attributes[:custom_reason] = custom_reason if custom_reason + SkippedEmailLog.create!(attributes) end def merge_json_x_header(name, value) @@ -242,5 +260,20 @@ module Email @message.header[name] = data.to_json end + def set_reply_key(post_id, user_id) + return unless user_id && + post_id && + header_value(Email::MessageBuilder::ALLOW_REPLY_BY_EMAIL_HEADER).present? + + # use safe variant here cause we tend to see concurrency issue + reply_key = PostReplyKey.find_or_create_by_safe!( + post_id: post_id, + user_id: user_id + ).reply_key + + @message.header['Reply-To'] = + header_value('Reply-To').gsub!("%{reply_key}", reply_key) + end + end end diff --git a/lib/email/styles.rb b/lib/email/styles.rb index 7a34bc679e..33ae884b7f 100644 --- a/lib/email/styles.rb +++ b/lib/email/styles.rb @@ -84,9 +84,9 @@ module Email def format_notification style('.previous-discussion', 'font-size: 17px; color: #444; margin-bottom:10px;') style('.notification-date', "text-align:right;color:#999999;padding-right:5px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;font-size:11px") - style('.username', "font-size:13px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;color:#3b5998;text-decoration:none;font-weight:bold") + style('.username', "font-size:13px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;color:#{SiteSetting.email_link_color};text-decoration:none;font-weight:bold") style('.user-title', "font-size:13px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;text-decoration:none;margin-left:7px;color: #999;") - style('.user-name', "font-size:13px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;text-decoration:none;margin-left:7px;color: #3b5998;font-weight:normal;") + style('.user-name', "font-size:13px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;text-decoration:none;margin-left:7px;color: #{SiteSetting.email_link_color};font-weight:normal;") style('.post-wrapper', "margin-bottom:25px;") style('.user-avatar', 'vertical-align:top;width:55px;') style('.user-avatar img', nil, width: '45', height: '45') @@ -98,6 +98,7 @@ module Email correct_first_body_margin correct_footer_style style('div.undecorated-link-footer a', "font-weight: normal;") + correct_footer_style_hilight_first reset_tables onebox_styles plugin_styles @@ -152,7 +153,7 @@ module Email # If an iframe is protocol relative, use SSL when displaying it display_src = "#{src_uri.scheme || 'https'}://#{src_uri.host}#{src_uri.path}#{src_uri.query.nil? ? '' : '?' + src_uri.query}#{src_uri.fragment.nil? ? '' : '#' + src_uri.fragment}" i.replace "

#{CGI.escapeHTML(display_src)}

" - rescue URI::InvalidURIError + rescue URI::Error # If the URL is weird, remove the iframe i.remove end @@ -214,7 +215,7 @@ module Email @fragment.css("a").each do |link| begin link["href"] = "#{site_uri}#{link['href']}" unless URI(link["href"].to_s).host.present? - rescue URI::InvalidURIError, URI::InvalidComponentError + rescue URI::Error # leave it end end @@ -242,20 +243,27 @@ module Email end def correct_footer_style - footernum = 0 @fragment.css('.footer').each do |element| element['style'] = "color:#666;" + element.css('a').each do |inner| + inner['style'] = "color:#666;" + end + end + end + + def correct_footer_style_hilight_first + footernum = 0 + @fragment.css('.footer.hilight').each do |element| linknum = 0 element.css('a').each do |inner| # we want the first footer link to be specially highlighted as IMPORTANT if footernum == (0) && linknum == (0) - inner['style'] = "background-color: #006699; color:#ffffff; border-top: 4px solid #006699; border-right: 6px solid #006699; border-bottom: 4px solid #006699; border-left: 6px solid #006699; display: inline-block;" - else - inner['style'] = "color:#666;" + bg_color = SiteSetting.email_accent_bg_color + inner['style'] = "background-color: #{bg_color}; color: #{SiteSetting.email_accent_fg_color}; border-top: 4px solid #{bg_color}; border-right: 6px solid #{bg_color}; border-bottom: 4px solid #{bg_color}; border-left: 6px solid #{bg_color}; display: inline-block; font-weight: bold;" end - linknum += 1 + return end - footernum += 1 + return end end diff --git a/lib/email_updater.rb b/lib/email_updater.rb index d3d8eaf339..dd7670f75b 100644 --- a/lib/email_updater.rb +++ b/lib/email_updater.rb @@ -104,19 +104,19 @@ class EmailUpdater protected - def notify_old(old_email, new_email) - Jobs.enqueue :critical_user_email, - to_address: old_email, - type: :notify_old_email, - user_id: @user.id - end + def notify_old(old_email, new_email) + Jobs.enqueue :critical_user_email, + to_address: old_email, + type: :notify_old_email, + user_id: @user.id + end - def send_email(type, email_token) - Jobs.enqueue :critical_user_email, - to_address: email_token.email, - type: type, - user_id: @user.id, - email_token: email_token.token - end + def send_email(type, email_token) + Jobs.enqueue :critical_user_email, + to_address: email_token.email, + type: type, + user_id: @user.id, + email_token: email_token.token + end end diff --git a/lib/emoji/db.json b/lib/emoji/db.json index f23998d8f4..31bf152c41 100644 --- a/lib/emoji/db.json +++ b/lib/emoji/db.json @@ -6023,6 +6023,314 @@ { "code": "1f1fa-1f1f3", "name": "united_nations" + }, + { + "code": "1f970", + "name": "smiling_face_with_three_hearts" + }, + { + "code": "1f975", + "name": "hot_face" + }, + { + "code": "1f976", + "name": "cold_face" + }, + { + "code": "1f973", + "name": "partying_face" + }, + { + "code": "1f974", + "name": "woozy_face" + }, + { + "code": "1f97a", + "name": "pleading_face" + }, + { + "code": "1f468-200d-1f9b0", + "name": "man_red_haired" + }, + { + "code": "1f468-200d-1f9b1", + "name": "man_curly_haired" + }, + { + "code": "1f468-200d-1f9b3", + "name": "man_white_haired" + }, + { + "code": "1f468-200d-1f9b2", + "name": "man_bald" + }, + { + "code": "1f469-200d-1f9b0", + "name": "woman_red_haired" + }, + { + "code": "1f469-200d-1f9b1", + "name": "woman_curly_haired" + }, + { + "code": "1f469-200d-1f9b3", + "name": "woman_white_haired" + }, + { + "code": "1f469-200d-1f9b2", + "name": "woman_bald" + }, + { + "code": "1f9b8", + "name": "superhero" + }, + { + "code": "1f9b8-200d-2642", + "name": "man_superhero" + }, + { + "code": "1f9b8-200d-2640", + "name": "woman_superhero" + }, + { + "code": "1f9b9", + "name": "supervillain" + }, + { + "code": "1f9b9-200d-2640", + "name": "woman_supervillain" + }, + { + "code": "1f9b9-200d-2642", + "name": "man_supervillain" + }, + { + "code": "1f9b5", + "name": "leg" + }, + { + "code": "1f9b6", + "name": "foot" + }, + { + "code": "1f9b4", + "name": "bone" + }, + { + "code": "1f9b7", + "name": "tooth" + }, + { + "code": "1f97d", + "name": "goggles" + }, + { + "code": "1f97c", + "name": "lab_coat" + }, + { + "code": "1f97e", + "name": "hiking_boot" + }, + { + "code": "1f97f", + "name": "flat_shoe" + }, + { + "code": "1f99d", + "name": "raccoon" + }, + { + "code": "1f999", + "name": "llama" + }, + { + "code": "1f99b", + "name": "hippopotamus" + }, + { + "code": "1f998", + "name": "kangaroo" + }, + { + "code": "1f9a1", + "name": "badger" + }, + { + "code": "1f9a2", + "name": "swan" + }, + { + "code": "1f99a", + "name": "peacock" + }, + { + "code": "1f99c", + "name": "parrot" + }, + { + "code": "1f99e", + "name": "lobster" + }, + { + "code": "1f99f", + "name": "mosquito" + }, + { + "code": "1f9a0", + "name": "microbe" + }, + { + "code": "1f96d", + "name": "mango" + }, + { + "code": "1f96c", + "name": "leafy_green" + }, + { + "code": "1f96f", + "name": "bagel" + }, + { + "code": "1f9c2", + "name": "salt" + }, + { + "code": "1f96e", + "name": "moon_cake" + }, + { + "code": "1f9c1", + "name": "cupcake" + }, + { + "code": "1f9ed", + "name": "compass" + }, + { + "code": "1f9f1", + "name": "brick" + }, + { + "code": "1f6f9", + "name": "skateboard" + }, + { + "code": "1f9f3", + "name": "luggage" + }, + { + "code": "1f9e8", + "name": "firecracker" + }, + { + "code": "1f9e7", + "name": "red_gift_envelope" + }, + { + "code": "1f94e", + "name": "softball" + }, + { + "code": "1f94f", + "name": "flying_disc" + }, + { + "code": "1f94d", + "name": "lacrosse" + }, + { + "code": "1f9ff", + "name": "nazar_amulet" + }, + { + "code": "1f9e9", + "name": "jigsaw" + }, + { + "code": "1f9f8", + "name": "teddy_bear" + }, + { + "code": "265f", + "name": "chess_pawn" + }, + { + "code": "1f9f5", + "name": "thread" + }, + { + "code": "1f9f6", + "name": "yarn" + }, + { + "code": "1f9ee", + "name": "abacus" + }, + { + "code": "1f9fe", + "name": "receipt" + }, + { + "code": "1f9f0", + "name": "toolbox" + }, + { + "code": "1f9f2", + "name": "magnet" + }, + { + "code": "1f9ea", + "name": "test_tube" + }, + { + "code": "1f9eb", + "name": "petri_dish" + }, + { + "code": "1f9ec", + "name": "dna" + }, + { + "code": "1f9f4", + "name": "lotion_bottle" + }, + { + "code": "1f9f7", + "name": "safety_pin" + }, + { + "code": "1f9f9", + "name": "broom" + }, + { + "code": "1f9fa", + "name": "basket" + }, + { + "code": "1f9fb", + "name": "roll_of_toilet_paper" + }, + { + "code": "1f9fc", + "name": "soap" + }, + { + "code": "1f9fd", + "name": "sponge" + }, + { + "code": "1f9ef", + "name": "fire_extinguisher" + }, + { + "code": "267e", + "name": "infinity" + }, + { + "code": "1f3f4-200d-2620", + "name": "pirate_flag" } ], "tonableEmojis": [ diff --git a/lib/emoji/groups.json b/lib/emoji/groups.json index 50d78901d6..023248de1f 100644 --- a/lib/emoji/groups.json +++ b/lib/emoji/groups.json @@ -60,6 +60,10 @@ "name": "kissing_heart", "diversity": false }, + { + "name": "smiling_face_with_three_hearts", + "diversity": false + }, { "name": "kissing", "diversity": false @@ -260,6 +264,14 @@ "name": "scream", "diversity": false }, + { + "name": "hot_face", + "diversity": false + }, + { + "name": "cold_face", + "diversity": false + }, { "name": "flushed", "diversity": false @@ -316,6 +328,18 @@ "name": "cowboy_hat_face", "diversity": false }, + { + "name": "partying_face", + "diversity": false + }, + { + "name": "woozy_face", + "diversity": false + }, + { + "name": "pleading_face", + "diversity": false + }, { "name": "lying_face", "diversity": false @@ -452,14 +476,58 @@ "name": "adult", "diversity": true }, + { + "name": "blonde_man", + "diversity": true + }, { "name": "man", "diversity": true }, + { + "name": "man_red_haired", + "diversity": false + }, + { + "name": "man_curly_haired", + "diversity": false + }, + { + "name": "man_white_haired", + "diversity": false + }, + { + "name": "man_bald", + "diversity": false + }, + { + "name": "bearded_person", + "diversity": true + }, { "name": "woman", "diversity": true }, + { + "name": "blonde_woman", + "diversity": true + }, + { + "name": "woman_red_haired", + "diversity": false + }, + { + "name": "woman_curly_haired", + "diversity": false + }, + { + "name": "woman_white_haired", + "diversity": false + }, + { + "name": "woman_bald", + "diversity": false + }, { "name": "older_adult", "diversity": true @@ -656,18 +724,6 @@ "name": "woman_with_headscarf", "diversity": true }, - { - "name": "bearded_person", - "diversity": true - }, - { - "name": "blonde_man", - "diversity": true - }, - { - "name": "blonde_woman", - "diversity": true - }, { "name": "man_in_tuxedo", "diversity": true @@ -696,6 +752,30 @@ "name": "mrs_claus", "diversity": true }, + { + "name": "superhero", + "diversity": false + }, + { + "name": "man_superhero", + "diversity": false + }, + { + "name": "woman_superhero", + "diversity": false + }, + { + "name": "supervillain", + "diversity": false + }, + { + "name": "man_supervillain", + "diversity": false + }, + { + "name": "woman_supervillain", + "diversity": false + }, { "name": "mage", "diversity": true @@ -956,6 +1036,14 @@ "name": "muscle", "diversity": true }, + { + "name": "leg", + "diversity": false + }, + { + "name": "foot", + "diversity": false + }, { "name": "point_left", "diversity": true @@ -1104,6 +1192,14 @@ "name": "brain", "diversity": false }, + { + "name": "bone", + "diversity": false + }, + { + "name": "tooth", + "diversity": false + }, { "name": "tongue", "diversity": false @@ -1151,6 +1247,10 @@ "name": "fox_face", "diversity": false }, + { + "name": "raccoon", + "diversity": false + }, { "name": "cat", "diversity": false @@ -1247,6 +1347,10 @@ "name": "camel", "diversity": false }, + { + "name": "llama", + "diversity": false + }, { "name": "giraffe", "diversity": false @@ -1259,6 +1363,10 @@ "name": "rhinoceros", "diversity": false }, + { + "name": "hippopotamus", + "diversity": false + }, { "name": "mouse", "diversity": false @@ -1307,6 +1415,14 @@ "name": "panda_face", "diversity": false }, + { + "name": "kangaroo", + "diversity": false + }, + { + "name": "badger", + "diversity": false + }, { "name": "paw_prints", "diversity": false @@ -1355,10 +1471,22 @@ "name": "duck", "diversity": false }, + { + "name": "swan", + "diversity": false + }, { "name": "owl", "diversity": false }, + { + "name": "peacock", + "diversity": false + }, + { + "name": "parrot", + "diversity": false + }, { "name": "frog", "diversity": false @@ -1431,18 +1559,6 @@ "name": "shell", "diversity": false }, - { - "name": "crab", - "diversity": false - }, - { - "name": "shrimp", - "diversity": false - }, - { - "name": "squid", - "diversity": false - }, { "name": "snail", "diversity": false @@ -1483,6 +1599,14 @@ "name": "scorpion", "diversity": false }, + { + "name": "mosquito", + "diversity": false + }, + { + "name": "microbe", + "diversity": false + }, { "name": "bouquet", "diversity": false @@ -1786,6 +1910,10 @@ "name": "pineapple", "diversity": false }, + { + "name": "mango", + "diversity": false + }, { "name": "apple", "diversity": false @@ -1850,6 +1978,10 @@ "name": "cucumber", "diversity": false }, + { + "name": "leafy_green", + "diversity": false + }, { "name": "broccoli", "diversity": false @@ -1882,6 +2014,10 @@ "name": "pretzel", "diversity": false }, + { + "name": "bagel", + "diversity": false + }, { "name": "pancakes", "diversity": false @@ -1966,6 +2102,10 @@ "name": "popcorn", "diversity": false }, + { + "name": "salt", + "diversity": false + }, { "name": "canned_food", "diversity": false @@ -2018,6 +2158,10 @@ "name": "fish_cake", "diversity": false }, + { + "name": "moon_cake", + "diversity": false + }, { "name": "dango", "diversity": false @@ -2062,6 +2206,10 @@ "name": "cake", "diversity": false }, + { + "name": "cupcake", + "diversity": false + }, { "name": "pie", "diversity": false @@ -2189,6 +2337,10 @@ "name": "sparkler", "diversity": false }, + { + "name": "firecracker", + "diversity": false + }, { "name": "sparkles", "diversity": false @@ -2229,6 +2381,10 @@ "name": "rice_scene", "diversity": false }, + { + "name": "red_gift_envelope", + "diversity": false + }, { "name": "ribbon", "diversity": false @@ -2258,19 +2414,7 @@ "diversity": false }, { - "name": "heart", - "diversity": false - }, - { - "name": "heartbeat", - "diversity": false - }, - { - "name": "broken_heart", - "diversity": false - }, - { - "name": "two_hearts", + "name": "gift_heart", "diversity": false }, { @@ -2282,11 +2426,35 @@ "diversity": false }, { - "name": "blue_heart", + "name": "heartbeat", "diversity": false }, { - "name": "green_heart", + "name": "revolving_hearts", + "diversity": false + }, + { + "name": "two_hearts", + "diversity": false + }, + { + "name": "love_letter", + "diversity": false + }, + { + "name": "heavy_heart_exclamation", + "diversity": false + }, + { + "name": "broken_heart", + "diversity": false + }, + { + "name": "heart", + "diversity": false + }, + { + "name": "orange_heart", "diversity": false }, { @@ -2294,7 +2462,11 @@ "diversity": false }, { - "name": "orange_heart", + "name": "green_heart", + "diversity": false + }, + { + "name": "blue_heart", "diversity": false }, { @@ -2305,26 +2477,10 @@ "name": "black_heart", "diversity": false }, - { - "name": "gift_heart", - "diversity": false - }, - { - "name": "revolving_hearts", - "diversity": false - }, { "name": "heart_decoration", "diversity": false }, - { - "name": "heavy_heart_exclamation", - "diversity": false - }, - { - "name": "love_letter", - "diversity": false - }, { "name": "zzz", "diversity": false @@ -2612,6 +2768,10 @@ "name": "baseball", "diversity": false }, + { + "name": "softball", + "diversity": false + }, { "name": "basketball", "diversity": false @@ -2632,6 +2792,10 @@ "name": "tennis", "diversity": false }, + { + "name": "flying_disc", + "diversity": false + }, { "name": "bowling", "diversity": false @@ -2648,6 +2812,10 @@ "name": "ice_hockey", "diversity": false }, + { + "name": "lacrosse", + "diversity": false + }, { "name": "ping_pong", "diversity": false @@ -2708,6 +2876,10 @@ "name": "crystal_ball", "diversity": false }, + { + "name": "nazar_amulet", + "diversity": false + }, { "name": "video_game", "diversity": false @@ -2724,6 +2896,14 @@ "name": "game_die", "diversity": false }, + { + "name": "jigsaw", + "diversity": false + }, + { + "name": "teddy_bear", + "diversity": false + }, { "name": "spades", "diversity": false @@ -2740,6 +2920,10 @@ "name": "clubs", "diversity": false }, + { + "name": "chess_pawn", + "diversity": false + }, { "name": "black_joker", "diversity": false @@ -2843,6 +3027,10 @@ "name": "japan", "diversity": false }, + { + "name": "compass", + "diversity": false + }, { "name": "mountain_snow", "diversity": false @@ -2891,6 +3079,10 @@ "name": "building_construction", "diversity": false }, + { + "name": "brick", + "diversity": false + }, { "name": "houses", "diversity": false @@ -3179,6 +3371,10 @@ "name": "kick_scooter", "diversity": false }, + { + "name": "skateboard", + "diversity": false + }, { "name": "motor_scooter", "diversity": false @@ -3307,6 +3503,10 @@ "name": "bellhop_bell", "diversity": false }, + { + "name": "luggage", + "diversity": false + }, { "name": "checkered_flag", "diversity": false @@ -3331,6 +3531,10 @@ "name": "rainbow_flag", "diversity": false }, + { + "name": "pirate_flag", + "diversity": false + }, { "name": "ascension_island", "diversity": false @@ -4378,6 +4582,14 @@ "name": "dark_sunglasses", "diversity": false }, + { + "name": "goggles", + "diversity": false + }, + { + "name": "lab_coat", + "diversity": false + }, { "name": "necktie", "diversity": false @@ -4450,6 +4662,14 @@ "name": "athletic_shoe", "diversity": false }, + { + "name": "hiking_boot", + "diversity": false + }, + { + "name": "flat_shoe", + "diversity": false + }, { "name": "high_heel", "diversity": false @@ -4634,6 +4854,10 @@ "name": "dvd", "diversity": false }, + { + "name": "abacus", + "diversity": false + }, { "name": "movie_camera", "diversity": false @@ -4790,6 +5014,10 @@ "name": "credit_card", "diversity": false }, + { + "name": "receipt", + "diversity": false + }, { "name": "chart", "diversity": false @@ -5062,6 +5290,14 @@ "name": "chains", "diversity": false }, + { + "name": "toolbox", + "diversity": false + }, + { + "name": "magnet", + "diversity": false + }, { "name": "syringe", "diversity": false @@ -5466,6 +5702,10 @@ "name": "mobile_phone_off", "diversity": false }, + { + "name": "infinity", + "diversity": false + }, { "name": "recycle", "diversity": false @@ -5803,21 +6043,37 @@ "diversity": false }, { - "name": "black_small_square", + "name": "red_circle", "diversity": false }, { - "name": "white_small_square", + "name": "large_blue_circle", "diversity": false }, { - "name": "white_medium_square", + "name": "white_circle", + "diversity": false + }, + { + "name": "black_circle", + "diversity": false + }, + { + "name": "white_large_square", + "diversity": false + }, + { + "name": "black_large_square", "diversity": false }, { "name": "black_medium_square", "diversity": false }, + { + "name": "white_medium_square", + "diversity": false + }, { "name": "white_medium_small_square", "diversity": false @@ -5827,11 +6083,11 @@ "diversity": false }, { - "name": "black_large_square", + "name": "white_small_square", "diversity": false }, { - "name": "white_large_square", + "name": "black_small_square", "diversity": false }, { @@ -5874,22 +6130,6 @@ "name": "white_square_button", "diversity": false }, - { - "name": "white_circle", - "diversity": false - }, - { - "name": "black_circle", - "diversity": false - }, - { - "name": "red_circle", - "diversity": false - }, - { - "name": "large_blue_circle", - "diversity": false - }, { "name": "hourglass", "diversity": false diff --git a/lib/encodings.rb b/lib/encodings.rb new file mode 100644 index 0000000000..f323deff07 --- /dev/null +++ b/lib/encodings.rb @@ -0,0 +1,33 @@ +require 'rchardet' + +module Encodings + def self.to_utf8(string) + result = CharDet.detect(string) + + encoded_string = try_utf8(string, result['encoding']) if result && result['encoding'] + encoded_string = force_utf8(string) if encoded_string.nil? + encoded_string + end + + def self.try_utf8(string, source_encoding) + encoded = string.encode(Encoding::UTF_8, source_encoding) + encoded&.valid_encoding? ? delete_bom!(encoded) : nil + rescue Encoding::InvalidByteSequenceError, + Encoding::UndefinedConversionError, + Encoding::ConverterNotFoundError + nil + end + + def self.force_utf8(string) + encoded_string = string.encode(Encoding::UTF_8, + undef: :replace, + invalid: :replace, + replace: '') + delete_bom!(encoded_string) + end + + def self.delete_bom!(string) + string.sub!(/\A\xEF\xBB\xBF/, '') unless string.blank? + string + end +end diff --git a/lib/file_helper.rb b/lib/file_helper.rb index 7ef5952390..21c0cd79bc 100644 --- a/lib/file_helper.rb +++ b/lib/file_helper.rb @@ -25,7 +25,8 @@ class FileHelper follow_redirect: false, read_timeout: 5, skip_rate_limit: false, - verbose: false) + verbose: false, + retain_on_max_file_size_exceeded: false) url = "https:" + url if url.start_with?("//") raise Discourse::InvalidParameters.new(:url) unless url =~ /^https?:\/\// @@ -54,22 +55,27 @@ class FileHelper end end - # first run - tmp_file_ext = File.extname(uri.path) - - if tmp_file_ext.blank? && response.content_type.present? + if response.content_type.present? ext = MiniMime.lookup_by_content_type(response.content_type)&.extension ext = "jpg" if ext == "jpe" tmp_file_ext = "." + ext if ext.present? end + tmp_file_ext ||= File.extname(uri.path) tmp = Tempfile.new([tmp_file_name, tmp_file_ext]) tmp.binmode end tmp.write(chunk) - throw :done if tmp.size > max_file_size + if tmp.size > max_file_size + unless retain_on_max_file_size_exceeded + tmp.close + tmp = nil + end + + throw :done + end end tmp&.rewind @@ -96,12 +102,12 @@ class FileHelper private - def self.images - @@images ||= Set.new %w{jpg jpeg png gif tif tiff bmp svg webp ico} - end + def self.images + @@images ||= Set.new %w{jpg jpeg png gif tif tiff bmp svg webp ico} + end - def self.images_regexp - @@images_regexp ||= /\.(#{images.to_a.join("|")})$/i - end + def self.images_regexp + @@images_regexp ||= /\.(#{images.to_a.join("|")})$/i + end end diff --git a/lib/file_store/base_store.rb b/lib/file_store/base_store.rb index aa602c2c79..5523c4a2c8 100644 --- a/lib/file_store/base_store.rb +++ b/lib/file_store/base_store.rb @@ -128,10 +128,10 @@ module FileStore def cache_file(file, filename) path = get_cache_path_for(filename) dir = File.dirname(path) - FileUtils.mkdir_p(dir) unless Dir[dir].present? + FileUtils.mkdir_p(dir) unless Dir.exist?(dir) FileUtils.cp(file.path, path) # keep latest 500 files - `ls -tr #{CACHE_DIR} | head -n -#{CACHE_MAXIMUM_SIZE} | xargs rm -f` + `ls -tr #{CACHE_DIR} | head -n -#{CACHE_MAXIMUM_SIZE} | awk '$0="#{CACHE_DIR}"$0' | xargs rm -f` end private diff --git a/lib/file_store/s3_store.rb b/lib/file_store/s3_store.rb index 483b41e02f..aa444ba1fc 100644 --- a/lib/file_store/s3_store.rb +++ b/lib/file_store/s3_store.rb @@ -9,6 +9,8 @@ module FileStore class S3Store < BaseStore TOMBSTONE_PREFIX ||= "tombstone/" + attr_reader :s3_helper + def initialize(s3_helper = nil) @s3_helper = s3_helper || S3Helper.new(s3_bucket, TOMBSTONE_PREFIX) end @@ -50,6 +52,11 @@ module FileStore @s3_helper.remove(path, true) end + def copy_file(url, source, destination) + return unless has_been_uploaded?(url) + @s3_helper.copy(source, destination) + end + def has_been_uploaded?(url) return false if url.blank? diff --git a/lib/final_destination.rb b/lib/final_destination.rb index 57a18fcd2a..4f474e970e 100644 --- a/lib/final_destination.rb +++ b/lib/final_destination.rb @@ -26,7 +26,7 @@ class FinalDestination "HTTPS_DOMAIN_#{domain}" end - attr_reader :status, :cookie, :status_code + attr_reader :status, :cookie, :status_code, :ignored def initialize(url, opts = nil) @url = url @@ -36,7 +36,22 @@ class FinalDestination @force_get_hosts = @opts[:force_get_hosts] || [] @opts[:max_redirects] ||= 5 @opts[:lookup_ip] ||= lambda { |host| FinalDestination.lookup_ip(host) } - @ignored = [Discourse.base_url_no_prefix] + (@opts[:ignore_redirects] || []) + + @ignored = @opts[:ignore_hostnames] || [] + + ignore_redirects = [Discourse.base_url_no_prefix] + + if @opts[:ignore_redirects] + ignore_redirects.concat(@opts[:ignore_redirects]) + end + + ignore_redirects.each do |ignore_redirect| + ignore_redirect = uri(ignore_redirect) + if ignore_redirect.present? && ignore_redirect.hostname + @ignored << ignore_redirect.hostname + end + end + @limit = @opts[:max_redirects] @status = :ready @http_verb = @force_get_hosts.any? { |host| hostname_matches?(host) } ? :get : :head @@ -131,18 +146,18 @@ class FinalDestination return nil end - @ignored.each do |host| - if hostname_matches?(host) - @status = :resolved - return @uri - end - end - unless validate_uri log(:warn, "FinalDestination could not resolve URL (invalid URI): #{@uri}") if @verbose return nil end + @ignored.each do |host| + if @uri&.hostname&.match?(host) + @status = :resolved + return @uri + end + end + headers = request_headers response = Excon.public_send(@http_verb, @uri.to_s, @@ -383,8 +398,8 @@ class FinalDestination def uri(location) begin - URI(location) - rescue URI::InvalidURIError, ArgumentError + URI.parse(location) + rescue URI::Error end end diff --git a/lib/flag_query.rb b/lib/flag_query.rb index 11db2aa887..34d523bdbc 100644 --- a/lib/flag_query.rb +++ b/lib/flag_query.rb @@ -2,6 +2,15 @@ require 'ostruct' module FlagQuery + def self.plugin_post_custom_fields + @plugin_post_custom_fields ||= {} + end + + # Allow plugins to add custom fields to the flag views + def self.register_plugin_post_custom_field(field, plugin) + plugin_post_custom_fields[field] = plugin + end + def self.flagged_posts_report(current_user, opts = nil) opts ||= {} offset = opts[:offset] || 0 @@ -32,9 +41,9 @@ module FlagQuery post_ids = post_ids_relation.pluck(:post_id).uniq - posts = SqlBuilder.new(" + posts = DB.query(<<~SQL, post_ids: post_ids) SELECT p.id, - p.cooked, + p.cooked as excerpt, p.raw, p.user_id, p.topic_id, @@ -43,10 +52,13 @@ module FlagQuery p.hidden, p.deleted_at, p.user_deleted, + NULL as post_actions, + NULL as post_action_ids, (SELECT created_at FROM post_revisions WHERE post_id = p.id AND user_id = p.user_id ORDER BY created_at DESC LIMIT 1) AS last_revised_at, (SELECT COUNT(*) FROM post_actions WHERE (disagreed_at IS NOT NULL OR agreed_at IS NOT NULL OR deferred_at IS NOT NULL) AND post_id = p.id)::int AS previous_flags_count FROM posts p - WHERE p.id in (:post_ids)").map_exec(OpenStruct, post_ids: post_ids) + WHERE p.id in (:post_ids) + SQL post_lookup = {} user_ids = Set.new @@ -55,8 +67,7 @@ module FlagQuery posts.each do |p| user_ids << p.user_id topic_ids << p.topic_id - p.excerpt = Post.excerpt(p.cooked) - p.delete_field(:cooked) + p.excerpt = Post.excerpt(p.excerpt) post_lookup[p.id] = p end @@ -124,15 +135,32 @@ module FlagQuery user_ids << pa.disposed_by_id if pa.disposed_by_id end + post_custom_field_names = [] + plugin_post_custom_fields.each do |field, plugin| + post_custom_field_names << field if plugin.enabled? + end + + post_custom_fields = Post.custom_fields_for_ids(post_ids, post_custom_field_names) + # maintain order posts = post_ids.map { |id| post_lookup[id] } + # TODO: add serializer so we can skip this - posts.map!(&:marshal_dump) + posts.map! do |post| + result = post.to_h + if cfs = post_custom_fields[post.id] + result[:custom_fields] = cfs + end + result + end + + users = User.includes(:user_stat).where(id: user_ids.to_a).to_a + User.preload_custom_fields(users, User.whitelisted_user_custom_fields(guardian)) [ posts, Topic.with_deleted.where(id: topic_ids.to_a).to_a, - User.includes(:user_stat).where(id: user_ids.to_a).to_a, + users, all_post_actions, total_rows ] @@ -224,14 +252,14 @@ module FlagQuery private - def self.excerpt(cooked) - excerpt = Post.excerpt(cooked, 200, keep_emoji_images: true) - # remove the first link if it's the first node - fragment = Nokogiri::HTML.fragment(excerpt) - if fragment.children.first == fragment.css("a:first").first && fragment.children.first - fragment.children.first.remove - end - fragment.to_html.strip + def self.excerpt(cooked) + excerpt = Post.excerpt(cooked, 200, keep_emoji_images: true) + # remove the first link if it's the first node + fragment = Nokogiri::HTML.fragment(excerpt) + if fragment.children.first == fragment.css("a:first").first && fragment.children.first + fragment.children.first.remove end + fragment.to_html.strip + end end diff --git a/lib/freedom_patches/active_record_attribute_methods.rb b/lib/freedom_patches/active_record_attribute_methods.rb new file mode 100644 index 0000000000..71fd5d44c7 --- /dev/null +++ b/lib/freedom_patches/active_record_attribute_methods.rb @@ -0,0 +1,18 @@ +# see: https://github.com/rails/rails/issues/32995 +# +# Rails 5.2 forces us to add Arel.sql to #order and #pluck +# Discourse is very SQL heavy and this makes the code much more +# verbose and confusing, especially since it is not enforced for +# #group, #join and many other relation methods +# For the time being we monkey patch this away, longer term we +# hope Rails will allow us for this to be optional + +module ActiveRecord + module AttributeMethods + module ClassMethods + def enforce_raw_sql_whitelist(*args) + return + end + end + end +end diff --git a/lib/freedom_patches/active_record_base.rb b/lib/freedom_patches/active_record_base.rb index b65ebc0616..4f71a4df38 100644 --- a/lib/freedom_patches/active_record_base.rb +++ b/lib/freedom_patches/active_record_base.rb @@ -1,20 +1,36 @@ class ActiveRecord::Base + # Handle PG::UniqueViolation as well due to concurrency + # find_or_create does find_by(hash) || create!(hash) + # in some cases find will not find and multiple creates will be called + # + # note: Rails 6 has: https://github.com/rails/rails/blob/c83e30da27eafde79164ecb376e8a28ccc8d841f/activerecord/lib/active_record/relation.rb#L171-L201 + # This means that in Rails 6 we would either use: + # + # create_or_find_by! (if we are generally creating) + # + # OR + # + # find_by(hash) || create_or_find_by(hash) (if we are generally finding) + def self.find_or_create_by_safe!(hash) + begin + find_or_create_by!(hash) + rescue PG::UniqueViolation, ActiveRecord::RecordNotUnique + # try again cause another transaction could have passed by now + find_or_create_by!(hash) + end + end + # Execute SQL manually def self.exec_sql(*args) + + Discourse.deprecate("exec_sql should not be used anymore, please use DB.exec or DB.query instead!") + conn = ActiveRecord::Base.connection sql = ActiveRecord::Base.send(:sanitize_sql_array, args) conn.raw_connection.async_exec(sql) end - def self.exec_sql_row_count(*args) - exec_sql(*args).cmd_tuples - end - - def self.sql_fragment(*sql_array) - ActiveRecord::Base.send(:sanitize_sql_array, sql_array) - end - def exec_sql(*args) ActiveRecord::Base.exec_sql(*args) end @@ -36,10 +52,4 @@ class ActiveRecord::Base end end - # Support for psql. If we want to support multiple RDBMs in the future we can - # split this. - def exec_sql_row_count(*args) - exec_sql(*args).cmd_tuples - end - end diff --git a/lib/freedom_patches/fast_pluck.rb b/lib/freedom_patches/fast_pluck.rb index 6034cf7a52..367c38cc85 100644 --- a/lib/freedom_patches/fast_pluck.rb +++ b/lib/freedom_patches/fast_pluck.rb @@ -1,9 +1,7 @@ # Speeds up #pluck so its about 2.2x faster, importantly makes pluck avoid creation of a slew # of AR objects # - -require_dependency 'sql_builder' - +# class ActiveRecord::Relation # Note: In discourse, the following code is included in lib/sql_builder.rb @@ -36,39 +34,32 @@ class ActiveRecord::Relation class ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter def select_raw(arel, name = nil, binds = [], &block) - arel, binds = binds_from_relation arel, binds - sql = to_sql(arel, binds) + arel = arel_from_relation(arel) + sql, binds = to_sql_and_binds(arel, binds) execute_and_clear(sql, name, binds, &block) end end - def pluck(*cols) - - conn = ActiveRecord::Base.connection - relation = self - - cols.map! do |column_name| - if column_name.is_a?(Symbol) && attribute_alias?(column_name) - attribute_alias(column_name) - else - column_name.to_s - end + def pluck(*column_names) + if loaded? && (column_names.map(&:to_s) - @klass.attribute_names - @klass.attribute_aliases.keys).empty? + return records.pluck(*column_names) end - if has_include?(cols.first) - construct_relation_for_association_calculations.pluck(*cols) + if has_include?(column_names.first) + relation = apply_join_dependency + relation.pluck(*column_names) else + enforce_raw_sql_whitelist(column_names) relation = spawn - relation.select_values = cols.map { |cn| - columns_hash.key?(cn) ? arel_table[cn] : cn + relation.select_values = column_names.map { |cn| + @klass.has_attribute?(cn) || @klass.attribute_alias?(cn) ? arel_attribute(cn) : cn } - conn.select_raw(relation, nil, relation.bound_attributes) do |result, _| - result.type_map = SqlBuilder.pg_type_map + klass.connection.select_raw(relation.arel) do |result, _| + result.type_map = DB.type_map result.nfields == 1 ? result.column_values(0) : result.values end - end end end diff --git a/lib/freedom_patches/inflector_backport.rb b/lib/freedom_patches/inflector_backport.rb index 1e192b0033..cc97659155 100644 --- a/lib/freedom_patches/inflector_backport.rb +++ b/lib/freedom_patches/inflector_backport.rb @@ -20,12 +20,12 @@ module ActiveSupport uncached = "#{method_name}_without_cache" alias_method uncached, method_name - define_method(method_name) do |*args| + define_method(method_name) do |*arguments| # this avoids recursive locks found = true - data = cache.fetch(args) { found = false } + data = cache.fetch(arguments) { found = false } unless found - cache[args] = data = send(uncached, *args) + cache[arguments] = data = send(uncached, *arguments) end # so cache is never corrupted data.dup @@ -45,9 +45,10 @@ module ActiveSupport args.each do |method_name| orig = "#{method_name}_without_clear_memoize" alias_method orig, method_name - define_method(method_name) do |*args| + + define_method(method_name) do |*arguments| ActiveSupport::Inflector.clear_memoize! - send(orig, *args) + send(orig, *arguments) end end end diff --git a/lib/freedom_patches/net.rb b/lib/freedom_patches/net.rb index db7091bda9..136ebea124 100644 --- a/lib/freedom_patches/net.rb +++ b/lib/freedom_patches/net.rb @@ -45,5 +45,5 @@ if Gem::Version.new(RUBY_VERSION) == Gem::Version.new("2.5.1") end elsif Gem::Version.new(RUBY_VERSION) > Gem::Version.new("2.5.1") # See https://github.com/ruby/ruby/commit/7830a950efa6d312e7c662beabaa0f8d7b4e0a23 - raise 'This monkey patch is no longer required.' + STDERR.puts 'This monkey patch is no longer required.' end diff --git a/lib/freedom_patches/pool_drainer.rb b/lib/freedom_patches/pool_drainer.rb deleted file mode 100644 index 0e0350d635..0000000000 --- a/lib/freedom_patches/pool_drainer.rb +++ /dev/null @@ -1,56 +0,0 @@ - -if Rails.version >= "4.2.0" - class ActiveRecord::ConnectionAdapters::AbstractAdapter - module LastUseExtension - attr_reader :last_use, :first_use - - def initialize(connection, logger = nil, pool = nil) - super - @last_use = false - @first_use = Time.now - end - - def lease - @lock.synchronize do - unless in_use? - @last_use = Time.now - super - end - end - end - end - - prepend LastUseExtension - end -end - -class ActiveRecord::ConnectionAdapters::ConnectionPool - # drain all idle connections - # if idle_time is specified only connections idle for N seconds will be drained - def drain(idle_time = nil, max_age = nil) - synchronize do - @available.clear - @connections.delete_if do |conn| - try_drain?(conn, idle_time, max_age) - end - - @connections.each do |conn| - @available.add conn if !conn.in_use? - end - end - - end - - private - - def try_drain?(conn, idle_time, max_age) - if !conn.in_use? - if !idle_time || conn.last_use < idle_time.seconds.ago || (max_age && conn.first_use < max_age.seconds.ago) - conn.disconnect! - return true - end - end - - false - end -end diff --git a/lib/freedom_patches/rack_patches.rb b/lib/freedom_patches/rack_patches.rb index 890435d9b9..4cdc2dce11 100644 --- a/lib/freedom_patches/rack_patches.rb +++ b/lib/freedom_patches/rack_patches.rb @@ -3,40 +3,40 @@ class Rack::ETag private - def digest_body(body) - parts = [] - has_body = false + def digest_body(body) + parts = [] + has_body = false - body.each do |part| - parts << part - has_body ||= part.length > 0 - end + body.each do |part| + parts << part + has_body ||= part.length > 0 + end - hexdigest = - if has_body - digest = Digest::MD5.new - parts.each { |part| digest << part } - digest.hexdigest - end + hexdigest = + if has_body + digest = Digest::MD5.new + parts.each { |part| digest << part } + digest.hexdigest + end - [hexdigest, parts] - end + [hexdigest, parts] + end end # patch https://github.com/rack/rack/pull/596 # class Rack::ConditionalGet private - def to_rfc2822(since) - # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A - # anything shorter is invalid, this avoids exceptions for common cases - # most common being the empty string - if since && since.length >= 16 - # NOTE: there is no trivial way to write this in a non execption way - # _rfc2822 returns a hash but is not that usable - Time.rfc2822(since) rescue nil - else - nil - end - end + def to_rfc2822(since) + # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A + # anything shorter is invalid, this avoids exceptions for common cases + # most common being the empty string + if since && since.length >= 16 + # NOTE: there is no trivial way to write this in a non execption way + # _rfc2822 returns a hash but is not that usable + Time.rfc2822(since) rescue nil + else + nil + end + end end diff --git a/lib/freedom_patches/reaper.rb b/lib/freedom_patches/reaper.rb new file mode 100644 index 0000000000..c603ac70bb --- /dev/null +++ b/lib/freedom_patches/reaper.rb @@ -0,0 +1,18 @@ +# Discourse ships with a connection reaper +# this patch ensures that the connection reaper never runs in Rails +# +# In Rails 5.2 the connection reaper is "per-pool" this means it can bloat +# threads quite a lot in a multisite +# +# Note, the "correct" way is to set this in the spec, however due to multisite +# getting reaper_interval=0 into all the specs is not going to be trivial +# when we eventually do that we can remove this patch + +if !defined? ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper + raise "Can not find connection Reaper class, this patch will no longer work!" +end + +class ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper + def run + end +end diff --git a/lib/freedom_patches/translate_accelerator.rb b/lib/freedom_patches/translate_accelerator.rb index fe737f5257..9d1c55d92c 100644 --- a/lib/freedom_patches/translate_accelerator.rb +++ b/lib/freedom_patches/translate_accelerator.rb @@ -41,9 +41,11 @@ module I18n I18n.backend.load_translations(I18n.load_path.grep(/\.rb$/)) # load plural rules from plugins - DiscoursePluginRegistry.locales.each do |locale, options| + DiscoursePluginRegistry.locales.each do |plugin_locale, options| if options[:plural] - I18n.backend.store_translations(locale, i18n: { plural: options[:plural] }) + I18n.backend.store_translations(plugin_locale, + i18n: { plural: options[:plural] } + ) end end end @@ -68,7 +70,7 @@ module I18n target = opts[:backend] || backend results = opts[:overridden] ? {} : target.search(config.locale, query) - regexp = /#{query}/i + regexp = /#{Regexp.escape(query)}/i (overrides_by_locale(locale) || {}).each do |k, v| results.delete(k) results[k] = v if (k =~ regexp || v =~ regexp) diff --git a/lib/generators/plugin/plugin_generator.rb b/lib/generators/plugin/plugin_generator.rb new file mode 100644 index 0000000000..94f9d2441d --- /dev/null +++ b/lib/generators/plugin/plugin_generator.rb @@ -0,0 +1,99 @@ +require 'rails/generators/named_base' + +class PluginGenerator < Rails::Generators::NamedBase + attr_writer :github_username + + desc 'This generator creates a Discourse plugin skeleton' + + source_root File.expand_path('templates', __dir__) + + class_option :controller, type: :boolean, desc: "Generate controller", default: true + class_option :spec, type: :boolean, desc: "Generate spec", default: true + class_option :acceptance, type: :boolean, desc: "Generate acceptance test", default: true + class_option :stylesheet, type: :boolean, desc: "Generate Stylesheet", default: true + class_option :javascript, type: :boolean, desc: "Generate Javascript initializer", default: true + class_option :scheduled_job, type: :boolean, desc: "Generate scheduled job", default: false + class_option :help, type: :boolean, desc: "Adds help comments in generated files", default: true + + def create_acceptance_file + return unless @options['acceptance'] + + template 'acceptance-test.js.es6.erb', File.join('plugins', dasherized_name, "test/javascripts/acceptance", "#{dasherized_name}-test.js.es6") + end + + def create_spec_file + return if !@options['spec'] || !@options['controller'] + + template 'controller_spec.rb.erb', File.join('plugins', dasherized_name, "spec/requests/actions_controller_spec.rb") + end + + def create_scheduled_job_file + return unless @options['scheduled_job'] + + path = File.join('plugins', dasherized_name, 'jobs/scheduled', "check_#{underscored_name}.rb") + template 'scheduled_job.rb.erb', path + end + + def create_readme_file + ensure_github_username + + template 'README.md.erb', File.join('plugins', dasherized_name, "README.md") + end + + def create_license_file + ensure_github_username + + template 'LICENSE.erb', File.join('plugins', dasherized_name, "LICENSE") + end + + def create_plugin_file + ensure_github_username + + template 'plugin.rb.erb', File.join('plugins', dasherized_name, "plugin.rb") + end + + def create_stylesheet_file + return unless @options['stylesheet'] + + template 'stylesheet.scss.erb', File.join('plugins', dasherized_name, 'assets/stylesheets/common', "#{dasherized_name}.scss") + end + + def create_javascript_file + return unless @options['javascript'] + + template 'javascript.es6.erb', File.join('plugins', dasherized_name, 'assets/javascripts/initializers', "#{dasherized_name}.es6") + end + + def create_settings_file + template 'settings.yml.erb', File.join('plugins', dasherized_name, 'config', 'settings.yml') + end + + def create_locales_file + template 'client.en.yml.erb', File.join('plugins', dasherized_name, 'config/locales', 'client.en.yml') + template 'server.en.yml.erb', File.join('plugins', dasherized_name, 'config/locales', 'server.en.yml') + end + + def create_gitignore_entry + plugin_entry = "!/plugins/#{dasherized_name}" + + unless File.readlines(".gitignore").grep(/#{plugin_entry}/).size > 0 + open('.gitignore', 'a') { |f| f.puts "\n#{plugin_entry}" } + end + end + + def ensure_github_username + @github_username ||= ask("Github username?") + end + + def underscored_name + name.underscore + end + + def dasherized_name + underscored_name.dasherize + end + + def classified_name + name.tableize.classify + end +end diff --git a/lib/generators/plugin/templates/LICENSE.erb b/lib/generators/plugin/templates/LICENSE.erb new file mode 100644 index 0000000000..bc12283e18 --- /dev/null +++ b/lib/generators/plugin/templates/LICENSE.erb @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 <%= @github_username %>. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/generators/plugin/templates/README.md.erb b/lib/generators/plugin/templates/README.md.erb new file mode 100644 index 0000000000..6db29ed09c --- /dev/null +++ b/lib/generators/plugin/templates/README.md.erb @@ -0,0 +1,16 @@ +# <%= name %> + +<%= name %> is a plugin for ... + +## Installation + +Follow [Install a Plugin](https://meta.discourse.org/t/install-a-plugin/19157) +how-to from the official Discourse Meta, using `git clone https://github.com/<%= @github_username %>/<%= dasherized_name %>.git` +as the plugin command. + +## Usage + +## Feedback + +If you have issues or suggestions for the plugin, please bring them up on +[Discourse Meta](https://meta.discourse.org). diff --git a/lib/generators/plugin/templates/acceptance-test.js.es6.erb b/lib/generators/plugin/templates/acceptance-test.js.es6.erb new file mode 100644 index 0000000000..85da8e9791 --- /dev/null +++ b/lib/generators/plugin/templates/acceptance-test.js.es6.erb @@ -0,0 +1,9 @@ +import { acceptance } from "helpers/qunit-helpers"; + +acceptance("<%= name %>", { loggedIn: true }); + +test("<%= name %> works", async assert => { + await visit("/admin/plugins/<%= dasherized_name %>"); + + assert.ok(false, "it shows the <%= name %> button"); +}); diff --git a/lib/generators/plugin/templates/client.en.yml.erb b/lib/generators/plugin/templates/client.en.yml.erb new file mode 100644 index 0000000000..ac043b828c --- /dev/null +++ b/lib/generators/plugin/templates/client.en.yml.erb @@ -0,0 +1,3 @@ +en: + js: + <%= underscored_name %>: diff --git a/lib/generators/plugin/templates/controller_spec.rb.erb b/lib/generators/plugin/templates/controller_spec.rb.erb new file mode 100644 index 0000000000..88935a5dfe --- /dev/null +++ b/lib/generators/plugin/templates/controller_spec.rb.erb @@ -0,0 +1,13 @@ +require 'rails_helper' + +describe <%= name %>::ActionsController do + before do + SiteSetting.queue_jobs = false + end + + it 'can list' do + sign_in(Fabricate(:user)) + get "/<%= dasherized_name %>/list.json" + expect(response.status).to eq(200) + end +end diff --git a/lib/generators/plugin/templates/javascript.es6.erb b/lib/generators/plugin/templates/javascript.es6.erb new file mode 100644 index 0000000000..37fb2881c6 --- /dev/null +++ b/lib/generators/plugin/templates/javascript.es6.erb @@ -0,0 +1,16 @@ +import { withPluginApi } from "discourse/lib/plugin-api"; + +function initialize<%= classified_name %>(api) { + <% if @options['help'] %> + // see app/assets/javascripts/discourse/lib/plugin-api + // for the functions available via the api object + <% end %> +} + +export default { + name: "<%= dasherized_name %>", + + initialize() { + withPluginApi("0.8.24", initialize<%= classified_name %>); + } +}; diff --git a/lib/generators/plugin/templates/plugin.rb.erb b/lib/generators/plugin/templates/plugin.rb.erb new file mode 100644 index 0000000000..4937d8dba7 --- /dev/null +++ b/lib/generators/plugin/templates/plugin.rb.erb @@ -0,0 +1,51 @@ +# name: <%= name %> +# about: +# version: 0.1 +# authors: <%= @github_username %> +# url: https://github.com/<%= @github_username %> + +<% if @options["stylesheet"] %> +register_asset "stylesheets/common/<%= dasherized_name %>.scss" +<% end %> + +enabled_site_setting :<%= underscored_name %>_enabled + +PLUGIN_NAME ||= "<%= name %>".freeze + +after_initialize do + <% if @options['help'] %> + # see lib/plugin/instance.rb for the methods available in this context + <% end %> + + module ::<%= classified_name %> + class Engine < ::Rails::Engine + engine_name PLUGIN_NAME + isolate_namespace <%= classified_name %> + end + end + + <% if @options["scheduled_job"] %> + require File.expand_path("../jobs/scheduled/check_<%= underscored_name %>.rb", __FILE__) + <% end %> + + <% if @options["controller"] %> + require_dependency "application_controller" + class <%= name %>::ActionsController < ::ApplicationController + requires_plugin PLUGIN_NAME + + before_action :ensure_logged_in + + def list + render json: success_json + end + end + + <%= name %>::Engine.routes.draw do + get "/list" => "actions#list" + end + + Discourse::Application.routes.append do + mount ::<%= name %>::Engine, at: "/<%= dasherized_name %>" + end + <% end %> +end diff --git a/lib/generators/plugin/templates/scheduled_job.rb.erb b/lib/generators/plugin/templates/scheduled_job.rb.erb new file mode 100644 index 0000000000..21d9e17b77 --- /dev/null +++ b/lib/generators/plugin/templates/scheduled_job.rb.erb @@ -0,0 +1,8 @@ +module Jobs + class ::<%= classified_name %>::Check < Jobs::Scheduled + every 1.day + + def execute(args = nil) + end + end +end diff --git a/lib/generators/plugin/templates/server.en.yml.erb b/lib/generators/plugin/templates/server.en.yml.erb new file mode 100644 index 0000000000..574f41acd7 --- /dev/null +++ b/lib/generators/plugin/templates/server.en.yml.erb @@ -0,0 +1,3 @@ +en: + site_settings: + <%= underscored_name %>_enabled: "Enable <%= name %> plugin" diff --git a/lib/generators/plugin/templates/settings.yml.erb b/lib/generators/plugin/templates/settings.yml.erb new file mode 100644 index 0000000000..3f43a52beb --- /dev/null +++ b/lib/generators/plugin/templates/settings.yml.erb @@ -0,0 +1,4 @@ +plugins: + <%= underscored_name %>_enabled: + default: true + client: true diff --git a/lib/generators/plugin/templates/stylesheet.scss.erb b/lib/generators/plugin/templates/stylesheet.scss.erb new file mode 100644 index 0000000000..ef54f605be --- /dev/null +++ b/lib/generators/plugin/templates/stylesheet.scss.erb @@ -0,0 +1,2 @@ +.<%= dasherized_name %> { +} diff --git a/lib/guardian.rb b/lib/guardian.rb index 528a190ff7..3f7a96eba3 100644 --- a/lib/guardian.rb +++ b/lib/guardian.rb @@ -272,6 +272,7 @@ class Guardian if object.is_a?(Topic) && object.private_message? return false unless SiteSetting.enable_personal_messages? + return false if object.reached_recipients_limit? && !is_staff? end if object.is_a?(Topic) && object.category @@ -334,15 +335,20 @@ class Guardian (!is_silenced? || target.staff?) end - def cand_send_private_messages_to_email? + def can_send_private_messages_to_email? # Staged users must be enabled to create a temporary user. SiteSetting.enable_staged_users && # User is authenticated authenticated? && # User is trusted enough - @user.has_trust_level?(SiteSetting.min_trust_to_send_email_messages) && - # PMs to email addresses are enabled - (is_staff? || SiteSetting.enable_personal_email_messages) + (is_staff? || + ( + # TODO: 2019 evaluate if we need this flexibility + # perhaps we enable this unconditionally to TL4? + @user.has_trust_level?(SiteSetting.min_trust_to_send_email_messages) && + SiteSetting.enable_personal_email_messages + ) + ) end def can_see_emails? @@ -358,12 +364,18 @@ class Guardian UserExport.where(user_id: @user.id, created_at: (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)).count == 0 end - def allow_theme?(theme_key) - if is_staff? - Theme.theme_keys.include?(theme_key) - else - Theme.user_theme_keys.include?(theme_key) + def allow_themes?(theme_ids, include_preview: false) + return true if theme_ids.blank? + + if include_preview && is_staff? && (theme_ids - Theme.theme_ids).blank? + return true end + + parent = theme_ids.first + components = theme_ids[1..-1] || [] + + Theme.user_theme_ids.include?(parent) && + (components - Theme.components_for(parent)).empty? end private diff --git a/lib/guardian/post_guardian.rb b/lib/guardian/post_guardian.rb index 81eb95f9f0..c58ffff15c 100644 --- a/lib/guardian/post_guardian.rb +++ b/lib/guardian/post_guardian.rb @@ -1,9 +1,25 @@ #mixin for all guardian methods dealing with post permissions module PostGuardian - def can_post_link? - authenticated? && - @user.has_trust_level?(TrustLevel[SiteSetting.min_trust_to_post_links]) + def unrestricted_link_posting? + authenticated? && @user.has_trust_level?(TrustLevel[SiteSetting.min_trust_to_post_links]) + end + + def link_posting_access + if unrestricted_link_posting? + 'full' + elsif SiteSetting.whitelisted_link_domains.present? + 'limited' + else + 'none' + end + end + + def can_post_link?(host: nil) + return false if host.blank? + + unrestricted_link_posting? || + SiteSetting.whitelisted_link_domains.split('|').include?(host) end # Can the user act on the post in a particular way. @@ -20,10 +36,14 @@ module PostGuardian already_did_flagging = taken.any? && (taken & PostActionType.notify_flag_types.values).any? result = if authenticated? && post && !@user.anonymous? + + # Silenced users can't flag + return false if is_flag && @user.silenced? + # post made by staff, but we don't allow staff flags return false if is_flag && (!SiteSetting.allow_flagging_staff?) && - post.user.staff? + post&.user&.staff? if [:notify_user, :notify_moderators].include?(action_key) && (!SiteSetting.enable_personal_messages? || @@ -127,6 +147,9 @@ module PostGuardian end if is_my_own?(post) + + return false if @user.silenced? + if post.hidden? return false if post.hidden_at.present? && post.hidden_at >= SiteSetting.cooldown_minutes_after_hiding_posts.minutes.ago @@ -148,9 +171,6 @@ module PostGuardian # Can't delete the first post return false if post.is_first_post? - # Can't delete after post_edit_time_limit minutes have passed - return false if !is_staff? && post.edit_time_limit_expired? - # Can't delete posts in archived topics unless you are staff return false if !is_staff? && post.topic.archived? @@ -242,4 +262,8 @@ module PostGuardian def can_unhide?(post) post.try(:hidden) && is_staff? end + + def can_skip_bump? + is_staff? + end end diff --git a/lib/guardian/tag_guardian.rb b/lib/guardian/tag_guardian.rb index 84856d4d15..d444f2096a 100644 --- a/lib/guardian/tag_guardian.rb +++ b/lib/guardian/tag_guardian.rb @@ -1,10 +1,14 @@ #mixin for all guardian methods dealing with tagging permisions module TagGuardian def can_create_tag? + return is_admin? if SiteSetting.min_trust_to_create_tag.to_s == 'admin' + return is_staff? if SiteSetting.min_trust_to_create_tag.to_s == 'staff' user && SiteSetting.tagging_enabled && user.has_trust_level?(SiteSetting.min_trust_to_create_tag.to_i) end def can_tag_topics? + return is_admin? if SiteSetting.min_trust_level_to_tag_topics.to_s == 'admin' + return is_staff? if SiteSetting.min_trust_level_to_tag_topics.to_s == 'staff' user && SiteSetting.tagging_enabled && user.has_trust_level?(SiteSetting.min_trust_level_to_tag_topics.to_i) end diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index d3b6052180..8a7fd9d117 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -34,6 +34,12 @@ module TopicGuardian (!category || Category.topic_create_allowed(self).where(id: category_id).count == 1) end + def can_move_topic_to_category?(category) + category = Category === category ? category : Category.find(category || SiteSetting.uncategorized_category_id) + + is_staff? || (can_create_topic_on_category?(category) && !category.require_topic_approval?) + end + def can_create_post_on_topic?(topic) # No users can create posts on deleted topics return false if topic.blank? @@ -140,4 +146,8 @@ module TopicGuardian return false unless SiteSetting.topic_featured_link_enabled Category.where(id: category_id || SiteSetting.uncategorized_category_id, topic_featured_link_allowed: true).exists? end + + def can_update_bumped_at? + is_staff? + end end diff --git a/lib/i18n/backend/discourse_i18n.rb b/lib/i18n/backend/discourse_i18n.rb index 1f33dd60e0..553de8eb50 100644 --- a/lib/i18n/backend/discourse_i18n.rb +++ b/lib/i18n/backend/discourse_i18n.rb @@ -44,7 +44,7 @@ module I18n results = {} fallbacks(locale).each do |fallback| - find_results(/#{query}/i, results, translations[fallback]) + find_results(/#{Regexp.escape(query)}/i, results, translations[fallback]) end results @@ -52,54 +52,54 @@ module I18n protected - def find_results(regexp, results, translations, path = nil) - return results if translations.blank? + def find_results(regexp, results, translations, path = nil) + return results if translations.blank? - translations.each do |k_sym, v| - k = k_sym.to_s - key_path = path ? "#{path}.#{k}" : k - if v.is_a?(String) - unless results.has_key?(key_path) - results[key_path] = v if key_path =~ regexp || v =~ regexp - end - elsif v.is_a?(Hash) - find_results(regexp, results, v, key_path) + translations.each do |k_sym, v| + k = k_sym.to_s + key_path = path ? "#{path}.#{k}" : k + if v.is_a?(String) + unless results.has_key?(key_path) + results[key_path] = v if key_path =~ regexp || v =~ regexp end + elsif v.is_a?(Hash) + find_results(regexp, results, v, key_path) end - results end + results + end - # Support interpolation and pluralization of overrides by first looking up - # the original translations before applying our overrides. - def lookup(locale, key, scope = [], options = {}) - existing_translations = super(locale, key, scope, options) - return existing_translations if scope.is_a?(Array) && scope.include?(:models) + # Support interpolation and pluralization of overrides by first looking up + # the original translations before applying our overrides. + def lookup(locale, key, scope = [], options = {}) + existing_translations = super(locale, key, scope, options) + return existing_translations if scope.is_a?(Array) && scope.include?(:models) - overrides = options.dig(:overrides, locale) + overrides = options.dig(:overrides, locale) - if overrides - if existing_translations && options[:count] - remapped_translations = - if existing_translations.is_a?(Hash) - Hash[existing_translations.map { |k, v| ["#{key}.#{k}", v] }] - elsif existing_translations.is_a?(String) - Hash[[[key, existing_translations]]] - end - - result = {} - - remapped_translations.merge(overrides).each do |k, v| - result[k.split('.').last.to_sym] = v if k != key && k.start_with?(key.to_s) + if overrides + if existing_translations && options[:count] + remapped_translations = + if existing_translations.is_a?(Hash) + Hash[existing_translations.map { |k, v| ["#{key}.#{k}", v] }] + elsif existing_translations.is_a?(String) + Hash[[[key, existing_translations]]] end - return result if result.size > 0 - end - return overrides[key] if overrides[key] + result = {} + + remapped_translations.merge(overrides).each do |k, v| + result[k.split('.').last.to_sym] = v if k != key && k.start_with?(key.to_s) + end + return result if result.size > 0 end - existing_translations + return overrides[key] if overrides[key] end + existing_translations + end + end end end diff --git a/lib/i18n/duplicate_key_finder.rb b/lib/i18n/duplicate_key_finder.rb index 745b5ce293..f23221d13e 100644 --- a/lib/i18n/duplicate_key_finder.rb +++ b/lib/i18n/duplicate_key_finder.rb @@ -10,8 +10,8 @@ class DuplicateKeyFinder < LocaleFileWalker protected - def handle_scalar(node, depth, parents) - super - @keys_with_count[parents.join('.')] += 1 - end + def handle_scalar(node, depth, parents) + super + @keys_with_count[parents.join('.')] += 1 + end end diff --git a/lib/i18n/i18n_interpolation_keys_finder.rb b/lib/i18n/i18n_interpolation_keys_finder.rb index cc91e806b9..7c5fe9288a 100644 --- a/lib/i18n/i18n_interpolation_keys_finder.rb +++ b/lib/i18n/i18n_interpolation_keys_finder.rb @@ -1,6 +1,6 @@ class I18nInterpolationKeysFinder def self.find(text) - keys = text.scan(I18n::INTERPOLATION_PATTERN) + keys = text.scan(Regexp.union(I18n::INTERPOLATION_PATTERN, /\{\{(\w+)\}\}/)) keys.flatten! keys.compact! keys.uniq! diff --git a/lib/i18n/locale_file_checker.rb b/lib/i18n/locale_file_checker.rb new file mode 100644 index 0000000000..b9aa206bb0 --- /dev/null +++ b/lib/i18n/locale_file_checker.rb @@ -0,0 +1,173 @@ +require 'i18n/i18n_interpolation_keys_finder' +require 'yaml' + +class LocaleFileChecker + TYPE_MISSING_INTERPOLATION_KEYS = 1 + TYPE_UNSUPPORTED_INTERPOLATION_KEYS = 2 + TYPE_MISSING_PLURAL_KEYS = 3 + TYPE_INVALID_MESSAGE_FORMAT = 4 + + def check(locale) + @errors = {} + @locale = locale.to_s + + locale_files.each do |locale_path| + next unless reference_path = reference_file(locale_path) + + @relative_locale_path = Pathname.new(locale_path).relative_path_from(Pathname.new(Rails.root)).to_s + @locale_yaml = YAML.load_file(locale_path) + @reference_yaml = YAML.load_file(reference_path) + + check_interpolation_keys + check_plural_keys + check_message_format + end + + @errors + end + + private + + YML_DIRS = ["config/locales", "plugins/**/locales"] + PLURALS_FILE = "config/locales/plurals.rb" + REFERENCE_LOCALE = "en" + REFERENCE_PLURAL_KEYS = ["one", "other"] + + # Some languages should always use %{count} in pluralized strings. + # https://meta.discourse.org/t/always-use-count-variable-when-translating-pluralized-strings/83969 + FORCE_PLURAL_COUNT_LOCALES = ["bs", "lt", "lv", "ru", "sl", "sr", "uk"] + + def locale_files + YML_DIRS.map { |dir| Dir["#{Rails.root}/#{dir}/{client,server}.#{@locale}.yml"] }.flatten + end + + def reference_file(path) + path = path.gsub(/\.\w{2,}\.yml$/, ".#{REFERENCE_LOCALE}.yml") + path if File.exists?(path) + end + + def traverse_hash(hash, parent_keys, &block) + hash.each do |key, value| + keys = parent_keys.dup << key + + if value.is_a?(Hash) + traverse_hash(value, keys, &block) + else + yield(keys, value, hash) + end + end + end + + def check_interpolation_keys + traverse_hash(@locale_yaml, []) do |keys, value| + reference_value = reference_value(keys) + next if reference_value.nil? + + if pluralized = reference_value_pluralized?(reference_value) + if keys.last == "one" && !FORCE_PLURAL_COUNT_LOCALES.include?(@locale) + reference_value = reference_value["one"] + else + reference_value = reference_value["other"] + end + end + + reference_interpolation_keys = I18nInterpolationKeysFinder.find(reference_value.to_s) + locale_interpolation_keys = I18nInterpolationKeysFinder.find(value.to_s) + + missing_keys = reference_interpolation_keys - locale_interpolation_keys + unsupported_keys = locale_interpolation_keys - reference_interpolation_keys + + # English strings often don't use the %{count} variable within the "one" key, + # but it's perfectly fine for other locales to use it. + unsupported_keys.delete("count") if pluralized && keys.last == "one" + + # Not all locales need the %{count} variable within the "one" key. + if pluralized && keys.last == "one" && !FORCE_PLURAL_COUNT_LOCALES.include?(@locale) + missing_keys.delete("count") + end + + add_error(keys, TYPE_MISSING_INTERPOLATION_KEYS, missing_keys, pluralized: pluralized) unless missing_keys.empty? + add_error(keys, TYPE_UNSUPPORTED_INTERPOLATION_KEYS, unsupported_keys, pluralized: pluralized) unless unsupported_keys.empty? + end + end + + def check_plural_keys + known_parent_keys = Set.new + + traverse_hash(@locale_yaml, []) do |keys, _, parent| + keys = keys[0..-2] + parent_key = keys.join(".") + next if known_parent_keys.include?(parent_key) + known_parent_keys << parent_key + + reference_value = reference_value(keys) + next if reference_value.nil? || !reference_value_pluralized?(reference_value) + + expected_plural_keys = plural_keys[@locale] + actual_plural_keys = parent.is_a?(Hash) ? parent.keys : [] + missing_plural_keys = expected_plural_keys - actual_plural_keys + + add_error(keys, TYPE_MISSING_PLURAL_KEYS, missing_plural_keys, pluralized: true) unless missing_plural_keys.empty? + end + end + + def check_message_format + mf_locale, mf_filename = JsLocaleHelper.find_message_format_locale([@locale], true) + + traverse_hash(@locale_yaml, []) do |keys, value| + next unless keys.last.ends_with?("_MF") + + begin + JsLocaleHelper.with_context do |ctx| + ctx.load(mf_filename) if File.exist?(mf_filename) + ctx.eval("mf = new MessageFormat('#{mf_locale}');") + ctx.eval("mf.precompile(mf.parse(#{value.to_s.inspect}))") + end + rescue MiniRacer::EvalError => error + error_message = error.message.sub(/at undefined[:\d]+/, "").strip + add_error(keys, TYPE_INVALID_MESSAGE_FORMAT, error_message, pluralized: false) + end + end + end + + def reference_value(keys) + value = @reference_yaml[REFERENCE_LOCALE] + + keys[1..-2].each do |key| + value = value[key] + return nil if value.nil? + end + + reference_value_pluralized?(value) ? value : value[keys.last] + end + + def reference_value_pluralized?(value) + value.is_a?(Hash) && + value.keys.sort == REFERENCE_PLURAL_KEYS && + value.keys.all? { |k| value[k].is_a?(String) } + end + + def plural_keys + @plural_keys ||= begin + eval(File.read("#{Rails.root}/#{PLURALS_FILE}")).map do |locale, value| + [locale.to_s, value[:i18n][:plural][:keys].map(&:to_s)] + end.to_h + end + end + + def add_error(keys, type, details, pluralized:) + @errors[@relative_locale_path] ||= [] + + if pluralized + joined_key = keys[1..-2].join(".") << " [#{keys.last}]" + else + joined_key = keys[1..-1].join(".") + end + + @errors[@relative_locale_path] << { + key: joined_key, + type: type, + details: details.to_s + } + end +end diff --git a/lib/import_export/base_exporter.rb b/lib/import_export/base_exporter.rb index 58d3b77e4e..77057406ce 100644 --- a/lib/import_export/base_exporter.rb +++ b/lib/import_export/base_exporter.rb @@ -97,9 +97,14 @@ module ImportExport topic_data[:posts] = [] topic.ordered_posts.find_each do |post| - h = POST_ATTRS.inject({}) { |h, a| h[a] = post.send(a); h; } - h[:raw] = h[:raw].gsub('src="/uploads', "src=\"#{Discourse.base_url_no_prefix}/uploads") - topic_data[:posts] << h + attributes = POST_ATTRS.inject({}) { |h, a| h[a] = post.send(a); h; } + + attributes[:raw] = attributes[:raw].gsub( + 'src="/uploads', + "src=\"#{Discourse.base_url_no_prefix}/uploads" + ) + + topic_data[:posts] << attributes end data << topic_data diff --git a/lib/inline_oneboxer.rb b/lib/inline_oneboxer.rb index aafe3b338c..1ba2683016 100644 --- a/lib/inline_oneboxer.rb +++ b/lib/inline_oneboxer.rb @@ -23,8 +23,9 @@ class InlineOneboxer def self.lookup(url, opts = nil) opts ||= {} + opts = opts.with_indifferent_access - unless opts[:skip_cache] + unless opts[:skip_cache] || opts[:invalidate] cached = cache_lookup(url) return cached if cached.present? end @@ -46,7 +47,7 @@ class InlineOneboxer if always_allow || domains uri = begin URI(url) - rescue URI::InvalidURIError + rescue URI::Error end if uri.present? && @@ -63,20 +64,20 @@ class InlineOneboxer private - def self.onebox_for(url, title, opts) - onebox = { - url: url, - title: title && Emoji.gsub_emoji_to_unicode(title) - } - unless opts[:skip_cache] - Rails.cache.write(cache_key(url), onebox, expires_in: 1.day) - end - - onebox + def self.onebox_for(url, title, opts) + onebox = { + url: url, + title: title && Emoji.gsub_emoji_to_unicode(title) + } + unless opts[:skip_cache] + Rails.cache.write(cache_key(url), onebox, expires_in: 1.day) end - def self.cache_key(url) - "inline_onebox:#{url}" - end + onebox + end + + def self.cache_key(url) + "inline_onebox:#{url}" + end end diff --git a/lib/introduction_updater.rb b/lib/introduction_updater.rb index a576b0433c..002b52f06e 100644 --- a/lib/introduction_updater.rb +++ b/lib/introduction_updater.rb @@ -20,7 +20,6 @@ class IntroductionUpdater remaining = post.raw.split("\n")[1..-1] revisor.revise!(@user, raw: "#{new_value}\n#{remaining.join("\n")}") end - end protected @@ -30,7 +29,12 @@ protected end def find_welcome_post - welcome_topic = Topic.where(slug: 'welcome-to-discourse').first + topic_id = TopicCustomField.where(name: "is_welcome_topic").where(value: "true").pluck(:topic_id) + unless topic_id.present? + topic_id = Topic.listable_topics.where(slug: 'welcome-to-discourse').pluck(:id) + end + + welcome_topic = Topic.where(id: topic_id).first return nil unless welcome_topic.present? post = welcome_topic.posts.where(post_number: 1).first diff --git a/lib/js_locale_helper.rb b/lib/js_locale_helper.rb index 8b66f56be9..0207aee1b4 100644 --- a/lib/js_locale_helper.rb +++ b/lib/js_locale_helper.rb @@ -55,6 +55,10 @@ module JsLocaleHelper # merge translations (plugin translations overwrite default translations) if translations[locale_str] && plugin_translations(locale_str) + translations[locale_str]['js'] ||= {} + translations[locale_str]['admin_js'] ||= {} + translations[locale_str]['wizard_js'] ||= {} + translations[locale_str]['js'].deep_merge!(plugin_translations(locale_str)['js']) if plugin_translations(locale_str)['js'] translations[locale_str]['admin_js'].deep_merge!(plugin_translations(locale_str)['admin_js']) if plugin_translations(locale_str)['admin_js'] translations[locale_str]['wizard_js'].deep_merge!(plugin_translations(locale_str)['wizard_js']) if plugin_translations(locale_str)['wizard_js'] diff --git a/lib/markdown_linker.rb b/lib/markdown_linker.rb index fab7c5a6b6..9e69f6c106 100644 --- a/lib/markdown_linker.rb +++ b/lib/markdown_linker.rb @@ -9,7 +9,7 @@ class MarkdownLinker end def create(title, url) - @markdown_links[@index] = "#{@base_url}#{url}" + @markdown_links[@index] = url.start_with?(@base_url) ? url : "#{@base_url}#{url}" result = "[#{title}][#{@index}]" @index += 1 result diff --git a/lib/middleware/anonymous_cache.rb b/lib/middleware/anonymous_cache.rb index 2a195c2f93..f2539b0610 100644 --- a/lib/middleware/anonymous_cache.rb +++ b/lib/middleware/anonymous_cache.rb @@ -21,6 +21,14 @@ module Middleware @request = Rack::Request.new(@env) end + def blocked_crawler? + @request.get? && + !@request.xhr? && + !@request.path.ends_with?('robots.txt') && + !@request.path.ends_with?('srv/status') && + CrawlerDetection.is_blocked_crawler?(@request.env['HTTP_USER_AGENT']) + end + def is_mobile=(val) @is_mobile = val ? :true : :false end @@ -58,15 +66,16 @@ module Middleware end def cache_key - @cache_key ||= "ANON_CACHE_#{@env["HTTP_ACCEPT"]}_#{@env["HTTP_HOST"]}#{@env["REQUEST_URI"]}|m=#{is_mobile?}|c=#{is_crawler?}|b=#{has_brotli?}|t=#{theme_key}" + @cache_key ||= "ANON_CACHE_#{@env["HTTP_ACCEPT"]}_#{@env["HTTP_HOST"]}#{@env["REQUEST_URI"]}|m=#{is_mobile?}|c=#{is_crawler?}|b=#{has_brotli?}|t=#{theme_ids.join(",")}" end - def theme_key - key, _ = @request.cookies['theme_key']&.split(',') - if key && Guardian.new.allow_theme?(key) - key + def theme_ids + ids, _ = @request.cookies['theme_ids']&.split('|') + ids = ids&.split(",")&.map(&:to_i) + if ids && Guardian.new.allow_themes?(ids) + Theme.transform_ids(ids) else - nil + [] end end @@ -188,6 +197,11 @@ module Middleware helper = Helper.new(env) force_anon = false + if helper.blocked_crawler? + env["discourse.request_tracker.skip"] = true + return [403, {}, "Crawler is not allowed!"] + end + if helper.should_force_anonymous? force_anon = env["DISCOURSE_FORCE_ANON"] = true helper.force_anonymous! diff --git a/lib/middleware/request_tracker.rb b/lib/middleware/request_tracker.rb index 527741344a..26680bf9c6 100644 --- a/lib/middleware/request_tracker.rb +++ b/lib/middleware/request_tracker.rb @@ -175,12 +175,6 @@ class Middleware::RequestTracker return result end - if block_crawler(request) - log_request = false - result = [403, { 'Content-Type' => 'text/plain' }, ['Crawler is not allowed']] - return result - end - env["discourse.request_tracker"] = self MethodProfiler.start result = @app.call(env) @@ -264,7 +258,7 @@ class Middleware::RequestTracker if !limiter_assets10.can_perform? if warn - Rails.logger.warn("Global asset IP rate limit exceeded for #{ip}: 10 second rate limit, uri: #{request.env["REQUEST_URI"]}") + Discourse.warn("Global asset IP rate limit exceeded for #{ip}: 10 second rate limit", uri: request.env["REQUEST_URI"]) end return !(GlobalSetting.max_reqs_per_ip_mode == "warn") @@ -278,7 +272,7 @@ class Middleware::RequestTracker false rescue RateLimiter::LimitExceeded if warn - Rails.logger.warn("Global IP rate limit exceeded for #{ip}: #{type} second rate limit, uri: #{request.env["REQUEST_URI"]}") + Discourse.warn("Global IP rate limit exceeded for #{ip}: #{type} second rate limit", uri: request.env["REQUEST_URI"]) !(GlobalSetting.max_reqs_per_ip_mode == "warn") else true @@ -287,13 +281,6 @@ class Middleware::RequestTracker end end - def block_crawler(request) - request.get? && - !request.xhr? && - !request.path.ends_with?('robots.txt') && - CrawlerDetection.is_blocked_crawler?(request.env['HTTP_USER_AGENT']) - end - def log_later(data, host) Scheduler::Defer.later("Track view", _db = nil) do self.class.log_request_on_site(data, host) diff --git a/lib/migration/base_dropper.rb b/lib/migration/base_dropper.rb index f36963d99e..eff5fcdb1b 100644 --- a/lib/migration/base_dropper.rb +++ b/lib/migration/base_dropper.rb @@ -1,8 +1,11 @@ module Migration class BaseDropper - def initialize(after_migration, delay, on_drop) + FUNCTION_SCHEMA_NAME = "discourse_functions".freeze + + def initialize(after_migration, delay, on_drop, after_drop) @after_migration = after_migration @on_drop = on_drop + @after_drop = after_drop # in production we need some extra delay to allow for slow migrations @delay = delay || (Rails.env.production? ? 3600 : 0) @@ -12,6 +15,7 @@ module Migration if droppable? @on_drop&.call execute_drop! + @after_drop&.call Discourse.reset_active_record_cache end @@ -44,11 +48,15 @@ module Migration end def self.create_readonly_function(table_name, column_name = nil) + DB.exec <<~SQL + CREATE SCHEMA IF NOT EXISTS #{FUNCTION_SCHEMA_NAME}; + SQL + message = column_name ? "Discourse: #{column_name} in #{table_name} is readonly" : "Discourse: #{table_name} is read only" - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL CREATE OR REPLACE FUNCTION #{readonly_function_name(table_name, column_name)} RETURNS trigger AS $rcr$ BEGIN RAISE EXCEPTION '#{message}'; @@ -67,7 +75,14 @@ module Migration end def self.readonly_function_name(table_name, column_name = nil) - ["raise", table_name, column_name, "readonly()"].compact.join("_") + function_name = [ + "raise", + table_name, + column_name, + "readonly()" + ].compact.join("_") + + "#{FUNCTION_SCHEMA_NAME}.#{function_name}" end def self.readonly_trigger_name(table_name, column_name = nil) diff --git a/lib/migration/column_dropper.rb b/lib/migration/column_dropper.rb index d7176505d1..10e7b37b1c 100644 --- a/lib/migration/column_dropper.rb +++ b/lib/migration/column_dropper.rb @@ -2,17 +2,19 @@ require_dependency 'migration/base_dropper' module Migration class ColumnDropper < BaseDropper - def self.drop(table:, after_migration:, columns:, delay: nil, on_drop: nil) + def self.drop(table:, after_migration:, columns:, delay: nil, on_drop: nil, after_drop: nil) validate_table_name(table) columns.each { |column| validate_column_name(column) } - ColumnDropper.new(table, columns, after_migration, delay, on_drop).delayed_drop + ColumnDropper.new( + table, columns, after_migration, delay, on_drop, after_drop + ).delayed_drop end def self.mark_readonly(table_name, column_name) create_readonly_function(table_name, column_name) - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL CREATE TRIGGER #{readonly_trigger_name(table_name, column_name)} BEFORE INSERT OR UPDATE OF #{column_name} ON #{table_name} @@ -24,40 +26,41 @@ module Migration private - def initialize(table, columns, after_migration, delay, on_drop) - super(after_migration, delay, on_drop) + def initialize(table, columns, after_migration, delay, on_drop, after_drop) + super(after_migration, delay, on_drop, after_drop) @table = table @columns = columns end def droppable? - builder = SqlBuilder.new(<<~SQL) + builder = DB.build(<<~SQL) SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS /*where*/ LIMIT 1 SQL - builder.where("table_schema = 'public'") + builder + .where("table_schema = 'public'") .where("table_name = :table") .where("column_name IN (:columns)") .where(previous_migration_done) .exec(table: @table, columns: @columns, delay: "#{@delay} seconds", - after_migration: @after_migration).to_a.length > 0 + after_migration: @after_migration) > 0 end def execute_drop! @columns.each do |column| - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL DROP TRIGGER IF EXISTS #{BaseDropper.readonly_trigger_name(@table, column)} ON #{@table}; DROP FUNCTION IF EXISTS #{BaseDropper.readonly_function_name(@table, column)} CASCADE; SQL # safe cause it is protected on method entry, can not be passed in params - ActiveRecord::Base.exec_sql("ALTER TABLE #{@table} DROP COLUMN IF EXISTS #{column}") + DB.exec("ALTER TABLE #{@table} DROP COLUMN IF EXISTS #{column}") end end end diff --git a/lib/migration/table_dropper.rb b/lib/migration/table_dropper.rb index 78a9c7172f..0e1a938983 100644 --- a/lib/migration/table_dropper.rb +++ b/lib/migration/table_dropper.rb @@ -2,23 +2,27 @@ require_dependency 'migration/base_dropper' module Migration class Migration::TableDropper < BaseDropper - def self.delayed_drop(table_name:, after_migration:, delay: nil, on_drop: nil) + def self.delayed_drop(table_name:, after_migration:, delay: nil, on_drop: nil, after_drop: nil) validate_table_name(table_name) - TableDropper.new(table_name, nil, after_migration, delay, on_drop).delayed_drop + TableDropper.new( + table_name, nil, after_migration, delay, on_drop, after_drop + ).delayed_drop end - def self.delayed_rename(old_name:, new_name:, after_migration:, delay: nil, on_drop: nil) + def self.delayed_rename(old_name:, new_name:, after_migration:, delay: nil, on_drop: nil, after_drop: nil) validate_table_name(old_name) validate_table_name(new_name) - TableDropper.new(old_name, new_name, after_migration, delay, on_drop).delayed_drop + TableDropper.new( + old_name, new_name, after_migration, delay, on_drop, after_drop + ).delayed_drop end def self.read_only_table(table_name) create_readonly_function(table_name) - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL CREATE TRIGGER #{readonly_trigger_name(table_name)} BEFORE INSERT OR UPDATE OR DELETE OR TRUNCATE ON #{table_name} @@ -29,15 +33,15 @@ module Migration private - def initialize(old_name, new_name, after_migration, delay, on_drop) - super(after_migration, delay, on_drop) + def initialize(old_name, new_name, after_migration, delay, on_drop, after_drop) + super(after_migration, delay, on_drop, after_drop) @old_name = old_name @new_name = new_name end def droppable? - builder = SqlBuilder.new(<<~SQL) + builder = DB.build(<<~SQL) SELECT 1 FROM INFORMATION_SCHEMA.TABLES /*where*/ @@ -52,7 +56,7 @@ module Migration .exec(old_name: @old_name, new_name: @new_name, delay: "#{@delay} seconds", - after_migration: @after_migration).to_a.length > 0 + after_migration: @after_migration) > 0 end def table_exists(table_name_placeholder) @@ -67,9 +71,9 @@ module Migration end def execute_drop! - ActiveRecord::Base.exec_sql("DROP TABLE IF EXISTS #{@old_name}") + DB.exec("DROP TABLE IF EXISTS #{@old_name}") - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL DROP FUNCTION IF EXISTS #{BaseDropper.readonly_function_name(@old_name)} CASCADE; SQL end diff --git a/lib/mini_sql_multisite_connection.rb b/lib/mini_sql_multisite_connection.rb new file mode 100644 index 0000000000..c628ef644b --- /dev/null +++ b/lib/mini_sql_multisite_connection.rb @@ -0,0 +1,69 @@ +class MiniSqlMultisiteConnection < MiniSql::Connection + + class CustomBuilder < MiniSql::Builder + + def initialize(connection, sql) + super + end + + def secure_category(secure_category_ids, category_alias = 'c') + if secure_category_ids.present? + where("NOT COALESCE(" << category_alias << ".read_restricted, false) OR " << category_alias << ".id in (:secure_category_ids)", secure_category_ids: secure_category_ids) + else + where("NOT COALESCE(" << category_alias << ".read_restricted, false)") + end + self + end + end + + class ParamEncoder + def encode(*sql_array) + # use active record to avoid any discrepencies + ActiveRecord::Base.send(:sanitize_sql_array, sql_array) + end + end + + class AfterCommitWrapper + def initialize + @callback = Proc.new + end + + def committed!(*) + @callback.call + end + + def before_committed!(*); end + def rolledback!(*); end + end + + # Allows running arbitrary code after the current transaction has been committed. + # Works even with nested transactions. Useful for scheduling sidekiq jobs. + def after_commit(&blk) + ActiveRecord::Base.connection.add_transaction_record( + AfterCommitWrapper.new(&blk) + ) + end + + def self.instance + new(nil, param_encoder: ParamEncoder.new) + end + + # we need a tiny adapter here so we always run against the + # correct multisite connection + def raw_connection + ActiveRecord::Base.connection.raw_connection + end + + def build(sql) + CustomBuilder.new(self, sql) + end + + def sql_fragment(query, *args) + if args.length > 0 + param_encoder.encode(query, *args) + else + query + end + end + +end diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb index b6965bc221..6fe08f93c4 100644 --- a/lib/new_post_manager.rb +++ b/lib/new_post_manager.rb @@ -82,7 +82,20 @@ class NewPostManager is_fast_typer?(manager) || matches_auto_silence_regex?(manager) || WordWatcher.new("#{manager.args[:title]} #{manager.args[:raw]}").requires_approval? || - (SiteSetting.approve_unless_staged && user.staged) + (SiteSetting.approve_unless_staged && user.staged) || + post_needs_approval_in_its_category?(manager) + end + + def self.post_needs_approval_in_its_category?(manager) + if manager.args[:topic_id].present? + cat = Category.joins(:topics).find_by(topics: { id: manager.args[:topic_id] }) + return false unless cat + cat.require_reply_approval? + elsif manager.args[:category].present? + Category.find(manager.args[:category]).require_topic_approval? + else + false + end end def self.default_handler(manager) diff --git a/lib/onebox/engine/whitelisted_generic_onebox.rb b/lib/onebox/engine/whitelisted_generic_onebox.rb index f48ad2f214..64b22dae9c 100644 --- a/lib/onebox/engine/whitelisted_generic_onebox.rb +++ b/lib/onebox/engine/whitelisted_generic_onebox.rb @@ -16,22 +16,22 @@ module Onebox private - # overwrite to whitelist iframes - def is_embedded? - return false unless data[:html] && data[:height] - return true if WhitelistedGenericOnebox.html_providers.include?(data[:provider_name]) + # overwrite to whitelist iframes + def is_embedded? + return false unless data[:html] && data[:height] + return true if WhitelistedGenericOnebox.html_providers.include?(data[:provider_name]) - if data[:html]["iframe"] - fragment = Nokogiri::HTML::fragment(data[:html]) - if iframe = fragment.at_css("iframe") - src = iframe["src"] - return src.present? && SiteSetting.allowed_iframes.split("|").any? { |url| src.start_with?(url) } - end + if data[:html]["iframe"] + fragment = Nokogiri::HTML::fragment(data[:html]) + if iframe = fragment.at_css("iframe") + src = iframe["src"] + return src.present? && SiteSetting.allowed_iframes.split("|").any? { |url| src.start_with?(url) } end - - false end + false + end + end end end diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb index dc5b649157..a0f48d43b3 100644 --- a/lib/oneboxer.rb +++ b/lib/oneboxer.rb @@ -125,151 +125,153 @@ module Oneboxer private - def self.preview_key(user_id) - "onebox:preview:#{user_id}" - end + def self.preview_key(user_id) + "onebox:preview:#{user_id}" + end - def self.blank_onebox - { preview: "", onebox: "" } - end + def self.blank_onebox + { preview: "", onebox: "" } + end - def self.onebox_cache_key(url) - "onebox__#{url}" - end + def self.onebox_cache_key(url) + "onebox__#{url}" + end - def self.onebox_raw(url, opts = {}) - url = URI(url).to_s - local_onebox(url, opts) || external_onebox(url) - rescue => e - # no point warning here, just cause we have an issue oneboxing a url - # we can later hunt for failed oneboxes by searching logs if needed - Rails.logger.info("Failed to onebox #{url} #{e} #{e.backtrace}") - # return a blank hash, so rest of the code works - blank_onebox - end + def self.onebox_raw(url, opts = {}) + url = URI(url).to_s + local_onebox(url, opts) || external_onebox(url) + rescue => e + # no point warning here, just cause we have an issue oneboxing a url + # we can later hunt for failed oneboxes by searching logs if needed + Rails.logger.info("Failed to onebox #{url} #{e} #{e.backtrace}") + # return a blank hash, so rest of the code works + blank_onebox + end - def self.local_onebox(url, opts = {}) - return unless route = Discourse.route_for(url) + def self.local_onebox(url, opts = {}) + return unless route = Discourse.route_for(url) - html = - case route[:controller] - when "uploads" then local_upload_html(url) - when "topics" then local_topic_html(url, route, opts) - when "users" then local_user_html(url, route) - end - - html = html.presence || "#{url}" - { onebox: html, preview: html } - end - - def self.local_upload_html(url) - case File.extname(URI(url).path || "") - when /^\.(mov|mp4|webm|ogv)$/i - "" - when /^\.(mp3|ogg|wav|m4a)$/i - "" - end - end - - def self.local_topic_html(url, route, opts) - return unless current_user = User.find_by(id: opts[:user_id]) - - if current_category = Category.find_by(id: opts[:category_id]) - return unless Guardian.new(current_user).can_see_category?(current_category) + html = + case route[:controller] + when "uploads" then local_upload_html(url) + when "topics" then local_topic_html(url, route, opts) + when "users" then local_user_html(url, route) end - if current_topic = Topic.find_by(id: opts[:topic_id]) - return unless Guardian.new(current_user).can_see_topic?(current_topic) - end + html = html.presence || "#{url}" + { onebox: html, preview: html } + end - topic = Topic.find_by(id: route[:topic_id]) + def self.local_upload_html(url) + case File.extname(URI(url).path || "") + when /^\.(mov|mp4|webm|ogv)$/i + "" + when /^\.(mp3|ogg|wav|m4a)$/i + "" + end + end - return unless topic - return if topic.private_message? + def self.local_topic_html(url, route, opts) + return unless current_user = User.find_by(id: opts[:user_id]) - if current_category&.id != topic.category_id - return unless Guardian.new.can_see_topic?(topic) - end - - post_number = route[:post_number].to_i - - post = post_number > 1 ? - topic.posts.where(post_number: post_number).first : - topic.ordered_posts.first - - return if !post || post.hidden || post.post_type != Post.types[:regular] - - if post_number > 1 && current_topic&.id == topic.id - excerpt = post.excerpt(SiteSetting.post_onebox_maxlength) - excerpt.gsub!(/[\r\n]+/, " ") - excerpt.gsub!("[/quote]", "[quote]") # don't break my quote - - quote = "[quote=\"#{post.user.username}, topic:#{topic.id}, post:#{post.post_number}\"]\n#{excerpt}\n[/quote]" - - PrettyText.cook(quote) - else - args = { - topic_id: topic.id, - post_number: post.post_number, - avatar: PrettyText.avatar_img(post.user.avatar_template, "tiny"), - original_url: url, - title: PrettyText.unescape_emoji(CGI::escapeHTML(topic.title)), - category_html: CategoryBadge.html_for(topic.category), - quote: PrettyText.unescape_emoji(post.excerpt(SiteSetting.post_onebox_maxlength)), - } - - template = File.read("#{Rails.root}/lib/onebox/templates/discourse_topic_onebox.hbs") - Mustache.render(template, args) - end + if current_category = Category.find_by(id: opts[:category_id]) + return unless Guardian.new(current_user).can_see_category?(current_category) end - def self.local_user_html(url, route) - username = route[:username] || "" - - if user = User.find_by(username_lower: username.downcase) - args = { - user_id: user.id, - username: user.username, - avatar: PrettyText.avatar_img(user.avatar_template, "extra_large"), - name: user.name, - bio: user.user_profile.bio_excerpt(230), - location: user.user_profile.location, - joined: I18n.t('joined'), - created_at: user.created_at.strftime(I18n.t('datetime_formats.formats.date_only')), - website: user.user_profile.website, - website_name: UserSerializer.new(user).website_name, - original_url: url - } - - template = File.read("#{Rails.root}/lib/onebox/templates/discourse_user_onebox.hbs") - Mustache.render(template, args) - else - nil - end + if current_topic = Topic.find_by(id: opts[:topic_id]) + return unless Guardian.new(current_user).can_see_topic?(current_topic) end - def self.external_onebox(url) - Rails.cache.fetch(onebox_cache_key(url), expires_in: 1.day) do - fd = FinalDestination.new(url, ignore_redirects: ignore_redirects, force_get_hosts: force_get_hosts) - uri = fd.resolve - return blank_onebox if uri.blank? || SiteSetting.onebox_domains_blacklist.include?(uri.hostname) + topic = Topic.find_by(id: route[:topic_id]) - options = { - cache: {}, - max_width: 695, - sanitize_config: Sanitize::Config::DISCOURSE_ONEBOX - } + return unless topic + return if topic.private_message? - options[:cookie] = fd.cookie if fd.cookie - - if Rails.env.development? && SiteSetting.port.to_i > 0 - Onebox.options = { allowed_ports: [80, 443, SiteSetting.port.to_i] } - end - - r = Onebox.preview(uri.to_s, options) - - { onebox: r.to_s, preview: r&.placeholder_html.to_s } - end + if current_category&.id != topic.category_id + return unless Guardian.new.can_see_topic?(topic) end + post_number = route[:post_number].to_i + + post = post_number > 1 ? + topic.posts.where(post_number: post_number).first : + topic.ordered_posts.first + + return if !post || post.hidden || post.post_type != Post.types[:regular] + + if post_number > 1 && current_topic&.id == topic.id + excerpt = post.excerpt(SiteSetting.post_onebox_maxlength) + excerpt.gsub!(/[\r\n]+/, " ") + excerpt.gsub!("[/quote]", "[quote]") # don't break my quote + + quote = "[quote=\"#{post.user.username}, topic:#{topic.id}, post:#{post.post_number}\"]\n#{excerpt}\n[/quote]" + + PrettyText.cook(quote) + else + args = { + topic_id: topic.id, + post_number: post.post_number, + avatar: PrettyText.avatar_img(post.user.avatar_template, "tiny"), + original_url: url, + title: PrettyText.unescape_emoji(CGI::escapeHTML(topic.title)), + category_html: CategoryBadge.html_for(topic.category), + quote: PrettyText.unescape_emoji(post.excerpt(SiteSetting.post_onebox_maxlength)), + } + + template = File.read("#{Rails.root}/lib/onebox/templates/discourse_topic_onebox.hbs") + Mustache.render(template, args) + end + end + + def self.local_user_html(url, route) + username = route[:username] || "" + + if user = User.find_by(username_lower: username.downcase) + args = { + user_id: user.id, + username: user.username, + avatar: PrettyText.avatar_img(user.avatar_template, "extra_large"), + name: user.name, + bio: user.user_profile.bio_excerpt(230), + location: user.user_profile.location, + joined: I18n.t('joined'), + created_at: user.created_at.strftime(I18n.t('datetime_formats.formats.date_only')), + website: user.user_profile.website, + website_name: UserSerializer.new(user).website_name, + original_url: url + } + + template = File.read("#{Rails.root}/lib/onebox/templates/discourse_user_onebox.hbs") + Mustache.render(template, args) + else + nil + end + end + + def self.external_onebox(url) + Rails.cache.fetch(onebox_cache_key(url), expires_in: 1.day) do + ignored = SiteSetting.onebox_domains_blacklist.split("|") + + fd = FinalDestination.new(url, ignore_redirects: ignore_redirects, ignore_hostnames: ignored, force_get_hosts: force_get_hosts) + uri = fd.resolve + return blank_onebox if uri.blank? || ignored.map { |hostname| uri.hostname.match?(hostname) }.any? + + options = { + cache: {}, + max_width: 695, + sanitize_config: Sanitize::Config::DISCOURSE_ONEBOX + } + + options[:cookie] = fd.cookie if fd.cookie + + if Rails.env.development? && SiteSetting.port.to_i > 0 + Onebox.options = { allowed_ports: [80, 443, SiteSetting.port.to_i] } + end + + r = Onebox.preview(uri.to_s, options) + + { onebox: r.to_s, preview: r&.placeholder_html.to_s } + end + end + end diff --git a/lib/plugin/auth_provider.rb b/lib/plugin/auth_provider.rb deleted file mode 100644 index 996d9ba041..0000000000 --- a/lib/plugin/auth_provider.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Plugin::AuthProvider - - def self.auth_attributes - [:glyph, :background_color, :title, :message, :frame_width, :frame_height, :authenticator, - :title_setting, :enabled_setting, :full_screen_login, :custom_url] - end - - attr_accessor(*auth_attributes) - - def name - authenticator.name - end - - def to_json - result = { name: name } - result['customUrl'] = custom_url if custom_url - result['titleOverride'] = title if title - result['titleSetting'] = title_setting if title_setting - result['enabledSetting'] = enabled_setting if enabled_setting - result['messageOverride'] = message if message - result['frameWidth'] = frame_width if frame_width - result['frameHeight'] = frame_height if frame_height - result['fullScreenLogin'] = full_screen_login if full_screen_login - result.to_json - end - -end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index de1b13b915..21c4b82d88 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -1,7 +1,7 @@ require 'digest/sha1' require 'fileutils' require_dependency 'plugin/metadata' -require_dependency 'plugin/auth_provider' +require_dependency 'auth' class Plugin::CustomEmoji def self.cache_key @@ -92,6 +92,13 @@ class Plugin::Instance end end + # Applies to all sites in a multisite environment. Ignores plugin.enabled? + def add_report(name, &block) + reloadable_patch do |plugin| + Report.add_report(name, &block) + end + end + # Applies to all sites in a multisite environment. Ignores plugin.enabled? def replace_flags settings = ::FlagSettings.new @@ -102,12 +109,24 @@ class Plugin::Instance end end + def whitelist_flag_post_custom_field(field) + reloadable_patch do |plugin| + ::FlagQuery.register_plugin_post_custom_field(field, plugin) # plugin.enabled? is checked at runtime + end + end + def whitelist_staff_user_custom_field(field) reloadable_patch do |plugin| ::User.register_plugin_staff_custom_field(field, plugin) # plugin.enabled? is checked at runtime end end + def register_editable_user_custom_field(field) + reloadable_patch do |plugin| + ::User.register_plugin_editable_user_custom_field(field, plugin) # plugin.enabled? is checked at runtime + end + end + def custom_avatar_column(column) reloadable_patch do |plugin| AvatarLookup.lookup_columns << column @@ -386,38 +405,6 @@ class Plugin::Instance css = styles.join("\n") js = javascripts.join("\n") - auth_providers.each do |auth| - - auth_json = auth.to_json - hash = Digest::SHA1.hexdigest(auth_json) - js << < 1').group(:user_id).count - counts.each do |user_id, count| - if user_stat = UserStat.where(user_id: user_id).first - user_stat.update_attributes(post_count: user_stat.post_count + count) + if @post.is_first_post? + # Update stats of all people who replied + counts = Post.where(post_type: Post.types[:regular], topic_id: @post.topic_id).where('post_number > 1').group(:user_id).count + counts.each do |user_id, count| + if user_stat = UserStat.where(user_id: user_id).first + user_stat.update_attributes(post_count: user_stat.post_count + count) + end end end end @@ -166,12 +169,12 @@ class PostDestroyer def make_previous_post_the_last_one last_post = Post.where("topic_id = ? and id <> ?", @post.topic_id, @post.id).order('created_at desc').limit(1).first - if last_post.present? - @post.topic.update_attributes( - last_posted_at: last_post.created_at, - last_post_user_id: last_post.user_id, - highest_post_number: last_post.post_number - ) + if last_post.present? && @post.topic.present? + topic = @post.topic + topic.last_posted_at = last_post.created_at + topic.last_post_user_id = last_post.user_id + topic.highest_post_number = last_post.post_number + topic.save!(validate: false) end end @@ -194,6 +197,18 @@ class PostDestroyer end def agree_with_flags + if @post.has_active_flag? && @user.id > 0 && @user.staff? + Jobs.enqueue( + :send_system_message, + user_id: @post.user.id, + message_type: :flags_agreed_and_post_deleted, + message_options: { + url: @post.url, + flag_reason: I18n.t("flag_reasons.#{@post.active_flags.last.post_action_type.name_key}", locale: SiteSetting.default_locale) + } + ) + end + PostAction.agree_flags!(@post, @user, delete_post: true) end @@ -248,10 +263,12 @@ class PostDestroyer author.user_stat.first_post_created_at = author.posts.order('created_at ASC').first.try(:created_at) end - if @post.post_type == Post.types[:regular] && !@post.is_first_post? && !@topic.nil? - author.user_stat.post_count -= 1 + if @post.topic && !@post.topic.private_message? + if @post.post_type == Post.types[:regular] && !@post.is_first_post? && !@topic.nil? + author.user_stat.post_count -= 1 + end + author.user_stat.topic_count -= 1 if @post.is_first_post? end - author.user_stat.topic_count -= 1 if @post.is_first_post? # We don't count replies to your own topics in topic_reply_count if @topic && author.id != @topic.user_id diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb index d74e50dd95..8148b11004 100644 --- a/lib/post_revisor.rb +++ b/lib/post_revisor.rb @@ -69,7 +69,7 @@ class PostRevisor end track_topic_field(:category_id) do |tc, category_id| - if category_id == 0 || tc.guardian.can_create_topic_on_category?(category_id) + if category_id == 0 || tc.guardian.can_move_topic_to_category?(category_id) tc.record_change('category_id', tc.topic.category_id, category_id) tc.check_result(tc.topic.change_category_to_id(category_id)) end @@ -566,7 +566,7 @@ class PostRevisor end def update_topic_word_counts - Topic.exec_sql("UPDATE topics + DB.exec("UPDATE topics SET word_count = ( SELECT SUM(COALESCE(posts.word_count, 0)) FROM posts diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index 9e3b5fc94c..f43dcdbd93 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -172,6 +172,10 @@ module PrettyText buffer << "__optInput.userId = #{opts[:user_id].to_i};\n" end + if opts[:invalidate_oneboxes] + buffer << "__optInput.invalidateOneboxes = true;\n" + end + buffer << "__textOptions = __buildOptions(__optInput);\n" buffer << ("__pt = new __PrettyText(__textOptions);") @@ -293,7 +297,7 @@ module PrettyText else l["rel"] = "nofollow noopener" end - rescue URI::InvalidURIError, URI::InvalidComponentError + rescue URI::Error # add a nofollow anyway l["rel"] = "nofollow noopener" end @@ -363,7 +367,7 @@ module PrettyText unless uri.host.present? || href.start_with?('mailto') link["href"] = "#{site_uri}#{link['href']}" end - rescue URI::InvalidURIError, URI::InvalidComponentError + rescue URI::Error # leave it end end diff --git a/lib/pretty_text/helpers.rb b/lib/pretty_text/helpers.rb index dcb42d76d4..09d7b1a31b 100644 --- a/lib/pretty_text/helpers.rb +++ b/lib/pretty_text/helpers.rb @@ -63,13 +63,18 @@ module PrettyText end if map.length > 0 - reverse_map = map.invert + reverse_map = {} + + map.each do |key, value| + reverse_map[value] ||= [] + reverse_map[value] << key + end Upload.where(sha1: map.values).pluck(:sha1, :url).each do |row| sha1, url = row - if short_url = reverse_map[sha1] - result[short_url] = url + if short_urls = reverse_map[sha1] + short_urls.each { |short_url| result[short_url] = url } end end end @@ -77,8 +82,8 @@ module PrettyText result end - def lookup_inline_onebox(url) - InlineOneboxer.lookup(url) + def lookup_inline_onebox(url, opts = {}) + InlineOneboxer.lookup(url, opts) end def get_topic_info(topic_id) diff --git a/lib/pretty_text/shims.js b/lib/pretty_text/shims.js index 46ce259587..9631d260f8 100644 --- a/lib/pretty_text/shims.js +++ b/lib/pretty_text/shims.js @@ -49,8 +49,14 @@ function __getURL(url) { return url; } -function __lookupInlineOnebox(url) { - return __helpers.lookup_inline_onebox(url); +function __lookupInlineOnebox(url, invalidate = false) { + const opts = {}; + + if (invalidate) { + opts["invalidate"] = true; + } + + return __helpers.lookup_inline_onebox(url, opts); } function __lookupImageUrls(urls) { diff --git a/lib/promotion.rb b/lib/promotion.rb index d1d16b5e91..c6527b47de 100644 --- a/lib/promotion.rb +++ b/lib/promotion.rb @@ -23,7 +23,11 @@ class Promotion end def review_tl0 - Promotion.tl1_met?(@user) && change_trust_level!(TrustLevel[1]) + if Promotion.tl1_met?(@user) && change_trust_level!(TrustLevel[1]) + @user.enqueue_member_welcome_message + return true + end + false end def review_tl1 diff --git a/lib/rate_limiter/limit_exceeded.rb b/lib/rate_limiter/limit_exceeded.rb index 67197b1dea..6e910b3732 100644 --- a/lib/rate_limiter/limit_exceeded.rb +++ b/lib/rate_limiter/limit_exceeded.rb @@ -10,14 +10,16 @@ class RateLimiter end def description - time_left = "" - if @available_in < 1.minute.to_i - time_left = I18n.t("rate_limiter.seconds", count: @available_in) - elsif @available_in < 1.hour.to_i - time_left = I18n.t("rate_limiter.minutes", count: (@available_in / 1.minute.to_i)) - else - time_left = I18n.t("rate_limiter.hours", count: (@available_in / 1.hour.to_i)) - end + time_left = + if @available_in <= 3 + I18n.t("rate_limiter.short_time") + elsif @available_in < 1.minute.to_i + I18n.t("rate_limiter.seconds", count: @available_in) + elsif @available_in < 1.hour.to_i + I18n.t("rate_limiter.minutes", count: (@available_in / 1.minute.to_i)) + else + I18n.t("rate_limiter.hours", count: (@available_in / 1.hour.to_i)) + end if @type.present? type_key = @type.tr("-", "_") diff --git a/lib/remap.rb b/lib/remap.rb new file mode 100644 index 0000000000..45755fb331 --- /dev/null +++ b/lib/remap.rb @@ -0,0 +1,43 @@ +class Remap + def initialize(from, to, regex: false, verbose: false) + @from = from + @to = to + @regex = regex + @verbose = verbose + end + + def perform + sql = "SELECT table_name, column_name +FROM information_schema.columns +WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%') and is_updatable = 'YES'" + + cnn = ActiveRecord::Base.connection.raw_connection + + results = cnn.async_exec(sql).to_a + + results.each do |result| + table_name = result["table_name"] + column_name = result["column_name"] + + log "Remapping #{table_name} #{column_name}" + + result = if @regex + cnn.async_exec("UPDATE #{table_name} + SET #{column_name} = regexp_replace(#{column_name}, $1, $2, 'g') + WHERE NOT #{column_name} IS NULL + AND #{column_name} <> regexp_replace(#{column_name}, $1, $2, 'g')", [@from, @to]) + else + cnn.async_exec("UPDATE #{table_name} + SET #{column_name} = replace(#{column_name}, $1, $2) + WHERE NOT #{column_name} IS NULL + AND #{column_name} <> replace(#{column_name}, $1, $2)", [@from, @to]) + end + + log "#{result.cmd_tuples} rows affected!" + end + end + + def log(message) + puts(message) if @verbose + end +end diff --git a/lib/retrieve_title.rb b/lib/retrieve_title.rb index c8e5f8a7ed..62c4a4022d 100644 --- a/lib/retrieve_title.rb +++ b/lib/retrieve_title.rb @@ -37,36 +37,36 @@ module RetrieveTitle private - def self.max_chunk_size(uri) + def self.max_chunk_size(uri) - # Amazon and YouTube leave the title until very late. Exceptions are bad - # but these are large sites. - return 500 if uri.host =~ /amazon\.(com|ca|co\.uk|es|fr|de|it|com\.au|com\.br|cn|in|co\.jp|com\.mx)$/ - return 300 if uri.host =~ /youtube\.com$/ || uri.host =~ /youtu.be/ + # Amazon and YouTube leave the title until very late. Exceptions are bad + # but these are large sites. + return 500 if uri.host =~ /amazon\.(com|ca|co\.uk|es|fr|de|it|com\.au|com\.br|cn|in|co\.jp|com\.mx)$/ + return 300 if uri.host =~ /youtube\.com$/ || uri.host =~ /youtu.be/ - # default is 10k - 10 - end + # default is 10k + 10 + end - # Fetch the beginning of a HTML document at a url - def self.fetch_title(url) - fd = FinalDestination.new(url, timeout: CRAWL_TIMEOUT) + # Fetch the beginning of a HTML document at a url + def self.fetch_title(url) + fd = FinalDestination.new(url, timeout: CRAWL_TIMEOUT) - current = nil - title = nil + current = nil + title = nil - fd.get do |_response, chunk, uri| + fd.get do |_response, chunk, uri| - if current - current << chunk - else - current = chunk - end - - max_size = max_chunk_size(uri) * 1024 - title = extract_title(current) - throw :done if title || max_size < current.length + if current + current << chunk + else + current = chunk end - return title + + max_size = max_chunk_size(uri) * 1024 + title = extract_title(current) + throw :done if title || max_size < current.length end + return title + end end diff --git a/lib/s3_helper.rb b/lib/s3_helper.rb index 8ead961b20..45a29585d0 100644 --- a/lib/s3_helper.rb +++ b/lib/s3_helper.rb @@ -30,20 +30,25 @@ class S3Helper end def remove(s3_filename, copy_to_tombstone = false) - bucket = s3_bucket - # copy the file in tombstone if copy_to_tombstone && @tombstone_prefix.present? - bucket - .object(File.join(@tombstone_prefix, s3_filename)) - .copy_from(copy_source: File.join(@s3_bucket_name, get_path_for_s3_upload(s3_filename))) + self.copy( + get_path_for_s3_upload(s3_filename), + File.join(@tombstone_prefix, s3_filename) + ) end # delete the file - bucket.object(get_path_for_s3_upload(s3_filename)).delete + s3_bucket.object(get_path_for_s3_upload(s3_filename)).delete rescue Aws::S3::Errors::NoSuchKey end + def copy(source, destination, options: {}) + s3_bucket + .object(destination) + .copy_from(options.merge(copy_source: File.join(@s3_bucket_name, source))) + end + # make sure we have a cors config for assets # otherwise we will have no fonts def ensure_cors! @@ -131,7 +136,11 @@ class S3Helper end def list(prefix = "") - s3_bucket.objects(prefix: "#{@s3_bucket_folder_path}/#{prefix}") + if @s3_bucket_folder_path.present? + prefix = File.join(@s3_bucket_folder_path, prefix) + end + + s3_bucket.objects(prefix: prefix) end def tag_file(key, tags) @@ -150,7 +159,9 @@ class S3Helper end def self.s3_options(obj) - opts = { region: obj.s3_region } + opts = { region: obj.s3_region, + endpoint: SiteSetting.s3_endpoint, + force_path_style: SiteSetting.s3_force_path_style } unless obj.s3_use_iam_profile opts[:access_key_id] = obj.s3_access_key_id @@ -184,9 +195,11 @@ class S3Helper end def s3_bucket - bucket = s3_resource.bucket(@s3_bucket_name) - bucket.create unless bucket.exists? - bucket + @s3_bucket ||= begin + bucket = s3_resource.bucket(@s3_bucket_name) + bucket.create unless bucket.exists? + bucket + end end def check_missing_site_options diff --git a/lib/scheduler/manager.rb b/lib/scheduler/manager.rb deleted file mode 100644 index e9d98b9abd..0000000000 --- a/lib/scheduler/manager.rb +++ /dev/null @@ -1,360 +0,0 @@ -# Initially we used sidetiq, this was a problem: -# -# 1. No mechnism to add "randomisation" into job execution -# 2. No stats about previous runs or failures -# 3. Dependency on ice_cube gem causes runaway CPU - -require_dependency 'distributed_mutex' - -module Scheduler - class Manager - attr_accessor :random_ratio, :redis, :enable_stats - - class Runner - def initialize(manager) - @stopped = false - @mutex = Mutex.new - @queue = Queue.new - @manager = manager - @reschedule_orphans_thread = Thread.new do - while !@stopped - sleep 1.minute - @mutex.synchronize do - reschedule_orphans - end - end - end - @keep_alive_thread = Thread.new do - while !@stopped - @mutex.synchronize do - keep_alive - end - sleep (@manager.keep_alive_duration / 2) - end - end - @thread = Thread.new do - while !@stopped - process_queue - end - end - end - - def keep_alive - @manager.keep_alive - rescue => ex - Discourse.handle_job_exception(ex, message: "Scheduling manager keep-alive") - end - - def reschedule_orphans - @manager.reschedule_orphans! - rescue => ex - Discourse.handle_job_exception(ex, message: "Scheduling manager orphan rescheduler") - end - - def hostname - @hostname ||= begin - `hostname` - rescue - "unknown" - end - end - - def process_queue - - klass = @queue.deq - return unless klass - - # hack alert, I need to both deq and set @running atomically. - @running = true - failed = false - start = Time.now.to_f - info = @mutex.synchronize { @manager.schedule_info(klass) } - stat = nil - error = nil - - begin - info.prev_result = "RUNNING" - @mutex.synchronize { info.write! } - - if @manager.enable_stats - RailsMultisite::ConnectionManagement.with_connection("default") do - stat = SchedulerStat.create!( - name: klass.to_s, - hostname: hostname, - pid: Process.pid, - started_at: Time.zone.now, - live_slots_start: GC.stat[:heap_live_slots] - ) - end - end - - klass.new.perform - rescue => e - if e.class != Jobs::HandledExceptionWrapper - Discourse.handle_job_exception(e, message: "Running a scheduled job", job: klass) - end - - error = "#{e.class}: #{e.message} #{e.backtrace.join("\n")}" - failed = true - end - duration = ((Time.now.to_f - start) * 1000).to_i - info.prev_duration = duration - info.prev_result = failed ? "FAILED" : "OK" - info.current_owner = nil - if stat - RailsMultisite::ConnectionManagement.with_connection("default") do - stat.update!( - duration_ms: duration, - live_slots_finish: GC.stat[:heap_live_slots], - success: !failed, - error: error - ) - DiscourseEvent.trigger(:scheduled_job_ran, stat) - end - end - attempts(3) do - @mutex.synchronize { info.write! } - end - rescue => ex - Discourse.handle_job_exception(ex, message: "Processing scheduled job queue") - ensure - @running = false - ActiveRecord::Base.connection_handler.clear_active_connections! - end - - def stop! - return if @stopped - - @mutex.synchronize do - @stopped = true - - @keep_alive_thread.kill - @reschedule_orphans_thread.kill - - @keep_alive_thread.join - @reschedule_orphans_thread.join - - enq(nil) - - kill_thread = Thread.new do - sleep 0.5 - @thread.kill - end - - @thread.join - kill_thread.kill - kill_thread.join - end - end - - def enq(klass) - @queue << klass - end - - def wait_till_done - while !@queue.empty? && !(@queue.num_waiting > 0) - sleep 0.001 - end - # this is a hack, but is only used for test anyway - sleep 0.001 - while @running - sleep 0.001 - end - end - - def attempts(n) - n.times { - begin - yield; break - rescue - sleep Random.rand - end - } - end - - end - - def self.without_runner(redis = nil) - self.new(redis, skip_runner: true) - end - - def initialize(redis = nil, options = nil) - @redis = $redis || redis - @random_ratio = 0.1 - unless options && options[:skip_runner] - @runner = Runner.new(self) - self.class.current = self - end - - @hostname = options && options[:hostname] - @manager_id = SecureRandom.hex - - if options && options.key?(:enable_stats) - @enable_stats = options[:enable_stats] - else - @enable_stats = true - end - end - - def self.current - @current - end - - def self.current=(manager) - @current = manager - end - - def hostname - @hostname ||= `hostname`.strip - end - - def schedule_info(klass) - ScheduleInfo.new(klass, self) - end - - def next_run(klass) - schedule_info(klass).next_run - end - - def ensure_schedule!(klass) - lock do - schedule_info(klass).schedule! - end - end - - def remove(klass) - lock do - schedule_info(klass).del! - end - end - - def reschedule_orphans! - lock do - reschedule_orphans_on! - reschedule_orphans_on!(hostname) - end - end - - def reschedule_orphans_on!(hostname = nil) - redis.zrange(Manager.queue_key(hostname), 0, -1).each do |key| - klass = get_klass(key) - next unless klass - info = schedule_info(klass) - - if ['QUEUED', 'RUNNING'].include?(info.prev_result) && - (info.current_owner.blank? || !redis.get(info.current_owner)) - info.prev_result = 'ORPHAN' - info.next_run = Time.now.to_i - info.write! - end - end - end - - def get_klass(name) - name.constantize - rescue NameError - nil - end - - def tick - lock do - schedule_next_job - schedule_next_job(hostname) - end - end - - def schedule_next_job(hostname = nil) - (key, due), _ = redis.zrange Manager.queue_key(hostname), 0, 0, withscores: true - return unless key - - if due.to_i <= Time.now.to_i - klass = get_klass(key) - unless klass - # corrupt key, nuke it (renamed job or something) - redis.zrem Manager.queue_key(hostname), key - return - end - info = schedule_info(klass) - info.prev_run = Time.now.to_i - info.prev_result = "QUEUED" - info.prev_duration = -1 - info.next_run = nil - info.current_owner = identity_key - info.schedule! - @runner.enq(klass) - end - end - - def blocking_tick - tick - @runner.wait_till_done - end - - def stop! - @runner.stop! - self.class.current = nil - end - - def keep_alive_duration - 60 - end - - def keep_alive - redis.setex identity_key, keep_alive_duration, "" - end - - def lock - DistributedMutex.new(Manager.lock_key).synchronize do - yield - end - end - - def self.discover_schedules - # hack for developemnt reloader is crazytown - # multiple classes with same name can be in - # object space - unique = Set.new - schedules = [] - ObjectSpace.each_object(Scheduler::Schedule) do |schedule| - if schedule.scheduled? - next if unique.include?(schedule.to_s) - schedules << schedule - unique << schedule.to_s - end - end - schedules - end - - @mutex = Mutex.new - def self.seq - @mutex.synchronize do - @i ||= 0 - @i += 1 - end - end - - def identity_key - @identity_key ||= "_scheduler_#{hostname}:#{Process.pid}:#{self.class.seq}:#{SecureRandom.hex}" - end - - def self.lock_key - "_scheduler_lock_" - end - - def self.queue_key(hostname = nil) - if hostname - "_scheduler_queue_#{hostname}_" - else - "_scheduler_queue_" - end - end - - def self.schedule_key(klass, hostname = nil) - if hostname - "_scheduler_#{klass}_#{hostname}" - else - "_scheduler_#{klass}" - end - end - end -end diff --git a/lib/scheduler/schedule.rb b/lib/scheduler/schedule.rb deleted file mode 100644 index 05c8085bc1..0000000000 --- a/lib/scheduler/schedule.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Scheduler::Schedule - - def daily(options = nil) - if options - @daily = options - end - @daily - end - - def every(duration = nil) - if duration - @every = duration - if manager = Scheduler::Manager.current - manager.ensure_schedule!(self) - end - end - @every - end - - # schedule job indepndently on each host (looking at hostname) - def per_host - @per_host = true - end - - def is_per_host - @per_host - end - - def schedule_info - manager = Scheduler::Manager.without_runner - manager.schedule_info self - end - - def scheduled? - !!@every || !!@daily - end -end diff --git a/lib/scheduler/schedule_info.rb b/lib/scheduler/schedule_info.rb deleted file mode 100644 index d9348b2ea6..0000000000 --- a/lib/scheduler/schedule_info.rb +++ /dev/null @@ -1,138 +0,0 @@ -module Scheduler - class ScheduleInfo - attr_accessor :next_run, - :prev_run, - :prev_duration, - :prev_result, - :current_owner - - def initialize(klass, manager) - @klass = klass - @manager = manager - - data = nil - - if data = @manager.redis.get(key) - data = JSON.parse(data) - end - - if data - @next_run = data["next_run"] - @prev_run = data["prev_run"] - @prev_result = data["prev_result"] - @prev_duration = data["prev_duration"] - @current_owner = data["current_owner"] - end - rescue - # corrupt redis - @next_run = @prev_run = @prev_result = @prev_duration = @current_owner = nil - end - - # this means the schedule is going to fire, it is setup correctly - # invalid schedules are fixed by running "schedule!" - # this happens automatically after if fire by the manager - def valid? - return false unless @next_run - (!@prev_run && @next_run < Time.now.to_i + 5.minutes) || valid_every? || valid_daily? - end - - def valid_every? - return false unless @klass.every - !!@prev_run && - @prev_run <= Time.now.to_i && - @next_run < @prev_run + @klass.every * (1 + @manager.random_ratio) - end - - def valid_daily? - return false unless @klass.daily - return true if !@prev_run && @next_run && @next_run <= (Time.zone.now + 1.day).to_i - !!@prev_run && - @prev_run <= Time.zone.now.to_i && - @next_run < @prev_run + 1.day - end - - def schedule_every! - if !valid? && @prev_run - mixup = @klass.every * @manager.random_ratio - mixup = (mixup * Random.rand - mixup / 2).to_i - @next_run = @prev_run + mixup + @klass.every - end - - if !valid? - @next_run = Time.now.to_i + 5.minutes * Random.rand - end - end - - def schedule_daily! - return if valid? - - at = @klass.daily[:at] || 0 - today_begin = Time.zone.now.midnight.to_i - today_offset = DateTime.now.seconds_since_midnight - - # If it's later today - if at > today_offset - @next_run = today_begin + at - else - # Otherwise do it tomorrow - @next_run = today_begin + 1.day + at - end - end - - def schedule! - if @klass.every - schedule_every! - elsif @klass.daily - schedule_daily! - end - - write! - end - - def write! - - clear! - redis.set key, { - next_run: @next_run, - prev_run: @prev_run, - prev_duration: @prev_duration, - prev_result: @prev_result, - current_owner: @current_owner - }.to_json - - redis.zadd queue_key, @next_run, @klass if @next_run - end - - def del! - clear! - @next_run = @prev_run = @prev_result = @prev_duration = @current_owner = nil - end - - def key - if @klass.is_per_host - Manager.schedule_key(@klass, @manager.hostname) - else - Manager.schedule_key(@klass) - end - end - - def queue_key - if @klass.is_per_host - Manager.queue_key(@manager.hostname) - else - Manager.queue_key - end - end - - def redis - @manager.redis - end - - private - def clear! - redis.del key - redis.zrem queue_key, @klass - end - - end -end diff --git a/lib/scheduler/scheduler.rb b/lib/scheduler/scheduler.rb deleted file mode 100644 index e9f389194f..0000000000 --- a/lib/scheduler/scheduler.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Scheduler -end - -require_dependency 'scheduler/schedule' -require_dependency 'scheduler/schedule_info' -require_dependency 'scheduler/manager' -require_dependency 'scheduler/defer' diff --git a/lib/scheduler/views/history.erb b/lib/scheduler/views/history.erb deleted file mode 100644 index c1cc026ba7..0000000000 --- a/lib/scheduler/views/history.erb +++ /dev/null @@ -1,47 +0,0 @@ -

-
-

Scheduler History

-
-
- -
-
-
- <% if @scheduler_stats.length > 0 %> - - - - - - - - - - - - <% @scheduler_stats.each do |stat| %> - - - - - - - - - <% end %> - -
Job NameHostname:PidLive Slots deltaStarted AtDuration
<%= stat.name %><%= stat.hostname %>:<%= stat.pid %> - <% if stat.live_slots_start && stat.live_slots_finish %> - <%= stat.live_slots_finish - stat.live_slots_start %> - <% end %> - <%= sane_time stat.started_at %><%= sane_duration stat.duration_ms %> - <% if stat.success.nil? %> - RUNNING - <% elsif !stat.success %> - FAILED - <% end %> -
- <% end %> -
-
-
diff --git a/lib/scheduler/views/scheduler.erb b/lib/scheduler/views/scheduler.erb deleted file mode 100644 index 85fb6da8d9..0000000000 --- a/lib/scheduler/views/scheduler.erb +++ /dev/null @@ -1,73 +0,0 @@ -
- <% if Sidekiq.paused? %> -
-
-

SIDEKIQ IS PAUSED!

-
-
- <% end %> -
-

Recurring Jobs history

-
-
- -
-
- -
- <% if @schedules.length > 0 %> - - - - - - - - - - - <% @schedules.each do |schedule| %> - <% @info = schedule.schedule_info %> - - - - - - - - - <% end %> -
WorkerLast RunLast ResultLast DurationLast OwnerNext Run DueActions
- <%= schedule %> - - <% prev = @info.prev_run %> - <% if prev.nil? %> - Never - <% else %> - <%= relative_time(Time.at(prev)) %> - <% end %> - - <%= @info.prev_result %> - - <%= sane_duration @info.prev_duration %> - - <%= @info.current_owner %> - - <% next_run = @info.next_run %> - <% if next_run.nil? %> - Not Scheduled Yet - <% else %> - <%= relative_time(Time.at(next_run)) %> - <% end %> - -
" method="post"> - <%= csrf_tag if respond_to?(:csrf_tag) %> - -
-
- <% else %> -
No recurring jobs found.
- <% end %> -
-
-
diff --git a/lib/scheduler/web.rb b/lib/scheduler/web.rb deleted file mode 100644 index b2deac7bf6..0000000000 --- a/lib/scheduler/web.rb +++ /dev/null @@ -1,65 +0,0 @@ -# Based off sidetiq https://github.com/tobiassvn/sidetiq/blob/master/lib/sidetiq/web.rb -module Scheduler - module Web - VIEWS = File.expand_path('views', File.dirname(__FILE__)) unless defined? VIEWS - - def self.registered(app) - - app.helpers do - def sane_time(time) - return unless time - time - end - - def sane_duration(duration) - return unless duration - if duration < 1000 - "#{duration}ms" - elsif duration < 60 * 1000 - "#{'%.2f' % (duration / 1000.0)} secs" - end - end - end - - app.get "/scheduler" do - RailsMultisite::ConnectionManagement.with_connection("default") do - @manager = Scheduler::Manager.without_runner - @schedules = Scheduler::Manager.discover_schedules.sort do |a, b| - a_next = a.schedule_info.next_run - b_next = b.schedule_info.next_run - if a_next && b_next - a_next <=> b_next - elsif a_next - -1 - else - 1 - end - end - erb File.read(File.join(VIEWS, 'scheduler.erb')), locals: { view_path: VIEWS } - end - end - - app.get "/scheduler/history" do - @scheduler_stats = SchedulerStat.order('started_at desc').limit(200) - erb File.read(File.join(VIEWS, 'history.erb')), locals: { view_path: VIEWS } - end - - app.post "/scheduler/:name/trigger" do - halt 404 unless (name = params[:name]) - - RailsMultisite::ConnectionManagement.with_connection("default") do - klass = name.constantize - info = klass.schedule_info - info.next_run = Time.now.to_i - info.write! - - redirect "#{root_path}scheduler" - end - end - - end - end -end - -Sidekiq::Web.register(Scheduler::Web) -Sidekiq::Web.tabs["Scheduler"] = "scheduler" diff --git a/lib/score_calculator.rb b/lib/score_calculator.rb index baf93cb457..69c8173d9b 100644 --- a/lib/score_calculator.rb +++ b/lib/score_calculator.rb @@ -20,7 +20,6 @@ class ScoreCalculator update_posts_score(opts) update_posts_rank(opts) update_topics_rank(opts) - update_topics_percent_rank(opts) end private @@ -32,7 +31,7 @@ class ScoreCalculator @weightings.each_key { |k| components << "COALESCE(posts.#{k}, 0) * :#{k}" } components = components.join(" + ") - builder = SqlBuilder.new < posts.percent_rank") filter_topics(builder, opts) - while builder.exec.cmd_tuples == limit + while builder.exec == limit end end def update_topics_rank(opts) - builder = SqlBuilder.new("UPDATE topics AS topics - SET has_summary = (topics.like_count >= :likes_required AND - topics.posts_count >= :posts_required AND - x.max_score >= :score_required), - score = x.avg_score - FROM (SELECT p.topic_id, - MAX(p.score) AS max_score, - AVG(p.score) AS avg_score - FROM posts AS p - GROUP BY p.topic_id) AS x - /*where*/") + builder = DB.build <<~SQL + UPDATE topics AS topics + SET has_summary = (topics.like_count >= :likes_required AND + topics.posts_count >= :posts_required AND + x.max_score >= :score_required), + score = x.avg_score + FROM (SELECT p.topic_id, + MAX(p.score) AS max_score, + AVG(p.score) AS avg_score + FROM posts AS p + GROUP BY p.topic_id) AS x + /*where*/ + SQL - builder.where("x.topic_id = topics.id AND - ( - (topics.score <> x.avg_score OR topics.score IS NULL) OR - (topics.has_summary IS NULL OR topics.has_summary <> ( - topics.like_count >= :likes_required AND - topics.posts_count >= :posts_required AND - x.max_score >= :score_required - )) - ) - ", - likes_required: SiteSetting.summary_likes_required, - posts_required: SiteSetting.summary_posts_required, - score_required: SiteSetting.summary_score_threshold) + defaults = { + likes_required: SiteSetting.summary_likes_required, + posts_required: SiteSetting.summary_posts_required, + score_required: SiteSetting.summary_score_threshold + } - filter_topics(builder, opts) - - builder.exec - end - - def update_topics_percent_rank(opts) - - builder = SqlBuilder.new("UPDATE topics SET percent_rank = x.percent_rank - FROM (SELECT id, percent_rank() - OVER (ORDER BY SCORE DESC) as percent_rank - FROM topics) AS x - /*where*/") - - builder.where("x.id = topics.id AND (topics.percent_rank <> x.percent_rank OR topics.percent_rank IS NULL)") + builder.where(<<~SQL, defaults) + x.topic_id = topics.id AND + ( + (topics.score <> x.avg_score OR topics.score IS NULL) OR + (topics.has_summary IS NULL OR topics.has_summary <> ( + topics.like_count >= :likes_required AND + topics.posts_count >= :posts_required AND + x.max_score >= :score_required + )) + ) + SQL filter_topics(builder, opts) diff --git a/lib/search.rb b/lib/search.rb index 40f80a245c..3cd0a20a14 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -132,11 +132,14 @@ class Search @valid = true @page = @opts[:page] + term = term.to_s.dup + # Removes any zero-width characters from search terms - term.to_s.gsub!(/[\u200B-\u200D\uFEFF]/, '') + term.gsub!(/[\u200B-\u200D\uFEFF]/, '') # Replace curly quotes to regular quotes - term.to_s.gsub!(/[\u201c\u201d]/, '"') - @clean_term = term.to_s.dup + term.gsub!(/[\u201c\u201d]/, '"') + + @clean_term = term term = process_advanced_search!(term) @@ -369,7 +372,7 @@ class Search end end - advanced_filter(/^\#([a-zA-Z0-9\-:=]+)/) do |posts, match| + advanced_filter(/^\#([\p{L}0-9\-:=]+)/) do |posts, match| exact = true @@ -465,437 +468,452 @@ class Search end end - advanced_filter(/tags?:([a-zA-Z0-9,\-_+]+)/) do |posts, match| - if match.include?('+') - tags = match.split('+') + advanced_filter(/^tags?:([\p{L}0-9,\-_+]+)/) do |posts, match| + search_tags(posts, match, positive: true) + end - posts.where("topics.id IN ( - SELECT tt.topic_id - FROM topic_tags tt, tags - WHERE tt.tag_id = tags.id - GROUP BY tt.topic_id - HAVING to_tsvector(#{default_ts_config}, array_to_string(array_agg(tags.name), ' ')) @@ to_tsquery(#{default_ts_config}, ?) - )", tags.join('&')) - else - tags = match.split(",") - - posts.where("topics.id IN ( - SELECT DISTINCT(tt.topic_id) - FROM topic_tags tt, tags - WHERE tt.tag_id = tags.id - AND tags.name in (?) - )", tags) - end + advanced_filter(/\-tags?:([\p{L}0-9,\-_+]+)/) do |posts, match| + search_tags(posts, match, positive: false) end advanced_filter(/filetypes?:([a-zA-Z0-9,\-_]+)/) do |posts, match| file_extensions = match.split(",").map(&:downcase) - posts.where("posts.id IN ( - SELECT post_id FROM topic_links - WHERE extension IN (:file_extensions) + SELECT post_id + FROM topic_links + WHERE extension IN (:file_extensions) + UNION - SELECT post_uploads.post_id FROM uploads - JOIN post_uploads ON post_uploads.upload_id = uploads.id - WHERE lower(uploads.extension) IN (:file_extensions) - )", file_extensions: file_extensions) + + SELECT post_uploads.post_id + FROM uploads + JOIN post_uploads ON post_uploads.upload_id = uploads.id + WHERE lower(uploads.extension) IN (:file_extensions) + )", file_extensions: file_extensions) end private - def process_advanced_search!(term) + def search_tags(posts, match, positive:) + return if match.nil? - term.to_s.scan(/(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/).to_a.map do |(word, _)| - next if word.blank? + modifier = positive ? "" : "NOT" - found = false + if match.include?('+') + tags = match.split('+') - Search.advanced_filters.each do |matcher, block| - cleaned = word.gsub(/["']/, "") - if cleaned =~ matcher - (@filters ||= []) << [block, $1] - found = true - end - end + posts.where("topics.id #{modifier} IN ( + SELECT tt.topic_id + FROM topic_tags tt, tags + WHERE tt.tag_id = tags.id + GROUP BY tt.topic_id + HAVING to_tsvector(#{default_ts_config}, array_to_string(array_agg(tags.name), ' ')) @@ to_tsquery(#{default_ts_config}, ?) + )", tags.join('&')).order("id") + else + tags = match.split(",") - @in_title = false - - if word == 'order:latest' || word == 'l' - @order = :latest - nil - elsif word == 'order:latest_topic' - @order = :latest_topic - nil - elsif word == 'in:title' - @in_title = true - nil - elsif word =~ /topic:(\d+)/ - topic_id = $1.to_i - if topic_id > 1 - topic = Topic.find_by(id: topic_id) - if @guardian.can_see?(topic) - @search_context = topic - end - end - nil - elsif word == 'order:views' - @order = :views - nil - elsif word == 'order:likes' - @order = :likes - nil - elsif word == 'in:private' - @search_pms = true - nil - elsif word =~ /^private_messages:(.+)$/ - @search_pms = true - nil - else - found ? nil : word - end - end.compact.join(' ') + posts.where("topics.id #{modifier} IN ( + SELECT DISTINCT(tt.topic_id) + FROM topic_tags tt, tags + WHERE tt.tag_id = tags.id AND tags.name IN (?) + )", tags).order("id") end + end - def find_grouped_results + def process_advanced_search!(term) + term.to_s.scan(/(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/).to_a.map do |(word, _)| + next if word.blank? - if @results.type_filter.present? - raise Discourse::InvalidAccess.new("invalid type filter") unless Search.facets.include?(@results.type_filter) - send("#{@results.type_filter}_search") + found = false + + Search.advanced_filters.each do |matcher, block| + cleaned = word.gsub(/["']/, "") + if cleaned =~ matcher + (@filters ||= []) << [block, $1] + found = true + end + end + + @in_title = false + + if word == 'order:latest' || word == 'l' + @order = :latest + nil + elsif word == 'order:latest_topic' + @order = :latest_topic + nil + elsif word == 'in:title' + @in_title = true + nil + elsif word =~ /topic:(\d+)/ + topic_id = $1.to_i + if topic_id > 1 + topic = Topic.find_by(id: topic_id) + if @guardian.can_see?(topic) + @search_context = topic + end + end + nil + elsif word == 'order:views' + @order = :views + nil + elsif word == 'order:likes' + @order = :likes + nil + elsif word == 'in:private' + @search_pms = true + nil + elsif word =~ /^private_messages:(.+)$/ + @search_pms = true + nil else - unless @search_context - user_search if @term.present? - category_search if @term.present? - tags_search if @term.present? + found ? nil : word + end + end.compact.join(' ') + end + + def find_grouped_results + + if @results.type_filter.present? + raise Discourse::InvalidAccess.new("invalid type filter") unless Search.facets.include?(@results.type_filter) + send("#{@results.type_filter}_search") + else + unless @search_context + user_search if @term.present? + category_search if @term.present? + tags_search if @term.present? + end + topic_search + end + + add_more_topics_if_expected + @results + rescue ActiveRecord::StatementInvalid + # In the event of a PG:Error return nothing, it is likely they used a foreign language whose + # locale is not supported by postgres + end + + # Add more topics if we expected them + def add_more_topics_if_expected + expected_topics = 0 + expected_topics = Search.facets.size unless @results.type_filter.present? + expected_topics = Search.per_facet * Search.facets.size if @results.type_filter == 'topic' + expected_topics -= @results.posts.length + if expected_topics > 0 + extra_posts = posts_query(expected_topics * Search.burst_factor) + extra_posts = extra_posts.where("posts.topic_id NOT in (?)", @results.posts.map(&:topic_id)) if @results.posts.present? + extra_posts.each do |post| + @results.add(post) + expected_topics -= 1 + break if expected_topics == 0 + end + end + end + + # If we're searching for a single topic + def single_topic(id) + post = Post.find_by(topic_id: id, post_number: 1) + return nil unless @guardian.can_see?(post) + + @results.add(post) + @results + end + + def secure_category_ids + return @secure_category_ids unless @secure_category_ids.nil? + @secure_category_ids = @guardian.secure_category_ids + end + + def category_search + # scope is leaking onto Category, this is not good and probably a bug in Rails + # the secure_category_ids will invoke the same method on User, it calls Category.where + # however the scope from the query below is leaking in to Category, this works around + # the issue while we figure out what is up in Rails + secure_category_ids + + categories = Category.includes(:category_search_data) + .where("category_search_data.search_data @@ #{ts_query}") + .references(:category_search_data) + .order("topics_month DESC") + .secured(@guardian) + .limit(limit) + + categories.each do |category| + @results.add(category) + end + end + + def user_search + return if SiteSetting.hide_user_profiles_from_public && !@guardian.user + + users = User.includes(:user_search_data) + .references(:user_search_data) + .where(active: true) + .where(staged: false) + .where("user_search_data.search_data @@ #{ts_query("simple")}") + .order("CASE WHEN username_lower = '#{@original_term.downcase}' THEN 0 ELSE 1 END") + .order("last_posted_at DESC") + .limit(limit) + + users.each do |user| + @results.add(user) + end + end + + def tags_search + return unless SiteSetting.tagging_enabled + + tags = Tag.includes(:tag_search_data) + .where("tag_search_data.search_data @@ #{ts_query}") + .references(:tag_search_data) + .order("name asc") + .limit(limit) + + tags.each do |tag| + @results.add(tag) + end + end + + def posts_query(limit, opts = nil) + opts ||= {} + posts = Post.where(post_type: Topic.visible_post_types(@guardian.user)) + .joins(:post_search_data, :topic) + .joins("LEFT JOIN categories ON categories.id = topics.category_id") + .where("topics.deleted_at" => nil) + + is_topic_search = @search_context.present? && @search_context.is_a?(Topic) + + posts = posts.where("topics.visible") unless is_topic_search + + if opts[:private_messages] || (is_topic_search && @search_context.private_message?) + posts = posts.where("topics.archetype = ?", Archetype.private_message) + + unless @guardian.is_admin? + posts = posts.private_posts_for_user(@guardian.user) + end + else + posts = posts.where("topics.archetype <> ?", Archetype.private_message) + end + + if @term.present? + if is_topic_search + + term_without_quote = @term + if @term =~ /"(.+)"/ + term_without_quote = $1 end - topic_search - end - add_more_topics_if_expected - @results - rescue ActiveRecord::StatementInvalid - # In the event of a PG:Error return nothing, it is likely they used a foreign language whose - # locale is not supported by postgres - end - - # Add more topics if we expected them - def add_more_topics_if_expected - expected_topics = 0 - expected_topics = Search.facets.size unless @results.type_filter.present? - expected_topics = Search.per_facet * Search.facets.size if @results.type_filter == 'topic' - expected_topics -= @results.posts.length - if expected_topics > 0 - extra_posts = posts_query(expected_topics * Search.burst_factor) - extra_posts = extra_posts.where("posts.topic_id NOT in (?)", @results.posts.map(&:topic_id)) if @results.posts.present? - extra_posts.each do |post| - @results.add(post) - expected_topics -= 1 - break if expected_topics == 0 + if @term =~ /'(.+)'/ + term_without_quote = $1 end - end - end - # If we're searching for a single topic - def single_topic(id) - post = Post.find_by(topic_id: id, post_number: 1) - return nil unless @guardian.can_see?(post) - - @results.add(post) - @results - end - - def secure_category_ids - return @secure_category_ids unless @secure_category_ids.nil? - @secure_category_ids = @guardian.secure_category_ids - end - - def category_search - # scope is leaking onto Category, this is not good and probably a bug in Rails - # the secure_category_ids will invoke the same method on User, it calls Category.where - # however the scope from the query below is leaking in to Category, this works around - # the issue while we figure out what is up in Rails - secure_category_ids - - categories = Category.includes(:category_search_data) - .where("category_search_data.search_data @@ #{ts_query}") - .references(:category_search_data) - .order("topics_month DESC") - .secured(@guardian) - .limit(limit) - - categories.each do |category| - @results.add(category) - end - end - - def user_search - return if SiteSetting.hide_user_profiles_from_public && !@guardian.user - - users = User.includes(:user_search_data) - .references(:user_search_data) - .where(active: true) - .where(staged: false) - .where("user_search_data.search_data @@ #{ts_query("simple")}") - .order("CASE WHEN username_lower = '#{@original_term.downcase}' THEN 0 ELSE 1 END") - .order("last_posted_at DESC") - .limit(limit) - - users.each do |user| - @results.add(user) - end - end - - def tags_search - return unless SiteSetting.tagging_enabled - - tags = Tag.includes(:tag_search_data) - .where("tag_search_data.search_data @@ #{ts_query}") - .references(:tag_search_data) - .order("name asc") - .limit(limit) - - tags.each do |tag| - @results.add(tag) - end - end - - def posts_query(limit, opts = nil) - opts ||= {} - posts = Post.where(post_type: Topic.visible_post_types(@guardian.user)) - .joins(:post_search_data, :topic) - .joins("LEFT JOIN categories ON categories.id = topics.category_id") - .where("topics.deleted_at" => nil) - - is_topic_search = @search_context.present? && @search_context.is_a?(Topic) - - posts = posts.where("topics.visible") unless is_topic_search - - if opts[:private_messages] || (is_topic_search && @search_context.private_message?) - posts = posts.where("topics.archetype = ?", Archetype.private_message) - - unless @guardian.is_admin? - posts = posts.private_posts_for_user(@guardian.user) - end + posts = posts.joins('JOIN users u ON u.id = posts.user_id') + posts = posts.where("posts.raw || ' ' || u.username || ' ' || COALESCE(u.name, '') ilike ?", "%#{term_without_quote}%") else - posts = posts.where("topics.archetype <> ?", Archetype.private_message) - end - - if @term.present? - if is_topic_search - - term_without_quote = @term - if @term =~ /"(.+)"/ - term_without_quote = $1 - end - - if @term =~ /'(.+)'/ - term_without_quote = $1 - end - - posts = posts.joins('JOIN users u ON u.id = posts.user_id') - posts = posts.where("posts.raw || ' ' || u.username || ' ' || COALESCE(u.name, '') ilike ?", "%#{term_without_quote}%") - else - # A is for title - # B is for category - # C is for tags - # D is for cooked - weights = @in_title ? 'A' : (SiteSetting.tagging_enabled ? 'ABCD' : 'ABD') - posts = posts.where("post_search_data.search_data @@ #{ts_query(weight_filter: weights)}") - exact_terms = @term.scan(/"([^"]+)"/).flatten - exact_terms.each do |exact| - posts = posts.where("posts.raw ilike :exact OR topics.title ilike :exact", exact: "%#{exact}%") - end + # A is for title + # B is for category + # C is for tags + # D is for cooked + weights = @in_title ? 'A' : (SiteSetting.tagging_enabled ? 'ABCD' : 'ABD') + posts = posts.where("post_search_data.search_data @@ #{ts_query(weight_filter: weights)}") + exact_terms = @term.scan(/"([^"]+)"/).flatten + exact_terms.each do |exact| + posts = posts.where("posts.raw ilike :exact OR topics.title ilike :exact", exact: "%#{exact}%") end end + end - @filters.each do |block, match| - if block.arity == 1 - posts = instance_exec(posts, &block) || posts - else - posts = instance_exec(posts, match, &block) || posts - end - end if @filters - - # If we have a search context, prioritize those posts first - if @search_context.present? - - if @search_context.is_a?(User) - - if opts[:private_messages] - posts = posts.private_posts_for_user(@search_context) - else - posts = posts.where("posts.user_id = #{@search_context.id}") - end - - elsif @search_context.is_a?(Category) - category_ids = [@search_context.id] + Category.where(parent_category_id: @search_context.id).pluck(:id) - posts = posts.where("topics.category_id in (?)", category_ids) - elsif @search_context.is_a?(Topic) - posts = posts.where("topics.id = #{@search_context.id}") - .order("posts.post_number #{@order == :latest ? "DESC" : ""}") - end - - end - - if @order == :latest || (@term.blank? && !@order) - if opts[:aggregate_search] - posts = posts.order("MAX(posts.created_at) DESC") - else - posts = posts.reorder("posts.created_at DESC") - end - elsif @order == :latest_topic - if opts[:aggregate_search] - posts = posts.order("MAX(topics.created_at) DESC") - else - posts = posts.order("topics.created_at DESC") - end - elsif @order == :views - if opts[:aggregate_search] - posts = posts.order("MAX(topics.views) DESC") - else - posts = posts.order("topics.views DESC") - end - elsif @order == :likes - if opts[:aggregate_search] - posts = posts.order("MAX(posts.like_count) DESC") - else - posts = posts.order("posts.like_count DESC") - end + @filters.each do |block, match| + if block.arity == 1 + posts = instance_exec(posts, &block) || posts else - data_ranking = "TS_RANK_CD(post_search_data.search_data, #{ts_query})" - if opts[:aggregate_search] - posts = posts.order("MAX(#{data_ranking}) DESC") + posts = instance_exec(posts, match, &block) || posts + end + end if @filters + + # If we have a search context, prioritize those posts first + if @search_context.present? + + if @search_context.is_a?(User) + + if opts[:private_messages] + posts = posts.private_posts_for_user(@search_context) else - posts = posts.order("#{data_ranking} DESC") + posts = posts.where("posts.user_id = #{@search_context.id}") end - posts = posts.order("topics.bumped_at DESC") + + elsif @search_context.is_a?(Category) + category_ids = [@search_context.id] + Category.where(parent_category_id: @search_context.id).pluck(:id) + posts = posts.where("topics.category_id in (?)", category_ids) + elsif @search_context.is_a?(Topic) + posts = posts.where("topics.id = #{@search_context.id}") + .order("posts.post_number #{@order == :latest ? "DESC" : ""}") end - if secure_category_ids.present? - posts = posts.where("(categories.id IS NULL) OR (NOT categories.read_restricted) OR (categories.id IN (?))", secure_category_ids).references(:categories) + end + + if @order == :latest || (@term.blank? && !@order) + if opts[:aggregate_search] + posts = posts.order("MAX(posts.created_at) DESC") else - posts = posts.where("(categories.id IS NULL) OR (NOT categories.read_restricted)").references(:categories) + posts = posts.reorder("posts.created_at DESC") end - - posts = posts.offset(offset) - posts.limit(limit) - end - - def self.default_ts_config - "'#{Search.ts_config}'" - end - - def default_ts_config - self.class.default_ts_config - end - - def self.ts_query(term: , ts_config: nil, joiner: "&", weight_filter: nil) - - data = Post.exec_sql("SELECT TO_TSVECTOR(:config, :term)", - config: 'simple', - term: term).values[0][0] - - ts_config = ActiveRecord::Base.connection.quote(ts_config) if ts_config - all_terms = data.scan(/'([^']+)'\:\d+/).flatten - all_terms.map! do |t| - t.split(/[\)\(&']/)[0] - end.compact! - - query = ActiveRecord::Base.connection.quote( - all_terms - .map { |t| "'#{PG::Connection.escape_string(t)}':*#{weight_filter}" } - .join(" #{joiner} ") - ) - - "TO_TSQUERY(#{ts_config || default_ts_config}, #{query})" - end - - def ts_query(ts_config = nil, weight_filter: nil) - @ts_query_cache ||= {} - @ts_query_cache["#{ts_config || default_ts_config} #{@term} #{weight_filter}"] ||= - Search.ts_query(term: @term, ts_config: ts_config, weight_filter: weight_filter) - end - - def wrap_rows(query) - "SELECT *, row_number() over() row_number FROM (#{query.to_sql}) xxx" - end - - def aggregate_post_sql(opts) - min_or_max = @order == :latest ? "max" : "min" - - query = - if @order == :likes - # likes are a pain to aggregate so skip - posts_query(limit, private_messages: opts[:private_messages]) - .select('topics.id', "posts.post_number") - else - posts_query(limit, aggregate_search: true, private_messages: opts[:private_messages]) - .select('topics.id', "#{min_or_max}(posts.post_number) post_number") - .group('topics.id') - end - - min_id = Search.min_post_id - if min_id > 0 - low_set = query.dup.where("post_search_data.post_id < #{min_id}") - high_set = query.where("post_search_data.post_id >= #{min_id}") - - return { default: wrap_rows(high_set), remaining: wrap_rows(low_set) } - end - - # double wrapping so we get correct row numbers - { default: wrap_rows(query) } - end - - def aggregate_posts(post_sql) - return [] unless post_sql - - posts_eager_loads(Post) - .joins("JOIN (#{post_sql}) x ON x.id = posts.topic_id AND x.post_number = posts.post_number") - .order('row_number') - end - - def aggregate_search(opts = {}) - post_sql = aggregate_post_sql(opts) - - added = 0 - - aggregate_posts(post_sql[:default]).each do |p| - @results.add(p) - added += 1 - end - - if added < limit - aggregate_posts(post_sql[:remaining]).each { |p| @results.add(p) } - end - end - - def private_messages_search - raise Discourse::InvalidAccess.new("anonymous can not search PMs") unless @guardian.user - - aggregate_search(private_messages: true) - end - - def topic_search - if @search_context.is_a?(Topic) - posts = posts_eager_loads(posts_query(limit)) - .where('posts.topic_id = ?', @search_context.id) - - posts.each do |post| - @results.add(post) - end + elsif @order == :latest_topic + if opts[:aggregate_search] + posts = posts.order("MAX(topics.created_at) DESC") else - aggregate_search + posts = posts.order("topics.created_at DESC") end + elsif @order == :views + if opts[:aggregate_search] + posts = posts.order("MAX(topics.views) DESC") + else + posts = posts.order("topics.views DESC") + end + elsif @order == :likes + if opts[:aggregate_search] + posts = posts.order("MAX(posts.like_count) DESC") + else + posts = posts.order("posts.like_count DESC") + end + else + data_ranking = "TS_RANK_CD(post_search_data.search_data, #{ts_query})" + if opts[:aggregate_search] + posts = posts.order("MAX(#{data_ranking}) DESC") + else + posts = posts.order("#{data_ranking} DESC") + end + posts = posts.order("topics.bumped_at DESC") end - def posts_eager_loads(query) - query = query.includes(:user) - topic_eager_loads = [:category] + if secure_category_ids.present? + posts = posts.where("(categories.id IS NULL) OR (NOT categories.read_restricted) OR (categories.id IN (?))", secure_category_ids).references(:categories) + else + posts = posts.where("(categories.id IS NULL) OR (NOT categories.read_restricted)").references(:categories) + end - if SiteSetting.tagging_enabled - topic_eager_loads << :tags + posts = posts.offset(offset) + posts.limit(limit) + end + + def self.default_ts_config + "'#{Search.ts_config}'" + end + + def default_ts_config + self.class.default_ts_config + end + + def self.ts_query(term: , ts_config: nil, joiner: "&", weight_filter: nil) + + data = DB.query_single( + "SELECT TO_TSVECTOR(:config, :term)", + config: 'simple', + term: term + ).first + + ts_config = ActiveRecord::Base.connection.quote(ts_config) if ts_config + all_terms = data.scan(/'([^']+)'\:\d+/).flatten + all_terms.map! do |t| + t.split(/[\)\(&']/)[0] + end.compact! + + query = ActiveRecord::Base.connection.quote( + all_terms + .map { |t| "'#{PG::Connection.escape_string(t)}':*#{weight_filter}" } + .join(" #{joiner} ") + ) + + "TO_TSQUERY(#{ts_config || default_ts_config}, #{query})" + end + + def ts_query(ts_config = nil, weight_filter: nil) + @ts_query_cache ||= {} + @ts_query_cache["#{ts_config || default_ts_config} #{@term} #{weight_filter}"] ||= + Search.ts_query(term: @term, ts_config: ts_config, weight_filter: weight_filter) + end + + def wrap_rows(query) + "SELECT *, row_number() over() row_number FROM (#{query.to_sql}) xxx" + end + + def aggregate_post_sql(opts) + min_or_max = @order == :latest ? "max" : "min" + + query = + if @order == :likes + # likes are a pain to aggregate so skip + posts_query(limit, private_messages: opts[:private_messages]) + .select('topics.id', "posts.post_number") + else + posts_query(limit, aggregate_search: true, private_messages: opts[:private_messages]) + .select('topics.id', "#{min_or_max}(posts.post_number) post_number") + .group('topics.id') end - query.includes(topic: topic_eager_loads) + min_id = Search.min_post_id + if min_id > 0 + low_set = query.dup.where("post_search_data.post_id < #{min_id}") + high_set = query.where("post_search_data.post_id >= #{min_id}") + + return { default: wrap_rows(high_set), remaining: wrap_rows(low_set) } end + # double wrapping so we get correct row numbers + { default: wrap_rows(query) } + end + + def aggregate_posts(post_sql) + return [] unless post_sql + + posts_eager_loads(Post) + .joins("JOIN (#{post_sql}) x ON x.id = posts.topic_id AND x.post_number = posts.post_number") + .order('row_number') + end + + def aggregate_search(opts = {}) + post_sql = aggregate_post_sql(opts) + + added = 0 + + aggregate_posts(post_sql[:default]).each do |p| + @results.add(p) + added += 1 + end + + if added < limit + aggregate_posts(post_sql[:remaining]).each { |p| @results.add(p) } + end + end + + def private_messages_search + raise Discourse::InvalidAccess.new("anonymous can not search PMs") unless @guardian.user + + aggregate_search(private_messages: true) + end + + def topic_search + if @search_context.is_a?(Topic) + posts = posts_eager_loads(posts_query(limit)) + .where('posts.topic_id = ?', @search_context.id) + + posts.each do |post| + @results.add(post) + end + else + aggregate_search + end + end + + def posts_eager_loads(query) + query = query.includes(:user) + topic_eager_loads = [:category] + + if SiteSetting.tagging_enabled + topic_eager_loads << :tags + end + + query.includes(topic: topic_eager_loads) + end + end diff --git a/lib/sidekiq/pausable.rb b/lib/sidekiq/pausable.rb index 1d96f19e16..49ca1eb6f6 100644 --- a/lib/sidekiq/pausable.rb +++ b/lib/sidekiq/pausable.rb @@ -7,6 +7,7 @@ class SidekiqPauser def pause! redis.setex paused_key, 60, "paused" + @mutex.synchronize do @extend_lease_thread ||= extend_lease_thread sleep 0.001 while !paused? @@ -35,7 +36,7 @@ class SidekiqPauser while true do break unless @mutex.synchronize { @extend_lease_thread } redis.expire paused_key, 60 - sleep 30 + sleep(Rails.env.test? ? 0.01 : 30) end end end @@ -73,7 +74,7 @@ class Sidekiq::Pausable end def call(worker, msg, queue) - if Sidekiq.paused? + if Sidekiq.paused? && !(Jobs::RunHeartbeat === worker) worker.class.perform_in(@delay, *msg['args']) else start = Process.clock_gettime(Process::CLOCK_MONOTONIC) diff --git a/lib/single_sign_on.rb b/lib/single_sign_on.rb index 3e449b8462..6900b633b2 100644 --- a/lib/single_sign_on.rb +++ b/lib/single_sign_on.rb @@ -1,9 +1,40 @@ class SingleSignOn - ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :avatar_force_update, :require_activation, - :bio, :external_id, :return_sso_url, :admin, :moderator, :suppress_welcome_message, :title, - :add_groups, :remove_groups, :groups, :profile_background_url, :card_background_url] + + ACCESSORS = %i{ + add_groups + admin moderator + avatar_force_update + avatar_url + bio + card_background_url + email + external_id + groups + locale + locale_force_update + name + nonce + profile_background_url + remove_groups + require_activation + return_sso_url + suppress_welcome_message + title + username + website + } + FIXNUMS = [] - BOOLS = [:avatar_force_update, :admin, :moderator, :require_activation, :suppress_welcome_message] + + BOOLS = %i{ + admin + avatar_force_update + locale_force_update + moderator + require_activation + suppress_welcome_message + } + NONCE_EXPIRY_TIME = 10.minutes attr_accessor(*ACCESSORS) diff --git a/lib/site_setting_extension.rb b/lib/site_setting_extension.rb index 412ded8bfd..490cc26b6d 100644 --- a/lib/site_setting_extension.rb +++ b/lib/site_setting_extension.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require_dependency 'site_settings/deprecated_settings' require_dependency 'site_settings/type_supervisor' require_dependency 'site_settings/defaults_provider' @@ -5,12 +7,54 @@ require_dependency 'site_settings/db_provider' module SiteSettingExtension include SiteSettings::DeprecatedSettings - extend Forwardable - def_delegator :defaults, :site_locale, :default_locale - def_delegator :defaults, :site_locale=, :default_locale= - def_delegator :defaults, :has_setting? - def_delegators 'SiteSettings::TypeSupervisor', :types, :supported_types + # support default_locale being set via global settings + # this also adds support for testing the extension and global settings + # for site locale + def self.extended(klass) + if GlobalSetting.respond_to?(:default_locale) && GlobalSetting.default_locale.present? + klass.send :setup_shadowed_methods, :default_locale, GlobalSetting.default_locale + end + end + + # we need a default here to support defaults per locale + def default_locale=(val) + val = val.to_s + raise Discourse::InvalidParameters.new(:value) unless LocaleSiteSetting.valid_value?(val) + if val != self.default_locale + add_override!(:default_locale, val) + refresh! + Discourse.request_refresh! + end + end + + def default_locale? + true + end + + # set up some sort of default so we can look stuff up + def default_locale + # note optimised cause this is called a lot so avoiding .presence which + # adds 2 method calls + locale = current[:default_locale] + if locale && !locale.blank? + locale + else + SiteSettings::DefaultsProvider::DEFAULT_LOCALE + end + end + + def has_setting?(v) + defaults.has_setting?(v) + end + + def supported_types + SiteSettings::TypeSupervisor.supported_types + end + + def types + SiteSettings::TypeSupervisor.types + end def listen_for_changes=(val) @listen_for_changes = val @@ -55,27 +99,35 @@ module SiteSettingExtension end def refresh_settings - @refresh_settings ||= [] + @refresh_settings ||= [:default_locale] end def client_settings - @client_settings ||= [] + @client_settings ||= [:default_locale] end def previews @previews ||= {} end + def secret_settings + @secret_settings ||= [] + end + def setting(name_arg, default = nil, opts = {}) name = name_arg.to_sym + if name == :default_locale + raise Discourse::InvalidParameters.new("Other settings depend on default locale, you can not configure it like this") + end + shadowed_val = nil mutex.synchronize do defaults.load_setting( name, default, - opts.extract!(*SiteSettings::DefaultsProvider::CONSUMED_OPTS) + opts.delete(:locale_default) ) categories[name] = opts[:category] || :uncategorized @@ -106,6 +158,10 @@ module SiteSettingExtension previews[name] = opts[:preview] end + if opts[:secret] + secret_settings << name + end + type_supervisor.load_setting( name, opts.extract!(*SiteSettings::TypeSupervisor::CONSUMED_OPTS) @@ -121,7 +177,7 @@ module SiteSettingExtension def settings_hash result = {} - defaults.each_key do |s| + defaults.all.keys.each do |s| result[s] = send(s).to_s end result @@ -139,21 +195,36 @@ module SiteSettingExtension # Retrieve all settings def all_settings(include_hidden = false) - defaults + + locale_setting_hash = + { + setting: 'default_locale', + default: SiteSettings::DefaultsProvider::DEFAULT_LOCALE, + category: 'required', + description: description('default_locale'), + type: SiteSetting.types[SiteSetting.types[:enum]], + preview: nil, + value: self.default_locale, + valid_values: LocaleSiteSetting.values, + translate_names: LocaleSiteSetting.translate_names? + } + + defaults.all(default_locale) .reject { |s, _| !include_hidden && hidden_settings.include?(s) } .map do |s, v| value = send(s) opts = { setting: s, description: description(s), - default: defaults[s].to_s, + default: defaults.get(s, default_locale).to_s, value: value.to_s, category: categories[s], - preview: previews[s] + preview: previews[s], + secret: secret_settings.include?(s) }.merge(type_supervisor.type_hash(s)) opts - end.unshift(defaults.locale_setting_hash) + end.unshift(locale_setting_hash) end def description(setting) @@ -176,7 +247,7 @@ module SiteSettingExtension [s.name.to_sym, type_supervisor.to_rb_value(s.name, s.value, s.data_type)] }.to_a.flatten)] - defaults_view = defaults.all + defaults_view = defaults.all(new_hash[:default_locale]) # add locale default and defaults based on default_locale, cause they are cached new_hash = defaults_view.merge!(new_hash) @@ -233,7 +304,7 @@ module SiteSettingExtension def remove_override!(name) provider.destroy(name) - current[name] = defaults[name] + current[name] = defaults.get(name, default_locale) clear_cache! end @@ -276,7 +347,7 @@ module SiteSettingExtension self.send("#{name}=", value) Discourse.request_refresh! if requires_refresh?(name) else - raise ArgumentError.new("Either no setting named '#{name}' exists or value provided is invalid") + raise Discourse::InvalidParameters.new("Either no setting named '#{name}' exists or value provided is invalid") end end @@ -284,7 +355,7 @@ module SiteSettingExtension prev_value = send(name) set(name, value) if has_setting?(name) - value = prev_value = "[FILTERED]" if name.to_s =~ /_secret/ + value = prev_value = "[FILTERED]" if secret_settings.include?(name.to_sym) StaffActionLogger.new(user).log_site_setting_change(name, prev_value, value) end end @@ -355,13 +426,13 @@ module SiteSettingExtension host = begin URI.parse(url)&.host - rescue URI::InvalidURIError + rescue URI::Error nil end host ||= begin URI.parse("http://#{url}")&.host - rescue URI::InvalidURIError + rescue URI::Error nil end diff --git a/lib/site_settings/db_provider.rb b/lib/site_settings/db_provider.rb index 3ad32164e9..9300be2dba 100644 --- a/lib/site_settings/db_provider.rb +++ b/lib/site_settings/db_provider.rb @@ -14,15 +14,14 @@ class SiteSettings::DbProvider return [] unless table_exists? # Not leaking out AR records, cause I want all editing to happen via this API - SqlBuilder.new("SELECT name, data_type, value FROM #{@model.table_name}").map_exec(OpenStruct) + DB.query("SELECT name, data_type, value FROM #{@model.table_name}") end def find(name) return nil unless table_exists? # Not leaking out AR records, cause I want all editing to happen via this API - SqlBuilder.new("SELECT name, data_type, value FROM #{@model.table_name} WHERE name = :name") - .map_exec(OpenStruct, name: name) + DB.query("SELECT name, data_type, value FROM #{@model.table_name} WHERE name = ?", name) .first end @@ -57,12 +56,12 @@ class SiteSettings::DbProvider # table is not in the db yet, initial migration, etc def table_exists? @table_exists ||= {} - - unless @table_exists[current_site] - @table_exists[current_site] = ActiveRecord::Base.connection.table_exists?(@model.table_name) + begin + @table_exists[current_site] ||= ActiveRecord::Base.connection.table_exists?(@model.table_name) + rescue + STDERR.puts "No connection to db, unable to retrieve site settings! (normal when running db:create)" + @table_exists[current_site] = false end - - @table_exists[current_site] end end diff --git a/lib/site_settings/defaults_provider.rb b/lib/site_settings/defaults_provider.rb index 7b1467a653..6340ff91b9 100644 --- a/lib/site_settings/defaults_provider.rb +++ b/lib/site_settings/defaults_provider.rb @@ -1,31 +1,23 @@ +# frozen_string_literal: true + module SiteSettings; end # A cache for providing default value based on site locale class SiteSettings::DefaultsProvider - include Enumerable - - CONSUMED_OPTS = %i[default locale_default].freeze - DEFAULT_LOCALE_KEY = :default_locale - DEFAULT_LOCALE = 'en'.freeze - DEFAULT_CATEGORY = 'required'.freeze - - @@site_locales ||= DistributedCache.new('site_locales') + DEFAULT_LOCALE = 'en' def initialize(site_setting) @site_setting = site_setting - @site_setting.refresh_settings << DEFAULT_LOCALE_KEY @defaults = {} @defaults[DEFAULT_LOCALE.to_sym] = {} - - refresh_site_locale! end - def load_setting(name_arg, value, opts = {}) + def load_setting(name_arg, value, locale_defaults) name = name_arg.to_sym @defaults[DEFAULT_LOCALE.to_sym][name] = value - if (locale_default = opts[:locale_default]) - locale_default.each do |locale, v| + if (locale_defaults) + locale_defaults.each do |locale, v| locale = locale.to_sym @defaults[locale] ||= {} @defaults[locale][name] = v @@ -34,15 +26,19 @@ class SiteSettings::DefaultsProvider end def db_all - @site_setting.provider.all.delete_if { |s| s.name.to_sym == DEFAULT_LOCALE_KEY } + @site_setting.provider.all end - def all - @defaults[DEFAULT_LOCALE.to_sym].merge(@defaults[self.site_locale.to_sym] || {}) + def all(locale = nil) + if locale + @defaults[DEFAULT_LOCALE.to_sym].merge(@defaults[locale.to_sym] || {}) + else + @defaults[DEFAULT_LOCALE.to_sym].dup + end end - def get(name) - @defaults.dig(self.site_locale.to_sym, name.to_sym) || + def get(name, locale = DEFAULT_LOCALE) + @defaults.dig(locale.to_sym, name.to_sym) || @defaults.dig(DEFAULT_LOCALE.to_sym, name.to_sym) end alias [] get @@ -50,81 +46,25 @@ class SiteSettings::DefaultsProvider # Used to override site settings in dev/test env def set_regardless_of_locale(name, value) name = name.to_sym - if @site_setting.has_setting?(name) + if name == :default_locale || @site_setting.has_setting?(name) @defaults.each { |_, hash| hash.delete(name) } @defaults[DEFAULT_LOCALE.to_sym][name] = value value, type = @site_setting.type_supervisor.to_db_value(name, value) - @defaults[self.site_locale.to_sym] ||= {} - @defaults[self.site_locale.to_sym][name] = @site_setting.type_supervisor.to_rb_value(name, value, type) + @defaults[SiteSetting.default_locale.to_sym] ||= {} + @defaults[SiteSetting.default_locale.to_sym][name] = @site_setting.type_supervisor.to_rb_value(name, value, type) else raise ArgumentError.new("No setting named '#{name}' exists") end end - def site_locale - @@site_locales[current_db] - end - - def site_locale=(val) - val = val.to_s - raise Discourse::InvalidParameters.new(:value) unless LocaleSiteSetting.valid_value?(val) - - if val != @@site_locales[current_db] - @site_setting.provider.save(DEFAULT_LOCALE_KEY, val, SiteSetting.types[:string]) - refresh_site_locale! - @site_setting.refresh! - Discourse.request_refresh! - end - - @@site_locales[current_db] - end - - def each(&block) - self.all.each do |key, value| - block.call(key.to_sym, value) - end - end - - def locale_setting_hash - { - setting: DEFAULT_LOCALE_KEY, - default: DEFAULT_LOCALE, - category: DEFAULT_CATEGORY, - description: @site_setting.description(DEFAULT_LOCALE_KEY), - type: SiteSetting.types[SiteSetting.types[:enum]], - preview: nil, - value: @@site_locales[current_db], - valid_values: LocaleSiteSetting.values, - translate_names: LocaleSiteSetting.translate_names? - } - end - - def refresh_site_locale! - RailsMultisite::ConnectionManagement.each_connection do |db| - @@site_locales[db] = - if GlobalSetting.respond_to?(DEFAULT_LOCALE_KEY) && - (global_val = GlobalSetting.send(DEFAULT_LOCALE_KEY)) && - !global_val.blank? - global_val - elsif (db_val = @site_setting.provider.find(DEFAULT_LOCALE_KEY)) - db_val.value.to_s - else - DEFAULT_LOCALE - end - - @@site_locales[db] - end - end - def has_setting?(name) - has_key?(name.to_sym) || has_key?("#{name.to_s}?".to_sym) + has_key?(name.to_sym) || has_key?("#{name.to_s}?".to_sym) || name.to_sym == :default_locale end private def has_key?(name) - @defaults[self.site_locale.to_sym]&.key?(name) || - @defaults[DEFAULT_LOCALE.to_sym].key?(name) || name == DEFAULT_LOCALE_KEY + @defaults[DEFAULT_LOCALE.to_sym].key?(name) end def current_db diff --git a/lib/site_settings/type_supervisor.rb b/lib/site_settings/type_supervisor.rb index 3e7c0ec3f1..32fd773375 100644 --- a/lib/site_settings/type_supervisor.rb +++ b/lib/site_settings/type_supervisor.rb @@ -6,7 +6,7 @@ module SiteSettings; end class SiteSettings::TypeSupervisor include SiteSettings::Validations - CONSUMED_OPTS = %i[enum choices type validator min max regex hidden regex_error allow_any].freeze + CONSUMED_OPTS = %i[enum choices type validator min max regex hidden regex_error allow_any list_type].freeze VALIDATOR_OPTS = %i[min max regex hidden regex_error].freeze # For plugins, so they can tell if a feature is supported @@ -29,7 +29,8 @@ class SiteSettings::TypeSupervisor regex: 13, email: 14, username: 15, - category: 16 + category: 16, + uploaded_image_list: 17, ) end @@ -62,6 +63,7 @@ class SiteSettings::TypeSupervisor @validators = {} @types = {} @allow_any = {} + @list_type = {} end def load_setting(name_arg, opts = {}) @@ -87,6 +89,7 @@ class SiteSettings::TypeSupervisor if type.to_sym == :list @allow_any[name] = opts[:allow_any] == false ? false : true + @list_type[name] = opts[:list_type] if opts[:list_type] end end @types[name] = get_data_type(name, @defaults_provider[name]) @@ -99,7 +102,8 @@ class SiteSettings::TypeSupervisor def to_rb_value(name, value, override_type = nil) name = name.to_sym - type = @types[name] = (override_type || @types[name] || get_data_type(name, value)) + @types[name] = (@types[name] || get_data_type(name, value)) + type = (override_type || @types[name]) case type when self.class.types[:float] @@ -142,6 +146,7 @@ class SiteSettings::TypeSupervisor end result[:choices] = @choices[name] if @choices.has_key? name + result[:list_type] = @list_type[name] if @list_type.has_key? name result end @@ -169,7 +174,11 @@ class SiteSettings::TypeSupervisor if enum_class(name) raise Discourse::InvalidParameters.new(:value) unless enum_class(name).valid_value?(val) else - raise Discourse::InvalidParameters.new(:value) unless @choices[name].include?(val) + unless (choice = @choices[name]) + raise Discourse::InvalidParameters.new(name) + end + + raise Discourse::InvalidParameters.new(:value) unless choice.include?(val) end end diff --git a/lib/sql_builder.rb b/lib/sql_builder.rb index 3498cbe617..f21ae4b1f8 100644 --- a/lib/sql_builder.rb +++ b/lib/sql_builder.rb @@ -1,6 +1,9 @@ class SqlBuilder def initialize(template, klass = nil) + + Discourse.deprecate("SqlBuilder is deprecated and will be removed, please use DB.build instead!") + @args = {} @sql = template @sections = {} @@ -75,12 +78,8 @@ class SqlBuilder class RailsDateTimeDecoder < PG::SimpleDecoder def decode(string, tuple = nil, field = nil) - if Rails.version >= "4.2.0" - @caster ||= ActiveRecord::Type::DateTime.new - @caster.cast(string) - else - ActiveRecord::ConnectionAdapters::Column.string_to_time string - end + @caster ||= ActiveRecord::Type::DateTime.new + @caster.cast(string) end end @@ -118,9 +117,3 @@ class SqlBuilder end end - -class ActiveRecord::Base - def self.sql_builder(template) - SqlBuilder.new(template, self) - end -end diff --git a/lib/stylesheet/manager.rb b/lib/stylesheet/manager.rb index 2d5f3614d1..7beded7f1b 100644 --- a/lib/stylesheet/manager.rb +++ b/lib/stylesheet/manager.rb @@ -8,6 +8,7 @@ class Stylesheet::Manager CACHE_PATH ||= 'tmp/stylesheet-cache' MANIFEST_DIR ||= "#{Rails.root}/tmp/cache/assets/#{Rails.env}" MANIFEST_FULL_PATH ||= "#{MANIFEST_DIR}/stylesheet-manifest" + THEME_REGEX ||= /_theme$/ @lock = Mutex.new @@ -19,51 +20,79 @@ class Stylesheet::Manager cache.hash.keys.select { |k| k =~ /theme/ }.each { |k|cache.delete(k) } end - def self.stylesheet_href(target = :desktop, theme_key = :missing) - href = stylesheet_link_tag(target, 'all', theme_key) - if href - href.split(/["']/)[1] - end + def self.stylesheet_data(target = :desktop, theme_ids = :missing) + stylesheet_details(target, "all", theme_ids) end - def self.stylesheet_link_tag(target = :desktop, media = 'all', theme_key = :missing) + def self.stylesheet_link_tag(target = :desktop, media = 'all', theme_ids = :missing) + stylesheets = stylesheet_details(target, media, theme_ids) + stylesheets.map do |stylesheet| + href = stylesheet[:new_href] + theme_id = stylesheet[:theme_id] + data_theme_id = theme_id ? "data-theme-id=\"#{theme_id}\"" : "" + %[] + end.join("\n").html_safe + end + + def self.stylesheet_details(target = :desktop, media = 'all', theme_ids = :missing) + if theme_ids == :missing + theme_ids = [SiteSetting.default_theme_id] + end target = target.to_sym - if theme_key == :missing - theme_key = SiteSetting.default_theme_key - end + theme_ids = [theme_ids] unless Array === theme_ids + theme_ids = [theme_ids.first] unless target =~ THEME_REGEX + theme_ids = Theme.transform_ids(theme_ids, extend: false) current_hostname = Discourse.current_hostname - cache_key = "#{target}_#{theme_key}_#{current_hostname}" - tag = cache[cache_key] - return tag.dup.html_safe if tag + array_cache_key = "array_themes_#{theme_ids.join(",")}_#{target}_#{current_hostname}" + stylesheets = cache[array_cache_key] + return stylesheets if stylesheets.present? @lock.synchronize do - builder = self.new(target, theme_key) - if builder.is_theme? && !builder.theme - tag = "" - else - builder.compile unless File.exists?(builder.stylesheet_fullpath) - tag = %[] - end + stylesheets = [] + theme_ids.each do |theme_id| + data = { target: target } + cache_key = "path_#{target}_#{theme_id}_#{current_hostname}" + href = cache[cache_key] - cache[cache_key] = tag - tag.dup.html_safe + unless href + builder = self.new(target, theme_id) + is_theme = builder.is_theme? + has_theme = builder.theme.present? + + if is_theme && !has_theme + next + else + data[:theme_id] = builder.theme.id if has_theme && is_theme + builder.compile unless File.exists?(builder.stylesheet_fullpath) + href = builder.stylesheet_path(current_hostname) + end + cache[cache_key] = href + end + + data[:theme_id] = theme_id if theme_id.present? && data[:theme_id].blank? + data[:new_href] = href + stylesheets << data + end + cache[array_cache_key] = stylesheets.freeze + stylesheets end end def self.precompile_css - themes = Theme.where('user_selectable OR key = ?', SiteSetting.default_theme_key).pluck(:key, :name) + themes = Theme.where('user_selectable OR id = ?', SiteSetting.default_theme_id).pluck(:id, :name) themes << nil - themes.each do |key, name| - [:desktop, :mobile, :desktop_rtl, :mobile_rtl].each do |target| - theme_key = key || SiteSetting.default_theme_key - cache_key = "#{target}_#{theme_key}" + themes.each do |id, name| + [:desktop, :mobile, :desktop_rtl, :mobile_rtl, :desktop_theme, :mobile_theme, :admin].each do |target| + theme_id = id || SiteSetting.default_theme_id + next if target =~ THEME_REGEX && theme_id == -1 + cache_key = "#{target}_#{theme_id}" STDERR.puts "precompile target: #{target} #{name}" - builder = self.new(target, theme_key) + builder = self.new(target, theme_id) builder.compile(force: true) cache[cache_key] = nil end @@ -100,9 +129,13 @@ class Stylesheet::Manager end.compact.max.to_i end - def initialize(target = :desktop, theme_key) + def self.cache_fullpath + "#{Rails.root}/#{CACHE_PATH}" + end + + def initialize(target = :desktop, theme_id) @target = target - @theme_key = theme_key + @theme_id = theme_id end def compile(opts = {}) @@ -133,7 +166,10 @@ class Stylesheet::Manager source_map_file: source_map_filename ) rescue SassC::SyntaxError => e - Rails.logger.error "Failed to compile #{@target} stylesheet: #{e.message}" + + # we do not need this reported as we will report it in the UI anyway + Rails.logger.info "Failed to compile #{@target} stylesheet: #{e.message}" + if %w{embedded_theme mobile_theme desktop_theme}.include?(@target.to_s) # no special errors for theme, handled in theme editor ["", nil] @@ -162,10 +198,6 @@ class Stylesheet::Manager css end - def self.cache_fullpath - "#{Rails.root}/#{CACHE_PATH}" - end - def cache_fullpath self.class.cache_fullpath end @@ -225,7 +257,7 @@ class Stylesheet::Manager end def is_theme? - !!(@target.to_s =~ /_theme$/) + !!(@target.to_s =~ THEME_REGEX) end # digest encodes the things that trigger a recompile @@ -240,7 +272,7 @@ class Stylesheet::Manager end def theme - @theme ||= (Theme.find_by(key: @theme_key) || :nil) + @theme ||= Theme.find_by(id: @theme_id) || :nil @theme == :nil ? nil : @theme end @@ -256,7 +288,7 @@ class Stylesheet::Manager raise "attempting to look up theme digest for invalid field" end - Digest::SHA1.hexdigest(scss.to_s + color_scheme_digest.to_s + settings_digest + plugins_digest) + Digest::SHA1.hexdigest(scss.to_s + color_scheme_digest.to_s + settings_digest + plugins_digest + uploads_digest) end # this protects us from situations where new versions of a plugin removed a file @@ -271,7 +303,23 @@ class Stylesheet::Manager end def settings_digest - Digest::SHA1.hexdigest((theme&.included_settings || {}).to_json) + theme_ids = Theme.components_for(@theme_id).dup + theme_ids << @theme_id + + fields = ThemeField.where( + name: "yaml", + type_id: ThemeField.types[:yaml], + theme_id: theme_ids + ).pluck(:updated_at) + + settings = ThemeSetting.where(theme_id: theme_ids).pluck(:updated_at) + timestamps = fields.concat(settings).map!(&:to_f).sort!.join(",") + + Digest::SHA1.hexdigest(timestamps) + end + + def uploads_digest + Digest::SHA1.hexdigest(ThemeField.joins(:upload).where(id: theme&.all_theme_variables).pluck(:sha1).join(",")) end def color_scheme_digest diff --git a/lib/stylesheet/watcher.rb b/lib/stylesheet/watcher.rb index a1150e734f..e2425c4fd7 100644 --- a/lib/stylesheet/watcher.rb +++ b/lib/stylesheet/watcher.rb @@ -3,12 +3,15 @@ require 'listen' module Stylesheet class Watcher - def self.theme_key=(v) - @theme_key = v + def self.theme_id=(v) + @theme_id = v end - def self.theme_key - @theme_key || SiteSetting.default_theme_key + def self.theme_id + if @theme_id.blank? && SiteSetting.default_theme_id != -1 + @theme_id = SiteSetting.default_theme_id + end + @theme_id end def self.watch(paths = nil) @@ -76,12 +79,8 @@ module Stylesheet Stylesheet::Manager.cache.clear message = ["desktop", "mobile", "admin"].map do |name| - { - target: name, - new_href: Stylesheet::Manager.stylesheet_href(name.to_sym), - theme_key: Stylesheet::Watcher.theme_key - } - end + Stylesheet::Manager.stylesheet_data(name.to_sym, Stylesheet::Watcher.theme_id) + end.flatten MessageBus.publish '/file-change', message end diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake index abb83aff2b..4acfff1116 100644 --- a/lib/tasks/assets.rake +++ b/lib/tasks/assets.rake @@ -94,7 +94,6 @@ def compress_ruby(from, to) data = File.read("#{assets_path}/#{from}") uglified, map = Uglifier.new(comments: :none, - screw_ie8: true, source_map: { filename: File.basename(from), output_filename: File.basename(to) @@ -111,7 +110,7 @@ end def gzip(path) STDERR.puts "gzip -f -c -9 #{path} > #{path}.gz" - STDERR.puts `gzip -f -c -9 #{path} > #{path}.gz` + STDERR.puts `gzip -f -c -9 #{path} > #{path}.gz`.strip raise "gzip compression failed: exit code #{$?.exitstatus}" if $?.exitstatus != 0 end @@ -138,7 +137,7 @@ def brotli(path) STDERR.puts brotli_command(path) STDERR.puts `#{brotli_command(path)}` raise "brotli compression failed: exit code #{$?.exitstatus}" if $?.exitstatus != 0 - STDERR.puts `chmod +r #{path}.br` + STDERR.puts `chmod +r #{path}.br`.strip raise "chmod failed: exit code #{$?.exitstatus}" if $?.exitstatus != 0 end end @@ -180,9 +179,10 @@ task 'assets:precompile' => 'assets:precompile:before' do if File.exists?(_path) STDERR.puts "Skipping: #{file} already compressed" else - STDERR.puts "Compressing: #{file}" - proc.call do + start = Time.now + STDERR.puts "#{start} Compressing: #{file}" + # We can specify some files to never minify unless (ENV["DONT_MINIFY"] == "1") || to_skip.include?(info['logical_path']) FileUtils.mv(path, _path) @@ -193,6 +193,9 @@ task 'assets:precompile' => 'assets:precompile:before' do info["mtime"] = File.mtime(path).iso8601 gzip(path) brotli(path) + + STDERR.puts "Done compressing #{file} : #{(Time.now - start).round(2)} secs" + STDERR.puts end end end diff --git a/lib/tasks/categories.rake b/lib/tasks/categories.rake index 407bf65f74..87e5fc878a 100644 --- a/lib/tasks/categories.rake +++ b/lib/tasks/categories.rake @@ -21,3 +21,16 @@ task "categories:move_topics", [:from_category, :to_category] => [:environment] puts "", "Done!", "" end + +task "categories:create_definition" => :environment do + puts "Creating category definitions" + puts + + Category.where(topic_id: nil).each(&:create_category_definition) + + puts "", "Done!", "" +end + +def print_status(current, max) + print "\r%9d / %d (%5.1f%%)" % [current, max, ((current.to_f / max.to_f) * 100).round(1)] +end diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index e7782f1a85..1d1c5fa0ed 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -96,7 +96,7 @@ task 'db:stats' => 'environment' do SQL puts - print_table(Post.exec_sql(sql).to_a) + print_table(DB.query_hash(sql)) end desc 'Rebuild indexes' @@ -108,16 +108,14 @@ task 'db:rebuild_indexes' => 'environment' do Discourse.enable_readonly_mode backup_schema = Jobs::Importer::BACKUP_SCHEMA - table_names = User.exec_sql("select table_name from information_schema.tables where table_schema = 'public'").map do |row| - row['table_name'] - end + table_names = DB.query_single("select table_name from information_schema.tables where table_schema = 'public'") begin # Move all tables to the backup schema: - User.exec_sql("DROP SCHEMA IF EXISTS #{backup_schema} CASCADE") - User.exec_sql("CREATE SCHEMA #{backup_schema}") + DB.exec("DROP SCHEMA IF EXISTS #{backup_schema} CASCADE") + DB.exec("CREATE SCHEMA #{backup_schema}") table_names.each do |table_name| - User.exec_sql("ALTER TABLE public.#{table_name} SET SCHEMA #{backup_schema}") + DB.exec("ALTER TABLE public.#{table_name} SET SCHEMA #{backup_schema}") end # Create a new empty db @@ -126,25 +124,25 @@ task 'db:rebuild_indexes' => 'environment' do # Fetch index definitions from the new db index_definitions = {} table_names.each do |table_name| - index_definitions[table_name] = User.exec_sql("SELECT indexdef FROM pg_indexes WHERE tablename = '#{table_name}' and schemaname = 'public';").map { |x| x['indexdef'] } + index_definitions[table_name] = DB.query_single("SELECT indexdef FROM pg_indexes WHERE tablename = '#{table_name}' and schemaname = 'public';") end # Drop the new tables table_names.each do |table_name| - User.exec_sql("DROP TABLE public.#{table_name}") + DB.exec("DROP TABLE public.#{table_name}") end # Move the old tables back to the public schema table_names.each do |table_name| - User.exec_sql("ALTER TABLE #{backup_schema}.#{table_name} SET SCHEMA public") + DB.exec("ALTER TABLE #{backup_schema}.#{table_name} SET SCHEMA public") end # Drop their indexes - index_names = User.exec_sql("SELECT indexname FROM pg_indexes WHERE schemaname = 'public' AND tablename IN ('#{table_names.join("', '")}')").map { |x| x['indexname'] } + index_names = DB.query_single("SELECT indexname FROM pg_indexes WHERE schemaname = 'public' AND tablename IN ('#{table_names.join("', '")}')") index_names.each do |index_name| begin puts index_name - User.exec_sql("DROP INDEX public.#{index_name}") + DB.exec("DROP INDEX public.#{index_name}") rescue ActiveRecord::StatementInvalid # It's this: # PG::Error: ERROR: cannot drop index category_users_pkey because constraint category_users_pkey on table category_users requires it @@ -156,7 +154,7 @@ task 'db:rebuild_indexes' => 'environment' do table_names.each do |table_name| index_definitions[table_name].each do |index_def| begin - User.exec_sql(index_def) + DB.exec(index_def) rescue ActiveRecord::StatementInvalid # Trying to recreate a primary key end diff --git a/lib/tasks/destroy.rake b/lib/tasks/destroy.rake index c079674048..ffcf829df4 100644 --- a/lib/tasks/destroy.rake +++ b/lib/tasks/destroy.rake @@ -2,10 +2,12 @@ # content and users from your site, but keeping your site settings, # theme, and category structure. desc "Remove all topics in a category" -task "destroy:topics", [:category] => :environment do |t, args| +task "destroy:topics", [:category, :parent_category] => :environment do |t, args| category = args[:category] - puts "Going to delete all topics in the #{category} category" - puts log = DestroyTask.destroy_topics(category) + parent_category = args[:parent_category] + descriptive_slug = parent_category ? "#{parent_category}/#{category}" : category + puts "Going to delete all topics in the #{descriptive_slug} category" + puts log = DestroyTask.destroy_topics(category, parent_category) end desc "Remove all topics in all categories" diff --git a/lib/tasks/docker.rake b/lib/tasks/docker.rake index f66450a050..6a7088dfd3 100644 --- a/lib/tasks/docker.rake +++ b/lib/tasks/docker.rake @@ -39,14 +39,30 @@ task 'docker:test' do begin @good = true unless ENV['SKIP_LINT'] - puts "Running linters" + puts "Running linters/prettyfiers" + puts "eslint #{`yarn eslint -v`}" + puts "prettier #{`yarn prettier -v`}" + if ENV["SINGLE_PLUGIN"] @good &&= run_or_fail("bundle exec rubocop --parallel plugins/#{ENV["SINGLE_PLUGIN"]}") - @good &&= run_or_fail("eslint --ext .es6 plugins/#{ENV['SINGLE_PLUGIN']}") + @good &&= run_or_fail("yarn eslint --ext .es6 plugins/#{ENV['SINGLE_PLUGIN']}") + + puts "Listing prettier offenses in #{ENV['SINGLE_PLUGIN']}:" + @good &&= run_or_fail("yarn prettier --list-different 'plugins/#{ENV['SINGLE_PLUGIN']}/**/*.scss' 'plugins/#{ENV['SINGLE_PLUGIN']}/**/*.es6'") else @good &&= run_or_fail("bundle exec rubocop --parallel") unless ENV["SKIP_CORE"] - @good &&= run_or_fail("eslint app/assets/javascripts test/javascripts") unless ENV["SKIP_CORE"] - @good &&= run_or_fail("eslint --ext .es6 app/assets/javascripts test/javascripts plugins") unless ENV["SKIP_PLUGINS"] + @good &&= run_or_fail("yarn eslint app/assets/javascripts test/javascripts") unless ENV["SKIP_CORE"] + @good &&= run_or_fail("yarn eslint --ext .es6 app/assets/javascripts test/javascripts plugins") unless ENV["SKIP_PLUGINS"] + + unless ENV["SKIP_CORE"] + puts "Listing prettier offenses in core:" + @good &&= run_or_fail('yarn prettier --list-different "app/assets/stylesheets/**/*.scss" "app/assets/javascripts/**/*.es6" "test/javascripts/**/*.es6"') + end + + unless ENV["SKIP_PLUGINS"] + puts "Listing prettier offenses in plugins:" + @good &&= run_or_fail('yarn prettier --list-different "plugins/**/*.scss" "plugins/**/*.es6"') + end end end @@ -70,13 +86,14 @@ task 'docker:test' do ENV["RAILS_ENV"] = "test" - @good &&= run_or_fail("bundle exec rake db:create db:migrate") + @good &&= run_or_fail("bundle exec rake db:create") if ENV["INSTALL_OFFICIAL_PLUGINS"] @good &&= run_or_fail("bundle exec rake plugin:install_all_official") - @good &&= run_or_fail("bundle exec rails r 'puts \"installing all gems\"'") end + @good &&= run_or_fail("bundle exec rake db:migrate") + unless ENV["JS_ONLY"] unless ENV["SKIP_CORE"] diff --git a/lib/tasks/emails.rake b/lib/tasks/emails.rake index c4258bd9d3..82bb6b6c83 100644 --- a/lib/tasks/emails.rake +++ b/lib/tasks/emails.rake @@ -55,9 +55,120 @@ task "emails:import" => :environment do end end -desc 'Send email test message' +desc "Check if SMTP connection is successful and send test message" task 'emails:test', [:email] => [:environment] do |_, args| email = args[:email] + message = "OK" + begin + smtp = Discourse::Application.config.action_mailer.smtp_settings - Email::Sender.new(TestMailer.send_test(email), :test_message).send + if smtp[:address].match(/smtp\.gmail\.com/) + puts <<~STR + #{smtp} + ============================== WARNING ============================== + + Sending mail with Gmail is a violation of their terms of service. + + Sending with G Suite might work, but it is not recommended. For information see: + https://meta.discourse.org/t/dscourse-aws-ec2-g-suite-troubleshoting/62931?u=pfaffman + + ========================= CONTINUING TEST ============================ + STR + end + + puts "Testing sending to #{email} using #{smtp[:user_name]}:#{smtp[:password]}@#{smtp[:address]}:#{smtp[:port]}." + + Net::SMTP.start(smtp[:address], smtp[:port]) + .auth_login(smtp[:user_name], smtp[:password]) + rescue Exception => e + + if e.to_s.match(/execution expired/) + message = <<~STR + ======================================== ERROR ======================================== + Connection to port #{ENV["DISCOURSE_SMTP_PORT"]} failed. + ====================================== SOLUTION ======================================= + The most likely problem is that your server has outgoing SMTP traffic blocked. + If you are using a service like Mailgun or Sendgrid, try using port 2525. + ======================================================================================= + STR + elsif e.to_s.match(/535/) + message = <<~STR + ======================================== ERROR ======================================== + AUTHENTICATION FAILED + + #{e} + + ====================================== SOLUTION ======================================= + The most likely problem is that your SMTP username and/or Password is incorrect. + Check them and try again. + ======================================================================================= + STR + j + elsif e.to_s.match(/Connection refused/) + message = <<~STR + ======================================== ERROR ======================================== + CONNECTION REFUSED + + #{e} + + ====================================== SOLUTION ======================================= + The most likely problem is that you have chosen the wrong port or a network problem is + blocking access from the Docker container. + + Check the port and your networking configuration. + ======================================================================================= + STR + + elsif e.to_s.match(/service not known/) + message = <<~STR + ======================================== ERROR ======================================== + SMTP SERVER NOT FOUND + + #{e} + + ====================================== SOLUTION ======================================= + The most likely problem is that the host name of your SMTP server is incorrect. + Check it and try again. + ======================================================================================= + STR + + else + + message = <<~STR + ======================================== ERROR ======================================== + UNEXPECTED ERROR + + #{e} + + ====================================== SOLUTION ======================================= + This is not a common error. No recommended solution exists! + + Please report the exact error message above. (And a solution, if you find one!) + ======================================================================================= + STR + end + end + if message == "OK" + puts "SMTP server connection successful." + else + puts message + exit + end + begin + puts "Sending to #{email}. . . " + Email::Sender.new(TestMailer.send_test(email), :test_message).send + rescue + puts "Sending mail failed." + else + puts <<~STR + Mail accepted by SMTP server. + + If you do not receive the message, check your SPAM folder + or test again using a service like http://www.mail-tester.com/. + + If the message is not delivered it is not a problem with Discourse. + + Check the SMTP server logs to see why it failed to deliver the message. + STR + end end diff --git a/lib/tasks/emoji.rake b/lib/tasks/emoji.rake index 2ebfb4964a..ac7697fb51 100644 --- a/lib/tasks/emoji.rake +++ b/lib/tasks/emoji.rake @@ -350,24 +350,167 @@ DEFAULT_SET ||= "twitter" # Replace the platform by another when downloading the image (accepts names or categories) EMOJI_IMAGES_PATCH ||= { "windows" => { - "hash" => "apple", - "zero" => "apple", - "one" => "apple", - "two" => "apple", - "three" => "apple", - "four" => "apple", - "five" => "apple", - "six" => "apple", - "seven" => "apple", - "eight" => "apple", - "nine" => "apple", - "asterisk" => "apple" + "infinity" => "twitter", + "pirate_flag" => "twitter" }, "apple" => { - "snowboarder" => "twitter" + "snowboarder" => "twitter", + "smiling_face_with_three_Hearts" => "twitter", + "hot_face" => "twitter", + "cold_face" => "twitter", + "partying_face" => "twitter", + "woozy_face" => "twitter", + "pleading_face" => "twitter", + "man_red_haired" => "twitter", + "man_curly_haired" => "twitter", + "man_white_haired" => "twitter", + "man_bald" => "twitter", + "woman_red_haired" => "twitter", + "woman_curly_haired" => "twitter", + "woman_white_haired" => "twitter", + "woman_bald" => "twitter", + "superhero" => "twitter", + "man_superhero" => "twitter", + "woman_superhero" => "twitter", + "supervillain" => "twitter", + "woman_supervillain" => "twitter", + "man_supervillain" => "twitter", + "leg" => "twitter", + "foot" => "twitter", + "bone" => "twitter", + "tooth" => "twitter", + "goggles" => "twitter", + "lab_coat" => "twitter", + "hiking_boot" => "twitter", + "flat_shoe" => "twitter", + "raccoon" => "twitter", + "llama" => "twitter", + "hippopotamus" => "twitter", + "kangaroo" => "twitter", + "badger" => "twitter", + "swan" => "twitter", + "peacock" => "twitter", + "parrot" => "twitter", + "lobster" => "twitter", + "mosquito" => "twitter", + "microbe" => "twitter", + "mango" => "twitter", + "leafy_green" => "twitter", + "bagel" => "twitter", + "salt" => "twitter", + "moon_cake" => "twitter", + "cupcake" => "twitter", + "compass" => "twitter", + "brick" => "twitter", + "skateboard" => "twitter", + "luggage" => "twitter", + "firecracker" => "twitter", + "red_gift_envelope" => "twitter", + "flying_disc" => "twitter", + "lacrosse" => "twitter", + "nazar_amulet" => "twitter", + "jigsaw" => "twitter", + "teddy_bear" => "twitter", + "chess_pawn" => "twitter", + "thread" => "twitter", + "yarn" => "twitter", + "abacus" => "twitter", + "receipt" => "twitter", + "toolbox" => "twitter", + "magnet" => "twitter", + "test_tube" => "twitter", + "petri_dish" => "twitter", + "dna" => "twitter", + "lotion_bottle" => "twitter", + "safety_pin" => "twitter", + "broom" => "twitter", + "basket" => "twitter", + "roll_of_toilet_paper" => "twitter", + "soap" => "twitter", + "sponge" => "twitter", + "fire_extinguisher" => "twitter", + "infinity" => "twitter", + "pirate_flag" => "twitter" }, "emoji_one" => { "country-flag" => "twitter" + }, + "facebook" => { + "smiling_face_with_three_Hearts" => "twitter", + "hot_face" => "twitter", + "cold_face" => "twitter", + "partying_face" => "twitter", + "woozy_face" => "twitter", + "pleading_face" => "twitter", + "man_red_haired" => "twitter", + "man_curly_haired" => "twitter", + "man_white_haired" => "twitter", + "man_bald" => "twitter", + "woman_red_haired" => "twitter", + "woman_curly_haired" => "twitter", + "woman_white_haired" => "twitter", + "woman_bald" => "twitter", + "man_superhero" => "twitter", + "woman_superhero" => "twitter", + "woman_supervillain" => "twitter", + "man_supervillain" => "twitter", + "leg" => "twitter", + "foot" => "twitter", + "bone" => "twitter", + "tooth" => "twitter", + "goggles" => "twitter", + "lab_coat" => "twitter", + "hiking_boot" => "twitter", + "flat_shoe" => "twitter", + "raccoon" => "twitter", + "llama" => "twitter", + "hippopotamus" => "twitter", + "kangaroo" => "twitter", + "badger" => "twitter", + "swan" => "twitter", + "peacock" => "twitter", + "parrot" => "twitter", + "lobster" => "twitter", + "mosquito" => "twitter", + "microbe" => "twitter", + "mango" => "twitter", + "leafy_green" => "twitter", + "bagel" => "twitter", + "salt" => "twitter", + "moon_cake" => "twitter", + "cupcake" => "twitter", + "compass" => "twitter", + "brick" => "twitter", + "skateboard" => "twitter", + "luggage" => "twitter", + "firecracker" => "twitter", + "red_gift_envelope" => "twitter", + "softball" => "twitter", + "flying_disc" => "twitter", + "lacrosse" => "twitter", + "nazar_amulet" => "twitter", + "jigsaw" => "twitter", + "teddy_bear" => "twitter", + "chess_pawn" => "twitter", + "thread" => "twitter", + "yarn" => "twitter", + "abacus" => "twitter", + "receipt" => "twitter", + "toolbox" => "twitter", + "magnet" => "twitter", + "test_tube" => "twitter", + "petri_dish" => "twitter", + "dna" => "twitter", + "lotion_bottle" => "twitter", + "safety_pin" => "twitter", + "broom" => "twitter", + "basket" => "twitter", + "roll_of_toilet_paper" => "twitter", + "soap" => "twitter", + "sponge" => "twitter", + "fire_extinguisher" => "twitter", + "infinity" => "twitter", + "pirate_flag" => "twitter" } } diff --git a/lib/tasks/i18n.rake b/lib/tasks/i18n.rake new file mode 100644 index 0000000000..ddd7e25891 --- /dev/null +++ b/lib/tasks/i18n.rake @@ -0,0 +1,57 @@ +require 'i18n/locale_file_checker' +require 'colored2' + +desc "Checks locale files for errors" +task "i18n:check", [:locale] => [:environment] do |_, args| + failed_locales = [] + + if args[:locale].present? + if LocaleSiteSetting.valid_value?(args[:locale]) + locales = [args[:locale]] + else + puts "ERROR: #{locale} is not a valid locale" + exit 1 + end + else + locales = LocaleSiteSetting.supported_locales + end + + locales.each do |locale| + begin + all_errors = LocaleFileChecker.new.check(locale) + rescue + failed_locales << locale + next + end + + all_errors.each do |filename, errors| + puts "", "=" * 80 + puts filename.bold + puts "=" * 80 + + errors.each do |error| + message = + case error[:type] + when LocaleFileChecker::TYPE_MISSING_INTERPOLATION_KEYS + "Missing interpolation keys".red + when LocaleFileChecker::TYPE_UNSUPPORTED_INTERPOLATION_KEYS + "Unsupported interpolation keys".red + when LocaleFileChecker::TYPE_MISSING_PLURAL_KEYS + "Missing plural keys".magenta + when LocaleFileChecker::TYPE_INVALID_MESSAGE_FORMAT + "Invalid message format".yellow + end + details = error[:details] ? ": #{error[:details]}" : "" + + puts error[:key] << " -- " << message << details + end + end + end + + failed_locales.each do |failed_locale| + puts "", "Failed to check locale files for #{failed_locale}".red + end + + puts "" + exit 1 unless failed_locales.empty? +end diff --git a/lib/tasks/i18n_stats.rake b/lib/tasks/i18n_stats.rake deleted file mode 100644 index ae48b2e968..0000000000 --- a/lib/tasks/i18n_stats.rake +++ /dev/null @@ -1,134 +0,0 @@ -require 'yaml' - -desc "show the current translation status" -task "i18n:stats" => :environment do - - def to_dotted_hash(source, target = {}, namespace = nil) - prefix = "#{namespace}." if namespace - if source.kind_of?(Hash) - - # detect pluralizable string - if (source["other"] != nil) - target[namespace] = { pluralizable: true, content: source } - return - end - - source.each do |key, value| - to_dotted_hash(value, target, "#{prefix}#{key}") - end - else - target[namespace] = source - end - target - end - - def compare(a, b, plural_keys) - locale1 = /.*\.([^.]{2,})\.yml$/.match(a)[1] - locale2 = /.*\.([^.]{2,})\.yml$/.match(b)[1] - - a = YAML.load_file("#{Rails.root}/config/locales/#{a}")[locale1] - b = YAML.load_file("#{Rails.root}/config/locales/#{b}")[locale2] - a = to_dotted_hash(a) - b = to_dotted_hash(b) - - plus = [] - minus = [] - same = [] - total = a.count - - a.each do |key, value| - if b[key] == nil - minus << key - end - if a[key] == b[key] - same << key - end - end - - b.each do |key, value| - if a[key] == nil - plus << key - end - end - - a.each do |key, value| - if value.kind_of?(Hash) - if value[:pluralizable] - plural_keys.each do |pl| - if b[key] == nil || !b[key].kind_of?(Hash) || b[key][:content][pl] == nil - minus << "#{key}.#{pl}" - end - end - - if b[key] != nil && b[key].kind_of?(Hash) - b[key][:content].each do |pl, val| - if ! plural_keys.include?(pl) - if a[key][:content]["zero"] == nil - plus << "#{key}.#{pl}" - end - end - end - end - - # special handling for zero - if a[key][:content]["zero"] != nil - if b[key] == nil || !b[key].kind_of?(Hash) || b[key][:content]["zero"] == nil - minus << "#{key}.zero" - end - end - end - end - end - - return plus, minus, same, total - end - - def get_plurals(locale) - I18n.t("i18n.plural.keys", locale: locale).map { |x| x.to_s } - end - - puts "Discourse Translation Status Script" - puts "To show details about a specific locale (e.g. 'de'), run as:" - puts " rake i18n:stats locale=de" - puts "" - - filemask = "client.*.yml" - details = false - if ENV['locale'] != nil - filemask = "client.#{ENV['locale']}.yml" - details = true - end - - puts " locale | cli+ | cli- | cli= | cli tot| srv+ | srv- | srv= | srv tot" - puts "----------------------------------------------------------------------------------" - - Dir["#{Rails.root}/config/locales/#{filemask}"].each do |f| - locale = /.*\.([^.]{2,})\.yml$/.match(f)[1] - next if locale == "en" - next if !File.exists?("#{Rails.root}/config/locales/client.#{locale}.yml") - next if !File.exists?("#{Rails.root}/config/locales/server.#{locale}.yml") - - pluralization_keys = get_plurals(locale) - - plus1, minus1, same1, total1 = compare("client.en.yml", "client.#{locale}.yml", pluralization_keys) - plus2, minus2, same2, total2 = compare("server.en.yml", "server.#{locale}.yml", pluralization_keys) - puts "%10s %8s %8s %8s %8s %8s %8s %8s %8s" % [locale, plus1.count, minus1.count, same1.count, total1, - plus2.count, minus2.count, same2.count, total2] - - if details - puts "" - puts "Equal keys:" - same1.each { |k| puts "client: #{locale}.#{k}" } - same2.each { |k| puts "server: #{locale}.#{k}" } - puts "" - puts "Missing keys:" - minus1.each { |k| puts "client: #{locale}.#{k}" } - minus2.each { |k| puts "server: #{locale}.#{k}" } - puts "" - puts "Surplus keys:" - plus1.each { |k| puts "client: #{locale}.#{k}" } - plus2.each { |k| puts "server: #{locale}.#{k}" } - end - end - -end diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index 15458e27cc..5ce4875509 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -29,7 +29,7 @@ MS_SPEND_CREATING_POST ||= 5000 def insert_post_timings log "Inserting post timings..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO post_timings (topic_id, post_number, user_id, msecs) SELECT topic_id, post_number, user_id, #{MS_SPEND_CREATING_POST} FROM posts @@ -41,7 +41,7 @@ end def insert_post_replies log "Inserting post replies..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO post_replies (post_id, reply_id, created_at, updated_at) SELECT p2.id, p.id, p.created_at, p.created_at FROM posts p @@ -53,7 +53,7 @@ end def insert_topic_users log "Inserting topic users..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO topic_users (user_id, topic_id, posted, last_read_post_number, highest_seen_post_number, first_visited_at, last_visited_at, total_msecs_viewed) SELECT user_id, topic_id, 't' , MAX(post_number), MAX(post_number), MIN(created_at), MAX(created_at), COUNT(id) * #{MS_SPEND_CREATING_POST} FROM posts @@ -66,7 +66,7 @@ end def insert_topic_views log "Inserting topic views..." - exec_sql <<-SQL + DB.exec <<-SQL WITH X AS ( SELECT topic_id, user_id, DATE(p.created_at) posted_at FROM posts p @@ -86,7 +86,7 @@ end def insert_user_actions log "Inserting user actions for NEW_TOPIC = 4..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO user_actions (action_type, user_id, target_topic_id, target_post_id, acting_user_id, created_at, updated_at) SELECT 4, p.user_id, topic_id, p.id, p.user_id, p.created_at, p.created_at FROM posts p @@ -100,7 +100,7 @@ def insert_user_actions log "Inserting user actions for REPLY = 5..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO user_actions (action_type, user_id, target_topic_id, target_post_id, acting_user_id, created_at, updated_at) SELECT 5, p.user_id, topic_id, p.id, p.user_id, p.created_at, p.created_at FROM posts p @@ -114,7 +114,7 @@ def insert_user_actions log "Inserting user actions for RESPONSE = 6..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO user_actions (action_type, user_id, target_topic_id, target_post_id, acting_user_id, created_at, updated_at) SELECT 6, p.user_id, p.topic_id, p.id, p2.user_id, p.created_at, p.created_at FROM posts p @@ -137,7 +137,7 @@ end def insert_user_options log "Inserting user options..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO user_options ( user_id, email_always, @@ -189,7 +189,7 @@ end def insert_user_stats log "Inserting user stats..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO user_stats (user_id, new_since) SELECT id, created_at FROM users @@ -200,7 +200,7 @@ end def insert_user_visits log "Inserting user visits..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO user_visits (user_id, visited_at, posts_read) SELECT user_id, DATE(created_at), COUNT(*) FROM posts @@ -213,7 +213,7 @@ end def insert_draft_sequences log "Inserting draft sequences..." - exec_sql <<-SQL + DB.exec <<-SQL INSERT INTO draft_sequences (user_id, draft_key, sequence) SELECT user_id, CONCAT('#{Draft::EXISTING_TOPIC}', id), 1 FROM topics @@ -226,7 +226,10 @@ end def update_user_stats log "Updating user stats..." - exec_sql <<-SQL + # TODO: topic_count is counting all topics you replied in as if you started the topic. + # TODO: post_count is counting first posts. + # TODO: topic_reply_count is never used, and is counting PMs here. + DB.exec <<-SQL WITH X AS ( SELECT p.user_id , COUNT(p.id) posts @@ -283,7 +286,7 @@ end def update_posts log "Updating posts..." - exec_sql <<-SQL + DB.exec <<-SQL WITH Y AS ( SELECT post_id, COUNT(*) replies FROM post_replies GROUP BY post_id ) @@ -310,7 +313,7 @@ end def update_topics log "Updating topics..." - exec_sql <<-SQL + DB.exec <<-SQL WITH X AS ( SELECT topic_id , COUNT(*) posts @@ -350,7 +353,7 @@ end def update_categories log "Updating categories..." - exec_sql <<-SQL + DB.exec <<-SQL WITH X AS ( SELECT category_id , MAX(p.id) post_id @@ -382,7 +385,7 @@ end def update_users log "Updating users..." - exec_sql <<-SQL + DB.exec <<-SQL WITH X AS ( SELECT user_id , MIN(created_at) min_created_at @@ -406,7 +409,7 @@ end def update_groups log "Updating groups..." - exec_sql <<-SQL + DB.exec <<-SQL WITH X AS ( SELECT group_id, COUNT(*) count FROM group_users @@ -428,12 +431,6 @@ def log(message) puts "[#{DateTime.now.strftime("%Y-%m-%d %H:%M:%S")}] #{message}" end -def exec_sql(sql) - ActiveRecord::Base.transaction do - ActiveRecord::Base.exec_sql(sql) - end -end - task "import:create_phpbb_permalinks" => :environment do log 'Creating Permalinks...' @@ -454,12 +451,11 @@ task "import:remap_old_phpbb_permalinks" => :environment do log 'Remapping Permalinks...' i = 0 - # discussions.flightaware.com - Post.where("raw LIKE ?", "%discussions.flightaware.com%").each do |p| + Post.where("raw LIKE ?", "%discussions.example.com%").each do |p| begin new_raw = p.raw.dup - # \((https?:\/\/discussions\.flightaware\.com\/\S*-t\d+.html)\) - new_raw.gsub!(/\((https?:\/\/discussions\.flightaware\.com\/\S*-t\d+.html)\)/) do + # \((https?:\/\/discussions\.example\.com\/\S*-t\d+.html)\) + new_raw.gsub!(/\((https?:\/\/discussions\.example\.com\/\S*-t\d+.html)\)/) do normalized_url = Permalink.normalize_url($1) permalink = Permalink.find_by_url(normalized_url) rescue nil if permalink && permalink.target_url @@ -478,7 +474,6 @@ task "import:remap_old_phpbb_permalinks" => :environment do # skip end end - i log "Done! #{i} posts remapped." end diff --git a/lib/tasks/plugin.rake b/lib/tasks/plugin.rake index 56cfb31207..4152286bd1 100644 --- a/lib/tasks/plugin.rake +++ b/lib/tasks/plugin.rake @@ -5,7 +5,6 @@ task 'plugin:install_all_official' do skip = Set.new([ 'customer-flair', 'discourse-nginx-performance-report', - 'hosted-site', 'lazyYT', 'poll', ]) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index 3c17bc1e3b..d28dc66562 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -81,22 +81,25 @@ end def rebake_posts(opts = {}) puts "Rebaking post markdown for '#{RailsMultisite::ConnectionManagement.current_db}'" - disable_edit_notifications = SiteSetting.disable_edit_notifications - SiteSetting.disable_edit_notifications = true + begin + disable_edit_notifications = SiteSetting.disable_edit_notifications + SiteSetting.disable_edit_notifications = true - total = Post.count - rebaked = 0 + total = Post.count + rebaked = 0 + batch = 1000 + Post.update_all('baked_version = NULL') - # TODO: make this resumable because carrying around 20 million ids in memory is not a great idea long term - Post.order(id: :desc).pluck(:id).in_groups_of(1000, false).each do |batched_post_ids| - Post.order(created_at: :desc).where(id: batched_post_ids).each do |post| - rebake_post(post, opts) - print_status(rebaked += 1, total) + (0..(total - 1).abs).step(batch) do |i| + Post.order(id: :desc).offset(i).limit(batch).each do |post| + rebake_post(post, opts) + print_status(rebaked += 1, total) + end end + ensure + SiteSetting.disable_edit_notifications = disable_edit_notifications end - SiteSetting.disable_edit_notifications = disable_edit_notifications - puts "", "#{rebaked} posts done!", "-" * 50 end @@ -130,16 +133,21 @@ task 'posts:normalize_code' => :environment do puts "#{i} posts normalized!" end -def remap_posts(find, type, replace = "") +def remap_posts(find, type, ignore_case, replace = "") + ignore_case = ignore_case == 'true' i = 0 Post.raw_match(find, type).find_each do |p| - new_raw = + regex = case type - when 'string' then p.raw.gsub(/#{Regexp.escape(find)}/, replace) - when 'regex' then p.raw.gsub(/#{find}/, replace) + when 'string' then + Regexp.new(Regexp.escape(find), ignore_case) + when 'regex' then + Regexp.new(find, ignore_case) end + new_raw = p.raw.gsub(regex, replace) + if new_raw != p.raw begin p.revise(Discourse.system_user, { raw: new_raw }, bypass_bump: true, skip_revision: true) @@ -155,13 +163,14 @@ def remap_posts(find, type, replace = "") end desc 'Remap all posts matching specific string' -task 'posts:remap', [:find, :replace, :type] => [:environment] do |_, args| +task 'posts:remap', [:find, :replace, :type, :ignore_case] => [:environment] do |_, args| require 'highline/import' - args.with_defaults(type: 'string') + args.with_defaults(type: 'string', ignore_case: 'false') find = args[:find] replace = args[:replace] type = args[:type]&.downcase + ignore_case = args[:ignore_case]&.downcase if !find puts "ERROR: Expecting rake posts:remap['find','replace']" @@ -170,7 +179,10 @@ task 'posts:remap', [:find, :replace, :type] => [:environment] do |_, args| puts "ERROR: Expecting rake posts:remap['find','replace']. Want to delete a word/string instead? Try rake posts:delete_word['word-to-delete']" exit 1 elsif type != 'string' && type != 'regex' - puts "ERROR: Expecting rake posts:delete_word[pattern, type] where type is string or regex" + puts "ERROR: Expecting rake posts:remap['find','replace',type] where type is string or regex" + exit 1 + elsif ignore_case != 'true' && ignore_case != 'false' + puts "ERROR: Expecting rake posts:remap['find','replace',type,ignore_case] where ignore_case is true or false" exit 1 else confirm_replace = ask("Are you sure you want to replace all #{type} occurrences of '#{find}' with '#{replace}'? (Y/n)") @@ -178,17 +190,18 @@ task 'posts:remap', [:find, :replace, :type] => [:environment] do |_, args| end puts "Remapping" - total = remap_posts(find, type, replace) + total = remap_posts(find, type, ignore_case, replace) puts "", "#{total} posts remapped!", "" end desc 'Delete occurrence of a word/string' -task 'posts:delete_word', [:find, :type] => [:environment] do |_, args| +task 'posts:delete_word', [:find, :type, :ignore_case] => [:environment] do |_, args| require 'highline/import' - args.with_defaults(type: 'string') + args.with_defaults(type: 'string', ignore_case: 'false') find = args[:find] type = args[:type]&.downcase + ignore_case = args[:ignore_case]&.downcase if !find puts "ERROR: Expecting rake posts:delete_word['word-to-delete']" @@ -196,13 +209,16 @@ task 'posts:delete_word', [:find, :type] => [:environment] do |_, args| elsif type != 'string' && type != 'regex' puts "ERROR: Expecting rake posts:delete_word[pattern, type] where type is string or regex" exit 1 + elsif ignore_case != 'true' && ignore_case != 'false' + puts "ERROR: Expecting rake posts:delete_word[pattern, type,ignore_case] where ignore_case is true or false" + exit 1 else confirm_delete = ask("Are you sure you want to remove all #{type} occurrences of '#{find}'? (Y/n)") exit 1 unless (confirm_delete == "" || confirm_delete.downcase == 'y') end puts "Processing" - total = remap_posts(find, type) + total = remap_posts(find, type, ignore_case) puts "", "#{total} posts updated!", "" end @@ -283,7 +299,7 @@ task 'posts:reorder_posts', [:topic_id] => [:environment] do |_, args| Post.transaction do # update sort_order and flip post_number to prevent # unique constraint violations when updating post_number - builder = SqlBuilder.new(<<~SQL) + builder = DB.build(<<~SQL) WITH ordered_posts AS ( SELECT id, @@ -304,7 +320,7 @@ task 'posts:reorder_posts', [:topic_id] => [:environment] do |_, args| builder.where("topic_id = :topic_id") if args[:topic_id] builder.exec(topic_id: args[:topic_id]) - Notification.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE notifications AS x SET post_number = p.sort_order FROM posts AS p @@ -313,7 +329,7 @@ task 'posts:reorder_posts', [:topic_id] => [:environment] do |_, args| p.post_number < 0 SQL - PostTiming.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE post_timings AS x SET post_number = x.post_number * -1 FROM posts AS p @@ -329,7 +345,7 @@ task 'posts:reorder_posts', [:topic_id] => [:environment] do |_, args| p.post_number < 0; SQL - Post.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE posts AS x SET reply_to_post_number = p.sort_order FROM posts AS p @@ -338,7 +354,7 @@ task 'posts:reorder_posts', [:topic_id] => [:environment] do |_, args| p.post_number < 0; SQL - TopicUser.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE topic_users AS x SET last_read_post_number = p.sort_order FROM posts AS p @@ -362,7 +378,7 @@ task 'posts:reorder_posts', [:topic_id] => [:environment] do |_, args| SQL # finally update the post_number - Post.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE posts SET post_number = sort_order WHERE post_number < 0 diff --git a/lib/tasks/scheduler.rake b/lib/tasks/scheduler.rake index 14e4018828..23b7cacf69 100644 --- a/lib/tasks/scheduler.rake +++ b/lib/tasks/scheduler.rake @@ -28,7 +28,7 @@ end desc "run every task the scheduler knows about in that order, use only for debugging" task 'scheduler:run_all' => :environment do - Scheduler::Manager.discover_schedules.each do |schedule| + MiniScheduler::Manager.discover_schedules.each do |schedule| puts "Running #{schedule}" time { schedule.new.execute({}) } end diff --git a/lib/tasks/smoke_test.rake b/lib/tasks/smoke_test.rake index 87b526e7f6..d84de7c576 100644 --- a/lib/tasks/smoke_test.rake +++ b/lib/tasks/smoke_test.rake @@ -8,6 +8,8 @@ task "smoke:test" do abort "Chrome 59 or higher is required to run smoke tests in headless mode." end + system("yarn install --dev") + url = ENV["URL"] if !url require "#{Rails.root}/config/environment" @@ -29,21 +31,12 @@ task "smoke:test" do dir = ENV["SMOKE_TEST_SCREENSHOT_PATH"] || 'tmp/smoke-test-screenshots' FileUtils.mkdir_p(dir) unless Dir.exists?(dir) - start = Time.now - while true - response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http| - http.request(request) - end + response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http| + http.request(request) + end - break if response.code == "200" - - # retry for up to 5 minutes - if Time.now - start < 300 - puts "Connection failed with #{response.code}. Retrying in 5 seconds..." - sleep(5) - else - raise "TRIVIAL GET FAILED WITH #{response.code}" - end + if response.code != "200" + raise "TRIVIAL GET FAILED WITH #{response.code}" end results = "" diff --git a/lib/tasks/tags.rake b/lib/tasks/tags.rake new file mode 100644 index 0000000000..3c10614a4b --- /dev/null +++ b/lib/tasks/tags.rake @@ -0,0 +1,26 @@ +task "tags:bulk_tag_category", [:tags, :category] => [:environment] do |_, args| + tags = args[:tags].split("|") + category_id = args[:category] + + if !tags || !category_id + puts 'ERROR: Expecting tags:bulk_tag_category["tag",category_id]' + exit 1 + end + + guardian = Guardian.new(Discourse.system_user) + category = Category.find(category_id) + + tagged = 0 + total = category.topics.count + + category.topics.find_each do |topic| + DiscourseTagging.tag_topic_by_names(topic, guardian, tags) + print_status(tagged += 1, total) + end + + puts "", "Done!", "" +end + +def print_status(current, max) + print "\r%9d / %d (%5.1f%%)" % [current, max, ((current.to_f / max.to_f) * 100).round(1)] +end diff --git a/lib/tasks/topics.rake b/lib/tasks/topics.rake index bbbf56ac79..e9720e76f6 100644 --- a/lib/tasks/topics.rake +++ b/lib/tasks/topics.rake @@ -64,3 +64,36 @@ task "topics:apply_autoclose" => :environment do puts "", "Done" end + +def update_static_page_topic(locale, site_setting_key, title_key, body_key, params = {}) + topic = Topic.find(SiteSetting.send(site_setting_key)) + + if (topic && post = topic.first_post) + post.revise(Discourse.system_user, + title: I18n.t(title_key, locale: locale), + raw: I18n.t(body_key, params.merge(locale: locale))) + + puts "", "Topic for #{site_setting_key} updated" + else + puts "", "Topic for #{site_setting_key} not found" + end +end + +desc "Update static topics (ToS, Privacy, Guidelines) with latest translated content" +task "topics:update_static", [:locale] => [:environment] do |_, args| + locale = args[:locale]&.to_sym + + if locale.blank? || !I18n.locale_available?(locale) + puts "ERROR: Expecting rake topics:update_static[locale]" + exit 1 + end + + update_static_page_topic(locale, "tos_topic_id", "tos_topic.title", "tos_topic.body", + company_domain: SiteSetting.company_domain.presence || "company_domain", + company_full_name: SiteSetting.company_full_name.presence || "company_full_name", + company_name: SiteSetting.company_short_name.presence || "company_short_name") + + update_static_page_topic(locale, "guidelines_topic_id", "guidelines_topic.title", "guidelines_topic.body") + + update_static_page_topic(locale, "privacy_topic_id", "privacy_topic.title", "privacy_topic.body") +end diff --git a/lib/tasks/typepad.thor b/lib/tasks/typepad.thor index 7db75d415e..8197f7f0f5 100644 --- a/lib/tasks/typepad.thor +++ b/lib/tasks/typepad.thor @@ -27,21 +27,21 @@ class Typepad < Thor end inside_block = true - entry = "" + input = "" entries = [] File.open(options[:file]).each_line do |l| l = l.scrub if l =~ /^--------$/ - parsed_entry = process_entry(entry) + parsed_entry = process_entry(input) if parsed_entry puts "Parsed #{parsed_entry[:title]}" entries << parsed_entry end - entry = "" + input = "" else - entry << l + input << l end end @@ -55,6 +55,7 @@ class Typepad < Thor SiteSetting.email_domains_blacklist = "" puts "Importing #{entries.size} entries" + entries.each_with_index do |entry, idx| puts "Importing (#{idx + 1}/#{entries.size})" next if entry[:body].blank? @@ -219,7 +220,7 @@ class Typepad < Thor current << c end end - segments.delete_if { |s| s.nil? || s.size < 2 } + segments.delete_if { |segment| segment.nil? || segment.size < 2 } segments << current comment[:author] = segments[0] diff --git a/lib/tasks/uploads.rake b/lib/tasks/uploads.rake index d69f3078a7..b190b3a5c8 100644 --- a/lib/tasks/uploads.rake +++ b/lib/tasks/uploads.rake @@ -121,9 +121,10 @@ def migrate_from_s3 puts "Migrating uploads from S3 to local storage for '#{db}'..." - max_file_size_kb = [SiteSetting.max_image_size_kb, SiteSetting.max_attachment_size_kb].max.kilobytes - - Post.where("user_id > 0 AND raw LIKE '%.s3%.amazonaws.com/%'").find_each do |post| + Post + .where("user_id > 0") + .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'") + .find_each do |post| begin updated = false @@ -154,6 +155,31 @@ def migrate_from_s3 end end + post.raw.gsub!(/(upload:\/\/[0-9a-zA-Z]+\.\w+)/) do |url| + begin + if sha1 = Upload.sha1_from_short_url(url) + if upload = Upload.find_by(sha1: sha1) + if upload.url.start_with?("//") + file = FileHelper.download("http:#{upload.url}", max_file_size: 20.megabytes, tmp_file_name: "from_s3", follow_redirect: true) + filename = upload.original_filename + origin = upload.origin + upload.destroy + + new_upload = UploadCreator.new(file, filename, origin: origin).create_for(post.user_id || -1) + if new_upload&.save + updated = true + url = new_upload.url + end + end + end + end + + url + rescue + url + end + end + if updated post.save! post.rebake! @@ -227,7 +253,7 @@ def migrate_to_s3 putc "X" next ensure - file.try(:close!) rescue nil + file&.close end # remap the URL @@ -676,7 +702,7 @@ task "uploads:analyze", [:cache_path, :limit] => :environment do |_, args| printf "%-25s | %-25s | %-25s | %-25s\n", 'username', 'total size of uploads', 'number of uploads', 'number of optimized images' puts "-" * 110 - User.exec_sql(sql).values.each do |username, num_of_uploads, total_size_of_uploads, num_of_optimized_images| + DB.query_single(sql).each do |username, num_of_uploads, total_size_of_uploads, num_of_optimized_images| printf "%-25s | %-25s | %-25s | %-25s\n", username, helper.number_to_human_size(total_size_of_uploads), num_of_uploads, num_of_optimized_images end @@ -684,3 +710,102 @@ task "uploads:analyze", [:cache_path, :limit] => :environment do |_, args| puts "List of file paths @ #{path}" puts "Duration: #{Time.zone.now - now} seconds" end + +task "uploads:fix_incorrect_extensions" => :environment do + require_dependency "upload_fixer" + UploadFixer.fix_all_extensions +end + +task "uploads:list_posts_with_broken_images" => :environment do + if ENV["RAILS_DB"] + list_broken_posts(recover_from_s3: !!ENV["RECOVER_FROM_S3"]) + else + RailsMultisite::ConnectionManagement.each_connection do |db| + list_broken_posts(recover_from_s3: !!ENV["RECOVER_FROM_S3"]) + end + end +end + +def list_broken_posts(recover_from_s3: false) + object_keys = nil + + Post.where("raw LIKE '%upload:\/\/%'").find_each do |post| + begin + begin + analyzer = PostAnalyzer.new(post.raw, post.topic_id) + cooked_stripped = analyzer.send(:cooked_stripped) + end + + cooked_stripped.css("img").each do |img| + if dom_class = img["class"] + if (Post.white_listed_image_classes & dom_class.split).count > 0 + next + end + end + + if img["data-orig-src"] + puts "#{post.full_url} #{img["data-orig-src"]}" + + if recover_from_s3 && Discourse.store.external? + object_keys ||= begin + s3_helper = Discourse.store.s3_helper + + s3_helper.list("original").map(&:key).concat( + s3_helper.list("#{FileStore::S3Store::TOMBSTONE_PREFIX}original").map(&:key) + ) + end + + recover_from_s3_by_sha1( + post: post, + sha1: Upload.sha1_from_short_url(img["data-orig-src"]), + object_keys: object_keys + ) + end + end + end + rescue => e + puts "#{post.full_url} Error: #{e.message}" + end + end +end + +def recover_from_s3_by_sha1(post:, sha1:, object_keys: []) + object_keys.each do |key| + if key =~ /#{sha1}/ + tombstone_prefix = FileStore::S3Store::TOMBSTONE_PREFIX + + if key.starts_with?(tombstone_prefix) + Discourse.store.s3_helper.copy( + key, + key.sub(tombstone_prefix, ""), + options: { acl: "public-read" } + ) + end + + url = "https:#{SiteSetting.Upload.absolute_base_url}/#{key}" + + begin + tmp = FileHelper.download( + url, + max_file_size: SiteSetting.max_image_size_kb.kilobytes, + tmp_file_name: "recover_from_s3" + ) + + if tmp + upload = UploadCreator.new( + tmp, + File.basename(key) + ).create_for(post.user_id) + + if upload.persisted? + post.rebake! + else + puts "#{post.full_url}: #{upload.errors.full_messages.join(", ")}" + end + end + ensure + tmp&.close + end + end + end +end diff --git a/lib/tasks/users.rake b/lib/tasks/users.rake index 877d270f68..9bfaa79c9c 100644 --- a/lib/tasks/users.rake +++ b/lib/tasks/users.rake @@ -32,6 +32,7 @@ task "users:change_post_ownership", [:old_username, :new_username, :archetype] = puts "", "#{i} posts ownership changed!", "" end +desc "Merge the source user into the target user" task "users:merge", [:source_username, :target_username] => [:environment] do |_, args| source_username = args[:source_username] target_username = args[:target_username] @@ -48,6 +49,7 @@ task "users:merge", [:source_username, :target_username] => [:environment] do |_ puts "", "Users merged!", "" end +desc "Rename a user" task "users:rename", [:old_username, :new_username] => [:environment] do |_, args| old_username = args[:old_username] new_username = args[:new_username] @@ -62,7 +64,7 @@ task "users:rename", [:old_username, :new_username] => [:environment] do |_, arg puts "", "User renamed!", "" end -desc "Updates username in quotes and mentions. Use this if the user was renamed before proper renaming existed." +desc "Update username in quotes and mentions. Use this if the user was renamed before proper renaming existed." task "users:update_posts", [:old_username, :current_username] => [:environment] do |_, args| old_username = args[:old_username] current_username = args[:current_username] @@ -73,15 +75,78 @@ task "users:update_posts", [:old_username, :current_username] => [:environment] end user = find_user(current_username) - Jobs::UpdateUsername.new.execute( - user_id: user.id, - old_username: old_username, - new_username: user.username, - avatar_template: user.avatar_template) + UsernameChanger.update_username(user_id: user.id, + old_username: old_username, + new_username: user.username, + avatar_template: user.avatar_template, + asynchronous: false) puts "", "Username updated!", "" end +desc 'Recalculate post and topic counts in user stats' +task 'users:recalculate_post_counts' => :environment do + puts '', 'Updating user stats...' + + filter_public_posts_and_topics = <<~SQL + p.deleted_at IS NULL + AND NOT COALESCE(p.hidden, 't') + AND p.post_type = 1 + AND t.deleted_at IS NULL + AND COALESCE(t.visible, 't') + AND t.archetype <> 'private_message' + AND p.user_id > 0 + SQL + + puts 'post counts...' + + # all public replies + DB.exec <<~SQL + WITH X AS ( + SELECT p.user_id, COUNT(p.id) post_count + FROM posts p + JOIN topics t ON t.id = p.topic_id + WHERE #{filter_public_posts_and_topics} + AND p.post_number > 1 +GROUP BY p.user_id + ) + UPDATE user_stats + SET post_count = X.post_count + FROM X + WHERE user_stats.user_id = X.user_id + AND user_stats.post_count <> X.post_count + SQL + + puts 'topic counts...' + + # public topics + DB.exec <<~SQL + WITH X AS ( + SELECT p.user_id, COUNT(p.id) topic_count + FROM posts p + JOIN topics t ON t.id = p.topic_id + WHERE #{filter_public_posts_and_topics} + AND p.post_number = 1 +GROUP BY p.user_id + ) + UPDATE user_stats + SET topic_count = X.topic_count + FROM X + WHERE user_stats.user_id = X.user_id + AND user_stats.topic_count <> X.topic_count + SQL + + puts 'Done!', '' +end + +desc "Disable 2FA for user with the given username" +task "users:disable_2fa", [:username] => [:environment] do |_, args| + username = args[:username] + user = find_user(username) + UserSecondFactor.where(user_id: user.id, method: UserSecondFactor.methods[:totp]).each(&:destroy!) + puts "2FA disabled for #{username}" +end + def find_user(username) user = User.find_by_username(username) diff --git a/lib/theme_settings_manager.rb b/lib/theme_settings_manager.rb index 537b2c7de1..8080271944 100644 --- a/lib/theme_settings_manager.rb +++ b/lib/theme_settings_manager.rb @@ -93,8 +93,13 @@ class ThemeSettingsManager (max.is_a?(::Integer) || max.is_a?(::Float)) && max != ::Float::INFINITY end - class List < self; end - class String < self + class List < self + def list_type + @opts[:list_type] + end + end + + class String < self def is_valid_value?(new_value) (@opts[:min]..@opts[:max]).include? new_value.to_s.length end diff --git a/lib/theme_settings_parser.rb b/lib/theme_settings_parser.rb index 475d24a948..064dd7ef14 100644 --- a/lib/theme_settings_parser.rb +++ b/lib/theme_settings_parser.rb @@ -33,6 +33,11 @@ class ThemeSettingsParser opts[:max] = raw_opts[:max].is_a?(Numeric) ? raw_opts[:max] : Float::INFINITY opts[:min] = raw_opts[:min].is_a?(Numeric) ? raw_opts[:min] : -Float::INFINITY end + + if raw_opts[:list_type] + opts[:list_type] = raw_opts[:list_type] + end + opts end diff --git a/lib/timeline_lookup.rb b/lib/timeline_lookup.rb index 90d4a5e02a..3a62ba9ef6 100644 --- a/lib/timeline_lookup.rb +++ b/lib/timeline_lookup.rb @@ -1,6 +1,6 @@ module TimelineLookup - # Given an array of tuples (id, post_number, days_ago), return at most `max_values` worth of a + # Given an array of tuples containing (id, days_ago), return at most `max_values` worth of a # lookup table to help the front end timeline display dates associated with posts def self.build(tuples, max_values = 300) result = [] @@ -9,9 +9,10 @@ module TimelineLookup last_days_ago = -1 tuples.each_with_index do |t, idx| + return result unless t.is_a?(Array) next unless (idx % every) === 0 - days_ago = t[2] + days_ago = t[1] if (days_ago != last_days_ago) result << [idx + 1, days_ago] diff --git a/lib/topic_creator.rb b/lib/topic_creator.rb index 6394156fcb..a62d42bd6f 100644 --- a/lib/topic_creator.rb +++ b/lib/topic_creator.rb @@ -183,7 +183,7 @@ class TopicCreator rollback_with!(topic, :no_user_selected) end - if @opts[:target_emails].present? && !@guardian.cand_send_private_messages_to_email? then + if @opts[:target_emails].present? && !@guardian.can_send_private_messages_to_email? then rollback_with!(topic, :reply_by_email_disabled) end diff --git a/lib/topic_query.rb b/lib/topic_query.rb index 563eedf67a..202d344470 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -9,6 +9,46 @@ require_dependency 'topic_query_sql' require_dependency 'avatar_lookup' class TopicQuery + PG_MAX_INT ||= 2147483647 + + def self.validators + @validators ||= begin + + int = lambda do |x| + Integer === x || (String === x && x.match?(/^-?[0-9]+$/)) + end + + zero_up_to_max_int = lambda do |x| + int.call(x) && x.to_i.between?(0, PG_MAX_INT) + end + + one_up_to_max_int = lambda do |x| + int.call(x) && x.to_i.between?(1, PG_MAX_INT) + end + + array_int_or_int = lambda do |x| + int.call(x) || ( + Array === x && x.length > 0 && x.all?(&int) + ) + end + + { + max_posts: zero_up_to_max_int, + min_posts: zero_up_to_max_int, + page: zero_up_to_max_int, + exclude_category_ids: array_int_or_int + } + end + end + + def self.validate?(option, value) + + if fn = validators[option.to_sym] + fn.call(value) + else + true + end + end def self.public_valid_options @public_valid_options ||= @@ -374,7 +414,7 @@ class TopicQuery end list = TopicList.new(filter, @user, topics, options.merge(@options)) - list.per_page = per_page_setting + list.per_page = options[:per_page] || per_page_setting list end @@ -423,147 +463,147 @@ class TopicQuery protected - def per_page_setting - @options[:slow_platform] ? 15 : 30 - end + def per_page_setting + @options[:slow_platform] ? 15 : 30 + end - def private_messages_for(user, type) - options = @options - options.reverse_merge!(per_page: per_page_setting) + def private_messages_for(user, type) + options = @options + options.reverse_merge!(per_page: per_page_setting) - result = Topic.includes(:tags) + result = Topic.includes(:tags) - if type == :group - result = result.includes(:allowed_users) - result = result.where(" - topics.id IN ( - SELECT topic_id FROM topic_allowed_groups - WHERE ( - group_id IN ( - SELECT group_id - FROM group_users - WHERE user_id = #{user.id.to_i} - OR #{user.staff?} - ) - ) - AND group_id IN (SELECT id FROM groups WHERE name ilike ?) - )", - @options[:group_name] - ) - elsif type == :user - result = result.includes(:allowed_users) - result = result.where("topics.id IN (SELECT topic_id FROM topic_allowed_users WHERE user_id = #{user.id.to_i})") - elsif type == :all - result = result.includes(:allowed_users) - result = result.where("topics.id IN ( - SELECT topic_id - FROM topic_allowed_users + if type == :group + result = result.includes(:allowed_users) + result = result.where(" + topics.id IN ( + SELECT topic_id FROM topic_allowed_groups + WHERE ( + group_id IN ( + SELECT group_id + FROM group_users WHERE user_id = #{user.id.to_i} - UNION ALL - SELECT topic_id FROM topic_allowed_groups - WHERE group_id IN ( - SELECT group_id FROM group_users WHERE user_id = #{user.id.to_i} - ) - )") - end - - result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{user.id.to_i})") - .order("topics.bumped_at DESC") - .private_messages - - result = result.limit(options[:per_page]) unless options[:limit] == false - result = result.visible if options[:visible] || @user.nil? || @user.regular? - - if options[:page] - offset = options[:page].to_i * options[:per_page] - result = result.offset(offset) if offset > 0 - end - result + OR #{user.staff?} + ) + ) + AND group_id IN (SELECT id FROM groups WHERE name ilike ?) + )", + @options[:group_name] + ) + elsif type == :user + result = result.includes(:allowed_users) + result = result.where("topics.id IN (SELECT topic_id FROM topic_allowed_users WHERE user_id = #{user.id.to_i})") + elsif type == :all + result = result.includes(:allowed_users) + result = result.where("topics.id IN ( + SELECT topic_id + FROM topic_allowed_users + WHERE user_id = #{user.id.to_i} + UNION ALL + SELECT topic_id FROM topic_allowed_groups + WHERE group_id IN ( + SELECT group_id FROM group_users WHERE user_id = #{user.id.to_i} + ) + )") end - def apply_shared_drafts(result, category_id, options) - drafts_category_id = SiteSetting.shared_drafts_category.to_i - viewing_shared = category_id && category_id == drafts_category_id + result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{user.id.to_i})") + .order("topics.bumped_at DESC") + .private_messages - if guardian.can_create_shared_draft? - if options[:destination_category_id] - destination_category_id = get_category_id(options[:destination_category_id]) - topic_ids = SharedDraft.where(category_id: destination_category_id).pluck(:topic_id) - return result.where(id: topic_ids) - elsif viewing_shared - result = result.includes(:shared_draft).references(:shared_draft) - else - return result.where('topics.category_id != ?', drafts_category_id) - end + result = result.limit(options[:per_page]) unless options[:limit] == false + result = result.visible if options[:visible] || @user.nil? || @user.regular? + + if options[:page] + offset = options[:page].to_i * options[:per_page] + result = result.offset(offset) if offset > 0 + end + result + end + + def apply_shared_drafts(result, category_id, options) + drafts_category_id = SiteSetting.shared_drafts_category.to_i + viewing_shared = category_id && category_id == drafts_category_id + + if guardian.can_create_shared_draft? + if options[:destination_category_id] + destination_category_id = get_category_id(options[:destination_category_id]) + topic_ids = SharedDraft.where(category_id: destination_category_id).pluck(:topic_id) + return result.where(id: topic_ids) + elsif viewing_shared + result = result.includes(:shared_draft).references(:shared_draft) + else + return result.where('topics.category_id != ?', drafts_category_id) end - - result end - def apply_ordering(result, options) - sort_column = SORTABLE_MAPPING[options[:order]] || 'default' - sort_dir = (options[:ascending] == "true") ? "ASC" : "DESC" + result + end - # If we are sorting in the default order desc, we should consider including pinned - # topics. Otherwise, just use bumped_at. - if sort_column == 'default' - if sort_dir == 'DESC' - # If something requires a custom order, for example "unread" which sorts the least read - # to the top, do nothing - return result if options[:unordered] - end - sort_column = 'bumped_at' + def apply_ordering(result, options) + sort_column = SORTABLE_MAPPING[options[:order]] || 'default' + sort_dir = (options[:ascending] == "true") ? "ASC" : "DESC" + + # If we are sorting in the default order desc, we should consider including pinned + # topics. Otherwise, just use bumped_at. + if sort_column == 'default' + if sort_dir == 'DESC' + # If something requires a custom order, for example "unread" which sorts the least read + # to the top, do nothing + return result if options[:unordered] end - - # If we are sorting by category, actually use the name - if sort_column == 'category_id' - # TODO forces a table scan, slow - return result.references(:categories).order(TopicQuerySQL.order_by_category_sql(sort_dir)) - end - - if sort_column == 'op_likes' - return result.includes(:first_post).order("(SELECT like_count FROM posts p3 WHERE p3.topic_id = topics.id AND p3.post_number = 1) #{sort_dir}") - end - - if sort_column.start_with?('custom_fields') - field = sort_column.split('.')[1] - return result.order("(SELECT CASE WHEN EXISTS (SELECT true FROM topic_custom_fields tcf WHERE tcf.topic_id::integer = topics.id::integer AND tcf.name = '#{field}') THEN (SELECT value::integer FROM topic_custom_fields tcf WHERE tcf.topic_id::integer = topics.id::integer AND tcf.name = '#{field}') ELSE 0 END) #{sort_dir}") - end - - result.order("topics.#{sort_column} #{sort_dir}") + sort_column = 'bumped_at' end - def get_category_id(category_id_or_slug) - return nil unless category_id_or_slug - category_id = category_id_or_slug.to_i - category_id = Category.where(slug: category_id_or_slug).pluck(:id).first if category_id == 0 - category_id + # If we are sorting by category, actually use the name + if sort_column == 'category_id' + # TODO forces a table scan, slow + return result.references(:categories).order(TopicQuerySQL.order_by_category_sql(sort_dir)) end - # Create results based on a bunch of default options - def default_results(options = {}) - options.reverse_merge!(@options) - options.reverse_merge!(per_page: per_page_setting) + if sort_column == 'op_likes' + return result.includes(:first_post).order("(SELECT like_count FROM posts p3 WHERE p3.topic_id = topics.id AND p3.post_number = 1) #{sort_dir}") + end - # Whether to return visible topics - options[:visible] = true if @user.nil? || @user.regular? - options[:visible] = false if @user && @user.id == options[:filtered_to_user] + if sort_column.start_with?('custom_fields') + field = sort_column.split('.')[1] + return result.order("(SELECT CASE WHEN EXISTS (SELECT true FROM topic_custom_fields tcf WHERE tcf.topic_id::integer = topics.id::integer AND tcf.name = '#{field}') THEN (SELECT value::integer FROM topic_custom_fields tcf WHERE tcf.topic_id::integer = topics.id::integer AND tcf.name = '#{field}') ELSE 0 END) #{sort_dir}") + end - # Start with a list of all topics - result = Topic.unscoped + result.order("topics.#{sort_column} #{sort_dir}") + end - if @user - result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{@user.id.to_i})") - .references('tu') - end + def get_category_id(category_id_or_slug) + return nil unless category_id_or_slug + category_id = category_id_or_slug.to_i + category_id = Category.where(slug: category_id_or_slug).pluck(:id).first if category_id == 0 + category_id + end - category_id = get_category_id(options[:category]) - @options[:category_id] = category_id - if category_id - if options[:no_subcategories] - result = result.where('categories.id = ?', category_id) - else - sql = <<~SQL + # Create results based on a bunch of default options + def default_results(options = {}) + options.reverse_merge!(@options) + options.reverse_merge!(per_page: per_page_setting) + + # Whether to return visible topics + options[:visible] = true if @user.nil? || @user.regular? + options[:visible] = false if @user && @user.id == options[:filtered_to_user] + + # Start with a list of all topics + result = Topic.unscoped + + if @user + result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{@user.id.to_i})") + .references('tu') + end + + category_id = get_category_id(options[:category]) + @options[:category_id] = category_id + if category_id + if options[:no_subcategories] + result = result.where('categories.id = ?', category_id) + else + sql = <<~SQL categories.id IN ( SELECT c2.id FROM categories c2 WHERE c2.parent_category_id = :category_id UNION ALL @@ -573,356 +613,356 @@ class TopicQuery SELECT c3.topic_id FROM categories c3 WHERE c3.parent_category_id = :category_id ) SQL - result = result.where(sql, category_id: category_id) - end - result = result.references(:categories) + result = result.where(sql, category_id: category_id) + end + result = result.references(:categories) - if !@options[:order] - # category default sort order - sort_order, sort_ascending = Category.where(id: category_id).pluck(:sort_order, :sort_ascending).first - if sort_order - options[:order] = sort_order - options[:ascending] = !!sort_ascending ? 'true' : 'false' - end + if !@options[:order] + # category default sort order + sort_order, sort_ascending = Category.where(id: category_id).pluck(:sort_order, :sort_ascending).first + if sort_order + options[:order] = sort_order + options[:ascending] = !!sort_ascending ? 'true' : 'false' end end + end - # ALL TAGS: something like this? - # Topic.joins(:tags).where('tags.name in (?)', @options[:tags]).group('topic_id').having('count(*)=?', @options[:tags].size).select('topic_id') + # ALL TAGS: something like this? + # Topic.joins(:tags).where('tags.name in (?)', @options[:tags]).group('topic_id').having('count(*)=?', @options[:tags].size).select('topic_id') - if SiteSetting.tagging_enabled - result = result.preload(:tags) + if SiteSetting.tagging_enabled + result = result.preload(:tags) - if @options[:tags] && @options[:tags].size > 0 + if @options[:tags] && @options[:tags].size > 0 - if @options[:match_all_tags] - # ALL of the given tags: - tags_count = @options[:tags].length - @options[:tags] = Tag.where(name: @options[:tags]).pluck(:id) unless @options[:tags][0].is_a?(Integer) + if @options[:match_all_tags] + # ALL of the given tags: + tags_count = @options[:tags].length + @options[:tags] = Tag.where(name: @options[:tags]).pluck(:id) unless @options[:tags][0].is_a?(Integer) - if tags_count == @options[:tags].length - @options[:tags].each_with_index do |tag, index| - sql_alias = ['t', index].join - result = result.joins("INNER JOIN topic_tags #{sql_alias} ON #{sql_alias}.topic_id = topics.id AND #{sql_alias}.tag_id = #{tag}") - end - else - result = result.none # don't return any results unless all tags exist in the database + if tags_count == @options[:tags].length + @options[:tags].each_with_index do |tag, index| + sql_alias = ['t', index].join + result = result.joins("INNER JOIN topic_tags #{sql_alias} ON #{sql_alias}.topic_id = topics.id AND #{sql_alias}.tag_id = #{tag}") end else - # ANY of the given tags: - result = result.joins(:tags) - if @options[:tags][0].is_a?(Integer) - result = result.where("tags.id in (?)", @options[:tags]) - else - result = result.where("tags.name in (?)", @options[:tags]) - end + result = result.none # don't return any results unless all tags exist in the database end - elsif @options[:no_tags] - # the following will do: ("topics"."id" NOT IN (SELECT DISTINCT "topic_tags"."topic_id" FROM "topic_tags")) - result = result.where.not(id: TopicTag.distinct.pluck(:topic_id)) - end - end - - result = apply_ordering(result, options) - result = result.listable_topics.includes(:category) - result = apply_shared_drafts(result, category_id, options) - - if options[:exclude_category_ids] && options[:exclude_category_ids].is_a?(Array) && options[:exclude_category_ids].size > 0 - result = result.where("categories.id NOT IN (?)", options[:exclude_category_ids]).references(:categories) - end - - # Don't include the category topics if excluded - if options[:no_definitions] - result = result.where('COALESCE(categories.topic_id, 0) <> topics.id') - end - - result = result.limit(options[:per_page]) unless options[:limit] == false - result = result.visible if options[:visible] - result = result.where.not(topics: { id: options[:except_topic_ids] }).references(:topics) if options[:except_topic_ids] - - if options[:page] - offset = options[:page].to_i * options[:per_page] - result = result.offset(offset) if offset > 0 - end - - if options[:topic_ids] - result = result.where('topics.id in (?)', options[:topic_ids]).references(:topics) - end - - if search = options[:search] - result = result.where("topics.id in (select pp.topic_id from post_search_data pd join posts pp on pp.id = pd.post_id where pd.search_data @@ #{Search.ts_query(term: search.to_s)})") - end - - # NOTE protect against SYM attack can be removed with Ruby 2.2 - # - state = options[:state] - if @user && state && - TopicUser.notification_levels.keys.map(&:to_s).include?(state) - level = TopicUser.notification_levels[state.to_sym] - result = result.where('topics.id IN ( - SELECT topic_id - FROM topic_users - WHERE user_id = ? AND - notification_level = ?)', @user.id, level) - end - - require_deleted_clause = true - - if before = options[:before] - if (before = before.to_i) > 0 - result = result.where('topics.created_at < ?', before.to_i.days.ago) - end - end - - if bumped_before = options[:bumped_before] - if (bumped_before = bumped_before.to_i) > 0 - result = result.where('topics.bumped_at < ?', bumped_before.to_i.days.ago) - end - end - - if status = options[:status] - case status - when 'open' - result = result.where('NOT topics.closed AND NOT topics.archived') - when 'closed' - result = result.where('topics.closed') - when 'archived' - result = result.where('topics.archived') - when 'listed' - result = result.where('topics.visible') - when 'unlisted' - result = result.where('NOT topics.visible') - when 'deleted' - guardian = @guardian - if guardian.is_staff? - result = result.where('topics.deleted_at IS NOT NULL') - require_deleted_clause = false + else + # ANY of the given tags: + result = result.joins(:tags) + if @options[:tags][0].is_a?(Integer) + result = result.where("tags.id in (?)", @options[:tags]) + else + result = result.where("tags.name in (?)", @options[:tags]) end end + elsif @options[:no_tags] + # the following will do: ("topics"."id" NOT IN (SELECT DISTINCT "topic_tags"."topic_id" FROM "topic_tags")) + result = result.where.not(id: TopicTag.distinct.pluck(:topic_id)) end - - if (filter = options[:filter]) && @user - action = - if filter == "bookmarked" - PostActionType.types[:bookmark] - elsif filter == "liked" - PostActionType.types[:like] - end - if action - result = result.where('topics.id IN (SELECT pp.topic_id - FROM post_actions pa - JOIN posts pp ON pp.id = pa.post_id - WHERE pa.user_id = :user_id AND - pa.post_action_type_id = :action AND - pa.deleted_at IS NULL - )', user_id: @user.id, - action: action - ) - end - end - - result = result.where('topics.deleted_at IS NULL') if require_deleted_clause - result = result.where('topics.posts_count <= ?', options[:max_posts]) if options[:max_posts].present? - result = result.where('topics.posts_count >= ?', options[:min_posts]) if options[:min_posts].present? - - result = TopicQuery.apply_custom_filters(result, self) - - @guardian.filter_allowed_categories(result) end - def remove_muted_topics(list, user) - if user - list = list.where('COALESCE(tu.notification_level,1) > :muted', muted: TopicUser.notification_levels[:muted]) - end + result = apply_ordering(result, options) + result = result.listable_topics.includes(:category) + result = apply_shared_drafts(result, category_id, options) + if options[:exclude_category_ids] && options[:exclude_category_ids].is_a?(Array) && options[:exclude_category_ids].size > 0 + result = result.where("categories.id NOT IN (?)", options[:exclude_category_ids].map(&:to_i)).references(:categories) + end + + # Don't include the category topics if excluded + if options[:no_definitions] + result = result.where('COALESCE(categories.topic_id, 0) <> topics.id') + end + + result = result.limit(options[:per_page]) unless options[:limit] == false + result = result.visible if options[:visible] + result = result.where.not(topics: { id: options[:except_topic_ids] }).references(:topics) if options[:except_topic_ids] + + if options[:page] + offset = options[:page].to_i * options[:per_page] + result = result.offset(offset) if offset > 0 + end + + if options[:topic_ids] + result = result.where('topics.id in (?)', options[:topic_ids]).references(:topics) + end + + if search = options[:search] + result = result.where("topics.id in (select pp.topic_id from post_search_data pd join posts pp on pp.id = pd.post_id where pd.search_data @@ #{Search.ts_query(term: search.to_s)})") + end + + # NOTE protect against SYM attack can be removed with Ruby 2.2 + # + state = options[:state] + if @user && state && + TopicUser.notification_levels.keys.map(&:to_s).include?(state) + level = TopicUser.notification_levels[state.to_sym] + result = result.where('topics.id IN ( + SELECT topic_id + FROM topic_users + WHERE user_id = ? AND + notification_level = ?)', @user.id, level) + end + + require_deleted_clause = true + + if before = options[:before] + if (before = before.to_i) > 0 + result = result.where('topics.created_at < ?', before.to_i.days.ago) + end + end + + if bumped_before = options[:bumped_before] + if (bumped_before = bumped_before.to_i) > 0 + result = result.where('topics.bumped_at < ?', bumped_before.to_i.days.ago) + end + end + + if status = options[:status] + case status + when 'open' + result = result.where('NOT topics.closed AND NOT topics.archived') + when 'closed' + result = result.where('topics.closed') + when 'archived' + result = result.where('topics.archived') + when 'listed' + result = result.where('topics.visible') + when 'unlisted' + result = result.where('NOT topics.visible') + when 'deleted' + guardian = @guardian + if guardian.is_staff? + result = result.where('topics.deleted_at IS NOT NULL') + require_deleted_clause = false + end + end + end + + if (filter = options[:filter]) && @user + action = + if filter == "bookmarked" + PostActionType.types[:bookmark] + elsif filter == "liked" + PostActionType.types[:like] + end + if action + result = result.where('topics.id IN (SELECT pp.topic_id + FROM post_actions pa + JOIN posts pp ON pp.id = pa.post_id + WHERE pa.user_id = :user_id AND + pa.post_action_type_id = :action AND + pa.deleted_at IS NULL + )', user_id: @user.id, + action: action + ) + end + end + + result = result.where('topics.deleted_at IS NULL') if require_deleted_clause + result = result.where('topics.posts_count <= ?', options[:max_posts]) if options[:max_posts].present? + result = result.where('topics.posts_count >= ?', options[:min_posts]) if options[:min_posts].present? + + result = TopicQuery.apply_custom_filters(result, self) + + @guardian.filter_allowed_categories(result) + end + + def remove_muted_topics(list, user) + if user + list = list.where('COALESCE(tu.notification_level,1) > :muted', muted: TopicUser.notification_levels[:muted]) + end + + list + end + def remove_muted_categories(list, user, opts = nil) + category_id = get_category_id(opts[:exclude]) if opts + + if user + list = list.references("cu") + .where(" + NOT EXISTS ( + SELECT 1 + FROM category_users cu + WHERE cu.user_id = :user_id + AND cu.category_id = topics.category_id + AND cu.notification_level = :muted + AND cu.category_id <> :category_id + AND (tu.notification_level IS NULL OR tu.notification_level < :tracking) + )", user_id: user.id, + muted: CategoryUser.notification_levels[:muted], + tracking: TopicUser.notification_levels[:tracking], + category_id: category_id || -1) + end + + list + end + def remove_muted_tags(list, user, opts = nil) + if user.nil? || !SiteSetting.tagging_enabled || !SiteSetting.remove_muted_tags_from_latest list - end - def remove_muted_categories(list, user, opts = nil) - category_id = get_category_id(opts[:exclude]) if opts - - if user - list = list.references("cu") - .where(" - NOT EXISTS ( - SELECT 1 - FROM category_users cu - WHERE cu.user_id = :user_id - AND cu.category_id = topics.category_id - AND cu.notification_level = :muted - AND cu.category_id <> :category_id - AND (tu.notification_level IS NULL OR tu.notification_level < :tracking) - )", user_id: user.id, - muted: CategoryUser.notification_levels[:muted], - tracking: TopicUser.notification_levels[:tracking], - category_id: category_id || -1) - end - - list - end - def remove_muted_tags(list, user, opts = nil) - if user.nil? || !SiteSetting.tagging_enabled || !SiteSetting.remove_muted_tags_from_latest + else + if !TagUser.lookup(user, :muted).exists? list else - if !TagUser.lookup(user, :muted).exists? - list + showing_tag = if opts[:filter] + f = opts[:filter].split('/') + f[0] == 'tags' ? f[1] : nil else - showing_tag = if opts[:filter] - f = opts[:filter].split('/') - f[0] == 'tags' ? f[1] : nil - else - nil - end + nil + end - if TagUser.lookup(user, :muted).joins(:tag).where('tags.name = ?', showing_tag).exists? - list # if viewing the topic list for a muted tag, show all the topics - else - muted_tag_ids = TagUser.lookup(user, :muted).pluck(:tag_id) - list = list.where(" - EXISTS ( - SELECT 1 - FROM topic_tags tt - WHERE tt.tag_id NOT IN (:tag_ids) - AND tt.topic_id = topics.id - ) OR NOT EXISTS (SELECT 1 FROM topic_tags tt WHERE tt.topic_id = topics.id)", tag_ids: muted_tag_ids) - end + if TagUser.lookup(user, :muted).joins(:tag).where('tags.name = ?', showing_tag).exists? + list # if viewing the topic list for a muted tag, show all the topics + else + muted_tag_ids = TagUser.lookup(user, :muted).pluck(:tag_id) + list = list.where(" + EXISTS ( + SELECT 1 + FROM topic_tags tt + WHERE tt.tag_id NOT IN (:tag_ids) + AND tt.topic_id = topics.id + ) OR NOT EXISTS (SELECT 1 FROM topic_tags tt WHERE tt.topic_id = topics.id)", tag_ids: muted_tag_ids) end end end + end - def new_messages(params) - TopicQuery.new_filter(messages_for_groups_or_user(params[:my_group_ids]), Time.at(SiteSetting.min_new_topics_time).to_datetime) - .limit(params[:count]) - end + def new_messages(params) + TopicQuery.new_filter(messages_for_groups_or_user(params[:my_group_ids]), Time.at(SiteSetting.min_new_topics_time).to_datetime) + .limit(params[:count]) + end - def unread_messages(params) - TopicQuery.unread_filter( - messages_for_groups_or_user(params[:my_group_ids]), - @user&.id, - staff: @user&.staff?) - .limit(params[:count]) - end + def unread_messages(params) + TopicQuery.unread_filter( + messages_for_groups_or_user(params[:my_group_ids]), + @user&.id, + staff: @user&.staff?) + .limit(params[:count]) + end - def related_messages_user(params) - messages = messages_for_user.limit(params[:count]) - messages = allowed_messages(messages, params) - end + def related_messages_user(params) + messages = messages_for_user.limit(params[:count]) + messages = allowed_messages(messages, params) + end - def related_messages_group(params) - messages = messages_for_groups_or_user(params[:my_group_ids]).limit(params[:count]) - messages = allowed_messages(messages, params) - end + def related_messages_group(params) + messages = messages_for_groups_or_user(params[:my_group_ids]).limit(params[:count]) + messages = allowed_messages(messages, params) + end - def allowed_messages(messages, params) - user_ids = (params[:target_user_ids] || []) - group_ids = ((params[:target_group_ids] - params[:my_group_ids]) || []) - - if user_ids.present? - messages = - messages.joins(" - LEFT JOIN topic_allowed_users ta2 - ON topics.id = ta2.topic_id - AND ta2.user_id IN (#{sanitize_sql_array(user_ids)}) - ") - end - - if group_ids.present? - messages = - messages.joins(" - LEFT JOIN topic_allowed_groups tg2 - ON topics.id = tg2.topic_id - AND tg2.group_id IN (#{sanitize_sql_array(group_ids)}) - ") - end + def allowed_messages(messages, params) + user_ids = (params[:target_user_ids] || []) + group_ids = ((params[:target_group_ids] - params[:my_group_ids]) || []) + if user_ids.present? messages = - if user_ids.present? && group_ids.present? - messages.where("ta2.topic_id IS NOT NULL OR tg2.topic_id IS NOT NULL") - elsif user_ids.present? - messages.where("ta2.topic_id IS NOT NULL") - elsif group_ids.present? - messages.where("tg2.topic_id IS NOT NULL") - end + messages.joins(" + LEFT JOIN topic_allowed_users ta2 + ON topics.id = ta2.topic_id + AND ta2.user_id IN (#{sanitize_sql_array(user_ids)}) + ") end - def messages_for_groups_or_user(group_ids) - if group_ids.present? - base_messages - .joins(" - LEFT JOIN ( - SELECT * FROM topic_allowed_groups _tg - LEFT JOIN group_users gu - ON gu.user_id = #{@user.id.to_i} - AND gu.group_id = _tg.group_id - WHERE gu.group_id IN (#{sanitize_sql_array(group_ids)}) - ) tg ON topics.id = tg.topic_id - ") - .where("tg.topic_id IS NOT NULL") - else - messages_for_user + if group_ids.present? + messages = + messages.joins(" + LEFT JOIN topic_allowed_groups tg2 + ON topics.id = tg2.topic_id + AND tg2.group_id IN (#{sanitize_sql_array(group_ids)}) + ") + end + + messages = + if user_ids.present? && group_ids.present? + messages.where("ta2.topic_id IS NOT NULL OR tg2.topic_id IS NOT NULL") + elsif user_ids.present? + messages.where("ta2.topic_id IS NOT NULL") + elsif group_ids.present? + messages.where("tg2.topic_id IS NOT NULL") end - end + end - def messages_for_user + def messages_for_groups_or_user(group_ids) + if group_ids.present? base_messages .joins(" - LEFT JOIN topic_allowed_users ta - ON topics.id = ta.topic_id - AND ta.user_id = #{@user.id.to_i} + LEFT JOIN ( + SELECT * FROM topic_allowed_groups _tg + LEFT JOIN group_users gu + ON gu.user_id = #{@user.id.to_i} + AND gu.group_id = _tg.group_id + WHERE gu.group_id IN (#{sanitize_sql_array(group_ids)}) + ) tg ON topics.id = tg.topic_id ") - .where("ta.topic_id IS NOT NULL") + .where("tg.topic_id IS NOT NULL") + else + messages_for_user + end + end + + def messages_for_user + base_messages + .joins(" + LEFT JOIN topic_allowed_users ta + ON topics.id = ta.topic_id + AND ta.user_id = #{@user.id.to_i} + ") + .where("ta.topic_id IS NOT NULL") + end + + def base_messages + query = Topic + .where('topics.archetype = ?', Archetype.private_message) + .joins("LEFT JOIN topic_users tu ON topics.id = tu.topic_id AND tu.user_id = #{@user.id.to_i}") + + query = query.includes(:tags) if SiteSetting.tagging_enabled + query.order('topics.bumped_at DESC') + end + + def random_suggested(topic, count, excluded_topic_ids = []) + result = default_results(unordered: true, per_page: count).where(closed: false, archived: false) + + if SiteSetting.limit_suggested_to_category + excluded_topic_ids += Category.where(id: topic.category_id).pluck(:id) + else + excluded_topic_ids += Category.topic_ids.to_a + end + result = result.where("topics.id NOT IN (?)", excluded_topic_ids) unless excluded_topic_ids.empty? + + result = remove_muted_categories(result, @user) + + # If we are in a category, prefer it for the random results + if topic.category_id + result = result.order("CASE WHEN topics.category_id = #{topic.category_id.to_i} THEN 0 ELSE 1 END") end - def base_messages - query = Topic - .where('topics.archetype = ?', Archetype.private_message) - .joins("LEFT JOIN topic_users tu ON topics.id = tu.topic_id AND tu.user_id = #{@user.id.to_i}") + # Best effort, it over selects, however if you have a high number + # of muted categories there is tiny chance we will not select enough + # in particular this can happen if current category is empty and tons + # of muted, big edge case + # + # we over select in case cache is stale + max = (count * 1.3).to_i + ids = SiteSetting.limit_suggested_to_category ? [] : RandomTopicSelector.next(max) + ids.concat(RandomTopicSelector.next(max, topic.category)) - query = query.includes(:tags) if SiteSetting.tagging_enabled - query.order('topics.bumped_at DESC') + result.where(id: ids.uniq) + end + + def suggested_ordering(result, options) + # Prefer unread in the same category + if options[:topic] && options[:topic].category_id + result = result.order("CASE WHEN topics.category_id = #{options[:topic].category_id.to_i} THEN 0 ELSE 1 END") end - def random_suggested(topic, count, excluded_topic_ids = []) - result = default_results(unordered: true, per_page: count).where(closed: false, archived: false) - - if SiteSetting.limit_suggested_to_category - excluded_topic_ids += Category.where(id: topic.category_id).pluck(:id) - else - excluded_topic_ids += Category.topic_ids.to_a - end - result = result.where("topics.id NOT IN (?)", excluded_topic_ids) unless excluded_topic_ids.empty? - - result = remove_muted_categories(result, @user) - - # If we are in a category, prefer it for the random results - if topic.category_id - result = result.order("CASE WHEN topics.category_id = #{topic.category_id.to_i} THEN 0 ELSE 1 END") - end - - # Best effort, it over selects, however if you have a high number - # of muted categories there is tiny chance we will not select enough - # in particular this can happen if current category is empty and tons - # of muted, big edge case - # - # we over select in case cache is stale - max = (count * 1.3).to_i - ids = SiteSetting.limit_suggested_to_category ? [] : RandomTopicSelector.next(max) - ids.concat(RandomTopicSelector.next(max, topic.category)) - - result.where(id: ids.uniq) - end - - def suggested_ordering(result, options) - # Prefer unread in the same category - if options[:topic] && options[:topic].category_id - result = result.order("CASE WHEN topics.category_id = #{options[:topic].category_id.to_i} THEN 0 ELSE 1 END") - end - - result.order('topics.bumped_at DESC') - end + result.order('topics.bumped_at DESC') + end private - def sanitize_sql_array(input) - ActiveRecord::Base.send(:sanitize_sql_array, input.join(',')) - end + def sanitize_sql_array(input) + ActiveRecord::Base.send(:sanitize_sql_array, input.join(',')) + end end diff --git a/lib/topic_query_sql.rb b/lib/topic_query_sql.rb index 2f9bbe5993..93a2b9a862 100644 --- a/lib/topic_query_sql.rb +++ b/lib/topic_query_sql.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # # SQL fragments used when querying a list of topics. # @@ -10,12 +11,12 @@ module TopicQuerySQL end def order_by_category_sql(dir) - "CASE WHEN categories.id = #{SiteSetting.uncategorized_category_id.to_i} THEN '' ELSE categories.name END #{dir}" + -"CASE WHEN categories.id = #{SiteSetting.uncategorized_category_id.to_i} THEN '' ELSE categories.name END #{dir}" end # If you've clearned the pin, use bumped_at, otherwise put it at the top def order_with_pinned_sql - "CASE + -"CASE WHEN (COALESCE(topics.pinned_at, '#{lowest_date}') > COALESCE(tu.cleared_pinned_at, '#{lowest_date}')) THEN topics.pinned_at + interval '9999 years' ELSE topics.bumped_at @@ -24,7 +25,7 @@ module TopicQuerySQL # If you've clearned the pin, use bumped_at, otherwise put it at the top def order_nocategory_with_pinned_sql - "CASE + -"CASE WHEN topics.pinned_globally AND (COALESCE(topics.pinned_at, '#{lowest_date}') > COALESCE(tu.cleared_pinned_at, '#{lowest_date}')) THEN topics.pinned_at + interval '9999 years' @@ -41,18 +42,18 @@ module TopicQuerySQL end def order_top_for(score) - "COALESCE(top_topics.#{score}, 0) DESC, topics.bumped_at DESC" + -"COALESCE(top_topics.#{score}, 0) DESC, topics.bumped_at DESC" end def order_top_with_pinned_category_for(score) # display pinned topics first - "CASE WHEN (COALESCE(topics.pinned_at, '#{lowest_date}') > COALESCE(tu.cleared_pinned_at, '#{lowest_date}')) THEN 0 ELSE 1 END, + -"CASE WHEN (COALESCE(topics.pinned_at, '#{lowest_date}') > COALESCE(tu.cleared_pinned_at, '#{lowest_date}')) THEN 0 ELSE 1 END, top_topics.#{score} DESC, topics.bumped_at DESC" end def order_top_with_notification_levels(score) - "COALESCE(topic_users.notification_level, 1) DESC, COALESCE(category_users.notification_level, 1) DESC, COALESCE(top_topics.#{score}, 0) DESC, topics.bumped_at DESC" + -"COALESCE(topic_users.notification_level, 1) DESC, COALESCE(category_users.notification_level, 1) DESC, COALESCE(top_topics.#{score}, 0) DESC, topics.bumped_at DESC" end end diff --git a/lib/topic_retriever.rb b/lib/topic_retriever.rb index 82f815d9f7..1addac713f 100644 --- a/lib/topic_retriever.rb +++ b/lib/topic_retriever.rb @@ -12,48 +12,48 @@ class TopicRetriever private - def invalid_url? - !EmbeddableHost.url_allowed?(@embed_url) + def invalid_url? + !EmbeddableHost.url_allowed?(@embed_url) + end + + def retrieved_recently? + # We can disable the throttle for some users, such as staff + return false if @opts[:no_throttle] + + # Throttle other users to once every 60 seconds + retrieved_key = "retrieved_topic" + if $redis.setnx(retrieved_key, "1") + $redis.expire(retrieved_key, 60) + return false end - def retrieved_recently? - # We can disable the throttle for some users, such as staff - return false if @opts[:no_throttle] + true + end - # Throttle other users to once every 60 seconds - retrieved_key = "retrieved_topic" - if $redis.setnx(retrieved_key, "1") - $redis.expire(retrieved_key, 60) - return false - end + def perform_retrieve + # It's possible another process or job found the embed already. So if that happened bail out. + return if TopicEmbed.where(embed_url: @embed_url).exists? - true - end - - def perform_retrieve - # It's possible another process or job found the embed already. So if that happened bail out. + # First check RSS if that is enabled + if SiteSetting.feed_polling_enabled? + Jobs::PollFeed.new.execute({}) return if TopicEmbed.where(embed_url: @embed_url).exists? - - # First check RSS if that is enabled - if SiteSetting.feed_polling_enabled? - Jobs::PollFeed.new.execute({}) - return if TopicEmbed.where(embed_url: @embed_url).exists? - end - - fetch_http end - def fetch_http - if @author_username.nil? - username = SiteSetting.embed_by_username.downcase - else - username = @author_username - end + fetch_http + end - user = User.where(username_lower: username.downcase).first - return if user.blank? - - TopicEmbed.import_remote(user, @embed_url) + def fetch_http + if @author_username.nil? + username = SiteSetting.embed_by_username.downcase + else + username = @author_username end + user = User.where(username_lower: username.downcase).first + return if user.blank? + + TopicEmbed.import_remote(user, @embed_url) + end + end diff --git a/lib/topic_view.rb b/lib/topic_view.rb index d2bf87de10..710ca9ddf1 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -4,6 +4,7 @@ require_dependency 'filter_best_posts' require_dependency 'gaps' class TopicView + MEGA_TOPIC_POSTS_COUNT = 10000 attr_reader :topic, :posts, :guardian, :filtered_posts, :chunk_size, :print, :message_bus_last_id attr_accessor :draft, :draft_key, :draft_sequence, :user_custom_fields, :post_custom_fields, :post_number @@ -70,7 +71,7 @@ class TopicView filter_posts(options) - if @posts + if @posts && !@skip_custom_fields if (added_fields = User.whitelisted_user_custom_fields(@guardian)).present? @user_custom_fields = User.custom_fields_for_ids(@posts.pluck(:user_id), added_fields) end @@ -103,7 +104,14 @@ class TopicView def gaps return unless @contains_gaps - Gaps.new(filtered_post_ids, unfiltered_posts.order(:sort_order).pluck(:id)) + + @gaps ||= begin + if is_mega_topic? + nil + else + Gaps.new(filtered_post_ids, unfiltered_posts.order(:sort_order).pluck(:id)) + end + end end def last_post @@ -136,7 +144,7 @@ class TopicView end def absolute_url - "#{Discourse.base_url}#{relative_url}" + "#{Discourse.base_url_no_prefix}#{relative_url}" end def relative_url @@ -185,6 +193,15 @@ class TopicView @topic.like_count end + def published_time + return nil if desired_post.blank? + if desired_post.wiki && desired_post.post_number == 1 && desired_post.revisions.size > 0 + desired_post.revisions.last.updated_at.strftime('%FT%T%:z') + else + desired_post.created_at.strftime('%FT%T%:z') + end + end + def image_url if @post_number > 1 && @desired_post.present? if @desired_post.image_url.present? @@ -201,6 +218,11 @@ class TopicView def filter_posts(opts = {}) return filter_posts_near(opts[:post_number].to_i) if opts[:post_number].present? return filter_posts_by_ids(opts[:post_ids]) if opts[:post_ids].present? + + if opts[:filter_post_number].present? + return filter_posts_by_post_number(opts[:filter_post_number], opts[:asc]) + end + return filter_best(opts[:best], opts) if opts[:best].present? filter_posts_paged(@page) @@ -233,8 +255,29 @@ class TopicView # Filter to all posts near a particular post number def filter_posts_near(post_number) - min_idx, max_idx = get_minmax_ids(post_number) - filter_posts_in_range(min_idx, max_idx) + posts_before = (@limit.to_f / 4).floor + posts_before = 1 if posts_before.zero? + sort_order = get_sort_order(post_number) + + before_post_ids = @filtered_posts.order(sort_order: :desc) + .where("posts.sort_order < ?", sort_order) + .limit(posts_before) + .pluck(:id) + + post_ids = before_post_ids + @filtered_posts.order(sort_order: :asc) + .where("posts.sort_order >= ?", sort_order) + .limit(@limit - before_post_ids.length) + .pluck(:id) + + if post_ids.length < @limit + post_ids = post_ids + @filtered_posts.order(sort_order: :desc) + .where("posts.sort_order < ?", sort_order) + .offset(before_post_ids.length) + .limit(@limit - post_ids.length) + .pluck(:id) + end + + filter_posts_by_ids(post_ids) end def filter_posts_paged(page) @@ -244,9 +287,12 @@ class TopicView # Sometimes we don't care about the OP, for example when embedding comments min = 1 if min == 0 && @exclude_first - max = (min + @limit) - 1 - - filter_posts_in_range(min, max) + @posts = filter_posts_by_ids( + @filtered_posts.order(:sort_order) + .offset(min) + .limit(@limit) + .pluck(:id) + ) end def filter_best(max, opts = {}) @@ -278,35 +324,48 @@ class TopicView def post_counts_by_user @post_counts_by_user ||= begin - post_ids = unfiltered_post_ids + if is_mega_topic? + {} + else + post_ids = unfiltered_post_ids - return {} if post_ids.blank? + return {} if post_ids.blank? - sql = <<~SQL - SELECT user_id, count(*) AS count_all - FROM posts - WHERE id IN (:post_ids) - AND user_id IS NOT NULL - GROUP BY user_id - ORDER BY count_all DESC - LIMIT #{MAX_PARTICIPANTS} - SQL + sql = <<~SQL + SELECT user_id, count(*) AS count_all + FROM posts + WHERE id in (:post_ids) + AND user_id IS NOT NULL + GROUP BY user_id + ORDER BY count_all DESC + LIMIT #{MAX_PARTICIPANTS} + SQL - Hash[Post.exec_sql(sql, post_ids: post_ids).values] + Hash[*DB.query_single(sql, post_ids: post_ids)] + end end end + # if a topic has more that N posts no longer attempt to + # get accurate participant count, instead grab cached count + # from topic + MAX_POSTS_COUNT_PARTICIPANTS = 500 + def participant_count @participant_count ||= begin if participants.size == MAX_PARTICIPANTS - sql = <<~SQL - SELECT COUNT(DISTINCT user_id) - FROM posts - WHERE id IN (:post_ids) - AND user_id IS NOT NULL - SQL - Post.exec_sql(sql, post_ids: unfiltered_post_ids).getvalue(0, 0).to_i + if @topic.posts_count > MAX_POSTS_COUNT_PARTICIPANTS + @topic.participant_count + else + sql = <<~SQL + SELECT COUNT(DISTINCT user_id) + FROM posts + WHERE id IN (:post_ids) + AND user_id IS NOT NULL + SQL + DB.query_single(sql, post_ids: unfiltered_post_ids).first.to_i + end else participants.size end @@ -360,16 +419,31 @@ class TopicView @filtered_posts.by_newest.with_user.first(25) end - # Returns an array of [id, post_number, days_ago] tuples. + # Returns an array of [id, days_ago] tuples. # `days_ago` is there for the timeline calculations. def filtered_post_stream - @filtered_post_stream ||= @filtered_posts - .order(:sort_order) - .pluck(:id, :post_number, 'EXTRACT(DAYS FROM CURRENT_TIMESTAMP - created_at)::INT AS days_ago') + @filtered_post_stream ||= begin + posts = @filtered_posts + .order(:sort_order) + + columns = [:id] + + if !is_mega_topic? + columns << 'EXTRACT(DAYS FROM CURRENT_TIMESTAMP - created_at)::INT AS days_ago' + end + + posts.pluck(*columns) + end end def filtered_post_ids - @filtered_post_ids ||= filtered_post_stream.map { |tuple| tuple[0] } + @filtered_post_ids ||= filtered_post_stream.map do |tuple| + if is_mega_topic? + tuple + else + tuple[0] + end + end end def unfiltered_post_ids @@ -383,6 +457,22 @@ class TopicView end end + def filtered_post_id(post_number) + @filtered_posts.where(post_number: post_number).pluck(:id).first + end + + def is_mega_topic? + @is_mega_topic ||= (@topic.posts_count >= MEGA_TOPIC_POSTS_COUNT) + end + + def first_post_id + @filtered_posts.order(sort_order: :asc).limit(1).pluck(:id).first + end + + def last_post_id + @filtered_posts.order(sort_order: :desc).limit(1).pluck(:id).first + end + protected def read_posts_set @@ -403,6 +493,32 @@ class TopicView private + def get_sort_order(post_number) + sql = <<~SQL + SELECT posts.sort_order + FROM posts + WHERE posts.post_number = #{post_number.to_i} + AND posts.topic_id = #{@topic.id.to_i} + LIMIT 1 + SQL + + sort_order = DB.query_single(sql).first + + if !sort_order + sql = <<~SQL + SELECT posts.sort_order + FROM posts + WHERE posts.topic_id = #{@topic.id.to_i} + ORDER BY @(post_number - #{post_number.to_i}) + LIMIT 1 + SQL + + sort_order = DB.query_single(sql).first + end + + sort_order + end + def filter_post_types(posts) visible_types = Topic.visible_post_types(@user) @@ -413,6 +529,26 @@ class TopicView end end + def filter_posts_by_post_number(post_number, asc) + sort_order = get_sort_order(post_number) + + posts = + if asc + @filtered_posts + .where("sort_order > ?", sort_order) + .order(sort_order: :asc) + else + @filtered_posts + .where("sort_order < ?", sort_order) + .order(sort_order: :desc) + end + + posts = posts.limit(@limit) if !@skip_limit + filter_posts_by_ids(posts.pluck(:id)) + + @posts = @posts.unscope(:order).order(sort_order: :desc) if !asc + end + def filter_posts_by_ids(post_ids) # TODO: Sort might be off @posts = Post.where(id: post_ids, topic_id: @topic.id) @@ -423,19 +559,6 @@ class TopicView @posts end - def filter_posts_in_range(min, max) - post_count = (filtered_post_ids.length - 1) - - max = [max, post_count].min - - return @posts = Post.none if min > max - - min = [[min, max].min, 0].max - - @posts = filter_posts_by_ids(filtered_post_ids[min..max]) - @posts - end - def find_topic(topic_or_topic_id) if topic_or_topic_id.is_a?(Topic) topic_or_topic_id @@ -473,7 +596,12 @@ class TopicView # Username filters if @username_filters.present? usernames = @username_filters.map { |u| u.downcase } - @filtered_posts = @filtered_posts.where('post_number = 1 OR posts.user_id IN (SELECT u.id FROM users u WHERE username_lower IN (?))', usernames) + + @filtered_posts = @filtered_posts.where(' + posts.post_number = 1 + OR posts.user_id IN (SELECT u.id FROM users u WHERE u.username_lower IN (?)) + ', usernames) + @contains_gaps = true end @@ -481,8 +609,12 @@ class TopicView # This should be last - don't want to tell the admin about deleted posts that clicking the button won't show # copy the filter for has_deleted? method @predelete_filtered_posts = @filtered_posts.spawn + if @guardian.can_see_deleted_posts? && !@show_deleted && has_deleted? - @filtered_posts = @filtered_posts.where("deleted_at IS NULL OR post_number = 1") + @filtered_posts = @filtered_posts.where( + "posts.deleted_at IS NULL OR posts.post_number = 1" + ) + @contains_gaps = true end @@ -504,45 +636,4 @@ class TopicView end end end - - def get_minmax_ids(post_number) - # Find the closest number we have - closest_index = closest_post_to(post_number) - return nil if closest_index.nil? - - # Make sure to get at least one post before, even with rounding - posts_before = (@limit.to_f / 4).floor - posts_before = 1 if posts_before.zero? - - min_idx = closest_index - posts_before - min_idx = 0 if min_idx < 0 - max_idx = min_idx + (@limit - 1) - - # Get a full page even if at the end - ensure_full_page(min_idx, max_idx) - end - - def ensure_full_page(min, max) - upper_limit = (filtered_post_ids.length - 1) - if max >= upper_limit - return (upper_limit - @limit) + 1, upper_limit - else - return min, max - end - end - - def closest_post_to(post_number) - # happy path - closest_post = @filtered_posts.where("post_number = ?", post_number).limit(1).pluck(:id) - - if closest_post.empty? - # less happy path, missing post - closest_post = @filtered_posts.order("@(post_number - #{post_number})").limit(1).pluck(:id) - end - - return nil if closest_post.empty? - - filtered_post_ids.index(closest_post.first) || filtered_post_ids[0] - end - end diff --git a/lib/topics_bulk_action.rb b/lib/topics_bulk_action.rb index 2d16fb5c21..4b2618710d 100644 --- a/lib/topics_bulk_action.rb +++ b/lib/topics_bulk_action.rb @@ -27,156 +27,157 @@ class TopicsBulkAction private - def find_group - return unless @options[:group] + def find_group + return unless @options[:group] - group = Group.where('name ilike ?', @options[:group]).first - raise Discourse::InvalidParameters.new(:group) unless group - unless group.group_users.where(user_id: @user.id).exists? - raise Discourse::InvalidParameters.new(:group) - end - group + group = Group.where('name ilike ?', @options[:group]).first + raise Discourse::InvalidParameters.new(:group) unless group + unless group.group_users.where(user_id: @user.id).exists? + raise Discourse::InvalidParameters.new(:group) end + group + end - def move_messages_to_inbox - group = find_group - topics.each do |t| - if guardian.can_see?(t) && t.private_message? - if group - GroupArchivedMessage.move_to_inbox!(group.id, t) - else - UserArchivedMessage.move_to_inbox!(@user.id, t) - end + def move_messages_to_inbox + group = find_group + topics.each do |t| + if guardian.can_see?(t) && t.private_message? + if group + GroupArchivedMessage.move_to_inbox!(group.id, t) + else + UserArchivedMessage.move_to_inbox!(@user.id, t) end end end + end - def archive_messages - group = find_group - topics.each do |t| - if guardian.can_see?(t) && t.private_message? - if group - GroupArchivedMessage.archive!(group.id, t) - else - UserArchivedMessage.archive!(@user.id, t) - end + def archive_messages + group = find_group + topics.each do |t| + if guardian.can_see?(t) && t.private_message? + if group + GroupArchivedMessage.archive!(group.id, t) + else + UserArchivedMessage.archive!(@user.id, t) end end end + end - def dismiss_posts - sql = " - UPDATE topic_users tu - SET highest_seen_post_number = t.highest_post_number , last_read_post_number = highest_post_number - FROM topics t - WHERE t.id = tu.topic_id AND tu.user_id = :user_id AND t.id IN (:topic_ids) - " + def dismiss_posts + sql = " + UPDATE topic_users tu + SET highest_seen_post_number = t.highest_post_number , last_read_post_number = highest_post_number + FROM topics t + WHERE t.id = tu.topic_id AND tu.user_id = :user_id AND t.id IN (:topic_ids) + " - Topic.exec_sql(sql, user_id: @user.id, topic_ids: @topic_ids) - @changed_ids.concat @topic_ids - end + DB.exec(sql, user_id: @user.id, topic_ids: @topic_ids) + @changed_ids.concat @topic_ids + end - def reset_read - PostTiming.destroy_for(@user.id, @topic_ids) - end + def reset_read + PostTiming.destroy_for(@user.id, @topic_ids) + end - def change_category - topics.each do |t| - if guardian.can_edit?(t) - @changed_ids << t.id if t.change_category_to_id(@operation[:category_id]) - end + def change_category + topics.each do |t| + if guardian.can_edit?(t) + @changed_ids << t.id if t.change_category_to_id(@operation[:category_id]) end end + end - def change_notification_level - topics.each do |t| - if guardian.can_see?(t) - TopicUser.change(@user, t.id, notification_level: @operation[:notification_level_id].to_i) - @changed_ids << t.id - end - end - end - - def close - topics.each do |t| - if guardian.can_moderate?(t) - t.update_status('closed', true, @user) - @changed_ids << t.id - end - end - end - - def unlist - topics.each do |t| - if guardian.can_moderate?(t) - t.update_status('visible', false, @user) - @changed_ids << t.id - end - end - end - - def relist - topics.each do |t| - if guardian.can_moderate?(t) - t.update_status('visible', true, @user) - @changed_ids << t.id - end - end - end - - def archive - topics.each do |t| - if guardian.can_moderate?(t) - t.update_status('archived', true, @user) - @changed_ids << t.id - end - end - end - - def delete - topics.each do |t| - if guardian.can_delete?(t) - PostDestroyer.new(@user, t.ordered_posts.first).destroy - end - end - end - - def change_tags - tags = @operation[:tags] - tags = DiscourseTagging.tags_for_saving(tags, guardian) if tags.present? - - topics.each do |t| - if guardian.can_edit?(t) - if tags.present? - DiscourseTagging.tag_topic_by_names(t, guardian, tags) - else - t.tags = [] - end - @changed_ids << t.id - end - end - end - - def append_tags - tags = @operation[:tags] - tags = DiscourseTagging.tags_for_saving(tags, guardian) if tags.present? - - topics.each do |t| - if guardian.can_edit?(t) - if tags.present? - DiscourseTagging.tag_topic_by_names(t, guardian, tags, append: true) - end + def change_notification_level + topics.each do |t| + if guardian.can_see?(t) + TopicUser.change(@user, t.id, notification_level: @operation[:notification_level_id].to_i) @changed_ids << t.id - end end end + end - def guardian - @guardian ||= Guardian.new(@user) + def close + topics.each do |t| + if guardian.can_moderate?(t) + t.update_status('closed', true, @user) + @changed_ids << t.id + end end + end - def topics - @topics ||= Topic.where(id: @topic_ids) + def unlist + topics.each do |t| + if guardian.can_moderate?(t) + t.update_status('visible', false, @user) + @changed_ids << t.id + end end + end + + def relist + topics.each do |t| + if guardian.can_moderate?(t) + t.update_status('visible', true, @user) + @changed_ids << t.id + end + end + end + + def archive + topics.each do |t| + if guardian.can_moderate?(t) + t.update_status('archived', true, @user) + @changed_ids << t.id + end + end + end + + def delete + topics.each do |t| + if guardian.can_delete?(t) + post = t.ordered_posts.first + PostDestroyer.new(@user, post).destroy if post + end + end + end + + def change_tags + tags = @operation[:tags] + tags = DiscourseTagging.tags_for_saving(tags, guardian) if tags.present? + + topics.each do |t| + if guardian.can_edit?(t) + if tags.present? + DiscourseTagging.tag_topic_by_names(t, guardian, tags) + else + t.tags = [] + end + @changed_ids << t.id + end + end + end + + def append_tags + tags = @operation[:tags] + tags = DiscourseTagging.tags_for_saving(tags, guardian) if tags.present? + + topics.each do |t| + if guardian.can_edit?(t) + if tags.present? + DiscourseTagging.tag_topic_by_names(t, guardian, tags, append: true) + end + @changed_ids << t.id + end + end + end + + def guardian + @guardian ||= Guardian.new(@user) + end + + def topics + @topics ||= Topic.where(id: @topic_ids) + end end diff --git a/lib/twitter_api.rb b/lib/twitter_api.rb index 96c3e96bae..d71d845888 100644 --- a/lib/twitter_api.rb +++ b/lib/twitter_api.rb @@ -2,6 +2,7 @@ class TwitterApi class << self + include ActionView::Helpers::NumberHelper def prettify_tweet(tweet) text = tweet["full_text"].dup @@ -23,7 +24,7 @@ class TwitterApi end elsif m['type'] == 'video' if large = m['sizes']['large'] - result << "
" + result << "
" end end end @@ -32,6 +33,10 @@ class TwitterApi result end + def prettify_number(count) + number_to_human(count, format: '%n%u', precision: 2, units: { thousand: 'K', million: 'M', billion: 'B' }) + end + def user_timeline(screen_name) JSON.parse(twitter_get(user_timeline_uri_for screen_name)) end diff --git a/lib/upload_creator.rb b/lib/upload_creator.rb index b7f3a574f2..d1b1d5f657 100644 --- a/lib/upload_creator.rb +++ b/lib/upload_creator.rb @@ -14,7 +14,6 @@ class UploadCreator # Available options # - type (string) - # - content_type (string) # - origin (string) # - for_group_message (boolean) # - for_theme (boolean) @@ -23,8 +22,8 @@ class UploadCreator # - for_export (boolean) def initialize(file, filename, opts = {}) @file = file - @filename = filename || '' - @upload = Upload.new(original_filename: filename, filesize: 0) + @filename = (filename || "").gsub(/[^[:print:]]/, "") + @upload = Upload.new(original_filename: @filename, filesize: 0) @opts = opts end @@ -35,13 +34,19 @@ class UploadCreator end DistributedMutex.synchronize("upload_#{user_id}_#{@filename}") do - if FileHelper.is_image?(@filename) + # test for image regardless of input + @image_info = FastImage.new(@file) rescue nil + + is_image = FileHelper.is_image?(@filename) + is_image ||= @image_info && FileHelper.is_image?("test.#{@image_info.type}") + + if is_image extract_image_info! return @upload if @upload.errors.present? if @filename[/\.svg$/i] whitelist_svg! - elsif !Rails.env.test? + elsif !Rails.env.test? || @opts[:force_optimize] convert_to_jpeg! if should_convert_to_jpeg? downsize! if should_downsize? fix_orientation! if should_fix_orientation? @@ -51,6 +56,9 @@ class UploadCreator crop! if should_crop? optimize! if should_optimize? end + + # conversion may have switched the type + image_type = @image_info.type.to_s end # compute the sha of the file @@ -68,18 +76,38 @@ class UploadCreator # return the previous upload if any return @upload unless @upload.nil? + fixed_original_filename = nil + if is_image + + current_extension = File.extname(@filename).downcase.sub("jpeg", "jpg") + expected_extension = ".#{image_type}".downcase.sub("jpeg", "jpg") + + # we have to correct original filename here, no choice + # otherwise validation will fail and we can not save + # TODO decide if we only run the validation on the extension + if current_extension != expected_extension + basename = File.basename(@filename, current_extension) + + if basename.length == 0 + basename = "image" + end + fixed_original_filename = "#{basename}#{expected_extension}" + end + end + # create the upload otherwise @upload = Upload.new @upload.user_id = user_id - @upload.original_filename = @filename + @upload.original_filename = fixed_original_filename || @filename @upload.filesize = filesize @upload.sha1 = sha1 @upload.url = "" @upload.origin = @opts[:origin][0...1000] if @opts[:origin] - @upload.extension = File.extname(@filename)[1..10] + @upload.extension = image_type || File.extname(@filename)[1..10] - if FileHelper.is_image?(@filename) - @upload.width, @upload.height = ImageSizer.resize(*@image_info.size) + if is_image + @upload.thumbnail_width, @upload.thumbnail_height = ImageSizer.resize(*@image_info.size) + @upload.width, @upload.height = @image_info.size end @upload.for_private_message = true if @opts[:for_private_message] @@ -91,16 +119,16 @@ class UploadCreator # store the file and update its url File.open(@file.path) do |f| - url = Discourse.store.store_upload(f, @upload, @opts[:content_type]) + url = Discourse.store.store_upload(f, @upload) + if url.present? - @upload.url = url - @upload.save + @upload.update!(url: url) else @upload.errors.add(:url, I18n.t("upload.store_failure", upload_id: @upload.id, user_id: user_id)) end end - if @upload.errors.empty? && FileHelper.is_image?(@filename) && @opts[:type] == "avatar" + if @upload.errors.empty? && is_image && @opts[:type] == "avatar" Jobs.enqueue(:create_avatar_thumbnails, upload_id: @upload.id, user_id: user_id) end @@ -140,7 +168,7 @@ class UploadCreator OptimizedImage.ensure_safe_paths!(from, to) - from = OptimizedImage.prepend_decoder!(from) + from = OptimizedImage.prepend_decoder!(from, nil, filename: "image.#{@image_info.type}") to = OptimizedImage.prepend_decoder!(to) begin @@ -153,8 +181,6 @@ class UploadCreator # keep the JPEG if it's at least 15% smaller if File.size(jpeg_tempfile.path) < filesize * 0.85 @file = jpeg_tempfile - @filename = (File.basename(@filename, ".*").presence || I18n.t("image").presence || "image") + ".jpg" - @opts[:content_type] = "image/jpeg" extract_image_info! else jpeg_tempfile&.close @@ -185,8 +211,18 @@ class UploadCreator 3.times do original_size = filesize downsized_pixels = [pixels, max_image_pixels].min / 2 - OptimizedImage.downsize(@file.path, @file.path, "#{downsized_pixels}@", filename: @filename, allow_animation: allow_animation) + + OptimizedImage.downsize( + @file.path, + @file.path, + "#{downsized_pixels}@", + filename: @filename, + allow_animation: allow_animation, + raise_on_error: true + ) + extract_image_info! + return if filesize >= original_size || pixels == 0 || !should_downsize? end end @@ -220,7 +256,7 @@ class UploadCreator path = @file.path OptimizedImage.ensure_safe_paths!(path) - path = OptimizedImage.prepend_decoder!(path) + path = OptimizedImage.prepend_decoder!(path, nil, filename: "image.#{@image_info.type}") Discourse::Utils.execute_command('convert', path, '-auto-orient', path) @@ -234,20 +270,22 @@ class UploadCreator def crop! max_pixel_ratio = Discourse::PIXEL_RATIOS.max + filename_with_correct_ext = "image.#{@image_info.type}" + case @opts[:type] when "avatar" width = height = Discourse.avatar_sizes.max - OptimizedImage.resize(@file.path, @file.path, width, height, filename: @filename, allow_animation: allow_animation) + OptimizedImage.resize(@file.path, @file.path, width, height, filename: filename_with_correct_ext, allow_animation: allow_animation) when "profile_background" max_width = 850 * max_pixel_ratio width, height = ImageSizer.resize(@image_info.size[0], @image_info.size[1], max_width: max_width, max_height: max_width) - OptimizedImage.downsize(@file.path, @file.path, "#{width}x#{height}" + '>', filename: @filename, allow_animation: allow_animation) + OptimizedImage.downsize(@file.path, @file.path, "#{width}x#{height}\>", filename: filename_with_correct_ext, allow_animation: allow_animation) when "card_background" max_width = 590 * max_pixel_ratio width, height = ImageSizer.resize(@image_info.size[0], @image_info.size[1], max_width: max_width, max_height: max_width) - OptimizedImage.downsize(@file.path, @file.path, "#{width}x#{height}" + '>', filename: @filename, allow_animation: allow_animation) + OptimizedImage.downsize(@file.path, @file.path, "#{width}x#{height}\>", filename: filename_with_correct_ext, allow_animation: allow_animation) when "custom_emoji" - OptimizedImage.downsize(@file.path, @file.path, '100x100>', filename: @filename, allow_animation: allow_animation) + OptimizedImage.downsize(@file.path, @file.path, "100x100\>", filename: filename_with_correct_ext, allow_animation: allow_animation) end extract_image_info! @@ -267,7 +305,7 @@ class UploadCreator OptimizedImage.ensure_safe_paths!(@file.path) FileHelper.optimize_image!(@file.path) extract_image_info! - rescue ImageOptim::Worker::TimeoutExceeded + rescue ImageOptim::TimeoutExceeded Rails.logger.warn("ImageOptim timed out while optimizing #{@filename}") end diff --git a/lib/upload_fixer.rb b/lib/upload_fixer.rb new file mode 100644 index 0000000000..1bf85b0b89 --- /dev/null +++ b/lib/upload_fixer.rb @@ -0,0 +1,89 @@ +class UploadFixer + def self.fix_all_extensions + Upload.where("uploads.extension IS NOT NULL").find_each do |upload| + fix_extension_on_upload(upload) + end + end + + def self.fix_extension_on_upload(upload) + is_external = Discourse.store.external? + previous_url = upload.url.dup + + source = + if is_external + "https:#{previous_url}" + else + Discourse.store.path_for(upload) + end + + correct_extension = FastImage.type(source).to_s.downcase + current_extension = upload.extension.to_s.downcase + + if correct_extension.present? + correct_extension = 'jpg' if correct_extension == 'jpeg' + current_extension = 'jpg' if current_extension == 'jpeg' + + if correct_extension != current_extension + new_filename = change_extension( + upload.original_filename, + correct_extension + ) + + new_url = change_extension(previous_url, correct_extension) + + if is_external + new_url = "/#{new_url}" + source = Discourse.store.get_path_for_upload(upload) + destination = change_extension(source, correct_extension) + + Discourse.store.copy_file( + previous_url, + source, + destination + ) + + upload.update!( + original_filename: new_filename, + url: new_url, + extension: correct_extension + ) + + DbHelper.remap(previous_url, upload.url) + Discourse.store.remove_file(previous_url, source) + else + destination = change_extension(source, correct_extension) + FileUtils.copy(source, destination) + + upload.update!( + original_filename: new_filename, + url: new_url, + extension: correct_extension + ) + + DbHelper.remap(previous_url, upload.url) + + tombstone_path = source.sub("/uploads/", "/uploads/tombstone/") + FileUtils.mkdir_p(File.dirname(tombstone_path)) + + FileUtils.move( + source, + tombstone_path + ) + end + + end + end + rescue => e + STDERR.puts "Skipping upload: failed to correct extension on upload id: #{upload.id} #{current_extension} => #{correct_extension}" + STDERR.puts e + end + + private + + def self.change_extension(path, extension) + pathname = Pathname.new(path) + dirname = pathname.dirname.to_s != "." ? "#{pathname.dirname}/" : "" + basename = File.basename(path, File.extname(path)) + "#{dirname}#{basename}.#{extension}" + end +end diff --git a/lib/url_helper.rb b/lib/url_helper.rb index 758528a4a3..5df27575f8 100644 --- a/lib/url_helper.rb +++ b/lib/url_helper.rb @@ -31,4 +31,21 @@ class UrlHelper encoded end + def self.cook_url(url) + return url unless is_local(url) + + uri = URI.parse(url) + filename = File.basename(uri.path) + is_attachment = !FileHelper.is_image?(filename) + + no_cdn = SiteSetting.login_required || SiteSetting.prevent_anons_from_downloading_files + + url = absolute_without_cdn(url) + url = Discourse.store.cdn_url(url) unless is_attachment && no_cdn + + schemaless(url) + rescue URI::Error + url + end + end diff --git a/lib/user_name_suggester.rb b/lib/user_name_suggester.rb index 2069113cfd..afff6f1223 100644 --- a/lib/user_name_suggester.rb +++ b/lib/user_name_suggester.rb @@ -39,7 +39,7 @@ module UserNameSuggester end def self.sanitize_username(name) - name = ActiveSupport::Inflector.transliterate(name) + name = ActiveSupport::Inflector.transliterate(name.to_s) # 1. replace characters that aren't allowed with '_' name.gsub!(UsernameValidator::CONFUSING_EXTENSIONS, "_") name.gsub!(/[^\w.-]/, "_") diff --git a/lib/validators/censored_words_validator.rb b/lib/validators/censored_words_validator.rb index 96749c845c..b2c70bc931 100644 --- a/lib/validators/censored_words_validator.rb +++ b/lib/validators/censored_words_validator.rb @@ -10,23 +10,23 @@ class CensoredWordsValidator < ActiveModel::EachValidator private - def censor_words(value, regexp) - censored_words = value.scan(regexp) - censored_words.flatten! - censored_words.compact! - censored_words.map!(&:strip) - censored_words.select!(&:present?) - censored_words.uniq! - censored_words - end + def censor_words(value, regexp) + censored_words = value.scan(regexp) + censored_words.flatten! + censored_words.compact! + censored_words.map!(&:strip) + censored_words.select!(&:present?) + censored_words.uniq! + censored_words + end - def join_censored_words(censored_words) - censored_words.map!(&:downcase) - censored_words.uniq! - censored_words.join(", ".freeze) - end + def join_censored_words(censored_words) + censored_words.map!(&:downcase) + censored_words.uniq! + censored_words.join(", ".freeze) + end - def censored_words_regexp - WordWatcher.word_matcher_regexp :censor - end + def censored_words_regexp + WordWatcher.word_matcher_regexp :censor + end end diff --git a/lib/validators/pop3_polling_enabled_setting_validator.rb b/lib/validators/pop3_polling_enabled_setting_validator.rb index d002f4eee7..0b79dc8d88 100644 --- a/lib/validators/pop3_polling_enabled_setting_validator.rb +++ b/lib/validators/pop3_polling_enabled_setting_validator.rb @@ -30,15 +30,15 @@ class POP3PollingEnabledSettingValidator private - def authentication_works? - @authentication_works ||= begin - pop3 = Net::POP3.new(SiteSetting.pop3_polling_host, SiteSetting.pop3_polling_port) - pop3.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if SiteSetting.pop3_polling_ssl - pop3.auth_only(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) - rescue Net::POPAuthenticationError - false - else - true - end + def authentication_works? + @authentication_works ||= begin + pop3 = Net::POP3.new(SiteSetting.pop3_polling_host, SiteSetting.pop3_polling_port) + pop3.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if SiteSetting.pop3_polling_ssl + pop3.auth_only(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) + rescue Net::POPAuthenticationError + false + else + true end + end end diff --git a/lib/validators/post_validator.rb b/lib/validators/post_validator.rb index f0b7b54a01..f8c58ec2e6 100644 --- a/lib/validators/post_validator.rb +++ b/lib/validators/post_validator.rb @@ -109,10 +109,12 @@ class Validators::PostValidator < ActiveModel::Validator end def can_post_links_validator(post) - if (post.link_count == 0 && !post.has_oneboxes?) || - Guardian.new(post.acting_user).can_post_link? || - private_message?(post) + if (post.link_count == 0 && !post.has_oneboxes?) || private_message?(post) + return newuser_links_validator(post) + end + guardian = Guardian.new(post.acting_user) + if post.linked_hosts.keys.all? { |h| guardian.can_post_link?(host: h) } return newuser_links_validator(post) end diff --git a/lib/validators/topic_title_length_validator.rb b/lib/validators/topic_title_length_validator.rb index bdee42c81c..6e4a1d1701 100644 --- a/lib/validators/topic_title_length_validator.rb +++ b/lib/validators/topic_title_length_validator.rb @@ -6,17 +6,17 @@ class TopicTitleLengthValidator < ActiveModel::EachValidator private - def title_validator(record) - length_range = - if record.user.try(:admin?) - 1..SiteSetting.max_topic_title_length - elsif record.private_message? - SiteSetting.private_message_title_length - else - SiteSetting.topic_title_length - end + def title_validator(record) + length_range = + if record.user.try(:admin?) + 1..SiteSetting.max_topic_title_length + elsif record.private_message? + SiteSetting.private_message_title_length + else + SiteSetting.topic_title_length + end - ActiveModel::Validations::LengthValidator.new(attributes: :title, in: length_range, allow_blank: true) - end + ActiveModel::Validations::LengthValidator.new(attributes: :title, in: length_range, allow_blank: true) + end end diff --git a/lib/validators/upload_url_validator.rb b/lib/validators/upload_url_validator.rb index 7609314f9d..67f1e7af67 100644 --- a/lib/validators/upload_url_validator.rb +++ b/lib/validators/upload_url_validator.rb @@ -4,7 +4,7 @@ class UploadUrlValidator < ActiveModel::EachValidator uri = begin URI.parse(value) - rescue URI::InvalidURIError + rescue URI::Error end unless uri && Discourse.store.has_been_uploaded?(value) diff --git a/lib/validators/upload_validator.rb b/lib/validators/upload_validator.rb index 5b9da9793d..60074a197f 100644 --- a/lib/validators/upload_validator.rb +++ b/lib/validators/upload_validator.rb @@ -113,7 +113,11 @@ class Validators::UploadValidator < ActiveModel::Validator end def maximum_file_size(upload, type) - max_size_kb = SiteSetting.send("max_#{type}_size_kb") + max_size_kb = if upload.for_export + SiteSetting.max_export_file_size_kb + else + SiteSetting.send("max_#{type}_size_kb") + end max_size_bytes = max_size_kb.kilobytes if upload.filesize > max_size_bytes diff --git a/lib/validators/url_validator.rb b/lib/validators/url_validator.rb index 7edfe431f3..fec4470cec 100644 --- a/lib/validators/url_validator.rb +++ b/lib/validators/url_validator.rb @@ -5,7 +5,7 @@ class UrlValidator < ActiveModel::EachValidator begin uri = URI.parse(value) uri.is_a?(URI::HTTP) && !uri.host.nil? && uri.host.include?(".") - rescue URI::InvalidURIError => e + rescue URI::Error => e if (e.message =~ /URI must be ascii only/) value = URI.encode(value) retry diff --git a/lib/version.rb b/lib/version.rb index ac0fb927e8..0259dc7e6a 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -3,9 +3,9 @@ module Discourse unless defined? ::Discourse::VERSION module VERSION #:nodoc: MAJOR = 2 - MINOR = 0 - TINY = 5 - PRE = nil + MINOR = 1 + TINY = 0 + PRE = 'beta6' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end diff --git a/lib/wizard/builder.rb b/lib/wizard/builder.rb index dddf08f7a7..8c00c2ae1b 100644 --- a/lib/wizard/builder.rb +++ b/lib/wizard/builder.rb @@ -117,40 +117,28 @@ class Wizard end @wizard.append_step('colors') do |step| - default_theme = Theme.find_by(key: SiteSetting.default_theme_key) - scheme_id = default_theme&.color_scheme&.base_scheme_id || 'default' + default_theme = Theme.find_by(id: SiteSetting.default_theme_id) + scheme_id = default_theme&.color_scheme&.base_scheme_id || 'Light' - themes = step.add_field(id: 'base_scheme_id', type: 'dropdown', required: true, value: scheme_id) + themes = step.add_field(id: 'theme_previews', type: 'component', required: true, value: scheme_id) ColorScheme.base_color_scheme_colors.each do |t| with_hash = t[:colors].dup with_hash.map { |k, v| with_hash[k] = "##{v}" } themes.add_choice(t[:id], data: { colors: with_hash }) end - step.add_field(id: 'theme_preview', type: 'component') step.on_update do |updater| - scheme_name = updater.fields[:base_scheme_id] + scheme_name = updater.fields[:theme_previews] || 'Light' + name = I18n.t("color_schemes.#{scheme_name.downcase.gsub(' ', '_')}_theme_name") theme = nil + scheme = ColorScheme.find_by(base_scheme_id: scheme_name, via_wizard: true) + scheme ||= ColorScheme.create_from_base(name: name, via_wizard: true, base_scheme_id: scheme_name) + themes = Theme.where(color_scheme_id: scheme.id).order(:id).to_a + theme = themes.find(&:default?) + theme ||= themes.first - if scheme_name == "dark" - scheme = ColorScheme.find_by(base_scheme_id: 'dark', via_wizard: true) - - name = I18n.t("wizard.step.colors.fields.theme_id.choices.dark.label") - scheme ||= ColorScheme.create_from_base(name: name, via_wizard: true, base_scheme_id: "dark") - - theme = Theme.find_by(color_scheme_id: scheme.id) - name = I18n.t('color_schemes.dark_theme_name') - theme ||= Theme.create(name: name, color_scheme_id: scheme.id, user_id: @wizard.user.id) - else - themes = Theme.where(color_scheme_id: nil).order(:id).to_a - theme = themes.find(&:default?) - theme ||= themes.first - - name = I18n.t('color_schemes.light_theme_name') - theme ||= Theme.create(name: name, user_id: @wizard.user.id) - end - + theme ||= Theme.create(name: name, user_id: @wizard.user.id, color_scheme_id: scheme.id) theme.set_default! end end @@ -169,22 +157,52 @@ class Wizard step.add_field(id: 'apple_touch_icon_url', type: 'image', value: SiteSetting.apple_touch_icon_url) step.on_update do |updater| - updater.apply_settings(:favicon_url, :apple_touch_icon_url) + updater.apply_settings(:favicon_url) + + if updater.fields[:apple_touch_icon_url] != SiteSetting.apple_touch_icon_url + upload = Upload.find_by_url(updater.fields[:apple_touch_icon_url]) + dimensions = 180 # for apple touch icon + if upload && upload.width > dimensions && upload.height > dimensions + updater.update_setting(:large_icon_url, updater.fields[:apple_touch_icon_url]) + + apple_touch_icon_optimized = OptimizedImage.create_for( + upload, + dimensions, + dimensions + ) + + original_file = File.new(Discourse.store.path_for(apple_touch_icon_optimized)) rescue nil + if original_file + apple_touch_icon_upload = UploadCreator.new(original_file, upload.original_filename).create_for(@wizard.user.id) + updater.update_setting(:apple_touch_icon_url, apple_touch_icon_upload.url) + end + apple_touch_icon_optimized.destroy! if apple_touch_icon_optimized.present? + else + updater.apply_settings(:apple_touch_icon_url) + end + end end end @wizard.append_step('homepage') do |step| - current = SiteSetting.top_menu.starts_with?("categories") ? "categories" : "latest" + current = SiteSetting.top_menu.starts_with?("categories") ? SiteSetting.desktop_category_page_style : "latest" style = step.add_field(id: 'homepage_style', type: 'dropdown', required: true, value: current) style.add_choice('latest') - style.add_choice('categories') + CategoryPageStyle.values.each do |page| + style.add_choice(page[:value]) + end + step.add_field(id: 'homepage_preview', type: 'component') step.on_update do |updater| - top_menu = "latest|new|unread|top|categories" - top_menu = "categories|latest|new|unread|top" if updater.fields[:homepage_style] == 'categories' + if updater.fields[:homepage_style] == 'latest' + top_menu = "latest|new|unread|top|categories" + else + top_menu = "categories|latest|new|unread|top" + updater.update_setting(:desktop_category_page_style, updater.fields[:homepage_style]) + end updater.update_setting(:top_menu, top_menu) end end @@ -199,7 +217,7 @@ class Wizard EmojiSetSiteSetting.values.each do |set| imgs = emoji.map do |e| - "" + "" end sets.add_choice(set[:value], label: I18n.t("js.#{set[:name]}"), diff --git a/package.json b/package.json index 2668bc503a..dbeab0e8e5 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,12 @@ "license": "MIT", "dependencies": {}, "devDependencies": { - "babel-eslint": "^8.0.3", - "chrome-launcher": "^0.10.0", - "chrome-remote-interface": "^0.25.4", - "eslint": "^4.13.1", - "puppeteer": "^0.13.0" + "babel-eslint": "^8.2", + "chrome-launcher": "^0.10", + "chrome-remote-interface": "^0.25", + "eslint": "^4.19", + "prettier": "^1.13", + "puppeteer": "^1.4", + "pretender": "^1.6" } } diff --git a/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6 b/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6 index 123c08ecc2..3a360b7e8e 100644 --- a/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6 +++ b/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6 @@ -1,17 +1,17 @@ -import { withPluginApi } from 'discourse/lib/plugin-api'; +import { withPluginApi } from "discourse/lib/plugin-api"; function initializeDetails(api) { api.decorateCooked($elem => $("details", $elem).details()); api.addToolbarPopupMenuOptionsCallback(() => { return { - action: 'insertDetails', - icon: 'caret-right', - label: 'details.title' + action: "insertDetails", + icon: "caret-right", + label: "details.title" }; }); - api.modifyClass('controller:composer', { + api.modifyClass("controller:composer", { actions: { insertDetails() { this.get("toolbarEvent").applySurround( @@ -29,6 +29,6 @@ export default { name: "apply-details", initialize() { - withPluginApi('0.8.7', initializeDetails); + withPluginApi("0.8.7", initializeDetails); } }; diff --git a/plugins/discourse-details/assets/javascripts/lib/discourse-markdown/details.js.es6 b/plugins/discourse-details/assets/javascripts/lib/discourse-markdown/details.js.es6 index 545d0eea90..93b5b7bf30 100644 --- a/plugins/discourse-details/assets/javascripts/lib/discourse-markdown/details.js.es6 +++ b/plugins/discourse-details/assets/javascripts/lib/discourse-markdown/details.js.es6 @@ -1,31 +1,31 @@ const rule = { - tag: 'details', + tag: "details", before: function(state, tagInfo) { const attrs = tagInfo.attrs; - state.push('bbcode_open', 'details', 1); - state.push('bbcode_open', 'summary', 1); + state.push("bbcode_open", "details", 1); + state.push("bbcode_open", "summary", 1); - let token = state.push('text', '', 0); - token.content = attrs['_default'] || ''; + let token = state.push("text", "", 0); + token.content = attrs["_default"] || ""; - state.push('bbcode_close', 'summary', -1); + state.push("bbcode_close", "summary", -1); }, after: function(state) { - state.push('bbcode_close', 'details', -1); + state.push("bbcode_close", "details", -1); } }; export function setup(helper) { helper.whiteList([ - 'summary', - 'summary[title]', - 'details', - 'details[open]', - 'details.elided' + "summary", + "summary[title]", + "details", + "details[open]", + "details.elided" ]); helper.registerPlugin(md => { - md.block.bbcode.ruler.push('details', rule); + md.block.bbcode.ruler.push("details", rule); }); } diff --git a/plugins/discourse-details/assets/stylesheets/details.scss b/plugins/discourse-details/assets/stylesheets/details.scss index a0265d894e..27b2c25f1b 100644 --- a/plugins/discourse-details/assets/stylesheets/details.scss +++ b/plugins/discourse-details/assets/stylesheets/details.scss @@ -18,8 +18,8 @@ summary:first-of-type { } summary:before { - content: '\25BA'; - margin-right: .25em; + content: "\25BA"; + margin-right: 0.25em; } details[open] > * { @@ -27,12 +27,12 @@ details[open] > * { } details[open] > summary:before, -details.open > summary:before { - content: '\25BC'; +details.open > summary:before { + content: "\25BC"; } details[open] > summary:first-of-type ~ *, -details.open > summary:first-of-type ~ * { +details.open > summary:first-of-type ~ * { display: block; } @@ -41,16 +41,9 @@ summary::-webkit-details-marker { display: none; } -/* FF: hide div generated by lazyYT plugin */ -details .lazyYT-container { - display: none; -} - - .elided { - summary:before { - content: '' !important; + content: "" !important; display: none; } @@ -63,17 +56,16 @@ details .lazyYT-container { box-sizing: border-box; margin: 0; padding: 0; - color: #aaa; - background: #f1f1f1; - border: 1px solid #ddd; - width: 21px; - line-height: 12px; - + color: $primary-medium; + background: $primary-low; + border: 1px solid $primary-low-mid; + width: 1.5em; + line-height: 1; } summary:hover { - color: #222; - background: #d8d8d8; - border-color: #cdcdcd; + color: $primary; + background: $primary-low-mid; + border-color: currentColor; } } diff --git a/plugins/discourse-details/config/locales/client.fi.yml b/plugins/discourse-details/config/locales/client.fi.yml index d1d1c24431..abda9c32b1 100644 --- a/plugins/discourse-details/config/locales/client.fi.yml +++ b/plugins/discourse-details/config/locales/client.fi.yml @@ -8,7 +8,7 @@ fi: js: details: - title: Yhteenveto + title: Piilota yksityiskohtia composer: details_title: Yhteenveto details_text: "Tämä teksti piilotetaan otsikon alle." diff --git a/plugins/discourse-details/config/locales/client.hu.yml b/plugins/discourse-details/config/locales/client.hu.yml new file mode 100644 index 0000000000..ae01e5179a --- /dev/null +++ b/plugins/discourse-details/config/locales/client.hu.yml @@ -0,0 +1,14 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + js: + details: + title: Részletek elrejtése + composer: + details_title: Összegzés + details_text: "A szöveg el lesz rejtve" diff --git a/plugins/discourse-details/config/locales/client.ko.yml b/plugins/discourse-details/config/locales/client.ko.yml index bf4e05d6f4..8d0ad598c1 100644 --- a/plugins/discourse-details/config/locales/client.ko.yml +++ b/plugins/discourse-details/config/locales/client.ko.yml @@ -5,4 +5,7 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -ko: {} +ko: + js: + composer: + details_text: "ì´ í…스트는 숨겨집니다." diff --git a/plugins/discourse-details/config/locales/client.pt_BR.yml b/plugins/discourse-details/config/locales/client.pt_BR.yml index bc85fd86b1..0b4280c624 100644 --- a/plugins/discourse-details/config/locales/client.pt_BR.yml +++ b/plugins/discourse-details/config/locales/client.pt_BR.yml @@ -5,4 +5,10 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -pt_BR: {} +pt_BR: + js: + details: + title: Detalhes ocultos + composer: + details_title: Resumo + details_text: "Este texto ficará oculto." diff --git a/plugins/discourse-details/config/locales/client.ru.yml b/plugins/discourse-details/config/locales/client.ru.yml index 5c634ee3d3..67b206a5da 100644 --- a/plugins/discourse-details/config/locales/client.ru.yml +++ b/plugins/discourse-details/config/locales/client.ru.yml @@ -5,4 +5,10 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -ru: {} +ru: + js: + details: + title: Скрыть детали + composer: + details_title: Сводка + details_text: "Этот текÑÑ‚ будет Ñкрыт" diff --git a/plugins/discourse-details/config/locales/client.sk.yml b/plugins/discourse-details/config/locales/client.sk.yml index bcc3a93dc5..23665f3c95 100644 --- a/plugins/discourse-details/config/locales/client.sk.yml +++ b/plugins/discourse-details/config/locales/client.sk.yml @@ -5,4 +5,10 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -sk: {} +sk: + js: + details: + title: SkryÅ¥ detaily + composer: + details_title: Zhrnutie + details_text: "Tento text bol skrytý" diff --git a/plugins/discourse-details/config/locales/client.sw.yml b/plugins/discourse-details/config/locales/client.sw.yml new file mode 100644 index 0000000000..dad627a64e --- /dev/null +++ b/plugins/discourse-details/config/locales/client.sw.yml @@ -0,0 +1,14 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + js: + details: + title: Ficha Maelezo + composer: + details_title: Muhtasari + details_text: "Haya maandiko yatafichwa" diff --git a/plugins/discourse-details/config/locales/client.th.yml b/plugins/discourse-details/config/locales/client.th.yml index 7ed98e15d8..96189dbb8a 100644 --- a/plugins/discourse-details/config/locales/client.th.yml +++ b/plugins/discourse-details/config/locales/client.th.yml @@ -5,4 +5,10 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -th: {} +th: + js: + details: + title: ซ่อนรายละเอียด + composer: + details_title: สรุป + details_text: "ข้อความนี้จะถูà¸à¸‹à¹ˆà¸­à¸™" diff --git a/plugins/discourse-details/config/locales/client.zh_CN.yml b/plugins/discourse-details/config/locales/client.zh_CN.yml index ba67ca12a0..f96ae195d8 100644 --- a/plugins/discourse-details/config/locales/client.zh_CN.yml +++ b/plugins/discourse-details/config/locales/client.zh_CN.yml @@ -10,5 +10,5 @@ zh_CN: details: title: éšè—详情 composer: - details_title: 总结 + details_title: æ¦‚è¦ details_text: "本文本将被éšè—" diff --git a/plugins/discourse-details/config/locales/server.fi.yml b/plugins/discourse-details/config/locales/server.fi.yml index b947adbbec..3d9a859cc9 100644 --- a/plugins/discourse-details/config/locales/server.fi.yml +++ b/plugins/discourse-details/config/locales/server.fi.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -fi: {} +fi: + site_settings: + details_enabled: "Ota käyttöön yksityiskohtaominaisuus. Jos muutat asetusta, sinun täytyy rakentaa viestit uudelleen komennolla: \"rake posts:rebake\". " diff --git a/plugins/discourse-details/config/locales/server.fr.yml b/plugins/discourse-details/config/locales/server.fr.yml index ca92bfb77f..b334f1483a 100644 --- a/plugins/discourse-details/config/locales/server.fr.yml +++ b/plugins/discourse-details/config/locales/server.fr.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -fr: {} +fr: + site_settings: + details_enabled: "Activer la fonction details. Si vous modifiez ceci, vous devez exécuter la commande \"rake posts:rebake\"." diff --git a/plugins/discourse-details/config/locales/server.hu.yml b/plugins/discourse-details/config/locales/server.hu.yml new file mode 100644 index 0000000000..762ea50ca1 --- /dev/null +++ b/plugins/discourse-details/config/locales/server.hu.yml @@ -0,0 +1,10 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + site_settings: + details_enabled: "Részletek funkció engedélyezése. Ha megváltoztatod ezt, újra kell tenned az összes bejegyzést ezzel: \"rake posts:rebake\"." diff --git a/plugins/discourse-details/config/locales/server.it.yml b/plugins/discourse-details/config/locales/server.it.yml index 12c5162aab..741bf29751 100644 --- a/plugins/discourse-details/config/locales/server.it.yml +++ b/plugins/discourse-details/config/locales/server.it.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -it: {} +it: + site_settings: + details_enabled: "Attiva la funzione dettagli. Se cambi questa impostazione, devi rielaborare tutti i Messaggi con \"rake posts:rebake\"" diff --git a/plugins/discourse-details/config/locales/server.pt_BR.yml b/plugins/discourse-details/config/locales/server.pt_BR.yml index bc85fd86b1..b379253dd7 100644 --- a/plugins/discourse-details/config/locales/server.pt_BR.yml +++ b/plugins/discourse-details/config/locales/server.pt_BR.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -pt_BR: {} +pt_BR: + site_settings: + details_enabled: "Habilitar o recurso de detalhes. Se você mudar isso, você deve rebake todas as mensagens com: \"rake posts: rebake\"." diff --git a/plugins/discourse-details/config/locales/server.ru.yml b/plugins/discourse-details/config/locales/server.ru.yml index 5c634ee3d3..11d23be517 100644 --- a/plugins/discourse-details/config/locales/server.ru.yml +++ b/plugins/discourse-details/config/locales/server.ru.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -ru: {} +ru: + site_settings: + details_enabled: "Включить дополнительные возможноÑти. ЕÑли вы измените данный пункт, то потребуетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ вÑе поÑты Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды: \"rake posts:rebake\"" diff --git a/plugins/discourse-details/config/locales/server.sk.yml b/plugins/discourse-details/config/locales/server.sk.yml index bcc3a93dc5..1609e4c7b7 100644 --- a/plugins/discourse-details/config/locales/server.sk.yml +++ b/plugins/discourse-details/config/locales/server.sk.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -sk: {} +sk: + site_settings: + details_enabled: "PovoliÅ¥ vlastnosÅ¥ detailov. Ak toto zmeníte, musíte znovu sparsovaÅ¥ vÅ¡etky príspevky: \"rake posts:rebake\"." diff --git a/plugins/discourse-details/config/locales/server.sw.yml b/plugins/discourse-details/config/locales/server.sw.yml new file mode 100644 index 0000000000..54b75273f7 --- /dev/null +++ b/plugins/discourse-details/config/locales/server.sw.yml @@ -0,0 +1,10 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + site_settings: + details_enabled: "Wezesha Vipengele vya maelezo. Na kama ukibadilisha, lazima useti machapisho yote kwa kutumia: \"rake posts:rebake\"." diff --git a/plugins/discourse-details/config/locales/server.zh_CN.yml b/plugins/discourse-details/config/locales/server.zh_CN.yml index 53c9902287..4b9261fddb 100644 --- a/plugins/discourse-details/config/locales/server.zh_CN.yml +++ b/plugins/discourse-details/config/locales/server.zh_CN.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -zh_CN: {} +zh_CN: + site_settings: + details_enabled: "å¯ç”¨ç»†èŠ‚åŠŸèƒ½ã€‚å¦‚æžœä½ æ”¹å˜äº†è¿™ä¸ªé€‰é¡¹ï¼Œå¿…é¡»é€šè¿‡æ­¤å‘½ä»¤é‡æ–°è°ƒåˆ¶å…¨éƒ¨å¸–å­ï¼š\"rake posts:rebake\"。" diff --git a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 index a22705223e..08922bd862 100644 --- a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 +++ b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 @@ -1,121 +1,133 @@ import { acceptance } from "helpers/qunit-helpers"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; -acceptance('Details Button', { +acceptance("Details Button", { loggedIn: true, beforeEach: function() { clearPopupMenuOptionsCallback(); } }); -function findTextarea() { - return find(".d-editor-input")[0]; -} +test("details button", async assert => { + const popupMenu = selectKit(".toolbar-popup-menu-options"); -test('details button', (assert) => { - const popupMenu = selectKit('.toolbar-popup-menu-options'); + await visit("/"); + await click("#create-topic"); - visit("/"); - click('#create-topic'); + await popupMenu.expand(); + await popupMenu.selectRowByValue("insertDetails"); - popupMenu.expand().selectRowByValue('insertDetails'); + assert.equal( + find(".d-editor-input").val(), + `\n[details="${I18n.t("composer.details_title")}"]\n${I18n.t( + "composer.details_text" + )}\n[/details]\n`, + "it should contain the right output" + ); - andThen(() => { - assert.equal( - find(".d-editor-input").val(), - `\n[details="${I18n.t("composer.details_title")}"]\n${I18n.t("composer.details_text")}\n[/details]\n`, - 'it should contain the right output' - ); - }); + await fillIn(".d-editor-input", "This is my title"); - fillIn('.d-editor-input', "This is my title"); + const textarea = find(".d-editor-input")[0]; + textarea.selectionStart = 0; + textarea.selectionEnd = textarea.value.length; - andThen(() => { - const textarea = findTextarea(); - textarea.selectionStart = 0; - textarea.selectionEnd = textarea.value.length; - }); + await popupMenu.expand(); + await popupMenu.selectRowByValue("insertDetails"); - popupMenu.expand().selectRowByValue('insertDetails'); + assert.equal( + find(".d-editor-input").val(), + `\n[details="${I18n.t( + "composer.details_title" + )}"]\nThis is my title\n[/details]\n`, + "it should contain the right selected output" + ); - andThen(() => { - assert.equal( - find(".d-editor-input").val(), - `\n[details="${I18n.t("composer.details_title")}"]\nThis is my title\n[/details]\n`, - 'it should contain the right selected output' - ); + assert.equal( + textarea.selectionStart, + 21, + "it should start highlighting at the right position" + ); + assert.equal( + textarea.selectionEnd, + 37, + "it should end highlighting at the right position" + ); - const textarea = findTextarea(); - assert.equal(textarea.selectionStart, 21, 'it should start highlighting at the right position'); - assert.equal(textarea.selectionEnd, 37, 'it should end highlighting at the right position'); - }); + await fillIn(".d-editor-input", "Before some text in between After"); - fillIn('.d-editor-input', "Before some text in between After"); + textarea.selectionStart = 7; + textarea.selectionEnd = 28; - andThen(() => { - const textarea = findTextarea(); - textarea.selectionStart = 7; - textarea.selectionEnd = 28; - }); + await popupMenu.expand(); + await popupMenu.selectRowByValue("insertDetails"); - popupMenu.expand().selectRowByValue('insertDetails'); + assert.equal( + find(".d-editor-input").val(), + `Before \n[details="${I18n.t( + "composer.details_title" + )}"]\nsome text in between\n[/details]\n After`, + "it should contain the right output" + ); - andThen(() => { - assert.equal( - find(".d-editor-input").val(), - `Before \n[details="${I18n.t("composer.details_title")}"]\nsome text in between\n[/details]\n After`, - 'it should contain the right output' - ); + assert.equal( + textarea.selectionStart, + 28, + "it should start highlighting at the right position" + ); + assert.equal( + textarea.selectionEnd, + 48, + "it should end highlighting at the right position" + ); - const textarea = findTextarea(); - assert.equal(textarea.selectionStart, 28, 'it should start highlighting at the right position'); - assert.equal(textarea.selectionEnd, 48, 'it should end highlighting at the right position'); - }); + await fillIn(".d-editor-input", "Before \nsome text in between\n After"); - fillIn('.d-editor-input', "Before \nsome text in between\n After"); + textarea.selectionStart = 8; + textarea.selectionEnd = 29; - andThen(() => { - const textarea = findTextarea(); - textarea.selectionStart = 8; - textarea.selectionEnd = 29; - }); + await popupMenu.expand(); + await popupMenu.selectRowByValue("insertDetails"); - popupMenu.expand().selectRowByValue('insertDetails'); + assert.equal( + find(".d-editor-input").val(), + `Before \n\n[details="${I18n.t( + "composer.details_title" + )}"]\nsome text in between\n[/details]\n\n After`, + "it should contain the right output" + ); - andThen(() => { - assert.equal( - find(".d-editor-input").val(), - `Before \n\n[details="${I18n.t("composer.details_title")}"]\nsome text in between\n[/details]\n\n After`, - 'it should contain the right output' - ); - - const textarea = findTextarea(); - assert.equal(textarea.selectionStart, 29, 'it should start highlighting at the right position'); - assert.equal(textarea.selectionEnd, 49, 'it should end highlighting at the right position'); - }); + assert.equal( + textarea.selectionStart, + 29, + "it should start highlighting at the right position" + ); + assert.equal( + textarea.selectionEnd, + 49, + "it should end highlighting at the right position" + ); }); -test('details button surrounds all selected text in a single details block', (assert) => { - const multilineInput = 'first line\n\nsecond line\n\nthird line'; - const popupMenu = selectKit('.toolbar-popup-menu-options'); +test("details button surrounds all selected text in a single details block", async assert => { + const multilineInput = "first line\n\nsecond line\n\nthird line"; + const popupMenu = selectKit(".toolbar-popup-menu-options"); - visit("/"); - click('#create-topic'); - fillIn('.d-editor-input', multilineInput); + await visit("/"); + await click("#create-topic"); + await fillIn(".d-editor-input", multilineInput); - andThen(() => { - const textarea = findTextarea(); - textarea.selectionStart = 0; - textarea.selectionEnd = textarea.value.length; - }); + const textarea = find(".d-editor-input")[0]; + textarea.selectionStart = 0; + textarea.selectionEnd = textarea.value.length; - popupMenu.expand().selectRowByValue('insertDetails'); + await popupMenu.expand(); + await popupMenu.selectRowByValue("insertDetails"); - andThen(() => { - assert.equal( - find(".d-editor-input").val(), - `\n[details="${I18n.t('composer.details_title')}"]\n${multilineInput}\n[/details]\n`, - 'it should contain the right output' - ); - }); + assert.equal( + find(".d-editor-input").val(), + `\n[details="${I18n.t( + "composer.details_title" + )}"]\n${multilineInput}\n[/details]\n`, + "it should contain the right output" + ); }); diff --git a/plugins/discourse-details/test/javascripts/lib/details-cooked-test.js.es6 b/plugins/discourse-details/test/javascripts/lib/details-cooked-test.js.es6 index ab49a5a92c..f6e8867b23 100644 --- a/plugins/discourse-details/test/javascripts/lib/details-cooked-test.js.es6 +++ b/plugins/discourse-details/test/javascripts/lib/details-cooked-test.js.es6 @@ -1,31 +1,38 @@ -import { default as PrettyText, buildOptions } from 'pretty-text/pretty-text'; +import { default as PrettyText, buildOptions } from "pretty-text/pretty-text"; QUnit.module("lib:details-cooked-test"); const defaultOpts = buildOptions({ siteSettings: { enable_emoji: true, - emoji_set: 'emoji_one', - highlighted_languages: 'json|ruby|javascript', - default_code_lang: 'auto', + emoji_set: "emoji_one", + highlighted_languages: "json|ruby|javascript", + default_code_lang: "auto" }, - censoredWords: 'shucks|whiz|whizzer', + censoredWords: "shucks|whiz|whizzer", getURL: url => url }); - test("details", assert => { const cooked = (input, expected, text) => { - assert.equal(new PrettyText(defaultOpts).cook(input), expected.replace(/\/>/g, ">"), text); + assert.equal( + new PrettyText(defaultOpts).cook(input), + expected.replace(/\/>/g, ">"), + text + ); }; - cooked(`
Infocoucou
`, - `
Infocoucou
`, - "manual HTML for details"); + cooked( + `
Infocoucou
`, + `
Infocoucou
`, + "manual HTML for details" + ); - cooked("[details=testing]\ntest\n[/details]", -`
+ cooked( + "[details=testing]\ntest\n[/details]", + `
testing

test

-
`); +
` + ); }); diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js b/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js index c68c51a461..9539dc4788 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js +++ b/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js @@ -11,7 +11,10 @@ clearTimeout(this.timeout); } - var relativeTime = moment.utc(options.date + " " + options.time, "YYYY-MM-DD HH:mm"); + var relativeTime = moment.utc( + options.date + " " + options.time, + "YYYY-MM-DD HH:mm:ss" + ); if (options.recurring && relativeTime < moment().utc()) { var parts = options.recurring.split("."); @@ -24,7 +27,10 @@ } var previews = options.timezones.split("|").map(function(timezone) { - var dateTime = relativeTime.tz(timezone).format(options.format); + var dateTime = relativeTime + .tz(timezone) + .format(options.format || "LLL"); + var timezoneParts = _formatTimezone(timezone); if (dateTime.match(/TZ/)) { @@ -39,11 +45,22 @@ } }); - relativeTime = relativeTime.tz(moment.tz.guess()).format(options.format); + var relativeTime = relativeTime.tz(moment.tz.guess()); + if ( + options.format !== "YYYY-MM-DD HH:mm:ss" && + relativeTime.isBetween( + moment().subtract(1, "day"), + moment().add(2, "day") + ) + ) { + relativeTime = relativeTime.calendar(); + } else { + relativeTime = relativeTime.format(options.format); + } var html = ""; html += ""; - html += relativeTime.replace("TZ", _formatTimezone(moment.tz.guess()).join(": ")); + html += ""; html += ""; var joinedPreviews = previews.join("\n"); @@ -52,7 +69,14 @@ .html(html) .attr("title", joinedPreviews) .attr("data-tooltip", joinedPreviews) - .addClass("cooked"); + .addClass("cooked") + .find(".relative-time") + .text( + relativeTime.replace( + "TZ", + _formatTimezone(moment.tz.guess()).join(": ") + ) + ); if (repeat) { this.timeout = setTimeout(function() { diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 index e3c1afefb5..832cbc4f63 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 @@ -1,13 +1,15 @@ import computed from "ember-addons/ember-computed-decorators"; -import { observes } from 'ember-addons/ember-computed-decorators'; +import { observes } from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ - timeFormat: "HH:mm", + timeFormat: "HH:mm:ss", dateFormat: "YYYY-MM-DD", - dateTimeFormat: "YYYY-MM-DD HH:mm", + dateTimeFormat: "YYYY-MM-DD HH:mm:ss", config: null, date: null, + toDate: null, time: null, + toTime: null, format: null, formats: null, recurring: null, @@ -17,10 +19,19 @@ export default Ember.Component.extend({ this._super(); this.set("date", moment().format(this.dateFormat)); - this.set("time", moment().format(this.timeFormat)); this.set("format", `LLL`); - this.set("timezones", (this.siteSettings.discourse_local_dates_default_timezones || "").split("|").filter(f => f)); - this.set("formats", (this.siteSettings.discourse_local_dates_default_formats || "").split("|")); + this.set( + "timezones", + (this.siteSettings.discourse_local_dates_default_timezones || "") + .split("|") + .filter(f => f) + ); + this.set( + "formats", + (this.siteSettings.discourse_local_dates_default_formats || "") + .split("|") + .filter(f => f) + ); }, didInsertElement() { @@ -54,53 +65,151 @@ export default Ember.Component.extend({ { name: "Every two months", id: "2.months" }, { name: "Every three months", id: "3.months" }, { name: "Every six months", id: "6.months" }, - { name: "Every year", id: "1.years" }, + { name: "Every year", id: "1.years" } ]; }, @computed() allTimezones() { - return _.map(moment.tz.names(), (z) => z); + return _.map(moment.tz.names(), z => z); }, - @observes("date", "time", "recurring", "format", "timezones") + @observes( + "date", + "time", + "toDate", + "toTime", + "recurring", + "format", + "timezones" + ) _setConfig() { + const toTime = this.get("toTime"); + + if (toTime && !this.get("toDate")) { + this.set("toDate", moment().format(this.dateFormat)); + } + const date = this.get("date"); + const toDate = this.get("toDate"); const time = this.get("time"); const recurring = this.get("recurring"); const format = this.get("format"); const timezones = this.get("timezones"); - const dateTime = moment(`${date} ${time}`, this.dateTimeFormat).utc(); + const timeInferred = time ? false : true; + const toTimeInferred = toTime ? false : true; - this.set("config", { + let dateTime; + if (!timeInferred) { + dateTime = moment + .tz(`${date} ${time}`, this.get("currentUserTimezone")) + .utc(); + } else { + dateTime = moment.tz(date, this.get("currentUserTimezone")).utc(); + } + + let toDateTime; + if (!toTimeInferred) { + toDateTime = moment + .tz(`${toDate} ${toTime}`, this.get("currentUserTimezone")) + .utc(); + } else { + toDateTime = moment + .tz(toDate, this.get("currentUserTimezone")) + .endOf("day") + .utc(); + } + + let config = { date: dateTime.format(this.dateFormat), - time: dateTime.format(this.timeFormat), dateTime, recurring, format, - timezones, - }); + timezones + }; + + config.time = dateTime.format(this.timeFormat); + config.toTime = toDateTime.format(this.timeFormat); + + if (toDate) { + config.toDate = toDateTime.format(this.dateFormat); + } + + if ( + timeInferred && + toTimeInferred && + this.get("formats").includes(format) + ) { + config.format = "LL"; + } + + if (toDate) { + config.toDateTime = toDateTime; + } + + if ( + !timeInferred && + !toTimeInferred && + date === moment().format(this.dateFormat) && + date === toDate && + this.get("formats").includes(format) + ) { + config.format = "LT"; + } + + this.set("config", config); }, getTextConfig(config) { let text = `[date=${config.date} `; if (config.recurring) text += `recurring=${config.recurring} `; - text += `time=${config.time} `; + + if (config.time) { + text += `time=${config.time} `; + } + text += `format="${config.format}" `; text += `timezones="${config.timezones.join("|")}"`; text += `]`; + + if (config.toDate) { + text += ` → `; + text += `[date=${config.toDate} `; + + if (config.toTime) { + text += `time=${config.toTime} `; + } + + text += `format="${config.format}" `; + text += `timezones="${config.timezones.join("|")}"`; + text += `]`; + } + return text; }, - @computed("config.dateTime") - validDate(dateTime) { + @computed("config.dateTime", "config.toDateTime") + validDate(dateTime, toDateTime) { if (!dateTime) return false; + + if (toDateTime) { + if (!toDateTime.isValid()) { + return false; + } + + if (toDateTime.diff(dateTime) < 0) { + return false; + } + } + return dateTime.isValid(); }, @computed("advancedMode") toggleModeBtnLabel(advancedMode) { - return advancedMode ? "discourse_local_dates.create.form.simple_mode" : "discourse_local_dates.create.form.advanced_mode"; + return advancedMode + ? "discourse_local_dates.create.form.simple_mode" + : "discourse_local_dates.create.form.advanced_mode"; }, actions: { diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs b/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs index 5b7ae5fa84..9b835945a6 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs +++ b/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs @@ -6,21 +6,47 @@
-
- -
- {{date-picker-future class="date-input" value=date defaultDate="DD-MM-YYYY"}} -
-
+
+
+
+ +
+ {{date-picker class="date-input" value=date defaultDate="DD-MM-YYYY"}} +
+
-
- -
- {{input type="time" value=time class="time-input"}} +
+ +
+ {{input type="time" value=time class="time-input"}} +
+
+
+ + to + +
+
+ +
+ {{date-picker class="date-input" value=toDate defaultDate="DD-MM-YYYY"}} +
+
+ +
+ +
+ {{input type="time" value=toTime class="time-input"}} +
+
diff --git a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 index 395a776fb7..87780f6c39 100644 --- a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 @@ -16,7 +16,7 @@ function initializeDiscourseLocalDates(api) { }; }); - api.modifyClass('controller:composer', { + api.modifyClass("controller:composer", { actions: { insertDiscourseLocalDate() { showModal("discourse-local-dates-create-modal").setProperties({ diff --git a/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 b/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 index 888bb747b7..b412829322 100644 --- a/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 @@ -1,4 +1,4 @@ -import { parseBBCodeTag } from 'pretty-text/engines/discourse-markdown/bbcode-block'; +import { parseBBCodeTag } from "pretty-text/engines/discourse-markdown/bbcode-block"; function addLocalDate(buffer, matches, state) { let token; @@ -6,11 +6,15 @@ function addLocalDate(buffer, matches, state) { let config = { date: null, time: null, - format: "YYYY-MM-DD HH:mm", + format: "YYYY-MM-DD HH:mm:ss", timezones: "" }; - let parsed = parseBBCodeTag("[date date" + matches[1] + "]", 0, matches[1].length + 11); + let parsed = parseBBCodeTag( + "[date date" + matches[1] + "]", + 0, + matches[1].length + 11 + ); config.date = parsed.attrs.date; config.time = parsed.attrs.time; @@ -18,53 +22,62 @@ function addLocalDate(buffer, matches, state) { config.format = parsed.attrs.format || config.format; config.timezones = parsed.attrs.timezones || config.timezones; - token = new state.Token('span_open', 'span', 1); + token = new state.Token("span_open", "span", 1); token.attrs = [ - ['class', 'discourse-local-date'], - ['data-date', config.date], - ['data-time', config.time], - ['data-format', config.format], - ['data-timezones', config.timezones], + ["class", "discourse-local-date"], + ["data-date", state.md.utils.escapeHtml(config.date)], + ["data-time", state.md.utils.escapeHtml(config.time)], + ["data-format", state.md.utils.escapeHtml(config.format)], + ["data-timezones", state.md.utils.escapeHtml(config.timezones)] ]; + if (config.recurring) { - token.attrs.push(['data-recurring', config.recurring]); + token.attrs.push([ + "data-recurring", + state.md.utils.escapeHtml(config.recurring) + ]); } buffer.push(token); - const previews = config.timezones.split("|").filter(t => t).map(timezone => { - const dateTime = moment - .utc(`${config.date} ${config.time}`, "YYYY-MM-DD HH:mm") - .tz(timezone) - .format(config.format); + const previews = config.timezones + .split("|") + .filter(t => t) + .map(timezone => { + const dateTime = moment + .utc(`${config.date} ${config.time}`, "YYYY-MM-DD HH:mm:ss") + .tz(timezone) + .format(config.format); - const formattedTimezone = timezone.replace("/", ": ").replace("_", " "); + const formattedTimezone = timezone.replace("/", ": ").replace("_", " "); - if (dateTime.match(/TZ/)) { - return dateTime.replace("TZ", formattedTimezone); - } else { - return `${dateTime} (${formattedTimezone})`; - } - }); + if (dateTime.match(/TZ/)) { + return dateTime.replace("TZ", formattedTimezone); + } else { + return `${dateTime} (${formattedTimezone})`; + } + }); - token.attrs.push(['data-email-preview', previews[0]]); + token.attrs.push(["data-email-preview", previews[0]]); - token = new state.Token('text', '', 0); + token = new state.Token("text", "", 0); token.content = previews.join(", "); buffer.push(token); - token = new state.Token('span_close', 'span', -1); + token = new state.Token("span_close", "span", -1); buffer.push(token); } export function setup(helper) { helper.whiteList([ - 'span.discourse-local-date', - 'span[data-*]', - 'span[title]' + "span.discourse-local-date", + "span[data-*]", + "span[title]" ]); helper.registerOptions((opts, siteSettings) => { - opts.features['discourse-local-dates'] = !!siteSettings.discourse_local_dates_enabled; + opts.features[ + "discourse-local-dates" + ] = !!siteSettings.discourse_local_dates_enabled; }); helper.registerPlugin(md => { @@ -73,6 +86,6 @@ export function setup(helper) { onMatch: addLocalDate }; - md.core.textPostProcess.ruler.push('discourse-local-dates', rule); + md.core.textPostProcess.ruler.push("discourse-local-dates", rule); }); } diff --git a/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss b/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss index f3e846b842..ea97b3d649 100644 --- a/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss +++ b/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss @@ -8,7 +8,7 @@ cursor: pointer; .d-icon-globe { - margin-right: .25em; + margin-right: 0.25em; color: $primary-medium; &:hover { @@ -27,7 +27,8 @@ align-items: center; justify-content: flex-start; - &:before, &:after { + &:before, + &:after { content: none; } @@ -59,6 +60,25 @@ .date-time-configuration { display: flex; align-items: center; + flex-direction: row; + + .range { + .from { + flex-direction: row; + display: flex; + } + + .to { + flex-direction: row; + display: flex; + } + + .to-indicator { + display: flex; + justify-content: center; + margin: 0.5em 0; + } + } .date { .date-input { @@ -75,8 +95,6 @@ } .time { - margin-right: 1em; - .time-input { margin: 0 0.5em 0 0; width: 120px; @@ -85,13 +103,20 @@ } .preview { + flex: 1; margin-top: 16px; + text-align: center; } - @include small-width { + @include breakpoint(medium) { flex-direction: column; align-items: flex-start; + .range .from, + .range .to { + flex-direction: column; + } + .date .date-input .date-picker { width: 200px; } @@ -111,28 +136,30 @@ width: 300px; } } - } + } - .format { - .format-input { - width: 280px; - } - } + .format { + .format-input { + width: 280px; + } + } - .formats { - list-style: none; - padding: 0; - margin: 0; - .format { - .previewed-format { - color: $primary-medium; - } - } - } + .formats { + list-style: none; + padding: 0; + margin: 0; + .format { + .previewed-format { + color: $primary-medium; + } + } + } - .control-group.recurrence, .control-group.format, .control-group.timezones { - margin-top: 1em; - } + .control-group.recurrence, + .control-group.format, + .control-group.timezones { + margin-top: 1em; + } .timezones-input { width: 99%; diff --git a/plugins/discourse-local-dates/config/locales/client.ca.yml b/plugins/discourse-local-dates/config/locales/client.ca.yml index e155a119c2..9d3db3c8e9 100644 --- a/plugins/discourse-local-dates/config/locales/client.ca.yml +++ b/plugins/discourse-local-dates/config/locales/client.ca.yml @@ -5,4 +5,9 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -ca: {} +ca: + js: + discourse_local_dates: + create: + form: + date_title: Data diff --git a/plugins/discourse-local-dates/config/locales/client.fi.yml b/plugins/discourse-local-dates/config/locales/client.fi.yml index b947adbbec..accdf5af47 100644 --- a/plugins/discourse-local-dates/config/locales/client.fi.yml +++ b/plugins/discourse-local-dates/config/locales/client.fi.yml @@ -5,4 +5,23 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -fi: {} +fi: + js: + discourse_local_dates: + title: Lisää päiväys + create: + modal_title: Lisää päiväys + modal_subtitle: "Näytämme päivämäärän ja ajan lukijalle paikallisen aikavyöhykkeen ajassa." + form: + insert: Lisää + advanced_mode: Lisäasetukset + simple_mode: Piilota lisäasetukset + format_description: "Missä formaatissa aika näytetään käyttäjälle. Näytä käyttäjän aikavyöhyke sanallisesti (esim. Europe/Paris) lisäämällä \"\\T\\Z\"." + timezones_title: Näytettävät aikavyöhykkeet + recurring_title: Toistuvuus + recurring_description: "Määrittele tapahtuman toistuvuus. Voit myös manuaalisesti muokata toistuvuusparametriä, jonka lomake viestiin luo. Käytä näitä avainsanoja: years, quarters, months, weeks, days, hours, minutes, seconds, milliseconds." + recurring_none: Ei toistuvuutta + invalid_date: Päiväys ei kelpaa. Tarkista päivämäärä ja aika. + date_title: Päivämäärä + time_title: Aika + format_title: Päiväysformaatti diff --git a/plugins/discourse-local-dates/config/locales/client.fr.yml b/plugins/discourse-local-dates/config/locales/client.fr.yml index 388a1c6786..3b9ae5b7b8 100644 --- a/plugins/discourse-local-dates/config/locales/client.fr.yml +++ b/plugins/discourse-local-dates/config/locales/client.fr.yml @@ -11,9 +11,11 @@ fr: title: Insérer date create: modal_title: Insérer date + modal_subtitle: "Nous convertirons automatiquement la date et l'heure dans le fuseau horaire local de l'utilisateur." form: insert: Insérer advanced_mode: Mode avancé + simple_mode: Mode simple format_description: "Format utilisé pour afficher la date pour l'utilisateur. Utiliser \"\\T\\Z\" pour afficher le fuseaux horaire de l'utilisateur en toutes lettres (Europe/Paris)" timezones_title: Fuseaux horaires à afficher timezones_description: Les fuseaux horaires seront utilisés pour afficher les dates en aperçu et en mode recours. @@ -21,3 +23,6 @@ fr: recurring_description: "Définir la périodicité d'un événement. Vous pouvez aussi modifier manuellement l'option de périodicité générée par le formulaire et utiliser une des clefs suivantes: years, quarters, months, weeks, days, hours, minutes, seconds, milliseconds. " recurring_none: Pas de périodicité invalid_date: Date invalide, contrôler que la date et l'heure sont correctes + date_title: Date + time_title: Time + format_title: Format de date diff --git a/plugins/discourse-local-dates/config/locales/client.he.yml b/plugins/discourse-local-dates/config/locales/client.he.yml index dd210821ca..cc6f8919e3 100644 --- a/plugins/discourse-local-dates/config/locales/client.he.yml +++ b/plugins/discourse-local-dates/config/locales/client.he.yml @@ -8,8 +8,14 @@ he: js: discourse_local_dates: + title: כתיבת ת×ריך create: + modal_title: כתיבת ת×ריך form: + insert: כתיבה + advanced_mode: מצב מורחב format_description: "תבנית להצגת ת×ריך המשתמש. יש להשתמש ב־„‎\\T\\Z†כדי להציג ×ת ×זור הזמן של המשתמש ×‘×ž×™×œ×™× (×סיה/ירושלי×)" timezones_title: ×זורי זמן timezones_description: ב×זורי זמן נעשה שימוש לטובת הצגת ת×ריך בתצוגה מקדימה וכבררת מחדל. + date_title: ת×ריך + time_title: זמן diff --git a/plugins/discourse-local-dates/config/locales/client.hu.yml b/plugins/discourse-local-dates/config/locales/client.hu.yml new file mode 100644 index 0000000000..6cf10ee4d4 --- /dev/null +++ b/plugins/discourse-local-dates/config/locales/client.hu.yml @@ -0,0 +1,25 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + js: + discourse_local_dates: + title: Dátum beszúrása + create: + modal_title: Dátum beszúrása + modal_subtitle: "Automatikusan átkonvertáljuk a dátumot és az idÅ‘t a látogató helyi idÅ‘zónájára." + form: + insert: Beszúrás + advanced_mode: Haladó mód + simple_mode: Egyszerű mód + timezones_title: Megjelenített idÅ‘zónák + recurring_title: IsmétlÅ‘dés + recurring_none: Nincs ismétlÅ‘dés + invalid_date: Érvénytelen dátum, gyÅ‘zÅ‘dj meg róla, hogy a dátum és idÅ‘ helyes + date_title: Dátum + time_title: IdÅ‘ + format_title: Dátumformátum diff --git a/plugins/discourse-local-dates/config/locales/client.it.yml b/plugins/discourse-local-dates/config/locales/client.it.yml index ec636d3a87..0f2eef44b4 100644 --- a/plugins/discourse-local-dates/config/locales/client.it.yml +++ b/plugins/discourse-local-dates/config/locales/client.it.yml @@ -14,3 +14,15 @@ it: modal_subtitle: "Convertiremo automaticamente la data e l'ora al fuso orario locale del visualizzatore." form: insert: Inserisci + advanced_mode: Modalità avanzata + simple_mode: Modalità semplice + format_description: "Formato usato per mostrare la data all'utente. Usa \"\\T\\Z\" per visualizzare il fuso orario per esteso (Europe/Paris)" + timezones_title: Fusi orari da visualizzare + timezones_description: I fusi orari verranno utilizzati per visualizzare le date nell'anteprima e nel fallback. + recurring_title: Ricorrenza + recurring_description: "Definisci la ricorrenza di un evento. Puoi anche modificare manualmente l'opzione di ricorrenza generata dal modulo e usare una delle seguenti chiavi: anni, trimestri, mesi, settimane, giorni, ore, minuti, secondi, millisecondi." + recurring_none: Nessuna ricorrenza + invalid_date: Data non valida, accertati che la data e l'ora siano corrette + date_title: Data + time_title: Ora + format_title: Formato data diff --git a/plugins/discourse-local-dates/config/locales/client.nb_NO.yml b/plugins/discourse-local-dates/config/locales/client.nb_NO.yml index a4fbc12fcd..03cdfe44b8 100644 --- a/plugins/discourse-local-dates/config/locales/client.nb_NO.yml +++ b/plugins/discourse-local-dates/config/locales/client.nb_NO.yml @@ -11,9 +11,11 @@ nb_NO: title: Sett inn dato create: modal_title: Sett inn dato + modal_subtitle: "Vi vil automatisk konvertere dato og tid til leserens lokale tidssone." form: insert: Sett inn advanced_mode: Avansert modus + simple_mode: Enkel modus format_description: "Format som brukes for Ã¥ vise datoen til en bruker. Bruk \"\\T\\Z\" for Ã¥ vise tidssonen som ord (Europe/Paris)" timezones_title: Tidssoner som vises timezones_description: Tidssoner vil brukes for Ã¥ vise datoer i forhÃ¥ndsvisninger og fallback. @@ -21,3 +23,6 @@ nb_NO: recurring_description: "Definer regelmessigheten til en hendelse. Du kan ogsÃ¥ manuelt redigere regelmessigheten etter at den er opprettet ved Ã¥ bruke de følgende nøklene: years, quarters, months, weeks, days, hours, minutes, seconds, milliseconds." recurring_none: Ingen regelmessighet invalid_date: Ugyldig dato, sjekk at dato og klokkeslett er korrekt + date_title: Dato + time_title: Tid + format_title: Datoformat diff --git a/plugins/discourse-local-dates/config/locales/client.pt_BR.yml b/plugins/discourse-local-dates/config/locales/client.pt_BR.yml index bc85fd86b1..b99cb3dacb 100644 --- a/plugins/discourse-local-dates/config/locales/client.pt_BR.yml +++ b/plugins/discourse-local-dates/config/locales/client.pt_BR.yml @@ -5,4 +5,24 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -pt_BR: {} +pt_BR: + js: + discourse_local_dates: + title: Inserir Data + create: + modal_title: Inserir data + modal_subtitle: " Converteremos automaticamente a data e o tempo para o fuso horário local do visitante." + form: + insert: Inserir + advanced_mode: Modo avançado. + simple_mode: Modo simples + format_description: "Formato usado para exibir a data para o usuário. Use \"\\ T \\ Z\" para exibir o fuso horário do usuário em palavras (Europa / Paris)" + timezones_title: Fuso horários para exibir + timezones_description: Os fusos horários serão usados ​​para exibir datas na visualização e no fallback. + recurring_title: Recorrência + recurring_description: "Defina a recorrência de um evento. Você também pode editar manualmente a opção recorrente gerada pelo formulário e usar uma das seguintes chaves: anos, trimestres, meses, semanas, dias, horas, minutos, segundos, milissegundos" + recurring_none: Sem recorrência + invalid_date: Data inválida, certifique-se de que data e tempo estão corretos + date_title: Data + time_title: Tempo + format_title: Formato de Data diff --git a/plugins/discourse-local-dates/config/locales/client.ru.yml b/plugins/discourse-local-dates/config/locales/client.ru.yml index 8090c65edf..15bd93295b 100644 --- a/plugins/discourse-local-dates/config/locales/client.ru.yml +++ b/plugins/discourse-local-dates/config/locales/client.ru.yml @@ -21,3 +21,6 @@ ru: recurring_description: "Определите повторение ÑобытиÑ. Кроме того, можно вручную изменить параметр повтора, Ñозданный формой, и иÑпользовать один из Ñледующих ключей: годы, кварталы, меÑÑцы, недели, дни, чаÑÑ‹, минуты, Ñекунды, миллиÑекунды." recurring_none: ОтÑутÑтвие Ñ€ÐµÑ†Ð¸Ð´Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ invalid_date: ÐедейÑÑ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð°, убедитеÑÑŒ, что дата и Ð²Ñ€ÐµÐ¼Ñ Ð²ÐµÑ€Ð½Ñ‹ + date_title: Дата + time_title: Ð’Ñ€ÐµÐ¼Ñ + format_title: Формат даты diff --git a/plugins/discourse-local-dates/config/locales/client.sk.yml b/plugins/discourse-local-dates/config/locales/client.sk.yml index bcc3a93dc5..00965ef5ca 100644 --- a/plugins/discourse-local-dates/config/locales/client.sk.yml +++ b/plugins/discourse-local-dates/config/locales/client.sk.yml @@ -5,4 +5,24 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -sk: {} +sk: + js: + discourse_local_dates: + title: VložiÅ¥ dátum + create: + modal_title: VložiÅ¥ dátum + modal_subtitle: "Dátum a Äas automaticky skonvertujeme do miestneho Äasového pásma diváka." + form: + insert: VložiÅ¥ + advanced_mode: PokroÄilý režim + simple_mode: Jednoduchý režim + format_description: "Formát použitý na zobrazenie dátumu používateľovi. Použite \"\\T\\Z\" na zobrazenie Äasového pásma používateľa slovami (Európa/Paríž)" + timezones_title: ÄŒasové pásma na zobrazenie + timezones_description: ÄŒasové pásma sa použijú na zobrazenie dátumov v náhľade a núdzových situáciách. + recurring_title: Opakovanie + recurring_description: "Definujte opakovanie udalosti. Môžete tiež manuálne upraviÅ¥ opakovanú možnosÅ¥ generovanú formulárom a použiÅ¥ jeden z nasledujúcich kľúÄov: roky, Å¡tvrÅ¥roky, mesiace, týždne, dni, hodiny, minúty, sekundy, milisekundy." + recurring_none: Žiadna opakovaná udalosÅ¥ + invalid_date: Neplatný dátum, uistite sa, že dátum a Äas sú správne + date_title: Dátum + time_title: ÄŒas + format_title: Formát dátumu diff --git a/plugins/discourse-local-dates/config/locales/client.sw.yml b/plugins/discourse-local-dates/config/locales/client.sw.yml new file mode 100644 index 0000000000..2d63004aaf --- /dev/null +++ b/plugins/discourse-local-dates/config/locales/client.sw.yml @@ -0,0 +1,28 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + js: + discourse_local_dates: + title: Andika tarehe + create: + modal_title: Andika tarehe + modal_subtitle: "Tutabadilisha moja kwa moja muda na tarehe kuendana na mahali pa mtumiaji" + form: + insert: Weka + advanced_mode: Hali-tumizi ya juu + simple_mode: Hali-tumizi rahisi + format_description: "Muundo uliotumika kuonesha tarehe kwa mtumiaji. Tumia \"\\T\\Z\" kuonesha muda halisi wa mahali pa mtumiaji kwa maneno (Ulaya/Paris)" + timezones_title: Majira za saa za kuonyeshwa + timezones_description: Majina ya saa yatatumika kuonyesha tarehe kwenye kihakiki na marejesho ya mfumo. + recurring_title: Kurudiarudia + recurring_description: "Eleza kujirudia kwa matukio.Unaweza kuandika mwenyewe chaguzo la kujirudia kwa tukio kwa:miaka,robo mwaka,miezi,majuma,siku,masaa,dakika,sekunde,milisekunde." + recurring_none: Hakuna kurudia + invalid_date: Tarehe batili, hakikisha tarehe na mda viko sawa + date_title: Tarehe + time_title: Muda + format_title: Muundo wa tarehe diff --git a/plugins/discourse-local-dates/config/locales/client.th.yml b/plugins/discourse-local-dates/config/locales/client.th.yml index 7ed98e15d8..179b0f95d1 100644 --- a/plugins/discourse-local-dates/config/locales/client.th.yml +++ b/plugins/discourse-local-dates/config/locales/client.th.yml @@ -5,4 +5,21 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -th: {} +th: + js: + discourse_local_dates: + title: เพิ่มวัน + create: + modal_title: เพิ่มวัน + modal_subtitle: "เราจะà¹à¸›à¸¥à¸‡à¸§à¸±à¸™à¸—ี่à¹à¸¥à¸°à¹€à¸§à¸¥à¸²à¹€à¸›à¹‡à¸™à¹€à¸‚ตเวลาของผู้เข้าชมอัตโนมัติ" + form: + insert: เพิ่ม + advanced_mode: ระดับสูง + simple_mode: ระดับพื้นà¸à¸²à¸™ + timezones_title: เขตเวลาที่จะà¹à¸ªà¸”ง + recurring_title: ซ้ำ + recurring_none: ไม่ซ้ำ + invalid_date: รูปà¹à¸šà¸šà¸§à¸±à¸™à¸—ี่ไม่ถูà¸à¸•้อง, ตรวจให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸§à¸±à¸™à¸—ี่à¹à¸¥à¸°à¹€à¸§à¸¥à¸²à¸–ูà¸à¸•้อง + date_title: วันที่ + time_title: เวลา + format_title: รูปà¹à¸šà¸šà¸§à¸±à¸™à¸—ี่ diff --git a/plugins/discourse-local-dates/config/locales/client.zh_CN.yml b/plugins/discourse-local-dates/config/locales/client.zh_CN.yml index 6276aa128e..14bea9d17f 100644 --- a/plugins/discourse-local-dates/config/locales/client.zh_CN.yml +++ b/plugins/discourse-local-dates/config/locales/client.zh_CN.yml @@ -11,6 +11,11 @@ zh_CN: title: æ’入日期 create: modal_title: æ’入日期 + modal_subtitle: "我们会自动将日期和时间转æ¢ä¸ºæµè§ˆè€…本地的时区" form: insert: æ’å…¥ advanced_mode: é«˜çº§æ¨¡å¼ + simple_mode: ç®€å•æ¨¡å¼ + date_title: 日期 + time_title: æ—¶é—´ + format_title: æ—¥æœŸæ ¼å¼ diff --git a/plugins/discourse-local-dates/config/locales/server.hu.yml b/plugins/discourse-local-dates/config/locales/server.hu.yml new file mode 100644 index 0000000000..97878c01e5 --- /dev/null +++ b/plugins/discourse-local-dates/config/locales/server.hu.yml @@ -0,0 +1,8 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: {} diff --git a/plugins/discourse-local-dates/config/locales/server.it.yml b/plugins/discourse-local-dates/config/locales/server.it.yml index 9ed9c25d9b..d3237a8364 100644 --- a/plugins/discourse-local-dates/config/locales/server.it.yml +++ b/plugins/discourse-local-dates/config/locales/server.it.yml @@ -8,3 +8,5 @@ it: site_settings: discourse_local_dates_enabled: "Attiva la funzionalità discourse-local-dates, che aggiunge il supporto nei messaggi ai fusi orari locali delle date, attraveso l'elemento [date]." + discourse_local_dates_default_formats: "Formati di data e ora più comuni, si veda il: formato stringhe momentjs" + discourse_local_dates_default_timezones: "Lista dei fusi orari predefiniti, deve essere un TZ valido" diff --git a/plugins/discourse-local-dates/config/locales/server.pt_BR.yml b/plugins/discourse-local-dates/config/locales/server.pt_BR.yml index bc85fd86b1..b3d90c230f 100644 --- a/plugins/discourse-local-dates/config/locales/server.pt_BR.yml +++ b/plugins/discourse-local-dates/config/locales/server.pt_BR.yml @@ -5,4 +5,8 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -pt_BR: {} +pt_BR: + site_settings: + discourse_local_dates_enabled: "Habilitar recurso de datas locais de discursos. Isso adicionará suporte às datas do fuso horário local em postagens usando o elemento [date]." + discourse_local_dates_default_formats: "Formatos de data e hora usados ​​com frequência, consulte:momentjs string format" + discourse_local_dates_default_timezones: "Lista padrão de fusos horários, deve ser válidaTZ" diff --git a/plugins/discourse-local-dates/config/locales/server.sk.yml b/plugins/discourse-local-dates/config/locales/server.sk.yml index bcc3a93dc5..a6a3cbacb3 100644 --- a/plugins/discourse-local-dates/config/locales/server.sk.yml +++ b/plugins/discourse-local-dates/config/locales/server.sk.yml @@ -5,4 +5,8 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -sk: {} +sk: + site_settings: + discourse_local_dates_enabled: "PovoliÅ¥ vlastnosÅ¥ discourse-local-dates. Táto vlastnosÅ¥ pridá podporu dátumov s lokálnymi Äasovými zónami v príspevkoch s použítím prvku [date]." + discourse_local_dates_default_formats: "ÄŒasto používané Äasové zóny, viÄ. formáty momentjs" + discourse_local_dates_default_timezones: "Predvolený zoznam Äasových zón, musí byÅ¥ platná ÄŒZ" diff --git a/plugins/discourse-local-dates/config/locales/server.sw.yml b/plugins/discourse-local-dates/config/locales/server.sw.yml new file mode 100644 index 0000000000..cae08512ac --- /dev/null +++ b/plugins/discourse-local-dates/config/locales/server.sw.yml @@ -0,0 +1,12 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + site_settings: + discourse_local_dates_enabled: "Wezesha kipengele cha discourse-local-dates.Hii itasaidia kwa majira ya muda wa eneo kujua tarehe za machapisho kutumia kipengele cha tarehe" + discourse_local_dates_default_formats: "Miundo ya tarehe na muda itumikayo mara kwa mara, tazama: Muundo wa momentjs" + discourse_local_dates_default_timezones: "Orodha ya chaguo-msingi ya majira ya saa, lazima yawe sahihi TZ" diff --git a/plugins/discourse-local-dates/lib/discourse_local_dates/engine.rb b/plugins/discourse-local-dates/lib/discourse_local_dates/engine.rb index ee920f0617..2338d5e298 100644 --- a/plugins/discourse-local-dates/lib/discourse_local_dates/engine.rb +++ b/plugins/discourse-local-dates/lib/discourse_local_dates/engine.rb @@ -1,6 +1,4 @@ module ::DiscourseLocalDates - PLUGIN_NAME = "discourse-local-dates" - class Engine < ::Rails::Engine engine_name DiscourseLocalDates::PLUGIN_NAME isolate_namespace DiscourseLocalDates diff --git a/plugins/discourse-local-dates/plugin.rb b/plugins/discourse-local-dates/plugin.rb index f027e75b5f..cb243194d7 100644 --- a/plugins/discourse-local-dates/plugin.rb +++ b/plugins/discourse-local-dates/plugin.rb @@ -12,6 +12,43 @@ register_asset "moment-timezone.js", :vendored_core_pretty_text enabled_site_setting :discourse_local_dates_enabled after_initialize do + module ::DiscourseLocalDates + PLUGIN_NAME ||= "discourse-local-dates".freeze + POST_CUSTOM_FIELD ||= "local_dates".freeze + end + + [ + "../lib/discourse_local_dates/engine.rb", + ].each { |path| load File.expand_path(path, __FILE__) } + + register_post_custom_field_type(DiscourseLocalDates::POST_CUSTOM_FIELD, :json) + + on(:before_post_process_cooked) do |doc, post| + dates = doc.css('span.discourse-local-date').map do |cooked_date| + date = {} + cooked_date.attributes.values.each do |attribute| + if attribute.name && ['data-date', 'data-time'].include?(attribute.name) + unless attribute.value == 'undefined' + date[attribute.name.gsub('data-', '')] = CGI.escapeHTML(attribute.value || "") + end + end + end + date + end + + if dates.present? + post.custom_fields[DiscourseLocalDates::POST_CUSTOM_FIELD] = dates.to_json + post.save_custom_fields + elsif !post.custom_fields[DiscourseLocalDates::POST_CUSTOM_FIELD].nil? + post.custom_fields.delete(DiscourseLocalDates::POST_CUSTOM_FIELD) + post.save_custom_fields + end + end + + add_to_class(:post, :local_dates) do + custom_fields[DiscourseLocalDates::POST_CUSTOM_FIELD] || [] + end + on(:reduce_cooked) do |fragment| container = fragment.css(".discourse-local-date").first @@ -21,5 +58,3 @@ after_initialize do end end end - -load File.expand_path('../lib/discourse_local_dates/engine.rb', __FILE__) diff --git a/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb b/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb index f81f8084f9..d76857b9ab 100644 --- a/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb +++ b/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb @@ -4,15 +4,15 @@ describe PrettyText do it 'supports inserting date' do freeze_time cooked = PrettyText.cook <<~MD - [date=2018-05-08 time=22:00 format=LLL timezones="Europe/Paris|America/Los_Angeles"] + [date=2018-05-08 time=22:00 format="L LTS" timezones="Europe/Paris|America/Los_Angeles"] MD expect(cooked).to include('class="discourse-local-date"') expect(cooked).to include('data-date="2018-05-08"') - expect(cooked).to include('data-format="LLL"') + expect(cooked).to include('data-format="L LTS"') expect(cooked).to include('data-timezones="Europe/Paris|America/Los_Angeles"') - expect(cooked).to include('May 8, 2018 3:00 PM (America: Los Angeles)') - expect(cooked).to include('May 9, 2018 12:00 AM (Europe: Paris)') + expect(cooked).to include('05/08/2018 3:00:00 PM (America: Los Angeles)') + expect(cooked).to include('05/09/2018 12:00:00 AM (Europe: Paris)') end it 'uses a simplified syntax in emails' do diff --git a/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 b/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 index 82117be16e..d3ece84fc6 100644 --- a/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 +++ b/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 @@ -1,29 +1,29 @@ -import { withPluginApi } from 'discourse/lib/plugin-api'; +import { withPluginApi } from "discourse/lib/plugin-api"; function initialize(api) { - const messageBus = api.container.lookup('message-bus:main'); + const messageBus = api.container.lookup("message-bus:main"); const currentUser = api.getCurrentUser(); - const appEvents = api.container.lookup('app-events:main'); + const appEvents = api.container.lookup("app-events:main"); - api.modifyClass('component:site-header', { + api.modifyClass("component:site-header", { didInsertElement() { this._super(); - this.dispatch('header:search-context-trigger', 'header'); + this.dispatch("header:search-context-trigger", "header"); } }); - api.attachWidgetAction('header', 'headerSearchContextTrigger', function() { + api.attachWidgetAction("header", "headerSearchContextTrigger", function() { if (this.site.mobileView) { this.state.skipSearchContext = false; } else { this.state.contextEnabled = true; - this.state.searchContextType = 'topic'; + this.state.searchContextType = "topic"; } }); if (messageBus && currentUser) { messageBus.subscribe(`/new_user_narrative/tutorial_search`, () => { - appEvents.trigger('header:search-context-trigger'); + appEvents.trigger("header:search-context-trigger"); }); } } @@ -32,7 +32,8 @@ export default { name: "new-user-narratve", initialize(container) { - const siteSettings = container.lookup('site-settings:main'); - if (siteSettings.discourse_narrative_bot_enabled) withPluginApi('0.8.7', initialize); + const siteSettings = container.lookup("site-settings:main"); + if (siteSettings.discourse_narrative_bot_enabled) + withPluginApi("0.8.7", initialize); } }; diff --git a/plugins/discourse-narrative-bot/autoload/jobs/narrative_init.rb b/plugins/discourse-narrative-bot/autoload/jobs/narrative_init.rb index 68fb003f11..226ec14ae8 100644 --- a/plugins/discourse-narrative-bot/autoload/jobs/narrative_init.rb +++ b/plugins/discourse-narrative-bot/autoload/jobs/narrative_init.rb @@ -1,4 +1,3 @@ -require_dependency 'i18n' require_dependency 'user' module Jobs diff --git a/plugins/discourse-narrative-bot/config/locales/client.hu.yml b/plugins/discourse-narrative-bot/config/locales/client.hu.yml new file mode 100644 index 0000000000..8a2b6083df --- /dev/null +++ b/plugins/discourse-narrative-bot/config/locales/client.hu.yml @@ -0,0 +1,13 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + js: + discourse_narrative_bot: + welcome_post_type: + new_user_track: "Indítsa el az új felhasználói oktatást minden új felhasználónak" + welcome_message: "Küldjön minden új felhasználónak egy üzenetet egy rövid gyorstalpalóval." diff --git a/plugins/discourse-narrative-bot/config/locales/client.sw.yml b/plugins/discourse-narrative-bot/config/locales/client.sw.yml new file mode 100644 index 0000000000..d91504b53d --- /dev/null +++ b/plugins/discourse-narrative-bot/config/locales/client.sw.yml @@ -0,0 +1,13 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + js: + discourse_narrative_bot: + welcome_post_type: + new_user_track: "Anzisha somo jipya kwa ajili ya watumizi wapya" + welcome_message: "Watumie watumiaji wapya ujumbe wa ukaribisho na mwongozo mfupi" diff --git a/plugins/discourse-narrative-bot/config/locales/server.ar.yml b/plugins/discourse-narrative-bot/config/locales/server.ar.yml index 5f5194a03b..db34889d8e 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ar.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ar.yml @@ -7,7 +7,6 @@ ar: site_settings: - discourse_narrative_bot_enabled: 'ÙØ¹Ù„ روبوت ديسكورس المتحدث' disable_discourse_narrative_bot_welcome_post: "عطل منشور الترحيب المنشور بواسطة روبوت ديسكورس المتحدث" discourse_narrative_bot_ignored_usernames: "اسماء الاعضاء التي يتوجب على روبوت ديسكورس المتحدث تجاهلها" discourse_narrative_bot_disable_public_replies: "عطل الردود العامة بواسطة روبوت ديسكورس المتحدث" diff --git a/plugins/discourse-narrative-bot/config/locales/server.bg.yml b/plugins/discourse-narrative-bot/config/locales/server.bg.yml index f9519432a8..2320c60eea 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.bg.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.bg.yml @@ -6,8 +6,6 @@ # https://www.transifex.com/projects/p/discourse-org/ bg: - site_settings: - discourse_narrative_bot_enabled: 'Включете ДиÑÐºÐ¾Ñ€Ñ Ð±Ð¾Ñ‚-а' badges: certified: long_description: | diff --git a/plugins/discourse-narrative-bot/config/locales/server.bs_BA.yml b/plugins/discourse-narrative-bot/config/locales/server.bs_BA.yml index db94860594..dbbad8f544 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.bs_BA.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.bs_BA.yml @@ -7,7 +7,6 @@ bs_BA: site_settings: - discourse_narrative_bot_enabled: 'UkljuÄi Discourse Narrative bot' disable_discourse_narrative_bot_welcome_post: "IskljuÄi objavu dobrodoÅ¡lice od strane Discourse Narrative bot" discourse_narrative_bot_ignored_usernames: "KorisniÄka imena koja Discourse Narrative bot bi trebao ignorisati" discourse_narrative_bot_disable_public_replies: "IskljuÄi javne odgovore od strane Discourse Narrative bot" diff --git a/plugins/discourse-narrative-bot/config/locales/server.ca.yml b/plugins/discourse-narrative-bot/config/locales/server.ca.yml index d563613d13..0974e87c22 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ca.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ca.yml @@ -7,7 +7,6 @@ ca: site_settings: - discourse_narrative_bot_enabled: 'Habilita el Discourse Narrative Bot' disable_discourse_narrative_bot_welcome_post: "Deshabilita el missatge de benvinguda del Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Noms d'usuari que el Discourse Narrative Bot hauria d'ignorar" discourse_narrative_bot_disable_public_replies: "Deshabilita les respostes públiques del Discourse Narrative Bot" diff --git a/plugins/discourse-narrative-bot/config/locales/server.cs.yml b/plugins/discourse-narrative-bot/config/locales/server.cs.yml index ab8ec878be..0cace26a92 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.cs.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.cs.yml @@ -7,7 +7,6 @@ cs: site_settings: - discourse_narrative_bot_enabled: 'Zapnout Discourse robota průvodce' disable_discourse_narrative_bot_welcome_post: "Vypnout uvítací příspÄ›vek od Discourse robota průvodce" discourse_narrative_bot_ignored_usernames: "Uživatelská jména, která by mÄ›l Discourse robot průvodce ignorovat" discourse_narrative_bot_disable_public_replies: "Vypnout veÅ™ejné odpovÄ›di Discourse robota průvodce" diff --git a/plugins/discourse-narrative-bot/config/locales/server.da.yml b/plugins/discourse-narrative-bot/config/locales/server.da.yml index a1c2479285..fbe7750d94 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.da.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.da.yml @@ -7,7 +7,6 @@ da: site_settings: - discourse_narrative_bot_enabled: 'Aktiverer Discourse Botten' disable_discourse_narrative_bot_welcome_post: "Deaktiver velkomst beskeden fra Discourse Botten" badges: certified: diff --git a/plugins/discourse-narrative-bot/config/locales/server.de.yml b/plugins/discourse-narrative-bot/config/locales/server.de.yml index 48a5360264..8aeeb347a1 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.de.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.de.yml @@ -7,7 +7,7 @@ de: site_settings: - discourse_narrative_bot_enabled: 'Discourse Narrative Bot aktivieren' + discourse_narrative_bot_enabled: 'Aktiviere den Discourse Lerntrainings-Bot (discobot)' disable_discourse_narrative_bot_welcome_post: "Die vom Discourse Narrative Bot gesendete Willkommensnachricht deaktivieren" discourse_narrative_bot_ignored_usernames: "Benutzernamen, die vom Discourse Narrative Bot ignoriert werden sollen" discourse_narrative_bot_disable_public_replies: "Öffentliche Antworten von Discourse Narrative Bot deaktivieren" @@ -141,6 +141,7 @@ de: In der Zwischenzeit lass ich dich erst mal in Ruhe. new_user_narrative: reset_trigger: "neuer Benutzer" + title: "Zertifikat für erfolgreiche Beendigung des Lerntrainings" cert_title: "In Anerkennung deines erfolgreichen Abschlusses eines Tutorials für neue Benutzer" hello: title: ":robot: Grüß dich!" diff --git a/plugins/discourse-narrative-bot/config/locales/server.el.yml b/plugins/discourse-narrative-bot/config/locales/server.el.yml index 1035daeaa5..08588fc4e5 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.el.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.el.yml @@ -7,7 +7,6 @@ el: site_settings: - discourse_narrative_bot_enabled: 'ΕνεÏγοποίηση Bot Î±Ï†Î·Î³Î·Î¼Î±Ï„Î¹ÎºÎ¿Ï Î»ÏŒÎ³Î¿Ï…' disable_discourse_narrative_bot_welcome_post: "ΑπενεÏγοποίηση του μηνÏματος καλωσοÏίσματος από το bot Î±Ï†Î·Î³Î·Î¼Î±Ï„Î¹ÎºÎ¿Ï Î»ÏŒÎ³Î¿Ï…" discourse_narrative_bot_ignored_usernames: "Ονόματα χÏηστών τα οποία το bot Î±Ï†Î·Î³Î·Î¼Î±Ï„Î¹ÎºÎ¿Ï Î»ÏŒÎ³Î¿Ï… θα Ï€Ïέπει να αγνοεί" discourse_narrative_bot_disable_public_replies: "ΑπενεÏγοποίηση δημόσιων απαντήσεων από το bot Î±Ï†Î·Î³Î·Î¼Î±Ï„Î¹ÎºÎ¿Ï Î»ÏŒÎ³Î¿Ï…" diff --git a/plugins/discourse-narrative-bot/config/locales/server.en.yml b/plugins/discourse-narrative-bot/config/locales/server.en.yml index 05a5c72b2f..1550fd9f6a 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.en.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.en.yml @@ -1,6 +1,6 @@ en: site_settings: - discourse_narrative_bot_enabled: 'Enable Discourse Narrative Bot' + discourse_narrative_bot_enabled: 'Enable Discourse Narrative Bot (discobot)' disable_discourse_narrative_bot_welcome_post: "Disable the welcome post by Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Usernames that the Discourse Narrative Bot should ignore" discourse_narrative_bot_disable_public_replies: "Disable public replies by Discourse Narrative Bot" @@ -145,6 +145,7 @@ en: new_user_narrative: reset_trigger: "new user" + title: "New user narrative completetion certificate" cert_title: "In recognition of successful completion of the new user tutorial" hello: diff --git a/plugins/discourse-narrative-bot/config/locales/server.es.yml b/plugins/discourse-narrative-bot/config/locales/server.es.yml index b8c5467ee3..a985e171f5 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.es.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.es.yml @@ -7,7 +7,7 @@ es: site_settings: - discourse_narrative_bot_enabled: 'Habilitar Discourse Narrative Bot' + discourse_narrative_bot_enabled: 'Habilitar Discourse Narrative Bot (discobot)' disable_discourse_narrative_bot_welcome_post: "Deshabilitar el post de bienvenida por Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Nombres de usuario que el Discourse Narrative Bot debe ignorar" discourse_narrative_bot_disable_public_replies: "Deshabilitar respuestas públicas del Discourse Narrative Bot" @@ -139,6 +139,7 @@ es: Mientras tanto, me quedaré fuera de tu camino. new_user_narrative: reset_trigger: "usuario nuevo" + title: "Certificado de completación para el nuevo usuario" cert_title: "En reconocimiento de la finalización exitosa del tutorial de usuario nuevo" hello: title: ":robot: Saludos!" diff --git a/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml b/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml index cb766a13ec..ecc2985b6a 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml @@ -7,7 +7,6 @@ fa_IR: site_settings: - discourse_narrative_bot_enabled: 'ربات سخنگوی دیسکورس را ÙØ¹Ø§Ù„ کنید' disable_discourse_narrative_bot_welcome_post: "پیغام خوشامدگویی ربات دیسکورس را از کار بیاندازید" discourse_narrative_bot_ignored_usernames: "نام‌های کاربری Ú©Ù‡ بایستی توسط ربات دیسکورس چشمپوشی شوند" discourse_narrative_bot_disable_public_replies: "از کار انداختن پاسخ‌های خصوصی توسط ربات دیسکورس" diff --git a/plugins/discourse-narrative-bot/config/locales/server.fi.yml b/plugins/discourse-narrative-bot/config/locales/server.fi.yml index 5e373ebe11..7b40cefea9 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.fi.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.fi.yml @@ -7,7 +7,6 @@ fi: site_settings: - discourse_narrative_bot_enabled: 'Ota Discoursen opastava botti käyttöön' disable_discourse_narrative_bot_welcome_post: "Estä bottia lähettämästä tervetuloviestejä" discourse_narrative_bot_ignored_usernames: "Käyttäjänimet, jotka botin tulisi jättää huomiotta" discourse_narrative_bot_disable_public_replies: "Estä bottia vastaamasta julkisesti ketjuihin" @@ -221,6 +220,8 @@ fi: **Lainaa**-painike ilmestyy, kun maalaat viestini tekstiä. **Vastaa**-painike käy yhtä hyvin, jos sinulla on tekstiä maalattuna. Kokeilisitko uudelleen? bookmark: + instructions: |- + Jos haluat oppia lisää, valitse tämän viestin alta ja **lisää tämä yksityisviestiketju kirjanmerkkeihisi**. Jos teet niin, sinua voi odottaa :gift: tulevaisuudessa! reply: |- Erinomaista! Löydät yksityiskeskustelumme nyt helposti koska vain [profiilisi kirjanmerkkivälilehdeltä](%{profile_page_url}/activity/bookmarks). Klikkaat vain profiilikuvaasi oikeassa yläkulmasssa ↗ not_found: |- @@ -357,6 +358,12 @@ fi: reply: |- Erinomaista! Muista, että tämä toimii alueiden lisäksi myös tunnisteille, jos ne ovat käytössä täällä. change_topic_notification_level: + instructions: |- + Sinulla on jokaiselle ketjulle ilmoitustaso. Aluksi se on 'tavallinen', jolloin saat tavalliseen tapaan ilmoituksen vain, jos joku puhuu nimenomaan sinulle. + + Oletuksena yksityisviestiketjujen ilmoitustaso on kaikkein korkein eli 'tarkkaillaan', jolloin saat ilmoituksen joka ikisestä viestistä. Voit kuitenkin valita _mille tahansa_ ketjulle ilmoitustason 'tarkkaillaan', 'seurataan' tai 'vaimennettu'. + + Kokeillaanpa vaihtaa tämän ketjun ilmoitustasoa. Ketjun alla on painike, joka näyttää sinun tarkkailevan tätä ketjua. Vaihda ilmoitustasoksi **seurataan**. not_found: |- Näytät yhä tarkkailevan :eyes: tätä ketjua! Jollet meinaa löytää sitä, ilmoitustasopainike sijaitsee ketjun alla. reply: |- @@ -385,6 +392,20 @@ fi: * :-1: [/poll] details: + instructions: |- + Joskus voit haluta **piilottaa yksityiskohtia** vastauksessasi: + + - Kirjoitat elokuvasta tai TV-ohjelmasta jotakin, minkä voi kokea juonipaljastukseksi. + + - Joudut sisällyttämään viestiisi suuria määriä yksityiskohtaista tietoa, joka voisi uuvuttaa lukijaa. + + [details=Napauta niin näet kuinka se toimii!] + 1. Valitse editorin hammasrataskuvake. + 2. Valitse "Piilota yksityiskohdat". + 3. Muokkaa yhteenvetotekstiä ja lisää sisältö. + [/details] + + Piilottaisitko yksityiskohtia editorin hammasrataskuvakkeen avulla seuraavasta vastauksestasi? not_found: |- Onko ongelmia yksityiskohtatoiminnon kanssa? Kokeilepa laittaa tämä seuraavaan vastaukseesi: diff --git a/plugins/discourse-narrative-bot/config/locales/server.fr.yml b/plugins/discourse-narrative-bot/config/locales/server.fr.yml index 4a3b47934f..186981964d 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.fr.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.fr.yml @@ -7,7 +7,7 @@ fr: site_settings: - discourse_narrative_bot_enabled: 'Activer l''assistant Discourse' + discourse_narrative_bot_enabled: 'Activer le rotbot de narration Discourse (discobot)' disable_discourse_narrative_bot_welcome_post: "Désactiver le message de bienvenue de l'assistant Discourse" discourse_narrative_bot_ignored_usernames: "Noms d'utilisateurs que l'assistant Discourse doit ignorer" discourse_narrative_bot_disable_public_replies: "Désactiver les réponses publiques de l'assistant Discourse" @@ -141,6 +141,7 @@ fr: Pendant ce temps là, je serais silencieux. new_user_narrative: reset_trigger: "nouvel utilisateur" + title: "Certificat de complétion des étapes de nouvel utilisateur" cert_title: "En reconnaissance de l'accomplissement avec succès du tutoriel nouvel utilisateur" hello: title: ":robot: Bienvenue !" diff --git a/plugins/discourse-narrative-bot/config/locales/server.he.yml b/plugins/discourse-narrative-bot/config/locales/server.he.yml index 908c13f1ff..51b1cedc83 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.he.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.he.yml @@ -7,7 +7,6 @@ he: site_settings: - discourse_narrative_bot_enabled: '×פשרו ×ת בוט ×”×¡×™×¤×•×¨×™× ×©×œ דיסקורס' disable_discourse_narrative_bot_welcome_post: "נטרלו ×ת פוסט ×”×‘×¨×•×›×™× ×”×‘××™× ×ž×ת בוט ×”×¡×™×¤×•×¨×™× ×©×œ דיסקורס" discourse_narrative_bot_ignored_usernames: "שמות ×ž×©×ª×ž×©×™× ×©×‘×•×˜ ×”×¡×™×¤×•×¨×™× ×©×œ דיסקורס צריך ×œ×”×ª×¢×œ× ×ž×”×" discourse_narrative_bot_disable_public_replies: "נטרלו תגובות פומביות מ×ת בוט ×”×¡×™×¤×•×¨×™× ×©×œ דיסקורס" @@ -205,6 +204,15 @@ he: mention: reply: |- _קר××ª× ×‘×©×ž×™!?_ :raised_hand: ×× ×™ מ×מין שכן! :wave: ובכן, ×× ×™ ×›×ן! תודה ש××™×–×›×¨×ª× ×ותי. :ok_hand: + end: + message: |- + תודה שנש×רת ×יתי @%{username}! עשיתי ×ת ×–×” בשבילך, ולדעתי הרווחת ×ת ×–×”: + + %{certificate} + + ××– זהו ביינתי×! ×פשר לבדוק [**×ת הדיוני ×”×חרוני×**](/latest) ×ו [**קטגוריות מדוברות**](/categories). :sunglasses: + + (×× ×ª×¨×¦×• לשוחח ×יתי שוב, תשלחו לי הודעה ×ו שתקר×ו לי ×¢× ×¡×™×ž×Ÿ `@%{discobot_username}` בכל זמן!) certificate: alt: 'תעודת הישג' advanced_user_narrative: diff --git a/plugins/discourse-narrative-bot/config/locales/server.hu.yml b/plugins/discourse-narrative-bot/config/locales/server.hu.yml new file mode 100644 index 0000000000..5efa28e6a3 --- /dev/null +++ b/plugins/discourse-narrative-bot/config/locales/server.hu.yml @@ -0,0 +1,41 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + site_settings: + disable_discourse_narrative_bot_welcome_post: "A Discourse alámondó bot üdvözlÅ‘ üzenetének kikapcsolása" + discourse_narrative_bot_ignored_usernames: "Felhasználónevek, amelyeket a Discourse alámondó bot figyelmen kívül hagyjon" + discourse_narrative_bot_disable_public_replies: "A Discourse alámondó bot nyilvános válaszainak kikapcsolása" + discourse_narrative_bot_welcome_post_type: "A Discourse mesélÅ‘ bot üdvözlÅ‘ üzeneteinek kiküldendÅ‘ típusai" + discourse_narrative_bot_welcome_post_delay: "Várj (n) másodpercet a Discourse mesélÅ‘ bot üdvözlÅ‘ üzenetének kiküldése elÅ‘tt." + badges: + certified: + name: Hitelesített + description: "Teljesítette az új felhasználók eligazítását" + long_description: | + Ezt a jelvényt az új felhasználók interaktív eligazításának sikeres teljesítéséért adjuk. KezdeményezÅ‘ voltál és megtanultad a beszélgetés alapvetÅ‘ eszközeit, és ezzel hitelesített lettél! + licensed: + name: Licenszelt + discourse_narrative_bot: + quote: + trigger: "idézet" + '1': + quote: "Minden nehézség közepében lehetÅ‘ség rejtÅ‘zik" + '3': + quote: "Ne azért sírj, mert vége van, mosolyogj azért, mert megtörtént." + magic_8_ball: + answers: + '3': "Kétségtelenül" + '7': "Leginkább" + '9': "Igen" + '12': "Kérdezd meg késÅ‘bb" + '17': "A válaszom nem." + track_selector: + reset_trigger: 'start' + skip_trigger: 'átugrás' + new_user_narrative: + reset_trigger: "új felhasználó" diff --git a/plugins/discourse-narrative-bot/config/locales/server.id.yml b/plugins/discourse-narrative-bot/config/locales/server.id.yml index 0281b0adbf..b0155d0666 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.id.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.id.yml @@ -7,11 +7,10 @@ id: site_settings: - discourse_narrative_bot_enabled: 'Aktifkan Discourse Narrative Bot' disable_discourse_narrative_bot_welcome_post: "Matikan kiriman selamat datang dari Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Nama Pengguna yang diabaikan oleh Discourse Narrative Bot" discourse_narrative_bot_disable_public_replies: "Matikan balasan publik oleh Discourse Narrative Bot" - discourse_narrative_bot_welcome_post_type: "Ketik kiriman selamat datang yang akan dikirim oleh Discourse Narrative Bot" + discourse_narrative_bot_welcome_post_type: "Tipe kiriman selamat datang yang akan dikirim oleh Discourse Narrative Bot" discourse_narrative_bot_welcome_post_delay: "Tunggu (n) detik sebelum Discourse Narrative Bot mengirim pos selamat datang." badges: certified: diff --git a/plugins/discourse-narrative-bot/config/locales/server.it.yml b/plugins/discourse-narrative-bot/config/locales/server.it.yml index e012e61dea..6c7dd0067f 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.it.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.it.yml @@ -7,7 +7,6 @@ it: site_settings: - discourse_narrative_bot_enabled: 'Abilita Discourse Narrative Bot' disable_discourse_narrative_bot_welcome_post: "Disabilita il messaggio di benvenuto di Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Nomi utente che Discourse Narrative Bot deve ignorare" discourse_narrative_bot_disable_public_replies: "Disabilita le risposte pubbliche da Discourse Narrative Bot" @@ -289,7 +288,7 @@ it: Hmm… sembra che tu abbia qualche problema. Mi dispiace. Hai cercato il termine **capi​bara**? end: message: |- - Grazie per avermi seguito @%{username}! Ho fatto questo per te, penso che te lo sei guadagnato: + Grazie per avermi seguito finora @%{username}! Ho fatto questo certificato per te, penso che te lo sia guadagnato: %{certificate} @@ -357,6 +356,12 @@ it: reply: |- Eccellente! Ricorda che ciò funziona sia per le categorie _sia_ per le etichette, se queste etichette sono abilitate. change_topic_notification_level: + instructions: |- + Ogni argomento ha un livello di notifica. Parte da 'Normale', il che significa che riceverai una notifica quando qualcuno parlerà direttamente con te. + + Per impostazione predefinita, il livello di notifica per un messaggio privato è impostato al livello più alto 'In osservazione', il che significa che riceverai una notifica ad ogni nuovo messaggio. Ma puoi sovrascrivere il livello di notifica per _ogni_ argomento su 'In osservazione', 'Seguito' o 'Silenziato'. + + Prova a modificare il livello di notifica per questo argomento. In fondo alla discussione, troverai un pulsante che ti mostrerà che questo argomento è **In osservazione** . Puoi modificare il livello di notifica a **Seguito**? not_found: |- Sembra che tu stia ancora osservando :eyes: questo argomento! Se hai problemi a trovarlo, il pulsante relativo al livello della notifica è situato in fondo all'argomento. reply: |- @@ -385,6 +390,20 @@ it: * :-1: [/poll] details: + instructions: |- + Qualche volta potresti voler **nascondere dei dettagli** nelle tue risposte: + + - Quando si stanno discutento punti della trama di un film o di uno show televisivo che potrebbero essere considerati degli spoiler. + + - Quando il tuo messaggio necessita di molti dettagli opzionali che potrebbero intralciare la lettura se letti tutti in una volta. + + [details=Seleziona qui per vedere come funziona!] + 1. Clicca il pulsante rotella nell'editor. + 2. Seleziona "Nascondi Dettagli". + 3. Inserisci un riassunto dei dettagli. + [/details] + + Riesci ad usare il pulsante rotella nell'editor per aggiungere una sezione dettagli nella tua prossima risposta? not_found: |- Hai problemi a creare un widget con dei dettagli? Prova a includere quello che segue nella tua prossima risposta: @@ -397,11 +416,11 @@ it: Ottimo lavoro — la tua attenzione per i _dettagli_ è ammirevole! end: message: |- - Hai affrontato tutto questo come un _utente avanzato_ infatti :bow: + Hai davvero affrontato tutto ciò da _utente avanzato_ :bow: %{certificate} - Questo è tutto quello che posso fare per te. + Questo è quanto. Arrivederci per adesso! Se desideri parlare di nuovo con me mandami un messaggio in qualsiasi momento :sunglasses: certificate: diff --git a/plugins/discourse-narrative-bot/config/locales/server.ko.yml b/plugins/discourse-narrative-bot/config/locales/server.ko.yml index 1ee4c2b9be..5edd0f075e 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ko.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ko.yml @@ -7,7 +7,6 @@ ko: site_settings: - discourse_narrative_bot_enabled: 'Discourse ì´ì•¼ê¸°ë´‡ 활성화' disable_discourse_narrative_bot_welcome_post: "Discourse ì´ì•¼ê¸°ë´‡ í™˜ì˜ í¬ìŠ¤íŠ¸ 비활성화" discourse_narrative_bot_ignored_usernames: "Discourse ì´ì•¼ê¸°ë´‡ì´ 무시할 ì‚¬ìš©ìž ì•„ì´ë””" discourse_narrative_bot_disable_public_replies: "Discourse ì´ì•¼ê¸°ë´‡ì˜ 공개 답글 비활성화" diff --git a/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml b/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml index b66fef32b5..dafd270d8f 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml @@ -7,7 +7,6 @@ nb_NO: site_settings: - discourse_narrative_bot_enabled: 'Aktiver Discourse Fortellerbot' disable_discourse_narrative_bot_welcome_post: "Deaktiver velkomstinnlegget fra Discourse Fortellerbot" discourse_narrative_bot_ignored_usernames: "Brukernavn som Discourse Fortellerbot skal ignorere" discourse_narrative_bot_disable_public_replies: "Deaktiver Ã¥pne svar fra Discourse Fortellerbot" diff --git a/plugins/discourse-narrative-bot/config/locales/server.nl.yml b/plugins/discourse-narrative-bot/config/locales/server.nl.yml index 7d74e3beca..118225ce11 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.nl.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.nl.yml @@ -7,7 +7,6 @@ nl: site_settings: - discourse_narrative_bot_enabled: 'Discourse Narrative Bot inschakelen' disable_discourse_narrative_bot_welcome_post: "Discourse Narrative Bot welkomstbericht uitschakelen" discourse_narrative_bot_ignored_usernames: "Gebruikersnamen die de Discourse Narrative Bot moet negeren" discourse_narrative_bot_disable_public_replies: "Antwoorden door de Discourse Narrative Bot uitschakelen" diff --git a/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml b/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml index 75989af67d..61c5ddf23e 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml @@ -7,7 +7,6 @@ pl_PL: site_settings: - discourse_narrative_bot_enabled: 'Włącz bota Discourse Narrative' disable_discourse_narrative_bot_welcome_post: "Dezaktywuj wpis powitalny Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Nazwy użytkownika, które bot Discourse Narrative powinien zignorować" discourse_narrative_bot_disable_public_replies: "Wyłącz publiczne odpowiedzi bota Discourse Narrative" diff --git a/plugins/discourse-narrative-bot/config/locales/server.pt.yml b/plugins/discourse-narrative-bot/config/locales/server.pt.yml index d6f8fb6d76..d4c9dcbff1 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.pt.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.pt.yml @@ -7,7 +7,6 @@ pt: site_settings: - discourse_narrative_bot_enabled: 'Ativar Discourse Narrative Bot' disable_discourse_narrative_bot_welcome_post: "Desativar a publicação de boas-vindas do Discourse Narrative Bot" discourse_narrative_bot_ignored_usernames: "Nomes de utilizador que o Discourse Narrative Bot deverá ignorar" discourse_narrative_bot_disable_public_replies: "Desativar as respostas públicas do Discourse Narrative Bot" diff --git a/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml b/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml index 76b2222f7b..431205a26d 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml @@ -7,7 +7,6 @@ pt_BR: site_settings: - discourse_narrative_bot_enabled: 'Habilitar o Robô de Narrativas do Discourse' disable_discourse_narrative_bot_welcome_post: "Desabilitar a mensagem de boas vindas do Robô de Narrativas do Discourse" discourse_narrative_bot_ignored_usernames: "Nomes de Usuário que o Robô de Narrativas do Discourse deve ignorar" discourse_narrative_bot_disable_public_replies: "Desabilitar respostas públicas do Robô de Narrativas do Discourse" @@ -56,7 +55,7 @@ pt_BR: quote: "A liberdade não vale a pena se não conota liberdade para errar." author: "Mahatma Gandhi" '3': - quote: "Não chore por que acabou, sorria por que aconteceu." + quote: "Não chore por que acabou, sorria porque aconteceu." author: "Dr Seuss" '4': quote: "Se você quer que algo seja feito corretamente, faça você mesmo." @@ -68,7 +67,7 @@ pt_BR: quote: "A vida é como uma caixa de chocolates. Você nunca sabe o que vai conseguir." author: "Mãe do Forrest Gump" '7': - quote: "Um pequeno passo para um homem, uma grande salto para a humanidade." + quote: "Um pequeno passo para um homem, um grande salto para a humanidade." author: "Neil Armstrong" '8': quote: "Faça uma coisa por dia que te assuste." @@ -94,8 +93,10 @@ pt_BR: '8': "Boa perspectiva" '9': "Sim" '10': "Sinais apontam que sim" + '11': "Responder hazy tente novamente" '12': "Pergunte novamente depois" '13': "Melhor não falar pra você agora" + '14': "não pode prever agora" '15': "Concentre-se e pergunte novamente" '16': "Não conte com isso" '17': "Minha resposta é não" @@ -116,6 +117,15 @@ pt_BR: `@%{discobot_username} %{reset_trigger} %{default_track}` >Comece com uma das seguintes narrativas: %{tracks}. + bot_actions: |- + `@%{discobot_username} %{dice_trigger} 2d6` + > :game_die: 3, 6 + + `@%{discobot_username} %{quote_trigger}` + > :left_speech_bubble: _Realize um ato aleatório de bondade, sem expectativa de recompensa, seguro sabendo que um dia alguém poderá fazer o mesmo por você_ & mdash; princesa Diana + + `@%{discobot_username} %{magic_8_ball_trigger}` + > :crystal_ball: Você pode contar com ele do_not_understand: first_response: |- Oi, obrigado pela resposta! @@ -142,11 +152,277 @@ pt_BR: - Nós acreditamos em um {comunidade com comportamento civilizado](/guidelines) em todos os momentos. onebox: + instructions: |- + Em seguida, você pode compartilhar um desses links comigo? Responda com ** um link em uma linha sozinho ** e ele será expandido automaticamente para incluir um resumo interessante. + + Para copiar um link, toque e segure no celular ou clique com o botão direito do mouse: + + - https://en.wikipedia.org/wiki/Inherently_funny_word + - https://en.wikipedia.org/wiki/Death_by_coconut + - https://en.wikipedia.org/wiki/Calculator_spelling reply: |- Legal! isto vai funcionar para a maioria dos links. Lembre-se, deve estar na linha _all by itself_, com nada na frente ou atrás. + not_found: |- + Desculpe, não consegui encontrar o link na sua resposta! :choro: + + Você pode tentar adicionar o seguinte link, em sua própria linha, na sua próxima resposta? + + images: + instructions: |- + Aqui está uma foto de um unicórnio: + + + + Se você gostou (e quem não gostaria!) Vá em frente e aperte o botão like: heart: abaixo deste post para me avisar. + + Você pode ** responder com uma foto? ** Qualquer imagem vai fazer! Arraste e solte, pressione o botão de upload ou copie e cole. + reply: |- + Imagem bacana - eu apertei o botão like: heart: para que você saiba o quanto eu gostei: heart_eyes: like_not_found: |- Você esqueceu de curtir :heart: meu [post?](%{url}) + not_found: |- + Parece que você não fez o upload de uma imagem, por isso escolhi uma foto que certamente você irá gostar. + + `%{image_url}` + + Tente fazer o upload da próxima ou colá-la em uma linha! formatting: + instructions: |- + Você pode fazer algumas palavras ** negrito ** ou _italic_ na sua resposta? + + - digite `** negrito **` ou `_itálico_` + + - ou, empurre o B or I botões no editor reply: |- Ótimo! HTML e BBCode também servem para formatação - para saber mais, [veja este tutorial](http://commonmark.org/help) :nerd: + not_found: |- + Não encontrei nenhuma formatação na sua resposta. : pencil2: + + Você pode tentar de novo? Use oB negrito ou I itálico no editor se você ficar preso. + quoting: + instructions: |- + Você pode tentar me citar quando responder, então eu sei exatamente a qual parte você está respondendo? + + > Se isso é café, por favor, me traga um pouco de chá; mas se isso é chá, por favor, me traga um pouco de café. + > + > Uma vantagem de falar consigo mesmo é que você sabe que pelo menos alguém está ouvindo. + > + > Algumas pessoas têm jeito com as palavras e outras pessoas ... ah, não tem jeito. + + Selecione o texto de qualquer & uarr; Cite sua preferência e, em seguida, pressione o botão ** Citar ** que aparece sobre sua seleção - ou o botão ** Responder ** na parte inferior desta postagem. + + Abaixo da citação, digite uma palavra ou duas sobre por que você escolheu essa, porque estou curioso: pensando: + reply: |- + Bom trabalho, você escolheu minha citação favorita! : left_speech_bubble: + not_found: |- + Hmm, parece que você não me citou na sua resposta? + + Selecionar qualquer texto na minha postagem trará o botão**Citação**. E pressionar ** Responder ** com qualquer texto selecionado também funcionará! Você pode tentar de novo? + bookmark: + instructions: |- + Se você quiser saber mais, selecione abaixo e **favoritar esta mensagem pessoal **. Se você fizer isso, pode haver um: presente: no seu futuro! + reply: |- + Excelente! Agora você pode encontrar facilmente o caminho de volta à nossa conversa particular a qualquer momento, diretamente da [guia de favoritos do seu perfil] (%{profile_page_url}/activity/bookmarks). Basta selecionar sua foto de perfil no canto superior direito ↗ + not_found: |- + Uh, não vejo nenhum favorito neste tópico. Você encontrou o marcador em cada postagem? Use o mostrar mais para revelar ações adicionais, se necessário. + emoji: + instructions: |- + Você pode ter me visto usando pequenas imagens em minhas respostas: blue_car :: dash: são chamadas de [emoji] (https://en.wikipedia.org/wiki/Emoji). Você pode ** adicionar um emoticon ** à sua resposta? Qualquer um desses funcionará: + + - Tipo`:) ;) :D :P :O` + + - Digite dois pontos : então complete o nome do emoji `: tada:` + + -Pressione o botão de emoticon no editor ou no teclado do seu celular + reply: |- + Isso é: brilhos: _emojitastic! _: Brilhos: + not_found: |- + Oops, não vejo nenhum Emoji na sua resposta? Ah não! :soluço: + + Tente digitar dois pontos : para abrir o seletor de emoji, digite as primeiras letras do que você deseja, como `: bird:` + + Ou pressione o botão de emoticon no editor. + + (Se você estiver em um dispositivo móvel, também poderá inserir o Emoji diretamente do teclado.) + mention: + instructions: |- + Às vezes, você pode querer chamar a atenção de uma pessoa, mesmo que não esteja respondendo diretamente a ela. Digite `@` e preencha seu nome de usuário para mencioná-los. + + Você pode mencionar ** `@%{discobot_username}`** na sua resposta? + reply: |- + Alguém disse meu nome? _: Raised_hand: Eu acredito que você fez! : wave: Bem, aqui estou eu! Obrigado por me mencionar. : ok_hand: + not_found: |- + Eu não vejo meu nome em nenhum lugar: franzindo a testa: você pode tentar me mencionar como `@%{discobot_username}` de novo? + + (E sim, meu nome de usuário é soletrado _disco_, como na mania de dança dos anos 70. Eu amo a vida noturna!](https://www.youtube.com/watch?v=B_wGI3_sGf8) :dancer:) + flag: + instructions: |- + Nós gostamos de nossas discussões amigáveis, e precisamos da sua ajuda para [manter as coisas civilizadas](%{guidelines_url}). Se você encontrar algum problema, sinalize para permitir em particular ao autor ou [nossa equipe](%{about_url}), saber sobre isso. + + > :imp: Eu escrevi algo desagradável aqui + + Eu acho que você sabe o que fazer. Vá em frente e ** marque esta postagem ** como inapropriado! + reply: |- + [Nossa equipe] (/ grupos / equipe) será notificada em particular sobre sua bandeira. Se um número suficiente de membros da comunidade sinalizar uma postagem, ela também será ocultada automaticamente como precaução. (Como eu realmente não escrevi uma postagem desagradável: angel :, eu fui em frente e removi a bandeira por enquanto.) + not_found: |- + Ah, não, minha postagem desagradável ainda não foi sinalizada. : preocupado: você pode sinalizá-lo como impróprio usando o ** flag ** ? Não se esqueça de usar o botão Mostrar mais para revelar mais ações para cada postagem. + search: + instructions: |- + _psst_… escondi uma surpresa neste tópico. Se você está pronto para o desafio, ** selecione o ícone de pesquisa ** no canto superior direito ↗ to search for it. + + Tente pesquisar pelo termo "capy & # 8203; bara" neste tópico + hidden_message: |- + Como você perdeu esta capivara? :piscadela: + + + + Você percebeu que agora está de volta ao começo? Alimente esta pobre capivara faminta ** respondendo com o `: herb:` emoji ** e você será levado automaticamente para o final. + reply: |- + Você encontrou: tada: + + - Para pesquisas mais detalhadas, vá para a [página de pesquisa completa](%{search_url}). + + -Para pular em qualquer lugar em uma longa discussão, experimente os controles do cronograma do tópico à direita (e em baixo, no celular). + + - Se você tiver um : teclado físico :, pressione? para ver nossos atalhos de teclado úteis. + not_found: |- + Hmm… parece que você pode estar com problemas. Me desculpe por isso. Você pesquisou pelo termo **capy​bara**? + end: + message: |- + Obrigado por ficar comigo @%{username}! Eu fiz isso para você, acho que você ganhou: + + %{certificate} + + É tudo por agora! Confira [** nossos tópicos de discussão mais recentes **] (/ mais recentes) ou [** categorias de discussão **] (/ categorias). :oculos de sol: + + (Se você quiser falar comigo novamente para saber mais, apenas envie uma mensagem ou mencione `@%{discobot_username}` a qualquer hora!) + certificate: + alt: 'Certificado de conclusão' + advanced_user_narrative: + reset_trigger: 'usuário avançado' + cert_title: "Em reconhecimento da conclusão bem-sucedida do tutorial do usuário avançado" + title: ': arrow_up: recursos avançados do usuário' + start_message: |- + Como usuário _advanced_, você já visitou [sua página de preferências] (/ my / preferences) ainda @%{username}? Existem muitas maneiras de personalizar sua experiência, como selecionar um tema claro ou escuro. + + Mas eu discordo, vamos começar! + edit: + bot_created_post_raw: "@%{discobot_username} é, de longe, o bot mais legal que conheço: wink:" + instructions: |- + Todo mundo comete erros. Mas não se preocupe, você sempre pode editar suas postagens para corrigi-las. + + Você pode começar ** editando ** o post que acabei de criar em seu nome? + not_found: |- + Parece que você ainda não editou a [postagem](%{url}) Eu criei para você. Você pode tentar de novo? + + Use o ícone para trazer o editor. + reply: |- + Ótimo trabalho! + + Observe que as edições feitas após 5 minutos aparecerão como revisões de edição pública e um pequeno ícone de lápis aparecerá no canto superior direito com a contagem de revisão. + delete: + instructions: |- + Se você quiser retirar uma postagem, pode excluí-la. + + Vá em frente e ** delete ** qualquer uma das suas postagens acima usando a ação ** delete **. Não exclua a primeira postagem! + not_found: |- + Ainda não vejo nenhuma postagem excluída? Lembre-se que mostrar mais revelará delete. + reply: |- + Whoa! :boom: + + Para preservar a continuidade das discussões, as exclusões não são imediatas, portanto, a postagem será removida depois de algum tempo. + recover: + deleted_post_raw: 'Por que @ %{discobot_username} excluiu minha postagem? angustiado:' + instructions: |- + Ah não! Parece que eu acidentalmente excluí um novo post que acabei de criar para você. + + Você pode me fazer um favor e **desfazer** isso? + not_found: |- + Tem problemas? Lembre-se que mostrar mais revelerá desfazer isso. + reply: |- + Ufa, esse foi um dos próximos! Obrigado por corrigir isso: wink: + + Observe que você só tem 24 horas para recuperar uma postagem. + category_hashtag: + instructions: |- + Você sabia que pode se referir a categorias e tags em sua postagem? Por exemplo, você viu a %{category} categoria? + + Digite `#` no meio de uma sentença e selecione qualquer categoria ou tag. + not_found: |- + Hmm, eu não vejo uma categoria lá em nenhum lugar. Note que `#` não pode ser o primeiro caractere. Você pode copiar isso na sua próxima resposta? + ```texto + Eu posso criar um link de categoria via # + ``` + reply: |- + Excelente! Lembre-se de que isso funciona para as tags _and_ de categorias, se as tags estiverem ativadas. + change_topic_notification_level: + instructions: |- + Todo tópico tem um nível de notificação. Começa em "normal", o que significa que você normalmente só será notificado quando alguém estiver falando diretamente com você. + + Por padrão, o nível de notificação de uma mensagem particular é definido como o nível mais alto de "observação", o que significa que você será notificado sobre cada nova resposta. Mas você pode substituir o nível de notificação de _qualquer_ tópico para "assistir", "acompanhar" ou "silenciado". + + Vamos tentar alterar o nível de notificação para este tópico. Na parte inferior do tópico, você encontrará um botão que mostra que ** está assistindo ** este tópico. Você pode alterar o nível de notificação para ** rastreamento **? + not_found: |- + Parece que você ainda está assistindo: eyes: this topic! Se você estiver com dificuldades para encontrá-lo, o botão do nível de notificação está localizado na parte inferior do tópico. + reply: |- + Ótimo trabalho! Espero que você não tenha ignorado este tópico, já que às vezes posso ser um pouco falador: sorriso. + + Observe que, quando você responde a um tópico ou lê um tópico por mais de alguns minutos, ele é automaticamente definido para um nível de notificação de 'rastreamento'. Você pode alterar isso em [suas preferências de usuário] (/ my / preferences). + poll: + instructions: |- + Você sabia que pode adicionar uma enquete a qualquer postagem? Tente usar a engrenagem no editor para ** construir uma enquete ** + not_found: |- + Ops! Não houve qualquer pesquisa na sua resposta. + + Use o ícone de roda dentada no editor ou copie e cole essa pesquisa na sua próxima resposta: + + ```texto + [poll] + * :cat: + * :dog: + [/poll] + ``` + reply: |- + Ei, boa enquete! Como eu faço para ensinar você? + + [poll] + * :+1: + * :-1: + [/poll] + details: + instructions: |- + Às vezes, você pode ** ocultar detalhes ** em suas respostas: + + -Quando você está discutindo pontos de trama de um filme ou programa de TV que seria considerado um spoiler. + + - Quando sua postagem precisar de muitos detalhes opcionais que podem ser impressionantes quando lidos de uma só vez. + + [detalhes = Selecione para ver como funciona!] + 1. Selecione a engrenagem no editor. + 2. Selecione "Ocultar detalhes". + 3. Edite o resumo de detalhes e adicione seu conteúdo. + [/ detalhes] + + Você pode usar a engrenagem no editor para adicionar uma seção de detalhes para sua próxima resposta? + not_found: |- + Está com problemas para criar um widget de detalhes? Tente incluir o seguinte na sua próxima resposta: + + ```texto + [details=Selecione-me para detalhes] + Aqui estão os detalhes + [/detalhes] + ``` + reply: |- + Ótimo trabalho - sua atenção para _detalhes_ é admirável! + end: + message: |- + Você brilhou através disso como um usuário avançado - de fato: arco: + + %{certificate} + + É tudo que tenho para você. + + Adeus por agora! Se você quiser falar comigo novamente, envie-me uma mensagem a qualquer momento: óculos de sol: + certificate: + alt: 'Certificado Avançado de Conquista da Trilha do Usuário' diff --git a/plugins/discourse-narrative-bot/config/locales/server.ru.yml b/plugins/discourse-narrative-bot/config/locales/server.ru.yml index 9afd3a0343..b0ef9909cd 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ru.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ru.yml @@ -7,7 +7,6 @@ ru: site_settings: - discourse_narrative_bot_enabled: 'Включить диÑкуÑÑионный бот' disable_discourse_narrative_bot_welcome_post: "Отключить приветÑтвенный поÑÑ‚ от бота" discourse_narrative_bot_ignored_usernames: "Имена пользователей, которые Ñледует игнорировать" discourse_narrative_bot_disable_public_replies: "Отключить общедоÑтупные ответы в боте." diff --git a/plugins/discourse-narrative-bot/config/locales/server.sk.yml b/plugins/discourse-narrative-bot/config/locales/server.sk.yml index 7a9e40bc74..eaf2848a6d 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.sk.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.sk.yml @@ -7,7 +7,6 @@ sk: site_settings: - discourse_narrative_bot_enabled: 'PovoliÅ¥ Rozprávacieho Robota Discourse' disable_discourse_narrative_bot_welcome_post: "Vypnúť uvítací príspevok Rozprávacieho Robota Discourse" discourse_narrative_bot_ignored_usernames: "Používateľské mená, ktoré má Rozprávací Robot Discourse ignorovaÅ¥" discourse_narrative_bot_disable_public_replies: "Vypnúť verejné odpovede Rozprávacieho Robota Discourse" diff --git a/plugins/discourse-narrative-bot/config/locales/server.sv.yml b/plugins/discourse-narrative-bot/config/locales/server.sv.yml index a66143cd3c..548aa6e73c 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.sv.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.sv.yml @@ -7,7 +7,6 @@ sv: site_settings: - discourse_narrative_bot_enabled: 'Aktivera Discourse digitala hjälpreda ' disable_discourse_narrative_bot_welcome_post: "Avaktivera introduktionsmeddelandet frÃ¥n Discourse digitala hjälpreda " discourse_narrative_bot_ignored_usernames: "Användarnamn som Discourse digitala hjälpreda bör ignorera" discourse_narrative_bot_disable_public_replies: "Inaktivera publika svar frÃ¥n Discourse digitala hjälpreda " diff --git a/plugins/discourse-narrative-bot/config/locales/server.sw.yml b/plugins/discourse-narrative-bot/config/locales/server.sw.yml new file mode 100644 index 0000000000..59103d5ca3 --- /dev/null +++ b/plugins/discourse-narrative-bot/config/locales/server.sw.yml @@ -0,0 +1,424 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + site_settings: + disable_discourse_narrative_bot_welcome_post: "Sitisha Roboti wa Discourse kukaribisha watu na taarifa" + discourse_narrative_bot_ignored_usernames: "Majina ya watumiaji ambayo Roboti wa Discourse aya dharau" + discourse_narrative_bot_disable_public_replies: "Sitisha majibu ya umma ya roboti wa Discourse" + discourse_narrative_bot_welcome_post_type: "Aina ya ujumbe wa kukaribisha watu, roboti wa Discourse atatuma" + discourse_narrative_bot_welcome_post_delay: "Subiria sekunde (n) kabla ya kutuma ujumbe wa ukaribisho kutoka kwa Roboti wa Discourse." + badges: + certified: + name: Imethibitishwa + description: "Amepitia taarifa za utambulisho" + long_description: | + Utapata hii beji ukimaliza kuapitia taarifa za utambulisho. Umechukua mda kupitia taarifa za awali za majadiliano kwenye mtandao huu, na umethibitishwa kuwa mjuzi + licensed: + name: Imesajiliwa + description: "Umemaliza mafunzo yetu ya kiwango cha juu" + long_description: | + Hii beji inapewa kwa mtu aliyemaliza kupitia mafunzo yetu ya juu. Umepata mafunzo hayo ya juu kuhusu majadiliano - na sasa umethibitishwa! + discourse_narrative_bot: + bio: "Habari, mimi sio mtu bali ni roboti. Ningependa nikufundishe kuhusu hii tovuti. Kuwasiliana na mimi, nitumie ujumbe au nitaje **@%{discobot_username}** popote." + timeout: + message: |- + Habari @%{username}, nakujulia hali kwa sababu sijakuona nina mda + + - Kuendelea, nijibu mda wowote. + + - Ukipenda kuruka hii hatua, sema `%{skip_trigger}`. + + - Kuanza upya, sema '%{reset_trigger}`. + + Kama unaona hakuna umuhimu, ni sawa tu. Mimi ni roboti. Hautaumiza hisia zangu. :sob: + dice: + trigger: "zungusha" + not_enough_dice: |- + Nina dadu %{num_of_dice}. [Aibu] (http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php), najua! + results: |- + > :game_die: %{results} + quote: + trigger: "nukulu" + '1': + quote: "Katikati ya kila ugumu kuna fursa" + author: "Albert Einstein" + '2': + quote: "Hakuna umuhimu wa kuwa na uhuru kama hakuna uhuru wa kufanya makosa." + author: "Mahatma Gandhi" + '3': + quote: "Usilie sababu imeisha, tabasamu kwa sababu ilitokea." + author: "Dr Seuss" + '4': + quote: "Ukitaka kitu kifanyike vizuri, fanya mwenyewe." + author: "Charles-Guillaume Étienne" + '5': + quote: "Amini kuwa unaweza na utakuwa umemaliza nusu ya safari." + author: "Theodore Roosevelt" + '6': + quote: "Maisha ni kama sanduku la chocolate. Hauwezi kujua utapata nini." + author: "Mama yake na Forrest Gump" + '7': + quote: "Hiyo ni hatua moja kwa mtu, hatua kubwa kwa binadamu." + author: "Neil Armstrong" + '8': + quote: "Kila siku fanya kitu ninachokutisha." + author: "Eleanor Roosevelt" + '9': + quote: "Makosa yanasemehewa, kama mtendaji yuko tayari kukiri." + author: "Bruce Lee" + '10': + quote: "Chochote ambacho akili ya binadamu inaweza kufikiria na kuamini, inaweza kukifanya." + author: "Napoleon Hill" + results: |- + > :left_speech_bubble: _%{quote}_ — %{author} + magic_8_ball: + trigger: 'Mali au Bahati' + answers: + '1': "Inawezekana" + '2': "Imeamuliwa kuwa hivyo" + '3': "Hakuna shaka" + '4': "Kweli kabisa" + '5': "Unaweza ukaiamini" + '6': "Kana ninavyoiona, ndio" + '7': "Inawezekana kuwa hivyo" + '8': "Outlook iko vizuri" + '9': "Ndio" + '10': "Ishara inaonekana kuwa ndio" + '11': "Jibu halipo vizuri jaribu tena" + '12': "Tafadhali, uliza tena baadae" + '13': "Afadhali kutokukwambia kwa sasa" + '14': "Haiwezi ikabashiri sasa hivi" + '15': "Kuwa makini na uliza tena" + '16': "Usiwe na hakika nacho" + '17': "Jibu langu ni hapana" + '18': "Ufuo wangu umesema hapana" + '19': "Outlook haiko vizuri" + '20': "Uhakika Kidogo Sana" + result: |- + > :crystal_ball: %{result} + track_selector: + reset_trigger: 'mwanzo' + skip_trigger: 'ruka' + help_trigger: 'onyesha msaada' + random_mention: + reply: |- + Habari! kujua ninachoweza kufanya andika `@%{discobot_username}%{help_trigger}`. + tracks: |- + Kwa sasa najua kufanya vitu vifuatavyo: + + `@%{discobot_username}%{reset_trigger}%{default_track}` + >Anzisha mazungumzo: %{tracks} + bot_actions: |- + `@%{discobot_username}%{dice_trigger} 2d6` + > :game_die: 3 ,6 + + `@%{discobot_username}%{quote_trigger}` + > :left_speech_bubble:_Fanya vitendo vya huruma na upendo, bila kutegemea tuzo, ukijua kuwa siku moja mtu atakufanyia hivyo pia_— Princess Diana + + `@%{discobot_username}%{magic_8_ball_trigger}` + >mpira_fuwele: Unaweza ukautegemea + do_not_understand: + first_response: |- + Habari, asante kwa jibu lako! + + Kwa bahati mbaya, mimi kama roboti sijatengenezwa vizuri sana, nimeshindwa kuelewa ulichokiandika. :frowning: + track_response: Unaweza kujaribu tena, au kama ungependa kuruka hatua hii, andika `%{skip_trigger}`. Kuanza upya, andika `%{reset_trigger}`. + second_response: |- + Oh, jamani. Bado Nashindwa kukuelewa. :anguished: + + Mimi ni roboti tu, kama hautajali unaweza kuwasiliana na binadamu, tembelea [ukurasa wa mawasiliano](/kuhusu) + + Kwa sasa, nitakaa pembeni. + new_user_narrative: + reset_trigger: "mtumiaji mpya" + cert_title: "Utambulisho wa kumaliza mafunzo ya mtumiaji mpya" + hello: + title: ":robot: Habari!" + message: |- + Asante kwa kujiunga na %{title}, na karibu! + + - Mimi ni roboti, lakini [wasaidizi wetu](/kuhusu) nao wapo kwa ajili yako kama unahitaji kuongea na mtu/binadamu. + + - Kwa ajili ya ulinzi na usalama, kuna vitu hautaweza kufanya kama mtumiaji mpya. Utapata uwezo (na [nembo](/nembo)) jinsi tutakavyozidi kukujua wewe. + + - Tunaamini na kuheshimu [mwenendo mzuri wa kijamii](/miongozo) mda wote. + onebox: + instructions: |- + Baada ya hapo, je unaweza kunipa hivi viungo na mimi? Jibu na **kila kiungo kwenye mstari wake**, na itaongezeka kuonyesha muhtasari kuhusiana na hicho kiungo. + + Kunakili kiungo, bonyeza bila kuachia kwenye simu yako ya mkononi, au bonyeza upande wa kulia wa puku ya komputa yako: + + - https://en.wikipedia.org/wiki/Inherently_funny_word + - https://en.wikipedia.org/wiki/Death_by_coconut + - https://en.wikipedia.org/wiki/Calculator_spelling + reply: |- + Vizuri! Hii itafaa kwa viungo. Kumbuka, inabidi kiwe kwenye mstari mmoja _yenyewe_, bila maneno yoyote mbele, au nyuma yake. + not_found: |- + Samahani, Sijaona kiungo kwenye jibu lako! :cry: + + Unaweza kuongeza kiungo, kwenye mstari wake pekee, kwenye jibu lako lipya? + + + images: + instructions: |- + Hii ni picha ya farasi: + + + + Kama unaipenda (kwa nini usiipende!) bonyeza kitufe cha :moyo chini ya taarifa na nijulishe. + + Je unaweza **kunijibu na picha?** Picha yoyote tu itafaa! Unaweza kuiweka, kuipakia au kuinakili na kuibandika hapa. + reply: |- + Picha nzuri -- Nimebonyeza kitufe cha :moyo: kuonyesha shukrani yangu kwako :heart_eyes_: + like_not_found: |- + Je ulisahau kuipenda :heart: [taarifa] yangu?(%{url}) :crying_cate_face: + not_found: |- + Inaonekana haujaweka picha kwa hiyo nimechagua picha_na uhakika_utaipenda. + + `%{image_url}` + + Jaribu kuweka ya kwako mwenyewe baada ya hii, au bandika kiungo kimoja kwenye mstari pekee! + formatting: + instructions: |- + Unaweza **kukoza** au _italiki_kwenye jibu lako? + + - andika `**koza**` au `_italiki_` + + -au, bonyeza vitufe vya B au I kwenye sehemu ya kuandika + reply: |- + Kazi nzuri! HTML na BBCode zinaumbiza - kujifunza zaidi, [jaribu fundisho hili] (http://commonmark.org/help) :nerd: + not_found: |- + Sijaona mtindo kwenye jibu lako. :pencil2: + + Unaweza ukajaribu tena? Bofya vitufe B koza au I italiki kwenye sehemu ya marekebisho kama ukikwama. + quoting: + instructions: |- + Unaweza kuninukulu mimi ukiwa unajibu, ili niweze kujusa sehemu gani unaijibu? + + > Kama hii ni kahawa, naomba uniletee chai; kama hii ni chai, naomba uniletee kahawa. + + > Faida moja ya kuongea mwenyewe, ni kuwa kuna mtu mmoja anakusikiliza. + > + > Kuna watu ambao wako vizuri na maneno, na kuna watu...oh, uh, sio kivile. + + Chagua maneno yoyote ↑ nukulu unayopendelea, na bonyeza kitufe cha **Nukulu** kitakacho tokea - au kifute cha **Jibu** chini kabisa ya hizi taariga. + + + Chini ya nukulu, andika neno moja au mawili kwa nini umechagua nukulu hiyo, kwa sababu ningependa kujua :thinking: + reply: |- + Umefanya vizuri, umechagua nukulu ninayoipenda pia! :left_speech_bubble: + not_found: |- + Inaonekana haukunikulu mimi kwenye jibu lako? + + Chagua neno lotote kwenye taarifa yangu italeta kitufe cha**Nukulu**. Na ukibonyeza **Jibu** na maneno yoyote uliyoyachagua, itakubali pia! Unaweza kujaibu tena? + bookmark: + instructions: |- + Kama ukipenda kujifunza zaidi, chagua chini na **alamisha ujumbe huu binafsi**. Ukifanya hivyo, unaweza kupata :gift: baadae! + reply: |- + Vizuri! Sasa unaweza kurudi kwenye maongezi yetu binafsi mda wowote, kupitia [kichupo cha mialamisho kwenye umbo lako](%{profile_page_url}/activity/mialamisho). Chagua umbo lako iliyopo juu upande wa kulia ↗ + not_found: |- + Nimeshindwa kuona mialamisho ya mada hii. Umeona alamisho yoyote kwenye kila chapisho? Tumia onyesha zaidi kuona vitendo zaidi kama vinahitajika. + emoji: + instructions: |- + Utakuwa umeona picha ndogo nilizotumia kwenye majibu yangu :blue_car::dash: hizo zinaitwa [emoji] (https://en.wikipedia.org/wiki/Emoji). Je unaweza **kuongeza emoji** kwenye jibu lako? Yoyote kati ya hizi zitafanya kazi: + + - Andika `:) ;) :D :P :O` + + - Andika nukta mbili :alafu malizia jina la emoji `:tada:` + + - Bofya kitufe cha emoji ndani ya sehemu ya kuhariri, au kwenye kibodi ya kifaa cha kiganjani. + reply: |- + Hiyo ni :sparkles: _emojitastic!_ :sparkles: + not_found: |- + Mmmh, nimeshindwa kuona Emoji yoyote kwenye jibu lako? Jamani! :sob: + + Jaribu kuandika nukta mbili : kuchagua emojis, alafu andika herufi za kwanza unazotaka, kama `:bird:` + + Au, bofya kitufe cha emoji kwenye sehemu ya kuhariri. + + (Kama unatumia kifaa cha kiganjani, unaweza kuingiza Emoji kutoka kwenye kibodi yako, pia.) + mention: + instructions: |- + Kuna mida utapenda kupata ufikivu wa mtumiaji mwingine, hata kama ukiwa hauwajibu. Andika `@` alafu andika jina analotumia kuwataja. + + Unaweza kutaja **`@%{discobot_username}`** kwenye jibu lako? + reply: |- + _Kuna mtu ametaja jina langu?_ :raised_hand: Nadhani umeniita! :wave: Haya, nimekuja! Asante kwa kunitaja. :ok_hand: + not_found: |- + Sioni jina langu popote :frowning: Unaweza ukajaribu kunitaja kama `@%{discobot_username}` tena? + + (Ndio, jina langu ni _disco_, kama miziki ya miaka ya 1970. Ni[napenda kusherehekea!] (https://www.youtube.com/watch?v=B_wGI3_sGf8) :dancer:) + flag: + instructions: |- + Tunapenda majadiliano yetu yawe ya kirafiki, na tunahitaji msaada wako [kuhakikisha kuwa vitu vipo kistaarabu au kiungwana](%{guidelines_url}). Kama ukiona tatizo lolote, tafadhali bonyeza bendera pembeni ya hiyo taarifa kumtujulisha mwandishi, au [wasaidizi wetu](%{about_url}), kujua kuhusiana na hilo tatizo. + + > :imp: Nimeandika kitu ambacho hakifai + + Nadhani unajua chakufanya, **Bonyeza hiyo bendera** kuashiria kuwa kuna tatizo na ujumbe uliosoma! + reply: |- + [Wasaidizi](/vikundi/wasaidizi) watajulishwa kwa ujumbe binafsi kuhusiana na bendera. Kama watumiaji wengi wakibonyeza bendera. Itafichwa hapo hapo kama tahadhari. (Kwa vile mimi siandikagi taarifa mbaya au chafu :angel:, Nimeitoa bendera kwa sasa.) + not_found: |- + Jamani, taarifa yangu chafu nilioandika bado haijapewa bendera. :worried: Unaweza ukamjulisha mtu kuwa ni chafu kwa kutumia **flag**? Usisahau kutumia kitufe za zaidikuonyesha vitendo zaidi kwa ajili ya kila taarifa. + search: + instructions: |- + _psst_ ...Nimeficha kitu kwenye hii mada. Kama unapenda kujua, **chagua ikoni ya utafiti** upande wa juu mkono wako wa kulia ↗ kukitafuta hicho kitu + + Jaribu kutafuta neno "capy​bara" kwenye hii mada + hidden_message: |- + Umepitwa vipi na capybara? :wink: + + + + Umegundua umerudi ulipoanza? Shibisha capybara mwenye njaa kwa **kuandika `:herb` ishara** na utapelekwa mwisho. + reply: |- + Nina furaha kuwa umeiona :tada: + + - Kwa utafiti wa ndani zaidi, nenda kwenye [utafiti wa karatasi yote](%{search_url}). + + -Kufika sehemu yoyote kwenye majadiliano, jaribu kutumia mfululizo wa mada kulingana na mda uliopo mkono wa kulia (na chini, kwenye kifaa cha kiganjani). + + -Kama una kibodi halisi :keyboard:, bonyeza ?kuona njia za mkato za kibodi. + not_found: |- + Hmm...inaonekana kama kuna tatizo. Samahani Sana. Je ulikuwa unatafuta kuhusiana na **capy​bara**? + end: + message: |- + Asante kwa kubaki na mimi @ %{username}! amekutengenezea hiki, Nadhani unastahili: + + %{certificate} + + Ni hilo tu kwa sasa! Tembelea [**mada za majadiliano zilizoongelewa hivi karibuni**](/karibuni) au [**vikundi vya majadiliano**](/majadiliano). : sunglasses: + (Ukipenda kujifunza zaidi, nitumie ujumbe mfupi au andika `@%{discobot_username}` mda wowote!) + certificate: + alt: 'Shahada ya Mafanikio' + advanced_user_narrative: + reset_trigger: 'mtumiaji wa hali ya juu' + cert_title: "Utambulisho wa kumaliza mafunzo ya mtumiaji mpya wa hali ya juu" + title: ':arrow_up: Vipengele vya mtumiaji wa hali ya juu' + start_message: |- + Kama mtumiaji_wa_hali_ya_juu, umetembela [ukurasa wa mapendekezo](/my/mapendekezo) @%{username}? Kuna njia nyingi za kugeuza kukufaa, kama kuchagua mandhari nyeupe au nyeusi. + + Anza kama upo tayari. + edit: + bot_created_post_raw: "@%{discobot_username} ni, kwa kirefu, roboti mjanja ninayemjua :wink:" + instructions: |- + Kila mtu anafanya makosa. Ila usijali, unaweza ukarekebisha makosa yako kwa huriri! + + Unaweza kuanza kwa **kuhariri** chapisho nililo kutengenezea? + not_found: |- + Inaonekana kuwa hauja hariri [chapisho](%{url}) nililokutengenezea. Unaweza kujaribu tena? + + Tumia ikoni kuonyesha sehemu ya kuhariri. + reply: |- + Kazi nzuri! + + Uhariri unaofanyika baada ya dakika 5 utatokea kama uhariri kwa umma, na ikoni ya penseli ndogo itatokea juu upande wa kulia ikiwa na namba ya sahihisho. + delete: + instructions: |- + Kama ukitaka kuondoa chapisho ulilotengeneza, unaweza kulifuta. + + **Futa** chapisho lolote juu kwa kutumia kitendo cha **kufuta** . Usifute chapisho la kwanza! + not_found: |- + Sioni machapisho yaliyofichwa? Kumbukaonyesha zaidi kuonyeshavilivyofutwa. + reply: |- + Whoa! :boom: + + Kuendeleza majadiliano, ufutaji hautatokea hapo hapo, chapisho litaondolewa baada ya mda fulani. + recover: + deleted_post_raw: 'Kwa nini @%{discobot_username} amefuta chapisho langu? :anguished:' + instructions: |- + Inaonekana kuwa nimefuta kimakosa chapisho langu jipya nililokutengenezea. + + Unaweza kunisaidia na **kulirudisha**? + not_found: |- + Je unapata tatizo? Kumbuka onyesha zaidi itaonyeshakurudisha. + reply: |- + Asante kwa kutatua tatizo :wink: + + Jua una masaa 24 kurudisha chapisho. + category_hashtag: + instructions: |- + Unajua unaweza kuongelea kategoria na lebo kwenye chapisho lako? Mfano, umeona kategoria %{category} hii? + + Andika `#` katikati ya sentensi na chagua kategoria au lebo yoyote. + not_found: |- + Hmm, Sioni kategoria yoyote. Jua kuwa `#` haiwezi kuwa herufi ya kwanza. Unaweza kunakili kwenye jibu lako linalokuja? + + ```neno + Ninaweza kutengeneza kiungo cha kategoria kupitia # + ``` + reply: |- + Vizuri sana! Kumbuka hii inafanya kazi kwenye kategoria _na_lebo kama lebo zikiruhusiwa. + change_topic_notification_level: + instructions: |- + Kila mada ina kiwango cha ujulishaji. Inaanza na 'kawaida', inamaanisha utajulishwa tu mtu akikuongelea. + + Kama chaguo-msingi, kiwango cha ujulishaji kwa ajili ya ujumbe binafsi ipo kwenye kiwango cha juu cha 'kuangalia', ina maanisha kuwa utajulishwa kuhusu kila jibu jipya. Lakini unaweza kubadilisha kiwango hiki kwa ajili ya mada 'zinazoangaliwa', 'inayofuatiliwa' au 'kunyamazishwa'. + + Tujaribu kubadilisha kiwango cha ujulishaji kwa ajili ya mada hii. Chini ya mada, utaona kitufe kinachosema una **angalia** mada hii. Unaweza kubadilisha kiwango cha ujulishaji kuwa **inafuatiliwa**? + not_found: |- + Inaonekana kuwa bado unaangalia :eyes: mada hii! Kama umeshindwa kuiona, kitufe cha kiwango cha kujulisha kinapatikana chini ya mada. + reply: |- + Kazi nzuri! Natumaini haujanyamazisha mada hii! kwa vile napenda kuongea sana saa zingine :grin:. + + Ukijibu mada, au ukisoma zaidi ya dakika chache, itawekwa kwenye orodha ya mada 'zinazofuatiliwa'. Unaweza kubadilisha hii kwenye [mipangilio yako ya mtumiaji](/my/preferences). + poll: + instructions: |- + Unajua unaweza kuongeza uchaguzi kwenye chapisho lolote? Jaribu kutumia gia kwenye uhariri ku **tengeneza uchaguzi** + not_found: |- + Whoops! Hakuna uchaguzi kwenye jibu lako. + + Tumia gia kwenye sehemu ya kuhariri, au nakili na kubandika uchaguzi huu kwenye jibu lako lijalo: + ```neno + [uchaguzi] + * :cat: + * :dog: + [/uchaguzi] + ``` + reply: |- + Habari, uchaguzi mzuri! Nimefanya vipi kwenye kukufundisha? + + [poll] + * :+1: + * :-1: + [/poll] + details: + instructions: |- + Kuna mda ungependa **kuficha taarifa** kwenye majibu yako: + + - Ukiwa unaongelea kuhusu sehemu nzuri za filamu au kipindi cha Runinga ambazo zinaweza kuwaharibia watu na kutowafanya watake kuangalia. + + - Chapisho lako likiwa linahitaji taarifa nyingi kuweza kuelewa. + + [taarifa=Chagua moja kati ya hizi kuona jinsi inavyofanya kazi!] + 1. Chagua gia kwenye uhariri. + 2. Chagua "Ficha Taarifa". + 3. Hariri taarifa za muhtasari na andika machapisho yako. + [/taarifa] + + Unaweza kutumia gia kwenye uhariri kuongeza sehemu ya taarifa kwenye jibu lako lijalo? + not_found: |- + Umeshindwa kutengeneza widget ya maelezo? Jaribu kuongeza yafuatayo kwenye jibu lako lifuatao: + + ```neno + [maelezo=Nichague kupata maelezo] + Maelezo yako yako hapa + [/maelezo] + ``` + reply: |- + Kazi nzuri - uwezo_wako_wa_kuona_vitu_kwa_undani ni mzuri sana! + end: + message: |- + Umepita kama _mtumiaji_wa_hali_ya_juu :bow: + + %{certificate} + + Nilikuwa na hivyo tu. + + Kwa heri kwa sasa! Kama ukitaka kuongea na mimi tena, nitumie ujumbe mda wowote :sunglasses: + certificate: + alt: 'Shahada ya Mafanikio ya Mtumiaji wa Juu' diff --git a/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml b/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml index 6a0720c1e5..cd6a2eac0f 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml @@ -6,8 +6,6 @@ # https://www.transifex.com/projects/p/discourse-org/ tr_TR: - site_settings: - discourse_narrative_bot_enabled: 'Discourse anlatı botunu etkinleÅŸtir' badges: certified: name: Sertifikalı diff --git a/plugins/discourse-narrative-bot/config/locales/server.ur.yml b/plugins/discourse-narrative-bot/config/locales/server.ur.yml index e1dc39a87e..9aeff760c6 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ur.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ur.yml @@ -7,7 +7,6 @@ ur: site_settings: - discourse_narrative_bot_enabled: 'ÚˆÙØ³Ú©ÙˆØ±Ø³ نَرَیٹÙÙˆ بوٹ Ú©Ùˆ ÙØ¹Ø§Ù„ کریں' disable_discourse_narrative_bot_welcome_post: "ÚˆÙØ³Ú©ÙˆØ±Ø³ نَرَیٹÙÙˆ بوٹ Ú©ÛŒ طر٠سے Ø§Ø³ØªÙ‚Ø¨Ø§Ù„ÛŒÛ Ù¾ÙˆØ³Ù¹ غیر ÙØ¹Ø§Ù„ کریں" discourse_narrative_bot_ignored_usernames: "صار٠نام جو ÚˆÙØ³Ú©ÙˆØ±Ø³ نَرَیٹÙÙˆ بوٹ نظر انداز کرے" discourse_narrative_bot_disable_public_replies: "ÚˆÙØ³Ú©ÙˆØ±Ø³ نَرَیٹÙÙˆ بوٹ Ú©ÛŒ طر٠سے عوامی جوابات غیر ÙØ¹Ø§Ù„ کریں" diff --git a/plugins/discourse-narrative-bot/config/locales/server.vi.yml b/plugins/discourse-narrative-bot/config/locales/server.vi.yml index 3d31b5ee77..df461db431 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.vi.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.vi.yml @@ -7,5 +7,4 @@ vi: site_settings: - discourse_narrative_bot_enabled: 'Bật Discourse Narrative Bot' disable_discourse_narrative_bot_welcome_post: "Tắt tính năng gá»­i lá»i chào từ Discourse Narrative Bot" diff --git a/plugins/discourse-narrative-bot/config/locales/server.zh_CN.yml b/plugins/discourse-narrative-bot/config/locales/server.zh_CN.yml index ab6c420568..713b911e7f 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.zh_CN.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.zh_CN.yml @@ -7,7 +7,6 @@ zh_CN: site_settings: - discourse_narrative_bot_enabled: 'å¯ç”¨ Discourse 代表机器人' disable_discourse_narrative_bot_welcome_post: "ç¦æ­¢ Discourse 代表机器人å‘逿¬¢è¿Žå¸–å­" discourse_narrative_bot_ignored_usernames: "Discourse 代表机器人应该忽略的用户å" discourse_narrative_bot_disable_public_replies: "ç¦æ­¢ Discourse 代表机器人å‘布公开回å¤" diff --git a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb index 6cf3416485..fc052dc71c 100644 --- a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb +++ b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb @@ -132,13 +132,15 @@ module DiscourseNarrativeBot def init_tutorial_recover data = get_data(@user) - post = PostCreator.create!(@user, raw: I18n.t( + post = PostCreator.create!(@user, + raw: I18n.t( "#{I18N_KEY}.recover.deleted_post_raw", i18n_post_args(discobot_username: self.discobot_user.username) ), - topic_id: data[:topic_id], - skip_bot: true, - skip_validations: true) + topic_id: data[:topic_id], + skip_bot: true, + skip_validations: true + ) set_state_data(:post_id, post.id) diff --git a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/certificate_generator.rb b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/certificate_generator.rb index bb1f4dbeff..656505dcff 100644 --- a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/certificate_generator.rb +++ b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/certificate_generator.rb @@ -72,7 +72,7 @@ module DiscourseNarrativeBot - test_cert + #{I18n.t('discourse_narrative_bot.new_user_narrative.title')} @@ -563,49 +563,49 @@ module DiscourseNarrativeBot private - def name - @user.username.titleize - end + def name + @user.username.titleize + end - def logo_group(size, width, height) - return unless SiteSetting.logo_small_url.present? + def logo_group(size, width, height) + return unless SiteSetting.logo_small_url.present? - begin - uri = URI(SiteSetting.logo_small_url) + begin + uri = URI(SiteSetting.logo_small_url) - logo_uri = - if uri.host.blank? || uri.scheme.blank? - URI("#{Discourse.base_url}/#{uri.path}") - else - uri - end + logo_uri = + if uri.host.blank? || uri.scheme.blank? + URI("#{Discourse.base_url}/#{uri.path}") + else + uri + end - <<~URL + <<~URL URL - rescue URI::InvalidURIError - '' - end + rescue URI::InvalidURIError + '' end + end - def base64_image_link(url) - if image = fetch_image(url) - "xlink:href=\"data:image/png;base64,#{Base64.strict_encode64(image)}\"" - else - "" - end + def base64_image_link(url) + if image = fetch_image(url) + "xlink:href=\"data:image/png;base64,#{Base64.strict_encode64(image)}\"" + else + "" end + end - def fetch_image(url) - URI(url).open('rb', redirect: true, allow_redirections: :all).read - rescue OpenURI::HTTPError - # Ignore if fetching image returns a non 200 response - end + def fetch_image(url) + URI(url).open('rb', redirect: true, allow_redirections: :all).read + rescue OpenURI::HTTPError + # Ignore if fetching image returns a non 200 response + end - def avatar_url - UrlHelper.absolute(Discourse.base_uri + @user.avatar_template.gsub('{size}', '250')) - end + def avatar_url + UrlHelper.absolute(Discourse.base_uri + @user.avatar_template.gsub('{size}', '250')) + end end end diff --git a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb index 26ab1437d6..bc134eb7e3 100644 --- a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb +++ b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb @@ -51,6 +51,7 @@ module DiscourseNarrativeBot }, tutorial_mention: { + prerequisite: Proc.new { SiteSetting.enable_mentions }, next_state: :tutorial_formatting, next_instructions: Proc.new { I18n.t("#{I18N_KEY}.formatting.instructions", base_uri: Discourse.base_uri) }, @@ -94,6 +95,7 @@ module DiscourseNarrativeBot }, tutorial_flag: { + prerequisite: Proc.new { SiteSetting.allow_flagging_staff }, next_state: :tutorial_search, next_instructions: Proc.new { I18n.t("#{I18N_KEY}.search.instructions", base_uri: Discourse.base_uri) }, flag: { diff --git a/plugins/discourse-narrative-bot/plugin.rb b/plugins/discourse-narrative-bot/plugin.rb index aaecead511..c321a28f2c 100644 --- a/plugins/discourse-narrative-bot/plugin.rb +++ b/plugins/discourse-narrative-bot/plugin.rb @@ -75,14 +75,19 @@ after_initialize do class CertificatesController < ::ApplicationController layout :false skip_before_action :check_xhr + requires_login def generate - raise Discourse::InvalidParameters.new('user_id must be present') unless params[:user_id]&.present? + unless params[:user_id]&.present? + raise Discourse::InvalidParameters.new('user_id must be present') + end user = User.find_by(id: params[:user_id]) raise Discourse::NotFound if user.blank? - raise Discourse::InvalidParameters.new('date must be present') unless params[:date]&.present? + unless params[:date]&.present? + raise Discourse::InvalidParameters.new('date must be present') + end generator = CertificateGenerator.new(user, params[:date]) diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb index 8ec9fc24b9..32a5a4e3f4 100644 --- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb +++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb @@ -78,7 +78,7 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do #{I18n.t('discourse_narrative_bot.advanced_user_narrative.edit.instructions', base_uri: '')} RAW - new_post = Post.offset(1).last + new_post = topic.ordered_posts.last(2).first expect(narrative.get_data(user)).to eq("topic_id" => topic.id, "state" => "tutorial_edit", @@ -108,15 +108,17 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do #{I18n.t('discourse_narrative_bot.advanced_user_narrative.edit.instructions', base_uri: '')} RAW - new_post = Post.offset(1).last + new_post = Topic.last.ordered_posts.last(2).first - expect(narrative.get_data(user)).to eq("topic_id" => new_post.topic.id, - "state" => "tutorial_edit", - "last_post_id" => new_post.id, - "track" => described_class.to_s, - "tutorial_edit" => { + expect(narrative.get_data(user)).to eq( + "topic_id" => new_post.topic.id, + "state" => "tutorial_edit", + "last_post_id" => new_post.id, + "track" => described_class.to_s, + "tutorial_edit" => { "post_id" => Post.last.id - }) + } + ) expect(new_post.raw).to eq(expected_raw.chomp) expect(new_post.topic.id).to_not eq(topic.id) @@ -231,7 +233,7 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do DiscourseNarrativeBot::TrackSelector.new(:reply, user, post_id: post.id).select - new_post = Post.offset(1).last + new_post = topic.ordered_posts.last(2).first expect(new_post.raw).to eq(I18n.t( 'discourse_narrative_bot.advanced_user_narrative.recover.instructions', base_uri: '') @@ -267,7 +269,7 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do RAW expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_recover) - expect(Post.offset(1).last.raw).to eq(expected_raw.chomp) + expect(topic.ordered_posts.last(2).first.raw).to eq(expected_raw.chomp) end context 'when user is an admin' do @@ -675,7 +677,7 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do post.update!(raw: "[details=\"This is a test\"]\nwooohoo\n[/details]") narrative.input(:reply, user, post: post) - expect(Post.offset(1).last.raw).to eq(I18n.t( + expect(topic.ordered_posts.last(2).first.raw).to eq(I18n.t( 'discourse_narrative_bot.advanced_user_narrative.details.reply', base_uri: '' )) diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb index 31ce253ce0..0d0d144f5e 100644 --- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb +++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb @@ -7,8 +7,9 @@ describe DiscourseNarrativeBot::NewUserNarrative do let(:user) { Fabricate(:user) } let(:topic) do - Fabricate(:private_message_topic, first_post: first_post, - topic_allowed_users: [ + Fabricate(:private_message_topic, + first_post: first_post, + topic_allowed_users: [ Fabricate.build(:topic_allowed_user, user: discobot_user), Fabricate.build(:topic_allowed_user, user: user), ] @@ -400,6 +401,22 @@ describe DiscourseNarrativeBot::NewUserNarrative do expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_flag) end + + describe 'when allow_flagging_staff is false' do + it 'should go to the right state' do + SiteSetting.allow_flagging_staff = false + post.update!(raw: skip_trigger) + + DiscourseNarrativeBot::TrackSelector.new( + :reply, + user, + post_id: post.id + ).select + + expect(narrative.get_data(user)[:state].to_sym) + .to eq(:tutorial_search) + end + end end end @@ -689,6 +706,23 @@ describe DiscourseNarrativeBot::NewUserNarrative do end end + describe 'when user mentions is disabled' do + before do + SiteSetting.enable_mentions = false + end + + it 'should skip the mention tutorial step' do + post.update!( + raw: ':monkey: :fries:' + ) + + narrative.expects(:enqueue_timeout_job).with(user) + narrative.input(:reply, user, post: post) + + expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_formatting) + end + end + it 'should create the right reply' do post.update!( raw: ':monkey: :fries:' @@ -926,7 +960,7 @@ describe DiscourseNarrativeBot::NewUserNarrative do DiscourseNarrativeBot::TrackSelector.new(:reply, user, post_id: post.id).select end.to change { Post.count }.by(2) - new_post = Post.offset(1).last + new_post = topic.ordered_posts.last(2).first expect(new_post.raw).to eq(I18n.t( 'discourse_narrative_bot.new_user_narrative.search.reply', @@ -935,12 +969,15 @@ describe DiscourseNarrativeBot::NewUserNarrative do expect(first_post.reload.raw).to eq('Hello world') - expect(narrative.get_data(user)).to include("state" => "end", - "topic_id" => new_post.topic_id, - "track" => described_class.to_s) + expect(narrative.get_data(user)).to include( + "state" => "end", + "topic_id" => new_post.topic_id, + "track" => described_class.to_s + ) - expect(user.badges.where(name: DiscourseNarrativeBot::NewUserNarrative::BADGE_NAME).exists?) - .to eq(true) + expect(user.badges.where( + name: DiscourseNarrativeBot::NewUserNarrative::BADGE_NAME).exists? + ).to eq(true) end end end diff --git a/plugins/discourse-narrative-bot/spec/integration/discobot_certificate_spec.rb b/plugins/discourse-narrative-bot/spec/integration/discobot_certificate_spec.rb deleted file mode 100644 index c635a357ca..0000000000 --- a/plugins/discourse-narrative-bot/spec/integration/discobot_certificate_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'rails_helper' - -describe "Discobot Certificate" do - let(:user) { Fabricate(:user, name: 'Jeff Atwood') } - - describe 'when viewing the certificate' do - it 'should return the right text' do - params = { - date: Time.zone.now.strftime("%b %d %Y"), - user_id: user.id - } - - stub_request(:get, /letter_avatar_proxy/).to_return(status: 200) - - stub_request(:get, "http://test.localhost//images/d-logo-sketch-small.png") - .to_return(status: 200) - - get '/discobot/certificate.svg', params: params - - expect(response.status).to eq(200) - end - - describe 'when params are missing' do - it "should raise the right errors" do - params = { - date: Time.zone.now.strftime("%b %d %Y"), - user_id: user.id - } - - params.each do |key, _| - get '/discobot/certificate.svg', params: params.except(key) - expect(response.status).to eq(400) - end - end - end - end -end diff --git a/plugins/discourse-narrative-bot/spec/jobs/onceoff/remap_old_bot_iamges_spec.rb b/plugins/discourse-narrative-bot/spec/jobs/onceoff/remap_old_bot_iamges_spec.rb index 31badd3612..baba2beb38 100644 --- a/plugins/discourse-narrative-bot/spec/jobs/onceoff/remap_old_bot_iamges_spec.rb +++ b/plugins/discourse-narrative-bot/spec/jobs/onceoff/remap_old_bot_iamges_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Jobs::DiscourseNarrativeBot::RemapOldBotImages do context "when bot's post contains an old link" do let(:post) do Fabricate(:post, - user_id: -2, + user: User.find(-2), raw: 'If you’d like to learn more, select below and **bookmark this private message**. If you do, there may be a :gift: in your future!' ) end @@ -25,7 +25,7 @@ RSpec.describe Jobs::DiscourseNarrativeBot::RemapOldBotImages do context 'subfolder' do let(:post) do Fabricate(:post, - user_id: -2, + user: User.find(-2), raw: 'If you’d like to learn more, select below and **bookmark this private message**. If you do, there may be a :gift: in your future!' ) end diff --git a/plugins/discourse-narrative-bot/spec/requests/discobot_certificate_spec.rb b/plugins/discourse-narrative-bot/spec/requests/discobot_certificate_spec.rb new file mode 100644 index 0000000000..119b2b8a8d --- /dev/null +++ b/plugins/discourse-narrative-bot/spec/requests/discobot_certificate_spec.rb @@ -0,0 +1,48 @@ +require 'rails_helper' + +describe "Discobot Certificate" do + let(:user) { Fabricate(:user, name: 'Jeff Atwood') } + + let(:params) { + { + date: Time.zone.now.strftime("%b %d %Y"), + user_id: user.id + } + } + + describe 'when viewing the certificate' do + describe 'when no logged in' do + it 'should return the right response' do + get '/discobot/certificate.svg', params: params + + expect(response.status).to eq(404) + end + end + + describe 'when logged in' do + before do + sign_in(user) + end + + it 'should return the right text' do + stub_request(:get, /letter_avatar_proxy/).to_return(status: 200) + + stub_request(:get, "http://test.localhost//images/d-logo-sketch-small.png") + .to_return(status: 200) + + get '/discobot/certificate.svg', params: params + + expect(response.status).to eq(200) + end + + describe 'when params are missing' do + it "should raise the right errors" do + params.each do |key, _| + get '/discobot/certificate.svg', params: params.except(key) + expect(response.status).to eq(400) + end + end + end + end + end +end diff --git a/plugins/discourse-narrative-bot/spec/integration/discobot_welcome_post_spec.rb b/plugins/discourse-narrative-bot/spec/requests/discobot_welcome_post_spec.rb similarity index 100% rename from plugins/discourse-narrative-bot/spec/integration/discobot_welcome_post_spec.rb rename to plugins/discourse-narrative-bot/spec/requests/discobot_welcome_post_spec.rb diff --git a/plugins/discourse-nginx-performance-report/config/locales/server.hu.yml b/plugins/discourse-nginx-performance-report/config/locales/server.hu.yml new file mode 100644 index 0000000000..636956c586 --- /dev/null +++ b/plugins/discourse-nginx-performance-report/config/locales/server.hu.yml @@ -0,0 +1,10 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + site_settings: + daily_performance_report: "NGINX naplók napi elemzése és egy csak stábtagoknak téma létrehozása a részletekkel" diff --git a/plugins/discourse-nginx-performance-report/config/locales/server.it.yml b/plugins/discourse-nginx-performance-report/config/locales/server.it.yml index 12c5162aab..1baea30d06 100644 --- a/plugins/discourse-nginx-performance-report/config/locales/server.it.yml +++ b/plugins/discourse-nginx-performance-report/config/locales/server.it.yml @@ -5,4 +5,6 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -it: {} +it: + site_settings: + daily_performance_report: "Analizza i log di NGINX giornalmente, e pubblica un argomento con i dettagli visibile solo allo Staff" diff --git a/plugins/discourse-nginx-performance-report/config/locales/server.sw.yml b/plugins/discourse-nginx-performance-report/config/locales/server.sw.yml new file mode 100644 index 0000000000..e32f712689 --- /dev/null +++ b/plugins/discourse-nginx-performance-report/config/locales/server.sw.yml @@ -0,0 +1,10 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + site_settings: + daily_performance_report: "Pitia batli za NGINX kila siku na chapisha mada za wasaidizi tu pamoja na maelezo" diff --git a/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 b/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 index 296736f3c3..431fec7d09 100644 --- a/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 +++ b/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 @@ -1,5 +1,9 @@ -import { ajax } from 'discourse/lib/ajax'; -import { default as computed, observes, on } from 'ember-addons/ember-computed-decorators'; +import { ajax } from "discourse/lib/ajax"; +import { + default as computed, + observes, + on +} from "ember-addons/ember-computed-decorators"; export const keepAliveDuration = 10000; export const bufferTime = 3000; @@ -20,90 +24,103 @@ export default Ember.Component.extend({ presenceUsers: null, channel: null, - @on('didInsertElement') + @on("didInsertElement") composerOpened() { this._lastPublish = new Date(); - Ember.run.once(this, 'updateState'); + Ember.run.once(this, "updateState"); }, - @observes('action', 'post.id', 'topic.id') + @observes("action", "post.id", "topic.id") composerStateChanged() { - Ember.run.once(this, 'updateState'); + Ember.run.once(this, "updateState"); }, - @observes('reply', 'title') + @observes("reply", "title") typing() { if (new Date() - this._lastPublish > keepAliveDuration) { - this.publish({ current: this.get('currentState') }); + this.publish({ current: this.get("currentState") }); } }, - @on('willDestroyElement') + @on("willDestroyElement") composerClosing() { - this.publish({ previous: this.get('currentState') }); + this.publish({ previous: this.get("currentState") }); Ember.run.cancel(this._pingTimer); Ember.run.cancel(this._clearTimer); }, updateState() { let state = null; - const action = this.get('action'); + const action = this.get("action"); - if (action === 'reply' || action === 'edit') { + if (action === "reply" || action === "edit") { state = { action }; - if (action === 'reply') state.topic_id = this.get('topic.id'); - if (action === 'edit') state.post_id = this.get('post.id'); + if (action === "reply") state.topic_id = this.get("topic.id"); + if (action === "edit") state.post_id = this.get("post.id"); } - this.set('previousState', this.get('currentState')); - this.set('currentState', state); + this.set("previousState", this.get("currentState")); + this.set("currentState", state); }, - @observes('currentState') + @observes("currentState") currentStateChanged() { - if (this.get('channel')) { - this.messageBus.unsubscribe(this.get('channel')); - this.set('channel', null); + if (this.get("channel")) { + this.messageBus.unsubscribe(this.get("channel")); + this.set("channel", null); } this.clear(); - if (!['reply', 'edit'].includes(this.get('action'))) { + if (!["reply", "edit"].includes(this.get("action"))) { return; } this.publish({ response_needed: true, - previous: this.get('previousState'), - current: this.get('currentState') + previous: this.get("previousState"), + current: this.get("currentState") }).then(r => { - if (this.get('isDestroyed')) { return; } - this.set('presenceUsers', r.users); - this.set('channel', r.messagebus_channel); + if (this.get("isDestroyed")) { + return; + } + this.set("presenceUsers", r.users); + this.set("channel", r.messagebus_channel); - if (!r.messagebus_channel) { return; } + if (!r.messagebus_channel) { + return; + } - this.messageBus.subscribe(r.messagebus_channel, message => { - if (!this.get('isDestroyed')) this.set('presenceUsers', message.users); - this._clearTimer = Ember.run.debounce(this, 'clear', keepAliveDuration + bufferTime); - }, r.messagebus_id); + this.messageBus.subscribe( + r.messagebus_channel, + message => { + if (!this.get("isDestroyed")) + this.set("presenceUsers", message.users); + this._clearTimer = Ember.run.debounce( + this, + "clear", + keepAliveDuration + bufferTime + ); + }, + r.messagebus_id + ); }); }, clear() { - if (!this.get('isDestroyed')) this.set('presenceUsers', []); + if (!this.get("isDestroyed")) this.set("presenceUsers", []); }, publish(data) { this._lastPublish = new Date(); - return ajax('/presence/publish', { type: 'POST', data }); + return ajax("/presence/publish", { type: "POST", data }); }, - @computed('presenceUsers', 'currentUser.id') + @computed("presenceUsers", "currentUser.id") users(users, currentUserId) { return (users || []).filter(user => user.id !== currentUserId); }, - isReply: Ember.computed.equal('action', 'reply'), - shouldDisplay: Ember.computed.gt('users.length', 0) + isReply: Ember.computed.equal("action", "reply"), + shouldDisplay: Ember.computed.gt("users.length", 0) }); diff --git a/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 b/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 index 9e7e9bb443..3be5e2c404 100644 --- a/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 +++ b/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 @@ -1,5 +1,11 @@ -import { default as computed, on } from 'ember-addons/ember-computed-decorators'; -import { keepAliveDuration, bufferTime } from 'discourse/plugins/discourse-presence/discourse/components/composer-presence-display'; +import { + default as computed, + on +} from "ember-addons/ember-computed-decorators"; +import { + keepAliveDuration, + bufferTime +} from "discourse/plugins/discourse-presence/discourse/components/composer-presence-display"; const MB_GET_LAST_MESSAGE = -2; @@ -8,35 +14,42 @@ export default Ember.Component.extend({ presenceUsers: null, clear() { - if (!this.get('isDestroyed')) this.set('presenceUsers', []); + if (!this.get("isDestroyed")) this.set("presenceUsers", []); }, - @on('didInsertElement') + @on("didInsertElement") _inserted() { this.clear(); - this.messageBus.subscribe(this.get('channel'), message => { - if (!this.get('isDestroyed')) this.set('presenceUsers', message.users); - this._clearTimer = Ember.run.debounce(this, 'clear', keepAliveDuration + bufferTime); - }, MB_GET_LAST_MESSAGE); + this.messageBus.subscribe( + this.get("channel"), + message => { + if (!this.get("isDestroyed")) this.set("presenceUsers", message.users); + this._clearTimer = Ember.run.debounce( + this, + "clear", + keepAliveDuration + bufferTime + ); + }, + MB_GET_LAST_MESSAGE + ); }, - @on('willDestroyElement') + @on("willDestroyElement") _destroyed() { Ember.run.cancel(this._clearTimer); - this.messageBus.unsubscribe(this.get('channel')); + this.messageBus.unsubscribe(this.get("channel")); }, - @computed('topicId') + @computed("topicId") channel(topicId) { return `/presence/topic/${topicId}`; }, - @computed('presenceUsers', 'currentUser.id') + @computed("presenceUsers", "currentUser.id") users(users, currentUserId) { return (users || []).filter(user => user.id !== currentUserId); }, - shouldDisplay: Ember.computed.gt('users.length', 0) - + shouldDisplay: Ember.computed.gt("users.length", 0) }); diff --git a/plugins/discourse-presence/assets/stylesheets/presence.scss b/plugins/discourse-presence/assets/stylesheets/presence.scss index 3fc25f06a5..85f9950ca7 100644 --- a/plugins/discourse-presence/assets/stylesheets/presence.scss +++ b/plugins/discourse-presence/assets/stylesheets/presence.scss @@ -2,23 +2,23 @@ background-color: $secondary; color: $primary-medium; display: flex; - + span.presence-text { margin-left: 5px; margin-right: 2px; flex: 0 0 auto; - padding-top: 3px; + padding-top: 3px; } .presence-avatars { display: flex; overflow: hidden; - flex-wrap: wrap; + flex-wrap: wrap; } .wave { flex: 0 0 auto; - + .dot { display: inline-block; animation: wave 1.8s linear infinite; @@ -34,7 +34,9 @@ } @keyframes wave { - 0%, 60%, 100% { + 0%, + 60%, + 100% { transform: initial; } @@ -49,7 +51,7 @@ top: 18px; right: 40px; @media screen and (max-width: $small-width) { - max-width: 318px; + max-width: 318px; .presence-avatars { flex-wrap: nowrap; } @@ -68,7 +70,7 @@ flex-wrap: nowrap; } .description { - display:none; + display: none; } } } diff --git a/plugins/discourse-presence/config/locales/client.fi.yml b/plugins/discourse-presence/config/locales/client.fi.yml index f71340ccae..378daadb7a 100644 --- a/plugins/discourse-presence/config/locales/client.fi.yml +++ b/plugins/discourse-presence/config/locales/client.fi.yml @@ -10,3 +10,6 @@ fi: presence: replying: "kirjoittaa vastausta" editing: "muokkaa viestiä" + replying_to_topic: + one: "kirjoittaa vastausta" + other: "kirjoittavat vastausta" diff --git a/plugins/discourse-presence/config/locales/client.hu.yml b/plugins/discourse-presence/config/locales/client.hu.yml new file mode 100644 index 0000000000..065dd5d20b --- /dev/null +++ b/plugins/discourse-presence/config/locales/client.hu.yml @@ -0,0 +1,15 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + js: + presence: + replying: "Válaszol" + editing: "Szerkesztés" + replying_to_topic: + one: "Válaszolni" + other: "Válaszolni" diff --git a/plugins/discourse-presence/config/locales/client.pt_BR.yml b/plugins/discourse-presence/config/locales/client.pt_BR.yml index bc85fd86b1..0778b71c4b 100644 --- a/plugins/discourse-presence/config/locales/client.pt_BR.yml +++ b/plugins/discourse-presence/config/locales/client.pt_BR.yml @@ -5,4 +5,11 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -pt_BR: {} +pt_BR: + js: + presence: + replying: "respondendo" + editing: "editando" + replying_to_topic: + one: "respondendo" + other: "respondendo" diff --git a/plugins/discourse-presence/config/locales/client.sk.yml b/plugins/discourse-presence/config/locales/client.sk.yml index 1a254025e0..6a7aa9a3e6 100644 --- a/plugins/discourse-presence/config/locales/client.sk.yml +++ b/plugins/discourse-presence/config/locales/client.sk.yml @@ -10,3 +10,8 @@ sk: presence: replying: "odpovedanie" editing: "upravovanie" + replying_to_topic: + one: "odpovedanie" + few: "odpovedanie" + many: "odpovedanie" + other: "odpovedanie" diff --git a/plugins/discourse-presence/config/locales/client.sw.yml b/plugins/discourse-presence/config/locales/client.sw.yml new file mode 100644 index 0000000000..6cc93e91fa --- /dev/null +++ b/plugins/discourse-presence/config/locales/client.sw.yml @@ -0,0 +1,12 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + js: + presence: + replying: "anajibu" + editing: "inarekebishwa/hariri" diff --git a/plugins/discourse-presence/config/locales/server.hu.yml b/plugins/discourse-presence/config/locales/server.hu.yml new file mode 100644 index 0000000000..39564af39d --- /dev/null +++ b/plugins/discourse-presence/config/locales/server.hu.yml @@ -0,0 +1,11 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + site_settings: + presence_enabled: 'Felhasználók mutatása akik jelenleg válaszolnak a jelenlegi témára, vagy szerkesztik a jelenlegi bejegyzést.' + presence_max_users_shown: 'Maximális számú ember amit mutat.' diff --git a/plugins/discourse-presence/config/locales/server.pt_BR.yml b/plugins/discourse-presence/config/locales/server.pt_BR.yml index bc85fd86b1..1469e02105 100644 --- a/plugins/discourse-presence/config/locales/server.pt_BR.yml +++ b/plugins/discourse-presence/config/locales/server.pt_BR.yml @@ -5,4 +5,7 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -pt_BR: {} +pt_BR: + site_settings: + presence_enabled: 'Mostrar usuários que atualmente estão respondendo ao tópico atual ou editando a postagem atual?' + presence_max_users_shown: 'Número máximo de usuários exibidos.' diff --git a/plugins/discourse-presence/config/locales/server.ru.yml b/plugins/discourse-presence/config/locales/server.ru.yml index 5c634ee3d3..e74ddb2b05 100644 --- a/plugins/discourse-presence/config/locales/server.ru.yml +++ b/plugins/discourse-presence/config/locales/server.ru.yml @@ -5,4 +5,7 @@ # To work with us on translations, join this project: # https://www.transifex.com/projects/p/discourse-org/ -ru: {} +ru: + site_settings: + presence_enabled: 'Показывать пользователей, которые отвечают или редактируют текущий поÑÑ‚ прÑмо ÑейчаÑ?' + presence_max_users_shown: 'МакÑимальное отражаемое количеÑтво пользователей, которые отвечают прÑмо ÑейчаÑ.' diff --git a/plugins/discourse-presence/config/locales/server.sw.yml b/plugins/discourse-presence/config/locales/server.sw.yml new file mode 100644 index 0000000000..a27006af01 --- /dev/null +++ b/plugins/discourse-presence/config/locales/server.sw.yml @@ -0,0 +1,11 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + site_settings: + presence_enabled: 'Onyesha watumiaji ambao wanaongelea mada ya sasa, au wana hariri mada?' + presence_max_users_shown: 'Kiwango cha juu cha watumiaji kilicho onyeshwa.' diff --git a/plugins/discourse-presence/plugin.rb b/plugins/discourse-presence/plugin.rb index 48f12a732a..2739eb9e2f 100644 --- a/plugins/discourse-presence/plugin.rb +++ b/plugins/discourse-presence/plugin.rb @@ -107,6 +107,9 @@ after_initialize do ACTIONS ||= [-"edit", -"reply"].freeze def publish + + raise Discourse::NotFound if !current_user + data = params.permit( :response_needed, current: [:action, :topic_id, :post_id], diff --git a/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6 b/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6 index 5400565243..2531f66e40 100644 --- a/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6 +++ b/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6 @@ -1,24 +1,24 @@ -import { withPluginApi } from 'discourse/lib/plugin-api'; +import { withPluginApi } from "discourse/lib/plugin-api"; export default { name: "apply-lazyYT", initialize() { - withPluginApi('0.1', api => { + withPluginApi("0.1", api => { api.decorateCooked($elem => { + const iframes = $(".lazyYT", $elem); + if (iframes.length === 0) { + return; + } - const iframes = $('.lazyYT', $elem); - if (iframes.length === 0) { return; } - - $('.lazyYT', $elem).lazyYT({ + $(".lazyYT", $elem).lazyYT({ onPlay(e, $el) { // don't cloak posts that have playing videos in them - const postId = parseInt($el.closest('article').data('post-id')); + const postId = parseInt($el.closest("article").data("post-id")); if (postId) { api.preventCloak(postId); } } }); - }); }); } diff --git a/plugins/lazyYT/assets/stylesheets/lazyYT.css b/plugins/lazyYT/assets/stylesheets/lazyYT.css index 38d6bbff69..134a535eb3 100644 --- a/plugins/lazyYT/assets/stylesheets/lazyYT.css +++ b/plugins/lazyYT/assets/stylesheets/lazyYT.css @@ -8,6 +8,7 @@ .lazyYT-container { position: relative; + z-index: z("base"); display: block; height: 0; padding: 0 0 56.25% 0; diff --git a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 index ab97861dfc..eab85cafe5 100644 --- a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 +++ b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 @@ -1,10 +1,13 @@ -import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; -import InputValidation from 'discourse/models/input-validation'; +import { + default as computed, + observes +} from "ember-addons/ember-computed-decorators"; +import InputValidation from "discourse/models/input-validation"; export default Ember.Controller.extend({ - regularPollType: 'regular', - numberPollType: 'number', - multiplePollType: 'multiple', + regularPollType: "regular", + numberPollType: "number", + multiplePollType: "multiple", init() { this._super(); @@ -14,9 +17,18 @@ export default Ember.Controller.extend({ @computed("regularPollType", "numberPollType", "multiplePollType") pollTypes(regularPollType, numberPollType, multiplePollType) { return [ - { name: I18n.t("poll.ui_builder.poll_type.regular"), value: regularPollType }, - { name: I18n.t("poll.ui_builder.poll_type.number"), value: numberPollType }, - { name: I18n.t("poll.ui_builder.poll_type.multiple"), value: multiplePollType }, + { + name: I18n.t("poll.ui_builder.poll_type.regular"), + value: regularPollType + }, + { + name: I18n.t("poll.ui_builder.poll_type.number"), + value: numberPollType + }, + { + name: I18n.t("poll.ui_builder.poll_type.multiple"), + value: multiplePollType + } ]; }, @@ -27,7 +39,7 @@ export default Ember.Controller.extend({ @computed("pollType", "pollOptionsCount", "multiplePollType") isMultiple(pollType, count, multiplePollType) { - return (pollType === multiplePollType) && count > 0; + return pollType === multiplePollType && count > 0; }, @computed("pollType", "numberPollType") @@ -73,11 +85,21 @@ export default Ember.Controller.extend({ if (isMultiple) { return this._comboboxOptions(1, count + 1); } else if (isNumber) { - return this._comboboxOptions(1, this.siteSettings.poll_maximum_options + 1); + return this._comboboxOptions( + 1, + this.siteSettings.poll_maximum_options + 1 + ); } }, - @computed("isRegular", "isMultiple", "isNumber", "pollOptionsCount", "pollMin", "pollStep") + @computed( + "isRegular", + "isMultiple", + "isNumber", + "pollOptionsCount", + "pollMin", + "pollStep" + ) pollMaxOptions(isRegular, isMultiple, isNumber, count, pollMin, pollStep) { if (isRegular) return; const pollMinInt = parseInt(pollMin) || 1; @@ -89,7 +111,10 @@ export default Ember.Controller.extend({ if (pollStepInt < 1) { pollStepInt = 1; } - return this._comboboxOptions(pollMinInt + 1, pollMinInt + (this.siteSettings.poll_maximum_options * pollStepInt)); + return this._comboboxOptions( + pollMinInt + 1, + pollMinInt + this.siteSettings.poll_maximum_options * pollStepInt + ); } }, @@ -99,28 +124,62 @@ export default Ember.Controller.extend({ return this._comboboxOptions(1, (parseInt(pollMax) || 1) + 1); }, - @computed("isNumber", "showMinMax", "pollType", "publicPoll", "pollOptions", "pollMin", "pollMax", "pollStep", "autoClose", "date", "time") - pollOutput(isNumber, showMinMax, pollType, publicPoll, pollOptions, pollMin, pollMax, pollStep, autoClose, date, time) { - let pollHeader = '[poll'; - let output = ''; + @computed( + "isNumber", + "showMinMax", + "pollType", + "publicPoll", + "pollOptions", + "pollMin", + "pollMax", + "pollStep", + "autoClose", + "date", + "time" + ) + pollOutput( + isNumber, + showMinMax, + pollType, + publicPoll, + pollOptions, + pollMin, + pollMax, + pollStep, + autoClose, + date, + time + ) { + let pollHeader = "[poll"; + let output = ""; - const match = this.get("toolbarEvent").getText().match(/\[poll(\s+name=[^\s\]]+)*.*\]/igm); + const match = this.get("toolbarEvent") + .getText() + .match(/\[poll(\s+name=[^\s\]]+)*.*\]/gim); if (match) { pollHeader += ` name=poll${match.length + 1}`; - }; + } let step = pollStep; - if (step < 1) { step = 1; } + if (step < 1) { + step = 1; + } if (pollType) pollHeader += ` type=${pollType}`; if (pollMin && showMinMax) pollHeader += ` min=${pollMin}`; if (pollMax) pollHeader += ` max=${pollMax}`; if (isNumber) pollHeader += ` step=${step}`; if (publicPoll) pollHeader += ` public=true`; - if (autoClose) pollHeader += ` close=${moment(date + " " + time, "YYYY-MM-DD HH:mm").toISOString()}`; + if (autoClose) { + let closeDate = moment( + date + " " + time, + "YYYY-MM-DD HH:mm" + ).toISOString(); + if (closeDate) pollHeader += ` close=${closeDate}`; + } - pollHeader += ']'; + pollHeader += "]"; output += `${pollHeader}\n`; if (pollOptions.length > 0 && !isNumber) { @@ -129,13 +188,24 @@ export default Ember.Controller.extend({ }); } - output += '[/poll]'; + output += "[/poll]"; return output; }, - @computed("pollOptionsCount", "isRegular", "isMultiple", "isNumber", "pollMin", "pollMax") + @computed( + "pollOptionsCount", + "isRegular", + "isMultiple", + "isNumber", + "pollMin", + "pollMax" + ) disableInsert(count, isRegular, isMultiple, isNumber, pollMin, pollMax) { - return (isRegular && count < 2) || (isMultiple && count < pollMin && pollMin >= pollMax) || (isNumber ? false : (count < 2)); + return ( + (isRegular && count < 2) || + (isMultiple && count < pollMin && pollMin >= pollMax) || + (isNumber ? false : count < 2) + ); }, @computed("pollMin", "pollMax") @@ -143,7 +213,10 @@ export default Ember.Controller.extend({ let options = { ok: true }; if (pollMin >= pollMax) { - options = { failed: true, reason: I18n.t("poll.ui_builder.help.invalid_values") }; + options = { + failed: true, + reason: I18n.t("poll.ui_builder.help.invalid_values") + }; } return InputValidation.create(options); @@ -154,7 +227,10 @@ export default Ember.Controller.extend({ let options = { ok: true }; if (pollStep < 1) { - options = { failed: true, reason: I18n.t("poll.ui_builder.help.min_step_value") }; + options = { + failed: true, + reason: I18n.t("poll.ui_builder.help.min_step_value") + }; } return InputValidation.create(options); @@ -165,7 +241,10 @@ export default Ember.Controller.extend({ let options = { ok: true }; if (disableInsert) { - options = { failed: true, reason: I18n.t("poll.ui_builder.help.options_count") }; + options = { + failed: true, + reason: I18n.t("poll.ui_builder.help.options_count") + }; } return InputValidation.create(options); @@ -181,13 +260,17 @@ export default Ember.Controller.extend({ this.setProperties({ pollType: null, publicPoll: false, - pollOptions: '', + pollOptions: "", pollMin: 1, pollMax: null, pollStep: 1, autoClose: false, - date: moment().add(1, "day").format("YYYY-DD-MM"), - time: moment().add(1, "hour").format("HH:mm"), + date: moment() + .add(1, "day") + .format("YYYY-MM-DD"), + time: moment() + .add(1, "hour") + .format("HH:mm") }); }, diff --git a/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 index bd92488271..a9e80394e4 100644 --- a/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 +++ b/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 @@ -1,43 +1,48 @@ -import { withPluginApi } from 'discourse/lib/plugin-api'; -import computed from 'ember-addons/ember-computed-decorators'; -import showModal from 'discourse/lib/show-modal'; +import { withPluginApi } from "discourse/lib/plugin-api"; +import computed from "ember-addons/ember-computed-decorators"; +import showModal from "discourse/lib/show-modal"; function initializePollUIBuilder(api) { - api.modifyClass('controller:composer', { - @computed('siteSettings.poll_enabled', 'siteSettings.poll_minimum_trust_level_to_create', 'model.topic.pm_with_non_human_user') + api.modifyClass("controller:composer", { + @computed( + "siteSettings.poll_enabled", + "siteSettings.poll_minimum_trust_level_to_create", + "model.topic.pm_with_non_human_user" + ) canBuildPoll(pollEnabled, minimumTrustLevel, pmWithNonHumanUser) { - return pollEnabled && - ( - pmWithNonHumanUser || - this.currentUser && - ( - this.currentUser.staff || - this.currentUser.trust_level >= minimumTrustLevel - ) - ); + return ( + pollEnabled && + (pmWithNonHumanUser || + (this.currentUser && + (this.currentUser.staff || + this.currentUser.trust_level >= minimumTrustLevel))) + ); }, actions: { showPollBuilder() { - showModal('poll-ui-builder').set('toolbarEvent', this.get('toolbarEvent')); + showModal("poll-ui-builder").set( + "toolbarEvent", + this.get("toolbarEvent") + ); } } }); api.addToolbarPopupMenuOptionsCallback(function() { return { - action: 'showPollBuilder', - icon: 'bar-chart-o', - label: 'poll.ui_builder.title', - condition: 'canBuildPoll' + action: "showPollBuilder", + icon: "bar-chart-o", + label: "poll.ui_builder.title", + condition: "canBuildPoll" }; }); } export default { - name: 'add-poll-ui-builder', + name: "add-poll-ui-builder", initialize() { - withPluginApi('0.8.7', initializePollUIBuilder); + withPluginApi("0.8.7", initializePollUIBuilder); } }; diff --git a/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 b/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 index 7325572bb6..2ea99f1374 100644 --- a/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 +++ b/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 @@ -1,23 +1,23 @@ -import { withPluginApi } from 'discourse/lib/plugin-api'; +import { withPluginApi } from "discourse/lib/plugin-api"; import { observes } from "ember-addons/ember-computed-decorators"; -import { getRegister } from 'discourse-common/lib/get-owner'; -import WidgetGlue from 'discourse/widgets/glue'; +import { getRegister } from "discourse-common/lib/get-owner"; +import WidgetGlue from "discourse/widgets/glue"; function initializePolls(api) { const register = getRegister(api); - api.modifyClass('controller:topic', { - subscribe(){ + api.modifyClass("controller:topic", { + subscribe() { this._super(); this.messageBus.subscribe("/polls/" + this.get("model.id"), msg => { - const post = this.get('model.postStream').findLoadedPost(msg.post_id); + const post = this.get("model.postStream").findLoadedPost(msg.post_id); if (post) { - post.set('polls', msg.polls); + post.set("polls", msg.polls); } }); }, - unsubscribe(){ - this.messageBus.unsubscribe('/polls/*'); + unsubscribe() { + this.messageBus.unsubscribe("/polls/*"); this._super(); } }); @@ -29,7 +29,7 @@ function initializePolls(api) { _glued.forEach(g => g.queueRerender()); } - api.modifyClass('model:post', { + api.modifyClass("model:post", { _polls: null, pollsObject: null, @@ -39,7 +39,7 @@ function initializePolls(api) { const polls = this.get("polls"); if (polls) { this._polls = this._polls || {}; - _.map(polls, (v,k) => { + _.map(polls, (v, k) => { const existing = this._polls[k]; if (existing) { this._polls[k].setProperties(v); @@ -53,19 +53,26 @@ function initializePolls(api) { } }); - function attachPolls($elem, helper) { - const $polls = $('.poll', $elem); - if (!$polls.length) { return; } + const $polls = $(".poll", $elem); + if (!$polls.length) { + return; + } + + if (!helper) { + return; + } const post = helper.getModel(); api.preventCloak(post.id); - const votes = post.get('polls_votes') || {}; + const votes = post.get("polls_votes") || {}; post.pollsChanged(); const polls = post.get("pollsObject"); - if (!polls) { return; } + if (!polls) { + return; + } _interval = _interval || setInterval(rerender, 30000); @@ -74,14 +81,14 @@ function initializePolls(api) { const pollName = $poll.data("poll-name"); const poll = polls[pollName]; if (poll) { - const isMultiple = poll.get('type') === 'multiple'; + const isMultiple = poll.get("type") === "multiple"; - const glue = new WidgetGlue('discourse-poll', register, { + const glue = new WidgetGlue("discourse-poll", register, { id: `${pollName}-${post.id}`, post, poll, vote: votes[pollName] || [], - isMultiple, + isMultiple }); glue.appendTo(pollElem); _glued.push(glue); @@ -108,6 +115,6 @@ export default { name: "extend-for-poll", initialize() { - withPluginApi('0.8.7', initializePolls); + withPluginApi("0.8.7", initializePolls); } }; diff --git a/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 b/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 index 9168834b92..4b5de26431 100644 --- a/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 +++ b/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 @@ -2,7 +2,17 @@ const DATA_PREFIX = "data-poll-"; const DEFAULT_POLL_NAME = "poll"; -const WHITELISTED_ATTRIBUTES = ["type", "name", "min", "max", "step", "order", "status", "public", "close"]; +const WHITELISTED_ATTRIBUTES = [ + "type", + "name", + "min", + "max", + "step", + "order", + "status", + "public", + "close" +]; function replaceToken(tokens, target, list) { let pos = tokens.indexOf(target); @@ -12,44 +22,48 @@ function replaceToken(tokens, target, list) { list[0].map = target.map; // resequence levels - for(;pos 0) { level++; } + if (nesting > 0) { + level++; + } } } // analyzes the block to that we have poll options function getListItems(tokens, startToken) { - let i = tokens.length-1; + let i = tokens.length - 1; let listItems = []; let buffer = []; - for(;tokens[i]!==startToken;i--) { + for (; tokens[i] !== startToken; i--) { if (i === 0) { return; } let token = tokens[i]; if (token.level === 0) { - if (token.tag !== 'ol' && token.tag !== 'ul') { + if (token.tag !== "ol" && token.tag !== "ul") { return; } } if (token.level === 1 && token.nesting === 1) { - if (token.tag === 'li') { - listItems.push([token, buffer.reverse().join(' ')]); + if (token.tag === "li") { + listItems.push([token, buffer.reverse().join(" ")]); } else { return; } } - if (token.level === 1 && token.nesting === 1 && token.tag === 'li') { + if (token.level === 1 && token.nesting === 1 && token.tag === "li") { buffer = []; } else { - if (token.type === 'text' || token.type === 'inline') { + if (token.type === "text" || token.type === "inline") { buffer.push(token.content); } } @@ -59,22 +73,21 @@ function getListItems(tokens, startToken) { } function invalidPoll(state, tag) { - let token = state.push('text', '', 0); - token.content = '[/' + tag + ']'; + let token = state.push("text", "", 0); + token.content = "[/" + tag + "]"; } const rule = { - tag: 'poll', + tag: "poll", - before: function(state, tagInfo, raw){ - let token = state.push('text', '', 0); + before: function(state, tagInfo, raw) { + let token = state.push("text", "", 0); token.content = raw; token.bbcode_attrs = tagInfo.attrs; - token.bbcode_type = 'poll_open'; + token.bbcode_type = "poll_open"; }, after: function(state, openToken, raw) { - let items = getListItems(state.tokens, openToken); if (!items) { return invalidPoll(state, raw); @@ -85,7 +98,7 @@ const rule = { // default poll attributes const attributes = [["class", "poll"]]; - if (!attrs['status']) { + if (!attrs["status"]) { attributes.push([DATA_PREFIX + "status", "open"]); } @@ -111,48 +124,54 @@ const rule = { let header = []; - let token = new state.Token('poll_open', 'div', 1); + let token = new state.Token("poll_open", "div", 1); token.block = true; token.attrs = attributes; header.push(token); - token = new state.Token('poll_open', 'div', 1); + token = new state.Token("poll_open", "div", 1); token.block = true; header.push(token); - token = new state.Token('poll_open', 'div', 1); - token.attrs = [['class', 'poll-container']]; + token = new state.Token("poll_open", "div", 1); + token.attrs = [["class", "poll-container"]]; header.push(token); // generate the options when the type is "number" if (attrs["type"] === "number") { // default values - if (isNaN(min)) { min = 1; } - if (isNaN(max)) { max = state.md.options.discourse.pollMaximumOptions; } - if (isNaN(step)) { step = 1; } + if (isNaN(min)) { + min = 1; + } + if (isNaN(max)) { + max = state.md.options.discourse.pollMaximumOptions; + } + if (isNaN(step)) { + step = 1; + } if (items.length > 0) { return invalidPoll(state, raw); } // dynamically generate options - token = new state.Token('bullet_list_open', 'ul', 1); + token = new state.Token("bullet_list_open", "ul", 1); header.push(token); for (let o = min; o <= max; o += step) { - token = new state.Token('list_item_open', 'li', 1); - items.push([token, String(o)]); + token = new state.Token("list_item_open", "li", 1); + items.push([token, String(o)]); header.push(token); - token = new state.Token('text', '', 0); + token = new state.Token("text", "", 0); token.content = String(o); header.push(token); - token = new state.Token('list_item_close', 'li', -1); + token = new state.Token("list_item_close", "li", -1); header.push(token); } - token = new state.Token('bullet_item_close', '', -1); + token = new state.Token("bullet_item_close", "", -1); header.push(token); } @@ -163,41 +182,41 @@ const rule = { token.attrs = token.attrs || []; let md5Hash = md5(JSON.stringify([text])); - token.attrs.push([DATA_PREFIX + 'option-id', md5Hash]); + token.attrs.push([DATA_PREFIX + "option-id", md5Hash]); } replaceToken(state.tokens, openToken, header); // we got to correct the level on the state // we just resequenced - state.level = state.tokens[state.tokens.length-1].level; + state.level = state.tokens[state.tokens.length - 1].level; - state.push('poll_close', 'div', -1); + state.push("poll_close", "div", -1); - token = state.push('poll_open', 'div', 1); - token.attrs = [['class', 'poll-info']]; + token = state.push("poll_open", "div", 1); + token.attrs = [["class", "poll-info"]]; - state.push('paragraph_open', 'p', 1); + state.push("paragraph_open", "p", 1); - token = state.push('span_open', 'span', 1); + token = state.push("span_open", "span", 1); token.block = false; - token.attrs = [['class', 'info-number']]; - token = state.push('text', '', 0); - token.content = '0'; - state.push('span_close', 'span', -1); + token.attrs = [["class", "info-number"]]; + token = state.push("text", "", 0); + token.content = "0"; + state.push("span_close", "span", -1); - token = state.push('span_open', 'span', 1); + token = state.push("span_open", "span", 1); token.block = false; - token.attrs = [['class', 'info-label']]; - token = state.push('text', '', 0); + token.attrs = [["class", "info-label"]]; + token = state.push("text", "", 0); token.content = I18n.t("poll.voters", { count: 0 }); - state.push('span_close', 'span', -1); + state.push("span_close", "span", -1); - state.push('paragraph_close', 'p', -1); + state.push("paragraph_close", "p", -1); - state.push('poll_close', 'div', -1); - state.push('poll_close', 'div', -1); - state.push('poll_close', 'div', -1); + state.push("poll_close", "div", -1); + state.push("poll_close", "div", -1); + state.push("poll_close", "div", -1); } }; @@ -208,27 +227,26 @@ function newApiInit(helper) { }); helper.registerPlugin(md => { - md.block.bbcode.ruler.push('poll', rule); + md.block.bbcode.ruler.push("poll", rule); }); } export function setup(helper) { helper.whiteList([ - 'div.poll', - 'div.poll-info', - 'div.poll-container', - 'div.poll-buttons', - 'div[data-*]', - 'span.info-number', - 'span.info-text', - 'span.info-label', - 'a.button.cast-votes', - 'a.button.toggle-results', - 'li[data-*]' + "div.poll", + "div.poll-info", + "div.poll-container", + "div.poll-buttons", + "div[data-*]", + "span.info-number", + "span.info-text", + "span.info-label", + "a.button.cast-votes", + "a.button.toggle-results", + "li[data-*]" ]); newApiInit(helper); - } /*! @@ -243,7 +261,10 @@ export function setup(helper) { * http://www.opensource.org/licenses/bsd-license */ function md5cycle(x, k) { - var a = x[0], b = x[1], c = x[2], d = x[3]; + var a = x[0], + b = x[1], + c = x[2], + d = x[3]; a = ff(a, b, c, d, k[0], 7, -680876936); d = ff(d, a, b, c, k[1], 12, -389564586); @@ -325,11 +346,11 @@ function cmn(q, a, b, x, s, t) { } function ff(a, b, c, d, x, s, t) { - return cmn((b & c) | ((~b) & d), a, b, x, s, t); + return cmn((b & c) | (~b & d), a, b, x, s, t); } function gg(a, b, c, d, x, s, t) { - return cmn((b & d) | (c & (~d)), a, b, x, s, t); + return cmn((b & d) | (c & ~d), a, b, x, s, t); } function hh(a, b, c, d, x, s, t) { @@ -337,7 +358,7 @@ function hh(a, b, c, d, x, s, t) { } function ii(a, b, c, d, x, s, t) { - return cmn(c ^ (b | (~d)), a, b, x, s, t); + return cmn(c ^ (b | ~d), a, b, x, s, t); } function md51(s) { @@ -345,15 +366,17 @@ function md51(s) { if (/[\x80-\xFF]/.test(s)) { s = unescape(encodeURI(s)); } - var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i; + var n = s.length, + state = [1732584193, -271733879, -1732584194, 271733878], + i; for (i = 64; i <= s.length; i += 64) { md5cycle(state, md5blk(s.substring(i - 64, i))); } s = s.substring(i - 64); var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (i = 0; i < s.length; i++) - tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3); - tail[i >> 2] |= 0x80 << ((i % 4) << 3); + tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3); + tail[i >> 2] |= 0x80 << (i % 4 << 3); if (i > 55) { md5cycle(state, tail); for (i = 0; i < 16; i++) tail[i] = 0; @@ -363,35 +386,37 @@ function md51(s) { return state; } -function md5blk(s) { /* I figured global was faster. */ - var md5blks = [], i; /* Andy King said do it this way. */ +function md5blk(s) { + /* I figured global was faster. */ + var md5blks = [], + i; /* Andy King said do it this way. */ for (i = 0; i < 64; i += 4) { - md5blks[i >> 2] = s.charCodeAt(i) + - (s.charCodeAt(i + 1) << 8) + - (s.charCodeAt(i + 2) << 16) + - (s.charCodeAt(i + 3) << 24); + md5blks[i >> 2] = + s.charCodeAt(i) + + (s.charCodeAt(i + 1) << 8) + + (s.charCodeAt(i + 2) << 16) + + (s.charCodeAt(i + 3) << 24); } return md5blks; } -var hex_chr = '0123456789abcdef'.split(''); +var hex_chr = "0123456789abcdef".split(""); function rhex(n) { - var s = '', j = 0; + var s = "", + j = 0; for (; j < 4; j++) - s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + - hex_chr[(n >> (j * 8)) & 0x0F]; + s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f]; return s; } function hex(x) { - for (var i = 0; i < x.length; i++) - x[i] = rhex(x[i]); - return x.join(''); + for (var i = 0; i < x.length; i++) x[i] = rhex(x[i]); + return x.join(""); } function add32(a, b) { - return (a + b) & 0xFFFFFFFF; + return (a + b) & 0xffffffff; } function md5(s) { diff --git a/plugins/poll/assets/javascripts/lib/even-round.js.es6 b/plugins/poll/assets/javascripts/lib/even-round.js.es6 index 12806e2611..1dd388562e 100644 --- a/plugins/poll/assets/javascripts/lib/even-round.js.es6 +++ b/plugins/poll/assets/javascripts/lib/even-round.js.es6 @@ -12,7 +12,7 @@ export default function(percentages) { // and increase the corresponding item in the percentages array by 1 let greatest = 0; let index = 0; - for (let j=0; j < decimals.length; j++) { + for (let j = 0; j < decimals.length; j++) { if (decimals[j] > greatest) { index = j; greatest = decimals[j]; @@ -25,5 +25,4 @@ export default function(percentages) { } return percentages.map(p => Math.floor(p)); -}; - +} diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 index f51c12e3ad..2925a22d98 100644 --- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 +++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 @@ -1,13 +1,13 @@ -import { createWidget } from 'discourse/widgets/widget'; -import { h } from 'virtual-dom'; -import { iconNode } from 'discourse-common/lib/icon-library'; -import RawHtml from 'discourse/widgets/raw-html'; -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { createWidget } from "discourse/widgets/widget"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import RawHtml from "discourse/widgets/raw-html"; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import evenRound from "discourse/plugins/poll/lib/even-round"; -import { avatarFor } from 'discourse/widgets/post'; +import { avatarFor } from "discourse/widgets/post"; import round from "discourse/lib/round"; -import { relativeAge } from 'discourse/lib/formatter'; +import { relativeAge } from "discourse/lib/formatter"; function optionHtml(option) { return new RawHtml({ html: `${option.html}` }); @@ -17,20 +17,20 @@ function fetchVoters(payload) { return ajax("/polls/voters.json", { type: "get", data: payload - }).catch((error) => { + }).catch(error => { if (error) { popupAjaxError(error); } else { - bootbox.alert(I18n.t('poll.error_while_fetching_voters')); + bootbox.alert(I18n.t("poll.error_while_fetching_voters")); } }); } -createWidget('discourse-poll-option', { - tagName: 'li', +createWidget("discourse-poll-option", { + tagName: "li", buildAttributes(attrs) { - return { 'data-poll-option-id': attrs.option.id }; + return { "data-poll-option-id": attrs.option.id }; }, html(attrs) { @@ -39,11 +39,11 @@ createWidget('discourse-poll-option', { const chosen = vote.indexOf(option.id) !== -1; if (attrs.isMultiple) { - result.push(iconNode(chosen ? 'check-square-o' : 'square-o')); + result.push(iconNode(chosen ? "check-square-o" : "square-o")); } else { - result.push(iconNode(chosen ? 'dot-circle-o' : 'circle-o')); + result.push(iconNode(chosen ? "dot-circle-o" : "circle-o")); } - result.push(' '); + result.push(" "); result.push(optionHtml(option)); return result; @@ -51,13 +51,13 @@ createWidget('discourse-poll-option', { click(e) { if ($(e.target).closest("a").length === 0) { - this.sendWidgetAction('toggleOption', this.attrs.option); + this.sendWidgetAction("toggleOption", this.attrs.option); } } }); -createWidget('discourse-poll-load-more', { - tagName: 'div.poll-voters-toggle-expand', +createWidget("discourse-poll-load-more", { + tagName: "div.poll-voters-toggle-expand", buildKey: attrs => `${attrs.id}-load-more`, defaultState() { @@ -65,36 +65,43 @@ createWidget('discourse-poll-load-more', { }, html(attrs, state) { - return state.loading ? h('div.spinner.small') : h('a', iconNode('chevron-down')); + return state.loading + ? h("div.spinner.small") + : h("a", iconNode("chevron-down")); }, click() { const { state } = this; - if (state.loading) { return; } + if (state.loading) { + return; + } state.loading = true; - return this.sendWidgetAction('loadMore').finally(() => state.loading = false); + return this.sendWidgetAction("loadMore").finally( + () => (state.loading = false) + ); } - }); -createWidget('discourse-poll-voters', { - tagName: 'ul.poll-voters-list', +createWidget("discourse-poll-voters", { + tagName: "ul.poll-voters-list", buildKey: attrs => attrs.id(), defaultState() { return { - loaded: 'new', + loaded: "new", pollVoters: [], - offset: 1, + offset: 1 }; }, fetchVoters() { const { attrs, state } = this; - if (state.loaded === 'loading') { return; } + if (state.loaded === "loading") { + return; + } - state.loaded = 'loading'; + state.loaded = "loading"; return fetchVoters({ post_id: attrs.postId, @@ -102,11 +109,12 @@ createWidget('discourse-poll-voters', { option_id: attrs.optionId, offset: state.offset }).then(result => { - state.loaded = 'loaded'; + state.loaded = "loaded"; state.offset += 1; const pollResult = result[attrs.pollName]; - const newVoters = attrs.pollType === 'number' ? pollResult : pollResult[attrs.optionId]; + const newVoters = + attrs.pollType === "number" ? pollResult : pollResult[attrs.optionId]; state.pollVoters = state.pollVoters.concat(newVoters); this.scheduleRerender(); @@ -118,46 +126,50 @@ createWidget('discourse-poll-voters', { }, html(attrs, state) { - if (attrs.pollVoters && state.loaded === 'new') { + if (attrs.pollVoters && state.loaded === "new") { state.pollVoters = attrs.pollVoters; } const contents = state.pollVoters.map(user => { - return h('li', [avatarFor('tiny', { - username: user.username, - template: user.avatar_template - }), ' ']); + return h("li", [ + avatarFor("tiny", { + username: user.username, + template: user.avatar_template + }), + " " + ]); }); if (state.pollVoters.length < attrs.totalVotes) { - contents.push(this.attach('discourse-poll-load-more', { id: attrs.id() })); + contents.push( + this.attach("discourse-poll-load-more", { id: attrs.id() }) + ); } - return h('div.poll-voters', contents); + return h("div.poll-voters", contents); } - }); -createWidget('discourse-poll-standard-results', { - tagName: 'ul.results', +createWidget("discourse-poll-standard-results", { + tagName: "ul.results", buildKey: attrs => `${attrs.id}-standard-results`, defaultState() { return { - loaded: 'new' + loaded: "new" }; }, fetchVoters() { const { attrs, state } = this; - if (state.loaded === 'new') { + if (state.loaded === "new") { fetchVoters({ post_id: attrs.post.id, - poll_name: attrs.poll.get('name') + poll_name: attrs.poll.get("name") }).then(result => { - state.voters = result[attrs.poll.get('name')]; - state.loaded = 'loaded'; + state.voters = result[attrs.poll.get("name")]; + state.loaded = "loaded"; this.scheduleRerender(); }); } @@ -165,11 +177,11 @@ createWidget('discourse-poll-standard-results', { html(attrs, state) { const { poll } = attrs; - const options = poll.get('options'); + const options = poll.get("options"); if (options) { - const voters = poll.get('voters'); - const isPublic = poll.get('public'); + const voters = poll.get("voters"); + const isPublic = poll.get("public"); const ordered = _.clone(options).sort((a, b) => { if (a.votes < b.votes) { @@ -185,11 +197,14 @@ createWidget('discourse-poll-standard-results', { } }); - const percentages = voters === 0 ? - Array(ordered.length).fill(0) : - ordered.map(o => 100 * o.votes / voters); + const percentages = + voters === 0 + ? Array(ordered.length).fill(0) + : ordered.map(o => (100 * o.votes) / voters); - const rounded = attrs.isMultiple ? percentages.map(Math.floor) : evenRound(percentages); + const rounded = attrs.isMultiple + ? percentages.map(Math.floor) + : evenRound(percentages); if (isPublic) this.fetchVoters(); @@ -198,50 +213,58 @@ createWidget('discourse-poll-standard-results', { const per = rounded[idx].toString(); const chosen = (attrs.vote || []).includes(option.id); - contents.push(h('div.option', - h('p', [ h('span.percentage', `${per}%`), optionHtml(option) ]) - )); + contents.push( + h( + "div.option", + h("p", [h("span.percentage", `${per}%`), optionHtml(option)]) + ) + ); - contents.push(h('div.bar-back', - h('div.bar', { attributes: { style: `width:${per}%` }}) - )); + contents.push( + h( + "div.bar-back", + h("div.bar", { attributes: { style: `width:${per}%` } }) + ) + ); if (isPublic) { - contents.push(this.attach('discourse-poll-voters', { - id: () => `poll-voters-${option.id}`, - postId: attrs.post.id, - optionId: option.id, - pollName: poll.get('name'), - totalVotes: option.votes, - pollVoters: (state.voters && state.voters[option.id]) || [] - })); + contents.push( + this.attach("discourse-poll-voters", { + id: () => `poll-voters-${option.id}`, + postId: attrs.post.id, + optionId: option.id, + pollName: poll.get("name"), + totalVotes: option.votes, + pollVoters: (state.voters && state.voters[option.id]) || [] + }) + ); } - return h('li', { className: `${chosen ? 'chosen' : ''}` }, contents); + return h("li", { className: `${chosen ? "chosen" : ""}` }, contents); }); } } }); -createWidget('discourse-poll-number-results', { +createWidget("discourse-poll-number-results", { buildKey: attrs => `${attrs.id}-number-results`, defaultState() { return { - loaded: 'new' + loaded: "new" }; }, fetchVoters() { const { attrs, state } = this; - if (state.loaded === 'new') { + if (state.loaded === "new") { fetchVoters({ post_id: attrs.post.id, - poll_name: attrs.poll.get('name') + poll_name: attrs.poll.get("name") }).then(result => { - state.voters = result[attrs.poll.get('name')]; - state.loaded = 'loaded'; + state.voters = result[attrs.poll.get("name")]; + state.loaded = "loaded"; this.scheduleRerender(); }); } @@ -249,59 +272,69 @@ createWidget('discourse-poll-number-results', { html(attrs, state) { const { poll } = attrs; - const isPublic = poll.get('public'); + const isPublic = poll.get("public"); - const totalScore = poll.get('options').reduce((total, o) => { + const totalScore = poll.get("options").reduce((total, o) => { return total + parseInt(o.html, 10) * parseInt(o.votes, 10); }, 0); const voters = poll.voters; const average = voters === 0 ? 0 : round(totalScore / voters, -2); const averageRating = I18n.t("poll.average_rating", { average }); - const results = [h('div.poll-results-number-rating', new RawHtml({ html: `${averageRating}` }))]; + const results = [ + h( + "div.poll-results-number-rating", + new RawHtml({ html: `${averageRating}` }) + ) + ]; if (isPublic) { this.fetchVoters(); - results.push(this.attach('discourse-poll-voters', { - id: () => `poll-voters-${poll.get('name')}`, - totalVotes: poll.get('voters'), - pollVoters: state.voters || [], - postId: attrs.post.id, - pollName: poll.get('name'), - pollType: poll.get('type') - })); + results.push( + this.attach("discourse-poll-voters", { + id: () => `poll-voters-${poll.get("name")}`, + totalVotes: poll.get("voters"), + pollVoters: state.voters || [], + postId: attrs.post.id, + pollName: poll.get("name"), + pollType: poll.get("type") + }) + ); } return results; } }); -createWidget('discourse-poll-container', { - tagName: 'div.poll-container', +createWidget("discourse-poll-container", { + tagName: "div.poll-container", html(attrs) { const { poll } = attrs; if (attrs.showResults || attrs.isClosed) { - const type = poll.get('type') === 'number' ? 'number' : 'standard'; + const type = poll.get("type") === "number" ? "number" : "standard"; return this.attach(`discourse-poll-${type}-results`, attrs); } - const options = poll.get('options'); + const options = poll.get("options"); if (options) { - return h('ul', options.map(option => { - return this.attach('discourse-poll-option', { - option, - isMultiple: attrs.isMultiple, - vote: attrs.vote - }); - })); + return h( + "ul", + options.map(option => { + return this.attach("discourse-poll-option", { + option, + isMultiple: attrs.isMultiple, + vote: attrs.vote + }); + }) + ); } } }); -createWidget('discourse-poll-info', { - tagName: 'div.poll-info', +createWidget("discourse-poll-info", { + tagName: "div.poll-info", multipleHelpText(min, max, options) { if (max > 0) { @@ -311,9 +344,14 @@ createWidget('discourse-poll-info', { } } else if (min > 1) { if (max < options) { - return I18n.t("poll.multiple.help.between_min_and_max_options", { min, max }); + return I18n.t("poll.multiple.help.between_min_and_max_options", { + min, + max + }); } else { - return I18n.t("poll.multiple.help.at_least_min_options", { count: min }); + return I18n.t("poll.multiple.help.at_least_min_options", { + count: min + }); } } else if (max <= options) { return I18n.t("poll.multiple.help.up_to_max_options", { count: max }); @@ -323,43 +361,63 @@ createWidget('discourse-poll-info', { html(attrs) { const { poll } = attrs; - const count = poll.get('voters'); - const result = [h('p', [ - h('span.info-number', count.toString()), - h('span.info-label', I18n.t('poll.voters', { count })) - ])]; + const count = poll.get("voters"); + const result = [ + h("p", [ + h("span.info-number", count.toString()), + h("span.info-label", I18n.t("poll.voters", { count })) + ]) + ]; if (attrs.isMultiple) { if (attrs.showResults || attrs.isClosed) { - const totalVotes = poll.get('options').reduce((total, o) => { + const totalVotes = poll.get("options").reduce((total, o) => { return total + parseInt(o.votes, 10); }, 0); - result.push(h('p', [ - h('span.info-number', totalVotes.toString()), - h('span.info-label', I18n.t("poll.total_votes", { count: totalVotes })) - ])); + result.push( + h("p", [ + h("span.info-number", totalVotes.toString()), + h( + "span.info-label", + I18n.t("poll.total_votes", { count: totalVotes }) + ) + ]) + ); } else { - const help = this.multipleHelpText(attrs.min, attrs.max, poll.get('options.length')); + const help = this.multipleHelpText( + attrs.min, + attrs.max, + poll.get("options.length") + ); if (help) { - result.push(new RawHtml({ html: `${help}` })); + result.push( + new RawHtml({ html: `${help}` }) + ); } } } if (!attrs.isClosed) { - if (!attrs.showResults && poll.get('public')) { - result.push(h('span.info-text', I18n.t('poll.public.title'))); + if (!attrs.showResults && poll.get("public")) { + result.push(h("span.info-text", I18n.t("poll.public.title"))); } if (poll.close) { const closeDate = moment.utc(poll.close); - const title = closeDate.format("LLL"); - const timeLeft = moment().to(closeDate.local(), true); + if (closeDate.isValid()) { + const title = closeDate.format("LLL"); + const timeLeft = moment().to(closeDate.local(), true); - result.push(new RawHtml({ - html: `${I18n.t("poll.automatic_close.closes_in", { timeLeft })}` - })); + result.push( + new RawHtml({ + html: `${I18n.t( + "poll.automatic_close.closes_in", + { timeLeft } + )}` + }) + ); + } } } @@ -367,46 +425,52 @@ createWidget('discourse-poll-info', { } }); -createWidget('discourse-poll-buttons', { - tagName: 'div.poll-buttons', +createWidget("discourse-poll-buttons", { + tagName: "div.poll-buttons", html(attrs) { const results = []; const { poll, post } = attrs; - const topicArchived = post.get('topic.archived'); + const topicArchived = post.get("topic.archived"); const closed = attrs.isClosed; const hideResultsDisabled = closed || topicArchived; if (attrs.isMultiple && !hideResultsDisabled) { const castVotesDisabled = !attrs.canCastVotes; - results.push(this.attach('button', { - className: `btn cast-votes ${castVotesDisabled ? '' : 'btn-primary'}`, - label: 'poll.cast-votes.label', - title: 'poll.cast-votes.title', - disabled: castVotesDisabled, - action: 'castVotes' - })); - results.push(' '); + results.push( + this.attach("button", { + className: `btn cast-votes ${castVotesDisabled ? "" : "btn-primary"}`, + label: "poll.cast-votes.label", + title: "poll.cast-votes.title", + disabled: castVotesDisabled, + action: "castVotes" + }) + ); + results.push(" "); } if (attrs.showResults || hideResultsDisabled) { - results.push(this.attach('button', { - className: 'btn toggle-results', - label: 'poll.hide-results.label', - title: 'poll.hide-results.title', - icon: 'eye-slash', - disabled: hideResultsDisabled, - action: 'toggleResults' - })); + results.push( + this.attach("button", { + className: "btn toggle-results", + label: "poll.hide-results.label", + title: "poll.hide-results.title", + icon: "eye-slash", + disabled: hideResultsDisabled, + action: "toggleResults" + }) + ); } else { - results.push(this.attach('button', { - className: 'btn toggle-results', - label: 'poll.show-results.label', - title: 'poll.show-results.title', - icon: 'eye', - disabled: poll.get('voters') === 0, - action: 'toggleResults' - })); + results.push( + this.attach("button", { + className: "btn toggle-results", + label: "poll.show-results.label", + title: "poll.show-results.title", + icon: "eye", + disabled: poll.get("voters") === 0, + action: "toggleResults" + }) + ); } if (attrs.isAutomaticallyClosed) { @@ -414,34 +478,44 @@ createWidget('discourse-poll-buttons', { const title = closeDate.format("LLL"); const age = relativeAge(closeDate.toDate(), { addAgo: true }); - results.push(new RawHtml({ - html: `${I18n.t("poll.automatic_close.age", { age })}` - })); + results.push( + new RawHtml({ + html: `${I18n.t( + "poll.automatic_close.age", + { age } + )}` + }) + ); } - if (this.currentUser && - (this.currentUser.get("id") === post.get('user_id') || - this.currentUser.get("staff")) && - !topicArchived) { - + if ( + this.currentUser && + (this.currentUser.get("id") === post.get("user_id") || + this.currentUser.get("staff")) && + !topicArchived + ) { if (closed) { if (!attrs.isAutomaticallyClosed) { - results.push(this.attach('button', { - className: 'btn toggle-status', - label: 'poll.open.label', - title: 'poll.open.title', - icon: 'unlock-alt', - action: 'toggleStatus' - })); + results.push( + this.attach("button", { + className: "btn toggle-status", + label: "poll.open.label", + title: "poll.open.title", + icon: "unlock-alt", + action: "toggleStatus" + }) + ); } } else { - results.push(this.attach('button', { - className: 'btn toggle-status btn-danger', - label: 'poll.close.label', - title: 'poll.close.title', - icon: 'lock', - action: 'toggleStatus' - })); + results.push( + this.attach("button", { + className: "btn toggle-status btn-danger", + label: "poll.close.label", + title: "poll.close.title", + icon: "lock", + action: "toggleStatus" + }) + ); } } @@ -449,23 +523,23 @@ createWidget('discourse-poll-buttons', { } }); -export default createWidget('discourse-poll', { - tagName: 'div.poll', +export default createWidget("discourse-poll", { + tagName: "div.poll", buildKey: attrs => attrs.id, buildAttributes(attrs) { const { poll } = attrs; return { - "data-poll-type": poll.get('type'), - "data-poll-name": poll.get('name'), - "data-poll-status": poll.get('status'), - "data-poll-public": poll.get('public'), - "data-poll-close": poll.get('close'), + "data-poll-type": poll.get("type"), + "data-poll-name": poll.get("name"), + "data-poll-status": poll.get("status"), + "data-poll-public": poll.get("public"), + "data-poll-close": poll.get("close") }; }, defaultState(attrs) { - const showResults = this.isClosed() || attrs.post.get('topic.archived'); + const showResults = this.isClosed() || attrs.post.get("topic.archived"); return { loading: false, showResults }; }, @@ -480,23 +554,27 @@ export default createWidget('discourse-poll', { max: this.max() }); - return h('div', [ - this.attach('discourse-poll-container', newAttrs), - this.attach('discourse-poll-info', newAttrs), - this.attach('discourse-poll-buttons', newAttrs) + return h("div", [ + this.attach("discourse-poll-container", newAttrs), + this.attach("discourse-poll-info", newAttrs), + this.attach("discourse-poll-buttons", newAttrs) ]); }, min() { let min = parseInt(this.attrs.poll.min, 10); - if (isNaN(min) || min < 1) { min = 1; } + if (isNaN(min) || min < 1) { + min = 1; + } return min; }, max() { let max = parseInt(this.attrs.poll.max, 10); const numOptions = this.attrs.poll.options.length; - if (isNaN(max) || max > numOptions) { max = numOptions; } + if (isNaN(max) || max > numOptions) { + max = numOptions; + } return max; }, @@ -520,7 +598,9 @@ export default createWidget('discourse-poll', { const selectedOptionCount = attrs.vote.length; if (attrs.isMultiple) { - return selectedOptionCount >= this.min() && selectedOptionCount <= this.max(); + return ( + selectedOptionCount >= this.min() && selectedOptionCount <= this.max() + ); } return selectedOptionCount > 0; @@ -530,7 +610,9 @@ export default createWidget('discourse-poll', { const { state, attrs } = this; const { post, poll } = attrs; - if (this.isAutomaticallyClosed()) { return; } + if (this.isAutomaticallyClosed()) { + return; + } bootbox.confirm( I18n.t(this.isClosed() ? "poll.open.confirm" : "poll.close.confirm"), @@ -544,22 +626,25 @@ export default createWidget('discourse-poll', { ajax("/polls/toggle_status", { type: "PUT", data: { - post_id: post.get('id'), - poll_name: poll.get('name'), - status, + post_id: post.get("id"), + poll_name: poll.get("name"), + status } - }).then(() => { - poll.set('status', status); - this.scheduleRerender(); - }).catch((error) => { - if (error) { - popupAjaxError(error); - } else { - bootbox.alert(I18n.t("poll.error_while_toggling_status")); - } - }).finally(() => { - state.loading = false; - }); + }) + .then(() => { + poll.set("status", status); + this.scheduleRerender(); + }) + .catch(error => { + if (error) { + popupAjaxError(error); + } else { + bootbox.alert(I18n.t("poll.error_while_toggling_status")); + } + }) + .finally(() => { + state.loading = false; + }); } } ); @@ -570,14 +655,18 @@ export default createWidget('discourse-poll', { }, showLogin() { - this.register.lookup('route:application').send('showLogin'); + this.register.lookup("route:application").send("showLogin"); }, toggleOption(option) { const { attrs } = this; - if (this.isClosed()) { return; } - if (!this.currentUser) { this.showLogin(); } + if (this.isClosed()) { + return; + } + if (!this.currentUser) { + this.showLogin(); + } const { vote } = attrs; @@ -598,8 +687,12 @@ export default createWidget('discourse-poll', { }, castVotes() { - if (!this.canCastVotes()) { return; } - if (!this.currentUser) { return this.showLogin(); } + if (!this.canCastVotes()) { + return; + } + if (!this.currentUser) { + return this.showLogin(); + } const { attrs, state } = this; @@ -612,16 +705,19 @@ export default createWidget('discourse-poll', { poll_name: attrs.poll.name, options: attrs.vote } - }).then(() => { - state.showResults = true; - }).catch((error) => { - if (error) { - popupAjaxError(error); - } else { - bootbox.alert(I18n.t("poll.error_while_casting_votes")); - } - }).finally(() => { - state.loading = false; - }); + }) + .then(() => { + state.showResults = true; + }) + .catch(error => { + if (error) { + popupAjaxError(error); + } else { + bootbox.alert(I18n.t("poll.error_while_casting_votes")); + } + }) + .finally(() => { + state.loading = false; + }); } }); diff --git a/plugins/poll/assets/stylesheets/common/poll.scss b/plugins/poll/assets/stylesheets/common/poll.scss index 09460788e0..4c3b35671c 100644 --- a/plugins/poll/assets/stylesheets/common/poll.scss +++ b/plugins/poll/assets/stylesheets/common/poll.scss @@ -1,15 +1,11 @@ -$border-color: rgb(219,219,219); -$text-color: #9E9E9E; - -$option-background: dark-light-diff($primary, $secondary, 90%, -65%); - div.poll { - margin: 10px 0; - border: 1px solid $border-color; + margin: 1em 0; + border: 1px solid $primary-low; @include unselectable; - ul, ol { + ul, + ol { margin: 0; padding: 0; list-style: none; @@ -19,41 +15,31 @@ div.poll { li { cursor: pointer; - font-size: 15px; - margin-bottom: 10px; + font-size: $font-up-1; + &:not(:last-of-type) { + margin-bottom: 0.5em; + } } li[data-poll-option-id] { color: $primary; - padding: .5em .7em .7em .5em; + padding: 0.5em 0.7em 0.7em 0.5em; } - .button { - display: inline-block; - padding: 6px 12px; - margin-right: 5px; - text-align: center; - cursor: pointer; - color: $primary; - background: dark-light-diff($primary, $secondary, 90%, -65%); - - &:hover { - background: dark-light-diff($primary, $secondary, 65%, -75%); - color: #fff; - } + img { + max-width: 100% !important; /* needed to override internal styles */ + height: auto; + margin-top: 0.25em; } .poll-info { - color: $text-color; - text-align: center; + color: $primary-medium; vertical-align: middle; - - .info-number { - font-size: 3.5em; - } + padding: 1em 0; .info-label { font-size: 1.7em; + line-height: $line-height-medium; } .info-text { @@ -64,7 +50,7 @@ div.poll { .poll-container { vertical-align: middle; - padding: 10px; + padding: 0.8em; .poll-results-number-rating { font-size: 2em; @@ -77,16 +63,15 @@ div.poll { } .info-text { margin: 0 5px; - color: $text-color; + color: $primary-medium; } } .poll-voters-list { + margin-top: 0.25em; li { display: inline; } - - margin-top: 4px; } .poll-voters-toggle-expand { @@ -95,28 +80,30 @@ div.poll { } .results { - + > li { + padding: 0.5em 0.7em 0.7em 0.5em; + } .option { - padding-bottom: 5px; + padding-bottom: 0.25em; p { margin: 0; } } .percentage { - font-size: 20px; + font-size: $font-up-1; float: right; - color: $text-color; - margin-left: 5px; + color: $primary-medium; + margin-left: 0.25em; } .bar-back { - background: $option-background; + background: $primary-low; } .bar { - height: 10px; - background: dark-light-diff($primary, $secondary, 50%, -25%);; + height: 0.75em; + background: $primary-medium; } .chosen .bar { @@ -125,13 +112,10 @@ div.poll { } &[data-poll-type="number"] { - li[data-poll-option-id] { display: inline-block; - width: 45px; - margin-right: 5px; + width: 3.25em; + margin-right: 0.25em; } - } - } diff --git a/plugins/poll/assets/stylesheets/desktop/poll.scss b/plugins/poll/assets/stylesheets/desktop/poll.scss index 79ead5d01f..e6ac930025 100644 --- a/plugins/poll/assets/stylesheets/desktop/poll.scss +++ b/plugins/poll/assets/stylesheets/desktop/poll.scss @@ -1,6 +1,5 @@ div.poll { display: table; - min-width: 500px; width: 100%; box-sizing: border-box; @@ -8,10 +7,15 @@ div.poll { min-width: 150px; width: 100%; display: table-cell; - border-left: 1px solid $border-color; + text-align: center; + border-left: 1px solid $primary-low; + + .info-number { + font-size: 3.5em; + } p { - margin: 40px 20px; + margin: 1.5em; } .info-label { @@ -21,13 +25,12 @@ div.poll { .poll-container { display: table-cell; - min-width: 330px; width: 100%; } .poll-buttons { - border-top: 1px solid $border-color; - padding: 10px; + border-top: 1px solid $primary-low; + padding: 1em 1.25em; .toggle-status { float: right; @@ -38,7 +41,7 @@ div.poll { .d-editor-preview { .poll-buttons { a:not(:first-child) { - margin-left: 5px; + margin-left: 0.25em; } } @@ -46,9 +49,9 @@ div.poll { li[data-poll-option-id]:before { font-family: FontAwesome; content: "\f10c"; - margin-right: 3px; + margin-right: 0.25em; position: relative; - top: 1px; + vertical-align: baseline; } &[data-poll-type="multiple"] { diff --git a/plugins/poll/assets/stylesheets/mobile/poll.scss b/plugins/poll/assets/stylesheets/mobile/poll.scss index 2d552a5f6b..a7efc3f483 100644 --- a/plugins/poll/assets/stylesheets/mobile/poll.scss +++ b/plugins/poll/assets/stylesheets/mobile/poll.scss @@ -1,15 +1,30 @@ div.poll { .poll-buttons { - padding: 0 5px 5px 5px; + padding: 0.5em 1.25em 1em 1.25em; button { - margin: 4px 2px; + margin: 0.25em; } } .poll-info { + padding: 0.5em 1.25em 0 1.25em; + display: flex; + flex-wrap: wrap; + border-top: 1px solid $primary-low; + .info-text { + display: inline; + margin: 0 0.5em 0.25em 0; + } + .info-number { + font-size: $font-up-6; + } + p { + margin: 0; + width: 100%; + } .info-label:before { - content:"\00a0"; //nbsp + content: "\00a0"; //nbsp } } } diff --git a/plugins/poll/config/locales/client.he.yml b/plugins/poll/config/locales/client.he.yml index e6d429d563..64c82f0ee1 100644 --- a/plugins/poll/config/locales/client.he.yml +++ b/plugins/poll/config/locales/client.he.yml @@ -17,7 +17,7 @@ he: one: "מספר הצבעות כולל" two: "מספר הצבעות כולל" many: "מספר הצבעות כולל" - other: "מספר הצבעות כולל" + other: "מספר הצבעות" average_rating: "דירוג ממוצע: %{average}." public: title: "הצבעות הן פומביות." diff --git a/plugins/poll/config/locales/client.hu.yml b/plugins/poll/config/locales/client.hu.yml new file mode 100644 index 0000000000..9c20598cb7 --- /dev/null +++ b/plugins/poll/config/locales/client.hu.yml @@ -0,0 +1,71 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + js: + poll: + voters: + one: "szavazó" + other: "szavazók" + total_votes: + one: "összes szavazat" + other: "összes szavazat" + average_rating: "Ãtlagos értékelés: %{average}." + public: + title: "A szavazatok nyilvánosak" + multiple: + help: + at_least_min_options: + one: "Válassz legalább 1 lehetÅ‘séget" + other: "Válasst legalább %{count} lehetÅ‘séget" + x_options: + one: "Válassz 1 lehetÅ‘séget" + other: "Válassz %{count} lehetÅ‘séget" + cast-votes: + title: "Szavazatod leadása" + label: "Szavazz!" + show-results: + title: "Eredmények megjelenítése" + label: "Eredmények mutatása" + hide-results: + title: "Vissza a szavazataidhoz" + label: "Eredmények elrejtése" + open: + title: "A szavazás megnyitása" + label: "Megnyitás" + confirm: "Biztosan megnyitod ezt a szavazást?" + close: + title: "A szavazás lezárása" + label: "Bezárás" + confirm: "Biztosan lezárod ezt a szavazást?" + automatic_close: + closes_in: "le lesz zárva %{timeLeft}" + error_while_toggling_status: "Elnézést, a szavazat állapotának vizsgálatakor hiba lépett fel." + error_while_casting_votes: "Sajnáljuk, hiba történt a szavazatod elküldésekor." + error_while_fetching_voters: "Elnézést, a szavazatok kiírásakor hiba lépett fel." + ui_builder: + title: Szavazás felépítése + insert: Szavazás beillesztése + help: + options_count: Legalább 2 opciót adj meg + invalid_values: A minimum értéknek alacsonyabbnak kell lennie a maximum értéknél. + min_step_value: A lépés minimális értéke 1 + poll_type: + label: Típus + regular: Egyszerű választás + multiple: Többszörös Választás + number: Értékelés Számokkal + poll_config: + max: Max + min: Min + step: Lépés + poll_public: + label: Mutasd, ki szavazott + poll_options: + label: Soronként egy választási lehetÅ‘séget adj meg + automatic_close: + label: Szavazás automatikus lezárása diff --git a/plugins/poll/config/locales/client.it.yml b/plugins/poll/config/locales/client.it.yml index 34d953edbf..70563112cd 100644 --- a/plugins/poll/config/locales/client.it.yml +++ b/plugins/poll/config/locales/client.it.yml @@ -46,6 +46,9 @@ it: title: "Chiudi il sondaggio" label: "Chiudi" confirm: "Sicuro di voler chiudere questo sondaggio?" + automatic_close: + closes_in: "termina in %{timeLeft}" + age: "terminato %{age}" error_while_toggling_status: "Spiacenti, si è verificato un errore nel commutare lo stato di questo sondaggio." error_while_casting_votes: "Spiacenti, si è verificato un errore nella votazione." error_while_fetching_voters: "Spiacenti, si è verificato un errore nel visualizzare i votanti." @@ -55,6 +58,7 @@ it: help: options_count: Inserisci almeno 2 opzioni invalid_values: Il valore minimo deve essere minore del valore massimo. + min_step_value: Il valore minimo di un passo è 1 poll_type: label: Tipo regular: Scelta Singola @@ -68,3 +72,5 @@ it: label: Mostra i votanti poll_options: label: Inserisci un'opzione di sondaggio per riga + automatic_close: + label: Chiudi sondaggio automaticamente diff --git a/plugins/poll/config/locales/client.pt_BR.yml b/plugins/poll/config/locales/client.pt_BR.yml index 0a6fedd298..2c2b689c7b 100644 --- a/plugins/poll/config/locales/client.pt_BR.yml +++ b/plugins/poll/config/locales/client.pt_BR.yml @@ -46,6 +46,9 @@ pt_BR: title: "Fechar a enquete" label: "Fechar" confirm: "Você tem certeza que deseja fechar essa enquete?" + automatic_close: + closes_in: "fecha em%{timeLeft}" + age: "fechado %{age}" error_while_toggling_status: "Desculpe, houve um erro ao mudar a situação da enquete.." error_while_casting_votes: "Desculpe, houve um erro ao votar." error_while_fetching_voters: "Desculpe, houve um erro ao mostrar os votantes." @@ -55,6 +58,7 @@ pt_BR: help: options_count: Enquetes devem ter no mínimo 2 opções invalid_values: O menor valor valor deve ser menor que o valor máximo. + min_step_value: O valor mínimo do passo é 1 poll_type: label: Tipo regular: Única escolha @@ -68,3 +72,5 @@ pt_BR: label: Exibir votantes poll_options: label: Insira uma resposta por linha + automatic_close: + label: Fechar automaticamente a votação diff --git a/plugins/poll/config/locales/client.sk.yml b/plugins/poll/config/locales/client.sk.yml index 8c4fc811e5..e1730e51f6 100644 --- a/plugins/poll/config/locales/client.sk.yml +++ b/plugins/poll/config/locales/client.sk.yml @@ -56,6 +56,9 @@ sk: title: "UzavrieÅ¥ hlasovanie" label: "ZavrieÅ¥" confirm: "Ste si istý, že chcete uzavrieÅ¥ toto hlasovanie?" + automatic_close: + closes_in: "uzavrie sa za" + age: "uzavreté" error_while_toggling_status: "Ľutujeme, nastala chyba pri prepínaní stavu tohto hlasovania." error_while_casting_votes: "Ľutujeme, nastala chyba pri prideľovaní VaÅ¡ich hlasov." error_while_fetching_voters: "Ľutujeme, nastala chyba pri zobrazení úÄastníkov." @@ -79,3 +82,5 @@ sk: label: UkázaÅ¥ kto hlasoval poll_options: label: Zadajte každú možnosÅ¥ voľby do nového riadka + automatic_close: + label: Automaticky zatvoriÅ¥ hlasovanie diff --git a/plugins/poll/config/locales/client.sw.yml b/plugins/poll/config/locales/client.sw.yml new file mode 100644 index 0000000000..79772727a0 --- /dev/null +++ b/plugins/poll/config/locales/client.sw.yml @@ -0,0 +1,76 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + js: + poll: + voters: + one: "wapiga kura" + other: "wapiga kura" + total_votes: + one: "jumla ya kura" + other: "jumla ya kura" + average_rating: "Wastani wa tathmini:%{average}" + public: + title: "Kura sio za umma." + multiple: + help: + at_least_min_options: + one: "Chagua angalau chaguo 1" + other: "Chagua angalau machaguo %{count}." + up_to_max_options: + one: "Chagua mpaka chaguo 1" + other: "Chagua mpaka machaguo %{count}" + x_options: + one: "Chagua chaguo 1" + other: "Chagua machaguo %{count}" + between_min_and_max_options: "Chagua kati ya %{min} mpaka %{max}" + cast-votes: + title: "Piga kura zako" + label: "Piga kura sasa!" + show-results: + title: "Onyesha matokeo ya uchaguzi" + label: "Onyesha matokeo" + hide-results: + title: "Rudi kwenye kura zako" + label: "Ficha matokeo" + open: + title: "Fungua uchaguzi" + label: "Fungua" + confirm: "Unauhakika unataka kufungua uchaguzi huu?" + close: + title: "Funga uchaguzi" + label: "Funga" + confirm: "Unauhakika unataka kufunga uchaguzi huu?" + automatic_close: + closes_in: "karibu katika%{timeLeft}" + age: "imefungwa %{age}" + error_while_toggling_status: "Samahani kulikuwa na hitilafu kwenye kubadilisha hali ya uchaguzi huu." + error_while_casting_votes: "Samahani kulikuwa na hitilafu kwenye kupiga kura." + error_while_fetching_voters: "Samahani kulikuwa na hitilafu kwenye kuonyesha wapiga kura." + ui_builder: + title: Jenga uchaguzi + insert: Ingiza uchaguzi + help: + options_count: Weka angalau machaguo mawili + invalid_values: Kiwango cha chini lazima kiwe kidogo kuliko kiwango cha juu. + min_step_value: Kiasi cha Kipimo cha chini ni 1 + poll_type: + label: Aina + regular: Chaguo Moja + multiple: Machaguo Mengi + number: Thaminisha kwa kutumia namba + poll_config: + max: Kiwango cha juu + min: Kiwango cha chini + step: Hatua + poll_public: + label: Onyesha waliopiga kura + poll_options: + label: Weka chaguo moja kwa kila mstari + automatic_close: + label: funga maoni moja kwa moja diff --git a/plugins/poll/config/locales/server.ca.yml b/plugins/poll/config/locales/server.ca.yml index c888ff3b60..51c97d4868 100644 --- a/plugins/poll/config/locales/server.ca.yml +++ b/plugins/poll/config/locales/server.ca.yml @@ -7,6 +7,7 @@ ca: site_settings: + poll_enabled: "Permetre enquestes?" poll_maximum_options: "Nombre màxim d'opcions permeses en una enquesta." poll_edit_window_mins: "Nombre de minuts després del posteig durant els quals poden editar-se les enquestes." poll: diff --git a/plugins/poll/config/locales/server.he.yml b/plugins/poll/config/locales/server.he.yml index 9c160dc77a..c7cd9f8dec 100644 --- a/plugins/poll/config/locales/server.he.yml +++ b/plugins/poll/config/locales/server.he.yml @@ -7,6 +7,7 @@ he: site_settings: + poll_enabled: "ל×פשר סקרי×?" poll_maximum_options: "מספר ×”×פשרויות המירבי המותר בסקר" poll_edit_window_mins: "מספר דקות ×חרי יצירת פוסט במהלכן ניתן לערוך סקרי×." poll: diff --git a/plugins/poll/config/locales/server.hu.yml b/plugins/poll/config/locales/server.hu.yml new file mode 100644 index 0000000000..4b67637b30 --- /dev/null +++ b/plugins/poll/config/locales/server.hu.yml @@ -0,0 +1,28 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +hu: + site_settings: + poll_enabled: "Engedélyezve vannak a szavazások?" + poll_maximum_options: "Maximum megszavazható tétel a szavazásokban." + poll_edit_window_mins: "Percek száma miután még lehet szerkeszteni a bejegyzést." + poll_minimum_trust_level_to_create: "Legkisebb szükséges bizalmi szint meghatározása szavazások létrehozásához." + poll: + default_poll_must_have_at_least_2_options: "Legalább 2 választható tételt kell tartalmaznia a szavazásnak." + default_poll_must_have_less_options: + one: "Szavazásnak kevesebb, mint 1 lehetÅ‘séget kell tartalmaznia." + other: "Szavazásnak legalább %{count} lehetÅ‘séget kell tartalmaznia." + default_poll_must_have_different_options: "A szavazásnak több különbözÅ‘ megszavazható tételt kell tartalmaznia." + named_poll_must_have_different_options: "A %[name] nevű szavazásnak több különbözÅ‘ megszavazható tételt kell tartalmaznia." + requires_at_least_1_valid_option: "Ki kell választanod legalább 1 érvényes lehetÅ‘séget." + topic_must_be_open_to_vote: "A témának nyítottnak kell hogy legyen hogy szavazni lehessen." + poll_must_be_open_to_vote: "A szavazásnak engedélyezve kell lennie ahhoz, hogy a felhasználok tudjanak szavazni." + topic_must_be_open_to_toggle_status: "A témának nyitottnak kell lennie hogy bekapcsolni lehessen a státuszt." + only_staff_or_op_can_toggle_status: "Csak egy staff tag vagy az eredeti posztoló tudja bekapcsolni a szavazás státuszát." + insufficient_rights_to_create: "Nem tudsz szavazást létrehozni." + email: + link_to_poll: "Klikk, hogy megnézd ezt a szavazást." diff --git a/plugins/poll/config/locales/server.it.yml b/plugins/poll/config/locales/server.it.yml index eb82db2fe5..0890a5b8e1 100644 --- a/plugins/poll/config/locales/server.it.yml +++ b/plugins/poll/config/locales/server.it.yml @@ -28,15 +28,18 @@ it: named_poll_with_multiple_choices_has_invalid_parameters: "Il sondaggio a scelta multipla dal nome %{name} ha parametri non validi." requires_at_least_1_valid_option: "Devi scegliere almeno una opzione valida." default_cannot_be_made_public: "I sondaggi con voti non possono essere resi pubblici." + named_cannot_be_made_public: "Il sondaggio dal nome %{name} contiene voti e non può essere reso pubblico." edit_window_expired: op_cannot_edit_options: "Non puoi aggiungere o cancellare le voci del sondaggio dopo i primi %{minutes} minuti. Contatta un moderatore se hai bisogno di modificare una voce di sondaggio." staff_cannot_add_or_remove_options: "Non puoi aggiungere o cancellare le voci del sondaggio dopo i primi %{minutes} minuti. Per farlo devi chiudere questo argomento ed aprirne uno nuovo." no_polls_associated_with_this_post: "Non ci sono sondaggi associati con questo messaggio." no_poll_with_this_name: "Nessun sondaggio avente nome %{name} è associato a questo messaggio." post_is_deleted: "Non è possibile operare su un messaggio cancellato." + user_cant_post_in_topic: "Non puoi votare perché non puoi pubblicare messaggi in questo argomento." topic_must_be_open_to_vote: "L'argomento deve essere aperto per poter votare." poll_must_be_open_to_vote: "Il sondaggio deve essere aperto per poter votare." topic_must_be_open_to_toggle_status: "L'argomento deve essere aperto per commutare lo stato." only_staff_or_op_can_toggle_status: "Solo un membro dello staff o l'autore originale possono commutare lo stato di un sondaggio." + insufficient_rights_to_create: "Non sei autorizzato a creare sondaggi." email: link_to_poll: "Clicca per vedere il sondaggio." diff --git a/plugins/poll/config/locales/server.pl_PL.yml b/plugins/poll/config/locales/server.pl_PL.yml index 78a78cf111..e88eee6495 100644 --- a/plugins/poll/config/locales/server.pl_PL.yml +++ b/plugins/poll/config/locales/server.pl_PL.yml @@ -32,6 +32,7 @@ pl_PL: named_poll_with_multiple_choices_has_invalid_parameters: "Ankieta wielokrotnego wyboru o nazwie %{name} posiada nieprawidÅ‚owe parametry." requires_at_least_1_valid_option: "Musisz wybrać co najmniej 1 poprawnÄ… opcje." default_cannot_be_made_public: "Ankieta z gÅ‚osami nie może być publiczna." + named_cannot_be_made_public: "Ankieta o nazwie %{name} posiada gÅ‚osy, w zwiÄ…zku z czym nie może być upubliczniona." edit_window_expired: op_cannot_edit_options: "Po upÅ‚ywie pierwszych %{minutes} minut nie można dodawać lub usuwać opcji wyboru w ankietach. Skontaktuj siÄ™ z moderatorem jeÅ›li naprawdÄ™ musisz zmienić opcjÄ™ w tej ankiecie." staff_cannot_add_or_remove_options: "Po upÅ‚ywie pierwszych %{minutes} minut nie można dodawać lub usuwać opcji wyboru w ankietach. Należy zamknąć ten temat i utworzyć zamiast tego nowy temat." diff --git a/plugins/poll/config/locales/server.pt_BR.yml b/plugins/poll/config/locales/server.pt_BR.yml index ef5cb4a77c..793a07bfa9 100644 --- a/plugins/poll/config/locales/server.pt_BR.yml +++ b/plugins/poll/config/locales/server.pt_BR.yml @@ -7,8 +7,10 @@ pt_BR: site_settings: + poll_enabled: "Permitir pesquisas?" poll_maximum_options: "Número máximo de opções permitidas em uma enquete." poll_edit_window_mins: "Número de minutos após a criação de uma postagem em que as enquetes podem ser editadas." + poll_minimum_trust_level_to_create: "Defina o nível mínimo de confiança necessário para criar enquetes." poll: multiple_polls_without_name: "Existem várias enquetes sem nome. Use o atributo 'name' para identificar suas enquetes." multiple_polls_with_same_name: "Existem várias enquetes com o mesmo nome: %{name}. Use o atributo 'name' para identificar suas enquetes." @@ -26,15 +28,18 @@ pt_BR: named_poll_with_multiple_choices_has_invalid_parameters: "Enquete chamada %{name} com múltiplas escolhas tem parâmetros inválidos." requires_at_least_1_valid_option: "Você deve selecionar pelo menos 1 opção válida." default_cannot_be_made_public: "Enquetes com votos não podem ser tornadas públicas." + named_cannot_be_made_public: "Pesquisa nomeada %{name} tem votos e não pode ser tornada pública." edit_window_expired: op_cannot_edit_options: "Você não pode adicionar ou remover opções das enquetes depois dos primeiros %{minutes} minutos. Por favor contate um moderador se você precisar editar uma opção da enquete." staff_cannot_add_or_remove_options: "Você não pode adicionar ou remover opções das enquetes depois dos primeiros %{minutes} minutos. Você deve fechar este tópico e criar um novo." no_polls_associated_with_this_post: "Não há votações associadas com esta mensagem." no_poll_with_this_name: "Nenhuma enquete com o nome %{nome} associada com esta mensagem." post_is_deleted: "Não pode agir numa mensagem apagada." + user_cant_post_in_topic: "Você não pode votar porque não pode postar neste tópico." topic_must_be_open_to_vote: "O tópico deve ser aperto para votação." poll_must_be_open_to_vote: "A enquete deve estar aberta para votação." topic_must_be_open_to_toggle_status: "O tópico deve estar aberto para mudar o status." only_staff_or_op_can_toggle_status: "Somente um moderador ou o criador do tópico pode mudar o status da enquete." + insufficient_rights_to_create: "Você não tem permissão para criar enquetes." email: link_to_poll: "Clique para ver a enquete." diff --git a/plugins/poll/config/locales/server.ru.yml b/plugins/poll/config/locales/server.ru.yml index e9003596ee..93ebe34e82 100644 --- a/plugins/poll/config/locales/server.ru.yml +++ b/plugins/poll/config/locales/server.ru.yml @@ -38,6 +38,7 @@ ru: no_polls_associated_with_this_post: "Ð’ данном Ñообщении нет опроÑов." no_poll_with_this_name: "Ð’ данном Ñообщении нет опроÑа под названием %{name}." post_is_deleted: "Ðевозможно Ñовершить дейÑтвие над удаленным Ñообщением." + user_cant_post_in_topic: "Ð’Ñ‹ не можете голоÑовать, Ñ‚.к. вы не можете пиÑать в Ñтой теме." topic_must_be_open_to_vote: "Ð”Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти голоÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² опроÑе, тема должна быть открыта." poll_must_be_open_to_vote: "ÐžÐ¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть открыт, чтобы в нем можно было голоÑовать." topic_must_be_open_to_toggle_status: "Чтобы изменить ÑтатуÑ, тема должна быть открыта." diff --git a/plugins/poll/config/locales/server.sk.yml b/plugins/poll/config/locales/server.sk.yml index 0f2313dfd5..a060473d49 100644 --- a/plugins/poll/config/locales/server.sk.yml +++ b/plugins/poll/config/locales/server.sk.yml @@ -32,6 +32,7 @@ sk: named_poll_with_multiple_choices_has_invalid_parameters: "Hlasovanie s názvom %{name} s viac možnosÅ¥ami má nesprávne parametre." requires_at_least_1_valid_option: "Musite vybraÅ¥ aspoň 1 platnú možnosÅ¥." default_cannot_be_made_public: "Hlasovanie s hlasmi nemôže byÅ¥ zverejnené." + named_cannot_be_made_public: "Hlasovanie nazvané %{name} má hlasy a nemôže byÅ¥ zverejnené." edit_window_expired: op_cannot_edit_options: "Po prvých %{minutes} minútach už nemôžete pridaÅ¥ alebo odstrániÅ¥ možnosti hlasovania. Ak potrebujete upraviÅ¥ možnosti hlasovania prosím kontaktujte moderátora." staff_cannot_add_or_remove_options: "Po prvých %{minutes} minútach už nemôžete pridaÅ¥ alebo odstrániÅ¥ možnosti hlasovania. Miesto toho by ste mali uzavrieÅ¥ túto tému a miesto nej vytvoriÅ¥ inú." diff --git a/plugins/poll/config/locales/server.sw.yml b/plugins/poll/config/locales/server.sw.yml new file mode 100644 index 0000000000..e1c2743ce7 --- /dev/null +++ b/plugins/poll/config/locales/server.sw.yml @@ -0,0 +1,45 @@ +# encoding: utf-8 +# +# Never edit this file. It will be overwritten when translations are pulled from Transifex. +# +# To work with us on translations, join this project: +# https://www.transifex.com/projects/p/discourse-org/ + +sw: + site_settings: + poll_enabled: "Ruhusu Uchaguzi?" + poll_maximum_options: "Idadi ya juu ya machaguo yanayoruhusiwa katika uchaguzi." + poll_edit_window_mins: "Idadi ya dakika baada ya maandiko kuwekwa ambapo uchaguzi unaweza kuhaririwa." + poll_minimum_trust_level_to_create: "Chagua kiwango cha chini ya uaminifu mtumiaji anahitaji kutengeneza uchaguzi." + poll: + multiple_polls_without_name: "Kuna chaguzi kadhaa zenye majina sawa. Tumia dhana ya 'jina' ili kutambua chaguzi zako." + multiple_polls_with_same_name: "Kuna chaguzi kadhaa zenye majina sawa: %{name}. Tumia dhana ya 'jina' ilikutofautisha chaguzi zako." + default_poll_must_have_at_least_2_options: "Chaguzi lazima ziwe angalau na machaguo 2." + named_poll_must_have_at_least_2_options: "Chaguzi yenye jina %{name} lazima iwe na angalau machaguo 2." + default_poll_must_have_less_options: + one: "Chaguzi lazima uwe na chaguo chini ya 1." + other: "Uchaguzi lazima uwe na chaguo chini ya %{count}." + named_poll_must_have_less_options: + one: "Uchaguzi wenye jina %{name} lazima uwe na chaguo chini ya 1." + other: "Uchaguzi wenye jina %{name} lazima uwe na machaguo chini ya %{count}." + default_poll_must_have_different_options: "Uchaguzi lazima uwe na machaguo tofauti." + named_poll_must_have_different_options: "Uchaguzi wenye jina %{name} lazima uwe na machaguo tofauti." + default_poll_with_multiple_choices_has_invalid_parameters: "Uchaguzi wenye machaguo mengi una vigezo ambavyo si sahihi." + named_poll_with_multiple_choices_has_invalid_parameters: "Uchaguzi wenye jina %{name}, ambao una machaguo mengi, una vigezo ambavyo si sahihi." + requires_at_least_1_valid_option: "Lazima uchague angalau chaguo 1 sahihi." + default_cannot_be_made_public: "Uchaguzi wenye kura hauwezi kugeuzwa ili usiwe wa siri." + named_cannot_be_made_public: "Uchaguzi ulioitwa %{name} una kura na hauwezi kufanyika kwa umma." + edit_window_expired: + op_cannot_edit_options: "Huwezi ukaongeza au kupunguza machaguo ya uchaguzi baada ya dakika %{minutes} za kwanza. Tafadhali wasiliana na msimamizi wa jukwaa kama utahitaji kuhariri chaguo la uchaguzi." + staff_cannot_add_or_remove_options: "Huwezi kuongeza au kupunguza machaguo ya uchaguzi baada ya dakika %{minutes}za mwanzo. Unapaswa kufunga mada hii na kuanzisha mada mpya badala yake." + no_polls_associated_with_this_post: "Hakuna chaguzi zinazohusiana na bandiko hili." + no_poll_with_this_name: "Hakuna uchaguzi wenye jina %{name} unaohusiana na bandiko hili." + post_is_deleted: "Huwezi kufanyia kazi bandiko lililofutwa." + user_cant_post_in_topic: "Huwezi kupiga kura kwa sababu hauwezi kuchangia kwenye hii mada." + topic_must_be_open_to_vote: "Mada inatakiwa iwe wazi, ili kupiga kura." + poll_must_be_open_to_vote: "Uchaguzi lazima uwe wazi ili kupiga kura." + topic_must_be_open_to_toggle_status: "Mada inatakiwa iwe wazi ili kubadilisha hali." + only_staff_or_op_can_toggle_status: "Ni msaidizi au mwandishi wa bandiko tu, ndo wanaoweza kubadilisha hali ya uchaguzi." + insufficient_rights_to_create: "Hauruhusiwi kutengeneza uchaguzi." + email: + link_to_poll: "Bofya ili kuangalia uchaguzi." diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index c4a5adcf32..44f818cabd 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -280,7 +280,8 @@ after_initialize do User.where(id: user_ids).each do |user| user_hash = UserNameSerializer.new(user).serializable_hash - poll_votes[user.id.to_s][poll_name].each do |option_id| + # protect against poorly denormalized data + poll_votes&.dig(user.id.to_s, poll_name)&.each do |option_id| if (params[:option_id]) next unless option_id == params[:option_id].to_s end diff --git a/plugins/poll/spec/controllers/polls_controller_spec.rb b/plugins/poll/spec/controllers/polls_controller_spec.rb index 390d342f13..5f377896bb 100644 --- a/plugins/poll/spec/controllers/polls_controller_spec.rb +++ b/plugins/poll/spec/controllers/polls_controller_spec.rb @@ -6,8 +6,8 @@ describe ::DiscoursePoll::PollsController do let!(:user) { log_in } let(:topic) { Fabricate(:topic) } - let(:poll) { Fabricate(:post, topic_id: topic.id, user_id: user.id, raw: "[poll]\n- A\n- B\n[/poll]") } - let(:multi_poll) { Fabricate(:post, topic_id: topic.id, user_id: user.id, raw: "[poll min=1 max=2 type=multiple public=true]\n- A\n- B\n[/poll]") } + let(:poll) { Fabricate(:post, topic: topic, user: user, raw: "[poll]\n- A\n- B\n[/poll]") } + let(:multi_poll) { Fabricate(:post, topic: topic, user: user, raw: "[poll min=1 max=2 type=multiple public=true]\n- A\n- B\n[/poll]") } describe "#vote" do @@ -18,7 +18,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["name"]).to eq("poll") expect(json["poll"]["voters"]).to eq(1) @@ -30,7 +30,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["A", "B"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.requires_at_least_1_valid_option")) end @@ -40,13 +40,13 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) put :vote, params: { post_id: poll.id, poll_name: "poll", options: ["e89dec30bbd9bf50fabf6a05b4324edf"] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["voters"]).to eq(1) expect(json["poll"]["options"][0]["votes"]).to eq(0) @@ -60,7 +60,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) end it "ensures topic is not archived" do @@ -70,7 +70,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["A"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.topic_must_be_open_to_vote")) end @@ -82,7 +82,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["A"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.post_is_deleted")) end @@ -94,7 +94,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["A"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.user_cant_post_in_topic")) end @@ -104,7 +104,7 @@ describe ::DiscoursePoll::PollsController do post_id: Fabricate(:post).id, poll_name: "foobar", options: ["A"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.no_polls_associated_with_this_post")) end @@ -114,7 +114,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "foobar", options: ["A"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.no_poll_with_this_name", name: "foobar")) end @@ -126,7 +126,7 @@ describe ::DiscoursePoll::PollsController do post_id: closed_poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.poll_must_be_open_to_vote")) end @@ -139,7 +139,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["voters"]).to eq(18) @@ -157,7 +157,7 @@ describe ::DiscoursePoll::PollsController do format: :json end.first - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["voters"]).to eq(1) @@ -172,7 +172,7 @@ describe ::DiscoursePoll::PollsController do params: body.merge(options: ["e89dec30bbd9bf50fabf6a05b4324edf"]), format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["voters"]).to eq(1) @@ -188,7 +188,7 @@ describe ::DiscoursePoll::PollsController do params: body.merge(options: ["e89dec30bbd9bf50fabf6a05b4324edf", "5c24fc1df56d764b550ceae1b9319125"]), format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["voters"]).to eq(2) @@ -208,7 +208,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", status: "closed" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["status"]).to eq("closed") end @@ -221,7 +221,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", status: "closed" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["poll"]["status"]).to eq("closed") end @@ -233,7 +233,7 @@ describe ::DiscoursePoll::PollsController do post_id: poll.id, poll_name: "poll", status: "closed" }, format: :json - expect(response).not_to be_success + expect(response.status).not_to eq(200) json = ::JSON.parse(response.body) expect(json["errors"][0]).to eq(I18n.t("poll.post_is_deleted")) end @@ -253,7 +253,7 @@ describe ::DiscoursePoll::PollsController do post_id: multi_poll.id, poll_name: "poll", options: [first] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) user2 = log_in @@ -261,7 +261,7 @@ describe ::DiscoursePoll::PollsController do post_id: multi_poll.id, poll_name: "poll", options: [first] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) user3 = log_in @@ -271,19 +271,36 @@ describe ::DiscoursePoll::PollsController do options: [first, second] }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) get :voters, params: { poll_name: 'poll', post_id: multi_poll.id, voter_limit: 2 }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = JSON.parse(response.body) # no user3 cause voter_limit is 2 expect(json["poll"][first].map { |h| h["id"] }.sort).to eq([user1.id, user2.id]) expect(json["poll"][second].map { |h| h["id"] }).to eq([user3.id]) + + reloaded = Post.find(multi_poll.id) + + # break the custom poll and make sure we still return something sane here + # TODO: normalize this data so we don't store the information twice and there is a chance + # that somehow a bg job can cause both fields to be out-of-sync + poll_votes = reloaded.custom_fields[DiscoursePoll::VOTES_CUSTOM_FIELD] + poll_votes.delete user2.id.to_s + + reloaded.save_custom_fields(true) + + get :voters, params: { + poll_name: 'poll', post_id: multi_poll.id, voter_limit: 2 + }, format: :json + + expect(response.status).to eq(200) + end end diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb index 917592e53c..96ccc97e7c 100644 --- a/plugins/poll/spec/controllers/posts_controller_spec.rb +++ b/plugins/poll/spec/controllers/posts_controller_spec.rb @@ -16,7 +16,7 @@ describe PostsController do title: title, raw: "[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["poll"]).to be @@ -29,7 +29,7 @@ describe PostsController do topic_id: post_1.topic.id, raw: "[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["poll"]).to be @@ -43,7 +43,7 @@ describe PostsController do title: title, raw: "[poll name=#{name} close=#{close_date.iso8601}]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["polls"][name]["close"]).to be @@ -99,7 +99,7 @@ describe PostsController do title: title, raw: "[poll name=]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["cooked"]).to include("<script>") @@ -111,7 +111,7 @@ describe PostsController do title: title, raw: "[Polls are awesome](/foobar)\n[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]).to be @@ -122,7 +122,7 @@ describe PostsController do title: title, raw: "[poll name=1]\n- A\n[poll name=2]\n- B\n- C\n[/poll]\n- D\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["1"]).to_not be @@ -148,7 +148,7 @@ describe PostsController do id: post_id, post: { raw: "[poll]\n- A\n- B\n- C\n[/poll]" } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["polls"]["poll"]["options"][2]["html"]).to eq("C") end @@ -160,7 +160,7 @@ describe PostsController do id: post_id, post: { raw: "[poll]\n- A\n- B\n- C\n[/poll]" } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["polls_votes"]).to_not be end @@ -196,7 +196,7 @@ describe PostsController do id: post_id, post: { raw: new_option } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") end @@ -208,14 +208,14 @@ describe PostsController do id: post_id, post: { raw: new_option } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") end it "support changes on the post" do put :update, params: { id: post_id, post: { raw: updated } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["cooked"]).to match("before") end @@ -248,7 +248,7 @@ describe PostsController do id: post_id, post: { raw: new_option } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") expect(json["post"]["polls"]["poll"]["voters"]).to eq(1) @@ -267,7 +267,7 @@ describe PostsController do id: post_id, post: { raw: new_option } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") @@ -278,7 +278,7 @@ describe PostsController do it "support changes on the post" do put :update, params: { id: post_id, post: { raw: updated } }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["post"]["cooked"]).to match("before") end @@ -322,7 +322,7 @@ describe PostsController do title: title, raw: "[poll]\n- A\n- B\n[/poll]\n[poll name=foo]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["poll"]).to be @@ -363,7 +363,7 @@ describe PostsController do title: title, raw: "[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to eq("

[poll]

\n
    \n
  • A
  • \n
  • B
    \n[/poll]
  • \n
") end @@ -399,7 +399,7 @@ describe PostsController do title: title, raw: "[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["poll"]).to be @@ -418,7 +418,7 @@ describe PostsController do title: title, raw: "[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["poll"]).to be @@ -437,7 +437,7 @@ describe PostsController do title: title, raw: "[poll]\n- A\n- B\n[/poll]" }, format: :json - expect(response).to be_success + expect(response.status).to eq(200) json = ::JSON.parse(response.body) expect(json["cooked"]).to match("data-poll-") expect(json["polls"]["poll"]).to be diff --git a/plugins/poll/spec/lib/pretty_text_spec.rb b/plugins/poll/spec/lib/pretty_text_spec.rb index e01a32d565..a21d6aac0a 100644 --- a/plugins/poll/spec/lib/pretty_text_spec.rb +++ b/plugins/poll/spec/lib/pretty_text_spec.rb @@ -98,7 +98,7 @@ describe PrettyText do
    -
  1. test 1 :slight_smile: test +
  2. test 1 :slight_smile: test
  3. test 2
diff --git a/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 b/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 index 99f4fd300c..586f6b9bab 100644 --- a/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 @@ -13,32 +13,41 @@ acceptance("Poll Builder - polls are disabled", { } }); -test("regular user - sufficient trust level", (assert) => { +test("regular user - sufficient trust level", assert => { replaceCurrentUser({ staff: false, trust_level: 3 }); displayPollBuilderButton(); andThen(() => { - assert.ok(!exists(".select-kit-row[title='Build Poll']"), "it hides the builder button"); + assert.ok( + !exists(".select-kit-row[title='Build Poll']"), + "it hides the builder button" + ); }); }); -test("regular user - insufficient trust level", (assert) => { +test("regular user - insufficient trust level", assert => { replaceCurrentUser({ staff: false, trust_level: 1 }); displayPollBuilderButton(); andThen(() => { - assert.ok(!exists(".select-kit-row[title='Build Poll']"), "it hides the builder button"); + assert.ok( + !exists(".select-kit-row[title='Build Poll']"), + "it hides the builder button" + ); }); }); -test("staff", (assert) => { +test("staff", assert => { replaceCurrentUser({ staff: true }); displayPollBuilderButton(); andThen(() => { - assert.ok(!exists(".select-kit-row[title='Build Poll']"), "it hides the builder button"); + assert.ok( + !exists(".select-kit-row[title='Build Poll']"), + "it hides the builder button" + ); }); }); diff --git a/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 b/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 index 5f407a958f..933e62ab9d 100644 --- a/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 @@ -13,32 +13,41 @@ acceptance("Poll Builder - polls are enabled", { } }); -test("regular user - sufficient trust level", (assert) => { +test("regular user - sufficient trust level", assert => { replaceCurrentUser({ staff: false, trust_level: 1 }); displayPollBuilderButton(); andThen(() => { - assert.ok(exists(".select-kit-row[title='Build Poll']"), "it shows the builder button"); + assert.ok( + exists(".select-kit-row[title='Build Poll']"), + "it shows the builder button" + ); }); }); -test("regular user - insufficient trust level", (assert) => { +test("regular user - insufficient trust level", assert => { replaceCurrentUser({ staff: false, trust_level: 0 }); displayPollBuilderButton(); andThen(() => { - assert.ok(!exists(".select-kit-row[title='Build Poll']"), "it hides the builder button"); + assert.ok( + !exists(".select-kit-row[title='Build Poll']"), + "it hides the builder button" + ); }); }); -test("staff - with insufficient trust level", (assert) => { +test("staff - with insufficient trust level", assert => { replaceCurrentUser({ staff: true, trust_level: 0 }); displayPollBuilderButton(); andThen(() => { - assert.ok(exists(".select-kit-row[title='Build Poll']"), "it shows the builder button"); + assert.ok( + exists(".select-kit-row[title='Build Poll']"), + "it shows the builder button" + ); }); }); diff --git a/plugins/poll/test/javascripts/acceptance/polls-test.js.es6 b/plugins/poll/test/javascripts/acceptance/polls-test.js.es6 index b6f81eba61..ebfe91455e 100644 --- a/plugins/poll/test/javascripts/acceptance/polls-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/polls-test.js.es6 @@ -9,116 +9,2023 @@ acceptance("Rendering polls", { } }); -test("Single Poll", (assert) => { - server.get('/t/13.json', () => { // eslint-disable-line no-undef +test("Single Poll", async assert => { + // prettier-ignore + server.get("/t/13.json", () => { // eslint-disable-line no-undef return [ 200, { "Content-Type": "application/json" }, - {"post_stream":{"posts":[{"id":19,"name":null,"username":"tgx","avatar_template":"/images/avatar.png","created_at":"2016-12-01T02:39:49.199Z","cooked":"
\n
\n
    \n
  • test
  • \n
  • haha
  • \n
\n

0voters

\n
\n\n
\n\n
\n
\n
    \n
  • donkey
  • \n
  • kong
  • \n
\n

0voters

\n
\n\n
","post_number":1,"post_type":1,"updated_at":"2016-12-01T02:47:18.317Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"avg_time":null,"incoming_link_count":0,"reads":1,"score":0,"yours":true,"topic_id":13,"topic_slug":"this-is-a-test-topic-for-polls","display_username":null,"primary_group_name":null,"primary_group_flair_url":null,"primary_group_flair_bg_color":null,"primary_group_flair_color":null,"version":2,"can_edit":true,"can_delete":false,"can_recover":true,"can_wiki":true,"read":true,"user_title":null,"actions_summary":[{"id":3,"can_act":true},{"id":4,"can_act":true},{"id":5,"hidden":true,"can_act":true},{"id":7,"can_act":true},{"id":8,"can_act":true}],"moderator":false,"admin":true,"staff":true,"user_id":1,"hidden":false,"hidden_reason_id":null,"trust_level":4,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"polls":{"poll":{"options":[{"id":"57ddd734344eb7436d64a7d68a0df444","html":"test","votes":0},{"id":"b5b78d79ab5b5d75d4d33d8b87f5d2aa","html":"haha","votes":0}],"voters":2,"status":"open","name":"poll"},"test":{"options":[{"id":"c26ad90783b0d80936e5fdb292b7963c","html":"donkey","votes":0},{"id":"99f2b9ac452ba73b115fcf3556e6d2d4","html":"kong","votes":0}],"voters":3,"status":"open","name":"test"}}}],"stream":[19]},"timeline_lookup":[[1,0]],"id":13,"title":"This is a test topic for polls","fancy_title":"This is a test topic for polls","posts_count":1,"created_at":"2016-12-01T02:39:48.055Z","views":1,"reply_count":0,"participant_count":1,"like_count":0,"last_posted_at":"2016-12-01T02:39:49.199Z","visible":true,"closed":false,"archived":false,"has_summary":false,"archetype":"regular","slug":"this-is-a-test-topic-for-polls","category_id":1,"word_count":10,"deleted_at":null,"user_id":1,"draft":null,"draft_key":"topic_13","draft_sequence":4,"posted":true,"unpinned":null,"pinned_globally":false,"pinned":false,"pinned_at":null,"pinned_until":null,"details":{"auto_close_at":null,"auto_close_hours":null,"auto_close_based_on_last_post":false,"created_by":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"},"last_poster":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"},"participants":[{"id":1,"username":"tgx","avatar_template":"/images/avatar.png","post_count":1}],"suggested_topics":[{"id":8,"title":"Welcome to Discourse","fancy_title":"Welcome to Discourse","slug":"welcome-to-discourse","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2016-11-24T02:10:54.328Z","last_posted_at":"2016-11-24T02:10:54.393Z","bumped":true,"bumped_at":"2016-11-24T02:10:54.393Z","unseen":false,"pinned":true,"unpinned":null,"excerpt":"The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"archetype":"regular","like_count":0,"views":0,"category_id":1,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":-1,"username":"system","avatar_template":"/images/avatar.png"}}]},{"id":12,"title":"Some testing topic testing","fancy_title":"Some testing topic testing","slug":"some-testing-topic-testing","posts_count":4,"reply_count":0,"highest_post_number":4,"image_url":null,"created_at":"2016-11-24T08:36:08.773Z","last_posted_at":"2016-12-01T01:15:52.008Z","bumped":true,"bumped_at":"2016-12-01T01:15:52.008Z","unseen":false,"last_read_post_number":4,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":2,"category_id":1,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"}}]},{"id":11,"title":"Some testing topic","fancy_title":"Some testing topic","slug":"some-testing-topic","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2016-11-24T08:35:26.758Z","last_posted_at":"2016-11-24T08:35:26.894Z","bumped":true,"bumped_at":"2016-11-24T08:35:26.894Z","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":0,"category_id":1,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"}}]}],"notification_level":3,"notifications_reason_id":1,"can_move_posts":true,"can_edit":true,"can_delete":true,"can_recover":true,"can_remove_allowed_users":true,"can_invite_to":true,"can_create_post":true,"can_reply_as_new_topic":true,"can_flag_topic":true},"highest_post_number":1,"last_read_post_number":1,"last_read_post_id":19,"deleted_by":null,"has_deleted":false,"actions_summary":[{"id":4,"count":0,"hidden":false,"can_act":true},{"id":7,"count":0,"hidden":false,"can_act":true},{"id":8,"count":0,"hidden":false,"can_act":true}],"chunk_size":20,"bookmarked":false} + { + post_stream: { + posts: [ + { + id: 19, + name: null, + username: "tgx", + avatar_template: "/images/avatar.png", + created_at: "2016-12-01T02:39:49.199Z", + cooked: + '
\n
\n
    \n
  • test
  • \n
  • haha
  • \n
\n

0voters

\n
\n\n
\n\n
\n
\n
    \n
  • donkey
  • \n
  • kong
  • \n
\n

0voters

\n
\n\n
', + post_number: 1, + post_type: 1, + updated_at: "2016-12-01T02:47:18.317Z", + reply_count: 0, + reply_to_post_number: null, + quote_count: 0, + avg_time: null, + incoming_link_count: 0, + reads: 1, + score: 0, + yours: true, + topic_id: 13, + topic_slug: "this-is-a-test-topic-for-polls", + display_username: null, + primary_group_name: null, + primary_group_flair_url: null, + primary_group_flair_bg_color: null, + primary_group_flair_color: null, + version: 2, + can_edit: true, + can_delete: false, + can_recover: true, + can_wiki: true, + read: true, + user_title: null, + actions_summary: [ + { id: 3, can_act: true }, + { id: 4, can_act: true }, + { id: 5, hidden: true, can_act: true }, + { id: 7, can_act: true }, + { id: 8, can_act: true } + ], + moderator: false, + admin: true, + staff: true, + user_id: 1, + hidden: false, + hidden_reason_id: null, + trust_level: 4, + deleted_at: null, + user_deleted: false, + edit_reason: null, + can_view_edit_history: true, + wiki: false, + polls: { + poll: { + options: [ + { + id: "57ddd734344eb7436d64a7d68a0df444", + html: "test", + votes: 0 + }, + { + id: "b5b78d79ab5b5d75d4d33d8b87f5d2aa", + html: "haha", + votes: 0 + } + ], + voters: 2, + status: "open", + name: "poll" + }, + test: { + options: [ + { + id: "c26ad90783b0d80936e5fdb292b7963c", + html: "donkey", + votes: 0 + }, + { + id: "99f2b9ac452ba73b115fcf3556e6d2d4", + html: "kong", + votes: 0 + } + ], + voters: 3, + status: "open", + name: "test" + } + } + } + ], + stream: [19] + }, + timeline_lookup: [[1, 0]], + id: 13, + title: "This is a test topic for polls", + fancy_title: "This is a test topic for polls", + posts_count: 1, + created_at: "2016-12-01T02:39:48.055Z", + views: 1, + reply_count: 0, + participant_count: 1, + like_count: 0, + last_posted_at: "2016-12-01T02:39:49.199Z", + visible: true, + closed: false, + archived: false, + has_summary: false, + archetype: "regular", + slug: "this-is-a-test-topic-for-polls", + category_id: 1, + word_count: 10, + deleted_at: null, + user_id: 1, + draft: null, + draft_key: "topic_13", + draft_sequence: 4, + posted: true, + unpinned: null, + pinned_globally: false, + pinned: false, + pinned_at: null, + pinned_until: null, + details: { + auto_close_at: null, + auto_close_hours: null, + auto_close_based_on_last_post: false, + created_by: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + }, + last_poster: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + }, + participants: [ + { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png", + post_count: 1 + } + ], + suggested_topics: [ + { + id: 8, + title: "Welcome to Discourse", + fancy_title: "Welcome to Discourse", + slug: "welcome-to-discourse", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2016-11-24T02:10:54.328Z", + last_posted_at: "2016-11-24T02:10:54.393Z", + bumped: true, + bumped_at: "2016-11-24T02:10:54.393Z", + unseen: false, + pinned: true, + unpinned: null, + excerpt: + "The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …", + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + archetype: "regular", + like_count: 0, + views: 0, + category_id: 1, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: -1, + username: "system", + avatar_template: "/images/avatar.png" + } + } + ] + }, + { + id: 12, + title: "Some testing topic testing", + fancy_title: "Some testing topic testing", + slug: "some-testing-topic-testing", + posts_count: 4, + reply_count: 0, + highest_post_number: 4, + image_url: null, + created_at: "2016-11-24T08:36:08.773Z", + last_posted_at: "2016-12-01T01:15:52.008Z", + bumped: true, + bumped_at: "2016-12-01T01:15:52.008Z", + unseen: false, + last_read_post_number: 4, + unread: 0, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + archetype: "regular", + like_count: 0, + views: 2, + category_id: 1, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + } + } + ] + }, + { + id: 11, + title: "Some testing topic", + fancy_title: "Some testing topic", + slug: "some-testing-topic", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2016-11-24T08:35:26.758Z", + last_posted_at: "2016-11-24T08:35:26.894Z", + bumped: true, + bumped_at: "2016-11-24T08:35:26.894Z", + unseen: false, + last_read_post_number: 1, + unread: 0, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + archetype: "regular", + like_count: 0, + views: 0, + category_id: 1, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + } + } + ] + } + ], + notification_level: 3, + notifications_reason_id: 1, + can_move_posts: true, + can_edit: true, + can_delete: true, + can_recover: true, + can_remove_allowed_users: true, + can_invite_to: true, + can_create_post: true, + can_reply_as_new_topic: true, + can_flag_topic: true + }, + highest_post_number: 1, + last_read_post_number: 1, + last_read_post_id: 19, + deleted_by: null, + has_deleted: false, + actions_summary: [ + { id: 4, count: 0, hidden: false, can_act: true }, + { id: 7, count: 0, hidden: false, can_act: true }, + { id: 8, count: 0, hidden: false, can_act: true } + ], + chunk_size: 20, + bookmarked: false + } ]; }); - visit("/t/this-is-a-test-topic-for-polls/13"); + await visit("/t/this-is-a-test-topic-for-polls/13"); - andThen(() => { - const polls = find('.poll'); + const polls = find(".poll"); - assert.equal(polls.length, 2, 'it should render the polls correctly'); - assert.equal(find('.info-number', polls[0]).text(), '2', 'it should display the right number of votes'); - assert.equal(find('.info-number', polls[1]).text(), '3', 'it should display the right number of votes'); - }); + assert.equal(polls.length, 2, "it should render the polls correctly"); + assert.equal( + find(".info-number", polls[0]).text(), + "2", + "it should display the right number of votes" + ); + assert.equal( + find(".info-number", polls[1]).text(), + "3", + "it should display the right number of votes" + ); }); -test("Public poll", assert => { - server.get('/t/12.json', () => { // eslint-disable-line no-undef +test("Public poll", async assert => { + // prettier-ignore + server.get("/t/12.json", () => { // eslint-disable-line no-undef return [ 200, { "Content-Type": "application/json" }, - {"post_stream":{"posts":[{"id":15,"name":null,"username":"tgx","avatar_template":"/images/avatar.png","created_at":"2017-01-31T08:39:06.237Z","cooked":"
\n
\n
    \n
  • 1
  • \n
  • 2
  • \n
  • 3
  • \n
\n
\n

0voters

\n

Choose up to 3 options

\n

Votes are public.

\n
\n
\n\n
","post_number":1,"post_type":1,"updated_at":"2017-01-31T08:39:06.237Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"avg_time":null,"incoming_link_count":0,"reads":1,"score":0,"yours":true,"topic_id":12,"topic_slug":"this-is-a-topic-created-for-testing","display_username":null,"primary_group_name":null,"primary_group_flair_url":null,"primary_group_flair_bg_color":null,"primary_group_flair_color":null,"version":1,"can_edit":true,"can_delete":false,"can_recover":true,"can_wiki":true,"read":true,"user_title":null,"actions_summary":[{"id":3,"can_act":true},{"id":4,"can_act":true},{"id":5,"hidden":true,"can_act":true},{"id":7,"can_act":true},{"id":8,"can_act":true}],"moderator":false,"admin":true,"staff":true,"user_id":1,"hidden":false,"hidden_reason_id":null,"trust_level":4,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"polls":{"poll":{"options":[{"id":"4d8a15e3cc35750f016ce15a43937620","html":"1","votes":29},{"id":"cd314db7dfbac2b10687b6f39abfdf41","html":"2","votes":29},{"id":"68b434ff88aeae7054e42cd05a4d9056","html":"3","votes":42}],"voters":100,"status":"open","name":"poll","type":"multiple","min":"1","max":"3","public":"true"}}}],"stream":[15]},"timeline_lookup":[[1,0]],"id":12,"title":"This is a topic created for testing","fancy_title":"This is a topic created for testing","posts_count":1,"created_at":"2017-01-31T08:39:06.094Z","views":1,"reply_count":0,"participant_count":1,"like_count":0,"last_posted_at":"2017-01-31T08:39:06.237Z","visible":true,"closed":false,"archived":false,"has_summary":false,"archetype":"regular","slug":"this-is-a-topic-created-for-testing","category_id":1,"word_count":13,"deleted_at":null,"user_id":1,"draft":null,"draft_key":"topic_12","draft_sequence":1,"posted":true,"unpinned":null,"pinned_globally":false,"pinned":false,"pinned_at":null,"pinned_until":null,"details":{"auto_close_at":null,"auto_close_hours":null,"auto_close_based_on_last_post":false,"created_by":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"},"last_poster":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"},"participants":[{"id":1,"username":"tgx","avatar_template":"/images/avatar.png","post_count":1,"primary_group_name":null,"primary_group_flair_url":null,"primary_group_flair_color":null,"primary_group_flair_bg_color":null}],"suggested_topics":[{"id":8,"title":"Welcome to Discourse","fancy_title":"Welcome to Discourse","slug":"welcome-to-discourse","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2017-01-31T07:53:45.363Z","last_posted_at":"2017-01-31T07:53:45.439Z","bumped":true,"bumped_at":"2017-01-31T07:53:45.439Z","unseen":false,"pinned":true,"unpinned":null,"excerpt":"The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"archetype":"regular","like_count":0,"views":0,"category_id":1,"featured_link":null,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":-1,"username":"system","avatar_template":"/images/avatar.png"}}]},{"id":11,"title":"This is a test post to try out posts","fancy_title":"This is a test post to try out posts","slug":"this-is-a-test-post-to-try-out-posts","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2017-01-31T07:55:58.407Z","last_posted_at":"2017-01-31T07:55:58.634Z","bumped":true,"bumped_at":"2017-01-31T07:55:58.634Z","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":1,"category_id":1,"featured_link":null,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"}}]}],"notification_level":3,"notifications_reason_id":1,"can_move_posts":true,"can_edit":true,"can_delete":true,"can_recover":true,"can_remove_allowed_users":true,"can_invite_to":true,"can_create_post":true,"can_reply_as_new_topic":true,"can_flag_topic":true},"highest_post_number":1,"last_read_post_number":1,"last_read_post_id":15,"deleted_by":null,"has_deleted":false,"actions_summary":[{"id":4,"count":0,"hidden":false,"can_act":true},{"id":7,"count":0,"hidden":false,"can_act":true},{"id":8,"count":0,"hidden":false,"can_act":true}],"chunk_size":20,"bookmarked":false,"featured_link":null} + { + post_stream: { + posts: [ + { + id: 15, + name: null, + username: "tgx", + avatar_template: "/images/avatar.png", + created_at: "2017-01-31T08:39:06.237Z", + cooked: + '
\n
\n
    \n
  • 1
  • \n
  • 2
  • \n
  • 3
  • \n
\n
\n

0voters

\n

Choose up to 3 options

\n

Votes are public.

\n
\n
\n\n
', + post_number: 1, + post_type: 1, + updated_at: "2017-01-31T08:39:06.237Z", + reply_count: 0, + reply_to_post_number: null, + quote_count: 0, + avg_time: null, + incoming_link_count: 0, + reads: 1, + score: 0, + yours: true, + topic_id: 12, + topic_slug: "this-is-a-topic-created-for-testing", + display_username: null, + primary_group_name: null, + primary_group_flair_url: null, + primary_group_flair_bg_color: null, + primary_group_flair_color: null, + version: 1, + can_edit: true, + can_delete: false, + can_recover: true, + can_wiki: true, + read: true, + user_title: null, + actions_summary: [ + { id: 3, can_act: true }, + { id: 4, can_act: true }, + { id: 5, hidden: true, can_act: true }, + { id: 7, can_act: true }, + { id: 8, can_act: true } + ], + moderator: false, + admin: true, + staff: true, + user_id: 1, + hidden: false, + hidden_reason_id: null, + trust_level: 4, + deleted_at: null, + user_deleted: false, + edit_reason: null, + can_view_edit_history: true, + wiki: false, + polls: { + poll: { + options: [ + { + id: "4d8a15e3cc35750f016ce15a43937620", + html: "1", + votes: 29 + }, + { + id: "cd314db7dfbac2b10687b6f39abfdf41", + html: "2", + votes: 29 + }, + { + id: "68b434ff88aeae7054e42cd05a4d9056", + html: "3", + votes: 42 + } + ], + voters: 100, + status: "open", + name: "poll", + type: "multiple", + min: "1", + max: "3", + public: "true" + } + } + } + ], + stream: [15] + }, + timeline_lookup: [[1, 0]], + id: 12, + title: "This is a topic created for testing", + fancy_title: "This is a topic created for testing", + posts_count: 1, + created_at: "2017-01-31T08:39:06.094Z", + views: 1, + reply_count: 0, + participant_count: 1, + like_count: 0, + last_posted_at: "2017-01-31T08:39:06.237Z", + visible: true, + closed: false, + archived: false, + has_summary: false, + archetype: "regular", + slug: "this-is-a-topic-created-for-testing", + category_id: 1, + word_count: 13, + deleted_at: null, + user_id: 1, + draft: null, + draft_key: "topic_12", + draft_sequence: 1, + posted: true, + unpinned: null, + pinned_globally: false, + pinned: false, + pinned_at: null, + pinned_until: null, + details: { + auto_close_at: null, + auto_close_hours: null, + auto_close_based_on_last_post: false, + created_by: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + }, + last_poster: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + }, + participants: [ + { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png", + post_count: 1, + primary_group_name: null, + primary_group_flair_url: null, + primary_group_flair_color: null, + primary_group_flair_bg_color: null + } + ], + suggested_topics: [ + { + id: 8, + title: "Welcome to Discourse", + fancy_title: "Welcome to Discourse", + slug: "welcome-to-discourse", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2017-01-31T07:53:45.363Z", + last_posted_at: "2017-01-31T07:53:45.439Z", + bumped: true, + bumped_at: "2017-01-31T07:53:45.439Z", + unseen: false, + pinned: true, + unpinned: null, + excerpt: + "The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …", + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + archetype: "regular", + like_count: 0, + views: 0, + category_id: 1, + featured_link: null, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: -1, + username: "system", + avatar_template: "/images/avatar.png" + } + } + ] + }, + { + id: 11, + title: "This is a test post to try out posts", + fancy_title: "This is a test post to try out posts", + slug: "this-is-a-test-post-to-try-out-posts", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2017-01-31T07:55:58.407Z", + last_posted_at: "2017-01-31T07:55:58.634Z", + bumped: true, + bumped_at: "2017-01-31T07:55:58.634Z", + unseen: false, + last_read_post_number: 1, + unread: 0, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + archetype: "regular", + like_count: 0, + views: 1, + category_id: 1, + featured_link: null, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + } + } + ] + } + ], + notification_level: 3, + notifications_reason_id: 1, + can_move_posts: true, + can_edit: true, + can_delete: true, + can_recover: true, + can_remove_allowed_users: true, + can_invite_to: true, + can_create_post: true, + can_reply_as_new_topic: true, + can_flag_topic: true + }, + highest_post_number: 1, + last_read_post_number: 1, + last_read_post_id: 15, + deleted_by: null, + has_deleted: false, + actions_summary: [ + { id: 4, count: 0, hidden: false, can_act: true }, + { id: 7, count: 0, hidden: false, can_act: true }, + { id: 8, count: 0, hidden: false, can_act: true } + ], + chunk_size: 20, + bookmarked: false, + featured_link: null + } ]; }); - server.get('/polls/voters.json', request => { // eslint-disable-line no-undef + // prettier-ignore + server.get("/polls/voters.json", request => { // eslint-disable-line no-undef let body = {}; if (_.isEqual(request.queryParams, { post_id: "15", poll_name: "poll" })) { - body = {"poll":{"68b434ff88aeae7054e42cd05a4d9056":[{"id":402,"username":"bruce400","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":409,"username":"bruce407","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":410,"username":"bruce408","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":411,"username":"bruce409","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":421,"username":"bruce419","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":422,"username":"bruce420","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":423,"username":"bruce421","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":426,"username":"bruce424","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":429,"username":"bruce427","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":437,"username":"bruce435","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":440,"username":"bruce438","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":442,"username":"bruce440","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":443,"username":"bruce441","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":445,"username":"bruce443","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":450,"username":"bruce448","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":451,"username":"bruce449","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":453,"username":"bruce451","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":455,"username":"bruce453","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":461,"username":"bruce459","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":466,"username":"bruce464","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":468,"username":"bruce466","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":477,"username":"bruce475","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":478,"username":"bruce476","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":498,"username":"bruce496","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":501,"username":"bruce499","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null}],"cd314db7dfbac2b10687b6f39abfdf41":[{"id":403,"username":"bruce401","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":404,"username":"bruce402","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":405,"username":"bruce403","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":408,"username":"bruce406","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":413,"username":"bruce411","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":414,"username":"bruce412","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":416,"username":"bruce414","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":418,"username":"bruce416","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":419,"username":"bruce417","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":433,"username":"bruce431","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":434,"username":"bruce432","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":435,"username":"bruce433","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":439,"username":"bruce437","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":441,"username":"bruce439","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":448,"username":"bruce446","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":449,"username":"bruce447","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":452,"username":"bruce450","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":462,"username":"bruce460","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":464,"username":"bruce462","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":465,"username":"bruce463","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":470,"username":"bruce468","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":471,"username":"bruce469","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":474,"username":"bruce472","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":476,"username":"bruce474","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":486,"username":"bruce484","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null}],"4d8a15e3cc35750f016ce15a43937620":[{"id":406,"username":"bruce404","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":407,"username":"bruce405","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":412,"username":"bruce410","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":415,"username":"bruce413","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":417,"username":"bruce415","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":420,"username":"bruce418","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":424,"username":"bruce422","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":425,"username":"bruce423","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":427,"username":"bruce425","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":428,"username":"bruce426","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":430,"username":"bruce428","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":431,"username":"bruce429","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":432,"username":"bruce430","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":436,"username":"bruce434","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":438,"username":"bruce436","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":444,"username":"bruce442","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":446,"username":"bruce444","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":447,"username":"bruce445","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":454,"username":"bruce452","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":458,"username":"bruce456","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":459,"username":"bruce457","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":481,"username":"bruce479","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":492,"username":"bruce490","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":494,"username":"bruce492","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":500,"username":"bruce498","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null}]}}; - } else if (_.isEqual(request.queryParams, { post_id: "15", poll_name: "poll", offset: "1", option_id: "68b434ff88aeae7054e42cd05a4d9056" })) { - body = {"poll":{"68b434ff88aeae7054e42cd05a4d9056":[{"id":402,"username":"bruce400","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":409,"username":"bruce407","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":410,"username":"bruce408","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":411,"username":"bruce409","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":421,"username":"bruce419","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":422,"username":"bruce420","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":423,"username":"bruce421","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":426,"username":"bruce424","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":429,"username":"bruce427","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":437,"username":"bruce435","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":440,"username":"bruce438","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":442,"username":"bruce440","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":443,"username":"bruce441","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":445,"username":"bruce443","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":450,"username":"bruce448","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":451,"username":"bruce449","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":453,"username":"bruce451","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":455,"username":"bruce453","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":456,"username":"bruce454","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":461,"username":"bruce459","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":466,"username":"bruce464","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":468,"username":"bruce466","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":477,"username":"bruce475","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":478,"username":"bruce476","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":498,"username":"bruce496","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null}]}}; + body = { + poll: { + "68b434ff88aeae7054e42cd05a4d9056": [ + { + id: 402, + username: "bruce400", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 409, + username: "bruce407", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 410, + username: "bruce408", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 411, + username: "bruce409", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 421, + username: "bruce419", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 422, + username: "bruce420", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 423, + username: "bruce421", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 426, + username: "bruce424", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 429, + username: "bruce427", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 437, + username: "bruce435", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 440, + username: "bruce438", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 442, + username: "bruce440", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 443, + username: "bruce441", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 445, + username: "bruce443", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 450, + username: "bruce448", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 451, + username: "bruce449", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 453, + username: "bruce451", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 455, + username: "bruce453", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 461, + username: "bruce459", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 466, + username: "bruce464", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 468, + username: "bruce466", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 477, + username: "bruce475", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 478, + username: "bruce476", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 498, + username: "bruce496", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 501, + username: "bruce499", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + } + ], + cd314db7dfbac2b10687b6f39abfdf41: [ + { + id: 403, + username: "bruce401", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 404, + username: "bruce402", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 405, + username: "bruce403", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 408, + username: "bruce406", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 413, + username: "bruce411", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 414, + username: "bruce412", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 416, + username: "bruce414", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 418, + username: "bruce416", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 419, + username: "bruce417", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 433, + username: "bruce431", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 434, + username: "bruce432", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 435, + username: "bruce433", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 439, + username: "bruce437", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 441, + username: "bruce439", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 448, + username: "bruce446", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 449, + username: "bruce447", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 452, + username: "bruce450", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 462, + username: "bruce460", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 464, + username: "bruce462", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 465, + username: "bruce463", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 470, + username: "bruce468", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 471, + username: "bruce469", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 474, + username: "bruce472", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 476, + username: "bruce474", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 486, + username: "bruce484", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + } + ], + "4d8a15e3cc35750f016ce15a43937620": [ + { + id: 406, + username: "bruce404", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 407, + username: "bruce405", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 412, + username: "bruce410", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 415, + username: "bruce413", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 417, + username: "bruce415", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 420, + username: "bruce418", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 424, + username: "bruce422", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 425, + username: "bruce423", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 427, + username: "bruce425", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 428, + username: "bruce426", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 430, + username: "bruce428", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 431, + username: "bruce429", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 432, + username: "bruce430", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 436, + username: "bruce434", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 438, + username: "bruce436", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 444, + username: "bruce442", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 446, + username: "bruce444", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 447, + username: "bruce445", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 454, + username: "bruce452", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 458, + username: "bruce456", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 459, + username: "bruce457", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 481, + username: "bruce479", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 492, + username: "bruce490", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 494, + username: "bruce492", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 500, + username: "bruce498", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + } + ] + } + }; + } else if ( + _.isEqual(request.queryParams, { + post_id: "15", + poll_name: "poll", + offset: "1", + option_id: "68b434ff88aeae7054e42cd05a4d9056" + }) + ) { + body = { + poll: { + "68b434ff88aeae7054e42cd05a4d9056": [ + { + id: 402, + username: "bruce400", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 409, + username: "bruce407", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 410, + username: "bruce408", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 411, + username: "bruce409", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 421, + username: "bruce419", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 422, + username: "bruce420", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 423, + username: "bruce421", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 426, + username: "bruce424", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 429, + username: "bruce427", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 437, + username: "bruce435", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 440, + username: "bruce438", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 442, + username: "bruce440", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 443, + username: "bruce441", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 445, + username: "bruce443", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 450, + username: "bruce448", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 451, + username: "bruce449", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 453, + username: "bruce451", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 455, + username: "bruce453", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 456, + username: "bruce454", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 461, + username: "bruce459", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 466, + username: "bruce464", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 468, + username: "bruce466", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 477, + username: "bruce475", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 478, + username: "bruce476", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 498, + username: "bruce496", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + } + ] + } + }; } return [200, { "Content-Type": "application/json" }, body]; }); - visit("/t/this-is-a-topic-created-for-testing/12"); + await visit("/t/this-is-a-topic-created-for-testing/12"); - andThen(() => { - const polls = find('.poll'); - assert.equal(polls.length, 1, 'it should render the poll correctly'); - }); + const polls = find(".poll"); + assert.equal(polls.length, 1, "it should render the poll correctly"); - click('button.toggle-results'); + await click("button.toggle-results"); - andThen(() => { - assert.equal( - find('.poll-voters:first li').length, 25, - 'it should display the right number of voters' - ); - }); + assert.equal( + find(".poll-voters:first li").length, + 25, + "it should display the right number of voters" + ); - click('.poll-voters-toggle-expand:first a'); + await click(".poll-voters-toggle-expand:first a"); - andThen(() => { - assert.equal( - find('.poll-voters:first li').length, 50, - 'it should display the right number of voters' - ); - }); + assert.equal( + find(".poll-voters:first li").length, + 50, + "it should display the right number of voters" + ); }); -test("Public number poll", assert => { - server.get('/t/13.json', () => { // eslint-disable-line no-undef +test("Public number poll", async assert => { + // prettier-ignore + server.get("/t/13.json", () => { // eslint-disable-line no-undef return [ 200, { "Content-Type": "application/json" }, - {"post_stream":{"posts":[{"id":16,"name":null,"username":"tgx","avatar_template":"/images/avatar.png","created_at":"2017-01-31T09:11:11.281Z","cooked":"
\n
\n
    \n
  • 1
  • \n
  • 2
  • \n
  • 3
  • \n
  • 4
  • \n
  • 5
  • \n
  • 6
  • \n
  • 7
  • \n
  • 8
  • \n
  • 9
  • \n
  • 10
  • \n
  • 11
  • \n
  • 12
  • \n
  • 13
  • \n
  • 14
  • \n
  • 15
  • \n
  • 16
  • \n
  • 17
  • \n
  • 18
  • \n
  • 19
  • \n
  • 20
  • \n
\n
\n

0voters

\n

Votes are public.

\n
\n
\n\n
","post_number":1,"post_type":1,"updated_at":"2017-01-31T09:11:11.281Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"avg_time":null,"incoming_link_count":0,"reads":1,"score":0,"yours":true,"topic_id":13,"topic_slug":"this-is-a-topic-for-testing-number-poll","display_username":null,"primary_group_name":null,"primary_group_flair_url":null,"primary_group_flair_bg_color":null,"primary_group_flair_color":null,"version":1,"can_edit":true,"can_delete":false,"can_recover":true,"can_wiki":true,"read":true,"user_title":null,"actions_summary":[{"id":3,"can_act":true},{"id":4,"can_act":true},{"id":5,"hidden":true,"can_act":true},{"id":7,"can_act":true},{"id":8,"can_act":true}],"moderator":false,"admin":true,"staff":true,"user_id":1,"hidden":false,"hidden_reason_id":null,"trust_level":4,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"polls":{"poll":{"options":[{"id":"4d8a15e3cc35750f016ce15a43937620","html":"1","votes":2},{"id":"cd314db7dfbac2b10687b6f39abfdf41","html":"2","votes":1},{"id":"68b434ff88aeae7054e42cd05a4d9056","html":"3","votes":1},{"id":"aa2393b424f2f395abb63bf785760a3b","html":"4","votes":0},{"id":"8b2f2930cac0574c3450f5db9a6fb7f9","html":"5","votes":1},{"id":"60cad69e0cfcb3fa77a68d11d3758002","html":"6","votes":0},{"id":"9ab1070dec27185440cdabb4948a5e9a","html":"7","votes":1},{"id":"99944bf07088f815a966d585daed6a7e","html":"8","votes":3},{"id":"345a83050400d78f5fac98d381b45e23","html":"9","votes":3},{"id":"46c01f638a50d86e020f47469733b8be","html":"10","votes":3},{"id":"07f7f85b2a3809faff68a35e81a664eb","html":"11","votes":2},{"id":"b3e8c14e714910cb8dd7089f097be133","html":"12","votes":4},{"id":"b4f15431e07443c372d521e4ed131abe","html":"13","votes":2},{"id":"a77bc9a30933e5af327211db2da46e17","html":"14","votes":2},{"id":"303d7c623da1985e94a9d27d43596934","html":"15","votes":2},{"id":"4e885ead68ff4456f102843df9fbbd7f","html":"16","votes":1},{"id":"cbf6e2b72e403b12d7ee63a138f32647","html":"17","votes":2},{"id":"9364fa2d67fbd62c473165441ad69571","html":"18","votes":2},{"id":"eb8661f072794ea57baa7827cd8ffc88","html":"19","votes":1},{"id":"b373436e858c0821135f994a5ff3345f","html":"20","votes":2}],"voters":35,"status":"open","name":"poll","type":"number","min":"1","max":"20","step":"1","public":"true"}}}],"stream":[16]},"timeline_lookup":[[1,0]],"id":13,"title":"This is a topic for testing number poll","fancy_title":"This is a topic for testing number poll","posts_count":1,"created_at":"2017-01-31T09:11:11.161Z","views":1,"reply_count":0,"participant_count":1,"like_count":0,"last_posted_at":"2017-01-31T09:11:11.281Z","visible":true,"closed":false,"archived":false,"has_summary":false,"archetype":"regular","slug":"this-is-a-topic-for-testing-number-poll","category_id":1,"word_count":12,"deleted_at":null,"user_id":1,"draft":null,"draft_key":"topic_13","draft_sequence":1,"posted":true,"unpinned":null,"pinned_globally":false,"pinned":false,"pinned_at":null,"pinned_until":null,"details":{"auto_close_at":null,"auto_close_hours":null,"auto_close_based_on_last_post":false,"created_by":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"},"last_poster":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"},"participants":[{"id":1,"username":"tgx","avatar_template":"/images/avatar.png","post_count":1,"primary_group_name":null,"primary_group_flair_url":null,"primary_group_flair_color":null,"primary_group_flair_bg_color":null}],"suggested_topics":[{"id":8,"title":"Welcome to Discourse","fancy_title":"Welcome to Discourse","slug":"welcome-to-discourse","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2017-01-31T07:53:45.363Z","last_posted_at":"2017-01-31T07:53:45.439Z","bumped":true,"bumped_at":"2017-01-31T07:53:45.439Z","unseen":false,"pinned":true,"unpinned":null,"excerpt":"The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"archetype":"regular","like_count":0,"views":0,"category_id":1,"featured_link":null,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":-1,"username":"system","avatar_template":"/images/avatar.png"}}]},{"id":11,"title":"This is a test post to try out posts","fancy_title":"This is a test post to try out posts","slug":"this-is-a-test-post-to-try-out-posts","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2017-01-31T07:55:58.407Z","last_posted_at":"2017-01-31T07:55:58.634Z","bumped":true,"bumped_at":"2017-01-31T07:55:58.634Z","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":1,"category_id":1,"featured_link":null,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"}}]},{"id":12,"title":"This is a topic created for testing","fancy_title":"This is a topic created for testing","slug":"this-is-a-topic-created-for-testing","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2017-01-31T08:39:06.094Z","last_posted_at":"2017-01-31T08:39:06.237Z","bumped":true,"bumped_at":"2017-01-31T09:10:46.528Z","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":1,"category_id":1,"featured_link":null,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/images/avatar.png"}}]}],"notification_level":3,"notifications_reason_id":1,"can_move_posts":true,"can_edit":true,"can_delete":true,"can_recover":true,"can_remove_allowed_users":true,"can_invite_to":true,"can_create_post":true,"can_reply_as_new_topic":true,"can_flag_topic":true},"highest_post_number":1,"last_read_post_number":1,"last_read_post_id":16,"deleted_by":null,"has_deleted":false,"actions_summary":[{"id":4,"count":0,"hidden":false,"can_act":true},{"id":7,"count":0,"hidden":false,"can_act":true},{"id":8,"count":0,"hidden":false,"can_act":true}],"chunk_size":20,"bookmarked":false,"featured_link":null} + { + post_stream: { + posts: [ + { + id: 16, + name: null, + username: "tgx", + avatar_template: "/images/avatar.png", + created_at: "2017-01-31T09:11:11.281Z", + cooked: + '
\n
\n
    \n
  • 1
  • \n
  • 2
  • \n
  • 3
  • \n
  • 4
  • \n
  • 5
  • \n
  • 6
  • \n
  • 7
  • \n
  • 8
  • \n
  • 9
  • \n
  • 10
  • \n
  • 11
  • \n
  • 12
  • \n
  • 13
  • \n
  • 14
  • \n
  • 15
  • \n
  • 16
  • \n
  • 17
  • \n
  • 18
  • \n
  • 19
  • \n
  • 20
  • \n
\n
\n

0voters

\n

Votes are public.

\n
\n
\n\n
', + post_number: 1, + post_type: 1, + updated_at: "2017-01-31T09:11:11.281Z", + reply_count: 0, + reply_to_post_number: null, + quote_count: 0, + avg_time: null, + incoming_link_count: 0, + reads: 1, + score: 0, + yours: true, + topic_id: 13, + topic_slug: "this-is-a-topic-for-testing-number-poll", + display_username: null, + primary_group_name: null, + primary_group_flair_url: null, + primary_group_flair_bg_color: null, + primary_group_flair_color: null, + version: 1, + can_edit: true, + can_delete: false, + can_recover: true, + can_wiki: true, + read: true, + user_title: null, + actions_summary: [ + { id: 3, can_act: true }, + { id: 4, can_act: true }, + { id: 5, hidden: true, can_act: true }, + { id: 7, can_act: true }, + { id: 8, can_act: true } + ], + moderator: false, + admin: true, + staff: true, + user_id: 1, + hidden: false, + hidden_reason_id: null, + trust_level: 4, + deleted_at: null, + user_deleted: false, + edit_reason: null, + can_view_edit_history: true, + wiki: false, + polls: { + poll: { + options: [ + { + id: "4d8a15e3cc35750f016ce15a43937620", + html: "1", + votes: 2 + }, + { + id: "cd314db7dfbac2b10687b6f39abfdf41", + html: "2", + votes: 1 + }, + { + id: "68b434ff88aeae7054e42cd05a4d9056", + html: "3", + votes: 1 + }, + { + id: "aa2393b424f2f395abb63bf785760a3b", + html: "4", + votes: 0 + }, + { + id: "8b2f2930cac0574c3450f5db9a6fb7f9", + html: "5", + votes: 1 + }, + { + id: "60cad69e0cfcb3fa77a68d11d3758002", + html: "6", + votes: 0 + }, + { + id: "9ab1070dec27185440cdabb4948a5e9a", + html: "7", + votes: 1 + }, + { + id: "99944bf07088f815a966d585daed6a7e", + html: "8", + votes: 3 + }, + { + id: "345a83050400d78f5fac98d381b45e23", + html: "9", + votes: 3 + }, + { + id: "46c01f638a50d86e020f47469733b8be", + html: "10", + votes: 3 + }, + { + id: "07f7f85b2a3809faff68a35e81a664eb", + html: "11", + votes: 2 + }, + { + id: "b3e8c14e714910cb8dd7089f097be133", + html: "12", + votes: 4 + }, + { + id: "b4f15431e07443c372d521e4ed131abe", + html: "13", + votes: 2 + }, + { + id: "a77bc9a30933e5af327211db2da46e17", + html: "14", + votes: 2 + }, + { + id: "303d7c623da1985e94a9d27d43596934", + html: "15", + votes: 2 + }, + { + id: "4e885ead68ff4456f102843df9fbbd7f", + html: "16", + votes: 1 + }, + { + id: "cbf6e2b72e403b12d7ee63a138f32647", + html: "17", + votes: 2 + }, + { + id: "9364fa2d67fbd62c473165441ad69571", + html: "18", + votes: 2 + }, + { + id: "eb8661f072794ea57baa7827cd8ffc88", + html: "19", + votes: 1 + }, + { + id: "b373436e858c0821135f994a5ff3345f", + html: "20", + votes: 2 + } + ], + voters: 35, + status: "open", + name: "poll", + type: "number", + min: "1", + max: "20", + step: "1", + public: "true" + } + } + } + ], + stream: [16] + }, + timeline_lookup: [[1, 0]], + id: 13, + title: "This is a topic for testing number poll", + fancy_title: "This is a topic for testing number poll", + posts_count: 1, + created_at: "2017-01-31T09:11:11.161Z", + views: 1, + reply_count: 0, + participant_count: 1, + like_count: 0, + last_posted_at: "2017-01-31T09:11:11.281Z", + visible: true, + closed: false, + archived: false, + has_summary: false, + archetype: "regular", + slug: "this-is-a-topic-for-testing-number-poll", + category_id: 1, + word_count: 12, + deleted_at: null, + user_id: 1, + draft: null, + draft_key: "topic_13", + draft_sequence: 1, + posted: true, + unpinned: null, + pinned_globally: false, + pinned: false, + pinned_at: null, + pinned_until: null, + details: { + auto_close_at: null, + auto_close_hours: null, + auto_close_based_on_last_post: false, + created_by: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + }, + last_poster: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + }, + participants: [ + { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png", + post_count: 1, + primary_group_name: null, + primary_group_flair_url: null, + primary_group_flair_color: null, + primary_group_flair_bg_color: null + } + ], + suggested_topics: [ + { + id: 8, + title: "Welcome to Discourse", + fancy_title: "Welcome to Discourse", + slug: "welcome-to-discourse", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2017-01-31T07:53:45.363Z", + last_posted_at: "2017-01-31T07:53:45.439Z", + bumped: true, + bumped_at: "2017-01-31T07:53:45.439Z", + unseen: false, + pinned: true, + unpinned: null, + excerpt: + "The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …", + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + archetype: "regular", + like_count: 0, + views: 0, + category_id: 1, + featured_link: null, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: -1, + username: "system", + avatar_template: "/images/avatar.png" + } + } + ] + }, + { + id: 11, + title: "This is a test post to try out posts", + fancy_title: "This is a test post to try out posts", + slug: "this-is-a-test-post-to-try-out-posts", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2017-01-31T07:55:58.407Z", + last_posted_at: "2017-01-31T07:55:58.634Z", + bumped: true, + bumped_at: "2017-01-31T07:55:58.634Z", + unseen: false, + last_read_post_number: 1, + unread: 0, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + archetype: "regular", + like_count: 0, + views: 1, + category_id: 1, + featured_link: null, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + } + } + ] + }, + { + id: 12, + title: "This is a topic created for testing", + fancy_title: "This is a topic created for testing", + slug: "this-is-a-topic-created-for-testing", + posts_count: 1, + reply_count: 0, + highest_post_number: 1, + image_url: null, + created_at: "2017-01-31T08:39:06.094Z", + last_posted_at: "2017-01-31T08:39:06.237Z", + bumped: true, + bumped_at: "2017-01-31T09:10:46.528Z", + unseen: false, + last_read_post_number: 1, + unread: 0, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + archetype: "regular", + like_count: 0, + views: 1, + category_id: 1, + featured_link: null, + posters: [ + { + extras: "latest single", + description: "Original Poster, Most Recent Poster", + user: { + id: 1, + username: "tgx", + avatar_template: "/images/avatar.png" + } + } + ] + } + ], + notification_level: 3, + notifications_reason_id: 1, + can_move_posts: true, + can_edit: true, + can_delete: true, + can_recover: true, + can_remove_allowed_users: true, + can_invite_to: true, + can_create_post: true, + can_reply_as_new_topic: true, + can_flag_topic: true + }, + highest_post_number: 1, + last_read_post_number: 1, + last_read_post_id: 16, + deleted_by: null, + has_deleted: false, + actions_summary: [ + { id: 4, count: 0, hidden: false, can_act: true }, + { id: 7, count: 0, hidden: false, can_act: true }, + { id: 8, count: 0, hidden: false, can_act: true } + ], + chunk_size: 20, + bookmarked: false, + featured_link: null + } ]; }); - server.get('/polls/voters.json', request => { // eslint-disable-line no-undef + // prettier-ignore + server.get("/polls/voters.json", request => { // eslint-disable-line no-undef let body = {}; if (_.isEqual(request.queryParams, { post_id: "16", poll_name: "poll" })) { - body = {"poll":[{"id":402,"username":"bruce400","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":403,"username":"bruce401","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":404,"username":"bruce402","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":405,"username":"bruce403","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":406,"username":"bruce404","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":407,"username":"bruce405","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":408,"username":"bruce406","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":409,"username":"bruce407","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":410,"username":"bruce408","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":411,"username":"bruce409","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":412,"username":"bruce410","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":413,"username":"bruce411","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":414,"username":"bruce412","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":415,"username":"bruce413","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":416,"username":"bruce414","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":417,"username":"bruce415","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":419,"username":"bruce417","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":421,"username":"bruce419","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":422,"username":"bruce420","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":424,"username":"bruce422","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":425,"username":"bruce423","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":427,"username":"bruce425","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":430,"username":"bruce428","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":431,"username":"bruce429","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":435,"username":"bruce433","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null}]}; - } else if (_.isEqual(request.queryParams, { post_id: "16", poll_name: "poll", offset: "1" })) { - body = {"poll":[{"id":418,"username":"bruce416","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":420,"username":"bruce418","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":423,"username":"bruce421","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":426,"username":"bruce424","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":428,"username":"bruce426","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":429,"username":"bruce427","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":432,"username":"bruce430","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":433,"username":"bruce431","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":434,"username":"bruce432","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null},{"id":436,"username":"bruce434","avatar_template":"/images/avatar.png","name":"Bruce Wayne","title":null}]}; + body = { + poll: [ + { + id: 402, + username: "bruce400", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 403, + username: "bruce401", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 404, + username: "bruce402", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 405, + username: "bruce403", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 406, + username: "bruce404", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 407, + username: "bruce405", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 408, + username: "bruce406", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 409, + username: "bruce407", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 410, + username: "bruce408", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 411, + username: "bruce409", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 412, + username: "bruce410", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 413, + username: "bruce411", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 414, + username: "bruce412", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 415, + username: "bruce413", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 416, + username: "bruce414", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 417, + username: "bruce415", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 419, + username: "bruce417", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 421, + username: "bruce419", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 422, + username: "bruce420", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 424, + username: "bruce422", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 425, + username: "bruce423", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 427, + username: "bruce425", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 430, + username: "bruce428", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 431, + username: "bruce429", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 435, + username: "bruce433", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + } + ] + }; + } else if ( + _.isEqual(request.queryParams, { + post_id: "16", + poll_name: "poll", + offset: "1" + }) + ) { + body = { + poll: [ + { + id: 418, + username: "bruce416", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 420, + username: "bruce418", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 423, + username: "bruce421", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 426, + username: "bruce424", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 428, + username: "bruce426", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 429, + username: "bruce427", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 432, + username: "bruce430", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 433, + username: "bruce431", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 434, + username: "bruce432", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + }, + { + id: 436, + username: "bruce434", + avatar_template: "/images/avatar.png", + name: "Bruce Wayne", + title: null + } + ] + }; } return [200, { "Content-Type": "application/json" }, body]; }); - visit("/t/this-is-a-topic-for-testing-number-poll/13"); + await visit("/t/this-is-a-topic-for-testing-number-poll/13"); - andThen(() => { - const polls = find('.poll'); - assert.equal(polls.length, 1, 'it should render the poll correctly'); - }); + const polls = find(".poll"); + assert.equal(polls.length, 1, "it should render the poll correctly"); - click('button.toggle-results'); + await click("button.toggle-results"); - andThen(() => { - assert.equal( - find('.poll-voters:first li').length, 25, - 'it should display the right number of voters' - ); - }); + assert.equal( + find(".poll-voters:first li").length, + 25, + "it should display the right number of voters" + ); - click('.poll-voters-toggle-expand:first a'); + await click(".poll-voters-toggle-expand:first a"); - andThen(() => { - assert.equal( - find('.poll-voters:first li').length, 35, - 'it should display the right number of voters' - ); - }); + assert.equal( + find(".poll-voters:first li").length, + 35, + "it should display the right number of voters" + ); }); diff --git a/plugins/poll/test/javascripts/controllers/poll-ui-builder-test.js.es6 b/plugins/poll/test/javascripts/controllers/poll-ui-builder-test.js.es6 index babab76ae7..d80e7c54f2 100644 --- a/plugins/poll/test/javascripts/controllers/poll-ui-builder-test.js.es6 +++ b/plugins/poll/test/javascripts/controllers/poll-ui-builder-test.js.es6 @@ -1,13 +1,13 @@ -import { mapRoutes } from 'discourse/mapping-router'; +import { mapRoutes } from "discourse/mapping-router"; moduleFor("controller:poll-ui-builder", "controller:poll-ui-builder", { setup() { - this.registry.register('router:main', mapRoutes()); - this.subject().set('toolbarEvent', { + this.registry.register("router:main", mapRoutes()); + this.subject().set("toolbarEvent", { getText: () => "" }); }, - needs: ['controller:modal'] + needs: ["controller:modal"] }); test("isMultiple", function(assert) { @@ -91,46 +91,73 @@ test("pollMinOptions", function(assert) { pollOptionsCount: 1 }); - assert.deepEqual(controller.get("pollMinOptions"), [{ name: 1, value: 1 }], "it should return the right options"); + assert.deepEqual( + controller.get("pollMinOptions"), + [{ name: 1, value: 1 }], + "it should return the right options" + ); controller.set("pollOptionsCount", 2); - assert.deepEqual(controller.get("pollMinOptions"), [ - { name: 1, value: 1 }, { name: 2, value: 2 } - ], "it should return the right options"); + assert.deepEqual( + controller.get("pollMinOptions"), + [{ name: 1, value: 1 }, { name: 2, value: 2 }], + "it should return the right options" + ); controller.set("isNumber", true); controller.siteSettings.poll_maximum_options = 2; - assert.deepEqual(controller.get("pollMinOptions"), [ - { name: 1, value: 1 }, { name: 2, value: 2 } - ], "it should return the right options"); + assert.deepEqual( + controller.get("pollMinOptions"), + [{ name: 1, value: 1 }, { name: 2, value: 2 }], + "it should return the right options" + ); }); test("pollMaxOptions", function(assert) { const controller = this.subject(); controller.siteSettings = Discourse.SiteSettings; - controller.setProperties({ isMultiple: true, pollOptionsCount: 1, pollMin: 1 }); + controller.setProperties({ + isMultiple: true, + pollOptionsCount: 1, + pollMin: 1 + }); - assert.deepEqual(controller.get("pollMaxOptions"), [], "it should return the right options"); + assert.deepEqual( + controller.get("pollMaxOptions"), + [], + "it should return the right options" + ); controller.set("pollOptionsCount", 2); - assert.deepEqual(controller.get("pollMaxOptions"), [ - { name: 2, value: 2 } - ], "it should return the right options"); + assert.deepEqual( + controller.get("pollMaxOptions"), + [{ name: 2, value: 2 }], + "it should return the right options" + ); controller.siteSettings.poll_maximum_options = 3; - controller.setProperties({ isMultiple: false, isNumber: true, pollStep: 2, pollMin: 1 }); + controller.setProperties({ + isMultiple: false, + isNumber: true, + pollStep: 2, + pollMin: 1 + }); - assert.deepEqual(controller.get("pollMaxOptions"), [ - { name: 2, value: 2 }, - { name: 3, value: 3 }, - { name: 4, value: 4 }, - { name: 5, value: 5 }, - { name: 6, value: 6 } - ], "it should return the right options"); + assert.deepEqual( + controller.get("pollMaxOptions"), + [ + { name: 2, value: 2 }, + { name: 3, value: 3 }, + { name: 4, value: 4 }, + { name: 5, value: 5 }, + { name: 6, value: 6 } + ], + "it should return the right options" + ); }); test("pollStepOptions", function(assert) { @@ -140,15 +167,19 @@ test("pollStepOptions", function(assert) { controller.set("isNumber", false); - assert.equal(controller.get("pollStepOptions"), null, "is should return null"); + assert.equal( + controller.get("pollStepOptions"), + null, + "is should return null" + ); controller.setProperties({ isNumber: true }); - assert.deepEqual(controller.get("pollStepOptions"), [ - { name: 1, value: 1 }, - { name: 2, value: 2 }, - { name: 3, value: 3 } - ], "it should return the right options"); + assert.deepEqual( + controller.get("pollStepOptions"), + [{ name: 1, value: 1 }, { name: 2, value: 2 }, { name: 3, value: 3 }], + "it should return the right options" + ); }); test("disableInsert", function(assert) { @@ -187,19 +218,35 @@ test("number pollOutput", function(assert) { pollMin: 1 }); - assert.equal(controller.get("pollOutput"), "[poll type=number min=1 max=20 step=1]\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=number min=1 max=20 step=1]\n[/poll]", + "it should return the right output" + ); controller.set("pollStep", 2); - assert.equal(controller.get("pollOutput"), "[poll type=number min=1 max=20 step=2]\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=number min=1 max=20 step=2]\n[/poll]", + "it should return the right output" + ); controller.set("publicPoll", true); - assert.equal(controller.get("pollOutput"), "[poll type=number min=1 max=20 step=2 public=true]\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=number min=1 max=20 step=2 public=true]\n[/poll]", + "it should return the right output" + ); controller.set("pollStep", 0); - assert.equal(controller.get("pollOutput"), "[poll type=number min=1 max=20 step=1 public=true]\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=number min=1 max=20 step=1 public=true]\n[/poll]", + "it should return the right output" + ); }); test("regular pollOutput", function(assert) { @@ -213,14 +260,21 @@ test("regular pollOutput", function(assert) { pollType: controller.get("regularPollType") }); - assert.equal(controller.get("pollOutput"), "[poll type=regular]\n* 1\n* 2\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=regular]\n* 1\n* 2\n[/poll]", + "it should return the right output" + ); controller.set("publicPoll", "true"); - assert.equal(controller.get("pollOutput"), "[poll type=regular public=true]\n* 1\n* 2\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=regular public=true]\n* 1\n* 2\n[/poll]", + "it should return the right output" + ); }); - test("multiple pollOutput", function(assert) { const controller = this.subject(); controller.siteSettings = Discourse.SiteSettings; @@ -233,9 +287,17 @@ test("multiple pollOutput", function(assert) { pollOptions: "\n\n1\n\n2" }); - assert.equal(controller.get("pollOutput"), "[poll type=multiple min=1 max=2]\n* 1\n* 2\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=multiple min=1 max=2]\n* 1\n* 2\n[/poll]", + "it should return the right output" + ); controller.set("publicPoll", "true"); - assert.equal(controller.get("pollOutput"), "[poll type=multiple min=1 max=2 public=true]\n* 1\n* 2\n[/poll]", "it should return the right output"); + assert.equal( + controller.get("pollOutput"), + "[poll type=multiple min=1 max=2 public=true]\n* 1\n* 2\n[/poll]", + "it should return the right output" + ); }); diff --git a/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 b/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 index 75035b6651..751607e373 100644 --- a/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 +++ b/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 @@ -1,64 +1,64 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; -moduleForWidget('discourse-poll-option'); +import { moduleForWidget, widgetTest } from "helpers/widget-test"; +moduleForWidget("discourse-poll-option"); const template = `{{mount-widget widget="discourse-poll-option" args=(hash option=option isMultiple=isMultiple vote=vote)}}`; -widgetTest('single, not selected', { +widgetTest("single, not selected", { template, beforeEach() { - this.set('option', { id: 'opt-id' }); - this.set('vote', []); + this.set("option", { id: "opt-id" }); + this.set("vote", []); }, test(assert) { - assert.ok(find('li .d-icon-circle-o:eq(0)').length === 1); + assert.ok(find("li .d-icon-circle-o:eq(0)").length === 1); } }); -widgetTest('single, selected', { +widgetTest("single, selected", { template, beforeEach() { - this.set('option', { id: 'opt-id' }); - this.set('vote', ['opt-id']); + this.set("option", { id: "opt-id" }); + this.set("vote", ["opt-id"]); }, test(assert) { - assert.ok(find('li .d-icon-dot-circle-o:eq(0)').length === 1); + assert.ok(find("li .d-icon-dot-circle-o:eq(0)").length === 1); } }); -widgetTest('multi, not selected', { +widgetTest("multi, not selected", { template, beforeEach() { this.setProperties({ - option: { id: 'opt-id' }, + option: { id: "opt-id" }, isMultiple: true, vote: [] }); }, test(assert) { - assert.ok(find('li .d-icon-square-o:eq(0)').length === 1); + assert.ok(find("li .d-icon-square-o:eq(0)").length === 1); } }); -widgetTest('multi, selected', { +widgetTest("multi, selected", { template, beforeEach() { this.setProperties({ - option: { id: 'opt-id' }, + option: { id: "opt-id" }, isMultiple: true, - vote: ['opt-id'] + vote: ["opt-id"] }); }, test(assert) { - assert.ok(find('li .d-icon-check-square-o:eq(0)').length === 1); + assert.ok(find("li .d-icon-check-square-o:eq(0)").length === 1); } }); diff --git a/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 b/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 index d289f45ae8..bfcd7be01d 100644 --- a/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 +++ b/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 @@ -1,67 +1,76 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; -moduleForWidget('discourse-poll-standard-results'); +import { moduleForWidget, widgetTest } from "helpers/widget-test"; +moduleForWidget("discourse-poll-standard-results"); const template = `{{mount-widget widget="discourse-poll-standard-results" args=(hash poll=poll isMultiple=isMultiple)}}`; -widgetTest('options in descending order', { +widgetTest("options in descending order", { template, beforeEach() { - this.set('poll', Ember.Object.create({ - options: [{ votes: 5 }, { votes: 4 }], - voters: 9 - })); + this.set( + "poll", + Ember.Object.create({ + options: [{ votes: 5 }, { votes: 4 }], + voters: 9 + }) + ); }, test(assert) { - assert.equal(this.$('.option .percentage:eq(0)').text(), '56%'); - assert.equal(this.$('.option .percentage:eq(1)').text(), '44%'); + assert.equal(this.$(".option .percentage:eq(0)").text(), "56%"); + assert.equal(this.$(".option .percentage:eq(1)").text(), "44%"); } }); -widgetTest('options in ascending order', { +widgetTest("options in ascending order", { template, beforeEach() { - this.set('poll', Ember.Object.create({ - options: [{ votes: 4 }, { votes: 5 }], - voters: 9 - })); + this.set( + "poll", + Ember.Object.create({ + options: [{ votes: 4 }, { votes: 5 }], + voters: 9 + }) + ); }, test(assert) { - assert.equal(this.$('.option .percentage:eq(0)').text(), '56%'); - assert.equal(this.$('.option .percentage:eq(1)').text(), '44%'); + assert.equal(this.$(".option .percentage:eq(0)").text(), "56%"); + assert.equal(this.$(".option .percentage:eq(1)").text(), "44%"); } }); -widgetTest('multiple options in descending order', { +widgetTest("multiple options in descending order", { template, beforeEach() { - this.set('isMultiple', true); - this.set('poll', Ember.Object.create({ - type: 'multiple', - options: [ - { votes: 5, html: 'a' }, - { votes: 2, html: 'b' }, - { votes: 4, html: 'c' }, - { votes: 1, html: 'b' }, - { votes: 1, html: 'a' } - ], - voters: 12 - })); + this.set("isMultiple", true); + this.set( + "poll", + Ember.Object.create({ + type: "multiple", + options: [ + { votes: 5, html: "a" }, + { votes: 2, html: "b" }, + { votes: 4, html: "c" }, + { votes: 1, html: "b" }, + { votes: 1, html: "a" } + ], + voters: 12 + }) + ); }, test(assert) { - assert.equal(this.$('.option .percentage:eq(0)').text(), '41%'); - assert.equal(this.$('.option .percentage:eq(1)').text(), '33%'); - assert.equal(this.$('.option .percentage:eq(2)').text(), '16%'); - assert.equal(this.$('.option .percentage:eq(3)').text(), '8%'); - assert.equal(this.$('.option span:nth-child(2):eq(3)').text(), 'a'); - assert.equal(this.$('.option .percentage:eq(4)').text(), '8%'); - assert.equal(this.$('.option span:nth-child(2):eq(4)').text(), 'b'); + assert.equal(this.$(".option .percentage:eq(0)").text(), "41%"); + assert.equal(this.$(".option .percentage:eq(1)").text(), "33%"); + assert.equal(this.$(".option .percentage:eq(2)").text(), "16%"); + assert.equal(this.$(".option .percentage:eq(3)").text(), "8%"); + assert.equal(this.$(".option span:nth-child(2):eq(3)").text(), "a"); + assert.equal(this.$(".option .percentage:eq(4)").text(), "8%"); + assert.equal(this.$(".option span:nth-child(2):eq(4)").text(), "b"); } }); diff --git a/public/403.sw.html b/public/403.sw.html new file mode 100644 index 0000000000..31db1b9144 --- /dev/null +++ b/public/403.sw.html @@ -0,0 +1,27 @@ + + + +Huwezi kufanya hivyo (403) + + + + +
+

403

+

Huwezi kuangalia rasilimali hiyo!

+ +

Nafasi itachukuliwa na Karatasi Binafsi ya Discourse 403.

+
+ + diff --git a/public/422.sw.html b/public/422.sw.html new file mode 100644 index 0000000000..81e9bd7587 --- /dev/null +++ b/public/422.sw.html @@ -0,0 +1,26 @@ + + + +Badiliko ulilotaka limekataliwa (422) + + + + + +
+

Badiliko ulilotaka limekataliwa.

+

Labda umejaribu kubadilisha kitu ambacho huna ruhusa ya kukifikia.

+
+ + diff --git a/public/500.sw.html b/public/500.sw.html new file mode 100644 index 0000000000..0ea5dab4c0 --- /dev/null +++ b/public/500.sw.html @@ -0,0 +1,13 @@ + + + +Samahani - Hitilafu 500 + + + +

Pole/Samahani

+

Programu inayoendesha jukwaa hili la majadiliano, imekumbana na tatizo la ghafla. Tunaomba radhi kwa usumbufu.

+

Maelezo ya kina kuhusu hitilafu yamehifadhiwa na taarifa ya moja kwa moja imetengenezwa. Tutaliangalia hili swala.

+

Hakuna ulazima wa kuchukua hatua za ziada. Hata hivyo, kama hali ya hitilafu ikiendelea kujitokeza, unaweza ukatoa maelezo zaidi kwa kuanzisha mada kwenye jukwaa la maoni la mtandao huu, ukijumuisha na hatua za kufanya hiyo hitilafu itokee

+ + diff --git a/public/503.sw.html b/public/503.sw.html new file mode 100644 index 0000000000..d4596b129a --- /dev/null +++ b/public/503.sw.html @@ -0,0 +1,12 @@ + + + +Mtandao unafanyiwa marekebisho - Discourse.org + + + +

Hatupatikani kutokana na marekebisho ya mtandao huu yaliyopangwa.

+

Jaribu kuangalia tena baada ya dakika chache.

+

Samahani kwa usumbufu!

+ + diff --git a/public/images/emoji/apple/abacus.png b/public/images/emoji/apple/abacus.png new file mode 100644 index 0000000000..e56e558529 Binary files /dev/null and b/public/images/emoji/apple/abacus.png differ diff --git a/public/images/emoji/apple/badger.png b/public/images/emoji/apple/badger.png new file mode 100644 index 0000000000..3428da8863 Binary files /dev/null and b/public/images/emoji/apple/badger.png differ diff --git a/public/images/emoji/apple/bagel.png b/public/images/emoji/apple/bagel.png new file mode 100644 index 0000000000..99312be2fe Binary files /dev/null and b/public/images/emoji/apple/bagel.png differ diff --git a/public/images/emoji/apple/basket.png b/public/images/emoji/apple/basket.png new file mode 100644 index 0000000000..020899092f Binary files /dev/null and b/public/images/emoji/apple/basket.png differ diff --git a/public/images/emoji/apple/bone.png b/public/images/emoji/apple/bone.png new file mode 100644 index 0000000000..0b54e2b72a Binary files /dev/null and b/public/images/emoji/apple/bone.png differ diff --git a/public/images/emoji/apple/brick.png b/public/images/emoji/apple/brick.png new file mode 100644 index 0000000000..5b87f50c8d Binary files /dev/null and b/public/images/emoji/apple/brick.png differ diff --git a/public/images/emoji/apple/broom.png b/public/images/emoji/apple/broom.png new file mode 100644 index 0000000000..88fe3eeb3b Binary files /dev/null and b/public/images/emoji/apple/broom.png differ diff --git a/public/images/emoji/apple/chess_pawn.png b/public/images/emoji/apple/chess_pawn.png new file mode 100644 index 0000000000..5ec149c62a Binary files /dev/null and b/public/images/emoji/apple/chess_pawn.png differ diff --git a/public/images/emoji/apple/cold_face.png b/public/images/emoji/apple/cold_face.png new file mode 100644 index 0000000000..6d14820c56 Binary files /dev/null and b/public/images/emoji/apple/cold_face.png differ diff --git a/public/images/emoji/apple/compass.png b/public/images/emoji/apple/compass.png new file mode 100644 index 0000000000..ff199d4822 Binary files /dev/null and b/public/images/emoji/apple/compass.png differ diff --git a/public/images/emoji/apple/computer_mouse.png b/public/images/emoji/apple/computer_mouse.png index 6fbde4a956..c9f4cda740 100644 Binary files a/public/images/emoji/apple/computer_mouse.png and b/public/images/emoji/apple/computer_mouse.png differ diff --git a/public/images/emoji/apple/cupcake.png b/public/images/emoji/apple/cupcake.png new file mode 100644 index 0000000000..68d3be724f Binary files /dev/null and b/public/images/emoji/apple/cupcake.png differ diff --git a/public/images/emoji/apple/dna.png b/public/images/emoji/apple/dna.png new file mode 100644 index 0000000000..66efccf23c Binary files /dev/null and b/public/images/emoji/apple/dna.png differ diff --git a/public/images/emoji/apple/fire_extinguisher.png b/public/images/emoji/apple/fire_extinguisher.png new file mode 100644 index 0000000000..f05d9276a1 Binary files /dev/null and b/public/images/emoji/apple/fire_extinguisher.png differ diff --git a/public/images/emoji/apple/firecracker.png b/public/images/emoji/apple/firecracker.png new file mode 100644 index 0000000000..0364e240bd Binary files /dev/null and b/public/images/emoji/apple/firecracker.png differ diff --git a/public/images/emoji/apple/flat_shoe.png b/public/images/emoji/apple/flat_shoe.png new file mode 100644 index 0000000000..2898e55dc0 Binary files /dev/null and b/public/images/emoji/apple/flat_shoe.png differ diff --git a/public/images/emoji/apple/flying_disc.png b/public/images/emoji/apple/flying_disc.png new file mode 100644 index 0000000000..ef34259ead Binary files /dev/null and b/public/images/emoji/apple/flying_disc.png differ diff --git a/public/images/emoji/apple/foot.png b/public/images/emoji/apple/foot.png new file mode 100644 index 0000000000..ed57c2bd9c Binary files /dev/null and b/public/images/emoji/apple/foot.png differ diff --git a/public/images/emoji/apple/goggles.png b/public/images/emoji/apple/goggles.png new file mode 100644 index 0000000000..0cf62133d7 Binary files /dev/null and b/public/images/emoji/apple/goggles.png differ diff --git a/public/images/emoji/apple/hiking_boot.png b/public/images/emoji/apple/hiking_boot.png new file mode 100644 index 0000000000..1e97c61b01 Binary files /dev/null and b/public/images/emoji/apple/hiking_boot.png differ diff --git a/public/images/emoji/apple/hippopotamus.png b/public/images/emoji/apple/hippopotamus.png new file mode 100644 index 0000000000..87048aaa59 Binary files /dev/null and b/public/images/emoji/apple/hippopotamus.png differ diff --git a/public/images/emoji/apple/hot_face.png b/public/images/emoji/apple/hot_face.png new file mode 100644 index 0000000000..08e3a353d4 Binary files /dev/null and b/public/images/emoji/apple/hot_face.png differ diff --git a/public/images/emoji/apple/infinity.png b/public/images/emoji/apple/infinity.png new file mode 100644 index 0000000000..778e87b2e4 Binary files /dev/null and b/public/images/emoji/apple/infinity.png differ diff --git a/public/images/emoji/apple/jigsaw.png b/public/images/emoji/apple/jigsaw.png new file mode 100644 index 0000000000..3039cfa0a3 Binary files /dev/null and b/public/images/emoji/apple/jigsaw.png differ diff --git a/public/images/emoji/apple/kangaroo.png b/public/images/emoji/apple/kangaroo.png new file mode 100644 index 0000000000..40444a28e8 Binary files /dev/null and b/public/images/emoji/apple/kangaroo.png differ diff --git a/public/images/emoji/apple/lab_coat.png b/public/images/emoji/apple/lab_coat.png new file mode 100644 index 0000000000..fcce6d1f47 Binary files /dev/null and b/public/images/emoji/apple/lab_coat.png differ diff --git a/public/images/emoji/apple/lacrosse.png b/public/images/emoji/apple/lacrosse.png new file mode 100644 index 0000000000..c4209eef02 Binary files /dev/null and b/public/images/emoji/apple/lacrosse.png differ diff --git a/public/images/emoji/apple/leafy_green.png b/public/images/emoji/apple/leafy_green.png new file mode 100644 index 0000000000..31601f0505 Binary files /dev/null and b/public/images/emoji/apple/leafy_green.png differ diff --git a/public/images/emoji/apple/leg.png b/public/images/emoji/apple/leg.png new file mode 100644 index 0000000000..b0087b4926 Binary files /dev/null and b/public/images/emoji/apple/leg.png differ diff --git a/public/images/emoji/apple/llama.png b/public/images/emoji/apple/llama.png new file mode 100644 index 0000000000..d43ae19ae1 Binary files /dev/null and b/public/images/emoji/apple/llama.png differ diff --git a/public/images/emoji/apple/lobster.png b/public/images/emoji/apple/lobster.png new file mode 100644 index 0000000000..17f50fa439 Binary files /dev/null and b/public/images/emoji/apple/lobster.png differ diff --git a/public/images/emoji/apple/lotion_bottle.png b/public/images/emoji/apple/lotion_bottle.png new file mode 100644 index 0000000000..48684bc139 Binary files /dev/null and b/public/images/emoji/apple/lotion_bottle.png differ diff --git a/public/images/emoji/apple/luggage.png b/public/images/emoji/apple/luggage.png new file mode 100644 index 0000000000..1da11d48c5 Binary files /dev/null and b/public/images/emoji/apple/luggage.png differ diff --git a/public/images/emoji/apple/magnet.png b/public/images/emoji/apple/magnet.png new file mode 100644 index 0000000000..6cbe88e681 Binary files /dev/null and b/public/images/emoji/apple/magnet.png differ diff --git a/public/images/emoji/apple/man_bald.png b/public/images/emoji/apple/man_bald.png new file mode 100644 index 0000000000..8e3a838506 Binary files /dev/null and b/public/images/emoji/apple/man_bald.png differ diff --git a/public/images/emoji/apple/man_curly_haired.png b/public/images/emoji/apple/man_curly_haired.png new file mode 100644 index 0000000000..6c1396b114 Binary files /dev/null and b/public/images/emoji/apple/man_curly_haired.png differ diff --git a/public/images/emoji/apple/man_red_haired.png b/public/images/emoji/apple/man_red_haired.png new file mode 100644 index 0000000000..4d5ef0e840 Binary files /dev/null and b/public/images/emoji/apple/man_red_haired.png differ diff --git a/public/images/emoji/apple/man_superhero.png b/public/images/emoji/apple/man_superhero.png new file mode 100644 index 0000000000..9082575ce9 Binary files /dev/null and b/public/images/emoji/apple/man_superhero.png differ diff --git a/public/images/emoji/apple/man_supervillain.png b/public/images/emoji/apple/man_supervillain.png new file mode 100644 index 0000000000..634a3f4920 Binary files /dev/null and b/public/images/emoji/apple/man_supervillain.png differ diff --git a/public/images/emoji/apple/man_white_haired.png b/public/images/emoji/apple/man_white_haired.png new file mode 100644 index 0000000000..f31b3a078c Binary files /dev/null and b/public/images/emoji/apple/man_white_haired.png differ diff --git a/public/images/emoji/apple/mango.png b/public/images/emoji/apple/mango.png new file mode 100644 index 0000000000..96d630c7bf Binary files /dev/null and b/public/images/emoji/apple/mango.png differ diff --git a/public/images/emoji/apple/microbe.png b/public/images/emoji/apple/microbe.png new file mode 100644 index 0000000000..1b687cbe7b Binary files /dev/null and b/public/images/emoji/apple/microbe.png differ diff --git a/public/images/emoji/apple/moon_cake.png b/public/images/emoji/apple/moon_cake.png new file mode 100644 index 0000000000..409640aa73 Binary files /dev/null and b/public/images/emoji/apple/moon_cake.png differ diff --git a/public/images/emoji/apple/mosquito.png b/public/images/emoji/apple/mosquito.png new file mode 100644 index 0000000000..325c90ea79 Binary files /dev/null and b/public/images/emoji/apple/mosquito.png differ diff --git a/public/images/emoji/apple/mouse_three_button.png b/public/images/emoji/apple/mouse_three_button.png index 6fbde4a956..c9f4cda740 100644 Binary files a/public/images/emoji/apple/mouse_three_button.png and b/public/images/emoji/apple/mouse_three_button.png differ diff --git a/public/images/emoji/apple/nazar_amulet.png b/public/images/emoji/apple/nazar_amulet.png new file mode 100644 index 0000000000..a5e55b990f Binary files /dev/null and b/public/images/emoji/apple/nazar_amulet.png differ diff --git a/public/images/emoji/apple/parrot.png b/public/images/emoji/apple/parrot.png new file mode 100644 index 0000000000..e9e3a5e0d0 Binary files /dev/null and b/public/images/emoji/apple/parrot.png differ diff --git a/public/images/emoji/apple/partying_face.png b/public/images/emoji/apple/partying_face.png new file mode 100644 index 0000000000..cf02521ccc Binary files /dev/null and b/public/images/emoji/apple/partying_face.png differ diff --git a/public/images/emoji/apple/peacock.png b/public/images/emoji/apple/peacock.png new file mode 100644 index 0000000000..59602cdcf0 Binary files /dev/null and b/public/images/emoji/apple/peacock.png differ diff --git a/public/images/emoji/apple/petri_dish.png b/public/images/emoji/apple/petri_dish.png new file mode 100644 index 0000000000..3a07b493c2 Binary files /dev/null and b/public/images/emoji/apple/petri_dish.png differ diff --git a/public/images/emoji/apple/pirate_flag.png b/public/images/emoji/apple/pirate_flag.png new file mode 100644 index 0000000000..91f599b478 Binary files /dev/null and b/public/images/emoji/apple/pirate_flag.png differ diff --git a/public/images/emoji/apple/pleading_face.png b/public/images/emoji/apple/pleading_face.png new file mode 100644 index 0000000000..e3c26b3dc1 Binary files /dev/null and b/public/images/emoji/apple/pleading_face.png differ diff --git a/public/images/emoji/apple/raccoon.png b/public/images/emoji/apple/raccoon.png new file mode 100644 index 0000000000..1d3916b94b Binary files /dev/null and b/public/images/emoji/apple/raccoon.png differ diff --git a/public/images/emoji/apple/receipt.png b/public/images/emoji/apple/receipt.png new file mode 100644 index 0000000000..b5f1ba925f Binary files /dev/null and b/public/images/emoji/apple/receipt.png differ diff --git a/public/images/emoji/apple/red_gift_envelope.png b/public/images/emoji/apple/red_gift_envelope.png new file mode 100644 index 0000000000..e88d858d58 Binary files /dev/null and b/public/images/emoji/apple/red_gift_envelope.png differ diff --git a/public/images/emoji/apple/roll_of_toilet_paper.png b/public/images/emoji/apple/roll_of_toilet_paper.png new file mode 100644 index 0000000000..00a5a9ecf6 Binary files /dev/null and b/public/images/emoji/apple/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/apple/safety_pin.png b/public/images/emoji/apple/safety_pin.png new file mode 100644 index 0000000000..b15166e2ab Binary files /dev/null and b/public/images/emoji/apple/safety_pin.png differ diff --git a/public/images/emoji/apple/salt.png b/public/images/emoji/apple/salt.png new file mode 100644 index 0000000000..053367714a Binary files /dev/null and b/public/images/emoji/apple/salt.png differ diff --git a/public/images/emoji/apple/skateboard.png b/public/images/emoji/apple/skateboard.png new file mode 100644 index 0000000000..142b14d8d7 Binary files /dev/null and b/public/images/emoji/apple/skateboard.png differ diff --git a/public/images/emoji/apple/smiling_face_with_three_hearts.png b/public/images/emoji/apple/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..679e033e95 Binary files /dev/null and b/public/images/emoji/apple/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/apple/snowboarder.png b/public/images/emoji/apple/snowboarder.png index 74f312e46e..ecffe685b8 100644 Binary files a/public/images/emoji/apple/snowboarder.png and b/public/images/emoji/apple/snowboarder.png differ diff --git a/public/images/emoji/apple/soap.png b/public/images/emoji/apple/soap.png new file mode 100644 index 0000000000..3432ebceb1 Binary files /dev/null and b/public/images/emoji/apple/soap.png differ diff --git a/public/images/emoji/apple/softball.png b/public/images/emoji/apple/softball.png new file mode 100644 index 0000000000..b78c695486 Binary files /dev/null and b/public/images/emoji/apple/softball.png differ diff --git a/public/images/emoji/apple/sponge.png b/public/images/emoji/apple/sponge.png new file mode 100644 index 0000000000..1c7ee83f5e Binary files /dev/null and b/public/images/emoji/apple/sponge.png differ diff --git a/public/images/emoji/apple/superhero.png b/public/images/emoji/apple/superhero.png new file mode 100644 index 0000000000..91080cba2e Binary files /dev/null and b/public/images/emoji/apple/superhero.png differ diff --git a/public/images/emoji/apple/supervillain.png b/public/images/emoji/apple/supervillain.png new file mode 100644 index 0000000000..9fb7495003 Binary files /dev/null and b/public/images/emoji/apple/supervillain.png differ diff --git a/public/images/emoji/apple/swan.png b/public/images/emoji/apple/swan.png new file mode 100644 index 0000000000..8fedcfee6a Binary files /dev/null and b/public/images/emoji/apple/swan.png differ diff --git a/public/images/emoji/apple/teddy_bear.png b/public/images/emoji/apple/teddy_bear.png new file mode 100644 index 0000000000..4ba5b7bb59 Binary files /dev/null and b/public/images/emoji/apple/teddy_bear.png differ diff --git a/public/images/emoji/apple/test_tube.png b/public/images/emoji/apple/test_tube.png new file mode 100644 index 0000000000..a004650181 Binary files /dev/null and b/public/images/emoji/apple/test_tube.png differ diff --git a/public/images/emoji/apple/thread.png b/public/images/emoji/apple/thread.png new file mode 100644 index 0000000000..b7b58f1b6a Binary files /dev/null and b/public/images/emoji/apple/thread.png differ diff --git a/public/images/emoji/apple/three_button_mouse.png b/public/images/emoji/apple/three_button_mouse.png index 6fbde4a956..c9f4cda740 100644 Binary files a/public/images/emoji/apple/three_button_mouse.png and b/public/images/emoji/apple/three_button_mouse.png differ diff --git a/public/images/emoji/apple/toolbox.png b/public/images/emoji/apple/toolbox.png new file mode 100644 index 0000000000..f66bd60df4 Binary files /dev/null and b/public/images/emoji/apple/toolbox.png differ diff --git a/public/images/emoji/apple/tooth.png b/public/images/emoji/apple/tooth.png new file mode 100644 index 0000000000..f5d32ea713 Binary files /dev/null and b/public/images/emoji/apple/tooth.png differ diff --git a/public/images/emoji/apple/united_nations.png b/public/images/emoji/apple/united_nations.png index d695a5cac0..ea7fc4c7d7 100644 Binary files a/public/images/emoji/apple/united_nations.png and b/public/images/emoji/apple/united_nations.png differ diff --git a/public/images/emoji/apple/white_medium_small_square.png b/public/images/emoji/apple/white_medium_small_square.png index 6ad4878f31..ca9bb235dd 100644 Binary files a/public/images/emoji/apple/white_medium_small_square.png and b/public/images/emoji/apple/white_medium_small_square.png differ diff --git a/public/images/emoji/apple/woman_bald.png b/public/images/emoji/apple/woman_bald.png new file mode 100644 index 0000000000..2fe69f9458 Binary files /dev/null and b/public/images/emoji/apple/woman_bald.png differ diff --git a/public/images/emoji/apple/woman_curly_haired.png b/public/images/emoji/apple/woman_curly_haired.png new file mode 100644 index 0000000000..02e4675748 Binary files /dev/null and b/public/images/emoji/apple/woman_curly_haired.png differ diff --git a/public/images/emoji/apple/woman_red_haired.png b/public/images/emoji/apple/woman_red_haired.png new file mode 100644 index 0000000000..7d85999a79 Binary files /dev/null and b/public/images/emoji/apple/woman_red_haired.png differ diff --git a/public/images/emoji/apple/woman_superhero.png b/public/images/emoji/apple/woman_superhero.png new file mode 100644 index 0000000000..153a0cf66a Binary files /dev/null and b/public/images/emoji/apple/woman_superhero.png differ diff --git a/public/images/emoji/apple/woman_supervillain.png b/public/images/emoji/apple/woman_supervillain.png new file mode 100644 index 0000000000..2f941110bc Binary files /dev/null and b/public/images/emoji/apple/woman_supervillain.png differ diff --git a/public/images/emoji/apple/woman_white_haired.png b/public/images/emoji/apple/woman_white_haired.png new file mode 100644 index 0000000000..a4a409c7e0 Binary files /dev/null and b/public/images/emoji/apple/woman_white_haired.png differ diff --git a/public/images/emoji/apple/woozy_face.png b/public/images/emoji/apple/woozy_face.png new file mode 100644 index 0000000000..3c4a112bec Binary files /dev/null and b/public/images/emoji/apple/woozy_face.png differ diff --git a/public/images/emoji/apple/yarn.png b/public/images/emoji/apple/yarn.png new file mode 100644 index 0000000000..005e38061f Binary files /dev/null and b/public/images/emoji/apple/yarn.png differ diff --git a/public/images/emoji/emoji_one/abacus.png b/public/images/emoji/emoji_one/abacus.png new file mode 100644 index 0000000000..022bd2f584 Binary files /dev/null and b/public/images/emoji/emoji_one/abacus.png differ diff --git a/public/images/emoji/emoji_one/afghanistan.png b/public/images/emoji/emoji_one/afghanistan.png index 50c4c6b272..7a37ec27e7 100644 Binary files a/public/images/emoji/emoji_one/afghanistan.png and b/public/images/emoji/emoji_one/afghanistan.png differ diff --git a/public/images/emoji/emoji_one/aland_islands.png b/public/images/emoji/emoji_one/aland_islands.png index 2ce958b920..99178f14d6 100644 Binary files a/public/images/emoji/emoji_one/aland_islands.png and b/public/images/emoji/emoji_one/aland_islands.png differ diff --git a/public/images/emoji/emoji_one/albania.png b/public/images/emoji/emoji_one/albania.png index 8d428869d4..a6d45735f3 100644 Binary files a/public/images/emoji/emoji_one/albania.png and b/public/images/emoji/emoji_one/albania.png differ diff --git a/public/images/emoji/emoji_one/algeria.png b/public/images/emoji/emoji_one/algeria.png index cd3dc01ab2..176f755df6 100644 Binary files a/public/images/emoji/emoji_one/algeria.png and b/public/images/emoji/emoji_one/algeria.png differ diff --git a/public/images/emoji/emoji_one/american_samoa.png b/public/images/emoji/emoji_one/american_samoa.png index f4f58e2e25..a5cdfccbcd 100644 Binary files a/public/images/emoji/emoji_one/american_samoa.png and b/public/images/emoji/emoji_one/american_samoa.png differ diff --git a/public/images/emoji/emoji_one/andorra.png b/public/images/emoji/emoji_one/andorra.png index 0fd73782c2..d2d47502e7 100644 Binary files a/public/images/emoji/emoji_one/andorra.png and b/public/images/emoji/emoji_one/andorra.png differ diff --git a/public/images/emoji/emoji_one/angola.png b/public/images/emoji/emoji_one/angola.png index 5aca11a07e..78acffcd20 100644 Binary files a/public/images/emoji/emoji_one/angola.png and b/public/images/emoji/emoji_one/angola.png differ diff --git a/public/images/emoji/emoji_one/anguilla.png b/public/images/emoji/emoji_one/anguilla.png index d1006c6c19..73f0c20398 100644 Binary files a/public/images/emoji/emoji_one/anguilla.png and b/public/images/emoji/emoji_one/anguilla.png differ diff --git a/public/images/emoji/emoji_one/antarctica.png b/public/images/emoji/emoji_one/antarctica.png index 5a6759de63..d21e4bafd2 100644 Binary files a/public/images/emoji/emoji_one/antarctica.png and b/public/images/emoji/emoji_one/antarctica.png differ diff --git a/public/images/emoji/emoji_one/antigua_barbuda.png b/public/images/emoji/emoji_one/antigua_barbuda.png index e3ff113cba..068f45ea90 100644 Binary files a/public/images/emoji/emoji_one/antigua_barbuda.png and b/public/images/emoji/emoji_one/antigua_barbuda.png differ diff --git a/public/images/emoji/emoji_one/argentina.png b/public/images/emoji/emoji_one/argentina.png index 1e5e815098..a7d8a31dd1 100644 Binary files a/public/images/emoji/emoji_one/argentina.png and b/public/images/emoji/emoji_one/argentina.png differ diff --git a/public/images/emoji/emoji_one/armenia.png b/public/images/emoji/emoji_one/armenia.png index 846307fcf3..5282660ee6 100644 Binary files a/public/images/emoji/emoji_one/armenia.png and b/public/images/emoji/emoji_one/armenia.png differ diff --git a/public/images/emoji/emoji_one/aruba.png b/public/images/emoji/emoji_one/aruba.png index 459facc13b..e250be924b 100644 Binary files a/public/images/emoji/emoji_one/aruba.png and b/public/images/emoji/emoji_one/aruba.png differ diff --git a/public/images/emoji/emoji_one/ascension_island.png b/public/images/emoji/emoji_one/ascension_island.png index 2e3a1fdd73..8e7a630b92 100644 Binary files a/public/images/emoji/emoji_one/ascension_island.png and b/public/images/emoji/emoji_one/ascension_island.png differ diff --git a/public/images/emoji/emoji_one/australia.png b/public/images/emoji/emoji_one/australia.png index 5dbc804e86..e42aa01037 100644 Binary files a/public/images/emoji/emoji_one/australia.png and b/public/images/emoji/emoji_one/australia.png differ diff --git a/public/images/emoji/emoji_one/austria.png b/public/images/emoji/emoji_one/austria.png index 58141c9f3c..3937efe840 100644 Binary files a/public/images/emoji/emoji_one/austria.png and b/public/images/emoji/emoji_one/austria.png differ diff --git a/public/images/emoji/emoji_one/azerbaijan.png b/public/images/emoji/emoji_one/azerbaijan.png index 59b4ecf2a0..4f0c1c8678 100644 Binary files a/public/images/emoji/emoji_one/azerbaijan.png and b/public/images/emoji/emoji_one/azerbaijan.png differ diff --git a/public/images/emoji/emoji_one/badger.png b/public/images/emoji/emoji_one/badger.png new file mode 100644 index 0000000000..6035a070ff Binary files /dev/null and b/public/images/emoji/emoji_one/badger.png differ diff --git a/public/images/emoji/emoji_one/bagel.png b/public/images/emoji/emoji_one/bagel.png new file mode 100644 index 0000000000..fb048e154c Binary files /dev/null and b/public/images/emoji/emoji_one/bagel.png differ diff --git a/public/images/emoji/emoji_one/bahamas.png b/public/images/emoji/emoji_one/bahamas.png index ed95128e19..f959101b26 100644 Binary files a/public/images/emoji/emoji_one/bahamas.png and b/public/images/emoji/emoji_one/bahamas.png differ diff --git a/public/images/emoji/emoji_one/bahrain.png b/public/images/emoji/emoji_one/bahrain.png index 815a93ef0b..28c3ec6f69 100644 Binary files a/public/images/emoji/emoji_one/bahrain.png and b/public/images/emoji/emoji_one/bahrain.png differ diff --git a/public/images/emoji/emoji_one/bangladesh.png b/public/images/emoji/emoji_one/bangladesh.png index caab400018..c1c933e092 100644 Binary files a/public/images/emoji/emoji_one/bangladesh.png and b/public/images/emoji/emoji_one/bangladesh.png differ diff --git a/public/images/emoji/emoji_one/barbados.png b/public/images/emoji/emoji_one/barbados.png index 830578344d..e6fb3edddb 100644 Binary files a/public/images/emoji/emoji_one/barbados.png and b/public/images/emoji/emoji_one/barbados.png differ diff --git a/public/images/emoji/emoji_one/basket.png b/public/images/emoji/emoji_one/basket.png new file mode 100644 index 0000000000..203cde8f0a Binary files /dev/null and b/public/images/emoji/emoji_one/basket.png differ diff --git a/public/images/emoji/emoji_one/belarus.png b/public/images/emoji/emoji_one/belarus.png index e75dc9ec50..fc2051bf7e 100644 Binary files a/public/images/emoji/emoji_one/belarus.png and b/public/images/emoji/emoji_one/belarus.png differ diff --git a/public/images/emoji/emoji_one/belgium.png b/public/images/emoji/emoji_one/belgium.png index ca401e5985..5fa8040164 100644 Binary files a/public/images/emoji/emoji_one/belgium.png and b/public/images/emoji/emoji_one/belgium.png differ diff --git a/public/images/emoji/emoji_one/belize.png b/public/images/emoji/emoji_one/belize.png index 5f6dded80b..0c23f8075a 100644 Binary files a/public/images/emoji/emoji_one/belize.png and b/public/images/emoji/emoji_one/belize.png differ diff --git a/public/images/emoji/emoji_one/benin.png b/public/images/emoji/emoji_one/benin.png index bb74e98818..d680841fc2 100644 Binary files a/public/images/emoji/emoji_one/benin.png and b/public/images/emoji/emoji_one/benin.png differ diff --git a/public/images/emoji/emoji_one/bermuda.png b/public/images/emoji/emoji_one/bermuda.png index 75f2fac760..13531297f2 100644 Binary files a/public/images/emoji/emoji_one/bermuda.png and b/public/images/emoji/emoji_one/bermuda.png differ diff --git a/public/images/emoji/emoji_one/bhutan.png b/public/images/emoji/emoji_one/bhutan.png index d9a2d20fc1..3e4ce7df33 100644 Binary files a/public/images/emoji/emoji_one/bhutan.png and b/public/images/emoji/emoji_one/bhutan.png differ diff --git a/public/images/emoji/emoji_one/bolivia.png b/public/images/emoji/emoji_one/bolivia.png index af9bd4d5e7..21c555bdd6 100644 Binary files a/public/images/emoji/emoji_one/bolivia.png and b/public/images/emoji/emoji_one/bolivia.png differ diff --git a/public/images/emoji/emoji_one/bone.png b/public/images/emoji/emoji_one/bone.png new file mode 100644 index 0000000000..7115248137 Binary files /dev/null and b/public/images/emoji/emoji_one/bone.png differ diff --git a/public/images/emoji/emoji_one/bosnia_herzegovina.png b/public/images/emoji/emoji_one/bosnia_herzegovina.png index 91493ade75..3ffe114d94 100644 Binary files a/public/images/emoji/emoji_one/bosnia_herzegovina.png and b/public/images/emoji/emoji_one/bosnia_herzegovina.png differ diff --git a/public/images/emoji/emoji_one/botswana.png b/public/images/emoji/emoji_one/botswana.png index 3697a723dd..bd99bb4bf3 100644 Binary files a/public/images/emoji/emoji_one/botswana.png and b/public/images/emoji/emoji_one/botswana.png differ diff --git a/public/images/emoji/emoji_one/bouvet_island.png b/public/images/emoji/emoji_one/bouvet_island.png index 801a577654..5f86c9a176 100644 Binary files a/public/images/emoji/emoji_one/bouvet_island.png and b/public/images/emoji/emoji_one/bouvet_island.png differ diff --git a/public/images/emoji/emoji_one/brazil.png b/public/images/emoji/emoji_one/brazil.png index a68b1e6b58..642f3a520d 100644 Binary files a/public/images/emoji/emoji_one/brazil.png and b/public/images/emoji/emoji_one/brazil.png differ diff --git a/public/images/emoji/emoji_one/brick.png b/public/images/emoji/emoji_one/brick.png new file mode 100644 index 0000000000..f42b1ad419 Binary files /dev/null and b/public/images/emoji/emoji_one/brick.png differ diff --git a/public/images/emoji/emoji_one/british_indian_ocean_territory.png b/public/images/emoji/emoji_one/british_indian_ocean_territory.png index e3d2479344..894316f63a 100644 Binary files a/public/images/emoji/emoji_one/british_indian_ocean_territory.png and b/public/images/emoji/emoji_one/british_indian_ocean_territory.png differ diff --git a/public/images/emoji/emoji_one/british_virgin_islands.png b/public/images/emoji/emoji_one/british_virgin_islands.png index 9f758979a1..72017181c9 100644 Binary files a/public/images/emoji/emoji_one/british_virgin_islands.png and b/public/images/emoji/emoji_one/british_virgin_islands.png differ diff --git a/public/images/emoji/emoji_one/broom.png b/public/images/emoji/emoji_one/broom.png new file mode 100644 index 0000000000..6334762b2e Binary files /dev/null and b/public/images/emoji/emoji_one/broom.png differ diff --git a/public/images/emoji/emoji_one/brunei.png b/public/images/emoji/emoji_one/brunei.png index 647e1c4d79..03dda7489f 100644 Binary files a/public/images/emoji/emoji_one/brunei.png and b/public/images/emoji/emoji_one/brunei.png differ diff --git a/public/images/emoji/emoji_one/bulgaria.png b/public/images/emoji/emoji_one/bulgaria.png index 5185700c63..0519f963c5 100644 Binary files a/public/images/emoji/emoji_one/bulgaria.png and b/public/images/emoji/emoji_one/bulgaria.png differ diff --git a/public/images/emoji/emoji_one/burkina_faso.png b/public/images/emoji/emoji_one/burkina_faso.png index c519f8a954..dad580a778 100644 Binary files a/public/images/emoji/emoji_one/burkina_faso.png and b/public/images/emoji/emoji_one/burkina_faso.png differ diff --git a/public/images/emoji/emoji_one/burundi.png b/public/images/emoji/emoji_one/burundi.png index 83e731cc34..7133116525 100644 Binary files a/public/images/emoji/emoji_one/burundi.png and b/public/images/emoji/emoji_one/burundi.png differ diff --git a/public/images/emoji/emoji_one/cambodia.png b/public/images/emoji/emoji_one/cambodia.png index 0a7ca06fb4..5be917325f 100644 Binary files a/public/images/emoji/emoji_one/cambodia.png and b/public/images/emoji/emoji_one/cambodia.png differ diff --git a/public/images/emoji/emoji_one/cameroon.png b/public/images/emoji/emoji_one/cameroon.png index b9aaf46348..c9eab9a4d1 100644 Binary files a/public/images/emoji/emoji_one/cameroon.png and b/public/images/emoji/emoji_one/cameroon.png differ diff --git a/public/images/emoji/emoji_one/canada.png b/public/images/emoji/emoji_one/canada.png index 82664ad79e..fe777da3f5 100644 Binary files a/public/images/emoji/emoji_one/canada.png and b/public/images/emoji/emoji_one/canada.png differ diff --git a/public/images/emoji/emoji_one/canary_islands.png b/public/images/emoji/emoji_one/canary_islands.png index 68ccf48d0d..80f670c87e 100644 Binary files a/public/images/emoji/emoji_one/canary_islands.png and b/public/images/emoji/emoji_one/canary_islands.png differ diff --git a/public/images/emoji/emoji_one/cape_verde.png b/public/images/emoji/emoji_one/cape_verde.png index 1252c37a6d..4c50734580 100644 Binary files a/public/images/emoji/emoji_one/cape_verde.png and b/public/images/emoji/emoji_one/cape_verde.png differ diff --git a/public/images/emoji/emoji_one/caribbean_netherlands.png b/public/images/emoji/emoji_one/caribbean_netherlands.png index 7780a4a036..be922b0c12 100644 Binary files a/public/images/emoji/emoji_one/caribbean_netherlands.png and b/public/images/emoji/emoji_one/caribbean_netherlands.png differ diff --git a/public/images/emoji/emoji_one/cayman_islands.png b/public/images/emoji/emoji_one/cayman_islands.png index 70d8309d8c..158d5899b0 100644 Binary files a/public/images/emoji/emoji_one/cayman_islands.png and b/public/images/emoji/emoji_one/cayman_islands.png differ diff --git a/public/images/emoji/emoji_one/central_african_republic.png b/public/images/emoji/emoji_one/central_african_republic.png index a344cb3ae8..2b28051981 100644 Binary files a/public/images/emoji/emoji_one/central_african_republic.png and b/public/images/emoji/emoji_one/central_african_republic.png differ diff --git a/public/images/emoji/emoji_one/ceuta_and_melilla.png b/public/images/emoji/emoji_one/ceuta_and_melilla.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/emoji_one/ceuta_and_melilla.png and b/public/images/emoji/emoji_one/ceuta_and_melilla.png differ diff --git a/public/images/emoji/emoji_one/chad.png b/public/images/emoji/emoji_one/chad.png index 26b77c821c..77184f4d06 100644 Binary files a/public/images/emoji/emoji_one/chad.png and b/public/images/emoji/emoji_one/chad.png differ diff --git a/public/images/emoji/emoji_one/chess_pawn.png b/public/images/emoji/emoji_one/chess_pawn.png new file mode 100644 index 0000000000..ac3263de1d Binary files /dev/null and b/public/images/emoji/emoji_one/chess_pawn.png differ diff --git a/public/images/emoji/emoji_one/chile.png b/public/images/emoji/emoji_one/chile.png index 740d09658e..5aded633e7 100644 Binary files a/public/images/emoji/emoji_one/chile.png and b/public/images/emoji/emoji_one/chile.png differ diff --git a/public/images/emoji/emoji_one/christmas_island.png b/public/images/emoji/emoji_one/christmas_island.png index 6958b7d8d8..b6f3608554 100644 Binary files a/public/images/emoji/emoji_one/christmas_island.png and b/public/images/emoji/emoji_one/christmas_island.png differ diff --git a/public/images/emoji/emoji_one/clipperton_island.png b/public/images/emoji/emoji_one/clipperton_island.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/emoji_one/clipperton_island.png and b/public/images/emoji/emoji_one/clipperton_island.png differ diff --git a/public/images/emoji/emoji_one/cn.png b/public/images/emoji/emoji_one/cn.png index 67efed2e4d..1543a73051 100644 Binary files a/public/images/emoji/emoji_one/cn.png and b/public/images/emoji/emoji_one/cn.png differ diff --git a/public/images/emoji/emoji_one/cocos_islands.png b/public/images/emoji/emoji_one/cocos_islands.png index c9025e34e4..02f32975b9 100644 Binary files a/public/images/emoji/emoji_one/cocos_islands.png and b/public/images/emoji/emoji_one/cocos_islands.png differ diff --git a/public/images/emoji/emoji_one/cold_face.png b/public/images/emoji/emoji_one/cold_face.png new file mode 100644 index 0000000000..7b16dc899b Binary files /dev/null and b/public/images/emoji/emoji_one/cold_face.png differ diff --git a/public/images/emoji/emoji_one/colombia.png b/public/images/emoji/emoji_one/colombia.png index 680f77b22d..0d2cf35564 100644 Binary files a/public/images/emoji/emoji_one/colombia.png and b/public/images/emoji/emoji_one/colombia.png differ diff --git a/public/images/emoji/emoji_one/comoros.png b/public/images/emoji/emoji_one/comoros.png index e765f50715..43af8492c8 100644 Binary files a/public/images/emoji/emoji_one/comoros.png and b/public/images/emoji/emoji_one/comoros.png differ diff --git a/public/images/emoji/emoji_one/compass.png b/public/images/emoji/emoji_one/compass.png new file mode 100644 index 0000000000..b304bb1c20 Binary files /dev/null and b/public/images/emoji/emoji_one/compass.png differ diff --git a/public/images/emoji/emoji_one/congo_brazzaville.png b/public/images/emoji/emoji_one/congo_brazzaville.png index 2eef1d6c17..113face155 100644 Binary files a/public/images/emoji/emoji_one/congo_brazzaville.png and b/public/images/emoji/emoji_one/congo_brazzaville.png differ diff --git a/public/images/emoji/emoji_one/congo_kinshasa.png b/public/images/emoji/emoji_one/congo_kinshasa.png index a34af9d64a..f0855b2738 100644 Binary files a/public/images/emoji/emoji_one/congo_kinshasa.png and b/public/images/emoji/emoji_one/congo_kinshasa.png differ diff --git a/public/images/emoji/emoji_one/cook_islands.png b/public/images/emoji/emoji_one/cook_islands.png index d1e4afbaca..c021ccda23 100644 Binary files a/public/images/emoji/emoji_one/cook_islands.png and b/public/images/emoji/emoji_one/cook_islands.png differ diff --git a/public/images/emoji/emoji_one/costa_rica.png b/public/images/emoji/emoji_one/costa_rica.png index e6c16e4ea0..9a7cc50ed5 100644 Binary files a/public/images/emoji/emoji_one/costa_rica.png and b/public/images/emoji/emoji_one/costa_rica.png differ diff --git a/public/images/emoji/emoji_one/cote_divoire.png b/public/images/emoji/emoji_one/cote_divoire.png index c8e9c1eace..e18e0bb120 100644 Binary files a/public/images/emoji/emoji_one/cote_divoire.png and b/public/images/emoji/emoji_one/cote_divoire.png differ diff --git a/public/images/emoji/emoji_one/croatia.png b/public/images/emoji/emoji_one/croatia.png index 6cc9a0e748..8f772364df 100644 Binary files a/public/images/emoji/emoji_one/croatia.png and b/public/images/emoji/emoji_one/croatia.png differ diff --git a/public/images/emoji/emoji_one/cuba.png b/public/images/emoji/emoji_one/cuba.png index 4436dee31e..88170e96bf 100644 Binary files a/public/images/emoji/emoji_one/cuba.png and b/public/images/emoji/emoji_one/cuba.png differ diff --git a/public/images/emoji/emoji_one/cupcake.png b/public/images/emoji/emoji_one/cupcake.png new file mode 100644 index 0000000000..8f19a5e251 Binary files /dev/null and b/public/images/emoji/emoji_one/cupcake.png differ diff --git a/public/images/emoji/emoji_one/curacao.png b/public/images/emoji/emoji_one/curacao.png index e29bde1f8b..5ea30eb8db 100644 Binary files a/public/images/emoji/emoji_one/curacao.png and b/public/images/emoji/emoji_one/curacao.png differ diff --git a/public/images/emoji/emoji_one/cyprus.png b/public/images/emoji/emoji_one/cyprus.png index 7f80f4ed57..5c333b0781 100644 Binary files a/public/images/emoji/emoji_one/cyprus.png and b/public/images/emoji/emoji_one/cyprus.png differ diff --git a/public/images/emoji/emoji_one/czech_republic.png b/public/images/emoji/emoji_one/czech_republic.png index 88558e4ab2..6bf97ba35d 100644 Binary files a/public/images/emoji/emoji_one/czech_republic.png and b/public/images/emoji/emoji_one/czech_republic.png differ diff --git a/public/images/emoji/emoji_one/de.png b/public/images/emoji/emoji_one/de.png index 746bf11011..52b93beeef 100644 Binary files a/public/images/emoji/emoji_one/de.png and b/public/images/emoji/emoji_one/de.png differ diff --git a/public/images/emoji/emoji_one/denmark.png b/public/images/emoji/emoji_one/denmark.png index 821499e02c..b7c4bed7a1 100644 Binary files a/public/images/emoji/emoji_one/denmark.png and b/public/images/emoji/emoji_one/denmark.png differ diff --git a/public/images/emoji/emoji_one/diego_garcia.png b/public/images/emoji/emoji_one/diego_garcia.png index 881e01a927..4a509c935c 100644 Binary files a/public/images/emoji/emoji_one/diego_garcia.png and b/public/images/emoji/emoji_one/diego_garcia.png differ diff --git a/public/images/emoji/emoji_one/djibouti.png b/public/images/emoji/emoji_one/djibouti.png index 606fe6a1ee..cc3ceca8b8 100644 Binary files a/public/images/emoji/emoji_one/djibouti.png and b/public/images/emoji/emoji_one/djibouti.png differ diff --git a/public/images/emoji/emoji_one/dna.png b/public/images/emoji/emoji_one/dna.png new file mode 100644 index 0000000000..ca26e15d0f Binary files /dev/null and b/public/images/emoji/emoji_one/dna.png differ diff --git a/public/images/emoji/emoji_one/dominica.png b/public/images/emoji/emoji_one/dominica.png index 588ece3f43..cfc96bc83a 100644 Binary files a/public/images/emoji/emoji_one/dominica.png and b/public/images/emoji/emoji_one/dominica.png differ diff --git a/public/images/emoji/emoji_one/dominican_republic.png b/public/images/emoji/emoji_one/dominican_republic.png index de48ff449c..b06ccbafe8 100644 Binary files a/public/images/emoji/emoji_one/dominican_republic.png and b/public/images/emoji/emoji_one/dominican_republic.png differ diff --git a/public/images/emoji/emoji_one/ecuador.png b/public/images/emoji/emoji_one/ecuador.png index cf86fbaad6..05b0a2ace0 100644 Binary files a/public/images/emoji/emoji_one/ecuador.png and b/public/images/emoji/emoji_one/ecuador.png differ diff --git a/public/images/emoji/emoji_one/egypt.png b/public/images/emoji/emoji_one/egypt.png index bbbdefa653..29dfd5bad8 100644 Binary files a/public/images/emoji/emoji_one/egypt.png and b/public/images/emoji/emoji_one/egypt.png differ diff --git a/public/images/emoji/emoji_one/el_salvador.png b/public/images/emoji/emoji_one/el_salvador.png index 0f24a98369..ad30dcd86f 100644 Binary files a/public/images/emoji/emoji_one/el_salvador.png and b/public/images/emoji/emoji_one/el_salvador.png differ diff --git a/public/images/emoji/emoji_one/equatorial_guinea.png b/public/images/emoji/emoji_one/equatorial_guinea.png index 38e992318c..02b7aec5fd 100644 Binary files a/public/images/emoji/emoji_one/equatorial_guinea.png and b/public/images/emoji/emoji_one/equatorial_guinea.png differ diff --git a/public/images/emoji/emoji_one/eritrea.png b/public/images/emoji/emoji_one/eritrea.png index 630fd66415..dea7458475 100644 Binary files a/public/images/emoji/emoji_one/eritrea.png and b/public/images/emoji/emoji_one/eritrea.png differ diff --git a/public/images/emoji/emoji_one/es.png b/public/images/emoji/emoji_one/es.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/emoji_one/es.png and b/public/images/emoji/emoji_one/es.png differ diff --git a/public/images/emoji/emoji_one/estonia.png b/public/images/emoji/emoji_one/estonia.png index 2553a5dbf7..94d8d46443 100644 Binary files a/public/images/emoji/emoji_one/estonia.png and b/public/images/emoji/emoji_one/estonia.png differ diff --git a/public/images/emoji/emoji_one/ethiopia.png b/public/images/emoji/emoji_one/ethiopia.png index d0d78350cd..4f4e7fc249 100644 Binary files a/public/images/emoji/emoji_one/ethiopia.png and b/public/images/emoji/emoji_one/ethiopia.png differ diff --git a/public/images/emoji/emoji_one/eu.png b/public/images/emoji/emoji_one/eu.png index 938b488ddb..4f0b5d7f4f 100644 Binary files a/public/images/emoji/emoji_one/eu.png and b/public/images/emoji/emoji_one/eu.png differ diff --git a/public/images/emoji/emoji_one/falkland_islands.png b/public/images/emoji/emoji_one/falkland_islands.png index d97a84cea1..5b2ecff4e4 100644 Binary files a/public/images/emoji/emoji_one/falkland_islands.png and b/public/images/emoji/emoji_one/falkland_islands.png differ diff --git a/public/images/emoji/emoji_one/faroe_islands.png b/public/images/emoji/emoji_one/faroe_islands.png index 5da7953f8d..59c59453aa 100644 Binary files a/public/images/emoji/emoji_one/faroe_islands.png and b/public/images/emoji/emoji_one/faroe_islands.png differ diff --git a/public/images/emoji/emoji_one/fiji.png b/public/images/emoji/emoji_one/fiji.png index df504caef6..fd38d20489 100644 Binary files a/public/images/emoji/emoji_one/fiji.png and b/public/images/emoji/emoji_one/fiji.png differ diff --git a/public/images/emoji/emoji_one/finland.png b/public/images/emoji/emoji_one/finland.png index 5eda4bb864..9caec14db9 100644 Binary files a/public/images/emoji/emoji_one/finland.png and b/public/images/emoji/emoji_one/finland.png differ diff --git a/public/images/emoji/emoji_one/fire_extinguisher.png b/public/images/emoji/emoji_one/fire_extinguisher.png new file mode 100644 index 0000000000..4fe65bc9e3 Binary files /dev/null and b/public/images/emoji/emoji_one/fire_extinguisher.png differ diff --git a/public/images/emoji/emoji_one/firecracker.png b/public/images/emoji/emoji_one/firecracker.png new file mode 100644 index 0000000000..e13f1105c6 Binary files /dev/null and b/public/images/emoji/emoji_one/firecracker.png differ diff --git a/public/images/emoji/emoji_one/flag_cn.png b/public/images/emoji/emoji_one/flag_cn.png index 67efed2e4d..1543a73051 100644 Binary files a/public/images/emoji/emoji_one/flag_cn.png and b/public/images/emoji/emoji_one/flag_cn.png differ diff --git a/public/images/emoji/emoji_one/flag_de.png b/public/images/emoji/emoji_one/flag_de.png index 746bf11011..52b93beeef 100644 Binary files a/public/images/emoji/emoji_one/flag_de.png and b/public/images/emoji/emoji_one/flag_de.png differ diff --git a/public/images/emoji/emoji_one/flag_es.png b/public/images/emoji/emoji_one/flag_es.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/emoji_one/flag_es.png and b/public/images/emoji/emoji_one/flag_es.png differ diff --git a/public/images/emoji/emoji_one/flag_fr.png b/public/images/emoji/emoji_one/flag_fr.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/emoji_one/flag_fr.png and b/public/images/emoji/emoji_one/flag_fr.png differ diff --git a/public/images/emoji/emoji_one/flag_gb.png b/public/images/emoji/emoji_one/flag_gb.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/emoji_one/flag_gb.png and b/public/images/emoji/emoji_one/flag_gb.png differ diff --git a/public/images/emoji/emoji_one/flag_it.png b/public/images/emoji/emoji_one/flag_it.png index 13bbb1b1f8..589002bb34 100644 Binary files a/public/images/emoji/emoji_one/flag_it.png and b/public/images/emoji/emoji_one/flag_it.png differ diff --git a/public/images/emoji/emoji_one/flag_jp.png b/public/images/emoji/emoji_one/flag_jp.png index cca79ffb9d..dd515aa063 100644 Binary files a/public/images/emoji/emoji_one/flag_jp.png and b/public/images/emoji/emoji_one/flag_jp.png differ diff --git a/public/images/emoji/emoji_one/flag_kr.png b/public/images/emoji/emoji_one/flag_kr.png index 82486f8812..8ff7ccd3ff 100644 Binary files a/public/images/emoji/emoji_one/flag_kr.png and b/public/images/emoji/emoji_one/flag_kr.png differ diff --git a/public/images/emoji/emoji_one/flag_ru.png b/public/images/emoji/emoji_one/flag_ru.png index 3ecaefd941..47752f3f0c 100644 Binary files a/public/images/emoji/emoji_one/flag_ru.png and b/public/images/emoji/emoji_one/flag_ru.png differ diff --git a/public/images/emoji/emoji_one/flag_us.png b/public/images/emoji/emoji_one/flag_us.png index 450853eca4..0ba064250e 100644 Binary files a/public/images/emoji/emoji_one/flag_us.png and b/public/images/emoji/emoji_one/flag_us.png differ diff --git a/public/images/emoji/emoji_one/flat_shoe.png b/public/images/emoji/emoji_one/flat_shoe.png new file mode 100644 index 0000000000..87a860c66c Binary files /dev/null and b/public/images/emoji/emoji_one/flat_shoe.png differ diff --git a/public/images/emoji/emoji_one/flying_disc.png b/public/images/emoji/emoji_one/flying_disc.png new file mode 100644 index 0000000000..fe7e08f679 Binary files /dev/null and b/public/images/emoji/emoji_one/flying_disc.png differ diff --git a/public/images/emoji/emoji_one/foot.png b/public/images/emoji/emoji_one/foot.png new file mode 100644 index 0000000000..c6acc5bb54 Binary files /dev/null and b/public/images/emoji/emoji_one/foot.png differ diff --git a/public/images/emoji/emoji_one/fr.png b/public/images/emoji/emoji_one/fr.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/emoji_one/fr.png and b/public/images/emoji/emoji_one/fr.png differ diff --git a/public/images/emoji/emoji_one/french_guiana.png b/public/images/emoji/emoji_one/french_guiana.png index b67d58af24..a175d1a292 100644 Binary files a/public/images/emoji/emoji_one/french_guiana.png and b/public/images/emoji/emoji_one/french_guiana.png differ diff --git a/public/images/emoji/emoji_one/french_polynesia.png b/public/images/emoji/emoji_one/french_polynesia.png index 8e67281736..f89b755744 100644 Binary files a/public/images/emoji/emoji_one/french_polynesia.png and b/public/images/emoji/emoji_one/french_polynesia.png differ diff --git a/public/images/emoji/emoji_one/french_southern_territories.png b/public/images/emoji/emoji_one/french_southern_territories.png index ecc9bec0fa..2c17f5e70a 100644 Binary files a/public/images/emoji/emoji_one/french_southern_territories.png and b/public/images/emoji/emoji_one/french_southern_territories.png differ diff --git a/public/images/emoji/emoji_one/gabon.png b/public/images/emoji/emoji_one/gabon.png index 6563b2a69f..5ac1191c7b 100644 Binary files a/public/images/emoji/emoji_one/gabon.png and b/public/images/emoji/emoji_one/gabon.png differ diff --git a/public/images/emoji/emoji_one/gambia.png b/public/images/emoji/emoji_one/gambia.png index 707ca2a121..db1f863384 100644 Binary files a/public/images/emoji/emoji_one/gambia.png and b/public/images/emoji/emoji_one/gambia.png differ diff --git a/public/images/emoji/emoji_one/gb.png b/public/images/emoji/emoji_one/gb.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/emoji_one/gb.png and b/public/images/emoji/emoji_one/gb.png differ diff --git a/public/images/emoji/emoji_one/georgia.png b/public/images/emoji/emoji_one/georgia.png index 673f81ef6f..31af12832b 100644 Binary files a/public/images/emoji/emoji_one/georgia.png and b/public/images/emoji/emoji_one/georgia.png differ diff --git a/public/images/emoji/emoji_one/ghana.png b/public/images/emoji/emoji_one/ghana.png index f1b8829dba..3f01ca0288 100644 Binary files a/public/images/emoji/emoji_one/ghana.png and b/public/images/emoji/emoji_one/ghana.png differ diff --git a/public/images/emoji/emoji_one/gibraltar.png b/public/images/emoji/emoji_one/gibraltar.png index cbe9f11a12..26d4ef755e 100644 Binary files a/public/images/emoji/emoji_one/gibraltar.png and b/public/images/emoji/emoji_one/gibraltar.png differ diff --git a/public/images/emoji/emoji_one/goggles.png b/public/images/emoji/emoji_one/goggles.png new file mode 100644 index 0000000000..7b0ce207a8 Binary files /dev/null and b/public/images/emoji/emoji_one/goggles.png differ diff --git a/public/images/emoji/emoji_one/greece.png b/public/images/emoji/emoji_one/greece.png index c274ffb629..0478442a41 100644 Binary files a/public/images/emoji/emoji_one/greece.png and b/public/images/emoji/emoji_one/greece.png differ diff --git a/public/images/emoji/emoji_one/greenland.png b/public/images/emoji/emoji_one/greenland.png index 31c8707a43..5df66b33ec 100644 Binary files a/public/images/emoji/emoji_one/greenland.png and b/public/images/emoji/emoji_one/greenland.png differ diff --git a/public/images/emoji/emoji_one/grenada.png b/public/images/emoji/emoji_one/grenada.png index 87f17a6ff2..66f160e0e7 100644 Binary files a/public/images/emoji/emoji_one/grenada.png and b/public/images/emoji/emoji_one/grenada.png differ diff --git a/public/images/emoji/emoji_one/guadeloupe.png b/public/images/emoji/emoji_one/guadeloupe.png index c9c437901d..97a3dd9be7 100644 Binary files a/public/images/emoji/emoji_one/guadeloupe.png and b/public/images/emoji/emoji_one/guadeloupe.png differ diff --git a/public/images/emoji/emoji_one/guam.png b/public/images/emoji/emoji_one/guam.png index d291c89c97..75c0945cfe 100644 Binary files a/public/images/emoji/emoji_one/guam.png and b/public/images/emoji/emoji_one/guam.png differ diff --git a/public/images/emoji/emoji_one/guatemala.png b/public/images/emoji/emoji_one/guatemala.png index b7e7259bc8..efa2d04ded 100644 Binary files a/public/images/emoji/emoji_one/guatemala.png and b/public/images/emoji/emoji_one/guatemala.png differ diff --git a/public/images/emoji/emoji_one/guernsey.png b/public/images/emoji/emoji_one/guernsey.png index f92e78a324..72ac329c84 100644 Binary files a/public/images/emoji/emoji_one/guernsey.png and b/public/images/emoji/emoji_one/guernsey.png differ diff --git a/public/images/emoji/emoji_one/guinea.png b/public/images/emoji/emoji_one/guinea.png index dd1482188c..dc4a63147c 100644 Binary files a/public/images/emoji/emoji_one/guinea.png and b/public/images/emoji/emoji_one/guinea.png differ diff --git a/public/images/emoji/emoji_one/guinea_bissau.png b/public/images/emoji/emoji_one/guinea_bissau.png index c2ab6fb507..639bc926bd 100644 Binary files a/public/images/emoji/emoji_one/guinea_bissau.png and b/public/images/emoji/emoji_one/guinea_bissau.png differ diff --git a/public/images/emoji/emoji_one/guyana.png b/public/images/emoji/emoji_one/guyana.png index 2ceb411ad2..481b04c3d6 100644 Binary files a/public/images/emoji/emoji_one/guyana.png and b/public/images/emoji/emoji_one/guyana.png differ diff --git a/public/images/emoji/emoji_one/haiti.png b/public/images/emoji/emoji_one/haiti.png index 53d2160f9a..afbf0287b6 100644 Binary files a/public/images/emoji/emoji_one/haiti.png and b/public/images/emoji/emoji_one/haiti.png differ diff --git a/public/images/emoji/emoji_one/heard_and_mc_donald_islands.png b/public/images/emoji/emoji_one/heard_and_mc_donald_islands.png index 1b5bf7b178..32d62da17f 100644 Binary files a/public/images/emoji/emoji_one/heard_and_mc_donald_islands.png and b/public/images/emoji/emoji_one/heard_and_mc_donald_islands.png differ diff --git a/public/images/emoji/emoji_one/hiking_boot.png b/public/images/emoji/emoji_one/hiking_boot.png new file mode 100644 index 0000000000..a6f9721242 Binary files /dev/null and b/public/images/emoji/emoji_one/hiking_boot.png differ diff --git a/public/images/emoji/emoji_one/hippopotamus.png b/public/images/emoji/emoji_one/hippopotamus.png new file mode 100644 index 0000000000..5e96eb2274 Binary files /dev/null and b/public/images/emoji/emoji_one/hippopotamus.png differ diff --git a/public/images/emoji/emoji_one/honduras.png b/public/images/emoji/emoji_one/honduras.png index d0aff11833..e1617778cb 100644 Binary files a/public/images/emoji/emoji_one/honduras.png and b/public/images/emoji/emoji_one/honduras.png differ diff --git a/public/images/emoji/emoji_one/hong_kong.png b/public/images/emoji/emoji_one/hong_kong.png index 9db8cbc102..412b6841f8 100644 Binary files a/public/images/emoji/emoji_one/hong_kong.png and b/public/images/emoji/emoji_one/hong_kong.png differ diff --git a/public/images/emoji/emoji_one/hot_face.png b/public/images/emoji/emoji_one/hot_face.png new file mode 100644 index 0000000000..c56d1db138 Binary files /dev/null and b/public/images/emoji/emoji_one/hot_face.png differ diff --git a/public/images/emoji/emoji_one/hungary.png b/public/images/emoji/emoji_one/hungary.png index 98963a97c9..2d69737f2a 100644 Binary files a/public/images/emoji/emoji_one/hungary.png and b/public/images/emoji/emoji_one/hungary.png differ diff --git a/public/images/emoji/emoji_one/iceland.png b/public/images/emoji/emoji_one/iceland.png index 399f5a4e85..bbe1022fdf 100644 Binary files a/public/images/emoji/emoji_one/iceland.png and b/public/images/emoji/emoji_one/iceland.png differ diff --git a/public/images/emoji/emoji_one/india.png b/public/images/emoji/emoji_one/india.png index b95563b787..e237fb1a7e 100644 Binary files a/public/images/emoji/emoji_one/india.png and b/public/images/emoji/emoji_one/india.png differ diff --git a/public/images/emoji/emoji_one/indonesia.png b/public/images/emoji/emoji_one/indonesia.png index 09e63e6b9f..ab74052019 100644 Binary files a/public/images/emoji/emoji_one/indonesia.png and b/public/images/emoji/emoji_one/indonesia.png differ diff --git a/public/images/emoji/emoji_one/infinity.png b/public/images/emoji/emoji_one/infinity.png new file mode 100644 index 0000000000..124b0f9330 Binary files /dev/null and b/public/images/emoji/emoji_one/infinity.png differ diff --git a/public/images/emoji/emoji_one/iran.png b/public/images/emoji/emoji_one/iran.png index e30df4c1f5..728b0c817a 100644 Binary files a/public/images/emoji/emoji_one/iran.png and b/public/images/emoji/emoji_one/iran.png differ diff --git a/public/images/emoji/emoji_one/iraq.png b/public/images/emoji/emoji_one/iraq.png index cccd140ba3..81de697331 100644 Binary files a/public/images/emoji/emoji_one/iraq.png and b/public/images/emoji/emoji_one/iraq.png differ diff --git a/public/images/emoji/emoji_one/ireland.png b/public/images/emoji/emoji_one/ireland.png index b97ecbcbd4..3d908bd857 100644 Binary files a/public/images/emoji/emoji_one/ireland.png and b/public/images/emoji/emoji_one/ireland.png differ diff --git a/public/images/emoji/emoji_one/isle_of_man.png b/public/images/emoji/emoji_one/isle_of_man.png index 7829f538f8..99304fca91 100644 Binary files a/public/images/emoji/emoji_one/isle_of_man.png and b/public/images/emoji/emoji_one/isle_of_man.png differ diff --git a/public/images/emoji/emoji_one/israel.png b/public/images/emoji/emoji_one/israel.png index f7bc67925d..33e880aa19 100644 Binary files a/public/images/emoji/emoji_one/israel.png and b/public/images/emoji/emoji_one/israel.png differ diff --git a/public/images/emoji/emoji_one/it.png b/public/images/emoji/emoji_one/it.png index 13bbb1b1f8..589002bb34 100644 Binary files a/public/images/emoji/emoji_one/it.png and b/public/images/emoji/emoji_one/it.png differ diff --git a/public/images/emoji/emoji_one/jamaica.png b/public/images/emoji/emoji_one/jamaica.png index dc2c807511..2a48a73a5e 100644 Binary files a/public/images/emoji/emoji_one/jamaica.png and b/public/images/emoji/emoji_one/jamaica.png differ diff --git a/public/images/emoji/emoji_one/jersey.png b/public/images/emoji/emoji_one/jersey.png index adfdbc3c1a..bc974c1272 100644 Binary files a/public/images/emoji/emoji_one/jersey.png and b/public/images/emoji/emoji_one/jersey.png differ diff --git a/public/images/emoji/emoji_one/jigsaw.png b/public/images/emoji/emoji_one/jigsaw.png new file mode 100644 index 0000000000..3425037670 Binary files /dev/null and b/public/images/emoji/emoji_one/jigsaw.png differ diff --git a/public/images/emoji/emoji_one/jordan.png b/public/images/emoji/emoji_one/jordan.png index 43a2f9139f..8f70256926 100644 Binary files a/public/images/emoji/emoji_one/jordan.png and b/public/images/emoji/emoji_one/jordan.png differ diff --git a/public/images/emoji/emoji_one/jp.png b/public/images/emoji/emoji_one/jp.png index cca79ffb9d..dd515aa063 100644 Binary files a/public/images/emoji/emoji_one/jp.png and b/public/images/emoji/emoji_one/jp.png differ diff --git a/public/images/emoji/emoji_one/kangaroo.png b/public/images/emoji/emoji_one/kangaroo.png new file mode 100644 index 0000000000..b923414097 Binary files /dev/null and b/public/images/emoji/emoji_one/kangaroo.png differ diff --git a/public/images/emoji/emoji_one/kazakhstan.png b/public/images/emoji/emoji_one/kazakhstan.png index 731858e2cf..d7e3401def 100644 Binary files a/public/images/emoji/emoji_one/kazakhstan.png and b/public/images/emoji/emoji_one/kazakhstan.png differ diff --git a/public/images/emoji/emoji_one/kenya.png b/public/images/emoji/emoji_one/kenya.png index cc55fd6981..468ab957ac 100644 Binary files a/public/images/emoji/emoji_one/kenya.png and b/public/images/emoji/emoji_one/kenya.png differ diff --git a/public/images/emoji/emoji_one/kiribati.png b/public/images/emoji/emoji_one/kiribati.png index 138fd3f2b5..ee10d01349 100644 Binary files a/public/images/emoji/emoji_one/kiribati.png and b/public/images/emoji/emoji_one/kiribati.png differ diff --git a/public/images/emoji/emoji_one/kosovo.png b/public/images/emoji/emoji_one/kosovo.png index efea0b70bd..043e9b514d 100644 Binary files a/public/images/emoji/emoji_one/kosovo.png and b/public/images/emoji/emoji_one/kosovo.png differ diff --git a/public/images/emoji/emoji_one/kr.png b/public/images/emoji/emoji_one/kr.png index 82486f8812..8ff7ccd3ff 100644 Binary files a/public/images/emoji/emoji_one/kr.png and b/public/images/emoji/emoji_one/kr.png differ diff --git a/public/images/emoji/emoji_one/kuwait.png b/public/images/emoji/emoji_one/kuwait.png index 32b00e4806..37c5cd60dd 100644 Binary files a/public/images/emoji/emoji_one/kuwait.png and b/public/images/emoji/emoji_one/kuwait.png differ diff --git a/public/images/emoji/emoji_one/kyrgyzstan.png b/public/images/emoji/emoji_one/kyrgyzstan.png index 6ecfc717c9..d1173028eb 100644 Binary files a/public/images/emoji/emoji_one/kyrgyzstan.png and b/public/images/emoji/emoji_one/kyrgyzstan.png differ diff --git a/public/images/emoji/emoji_one/lab_coat.png b/public/images/emoji/emoji_one/lab_coat.png new file mode 100644 index 0000000000..fac8066046 Binary files /dev/null and b/public/images/emoji/emoji_one/lab_coat.png differ diff --git a/public/images/emoji/emoji_one/lacrosse.png b/public/images/emoji/emoji_one/lacrosse.png new file mode 100644 index 0000000000..9168a06eac Binary files /dev/null and b/public/images/emoji/emoji_one/lacrosse.png differ diff --git a/public/images/emoji/emoji_one/laos.png b/public/images/emoji/emoji_one/laos.png index 5dca502f80..44f5e8da70 100644 Binary files a/public/images/emoji/emoji_one/laos.png and b/public/images/emoji/emoji_one/laos.png differ diff --git a/public/images/emoji/emoji_one/latvia.png b/public/images/emoji/emoji_one/latvia.png index a23d4c4e2e..627b031561 100644 Binary files a/public/images/emoji/emoji_one/latvia.png and b/public/images/emoji/emoji_one/latvia.png differ diff --git a/public/images/emoji/emoji_one/leafy_green.png b/public/images/emoji/emoji_one/leafy_green.png new file mode 100644 index 0000000000..ef382c68d0 Binary files /dev/null and b/public/images/emoji/emoji_one/leafy_green.png differ diff --git a/public/images/emoji/emoji_one/lebanon.png b/public/images/emoji/emoji_one/lebanon.png index 5b8710dfd7..f506228dd6 100644 Binary files a/public/images/emoji/emoji_one/lebanon.png and b/public/images/emoji/emoji_one/lebanon.png differ diff --git a/public/images/emoji/emoji_one/leg.png b/public/images/emoji/emoji_one/leg.png new file mode 100644 index 0000000000..df261c6587 Binary files /dev/null and b/public/images/emoji/emoji_one/leg.png differ diff --git a/public/images/emoji/emoji_one/lesotho.png b/public/images/emoji/emoji_one/lesotho.png index 136ea59d3d..77c7544679 100644 Binary files a/public/images/emoji/emoji_one/lesotho.png and b/public/images/emoji/emoji_one/lesotho.png differ diff --git a/public/images/emoji/emoji_one/liberia.png b/public/images/emoji/emoji_one/liberia.png index 2828cee4c8..8ed6a5a877 100644 Binary files a/public/images/emoji/emoji_one/liberia.png and b/public/images/emoji/emoji_one/liberia.png differ diff --git a/public/images/emoji/emoji_one/libya.png b/public/images/emoji/emoji_one/libya.png index a6c90e15d4..426e9319db 100644 Binary files a/public/images/emoji/emoji_one/libya.png and b/public/images/emoji/emoji_one/libya.png differ diff --git a/public/images/emoji/emoji_one/liechtenstein.png b/public/images/emoji/emoji_one/liechtenstein.png index 93605ebfd5..20f3bb9ada 100644 Binary files a/public/images/emoji/emoji_one/liechtenstein.png and b/public/images/emoji/emoji_one/liechtenstein.png differ diff --git a/public/images/emoji/emoji_one/lithuania.png b/public/images/emoji/emoji_one/lithuania.png index d4e7e6766a..a8a8aeece7 100644 Binary files a/public/images/emoji/emoji_one/lithuania.png and b/public/images/emoji/emoji_one/lithuania.png differ diff --git a/public/images/emoji/emoji_one/llama.png b/public/images/emoji/emoji_one/llama.png new file mode 100644 index 0000000000..01eeb7ae13 Binary files /dev/null and b/public/images/emoji/emoji_one/llama.png differ diff --git a/public/images/emoji/emoji_one/lobster.png b/public/images/emoji/emoji_one/lobster.png new file mode 100644 index 0000000000..a49e8adbe0 Binary files /dev/null and b/public/images/emoji/emoji_one/lobster.png differ diff --git a/public/images/emoji/emoji_one/lotion_bottle.png b/public/images/emoji/emoji_one/lotion_bottle.png new file mode 100644 index 0000000000..0ee75148cc Binary files /dev/null and b/public/images/emoji/emoji_one/lotion_bottle.png differ diff --git a/public/images/emoji/emoji_one/luggage.png b/public/images/emoji/emoji_one/luggage.png new file mode 100644 index 0000000000..09116a96a8 Binary files /dev/null and b/public/images/emoji/emoji_one/luggage.png differ diff --git a/public/images/emoji/emoji_one/luxembourg.png b/public/images/emoji/emoji_one/luxembourg.png index a8c6737d1b..c2c49482b0 100644 Binary files a/public/images/emoji/emoji_one/luxembourg.png and b/public/images/emoji/emoji_one/luxembourg.png differ diff --git a/public/images/emoji/emoji_one/macau.png b/public/images/emoji/emoji_one/macau.png index 70620e1d54..2fe5c8cb83 100644 Binary files a/public/images/emoji/emoji_one/macau.png and b/public/images/emoji/emoji_one/macau.png differ diff --git a/public/images/emoji/emoji_one/macedonia.png b/public/images/emoji/emoji_one/macedonia.png index a4c8ef41d2..379bb4a3d7 100644 Binary files a/public/images/emoji/emoji_one/macedonia.png and b/public/images/emoji/emoji_one/macedonia.png differ diff --git a/public/images/emoji/emoji_one/madagascar.png b/public/images/emoji/emoji_one/madagascar.png index 708ec7416c..09e5f33936 100644 Binary files a/public/images/emoji/emoji_one/madagascar.png and b/public/images/emoji/emoji_one/madagascar.png differ diff --git a/public/images/emoji/emoji_one/magnet.png b/public/images/emoji/emoji_one/magnet.png new file mode 100644 index 0000000000..8bf326b0d1 Binary files /dev/null and b/public/images/emoji/emoji_one/magnet.png differ diff --git a/public/images/emoji/emoji_one/malawi.png b/public/images/emoji/emoji_one/malawi.png index 854fd4ce85..bc81407e00 100644 Binary files a/public/images/emoji/emoji_one/malawi.png and b/public/images/emoji/emoji_one/malawi.png differ diff --git a/public/images/emoji/emoji_one/malaysia.png b/public/images/emoji/emoji_one/malaysia.png index 13137b15ad..108dd99dac 100644 Binary files a/public/images/emoji/emoji_one/malaysia.png and b/public/images/emoji/emoji_one/malaysia.png differ diff --git a/public/images/emoji/emoji_one/maldives.png b/public/images/emoji/emoji_one/maldives.png index e0fec7e04b..c666d7ae6d 100644 Binary files a/public/images/emoji/emoji_one/maldives.png and b/public/images/emoji/emoji_one/maldives.png differ diff --git a/public/images/emoji/emoji_one/mali.png b/public/images/emoji/emoji_one/mali.png index ef19c197c7..d7db7397c1 100644 Binary files a/public/images/emoji/emoji_one/mali.png and b/public/images/emoji/emoji_one/mali.png differ diff --git a/public/images/emoji/emoji_one/malta.png b/public/images/emoji/emoji_one/malta.png index f6850d6276..5cc7d787d5 100644 Binary files a/public/images/emoji/emoji_one/malta.png and b/public/images/emoji/emoji_one/malta.png differ diff --git a/public/images/emoji/emoji_one/man_bald.png b/public/images/emoji/emoji_one/man_bald.png new file mode 100644 index 0000000000..f482b67126 Binary files /dev/null and b/public/images/emoji/emoji_one/man_bald.png differ diff --git a/public/images/emoji/emoji_one/man_curly_haired.png b/public/images/emoji/emoji_one/man_curly_haired.png new file mode 100644 index 0000000000..c585680e0b Binary files /dev/null and b/public/images/emoji/emoji_one/man_curly_haired.png differ diff --git a/public/images/emoji/emoji_one/man_red_haired.png b/public/images/emoji/emoji_one/man_red_haired.png new file mode 100644 index 0000000000..1c2a4c2b85 Binary files /dev/null and b/public/images/emoji/emoji_one/man_red_haired.png differ diff --git a/public/images/emoji/emoji_one/man_superhero.png b/public/images/emoji/emoji_one/man_superhero.png new file mode 100644 index 0000000000..8d36788c1b Binary files /dev/null and b/public/images/emoji/emoji_one/man_superhero.png differ diff --git a/public/images/emoji/emoji_one/man_supervillain.png b/public/images/emoji/emoji_one/man_supervillain.png new file mode 100644 index 0000000000..7bb7289ce1 Binary files /dev/null and b/public/images/emoji/emoji_one/man_supervillain.png differ diff --git a/public/images/emoji/emoji_one/man_white_haired.png b/public/images/emoji/emoji_one/man_white_haired.png new file mode 100644 index 0000000000..8ec495591f Binary files /dev/null and b/public/images/emoji/emoji_one/man_white_haired.png differ diff --git a/public/images/emoji/emoji_one/mango.png b/public/images/emoji/emoji_one/mango.png new file mode 100644 index 0000000000..01f5333dd0 Binary files /dev/null and b/public/images/emoji/emoji_one/mango.png differ diff --git a/public/images/emoji/emoji_one/marshall_islands.png b/public/images/emoji/emoji_one/marshall_islands.png index 35a77d3ec6..6b69a8d551 100644 Binary files a/public/images/emoji/emoji_one/marshall_islands.png and b/public/images/emoji/emoji_one/marshall_islands.png differ diff --git a/public/images/emoji/emoji_one/martinique.png b/public/images/emoji/emoji_one/martinique.png index 20265c357a..aa46f114c2 100644 Binary files a/public/images/emoji/emoji_one/martinique.png and b/public/images/emoji/emoji_one/martinique.png differ diff --git a/public/images/emoji/emoji_one/mauritania.png b/public/images/emoji/emoji_one/mauritania.png index 23fa26e4ce..e9767976cf 100644 Binary files a/public/images/emoji/emoji_one/mauritania.png and b/public/images/emoji/emoji_one/mauritania.png differ diff --git a/public/images/emoji/emoji_one/mauritius.png b/public/images/emoji/emoji_one/mauritius.png index 846272e367..04d339cd1b 100644 Binary files a/public/images/emoji/emoji_one/mauritius.png and b/public/images/emoji/emoji_one/mauritius.png differ diff --git a/public/images/emoji/emoji_one/mayotte.png b/public/images/emoji/emoji_one/mayotte.png index 43a7879d24..642b133c08 100644 Binary files a/public/images/emoji/emoji_one/mayotte.png and b/public/images/emoji/emoji_one/mayotte.png differ diff --git a/public/images/emoji/emoji_one/mexico.png b/public/images/emoji/emoji_one/mexico.png index 95e838852b..61775bf729 100644 Binary files a/public/images/emoji/emoji_one/mexico.png and b/public/images/emoji/emoji_one/mexico.png differ diff --git a/public/images/emoji/emoji_one/microbe.png b/public/images/emoji/emoji_one/microbe.png new file mode 100644 index 0000000000..f030644206 Binary files /dev/null and b/public/images/emoji/emoji_one/microbe.png differ diff --git a/public/images/emoji/emoji_one/micronesia.png b/public/images/emoji/emoji_one/micronesia.png index 549d03fdc7..0fc25e88f9 100644 Binary files a/public/images/emoji/emoji_one/micronesia.png and b/public/images/emoji/emoji_one/micronesia.png differ diff --git a/public/images/emoji/emoji_one/moldova.png b/public/images/emoji/emoji_one/moldova.png index d4463a0147..4852033fce 100644 Binary files a/public/images/emoji/emoji_one/moldova.png and b/public/images/emoji/emoji_one/moldova.png differ diff --git a/public/images/emoji/emoji_one/monaco.png b/public/images/emoji/emoji_one/monaco.png index 17833f535a..4f57a0405c 100644 Binary files a/public/images/emoji/emoji_one/monaco.png and b/public/images/emoji/emoji_one/monaco.png differ diff --git a/public/images/emoji/emoji_one/mongolia.png b/public/images/emoji/emoji_one/mongolia.png index cf97894508..7f2225c80b 100644 Binary files a/public/images/emoji/emoji_one/mongolia.png and b/public/images/emoji/emoji_one/mongolia.png differ diff --git a/public/images/emoji/emoji_one/montenegro.png b/public/images/emoji/emoji_one/montenegro.png index 7cbd07cef3..ed5d0c4198 100644 Binary files a/public/images/emoji/emoji_one/montenegro.png and b/public/images/emoji/emoji_one/montenegro.png differ diff --git a/public/images/emoji/emoji_one/montserrat.png b/public/images/emoji/emoji_one/montserrat.png index 28712de519..fd6b759a34 100644 Binary files a/public/images/emoji/emoji_one/montserrat.png and b/public/images/emoji/emoji_one/montserrat.png differ diff --git a/public/images/emoji/emoji_one/moon_cake.png b/public/images/emoji/emoji_one/moon_cake.png new file mode 100644 index 0000000000..48a90fd201 Binary files /dev/null and b/public/images/emoji/emoji_one/moon_cake.png differ diff --git a/public/images/emoji/emoji_one/morocco.png b/public/images/emoji/emoji_one/morocco.png index 7f16d0a66d..10d4d98ba7 100644 Binary files a/public/images/emoji/emoji_one/morocco.png and b/public/images/emoji/emoji_one/morocco.png differ diff --git a/public/images/emoji/emoji_one/mosquito.png b/public/images/emoji/emoji_one/mosquito.png new file mode 100644 index 0000000000..14df71764e Binary files /dev/null and b/public/images/emoji/emoji_one/mosquito.png differ diff --git a/public/images/emoji/emoji_one/mozambique.png b/public/images/emoji/emoji_one/mozambique.png index 07d5cd56f0..1a33e0c69e 100644 Binary files a/public/images/emoji/emoji_one/mozambique.png and b/public/images/emoji/emoji_one/mozambique.png differ diff --git a/public/images/emoji/emoji_one/myanmar.png b/public/images/emoji/emoji_one/myanmar.png index 345829e2a3..42d00994e2 100644 Binary files a/public/images/emoji/emoji_one/myanmar.png and b/public/images/emoji/emoji_one/myanmar.png differ diff --git a/public/images/emoji/emoji_one/namibia.png b/public/images/emoji/emoji_one/namibia.png index f505b371fd..ba546e8227 100644 Binary files a/public/images/emoji/emoji_one/namibia.png and b/public/images/emoji/emoji_one/namibia.png differ diff --git a/public/images/emoji/emoji_one/nauru.png b/public/images/emoji/emoji_one/nauru.png index 443c1a5e93..1748da9cab 100644 Binary files a/public/images/emoji/emoji_one/nauru.png and b/public/images/emoji/emoji_one/nauru.png differ diff --git a/public/images/emoji/emoji_one/nazar_amulet.png b/public/images/emoji/emoji_one/nazar_amulet.png new file mode 100644 index 0000000000..02e1787112 Binary files /dev/null and b/public/images/emoji/emoji_one/nazar_amulet.png differ diff --git a/public/images/emoji/emoji_one/nepal.png b/public/images/emoji/emoji_one/nepal.png index cd57822d80..48acf5f2b7 100644 Binary files a/public/images/emoji/emoji_one/nepal.png and b/public/images/emoji/emoji_one/nepal.png differ diff --git a/public/images/emoji/emoji_one/netherlands.png b/public/images/emoji/emoji_one/netherlands.png index 1e37d79d5d..6963f32b59 100644 Binary files a/public/images/emoji/emoji_one/netherlands.png and b/public/images/emoji/emoji_one/netherlands.png differ diff --git a/public/images/emoji/emoji_one/new_caledonia.png b/public/images/emoji/emoji_one/new_caledonia.png index 45914c48c7..325fce6fcc 100644 Binary files a/public/images/emoji/emoji_one/new_caledonia.png and b/public/images/emoji/emoji_one/new_caledonia.png differ diff --git a/public/images/emoji/emoji_one/new_zealand.png b/public/images/emoji/emoji_one/new_zealand.png index 9ab60df7b7..753db4eb2a 100644 Binary files a/public/images/emoji/emoji_one/new_zealand.png and b/public/images/emoji/emoji_one/new_zealand.png differ diff --git a/public/images/emoji/emoji_one/nicaragua.png b/public/images/emoji/emoji_one/nicaragua.png index e405151e2d..0906eeb4e7 100644 Binary files a/public/images/emoji/emoji_one/nicaragua.png and b/public/images/emoji/emoji_one/nicaragua.png differ diff --git a/public/images/emoji/emoji_one/niger.png b/public/images/emoji/emoji_one/niger.png index fb6c4a4d37..6249ba305f 100644 Binary files a/public/images/emoji/emoji_one/niger.png and b/public/images/emoji/emoji_one/niger.png differ diff --git a/public/images/emoji/emoji_one/nigeria.png b/public/images/emoji/emoji_one/nigeria.png index 23c9d9a762..6cbb424d3d 100644 Binary files a/public/images/emoji/emoji_one/nigeria.png and b/public/images/emoji/emoji_one/nigeria.png differ diff --git a/public/images/emoji/emoji_one/niue.png b/public/images/emoji/emoji_one/niue.png index daaa26cc16..9bd5ec1ada 100644 Binary files a/public/images/emoji/emoji_one/niue.png and b/public/images/emoji/emoji_one/niue.png differ diff --git a/public/images/emoji/emoji_one/norfolk_island.png b/public/images/emoji/emoji_one/norfolk_island.png index 574acba100..599da68e6b 100644 Binary files a/public/images/emoji/emoji_one/norfolk_island.png and b/public/images/emoji/emoji_one/norfolk_island.png differ diff --git a/public/images/emoji/emoji_one/north_korea.png b/public/images/emoji/emoji_one/north_korea.png index d15d10aece..7e05f75fc6 100644 Binary files a/public/images/emoji/emoji_one/north_korea.png and b/public/images/emoji/emoji_one/north_korea.png differ diff --git a/public/images/emoji/emoji_one/northern_mariana_islands.png b/public/images/emoji/emoji_one/northern_mariana_islands.png index 962a6171b9..a581fbf72d 100644 Binary files a/public/images/emoji/emoji_one/northern_mariana_islands.png and b/public/images/emoji/emoji_one/northern_mariana_islands.png differ diff --git a/public/images/emoji/emoji_one/norway.png b/public/images/emoji/emoji_one/norway.png index 004a11d830..151484e1db 100644 Binary files a/public/images/emoji/emoji_one/norway.png and b/public/images/emoji/emoji_one/norway.png differ diff --git a/public/images/emoji/emoji_one/oman.png b/public/images/emoji/emoji_one/oman.png index 59e0df087e..1822af946a 100644 Binary files a/public/images/emoji/emoji_one/oman.png and b/public/images/emoji/emoji_one/oman.png differ diff --git a/public/images/emoji/emoji_one/pakistan.png b/public/images/emoji/emoji_one/pakistan.png index f4c74d1d49..77b7edf3eb 100644 Binary files a/public/images/emoji/emoji_one/pakistan.png and b/public/images/emoji/emoji_one/pakistan.png differ diff --git a/public/images/emoji/emoji_one/palau.png b/public/images/emoji/emoji_one/palau.png index 69aace7555..8a7aea6a9d 100644 Binary files a/public/images/emoji/emoji_one/palau.png and b/public/images/emoji/emoji_one/palau.png differ diff --git a/public/images/emoji/emoji_one/palestinian_territories.png b/public/images/emoji/emoji_one/palestinian_territories.png index 2e4399d762..2c22aef4c7 100644 Binary files a/public/images/emoji/emoji_one/palestinian_territories.png and b/public/images/emoji/emoji_one/palestinian_territories.png differ diff --git a/public/images/emoji/emoji_one/panama.png b/public/images/emoji/emoji_one/panama.png index 2a564db426..72a821c163 100644 Binary files a/public/images/emoji/emoji_one/panama.png and b/public/images/emoji/emoji_one/panama.png differ diff --git a/public/images/emoji/emoji_one/papua_new_guinea.png b/public/images/emoji/emoji_one/papua_new_guinea.png index b449d67794..d75762c30a 100644 Binary files a/public/images/emoji/emoji_one/papua_new_guinea.png and b/public/images/emoji/emoji_one/papua_new_guinea.png differ diff --git a/public/images/emoji/emoji_one/paraguay.png b/public/images/emoji/emoji_one/paraguay.png index d9eab9434c..967fb4cd45 100644 Binary files a/public/images/emoji/emoji_one/paraguay.png and b/public/images/emoji/emoji_one/paraguay.png differ diff --git a/public/images/emoji/emoji_one/parrot.png b/public/images/emoji/emoji_one/parrot.png new file mode 100644 index 0000000000..aaa6c5766e Binary files /dev/null and b/public/images/emoji/emoji_one/parrot.png differ diff --git a/public/images/emoji/emoji_one/partying_face.png b/public/images/emoji/emoji_one/partying_face.png new file mode 100644 index 0000000000..fe406fc166 Binary files /dev/null and b/public/images/emoji/emoji_one/partying_face.png differ diff --git a/public/images/emoji/emoji_one/peacock.png b/public/images/emoji/emoji_one/peacock.png new file mode 100644 index 0000000000..61514c9ce4 Binary files /dev/null and b/public/images/emoji/emoji_one/peacock.png differ diff --git a/public/images/emoji/emoji_one/peru.png b/public/images/emoji/emoji_one/peru.png index bbb5523f93..f7e54091a9 100644 Binary files a/public/images/emoji/emoji_one/peru.png and b/public/images/emoji/emoji_one/peru.png differ diff --git a/public/images/emoji/emoji_one/petri_dish.png b/public/images/emoji/emoji_one/petri_dish.png new file mode 100644 index 0000000000..ee00474cf3 Binary files /dev/null and b/public/images/emoji/emoji_one/petri_dish.png differ diff --git a/public/images/emoji/emoji_one/philippines.png b/public/images/emoji/emoji_one/philippines.png index b26fa86ac2..a0adbef2cf 100644 Binary files a/public/images/emoji/emoji_one/philippines.png and b/public/images/emoji/emoji_one/philippines.png differ diff --git a/public/images/emoji/emoji_one/pirate_flag.png b/public/images/emoji/emoji_one/pirate_flag.png new file mode 100644 index 0000000000..88c3e2c84d Binary files /dev/null and b/public/images/emoji/emoji_one/pirate_flag.png differ diff --git a/public/images/emoji/emoji_one/pitcairn_islands.png b/public/images/emoji/emoji_one/pitcairn_islands.png index 3e3d79bca5..a7ced0f12c 100644 Binary files a/public/images/emoji/emoji_one/pitcairn_islands.png and b/public/images/emoji/emoji_one/pitcairn_islands.png differ diff --git a/public/images/emoji/emoji_one/pleading_face.png b/public/images/emoji/emoji_one/pleading_face.png new file mode 100644 index 0000000000..780e355eac Binary files /dev/null and b/public/images/emoji/emoji_one/pleading_face.png differ diff --git a/public/images/emoji/emoji_one/poland.png b/public/images/emoji/emoji_one/poland.png index c8872ee52e..af38b9a8e2 100644 Binary files a/public/images/emoji/emoji_one/poland.png and b/public/images/emoji/emoji_one/poland.png differ diff --git a/public/images/emoji/emoji_one/portugal.png b/public/images/emoji/emoji_one/portugal.png index 5646de0622..246e2ceede 100644 Binary files a/public/images/emoji/emoji_one/portugal.png and b/public/images/emoji/emoji_one/portugal.png differ diff --git a/public/images/emoji/emoji_one/puerto_rico.png b/public/images/emoji/emoji_one/puerto_rico.png index 05a929944d..6d8a9634fa 100644 Binary files a/public/images/emoji/emoji_one/puerto_rico.png and b/public/images/emoji/emoji_one/puerto_rico.png differ diff --git a/public/images/emoji/emoji_one/qatar.png b/public/images/emoji/emoji_one/qatar.png index f51ae1d0ff..363099051c 100644 Binary files a/public/images/emoji/emoji_one/qatar.png and b/public/images/emoji/emoji_one/qatar.png differ diff --git a/public/images/emoji/emoji_one/raccoon.png b/public/images/emoji/emoji_one/raccoon.png new file mode 100644 index 0000000000..1ef6637cfa Binary files /dev/null and b/public/images/emoji/emoji_one/raccoon.png differ diff --git a/public/images/emoji/emoji_one/receipt.png b/public/images/emoji/emoji_one/receipt.png new file mode 100644 index 0000000000..6bef844972 Binary files /dev/null and b/public/images/emoji/emoji_one/receipt.png differ diff --git a/public/images/emoji/emoji_one/red_gift_envelope.png b/public/images/emoji/emoji_one/red_gift_envelope.png new file mode 100644 index 0000000000..c943501dd8 Binary files /dev/null and b/public/images/emoji/emoji_one/red_gift_envelope.png differ diff --git a/public/images/emoji/emoji_one/reunion.png b/public/images/emoji/emoji_one/reunion.png index 1679d4c5b9..188d989778 100644 Binary files a/public/images/emoji/emoji_one/reunion.png and b/public/images/emoji/emoji_one/reunion.png differ diff --git a/public/images/emoji/emoji_one/roll_of_toilet_paper.png b/public/images/emoji/emoji_one/roll_of_toilet_paper.png new file mode 100644 index 0000000000..f1927d5d9c Binary files /dev/null and b/public/images/emoji/emoji_one/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/emoji_one/romania.png b/public/images/emoji/emoji_one/romania.png index 2b16324878..953098b82d 100644 Binary files a/public/images/emoji/emoji_one/romania.png and b/public/images/emoji/emoji_one/romania.png differ diff --git a/public/images/emoji/emoji_one/ru.png b/public/images/emoji/emoji_one/ru.png index 3ecaefd941..47752f3f0c 100644 Binary files a/public/images/emoji/emoji_one/ru.png and b/public/images/emoji/emoji_one/ru.png differ diff --git a/public/images/emoji/emoji_one/rwanda.png b/public/images/emoji/emoji_one/rwanda.png index a45a988ff5..2802d1a2d7 100644 Binary files a/public/images/emoji/emoji_one/rwanda.png and b/public/images/emoji/emoji_one/rwanda.png differ diff --git a/public/images/emoji/emoji_one/safety_pin.png b/public/images/emoji/emoji_one/safety_pin.png new file mode 100644 index 0000000000..c7620f7972 Binary files /dev/null and b/public/images/emoji/emoji_one/safety_pin.png differ diff --git a/public/images/emoji/emoji_one/salt.png b/public/images/emoji/emoji_one/salt.png new file mode 100644 index 0000000000..f8fa13dbb9 Binary files /dev/null and b/public/images/emoji/emoji_one/salt.png differ diff --git a/public/images/emoji/emoji_one/samoa.png b/public/images/emoji/emoji_one/samoa.png index de81c048d0..5356f6d468 100644 Binary files a/public/images/emoji/emoji_one/samoa.png and b/public/images/emoji/emoji_one/samoa.png differ diff --git a/public/images/emoji/emoji_one/san_marino.png b/public/images/emoji/emoji_one/san_marino.png index fa20a00808..ddecba8b9e 100644 Binary files a/public/images/emoji/emoji_one/san_marino.png and b/public/images/emoji/emoji_one/san_marino.png differ diff --git a/public/images/emoji/emoji_one/sao_tome_principe.png b/public/images/emoji/emoji_one/sao_tome_principe.png index bbfcbd18df..e39a8e259f 100644 Binary files a/public/images/emoji/emoji_one/sao_tome_principe.png and b/public/images/emoji/emoji_one/sao_tome_principe.png differ diff --git a/public/images/emoji/emoji_one/saudi_arabia.png b/public/images/emoji/emoji_one/saudi_arabia.png index 59954eccbc..5f90f43d4b 100644 Binary files a/public/images/emoji/emoji_one/saudi_arabia.png and b/public/images/emoji/emoji_one/saudi_arabia.png differ diff --git a/public/images/emoji/emoji_one/senegal.png b/public/images/emoji/emoji_one/senegal.png index 2d32427625..caf9e4578b 100644 Binary files a/public/images/emoji/emoji_one/senegal.png and b/public/images/emoji/emoji_one/senegal.png differ diff --git a/public/images/emoji/emoji_one/serbia.png b/public/images/emoji/emoji_one/serbia.png index a7af1346e5..cc11163b5f 100644 Binary files a/public/images/emoji/emoji_one/serbia.png and b/public/images/emoji/emoji_one/serbia.png differ diff --git a/public/images/emoji/emoji_one/seychelles.png b/public/images/emoji/emoji_one/seychelles.png index e69ca6add1..908f6b88e6 100644 Binary files a/public/images/emoji/emoji_one/seychelles.png and b/public/images/emoji/emoji_one/seychelles.png differ diff --git a/public/images/emoji/emoji_one/sierra_leone.png b/public/images/emoji/emoji_one/sierra_leone.png index 816f090002..de88763d0d 100644 Binary files a/public/images/emoji/emoji_one/sierra_leone.png and b/public/images/emoji/emoji_one/sierra_leone.png differ diff --git a/public/images/emoji/emoji_one/singapore.png b/public/images/emoji/emoji_one/singapore.png index 4cf2332d20..454b82a079 100644 Binary files a/public/images/emoji/emoji_one/singapore.png and b/public/images/emoji/emoji_one/singapore.png differ diff --git a/public/images/emoji/emoji_one/sint_maarten.png b/public/images/emoji/emoji_one/sint_maarten.png index 5248152aba..72401f5fcd 100644 Binary files a/public/images/emoji/emoji_one/sint_maarten.png and b/public/images/emoji/emoji_one/sint_maarten.png differ diff --git a/public/images/emoji/emoji_one/skateboard.png b/public/images/emoji/emoji_one/skateboard.png new file mode 100644 index 0000000000..e255509b10 Binary files /dev/null and b/public/images/emoji/emoji_one/skateboard.png differ diff --git a/public/images/emoji/emoji_one/slovakia.png b/public/images/emoji/emoji_one/slovakia.png index 9b716032fd..276c387e03 100644 Binary files a/public/images/emoji/emoji_one/slovakia.png and b/public/images/emoji/emoji_one/slovakia.png differ diff --git a/public/images/emoji/emoji_one/slovenia.png b/public/images/emoji/emoji_one/slovenia.png index 6dfbe6eae2..473b67634f 100644 Binary files a/public/images/emoji/emoji_one/slovenia.png and b/public/images/emoji/emoji_one/slovenia.png differ diff --git a/public/images/emoji/emoji_one/smiling_face_with_three_hearts.png b/public/images/emoji/emoji_one/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..36efedef21 Binary files /dev/null and b/public/images/emoji/emoji_one/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/emoji_one/soap.png b/public/images/emoji/emoji_one/soap.png new file mode 100644 index 0000000000..2288e7597f Binary files /dev/null and b/public/images/emoji/emoji_one/soap.png differ diff --git a/public/images/emoji/emoji_one/softball.png b/public/images/emoji/emoji_one/softball.png new file mode 100644 index 0000000000..b519118e6b Binary files /dev/null and b/public/images/emoji/emoji_one/softball.png differ diff --git a/public/images/emoji/emoji_one/solomon_islands.png b/public/images/emoji/emoji_one/solomon_islands.png index e4476e1880..0be05b8cd0 100644 Binary files a/public/images/emoji/emoji_one/solomon_islands.png and b/public/images/emoji/emoji_one/solomon_islands.png differ diff --git a/public/images/emoji/emoji_one/somalia.png b/public/images/emoji/emoji_one/somalia.png index 209fffeaed..eec2a4dd43 100644 Binary files a/public/images/emoji/emoji_one/somalia.png and b/public/images/emoji/emoji_one/somalia.png differ diff --git a/public/images/emoji/emoji_one/south_africa.png b/public/images/emoji/emoji_one/south_africa.png index d40f1c75c8..d6dde19b4e 100644 Binary files a/public/images/emoji/emoji_one/south_africa.png and b/public/images/emoji/emoji_one/south_africa.png differ diff --git a/public/images/emoji/emoji_one/south_georgia_south_sandwich_islands.png b/public/images/emoji/emoji_one/south_georgia_south_sandwich_islands.png index 58f47bcd9b..da4bbff9c6 100644 Binary files a/public/images/emoji/emoji_one/south_georgia_south_sandwich_islands.png and b/public/images/emoji/emoji_one/south_georgia_south_sandwich_islands.png differ diff --git a/public/images/emoji/emoji_one/south_sudan.png b/public/images/emoji/emoji_one/south_sudan.png index c7cbc6967c..d87839b822 100644 Binary files a/public/images/emoji/emoji_one/south_sudan.png and b/public/images/emoji/emoji_one/south_sudan.png differ diff --git a/public/images/emoji/emoji_one/sponge.png b/public/images/emoji/emoji_one/sponge.png new file mode 100644 index 0000000000..2dae000f5d Binary files /dev/null and b/public/images/emoji/emoji_one/sponge.png differ diff --git a/public/images/emoji/emoji_one/sri_lanka.png b/public/images/emoji/emoji_one/sri_lanka.png index f15b9be56d..8f8d0b3aea 100644 Binary files a/public/images/emoji/emoji_one/sri_lanka.png and b/public/images/emoji/emoji_one/sri_lanka.png differ diff --git a/public/images/emoji/emoji_one/st_barthelemy.png b/public/images/emoji/emoji_one/st_barthelemy.png index e213bf7e40..f879335239 100644 Binary files a/public/images/emoji/emoji_one/st_barthelemy.png and b/public/images/emoji/emoji_one/st_barthelemy.png differ diff --git a/public/images/emoji/emoji_one/st_helena.png b/public/images/emoji/emoji_one/st_helena.png index 90fefd0cab..2d0df5102e 100644 Binary files a/public/images/emoji/emoji_one/st_helena.png and b/public/images/emoji/emoji_one/st_helena.png differ diff --git a/public/images/emoji/emoji_one/st_kitts_nevis.png b/public/images/emoji/emoji_one/st_kitts_nevis.png index d7686f8b60..e021417b87 100644 Binary files a/public/images/emoji/emoji_one/st_kitts_nevis.png and b/public/images/emoji/emoji_one/st_kitts_nevis.png differ diff --git a/public/images/emoji/emoji_one/st_lucia.png b/public/images/emoji/emoji_one/st_lucia.png index 92eafffe94..1b7e53a859 100644 Binary files a/public/images/emoji/emoji_one/st_lucia.png and b/public/images/emoji/emoji_one/st_lucia.png differ diff --git a/public/images/emoji/emoji_one/st_martin.png b/public/images/emoji/emoji_one/st_martin.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/emoji_one/st_martin.png and b/public/images/emoji/emoji_one/st_martin.png differ diff --git a/public/images/emoji/emoji_one/st_pierre_miquelon.png b/public/images/emoji/emoji_one/st_pierre_miquelon.png index b05828b47c..357a863146 100644 Binary files a/public/images/emoji/emoji_one/st_pierre_miquelon.png and b/public/images/emoji/emoji_one/st_pierre_miquelon.png differ diff --git a/public/images/emoji/emoji_one/st_vincent_grenadines.png b/public/images/emoji/emoji_one/st_vincent_grenadines.png index ddfd25fd22..0ace0a610d 100644 Binary files a/public/images/emoji/emoji_one/st_vincent_grenadines.png and b/public/images/emoji/emoji_one/st_vincent_grenadines.png differ diff --git a/public/images/emoji/emoji_one/sudan.png b/public/images/emoji/emoji_one/sudan.png index 3974a07328..56bc0f0b5c 100644 Binary files a/public/images/emoji/emoji_one/sudan.png and b/public/images/emoji/emoji_one/sudan.png differ diff --git a/public/images/emoji/emoji_one/superhero.png b/public/images/emoji/emoji_one/superhero.png new file mode 100644 index 0000000000..6ee52e3199 Binary files /dev/null and b/public/images/emoji/emoji_one/superhero.png differ diff --git a/public/images/emoji/emoji_one/supervillain.png b/public/images/emoji/emoji_one/supervillain.png new file mode 100644 index 0000000000..3aea1e7eae Binary files /dev/null and b/public/images/emoji/emoji_one/supervillain.png differ diff --git a/public/images/emoji/emoji_one/suriname.png b/public/images/emoji/emoji_one/suriname.png index 48afc4adac..7c1afcdceb 100644 Binary files a/public/images/emoji/emoji_one/suriname.png and b/public/images/emoji/emoji_one/suriname.png differ diff --git a/public/images/emoji/emoji_one/svalbard_and_jan_mayen.png b/public/images/emoji/emoji_one/svalbard_and_jan_mayen.png index 004a11d830..151484e1db 100644 Binary files a/public/images/emoji/emoji_one/svalbard_and_jan_mayen.png and b/public/images/emoji/emoji_one/svalbard_and_jan_mayen.png differ diff --git a/public/images/emoji/emoji_one/swan.png b/public/images/emoji/emoji_one/swan.png new file mode 100644 index 0000000000..4a0ac8fb12 Binary files /dev/null and b/public/images/emoji/emoji_one/swan.png differ diff --git a/public/images/emoji/emoji_one/swaziland.png b/public/images/emoji/emoji_one/swaziland.png index fb5ee97ba2..0cf3fb1d73 100644 Binary files a/public/images/emoji/emoji_one/swaziland.png and b/public/images/emoji/emoji_one/swaziland.png differ diff --git a/public/images/emoji/emoji_one/sweden.png b/public/images/emoji/emoji_one/sweden.png index 3b46fe18ab..4afbdcac76 100644 Binary files a/public/images/emoji/emoji_one/sweden.png and b/public/images/emoji/emoji_one/sweden.png differ diff --git a/public/images/emoji/emoji_one/switzerland.png b/public/images/emoji/emoji_one/switzerland.png index e0caa61ba6..bc50b99e54 100644 Binary files a/public/images/emoji/emoji_one/switzerland.png and b/public/images/emoji/emoji_one/switzerland.png differ diff --git a/public/images/emoji/emoji_one/syria.png b/public/images/emoji/emoji_one/syria.png index 53606f3e07..3dae2a2fcc 100644 Binary files a/public/images/emoji/emoji_one/syria.png and b/public/images/emoji/emoji_one/syria.png differ diff --git a/public/images/emoji/emoji_one/taiwan.png b/public/images/emoji/emoji_one/taiwan.png index dde348b40d..08123315bb 100644 Binary files a/public/images/emoji/emoji_one/taiwan.png and b/public/images/emoji/emoji_one/taiwan.png differ diff --git a/public/images/emoji/emoji_one/tajikistan.png b/public/images/emoji/emoji_one/tajikistan.png index 7b3697952d..7754926396 100644 Binary files a/public/images/emoji/emoji_one/tajikistan.png and b/public/images/emoji/emoji_one/tajikistan.png differ diff --git a/public/images/emoji/emoji_one/tanzania.png b/public/images/emoji/emoji_one/tanzania.png index d4026fea32..911f48da8b 100644 Binary files a/public/images/emoji/emoji_one/tanzania.png and b/public/images/emoji/emoji_one/tanzania.png differ diff --git a/public/images/emoji/emoji_one/teddy_bear.png b/public/images/emoji/emoji_one/teddy_bear.png new file mode 100644 index 0000000000..3e04bab07c Binary files /dev/null and b/public/images/emoji/emoji_one/teddy_bear.png differ diff --git a/public/images/emoji/emoji_one/test_tube.png b/public/images/emoji/emoji_one/test_tube.png new file mode 100644 index 0000000000..33b4404e98 Binary files /dev/null and b/public/images/emoji/emoji_one/test_tube.png differ diff --git a/public/images/emoji/emoji_one/thailand.png b/public/images/emoji/emoji_one/thailand.png index 81499f1616..218a284af0 100644 Binary files a/public/images/emoji/emoji_one/thailand.png and b/public/images/emoji/emoji_one/thailand.png differ diff --git a/public/images/emoji/emoji_one/thread.png b/public/images/emoji/emoji_one/thread.png new file mode 100644 index 0000000000..cf29afc5e1 Binary files /dev/null and b/public/images/emoji/emoji_one/thread.png differ diff --git a/public/images/emoji/emoji_one/timor_leste.png b/public/images/emoji/emoji_one/timor_leste.png index 6706def991..ab697eea2e 100644 Binary files a/public/images/emoji/emoji_one/timor_leste.png and b/public/images/emoji/emoji_one/timor_leste.png differ diff --git a/public/images/emoji/emoji_one/togo.png b/public/images/emoji/emoji_one/togo.png index 7a542547e0..1e3706997e 100644 Binary files a/public/images/emoji/emoji_one/togo.png and b/public/images/emoji/emoji_one/togo.png differ diff --git a/public/images/emoji/emoji_one/tokelau.png b/public/images/emoji/emoji_one/tokelau.png index f42f868631..122903dfe2 100644 Binary files a/public/images/emoji/emoji_one/tokelau.png and b/public/images/emoji/emoji_one/tokelau.png differ diff --git a/public/images/emoji/emoji_one/tonga.png b/public/images/emoji/emoji_one/tonga.png index bfff80acf4..22d9eb5d37 100644 Binary files a/public/images/emoji/emoji_one/tonga.png and b/public/images/emoji/emoji_one/tonga.png differ diff --git a/public/images/emoji/emoji_one/toolbox.png b/public/images/emoji/emoji_one/toolbox.png new file mode 100644 index 0000000000..4bd11cb25a Binary files /dev/null and b/public/images/emoji/emoji_one/toolbox.png differ diff --git a/public/images/emoji/emoji_one/tooth.png b/public/images/emoji/emoji_one/tooth.png new file mode 100644 index 0000000000..f65e593023 Binary files /dev/null and b/public/images/emoji/emoji_one/tooth.png differ diff --git a/public/images/emoji/emoji_one/tr.png b/public/images/emoji/emoji_one/tr.png index 3b6fc16379..a80ec23d64 100644 Binary files a/public/images/emoji/emoji_one/tr.png and b/public/images/emoji/emoji_one/tr.png differ diff --git a/public/images/emoji/emoji_one/trinidad_tobago.png b/public/images/emoji/emoji_one/trinidad_tobago.png index 14355ce15f..7052a392b7 100644 Binary files a/public/images/emoji/emoji_one/trinidad_tobago.png and b/public/images/emoji/emoji_one/trinidad_tobago.png differ diff --git a/public/images/emoji/emoji_one/tristan_da_cunha.png b/public/images/emoji/emoji_one/tristan_da_cunha.png index dff4791d41..15e4c3e159 100644 Binary files a/public/images/emoji/emoji_one/tristan_da_cunha.png and b/public/images/emoji/emoji_one/tristan_da_cunha.png differ diff --git a/public/images/emoji/emoji_one/tunisia.png b/public/images/emoji/emoji_one/tunisia.png index 2691b42f09..8b762b44d9 100644 Binary files a/public/images/emoji/emoji_one/tunisia.png and b/public/images/emoji/emoji_one/tunisia.png differ diff --git a/public/images/emoji/emoji_one/turkmenistan.png b/public/images/emoji/emoji_one/turkmenistan.png index a0729e2c29..8e6fbb11c5 100644 Binary files a/public/images/emoji/emoji_one/turkmenistan.png and b/public/images/emoji/emoji_one/turkmenistan.png differ diff --git a/public/images/emoji/emoji_one/turks_caicos_islands.png b/public/images/emoji/emoji_one/turks_caicos_islands.png index bb04d27666..7380100153 100644 Binary files a/public/images/emoji/emoji_one/turks_caicos_islands.png and b/public/images/emoji/emoji_one/turks_caicos_islands.png differ diff --git a/public/images/emoji/emoji_one/tuvalu.png b/public/images/emoji/emoji_one/tuvalu.png index 60fad11afc..44880afa7b 100644 Binary files a/public/images/emoji/emoji_one/tuvalu.png and b/public/images/emoji/emoji_one/tuvalu.png differ diff --git a/public/images/emoji/emoji_one/uganda.png b/public/images/emoji/emoji_one/uganda.png index 9541a9fe43..2926eb5072 100644 Binary files a/public/images/emoji/emoji_one/uganda.png and b/public/images/emoji/emoji_one/uganda.png differ diff --git a/public/images/emoji/emoji_one/uk.png b/public/images/emoji/emoji_one/uk.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/emoji_one/uk.png and b/public/images/emoji/emoji_one/uk.png differ diff --git a/public/images/emoji/emoji_one/ukraine.png b/public/images/emoji/emoji_one/ukraine.png index d24b4e827b..d76c090dc4 100644 Binary files a/public/images/emoji/emoji_one/ukraine.png and b/public/images/emoji/emoji_one/ukraine.png differ diff --git a/public/images/emoji/emoji_one/united_arab_emirates.png b/public/images/emoji/emoji_one/united_arab_emirates.png index 0aac4c4b1e..12ff444d51 100644 Binary files a/public/images/emoji/emoji_one/united_arab_emirates.png and b/public/images/emoji/emoji_one/united_arab_emirates.png differ diff --git a/public/images/emoji/emoji_one/united_nations.png b/public/images/emoji/emoji_one/united_nations.png index d695a5cac0..ea7fc4c7d7 100644 Binary files a/public/images/emoji/emoji_one/united_nations.png and b/public/images/emoji/emoji_one/united_nations.png differ diff --git a/public/images/emoji/emoji_one/uruguay.png b/public/images/emoji/emoji_one/uruguay.png index 8196541e26..8667234f6a 100644 Binary files a/public/images/emoji/emoji_one/uruguay.png and b/public/images/emoji/emoji_one/uruguay.png differ diff --git a/public/images/emoji/emoji_one/us.png b/public/images/emoji/emoji_one/us.png index 450853eca4..0ba064250e 100644 Binary files a/public/images/emoji/emoji_one/us.png and b/public/images/emoji/emoji_one/us.png differ diff --git a/public/images/emoji/emoji_one/us_outlying_islands.png b/public/images/emoji/emoji_one/us_outlying_islands.png index 450853eca4..bae619c110 100644 Binary files a/public/images/emoji/emoji_one/us_outlying_islands.png and b/public/images/emoji/emoji_one/us_outlying_islands.png differ diff --git a/public/images/emoji/emoji_one/us_virgin_islands.png b/public/images/emoji/emoji_one/us_virgin_islands.png index 2352c2610b..c117aff7f2 100644 Binary files a/public/images/emoji/emoji_one/us_virgin_islands.png and b/public/images/emoji/emoji_one/us_virgin_islands.png differ diff --git a/public/images/emoji/emoji_one/uzbekistan.png b/public/images/emoji/emoji_one/uzbekistan.png index c268b7f0b2..19004d72d4 100644 Binary files a/public/images/emoji/emoji_one/uzbekistan.png and b/public/images/emoji/emoji_one/uzbekistan.png differ diff --git a/public/images/emoji/emoji_one/vanuatu.png b/public/images/emoji/emoji_one/vanuatu.png index ebf4b69315..df4766669c 100644 Binary files a/public/images/emoji/emoji_one/vanuatu.png and b/public/images/emoji/emoji_one/vanuatu.png differ diff --git a/public/images/emoji/emoji_one/vatican_city.png b/public/images/emoji/emoji_one/vatican_city.png index a91fed8815..f0fe36f9ad 100644 Binary files a/public/images/emoji/emoji_one/vatican_city.png and b/public/images/emoji/emoji_one/vatican_city.png differ diff --git a/public/images/emoji/emoji_one/venezuela.png b/public/images/emoji/emoji_one/venezuela.png index e2b7cff1d8..70a249fec6 100644 Binary files a/public/images/emoji/emoji_one/venezuela.png and b/public/images/emoji/emoji_one/venezuela.png differ diff --git a/public/images/emoji/emoji_one/vietnam.png b/public/images/emoji/emoji_one/vietnam.png index f888ea9435..5282bd4343 100644 Binary files a/public/images/emoji/emoji_one/vietnam.png and b/public/images/emoji/emoji_one/vietnam.png differ diff --git a/public/images/emoji/emoji_one/wallis_futuna.png b/public/images/emoji/emoji_one/wallis_futuna.png index 4672eabedb..c75c4db34e 100644 Binary files a/public/images/emoji/emoji_one/wallis_futuna.png and b/public/images/emoji/emoji_one/wallis_futuna.png differ diff --git a/public/images/emoji/emoji_one/western_sahara.png b/public/images/emoji/emoji_one/western_sahara.png index 44c0ea20dd..3b6afaa73a 100644 Binary files a/public/images/emoji/emoji_one/western_sahara.png and b/public/images/emoji/emoji_one/western_sahara.png differ diff --git a/public/images/emoji/emoji_one/woman_bald.png b/public/images/emoji/emoji_one/woman_bald.png new file mode 100644 index 0000000000..f89fca0b7b Binary files /dev/null and b/public/images/emoji/emoji_one/woman_bald.png differ diff --git a/public/images/emoji/emoji_one/woman_curly_haired.png b/public/images/emoji/emoji_one/woman_curly_haired.png new file mode 100644 index 0000000000..11f78fc275 Binary files /dev/null and b/public/images/emoji/emoji_one/woman_curly_haired.png differ diff --git a/public/images/emoji/emoji_one/woman_red_haired.png b/public/images/emoji/emoji_one/woman_red_haired.png new file mode 100644 index 0000000000..8269c52e7c Binary files /dev/null and b/public/images/emoji/emoji_one/woman_red_haired.png differ diff --git a/public/images/emoji/emoji_one/woman_superhero.png b/public/images/emoji/emoji_one/woman_superhero.png new file mode 100644 index 0000000000..6ee52e3199 Binary files /dev/null and b/public/images/emoji/emoji_one/woman_superhero.png differ diff --git a/public/images/emoji/emoji_one/woman_supervillain.png b/public/images/emoji/emoji_one/woman_supervillain.png new file mode 100644 index 0000000000..3aea1e7eae Binary files /dev/null and b/public/images/emoji/emoji_one/woman_supervillain.png differ diff --git a/public/images/emoji/emoji_one/woman_white_haired.png b/public/images/emoji/emoji_one/woman_white_haired.png new file mode 100644 index 0000000000..06a60af8d5 Binary files /dev/null and b/public/images/emoji/emoji_one/woman_white_haired.png differ diff --git a/public/images/emoji/emoji_one/woozy_face.png b/public/images/emoji/emoji_one/woozy_face.png new file mode 100644 index 0000000000..f039fe4000 Binary files /dev/null and b/public/images/emoji/emoji_one/woozy_face.png differ diff --git a/public/images/emoji/emoji_one/yarn.png b/public/images/emoji/emoji_one/yarn.png new file mode 100644 index 0000000000..25d8b20e87 Binary files /dev/null and b/public/images/emoji/emoji_one/yarn.png differ diff --git a/public/images/emoji/emoji_one/yemen.png b/public/images/emoji/emoji_one/yemen.png index 3a37c85041..e858bb2c19 100644 Binary files a/public/images/emoji/emoji_one/yemen.png and b/public/images/emoji/emoji_one/yemen.png differ diff --git a/public/images/emoji/emoji_one/zambia.png b/public/images/emoji/emoji_one/zambia.png index 3e7d4cbea5..6283325081 100644 Binary files a/public/images/emoji/emoji_one/zambia.png and b/public/images/emoji/emoji_one/zambia.png differ diff --git a/public/images/emoji/emoji_one/zimbabwe.png b/public/images/emoji/emoji_one/zimbabwe.png index c3af3c54d7..d87fd6ac15 100644 Binary files a/public/images/emoji/emoji_one/zimbabwe.png and b/public/images/emoji/emoji_one/zimbabwe.png differ diff --git a/public/images/emoji/facebook_messenger/+1.png b/public/images/emoji/facebook_messenger/+1.png index 53f1b3d075..a97d9c978b 100644 Binary files a/public/images/emoji/facebook_messenger/+1.png and b/public/images/emoji/facebook_messenger/+1.png differ diff --git a/public/images/emoji/facebook_messenger/-1.png b/public/images/emoji/facebook_messenger/-1.png index 6a7dce2614..815bd92c8c 100644 Binary files a/public/images/emoji/facebook_messenger/-1.png and b/public/images/emoji/facebook_messenger/-1.png differ diff --git a/public/images/emoji/facebook_messenger/100.png b/public/images/emoji/facebook_messenger/100.png index 78dfa21ffb..fe8a4a99d9 100644 Binary files a/public/images/emoji/facebook_messenger/100.png and b/public/images/emoji/facebook_messenger/100.png differ diff --git a/public/images/emoji/facebook_messenger/1234.png b/public/images/emoji/facebook_messenger/1234.png index 7419d45eaf..07b65a935c 100644 Binary files a/public/images/emoji/facebook_messenger/1234.png and b/public/images/emoji/facebook_messenger/1234.png differ diff --git a/public/images/emoji/facebook_messenger/1st_place_medal.png b/public/images/emoji/facebook_messenger/1st_place_medal.png index 2e7efd77c8..318cf16072 100644 Binary files a/public/images/emoji/facebook_messenger/1st_place_medal.png and b/public/images/emoji/facebook_messenger/1st_place_medal.png differ diff --git a/public/images/emoji/facebook_messenger/2nd_place_medal.png b/public/images/emoji/facebook_messenger/2nd_place_medal.png index 531865180a..3301b8f092 100644 Binary files a/public/images/emoji/facebook_messenger/2nd_place_medal.png and b/public/images/emoji/facebook_messenger/2nd_place_medal.png differ diff --git a/public/images/emoji/facebook_messenger/3rd_place_medal.png b/public/images/emoji/facebook_messenger/3rd_place_medal.png index f4f0c3562e..d5ee84e980 100644 Binary files a/public/images/emoji/facebook_messenger/3rd_place_medal.png and b/public/images/emoji/facebook_messenger/3rd_place_medal.png differ diff --git a/public/images/emoji/facebook_messenger/8ball.png b/public/images/emoji/facebook_messenger/8ball.png index 11cc716c11..02a2648cc8 100644 Binary files a/public/images/emoji/facebook_messenger/8ball.png and b/public/images/emoji/facebook_messenger/8ball.png differ diff --git a/public/images/emoji/facebook_messenger/a.png b/public/images/emoji/facebook_messenger/a.png index 55b11f4ec0..ed19235431 100644 Binary files a/public/images/emoji/facebook_messenger/a.png and b/public/images/emoji/facebook_messenger/a.png differ diff --git a/public/images/emoji/facebook_messenger/ab.png b/public/images/emoji/facebook_messenger/ab.png index 963d76b053..da75bbd726 100644 Binary files a/public/images/emoji/facebook_messenger/ab.png and b/public/images/emoji/facebook_messenger/ab.png differ diff --git a/public/images/emoji/facebook_messenger/abacus.png b/public/images/emoji/facebook_messenger/abacus.png new file mode 100644 index 0000000000..e56e558529 Binary files /dev/null and b/public/images/emoji/facebook_messenger/abacus.png differ diff --git a/public/images/emoji/facebook_messenger/abc.png b/public/images/emoji/facebook_messenger/abc.png index baaa45c9b2..205967f614 100644 Binary files a/public/images/emoji/facebook_messenger/abc.png and b/public/images/emoji/facebook_messenger/abc.png differ diff --git a/public/images/emoji/facebook_messenger/abcd.png b/public/images/emoji/facebook_messenger/abcd.png index 09f754c8b6..0d05f2de0e 100644 Binary files a/public/images/emoji/facebook_messenger/abcd.png and b/public/images/emoji/facebook_messenger/abcd.png differ diff --git a/public/images/emoji/facebook_messenger/accept.png b/public/images/emoji/facebook_messenger/accept.png index 958f0f7788..6c03448d88 100644 Binary files a/public/images/emoji/facebook_messenger/accept.png and b/public/images/emoji/facebook_messenger/accept.png differ diff --git a/public/images/emoji/facebook_messenger/admission_tickets.png b/public/images/emoji/facebook_messenger/admission_tickets.png index e863f088be..7e1f0bc5ef 100644 Binary files a/public/images/emoji/facebook_messenger/admission_tickets.png and b/public/images/emoji/facebook_messenger/admission_tickets.png differ diff --git a/public/images/emoji/facebook_messenger/adult.png b/public/images/emoji/facebook_messenger/adult.png index d70004b157..92189aed26 100644 Binary files a/public/images/emoji/facebook_messenger/adult.png and b/public/images/emoji/facebook_messenger/adult.png differ diff --git a/public/images/emoji/facebook_messenger/aerial_tramway.png b/public/images/emoji/facebook_messenger/aerial_tramway.png index 278811eaf6..bddbd93388 100644 Binary files a/public/images/emoji/facebook_messenger/aerial_tramway.png and b/public/images/emoji/facebook_messenger/aerial_tramway.png differ diff --git a/public/images/emoji/facebook_messenger/afghanistan.png b/public/images/emoji/facebook_messenger/afghanistan.png index e4bd70e0cc..051239cf94 100644 Binary files a/public/images/emoji/facebook_messenger/afghanistan.png and b/public/images/emoji/facebook_messenger/afghanistan.png differ diff --git a/public/images/emoji/facebook_messenger/airplane.png b/public/images/emoji/facebook_messenger/airplane.png index 1591f52a46..60854fe20f 100644 Binary files a/public/images/emoji/facebook_messenger/airplane.png and b/public/images/emoji/facebook_messenger/airplane.png differ diff --git a/public/images/emoji/facebook_messenger/airplane_arriving.png b/public/images/emoji/facebook_messenger/airplane_arriving.png index 4e22866646..1849e3a1ee 100644 Binary files a/public/images/emoji/facebook_messenger/airplane_arriving.png and b/public/images/emoji/facebook_messenger/airplane_arriving.png differ diff --git a/public/images/emoji/facebook_messenger/airplane_departure.png b/public/images/emoji/facebook_messenger/airplane_departure.png index bfa84966f7..de0a85372e 100644 Binary files a/public/images/emoji/facebook_messenger/airplane_departure.png and b/public/images/emoji/facebook_messenger/airplane_departure.png differ diff --git a/public/images/emoji/facebook_messenger/airplane_small.png b/public/images/emoji/facebook_messenger/airplane_small.png index 110df28455..3675789917 100644 Binary files a/public/images/emoji/facebook_messenger/airplane_small.png and b/public/images/emoji/facebook_messenger/airplane_small.png differ diff --git a/public/images/emoji/facebook_messenger/aland_islands.png b/public/images/emoji/facebook_messenger/aland_islands.png index 27ccf56b7b..2e37345d00 100644 Binary files a/public/images/emoji/facebook_messenger/aland_islands.png and b/public/images/emoji/facebook_messenger/aland_islands.png differ diff --git a/public/images/emoji/facebook_messenger/alarm_clock.png b/public/images/emoji/facebook_messenger/alarm_clock.png index bf68033cbc..bdb8918ec9 100644 Binary files a/public/images/emoji/facebook_messenger/alarm_clock.png and b/public/images/emoji/facebook_messenger/alarm_clock.png differ diff --git a/public/images/emoji/facebook_messenger/albania.png b/public/images/emoji/facebook_messenger/albania.png index 86e6ef78a7..d0abec73f4 100644 Binary files a/public/images/emoji/facebook_messenger/albania.png and b/public/images/emoji/facebook_messenger/albania.png differ diff --git a/public/images/emoji/facebook_messenger/alembic.png b/public/images/emoji/facebook_messenger/alembic.png index 06f6bcfea7..1a5ca932fc 100644 Binary files a/public/images/emoji/facebook_messenger/alembic.png and b/public/images/emoji/facebook_messenger/alembic.png differ diff --git a/public/images/emoji/facebook_messenger/algeria.png b/public/images/emoji/facebook_messenger/algeria.png index e00db341e1..91f2be4b33 100644 Binary files a/public/images/emoji/facebook_messenger/algeria.png and b/public/images/emoji/facebook_messenger/algeria.png differ diff --git a/public/images/emoji/facebook_messenger/alien.png b/public/images/emoji/facebook_messenger/alien.png index 4f74102854..c9a4585252 100644 Binary files a/public/images/emoji/facebook_messenger/alien.png and b/public/images/emoji/facebook_messenger/alien.png differ diff --git a/public/images/emoji/facebook_messenger/ambulance.png b/public/images/emoji/facebook_messenger/ambulance.png index 38215b61f8..a96effbd53 100644 Binary files a/public/images/emoji/facebook_messenger/ambulance.png and b/public/images/emoji/facebook_messenger/ambulance.png differ diff --git a/public/images/emoji/facebook_messenger/american_samoa.png b/public/images/emoji/facebook_messenger/american_samoa.png index 61d8eab2fe..210f5e2b19 100644 Binary files a/public/images/emoji/facebook_messenger/american_samoa.png and b/public/images/emoji/facebook_messenger/american_samoa.png differ diff --git a/public/images/emoji/facebook_messenger/amphora.png b/public/images/emoji/facebook_messenger/amphora.png index d6548cfcc4..57f3fe9551 100644 Binary files a/public/images/emoji/facebook_messenger/amphora.png and b/public/images/emoji/facebook_messenger/amphora.png differ diff --git a/public/images/emoji/facebook_messenger/anchor.png b/public/images/emoji/facebook_messenger/anchor.png index b3114bceef..3bcd9175ef 100644 Binary files a/public/images/emoji/facebook_messenger/anchor.png and b/public/images/emoji/facebook_messenger/anchor.png differ diff --git a/public/images/emoji/facebook_messenger/andorra.png b/public/images/emoji/facebook_messenger/andorra.png index fdf8c39b42..d90c07b2ff 100644 Binary files a/public/images/emoji/facebook_messenger/andorra.png and b/public/images/emoji/facebook_messenger/andorra.png differ diff --git a/public/images/emoji/facebook_messenger/angel.png b/public/images/emoji/facebook_messenger/angel.png index d7b42390ae..8151ddea1e 100644 Binary files a/public/images/emoji/facebook_messenger/angel.png and b/public/images/emoji/facebook_messenger/angel.png differ diff --git a/public/images/emoji/facebook_messenger/anger.png b/public/images/emoji/facebook_messenger/anger.png index 4eb6dccaa2..9ec246d344 100644 Binary files a/public/images/emoji/facebook_messenger/anger.png and b/public/images/emoji/facebook_messenger/anger.png differ diff --git a/public/images/emoji/facebook_messenger/anger_right.png b/public/images/emoji/facebook_messenger/anger_right.png index c9f3e48c81..020b6bd446 100644 Binary files a/public/images/emoji/facebook_messenger/anger_right.png and b/public/images/emoji/facebook_messenger/anger_right.png differ diff --git a/public/images/emoji/facebook_messenger/angola.png b/public/images/emoji/facebook_messenger/angola.png index a1a98b7e2a..5bcb29d626 100644 Binary files a/public/images/emoji/facebook_messenger/angola.png and b/public/images/emoji/facebook_messenger/angola.png differ diff --git a/public/images/emoji/facebook_messenger/angry.png b/public/images/emoji/facebook_messenger/angry.png index e6b2466095..9b93a0ee14 100644 Binary files a/public/images/emoji/facebook_messenger/angry.png and b/public/images/emoji/facebook_messenger/angry.png differ diff --git a/public/images/emoji/facebook_messenger/anguilla.png b/public/images/emoji/facebook_messenger/anguilla.png index 66f543a1ec..138d674293 100644 Binary files a/public/images/emoji/facebook_messenger/anguilla.png and b/public/images/emoji/facebook_messenger/anguilla.png differ diff --git a/public/images/emoji/facebook_messenger/anguished.png b/public/images/emoji/facebook_messenger/anguished.png index 41ea3c16c8..8a01eec683 100644 Binary files a/public/images/emoji/facebook_messenger/anguished.png and b/public/images/emoji/facebook_messenger/anguished.png differ diff --git a/public/images/emoji/facebook_messenger/ant.png b/public/images/emoji/facebook_messenger/ant.png index c4388256a3..a596ac78fe 100644 Binary files a/public/images/emoji/facebook_messenger/ant.png and b/public/images/emoji/facebook_messenger/ant.png differ diff --git a/public/images/emoji/facebook_messenger/antarctica.png b/public/images/emoji/facebook_messenger/antarctica.png index 387d47f5bb..bd3408440b 100644 Binary files a/public/images/emoji/facebook_messenger/antarctica.png and b/public/images/emoji/facebook_messenger/antarctica.png differ diff --git a/public/images/emoji/facebook_messenger/antigua_barbuda.png b/public/images/emoji/facebook_messenger/antigua_barbuda.png index 0655dfa9d8..06dfb28c53 100644 Binary files a/public/images/emoji/facebook_messenger/antigua_barbuda.png and b/public/images/emoji/facebook_messenger/antigua_barbuda.png differ diff --git a/public/images/emoji/facebook_messenger/apple.png b/public/images/emoji/facebook_messenger/apple.png index 46ec06ea24..aa5e62b07c 100644 Binary files a/public/images/emoji/facebook_messenger/apple.png and b/public/images/emoji/facebook_messenger/apple.png differ diff --git a/public/images/emoji/facebook_messenger/aquarius.png b/public/images/emoji/facebook_messenger/aquarius.png index f81db33ca6..9bef19bc79 100644 Binary files a/public/images/emoji/facebook_messenger/aquarius.png and b/public/images/emoji/facebook_messenger/aquarius.png differ diff --git a/public/images/emoji/facebook_messenger/archery.png b/public/images/emoji/facebook_messenger/archery.png index eba0a0deeb..f4ff1803ad 100644 Binary files a/public/images/emoji/facebook_messenger/archery.png and b/public/images/emoji/facebook_messenger/archery.png differ diff --git a/public/images/emoji/facebook_messenger/argentina.png b/public/images/emoji/facebook_messenger/argentina.png index b8581e08d7..3a34943102 100644 Binary files a/public/images/emoji/facebook_messenger/argentina.png and b/public/images/emoji/facebook_messenger/argentina.png differ diff --git a/public/images/emoji/facebook_messenger/aries.png b/public/images/emoji/facebook_messenger/aries.png index 0223295e50..15a59f9fa1 100644 Binary files a/public/images/emoji/facebook_messenger/aries.png and b/public/images/emoji/facebook_messenger/aries.png differ diff --git a/public/images/emoji/facebook_messenger/armenia.png b/public/images/emoji/facebook_messenger/armenia.png index 546e4c9fae..e8d97634ef 100644 Binary files a/public/images/emoji/facebook_messenger/armenia.png and b/public/images/emoji/facebook_messenger/armenia.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_backward.png b/public/images/emoji/facebook_messenger/arrow_backward.png index 130d818226..8a01c36873 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_backward.png and b/public/images/emoji/facebook_messenger/arrow_backward.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_double_down.png b/public/images/emoji/facebook_messenger/arrow_double_down.png index 3ba9966d5c..59d2708714 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_double_down.png and b/public/images/emoji/facebook_messenger/arrow_double_down.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_double_up.png b/public/images/emoji/facebook_messenger/arrow_double_up.png index fd19d0666a..245df85040 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_double_up.png and b/public/images/emoji/facebook_messenger/arrow_double_up.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_down.png b/public/images/emoji/facebook_messenger/arrow_down.png index 12849775a2..e14b31423a 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_down.png and b/public/images/emoji/facebook_messenger/arrow_down.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_down_small.png b/public/images/emoji/facebook_messenger/arrow_down_small.png index 1902d03537..92b7cbc5b8 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_down_small.png and b/public/images/emoji/facebook_messenger/arrow_down_small.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_forward.png b/public/images/emoji/facebook_messenger/arrow_forward.png index e6061821e4..4e543ac9d6 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_forward.png and b/public/images/emoji/facebook_messenger/arrow_forward.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_heading_down.png b/public/images/emoji/facebook_messenger/arrow_heading_down.png index 6a6228d3f0..4169b02c30 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_heading_down.png and b/public/images/emoji/facebook_messenger/arrow_heading_down.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_heading_up.png b/public/images/emoji/facebook_messenger/arrow_heading_up.png index 3123994b1d..977627abba 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_heading_up.png and b/public/images/emoji/facebook_messenger/arrow_heading_up.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_left.png b/public/images/emoji/facebook_messenger/arrow_left.png index ae620c31d6..efde6ae697 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_left.png and b/public/images/emoji/facebook_messenger/arrow_left.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_lower_left.png b/public/images/emoji/facebook_messenger/arrow_lower_left.png index 4288a049ef..3899b01142 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_lower_left.png and b/public/images/emoji/facebook_messenger/arrow_lower_left.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_lower_right.png b/public/images/emoji/facebook_messenger/arrow_lower_right.png index 385137287d..21477b7ecd 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_lower_right.png and b/public/images/emoji/facebook_messenger/arrow_lower_right.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_right.png b/public/images/emoji/facebook_messenger/arrow_right.png index eecdb6a67a..319430d0ba 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_right.png and b/public/images/emoji/facebook_messenger/arrow_right.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_right_hook.png b/public/images/emoji/facebook_messenger/arrow_right_hook.png index 400f8be14c..2fbbb7e654 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_right_hook.png and b/public/images/emoji/facebook_messenger/arrow_right_hook.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_up.png b/public/images/emoji/facebook_messenger/arrow_up.png index c45961fece..1dd15fb049 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_up.png and b/public/images/emoji/facebook_messenger/arrow_up.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_up_down.png b/public/images/emoji/facebook_messenger/arrow_up_down.png index d41e69dd89..0a8b06a441 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_up_down.png and b/public/images/emoji/facebook_messenger/arrow_up_down.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_up_small.png b/public/images/emoji/facebook_messenger/arrow_up_small.png index 7022016ea7..ffe23dac5d 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_up_small.png and b/public/images/emoji/facebook_messenger/arrow_up_small.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_upper_left.png b/public/images/emoji/facebook_messenger/arrow_upper_left.png index 73041d2f30..3ddd178972 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_upper_left.png and b/public/images/emoji/facebook_messenger/arrow_upper_left.png differ diff --git a/public/images/emoji/facebook_messenger/arrow_upper_right.png b/public/images/emoji/facebook_messenger/arrow_upper_right.png index 96382a22c7..bde11d7c47 100644 Binary files a/public/images/emoji/facebook_messenger/arrow_upper_right.png and b/public/images/emoji/facebook_messenger/arrow_upper_right.png differ diff --git a/public/images/emoji/facebook_messenger/arrows_clockwise.png b/public/images/emoji/facebook_messenger/arrows_clockwise.png index 45ae5473a5..0e813ae303 100644 Binary files a/public/images/emoji/facebook_messenger/arrows_clockwise.png and b/public/images/emoji/facebook_messenger/arrows_clockwise.png differ diff --git a/public/images/emoji/facebook_messenger/arrows_counterclockwise.png b/public/images/emoji/facebook_messenger/arrows_counterclockwise.png index dc32223232..9fb3eeb2a7 100644 Binary files a/public/images/emoji/facebook_messenger/arrows_counterclockwise.png and b/public/images/emoji/facebook_messenger/arrows_counterclockwise.png differ diff --git a/public/images/emoji/facebook_messenger/art.png b/public/images/emoji/facebook_messenger/art.png index 7f2a869348..61e584b7a6 100644 Binary files a/public/images/emoji/facebook_messenger/art.png and b/public/images/emoji/facebook_messenger/art.png differ diff --git a/public/images/emoji/facebook_messenger/articulated_lorry.png b/public/images/emoji/facebook_messenger/articulated_lorry.png index 6a01eb5f96..f0bc41f714 100644 Binary files a/public/images/emoji/facebook_messenger/articulated_lorry.png and b/public/images/emoji/facebook_messenger/articulated_lorry.png differ diff --git a/public/images/emoji/facebook_messenger/artificial_satellite.png b/public/images/emoji/facebook_messenger/artificial_satellite.png index d50cf91954..925d5503c9 100644 Binary files a/public/images/emoji/facebook_messenger/artificial_satellite.png and b/public/images/emoji/facebook_messenger/artificial_satellite.png differ diff --git a/public/images/emoji/facebook_messenger/aruba.png b/public/images/emoji/facebook_messenger/aruba.png index bbd1acac5d..df390ead83 100644 Binary files a/public/images/emoji/facebook_messenger/aruba.png and b/public/images/emoji/facebook_messenger/aruba.png differ diff --git a/public/images/emoji/facebook_messenger/ascension_island.png b/public/images/emoji/facebook_messenger/ascension_island.png index 1f04f48a0c..f6d82bc62c 100644 Binary files a/public/images/emoji/facebook_messenger/ascension_island.png and b/public/images/emoji/facebook_messenger/ascension_island.png differ diff --git a/public/images/emoji/facebook_messenger/asterisk.png b/public/images/emoji/facebook_messenger/asterisk.png index a009bc2cda..0aade2223c 100644 Binary files a/public/images/emoji/facebook_messenger/asterisk.png and b/public/images/emoji/facebook_messenger/asterisk.png differ diff --git a/public/images/emoji/facebook_messenger/astonished.png b/public/images/emoji/facebook_messenger/astonished.png index 0cb60d865e..31c6531706 100644 Binary files a/public/images/emoji/facebook_messenger/astonished.png and b/public/images/emoji/facebook_messenger/astonished.png differ diff --git a/public/images/emoji/facebook_messenger/athletic_shoe.png b/public/images/emoji/facebook_messenger/athletic_shoe.png index dab191424b..371cea18f2 100644 Binary files a/public/images/emoji/facebook_messenger/athletic_shoe.png and b/public/images/emoji/facebook_messenger/athletic_shoe.png differ diff --git a/public/images/emoji/facebook_messenger/atm.png b/public/images/emoji/facebook_messenger/atm.png index fb14b328e7..31dbfda2b7 100644 Binary files a/public/images/emoji/facebook_messenger/atm.png and b/public/images/emoji/facebook_messenger/atm.png differ diff --git a/public/images/emoji/facebook_messenger/atom.png b/public/images/emoji/facebook_messenger/atom.png index de8f524127..ee9107f052 100644 Binary files a/public/images/emoji/facebook_messenger/atom.png and b/public/images/emoji/facebook_messenger/atom.png differ diff --git a/public/images/emoji/facebook_messenger/atom_symbol.png b/public/images/emoji/facebook_messenger/atom_symbol.png index de8f524127..ee9107f052 100644 Binary files a/public/images/emoji/facebook_messenger/atom_symbol.png and b/public/images/emoji/facebook_messenger/atom_symbol.png differ diff --git a/public/images/emoji/facebook_messenger/australia.png b/public/images/emoji/facebook_messenger/australia.png index fa2f3852cb..11a36dbc64 100644 Binary files a/public/images/emoji/facebook_messenger/australia.png and b/public/images/emoji/facebook_messenger/australia.png differ diff --git a/public/images/emoji/facebook_messenger/austria.png b/public/images/emoji/facebook_messenger/austria.png index 54a96ff5f9..2c23d5868c 100644 Binary files a/public/images/emoji/facebook_messenger/austria.png and b/public/images/emoji/facebook_messenger/austria.png differ diff --git a/public/images/emoji/facebook_messenger/automobile.png b/public/images/emoji/facebook_messenger/automobile.png index ba661ecefd..fc9d28be27 100644 Binary files a/public/images/emoji/facebook_messenger/automobile.png and b/public/images/emoji/facebook_messenger/automobile.png differ diff --git a/public/images/emoji/facebook_messenger/avocado.png b/public/images/emoji/facebook_messenger/avocado.png index 1c54fda2c7..cdcd5a94a6 100644 Binary files a/public/images/emoji/facebook_messenger/avocado.png and b/public/images/emoji/facebook_messenger/avocado.png differ diff --git a/public/images/emoji/facebook_messenger/azerbaijan.png b/public/images/emoji/facebook_messenger/azerbaijan.png index a5689d93da..fd1f27bedf 100644 Binary files a/public/images/emoji/facebook_messenger/azerbaijan.png and b/public/images/emoji/facebook_messenger/azerbaijan.png differ diff --git a/public/images/emoji/facebook_messenger/b.png b/public/images/emoji/facebook_messenger/b.png index 9679d4109b..fd384a4fe0 100644 Binary files a/public/images/emoji/facebook_messenger/b.png and b/public/images/emoji/facebook_messenger/b.png differ diff --git a/public/images/emoji/facebook_messenger/baby.png b/public/images/emoji/facebook_messenger/baby.png index 192b1e3aa4..d69fc584aa 100644 Binary files a/public/images/emoji/facebook_messenger/baby.png and b/public/images/emoji/facebook_messenger/baby.png differ diff --git a/public/images/emoji/facebook_messenger/baby_bottle.png b/public/images/emoji/facebook_messenger/baby_bottle.png index 7ffbf050da..f2e724964c 100644 Binary files a/public/images/emoji/facebook_messenger/baby_bottle.png and b/public/images/emoji/facebook_messenger/baby_bottle.png differ diff --git a/public/images/emoji/facebook_messenger/baby_chick.png b/public/images/emoji/facebook_messenger/baby_chick.png index 35031b2b1d..7203598d78 100644 Binary files a/public/images/emoji/facebook_messenger/baby_chick.png and b/public/images/emoji/facebook_messenger/baby_chick.png differ diff --git a/public/images/emoji/facebook_messenger/baby_symbol.png b/public/images/emoji/facebook_messenger/baby_symbol.png index 29d467e1c3..4626a3e00a 100644 Binary files a/public/images/emoji/facebook_messenger/baby_symbol.png and b/public/images/emoji/facebook_messenger/baby_symbol.png differ diff --git a/public/images/emoji/facebook_messenger/back.png b/public/images/emoji/facebook_messenger/back.png index 74adb96ec8..71d2558c35 100644 Binary files a/public/images/emoji/facebook_messenger/back.png and b/public/images/emoji/facebook_messenger/back.png differ diff --git a/public/images/emoji/facebook_messenger/bacon.png b/public/images/emoji/facebook_messenger/bacon.png index a1641e680e..5ee7ea93a6 100644 Binary files a/public/images/emoji/facebook_messenger/bacon.png and b/public/images/emoji/facebook_messenger/bacon.png differ diff --git a/public/images/emoji/facebook_messenger/badger.png b/public/images/emoji/facebook_messenger/badger.png new file mode 100644 index 0000000000..3428da8863 Binary files /dev/null and b/public/images/emoji/facebook_messenger/badger.png differ diff --git a/public/images/emoji/facebook_messenger/badminton.png b/public/images/emoji/facebook_messenger/badminton.png index 6c76fb84fb..9df981ff06 100644 Binary files a/public/images/emoji/facebook_messenger/badminton.png and b/public/images/emoji/facebook_messenger/badminton.png differ diff --git a/public/images/emoji/facebook_messenger/bagel.png b/public/images/emoji/facebook_messenger/bagel.png new file mode 100644 index 0000000000..99312be2fe Binary files /dev/null and b/public/images/emoji/facebook_messenger/bagel.png differ diff --git a/public/images/emoji/facebook_messenger/baggage_claim.png b/public/images/emoji/facebook_messenger/baggage_claim.png index 1e2b83d35f..f20aa2d95e 100644 Binary files a/public/images/emoji/facebook_messenger/baggage_claim.png and b/public/images/emoji/facebook_messenger/baggage_claim.png differ diff --git a/public/images/emoji/facebook_messenger/baguette_bread.png b/public/images/emoji/facebook_messenger/baguette_bread.png index 91558c2a20..a134bd43dd 100644 Binary files a/public/images/emoji/facebook_messenger/baguette_bread.png and b/public/images/emoji/facebook_messenger/baguette_bread.png differ diff --git a/public/images/emoji/facebook_messenger/bahamas.png b/public/images/emoji/facebook_messenger/bahamas.png index ad1fccb6f0..4ba4526555 100644 Binary files a/public/images/emoji/facebook_messenger/bahamas.png and b/public/images/emoji/facebook_messenger/bahamas.png differ diff --git a/public/images/emoji/facebook_messenger/bahrain.png b/public/images/emoji/facebook_messenger/bahrain.png index 3493584047..eb654cf86e 100644 Binary files a/public/images/emoji/facebook_messenger/bahrain.png and b/public/images/emoji/facebook_messenger/bahrain.png differ diff --git a/public/images/emoji/facebook_messenger/balance_scale.png b/public/images/emoji/facebook_messenger/balance_scale.png index a9e4f53e97..9ac52d3b5d 100644 Binary files a/public/images/emoji/facebook_messenger/balance_scale.png and b/public/images/emoji/facebook_messenger/balance_scale.png differ diff --git a/public/images/emoji/facebook_messenger/balloon.png b/public/images/emoji/facebook_messenger/balloon.png index a2257da1cd..b06ab6705c 100644 Binary files a/public/images/emoji/facebook_messenger/balloon.png and b/public/images/emoji/facebook_messenger/balloon.png differ diff --git a/public/images/emoji/facebook_messenger/ballot_box.png b/public/images/emoji/facebook_messenger/ballot_box.png index 5536b98437..172d34db68 100644 Binary files a/public/images/emoji/facebook_messenger/ballot_box.png and b/public/images/emoji/facebook_messenger/ballot_box.png differ diff --git a/public/images/emoji/facebook_messenger/ballot_box_with_ballot.png b/public/images/emoji/facebook_messenger/ballot_box_with_ballot.png index 5536b98437..172d34db68 100644 Binary files a/public/images/emoji/facebook_messenger/ballot_box_with_ballot.png and b/public/images/emoji/facebook_messenger/ballot_box_with_ballot.png differ diff --git a/public/images/emoji/facebook_messenger/ballot_box_with_check.png b/public/images/emoji/facebook_messenger/ballot_box_with_check.png index ff72c53602..d06285a5b5 100644 Binary files a/public/images/emoji/facebook_messenger/ballot_box_with_check.png and b/public/images/emoji/facebook_messenger/ballot_box_with_check.png differ diff --git a/public/images/emoji/facebook_messenger/bamboo.png b/public/images/emoji/facebook_messenger/bamboo.png index 2cbf57618c..b46fb2d046 100644 Binary files a/public/images/emoji/facebook_messenger/bamboo.png and b/public/images/emoji/facebook_messenger/bamboo.png differ diff --git a/public/images/emoji/facebook_messenger/banana.png b/public/images/emoji/facebook_messenger/banana.png index 302581faf9..c37afd0802 100644 Binary files a/public/images/emoji/facebook_messenger/banana.png and b/public/images/emoji/facebook_messenger/banana.png differ diff --git a/public/images/emoji/facebook_messenger/bangbang.png b/public/images/emoji/facebook_messenger/bangbang.png index 8e9678240d..20cd905d8d 100644 Binary files a/public/images/emoji/facebook_messenger/bangbang.png and b/public/images/emoji/facebook_messenger/bangbang.png differ diff --git a/public/images/emoji/facebook_messenger/bangladesh.png b/public/images/emoji/facebook_messenger/bangladesh.png index 30cef30b4e..fcca9a28c8 100644 Binary files a/public/images/emoji/facebook_messenger/bangladesh.png and b/public/images/emoji/facebook_messenger/bangladesh.png differ diff --git a/public/images/emoji/facebook_messenger/bank.png b/public/images/emoji/facebook_messenger/bank.png index b38b5bb1e5..bd98c70005 100644 Binary files a/public/images/emoji/facebook_messenger/bank.png and b/public/images/emoji/facebook_messenger/bank.png differ diff --git a/public/images/emoji/facebook_messenger/bar_chart.png b/public/images/emoji/facebook_messenger/bar_chart.png index d9b4b6e106..ca3d2440e4 100644 Binary files a/public/images/emoji/facebook_messenger/bar_chart.png and b/public/images/emoji/facebook_messenger/bar_chart.png differ diff --git a/public/images/emoji/facebook_messenger/barbados.png b/public/images/emoji/facebook_messenger/barbados.png index 4a2d7d3050..dd5ccc4319 100644 Binary files a/public/images/emoji/facebook_messenger/barbados.png and b/public/images/emoji/facebook_messenger/barbados.png differ diff --git a/public/images/emoji/facebook_messenger/barber.png b/public/images/emoji/facebook_messenger/barber.png index 2b4c6ab305..db45c2c0e1 100644 Binary files a/public/images/emoji/facebook_messenger/barber.png and b/public/images/emoji/facebook_messenger/barber.png differ diff --git a/public/images/emoji/facebook_messenger/baseball.png b/public/images/emoji/facebook_messenger/baseball.png index f39fbbf099..3f9bfb7ee8 100644 Binary files a/public/images/emoji/facebook_messenger/baseball.png and b/public/images/emoji/facebook_messenger/baseball.png differ diff --git a/public/images/emoji/facebook_messenger/basket.png b/public/images/emoji/facebook_messenger/basket.png new file mode 100644 index 0000000000..020899092f Binary files /dev/null and b/public/images/emoji/facebook_messenger/basket.png differ diff --git a/public/images/emoji/facebook_messenger/basketball.png b/public/images/emoji/facebook_messenger/basketball.png index 702a48a1a5..1fd3a328bd 100644 Binary files a/public/images/emoji/facebook_messenger/basketball.png and b/public/images/emoji/facebook_messenger/basketball.png differ diff --git a/public/images/emoji/facebook_messenger/basketball_man.png b/public/images/emoji/facebook_messenger/basketball_man.png index fc307b60c9..f1072d2938 100644 Binary files a/public/images/emoji/facebook_messenger/basketball_man.png and b/public/images/emoji/facebook_messenger/basketball_man.png differ diff --git a/public/images/emoji/facebook_messenger/basketball_player.png b/public/images/emoji/facebook_messenger/basketball_player.png index fc307b60c9..f1072d2938 100644 Binary files a/public/images/emoji/facebook_messenger/basketball_player.png and b/public/images/emoji/facebook_messenger/basketball_player.png differ diff --git a/public/images/emoji/facebook_messenger/basketball_woman.png b/public/images/emoji/facebook_messenger/basketball_woman.png index febb3c03b6..b9a08636e5 100644 Binary files a/public/images/emoji/facebook_messenger/basketball_woman.png and b/public/images/emoji/facebook_messenger/basketball_woman.png differ diff --git a/public/images/emoji/facebook_messenger/bat.png b/public/images/emoji/facebook_messenger/bat.png index 8e046d8509..3f09fcd380 100644 Binary files a/public/images/emoji/facebook_messenger/bat.png and b/public/images/emoji/facebook_messenger/bat.png differ diff --git a/public/images/emoji/facebook_messenger/bath.png b/public/images/emoji/facebook_messenger/bath.png index ed123b48c6..a9cd28cc28 100644 Binary files a/public/images/emoji/facebook_messenger/bath.png and b/public/images/emoji/facebook_messenger/bath.png differ diff --git a/public/images/emoji/facebook_messenger/bathtub.png b/public/images/emoji/facebook_messenger/bathtub.png index 924ff3acd4..80dd14702c 100644 Binary files a/public/images/emoji/facebook_messenger/bathtub.png and b/public/images/emoji/facebook_messenger/bathtub.png differ diff --git a/public/images/emoji/facebook_messenger/battery.png b/public/images/emoji/facebook_messenger/battery.png index 2b390fa736..aeee8297bf 100644 Binary files a/public/images/emoji/facebook_messenger/battery.png and b/public/images/emoji/facebook_messenger/battery.png differ diff --git a/public/images/emoji/facebook_messenger/beach.png b/public/images/emoji/facebook_messenger/beach.png index 953bbe38d6..3a0d5c904f 100644 Binary files a/public/images/emoji/facebook_messenger/beach.png and b/public/images/emoji/facebook_messenger/beach.png differ diff --git a/public/images/emoji/facebook_messenger/beach_umbrella.png b/public/images/emoji/facebook_messenger/beach_umbrella.png index 953bbe38d6..3a0d5c904f 100644 Binary files a/public/images/emoji/facebook_messenger/beach_umbrella.png and b/public/images/emoji/facebook_messenger/beach_umbrella.png differ diff --git a/public/images/emoji/facebook_messenger/beach_with_umbrella.png b/public/images/emoji/facebook_messenger/beach_with_umbrella.png index 953bbe38d6..3a0d5c904f 100644 Binary files a/public/images/emoji/facebook_messenger/beach_with_umbrella.png and b/public/images/emoji/facebook_messenger/beach_with_umbrella.png differ diff --git a/public/images/emoji/facebook_messenger/bear.png b/public/images/emoji/facebook_messenger/bear.png index 5622d9c5ca..d342c14f34 100644 Binary files a/public/images/emoji/facebook_messenger/bear.png and b/public/images/emoji/facebook_messenger/bear.png differ diff --git a/public/images/emoji/facebook_messenger/bearded_person.png b/public/images/emoji/facebook_messenger/bearded_person.png index d43b7a1124..6c44e56668 100644 Binary files a/public/images/emoji/facebook_messenger/bearded_person.png and b/public/images/emoji/facebook_messenger/bearded_person.png differ diff --git a/public/images/emoji/facebook_messenger/bed.png b/public/images/emoji/facebook_messenger/bed.png index fb92a4795b..b295bf9290 100644 Binary files a/public/images/emoji/facebook_messenger/bed.png and b/public/images/emoji/facebook_messenger/bed.png differ diff --git a/public/images/emoji/facebook_messenger/bee.png b/public/images/emoji/facebook_messenger/bee.png index 649181cf28..74b0b41098 100644 Binary files a/public/images/emoji/facebook_messenger/bee.png and b/public/images/emoji/facebook_messenger/bee.png differ diff --git a/public/images/emoji/facebook_messenger/beer.png b/public/images/emoji/facebook_messenger/beer.png index 7a4c1270f2..5f121da5b0 100644 Binary files a/public/images/emoji/facebook_messenger/beer.png and b/public/images/emoji/facebook_messenger/beer.png differ diff --git a/public/images/emoji/facebook_messenger/beers.png b/public/images/emoji/facebook_messenger/beers.png index b2a335ec47..84d197939f 100644 Binary files a/public/images/emoji/facebook_messenger/beers.png and b/public/images/emoji/facebook_messenger/beers.png differ diff --git a/public/images/emoji/facebook_messenger/beetle.png b/public/images/emoji/facebook_messenger/beetle.png index 03698c3175..0826eec54c 100644 Binary files a/public/images/emoji/facebook_messenger/beetle.png and b/public/images/emoji/facebook_messenger/beetle.png differ diff --git a/public/images/emoji/facebook_messenger/beginner.png b/public/images/emoji/facebook_messenger/beginner.png index 61fd22318d..3e6d2eb590 100644 Binary files a/public/images/emoji/facebook_messenger/beginner.png and b/public/images/emoji/facebook_messenger/beginner.png differ diff --git a/public/images/emoji/facebook_messenger/belarus.png b/public/images/emoji/facebook_messenger/belarus.png index 18bec8aa65..5c67831abb 100644 Binary files a/public/images/emoji/facebook_messenger/belarus.png and b/public/images/emoji/facebook_messenger/belarus.png differ diff --git a/public/images/emoji/facebook_messenger/belgium.png b/public/images/emoji/facebook_messenger/belgium.png index e73dfdf9b4..216355faf7 100644 Binary files a/public/images/emoji/facebook_messenger/belgium.png and b/public/images/emoji/facebook_messenger/belgium.png differ diff --git a/public/images/emoji/facebook_messenger/belize.png b/public/images/emoji/facebook_messenger/belize.png index b2b1118cbf..36890c04e7 100644 Binary files a/public/images/emoji/facebook_messenger/belize.png and b/public/images/emoji/facebook_messenger/belize.png differ diff --git a/public/images/emoji/facebook_messenger/bell.png b/public/images/emoji/facebook_messenger/bell.png index 6bce010523..eca956e154 100644 Binary files a/public/images/emoji/facebook_messenger/bell.png and b/public/images/emoji/facebook_messenger/bell.png differ diff --git a/public/images/emoji/facebook_messenger/bellhop.png b/public/images/emoji/facebook_messenger/bellhop.png index 6d356446ff..c1c7d783c8 100644 Binary files a/public/images/emoji/facebook_messenger/bellhop.png and b/public/images/emoji/facebook_messenger/bellhop.png differ diff --git a/public/images/emoji/facebook_messenger/bellhop_bell.png b/public/images/emoji/facebook_messenger/bellhop_bell.png index 6d356446ff..c1c7d783c8 100644 Binary files a/public/images/emoji/facebook_messenger/bellhop_bell.png and b/public/images/emoji/facebook_messenger/bellhop_bell.png differ diff --git a/public/images/emoji/facebook_messenger/benin.png b/public/images/emoji/facebook_messenger/benin.png index 8886562e35..d1f4fd3b48 100644 Binary files a/public/images/emoji/facebook_messenger/benin.png and b/public/images/emoji/facebook_messenger/benin.png differ diff --git a/public/images/emoji/facebook_messenger/bento.png b/public/images/emoji/facebook_messenger/bento.png index b67d8ba257..1143124991 100644 Binary files a/public/images/emoji/facebook_messenger/bento.png and b/public/images/emoji/facebook_messenger/bento.png differ diff --git a/public/images/emoji/facebook_messenger/bermuda.png b/public/images/emoji/facebook_messenger/bermuda.png index 2dd999ea25..8bce082cf4 100644 Binary files a/public/images/emoji/facebook_messenger/bermuda.png and b/public/images/emoji/facebook_messenger/bermuda.png differ diff --git a/public/images/emoji/facebook_messenger/bhutan.png b/public/images/emoji/facebook_messenger/bhutan.png index 0d670c8383..70b49f38bb 100644 Binary files a/public/images/emoji/facebook_messenger/bhutan.png and b/public/images/emoji/facebook_messenger/bhutan.png differ diff --git a/public/images/emoji/facebook_messenger/bicyclist.png b/public/images/emoji/facebook_messenger/bicyclist.png index 9866c2131c..41373d64dc 100644 Binary files a/public/images/emoji/facebook_messenger/bicyclist.png and b/public/images/emoji/facebook_messenger/bicyclist.png differ diff --git a/public/images/emoji/facebook_messenger/bike.png b/public/images/emoji/facebook_messenger/bike.png index 5e72b9eb62..7caca01760 100644 Binary files a/public/images/emoji/facebook_messenger/bike.png and b/public/images/emoji/facebook_messenger/bike.png differ diff --git a/public/images/emoji/facebook_messenger/biking_man.png b/public/images/emoji/facebook_messenger/biking_man.png index 9866c2131c..41373d64dc 100644 Binary files a/public/images/emoji/facebook_messenger/biking_man.png and b/public/images/emoji/facebook_messenger/biking_man.png differ diff --git a/public/images/emoji/facebook_messenger/biking_woman.png b/public/images/emoji/facebook_messenger/biking_woman.png index 3980ebe622..fae006e507 100644 Binary files a/public/images/emoji/facebook_messenger/biking_woman.png and b/public/images/emoji/facebook_messenger/biking_woman.png differ diff --git a/public/images/emoji/facebook_messenger/bikini.png b/public/images/emoji/facebook_messenger/bikini.png index 0efa62c324..d98fa589c6 100644 Binary files a/public/images/emoji/facebook_messenger/bikini.png and b/public/images/emoji/facebook_messenger/bikini.png differ diff --git a/public/images/emoji/facebook_messenger/billed_cap.png b/public/images/emoji/facebook_messenger/billed_cap.png index dae491812e..009604b598 100644 Binary files a/public/images/emoji/facebook_messenger/billed_cap.png and b/public/images/emoji/facebook_messenger/billed_cap.png differ diff --git a/public/images/emoji/facebook_messenger/biohazard.png b/public/images/emoji/facebook_messenger/biohazard.png index d9ebf1c044..aa5ac7e0be 100644 Binary files a/public/images/emoji/facebook_messenger/biohazard.png and b/public/images/emoji/facebook_messenger/biohazard.png differ diff --git a/public/images/emoji/facebook_messenger/biohazard_sign.png b/public/images/emoji/facebook_messenger/biohazard_sign.png index d9ebf1c044..aa5ac7e0be 100644 Binary files a/public/images/emoji/facebook_messenger/biohazard_sign.png and b/public/images/emoji/facebook_messenger/biohazard_sign.png differ diff --git a/public/images/emoji/facebook_messenger/bird.png b/public/images/emoji/facebook_messenger/bird.png index 549fc66244..577f2ca426 100644 Binary files a/public/images/emoji/facebook_messenger/bird.png and b/public/images/emoji/facebook_messenger/bird.png differ diff --git a/public/images/emoji/facebook_messenger/birthday.png b/public/images/emoji/facebook_messenger/birthday.png index ee788fa455..64c4b80f7c 100644 Binary files a/public/images/emoji/facebook_messenger/birthday.png and b/public/images/emoji/facebook_messenger/birthday.png differ diff --git a/public/images/emoji/facebook_messenger/black_circle.png b/public/images/emoji/facebook_messenger/black_circle.png index 426b5c11ef..e2d80d883d 100644 Binary files a/public/images/emoji/facebook_messenger/black_circle.png and b/public/images/emoji/facebook_messenger/black_circle.png differ diff --git a/public/images/emoji/facebook_messenger/black_flag.png b/public/images/emoji/facebook_messenger/black_flag.png index bc52913998..cf62460cc1 100644 Binary files a/public/images/emoji/facebook_messenger/black_flag.png and b/public/images/emoji/facebook_messenger/black_flag.png differ diff --git a/public/images/emoji/facebook_messenger/black_heart.png b/public/images/emoji/facebook_messenger/black_heart.png index 7a582c18a8..faa18d4b56 100644 Binary files a/public/images/emoji/facebook_messenger/black_heart.png and b/public/images/emoji/facebook_messenger/black_heart.png differ diff --git a/public/images/emoji/facebook_messenger/black_joker.png b/public/images/emoji/facebook_messenger/black_joker.png index 7a45907304..d04c626a29 100644 Binary files a/public/images/emoji/facebook_messenger/black_joker.png and b/public/images/emoji/facebook_messenger/black_joker.png differ diff --git a/public/images/emoji/facebook_messenger/black_large_square.png b/public/images/emoji/facebook_messenger/black_large_square.png index 302a41b45e..69ddcc6fec 100644 Binary files a/public/images/emoji/facebook_messenger/black_large_square.png and b/public/images/emoji/facebook_messenger/black_large_square.png differ diff --git a/public/images/emoji/facebook_messenger/black_medium_small_square.png b/public/images/emoji/facebook_messenger/black_medium_small_square.png index cb53eac3bc..4f33e6dbc9 100644 Binary files a/public/images/emoji/facebook_messenger/black_medium_small_square.png and b/public/images/emoji/facebook_messenger/black_medium_small_square.png differ diff --git a/public/images/emoji/facebook_messenger/black_medium_square.png b/public/images/emoji/facebook_messenger/black_medium_square.png index 21e0c608e7..305137a575 100644 Binary files a/public/images/emoji/facebook_messenger/black_medium_square.png and b/public/images/emoji/facebook_messenger/black_medium_square.png differ diff --git a/public/images/emoji/facebook_messenger/black_nib.png b/public/images/emoji/facebook_messenger/black_nib.png index 531ca55087..6b633bd31d 100644 Binary files a/public/images/emoji/facebook_messenger/black_nib.png and b/public/images/emoji/facebook_messenger/black_nib.png differ diff --git a/public/images/emoji/facebook_messenger/black_small_square.png b/public/images/emoji/facebook_messenger/black_small_square.png index 9354131059..cf7cb2374d 100644 Binary files a/public/images/emoji/facebook_messenger/black_small_square.png and b/public/images/emoji/facebook_messenger/black_small_square.png differ diff --git a/public/images/emoji/facebook_messenger/black_square_button.png b/public/images/emoji/facebook_messenger/black_square_button.png index 29c9e13885..d1902a6130 100644 Binary files a/public/images/emoji/facebook_messenger/black_square_button.png and b/public/images/emoji/facebook_messenger/black_square_button.png differ diff --git a/public/images/emoji/facebook_messenger/blonde_man.png b/public/images/emoji/facebook_messenger/blonde_man.png index f19dc6ff1d..98f74f2634 100644 Binary files a/public/images/emoji/facebook_messenger/blonde_man.png and b/public/images/emoji/facebook_messenger/blonde_man.png differ diff --git a/public/images/emoji/facebook_messenger/blonde_woman.png b/public/images/emoji/facebook_messenger/blonde_woman.png index cb1c51ac23..1a8cb66c8c 100644 Binary files a/public/images/emoji/facebook_messenger/blonde_woman.png and b/public/images/emoji/facebook_messenger/blonde_woman.png differ diff --git a/public/images/emoji/facebook_messenger/blossom.png b/public/images/emoji/facebook_messenger/blossom.png index a2a7b6db3c..6d0e71a38a 100644 Binary files a/public/images/emoji/facebook_messenger/blossom.png and b/public/images/emoji/facebook_messenger/blossom.png differ diff --git a/public/images/emoji/facebook_messenger/blowfish.png b/public/images/emoji/facebook_messenger/blowfish.png index 828264cc85..827716feab 100644 Binary files a/public/images/emoji/facebook_messenger/blowfish.png and b/public/images/emoji/facebook_messenger/blowfish.png differ diff --git a/public/images/emoji/facebook_messenger/blue_book.png b/public/images/emoji/facebook_messenger/blue_book.png index 4423cca14d..139d91d42f 100644 Binary files a/public/images/emoji/facebook_messenger/blue_book.png and b/public/images/emoji/facebook_messenger/blue_book.png differ diff --git a/public/images/emoji/facebook_messenger/blue_car.png b/public/images/emoji/facebook_messenger/blue_car.png index b48a962405..6580015f37 100644 Binary files a/public/images/emoji/facebook_messenger/blue_car.png and b/public/images/emoji/facebook_messenger/blue_car.png differ diff --git a/public/images/emoji/facebook_messenger/blue_heart.png b/public/images/emoji/facebook_messenger/blue_heart.png index 6f707d91a8..12f7dd3002 100644 Binary files a/public/images/emoji/facebook_messenger/blue_heart.png and b/public/images/emoji/facebook_messenger/blue_heart.png differ diff --git a/public/images/emoji/facebook_messenger/blush.png b/public/images/emoji/facebook_messenger/blush.png index 1d15bde80b..f7094b2f2a 100644 Binary files a/public/images/emoji/facebook_messenger/blush.png and b/public/images/emoji/facebook_messenger/blush.png differ diff --git a/public/images/emoji/facebook_messenger/boar.png b/public/images/emoji/facebook_messenger/boar.png index 22967fe532..40c63c9fd0 100644 Binary files a/public/images/emoji/facebook_messenger/boar.png and b/public/images/emoji/facebook_messenger/boar.png differ diff --git a/public/images/emoji/facebook_messenger/boat.png b/public/images/emoji/facebook_messenger/boat.png index d17e9287e5..b47e2f413d 100644 Binary files a/public/images/emoji/facebook_messenger/boat.png and b/public/images/emoji/facebook_messenger/boat.png differ diff --git a/public/images/emoji/facebook_messenger/bolivia.png b/public/images/emoji/facebook_messenger/bolivia.png index bb8c24688b..811c99d28d 100644 Binary files a/public/images/emoji/facebook_messenger/bolivia.png and b/public/images/emoji/facebook_messenger/bolivia.png differ diff --git a/public/images/emoji/facebook_messenger/bomb.png b/public/images/emoji/facebook_messenger/bomb.png index b08b877e95..82ceaadf65 100644 Binary files a/public/images/emoji/facebook_messenger/bomb.png and b/public/images/emoji/facebook_messenger/bomb.png differ diff --git a/public/images/emoji/facebook_messenger/bone.png b/public/images/emoji/facebook_messenger/bone.png new file mode 100644 index 0000000000..0b54e2b72a Binary files /dev/null and b/public/images/emoji/facebook_messenger/bone.png differ diff --git a/public/images/emoji/facebook_messenger/book.png b/public/images/emoji/facebook_messenger/book.png index 724a71aeb9..2302f835c4 100644 Binary files a/public/images/emoji/facebook_messenger/book.png and b/public/images/emoji/facebook_messenger/book.png differ diff --git a/public/images/emoji/facebook_messenger/bookmark.png b/public/images/emoji/facebook_messenger/bookmark.png index 2667d0cf46..a0b02d36f8 100644 Binary files a/public/images/emoji/facebook_messenger/bookmark.png and b/public/images/emoji/facebook_messenger/bookmark.png differ diff --git a/public/images/emoji/facebook_messenger/bookmark_tabs.png b/public/images/emoji/facebook_messenger/bookmark_tabs.png index d631d3c536..c66942c515 100644 Binary files a/public/images/emoji/facebook_messenger/bookmark_tabs.png and b/public/images/emoji/facebook_messenger/bookmark_tabs.png differ diff --git a/public/images/emoji/facebook_messenger/books.png b/public/images/emoji/facebook_messenger/books.png index f8411f5717..a4c47bc8bb 100644 Binary files a/public/images/emoji/facebook_messenger/books.png and b/public/images/emoji/facebook_messenger/books.png differ diff --git a/public/images/emoji/facebook_messenger/boom.png b/public/images/emoji/facebook_messenger/boom.png index 04269ded8c..181e68bf81 100644 Binary files a/public/images/emoji/facebook_messenger/boom.png and b/public/images/emoji/facebook_messenger/boom.png differ diff --git a/public/images/emoji/facebook_messenger/boot.png b/public/images/emoji/facebook_messenger/boot.png index 9b6e9c76c0..0132007c3d 100644 Binary files a/public/images/emoji/facebook_messenger/boot.png and b/public/images/emoji/facebook_messenger/boot.png differ diff --git a/public/images/emoji/facebook_messenger/bosnia_herzegovina.png b/public/images/emoji/facebook_messenger/bosnia_herzegovina.png index bd99de522c..842e932896 100644 Binary files a/public/images/emoji/facebook_messenger/bosnia_herzegovina.png and b/public/images/emoji/facebook_messenger/bosnia_herzegovina.png differ diff --git a/public/images/emoji/facebook_messenger/botswana.png b/public/images/emoji/facebook_messenger/botswana.png index 80636409e1..d690d4b7a3 100644 Binary files a/public/images/emoji/facebook_messenger/botswana.png and b/public/images/emoji/facebook_messenger/botswana.png differ diff --git a/public/images/emoji/facebook_messenger/bottle_with_popping_cork.png b/public/images/emoji/facebook_messenger/bottle_with_popping_cork.png index 428019d382..72bbaefc48 100644 Binary files a/public/images/emoji/facebook_messenger/bottle_with_popping_cork.png and b/public/images/emoji/facebook_messenger/bottle_with_popping_cork.png differ diff --git a/public/images/emoji/facebook_messenger/bouquet.png b/public/images/emoji/facebook_messenger/bouquet.png index 35bf8501a6..9b2a72984c 100644 Binary files a/public/images/emoji/facebook_messenger/bouquet.png and b/public/images/emoji/facebook_messenger/bouquet.png differ diff --git a/public/images/emoji/facebook_messenger/bouvet_island.png b/public/images/emoji/facebook_messenger/bouvet_island.png index d2cd8f67f2..9d31676eba 100644 Binary files a/public/images/emoji/facebook_messenger/bouvet_island.png and b/public/images/emoji/facebook_messenger/bouvet_island.png differ diff --git a/public/images/emoji/facebook_messenger/bow.png b/public/images/emoji/facebook_messenger/bow.png index d2ca3b5c9c..1a19b50ec9 100644 Binary files a/public/images/emoji/facebook_messenger/bow.png and b/public/images/emoji/facebook_messenger/bow.png differ diff --git a/public/images/emoji/facebook_messenger/bow_and_arrow.png b/public/images/emoji/facebook_messenger/bow_and_arrow.png index eba0a0deeb..f4ff1803ad 100644 Binary files a/public/images/emoji/facebook_messenger/bow_and_arrow.png and b/public/images/emoji/facebook_messenger/bow_and_arrow.png differ diff --git a/public/images/emoji/facebook_messenger/bowing_man.png b/public/images/emoji/facebook_messenger/bowing_man.png index d2ca3b5c9c..1a19b50ec9 100644 Binary files a/public/images/emoji/facebook_messenger/bowing_man.png and b/public/images/emoji/facebook_messenger/bowing_man.png differ diff --git a/public/images/emoji/facebook_messenger/bowing_woman.png b/public/images/emoji/facebook_messenger/bowing_woman.png index 7b2cefa342..64f931e3ff 100644 Binary files a/public/images/emoji/facebook_messenger/bowing_woman.png and b/public/images/emoji/facebook_messenger/bowing_woman.png differ diff --git a/public/images/emoji/facebook_messenger/bowl_with_spoon.png b/public/images/emoji/facebook_messenger/bowl_with_spoon.png index d8c2f02a72..275a57c45c 100644 Binary files a/public/images/emoji/facebook_messenger/bowl_with_spoon.png and b/public/images/emoji/facebook_messenger/bowl_with_spoon.png differ diff --git a/public/images/emoji/facebook_messenger/bowling.png b/public/images/emoji/facebook_messenger/bowling.png index 4848c6d193..899d245f95 100644 Binary files a/public/images/emoji/facebook_messenger/bowling.png and b/public/images/emoji/facebook_messenger/bowling.png differ diff --git a/public/images/emoji/facebook_messenger/boxing_glove.png b/public/images/emoji/facebook_messenger/boxing_glove.png index a95603e47c..69ca27b054 100644 Binary files a/public/images/emoji/facebook_messenger/boxing_glove.png and b/public/images/emoji/facebook_messenger/boxing_glove.png differ diff --git a/public/images/emoji/facebook_messenger/boy.png b/public/images/emoji/facebook_messenger/boy.png index 5c511ccc33..0c5bf4dd70 100644 Binary files a/public/images/emoji/facebook_messenger/boy.png and b/public/images/emoji/facebook_messenger/boy.png differ diff --git a/public/images/emoji/facebook_messenger/brain.png b/public/images/emoji/facebook_messenger/brain.png index 76b43744dc..a4d40b4977 100644 Binary files a/public/images/emoji/facebook_messenger/brain.png and b/public/images/emoji/facebook_messenger/brain.png differ diff --git a/public/images/emoji/facebook_messenger/brazil.png b/public/images/emoji/facebook_messenger/brazil.png index e620c5eb37..730742dea2 100644 Binary files a/public/images/emoji/facebook_messenger/brazil.png and b/public/images/emoji/facebook_messenger/brazil.png differ diff --git a/public/images/emoji/facebook_messenger/bread.png b/public/images/emoji/facebook_messenger/bread.png index e11f314c2d..214dc3dd3b 100644 Binary files a/public/images/emoji/facebook_messenger/bread.png and b/public/images/emoji/facebook_messenger/bread.png differ diff --git a/public/images/emoji/facebook_messenger/breast_feeding.png b/public/images/emoji/facebook_messenger/breast_feeding.png index c3a78fdfc5..0fc9b0b60c 100644 Binary files a/public/images/emoji/facebook_messenger/breast_feeding.png and b/public/images/emoji/facebook_messenger/breast_feeding.png differ diff --git a/public/images/emoji/facebook_messenger/brick.png b/public/images/emoji/facebook_messenger/brick.png new file mode 100644 index 0000000000..5b87f50c8d Binary files /dev/null and b/public/images/emoji/facebook_messenger/brick.png differ diff --git a/public/images/emoji/facebook_messenger/bride_with_veil.png b/public/images/emoji/facebook_messenger/bride_with_veil.png index 7a8894f5bf..ff6b8f5e19 100644 Binary files a/public/images/emoji/facebook_messenger/bride_with_veil.png and b/public/images/emoji/facebook_messenger/bride_with_veil.png differ diff --git a/public/images/emoji/facebook_messenger/bridge_at_night.png b/public/images/emoji/facebook_messenger/bridge_at_night.png index cd7ad472eb..773f15666c 100644 Binary files a/public/images/emoji/facebook_messenger/bridge_at_night.png and b/public/images/emoji/facebook_messenger/bridge_at_night.png differ diff --git a/public/images/emoji/facebook_messenger/briefcase.png b/public/images/emoji/facebook_messenger/briefcase.png index 8c63d39e4c..7832315e02 100644 Binary files a/public/images/emoji/facebook_messenger/briefcase.png and b/public/images/emoji/facebook_messenger/briefcase.png differ diff --git a/public/images/emoji/facebook_messenger/british_indian_ocean_territory.png b/public/images/emoji/facebook_messenger/british_indian_ocean_territory.png index 2c48fa114c..be9644c369 100644 Binary files a/public/images/emoji/facebook_messenger/british_indian_ocean_territory.png and b/public/images/emoji/facebook_messenger/british_indian_ocean_territory.png differ diff --git a/public/images/emoji/facebook_messenger/british_virgin_islands.png b/public/images/emoji/facebook_messenger/british_virgin_islands.png index 039c5f6617..b49114c924 100644 Binary files a/public/images/emoji/facebook_messenger/british_virgin_islands.png and b/public/images/emoji/facebook_messenger/british_virgin_islands.png differ diff --git a/public/images/emoji/facebook_messenger/broccoli.png b/public/images/emoji/facebook_messenger/broccoli.png index 350b31d138..5a5d6d53e4 100644 Binary files a/public/images/emoji/facebook_messenger/broccoli.png and b/public/images/emoji/facebook_messenger/broccoli.png differ diff --git a/public/images/emoji/facebook_messenger/broken_heart.png b/public/images/emoji/facebook_messenger/broken_heart.png index 08d023a94a..15d1d4cb6b 100644 Binary files a/public/images/emoji/facebook_messenger/broken_heart.png and b/public/images/emoji/facebook_messenger/broken_heart.png differ diff --git a/public/images/emoji/facebook_messenger/broom.png b/public/images/emoji/facebook_messenger/broom.png new file mode 100644 index 0000000000..88fe3eeb3b Binary files /dev/null and b/public/images/emoji/facebook_messenger/broom.png differ diff --git a/public/images/emoji/facebook_messenger/brunei.png b/public/images/emoji/facebook_messenger/brunei.png index 9cc73ebf71..b8f79123e1 100644 Binary files a/public/images/emoji/facebook_messenger/brunei.png and b/public/images/emoji/facebook_messenger/brunei.png differ diff --git a/public/images/emoji/facebook_messenger/bug.png b/public/images/emoji/facebook_messenger/bug.png index c0990ce9b0..db38b3f455 100644 Binary files a/public/images/emoji/facebook_messenger/bug.png and b/public/images/emoji/facebook_messenger/bug.png differ diff --git a/public/images/emoji/facebook_messenger/building_construction.png b/public/images/emoji/facebook_messenger/building_construction.png index 74cd30792b..0d44b346d5 100644 Binary files a/public/images/emoji/facebook_messenger/building_construction.png and b/public/images/emoji/facebook_messenger/building_construction.png differ diff --git a/public/images/emoji/facebook_messenger/bulb.png b/public/images/emoji/facebook_messenger/bulb.png index f018dd1e1b..545a0bd7db 100644 Binary files a/public/images/emoji/facebook_messenger/bulb.png and b/public/images/emoji/facebook_messenger/bulb.png differ diff --git a/public/images/emoji/facebook_messenger/bulgaria.png b/public/images/emoji/facebook_messenger/bulgaria.png index e82767d588..f6a3c76109 100644 Binary files a/public/images/emoji/facebook_messenger/bulgaria.png and b/public/images/emoji/facebook_messenger/bulgaria.png differ diff --git a/public/images/emoji/facebook_messenger/bullettrain_front.png b/public/images/emoji/facebook_messenger/bullettrain_front.png index 415d45cf36..4e07e0eda6 100644 Binary files a/public/images/emoji/facebook_messenger/bullettrain_front.png and b/public/images/emoji/facebook_messenger/bullettrain_front.png differ diff --git a/public/images/emoji/facebook_messenger/bullettrain_side.png b/public/images/emoji/facebook_messenger/bullettrain_side.png index 100c02226f..26428946c7 100644 Binary files a/public/images/emoji/facebook_messenger/bullettrain_side.png and b/public/images/emoji/facebook_messenger/bullettrain_side.png differ diff --git a/public/images/emoji/facebook_messenger/burkina_faso.png b/public/images/emoji/facebook_messenger/burkina_faso.png index 5f56200865..c31dfb8e39 100644 Binary files a/public/images/emoji/facebook_messenger/burkina_faso.png and b/public/images/emoji/facebook_messenger/burkina_faso.png differ diff --git a/public/images/emoji/facebook_messenger/burrito.png b/public/images/emoji/facebook_messenger/burrito.png index f9bf2b0fae..fd6ba906b2 100644 Binary files a/public/images/emoji/facebook_messenger/burrito.png and b/public/images/emoji/facebook_messenger/burrito.png differ diff --git a/public/images/emoji/facebook_messenger/burundi.png b/public/images/emoji/facebook_messenger/burundi.png index 55eedeabd4..b1eaf64791 100644 Binary files a/public/images/emoji/facebook_messenger/burundi.png and b/public/images/emoji/facebook_messenger/burundi.png differ diff --git a/public/images/emoji/facebook_messenger/bus.png b/public/images/emoji/facebook_messenger/bus.png index 6a253e989d..66f99916fd 100644 Binary files a/public/images/emoji/facebook_messenger/bus.png and b/public/images/emoji/facebook_messenger/bus.png differ diff --git a/public/images/emoji/facebook_messenger/business_suit_levitating.png b/public/images/emoji/facebook_messenger/business_suit_levitating.png index 12436f9888..dc6148caa7 100644 Binary files a/public/images/emoji/facebook_messenger/business_suit_levitating.png and b/public/images/emoji/facebook_messenger/business_suit_levitating.png differ diff --git a/public/images/emoji/facebook_messenger/busstop.png b/public/images/emoji/facebook_messenger/busstop.png index 5f0c87e31c..a2ac24c600 100644 Binary files a/public/images/emoji/facebook_messenger/busstop.png and b/public/images/emoji/facebook_messenger/busstop.png differ diff --git a/public/images/emoji/facebook_messenger/bust_in_silhouette.png b/public/images/emoji/facebook_messenger/bust_in_silhouette.png index 67ea131957..4655dac4f5 100644 Binary files a/public/images/emoji/facebook_messenger/bust_in_silhouette.png and b/public/images/emoji/facebook_messenger/bust_in_silhouette.png differ diff --git a/public/images/emoji/facebook_messenger/busts_in_silhouette.png b/public/images/emoji/facebook_messenger/busts_in_silhouette.png index 72ec2d844a..10a798d742 100644 Binary files a/public/images/emoji/facebook_messenger/busts_in_silhouette.png and b/public/images/emoji/facebook_messenger/busts_in_silhouette.png differ diff --git a/public/images/emoji/facebook_messenger/butterfly.png b/public/images/emoji/facebook_messenger/butterfly.png index b2c9a28a08..d34623a7cc 100644 Binary files a/public/images/emoji/facebook_messenger/butterfly.png and b/public/images/emoji/facebook_messenger/butterfly.png differ diff --git a/public/images/emoji/facebook_messenger/cactus.png b/public/images/emoji/facebook_messenger/cactus.png index ba88add8c0..43261b3078 100644 Binary files a/public/images/emoji/facebook_messenger/cactus.png and b/public/images/emoji/facebook_messenger/cactus.png differ diff --git a/public/images/emoji/facebook_messenger/cake.png b/public/images/emoji/facebook_messenger/cake.png index 379bd5b920..5f41cdf08c 100644 Binary files a/public/images/emoji/facebook_messenger/cake.png and b/public/images/emoji/facebook_messenger/cake.png differ diff --git a/public/images/emoji/facebook_messenger/calendar.png b/public/images/emoji/facebook_messenger/calendar.png index 3eb35553ee..9cc402e3b9 100644 Binary files a/public/images/emoji/facebook_messenger/calendar.png and b/public/images/emoji/facebook_messenger/calendar.png differ diff --git a/public/images/emoji/facebook_messenger/calendar_spiral.png b/public/images/emoji/facebook_messenger/calendar_spiral.png index ee07d24cb1..9c93fa0996 100644 Binary files a/public/images/emoji/facebook_messenger/calendar_spiral.png and b/public/images/emoji/facebook_messenger/calendar_spiral.png differ diff --git a/public/images/emoji/facebook_messenger/call_me_hand.png b/public/images/emoji/facebook_messenger/call_me_hand.png index b6167359c4..6763865e40 100644 Binary files a/public/images/emoji/facebook_messenger/call_me_hand.png and b/public/images/emoji/facebook_messenger/call_me_hand.png differ diff --git a/public/images/emoji/facebook_messenger/calling.png b/public/images/emoji/facebook_messenger/calling.png index bebcdc4bc6..ec63af8bdd 100644 Binary files a/public/images/emoji/facebook_messenger/calling.png and b/public/images/emoji/facebook_messenger/calling.png differ diff --git a/public/images/emoji/facebook_messenger/cambodia.png b/public/images/emoji/facebook_messenger/cambodia.png index 9ae1378cdd..4a30046642 100644 Binary files a/public/images/emoji/facebook_messenger/cambodia.png and b/public/images/emoji/facebook_messenger/cambodia.png differ diff --git a/public/images/emoji/facebook_messenger/camel.png b/public/images/emoji/facebook_messenger/camel.png index 929b1d55a0..2a887cbca1 100644 Binary files a/public/images/emoji/facebook_messenger/camel.png and b/public/images/emoji/facebook_messenger/camel.png differ diff --git a/public/images/emoji/facebook_messenger/camera.png b/public/images/emoji/facebook_messenger/camera.png index 3e815fdce7..653e4603cc 100644 Binary files a/public/images/emoji/facebook_messenger/camera.png and b/public/images/emoji/facebook_messenger/camera.png differ diff --git a/public/images/emoji/facebook_messenger/camera_flash.png b/public/images/emoji/facebook_messenger/camera_flash.png index 868eae6a70..b4896ab78c 100644 Binary files a/public/images/emoji/facebook_messenger/camera_flash.png and b/public/images/emoji/facebook_messenger/camera_flash.png differ diff --git a/public/images/emoji/facebook_messenger/camera_with_flash.png b/public/images/emoji/facebook_messenger/camera_with_flash.png index 868eae6a70..b4896ab78c 100644 Binary files a/public/images/emoji/facebook_messenger/camera_with_flash.png and b/public/images/emoji/facebook_messenger/camera_with_flash.png differ diff --git a/public/images/emoji/facebook_messenger/cameroon.png b/public/images/emoji/facebook_messenger/cameroon.png index 38777f3dd2..68a2f38d63 100644 Binary files a/public/images/emoji/facebook_messenger/cameroon.png and b/public/images/emoji/facebook_messenger/cameroon.png differ diff --git a/public/images/emoji/facebook_messenger/camping.png b/public/images/emoji/facebook_messenger/camping.png index c77eb36e6e..9f35cdbbab 100644 Binary files a/public/images/emoji/facebook_messenger/camping.png and b/public/images/emoji/facebook_messenger/camping.png differ diff --git a/public/images/emoji/facebook_messenger/canada.png b/public/images/emoji/facebook_messenger/canada.png index 846e0f2cda..414624c225 100644 Binary files a/public/images/emoji/facebook_messenger/canada.png and b/public/images/emoji/facebook_messenger/canada.png differ diff --git a/public/images/emoji/facebook_messenger/canary_islands.png b/public/images/emoji/facebook_messenger/canary_islands.png index 6bd488163d..516f76364a 100644 Binary files a/public/images/emoji/facebook_messenger/canary_islands.png and b/public/images/emoji/facebook_messenger/canary_islands.png differ diff --git a/public/images/emoji/facebook_messenger/cancer.png b/public/images/emoji/facebook_messenger/cancer.png index afd6e4cd9f..890de13b8e 100644 Binary files a/public/images/emoji/facebook_messenger/cancer.png and b/public/images/emoji/facebook_messenger/cancer.png differ diff --git a/public/images/emoji/facebook_messenger/candle.png b/public/images/emoji/facebook_messenger/candle.png index ed5e789952..f9dacace24 100644 Binary files a/public/images/emoji/facebook_messenger/candle.png and b/public/images/emoji/facebook_messenger/candle.png differ diff --git a/public/images/emoji/facebook_messenger/candy.png b/public/images/emoji/facebook_messenger/candy.png index 5c66cf87f0..f29d04fcc8 100644 Binary files a/public/images/emoji/facebook_messenger/candy.png and b/public/images/emoji/facebook_messenger/candy.png differ diff --git a/public/images/emoji/facebook_messenger/canned_food.png b/public/images/emoji/facebook_messenger/canned_food.png index 74b5ad355e..747e5cc9cb 100644 Binary files a/public/images/emoji/facebook_messenger/canned_food.png and b/public/images/emoji/facebook_messenger/canned_food.png differ diff --git a/public/images/emoji/facebook_messenger/canoe.png b/public/images/emoji/facebook_messenger/canoe.png index e7dfc9fcc8..ca93102bf5 100644 Binary files a/public/images/emoji/facebook_messenger/canoe.png and b/public/images/emoji/facebook_messenger/canoe.png differ diff --git a/public/images/emoji/facebook_messenger/cape_verde.png b/public/images/emoji/facebook_messenger/cape_verde.png index 64efb89b75..59c1b76c2d 100644 Binary files a/public/images/emoji/facebook_messenger/cape_verde.png and b/public/images/emoji/facebook_messenger/cape_verde.png differ diff --git a/public/images/emoji/facebook_messenger/capital_abcd.png b/public/images/emoji/facebook_messenger/capital_abcd.png index 7a5024cc86..b230997725 100644 Binary files a/public/images/emoji/facebook_messenger/capital_abcd.png and b/public/images/emoji/facebook_messenger/capital_abcd.png differ diff --git a/public/images/emoji/facebook_messenger/capricorn.png b/public/images/emoji/facebook_messenger/capricorn.png index cc28532c9b..79cac10ca0 100644 Binary files a/public/images/emoji/facebook_messenger/capricorn.png and b/public/images/emoji/facebook_messenger/capricorn.png differ diff --git a/public/images/emoji/facebook_messenger/car.png b/public/images/emoji/facebook_messenger/car.png index ba661ecefd..fc9d28be27 100644 Binary files a/public/images/emoji/facebook_messenger/car.png and b/public/images/emoji/facebook_messenger/car.png differ diff --git a/public/images/emoji/facebook_messenger/card_box.png b/public/images/emoji/facebook_messenger/card_box.png index 9090e436a3..25c036e7d5 100644 Binary files a/public/images/emoji/facebook_messenger/card_box.png and b/public/images/emoji/facebook_messenger/card_box.png differ diff --git a/public/images/emoji/facebook_messenger/card_file_box.png b/public/images/emoji/facebook_messenger/card_file_box.png index 9090e436a3..25c036e7d5 100644 Binary files a/public/images/emoji/facebook_messenger/card_file_box.png and b/public/images/emoji/facebook_messenger/card_file_box.png differ diff --git a/public/images/emoji/facebook_messenger/card_index.png b/public/images/emoji/facebook_messenger/card_index.png index 5083f6735c..1a43fd639d 100644 Binary files a/public/images/emoji/facebook_messenger/card_index.png and b/public/images/emoji/facebook_messenger/card_index.png differ diff --git a/public/images/emoji/facebook_messenger/card_index_dividers.png b/public/images/emoji/facebook_messenger/card_index_dividers.png index 8df2040c73..44775ce79b 100644 Binary files a/public/images/emoji/facebook_messenger/card_index_dividers.png and b/public/images/emoji/facebook_messenger/card_index_dividers.png differ diff --git a/public/images/emoji/facebook_messenger/caribbean_netherlands.png b/public/images/emoji/facebook_messenger/caribbean_netherlands.png index 7b0a02ff57..50e4e403bd 100644 Binary files a/public/images/emoji/facebook_messenger/caribbean_netherlands.png and b/public/images/emoji/facebook_messenger/caribbean_netherlands.png differ diff --git a/public/images/emoji/facebook_messenger/carousel_horse.png b/public/images/emoji/facebook_messenger/carousel_horse.png index 94d5d288c4..03eabd8d85 100644 Binary files a/public/images/emoji/facebook_messenger/carousel_horse.png and b/public/images/emoji/facebook_messenger/carousel_horse.png differ diff --git a/public/images/emoji/facebook_messenger/carrot.png b/public/images/emoji/facebook_messenger/carrot.png index 02b18cec6d..2a90873168 100644 Binary files a/public/images/emoji/facebook_messenger/carrot.png and b/public/images/emoji/facebook_messenger/carrot.png differ diff --git a/public/images/emoji/facebook_messenger/cat.png b/public/images/emoji/facebook_messenger/cat.png index f27d90591c..07d65f09fa 100644 Binary files a/public/images/emoji/facebook_messenger/cat.png and b/public/images/emoji/facebook_messenger/cat.png differ diff --git a/public/images/emoji/facebook_messenger/cat2.png b/public/images/emoji/facebook_messenger/cat2.png index 7002c9d87c..7de0571de9 100644 Binary files a/public/images/emoji/facebook_messenger/cat2.png and b/public/images/emoji/facebook_messenger/cat2.png differ diff --git a/public/images/emoji/facebook_messenger/cayman_islands.png b/public/images/emoji/facebook_messenger/cayman_islands.png index 086ac829fe..77f1b83e3c 100644 Binary files a/public/images/emoji/facebook_messenger/cayman_islands.png and b/public/images/emoji/facebook_messenger/cayman_islands.png differ diff --git a/public/images/emoji/facebook_messenger/cd.png b/public/images/emoji/facebook_messenger/cd.png index f01b522c8c..a2d0f2f1c1 100644 Binary files a/public/images/emoji/facebook_messenger/cd.png and b/public/images/emoji/facebook_messenger/cd.png differ diff --git a/public/images/emoji/facebook_messenger/central_african_republic.png b/public/images/emoji/facebook_messenger/central_african_republic.png index 7cc5e769c7..004a52fcaa 100644 Binary files a/public/images/emoji/facebook_messenger/central_african_republic.png and b/public/images/emoji/facebook_messenger/central_african_republic.png differ diff --git a/public/images/emoji/facebook_messenger/ceuta_and_melilla.png b/public/images/emoji/facebook_messenger/ceuta_and_melilla.png index 5d2f27537f..8347d89ca7 100644 Binary files a/public/images/emoji/facebook_messenger/ceuta_and_melilla.png and b/public/images/emoji/facebook_messenger/ceuta_and_melilla.png differ diff --git a/public/images/emoji/facebook_messenger/chad.png b/public/images/emoji/facebook_messenger/chad.png index e8452a8acf..3a7d7fcb71 100644 Binary files a/public/images/emoji/facebook_messenger/chad.png and b/public/images/emoji/facebook_messenger/chad.png differ diff --git a/public/images/emoji/facebook_messenger/chains.png b/public/images/emoji/facebook_messenger/chains.png index 1d9343f2c9..42787ce219 100644 Binary files a/public/images/emoji/facebook_messenger/chains.png and b/public/images/emoji/facebook_messenger/chains.png differ diff --git a/public/images/emoji/facebook_messenger/champagne.png b/public/images/emoji/facebook_messenger/champagne.png index 428019d382..72bbaefc48 100644 Binary files a/public/images/emoji/facebook_messenger/champagne.png and b/public/images/emoji/facebook_messenger/champagne.png differ diff --git a/public/images/emoji/facebook_messenger/chart.png b/public/images/emoji/facebook_messenger/chart.png index a14b1cb1ca..be8388e416 100644 Binary files a/public/images/emoji/facebook_messenger/chart.png and b/public/images/emoji/facebook_messenger/chart.png differ diff --git a/public/images/emoji/facebook_messenger/chart_with_downwards_trend.png b/public/images/emoji/facebook_messenger/chart_with_downwards_trend.png index ad71c30399..448a64fde9 100644 Binary files a/public/images/emoji/facebook_messenger/chart_with_downwards_trend.png and b/public/images/emoji/facebook_messenger/chart_with_downwards_trend.png differ diff --git a/public/images/emoji/facebook_messenger/chart_with_upwards_trend.png b/public/images/emoji/facebook_messenger/chart_with_upwards_trend.png index 93230e3ca2..82ac077d5a 100644 Binary files a/public/images/emoji/facebook_messenger/chart_with_upwards_trend.png and b/public/images/emoji/facebook_messenger/chart_with_upwards_trend.png differ diff --git a/public/images/emoji/facebook_messenger/checkered_flag.png b/public/images/emoji/facebook_messenger/checkered_flag.png index 518e7feebe..8d81450631 100644 Binary files a/public/images/emoji/facebook_messenger/checkered_flag.png and b/public/images/emoji/facebook_messenger/checkered_flag.png differ diff --git a/public/images/emoji/facebook_messenger/cheese.png b/public/images/emoji/facebook_messenger/cheese.png index d4aaac5dc6..d8903fd26d 100644 Binary files a/public/images/emoji/facebook_messenger/cheese.png and b/public/images/emoji/facebook_messenger/cheese.png differ diff --git a/public/images/emoji/facebook_messenger/cheese_wedge.png b/public/images/emoji/facebook_messenger/cheese_wedge.png index d4aaac5dc6..d8903fd26d 100644 Binary files a/public/images/emoji/facebook_messenger/cheese_wedge.png and b/public/images/emoji/facebook_messenger/cheese_wedge.png differ diff --git a/public/images/emoji/facebook_messenger/cherries.png b/public/images/emoji/facebook_messenger/cherries.png index 3cbc7a6f35..d480aba06b 100644 Binary files a/public/images/emoji/facebook_messenger/cherries.png and b/public/images/emoji/facebook_messenger/cherries.png differ diff --git a/public/images/emoji/facebook_messenger/cherry_blossom.png b/public/images/emoji/facebook_messenger/cherry_blossom.png index 7ed25a03ba..0c23cbf392 100644 Binary files a/public/images/emoji/facebook_messenger/cherry_blossom.png and b/public/images/emoji/facebook_messenger/cherry_blossom.png differ diff --git a/public/images/emoji/facebook_messenger/chess_pawn.png b/public/images/emoji/facebook_messenger/chess_pawn.png new file mode 100644 index 0000000000..5ec149c62a Binary files /dev/null and b/public/images/emoji/facebook_messenger/chess_pawn.png differ diff --git a/public/images/emoji/facebook_messenger/chestnut.png b/public/images/emoji/facebook_messenger/chestnut.png index a93a2af0f8..69cb191ec4 100644 Binary files a/public/images/emoji/facebook_messenger/chestnut.png and b/public/images/emoji/facebook_messenger/chestnut.png differ diff --git a/public/images/emoji/facebook_messenger/chicken.png b/public/images/emoji/facebook_messenger/chicken.png index ec3d58893d..a62716b313 100644 Binary files a/public/images/emoji/facebook_messenger/chicken.png and b/public/images/emoji/facebook_messenger/chicken.png differ diff --git a/public/images/emoji/facebook_messenger/child.png b/public/images/emoji/facebook_messenger/child.png index 5f8b2383dd..ef5245356b 100644 Binary files a/public/images/emoji/facebook_messenger/child.png and b/public/images/emoji/facebook_messenger/child.png differ diff --git a/public/images/emoji/facebook_messenger/children_crossing.png b/public/images/emoji/facebook_messenger/children_crossing.png index e08351b44c..33357983a1 100644 Binary files a/public/images/emoji/facebook_messenger/children_crossing.png and b/public/images/emoji/facebook_messenger/children_crossing.png differ diff --git a/public/images/emoji/facebook_messenger/chile.png b/public/images/emoji/facebook_messenger/chile.png index f52a03a2ea..4e63f8c2c2 100644 Binary files a/public/images/emoji/facebook_messenger/chile.png and b/public/images/emoji/facebook_messenger/chile.png differ diff --git a/public/images/emoji/facebook_messenger/chipmunk.png b/public/images/emoji/facebook_messenger/chipmunk.png index 92d32c95cb..fbcf06d8f5 100644 Binary files a/public/images/emoji/facebook_messenger/chipmunk.png and b/public/images/emoji/facebook_messenger/chipmunk.png differ diff --git a/public/images/emoji/facebook_messenger/chocolate_bar.png b/public/images/emoji/facebook_messenger/chocolate_bar.png index 137a7efd31..bb7677ca7e 100644 Binary files a/public/images/emoji/facebook_messenger/chocolate_bar.png and b/public/images/emoji/facebook_messenger/chocolate_bar.png differ diff --git a/public/images/emoji/facebook_messenger/chopsticks.png b/public/images/emoji/facebook_messenger/chopsticks.png index cbc90cf980..5af757887f 100644 Binary files a/public/images/emoji/facebook_messenger/chopsticks.png and b/public/images/emoji/facebook_messenger/chopsticks.png differ diff --git a/public/images/emoji/facebook_messenger/christmas_island.png b/public/images/emoji/facebook_messenger/christmas_island.png index bd3bd24ac9..4d03d3676c 100644 Binary files a/public/images/emoji/facebook_messenger/christmas_island.png and b/public/images/emoji/facebook_messenger/christmas_island.png differ diff --git a/public/images/emoji/facebook_messenger/christmas_tree.png b/public/images/emoji/facebook_messenger/christmas_tree.png index 8708c9f8c6..a07d3025f0 100644 Binary files a/public/images/emoji/facebook_messenger/christmas_tree.png and b/public/images/emoji/facebook_messenger/christmas_tree.png differ diff --git a/public/images/emoji/facebook_messenger/church.png b/public/images/emoji/facebook_messenger/church.png index 19930de136..a8ed93d0c9 100644 Binary files a/public/images/emoji/facebook_messenger/church.png and b/public/images/emoji/facebook_messenger/church.png differ diff --git a/public/images/emoji/facebook_messenger/cinema.png b/public/images/emoji/facebook_messenger/cinema.png index 294d990439..a5928b49cd 100644 Binary files a/public/images/emoji/facebook_messenger/cinema.png and b/public/images/emoji/facebook_messenger/cinema.png differ diff --git a/public/images/emoji/facebook_messenger/circus_tent.png b/public/images/emoji/facebook_messenger/circus_tent.png index 255c1f6c97..e8853246ac 100644 Binary files a/public/images/emoji/facebook_messenger/circus_tent.png and b/public/images/emoji/facebook_messenger/circus_tent.png differ diff --git a/public/images/emoji/facebook_messenger/city_dusk.png b/public/images/emoji/facebook_messenger/city_dusk.png index 82ef3e31cb..9a07ad66ef 100644 Binary files a/public/images/emoji/facebook_messenger/city_dusk.png and b/public/images/emoji/facebook_messenger/city_dusk.png differ diff --git a/public/images/emoji/facebook_messenger/city_sunrise.png b/public/images/emoji/facebook_messenger/city_sunrise.png index 7733873a9d..43ea52d610 100644 Binary files a/public/images/emoji/facebook_messenger/city_sunrise.png and b/public/images/emoji/facebook_messenger/city_sunrise.png differ diff --git a/public/images/emoji/facebook_messenger/city_sunset.png b/public/images/emoji/facebook_messenger/city_sunset.png index 82ef3e31cb..9a07ad66ef 100644 Binary files a/public/images/emoji/facebook_messenger/city_sunset.png and b/public/images/emoji/facebook_messenger/city_sunset.png differ diff --git a/public/images/emoji/facebook_messenger/cityscape.png b/public/images/emoji/facebook_messenger/cityscape.png index 8fe7412997..502e3dc0eb 100644 Binary files a/public/images/emoji/facebook_messenger/cityscape.png and b/public/images/emoji/facebook_messenger/cityscape.png differ diff --git a/public/images/emoji/facebook_messenger/cl.png b/public/images/emoji/facebook_messenger/cl.png index 9fb3fddb97..6f45ee5ad0 100644 Binary files a/public/images/emoji/facebook_messenger/cl.png and b/public/images/emoji/facebook_messenger/cl.png differ diff --git a/public/images/emoji/facebook_messenger/clamp.png b/public/images/emoji/facebook_messenger/clamp.png index c10411d5bd..382fe7af27 100644 Binary files a/public/images/emoji/facebook_messenger/clamp.png and b/public/images/emoji/facebook_messenger/clamp.png differ diff --git a/public/images/emoji/facebook_messenger/clap.png b/public/images/emoji/facebook_messenger/clap.png index 4c10caf428..9ef22d40ac 100644 Binary files a/public/images/emoji/facebook_messenger/clap.png and b/public/images/emoji/facebook_messenger/clap.png differ diff --git a/public/images/emoji/facebook_messenger/clapper.png b/public/images/emoji/facebook_messenger/clapper.png index fa560c7bc4..df4702d05a 100644 Binary files a/public/images/emoji/facebook_messenger/clapper.png and b/public/images/emoji/facebook_messenger/clapper.png differ diff --git a/public/images/emoji/facebook_messenger/classical_building.png b/public/images/emoji/facebook_messenger/classical_building.png index 23ed0b0287..a99315b9bf 100644 Binary files a/public/images/emoji/facebook_messenger/classical_building.png and b/public/images/emoji/facebook_messenger/classical_building.png differ diff --git a/public/images/emoji/facebook_messenger/clinking_glasses.png b/public/images/emoji/facebook_messenger/clinking_glasses.png index 95a68131c8..6ae076c63c 100644 Binary files a/public/images/emoji/facebook_messenger/clinking_glasses.png and b/public/images/emoji/facebook_messenger/clinking_glasses.png differ diff --git a/public/images/emoji/facebook_messenger/clipboard.png b/public/images/emoji/facebook_messenger/clipboard.png index 75f931105e..1b4b5913f9 100644 Binary files a/public/images/emoji/facebook_messenger/clipboard.png and b/public/images/emoji/facebook_messenger/clipboard.png differ diff --git a/public/images/emoji/facebook_messenger/clipperton_island.png b/public/images/emoji/facebook_messenger/clipperton_island.png index 2ef71d792a..cf75e74cf2 100644 Binary files a/public/images/emoji/facebook_messenger/clipperton_island.png and b/public/images/emoji/facebook_messenger/clipperton_island.png differ diff --git a/public/images/emoji/facebook_messenger/clock.png b/public/images/emoji/facebook_messenger/clock.png index 78008e45b6..b8696e64f0 100644 Binary files a/public/images/emoji/facebook_messenger/clock.png and b/public/images/emoji/facebook_messenger/clock.png differ diff --git a/public/images/emoji/facebook_messenger/clock1.png b/public/images/emoji/facebook_messenger/clock1.png index d2fe7a734f..9ed38e731c 100644 Binary files a/public/images/emoji/facebook_messenger/clock1.png and b/public/images/emoji/facebook_messenger/clock1.png differ diff --git a/public/images/emoji/facebook_messenger/clock10.png b/public/images/emoji/facebook_messenger/clock10.png index c29bb23b17..cf1e4b45a1 100644 Binary files a/public/images/emoji/facebook_messenger/clock10.png and b/public/images/emoji/facebook_messenger/clock10.png differ diff --git a/public/images/emoji/facebook_messenger/clock1030.png b/public/images/emoji/facebook_messenger/clock1030.png index 3820f6c771..6481ad4ce5 100644 Binary files a/public/images/emoji/facebook_messenger/clock1030.png and b/public/images/emoji/facebook_messenger/clock1030.png differ diff --git a/public/images/emoji/facebook_messenger/clock11.png b/public/images/emoji/facebook_messenger/clock11.png index 28e8a3fa9d..44c8b5b464 100644 Binary files a/public/images/emoji/facebook_messenger/clock11.png and b/public/images/emoji/facebook_messenger/clock11.png differ diff --git a/public/images/emoji/facebook_messenger/clock1130.png b/public/images/emoji/facebook_messenger/clock1130.png index d09766e18c..f63b75ae42 100644 Binary files a/public/images/emoji/facebook_messenger/clock1130.png and b/public/images/emoji/facebook_messenger/clock1130.png differ diff --git a/public/images/emoji/facebook_messenger/clock12.png b/public/images/emoji/facebook_messenger/clock12.png index 1e2ebb6b7e..945a4c74fb 100644 Binary files a/public/images/emoji/facebook_messenger/clock12.png and b/public/images/emoji/facebook_messenger/clock12.png differ diff --git a/public/images/emoji/facebook_messenger/clock1230.png b/public/images/emoji/facebook_messenger/clock1230.png index af50bf9da1..8556522364 100644 Binary files a/public/images/emoji/facebook_messenger/clock1230.png and b/public/images/emoji/facebook_messenger/clock1230.png differ diff --git a/public/images/emoji/facebook_messenger/clock130.png b/public/images/emoji/facebook_messenger/clock130.png index 4a40410585..541b7be294 100644 Binary files a/public/images/emoji/facebook_messenger/clock130.png and b/public/images/emoji/facebook_messenger/clock130.png differ diff --git a/public/images/emoji/facebook_messenger/clock2.png b/public/images/emoji/facebook_messenger/clock2.png index 2200574405..4de430ad72 100644 Binary files a/public/images/emoji/facebook_messenger/clock2.png and b/public/images/emoji/facebook_messenger/clock2.png differ diff --git a/public/images/emoji/facebook_messenger/clock230.png b/public/images/emoji/facebook_messenger/clock230.png index 0b75450318..9416cea7a6 100644 Binary files a/public/images/emoji/facebook_messenger/clock230.png and b/public/images/emoji/facebook_messenger/clock230.png differ diff --git a/public/images/emoji/facebook_messenger/clock3.png b/public/images/emoji/facebook_messenger/clock3.png index c06ab4efdf..29477a57f3 100644 Binary files a/public/images/emoji/facebook_messenger/clock3.png and b/public/images/emoji/facebook_messenger/clock3.png differ diff --git a/public/images/emoji/facebook_messenger/clock330.png b/public/images/emoji/facebook_messenger/clock330.png index f2227efb44..f97e73000c 100644 Binary files a/public/images/emoji/facebook_messenger/clock330.png and b/public/images/emoji/facebook_messenger/clock330.png differ diff --git a/public/images/emoji/facebook_messenger/clock4.png b/public/images/emoji/facebook_messenger/clock4.png index ab02a47af1..5cd31e9235 100644 Binary files a/public/images/emoji/facebook_messenger/clock4.png and b/public/images/emoji/facebook_messenger/clock4.png differ diff --git a/public/images/emoji/facebook_messenger/clock430.png b/public/images/emoji/facebook_messenger/clock430.png index 983319af15..033b0c94db 100644 Binary files a/public/images/emoji/facebook_messenger/clock430.png and b/public/images/emoji/facebook_messenger/clock430.png differ diff --git a/public/images/emoji/facebook_messenger/clock5.png b/public/images/emoji/facebook_messenger/clock5.png index 85df9f23b2..1ca55a8e40 100644 Binary files a/public/images/emoji/facebook_messenger/clock5.png and b/public/images/emoji/facebook_messenger/clock5.png differ diff --git a/public/images/emoji/facebook_messenger/clock530.png b/public/images/emoji/facebook_messenger/clock530.png index 445e19120b..8ec4f011dc 100644 Binary files a/public/images/emoji/facebook_messenger/clock530.png and b/public/images/emoji/facebook_messenger/clock530.png differ diff --git a/public/images/emoji/facebook_messenger/clock6.png b/public/images/emoji/facebook_messenger/clock6.png index f0d0abde11..6b4296e6a8 100644 Binary files a/public/images/emoji/facebook_messenger/clock6.png and b/public/images/emoji/facebook_messenger/clock6.png differ diff --git a/public/images/emoji/facebook_messenger/clock630.png b/public/images/emoji/facebook_messenger/clock630.png index ff6e85b7fa..3df7651f80 100644 Binary files a/public/images/emoji/facebook_messenger/clock630.png and b/public/images/emoji/facebook_messenger/clock630.png differ diff --git a/public/images/emoji/facebook_messenger/clock7.png b/public/images/emoji/facebook_messenger/clock7.png index eabd472dcb..722be0a2ee 100644 Binary files a/public/images/emoji/facebook_messenger/clock7.png and b/public/images/emoji/facebook_messenger/clock7.png differ diff --git a/public/images/emoji/facebook_messenger/clock730.png b/public/images/emoji/facebook_messenger/clock730.png index bf655fee5e..4757e2c501 100644 Binary files a/public/images/emoji/facebook_messenger/clock730.png and b/public/images/emoji/facebook_messenger/clock730.png differ diff --git a/public/images/emoji/facebook_messenger/clock8.png b/public/images/emoji/facebook_messenger/clock8.png index fc1f205987..dff9c3281a 100644 Binary files a/public/images/emoji/facebook_messenger/clock8.png and b/public/images/emoji/facebook_messenger/clock8.png differ diff --git a/public/images/emoji/facebook_messenger/clock830.png b/public/images/emoji/facebook_messenger/clock830.png index e6c8c9ece9..20fd689b38 100644 Binary files a/public/images/emoji/facebook_messenger/clock830.png and b/public/images/emoji/facebook_messenger/clock830.png differ diff --git a/public/images/emoji/facebook_messenger/clock9.png b/public/images/emoji/facebook_messenger/clock9.png index b650d63c03..9cd8ec0afc 100644 Binary files a/public/images/emoji/facebook_messenger/clock9.png and b/public/images/emoji/facebook_messenger/clock9.png differ diff --git a/public/images/emoji/facebook_messenger/clock930.png b/public/images/emoji/facebook_messenger/clock930.png index bdcf428fe0..f9ea7286f8 100644 Binary files a/public/images/emoji/facebook_messenger/clock930.png and b/public/images/emoji/facebook_messenger/clock930.png differ diff --git a/public/images/emoji/facebook_messenger/closed_book.png b/public/images/emoji/facebook_messenger/closed_book.png index ea4dfba918..f6fc482f88 100644 Binary files a/public/images/emoji/facebook_messenger/closed_book.png and b/public/images/emoji/facebook_messenger/closed_book.png differ diff --git a/public/images/emoji/facebook_messenger/closed_lock_with_key.png b/public/images/emoji/facebook_messenger/closed_lock_with_key.png index 696082fe3e..7cfddcf992 100644 Binary files a/public/images/emoji/facebook_messenger/closed_lock_with_key.png and b/public/images/emoji/facebook_messenger/closed_lock_with_key.png differ diff --git a/public/images/emoji/facebook_messenger/closed_umbrella.png b/public/images/emoji/facebook_messenger/closed_umbrella.png index 2c419306b3..0aee0b3d47 100644 Binary files a/public/images/emoji/facebook_messenger/closed_umbrella.png and b/public/images/emoji/facebook_messenger/closed_umbrella.png differ diff --git a/public/images/emoji/facebook_messenger/cloud.png b/public/images/emoji/facebook_messenger/cloud.png index 0cdcd5e3f6..c31b9bd104 100644 Binary files a/public/images/emoji/facebook_messenger/cloud.png and b/public/images/emoji/facebook_messenger/cloud.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_lightning.png b/public/images/emoji/facebook_messenger/cloud_lightning.png index 0bce1c2615..a980654f3f 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_lightning.png and b/public/images/emoji/facebook_messenger/cloud_lightning.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_rain.png b/public/images/emoji/facebook_messenger/cloud_rain.png index 22c872b509..ae544f5f88 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_rain.png and b/public/images/emoji/facebook_messenger/cloud_rain.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_snow.png b/public/images/emoji/facebook_messenger/cloud_snow.png index c3b2df9657..918d29c3e7 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_snow.png and b/public/images/emoji/facebook_messenger/cloud_snow.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_tornado.png b/public/images/emoji/facebook_messenger/cloud_tornado.png index 2de8ec4a69..c008264d3b 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_tornado.png and b/public/images/emoji/facebook_messenger/cloud_tornado.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_with_lightning.png b/public/images/emoji/facebook_messenger/cloud_with_lightning.png index 0bce1c2615..a980654f3f 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_with_lightning.png and b/public/images/emoji/facebook_messenger/cloud_with_lightning.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_with_lightning_and_rain.png b/public/images/emoji/facebook_messenger/cloud_with_lightning_and_rain.png index 943482554f..98b648e37a 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_with_lightning_and_rain.png and b/public/images/emoji/facebook_messenger/cloud_with_lightning_and_rain.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_with_rain.png b/public/images/emoji/facebook_messenger/cloud_with_rain.png index 22c872b509..ae544f5f88 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_with_rain.png and b/public/images/emoji/facebook_messenger/cloud_with_rain.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_with_snow.png b/public/images/emoji/facebook_messenger/cloud_with_snow.png index c3b2df9657..918d29c3e7 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_with_snow.png and b/public/images/emoji/facebook_messenger/cloud_with_snow.png differ diff --git a/public/images/emoji/facebook_messenger/cloud_with_tornado.png b/public/images/emoji/facebook_messenger/cloud_with_tornado.png index 2de8ec4a69..c008264d3b 100644 Binary files a/public/images/emoji/facebook_messenger/cloud_with_tornado.png and b/public/images/emoji/facebook_messenger/cloud_with_tornado.png differ diff --git a/public/images/emoji/facebook_messenger/clown_face.png b/public/images/emoji/facebook_messenger/clown_face.png index dafd3b5c0d..cf74aa474b 100644 Binary files a/public/images/emoji/facebook_messenger/clown_face.png and b/public/images/emoji/facebook_messenger/clown_face.png differ diff --git a/public/images/emoji/facebook_messenger/clubs.png b/public/images/emoji/facebook_messenger/clubs.png index 993580971f..58d67a0011 100644 Binary files a/public/images/emoji/facebook_messenger/clubs.png and b/public/images/emoji/facebook_messenger/clubs.png differ diff --git a/public/images/emoji/facebook_messenger/cn.png b/public/images/emoji/facebook_messenger/cn.png index ddad4d8315..3840d20a9e 100644 Binary files a/public/images/emoji/facebook_messenger/cn.png and b/public/images/emoji/facebook_messenger/cn.png differ diff --git a/public/images/emoji/facebook_messenger/coat.png b/public/images/emoji/facebook_messenger/coat.png index d7a1a07d05..97d003f87e 100644 Binary files a/public/images/emoji/facebook_messenger/coat.png and b/public/images/emoji/facebook_messenger/coat.png differ diff --git a/public/images/emoji/facebook_messenger/cocktail.png b/public/images/emoji/facebook_messenger/cocktail.png index 9231d1c010..cdcf051306 100644 Binary files a/public/images/emoji/facebook_messenger/cocktail.png and b/public/images/emoji/facebook_messenger/cocktail.png differ diff --git a/public/images/emoji/facebook_messenger/coconut.png b/public/images/emoji/facebook_messenger/coconut.png index 5c0ddcf15b..458db4a98a 100644 Binary files a/public/images/emoji/facebook_messenger/coconut.png and b/public/images/emoji/facebook_messenger/coconut.png differ diff --git a/public/images/emoji/facebook_messenger/cocos_islands.png b/public/images/emoji/facebook_messenger/cocos_islands.png index 8aaf9f3d82..6254157c5c 100644 Binary files a/public/images/emoji/facebook_messenger/cocos_islands.png and b/public/images/emoji/facebook_messenger/cocos_islands.png differ diff --git a/public/images/emoji/facebook_messenger/coffee.png b/public/images/emoji/facebook_messenger/coffee.png index 7b032b193c..5fb9fc8b82 100644 Binary files a/public/images/emoji/facebook_messenger/coffee.png and b/public/images/emoji/facebook_messenger/coffee.png differ diff --git a/public/images/emoji/facebook_messenger/coffin.png b/public/images/emoji/facebook_messenger/coffin.png index 311c61cbfe..cecd7c3f1b 100644 Binary files a/public/images/emoji/facebook_messenger/coffin.png and b/public/images/emoji/facebook_messenger/coffin.png differ diff --git a/public/images/emoji/facebook_messenger/cold_face.png b/public/images/emoji/facebook_messenger/cold_face.png new file mode 100644 index 0000000000..6d14820c56 Binary files /dev/null and b/public/images/emoji/facebook_messenger/cold_face.png differ diff --git a/public/images/emoji/facebook_messenger/cold_sweat.png b/public/images/emoji/facebook_messenger/cold_sweat.png index 35b8bb6861..d26bbe69f7 100644 Binary files a/public/images/emoji/facebook_messenger/cold_sweat.png and b/public/images/emoji/facebook_messenger/cold_sweat.png differ diff --git a/public/images/emoji/facebook_messenger/colombia.png b/public/images/emoji/facebook_messenger/colombia.png index ff797a7631..305bbd9d3f 100644 Binary files a/public/images/emoji/facebook_messenger/colombia.png and b/public/images/emoji/facebook_messenger/colombia.png differ diff --git a/public/images/emoji/facebook_messenger/comet.png b/public/images/emoji/facebook_messenger/comet.png index 13f4a3e1f7..1730ec5ced 100644 Binary files a/public/images/emoji/facebook_messenger/comet.png and b/public/images/emoji/facebook_messenger/comet.png differ diff --git a/public/images/emoji/facebook_messenger/comoros.png b/public/images/emoji/facebook_messenger/comoros.png index 443a8fb64f..1df34ad807 100644 Binary files a/public/images/emoji/facebook_messenger/comoros.png and b/public/images/emoji/facebook_messenger/comoros.png differ diff --git a/public/images/emoji/facebook_messenger/compass.png b/public/images/emoji/facebook_messenger/compass.png new file mode 100644 index 0000000000..ff199d4822 Binary files /dev/null and b/public/images/emoji/facebook_messenger/compass.png differ diff --git a/public/images/emoji/facebook_messenger/compression.png b/public/images/emoji/facebook_messenger/compression.png index c10411d5bd..382fe7af27 100644 Binary files a/public/images/emoji/facebook_messenger/compression.png and b/public/images/emoji/facebook_messenger/compression.png differ diff --git a/public/images/emoji/facebook_messenger/computer.png b/public/images/emoji/facebook_messenger/computer.png index 0444ab77d1..097df667a6 100644 Binary files a/public/images/emoji/facebook_messenger/computer.png and b/public/images/emoji/facebook_messenger/computer.png differ diff --git a/public/images/emoji/facebook_messenger/computer_mouse.png b/public/images/emoji/facebook_messenger/computer_mouse.png index 53fdef1f76..f9917195e0 100644 Binary files a/public/images/emoji/facebook_messenger/computer_mouse.png and b/public/images/emoji/facebook_messenger/computer_mouse.png differ diff --git a/public/images/emoji/facebook_messenger/confetti_ball.png b/public/images/emoji/facebook_messenger/confetti_ball.png index a814a64b1f..71a0157814 100644 Binary files a/public/images/emoji/facebook_messenger/confetti_ball.png and b/public/images/emoji/facebook_messenger/confetti_ball.png differ diff --git a/public/images/emoji/facebook_messenger/confounded.png b/public/images/emoji/facebook_messenger/confounded.png index 9113d51adf..84d117d40f 100644 Binary files a/public/images/emoji/facebook_messenger/confounded.png and b/public/images/emoji/facebook_messenger/confounded.png differ diff --git a/public/images/emoji/facebook_messenger/confused.png b/public/images/emoji/facebook_messenger/confused.png index fda747e0ac..592fc5a2cf 100644 Binary files a/public/images/emoji/facebook_messenger/confused.png and b/public/images/emoji/facebook_messenger/confused.png differ diff --git a/public/images/emoji/facebook_messenger/congo_brazzaville.png b/public/images/emoji/facebook_messenger/congo_brazzaville.png index d2bfc4f6b8..e6f9ff2555 100644 Binary files a/public/images/emoji/facebook_messenger/congo_brazzaville.png and b/public/images/emoji/facebook_messenger/congo_brazzaville.png differ diff --git a/public/images/emoji/facebook_messenger/congo_kinshasa.png b/public/images/emoji/facebook_messenger/congo_kinshasa.png index c3a26864c1..fe0a8cda52 100644 Binary files a/public/images/emoji/facebook_messenger/congo_kinshasa.png and b/public/images/emoji/facebook_messenger/congo_kinshasa.png differ diff --git a/public/images/emoji/facebook_messenger/congratulations.png b/public/images/emoji/facebook_messenger/congratulations.png index 9234bd13ae..fed2a3b03d 100644 Binary files a/public/images/emoji/facebook_messenger/congratulations.png and b/public/images/emoji/facebook_messenger/congratulations.png differ diff --git a/public/images/emoji/facebook_messenger/construction.png b/public/images/emoji/facebook_messenger/construction.png index b4bbfc7151..545bb1c04d 100644 Binary files a/public/images/emoji/facebook_messenger/construction.png and b/public/images/emoji/facebook_messenger/construction.png differ diff --git a/public/images/emoji/facebook_messenger/construction_site.png b/public/images/emoji/facebook_messenger/construction_site.png index 74cd30792b..0d44b346d5 100644 Binary files a/public/images/emoji/facebook_messenger/construction_site.png and b/public/images/emoji/facebook_messenger/construction_site.png differ diff --git a/public/images/emoji/facebook_messenger/construction_worker.png b/public/images/emoji/facebook_messenger/construction_worker.png index df0e868cf3..817dabe822 100644 Binary files a/public/images/emoji/facebook_messenger/construction_worker.png and b/public/images/emoji/facebook_messenger/construction_worker.png differ diff --git a/public/images/emoji/facebook_messenger/construction_worker_man.png b/public/images/emoji/facebook_messenger/construction_worker_man.png index df0e868cf3..817dabe822 100644 Binary files a/public/images/emoji/facebook_messenger/construction_worker_man.png and b/public/images/emoji/facebook_messenger/construction_worker_man.png differ diff --git a/public/images/emoji/facebook_messenger/construction_worker_woman.png b/public/images/emoji/facebook_messenger/construction_worker_woman.png index c5299dd7b9..1c20fa917b 100644 Binary files a/public/images/emoji/facebook_messenger/construction_worker_woman.png and b/public/images/emoji/facebook_messenger/construction_worker_woman.png differ diff --git a/public/images/emoji/facebook_messenger/control_knobs.png b/public/images/emoji/facebook_messenger/control_knobs.png index 102fea6aea..5d977e810a 100644 Binary files a/public/images/emoji/facebook_messenger/control_knobs.png and b/public/images/emoji/facebook_messenger/control_knobs.png differ diff --git a/public/images/emoji/facebook_messenger/convenience_store.png b/public/images/emoji/facebook_messenger/convenience_store.png index 6cf8b990a9..97223bae5f 100644 Binary files a/public/images/emoji/facebook_messenger/convenience_store.png and b/public/images/emoji/facebook_messenger/convenience_store.png differ diff --git a/public/images/emoji/facebook_messenger/cook_islands.png b/public/images/emoji/facebook_messenger/cook_islands.png index f42617d6fd..39b9e0c14a 100644 Binary files a/public/images/emoji/facebook_messenger/cook_islands.png and b/public/images/emoji/facebook_messenger/cook_islands.png differ diff --git a/public/images/emoji/facebook_messenger/cookie.png b/public/images/emoji/facebook_messenger/cookie.png index 69739eb017..dcae6266ff 100644 Binary files a/public/images/emoji/facebook_messenger/cookie.png and b/public/images/emoji/facebook_messenger/cookie.png differ diff --git a/public/images/emoji/facebook_messenger/cool.png b/public/images/emoji/facebook_messenger/cool.png index d68afbc36a..ddbdb84828 100644 Binary files a/public/images/emoji/facebook_messenger/cool.png and b/public/images/emoji/facebook_messenger/cool.png differ diff --git a/public/images/emoji/facebook_messenger/cop.png b/public/images/emoji/facebook_messenger/cop.png index 089df5b596..7ef765226b 100644 Binary files a/public/images/emoji/facebook_messenger/cop.png and b/public/images/emoji/facebook_messenger/cop.png differ diff --git a/public/images/emoji/facebook_messenger/copyright.png b/public/images/emoji/facebook_messenger/copyright.png index 61cb4f64b6..51446f43ad 100644 Binary files a/public/images/emoji/facebook_messenger/copyright.png and b/public/images/emoji/facebook_messenger/copyright.png differ diff --git a/public/images/emoji/facebook_messenger/corn.png b/public/images/emoji/facebook_messenger/corn.png index e025602738..b09378825c 100644 Binary files a/public/images/emoji/facebook_messenger/corn.png and b/public/images/emoji/facebook_messenger/corn.png differ diff --git a/public/images/emoji/facebook_messenger/costa_rica.png b/public/images/emoji/facebook_messenger/costa_rica.png index 3c8348c05c..648b5fc6a5 100644 Binary files a/public/images/emoji/facebook_messenger/costa_rica.png and b/public/images/emoji/facebook_messenger/costa_rica.png differ diff --git a/public/images/emoji/facebook_messenger/cote_divoire.png b/public/images/emoji/facebook_messenger/cote_divoire.png index 29dd8bdb36..a6cd91f0b2 100644 Binary files a/public/images/emoji/facebook_messenger/cote_divoire.png and b/public/images/emoji/facebook_messenger/cote_divoire.png differ diff --git a/public/images/emoji/facebook_messenger/couch.png b/public/images/emoji/facebook_messenger/couch.png index 678c13d733..7a832e6038 100644 Binary files a/public/images/emoji/facebook_messenger/couch.png and b/public/images/emoji/facebook_messenger/couch.png differ diff --git a/public/images/emoji/facebook_messenger/couch_and_lamp.png b/public/images/emoji/facebook_messenger/couch_and_lamp.png index 678c13d733..7a832e6038 100644 Binary files a/public/images/emoji/facebook_messenger/couch_and_lamp.png and b/public/images/emoji/facebook_messenger/couch_and_lamp.png differ diff --git a/public/images/emoji/facebook_messenger/couple.png b/public/images/emoji/facebook_messenger/couple.png index d30ab40ac9..d1d98be35e 100644 Binary files a/public/images/emoji/facebook_messenger/couple.png and b/public/images/emoji/facebook_messenger/couple.png differ diff --git a/public/images/emoji/facebook_messenger/couple_with_heart.png b/public/images/emoji/facebook_messenger/couple_with_heart.png index 00012f6fdc..21a899fd1b 100644 Binary files a/public/images/emoji/facebook_messenger/couple_with_heart.png and b/public/images/emoji/facebook_messenger/couple_with_heart.png differ diff --git a/public/images/emoji/facebook_messenger/couple_with_heart_man_man.png b/public/images/emoji/facebook_messenger/couple_with_heart_man_man.png index 50c3f8f81f..e30532a6cc 100644 Binary files a/public/images/emoji/facebook_messenger/couple_with_heart_man_man.png and b/public/images/emoji/facebook_messenger/couple_with_heart_man_man.png differ diff --git a/public/images/emoji/facebook_messenger/couple_with_heart_woman_man.png b/public/images/emoji/facebook_messenger/couple_with_heart_woman_man.png index 00012f6fdc..21a899fd1b 100644 Binary files a/public/images/emoji/facebook_messenger/couple_with_heart_woman_man.png and b/public/images/emoji/facebook_messenger/couple_with_heart_woman_man.png differ diff --git a/public/images/emoji/facebook_messenger/couple_with_heart_woman_woman.png b/public/images/emoji/facebook_messenger/couple_with_heart_woman_woman.png index ab3c64daed..69e1163bbc 100644 Binary files a/public/images/emoji/facebook_messenger/couple_with_heart_woman_woman.png and b/public/images/emoji/facebook_messenger/couple_with_heart_woman_woman.png differ diff --git a/public/images/emoji/facebook_messenger/couplekiss.png b/public/images/emoji/facebook_messenger/couplekiss.png index 27f53aa0cd..c00259f11c 100644 Binary files a/public/images/emoji/facebook_messenger/couplekiss.png and b/public/images/emoji/facebook_messenger/couplekiss.png differ diff --git a/public/images/emoji/facebook_messenger/couplekiss_man_man.png b/public/images/emoji/facebook_messenger/couplekiss_man_man.png index e626b7eb92..2ce8534039 100644 Binary files a/public/images/emoji/facebook_messenger/couplekiss_man_man.png and b/public/images/emoji/facebook_messenger/couplekiss_man_man.png differ diff --git a/public/images/emoji/facebook_messenger/couplekiss_man_woman.png b/public/images/emoji/facebook_messenger/couplekiss_man_woman.png index 27f53aa0cd..c00259f11c 100644 Binary files a/public/images/emoji/facebook_messenger/couplekiss_man_woman.png and b/public/images/emoji/facebook_messenger/couplekiss_man_woman.png differ diff --git a/public/images/emoji/facebook_messenger/couplekiss_woman_woman.png b/public/images/emoji/facebook_messenger/couplekiss_woman_woman.png index cb33b1daf9..863d511781 100644 Binary files a/public/images/emoji/facebook_messenger/couplekiss_woman_woman.png and b/public/images/emoji/facebook_messenger/couplekiss_woman_woman.png differ diff --git a/public/images/emoji/facebook_messenger/cow.png b/public/images/emoji/facebook_messenger/cow.png index 03134a5300..5ef9798507 100644 Binary files a/public/images/emoji/facebook_messenger/cow.png and b/public/images/emoji/facebook_messenger/cow.png differ diff --git a/public/images/emoji/facebook_messenger/cow2.png b/public/images/emoji/facebook_messenger/cow2.png index acb8e68aec..22a91d1e1d 100644 Binary files a/public/images/emoji/facebook_messenger/cow2.png and b/public/images/emoji/facebook_messenger/cow2.png differ diff --git a/public/images/emoji/facebook_messenger/cowboy_hat_face.png b/public/images/emoji/facebook_messenger/cowboy_hat_face.png index fb0178aef0..bcd1081e0e 100644 Binary files a/public/images/emoji/facebook_messenger/cowboy_hat_face.png and b/public/images/emoji/facebook_messenger/cowboy_hat_face.png differ diff --git a/public/images/emoji/facebook_messenger/crab.png b/public/images/emoji/facebook_messenger/crab.png index 29d38bb172..08a663e3e6 100644 Binary files a/public/images/emoji/facebook_messenger/crab.png and b/public/images/emoji/facebook_messenger/crab.png differ diff --git a/public/images/emoji/facebook_messenger/crayon.png b/public/images/emoji/facebook_messenger/crayon.png index 5f920abb85..136af75cb3 100644 Binary files a/public/images/emoji/facebook_messenger/crayon.png and b/public/images/emoji/facebook_messenger/crayon.png differ diff --git a/public/images/emoji/facebook_messenger/crazy_face.png b/public/images/emoji/facebook_messenger/crazy_face.png index c98503796f..b592d57e70 100644 Binary files a/public/images/emoji/facebook_messenger/crazy_face.png and b/public/images/emoji/facebook_messenger/crazy_face.png differ diff --git a/public/images/emoji/facebook_messenger/credit_card.png b/public/images/emoji/facebook_messenger/credit_card.png index 8274ccb05d..b40840eff1 100644 Binary files a/public/images/emoji/facebook_messenger/credit_card.png and b/public/images/emoji/facebook_messenger/credit_card.png differ diff --git a/public/images/emoji/facebook_messenger/crescent_moon.png b/public/images/emoji/facebook_messenger/crescent_moon.png index 423e9adf48..e29b0bc289 100644 Binary files a/public/images/emoji/facebook_messenger/crescent_moon.png and b/public/images/emoji/facebook_messenger/crescent_moon.png differ diff --git a/public/images/emoji/facebook_messenger/cricket.png b/public/images/emoji/facebook_messenger/cricket.png index 21f51073b7..712a4371be 100644 Binary files a/public/images/emoji/facebook_messenger/cricket.png and b/public/images/emoji/facebook_messenger/cricket.png differ diff --git a/public/images/emoji/facebook_messenger/cricket_bat_and_ball.png b/public/images/emoji/facebook_messenger/cricket_bat_and_ball.png index 3247402fc5..068b8db691 100644 Binary files a/public/images/emoji/facebook_messenger/cricket_bat_and_ball.png and b/public/images/emoji/facebook_messenger/cricket_bat_and_ball.png differ diff --git a/public/images/emoji/facebook_messenger/cricket_bat_ball.png b/public/images/emoji/facebook_messenger/cricket_bat_ball.png index 3247402fc5..068b8db691 100644 Binary files a/public/images/emoji/facebook_messenger/cricket_bat_ball.png and b/public/images/emoji/facebook_messenger/cricket_bat_ball.png differ diff --git a/public/images/emoji/facebook_messenger/croatia.png b/public/images/emoji/facebook_messenger/croatia.png index 4b0c90ed4a..4d3ad5a617 100644 Binary files a/public/images/emoji/facebook_messenger/croatia.png and b/public/images/emoji/facebook_messenger/croatia.png differ diff --git a/public/images/emoji/facebook_messenger/crocodile.png b/public/images/emoji/facebook_messenger/crocodile.png index 0794c39b52..bc179aa498 100644 Binary files a/public/images/emoji/facebook_messenger/crocodile.png and b/public/images/emoji/facebook_messenger/crocodile.png differ diff --git a/public/images/emoji/facebook_messenger/croissant.png b/public/images/emoji/facebook_messenger/croissant.png index 3675ac294e..d35b83c739 100644 Binary files a/public/images/emoji/facebook_messenger/croissant.png and b/public/images/emoji/facebook_messenger/croissant.png differ diff --git a/public/images/emoji/facebook_messenger/cross.png b/public/images/emoji/facebook_messenger/cross.png index 705cfc1e6f..93423cea92 100644 Binary files a/public/images/emoji/facebook_messenger/cross.png and b/public/images/emoji/facebook_messenger/cross.png differ diff --git a/public/images/emoji/facebook_messenger/crossed_fingers.png b/public/images/emoji/facebook_messenger/crossed_fingers.png index 63e4b4c155..caf94062a0 100644 Binary files a/public/images/emoji/facebook_messenger/crossed_fingers.png and b/public/images/emoji/facebook_messenger/crossed_fingers.png differ diff --git a/public/images/emoji/facebook_messenger/crossed_flags.png b/public/images/emoji/facebook_messenger/crossed_flags.png index 2c2802055e..fbc9c7484a 100644 Binary files a/public/images/emoji/facebook_messenger/crossed_flags.png and b/public/images/emoji/facebook_messenger/crossed_flags.png differ diff --git a/public/images/emoji/facebook_messenger/crossed_swords.png b/public/images/emoji/facebook_messenger/crossed_swords.png index 1c2e4956cb..322a498a98 100644 Binary files a/public/images/emoji/facebook_messenger/crossed_swords.png and b/public/images/emoji/facebook_messenger/crossed_swords.png differ diff --git a/public/images/emoji/facebook_messenger/crown.png b/public/images/emoji/facebook_messenger/crown.png index 8b4003b813..a1c0da59d1 100644 Binary files a/public/images/emoji/facebook_messenger/crown.png and b/public/images/emoji/facebook_messenger/crown.png differ diff --git a/public/images/emoji/facebook_messenger/cruise_ship.png b/public/images/emoji/facebook_messenger/cruise_ship.png index a79fe563a4..4324f0d867 100644 Binary files a/public/images/emoji/facebook_messenger/cruise_ship.png and b/public/images/emoji/facebook_messenger/cruise_ship.png differ diff --git a/public/images/emoji/facebook_messenger/cry.png b/public/images/emoji/facebook_messenger/cry.png index 35274e4359..6a640e6350 100644 Binary files a/public/images/emoji/facebook_messenger/cry.png and b/public/images/emoji/facebook_messenger/cry.png differ diff --git a/public/images/emoji/facebook_messenger/crying_cat_face.png b/public/images/emoji/facebook_messenger/crying_cat_face.png index 37e7c91b31..dd321aa5f8 100644 Binary files a/public/images/emoji/facebook_messenger/crying_cat_face.png and b/public/images/emoji/facebook_messenger/crying_cat_face.png differ diff --git a/public/images/emoji/facebook_messenger/crystal_ball.png b/public/images/emoji/facebook_messenger/crystal_ball.png index 4274254a14..ea52f219e8 100644 Binary files a/public/images/emoji/facebook_messenger/crystal_ball.png and b/public/images/emoji/facebook_messenger/crystal_ball.png differ diff --git a/public/images/emoji/facebook_messenger/cuba.png b/public/images/emoji/facebook_messenger/cuba.png index 154462eb04..82232c06c8 100644 Binary files a/public/images/emoji/facebook_messenger/cuba.png and b/public/images/emoji/facebook_messenger/cuba.png differ diff --git a/public/images/emoji/facebook_messenger/cucumber.png b/public/images/emoji/facebook_messenger/cucumber.png index 1331599e45..1d50816ccb 100644 Binary files a/public/images/emoji/facebook_messenger/cucumber.png and b/public/images/emoji/facebook_messenger/cucumber.png differ diff --git a/public/images/emoji/facebook_messenger/cup_with_straw.png b/public/images/emoji/facebook_messenger/cup_with_straw.png index 18d6fea1f5..b2b9215e80 100644 Binary files a/public/images/emoji/facebook_messenger/cup_with_straw.png and b/public/images/emoji/facebook_messenger/cup_with_straw.png differ diff --git a/public/images/emoji/facebook_messenger/cupcake.png b/public/images/emoji/facebook_messenger/cupcake.png new file mode 100644 index 0000000000..68d3be724f Binary files /dev/null and b/public/images/emoji/facebook_messenger/cupcake.png differ diff --git a/public/images/emoji/facebook_messenger/cupid.png b/public/images/emoji/facebook_messenger/cupid.png index 8d936d1e24..aad28db8e0 100644 Binary files a/public/images/emoji/facebook_messenger/cupid.png and b/public/images/emoji/facebook_messenger/cupid.png differ diff --git a/public/images/emoji/facebook_messenger/curacao.png b/public/images/emoji/facebook_messenger/curacao.png index 7425765f9a..4c9ef48dad 100644 Binary files a/public/images/emoji/facebook_messenger/curacao.png and b/public/images/emoji/facebook_messenger/curacao.png differ diff --git a/public/images/emoji/facebook_messenger/curling_stone.png b/public/images/emoji/facebook_messenger/curling_stone.png index b19fa35617..13203d7066 100644 Binary files a/public/images/emoji/facebook_messenger/curling_stone.png and b/public/images/emoji/facebook_messenger/curling_stone.png differ diff --git a/public/images/emoji/facebook_messenger/curly_loop.png b/public/images/emoji/facebook_messenger/curly_loop.png index 6128a31690..d38101b659 100644 Binary files a/public/images/emoji/facebook_messenger/curly_loop.png and b/public/images/emoji/facebook_messenger/curly_loop.png differ diff --git a/public/images/emoji/facebook_messenger/currency_exchange.png b/public/images/emoji/facebook_messenger/currency_exchange.png index 3747db6ca6..fa51fd1942 100644 Binary files a/public/images/emoji/facebook_messenger/currency_exchange.png and b/public/images/emoji/facebook_messenger/currency_exchange.png differ diff --git a/public/images/emoji/facebook_messenger/curry.png b/public/images/emoji/facebook_messenger/curry.png index 11bda1ff92..1a436deea0 100644 Binary files a/public/images/emoji/facebook_messenger/curry.png and b/public/images/emoji/facebook_messenger/curry.png differ diff --git a/public/images/emoji/facebook_messenger/custard.png b/public/images/emoji/facebook_messenger/custard.png index f829264bd3..1e87359d80 100644 Binary files a/public/images/emoji/facebook_messenger/custard.png and b/public/images/emoji/facebook_messenger/custard.png differ diff --git a/public/images/emoji/facebook_messenger/customs.png b/public/images/emoji/facebook_messenger/customs.png index 301caea47c..e8ddab8e87 100644 Binary files a/public/images/emoji/facebook_messenger/customs.png and b/public/images/emoji/facebook_messenger/customs.png differ diff --git a/public/images/emoji/facebook_messenger/cut_of_meat.png b/public/images/emoji/facebook_messenger/cut_of_meat.png index b6f4714c46..97c463eb9f 100644 Binary files a/public/images/emoji/facebook_messenger/cut_of_meat.png and b/public/images/emoji/facebook_messenger/cut_of_meat.png differ diff --git a/public/images/emoji/facebook_messenger/cyclone.png b/public/images/emoji/facebook_messenger/cyclone.png index dfbeb83774..fd47ee77df 100644 Binary files a/public/images/emoji/facebook_messenger/cyclone.png and b/public/images/emoji/facebook_messenger/cyclone.png differ diff --git a/public/images/emoji/facebook_messenger/cyprus.png b/public/images/emoji/facebook_messenger/cyprus.png index 71ef3428ca..efcaf23e34 100644 Binary files a/public/images/emoji/facebook_messenger/cyprus.png and b/public/images/emoji/facebook_messenger/cyprus.png differ diff --git a/public/images/emoji/facebook_messenger/czech_republic.png b/public/images/emoji/facebook_messenger/czech_republic.png index c7b22d1dbc..7200a5aee1 100644 Binary files a/public/images/emoji/facebook_messenger/czech_republic.png and b/public/images/emoji/facebook_messenger/czech_republic.png differ diff --git a/public/images/emoji/facebook_messenger/dagger.png b/public/images/emoji/facebook_messenger/dagger.png index 18965532b4..bda1771565 100644 Binary files a/public/images/emoji/facebook_messenger/dagger.png and b/public/images/emoji/facebook_messenger/dagger.png differ diff --git a/public/images/emoji/facebook_messenger/dagger_knife.png b/public/images/emoji/facebook_messenger/dagger_knife.png index 18965532b4..bda1771565 100644 Binary files a/public/images/emoji/facebook_messenger/dagger_knife.png and b/public/images/emoji/facebook_messenger/dagger_knife.png differ diff --git a/public/images/emoji/facebook_messenger/dancer.png b/public/images/emoji/facebook_messenger/dancer.png index 1626b805d8..1ae3421015 100644 Binary files a/public/images/emoji/facebook_messenger/dancer.png and b/public/images/emoji/facebook_messenger/dancer.png differ diff --git a/public/images/emoji/facebook_messenger/dancers.png b/public/images/emoji/facebook_messenger/dancers.png index 8514dea420..0d75351b37 100644 Binary files a/public/images/emoji/facebook_messenger/dancers.png and b/public/images/emoji/facebook_messenger/dancers.png differ diff --git a/public/images/emoji/facebook_messenger/dancing_men.png b/public/images/emoji/facebook_messenger/dancing_men.png index 873562db0a..d9ee5ed60e 100644 Binary files a/public/images/emoji/facebook_messenger/dancing_men.png and b/public/images/emoji/facebook_messenger/dancing_men.png differ diff --git a/public/images/emoji/facebook_messenger/dancing_women.png b/public/images/emoji/facebook_messenger/dancing_women.png index 8514dea420..0d75351b37 100644 Binary files a/public/images/emoji/facebook_messenger/dancing_women.png and b/public/images/emoji/facebook_messenger/dancing_women.png differ diff --git a/public/images/emoji/facebook_messenger/dango.png b/public/images/emoji/facebook_messenger/dango.png index 549edddc9c..dd20bd14e5 100644 Binary files a/public/images/emoji/facebook_messenger/dango.png and b/public/images/emoji/facebook_messenger/dango.png differ diff --git a/public/images/emoji/facebook_messenger/dark_sunglasses.png b/public/images/emoji/facebook_messenger/dark_sunglasses.png index 666c6f13d5..b497b6f9e5 100644 Binary files a/public/images/emoji/facebook_messenger/dark_sunglasses.png and b/public/images/emoji/facebook_messenger/dark_sunglasses.png differ diff --git a/public/images/emoji/facebook_messenger/dart.png b/public/images/emoji/facebook_messenger/dart.png index d1054c6516..38e128112d 100644 Binary files a/public/images/emoji/facebook_messenger/dart.png and b/public/images/emoji/facebook_messenger/dart.png differ diff --git a/public/images/emoji/facebook_messenger/dash.png b/public/images/emoji/facebook_messenger/dash.png index 99da43cb75..1f22fbd717 100644 Binary files a/public/images/emoji/facebook_messenger/dash.png and b/public/images/emoji/facebook_messenger/dash.png differ diff --git a/public/images/emoji/facebook_messenger/date.png b/public/images/emoji/facebook_messenger/date.png index 5816566750..fb82ad6c80 100644 Binary files a/public/images/emoji/facebook_messenger/date.png and b/public/images/emoji/facebook_messenger/date.png differ diff --git a/public/images/emoji/facebook_messenger/de.png b/public/images/emoji/facebook_messenger/de.png index 8a375afccd..4bb96695b9 100644 Binary files a/public/images/emoji/facebook_messenger/de.png and b/public/images/emoji/facebook_messenger/de.png differ diff --git a/public/images/emoji/facebook_messenger/deciduous_tree.png b/public/images/emoji/facebook_messenger/deciduous_tree.png index 99ec0af655..60042f42c3 100644 Binary files a/public/images/emoji/facebook_messenger/deciduous_tree.png and b/public/images/emoji/facebook_messenger/deciduous_tree.png differ diff --git a/public/images/emoji/facebook_messenger/deer.png b/public/images/emoji/facebook_messenger/deer.png index c9b03cc45f..7dcca9e01a 100644 Binary files a/public/images/emoji/facebook_messenger/deer.png and b/public/images/emoji/facebook_messenger/deer.png differ diff --git a/public/images/emoji/facebook_messenger/denmark.png b/public/images/emoji/facebook_messenger/denmark.png index 182974982d..5004289a32 100644 Binary files a/public/images/emoji/facebook_messenger/denmark.png and b/public/images/emoji/facebook_messenger/denmark.png differ diff --git a/public/images/emoji/facebook_messenger/department_store.png b/public/images/emoji/facebook_messenger/department_store.png index 96222f81e8..6e40682915 100644 Binary files a/public/images/emoji/facebook_messenger/department_store.png and b/public/images/emoji/facebook_messenger/department_store.png differ diff --git a/public/images/emoji/facebook_messenger/derelict_house.png b/public/images/emoji/facebook_messenger/derelict_house.png index a03480bd67..6276196b03 100644 Binary files a/public/images/emoji/facebook_messenger/derelict_house.png and b/public/images/emoji/facebook_messenger/derelict_house.png differ diff --git a/public/images/emoji/facebook_messenger/derelict_house_building.png b/public/images/emoji/facebook_messenger/derelict_house_building.png index a03480bd67..6276196b03 100644 Binary files a/public/images/emoji/facebook_messenger/derelict_house_building.png and b/public/images/emoji/facebook_messenger/derelict_house_building.png differ diff --git a/public/images/emoji/facebook_messenger/desert.png b/public/images/emoji/facebook_messenger/desert.png index 2b62e0a111..647eb4ae9e 100644 Binary files a/public/images/emoji/facebook_messenger/desert.png and b/public/images/emoji/facebook_messenger/desert.png differ diff --git a/public/images/emoji/facebook_messenger/desert_island.png b/public/images/emoji/facebook_messenger/desert_island.png index 7a1f87faf9..0cfd38ea30 100644 Binary files a/public/images/emoji/facebook_messenger/desert_island.png and b/public/images/emoji/facebook_messenger/desert_island.png differ diff --git a/public/images/emoji/facebook_messenger/desktop.png b/public/images/emoji/facebook_messenger/desktop.png index afd2e0ab2b..00d9ca91f9 100644 Binary files a/public/images/emoji/facebook_messenger/desktop.png and b/public/images/emoji/facebook_messenger/desktop.png differ diff --git a/public/images/emoji/facebook_messenger/desktop_computer.png b/public/images/emoji/facebook_messenger/desktop_computer.png index afd2e0ab2b..00d9ca91f9 100644 Binary files a/public/images/emoji/facebook_messenger/desktop_computer.png and b/public/images/emoji/facebook_messenger/desktop_computer.png differ diff --git a/public/images/emoji/facebook_messenger/diamond_shape_with_a_dot_inside.png b/public/images/emoji/facebook_messenger/diamond_shape_with_a_dot_inside.png index bc8c27c99b..aba1b675dd 100644 Binary files a/public/images/emoji/facebook_messenger/diamond_shape_with_a_dot_inside.png and b/public/images/emoji/facebook_messenger/diamond_shape_with_a_dot_inside.png differ diff --git a/public/images/emoji/facebook_messenger/diamonds.png b/public/images/emoji/facebook_messenger/diamonds.png index 51ceb38b9e..ddd5a3a5c2 100644 Binary files a/public/images/emoji/facebook_messenger/diamonds.png and b/public/images/emoji/facebook_messenger/diamonds.png differ diff --git a/public/images/emoji/facebook_messenger/diego_garcia.png b/public/images/emoji/facebook_messenger/diego_garcia.png index 2c48fa114c..be9644c369 100644 Binary files a/public/images/emoji/facebook_messenger/diego_garcia.png and b/public/images/emoji/facebook_messenger/diego_garcia.png differ diff --git a/public/images/emoji/facebook_messenger/disappointed.png b/public/images/emoji/facebook_messenger/disappointed.png index 60fff2810e..f6fe2ad383 100644 Binary files a/public/images/emoji/facebook_messenger/disappointed.png and b/public/images/emoji/facebook_messenger/disappointed.png differ diff --git a/public/images/emoji/facebook_messenger/disappointed_relieved.png b/public/images/emoji/facebook_messenger/disappointed_relieved.png index ff9396b641..e584537e82 100644 Binary files a/public/images/emoji/facebook_messenger/disappointed_relieved.png and b/public/images/emoji/facebook_messenger/disappointed_relieved.png differ diff --git a/public/images/emoji/facebook_messenger/dividers.png b/public/images/emoji/facebook_messenger/dividers.png index 8df2040c73..44775ce79b 100644 Binary files a/public/images/emoji/facebook_messenger/dividers.png and b/public/images/emoji/facebook_messenger/dividers.png differ diff --git a/public/images/emoji/facebook_messenger/dizzy.png b/public/images/emoji/facebook_messenger/dizzy.png index 28e7fc09be..7fc6ec526f 100644 Binary files a/public/images/emoji/facebook_messenger/dizzy.png and b/public/images/emoji/facebook_messenger/dizzy.png differ diff --git a/public/images/emoji/facebook_messenger/dizzy_face.png b/public/images/emoji/facebook_messenger/dizzy_face.png index 762b12e5d9..b298eb5872 100644 Binary files a/public/images/emoji/facebook_messenger/dizzy_face.png and b/public/images/emoji/facebook_messenger/dizzy_face.png differ diff --git a/public/images/emoji/facebook_messenger/djibouti.png b/public/images/emoji/facebook_messenger/djibouti.png index cfd80d614f..3318d25d99 100644 Binary files a/public/images/emoji/facebook_messenger/djibouti.png and b/public/images/emoji/facebook_messenger/djibouti.png differ diff --git a/public/images/emoji/facebook_messenger/dna.png b/public/images/emoji/facebook_messenger/dna.png new file mode 100644 index 0000000000..66efccf23c Binary files /dev/null and b/public/images/emoji/facebook_messenger/dna.png differ diff --git a/public/images/emoji/facebook_messenger/do_not_litter.png b/public/images/emoji/facebook_messenger/do_not_litter.png index 255f8d94ab..867eb642db 100644 Binary files a/public/images/emoji/facebook_messenger/do_not_litter.png and b/public/images/emoji/facebook_messenger/do_not_litter.png differ diff --git a/public/images/emoji/facebook_messenger/dog.png b/public/images/emoji/facebook_messenger/dog.png index b478ca4e39..12e7ac52e9 100644 Binary files a/public/images/emoji/facebook_messenger/dog.png and b/public/images/emoji/facebook_messenger/dog.png differ diff --git a/public/images/emoji/facebook_messenger/dog2.png b/public/images/emoji/facebook_messenger/dog2.png index 476d447a77..bb76f21436 100644 Binary files a/public/images/emoji/facebook_messenger/dog2.png and b/public/images/emoji/facebook_messenger/dog2.png differ diff --git a/public/images/emoji/facebook_messenger/dollar.png b/public/images/emoji/facebook_messenger/dollar.png index d523c3ad2e..632fb9694e 100644 Binary files a/public/images/emoji/facebook_messenger/dollar.png and b/public/images/emoji/facebook_messenger/dollar.png differ diff --git a/public/images/emoji/facebook_messenger/dolls.png b/public/images/emoji/facebook_messenger/dolls.png index f92c9d90fd..06008706a3 100644 Binary files a/public/images/emoji/facebook_messenger/dolls.png and b/public/images/emoji/facebook_messenger/dolls.png differ diff --git a/public/images/emoji/facebook_messenger/dolphin.png b/public/images/emoji/facebook_messenger/dolphin.png index 0229c106b7..1bd5190932 100644 Binary files a/public/images/emoji/facebook_messenger/dolphin.png and b/public/images/emoji/facebook_messenger/dolphin.png differ diff --git a/public/images/emoji/facebook_messenger/dominica.png b/public/images/emoji/facebook_messenger/dominica.png index f25264e8a2..faf9d51906 100644 Binary files a/public/images/emoji/facebook_messenger/dominica.png and b/public/images/emoji/facebook_messenger/dominica.png differ diff --git a/public/images/emoji/facebook_messenger/dominican_republic.png b/public/images/emoji/facebook_messenger/dominican_republic.png index 124c0ea10f..d247a1dea0 100644 Binary files a/public/images/emoji/facebook_messenger/dominican_republic.png and b/public/images/emoji/facebook_messenger/dominican_republic.png differ diff --git a/public/images/emoji/facebook_messenger/door.png b/public/images/emoji/facebook_messenger/door.png index c3ded83934..257dfe49e5 100644 Binary files a/public/images/emoji/facebook_messenger/door.png and b/public/images/emoji/facebook_messenger/door.png differ diff --git a/public/images/emoji/facebook_messenger/double_vertical_bar.png b/public/images/emoji/facebook_messenger/double_vertical_bar.png index de512cc09f..671f364939 100644 Binary files a/public/images/emoji/facebook_messenger/double_vertical_bar.png and b/public/images/emoji/facebook_messenger/double_vertical_bar.png differ diff --git a/public/images/emoji/facebook_messenger/doughnut.png b/public/images/emoji/facebook_messenger/doughnut.png index 7882858ed4..de2e979ab6 100644 Binary files a/public/images/emoji/facebook_messenger/doughnut.png and b/public/images/emoji/facebook_messenger/doughnut.png differ diff --git a/public/images/emoji/facebook_messenger/dove.png b/public/images/emoji/facebook_messenger/dove.png index fbd53b289d..4c7f243eba 100644 Binary files a/public/images/emoji/facebook_messenger/dove.png and b/public/images/emoji/facebook_messenger/dove.png differ diff --git a/public/images/emoji/facebook_messenger/dove_of_peace.png b/public/images/emoji/facebook_messenger/dove_of_peace.png index fbd53b289d..4c7f243eba 100644 Binary files a/public/images/emoji/facebook_messenger/dove_of_peace.png and b/public/images/emoji/facebook_messenger/dove_of_peace.png differ diff --git a/public/images/emoji/facebook_messenger/dragon.png b/public/images/emoji/facebook_messenger/dragon.png index 7493c8bcbe..af12fc53c1 100644 Binary files a/public/images/emoji/facebook_messenger/dragon.png and b/public/images/emoji/facebook_messenger/dragon.png differ diff --git a/public/images/emoji/facebook_messenger/dragon_face.png b/public/images/emoji/facebook_messenger/dragon_face.png index c664b08192..a3b9da0e03 100644 Binary files a/public/images/emoji/facebook_messenger/dragon_face.png and b/public/images/emoji/facebook_messenger/dragon_face.png differ diff --git a/public/images/emoji/facebook_messenger/dress.png b/public/images/emoji/facebook_messenger/dress.png index ff6572470d..90b669181c 100644 Binary files a/public/images/emoji/facebook_messenger/dress.png and b/public/images/emoji/facebook_messenger/dress.png differ diff --git a/public/images/emoji/facebook_messenger/dromedary_camel.png b/public/images/emoji/facebook_messenger/dromedary_camel.png index b9632cf2fc..a7a8cae08b 100644 Binary files a/public/images/emoji/facebook_messenger/dromedary_camel.png and b/public/images/emoji/facebook_messenger/dromedary_camel.png differ diff --git a/public/images/emoji/facebook_messenger/drooling_face.png b/public/images/emoji/facebook_messenger/drooling_face.png index 677d0d3bfd..7b956eb517 100644 Binary files a/public/images/emoji/facebook_messenger/drooling_face.png and b/public/images/emoji/facebook_messenger/drooling_face.png differ diff --git a/public/images/emoji/facebook_messenger/droplet.png b/public/images/emoji/facebook_messenger/droplet.png index 1bd974bb04..f501c80eeb 100644 Binary files a/public/images/emoji/facebook_messenger/droplet.png and b/public/images/emoji/facebook_messenger/droplet.png differ diff --git a/public/images/emoji/facebook_messenger/drum.png b/public/images/emoji/facebook_messenger/drum.png index 94383bf380..09954ce206 100644 Binary files a/public/images/emoji/facebook_messenger/drum.png and b/public/images/emoji/facebook_messenger/drum.png differ diff --git a/public/images/emoji/facebook_messenger/duck.png b/public/images/emoji/facebook_messenger/duck.png index f6c09dd677..222cb49a50 100644 Binary files a/public/images/emoji/facebook_messenger/duck.png and b/public/images/emoji/facebook_messenger/duck.png differ diff --git a/public/images/emoji/facebook_messenger/dumpling.png b/public/images/emoji/facebook_messenger/dumpling.png index 43d8c92275..a06c46cf89 100644 Binary files a/public/images/emoji/facebook_messenger/dumpling.png and b/public/images/emoji/facebook_messenger/dumpling.png differ diff --git a/public/images/emoji/facebook_messenger/dvd.png b/public/images/emoji/facebook_messenger/dvd.png index c81bf2e1e8..1e8cee343c 100644 Binary files a/public/images/emoji/facebook_messenger/dvd.png and b/public/images/emoji/facebook_messenger/dvd.png differ diff --git a/public/images/emoji/facebook_messenger/e-mail.png b/public/images/emoji/facebook_messenger/e-mail.png index e50d4fc637..b9ead4c678 100644 Binary files a/public/images/emoji/facebook_messenger/e-mail.png and b/public/images/emoji/facebook_messenger/e-mail.png differ diff --git a/public/images/emoji/facebook_messenger/eagle.png b/public/images/emoji/facebook_messenger/eagle.png index c152a6f022..1033e85a23 100644 Binary files a/public/images/emoji/facebook_messenger/eagle.png and b/public/images/emoji/facebook_messenger/eagle.png differ diff --git a/public/images/emoji/facebook_messenger/ear.png b/public/images/emoji/facebook_messenger/ear.png index c2cc0b5392..12bc58f8d7 100644 Binary files a/public/images/emoji/facebook_messenger/ear.png and b/public/images/emoji/facebook_messenger/ear.png differ diff --git a/public/images/emoji/facebook_messenger/ear_of_rice.png b/public/images/emoji/facebook_messenger/ear_of_rice.png index 5c443c28e3..75143b83d9 100644 Binary files a/public/images/emoji/facebook_messenger/ear_of_rice.png and b/public/images/emoji/facebook_messenger/ear_of_rice.png differ diff --git a/public/images/emoji/facebook_messenger/earth_africa.png b/public/images/emoji/facebook_messenger/earth_africa.png index 760ac58218..3a34f5648a 100644 Binary files a/public/images/emoji/facebook_messenger/earth_africa.png and b/public/images/emoji/facebook_messenger/earth_africa.png differ diff --git a/public/images/emoji/facebook_messenger/earth_americas.png b/public/images/emoji/facebook_messenger/earth_americas.png index 4ea93a7589..9ca0a76102 100644 Binary files a/public/images/emoji/facebook_messenger/earth_americas.png and b/public/images/emoji/facebook_messenger/earth_americas.png differ diff --git a/public/images/emoji/facebook_messenger/earth_asia.png b/public/images/emoji/facebook_messenger/earth_asia.png index 63dd04b647..97965bc3ba 100644 Binary files a/public/images/emoji/facebook_messenger/earth_asia.png and b/public/images/emoji/facebook_messenger/earth_asia.png differ diff --git a/public/images/emoji/facebook_messenger/ecuador.png b/public/images/emoji/facebook_messenger/ecuador.png index 38527eed7f..baa62952f3 100644 Binary files a/public/images/emoji/facebook_messenger/ecuador.png and b/public/images/emoji/facebook_messenger/ecuador.png differ diff --git a/public/images/emoji/facebook_messenger/egg.png b/public/images/emoji/facebook_messenger/egg.png index 49d700ec26..8ac88036ca 100644 Binary files a/public/images/emoji/facebook_messenger/egg.png and b/public/images/emoji/facebook_messenger/egg.png differ diff --git a/public/images/emoji/facebook_messenger/eggplant.png b/public/images/emoji/facebook_messenger/eggplant.png index aba93476d8..72522cc468 100644 Binary files a/public/images/emoji/facebook_messenger/eggplant.png and b/public/images/emoji/facebook_messenger/eggplant.png differ diff --git a/public/images/emoji/facebook_messenger/egypt.png b/public/images/emoji/facebook_messenger/egypt.png index 82c3bedbdb..b3c0f8e4ce 100644 Binary files a/public/images/emoji/facebook_messenger/egypt.png and b/public/images/emoji/facebook_messenger/egypt.png differ diff --git a/public/images/emoji/facebook_messenger/eight.png b/public/images/emoji/facebook_messenger/eight.png index fa9597b5cd..098b8ad3a9 100644 Binary files a/public/images/emoji/facebook_messenger/eight.png and b/public/images/emoji/facebook_messenger/eight.png differ diff --git a/public/images/emoji/facebook_messenger/eight_pointed_black_star.png b/public/images/emoji/facebook_messenger/eight_pointed_black_star.png index 89a35ee8a6..0e2ce4c2a5 100644 Binary files a/public/images/emoji/facebook_messenger/eight_pointed_black_star.png and b/public/images/emoji/facebook_messenger/eight_pointed_black_star.png differ diff --git a/public/images/emoji/facebook_messenger/eight_spoked_asterisk.png b/public/images/emoji/facebook_messenger/eight_spoked_asterisk.png index 62d86d5833..9f403a865e 100644 Binary files a/public/images/emoji/facebook_messenger/eight_spoked_asterisk.png and b/public/images/emoji/facebook_messenger/eight_spoked_asterisk.png differ diff --git a/public/images/emoji/facebook_messenger/el_salvador.png b/public/images/emoji/facebook_messenger/el_salvador.png index b761864c8a..11fc87615d 100644 Binary files a/public/images/emoji/facebook_messenger/el_salvador.png and b/public/images/emoji/facebook_messenger/el_salvador.png differ diff --git a/public/images/emoji/facebook_messenger/electric_plug.png b/public/images/emoji/facebook_messenger/electric_plug.png index 9dba32a38a..43e163aada 100644 Binary files a/public/images/emoji/facebook_messenger/electric_plug.png and b/public/images/emoji/facebook_messenger/electric_plug.png differ diff --git a/public/images/emoji/facebook_messenger/elephant.png b/public/images/emoji/facebook_messenger/elephant.png index 964f62c9f4..bccaba96ad 100644 Binary files a/public/images/emoji/facebook_messenger/elephant.png and b/public/images/emoji/facebook_messenger/elephant.png differ diff --git a/public/images/emoji/facebook_messenger/elf.png b/public/images/emoji/facebook_messenger/elf.png index 28df7d4551..d3778df5ff 100644 Binary files a/public/images/emoji/facebook_messenger/elf.png and b/public/images/emoji/facebook_messenger/elf.png differ diff --git a/public/images/emoji/facebook_messenger/email.png b/public/images/emoji/facebook_messenger/email.png index e50d4fc637..b9ead4c678 100644 Binary files a/public/images/emoji/facebook_messenger/email.png and b/public/images/emoji/facebook_messenger/email.png differ diff --git a/public/images/emoji/facebook_messenger/end.png b/public/images/emoji/facebook_messenger/end.png index 4fb09e928b..7121a72d60 100644 Binary files a/public/images/emoji/facebook_messenger/end.png and b/public/images/emoji/facebook_messenger/end.png differ diff --git a/public/images/emoji/facebook_messenger/envelope.png b/public/images/emoji/facebook_messenger/envelope.png index e50d4fc637..b9ead4c678 100644 Binary files a/public/images/emoji/facebook_messenger/envelope.png and b/public/images/emoji/facebook_messenger/envelope.png differ diff --git a/public/images/emoji/facebook_messenger/envelope_with_arrow.png b/public/images/emoji/facebook_messenger/envelope_with_arrow.png index 815f2e8c92..4017cb473c 100644 Binary files a/public/images/emoji/facebook_messenger/envelope_with_arrow.png and b/public/images/emoji/facebook_messenger/envelope_with_arrow.png differ diff --git a/public/images/emoji/facebook_messenger/equatorial_guinea.png b/public/images/emoji/facebook_messenger/equatorial_guinea.png index 8d75e77f6c..779c6aa77b 100644 Binary files a/public/images/emoji/facebook_messenger/equatorial_guinea.png and b/public/images/emoji/facebook_messenger/equatorial_guinea.png differ diff --git a/public/images/emoji/facebook_messenger/eritrea.png b/public/images/emoji/facebook_messenger/eritrea.png index 66814696cf..8949de006d 100644 Binary files a/public/images/emoji/facebook_messenger/eritrea.png and b/public/images/emoji/facebook_messenger/eritrea.png differ diff --git a/public/images/emoji/facebook_messenger/es.png b/public/images/emoji/facebook_messenger/es.png index 5d2f27537f..8347d89ca7 100644 Binary files a/public/images/emoji/facebook_messenger/es.png and b/public/images/emoji/facebook_messenger/es.png differ diff --git a/public/images/emoji/facebook_messenger/estonia.png b/public/images/emoji/facebook_messenger/estonia.png index 54e6980bbf..7c4bc678d6 100644 Binary files a/public/images/emoji/facebook_messenger/estonia.png and b/public/images/emoji/facebook_messenger/estonia.png differ diff --git a/public/images/emoji/facebook_messenger/ethiopia.png b/public/images/emoji/facebook_messenger/ethiopia.png index 53d71bf466..2569b402cd 100644 Binary files a/public/images/emoji/facebook_messenger/ethiopia.png and b/public/images/emoji/facebook_messenger/ethiopia.png differ diff --git a/public/images/emoji/facebook_messenger/eu.png b/public/images/emoji/facebook_messenger/eu.png index 206c2b3f62..5209760ad7 100644 Binary files a/public/images/emoji/facebook_messenger/eu.png and b/public/images/emoji/facebook_messenger/eu.png differ diff --git a/public/images/emoji/facebook_messenger/euro.png b/public/images/emoji/facebook_messenger/euro.png index fccf055f99..0cfffdd71a 100644 Binary files a/public/images/emoji/facebook_messenger/euro.png and b/public/images/emoji/facebook_messenger/euro.png differ diff --git a/public/images/emoji/facebook_messenger/european_castle.png b/public/images/emoji/facebook_messenger/european_castle.png index 67966275e0..423ac50a55 100644 Binary files a/public/images/emoji/facebook_messenger/european_castle.png and b/public/images/emoji/facebook_messenger/european_castle.png differ diff --git a/public/images/emoji/facebook_messenger/european_post_office.png b/public/images/emoji/facebook_messenger/european_post_office.png index 8dfaea0d1a..26b8c7ec37 100644 Binary files a/public/images/emoji/facebook_messenger/european_post_office.png and b/public/images/emoji/facebook_messenger/european_post_office.png differ diff --git a/public/images/emoji/facebook_messenger/evergreen_tree.png b/public/images/emoji/facebook_messenger/evergreen_tree.png index a37979eb96..91c54628b8 100644 Binary files a/public/images/emoji/facebook_messenger/evergreen_tree.png and b/public/images/emoji/facebook_messenger/evergreen_tree.png differ diff --git a/public/images/emoji/facebook_messenger/exclamation.png b/public/images/emoji/facebook_messenger/exclamation.png index 1903c396ed..0be3ca0c05 100644 Binary files a/public/images/emoji/facebook_messenger/exclamation.png and b/public/images/emoji/facebook_messenger/exclamation.png differ diff --git a/public/images/emoji/facebook_messenger/exploding_head.png b/public/images/emoji/facebook_messenger/exploding_head.png index a9f5841a2e..d10f860722 100644 Binary files a/public/images/emoji/facebook_messenger/exploding_head.png and b/public/images/emoji/facebook_messenger/exploding_head.png differ diff --git a/public/images/emoji/facebook_messenger/expressionless.png b/public/images/emoji/facebook_messenger/expressionless.png index 37263d3cf0..f535c6a184 100644 Binary files a/public/images/emoji/facebook_messenger/expressionless.png and b/public/images/emoji/facebook_messenger/expressionless.png differ diff --git a/public/images/emoji/facebook_messenger/eye.png b/public/images/emoji/facebook_messenger/eye.png index ddc8746378..f9c56e16c8 100644 Binary files a/public/images/emoji/facebook_messenger/eye.png and b/public/images/emoji/facebook_messenger/eye.png differ diff --git a/public/images/emoji/facebook_messenger/eyeglasses.png b/public/images/emoji/facebook_messenger/eyeglasses.png index 21197b6c81..050ed9b54d 100644 Binary files a/public/images/emoji/facebook_messenger/eyeglasses.png and b/public/images/emoji/facebook_messenger/eyeglasses.png differ diff --git a/public/images/emoji/facebook_messenger/eyes.png b/public/images/emoji/facebook_messenger/eyes.png index 6a8386702e..04349a67cd 100644 Binary files a/public/images/emoji/facebook_messenger/eyes.png and b/public/images/emoji/facebook_messenger/eyes.png differ diff --git a/public/images/emoji/facebook_messenger/face_vomiting.png b/public/images/emoji/facebook_messenger/face_vomiting.png index 5d01c9ce3d..542ddeed95 100644 Binary files a/public/images/emoji/facebook_messenger/face_vomiting.png and b/public/images/emoji/facebook_messenger/face_vomiting.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_hand_over_mouth.png b/public/images/emoji/facebook_messenger/face_with_hand_over_mouth.png index 823c498bf2..de37b74c7e 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_hand_over_mouth.png and b/public/images/emoji/facebook_messenger/face_with_hand_over_mouth.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_head_bandage.png b/public/images/emoji/facebook_messenger/face_with_head_bandage.png index 602886ae28..8128153d8e 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_head_bandage.png and b/public/images/emoji/facebook_messenger/face_with_head_bandage.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_monocle.png b/public/images/emoji/facebook_messenger/face_with_monocle.png index 3fcf2d871d..cb9118817a 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_monocle.png and b/public/images/emoji/facebook_messenger/face_with_monocle.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_raised_eyebrow.png b/public/images/emoji/facebook_messenger/face_with_raised_eyebrow.png index f79d400eae..ae9b091b9f 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_raised_eyebrow.png and b/public/images/emoji/facebook_messenger/face_with_raised_eyebrow.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_rolling_eyes.png b/public/images/emoji/facebook_messenger/face_with_rolling_eyes.png index 06b96d4c45..9d313256ad 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_rolling_eyes.png and b/public/images/emoji/facebook_messenger/face_with_rolling_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_symbols_over_mouth.png b/public/images/emoji/facebook_messenger/face_with_symbols_over_mouth.png index 1d7963a934..2a4a32290f 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_symbols_over_mouth.png and b/public/images/emoji/facebook_messenger/face_with_symbols_over_mouth.png differ diff --git a/public/images/emoji/facebook_messenger/face_with_thermometer.png b/public/images/emoji/facebook_messenger/face_with_thermometer.png index 9c4da3e1fc..4e49efcb3f 100644 Binary files a/public/images/emoji/facebook_messenger/face_with_thermometer.png and b/public/images/emoji/facebook_messenger/face_with_thermometer.png differ diff --git a/public/images/emoji/facebook_messenger/facepunch.png b/public/images/emoji/facebook_messenger/facepunch.png index 9db84ed1fd..bdbbc7a087 100644 Binary files a/public/images/emoji/facebook_messenger/facepunch.png and b/public/images/emoji/facebook_messenger/facepunch.png differ diff --git a/public/images/emoji/facebook_messenger/factory.png b/public/images/emoji/facebook_messenger/factory.png index 48500df348..61fed229b5 100644 Binary files a/public/images/emoji/facebook_messenger/factory.png and b/public/images/emoji/facebook_messenger/factory.png differ diff --git a/public/images/emoji/facebook_messenger/fairy.png b/public/images/emoji/facebook_messenger/fairy.png index 578c0af459..41ea8308d1 100644 Binary files a/public/images/emoji/facebook_messenger/fairy.png and b/public/images/emoji/facebook_messenger/fairy.png differ diff --git a/public/images/emoji/facebook_messenger/falkland_islands.png b/public/images/emoji/facebook_messenger/falkland_islands.png index d92d34fb2f..d236f2ef71 100644 Binary files a/public/images/emoji/facebook_messenger/falkland_islands.png and b/public/images/emoji/facebook_messenger/falkland_islands.png differ diff --git a/public/images/emoji/facebook_messenger/fallen_leaf.png b/public/images/emoji/facebook_messenger/fallen_leaf.png index c36b650a35..80b4ac9d6a 100644 Binary files a/public/images/emoji/facebook_messenger/fallen_leaf.png and b/public/images/emoji/facebook_messenger/fallen_leaf.png differ diff --git a/public/images/emoji/facebook_messenger/family.png b/public/images/emoji/facebook_messenger/family.png index f062b56d63..9019a5fefc 100644 Binary files a/public/images/emoji/facebook_messenger/family.png and b/public/images/emoji/facebook_messenger/family.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_boy.png b/public/images/emoji/facebook_messenger/family_man_boy.png index d5f9acd844..3bcf8132f2 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_boy.png and b/public/images/emoji/facebook_messenger/family_man_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_boy_boy.png b/public/images/emoji/facebook_messenger/family_man_boy_boy.png index 7071038f69..55e787d2d1 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_boy_boy.png and b/public/images/emoji/facebook_messenger/family_man_boy_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_girl.png b/public/images/emoji/facebook_messenger/family_man_girl.png index 19a459b2ec..158ebb1610 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_girl.png and b/public/images/emoji/facebook_messenger/family_man_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_girl_boy.png b/public/images/emoji/facebook_messenger/family_man_girl_boy.png index 23143257d5..0f13209f21 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_girl_boy.png and b/public/images/emoji/facebook_messenger/family_man_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_girl_girl.png b/public/images/emoji/facebook_messenger/family_man_girl_girl.png index b3954a2ca3..2179c49113 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_girl_girl.png and b/public/images/emoji/facebook_messenger/family_man_girl_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_man_boy.png b/public/images/emoji/facebook_messenger/family_man_man_boy.png index 1f70963cb5..f64afea8c8 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_man_boy.png and b/public/images/emoji/facebook_messenger/family_man_man_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_man_boy_boy.png b/public/images/emoji/facebook_messenger/family_man_man_boy_boy.png index f0042698f3..aa55cee7f0 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_man_boy_boy.png and b/public/images/emoji/facebook_messenger/family_man_man_boy_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_man_girl.png b/public/images/emoji/facebook_messenger/family_man_man_girl.png index ad0d796e1a..e53650734b 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_man_girl.png and b/public/images/emoji/facebook_messenger/family_man_man_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_man_girl_boy.png b/public/images/emoji/facebook_messenger/family_man_man_girl_boy.png index 38c179099d..378075395b 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_man_girl_boy.png and b/public/images/emoji/facebook_messenger/family_man_man_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_man_girl_girl.png b/public/images/emoji/facebook_messenger/family_man_man_girl_girl.png index 137ef25dee..0939e7355d 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_man_girl_girl.png and b/public/images/emoji/facebook_messenger/family_man_man_girl_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_boy.png b/public/images/emoji/facebook_messenger/family_man_woman_boy.png index 632185dca7..4b0b719918 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_boy.png and b/public/images/emoji/facebook_messenger/family_man_woman_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_boy_boy.png b/public/images/emoji/facebook_messenger/family_man_woman_boy_boy.png index e5355a098a..84fd11d6d2 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_boy_boy.png and b/public/images/emoji/facebook_messenger/family_man_woman_boy_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_boys.png b/public/images/emoji/facebook_messenger/family_man_woman_boys.png index e5355a098a..84fd11d6d2 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_boys.png and b/public/images/emoji/facebook_messenger/family_man_woman_boys.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_girl.png b/public/images/emoji/facebook_messenger/family_man_woman_girl.png index bdecab4e74..0a4322789a 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_girl.png and b/public/images/emoji/facebook_messenger/family_man_woman_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_girl_boy.png b/public/images/emoji/facebook_messenger/family_man_woman_girl_boy.png index f062b56d63..9019a5fefc 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_girl_boy.png and b/public/images/emoji/facebook_messenger/family_man_woman_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_girl_girl.png b/public/images/emoji/facebook_messenger/family_man_woman_girl_girl.png index c5871f65e1..fcdb100e14 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_girl_girl.png and b/public/images/emoji/facebook_messenger/family_man_woman_girl_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_man_woman_girls.png b/public/images/emoji/facebook_messenger/family_man_woman_girls.png index c5871f65e1..fcdb100e14 100644 Binary files a/public/images/emoji/facebook_messenger/family_man_woman_girls.png and b/public/images/emoji/facebook_messenger/family_man_woman_girls.png differ diff --git a/public/images/emoji/facebook_messenger/family_men_boy.png b/public/images/emoji/facebook_messenger/family_men_boy.png index 1f70963cb5..f64afea8c8 100644 Binary files a/public/images/emoji/facebook_messenger/family_men_boy.png and b/public/images/emoji/facebook_messenger/family_men_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_men_boys.png b/public/images/emoji/facebook_messenger/family_men_boys.png index f0042698f3..aa55cee7f0 100644 Binary files a/public/images/emoji/facebook_messenger/family_men_boys.png and b/public/images/emoji/facebook_messenger/family_men_boys.png differ diff --git a/public/images/emoji/facebook_messenger/family_men_girl.png b/public/images/emoji/facebook_messenger/family_men_girl.png index ad0d796e1a..e53650734b 100644 Binary files a/public/images/emoji/facebook_messenger/family_men_girl.png and b/public/images/emoji/facebook_messenger/family_men_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_men_girl_boy.png b/public/images/emoji/facebook_messenger/family_men_girl_boy.png index 38c179099d..378075395b 100644 Binary files a/public/images/emoji/facebook_messenger/family_men_girl_boy.png and b/public/images/emoji/facebook_messenger/family_men_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_men_girls.png b/public/images/emoji/facebook_messenger/family_men_girls.png index 137ef25dee..0939e7355d 100644 Binary files a/public/images/emoji/facebook_messenger/family_men_girls.png and b/public/images/emoji/facebook_messenger/family_men_girls.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_boy.png b/public/images/emoji/facebook_messenger/family_woman_boy.png index 85b90bce15..6842b085a1 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_boy.png and b/public/images/emoji/facebook_messenger/family_woman_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_boy_boy.png b/public/images/emoji/facebook_messenger/family_woman_boy_boy.png index 8ad5c0ef74..a136414a0f 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_boy_boy.png and b/public/images/emoji/facebook_messenger/family_woman_boy_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_girl.png b/public/images/emoji/facebook_messenger/family_woman_girl.png index 88006bf99a..bd4cb5b293 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_girl.png and b/public/images/emoji/facebook_messenger/family_woman_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_girl_boy.png b/public/images/emoji/facebook_messenger/family_woman_girl_boy.png index 6a75a1fdf8..3a55e4eb11 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_girl_boy.png and b/public/images/emoji/facebook_messenger/family_woman_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_girl_girl.png b/public/images/emoji/facebook_messenger/family_woman_girl_girl.png index b4507cee6d..271d13e623 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_girl_girl.png and b/public/images/emoji/facebook_messenger/family_woman_girl_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_woman_boy.png b/public/images/emoji/facebook_messenger/family_woman_woman_boy.png index 114275fe53..89d048207b 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_woman_boy.png and b/public/images/emoji/facebook_messenger/family_woman_woman_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_woman_boy_boy.png b/public/images/emoji/facebook_messenger/family_woman_woman_boy_boy.png index 9b3324a616..ee1b681641 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_woman_boy_boy.png and b/public/images/emoji/facebook_messenger/family_woman_woman_boy_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_woman_girl.png b/public/images/emoji/facebook_messenger/family_woman_woman_girl.png index 776eb9c96d..ea0ca61ea7 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_woman_girl.png and b/public/images/emoji/facebook_messenger/family_woman_woman_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_woman_girl_boy.png b/public/images/emoji/facebook_messenger/family_woman_woman_girl_boy.png index 21669217fc..24e680576c 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_woman_girl_boy.png and b/public/images/emoji/facebook_messenger/family_woman_woman_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_woman_woman_girl_girl.png b/public/images/emoji/facebook_messenger/family_woman_woman_girl_girl.png index 61d3425d94..29484ff142 100644 Binary files a/public/images/emoji/facebook_messenger/family_woman_woman_girl_girl.png and b/public/images/emoji/facebook_messenger/family_woman_woman_girl_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_women_boy.png b/public/images/emoji/facebook_messenger/family_women_boy.png index 114275fe53..89d048207b 100644 Binary files a/public/images/emoji/facebook_messenger/family_women_boy.png and b/public/images/emoji/facebook_messenger/family_women_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_women_boys.png b/public/images/emoji/facebook_messenger/family_women_boys.png index 9b3324a616..ee1b681641 100644 Binary files a/public/images/emoji/facebook_messenger/family_women_boys.png and b/public/images/emoji/facebook_messenger/family_women_boys.png differ diff --git a/public/images/emoji/facebook_messenger/family_women_girl.png b/public/images/emoji/facebook_messenger/family_women_girl.png index 776eb9c96d..ea0ca61ea7 100644 Binary files a/public/images/emoji/facebook_messenger/family_women_girl.png and b/public/images/emoji/facebook_messenger/family_women_girl.png differ diff --git a/public/images/emoji/facebook_messenger/family_women_girl_boy.png b/public/images/emoji/facebook_messenger/family_women_girl_boy.png index 21669217fc..24e680576c 100644 Binary files a/public/images/emoji/facebook_messenger/family_women_girl_boy.png and b/public/images/emoji/facebook_messenger/family_women_girl_boy.png differ diff --git a/public/images/emoji/facebook_messenger/family_women_girls.png b/public/images/emoji/facebook_messenger/family_women_girls.png index 61d3425d94..29484ff142 100644 Binary files a/public/images/emoji/facebook_messenger/family_women_girls.png and b/public/images/emoji/facebook_messenger/family_women_girls.png differ diff --git a/public/images/emoji/facebook_messenger/faroe_islands.png b/public/images/emoji/facebook_messenger/faroe_islands.png index 6968ee7c57..bf6b15d30a 100644 Binary files a/public/images/emoji/facebook_messenger/faroe_islands.png and b/public/images/emoji/facebook_messenger/faroe_islands.png differ diff --git a/public/images/emoji/facebook_messenger/fast_forward.png b/public/images/emoji/facebook_messenger/fast_forward.png index 2a0a36fdfa..c7f90e4696 100644 Binary files a/public/images/emoji/facebook_messenger/fast_forward.png and b/public/images/emoji/facebook_messenger/fast_forward.png differ diff --git a/public/images/emoji/facebook_messenger/fax.png b/public/images/emoji/facebook_messenger/fax.png index 5fe54424db..551fc5790e 100644 Binary files a/public/images/emoji/facebook_messenger/fax.png and b/public/images/emoji/facebook_messenger/fax.png differ diff --git a/public/images/emoji/facebook_messenger/fearful.png b/public/images/emoji/facebook_messenger/fearful.png index cac14ad2d0..76f15ea351 100644 Binary files a/public/images/emoji/facebook_messenger/fearful.png and b/public/images/emoji/facebook_messenger/fearful.png differ diff --git a/public/images/emoji/facebook_messenger/feet.png b/public/images/emoji/facebook_messenger/feet.png index 19555800a9..6c76493476 100644 Binary files a/public/images/emoji/facebook_messenger/feet.png and b/public/images/emoji/facebook_messenger/feet.png differ diff --git a/public/images/emoji/facebook_messenger/female_couple_with_heart.png b/public/images/emoji/facebook_messenger/female_couple_with_heart.png index ab3c64daed..69e1163bbc 100644 Binary files a/public/images/emoji/facebook_messenger/female_couple_with_heart.png and b/public/images/emoji/facebook_messenger/female_couple_with_heart.png differ diff --git a/public/images/emoji/facebook_messenger/female_couplekiss.png b/public/images/emoji/facebook_messenger/female_couplekiss.png index cb33b1daf9..863d511781 100644 Binary files a/public/images/emoji/facebook_messenger/female_couplekiss.png and b/public/images/emoji/facebook_messenger/female_couplekiss.png differ diff --git a/public/images/emoji/facebook_messenger/female_detective.png b/public/images/emoji/facebook_messenger/female_detective.png index 0c05fc2b6c..878b72a792 100644 Binary files a/public/images/emoji/facebook_messenger/female_detective.png and b/public/images/emoji/facebook_messenger/female_detective.png differ diff --git a/public/images/emoji/facebook_messenger/ferris_wheel.png b/public/images/emoji/facebook_messenger/ferris_wheel.png index ed9b3bad6c..1ca6196bbb 100644 Binary files a/public/images/emoji/facebook_messenger/ferris_wheel.png and b/public/images/emoji/facebook_messenger/ferris_wheel.png differ diff --git a/public/images/emoji/facebook_messenger/ferry.png b/public/images/emoji/facebook_messenger/ferry.png index 094d57bc69..7db8d3cdf1 100644 Binary files a/public/images/emoji/facebook_messenger/ferry.png and b/public/images/emoji/facebook_messenger/ferry.png differ diff --git a/public/images/emoji/facebook_messenger/field_hockey.png b/public/images/emoji/facebook_messenger/field_hockey.png index 170a99ef0d..20fe25b979 100644 Binary files a/public/images/emoji/facebook_messenger/field_hockey.png and b/public/images/emoji/facebook_messenger/field_hockey.png differ diff --git a/public/images/emoji/facebook_messenger/fiji.png b/public/images/emoji/facebook_messenger/fiji.png index 664e772e59..1017c8fe56 100644 Binary files a/public/images/emoji/facebook_messenger/fiji.png and b/public/images/emoji/facebook_messenger/fiji.png differ diff --git a/public/images/emoji/facebook_messenger/file_cabinet.png b/public/images/emoji/facebook_messenger/file_cabinet.png index 65fd2c5c29..45d441b9b7 100644 Binary files a/public/images/emoji/facebook_messenger/file_cabinet.png and b/public/images/emoji/facebook_messenger/file_cabinet.png differ diff --git a/public/images/emoji/facebook_messenger/file_folder.png b/public/images/emoji/facebook_messenger/file_folder.png index f0767e0c85..af2701a452 100644 Binary files a/public/images/emoji/facebook_messenger/file_folder.png and b/public/images/emoji/facebook_messenger/file_folder.png differ diff --git a/public/images/emoji/facebook_messenger/film_frames.png b/public/images/emoji/facebook_messenger/film_frames.png index a52d79d20f..7f4f9a5c7f 100644 Binary files a/public/images/emoji/facebook_messenger/film_frames.png and b/public/images/emoji/facebook_messenger/film_frames.png differ diff --git a/public/images/emoji/facebook_messenger/film_projector.png b/public/images/emoji/facebook_messenger/film_projector.png index 61cf7f7bac..20c9cbe76f 100644 Binary files a/public/images/emoji/facebook_messenger/film_projector.png and b/public/images/emoji/facebook_messenger/film_projector.png differ diff --git a/public/images/emoji/facebook_messenger/film_strip.png b/public/images/emoji/facebook_messenger/film_strip.png index a52d79d20f..7f4f9a5c7f 100644 Binary files a/public/images/emoji/facebook_messenger/film_strip.png and b/public/images/emoji/facebook_messenger/film_strip.png differ diff --git a/public/images/emoji/facebook_messenger/finland.png b/public/images/emoji/facebook_messenger/finland.png index b912331641..597be3c070 100644 Binary files a/public/images/emoji/facebook_messenger/finland.png and b/public/images/emoji/facebook_messenger/finland.png differ diff --git a/public/images/emoji/facebook_messenger/fire.png b/public/images/emoji/facebook_messenger/fire.png index 6915f6350e..3510083979 100644 Binary files a/public/images/emoji/facebook_messenger/fire.png and b/public/images/emoji/facebook_messenger/fire.png differ diff --git a/public/images/emoji/facebook_messenger/fire_engine.png b/public/images/emoji/facebook_messenger/fire_engine.png index 2638586eee..c080dd2373 100644 Binary files a/public/images/emoji/facebook_messenger/fire_engine.png and b/public/images/emoji/facebook_messenger/fire_engine.png differ diff --git a/public/images/emoji/facebook_messenger/fire_extinguisher.png b/public/images/emoji/facebook_messenger/fire_extinguisher.png new file mode 100644 index 0000000000..f05d9276a1 Binary files /dev/null and b/public/images/emoji/facebook_messenger/fire_extinguisher.png differ diff --git a/public/images/emoji/facebook_messenger/firecracker.png b/public/images/emoji/facebook_messenger/firecracker.png new file mode 100644 index 0000000000..0364e240bd Binary files /dev/null and b/public/images/emoji/facebook_messenger/firecracker.png differ diff --git a/public/images/emoji/facebook_messenger/fireworks.png b/public/images/emoji/facebook_messenger/fireworks.png index 2668be1397..97314cbdf8 100644 Binary files a/public/images/emoji/facebook_messenger/fireworks.png and b/public/images/emoji/facebook_messenger/fireworks.png differ diff --git a/public/images/emoji/facebook_messenger/first_quarter_moon.png b/public/images/emoji/facebook_messenger/first_quarter_moon.png index d0e1d4e755..b0aaa8eba3 100644 Binary files a/public/images/emoji/facebook_messenger/first_quarter_moon.png and b/public/images/emoji/facebook_messenger/first_quarter_moon.png differ diff --git a/public/images/emoji/facebook_messenger/first_quarter_moon_with_face.png b/public/images/emoji/facebook_messenger/first_quarter_moon_with_face.png index 08066c164a..2ef1f1c5e5 100644 Binary files a/public/images/emoji/facebook_messenger/first_quarter_moon_with_face.png and b/public/images/emoji/facebook_messenger/first_quarter_moon_with_face.png differ diff --git a/public/images/emoji/facebook_messenger/fish.png b/public/images/emoji/facebook_messenger/fish.png index 1d94061c4b..6f14515ef6 100644 Binary files a/public/images/emoji/facebook_messenger/fish.png and b/public/images/emoji/facebook_messenger/fish.png differ diff --git a/public/images/emoji/facebook_messenger/fish_cake.png b/public/images/emoji/facebook_messenger/fish_cake.png index 7337b4a973..689f889ebc 100644 Binary files a/public/images/emoji/facebook_messenger/fish_cake.png and b/public/images/emoji/facebook_messenger/fish_cake.png differ diff --git a/public/images/emoji/facebook_messenger/fishing_pole_and_fish.png b/public/images/emoji/facebook_messenger/fishing_pole_and_fish.png index 1d90b0b3c4..42a4b5f4fc 100644 Binary files a/public/images/emoji/facebook_messenger/fishing_pole_and_fish.png and b/public/images/emoji/facebook_messenger/fishing_pole_and_fish.png differ diff --git a/public/images/emoji/facebook_messenger/fist.png b/public/images/emoji/facebook_messenger/fist.png index 51a0bdaec0..f155d4f0e1 100644 Binary files a/public/images/emoji/facebook_messenger/fist.png and b/public/images/emoji/facebook_messenger/fist.png differ diff --git a/public/images/emoji/facebook_messenger/fist_left.png b/public/images/emoji/facebook_messenger/fist_left.png index 77c33b2da8..8aca4c3f23 100644 Binary files a/public/images/emoji/facebook_messenger/fist_left.png and b/public/images/emoji/facebook_messenger/fist_left.png differ diff --git a/public/images/emoji/facebook_messenger/fist_right.png b/public/images/emoji/facebook_messenger/fist_right.png index 9b7ef4d8a4..b2ec5365a1 100644 Binary files a/public/images/emoji/facebook_messenger/fist_right.png and b/public/images/emoji/facebook_messenger/fist_right.png differ diff --git a/public/images/emoji/facebook_messenger/five.png b/public/images/emoji/facebook_messenger/five.png index e7b38107eb..e0a35a820e 100644 Binary files a/public/images/emoji/facebook_messenger/five.png and b/public/images/emoji/facebook_messenger/five.png differ diff --git a/public/images/emoji/facebook_messenger/flag_black.png b/public/images/emoji/facebook_messenger/flag_black.png index bc52913998..cf62460cc1 100644 Binary files a/public/images/emoji/facebook_messenger/flag_black.png and b/public/images/emoji/facebook_messenger/flag_black.png differ diff --git a/public/images/emoji/facebook_messenger/flag_cn.png b/public/images/emoji/facebook_messenger/flag_cn.png index ddad4d8315..3840d20a9e 100644 Binary files a/public/images/emoji/facebook_messenger/flag_cn.png and b/public/images/emoji/facebook_messenger/flag_cn.png differ diff --git a/public/images/emoji/facebook_messenger/flag_de.png b/public/images/emoji/facebook_messenger/flag_de.png index 8a375afccd..4bb96695b9 100644 Binary files a/public/images/emoji/facebook_messenger/flag_de.png and b/public/images/emoji/facebook_messenger/flag_de.png differ diff --git a/public/images/emoji/facebook_messenger/flag_es.png b/public/images/emoji/facebook_messenger/flag_es.png index 5d2f27537f..8347d89ca7 100644 Binary files a/public/images/emoji/facebook_messenger/flag_es.png and b/public/images/emoji/facebook_messenger/flag_es.png differ diff --git a/public/images/emoji/facebook_messenger/flag_fr.png b/public/images/emoji/facebook_messenger/flag_fr.png index 2ef71d792a..cf75e74cf2 100644 Binary files a/public/images/emoji/facebook_messenger/flag_fr.png and b/public/images/emoji/facebook_messenger/flag_fr.png differ diff --git a/public/images/emoji/facebook_messenger/flag_gb.png b/public/images/emoji/facebook_messenger/flag_gb.png index 8ba8cda3ac..9064418988 100644 Binary files a/public/images/emoji/facebook_messenger/flag_gb.png and b/public/images/emoji/facebook_messenger/flag_gb.png differ diff --git a/public/images/emoji/facebook_messenger/flag_it.png b/public/images/emoji/facebook_messenger/flag_it.png index 1b5c5906b3..67454a828b 100644 Binary files a/public/images/emoji/facebook_messenger/flag_it.png and b/public/images/emoji/facebook_messenger/flag_it.png differ diff --git a/public/images/emoji/facebook_messenger/flag_jp.png b/public/images/emoji/facebook_messenger/flag_jp.png index ef2bc7b48f..eead98355b 100644 Binary files a/public/images/emoji/facebook_messenger/flag_jp.png and b/public/images/emoji/facebook_messenger/flag_jp.png differ diff --git a/public/images/emoji/facebook_messenger/flag_kr.png b/public/images/emoji/facebook_messenger/flag_kr.png index 4bd85faa98..00124acb1a 100644 Binary files a/public/images/emoji/facebook_messenger/flag_kr.png and b/public/images/emoji/facebook_messenger/flag_kr.png differ diff --git a/public/images/emoji/facebook_messenger/flag_ru.png b/public/images/emoji/facebook_messenger/flag_ru.png index 89692b70ef..7a42ac56d2 100644 Binary files a/public/images/emoji/facebook_messenger/flag_ru.png and b/public/images/emoji/facebook_messenger/flag_ru.png differ diff --git a/public/images/emoji/facebook_messenger/flag_us.png b/public/images/emoji/facebook_messenger/flag_us.png index 103498e009..edbed579fc 100644 Binary files a/public/images/emoji/facebook_messenger/flag_us.png and b/public/images/emoji/facebook_messenger/flag_us.png differ diff --git a/public/images/emoji/facebook_messenger/flag_white.png b/public/images/emoji/facebook_messenger/flag_white.png index 34dfcb802a..5be38ef018 100644 Binary files a/public/images/emoji/facebook_messenger/flag_white.png and b/public/images/emoji/facebook_messenger/flag_white.png differ diff --git a/public/images/emoji/facebook_messenger/flags.png b/public/images/emoji/facebook_messenger/flags.png index 3ff68d9b47..1e600286c4 100644 Binary files a/public/images/emoji/facebook_messenger/flags.png and b/public/images/emoji/facebook_messenger/flags.png differ diff --git a/public/images/emoji/facebook_messenger/flame.png b/public/images/emoji/facebook_messenger/flame.png index 6915f6350e..3510083979 100644 Binary files a/public/images/emoji/facebook_messenger/flame.png and b/public/images/emoji/facebook_messenger/flame.png differ diff --git a/public/images/emoji/facebook_messenger/flashlight.png b/public/images/emoji/facebook_messenger/flashlight.png index 7ea2a2ff84..fa649777a7 100644 Binary files a/public/images/emoji/facebook_messenger/flashlight.png and b/public/images/emoji/facebook_messenger/flashlight.png differ diff --git a/public/images/emoji/facebook_messenger/flat_shoe.png b/public/images/emoji/facebook_messenger/flat_shoe.png new file mode 100644 index 0000000000..2898e55dc0 Binary files /dev/null and b/public/images/emoji/facebook_messenger/flat_shoe.png differ diff --git a/public/images/emoji/facebook_messenger/fleur-de-lis.png b/public/images/emoji/facebook_messenger/fleur-de-lis.png index 4066f0646a..380dc02213 100644 Binary files a/public/images/emoji/facebook_messenger/fleur-de-lis.png and b/public/images/emoji/facebook_messenger/fleur-de-lis.png differ diff --git a/public/images/emoji/facebook_messenger/fleur_de_lis.png b/public/images/emoji/facebook_messenger/fleur_de_lis.png index 4066f0646a..380dc02213 100644 Binary files a/public/images/emoji/facebook_messenger/fleur_de_lis.png and b/public/images/emoji/facebook_messenger/fleur_de_lis.png differ diff --git a/public/images/emoji/facebook_messenger/flight_arrival.png b/public/images/emoji/facebook_messenger/flight_arrival.png index 4e22866646..1849e3a1ee 100644 Binary files a/public/images/emoji/facebook_messenger/flight_arrival.png and b/public/images/emoji/facebook_messenger/flight_arrival.png differ diff --git a/public/images/emoji/facebook_messenger/flight_departure.png b/public/images/emoji/facebook_messenger/flight_departure.png index bfa84966f7..de0a85372e 100644 Binary files a/public/images/emoji/facebook_messenger/flight_departure.png and b/public/images/emoji/facebook_messenger/flight_departure.png differ diff --git a/public/images/emoji/facebook_messenger/floppy_disk.png b/public/images/emoji/facebook_messenger/floppy_disk.png index 2efaf0997a..1353e41f0f 100644 Binary files a/public/images/emoji/facebook_messenger/floppy_disk.png and b/public/images/emoji/facebook_messenger/floppy_disk.png differ diff --git a/public/images/emoji/facebook_messenger/flower_playing_cards.png b/public/images/emoji/facebook_messenger/flower_playing_cards.png index 2bb67f87db..0b4060e562 100644 Binary files a/public/images/emoji/facebook_messenger/flower_playing_cards.png and b/public/images/emoji/facebook_messenger/flower_playing_cards.png differ diff --git a/public/images/emoji/facebook_messenger/flushed.png b/public/images/emoji/facebook_messenger/flushed.png index b1de1c333a..d7bc5d1a3e 100644 Binary files a/public/images/emoji/facebook_messenger/flushed.png and b/public/images/emoji/facebook_messenger/flushed.png differ diff --git a/public/images/emoji/facebook_messenger/flying_disc.png b/public/images/emoji/facebook_messenger/flying_disc.png new file mode 100644 index 0000000000..ef34259ead Binary files /dev/null and b/public/images/emoji/facebook_messenger/flying_disc.png differ diff --git a/public/images/emoji/facebook_messenger/flying_saucer.png b/public/images/emoji/facebook_messenger/flying_saucer.png index 012c32faf9..ad459ccbb1 100644 Binary files a/public/images/emoji/facebook_messenger/flying_saucer.png and b/public/images/emoji/facebook_messenger/flying_saucer.png differ diff --git a/public/images/emoji/facebook_messenger/fog.png b/public/images/emoji/facebook_messenger/fog.png index 5684bd2467..7e11a61f60 100644 Binary files a/public/images/emoji/facebook_messenger/fog.png and b/public/images/emoji/facebook_messenger/fog.png differ diff --git a/public/images/emoji/facebook_messenger/foggy.png b/public/images/emoji/facebook_messenger/foggy.png index 711fe0d85d..0b53910075 100644 Binary files a/public/images/emoji/facebook_messenger/foggy.png and b/public/images/emoji/facebook_messenger/foggy.png differ diff --git a/public/images/emoji/facebook_messenger/foot.png b/public/images/emoji/facebook_messenger/foot.png new file mode 100644 index 0000000000..ed57c2bd9c Binary files /dev/null and b/public/images/emoji/facebook_messenger/foot.png differ diff --git a/public/images/emoji/facebook_messenger/football.png b/public/images/emoji/facebook_messenger/football.png index 4db67dcfe8..1ac5184d16 100644 Binary files a/public/images/emoji/facebook_messenger/football.png and b/public/images/emoji/facebook_messenger/football.png differ diff --git a/public/images/emoji/facebook_messenger/footprints.png b/public/images/emoji/facebook_messenger/footprints.png index 19555800a9..6c76493476 100644 Binary files a/public/images/emoji/facebook_messenger/footprints.png and b/public/images/emoji/facebook_messenger/footprints.png differ diff --git a/public/images/emoji/facebook_messenger/fork_and_knife.png b/public/images/emoji/facebook_messenger/fork_and_knife.png index 4dd1ed6f5c..287905f7bb 100644 Binary files a/public/images/emoji/facebook_messenger/fork_and_knife.png and b/public/images/emoji/facebook_messenger/fork_and_knife.png differ diff --git a/public/images/emoji/facebook_messenger/fork_and_knife_with_plate.png b/public/images/emoji/facebook_messenger/fork_and_knife_with_plate.png index 84fd7bba6a..00925930e1 100644 Binary files a/public/images/emoji/facebook_messenger/fork_and_knife_with_plate.png and b/public/images/emoji/facebook_messenger/fork_and_knife_with_plate.png differ diff --git a/public/images/emoji/facebook_messenger/fork_knife_plate.png b/public/images/emoji/facebook_messenger/fork_knife_plate.png index 84fd7bba6a..00925930e1 100644 Binary files a/public/images/emoji/facebook_messenger/fork_knife_plate.png and b/public/images/emoji/facebook_messenger/fork_knife_plate.png differ diff --git a/public/images/emoji/facebook_messenger/fortune_cookie.png b/public/images/emoji/facebook_messenger/fortune_cookie.png index d023dc45dd..bc06369f3e 100644 Binary files a/public/images/emoji/facebook_messenger/fortune_cookie.png and b/public/images/emoji/facebook_messenger/fortune_cookie.png differ diff --git a/public/images/emoji/facebook_messenger/fountain.png b/public/images/emoji/facebook_messenger/fountain.png index 13cc69f0d7..6f086a6fa7 100644 Binary files a/public/images/emoji/facebook_messenger/fountain.png and b/public/images/emoji/facebook_messenger/fountain.png differ diff --git a/public/images/emoji/facebook_messenger/fountain_pen.png b/public/images/emoji/facebook_messenger/fountain_pen.png index 2e7296057b..6693c145e4 100644 Binary files a/public/images/emoji/facebook_messenger/fountain_pen.png and b/public/images/emoji/facebook_messenger/fountain_pen.png differ diff --git a/public/images/emoji/facebook_messenger/four.png b/public/images/emoji/facebook_messenger/four.png index bf7e0c444d..2855b01f0d 100644 Binary files a/public/images/emoji/facebook_messenger/four.png and b/public/images/emoji/facebook_messenger/four.png differ diff --git a/public/images/emoji/facebook_messenger/four_leaf_clover.png b/public/images/emoji/facebook_messenger/four_leaf_clover.png index 6bb5773121..1b80f6c7bf 100644 Binary files a/public/images/emoji/facebook_messenger/four_leaf_clover.png and b/public/images/emoji/facebook_messenger/four_leaf_clover.png differ diff --git a/public/images/emoji/facebook_messenger/fox_face.png b/public/images/emoji/facebook_messenger/fox_face.png index ddc3a4e751..c6672f0824 100644 Binary files a/public/images/emoji/facebook_messenger/fox_face.png and b/public/images/emoji/facebook_messenger/fox_face.png differ diff --git a/public/images/emoji/facebook_messenger/fr.png b/public/images/emoji/facebook_messenger/fr.png index 2ef71d792a..cf75e74cf2 100644 Binary files a/public/images/emoji/facebook_messenger/fr.png and b/public/images/emoji/facebook_messenger/fr.png differ diff --git a/public/images/emoji/facebook_messenger/frame_photo.png b/public/images/emoji/facebook_messenger/frame_photo.png index 9a61cd3cd7..63f3f490f3 100644 Binary files a/public/images/emoji/facebook_messenger/frame_photo.png and b/public/images/emoji/facebook_messenger/frame_photo.png differ diff --git a/public/images/emoji/facebook_messenger/frame_with_picture.png b/public/images/emoji/facebook_messenger/frame_with_picture.png index 9a61cd3cd7..63f3f490f3 100644 Binary files a/public/images/emoji/facebook_messenger/frame_with_picture.png and b/public/images/emoji/facebook_messenger/frame_with_picture.png differ diff --git a/public/images/emoji/facebook_messenger/framed_picture.png b/public/images/emoji/facebook_messenger/framed_picture.png index 9a61cd3cd7..63f3f490f3 100644 Binary files a/public/images/emoji/facebook_messenger/framed_picture.png and b/public/images/emoji/facebook_messenger/framed_picture.png differ diff --git a/public/images/emoji/facebook_messenger/free.png b/public/images/emoji/facebook_messenger/free.png index 8079e73326..ffa7ce1058 100644 Binary files a/public/images/emoji/facebook_messenger/free.png and b/public/images/emoji/facebook_messenger/free.png differ diff --git a/public/images/emoji/facebook_messenger/french_guiana.png b/public/images/emoji/facebook_messenger/french_guiana.png index 9a989f2cb1..58e498721c 100644 Binary files a/public/images/emoji/facebook_messenger/french_guiana.png and b/public/images/emoji/facebook_messenger/french_guiana.png differ diff --git a/public/images/emoji/facebook_messenger/french_polynesia.png b/public/images/emoji/facebook_messenger/french_polynesia.png index 18c22d5625..4224abf279 100644 Binary files a/public/images/emoji/facebook_messenger/french_polynesia.png and b/public/images/emoji/facebook_messenger/french_polynesia.png differ diff --git a/public/images/emoji/facebook_messenger/french_southern_territories.png b/public/images/emoji/facebook_messenger/french_southern_territories.png index 3e6643ad03..0c9be8cfb7 100644 Binary files a/public/images/emoji/facebook_messenger/french_southern_territories.png and b/public/images/emoji/facebook_messenger/french_southern_territories.png differ diff --git a/public/images/emoji/facebook_messenger/fried_egg.png b/public/images/emoji/facebook_messenger/fried_egg.png index 9020c53b0c..45a068e957 100644 Binary files a/public/images/emoji/facebook_messenger/fried_egg.png and b/public/images/emoji/facebook_messenger/fried_egg.png differ diff --git a/public/images/emoji/facebook_messenger/fried_shrimp.png b/public/images/emoji/facebook_messenger/fried_shrimp.png index 16fca0768d..1c5d08b130 100644 Binary files a/public/images/emoji/facebook_messenger/fried_shrimp.png and b/public/images/emoji/facebook_messenger/fried_shrimp.png differ diff --git a/public/images/emoji/facebook_messenger/fries.png b/public/images/emoji/facebook_messenger/fries.png index e5b1893c87..0f078b6835 100644 Binary files a/public/images/emoji/facebook_messenger/fries.png and b/public/images/emoji/facebook_messenger/fries.png differ diff --git a/public/images/emoji/facebook_messenger/frog.png b/public/images/emoji/facebook_messenger/frog.png index 3dfa411b72..a8d1f92a6a 100644 Binary files a/public/images/emoji/facebook_messenger/frog.png and b/public/images/emoji/facebook_messenger/frog.png differ diff --git a/public/images/emoji/facebook_messenger/frowning.png b/public/images/emoji/facebook_messenger/frowning.png index 971c37f998..2c22a65008 100644 Binary files a/public/images/emoji/facebook_messenger/frowning.png and b/public/images/emoji/facebook_messenger/frowning.png differ diff --git a/public/images/emoji/facebook_messenger/frowning2.png b/public/images/emoji/facebook_messenger/frowning2.png index e35c8cec02..5bd72b3eb4 100644 Binary files a/public/images/emoji/facebook_messenger/frowning2.png and b/public/images/emoji/facebook_messenger/frowning2.png differ diff --git a/public/images/emoji/facebook_messenger/frowning_face.png b/public/images/emoji/facebook_messenger/frowning_face.png index e35c8cec02..5bd72b3eb4 100644 Binary files a/public/images/emoji/facebook_messenger/frowning_face.png and b/public/images/emoji/facebook_messenger/frowning_face.png differ diff --git a/public/images/emoji/facebook_messenger/frowning_man.png b/public/images/emoji/facebook_messenger/frowning_man.png index 87a0828c37..8a81066ea6 100644 Binary files a/public/images/emoji/facebook_messenger/frowning_man.png and b/public/images/emoji/facebook_messenger/frowning_man.png differ diff --git a/public/images/emoji/facebook_messenger/frowning_woman.png b/public/images/emoji/facebook_messenger/frowning_woman.png index 1b7de19871..7cef5b6e8c 100644 Binary files a/public/images/emoji/facebook_messenger/frowning_woman.png and b/public/images/emoji/facebook_messenger/frowning_woman.png differ diff --git a/public/images/emoji/facebook_messenger/fu.png b/public/images/emoji/facebook_messenger/fu.png index 7f227d2d23..bc7e5f100c 100644 Binary files a/public/images/emoji/facebook_messenger/fu.png and b/public/images/emoji/facebook_messenger/fu.png differ diff --git a/public/images/emoji/facebook_messenger/fuelpump.png b/public/images/emoji/facebook_messenger/fuelpump.png index c0e4d0debb..ea33b36692 100644 Binary files a/public/images/emoji/facebook_messenger/fuelpump.png and b/public/images/emoji/facebook_messenger/fuelpump.png differ diff --git a/public/images/emoji/facebook_messenger/full_moon.png b/public/images/emoji/facebook_messenger/full_moon.png index 2a7748b936..2080166695 100644 Binary files a/public/images/emoji/facebook_messenger/full_moon.png and b/public/images/emoji/facebook_messenger/full_moon.png differ diff --git a/public/images/emoji/facebook_messenger/full_moon_with_face.png b/public/images/emoji/facebook_messenger/full_moon_with_face.png index 8fa6950024..626ce7cd94 100644 Binary files a/public/images/emoji/facebook_messenger/full_moon_with_face.png and b/public/images/emoji/facebook_messenger/full_moon_with_face.png differ diff --git a/public/images/emoji/facebook_messenger/funeral_urn.png b/public/images/emoji/facebook_messenger/funeral_urn.png index 818fa27fb8..3605e4e15f 100644 Binary files a/public/images/emoji/facebook_messenger/funeral_urn.png and b/public/images/emoji/facebook_messenger/funeral_urn.png differ diff --git a/public/images/emoji/facebook_messenger/gabon.png b/public/images/emoji/facebook_messenger/gabon.png index c1a2fb11fc..eefe4d7c65 100644 Binary files a/public/images/emoji/facebook_messenger/gabon.png and b/public/images/emoji/facebook_messenger/gabon.png differ diff --git a/public/images/emoji/facebook_messenger/gambia.png b/public/images/emoji/facebook_messenger/gambia.png index 33622c52ae..80b0b13a8d 100644 Binary files a/public/images/emoji/facebook_messenger/gambia.png and b/public/images/emoji/facebook_messenger/gambia.png differ diff --git a/public/images/emoji/facebook_messenger/game_die.png b/public/images/emoji/facebook_messenger/game_die.png index 4c6642d798..f7838e3324 100644 Binary files a/public/images/emoji/facebook_messenger/game_die.png and b/public/images/emoji/facebook_messenger/game_die.png differ diff --git a/public/images/emoji/facebook_messenger/gb.png b/public/images/emoji/facebook_messenger/gb.png index 8ba8cda3ac..9064418988 100644 Binary files a/public/images/emoji/facebook_messenger/gb.png and b/public/images/emoji/facebook_messenger/gb.png differ diff --git a/public/images/emoji/facebook_messenger/gear.png b/public/images/emoji/facebook_messenger/gear.png index dae873e04f..f1600b1118 100644 Binary files a/public/images/emoji/facebook_messenger/gear.png and b/public/images/emoji/facebook_messenger/gear.png differ diff --git a/public/images/emoji/facebook_messenger/gem.png b/public/images/emoji/facebook_messenger/gem.png index e4544a4fe5..ea6c176055 100644 Binary files a/public/images/emoji/facebook_messenger/gem.png and b/public/images/emoji/facebook_messenger/gem.png differ diff --git a/public/images/emoji/facebook_messenger/gemini.png b/public/images/emoji/facebook_messenger/gemini.png index 7af737f442..42bdde20ba 100644 Binary files a/public/images/emoji/facebook_messenger/gemini.png and b/public/images/emoji/facebook_messenger/gemini.png differ diff --git a/public/images/emoji/facebook_messenger/genie.png b/public/images/emoji/facebook_messenger/genie.png index e6eec0fe3c..c21865ab71 100644 Binary files a/public/images/emoji/facebook_messenger/genie.png and b/public/images/emoji/facebook_messenger/genie.png differ diff --git a/public/images/emoji/facebook_messenger/georgia.png b/public/images/emoji/facebook_messenger/georgia.png index 34dc6a4189..15839be1c0 100644 Binary files a/public/images/emoji/facebook_messenger/georgia.png and b/public/images/emoji/facebook_messenger/georgia.png differ diff --git a/public/images/emoji/facebook_messenger/ghana.png b/public/images/emoji/facebook_messenger/ghana.png index 968d76a9f9..a8662a755d 100644 Binary files a/public/images/emoji/facebook_messenger/ghana.png and b/public/images/emoji/facebook_messenger/ghana.png differ diff --git a/public/images/emoji/facebook_messenger/ghost.png b/public/images/emoji/facebook_messenger/ghost.png index a863a1583c..8b7b48c4e0 100644 Binary files a/public/images/emoji/facebook_messenger/ghost.png and b/public/images/emoji/facebook_messenger/ghost.png differ diff --git a/public/images/emoji/facebook_messenger/gibraltar.png b/public/images/emoji/facebook_messenger/gibraltar.png index 95f4bde22b..79061ad673 100644 Binary files a/public/images/emoji/facebook_messenger/gibraltar.png and b/public/images/emoji/facebook_messenger/gibraltar.png differ diff --git a/public/images/emoji/facebook_messenger/gift.png b/public/images/emoji/facebook_messenger/gift.png index f472a530a3..93e315d400 100644 Binary files a/public/images/emoji/facebook_messenger/gift.png and b/public/images/emoji/facebook_messenger/gift.png differ diff --git a/public/images/emoji/facebook_messenger/gift_heart.png b/public/images/emoji/facebook_messenger/gift_heart.png index dc0ebbf3af..249d226448 100644 Binary files a/public/images/emoji/facebook_messenger/gift_heart.png and b/public/images/emoji/facebook_messenger/gift_heart.png differ diff --git a/public/images/emoji/facebook_messenger/giraffe.png b/public/images/emoji/facebook_messenger/giraffe.png index 38971ced07..3d718609d8 100644 Binary files a/public/images/emoji/facebook_messenger/giraffe.png and b/public/images/emoji/facebook_messenger/giraffe.png differ diff --git a/public/images/emoji/facebook_messenger/girl.png b/public/images/emoji/facebook_messenger/girl.png index 6d02f25aef..ac79e10b2c 100644 Binary files a/public/images/emoji/facebook_messenger/girl.png and b/public/images/emoji/facebook_messenger/girl.png differ diff --git a/public/images/emoji/facebook_messenger/globe_with_meridians.png b/public/images/emoji/facebook_messenger/globe_with_meridians.png index 01de602655..4d05dd3660 100644 Binary files a/public/images/emoji/facebook_messenger/globe_with_meridians.png and b/public/images/emoji/facebook_messenger/globe_with_meridians.png differ diff --git a/public/images/emoji/facebook_messenger/gloves.png b/public/images/emoji/facebook_messenger/gloves.png index f0c79270aa..08f815158a 100644 Binary files a/public/images/emoji/facebook_messenger/gloves.png and b/public/images/emoji/facebook_messenger/gloves.png differ diff --git a/public/images/emoji/facebook_messenger/goal_net.png b/public/images/emoji/facebook_messenger/goal_net.png index 1587bf485a..b16bc547d2 100644 Binary files a/public/images/emoji/facebook_messenger/goal_net.png and b/public/images/emoji/facebook_messenger/goal_net.png differ diff --git a/public/images/emoji/facebook_messenger/goat.png b/public/images/emoji/facebook_messenger/goat.png index 2b433344ab..830bacaf7b 100644 Binary files a/public/images/emoji/facebook_messenger/goat.png and b/public/images/emoji/facebook_messenger/goat.png differ diff --git a/public/images/emoji/facebook_messenger/goggles.png b/public/images/emoji/facebook_messenger/goggles.png new file mode 100644 index 0000000000..0cf62133d7 Binary files /dev/null and b/public/images/emoji/facebook_messenger/goggles.png differ diff --git a/public/images/emoji/facebook_messenger/golf.png b/public/images/emoji/facebook_messenger/golf.png index c4d3e9825a..467ca871f3 100644 Binary files a/public/images/emoji/facebook_messenger/golf.png and b/public/images/emoji/facebook_messenger/golf.png differ diff --git a/public/images/emoji/facebook_messenger/golfer.png b/public/images/emoji/facebook_messenger/golfer.png index b9b3813b61..3d0703073c 100644 Binary files a/public/images/emoji/facebook_messenger/golfer.png and b/public/images/emoji/facebook_messenger/golfer.png differ diff --git a/public/images/emoji/facebook_messenger/golfing_man.png b/public/images/emoji/facebook_messenger/golfing_man.png index b9b3813b61..3d0703073c 100644 Binary files a/public/images/emoji/facebook_messenger/golfing_man.png and b/public/images/emoji/facebook_messenger/golfing_man.png differ diff --git a/public/images/emoji/facebook_messenger/golfing_woman.png b/public/images/emoji/facebook_messenger/golfing_woman.png index 6892a2c001..f1b10e586b 100644 Binary files a/public/images/emoji/facebook_messenger/golfing_woman.png and b/public/images/emoji/facebook_messenger/golfing_woman.png differ diff --git a/public/images/emoji/facebook_messenger/gorilla.png b/public/images/emoji/facebook_messenger/gorilla.png index 2b6c812747..6af71c4477 100644 Binary files a/public/images/emoji/facebook_messenger/gorilla.png and b/public/images/emoji/facebook_messenger/gorilla.png differ diff --git a/public/images/emoji/facebook_messenger/grandma.png b/public/images/emoji/facebook_messenger/grandma.png index e03cb5c779..f5a900ab15 100644 Binary files a/public/images/emoji/facebook_messenger/grandma.png and b/public/images/emoji/facebook_messenger/grandma.png differ diff --git a/public/images/emoji/facebook_messenger/grapes.png b/public/images/emoji/facebook_messenger/grapes.png index 23ae219f03..45232f43a4 100644 Binary files a/public/images/emoji/facebook_messenger/grapes.png and b/public/images/emoji/facebook_messenger/grapes.png differ diff --git a/public/images/emoji/facebook_messenger/greece.png b/public/images/emoji/facebook_messenger/greece.png index b14999baaf..d624770c09 100644 Binary files a/public/images/emoji/facebook_messenger/greece.png and b/public/images/emoji/facebook_messenger/greece.png differ diff --git a/public/images/emoji/facebook_messenger/green_apple.png b/public/images/emoji/facebook_messenger/green_apple.png index a86a4bae2e..fe30f7674a 100644 Binary files a/public/images/emoji/facebook_messenger/green_apple.png and b/public/images/emoji/facebook_messenger/green_apple.png differ diff --git a/public/images/emoji/facebook_messenger/green_book.png b/public/images/emoji/facebook_messenger/green_book.png index 77b7cfc9ae..7e8011361a 100644 Binary files a/public/images/emoji/facebook_messenger/green_book.png and b/public/images/emoji/facebook_messenger/green_book.png differ diff --git a/public/images/emoji/facebook_messenger/green_heart.png b/public/images/emoji/facebook_messenger/green_heart.png index 56b2d8c32a..b56f0f4c99 100644 Binary files a/public/images/emoji/facebook_messenger/green_heart.png and b/public/images/emoji/facebook_messenger/green_heart.png differ diff --git a/public/images/emoji/facebook_messenger/green_salad.png b/public/images/emoji/facebook_messenger/green_salad.png index e2c0f4eb12..f282011c82 100644 Binary files a/public/images/emoji/facebook_messenger/green_salad.png and b/public/images/emoji/facebook_messenger/green_salad.png differ diff --git a/public/images/emoji/facebook_messenger/greenland.png b/public/images/emoji/facebook_messenger/greenland.png index 0ff15a9ce5..9fc18a9141 100644 Binary files a/public/images/emoji/facebook_messenger/greenland.png and b/public/images/emoji/facebook_messenger/greenland.png differ diff --git a/public/images/emoji/facebook_messenger/grenada.png b/public/images/emoji/facebook_messenger/grenada.png index daa85edf80..9173368903 100644 Binary files a/public/images/emoji/facebook_messenger/grenada.png and b/public/images/emoji/facebook_messenger/grenada.png differ diff --git a/public/images/emoji/facebook_messenger/grey_exclamation.png b/public/images/emoji/facebook_messenger/grey_exclamation.png index a44d73e9dd..89734470b4 100644 Binary files a/public/images/emoji/facebook_messenger/grey_exclamation.png and b/public/images/emoji/facebook_messenger/grey_exclamation.png differ diff --git a/public/images/emoji/facebook_messenger/grey_question.png b/public/images/emoji/facebook_messenger/grey_question.png index 959bc4b17f..12f0c31da1 100644 Binary files a/public/images/emoji/facebook_messenger/grey_question.png and b/public/images/emoji/facebook_messenger/grey_question.png differ diff --git a/public/images/emoji/facebook_messenger/grimacing.png b/public/images/emoji/facebook_messenger/grimacing.png index 99ef127b0a..2b487a8cb4 100644 Binary files a/public/images/emoji/facebook_messenger/grimacing.png and b/public/images/emoji/facebook_messenger/grimacing.png differ diff --git a/public/images/emoji/facebook_messenger/grin.png b/public/images/emoji/facebook_messenger/grin.png index 897ca7c7f2..3781d65674 100644 Binary files a/public/images/emoji/facebook_messenger/grin.png and b/public/images/emoji/facebook_messenger/grin.png differ diff --git a/public/images/emoji/facebook_messenger/grinning.png b/public/images/emoji/facebook_messenger/grinning.png index 96c64315a7..db1133e3ac 100644 Binary files a/public/images/emoji/facebook_messenger/grinning.png and b/public/images/emoji/facebook_messenger/grinning.png differ diff --git a/public/images/emoji/facebook_messenger/guadeloupe.png b/public/images/emoji/facebook_messenger/guadeloupe.png index a971544962..17758a0137 100644 Binary files a/public/images/emoji/facebook_messenger/guadeloupe.png and b/public/images/emoji/facebook_messenger/guadeloupe.png differ diff --git a/public/images/emoji/facebook_messenger/guam.png b/public/images/emoji/facebook_messenger/guam.png index fe22a2d203..2aa9ffa74a 100644 Binary files a/public/images/emoji/facebook_messenger/guam.png and b/public/images/emoji/facebook_messenger/guam.png differ diff --git a/public/images/emoji/facebook_messenger/guardsman.png b/public/images/emoji/facebook_messenger/guardsman.png index 31878125c2..df03bbb198 100644 Binary files a/public/images/emoji/facebook_messenger/guardsman.png and b/public/images/emoji/facebook_messenger/guardsman.png differ diff --git a/public/images/emoji/facebook_messenger/guardswoman.png b/public/images/emoji/facebook_messenger/guardswoman.png index 97b1b0cdf4..af61441c2a 100644 Binary files a/public/images/emoji/facebook_messenger/guardswoman.png and b/public/images/emoji/facebook_messenger/guardswoman.png differ diff --git a/public/images/emoji/facebook_messenger/guatemala.png b/public/images/emoji/facebook_messenger/guatemala.png index d2f304231b..a930f8a478 100644 Binary files a/public/images/emoji/facebook_messenger/guatemala.png and b/public/images/emoji/facebook_messenger/guatemala.png differ diff --git a/public/images/emoji/facebook_messenger/guernsey.png b/public/images/emoji/facebook_messenger/guernsey.png index f44090afdf..d6912283c9 100644 Binary files a/public/images/emoji/facebook_messenger/guernsey.png and b/public/images/emoji/facebook_messenger/guernsey.png differ diff --git a/public/images/emoji/facebook_messenger/guinea.png b/public/images/emoji/facebook_messenger/guinea.png index f5be8aae5a..e0b0f4f079 100644 Binary files a/public/images/emoji/facebook_messenger/guinea.png and b/public/images/emoji/facebook_messenger/guinea.png differ diff --git a/public/images/emoji/facebook_messenger/guinea_bissau.png b/public/images/emoji/facebook_messenger/guinea_bissau.png index 28a2c2389f..6cad556f0b 100644 Binary files a/public/images/emoji/facebook_messenger/guinea_bissau.png and b/public/images/emoji/facebook_messenger/guinea_bissau.png differ diff --git a/public/images/emoji/facebook_messenger/guitar.png b/public/images/emoji/facebook_messenger/guitar.png index e0ef8db988..61de8b8ac0 100644 Binary files a/public/images/emoji/facebook_messenger/guitar.png and b/public/images/emoji/facebook_messenger/guitar.png differ diff --git a/public/images/emoji/facebook_messenger/gun.png b/public/images/emoji/facebook_messenger/gun.png index d2c1b3e737..ce3b71ceba 100644 Binary files a/public/images/emoji/facebook_messenger/gun.png and b/public/images/emoji/facebook_messenger/gun.png differ diff --git a/public/images/emoji/facebook_messenger/guyana.png b/public/images/emoji/facebook_messenger/guyana.png index 8e4eb44c47..992d746f0e 100644 Binary files a/public/images/emoji/facebook_messenger/guyana.png and b/public/images/emoji/facebook_messenger/guyana.png differ diff --git a/public/images/emoji/facebook_messenger/haircut.png b/public/images/emoji/facebook_messenger/haircut.png index cbf2b9410f..54869ce39e 100644 Binary files a/public/images/emoji/facebook_messenger/haircut.png and b/public/images/emoji/facebook_messenger/haircut.png differ diff --git a/public/images/emoji/facebook_messenger/haircut_man.png b/public/images/emoji/facebook_messenger/haircut_man.png index a497d7c559..8bfabddb59 100644 Binary files a/public/images/emoji/facebook_messenger/haircut_man.png and b/public/images/emoji/facebook_messenger/haircut_man.png differ diff --git a/public/images/emoji/facebook_messenger/haircut_woman.png b/public/images/emoji/facebook_messenger/haircut_woman.png index cbf2b9410f..54869ce39e 100644 Binary files a/public/images/emoji/facebook_messenger/haircut_woman.png and b/public/images/emoji/facebook_messenger/haircut_woman.png differ diff --git a/public/images/emoji/facebook_messenger/haiti.png b/public/images/emoji/facebook_messenger/haiti.png index 19dfa54998..c1ef7cc126 100644 Binary files a/public/images/emoji/facebook_messenger/haiti.png and b/public/images/emoji/facebook_messenger/haiti.png differ diff --git a/public/images/emoji/facebook_messenger/hamburger.png b/public/images/emoji/facebook_messenger/hamburger.png index f97e8ccbde..14d6441027 100644 Binary files a/public/images/emoji/facebook_messenger/hamburger.png and b/public/images/emoji/facebook_messenger/hamburger.png differ diff --git a/public/images/emoji/facebook_messenger/hammer.png b/public/images/emoji/facebook_messenger/hammer.png index 69487b597d..7a69c4a99b 100644 Binary files a/public/images/emoji/facebook_messenger/hammer.png and b/public/images/emoji/facebook_messenger/hammer.png differ diff --git a/public/images/emoji/facebook_messenger/hammer_and_pick.png b/public/images/emoji/facebook_messenger/hammer_and_pick.png index 585f3afe9d..2c8a70943f 100644 Binary files a/public/images/emoji/facebook_messenger/hammer_and_pick.png and b/public/images/emoji/facebook_messenger/hammer_and_pick.png differ diff --git a/public/images/emoji/facebook_messenger/hammer_and_wrench.png b/public/images/emoji/facebook_messenger/hammer_and_wrench.png index ed21302869..3b2646f5f7 100644 Binary files a/public/images/emoji/facebook_messenger/hammer_and_wrench.png and b/public/images/emoji/facebook_messenger/hammer_and_wrench.png differ diff --git a/public/images/emoji/facebook_messenger/hammer_pick.png b/public/images/emoji/facebook_messenger/hammer_pick.png index 585f3afe9d..2c8a70943f 100644 Binary files a/public/images/emoji/facebook_messenger/hammer_pick.png and b/public/images/emoji/facebook_messenger/hammer_pick.png differ diff --git a/public/images/emoji/facebook_messenger/hamster.png b/public/images/emoji/facebook_messenger/hamster.png index 04a6d2fd05..b35e426ca3 100644 Binary files a/public/images/emoji/facebook_messenger/hamster.png and b/public/images/emoji/facebook_messenger/hamster.png differ diff --git a/public/images/emoji/facebook_messenger/hand.png b/public/images/emoji/facebook_messenger/hand.png index 17f858c2fa..62d1a5076a 100644 Binary files a/public/images/emoji/facebook_messenger/hand.png and b/public/images/emoji/facebook_messenger/hand.png differ diff --git a/public/images/emoji/facebook_messenger/hand_splayed.png b/public/images/emoji/facebook_messenger/hand_splayed.png index 600cb22c58..d732df9355 100644 Binary files a/public/images/emoji/facebook_messenger/hand_splayed.png and b/public/images/emoji/facebook_messenger/hand_splayed.png differ diff --git a/public/images/emoji/facebook_messenger/handbag.png b/public/images/emoji/facebook_messenger/handbag.png index f722ba09c1..4096beaa9b 100644 Binary files a/public/images/emoji/facebook_messenger/handbag.png and b/public/images/emoji/facebook_messenger/handbag.png differ diff --git a/public/images/emoji/facebook_messenger/handshake.png b/public/images/emoji/facebook_messenger/handshake.png index 9f33302261..c23359d26c 100644 Binary files a/public/images/emoji/facebook_messenger/handshake.png and b/public/images/emoji/facebook_messenger/handshake.png differ diff --git a/public/images/emoji/facebook_messenger/hankey.png b/public/images/emoji/facebook_messenger/hankey.png index 7c3e519922..fa0dae8290 100644 Binary files a/public/images/emoji/facebook_messenger/hankey.png and b/public/images/emoji/facebook_messenger/hankey.png differ diff --git a/public/images/emoji/facebook_messenger/hash.png b/public/images/emoji/facebook_messenger/hash.png index 72b73a8fc5..e5167e172f 100644 Binary files a/public/images/emoji/facebook_messenger/hash.png and b/public/images/emoji/facebook_messenger/hash.png differ diff --git a/public/images/emoji/facebook_messenger/hatched_chick.png b/public/images/emoji/facebook_messenger/hatched_chick.png index 3da991ab2c..858c919278 100644 Binary files a/public/images/emoji/facebook_messenger/hatched_chick.png and b/public/images/emoji/facebook_messenger/hatched_chick.png differ diff --git a/public/images/emoji/facebook_messenger/hatching_chick.png b/public/images/emoji/facebook_messenger/hatching_chick.png index d4f74aa4d5..1eff5bb814 100644 Binary files a/public/images/emoji/facebook_messenger/hatching_chick.png and b/public/images/emoji/facebook_messenger/hatching_chick.png differ diff --git a/public/images/emoji/facebook_messenger/head_bandage.png b/public/images/emoji/facebook_messenger/head_bandage.png index 602886ae28..8128153d8e 100644 Binary files a/public/images/emoji/facebook_messenger/head_bandage.png and b/public/images/emoji/facebook_messenger/head_bandage.png differ diff --git a/public/images/emoji/facebook_messenger/headphones.png b/public/images/emoji/facebook_messenger/headphones.png index ace9eda596..dc8d9b4377 100644 Binary files a/public/images/emoji/facebook_messenger/headphones.png and b/public/images/emoji/facebook_messenger/headphones.png differ diff --git a/public/images/emoji/facebook_messenger/hear_no_evil.png b/public/images/emoji/facebook_messenger/hear_no_evil.png index f03d4ad4a5..4c1fb72168 100644 Binary files a/public/images/emoji/facebook_messenger/hear_no_evil.png and b/public/images/emoji/facebook_messenger/hear_no_evil.png differ diff --git a/public/images/emoji/facebook_messenger/heard_and_mc_donald_islands.png b/public/images/emoji/facebook_messenger/heard_and_mc_donald_islands.png index fa2f3852cb..11a36dbc64 100644 Binary files a/public/images/emoji/facebook_messenger/heard_and_mc_donald_islands.png and b/public/images/emoji/facebook_messenger/heard_and_mc_donald_islands.png differ diff --git a/public/images/emoji/facebook_messenger/heart.png b/public/images/emoji/facebook_messenger/heart.png index 2d97890163..85c10acd84 100644 Binary files a/public/images/emoji/facebook_messenger/heart.png and b/public/images/emoji/facebook_messenger/heart.png differ diff --git a/public/images/emoji/facebook_messenger/heart_decoration.png b/public/images/emoji/facebook_messenger/heart_decoration.png index 61a8cf5b25..02a2ee3f55 100644 Binary files a/public/images/emoji/facebook_messenger/heart_decoration.png and b/public/images/emoji/facebook_messenger/heart_decoration.png differ diff --git a/public/images/emoji/facebook_messenger/heart_exclamation.png b/public/images/emoji/facebook_messenger/heart_exclamation.png index 026082fabb..77cde18025 100644 Binary files a/public/images/emoji/facebook_messenger/heart_exclamation.png and b/public/images/emoji/facebook_messenger/heart_exclamation.png differ diff --git a/public/images/emoji/facebook_messenger/heart_eyes.png b/public/images/emoji/facebook_messenger/heart_eyes.png index 50a43d9081..2ec301d105 100644 Binary files a/public/images/emoji/facebook_messenger/heart_eyes.png and b/public/images/emoji/facebook_messenger/heart_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/heart_eyes_cat.png b/public/images/emoji/facebook_messenger/heart_eyes_cat.png index 48f8910a5e..a713e1eeaf 100644 Binary files a/public/images/emoji/facebook_messenger/heart_eyes_cat.png and b/public/images/emoji/facebook_messenger/heart_eyes_cat.png differ diff --git a/public/images/emoji/facebook_messenger/heartbeat.png b/public/images/emoji/facebook_messenger/heartbeat.png index 1dff4e5be8..34f1ba578c 100644 Binary files a/public/images/emoji/facebook_messenger/heartbeat.png and b/public/images/emoji/facebook_messenger/heartbeat.png differ diff --git a/public/images/emoji/facebook_messenger/heartpulse.png b/public/images/emoji/facebook_messenger/heartpulse.png index e789909dec..ae2b6c437b 100644 Binary files a/public/images/emoji/facebook_messenger/heartpulse.png and b/public/images/emoji/facebook_messenger/heartpulse.png differ diff --git a/public/images/emoji/facebook_messenger/hearts.png b/public/images/emoji/facebook_messenger/hearts.png index d2cd3477ec..237afbd244 100644 Binary files a/public/images/emoji/facebook_messenger/hearts.png and b/public/images/emoji/facebook_messenger/hearts.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_check_mark.png b/public/images/emoji/facebook_messenger/heavy_check_mark.png index 00d59ba534..33e17aa275 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_check_mark.png and b/public/images/emoji/facebook_messenger/heavy_check_mark.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_division_sign.png b/public/images/emoji/facebook_messenger/heavy_division_sign.png index 2bb364dd8a..440f13b114 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_division_sign.png and b/public/images/emoji/facebook_messenger/heavy_division_sign.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_dollar_sign.png b/public/images/emoji/facebook_messenger/heavy_dollar_sign.png index e356de42d5..03d9a93524 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_dollar_sign.png and b/public/images/emoji/facebook_messenger/heavy_dollar_sign.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_heart_exclamation.png b/public/images/emoji/facebook_messenger/heavy_heart_exclamation.png index 026082fabb..77cde18025 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_heart_exclamation.png and b/public/images/emoji/facebook_messenger/heavy_heart_exclamation.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_heart_exclamation_mark_ornament.png b/public/images/emoji/facebook_messenger/heavy_heart_exclamation_mark_ornament.png index 026082fabb..77cde18025 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_heart_exclamation_mark_ornament.png and b/public/images/emoji/facebook_messenger/heavy_heart_exclamation_mark_ornament.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_minus_sign.png b/public/images/emoji/facebook_messenger/heavy_minus_sign.png index 9f9d9d165f..099cd147aa 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_minus_sign.png and b/public/images/emoji/facebook_messenger/heavy_minus_sign.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_multiplication_x.png b/public/images/emoji/facebook_messenger/heavy_multiplication_x.png index 846b870e88..e60b111dd5 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_multiplication_x.png and b/public/images/emoji/facebook_messenger/heavy_multiplication_x.png differ diff --git a/public/images/emoji/facebook_messenger/heavy_plus_sign.png b/public/images/emoji/facebook_messenger/heavy_plus_sign.png index 3cb405cab2..f6102d07ee 100644 Binary files a/public/images/emoji/facebook_messenger/heavy_plus_sign.png and b/public/images/emoji/facebook_messenger/heavy_plus_sign.png differ diff --git a/public/images/emoji/facebook_messenger/hedgehog.png b/public/images/emoji/facebook_messenger/hedgehog.png index d877234ff9..a3e4df2de7 100644 Binary files a/public/images/emoji/facebook_messenger/hedgehog.png and b/public/images/emoji/facebook_messenger/hedgehog.png differ diff --git a/public/images/emoji/facebook_messenger/helicopter.png b/public/images/emoji/facebook_messenger/helicopter.png index d66ada6082..6414116c81 100644 Binary files a/public/images/emoji/facebook_messenger/helicopter.png and b/public/images/emoji/facebook_messenger/helicopter.png differ diff --git a/public/images/emoji/facebook_messenger/helmet_with_cross.png b/public/images/emoji/facebook_messenger/helmet_with_cross.png index 959efb0fb0..1158423213 100644 Binary files a/public/images/emoji/facebook_messenger/helmet_with_cross.png and b/public/images/emoji/facebook_messenger/helmet_with_cross.png differ diff --git a/public/images/emoji/facebook_messenger/helmet_with_white_cross.png b/public/images/emoji/facebook_messenger/helmet_with_white_cross.png index 959efb0fb0..1158423213 100644 Binary files a/public/images/emoji/facebook_messenger/helmet_with_white_cross.png and b/public/images/emoji/facebook_messenger/helmet_with_white_cross.png differ diff --git a/public/images/emoji/facebook_messenger/herb.png b/public/images/emoji/facebook_messenger/herb.png index 537c88ff2e..5cc58fa669 100644 Binary files a/public/images/emoji/facebook_messenger/herb.png and b/public/images/emoji/facebook_messenger/herb.png differ diff --git a/public/images/emoji/facebook_messenger/hibiscus.png b/public/images/emoji/facebook_messenger/hibiscus.png index 0f40ef1f0e..3c89b8ff26 100644 Binary files a/public/images/emoji/facebook_messenger/hibiscus.png and b/public/images/emoji/facebook_messenger/hibiscus.png differ diff --git a/public/images/emoji/facebook_messenger/high_brightness.png b/public/images/emoji/facebook_messenger/high_brightness.png index bfe3eff100..bcc8387b6f 100644 Binary files a/public/images/emoji/facebook_messenger/high_brightness.png and b/public/images/emoji/facebook_messenger/high_brightness.png differ diff --git a/public/images/emoji/facebook_messenger/high_heel.png b/public/images/emoji/facebook_messenger/high_heel.png index 1f252a71f2..38748fe32e 100644 Binary files a/public/images/emoji/facebook_messenger/high_heel.png and b/public/images/emoji/facebook_messenger/high_heel.png differ diff --git a/public/images/emoji/facebook_messenger/hiking_boot.png b/public/images/emoji/facebook_messenger/hiking_boot.png new file mode 100644 index 0000000000..1e97c61b01 Binary files /dev/null and b/public/images/emoji/facebook_messenger/hiking_boot.png differ diff --git a/public/images/emoji/facebook_messenger/hippopotamus.png b/public/images/emoji/facebook_messenger/hippopotamus.png new file mode 100644 index 0000000000..87048aaa59 Binary files /dev/null and b/public/images/emoji/facebook_messenger/hippopotamus.png differ diff --git a/public/images/emoji/facebook_messenger/hocho.png b/public/images/emoji/facebook_messenger/hocho.png index 963153dd29..fa5308faa4 100644 Binary files a/public/images/emoji/facebook_messenger/hocho.png and b/public/images/emoji/facebook_messenger/hocho.png differ diff --git a/public/images/emoji/facebook_messenger/hockey.png b/public/images/emoji/facebook_messenger/hockey.png index a8776ad0b3..86c7144cd7 100644 Binary files a/public/images/emoji/facebook_messenger/hockey.png and b/public/images/emoji/facebook_messenger/hockey.png differ diff --git a/public/images/emoji/facebook_messenger/hole.png b/public/images/emoji/facebook_messenger/hole.png index 54686d0428..1cd7aaf92b 100644 Binary files a/public/images/emoji/facebook_messenger/hole.png and b/public/images/emoji/facebook_messenger/hole.png differ diff --git a/public/images/emoji/facebook_messenger/homes.png b/public/images/emoji/facebook_messenger/homes.png index 8e3698a572..83bf0509ad 100644 Binary files a/public/images/emoji/facebook_messenger/homes.png and b/public/images/emoji/facebook_messenger/homes.png differ diff --git a/public/images/emoji/facebook_messenger/honduras.png b/public/images/emoji/facebook_messenger/honduras.png index e1eb11f5a7..d29cea6e61 100644 Binary files a/public/images/emoji/facebook_messenger/honduras.png and b/public/images/emoji/facebook_messenger/honduras.png differ diff --git a/public/images/emoji/facebook_messenger/honey_pot.png b/public/images/emoji/facebook_messenger/honey_pot.png index dde7e17e7c..08084e93f5 100644 Binary files a/public/images/emoji/facebook_messenger/honey_pot.png and b/public/images/emoji/facebook_messenger/honey_pot.png differ diff --git a/public/images/emoji/facebook_messenger/honeybee.png b/public/images/emoji/facebook_messenger/honeybee.png index 649181cf28..74b0b41098 100644 Binary files a/public/images/emoji/facebook_messenger/honeybee.png and b/public/images/emoji/facebook_messenger/honeybee.png differ diff --git a/public/images/emoji/facebook_messenger/hong_kong.png b/public/images/emoji/facebook_messenger/hong_kong.png index 01ac6e241c..6e4f4db7e2 100644 Binary files a/public/images/emoji/facebook_messenger/hong_kong.png and b/public/images/emoji/facebook_messenger/hong_kong.png differ diff --git a/public/images/emoji/facebook_messenger/horse.png b/public/images/emoji/facebook_messenger/horse.png index 54ad115988..ebc1c709a6 100644 Binary files a/public/images/emoji/facebook_messenger/horse.png and b/public/images/emoji/facebook_messenger/horse.png differ diff --git a/public/images/emoji/facebook_messenger/horse_racing.png b/public/images/emoji/facebook_messenger/horse_racing.png index 436c3d0b23..2262a23d02 100644 Binary files a/public/images/emoji/facebook_messenger/horse_racing.png and b/public/images/emoji/facebook_messenger/horse_racing.png differ diff --git a/public/images/emoji/facebook_messenger/hospital.png b/public/images/emoji/facebook_messenger/hospital.png index aadcadf4aa..a973233893 100644 Binary files a/public/images/emoji/facebook_messenger/hospital.png and b/public/images/emoji/facebook_messenger/hospital.png differ diff --git a/public/images/emoji/facebook_messenger/hot_dog.png b/public/images/emoji/facebook_messenger/hot_dog.png index e45ce386c4..1ec567b2c3 100644 Binary files a/public/images/emoji/facebook_messenger/hot_dog.png and b/public/images/emoji/facebook_messenger/hot_dog.png differ diff --git a/public/images/emoji/facebook_messenger/hot_face.png b/public/images/emoji/facebook_messenger/hot_face.png new file mode 100644 index 0000000000..08e3a353d4 Binary files /dev/null and b/public/images/emoji/facebook_messenger/hot_face.png differ diff --git a/public/images/emoji/facebook_messenger/hot_pepper.png b/public/images/emoji/facebook_messenger/hot_pepper.png index abb2655218..63a848343d 100644 Binary files a/public/images/emoji/facebook_messenger/hot_pepper.png and b/public/images/emoji/facebook_messenger/hot_pepper.png differ diff --git a/public/images/emoji/facebook_messenger/hotdog.png b/public/images/emoji/facebook_messenger/hotdog.png index e45ce386c4..1ec567b2c3 100644 Binary files a/public/images/emoji/facebook_messenger/hotdog.png and b/public/images/emoji/facebook_messenger/hotdog.png differ diff --git a/public/images/emoji/facebook_messenger/hotel.png b/public/images/emoji/facebook_messenger/hotel.png index 47b7b53926..ae9504eb56 100644 Binary files a/public/images/emoji/facebook_messenger/hotel.png and b/public/images/emoji/facebook_messenger/hotel.png differ diff --git a/public/images/emoji/facebook_messenger/hotsprings.png b/public/images/emoji/facebook_messenger/hotsprings.png index a5ceefcb10..2070bfeaa9 100644 Binary files a/public/images/emoji/facebook_messenger/hotsprings.png and b/public/images/emoji/facebook_messenger/hotsprings.png differ diff --git a/public/images/emoji/facebook_messenger/hourglass.png b/public/images/emoji/facebook_messenger/hourglass.png index 5d65df7558..93e1d671f4 100644 Binary files a/public/images/emoji/facebook_messenger/hourglass.png and b/public/images/emoji/facebook_messenger/hourglass.png differ diff --git a/public/images/emoji/facebook_messenger/hourglass_flowing_sand.png b/public/images/emoji/facebook_messenger/hourglass_flowing_sand.png index b3cf6c1c4e..f86fde44b5 100644 Binary files a/public/images/emoji/facebook_messenger/hourglass_flowing_sand.png and b/public/images/emoji/facebook_messenger/hourglass_flowing_sand.png differ diff --git a/public/images/emoji/facebook_messenger/house.png b/public/images/emoji/facebook_messenger/house.png index e8b95ddeee..914f823bbf 100644 Binary files a/public/images/emoji/facebook_messenger/house.png and b/public/images/emoji/facebook_messenger/house.png differ diff --git a/public/images/emoji/facebook_messenger/house_abandoned.png b/public/images/emoji/facebook_messenger/house_abandoned.png index a03480bd67..6276196b03 100644 Binary files a/public/images/emoji/facebook_messenger/house_abandoned.png and b/public/images/emoji/facebook_messenger/house_abandoned.png differ diff --git a/public/images/emoji/facebook_messenger/house_buildings.png b/public/images/emoji/facebook_messenger/house_buildings.png index 8e3698a572..83bf0509ad 100644 Binary files a/public/images/emoji/facebook_messenger/house_buildings.png and b/public/images/emoji/facebook_messenger/house_buildings.png differ diff --git a/public/images/emoji/facebook_messenger/house_with_garden.png b/public/images/emoji/facebook_messenger/house_with_garden.png index a0f69a0e53..1cd7a99722 100644 Binary files a/public/images/emoji/facebook_messenger/house_with_garden.png and b/public/images/emoji/facebook_messenger/house_with_garden.png differ diff --git a/public/images/emoji/facebook_messenger/houses.png b/public/images/emoji/facebook_messenger/houses.png index 8e3698a572..83bf0509ad 100644 Binary files a/public/images/emoji/facebook_messenger/houses.png and b/public/images/emoji/facebook_messenger/houses.png differ diff --git a/public/images/emoji/facebook_messenger/hugging.png b/public/images/emoji/facebook_messenger/hugging.png index b9d48c43a1..fae110e159 100644 Binary files a/public/images/emoji/facebook_messenger/hugging.png and b/public/images/emoji/facebook_messenger/hugging.png differ diff --git a/public/images/emoji/facebook_messenger/hugging_face.png b/public/images/emoji/facebook_messenger/hugging_face.png index b9d48c43a1..fae110e159 100644 Binary files a/public/images/emoji/facebook_messenger/hugging_face.png and b/public/images/emoji/facebook_messenger/hugging_face.png differ diff --git a/public/images/emoji/facebook_messenger/hugs.png b/public/images/emoji/facebook_messenger/hugs.png index b9d48c43a1..fae110e159 100644 Binary files a/public/images/emoji/facebook_messenger/hugs.png and b/public/images/emoji/facebook_messenger/hugs.png differ diff --git a/public/images/emoji/facebook_messenger/hungary.png b/public/images/emoji/facebook_messenger/hungary.png index ce5faad3cf..175c0b7794 100644 Binary files a/public/images/emoji/facebook_messenger/hungary.png and b/public/images/emoji/facebook_messenger/hungary.png differ diff --git a/public/images/emoji/facebook_messenger/hushed.png b/public/images/emoji/facebook_messenger/hushed.png index fe5922c1b1..e89bc87b10 100644 Binary files a/public/images/emoji/facebook_messenger/hushed.png and b/public/images/emoji/facebook_messenger/hushed.png differ diff --git a/public/images/emoji/facebook_messenger/ice_cream.png b/public/images/emoji/facebook_messenger/ice_cream.png index 6eb4419cf6..59314cf227 100644 Binary files a/public/images/emoji/facebook_messenger/ice_cream.png and b/public/images/emoji/facebook_messenger/ice_cream.png differ diff --git a/public/images/emoji/facebook_messenger/ice_hockey.png b/public/images/emoji/facebook_messenger/ice_hockey.png index a8776ad0b3..86c7144cd7 100644 Binary files a/public/images/emoji/facebook_messenger/ice_hockey.png and b/public/images/emoji/facebook_messenger/ice_hockey.png differ diff --git a/public/images/emoji/facebook_messenger/ice_skate.png b/public/images/emoji/facebook_messenger/ice_skate.png index 0d6fc56224..93fe5341b0 100644 Binary files a/public/images/emoji/facebook_messenger/ice_skate.png and b/public/images/emoji/facebook_messenger/ice_skate.png differ diff --git a/public/images/emoji/facebook_messenger/icecream.png b/public/images/emoji/facebook_messenger/icecream.png index e4b11920b4..07d0541ac7 100644 Binary files a/public/images/emoji/facebook_messenger/icecream.png and b/public/images/emoji/facebook_messenger/icecream.png differ diff --git a/public/images/emoji/facebook_messenger/iceland.png b/public/images/emoji/facebook_messenger/iceland.png index 61ae322bfa..e3c4676e3d 100644 Binary files a/public/images/emoji/facebook_messenger/iceland.png and b/public/images/emoji/facebook_messenger/iceland.png differ diff --git a/public/images/emoji/facebook_messenger/id.png b/public/images/emoji/facebook_messenger/id.png index 46bab338b3..c65b407332 100644 Binary files a/public/images/emoji/facebook_messenger/id.png and b/public/images/emoji/facebook_messenger/id.png differ diff --git a/public/images/emoji/facebook_messenger/ideograph_advantage.png b/public/images/emoji/facebook_messenger/ideograph_advantage.png index 4d5ba3582a..339b0829cc 100644 Binary files a/public/images/emoji/facebook_messenger/ideograph_advantage.png and b/public/images/emoji/facebook_messenger/ideograph_advantage.png differ diff --git a/public/images/emoji/facebook_messenger/imp.png b/public/images/emoji/facebook_messenger/imp.png index ee24b8fabd..f4ddb3f19a 100644 Binary files a/public/images/emoji/facebook_messenger/imp.png and b/public/images/emoji/facebook_messenger/imp.png differ diff --git a/public/images/emoji/facebook_messenger/inbox_tray.png b/public/images/emoji/facebook_messenger/inbox_tray.png index 260a984f1e..62385c1beb 100644 Binary files a/public/images/emoji/facebook_messenger/inbox_tray.png and b/public/images/emoji/facebook_messenger/inbox_tray.png differ diff --git a/public/images/emoji/facebook_messenger/incoming_envelope.png b/public/images/emoji/facebook_messenger/incoming_envelope.png index 6379db7cf1..fd407cb3fc 100644 Binary files a/public/images/emoji/facebook_messenger/incoming_envelope.png and b/public/images/emoji/facebook_messenger/incoming_envelope.png differ diff --git a/public/images/emoji/facebook_messenger/india.png b/public/images/emoji/facebook_messenger/india.png index b903a37759..6508cbd1fc 100644 Binary files a/public/images/emoji/facebook_messenger/india.png and b/public/images/emoji/facebook_messenger/india.png differ diff --git a/public/images/emoji/facebook_messenger/indonesia.png b/public/images/emoji/facebook_messenger/indonesia.png index d3945cc22a..0f684c5bf0 100644 Binary files a/public/images/emoji/facebook_messenger/indonesia.png and b/public/images/emoji/facebook_messenger/indonesia.png differ diff --git a/public/images/emoji/facebook_messenger/infinity.png b/public/images/emoji/facebook_messenger/infinity.png new file mode 100644 index 0000000000..778e87b2e4 Binary files /dev/null and b/public/images/emoji/facebook_messenger/infinity.png differ diff --git a/public/images/emoji/facebook_messenger/information_desk_person.png b/public/images/emoji/facebook_messenger/information_desk_person.png index 45ca8d273d..60d8f589ee 100644 Binary files a/public/images/emoji/facebook_messenger/information_desk_person.png and b/public/images/emoji/facebook_messenger/information_desk_person.png differ diff --git a/public/images/emoji/facebook_messenger/information_source.png b/public/images/emoji/facebook_messenger/information_source.png index 0494b22384..bdfcc4643e 100644 Binary files a/public/images/emoji/facebook_messenger/information_source.png and b/public/images/emoji/facebook_messenger/information_source.png differ diff --git a/public/images/emoji/facebook_messenger/innocent.png b/public/images/emoji/facebook_messenger/innocent.png index ae87d6ced4..553385ed3a 100644 Binary files a/public/images/emoji/facebook_messenger/innocent.png and b/public/images/emoji/facebook_messenger/innocent.png differ diff --git a/public/images/emoji/facebook_messenger/interrobang.png b/public/images/emoji/facebook_messenger/interrobang.png index bcf63f7d25..efbaa824a9 100644 Binary files a/public/images/emoji/facebook_messenger/interrobang.png and b/public/images/emoji/facebook_messenger/interrobang.png differ diff --git a/public/images/emoji/facebook_messenger/iphone.png b/public/images/emoji/facebook_messenger/iphone.png index d5ac577d7f..3c6388cbdc 100644 Binary files a/public/images/emoji/facebook_messenger/iphone.png and b/public/images/emoji/facebook_messenger/iphone.png differ diff --git a/public/images/emoji/facebook_messenger/iran.png b/public/images/emoji/facebook_messenger/iran.png index d40dd83547..872ddb7742 100644 Binary files a/public/images/emoji/facebook_messenger/iran.png and b/public/images/emoji/facebook_messenger/iran.png differ diff --git a/public/images/emoji/facebook_messenger/iraq.png b/public/images/emoji/facebook_messenger/iraq.png index b9f8e328f0..b5ad6acaf7 100644 Binary files a/public/images/emoji/facebook_messenger/iraq.png and b/public/images/emoji/facebook_messenger/iraq.png differ diff --git a/public/images/emoji/facebook_messenger/ireland.png b/public/images/emoji/facebook_messenger/ireland.png index a9a69ad3b8..1763c369e2 100644 Binary files a/public/images/emoji/facebook_messenger/ireland.png and b/public/images/emoji/facebook_messenger/ireland.png differ diff --git a/public/images/emoji/facebook_messenger/island.png b/public/images/emoji/facebook_messenger/island.png index 7a1f87faf9..0cfd38ea30 100644 Binary files a/public/images/emoji/facebook_messenger/island.png and b/public/images/emoji/facebook_messenger/island.png differ diff --git a/public/images/emoji/facebook_messenger/isle_of_man.png b/public/images/emoji/facebook_messenger/isle_of_man.png index d5a7846ed8..cbc63717dd 100644 Binary files a/public/images/emoji/facebook_messenger/isle_of_man.png and b/public/images/emoji/facebook_messenger/isle_of_man.png differ diff --git a/public/images/emoji/facebook_messenger/israel.png b/public/images/emoji/facebook_messenger/israel.png index 58146f46cb..311f730830 100644 Binary files a/public/images/emoji/facebook_messenger/israel.png and b/public/images/emoji/facebook_messenger/israel.png differ diff --git a/public/images/emoji/facebook_messenger/it.png b/public/images/emoji/facebook_messenger/it.png index 1b5c5906b3..67454a828b 100644 Binary files a/public/images/emoji/facebook_messenger/it.png and b/public/images/emoji/facebook_messenger/it.png differ diff --git a/public/images/emoji/facebook_messenger/izakaya_lantern.png b/public/images/emoji/facebook_messenger/izakaya_lantern.png index 91f1eb3b69..f11de298e3 100644 Binary files a/public/images/emoji/facebook_messenger/izakaya_lantern.png and b/public/images/emoji/facebook_messenger/izakaya_lantern.png differ diff --git a/public/images/emoji/facebook_messenger/jack_o_lantern.png b/public/images/emoji/facebook_messenger/jack_o_lantern.png index 815cf3eb4e..be357f9af9 100644 Binary files a/public/images/emoji/facebook_messenger/jack_o_lantern.png and b/public/images/emoji/facebook_messenger/jack_o_lantern.png differ diff --git a/public/images/emoji/facebook_messenger/jamaica.png b/public/images/emoji/facebook_messenger/jamaica.png index e569aa9ee9..3d58cbc2ce 100644 Binary files a/public/images/emoji/facebook_messenger/jamaica.png and b/public/images/emoji/facebook_messenger/jamaica.png differ diff --git a/public/images/emoji/facebook_messenger/japan.png b/public/images/emoji/facebook_messenger/japan.png index 718d526368..edeb3a64cf 100644 Binary files a/public/images/emoji/facebook_messenger/japan.png and b/public/images/emoji/facebook_messenger/japan.png differ diff --git a/public/images/emoji/facebook_messenger/japanese_castle.png b/public/images/emoji/facebook_messenger/japanese_castle.png index 9b7faba907..f960c6fc31 100644 Binary files a/public/images/emoji/facebook_messenger/japanese_castle.png and b/public/images/emoji/facebook_messenger/japanese_castle.png differ diff --git a/public/images/emoji/facebook_messenger/japanese_goblin.png b/public/images/emoji/facebook_messenger/japanese_goblin.png index 3df2f0ed51..d6865c79e2 100644 Binary files a/public/images/emoji/facebook_messenger/japanese_goblin.png and b/public/images/emoji/facebook_messenger/japanese_goblin.png differ diff --git a/public/images/emoji/facebook_messenger/japanese_ogre.png b/public/images/emoji/facebook_messenger/japanese_ogre.png index 761225433f..101e9f8faa 100644 Binary files a/public/images/emoji/facebook_messenger/japanese_ogre.png and b/public/images/emoji/facebook_messenger/japanese_ogre.png differ diff --git a/public/images/emoji/facebook_messenger/jeans.png b/public/images/emoji/facebook_messenger/jeans.png index f692b7ce50..4b96e9eff0 100644 Binary files a/public/images/emoji/facebook_messenger/jeans.png and b/public/images/emoji/facebook_messenger/jeans.png differ diff --git a/public/images/emoji/facebook_messenger/jersey.png b/public/images/emoji/facebook_messenger/jersey.png index 1c294698e3..87c2df66ac 100644 Binary files a/public/images/emoji/facebook_messenger/jersey.png and b/public/images/emoji/facebook_messenger/jersey.png differ diff --git a/public/images/emoji/facebook_messenger/jigsaw.png b/public/images/emoji/facebook_messenger/jigsaw.png new file mode 100644 index 0000000000..3039cfa0a3 Binary files /dev/null and b/public/images/emoji/facebook_messenger/jigsaw.png differ diff --git a/public/images/emoji/facebook_messenger/jordan.png b/public/images/emoji/facebook_messenger/jordan.png index 2211150a8e..b09775e73a 100644 Binary files a/public/images/emoji/facebook_messenger/jordan.png and b/public/images/emoji/facebook_messenger/jordan.png differ diff --git a/public/images/emoji/facebook_messenger/joy.png b/public/images/emoji/facebook_messenger/joy.png index b61ad326be..5664fbd375 100644 Binary files a/public/images/emoji/facebook_messenger/joy.png and b/public/images/emoji/facebook_messenger/joy.png differ diff --git a/public/images/emoji/facebook_messenger/joy_cat.png b/public/images/emoji/facebook_messenger/joy_cat.png index be20cd66c4..558cb5d335 100644 Binary files a/public/images/emoji/facebook_messenger/joy_cat.png and b/public/images/emoji/facebook_messenger/joy_cat.png differ diff --git a/public/images/emoji/facebook_messenger/joystick.png b/public/images/emoji/facebook_messenger/joystick.png index 7ae3e89d17..b698616411 100644 Binary files a/public/images/emoji/facebook_messenger/joystick.png and b/public/images/emoji/facebook_messenger/joystick.png differ diff --git a/public/images/emoji/facebook_messenger/jp.png b/public/images/emoji/facebook_messenger/jp.png index ef2bc7b48f..eead98355b 100644 Binary files a/public/images/emoji/facebook_messenger/jp.png and b/public/images/emoji/facebook_messenger/jp.png differ diff --git a/public/images/emoji/facebook_messenger/kaaba.png b/public/images/emoji/facebook_messenger/kaaba.png index 292dd5e2e1..38e5fb4bbd 100644 Binary files a/public/images/emoji/facebook_messenger/kaaba.png and b/public/images/emoji/facebook_messenger/kaaba.png differ diff --git a/public/images/emoji/facebook_messenger/kangaroo.png b/public/images/emoji/facebook_messenger/kangaroo.png new file mode 100644 index 0000000000..40444a28e8 Binary files /dev/null and b/public/images/emoji/facebook_messenger/kangaroo.png differ diff --git a/public/images/emoji/facebook_messenger/kazakhstan.png b/public/images/emoji/facebook_messenger/kazakhstan.png index 799739df89..09f8eb2d32 100644 Binary files a/public/images/emoji/facebook_messenger/kazakhstan.png and b/public/images/emoji/facebook_messenger/kazakhstan.png differ diff --git a/public/images/emoji/facebook_messenger/kenya.png b/public/images/emoji/facebook_messenger/kenya.png index 5bd6cbce8e..d4451970bc 100644 Binary files a/public/images/emoji/facebook_messenger/kenya.png and b/public/images/emoji/facebook_messenger/kenya.png differ diff --git a/public/images/emoji/facebook_messenger/key.png b/public/images/emoji/facebook_messenger/key.png index 4007045365..6a85f183d5 100644 Binary files a/public/images/emoji/facebook_messenger/key.png and b/public/images/emoji/facebook_messenger/key.png differ diff --git a/public/images/emoji/facebook_messenger/key2.png b/public/images/emoji/facebook_messenger/key2.png index 4452b17fb5..ed2f7d5bfe 100644 Binary files a/public/images/emoji/facebook_messenger/key2.png and b/public/images/emoji/facebook_messenger/key2.png differ diff --git a/public/images/emoji/facebook_messenger/keyboard.png b/public/images/emoji/facebook_messenger/keyboard.png index 6a3d63d1e0..326b49ec78 100644 Binary files a/public/images/emoji/facebook_messenger/keyboard.png and b/public/images/emoji/facebook_messenger/keyboard.png differ diff --git a/public/images/emoji/facebook_messenger/keycap_star.png b/public/images/emoji/facebook_messenger/keycap_star.png index a009bc2cda..0aade2223c 100644 Binary files a/public/images/emoji/facebook_messenger/keycap_star.png and b/public/images/emoji/facebook_messenger/keycap_star.png differ diff --git a/public/images/emoji/facebook_messenger/keycap_ten.png b/public/images/emoji/facebook_messenger/keycap_ten.png index c0beb67e22..f1e640952f 100644 Binary files a/public/images/emoji/facebook_messenger/keycap_ten.png and b/public/images/emoji/facebook_messenger/keycap_ten.png differ diff --git a/public/images/emoji/facebook_messenger/kick_scooter.png b/public/images/emoji/facebook_messenger/kick_scooter.png index 262f386ccf..e03a3feca1 100644 Binary files a/public/images/emoji/facebook_messenger/kick_scooter.png and b/public/images/emoji/facebook_messenger/kick_scooter.png differ diff --git a/public/images/emoji/facebook_messenger/kimono.png b/public/images/emoji/facebook_messenger/kimono.png index 0647cd4e98..2886cd477c 100644 Binary files a/public/images/emoji/facebook_messenger/kimono.png and b/public/images/emoji/facebook_messenger/kimono.png differ diff --git a/public/images/emoji/facebook_messenger/kiribati.png b/public/images/emoji/facebook_messenger/kiribati.png index ca481a9860..4c18dd993f 100644 Binary files a/public/images/emoji/facebook_messenger/kiribati.png and b/public/images/emoji/facebook_messenger/kiribati.png differ diff --git a/public/images/emoji/facebook_messenger/kiss.png b/public/images/emoji/facebook_messenger/kiss.png index a9748f359a..ace6d44874 100644 Binary files a/public/images/emoji/facebook_messenger/kiss.png and b/public/images/emoji/facebook_messenger/kiss.png differ diff --git a/public/images/emoji/facebook_messenger/kissing.png b/public/images/emoji/facebook_messenger/kissing.png index 00ac735175..7687432e92 100644 Binary files a/public/images/emoji/facebook_messenger/kissing.png and b/public/images/emoji/facebook_messenger/kissing.png differ diff --git a/public/images/emoji/facebook_messenger/kissing_cat.png b/public/images/emoji/facebook_messenger/kissing_cat.png index 8f406299d2..20af5b968f 100644 Binary files a/public/images/emoji/facebook_messenger/kissing_cat.png and b/public/images/emoji/facebook_messenger/kissing_cat.png differ diff --git a/public/images/emoji/facebook_messenger/kissing_closed_eyes.png b/public/images/emoji/facebook_messenger/kissing_closed_eyes.png index b128cee450..f73c44a8e7 100644 Binary files a/public/images/emoji/facebook_messenger/kissing_closed_eyes.png and b/public/images/emoji/facebook_messenger/kissing_closed_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/kissing_heart.png b/public/images/emoji/facebook_messenger/kissing_heart.png index 9678efe0c9..b47da14d21 100644 Binary files a/public/images/emoji/facebook_messenger/kissing_heart.png and b/public/images/emoji/facebook_messenger/kissing_heart.png differ diff --git a/public/images/emoji/facebook_messenger/kissing_smiling_eyes.png b/public/images/emoji/facebook_messenger/kissing_smiling_eyes.png index 1a3dcb4d2a..0f94490450 100644 Binary files a/public/images/emoji/facebook_messenger/kissing_smiling_eyes.png and b/public/images/emoji/facebook_messenger/kissing_smiling_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/kiwi_fruit.png b/public/images/emoji/facebook_messenger/kiwi_fruit.png index 07613f83aa..b3c0602783 100644 Binary files a/public/images/emoji/facebook_messenger/kiwi_fruit.png and b/public/images/emoji/facebook_messenger/kiwi_fruit.png differ diff --git a/public/images/emoji/facebook_messenger/knife.png b/public/images/emoji/facebook_messenger/knife.png index 963153dd29..fa5308faa4 100644 Binary files a/public/images/emoji/facebook_messenger/knife.png and b/public/images/emoji/facebook_messenger/knife.png differ diff --git a/public/images/emoji/facebook_messenger/koala.png b/public/images/emoji/facebook_messenger/koala.png index dbf611f299..6d8bfdc50d 100644 Binary files a/public/images/emoji/facebook_messenger/koala.png and b/public/images/emoji/facebook_messenger/koala.png differ diff --git a/public/images/emoji/facebook_messenger/koko.png b/public/images/emoji/facebook_messenger/koko.png index 3d1a4f4b56..9e36af507f 100644 Binary files a/public/images/emoji/facebook_messenger/koko.png and b/public/images/emoji/facebook_messenger/koko.png differ diff --git a/public/images/emoji/facebook_messenger/kosovo.png b/public/images/emoji/facebook_messenger/kosovo.png index 9b8d095d51..ca9ecee103 100644 Binary files a/public/images/emoji/facebook_messenger/kosovo.png and b/public/images/emoji/facebook_messenger/kosovo.png differ diff --git a/public/images/emoji/facebook_messenger/kr.png b/public/images/emoji/facebook_messenger/kr.png index 4bd85faa98..00124acb1a 100644 Binary files a/public/images/emoji/facebook_messenger/kr.png and b/public/images/emoji/facebook_messenger/kr.png differ diff --git a/public/images/emoji/facebook_messenger/kuwait.png b/public/images/emoji/facebook_messenger/kuwait.png index 447fbdd84a..0cea9e498a 100644 Binary files a/public/images/emoji/facebook_messenger/kuwait.png and b/public/images/emoji/facebook_messenger/kuwait.png differ diff --git a/public/images/emoji/facebook_messenger/kyrgyzstan.png b/public/images/emoji/facebook_messenger/kyrgyzstan.png index 60ab151c04..060b82533c 100644 Binary files a/public/images/emoji/facebook_messenger/kyrgyzstan.png and b/public/images/emoji/facebook_messenger/kyrgyzstan.png differ diff --git a/public/images/emoji/facebook_messenger/lab_coat.png b/public/images/emoji/facebook_messenger/lab_coat.png new file mode 100644 index 0000000000..fcce6d1f47 Binary files /dev/null and b/public/images/emoji/facebook_messenger/lab_coat.png differ diff --git a/public/images/emoji/facebook_messenger/label.png b/public/images/emoji/facebook_messenger/label.png index 1a8034cbe6..ed6e74d6ef 100644 Binary files a/public/images/emoji/facebook_messenger/label.png and b/public/images/emoji/facebook_messenger/label.png differ diff --git a/public/images/emoji/facebook_messenger/lacrosse.png b/public/images/emoji/facebook_messenger/lacrosse.png new file mode 100644 index 0000000000..c4209eef02 Binary files /dev/null and b/public/images/emoji/facebook_messenger/lacrosse.png differ diff --git a/public/images/emoji/facebook_messenger/laos.png b/public/images/emoji/facebook_messenger/laos.png index becdf43c9b..f81323768f 100644 Binary files a/public/images/emoji/facebook_messenger/laos.png and b/public/images/emoji/facebook_messenger/laos.png differ diff --git a/public/images/emoji/facebook_messenger/large_blue_circle.png b/public/images/emoji/facebook_messenger/large_blue_circle.png index 13a06c1bab..88dd30d546 100644 Binary files a/public/images/emoji/facebook_messenger/large_blue_circle.png and b/public/images/emoji/facebook_messenger/large_blue_circle.png differ diff --git a/public/images/emoji/facebook_messenger/large_blue_diamond.png b/public/images/emoji/facebook_messenger/large_blue_diamond.png index b37360628a..96fbf585d5 100644 Binary files a/public/images/emoji/facebook_messenger/large_blue_diamond.png and b/public/images/emoji/facebook_messenger/large_blue_diamond.png differ diff --git a/public/images/emoji/facebook_messenger/large_orange_diamond.png b/public/images/emoji/facebook_messenger/large_orange_diamond.png index f3e122848e..377186bb69 100644 Binary files a/public/images/emoji/facebook_messenger/large_orange_diamond.png and b/public/images/emoji/facebook_messenger/large_orange_diamond.png differ diff --git a/public/images/emoji/facebook_messenger/last_quarter_moon.png b/public/images/emoji/facebook_messenger/last_quarter_moon.png index c6ffbfa280..692f9f1424 100644 Binary files a/public/images/emoji/facebook_messenger/last_quarter_moon.png and b/public/images/emoji/facebook_messenger/last_quarter_moon.png differ diff --git a/public/images/emoji/facebook_messenger/last_quarter_moon_with_face.png b/public/images/emoji/facebook_messenger/last_quarter_moon_with_face.png index b7404f7719..dd9e343698 100644 Binary files a/public/images/emoji/facebook_messenger/last_quarter_moon_with_face.png and b/public/images/emoji/facebook_messenger/last_quarter_moon_with_face.png differ diff --git a/public/images/emoji/facebook_messenger/latin_cross.png b/public/images/emoji/facebook_messenger/latin_cross.png index 705cfc1e6f..93423cea92 100644 Binary files a/public/images/emoji/facebook_messenger/latin_cross.png and b/public/images/emoji/facebook_messenger/latin_cross.png differ diff --git a/public/images/emoji/facebook_messenger/latvia.png b/public/images/emoji/facebook_messenger/latvia.png index 5028433200..257ad4108c 100644 Binary files a/public/images/emoji/facebook_messenger/latvia.png and b/public/images/emoji/facebook_messenger/latvia.png differ diff --git a/public/images/emoji/facebook_messenger/laughing.png b/public/images/emoji/facebook_messenger/laughing.png index 039f7f9d6d..9a91d6097b 100644 Binary files a/public/images/emoji/facebook_messenger/laughing.png and b/public/images/emoji/facebook_messenger/laughing.png differ diff --git a/public/images/emoji/facebook_messenger/leafy_green.png b/public/images/emoji/facebook_messenger/leafy_green.png new file mode 100644 index 0000000000..31601f0505 Binary files /dev/null and b/public/images/emoji/facebook_messenger/leafy_green.png differ diff --git a/public/images/emoji/facebook_messenger/leaves.png b/public/images/emoji/facebook_messenger/leaves.png index 20f7a4c8aa..a14490729d 100644 Binary files a/public/images/emoji/facebook_messenger/leaves.png and b/public/images/emoji/facebook_messenger/leaves.png differ diff --git a/public/images/emoji/facebook_messenger/lebanon.png b/public/images/emoji/facebook_messenger/lebanon.png index 462daf5b45..9b04f5b999 100644 Binary files a/public/images/emoji/facebook_messenger/lebanon.png and b/public/images/emoji/facebook_messenger/lebanon.png differ diff --git a/public/images/emoji/facebook_messenger/ledger.png b/public/images/emoji/facebook_messenger/ledger.png index 2b4ea73fe3..321e0567c3 100644 Binary files a/public/images/emoji/facebook_messenger/ledger.png and b/public/images/emoji/facebook_messenger/ledger.png differ diff --git a/public/images/emoji/facebook_messenger/left_luggage.png b/public/images/emoji/facebook_messenger/left_luggage.png index a384686dd9..34fa1061b2 100644 Binary files a/public/images/emoji/facebook_messenger/left_luggage.png and b/public/images/emoji/facebook_messenger/left_luggage.png differ diff --git a/public/images/emoji/facebook_messenger/left_right_arrow.png b/public/images/emoji/facebook_messenger/left_right_arrow.png index db907768e0..6ca9f02d9a 100644 Binary files a/public/images/emoji/facebook_messenger/left_right_arrow.png and b/public/images/emoji/facebook_messenger/left_right_arrow.png differ diff --git a/public/images/emoji/facebook_messenger/left_speech_bubble.png b/public/images/emoji/facebook_messenger/left_speech_bubble.png index 80195d4727..f0054b32e5 100644 Binary files a/public/images/emoji/facebook_messenger/left_speech_bubble.png and b/public/images/emoji/facebook_messenger/left_speech_bubble.png differ diff --git a/public/images/emoji/facebook_messenger/leftwards_arrow_with_hook.png b/public/images/emoji/facebook_messenger/leftwards_arrow_with_hook.png index b7c7dd6baa..197d8c1c03 100644 Binary files a/public/images/emoji/facebook_messenger/leftwards_arrow_with_hook.png and b/public/images/emoji/facebook_messenger/leftwards_arrow_with_hook.png differ diff --git a/public/images/emoji/facebook_messenger/leg.png b/public/images/emoji/facebook_messenger/leg.png new file mode 100644 index 0000000000..b0087b4926 Binary files /dev/null and b/public/images/emoji/facebook_messenger/leg.png differ diff --git a/public/images/emoji/facebook_messenger/lemon.png b/public/images/emoji/facebook_messenger/lemon.png index a5d4c812ad..7609f7a853 100644 Binary files a/public/images/emoji/facebook_messenger/lemon.png and b/public/images/emoji/facebook_messenger/lemon.png differ diff --git a/public/images/emoji/facebook_messenger/leo.png b/public/images/emoji/facebook_messenger/leo.png index 3b92fc4b10..2ab5082d36 100644 Binary files a/public/images/emoji/facebook_messenger/leo.png and b/public/images/emoji/facebook_messenger/leo.png differ diff --git a/public/images/emoji/facebook_messenger/leopard.png b/public/images/emoji/facebook_messenger/leopard.png index e04426afa8..b85d110420 100644 Binary files a/public/images/emoji/facebook_messenger/leopard.png and b/public/images/emoji/facebook_messenger/leopard.png differ diff --git a/public/images/emoji/facebook_messenger/lesotho.png b/public/images/emoji/facebook_messenger/lesotho.png index dcb3b92128..9c07332c7f 100644 Binary files a/public/images/emoji/facebook_messenger/lesotho.png and b/public/images/emoji/facebook_messenger/lesotho.png differ diff --git a/public/images/emoji/facebook_messenger/level_slider.png b/public/images/emoji/facebook_messenger/level_slider.png index bad2d4c7e5..59f5b30cbc 100644 Binary files a/public/images/emoji/facebook_messenger/level_slider.png and b/public/images/emoji/facebook_messenger/level_slider.png differ diff --git a/public/images/emoji/facebook_messenger/levitate.png b/public/images/emoji/facebook_messenger/levitate.png index 12436f9888..dc6148caa7 100644 Binary files a/public/images/emoji/facebook_messenger/levitate.png and b/public/images/emoji/facebook_messenger/levitate.png differ diff --git a/public/images/emoji/facebook_messenger/liberia.png b/public/images/emoji/facebook_messenger/liberia.png index 0a04c6709f..7a78e1c5ec 100644 Binary files a/public/images/emoji/facebook_messenger/liberia.png and b/public/images/emoji/facebook_messenger/liberia.png differ diff --git a/public/images/emoji/facebook_messenger/libra.png b/public/images/emoji/facebook_messenger/libra.png index 96ce496875..fbffa8f84a 100644 Binary files a/public/images/emoji/facebook_messenger/libra.png and b/public/images/emoji/facebook_messenger/libra.png differ diff --git a/public/images/emoji/facebook_messenger/libya.png b/public/images/emoji/facebook_messenger/libya.png index 263d4f56cc..a17fd40d4c 100644 Binary files a/public/images/emoji/facebook_messenger/libya.png and b/public/images/emoji/facebook_messenger/libya.png differ diff --git a/public/images/emoji/facebook_messenger/liechtenstein.png b/public/images/emoji/facebook_messenger/liechtenstein.png index 888fa7a2d8..67e7d38e3d 100644 Binary files a/public/images/emoji/facebook_messenger/liechtenstein.png and b/public/images/emoji/facebook_messenger/liechtenstein.png differ diff --git a/public/images/emoji/facebook_messenger/lifter.png b/public/images/emoji/facebook_messenger/lifter.png index 1ce6966153..b9b6ab8259 100644 Binary files a/public/images/emoji/facebook_messenger/lifter.png and b/public/images/emoji/facebook_messenger/lifter.png differ diff --git a/public/images/emoji/facebook_messenger/light_rail.png b/public/images/emoji/facebook_messenger/light_rail.png index 510c368879..0cb910a740 100644 Binary files a/public/images/emoji/facebook_messenger/light_rail.png and b/public/images/emoji/facebook_messenger/light_rail.png differ diff --git a/public/images/emoji/facebook_messenger/link.png b/public/images/emoji/facebook_messenger/link.png index c3fd6f5f23..caf7c1c8ae 100644 Binary files a/public/images/emoji/facebook_messenger/link.png and b/public/images/emoji/facebook_messenger/link.png differ diff --git a/public/images/emoji/facebook_messenger/linked_paperclips.png b/public/images/emoji/facebook_messenger/linked_paperclips.png index 998be6d8ba..d916fa07df 100644 Binary files a/public/images/emoji/facebook_messenger/linked_paperclips.png and b/public/images/emoji/facebook_messenger/linked_paperclips.png differ diff --git a/public/images/emoji/facebook_messenger/lion.png b/public/images/emoji/facebook_messenger/lion.png index d77e842321..94a0030da1 100644 Binary files a/public/images/emoji/facebook_messenger/lion.png and b/public/images/emoji/facebook_messenger/lion.png differ diff --git a/public/images/emoji/facebook_messenger/lion_face.png b/public/images/emoji/facebook_messenger/lion_face.png index d77e842321..94a0030da1 100644 Binary files a/public/images/emoji/facebook_messenger/lion_face.png and b/public/images/emoji/facebook_messenger/lion_face.png differ diff --git a/public/images/emoji/facebook_messenger/lips.png b/public/images/emoji/facebook_messenger/lips.png index 9d54a3869b..a8e5822fba 100644 Binary files a/public/images/emoji/facebook_messenger/lips.png and b/public/images/emoji/facebook_messenger/lips.png differ diff --git a/public/images/emoji/facebook_messenger/lipstick.png b/public/images/emoji/facebook_messenger/lipstick.png index dc1a810cca..d7c162c904 100644 Binary files a/public/images/emoji/facebook_messenger/lipstick.png and b/public/images/emoji/facebook_messenger/lipstick.png differ diff --git a/public/images/emoji/facebook_messenger/lithuania.png b/public/images/emoji/facebook_messenger/lithuania.png index 6682b7d125..274ad5ffe8 100644 Binary files a/public/images/emoji/facebook_messenger/lithuania.png and b/public/images/emoji/facebook_messenger/lithuania.png differ diff --git a/public/images/emoji/facebook_messenger/lizard.png b/public/images/emoji/facebook_messenger/lizard.png index 55488c67b0..88a4332de2 100644 Binary files a/public/images/emoji/facebook_messenger/lizard.png and b/public/images/emoji/facebook_messenger/lizard.png differ diff --git a/public/images/emoji/facebook_messenger/llama.png b/public/images/emoji/facebook_messenger/llama.png new file mode 100644 index 0000000000..d43ae19ae1 Binary files /dev/null and b/public/images/emoji/facebook_messenger/llama.png differ diff --git a/public/images/emoji/facebook_messenger/lobster.png b/public/images/emoji/facebook_messenger/lobster.png new file mode 100644 index 0000000000..17f50fa439 Binary files /dev/null and b/public/images/emoji/facebook_messenger/lobster.png differ diff --git a/public/images/emoji/facebook_messenger/lock.png b/public/images/emoji/facebook_messenger/lock.png index a64f3f01e9..8ff67ce46e 100644 Binary files a/public/images/emoji/facebook_messenger/lock.png and b/public/images/emoji/facebook_messenger/lock.png differ diff --git a/public/images/emoji/facebook_messenger/lock_with_ink_pen.png b/public/images/emoji/facebook_messenger/lock_with_ink_pen.png index e3878e7c73..0ce1960483 100644 Binary files a/public/images/emoji/facebook_messenger/lock_with_ink_pen.png and b/public/images/emoji/facebook_messenger/lock_with_ink_pen.png differ diff --git a/public/images/emoji/facebook_messenger/lollipop.png b/public/images/emoji/facebook_messenger/lollipop.png index 6519cba46c..d8d634d9cf 100644 Binary files a/public/images/emoji/facebook_messenger/lollipop.png and b/public/images/emoji/facebook_messenger/lollipop.png differ diff --git a/public/images/emoji/facebook_messenger/loop.png b/public/images/emoji/facebook_messenger/loop.png index 45ecb253f0..de03cea2c5 100644 Binary files a/public/images/emoji/facebook_messenger/loop.png and b/public/images/emoji/facebook_messenger/loop.png differ diff --git a/public/images/emoji/facebook_messenger/lotion_bottle.png b/public/images/emoji/facebook_messenger/lotion_bottle.png new file mode 100644 index 0000000000..48684bc139 Binary files /dev/null and b/public/images/emoji/facebook_messenger/lotion_bottle.png differ diff --git a/public/images/emoji/facebook_messenger/loud_sound.png b/public/images/emoji/facebook_messenger/loud_sound.png index c44ba01abe..f643278e6b 100644 Binary files a/public/images/emoji/facebook_messenger/loud_sound.png and b/public/images/emoji/facebook_messenger/loud_sound.png differ diff --git a/public/images/emoji/facebook_messenger/loudspeaker.png b/public/images/emoji/facebook_messenger/loudspeaker.png index a1cd49a51e..46e2e82473 100644 Binary files a/public/images/emoji/facebook_messenger/loudspeaker.png and b/public/images/emoji/facebook_messenger/loudspeaker.png differ diff --git a/public/images/emoji/facebook_messenger/love_hotel.png b/public/images/emoji/facebook_messenger/love_hotel.png index 488c2b9bda..5ae45c137f 100644 Binary files a/public/images/emoji/facebook_messenger/love_hotel.png and b/public/images/emoji/facebook_messenger/love_hotel.png differ diff --git a/public/images/emoji/facebook_messenger/love_letter.png b/public/images/emoji/facebook_messenger/love_letter.png index a45da6bdcc..6d9a0f8c71 100644 Binary files a/public/images/emoji/facebook_messenger/love_letter.png and b/public/images/emoji/facebook_messenger/love_letter.png differ diff --git a/public/images/emoji/facebook_messenger/love_you_gesture.png b/public/images/emoji/facebook_messenger/love_you_gesture.png index 2421a6f2aa..12fff4d969 100644 Binary files a/public/images/emoji/facebook_messenger/love_you_gesture.png and b/public/images/emoji/facebook_messenger/love_you_gesture.png differ diff --git a/public/images/emoji/facebook_messenger/low_brightness.png b/public/images/emoji/facebook_messenger/low_brightness.png index 5663f2c871..08bfa587af 100644 Binary files a/public/images/emoji/facebook_messenger/low_brightness.png and b/public/images/emoji/facebook_messenger/low_brightness.png differ diff --git a/public/images/emoji/facebook_messenger/lower_left_ballpoint_pen.png b/public/images/emoji/facebook_messenger/lower_left_ballpoint_pen.png index 399b2fbf22..fc87159a8c 100644 Binary files a/public/images/emoji/facebook_messenger/lower_left_ballpoint_pen.png and b/public/images/emoji/facebook_messenger/lower_left_ballpoint_pen.png differ diff --git a/public/images/emoji/facebook_messenger/lower_left_crayon.png b/public/images/emoji/facebook_messenger/lower_left_crayon.png index 5f920abb85..136af75cb3 100644 Binary files a/public/images/emoji/facebook_messenger/lower_left_crayon.png and b/public/images/emoji/facebook_messenger/lower_left_crayon.png differ diff --git a/public/images/emoji/facebook_messenger/lower_left_fountain_pen.png b/public/images/emoji/facebook_messenger/lower_left_fountain_pen.png index 2e7296057b..6693c145e4 100644 Binary files a/public/images/emoji/facebook_messenger/lower_left_fountain_pen.png and b/public/images/emoji/facebook_messenger/lower_left_fountain_pen.png differ diff --git a/public/images/emoji/facebook_messenger/lower_left_paintbrush.png b/public/images/emoji/facebook_messenger/lower_left_paintbrush.png index 6044b9caff..9b698273ed 100644 Binary files a/public/images/emoji/facebook_messenger/lower_left_paintbrush.png and b/public/images/emoji/facebook_messenger/lower_left_paintbrush.png differ diff --git a/public/images/emoji/facebook_messenger/luggage.png b/public/images/emoji/facebook_messenger/luggage.png new file mode 100644 index 0000000000..1da11d48c5 Binary files /dev/null and b/public/images/emoji/facebook_messenger/luggage.png differ diff --git a/public/images/emoji/facebook_messenger/luxembourg.png b/public/images/emoji/facebook_messenger/luxembourg.png index 68575f7817..00e0833ddf 100644 Binary files a/public/images/emoji/facebook_messenger/luxembourg.png and b/public/images/emoji/facebook_messenger/luxembourg.png differ diff --git a/public/images/emoji/facebook_messenger/lying_face.png b/public/images/emoji/facebook_messenger/lying_face.png index 811777b16d..3964852dee 100644 Binary files a/public/images/emoji/facebook_messenger/lying_face.png and b/public/images/emoji/facebook_messenger/lying_face.png differ diff --git a/public/images/emoji/facebook_messenger/m.png b/public/images/emoji/facebook_messenger/m.png index 05105497d2..68902e2cf4 100644 Binary files a/public/images/emoji/facebook_messenger/m.png and b/public/images/emoji/facebook_messenger/m.png differ diff --git a/public/images/emoji/facebook_messenger/macau.png b/public/images/emoji/facebook_messenger/macau.png index 9e4a5f7f2b..a54ab7997f 100644 Binary files a/public/images/emoji/facebook_messenger/macau.png and b/public/images/emoji/facebook_messenger/macau.png differ diff --git a/public/images/emoji/facebook_messenger/macedonia.png b/public/images/emoji/facebook_messenger/macedonia.png index ed77739065..06d48f9f14 100644 Binary files a/public/images/emoji/facebook_messenger/macedonia.png and b/public/images/emoji/facebook_messenger/macedonia.png differ diff --git a/public/images/emoji/facebook_messenger/madagascar.png b/public/images/emoji/facebook_messenger/madagascar.png index cb90e63b62..d0d50a6c62 100644 Binary files a/public/images/emoji/facebook_messenger/madagascar.png and b/public/images/emoji/facebook_messenger/madagascar.png differ diff --git a/public/images/emoji/facebook_messenger/mag.png b/public/images/emoji/facebook_messenger/mag.png index f17f5bc03d..044847b5fa 100644 Binary files a/public/images/emoji/facebook_messenger/mag.png and b/public/images/emoji/facebook_messenger/mag.png differ diff --git a/public/images/emoji/facebook_messenger/mag_right.png b/public/images/emoji/facebook_messenger/mag_right.png index 953a397b6e..185518eafd 100644 Binary files a/public/images/emoji/facebook_messenger/mag_right.png and b/public/images/emoji/facebook_messenger/mag_right.png differ diff --git a/public/images/emoji/facebook_messenger/mage.png b/public/images/emoji/facebook_messenger/mage.png index 339eb4c0c7..f66e7c2ccf 100644 Binary files a/public/images/emoji/facebook_messenger/mage.png and b/public/images/emoji/facebook_messenger/mage.png differ diff --git a/public/images/emoji/facebook_messenger/magnet.png b/public/images/emoji/facebook_messenger/magnet.png new file mode 100644 index 0000000000..6cbe88e681 Binary files /dev/null and b/public/images/emoji/facebook_messenger/magnet.png differ diff --git a/public/images/emoji/facebook_messenger/mahjong.png b/public/images/emoji/facebook_messenger/mahjong.png index 636fe30a68..6802282c86 100644 Binary files a/public/images/emoji/facebook_messenger/mahjong.png and b/public/images/emoji/facebook_messenger/mahjong.png differ diff --git a/public/images/emoji/facebook_messenger/mailbox.png b/public/images/emoji/facebook_messenger/mailbox.png index 73ddcb39eb..45131c80e5 100644 Binary files a/public/images/emoji/facebook_messenger/mailbox.png and b/public/images/emoji/facebook_messenger/mailbox.png differ diff --git a/public/images/emoji/facebook_messenger/mailbox_closed.png b/public/images/emoji/facebook_messenger/mailbox_closed.png index b631ad8414..e1ab486bdb 100644 Binary files a/public/images/emoji/facebook_messenger/mailbox_closed.png and b/public/images/emoji/facebook_messenger/mailbox_closed.png differ diff --git a/public/images/emoji/facebook_messenger/mailbox_with_mail.png b/public/images/emoji/facebook_messenger/mailbox_with_mail.png index d75eca10f8..561b065210 100644 Binary files a/public/images/emoji/facebook_messenger/mailbox_with_mail.png and b/public/images/emoji/facebook_messenger/mailbox_with_mail.png differ diff --git a/public/images/emoji/facebook_messenger/mailbox_with_no_mail.png b/public/images/emoji/facebook_messenger/mailbox_with_no_mail.png index 524dac7777..a3d1ec9ce9 100644 Binary files a/public/images/emoji/facebook_messenger/mailbox_with_no_mail.png and b/public/images/emoji/facebook_messenger/mailbox_with_no_mail.png differ diff --git a/public/images/emoji/facebook_messenger/malawi.png b/public/images/emoji/facebook_messenger/malawi.png index 6f25fc26b4..8833e11d4f 100644 Binary files a/public/images/emoji/facebook_messenger/malawi.png and b/public/images/emoji/facebook_messenger/malawi.png differ diff --git a/public/images/emoji/facebook_messenger/malaysia.png b/public/images/emoji/facebook_messenger/malaysia.png index dc5ec8d4e9..9a5441ac1d 100644 Binary files a/public/images/emoji/facebook_messenger/malaysia.png and b/public/images/emoji/facebook_messenger/malaysia.png differ diff --git a/public/images/emoji/facebook_messenger/maldives.png b/public/images/emoji/facebook_messenger/maldives.png index c8fa5b60b9..b76585827f 100644 Binary files a/public/images/emoji/facebook_messenger/maldives.png and b/public/images/emoji/facebook_messenger/maldives.png differ diff --git a/public/images/emoji/facebook_messenger/male_couple_with_heart.png b/public/images/emoji/facebook_messenger/male_couple_with_heart.png index 50c3f8f81f..e30532a6cc 100644 Binary files a/public/images/emoji/facebook_messenger/male_couple_with_heart.png and b/public/images/emoji/facebook_messenger/male_couple_with_heart.png differ diff --git a/public/images/emoji/facebook_messenger/male_couplekiss.png b/public/images/emoji/facebook_messenger/male_couplekiss.png index e626b7eb92..2ce8534039 100644 Binary files a/public/images/emoji/facebook_messenger/male_couplekiss.png and b/public/images/emoji/facebook_messenger/male_couplekiss.png differ diff --git a/public/images/emoji/facebook_messenger/male_detective.png b/public/images/emoji/facebook_messenger/male_detective.png index 6734c6bde0..0d6160dd2b 100644 Binary files a/public/images/emoji/facebook_messenger/male_detective.png and b/public/images/emoji/facebook_messenger/male_detective.png differ diff --git a/public/images/emoji/facebook_messenger/mali.png b/public/images/emoji/facebook_messenger/mali.png index 4798e46bec..cd47d6cb2d 100644 Binary files a/public/images/emoji/facebook_messenger/mali.png and b/public/images/emoji/facebook_messenger/mali.png differ diff --git a/public/images/emoji/facebook_messenger/malta.png b/public/images/emoji/facebook_messenger/malta.png index fb79203a5e..602dcc64bf 100644 Binary files a/public/images/emoji/facebook_messenger/malta.png and b/public/images/emoji/facebook_messenger/malta.png differ diff --git a/public/images/emoji/facebook_messenger/man.png b/public/images/emoji/facebook_messenger/man.png index 8559060c61..cc02fef28f 100644 Binary files a/public/images/emoji/facebook_messenger/man.png and b/public/images/emoji/facebook_messenger/man.png differ diff --git a/public/images/emoji/facebook_messenger/man_artist.png b/public/images/emoji/facebook_messenger/man_artist.png index 4a540590d3..50258b46b9 100644 Binary files a/public/images/emoji/facebook_messenger/man_artist.png and b/public/images/emoji/facebook_messenger/man_artist.png differ diff --git a/public/images/emoji/facebook_messenger/man_astronaut.png b/public/images/emoji/facebook_messenger/man_astronaut.png index 0cd5eaeecf..27a05020e8 100644 Binary files a/public/images/emoji/facebook_messenger/man_astronaut.png and b/public/images/emoji/facebook_messenger/man_astronaut.png differ diff --git a/public/images/emoji/facebook_messenger/man_bald.png b/public/images/emoji/facebook_messenger/man_bald.png new file mode 100644 index 0000000000..8e3a838506 Binary files /dev/null and b/public/images/emoji/facebook_messenger/man_bald.png differ diff --git a/public/images/emoji/facebook_messenger/man_cartwheeling.png b/public/images/emoji/facebook_messenger/man_cartwheeling.png index 49633f6851..dc16cd498a 100644 Binary files a/public/images/emoji/facebook_messenger/man_cartwheeling.png and b/public/images/emoji/facebook_messenger/man_cartwheeling.png differ diff --git a/public/images/emoji/facebook_messenger/man_cook.png b/public/images/emoji/facebook_messenger/man_cook.png index 61961e6d46..9c92f8ad3f 100644 Binary files a/public/images/emoji/facebook_messenger/man_cook.png and b/public/images/emoji/facebook_messenger/man_cook.png differ diff --git a/public/images/emoji/facebook_messenger/man_curly_haired.png b/public/images/emoji/facebook_messenger/man_curly_haired.png new file mode 100644 index 0000000000..6c1396b114 Binary files /dev/null and b/public/images/emoji/facebook_messenger/man_curly_haired.png differ diff --git a/public/images/emoji/facebook_messenger/man_dancing.png b/public/images/emoji/facebook_messenger/man_dancing.png index a0792b7355..fb1b1f7581 100644 Binary files a/public/images/emoji/facebook_messenger/man_dancing.png and b/public/images/emoji/facebook_messenger/man_dancing.png differ diff --git a/public/images/emoji/facebook_messenger/man_facepalming.png b/public/images/emoji/facebook_messenger/man_facepalming.png index acce29638a..a898cc11be 100644 Binary files a/public/images/emoji/facebook_messenger/man_facepalming.png and b/public/images/emoji/facebook_messenger/man_facepalming.png differ diff --git a/public/images/emoji/facebook_messenger/man_factory_worker.png b/public/images/emoji/facebook_messenger/man_factory_worker.png index 225a58bae3..42652507c7 100644 Binary files a/public/images/emoji/facebook_messenger/man_factory_worker.png and b/public/images/emoji/facebook_messenger/man_factory_worker.png differ diff --git a/public/images/emoji/facebook_messenger/man_farmer.png b/public/images/emoji/facebook_messenger/man_farmer.png index 0db3f28676..f1ae631884 100644 Binary files a/public/images/emoji/facebook_messenger/man_farmer.png and b/public/images/emoji/facebook_messenger/man_farmer.png differ diff --git a/public/images/emoji/facebook_messenger/man_firefighter.png b/public/images/emoji/facebook_messenger/man_firefighter.png index af2a62e44e..21ae1ab7da 100644 Binary files a/public/images/emoji/facebook_messenger/man_firefighter.png and b/public/images/emoji/facebook_messenger/man_firefighter.png differ diff --git a/public/images/emoji/facebook_messenger/man_health_worker.png b/public/images/emoji/facebook_messenger/man_health_worker.png index d25197ffc4..e812ac248f 100644 Binary files a/public/images/emoji/facebook_messenger/man_health_worker.png and b/public/images/emoji/facebook_messenger/man_health_worker.png differ diff --git a/public/images/emoji/facebook_messenger/man_in_business_suit_levitating.png b/public/images/emoji/facebook_messenger/man_in_business_suit_levitating.png index 12436f9888..dc6148caa7 100644 Binary files a/public/images/emoji/facebook_messenger/man_in_business_suit_levitating.png and b/public/images/emoji/facebook_messenger/man_in_business_suit_levitating.png differ diff --git a/public/images/emoji/facebook_messenger/man_in_tuxedo.png b/public/images/emoji/facebook_messenger/man_in_tuxedo.png index c1e78a356a..5f7ea9d05d 100644 Binary files a/public/images/emoji/facebook_messenger/man_in_tuxedo.png and b/public/images/emoji/facebook_messenger/man_in_tuxedo.png differ diff --git a/public/images/emoji/facebook_messenger/man_judge.png b/public/images/emoji/facebook_messenger/man_judge.png index 672fb5f7df..81e1fd2715 100644 Binary files a/public/images/emoji/facebook_messenger/man_judge.png and b/public/images/emoji/facebook_messenger/man_judge.png differ diff --git a/public/images/emoji/facebook_messenger/man_juggling.png b/public/images/emoji/facebook_messenger/man_juggling.png index afa07527b3..96ac32c598 100644 Binary files a/public/images/emoji/facebook_messenger/man_juggling.png and b/public/images/emoji/facebook_messenger/man_juggling.png differ diff --git a/public/images/emoji/facebook_messenger/man_mechanic.png b/public/images/emoji/facebook_messenger/man_mechanic.png index c79d7989e9..bc9bf7f167 100644 Binary files a/public/images/emoji/facebook_messenger/man_mechanic.png and b/public/images/emoji/facebook_messenger/man_mechanic.png differ diff --git a/public/images/emoji/facebook_messenger/man_office_worker.png b/public/images/emoji/facebook_messenger/man_office_worker.png index fe5637f8cf..78cfd35ff1 100644 Binary files a/public/images/emoji/facebook_messenger/man_office_worker.png and b/public/images/emoji/facebook_messenger/man_office_worker.png differ diff --git a/public/images/emoji/facebook_messenger/man_pilot.png b/public/images/emoji/facebook_messenger/man_pilot.png index 9dc4123649..b21c106958 100644 Binary files a/public/images/emoji/facebook_messenger/man_pilot.png and b/public/images/emoji/facebook_messenger/man_pilot.png differ diff --git a/public/images/emoji/facebook_messenger/man_playing_handball.png b/public/images/emoji/facebook_messenger/man_playing_handball.png index 8a8ae125d6..567a065669 100644 Binary files a/public/images/emoji/facebook_messenger/man_playing_handball.png and b/public/images/emoji/facebook_messenger/man_playing_handball.png differ diff --git a/public/images/emoji/facebook_messenger/man_playing_water_polo.png b/public/images/emoji/facebook_messenger/man_playing_water_polo.png index 520bca4a68..608659c73e 100644 Binary files a/public/images/emoji/facebook_messenger/man_playing_water_polo.png and b/public/images/emoji/facebook_messenger/man_playing_water_polo.png differ diff --git a/public/images/emoji/facebook_messenger/man_red_haired.png b/public/images/emoji/facebook_messenger/man_red_haired.png new file mode 100644 index 0000000000..4d5ef0e840 Binary files /dev/null and b/public/images/emoji/facebook_messenger/man_red_haired.png differ diff --git a/public/images/emoji/facebook_messenger/man_scientist.png b/public/images/emoji/facebook_messenger/man_scientist.png index d2d1336eb2..eaeb9da522 100644 Binary files a/public/images/emoji/facebook_messenger/man_scientist.png and b/public/images/emoji/facebook_messenger/man_scientist.png differ diff --git a/public/images/emoji/facebook_messenger/man_shrugging.png b/public/images/emoji/facebook_messenger/man_shrugging.png index 378c415170..cc099139ca 100644 Binary files a/public/images/emoji/facebook_messenger/man_shrugging.png and b/public/images/emoji/facebook_messenger/man_shrugging.png differ diff --git a/public/images/emoji/facebook_messenger/man_singer.png b/public/images/emoji/facebook_messenger/man_singer.png index f7a8eb225d..f5ec91075f 100644 Binary files a/public/images/emoji/facebook_messenger/man_singer.png and b/public/images/emoji/facebook_messenger/man_singer.png differ diff --git a/public/images/emoji/facebook_messenger/man_student.png b/public/images/emoji/facebook_messenger/man_student.png index 6f424bf572..e2380af5fb 100644 Binary files a/public/images/emoji/facebook_messenger/man_student.png and b/public/images/emoji/facebook_messenger/man_student.png differ diff --git a/public/images/emoji/facebook_messenger/man_superhero.png b/public/images/emoji/facebook_messenger/man_superhero.png new file mode 100644 index 0000000000..9082575ce9 Binary files /dev/null and b/public/images/emoji/facebook_messenger/man_superhero.png differ diff --git a/public/images/emoji/facebook_messenger/man_supervillain.png b/public/images/emoji/facebook_messenger/man_supervillain.png new file mode 100644 index 0000000000..634a3f4920 Binary files /dev/null and b/public/images/emoji/facebook_messenger/man_supervillain.png differ diff --git a/public/images/emoji/facebook_messenger/man_teacher.png b/public/images/emoji/facebook_messenger/man_teacher.png index 86ce6c107d..fdc458b777 100644 Binary files a/public/images/emoji/facebook_messenger/man_teacher.png and b/public/images/emoji/facebook_messenger/man_teacher.png differ diff --git a/public/images/emoji/facebook_messenger/man_technologist.png b/public/images/emoji/facebook_messenger/man_technologist.png index f20d3a50f6..f3821a27f2 100644 Binary files a/public/images/emoji/facebook_messenger/man_technologist.png and b/public/images/emoji/facebook_messenger/man_technologist.png differ diff --git a/public/images/emoji/facebook_messenger/man_white_haired.png b/public/images/emoji/facebook_messenger/man_white_haired.png new file mode 100644 index 0000000000..f31b3a078c Binary files /dev/null and b/public/images/emoji/facebook_messenger/man_white_haired.png differ diff --git a/public/images/emoji/facebook_messenger/man_with_gua_pi_mao.png b/public/images/emoji/facebook_messenger/man_with_gua_pi_mao.png index 76cd44df79..ed2c8bf960 100644 Binary files a/public/images/emoji/facebook_messenger/man_with_gua_pi_mao.png and b/public/images/emoji/facebook_messenger/man_with_gua_pi_mao.png differ diff --git a/public/images/emoji/facebook_messenger/man_with_turban.png b/public/images/emoji/facebook_messenger/man_with_turban.png index 39194b7c4f..2325c13dbe 100644 Binary files a/public/images/emoji/facebook_messenger/man_with_turban.png and b/public/images/emoji/facebook_messenger/man_with_turban.png differ diff --git a/public/images/emoji/facebook_messenger/mango.png b/public/images/emoji/facebook_messenger/mango.png new file mode 100644 index 0000000000..96d630c7bf Binary files /dev/null and b/public/images/emoji/facebook_messenger/mango.png differ diff --git a/public/images/emoji/facebook_messenger/mans_shoe.png b/public/images/emoji/facebook_messenger/mans_shoe.png index 82f9de4e31..32da28ffcb 100644 Binary files a/public/images/emoji/facebook_messenger/mans_shoe.png and b/public/images/emoji/facebook_messenger/mans_shoe.png differ diff --git a/public/images/emoji/facebook_messenger/mantelpiece_clock.png b/public/images/emoji/facebook_messenger/mantelpiece_clock.png index 78008e45b6..b8696e64f0 100644 Binary files a/public/images/emoji/facebook_messenger/mantelpiece_clock.png and b/public/images/emoji/facebook_messenger/mantelpiece_clock.png differ diff --git a/public/images/emoji/facebook_messenger/map.png b/public/images/emoji/facebook_messenger/map.png index f387ba2fd7..613f6de858 100644 Binary files a/public/images/emoji/facebook_messenger/map.png and b/public/images/emoji/facebook_messenger/map.png differ diff --git a/public/images/emoji/facebook_messenger/maple_leaf.png b/public/images/emoji/facebook_messenger/maple_leaf.png index eeced53f25..6a7e5026f9 100644 Binary files a/public/images/emoji/facebook_messenger/maple_leaf.png and b/public/images/emoji/facebook_messenger/maple_leaf.png differ diff --git a/public/images/emoji/facebook_messenger/marshall_islands.png b/public/images/emoji/facebook_messenger/marshall_islands.png index acd27f3eba..ab77d93c81 100644 Binary files a/public/images/emoji/facebook_messenger/marshall_islands.png and b/public/images/emoji/facebook_messenger/marshall_islands.png differ diff --git a/public/images/emoji/facebook_messenger/martial_arts_uniform.png b/public/images/emoji/facebook_messenger/martial_arts_uniform.png index 04258b2bb5..8acfcb100a 100644 Binary files a/public/images/emoji/facebook_messenger/martial_arts_uniform.png and b/public/images/emoji/facebook_messenger/martial_arts_uniform.png differ diff --git a/public/images/emoji/facebook_messenger/martinique.png b/public/images/emoji/facebook_messenger/martinique.png index 05e5005493..72ef7480f4 100644 Binary files a/public/images/emoji/facebook_messenger/martinique.png and b/public/images/emoji/facebook_messenger/martinique.png differ diff --git a/public/images/emoji/facebook_messenger/mask.png b/public/images/emoji/facebook_messenger/mask.png index 56eefc6684..fdf098ca1f 100644 Binary files a/public/images/emoji/facebook_messenger/mask.png and b/public/images/emoji/facebook_messenger/mask.png differ diff --git a/public/images/emoji/facebook_messenger/massage.png b/public/images/emoji/facebook_messenger/massage.png index 7bd3bc2694..bf672bf25c 100644 Binary files a/public/images/emoji/facebook_messenger/massage.png and b/public/images/emoji/facebook_messenger/massage.png differ diff --git a/public/images/emoji/facebook_messenger/massage_man.png b/public/images/emoji/facebook_messenger/massage_man.png index 1c94d6a3fe..1334d8c0aa 100644 Binary files a/public/images/emoji/facebook_messenger/massage_man.png and b/public/images/emoji/facebook_messenger/massage_man.png differ diff --git a/public/images/emoji/facebook_messenger/massage_woman.png b/public/images/emoji/facebook_messenger/massage_woman.png index 7bd3bc2694..bf672bf25c 100644 Binary files a/public/images/emoji/facebook_messenger/massage_woman.png and b/public/images/emoji/facebook_messenger/massage_woman.png differ diff --git a/public/images/emoji/facebook_messenger/mauritania.png b/public/images/emoji/facebook_messenger/mauritania.png index 3c10439149..0617bb522e 100644 Binary files a/public/images/emoji/facebook_messenger/mauritania.png and b/public/images/emoji/facebook_messenger/mauritania.png differ diff --git a/public/images/emoji/facebook_messenger/mauritius.png b/public/images/emoji/facebook_messenger/mauritius.png index 048d235748..5a727e5a76 100644 Binary files a/public/images/emoji/facebook_messenger/mauritius.png and b/public/images/emoji/facebook_messenger/mauritius.png differ diff --git a/public/images/emoji/facebook_messenger/mayotte.png b/public/images/emoji/facebook_messenger/mayotte.png index d719a9d2d3..2fbaa1f34f 100644 Binary files a/public/images/emoji/facebook_messenger/mayotte.png and b/public/images/emoji/facebook_messenger/mayotte.png differ diff --git a/public/images/emoji/facebook_messenger/meat_on_bone.png b/public/images/emoji/facebook_messenger/meat_on_bone.png index 4d06e486e9..ffb403dc18 100644 Binary files a/public/images/emoji/facebook_messenger/meat_on_bone.png and b/public/images/emoji/facebook_messenger/meat_on_bone.png differ diff --git a/public/images/emoji/facebook_messenger/medal.png b/public/images/emoji/facebook_messenger/medal.png index 2f481eb281..158e4afbe8 100644 Binary files a/public/images/emoji/facebook_messenger/medal.png and b/public/images/emoji/facebook_messenger/medal.png differ diff --git a/public/images/emoji/facebook_messenger/medal_military.png b/public/images/emoji/facebook_messenger/medal_military.png index 8d80e8b4c6..0afdd2474b 100644 Binary files a/public/images/emoji/facebook_messenger/medal_military.png and b/public/images/emoji/facebook_messenger/medal_military.png differ diff --git a/public/images/emoji/facebook_messenger/medal_sports.png b/public/images/emoji/facebook_messenger/medal_sports.png index 2f481eb281..158e4afbe8 100644 Binary files a/public/images/emoji/facebook_messenger/medal_sports.png and b/public/images/emoji/facebook_messenger/medal_sports.png differ diff --git a/public/images/emoji/facebook_messenger/mega.png b/public/images/emoji/facebook_messenger/mega.png index 7e2d03af65..c6bca074b9 100644 Binary files a/public/images/emoji/facebook_messenger/mega.png and b/public/images/emoji/facebook_messenger/mega.png differ diff --git a/public/images/emoji/facebook_messenger/melon.png b/public/images/emoji/facebook_messenger/melon.png index bcc3734221..b51b21a087 100644 Binary files a/public/images/emoji/facebook_messenger/melon.png and b/public/images/emoji/facebook_messenger/melon.png differ diff --git a/public/images/emoji/facebook_messenger/memo.png b/public/images/emoji/facebook_messenger/memo.png index 57d00e040e..21f0fbc228 100644 Binary files a/public/images/emoji/facebook_messenger/memo.png and b/public/images/emoji/facebook_messenger/memo.png differ diff --git a/public/images/emoji/facebook_messenger/men_wrestling.png b/public/images/emoji/facebook_messenger/men_wrestling.png index 1e179aa03a..5752f39022 100644 Binary files a/public/images/emoji/facebook_messenger/men_wrestling.png and b/public/images/emoji/facebook_messenger/men_wrestling.png differ diff --git a/public/images/emoji/facebook_messenger/menorah.png b/public/images/emoji/facebook_messenger/menorah.png index 292658d622..b7cc4934de 100644 Binary files a/public/images/emoji/facebook_messenger/menorah.png and b/public/images/emoji/facebook_messenger/menorah.png differ diff --git a/public/images/emoji/facebook_messenger/mens.png b/public/images/emoji/facebook_messenger/mens.png index 306dc4c6e1..a5d10d718f 100644 Binary files a/public/images/emoji/facebook_messenger/mens.png and b/public/images/emoji/facebook_messenger/mens.png differ diff --git a/public/images/emoji/facebook_messenger/mermaid.png b/public/images/emoji/facebook_messenger/mermaid.png index a2b11f2232..e342722ea4 100644 Binary files a/public/images/emoji/facebook_messenger/mermaid.png and b/public/images/emoji/facebook_messenger/mermaid.png differ diff --git a/public/images/emoji/facebook_messenger/merman.png b/public/images/emoji/facebook_messenger/merman.png index 8f80f7787f..2805aa2072 100644 Binary files a/public/images/emoji/facebook_messenger/merman.png and b/public/images/emoji/facebook_messenger/merman.png differ diff --git a/public/images/emoji/facebook_messenger/metal.png b/public/images/emoji/facebook_messenger/metal.png index 42ebf7a6e4..a7aaf0fa88 100644 Binary files a/public/images/emoji/facebook_messenger/metal.png and b/public/images/emoji/facebook_messenger/metal.png differ diff --git a/public/images/emoji/facebook_messenger/metro.png b/public/images/emoji/facebook_messenger/metro.png index b8b8874e58..e0b9f18128 100644 Binary files a/public/images/emoji/facebook_messenger/metro.png and b/public/images/emoji/facebook_messenger/metro.png differ diff --git a/public/images/emoji/facebook_messenger/mexico.png b/public/images/emoji/facebook_messenger/mexico.png index 79c41a695c..ed85a728f3 100644 Binary files a/public/images/emoji/facebook_messenger/mexico.png and b/public/images/emoji/facebook_messenger/mexico.png differ diff --git a/public/images/emoji/facebook_messenger/microbe.png b/public/images/emoji/facebook_messenger/microbe.png new file mode 100644 index 0000000000..1b687cbe7b Binary files /dev/null and b/public/images/emoji/facebook_messenger/microbe.png differ diff --git a/public/images/emoji/facebook_messenger/micronesia.png b/public/images/emoji/facebook_messenger/micronesia.png index 21c6152900..f05a0728ac 100644 Binary files a/public/images/emoji/facebook_messenger/micronesia.png and b/public/images/emoji/facebook_messenger/micronesia.png differ diff --git a/public/images/emoji/facebook_messenger/microphone.png b/public/images/emoji/facebook_messenger/microphone.png index 7ebc72a14c..383aeaab31 100644 Binary files a/public/images/emoji/facebook_messenger/microphone.png and b/public/images/emoji/facebook_messenger/microphone.png differ diff --git a/public/images/emoji/facebook_messenger/microphone2.png b/public/images/emoji/facebook_messenger/microphone2.png index ed24a78f7f..15726b76d6 100644 Binary files a/public/images/emoji/facebook_messenger/microphone2.png and b/public/images/emoji/facebook_messenger/microphone2.png differ diff --git a/public/images/emoji/facebook_messenger/microscope.png b/public/images/emoji/facebook_messenger/microscope.png index 6a4530f623..8e4fc758ea 100644 Binary files a/public/images/emoji/facebook_messenger/microscope.png and b/public/images/emoji/facebook_messenger/microscope.png differ diff --git a/public/images/emoji/facebook_messenger/middle_finger.png b/public/images/emoji/facebook_messenger/middle_finger.png index 7f227d2d23..bc7e5f100c 100644 Binary files a/public/images/emoji/facebook_messenger/middle_finger.png and b/public/images/emoji/facebook_messenger/middle_finger.png differ diff --git a/public/images/emoji/facebook_messenger/military_medal.png b/public/images/emoji/facebook_messenger/military_medal.png index 8d80e8b4c6..0afdd2474b 100644 Binary files a/public/images/emoji/facebook_messenger/military_medal.png and b/public/images/emoji/facebook_messenger/military_medal.png differ diff --git a/public/images/emoji/facebook_messenger/milk_glass.png b/public/images/emoji/facebook_messenger/milk_glass.png index 45c736ee87..e9dea59860 100644 Binary files a/public/images/emoji/facebook_messenger/milk_glass.png and b/public/images/emoji/facebook_messenger/milk_glass.png differ diff --git a/public/images/emoji/facebook_messenger/milky_way.png b/public/images/emoji/facebook_messenger/milky_way.png index 3183e2b6b7..8b88998ee9 100644 Binary files a/public/images/emoji/facebook_messenger/milky_way.png and b/public/images/emoji/facebook_messenger/milky_way.png differ diff --git a/public/images/emoji/facebook_messenger/minibus.png b/public/images/emoji/facebook_messenger/minibus.png index bed2cfab32..71c756d63b 100644 Binary files a/public/images/emoji/facebook_messenger/minibus.png and b/public/images/emoji/facebook_messenger/minibus.png differ diff --git a/public/images/emoji/facebook_messenger/minidisc.png b/public/images/emoji/facebook_messenger/minidisc.png index 6ef24a0c5d..a271914949 100644 Binary files a/public/images/emoji/facebook_messenger/minidisc.png and b/public/images/emoji/facebook_messenger/minidisc.png differ diff --git a/public/images/emoji/facebook_messenger/mobile_phone_off.png b/public/images/emoji/facebook_messenger/mobile_phone_off.png index 0cba945b11..4fae7f81bc 100644 Binary files a/public/images/emoji/facebook_messenger/mobile_phone_off.png and b/public/images/emoji/facebook_messenger/mobile_phone_off.png differ diff --git a/public/images/emoji/facebook_messenger/moldova.png b/public/images/emoji/facebook_messenger/moldova.png index 13d3d63680..578b194f26 100644 Binary files a/public/images/emoji/facebook_messenger/moldova.png and b/public/images/emoji/facebook_messenger/moldova.png differ diff --git a/public/images/emoji/facebook_messenger/monaco.png b/public/images/emoji/facebook_messenger/monaco.png index 3d30b55f81..ceda3c6aec 100644 Binary files a/public/images/emoji/facebook_messenger/monaco.png and b/public/images/emoji/facebook_messenger/monaco.png differ diff --git a/public/images/emoji/facebook_messenger/money_mouth.png b/public/images/emoji/facebook_messenger/money_mouth.png index 4ef96ba5f7..67de328361 100644 Binary files a/public/images/emoji/facebook_messenger/money_mouth.png and b/public/images/emoji/facebook_messenger/money_mouth.png differ diff --git a/public/images/emoji/facebook_messenger/money_mouth_face.png b/public/images/emoji/facebook_messenger/money_mouth_face.png index 4ef96ba5f7..67de328361 100644 Binary files a/public/images/emoji/facebook_messenger/money_mouth_face.png and b/public/images/emoji/facebook_messenger/money_mouth_face.png differ diff --git a/public/images/emoji/facebook_messenger/money_with_wings.png b/public/images/emoji/facebook_messenger/money_with_wings.png index 4f500ee513..f94f6c76be 100644 Binary files a/public/images/emoji/facebook_messenger/money_with_wings.png and b/public/images/emoji/facebook_messenger/money_with_wings.png differ diff --git a/public/images/emoji/facebook_messenger/moneybag.png b/public/images/emoji/facebook_messenger/moneybag.png index 0b80bcf56a..8cbf65ae5d 100644 Binary files a/public/images/emoji/facebook_messenger/moneybag.png and b/public/images/emoji/facebook_messenger/moneybag.png differ diff --git a/public/images/emoji/facebook_messenger/mongolia.png b/public/images/emoji/facebook_messenger/mongolia.png index 19672874f3..ff11355a4f 100644 Binary files a/public/images/emoji/facebook_messenger/mongolia.png and b/public/images/emoji/facebook_messenger/mongolia.png differ diff --git a/public/images/emoji/facebook_messenger/monkey.png b/public/images/emoji/facebook_messenger/monkey.png index e6e32df3c2..8650288abb 100644 Binary files a/public/images/emoji/facebook_messenger/monkey.png and b/public/images/emoji/facebook_messenger/monkey.png differ diff --git a/public/images/emoji/facebook_messenger/monkey_face.png b/public/images/emoji/facebook_messenger/monkey_face.png index a1cc715ede..4816e79322 100644 Binary files a/public/images/emoji/facebook_messenger/monkey_face.png and b/public/images/emoji/facebook_messenger/monkey_face.png differ diff --git a/public/images/emoji/facebook_messenger/monorail.png b/public/images/emoji/facebook_messenger/monorail.png index c746ad48f7..06119cc6e5 100644 Binary files a/public/images/emoji/facebook_messenger/monorail.png and b/public/images/emoji/facebook_messenger/monorail.png differ diff --git a/public/images/emoji/facebook_messenger/montenegro.png b/public/images/emoji/facebook_messenger/montenegro.png index d341052481..f793b6f67b 100644 Binary files a/public/images/emoji/facebook_messenger/montenegro.png and b/public/images/emoji/facebook_messenger/montenegro.png differ diff --git a/public/images/emoji/facebook_messenger/montserrat.png b/public/images/emoji/facebook_messenger/montserrat.png index e93e3f1ad5..67bf8a4acc 100644 Binary files a/public/images/emoji/facebook_messenger/montserrat.png and b/public/images/emoji/facebook_messenger/montserrat.png differ diff --git a/public/images/emoji/facebook_messenger/moon.png b/public/images/emoji/facebook_messenger/moon.png index 6c643e99fb..133f411122 100644 Binary files a/public/images/emoji/facebook_messenger/moon.png and b/public/images/emoji/facebook_messenger/moon.png differ diff --git a/public/images/emoji/facebook_messenger/moon_cake.png b/public/images/emoji/facebook_messenger/moon_cake.png new file mode 100644 index 0000000000..409640aa73 Binary files /dev/null and b/public/images/emoji/facebook_messenger/moon_cake.png differ diff --git a/public/images/emoji/facebook_messenger/morocco.png b/public/images/emoji/facebook_messenger/morocco.png index deb941c352..0f09c4c680 100644 Binary files a/public/images/emoji/facebook_messenger/morocco.png and b/public/images/emoji/facebook_messenger/morocco.png differ diff --git a/public/images/emoji/facebook_messenger/mortar_board.png b/public/images/emoji/facebook_messenger/mortar_board.png index 682dea333c..a390e1a8f8 100644 Binary files a/public/images/emoji/facebook_messenger/mortar_board.png and b/public/images/emoji/facebook_messenger/mortar_board.png differ diff --git a/public/images/emoji/facebook_messenger/mosque.png b/public/images/emoji/facebook_messenger/mosque.png index eb379aabfc..7dc48bbd4f 100644 Binary files a/public/images/emoji/facebook_messenger/mosque.png and b/public/images/emoji/facebook_messenger/mosque.png differ diff --git a/public/images/emoji/facebook_messenger/mosquito.png b/public/images/emoji/facebook_messenger/mosquito.png new file mode 100644 index 0000000000..325c90ea79 Binary files /dev/null and b/public/images/emoji/facebook_messenger/mosquito.png differ diff --git a/public/images/emoji/facebook_messenger/motor_boat.png b/public/images/emoji/facebook_messenger/motor_boat.png index d17e9287e5..b47e2f413d 100644 Binary files a/public/images/emoji/facebook_messenger/motor_boat.png and b/public/images/emoji/facebook_messenger/motor_boat.png differ diff --git a/public/images/emoji/facebook_messenger/motor_scooter.png b/public/images/emoji/facebook_messenger/motor_scooter.png index bcf8f5edf4..5674a2e61b 100644 Binary files a/public/images/emoji/facebook_messenger/motor_scooter.png and b/public/images/emoji/facebook_messenger/motor_scooter.png differ diff --git a/public/images/emoji/facebook_messenger/motorboat.png b/public/images/emoji/facebook_messenger/motorboat.png index d17e9287e5..b47e2f413d 100644 Binary files a/public/images/emoji/facebook_messenger/motorboat.png and b/public/images/emoji/facebook_messenger/motorboat.png differ diff --git a/public/images/emoji/facebook_messenger/motorcycle.png b/public/images/emoji/facebook_messenger/motorcycle.png index a23e481708..c52194be27 100644 Binary files a/public/images/emoji/facebook_messenger/motorcycle.png and b/public/images/emoji/facebook_messenger/motorcycle.png differ diff --git a/public/images/emoji/facebook_messenger/motorway.png b/public/images/emoji/facebook_messenger/motorway.png index 9519c6cc3b..e0c20bca1b 100644 Binary files a/public/images/emoji/facebook_messenger/motorway.png and b/public/images/emoji/facebook_messenger/motorway.png differ diff --git a/public/images/emoji/facebook_messenger/mount_fuji.png b/public/images/emoji/facebook_messenger/mount_fuji.png index 2c07a998e7..3980fa05e0 100644 Binary files a/public/images/emoji/facebook_messenger/mount_fuji.png and b/public/images/emoji/facebook_messenger/mount_fuji.png differ diff --git a/public/images/emoji/facebook_messenger/mountain.png b/public/images/emoji/facebook_messenger/mountain.png index d5fd7c1c0f..27bf768db7 100644 Binary files a/public/images/emoji/facebook_messenger/mountain.png and b/public/images/emoji/facebook_messenger/mountain.png differ diff --git a/public/images/emoji/facebook_messenger/mountain_bicyclist.png b/public/images/emoji/facebook_messenger/mountain_bicyclist.png index 9f8962cf5a..e98486a0ab 100644 Binary files a/public/images/emoji/facebook_messenger/mountain_bicyclist.png and b/public/images/emoji/facebook_messenger/mountain_bicyclist.png differ diff --git a/public/images/emoji/facebook_messenger/mountain_biking_man.png b/public/images/emoji/facebook_messenger/mountain_biking_man.png index 9f8962cf5a..e98486a0ab 100644 Binary files a/public/images/emoji/facebook_messenger/mountain_biking_man.png and b/public/images/emoji/facebook_messenger/mountain_biking_man.png differ diff --git a/public/images/emoji/facebook_messenger/mountain_biking_woman.png b/public/images/emoji/facebook_messenger/mountain_biking_woman.png index 848ae248ab..54d9a3ecf1 100644 Binary files a/public/images/emoji/facebook_messenger/mountain_biking_woman.png and b/public/images/emoji/facebook_messenger/mountain_biking_woman.png differ diff --git a/public/images/emoji/facebook_messenger/mountain_cableway.png b/public/images/emoji/facebook_messenger/mountain_cableway.png index 05e5c2cd34..b84f15d8b4 100644 Binary files a/public/images/emoji/facebook_messenger/mountain_cableway.png and b/public/images/emoji/facebook_messenger/mountain_cableway.png differ diff --git a/public/images/emoji/facebook_messenger/mountain_railway.png b/public/images/emoji/facebook_messenger/mountain_railway.png index 55752f0549..6f00b0351f 100644 Binary files a/public/images/emoji/facebook_messenger/mountain_railway.png and b/public/images/emoji/facebook_messenger/mountain_railway.png differ diff --git a/public/images/emoji/facebook_messenger/mountain_snow.png b/public/images/emoji/facebook_messenger/mountain_snow.png index 5529c620de..118d62d5a6 100644 Binary files a/public/images/emoji/facebook_messenger/mountain_snow.png and b/public/images/emoji/facebook_messenger/mountain_snow.png differ diff --git a/public/images/emoji/facebook_messenger/mouse.png b/public/images/emoji/facebook_messenger/mouse.png index b451d03334..c8aa13166e 100644 Binary files a/public/images/emoji/facebook_messenger/mouse.png and b/public/images/emoji/facebook_messenger/mouse.png differ diff --git a/public/images/emoji/facebook_messenger/mouse2.png b/public/images/emoji/facebook_messenger/mouse2.png index 92e3d7efd6..a721c7eae1 100644 Binary files a/public/images/emoji/facebook_messenger/mouse2.png and b/public/images/emoji/facebook_messenger/mouse2.png differ diff --git a/public/images/emoji/facebook_messenger/mouse_three_button.png b/public/images/emoji/facebook_messenger/mouse_three_button.png index 53fdef1f76..f9917195e0 100644 Binary files a/public/images/emoji/facebook_messenger/mouse_three_button.png and b/public/images/emoji/facebook_messenger/mouse_three_button.png differ diff --git a/public/images/emoji/facebook_messenger/movie_camera.png b/public/images/emoji/facebook_messenger/movie_camera.png index 0e7c8535d2..2d109b206a 100644 Binary files a/public/images/emoji/facebook_messenger/movie_camera.png and b/public/images/emoji/facebook_messenger/movie_camera.png differ diff --git a/public/images/emoji/facebook_messenger/moyai.png b/public/images/emoji/facebook_messenger/moyai.png index 9358b9ee33..3b0bff74ae 100644 Binary files a/public/images/emoji/facebook_messenger/moyai.png and b/public/images/emoji/facebook_messenger/moyai.png differ diff --git a/public/images/emoji/facebook_messenger/mozambique.png b/public/images/emoji/facebook_messenger/mozambique.png index e2fb9eb03e..ceb7120ef6 100644 Binary files a/public/images/emoji/facebook_messenger/mozambique.png and b/public/images/emoji/facebook_messenger/mozambique.png differ diff --git a/public/images/emoji/facebook_messenger/mrs_claus.png b/public/images/emoji/facebook_messenger/mrs_claus.png index 8530a11d5d..f784aca235 100644 Binary files a/public/images/emoji/facebook_messenger/mrs_claus.png and b/public/images/emoji/facebook_messenger/mrs_claus.png differ diff --git a/public/images/emoji/facebook_messenger/muscle.png b/public/images/emoji/facebook_messenger/muscle.png index 9bbaec8da5..81f346aef4 100644 Binary files a/public/images/emoji/facebook_messenger/muscle.png and b/public/images/emoji/facebook_messenger/muscle.png differ diff --git a/public/images/emoji/facebook_messenger/mushroom.png b/public/images/emoji/facebook_messenger/mushroom.png index bf49f207ee..ed274e46c2 100644 Binary files a/public/images/emoji/facebook_messenger/mushroom.png and b/public/images/emoji/facebook_messenger/mushroom.png differ diff --git a/public/images/emoji/facebook_messenger/musical_keyboard.png b/public/images/emoji/facebook_messenger/musical_keyboard.png index 68d5e55021..d1a68eebf4 100644 Binary files a/public/images/emoji/facebook_messenger/musical_keyboard.png and b/public/images/emoji/facebook_messenger/musical_keyboard.png differ diff --git a/public/images/emoji/facebook_messenger/musical_note.png b/public/images/emoji/facebook_messenger/musical_note.png index 5d00c5d49a..fe134a6986 100644 Binary files a/public/images/emoji/facebook_messenger/musical_note.png and b/public/images/emoji/facebook_messenger/musical_note.png differ diff --git a/public/images/emoji/facebook_messenger/musical_score.png b/public/images/emoji/facebook_messenger/musical_score.png index a666aeee4c..aef3fa53ea 100644 Binary files a/public/images/emoji/facebook_messenger/musical_score.png and b/public/images/emoji/facebook_messenger/musical_score.png differ diff --git a/public/images/emoji/facebook_messenger/mute.png b/public/images/emoji/facebook_messenger/mute.png index b63a966af3..9ea4dbb9e8 100644 Binary files a/public/images/emoji/facebook_messenger/mute.png and b/public/images/emoji/facebook_messenger/mute.png differ diff --git a/public/images/emoji/facebook_messenger/myanmar.png b/public/images/emoji/facebook_messenger/myanmar.png index b181354b0c..3b2c34cdb6 100644 Binary files a/public/images/emoji/facebook_messenger/myanmar.png and b/public/images/emoji/facebook_messenger/myanmar.png differ diff --git a/public/images/emoji/facebook_messenger/nail_care.png b/public/images/emoji/facebook_messenger/nail_care.png index 3e11be1510..eadae8eadd 100644 Binary files a/public/images/emoji/facebook_messenger/nail_care.png and b/public/images/emoji/facebook_messenger/nail_care.png differ diff --git a/public/images/emoji/facebook_messenger/name_badge.png b/public/images/emoji/facebook_messenger/name_badge.png index b6004838b0..34b8970757 100644 Binary files a/public/images/emoji/facebook_messenger/name_badge.png and b/public/images/emoji/facebook_messenger/name_badge.png differ diff --git a/public/images/emoji/facebook_messenger/namibia.png b/public/images/emoji/facebook_messenger/namibia.png index f5ca04c822..21b3161a97 100644 Binary files a/public/images/emoji/facebook_messenger/namibia.png and b/public/images/emoji/facebook_messenger/namibia.png differ diff --git a/public/images/emoji/facebook_messenger/national_park.png b/public/images/emoji/facebook_messenger/national_park.png index 38452f9b92..26ed901dea 100644 Binary files a/public/images/emoji/facebook_messenger/national_park.png and b/public/images/emoji/facebook_messenger/national_park.png differ diff --git a/public/images/emoji/facebook_messenger/nauru.png b/public/images/emoji/facebook_messenger/nauru.png index eab0c09add..aa270281a0 100644 Binary files a/public/images/emoji/facebook_messenger/nauru.png and b/public/images/emoji/facebook_messenger/nauru.png differ diff --git a/public/images/emoji/facebook_messenger/nauseated_face.png b/public/images/emoji/facebook_messenger/nauseated_face.png index c50528789c..cfd44c2d97 100644 Binary files a/public/images/emoji/facebook_messenger/nauseated_face.png and b/public/images/emoji/facebook_messenger/nauseated_face.png differ diff --git a/public/images/emoji/facebook_messenger/nazar_amulet.png b/public/images/emoji/facebook_messenger/nazar_amulet.png new file mode 100644 index 0000000000..a5e55b990f Binary files /dev/null and b/public/images/emoji/facebook_messenger/nazar_amulet.png differ diff --git a/public/images/emoji/facebook_messenger/necktie.png b/public/images/emoji/facebook_messenger/necktie.png index 3b0b644091..a1799c6a70 100644 Binary files a/public/images/emoji/facebook_messenger/necktie.png and b/public/images/emoji/facebook_messenger/necktie.png differ diff --git a/public/images/emoji/facebook_messenger/negative_squared_cross_mark.png b/public/images/emoji/facebook_messenger/negative_squared_cross_mark.png index 7a5b77824a..faed2ca4ce 100644 Binary files a/public/images/emoji/facebook_messenger/negative_squared_cross_mark.png and b/public/images/emoji/facebook_messenger/negative_squared_cross_mark.png differ diff --git a/public/images/emoji/facebook_messenger/nepal.png b/public/images/emoji/facebook_messenger/nepal.png index 52db040673..ef0dfbe921 100644 Binary files a/public/images/emoji/facebook_messenger/nepal.png and b/public/images/emoji/facebook_messenger/nepal.png differ diff --git a/public/images/emoji/facebook_messenger/nerd.png b/public/images/emoji/facebook_messenger/nerd.png index 2c83c27732..1c8a6ccd36 100644 Binary files a/public/images/emoji/facebook_messenger/nerd.png and b/public/images/emoji/facebook_messenger/nerd.png differ diff --git a/public/images/emoji/facebook_messenger/nerd_face.png b/public/images/emoji/facebook_messenger/nerd_face.png index 2c83c27732..1c8a6ccd36 100644 Binary files a/public/images/emoji/facebook_messenger/nerd_face.png and b/public/images/emoji/facebook_messenger/nerd_face.png differ diff --git a/public/images/emoji/facebook_messenger/netherlands.png b/public/images/emoji/facebook_messenger/netherlands.png index d939e8d0ab..49ed7dd6df 100644 Binary files a/public/images/emoji/facebook_messenger/netherlands.png and b/public/images/emoji/facebook_messenger/netherlands.png differ diff --git a/public/images/emoji/facebook_messenger/neutral_face.png b/public/images/emoji/facebook_messenger/neutral_face.png index 0272013bb9..b014949de4 100644 Binary files a/public/images/emoji/facebook_messenger/neutral_face.png and b/public/images/emoji/facebook_messenger/neutral_face.png differ diff --git a/public/images/emoji/facebook_messenger/new.png b/public/images/emoji/facebook_messenger/new.png index 399ac34b5b..41b6312772 100644 Binary files a/public/images/emoji/facebook_messenger/new.png and b/public/images/emoji/facebook_messenger/new.png differ diff --git a/public/images/emoji/facebook_messenger/new_caledonia.png b/public/images/emoji/facebook_messenger/new_caledonia.png index 95db4553b7..cb662ca6ee 100644 Binary files a/public/images/emoji/facebook_messenger/new_caledonia.png and b/public/images/emoji/facebook_messenger/new_caledonia.png differ diff --git a/public/images/emoji/facebook_messenger/new_moon.png b/public/images/emoji/facebook_messenger/new_moon.png index 6c643e99fb..133f411122 100644 Binary files a/public/images/emoji/facebook_messenger/new_moon.png and b/public/images/emoji/facebook_messenger/new_moon.png differ diff --git a/public/images/emoji/facebook_messenger/new_moon_with_face.png b/public/images/emoji/facebook_messenger/new_moon_with_face.png index a73dd1035d..9fd4711909 100644 Binary files a/public/images/emoji/facebook_messenger/new_moon_with_face.png and b/public/images/emoji/facebook_messenger/new_moon_with_face.png differ diff --git a/public/images/emoji/facebook_messenger/new_zealand.png b/public/images/emoji/facebook_messenger/new_zealand.png index 6e5d8b040e..9d55981c5b 100644 Binary files a/public/images/emoji/facebook_messenger/new_zealand.png and b/public/images/emoji/facebook_messenger/new_zealand.png differ diff --git a/public/images/emoji/facebook_messenger/newspaper.png b/public/images/emoji/facebook_messenger/newspaper.png index 0f17e09c37..5beb928da5 100644 Binary files a/public/images/emoji/facebook_messenger/newspaper.png and b/public/images/emoji/facebook_messenger/newspaper.png differ diff --git a/public/images/emoji/facebook_messenger/newspaper2.png b/public/images/emoji/facebook_messenger/newspaper2.png index 785c9d1767..19b2d593d4 100644 Binary files a/public/images/emoji/facebook_messenger/newspaper2.png and b/public/images/emoji/facebook_messenger/newspaper2.png differ diff --git a/public/images/emoji/facebook_messenger/newspaper_roll.png b/public/images/emoji/facebook_messenger/newspaper_roll.png index 785c9d1767..19b2d593d4 100644 Binary files a/public/images/emoji/facebook_messenger/newspaper_roll.png and b/public/images/emoji/facebook_messenger/newspaper_roll.png differ diff --git a/public/images/emoji/facebook_messenger/next_track.png b/public/images/emoji/facebook_messenger/next_track.png index 73c5fae8b8..ea6437b1bd 100644 Binary files a/public/images/emoji/facebook_messenger/next_track.png and b/public/images/emoji/facebook_messenger/next_track.png differ diff --git a/public/images/emoji/facebook_messenger/next_track_button.png b/public/images/emoji/facebook_messenger/next_track_button.png index 73c5fae8b8..ea6437b1bd 100644 Binary files a/public/images/emoji/facebook_messenger/next_track_button.png and b/public/images/emoji/facebook_messenger/next_track_button.png differ diff --git a/public/images/emoji/facebook_messenger/ng.png b/public/images/emoji/facebook_messenger/ng.png index 77d4f0bc5d..7cb60c333b 100644 Binary files a/public/images/emoji/facebook_messenger/ng.png and b/public/images/emoji/facebook_messenger/ng.png differ diff --git a/public/images/emoji/facebook_messenger/nicaragua.png b/public/images/emoji/facebook_messenger/nicaragua.png index f173f6e56f..789e984a60 100644 Binary files a/public/images/emoji/facebook_messenger/nicaragua.png and b/public/images/emoji/facebook_messenger/nicaragua.png differ diff --git a/public/images/emoji/facebook_messenger/niger.png b/public/images/emoji/facebook_messenger/niger.png index 7a63027982..55cf8db145 100644 Binary files a/public/images/emoji/facebook_messenger/niger.png and b/public/images/emoji/facebook_messenger/niger.png differ diff --git a/public/images/emoji/facebook_messenger/nigeria.png b/public/images/emoji/facebook_messenger/nigeria.png index fef6a35192..d4fcbb1d00 100644 Binary files a/public/images/emoji/facebook_messenger/nigeria.png and b/public/images/emoji/facebook_messenger/nigeria.png differ diff --git a/public/images/emoji/facebook_messenger/night_with_stars.png b/public/images/emoji/facebook_messenger/night_with_stars.png index e4dbd0f925..9495e56b0a 100644 Binary files a/public/images/emoji/facebook_messenger/night_with_stars.png and b/public/images/emoji/facebook_messenger/night_with_stars.png differ diff --git a/public/images/emoji/facebook_messenger/nine.png b/public/images/emoji/facebook_messenger/nine.png index 78c2b33ae4..c1dbb2010d 100644 Binary files a/public/images/emoji/facebook_messenger/nine.png and b/public/images/emoji/facebook_messenger/nine.png differ diff --git a/public/images/emoji/facebook_messenger/niue.png b/public/images/emoji/facebook_messenger/niue.png index f60cff48dd..25b3bc21af 100644 Binary files a/public/images/emoji/facebook_messenger/niue.png and b/public/images/emoji/facebook_messenger/niue.png differ diff --git a/public/images/emoji/facebook_messenger/no_bell.png b/public/images/emoji/facebook_messenger/no_bell.png index 0d7043bfe7..2331c8e93f 100644 Binary files a/public/images/emoji/facebook_messenger/no_bell.png and b/public/images/emoji/facebook_messenger/no_bell.png differ diff --git a/public/images/emoji/facebook_messenger/no_bicycles.png b/public/images/emoji/facebook_messenger/no_bicycles.png index 5d365336c4..94ddf603a2 100644 Binary files a/public/images/emoji/facebook_messenger/no_bicycles.png and b/public/images/emoji/facebook_messenger/no_bicycles.png differ diff --git a/public/images/emoji/facebook_messenger/no_entry.png b/public/images/emoji/facebook_messenger/no_entry.png index b251f243c3..37130b2323 100644 Binary files a/public/images/emoji/facebook_messenger/no_entry.png and b/public/images/emoji/facebook_messenger/no_entry.png differ diff --git a/public/images/emoji/facebook_messenger/no_entry_sign.png b/public/images/emoji/facebook_messenger/no_entry_sign.png index 3fb90983da..7330e9420a 100644 Binary files a/public/images/emoji/facebook_messenger/no_entry_sign.png and b/public/images/emoji/facebook_messenger/no_entry_sign.png differ diff --git a/public/images/emoji/facebook_messenger/no_good.png b/public/images/emoji/facebook_messenger/no_good.png index 35ea5e5a2e..26992a04a1 100644 Binary files a/public/images/emoji/facebook_messenger/no_good.png and b/public/images/emoji/facebook_messenger/no_good.png differ diff --git a/public/images/emoji/facebook_messenger/no_good_man.png b/public/images/emoji/facebook_messenger/no_good_man.png index 04525ff5a9..631558712f 100644 Binary files a/public/images/emoji/facebook_messenger/no_good_man.png and b/public/images/emoji/facebook_messenger/no_good_man.png differ diff --git a/public/images/emoji/facebook_messenger/no_good_woman.png b/public/images/emoji/facebook_messenger/no_good_woman.png index 35ea5e5a2e..26992a04a1 100644 Binary files a/public/images/emoji/facebook_messenger/no_good_woman.png and b/public/images/emoji/facebook_messenger/no_good_woman.png differ diff --git a/public/images/emoji/facebook_messenger/no_mobile_phones.png b/public/images/emoji/facebook_messenger/no_mobile_phones.png index 64444baa03..3bc956d332 100644 Binary files a/public/images/emoji/facebook_messenger/no_mobile_phones.png and b/public/images/emoji/facebook_messenger/no_mobile_phones.png differ diff --git a/public/images/emoji/facebook_messenger/no_mouth.png b/public/images/emoji/facebook_messenger/no_mouth.png index e3626f448b..49dfbb99f9 100644 Binary files a/public/images/emoji/facebook_messenger/no_mouth.png and b/public/images/emoji/facebook_messenger/no_mouth.png differ diff --git a/public/images/emoji/facebook_messenger/no_pedestrians.png b/public/images/emoji/facebook_messenger/no_pedestrians.png index cf2e6202f0..10ecdaa50a 100644 Binary files a/public/images/emoji/facebook_messenger/no_pedestrians.png and b/public/images/emoji/facebook_messenger/no_pedestrians.png differ diff --git a/public/images/emoji/facebook_messenger/no_smoking.png b/public/images/emoji/facebook_messenger/no_smoking.png index 6d5f7caf45..57ee83e256 100644 Binary files a/public/images/emoji/facebook_messenger/no_smoking.png and b/public/images/emoji/facebook_messenger/no_smoking.png differ diff --git a/public/images/emoji/facebook_messenger/non-potable_water.png b/public/images/emoji/facebook_messenger/non-potable_water.png index 6c3d2c5d99..98a0c9187c 100644 Binary files a/public/images/emoji/facebook_messenger/non-potable_water.png and b/public/images/emoji/facebook_messenger/non-potable_water.png differ diff --git a/public/images/emoji/facebook_messenger/norfolk_island.png b/public/images/emoji/facebook_messenger/norfolk_island.png index 1a56f41ccb..75e46188a9 100644 Binary files a/public/images/emoji/facebook_messenger/norfolk_island.png and b/public/images/emoji/facebook_messenger/norfolk_island.png differ diff --git a/public/images/emoji/facebook_messenger/north_korea.png b/public/images/emoji/facebook_messenger/north_korea.png index 0a0621583c..0d76d4dd52 100644 Binary files a/public/images/emoji/facebook_messenger/north_korea.png and b/public/images/emoji/facebook_messenger/north_korea.png differ diff --git a/public/images/emoji/facebook_messenger/northern_mariana_islands.png b/public/images/emoji/facebook_messenger/northern_mariana_islands.png index 0adddf1ed5..8e60affdc6 100644 Binary files a/public/images/emoji/facebook_messenger/northern_mariana_islands.png and b/public/images/emoji/facebook_messenger/northern_mariana_islands.png differ diff --git a/public/images/emoji/facebook_messenger/norway.png b/public/images/emoji/facebook_messenger/norway.png index d2cd8f67f2..9d31676eba 100644 Binary files a/public/images/emoji/facebook_messenger/norway.png and b/public/images/emoji/facebook_messenger/norway.png differ diff --git a/public/images/emoji/facebook_messenger/nose.png b/public/images/emoji/facebook_messenger/nose.png index 9ab35d4ee4..03957cad6d 100644 Binary files a/public/images/emoji/facebook_messenger/nose.png and b/public/images/emoji/facebook_messenger/nose.png differ diff --git a/public/images/emoji/facebook_messenger/notebook.png b/public/images/emoji/facebook_messenger/notebook.png index f22f2f9318..ef21b08d64 100644 Binary files a/public/images/emoji/facebook_messenger/notebook.png and b/public/images/emoji/facebook_messenger/notebook.png differ diff --git a/public/images/emoji/facebook_messenger/notebook_with_decorative_cover.png b/public/images/emoji/facebook_messenger/notebook_with_decorative_cover.png index b6c301f963..5c17aad99d 100644 Binary files a/public/images/emoji/facebook_messenger/notebook_with_decorative_cover.png and b/public/images/emoji/facebook_messenger/notebook_with_decorative_cover.png differ diff --git a/public/images/emoji/facebook_messenger/notepad_spiral.png b/public/images/emoji/facebook_messenger/notepad_spiral.png index e441801b07..54a49dbc5d 100644 Binary files a/public/images/emoji/facebook_messenger/notepad_spiral.png and b/public/images/emoji/facebook_messenger/notepad_spiral.png differ diff --git a/public/images/emoji/facebook_messenger/notes.png b/public/images/emoji/facebook_messenger/notes.png index d2d297c574..9ea5ec0acf 100644 Binary files a/public/images/emoji/facebook_messenger/notes.png and b/public/images/emoji/facebook_messenger/notes.png differ diff --git a/public/images/emoji/facebook_messenger/nut_and_bolt.png b/public/images/emoji/facebook_messenger/nut_and_bolt.png index f33cc46acd..8ec30c0d5f 100644 Binary files a/public/images/emoji/facebook_messenger/nut_and_bolt.png and b/public/images/emoji/facebook_messenger/nut_and_bolt.png differ diff --git a/public/images/emoji/facebook_messenger/o.png b/public/images/emoji/facebook_messenger/o.png index bd9e2bce25..9b348cd874 100644 Binary files a/public/images/emoji/facebook_messenger/o.png and b/public/images/emoji/facebook_messenger/o.png differ diff --git a/public/images/emoji/facebook_messenger/o2.png b/public/images/emoji/facebook_messenger/o2.png index d56cd0c2aa..7b058cf43b 100644 Binary files a/public/images/emoji/facebook_messenger/o2.png and b/public/images/emoji/facebook_messenger/o2.png differ diff --git a/public/images/emoji/facebook_messenger/ocean.png b/public/images/emoji/facebook_messenger/ocean.png index 1d0e349a94..c30d2ef8e3 100644 Binary files a/public/images/emoji/facebook_messenger/ocean.png and b/public/images/emoji/facebook_messenger/ocean.png differ diff --git a/public/images/emoji/facebook_messenger/octopus.png b/public/images/emoji/facebook_messenger/octopus.png index 7b84177501..36c12115bb 100644 Binary files a/public/images/emoji/facebook_messenger/octopus.png and b/public/images/emoji/facebook_messenger/octopus.png differ diff --git a/public/images/emoji/facebook_messenger/oden.png b/public/images/emoji/facebook_messenger/oden.png index 621476b0b9..a1a8fbc875 100644 Binary files a/public/images/emoji/facebook_messenger/oden.png and b/public/images/emoji/facebook_messenger/oden.png differ diff --git a/public/images/emoji/facebook_messenger/office.png b/public/images/emoji/facebook_messenger/office.png index d5ed4d845a..6779236bec 100644 Binary files a/public/images/emoji/facebook_messenger/office.png and b/public/images/emoji/facebook_messenger/office.png differ diff --git a/public/images/emoji/facebook_messenger/oil.png b/public/images/emoji/facebook_messenger/oil.png index 9e49ad7667..26b2b6e4b9 100644 Binary files a/public/images/emoji/facebook_messenger/oil.png and b/public/images/emoji/facebook_messenger/oil.png differ diff --git a/public/images/emoji/facebook_messenger/oil_drum.png b/public/images/emoji/facebook_messenger/oil_drum.png index 9e49ad7667..26b2b6e4b9 100644 Binary files a/public/images/emoji/facebook_messenger/oil_drum.png and b/public/images/emoji/facebook_messenger/oil_drum.png differ diff --git a/public/images/emoji/facebook_messenger/ok.png b/public/images/emoji/facebook_messenger/ok.png index 32ee0173f0..c8769b5918 100644 Binary files a/public/images/emoji/facebook_messenger/ok.png and b/public/images/emoji/facebook_messenger/ok.png differ diff --git a/public/images/emoji/facebook_messenger/ok_hand.png b/public/images/emoji/facebook_messenger/ok_hand.png index b5ff9c0f8d..25bf45d9dc 100644 Binary files a/public/images/emoji/facebook_messenger/ok_hand.png and b/public/images/emoji/facebook_messenger/ok_hand.png differ diff --git a/public/images/emoji/facebook_messenger/ok_man.png b/public/images/emoji/facebook_messenger/ok_man.png index 526277ebe0..f7eb680108 100644 Binary files a/public/images/emoji/facebook_messenger/ok_man.png and b/public/images/emoji/facebook_messenger/ok_man.png differ diff --git a/public/images/emoji/facebook_messenger/ok_woman.png b/public/images/emoji/facebook_messenger/ok_woman.png index 00a58e844c..71bbe36dfa 100644 Binary files a/public/images/emoji/facebook_messenger/ok_woman.png and b/public/images/emoji/facebook_messenger/ok_woman.png differ diff --git a/public/images/emoji/facebook_messenger/old_key.png b/public/images/emoji/facebook_messenger/old_key.png index 4452b17fb5..ed2f7d5bfe 100644 Binary files a/public/images/emoji/facebook_messenger/old_key.png and b/public/images/emoji/facebook_messenger/old_key.png differ diff --git a/public/images/emoji/facebook_messenger/older_adult.png b/public/images/emoji/facebook_messenger/older_adult.png index 6bad639262..466c6403f1 100644 Binary files a/public/images/emoji/facebook_messenger/older_adult.png and b/public/images/emoji/facebook_messenger/older_adult.png differ diff --git a/public/images/emoji/facebook_messenger/older_man.png b/public/images/emoji/facebook_messenger/older_man.png index db5c5681d1..fcce085dce 100644 Binary files a/public/images/emoji/facebook_messenger/older_man.png and b/public/images/emoji/facebook_messenger/older_man.png differ diff --git a/public/images/emoji/facebook_messenger/older_woman.png b/public/images/emoji/facebook_messenger/older_woman.png index e03cb5c779..f5a900ab15 100644 Binary files a/public/images/emoji/facebook_messenger/older_woman.png and b/public/images/emoji/facebook_messenger/older_woman.png differ diff --git a/public/images/emoji/facebook_messenger/om.png b/public/images/emoji/facebook_messenger/om.png index 8b75e5ff06..39c5be3faf 100644 Binary files a/public/images/emoji/facebook_messenger/om.png and b/public/images/emoji/facebook_messenger/om.png differ diff --git a/public/images/emoji/facebook_messenger/om_symbol.png b/public/images/emoji/facebook_messenger/om_symbol.png index 8b75e5ff06..39c5be3faf 100644 Binary files a/public/images/emoji/facebook_messenger/om_symbol.png and b/public/images/emoji/facebook_messenger/om_symbol.png differ diff --git a/public/images/emoji/facebook_messenger/oman.png b/public/images/emoji/facebook_messenger/oman.png index 29ecf6f579..ce178186db 100644 Binary files a/public/images/emoji/facebook_messenger/oman.png and b/public/images/emoji/facebook_messenger/oman.png differ diff --git a/public/images/emoji/facebook_messenger/on.png b/public/images/emoji/facebook_messenger/on.png index 1cb4c2240c..96455308d5 100644 Binary files a/public/images/emoji/facebook_messenger/on.png and b/public/images/emoji/facebook_messenger/on.png differ diff --git a/public/images/emoji/facebook_messenger/oncoming_automobile.png b/public/images/emoji/facebook_messenger/oncoming_automobile.png index ba661ecefd..fc9d28be27 100644 Binary files a/public/images/emoji/facebook_messenger/oncoming_automobile.png and b/public/images/emoji/facebook_messenger/oncoming_automobile.png differ diff --git a/public/images/emoji/facebook_messenger/oncoming_bus.png b/public/images/emoji/facebook_messenger/oncoming_bus.png index 9f3ab610b3..ddf038f0c2 100644 Binary files a/public/images/emoji/facebook_messenger/oncoming_bus.png and b/public/images/emoji/facebook_messenger/oncoming_bus.png differ diff --git a/public/images/emoji/facebook_messenger/oncoming_police_car.png b/public/images/emoji/facebook_messenger/oncoming_police_car.png index c902b64726..08ed584730 100644 Binary files a/public/images/emoji/facebook_messenger/oncoming_police_car.png and b/public/images/emoji/facebook_messenger/oncoming_police_car.png differ diff --git a/public/images/emoji/facebook_messenger/oncoming_taxi.png b/public/images/emoji/facebook_messenger/oncoming_taxi.png index bfd23e66a6..16b4b5e805 100644 Binary files a/public/images/emoji/facebook_messenger/oncoming_taxi.png and b/public/images/emoji/facebook_messenger/oncoming_taxi.png differ diff --git a/public/images/emoji/facebook_messenger/one.png b/public/images/emoji/facebook_messenger/one.png index 76300042c2..04c91f865e 100644 Binary files a/public/images/emoji/facebook_messenger/one.png and b/public/images/emoji/facebook_messenger/one.png differ diff --git a/public/images/emoji/facebook_messenger/open_book.png b/public/images/emoji/facebook_messenger/open_book.png index 724a71aeb9..2302f835c4 100644 Binary files a/public/images/emoji/facebook_messenger/open_book.png and b/public/images/emoji/facebook_messenger/open_book.png differ diff --git a/public/images/emoji/facebook_messenger/open_file_folder.png b/public/images/emoji/facebook_messenger/open_file_folder.png index a8a486e9bb..f68ec1cc01 100644 Binary files a/public/images/emoji/facebook_messenger/open_file_folder.png and b/public/images/emoji/facebook_messenger/open_file_folder.png differ diff --git a/public/images/emoji/facebook_messenger/open_hands.png b/public/images/emoji/facebook_messenger/open_hands.png index 8c8ecb9b6b..aa42f1ade8 100644 Binary files a/public/images/emoji/facebook_messenger/open_hands.png and b/public/images/emoji/facebook_messenger/open_hands.png differ diff --git a/public/images/emoji/facebook_messenger/open_mouth.png b/public/images/emoji/facebook_messenger/open_mouth.png index faf523c087..4cb3568d41 100644 Binary files a/public/images/emoji/facebook_messenger/open_mouth.png and b/public/images/emoji/facebook_messenger/open_mouth.png differ diff --git a/public/images/emoji/facebook_messenger/open_umbrella.png b/public/images/emoji/facebook_messenger/open_umbrella.png index d84b97cb0c..0e5414f9a9 100644 Binary files a/public/images/emoji/facebook_messenger/open_umbrella.png and b/public/images/emoji/facebook_messenger/open_umbrella.png differ diff --git a/public/images/emoji/facebook_messenger/ophiuchus.png b/public/images/emoji/facebook_messenger/ophiuchus.png index d6b543d1e2..99107317be 100644 Binary files a/public/images/emoji/facebook_messenger/ophiuchus.png and b/public/images/emoji/facebook_messenger/ophiuchus.png differ diff --git a/public/images/emoji/facebook_messenger/orange_book.png b/public/images/emoji/facebook_messenger/orange_book.png index 7d665061df..9633cfa6bc 100644 Binary files a/public/images/emoji/facebook_messenger/orange_book.png and b/public/images/emoji/facebook_messenger/orange_book.png differ diff --git a/public/images/emoji/facebook_messenger/orange_heart.png b/public/images/emoji/facebook_messenger/orange_heart.png index 3d53e3eeae..222d511fc5 100644 Binary files a/public/images/emoji/facebook_messenger/orange_heart.png and b/public/images/emoji/facebook_messenger/orange_heart.png differ diff --git a/public/images/emoji/facebook_messenger/orthodox_cross.png b/public/images/emoji/facebook_messenger/orthodox_cross.png index f8f3aa79dc..d08264488f 100644 Binary files a/public/images/emoji/facebook_messenger/orthodox_cross.png and b/public/images/emoji/facebook_messenger/orthodox_cross.png differ diff --git a/public/images/emoji/facebook_messenger/outbox_tray.png b/public/images/emoji/facebook_messenger/outbox_tray.png index 50b5392576..d64e62861b 100644 Binary files a/public/images/emoji/facebook_messenger/outbox_tray.png and b/public/images/emoji/facebook_messenger/outbox_tray.png differ diff --git a/public/images/emoji/facebook_messenger/owl.png b/public/images/emoji/facebook_messenger/owl.png index 8d0fc40856..617a64e808 100644 Binary files a/public/images/emoji/facebook_messenger/owl.png and b/public/images/emoji/facebook_messenger/owl.png differ diff --git a/public/images/emoji/facebook_messenger/ox.png b/public/images/emoji/facebook_messenger/ox.png index 76087acb70..a00ea61f31 100644 Binary files a/public/images/emoji/facebook_messenger/ox.png and b/public/images/emoji/facebook_messenger/ox.png differ diff --git a/public/images/emoji/facebook_messenger/package.png b/public/images/emoji/facebook_messenger/package.png index ab5e2dc92c..47ff913ce5 100644 Binary files a/public/images/emoji/facebook_messenger/package.png and b/public/images/emoji/facebook_messenger/package.png differ diff --git a/public/images/emoji/facebook_messenger/page_facing_up.png b/public/images/emoji/facebook_messenger/page_facing_up.png index 77bd0e595f..58bf980d9a 100644 Binary files a/public/images/emoji/facebook_messenger/page_facing_up.png and b/public/images/emoji/facebook_messenger/page_facing_up.png differ diff --git a/public/images/emoji/facebook_messenger/page_with_curl.png b/public/images/emoji/facebook_messenger/page_with_curl.png index 24af18b404..adf25d8555 100644 Binary files a/public/images/emoji/facebook_messenger/page_with_curl.png and b/public/images/emoji/facebook_messenger/page_with_curl.png differ diff --git a/public/images/emoji/facebook_messenger/pager.png b/public/images/emoji/facebook_messenger/pager.png index b7b4372d70..c9aa621ce4 100644 Binary files a/public/images/emoji/facebook_messenger/pager.png and b/public/images/emoji/facebook_messenger/pager.png differ diff --git a/public/images/emoji/facebook_messenger/paintbrush.png b/public/images/emoji/facebook_messenger/paintbrush.png index 6044b9caff..9b698273ed 100644 Binary files a/public/images/emoji/facebook_messenger/paintbrush.png and b/public/images/emoji/facebook_messenger/paintbrush.png differ diff --git a/public/images/emoji/facebook_messenger/pakistan.png b/public/images/emoji/facebook_messenger/pakistan.png index 4f31345513..5cf099e1f0 100644 Binary files a/public/images/emoji/facebook_messenger/pakistan.png and b/public/images/emoji/facebook_messenger/pakistan.png differ diff --git a/public/images/emoji/facebook_messenger/palau.png b/public/images/emoji/facebook_messenger/palau.png index c92ad17134..3c5810b07d 100644 Binary files a/public/images/emoji/facebook_messenger/palau.png and b/public/images/emoji/facebook_messenger/palau.png differ diff --git a/public/images/emoji/facebook_messenger/palestinian_territories.png b/public/images/emoji/facebook_messenger/palestinian_territories.png index b1f0426ac4..e3ddbc7241 100644 Binary files a/public/images/emoji/facebook_messenger/palestinian_territories.png and b/public/images/emoji/facebook_messenger/palestinian_territories.png differ diff --git a/public/images/emoji/facebook_messenger/palm_tree.png b/public/images/emoji/facebook_messenger/palm_tree.png index d4df51746c..b099906c8f 100644 Binary files a/public/images/emoji/facebook_messenger/palm_tree.png and b/public/images/emoji/facebook_messenger/palm_tree.png differ diff --git a/public/images/emoji/facebook_messenger/palms_up_together.png b/public/images/emoji/facebook_messenger/palms_up_together.png index 376dbb58ad..19b61c37ef 100644 Binary files a/public/images/emoji/facebook_messenger/palms_up_together.png and b/public/images/emoji/facebook_messenger/palms_up_together.png differ diff --git a/public/images/emoji/facebook_messenger/panama.png b/public/images/emoji/facebook_messenger/panama.png index 63384f4460..cbcf7dfefd 100644 Binary files a/public/images/emoji/facebook_messenger/panama.png and b/public/images/emoji/facebook_messenger/panama.png differ diff --git a/public/images/emoji/facebook_messenger/pancakes.png b/public/images/emoji/facebook_messenger/pancakes.png index cc145982be..0db74d2b79 100644 Binary files a/public/images/emoji/facebook_messenger/pancakes.png and b/public/images/emoji/facebook_messenger/pancakes.png differ diff --git a/public/images/emoji/facebook_messenger/panda_face.png b/public/images/emoji/facebook_messenger/panda_face.png index 682db9fd23..18a0ca86e8 100644 Binary files a/public/images/emoji/facebook_messenger/panda_face.png and b/public/images/emoji/facebook_messenger/panda_face.png differ diff --git a/public/images/emoji/facebook_messenger/paperclip.png b/public/images/emoji/facebook_messenger/paperclip.png index 43ddbeabd8..461a539f56 100644 Binary files a/public/images/emoji/facebook_messenger/paperclip.png and b/public/images/emoji/facebook_messenger/paperclip.png differ diff --git a/public/images/emoji/facebook_messenger/paperclips.png b/public/images/emoji/facebook_messenger/paperclips.png index 998be6d8ba..d916fa07df 100644 Binary files a/public/images/emoji/facebook_messenger/paperclips.png and b/public/images/emoji/facebook_messenger/paperclips.png differ diff --git a/public/images/emoji/facebook_messenger/papua_new_guinea.png b/public/images/emoji/facebook_messenger/papua_new_guinea.png index eb43e17411..0e3b885a25 100644 Binary files a/public/images/emoji/facebook_messenger/papua_new_guinea.png and b/public/images/emoji/facebook_messenger/papua_new_guinea.png differ diff --git a/public/images/emoji/facebook_messenger/paraguay.png b/public/images/emoji/facebook_messenger/paraguay.png index 649c4a12e0..c959657edf 100644 Binary files a/public/images/emoji/facebook_messenger/paraguay.png and b/public/images/emoji/facebook_messenger/paraguay.png differ diff --git a/public/images/emoji/facebook_messenger/parasol_on_ground.png b/public/images/emoji/facebook_messenger/parasol_on_ground.png index 946097af1c..3239fb774e 100644 Binary files a/public/images/emoji/facebook_messenger/parasol_on_ground.png and b/public/images/emoji/facebook_messenger/parasol_on_ground.png differ diff --git a/public/images/emoji/facebook_messenger/park.png b/public/images/emoji/facebook_messenger/park.png index 38452f9b92..26ed901dea 100644 Binary files a/public/images/emoji/facebook_messenger/park.png and b/public/images/emoji/facebook_messenger/park.png differ diff --git a/public/images/emoji/facebook_messenger/parking.png b/public/images/emoji/facebook_messenger/parking.png index cc8b01b40b..2e7ec579b9 100644 Binary files a/public/images/emoji/facebook_messenger/parking.png and b/public/images/emoji/facebook_messenger/parking.png differ diff --git a/public/images/emoji/facebook_messenger/parrot.png b/public/images/emoji/facebook_messenger/parrot.png new file mode 100644 index 0000000000..e9e3a5e0d0 Binary files /dev/null and b/public/images/emoji/facebook_messenger/parrot.png differ diff --git a/public/images/emoji/facebook_messenger/part_alternation_mark.png b/public/images/emoji/facebook_messenger/part_alternation_mark.png index 5da9ee8653..e13a9135f6 100644 Binary files a/public/images/emoji/facebook_messenger/part_alternation_mark.png and b/public/images/emoji/facebook_messenger/part_alternation_mark.png differ diff --git a/public/images/emoji/facebook_messenger/partly_sunny.png b/public/images/emoji/facebook_messenger/partly_sunny.png index 8258b2f793..b4f3e1bdfa 100644 Binary files a/public/images/emoji/facebook_messenger/partly_sunny.png and b/public/images/emoji/facebook_messenger/partly_sunny.png differ diff --git a/public/images/emoji/facebook_messenger/partying_face.png b/public/images/emoji/facebook_messenger/partying_face.png new file mode 100644 index 0000000000..cf02521ccc Binary files /dev/null and b/public/images/emoji/facebook_messenger/partying_face.png differ diff --git a/public/images/emoji/facebook_messenger/passenger_ship.png b/public/images/emoji/facebook_messenger/passenger_ship.png index a79fe563a4..4324f0d867 100644 Binary files a/public/images/emoji/facebook_messenger/passenger_ship.png and b/public/images/emoji/facebook_messenger/passenger_ship.png differ diff --git a/public/images/emoji/facebook_messenger/passport_control.png b/public/images/emoji/facebook_messenger/passport_control.png index c1df6e0f18..7e200bb3c9 100644 Binary files a/public/images/emoji/facebook_messenger/passport_control.png and b/public/images/emoji/facebook_messenger/passport_control.png differ diff --git a/public/images/emoji/facebook_messenger/pause_button.png b/public/images/emoji/facebook_messenger/pause_button.png index de512cc09f..671f364939 100644 Binary files a/public/images/emoji/facebook_messenger/pause_button.png and b/public/images/emoji/facebook_messenger/pause_button.png differ diff --git a/public/images/emoji/facebook_messenger/paw_prints.png b/public/images/emoji/facebook_messenger/paw_prints.png index f102be9210..f803b4acba 100644 Binary files a/public/images/emoji/facebook_messenger/paw_prints.png and b/public/images/emoji/facebook_messenger/paw_prints.png differ diff --git a/public/images/emoji/facebook_messenger/peace.png b/public/images/emoji/facebook_messenger/peace.png index f900713ae3..cf28a4b410 100644 Binary files a/public/images/emoji/facebook_messenger/peace.png and b/public/images/emoji/facebook_messenger/peace.png differ diff --git a/public/images/emoji/facebook_messenger/peace_symbol.png b/public/images/emoji/facebook_messenger/peace_symbol.png index f900713ae3..cf28a4b410 100644 Binary files a/public/images/emoji/facebook_messenger/peace_symbol.png and b/public/images/emoji/facebook_messenger/peace_symbol.png differ diff --git a/public/images/emoji/facebook_messenger/peach.png b/public/images/emoji/facebook_messenger/peach.png index f3af1b0a0e..fc61ffe21f 100644 Binary files a/public/images/emoji/facebook_messenger/peach.png and b/public/images/emoji/facebook_messenger/peach.png differ diff --git a/public/images/emoji/facebook_messenger/peacock.png b/public/images/emoji/facebook_messenger/peacock.png new file mode 100644 index 0000000000..59602cdcf0 Binary files /dev/null and b/public/images/emoji/facebook_messenger/peacock.png differ diff --git a/public/images/emoji/facebook_messenger/peanuts.png b/public/images/emoji/facebook_messenger/peanuts.png index 55adb32d2b..e770b6e0f2 100644 Binary files a/public/images/emoji/facebook_messenger/peanuts.png and b/public/images/emoji/facebook_messenger/peanuts.png differ diff --git a/public/images/emoji/facebook_messenger/pear.png b/public/images/emoji/facebook_messenger/pear.png index 6ac15abff2..9a4be1f63f 100644 Binary files a/public/images/emoji/facebook_messenger/pear.png and b/public/images/emoji/facebook_messenger/pear.png differ diff --git a/public/images/emoji/facebook_messenger/pen.png b/public/images/emoji/facebook_messenger/pen.png index 399b2fbf22..fc87159a8c 100644 Binary files a/public/images/emoji/facebook_messenger/pen.png and b/public/images/emoji/facebook_messenger/pen.png differ diff --git a/public/images/emoji/facebook_messenger/pen_ballpoint.png b/public/images/emoji/facebook_messenger/pen_ballpoint.png index 399b2fbf22..fc87159a8c 100644 Binary files a/public/images/emoji/facebook_messenger/pen_ballpoint.png and b/public/images/emoji/facebook_messenger/pen_ballpoint.png differ diff --git a/public/images/emoji/facebook_messenger/pen_fountain.png b/public/images/emoji/facebook_messenger/pen_fountain.png index 2e7296057b..6693c145e4 100644 Binary files a/public/images/emoji/facebook_messenger/pen_fountain.png and b/public/images/emoji/facebook_messenger/pen_fountain.png differ diff --git a/public/images/emoji/facebook_messenger/pencil.png b/public/images/emoji/facebook_messenger/pencil.png index 57d00e040e..21f0fbc228 100644 Binary files a/public/images/emoji/facebook_messenger/pencil.png and b/public/images/emoji/facebook_messenger/pencil.png differ diff --git a/public/images/emoji/facebook_messenger/pencil2.png b/public/images/emoji/facebook_messenger/pencil2.png index 5b48c58c80..9de76ed225 100644 Binary files a/public/images/emoji/facebook_messenger/pencil2.png and b/public/images/emoji/facebook_messenger/pencil2.png differ diff --git a/public/images/emoji/facebook_messenger/penguin.png b/public/images/emoji/facebook_messenger/penguin.png index 2633a1f130..a5816dda28 100644 Binary files a/public/images/emoji/facebook_messenger/penguin.png and b/public/images/emoji/facebook_messenger/penguin.png differ diff --git a/public/images/emoji/facebook_messenger/pensive.png b/public/images/emoji/facebook_messenger/pensive.png index df42076659..01c7f348bf 100644 Binary files a/public/images/emoji/facebook_messenger/pensive.png and b/public/images/emoji/facebook_messenger/pensive.png differ diff --git a/public/images/emoji/facebook_messenger/performing_arts.png b/public/images/emoji/facebook_messenger/performing_arts.png index 80cca58608..97a68b9634 100644 Binary files a/public/images/emoji/facebook_messenger/performing_arts.png and b/public/images/emoji/facebook_messenger/performing_arts.png differ diff --git a/public/images/emoji/facebook_messenger/persevere.png b/public/images/emoji/facebook_messenger/persevere.png index 619272dafa..b85c7a57b6 100644 Binary files a/public/images/emoji/facebook_messenger/persevere.png and b/public/images/emoji/facebook_messenger/persevere.png differ diff --git a/public/images/emoji/facebook_messenger/person_climbing.png b/public/images/emoji/facebook_messenger/person_climbing.png index a0001a92f5..1368fd7f8d 100644 Binary files a/public/images/emoji/facebook_messenger/person_climbing.png and b/public/images/emoji/facebook_messenger/person_climbing.png differ diff --git a/public/images/emoji/facebook_messenger/person_fencing.png b/public/images/emoji/facebook_messenger/person_fencing.png index 5a2d7381a3..4171304f85 100644 Binary files a/public/images/emoji/facebook_messenger/person_fencing.png and b/public/images/emoji/facebook_messenger/person_fencing.png differ diff --git a/public/images/emoji/facebook_messenger/person_frowning.png b/public/images/emoji/facebook_messenger/person_frowning.png index 1b7de19871..7cef5b6e8c 100644 Binary files a/public/images/emoji/facebook_messenger/person_frowning.png and b/public/images/emoji/facebook_messenger/person_frowning.png differ diff --git a/public/images/emoji/facebook_messenger/person_in_lotus_position.png b/public/images/emoji/facebook_messenger/person_in_lotus_position.png index 3e265ed93e..3aaf747507 100644 Binary files a/public/images/emoji/facebook_messenger/person_in_lotus_position.png and b/public/images/emoji/facebook_messenger/person_in_lotus_position.png differ diff --git a/public/images/emoji/facebook_messenger/person_in_steamy_room.png b/public/images/emoji/facebook_messenger/person_in_steamy_room.png index 00fecc6ce1..bd9c68027f 100644 Binary files a/public/images/emoji/facebook_messenger/person_in_steamy_room.png and b/public/images/emoji/facebook_messenger/person_in_steamy_room.png differ diff --git a/public/images/emoji/facebook_messenger/person_with_ball.png b/public/images/emoji/facebook_messenger/person_with_ball.png index fc307b60c9..f1072d2938 100644 Binary files a/public/images/emoji/facebook_messenger/person_with_ball.png and b/public/images/emoji/facebook_messenger/person_with_ball.png differ diff --git a/public/images/emoji/facebook_messenger/person_with_blond_hair.png b/public/images/emoji/facebook_messenger/person_with_blond_hair.png index f19dc6ff1d..98f74f2634 100644 Binary files a/public/images/emoji/facebook_messenger/person_with_blond_hair.png and b/public/images/emoji/facebook_messenger/person_with_blond_hair.png differ diff --git a/public/images/emoji/facebook_messenger/person_with_pouting_face.png b/public/images/emoji/facebook_messenger/person_with_pouting_face.png index 0a66b08a91..571c018f75 100644 Binary files a/public/images/emoji/facebook_messenger/person_with_pouting_face.png and b/public/images/emoji/facebook_messenger/person_with_pouting_face.png differ diff --git a/public/images/emoji/facebook_messenger/peru.png b/public/images/emoji/facebook_messenger/peru.png index bc70d26c8b..bdd39852bc 100644 Binary files a/public/images/emoji/facebook_messenger/peru.png and b/public/images/emoji/facebook_messenger/peru.png differ diff --git a/public/images/emoji/facebook_messenger/petri_dish.png b/public/images/emoji/facebook_messenger/petri_dish.png new file mode 100644 index 0000000000..3a07b493c2 Binary files /dev/null and b/public/images/emoji/facebook_messenger/petri_dish.png differ diff --git a/public/images/emoji/facebook_messenger/philippines.png b/public/images/emoji/facebook_messenger/philippines.png index b353a66a20..2e3f2c1261 100644 Binary files a/public/images/emoji/facebook_messenger/philippines.png and b/public/images/emoji/facebook_messenger/philippines.png differ diff --git a/public/images/emoji/facebook_messenger/phone.png b/public/images/emoji/facebook_messenger/phone.png index 13b38ac3c6..9513793959 100644 Binary files a/public/images/emoji/facebook_messenger/phone.png and b/public/images/emoji/facebook_messenger/phone.png differ diff --git a/public/images/emoji/facebook_messenger/pick.png b/public/images/emoji/facebook_messenger/pick.png index 9609878285..ccd2c8342b 100644 Binary files a/public/images/emoji/facebook_messenger/pick.png and b/public/images/emoji/facebook_messenger/pick.png differ diff --git a/public/images/emoji/facebook_messenger/pie.png b/public/images/emoji/facebook_messenger/pie.png index 0e3e08b596..c714298829 100644 Binary files a/public/images/emoji/facebook_messenger/pie.png and b/public/images/emoji/facebook_messenger/pie.png differ diff --git a/public/images/emoji/facebook_messenger/pig.png b/public/images/emoji/facebook_messenger/pig.png index 8c5e07caf4..0995d62ff1 100644 Binary files a/public/images/emoji/facebook_messenger/pig.png and b/public/images/emoji/facebook_messenger/pig.png differ diff --git a/public/images/emoji/facebook_messenger/pig2.png b/public/images/emoji/facebook_messenger/pig2.png index 5dbdfafb56..4c3069aa1d 100644 Binary files a/public/images/emoji/facebook_messenger/pig2.png and b/public/images/emoji/facebook_messenger/pig2.png differ diff --git a/public/images/emoji/facebook_messenger/pig_nose.png b/public/images/emoji/facebook_messenger/pig_nose.png index 63162feb5a..93fc228549 100644 Binary files a/public/images/emoji/facebook_messenger/pig_nose.png and b/public/images/emoji/facebook_messenger/pig_nose.png differ diff --git a/public/images/emoji/facebook_messenger/pill.png b/public/images/emoji/facebook_messenger/pill.png index c1014ba812..60226b79ac 100644 Binary files a/public/images/emoji/facebook_messenger/pill.png and b/public/images/emoji/facebook_messenger/pill.png differ diff --git a/public/images/emoji/facebook_messenger/pineapple.png b/public/images/emoji/facebook_messenger/pineapple.png index 68c125bb0e..1304f2862b 100644 Binary files a/public/images/emoji/facebook_messenger/pineapple.png and b/public/images/emoji/facebook_messenger/pineapple.png differ diff --git a/public/images/emoji/facebook_messenger/ping_pong.png b/public/images/emoji/facebook_messenger/ping_pong.png index 4b18adbad4..25b2ecba56 100644 Binary files a/public/images/emoji/facebook_messenger/ping_pong.png and b/public/images/emoji/facebook_messenger/ping_pong.png differ diff --git a/public/images/emoji/facebook_messenger/pirate_flag.png b/public/images/emoji/facebook_messenger/pirate_flag.png new file mode 100644 index 0000000000..91f599b478 Binary files /dev/null and b/public/images/emoji/facebook_messenger/pirate_flag.png differ diff --git a/public/images/emoji/facebook_messenger/pisces.png b/public/images/emoji/facebook_messenger/pisces.png index 1ff18a40d1..6521f5c835 100644 Binary files a/public/images/emoji/facebook_messenger/pisces.png and b/public/images/emoji/facebook_messenger/pisces.png differ diff --git a/public/images/emoji/facebook_messenger/pitcairn_islands.png b/public/images/emoji/facebook_messenger/pitcairn_islands.png index 65730670ad..ede5513974 100644 Binary files a/public/images/emoji/facebook_messenger/pitcairn_islands.png and b/public/images/emoji/facebook_messenger/pitcairn_islands.png differ diff --git a/public/images/emoji/facebook_messenger/pizza.png b/public/images/emoji/facebook_messenger/pizza.png index 2fb11e2299..415ff0df32 100644 Binary files a/public/images/emoji/facebook_messenger/pizza.png and b/public/images/emoji/facebook_messenger/pizza.png differ diff --git a/public/images/emoji/facebook_messenger/place_of_worship.png b/public/images/emoji/facebook_messenger/place_of_worship.png index 0f9025c3c4..e28b3e94ce 100644 Binary files a/public/images/emoji/facebook_messenger/place_of_worship.png and b/public/images/emoji/facebook_messenger/place_of_worship.png differ diff --git a/public/images/emoji/facebook_messenger/plate_with_cutlery.png b/public/images/emoji/facebook_messenger/plate_with_cutlery.png index 84fd7bba6a..00925930e1 100644 Binary files a/public/images/emoji/facebook_messenger/plate_with_cutlery.png and b/public/images/emoji/facebook_messenger/plate_with_cutlery.png differ diff --git a/public/images/emoji/facebook_messenger/play_or_pause_button.png b/public/images/emoji/facebook_messenger/play_or_pause_button.png index 3bd3854902..fba57f1fec 100644 Binary files a/public/images/emoji/facebook_messenger/play_or_pause_button.png and b/public/images/emoji/facebook_messenger/play_or_pause_button.png differ diff --git a/public/images/emoji/facebook_messenger/play_pause.png b/public/images/emoji/facebook_messenger/play_pause.png index 3bd3854902..fba57f1fec 100644 Binary files a/public/images/emoji/facebook_messenger/play_pause.png and b/public/images/emoji/facebook_messenger/play_pause.png differ diff --git a/public/images/emoji/facebook_messenger/pleading_face.png b/public/images/emoji/facebook_messenger/pleading_face.png new file mode 100644 index 0000000000..e3c26b3dc1 Binary files /dev/null and b/public/images/emoji/facebook_messenger/pleading_face.png differ diff --git a/public/images/emoji/facebook_messenger/point_down.png b/public/images/emoji/facebook_messenger/point_down.png index 7fcb9445f8..f49c968f6f 100644 Binary files a/public/images/emoji/facebook_messenger/point_down.png and b/public/images/emoji/facebook_messenger/point_down.png differ diff --git a/public/images/emoji/facebook_messenger/point_left.png b/public/images/emoji/facebook_messenger/point_left.png index 96875e5194..5d403f3964 100644 Binary files a/public/images/emoji/facebook_messenger/point_left.png and b/public/images/emoji/facebook_messenger/point_left.png differ diff --git a/public/images/emoji/facebook_messenger/point_right.png b/public/images/emoji/facebook_messenger/point_right.png index 1a15c51878..919d5279a6 100644 Binary files a/public/images/emoji/facebook_messenger/point_right.png and b/public/images/emoji/facebook_messenger/point_right.png differ diff --git a/public/images/emoji/facebook_messenger/point_up.png b/public/images/emoji/facebook_messenger/point_up.png index 1a96d5a262..77b8da2f09 100644 Binary files a/public/images/emoji/facebook_messenger/point_up.png and b/public/images/emoji/facebook_messenger/point_up.png differ diff --git a/public/images/emoji/facebook_messenger/point_up_2.png b/public/images/emoji/facebook_messenger/point_up_2.png index 4461114a60..063d0f27ce 100644 Binary files a/public/images/emoji/facebook_messenger/point_up_2.png and b/public/images/emoji/facebook_messenger/point_up_2.png differ diff --git a/public/images/emoji/facebook_messenger/poland.png b/public/images/emoji/facebook_messenger/poland.png index 1f2087f592..f785291f9a 100644 Binary files a/public/images/emoji/facebook_messenger/poland.png and b/public/images/emoji/facebook_messenger/poland.png differ diff --git a/public/images/emoji/facebook_messenger/police_car.png b/public/images/emoji/facebook_messenger/police_car.png index 123fb4dd83..a64593d67d 100644 Binary files a/public/images/emoji/facebook_messenger/police_car.png and b/public/images/emoji/facebook_messenger/police_car.png differ diff --git a/public/images/emoji/facebook_messenger/policeman.png b/public/images/emoji/facebook_messenger/policeman.png index 089df5b596..7ef765226b 100644 Binary files a/public/images/emoji/facebook_messenger/policeman.png and b/public/images/emoji/facebook_messenger/policeman.png differ diff --git a/public/images/emoji/facebook_messenger/policewoman.png b/public/images/emoji/facebook_messenger/policewoman.png index baa67bd5ca..9d13d53a9c 100644 Binary files a/public/images/emoji/facebook_messenger/policewoman.png and b/public/images/emoji/facebook_messenger/policewoman.png differ diff --git a/public/images/emoji/facebook_messenger/poo.png b/public/images/emoji/facebook_messenger/poo.png index 7c3e519922..fa0dae8290 100644 Binary files a/public/images/emoji/facebook_messenger/poo.png and b/public/images/emoji/facebook_messenger/poo.png differ diff --git a/public/images/emoji/facebook_messenger/poodle.png b/public/images/emoji/facebook_messenger/poodle.png index 795f840073..1f21df2b55 100644 Binary files a/public/images/emoji/facebook_messenger/poodle.png and b/public/images/emoji/facebook_messenger/poodle.png differ diff --git a/public/images/emoji/facebook_messenger/poop.png b/public/images/emoji/facebook_messenger/poop.png index 7c3e519922..fa0dae8290 100644 Binary files a/public/images/emoji/facebook_messenger/poop.png and b/public/images/emoji/facebook_messenger/poop.png differ diff --git a/public/images/emoji/facebook_messenger/popcorn.png b/public/images/emoji/facebook_messenger/popcorn.png index 1ff9913d74..7f58365965 100644 Binary files a/public/images/emoji/facebook_messenger/popcorn.png and b/public/images/emoji/facebook_messenger/popcorn.png differ diff --git a/public/images/emoji/facebook_messenger/portugal.png b/public/images/emoji/facebook_messenger/portugal.png index a21775bee9..72e36e6045 100644 Binary files a/public/images/emoji/facebook_messenger/portugal.png and b/public/images/emoji/facebook_messenger/portugal.png differ diff --git a/public/images/emoji/facebook_messenger/post_office.png b/public/images/emoji/facebook_messenger/post_office.png index 3e78559866..7f62988fe6 100644 Binary files a/public/images/emoji/facebook_messenger/post_office.png and b/public/images/emoji/facebook_messenger/post_office.png differ diff --git a/public/images/emoji/facebook_messenger/postal_horn.png b/public/images/emoji/facebook_messenger/postal_horn.png index e5fe95fcd9..4094c63a1e 100644 Binary files a/public/images/emoji/facebook_messenger/postal_horn.png and b/public/images/emoji/facebook_messenger/postal_horn.png differ diff --git a/public/images/emoji/facebook_messenger/postbox.png b/public/images/emoji/facebook_messenger/postbox.png index e9fa114529..5d8366d81c 100644 Binary files a/public/images/emoji/facebook_messenger/postbox.png and b/public/images/emoji/facebook_messenger/postbox.png differ diff --git a/public/images/emoji/facebook_messenger/potable_water.png b/public/images/emoji/facebook_messenger/potable_water.png index de49c67324..be9436aee0 100644 Binary files a/public/images/emoji/facebook_messenger/potable_water.png and b/public/images/emoji/facebook_messenger/potable_water.png differ diff --git a/public/images/emoji/facebook_messenger/potato.png b/public/images/emoji/facebook_messenger/potato.png index fa933340d3..80459e0aa6 100644 Binary files a/public/images/emoji/facebook_messenger/potato.png and b/public/images/emoji/facebook_messenger/potato.png differ diff --git a/public/images/emoji/facebook_messenger/pouch.png b/public/images/emoji/facebook_messenger/pouch.png index 9f7276a17d..032f0ec777 100644 Binary files a/public/images/emoji/facebook_messenger/pouch.png and b/public/images/emoji/facebook_messenger/pouch.png differ diff --git a/public/images/emoji/facebook_messenger/poultry_leg.png b/public/images/emoji/facebook_messenger/poultry_leg.png index a04a253a01..4beecdad93 100644 Binary files a/public/images/emoji/facebook_messenger/poultry_leg.png and b/public/images/emoji/facebook_messenger/poultry_leg.png differ diff --git a/public/images/emoji/facebook_messenger/pound.png b/public/images/emoji/facebook_messenger/pound.png index 8e210f98c6..1068983888 100644 Binary files a/public/images/emoji/facebook_messenger/pound.png and b/public/images/emoji/facebook_messenger/pound.png differ diff --git a/public/images/emoji/facebook_messenger/pouting_cat.png b/public/images/emoji/facebook_messenger/pouting_cat.png index 51e21f5413..393c6dfb89 100644 Binary files a/public/images/emoji/facebook_messenger/pouting_cat.png and b/public/images/emoji/facebook_messenger/pouting_cat.png differ diff --git a/public/images/emoji/facebook_messenger/pouting_man.png b/public/images/emoji/facebook_messenger/pouting_man.png index 94f4177368..12f4239b5e 100644 Binary files a/public/images/emoji/facebook_messenger/pouting_man.png and b/public/images/emoji/facebook_messenger/pouting_man.png differ diff --git a/public/images/emoji/facebook_messenger/pouting_woman.png b/public/images/emoji/facebook_messenger/pouting_woman.png index 0a66b08a91..571c018f75 100644 Binary files a/public/images/emoji/facebook_messenger/pouting_woman.png and b/public/images/emoji/facebook_messenger/pouting_woman.png differ diff --git a/public/images/emoji/facebook_messenger/pray.png b/public/images/emoji/facebook_messenger/pray.png index 1a069bcab0..a6e71757fd 100644 Binary files a/public/images/emoji/facebook_messenger/pray.png and b/public/images/emoji/facebook_messenger/pray.png differ diff --git a/public/images/emoji/facebook_messenger/prayer_beads.png b/public/images/emoji/facebook_messenger/prayer_beads.png index 9fe4026f77..fded431fa2 100644 Binary files a/public/images/emoji/facebook_messenger/prayer_beads.png and b/public/images/emoji/facebook_messenger/prayer_beads.png differ diff --git a/public/images/emoji/facebook_messenger/pregnant_woman.png b/public/images/emoji/facebook_messenger/pregnant_woman.png index b63c159fd2..c21626db06 100644 Binary files a/public/images/emoji/facebook_messenger/pregnant_woman.png and b/public/images/emoji/facebook_messenger/pregnant_woman.png differ diff --git a/public/images/emoji/facebook_messenger/pretzel.png b/public/images/emoji/facebook_messenger/pretzel.png index d2704035f8..92b8f41856 100644 Binary files a/public/images/emoji/facebook_messenger/pretzel.png and b/public/images/emoji/facebook_messenger/pretzel.png differ diff --git a/public/images/emoji/facebook_messenger/previous_track.png b/public/images/emoji/facebook_messenger/previous_track.png index 5794a548e0..b3061dcb50 100644 Binary files a/public/images/emoji/facebook_messenger/previous_track.png and b/public/images/emoji/facebook_messenger/previous_track.png differ diff --git a/public/images/emoji/facebook_messenger/previous_track_button.png b/public/images/emoji/facebook_messenger/previous_track_button.png index 5794a548e0..b3061dcb50 100644 Binary files a/public/images/emoji/facebook_messenger/previous_track_button.png and b/public/images/emoji/facebook_messenger/previous_track_button.png differ diff --git a/public/images/emoji/facebook_messenger/prince.png b/public/images/emoji/facebook_messenger/prince.png index 6757b6dfec..5e859ddda0 100644 Binary files a/public/images/emoji/facebook_messenger/prince.png and b/public/images/emoji/facebook_messenger/prince.png differ diff --git a/public/images/emoji/facebook_messenger/princess.png b/public/images/emoji/facebook_messenger/princess.png index 6f6aad8f43..804d4fcfa4 100644 Binary files a/public/images/emoji/facebook_messenger/princess.png and b/public/images/emoji/facebook_messenger/princess.png differ diff --git a/public/images/emoji/facebook_messenger/printer.png b/public/images/emoji/facebook_messenger/printer.png index 51d12393ef..4604987f42 100644 Binary files a/public/images/emoji/facebook_messenger/printer.png and b/public/images/emoji/facebook_messenger/printer.png differ diff --git a/public/images/emoji/facebook_messenger/projector.png b/public/images/emoji/facebook_messenger/projector.png index 61cf7f7bac..20c9cbe76f 100644 Binary files a/public/images/emoji/facebook_messenger/projector.png and b/public/images/emoji/facebook_messenger/projector.png differ diff --git a/public/images/emoji/facebook_messenger/puerto_rico.png b/public/images/emoji/facebook_messenger/puerto_rico.png index 62984354a8..39b2319601 100644 Binary files a/public/images/emoji/facebook_messenger/puerto_rico.png and b/public/images/emoji/facebook_messenger/puerto_rico.png differ diff --git a/public/images/emoji/facebook_messenger/puke.png b/public/images/emoji/facebook_messenger/puke.png index 5d01c9ce3d..542ddeed95 100644 Binary files a/public/images/emoji/facebook_messenger/puke.png and b/public/images/emoji/facebook_messenger/puke.png differ diff --git a/public/images/emoji/facebook_messenger/punch.png b/public/images/emoji/facebook_messenger/punch.png index 9db84ed1fd..bdbbc7a087 100644 Binary files a/public/images/emoji/facebook_messenger/punch.png and b/public/images/emoji/facebook_messenger/punch.png differ diff --git a/public/images/emoji/facebook_messenger/purple_heart.png b/public/images/emoji/facebook_messenger/purple_heart.png index fbc2b035fd..12346cd346 100644 Binary files a/public/images/emoji/facebook_messenger/purple_heart.png and b/public/images/emoji/facebook_messenger/purple_heart.png differ diff --git a/public/images/emoji/facebook_messenger/purse.png b/public/images/emoji/facebook_messenger/purse.png index 75f4318ca0..07ad64fc36 100644 Binary files a/public/images/emoji/facebook_messenger/purse.png and b/public/images/emoji/facebook_messenger/purse.png differ diff --git a/public/images/emoji/facebook_messenger/pushpin.png b/public/images/emoji/facebook_messenger/pushpin.png index 783a05ec84..18b7f8e92d 100644 Binary files a/public/images/emoji/facebook_messenger/pushpin.png and b/public/images/emoji/facebook_messenger/pushpin.png differ diff --git a/public/images/emoji/facebook_messenger/put_litter_in_its_place.png b/public/images/emoji/facebook_messenger/put_litter_in_its_place.png index fcf7e4d8fc..28ff10b832 100644 Binary files a/public/images/emoji/facebook_messenger/put_litter_in_its_place.png and b/public/images/emoji/facebook_messenger/put_litter_in_its_place.png differ diff --git a/public/images/emoji/facebook_messenger/qatar.png b/public/images/emoji/facebook_messenger/qatar.png index 35e3a77782..3a2efce95d 100644 Binary files a/public/images/emoji/facebook_messenger/qatar.png and b/public/images/emoji/facebook_messenger/qatar.png differ diff --git a/public/images/emoji/facebook_messenger/question.png b/public/images/emoji/facebook_messenger/question.png index c1fb56fd01..397ace03b8 100644 Binary files a/public/images/emoji/facebook_messenger/question.png and b/public/images/emoji/facebook_messenger/question.png differ diff --git a/public/images/emoji/facebook_messenger/rabbit.png b/public/images/emoji/facebook_messenger/rabbit.png index 83b69e3e77..8e46adea09 100644 Binary files a/public/images/emoji/facebook_messenger/rabbit.png and b/public/images/emoji/facebook_messenger/rabbit.png differ diff --git a/public/images/emoji/facebook_messenger/rabbit2.png b/public/images/emoji/facebook_messenger/rabbit2.png index 1f448ab008..6ceb505076 100644 Binary files a/public/images/emoji/facebook_messenger/rabbit2.png and b/public/images/emoji/facebook_messenger/rabbit2.png differ diff --git a/public/images/emoji/facebook_messenger/raccoon.png b/public/images/emoji/facebook_messenger/raccoon.png new file mode 100644 index 0000000000..1d3916b94b Binary files /dev/null and b/public/images/emoji/facebook_messenger/raccoon.png differ diff --git a/public/images/emoji/facebook_messenger/race_car.png b/public/images/emoji/facebook_messenger/race_car.png index 7f4a20f3e5..0cde6b313a 100644 Binary files a/public/images/emoji/facebook_messenger/race_car.png and b/public/images/emoji/facebook_messenger/race_car.png differ diff --git a/public/images/emoji/facebook_messenger/racehorse.png b/public/images/emoji/facebook_messenger/racehorse.png index 81bfe0d256..f281b3cb99 100644 Binary files a/public/images/emoji/facebook_messenger/racehorse.png and b/public/images/emoji/facebook_messenger/racehorse.png differ diff --git a/public/images/emoji/facebook_messenger/racing_car.png b/public/images/emoji/facebook_messenger/racing_car.png index 7f4a20f3e5..0cde6b313a 100644 Binary files a/public/images/emoji/facebook_messenger/racing_car.png and b/public/images/emoji/facebook_messenger/racing_car.png differ diff --git a/public/images/emoji/facebook_messenger/racing_motorcycle.png b/public/images/emoji/facebook_messenger/racing_motorcycle.png index a23e481708..c52194be27 100644 Binary files a/public/images/emoji/facebook_messenger/racing_motorcycle.png and b/public/images/emoji/facebook_messenger/racing_motorcycle.png differ diff --git a/public/images/emoji/facebook_messenger/radio.png b/public/images/emoji/facebook_messenger/radio.png index f9be30dc8a..a8e124561f 100644 Binary files a/public/images/emoji/facebook_messenger/radio.png and b/public/images/emoji/facebook_messenger/radio.png differ diff --git a/public/images/emoji/facebook_messenger/radio_button.png b/public/images/emoji/facebook_messenger/radio_button.png index a0abadd2f3..4aae812865 100644 Binary files a/public/images/emoji/facebook_messenger/radio_button.png and b/public/images/emoji/facebook_messenger/radio_button.png differ diff --git a/public/images/emoji/facebook_messenger/radioactive.png b/public/images/emoji/facebook_messenger/radioactive.png index 9d347aea25..ab9f10f26e 100644 Binary files a/public/images/emoji/facebook_messenger/radioactive.png and b/public/images/emoji/facebook_messenger/radioactive.png differ diff --git a/public/images/emoji/facebook_messenger/radioactive_sign.png b/public/images/emoji/facebook_messenger/radioactive_sign.png index 9d347aea25..ab9f10f26e 100644 Binary files a/public/images/emoji/facebook_messenger/radioactive_sign.png and b/public/images/emoji/facebook_messenger/radioactive_sign.png differ diff --git a/public/images/emoji/facebook_messenger/rage.png b/public/images/emoji/facebook_messenger/rage.png index 668631f0b3..f109f8df6e 100644 Binary files a/public/images/emoji/facebook_messenger/rage.png and b/public/images/emoji/facebook_messenger/rage.png differ diff --git a/public/images/emoji/facebook_messenger/railroad_track.png b/public/images/emoji/facebook_messenger/railroad_track.png index b15ae4cb9b..e7772871d6 100644 Binary files a/public/images/emoji/facebook_messenger/railroad_track.png and b/public/images/emoji/facebook_messenger/railroad_track.png differ diff --git a/public/images/emoji/facebook_messenger/railway_car.png b/public/images/emoji/facebook_messenger/railway_car.png index e6e20a0b25..d4f7a97688 100644 Binary files a/public/images/emoji/facebook_messenger/railway_car.png and b/public/images/emoji/facebook_messenger/railway_car.png differ diff --git a/public/images/emoji/facebook_messenger/railway_track.png b/public/images/emoji/facebook_messenger/railway_track.png index b15ae4cb9b..e7772871d6 100644 Binary files a/public/images/emoji/facebook_messenger/railway_track.png and b/public/images/emoji/facebook_messenger/railway_track.png differ diff --git a/public/images/emoji/facebook_messenger/rainbow.png b/public/images/emoji/facebook_messenger/rainbow.png index 9f1a380b39..df3339ec12 100644 Binary files a/public/images/emoji/facebook_messenger/rainbow.png and b/public/images/emoji/facebook_messenger/rainbow.png differ diff --git a/public/images/emoji/facebook_messenger/rainbow_flag.png b/public/images/emoji/facebook_messenger/rainbow_flag.png index e0e4ae944c..e27f5d9030 100644 Binary files a/public/images/emoji/facebook_messenger/rainbow_flag.png and b/public/images/emoji/facebook_messenger/rainbow_flag.png differ diff --git a/public/images/emoji/facebook_messenger/raised_back_of_hand.png b/public/images/emoji/facebook_messenger/raised_back_of_hand.png index abb7de33c5..917236624f 100644 Binary files a/public/images/emoji/facebook_messenger/raised_back_of_hand.png and b/public/images/emoji/facebook_messenger/raised_back_of_hand.png differ diff --git a/public/images/emoji/facebook_messenger/raised_hand.png b/public/images/emoji/facebook_messenger/raised_hand.png index 17f858c2fa..62d1a5076a 100644 Binary files a/public/images/emoji/facebook_messenger/raised_hand.png and b/public/images/emoji/facebook_messenger/raised_hand.png differ diff --git a/public/images/emoji/facebook_messenger/raised_hand_with_fingers_splayed.png b/public/images/emoji/facebook_messenger/raised_hand_with_fingers_splayed.png index 600cb22c58..d732df9355 100644 Binary files a/public/images/emoji/facebook_messenger/raised_hand_with_fingers_splayed.png and b/public/images/emoji/facebook_messenger/raised_hand_with_fingers_splayed.png differ diff --git a/public/images/emoji/facebook_messenger/raised_hand_with_part_between_middle_and_ring_fingers.png b/public/images/emoji/facebook_messenger/raised_hand_with_part_between_middle_and_ring_fingers.png index af49237861..d217c8e52e 100644 Binary files a/public/images/emoji/facebook_messenger/raised_hand_with_part_between_middle_and_ring_fingers.png and b/public/images/emoji/facebook_messenger/raised_hand_with_part_between_middle_and_ring_fingers.png differ diff --git a/public/images/emoji/facebook_messenger/raised_hands.png b/public/images/emoji/facebook_messenger/raised_hands.png index 4bdb955cc5..d6dececad0 100644 Binary files a/public/images/emoji/facebook_messenger/raised_hands.png and b/public/images/emoji/facebook_messenger/raised_hands.png differ diff --git a/public/images/emoji/facebook_messenger/raising_hand.png b/public/images/emoji/facebook_messenger/raising_hand.png index 1e03e1bde1..4aa65c1466 100644 Binary files a/public/images/emoji/facebook_messenger/raising_hand.png and b/public/images/emoji/facebook_messenger/raising_hand.png differ diff --git a/public/images/emoji/facebook_messenger/raising_hand_man.png b/public/images/emoji/facebook_messenger/raising_hand_man.png index cf96d698db..e232d10e37 100644 Binary files a/public/images/emoji/facebook_messenger/raising_hand_man.png and b/public/images/emoji/facebook_messenger/raising_hand_man.png differ diff --git a/public/images/emoji/facebook_messenger/raising_hand_woman.png b/public/images/emoji/facebook_messenger/raising_hand_woman.png index 1e03e1bde1..4aa65c1466 100644 Binary files a/public/images/emoji/facebook_messenger/raising_hand_woman.png and b/public/images/emoji/facebook_messenger/raising_hand_woman.png differ diff --git a/public/images/emoji/facebook_messenger/ram.png b/public/images/emoji/facebook_messenger/ram.png index 112d5fe61a..92479e9006 100644 Binary files a/public/images/emoji/facebook_messenger/ram.png and b/public/images/emoji/facebook_messenger/ram.png differ diff --git a/public/images/emoji/facebook_messenger/ramen.png b/public/images/emoji/facebook_messenger/ramen.png index d9f74704a9..e9c4e3c5fc 100644 Binary files a/public/images/emoji/facebook_messenger/ramen.png and b/public/images/emoji/facebook_messenger/ramen.png differ diff --git a/public/images/emoji/facebook_messenger/rat.png b/public/images/emoji/facebook_messenger/rat.png index 6178f5c85b..5de096d572 100644 Binary files a/public/images/emoji/facebook_messenger/rat.png and b/public/images/emoji/facebook_messenger/rat.png differ diff --git a/public/images/emoji/facebook_messenger/receipt.png b/public/images/emoji/facebook_messenger/receipt.png new file mode 100644 index 0000000000..b5f1ba925f Binary files /dev/null and b/public/images/emoji/facebook_messenger/receipt.png differ diff --git a/public/images/emoji/facebook_messenger/record_button.png b/public/images/emoji/facebook_messenger/record_button.png index b876f26aea..5eefa9e2e3 100644 Binary files a/public/images/emoji/facebook_messenger/record_button.png and b/public/images/emoji/facebook_messenger/record_button.png differ diff --git a/public/images/emoji/facebook_messenger/recycle.png b/public/images/emoji/facebook_messenger/recycle.png index 79627cb74d..fb357f6c0e 100644 Binary files a/public/images/emoji/facebook_messenger/recycle.png and b/public/images/emoji/facebook_messenger/recycle.png differ diff --git a/public/images/emoji/facebook_messenger/red_car.png b/public/images/emoji/facebook_messenger/red_car.png index 8f5d52b249..9b731b0447 100644 Binary files a/public/images/emoji/facebook_messenger/red_car.png and b/public/images/emoji/facebook_messenger/red_car.png differ diff --git a/public/images/emoji/facebook_messenger/red_circle.png b/public/images/emoji/facebook_messenger/red_circle.png index 381aa5eae2..ff591c1725 100644 Binary files a/public/images/emoji/facebook_messenger/red_circle.png and b/public/images/emoji/facebook_messenger/red_circle.png differ diff --git a/public/images/emoji/facebook_messenger/red_gift_envelope.png b/public/images/emoji/facebook_messenger/red_gift_envelope.png new file mode 100644 index 0000000000..e88d858d58 Binary files /dev/null and b/public/images/emoji/facebook_messenger/red_gift_envelope.png differ diff --git a/public/images/emoji/facebook_messenger/registered.png b/public/images/emoji/facebook_messenger/registered.png index aaa5b08f6f..bda445e55d 100644 Binary files a/public/images/emoji/facebook_messenger/registered.png and b/public/images/emoji/facebook_messenger/registered.png differ diff --git a/public/images/emoji/facebook_messenger/relaxed.png b/public/images/emoji/facebook_messenger/relaxed.png index a22687bafc..7df31413ec 100644 Binary files a/public/images/emoji/facebook_messenger/relaxed.png and b/public/images/emoji/facebook_messenger/relaxed.png differ diff --git a/public/images/emoji/facebook_messenger/relieved.png b/public/images/emoji/facebook_messenger/relieved.png index 8e7ec32047..4ea1fdfd7c 100644 Binary files a/public/images/emoji/facebook_messenger/relieved.png and b/public/images/emoji/facebook_messenger/relieved.png differ diff --git a/public/images/emoji/facebook_messenger/reminder_ribbon.png b/public/images/emoji/facebook_messenger/reminder_ribbon.png index 0375adc7c0..d1c4dcf657 100644 Binary files a/public/images/emoji/facebook_messenger/reminder_ribbon.png and b/public/images/emoji/facebook_messenger/reminder_ribbon.png differ diff --git a/public/images/emoji/facebook_messenger/repeat.png b/public/images/emoji/facebook_messenger/repeat.png index 449fbd9852..4cccc6409c 100644 Binary files a/public/images/emoji/facebook_messenger/repeat.png and b/public/images/emoji/facebook_messenger/repeat.png differ diff --git a/public/images/emoji/facebook_messenger/repeat_one.png b/public/images/emoji/facebook_messenger/repeat_one.png index cd67c1061e..2a030f07e2 100644 Binary files a/public/images/emoji/facebook_messenger/repeat_one.png and b/public/images/emoji/facebook_messenger/repeat_one.png differ diff --git a/public/images/emoji/facebook_messenger/rescue_worker_helmet.png b/public/images/emoji/facebook_messenger/rescue_worker_helmet.png index 959efb0fb0..1158423213 100644 Binary files a/public/images/emoji/facebook_messenger/rescue_worker_helmet.png and b/public/images/emoji/facebook_messenger/rescue_worker_helmet.png differ diff --git a/public/images/emoji/facebook_messenger/restroom.png b/public/images/emoji/facebook_messenger/restroom.png index d6bbaeb20c..d6a218ffd6 100644 Binary files a/public/images/emoji/facebook_messenger/restroom.png and b/public/images/emoji/facebook_messenger/restroom.png differ diff --git a/public/images/emoji/facebook_messenger/reunion.png b/public/images/emoji/facebook_messenger/reunion.png index 6104c8cbe6..af94b088b1 100644 Binary files a/public/images/emoji/facebook_messenger/reunion.png and b/public/images/emoji/facebook_messenger/reunion.png differ diff --git a/public/images/emoji/facebook_messenger/reversed_hand_with_middle_finger_extended.png b/public/images/emoji/facebook_messenger/reversed_hand_with_middle_finger_extended.png index 7f227d2d23..bc7e5f100c 100644 Binary files a/public/images/emoji/facebook_messenger/reversed_hand_with_middle_finger_extended.png and b/public/images/emoji/facebook_messenger/reversed_hand_with_middle_finger_extended.png differ diff --git a/public/images/emoji/facebook_messenger/revolving_hearts.png b/public/images/emoji/facebook_messenger/revolving_hearts.png index f9ce212348..7c452d4d21 100644 Binary files a/public/images/emoji/facebook_messenger/revolving_hearts.png and b/public/images/emoji/facebook_messenger/revolving_hearts.png differ diff --git a/public/images/emoji/facebook_messenger/rewind.png b/public/images/emoji/facebook_messenger/rewind.png index 4dac953768..47c8eb7d5d 100644 Binary files a/public/images/emoji/facebook_messenger/rewind.png and b/public/images/emoji/facebook_messenger/rewind.png differ diff --git a/public/images/emoji/facebook_messenger/rhinoceros.png b/public/images/emoji/facebook_messenger/rhinoceros.png index 9e5f1a55f4..4ce37875c0 100644 Binary files a/public/images/emoji/facebook_messenger/rhinoceros.png and b/public/images/emoji/facebook_messenger/rhinoceros.png differ diff --git a/public/images/emoji/facebook_messenger/ribbon.png b/public/images/emoji/facebook_messenger/ribbon.png index 1a031384e0..61bff4ce38 100644 Binary files a/public/images/emoji/facebook_messenger/ribbon.png and b/public/images/emoji/facebook_messenger/ribbon.png differ diff --git a/public/images/emoji/facebook_messenger/rice.png b/public/images/emoji/facebook_messenger/rice.png index fcf702b567..bee4b642ab 100644 Binary files a/public/images/emoji/facebook_messenger/rice.png and b/public/images/emoji/facebook_messenger/rice.png differ diff --git a/public/images/emoji/facebook_messenger/rice_ball.png b/public/images/emoji/facebook_messenger/rice_ball.png index 660f25d854..edc381cfdd 100644 Binary files a/public/images/emoji/facebook_messenger/rice_ball.png and b/public/images/emoji/facebook_messenger/rice_ball.png differ diff --git a/public/images/emoji/facebook_messenger/rice_cracker.png b/public/images/emoji/facebook_messenger/rice_cracker.png index d366fe9c83..27f1c9aa9d 100644 Binary files a/public/images/emoji/facebook_messenger/rice_cracker.png and b/public/images/emoji/facebook_messenger/rice_cracker.png differ diff --git a/public/images/emoji/facebook_messenger/rice_scene.png b/public/images/emoji/facebook_messenger/rice_scene.png index e54a58e204..0e5389ff4f 100644 Binary files a/public/images/emoji/facebook_messenger/rice_scene.png and b/public/images/emoji/facebook_messenger/rice_scene.png differ diff --git a/public/images/emoji/facebook_messenger/right_anger_bubble.png b/public/images/emoji/facebook_messenger/right_anger_bubble.png index c9f3e48c81..020b6bd446 100644 Binary files a/public/images/emoji/facebook_messenger/right_anger_bubble.png and b/public/images/emoji/facebook_messenger/right_anger_bubble.png differ diff --git a/public/images/emoji/facebook_messenger/ring.png b/public/images/emoji/facebook_messenger/ring.png index 226998089e..3458cd817d 100644 Binary files a/public/images/emoji/facebook_messenger/ring.png and b/public/images/emoji/facebook_messenger/ring.png differ diff --git a/public/images/emoji/facebook_messenger/robot.png b/public/images/emoji/facebook_messenger/robot.png index 9d5170fb7f..adf0488570 100644 Binary files a/public/images/emoji/facebook_messenger/robot.png and b/public/images/emoji/facebook_messenger/robot.png differ diff --git a/public/images/emoji/facebook_messenger/robot_face.png b/public/images/emoji/facebook_messenger/robot_face.png index 9d5170fb7f..adf0488570 100644 Binary files a/public/images/emoji/facebook_messenger/robot_face.png and b/public/images/emoji/facebook_messenger/robot_face.png differ diff --git a/public/images/emoji/facebook_messenger/rocket.png b/public/images/emoji/facebook_messenger/rocket.png index 00b96d3c7d..287cadfbfd 100644 Binary files a/public/images/emoji/facebook_messenger/rocket.png and b/public/images/emoji/facebook_messenger/rocket.png differ diff --git a/public/images/emoji/facebook_messenger/rofl.png b/public/images/emoji/facebook_messenger/rofl.png index 7e75f50e65..faabfbea52 100644 Binary files a/public/images/emoji/facebook_messenger/rofl.png and b/public/images/emoji/facebook_messenger/rofl.png differ diff --git a/public/images/emoji/facebook_messenger/roll_eyes.png b/public/images/emoji/facebook_messenger/roll_eyes.png index 06b96d4c45..9d313256ad 100644 Binary files a/public/images/emoji/facebook_messenger/roll_eyes.png and b/public/images/emoji/facebook_messenger/roll_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/roll_of_toilet_paper.png b/public/images/emoji/facebook_messenger/roll_of_toilet_paper.png new file mode 100644 index 0000000000..00a5a9ecf6 Binary files /dev/null and b/public/images/emoji/facebook_messenger/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/facebook_messenger/rolled_up_newspaper.png b/public/images/emoji/facebook_messenger/rolled_up_newspaper.png index 785c9d1767..19b2d593d4 100644 Binary files a/public/images/emoji/facebook_messenger/rolled_up_newspaper.png and b/public/images/emoji/facebook_messenger/rolled_up_newspaper.png differ diff --git a/public/images/emoji/facebook_messenger/roller_coaster.png b/public/images/emoji/facebook_messenger/roller_coaster.png index 8523147fc4..91665f78e1 100644 Binary files a/public/images/emoji/facebook_messenger/roller_coaster.png and b/public/images/emoji/facebook_messenger/roller_coaster.png differ diff --git a/public/images/emoji/facebook_messenger/rolling_eyes.png b/public/images/emoji/facebook_messenger/rolling_eyes.png index 06b96d4c45..9d313256ad 100644 Binary files a/public/images/emoji/facebook_messenger/rolling_eyes.png and b/public/images/emoji/facebook_messenger/rolling_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/romania.png b/public/images/emoji/facebook_messenger/romania.png index 7b7ea9a3fe..05eb70ffba 100644 Binary files a/public/images/emoji/facebook_messenger/romania.png and b/public/images/emoji/facebook_messenger/romania.png differ diff --git a/public/images/emoji/facebook_messenger/rooster.png b/public/images/emoji/facebook_messenger/rooster.png index d07cd89243..fa3eb34831 100644 Binary files a/public/images/emoji/facebook_messenger/rooster.png and b/public/images/emoji/facebook_messenger/rooster.png differ diff --git a/public/images/emoji/facebook_messenger/rose.png b/public/images/emoji/facebook_messenger/rose.png index 11e4246a1c..4d410d4bc6 100644 Binary files a/public/images/emoji/facebook_messenger/rose.png and b/public/images/emoji/facebook_messenger/rose.png differ diff --git a/public/images/emoji/facebook_messenger/rosette.png b/public/images/emoji/facebook_messenger/rosette.png index 732127dac6..dfb834c0bf 100644 Binary files a/public/images/emoji/facebook_messenger/rosette.png and b/public/images/emoji/facebook_messenger/rosette.png differ diff --git a/public/images/emoji/facebook_messenger/rotating_light.png b/public/images/emoji/facebook_messenger/rotating_light.png index a11a19e8cc..7a48074168 100644 Binary files a/public/images/emoji/facebook_messenger/rotating_light.png and b/public/images/emoji/facebook_messenger/rotating_light.png differ diff --git a/public/images/emoji/facebook_messenger/round_pushpin.png b/public/images/emoji/facebook_messenger/round_pushpin.png index 28b4cb9e2a..574caa23da 100644 Binary files a/public/images/emoji/facebook_messenger/round_pushpin.png and b/public/images/emoji/facebook_messenger/round_pushpin.png differ diff --git a/public/images/emoji/facebook_messenger/rowboat.png b/public/images/emoji/facebook_messenger/rowboat.png index 1c1a5704b6..77230bd5fc 100644 Binary files a/public/images/emoji/facebook_messenger/rowboat.png and b/public/images/emoji/facebook_messenger/rowboat.png differ diff --git a/public/images/emoji/facebook_messenger/rowing_man.png b/public/images/emoji/facebook_messenger/rowing_man.png index 1c1a5704b6..77230bd5fc 100644 Binary files a/public/images/emoji/facebook_messenger/rowing_man.png and b/public/images/emoji/facebook_messenger/rowing_man.png differ diff --git a/public/images/emoji/facebook_messenger/rowing_woman.png b/public/images/emoji/facebook_messenger/rowing_woman.png index d81db32514..4b09a26f39 100644 Binary files a/public/images/emoji/facebook_messenger/rowing_woman.png and b/public/images/emoji/facebook_messenger/rowing_woman.png differ diff --git a/public/images/emoji/facebook_messenger/ru.png b/public/images/emoji/facebook_messenger/ru.png index 89692b70ef..7a42ac56d2 100644 Binary files a/public/images/emoji/facebook_messenger/ru.png and b/public/images/emoji/facebook_messenger/ru.png differ diff --git a/public/images/emoji/facebook_messenger/rugby_football.png b/public/images/emoji/facebook_messenger/rugby_football.png index 21cde2c867..f87bed2760 100644 Binary files a/public/images/emoji/facebook_messenger/rugby_football.png and b/public/images/emoji/facebook_messenger/rugby_football.png differ diff --git a/public/images/emoji/facebook_messenger/runner.png b/public/images/emoji/facebook_messenger/runner.png index 046d9b5ae6..e3e88578dc 100644 Binary files a/public/images/emoji/facebook_messenger/runner.png and b/public/images/emoji/facebook_messenger/runner.png differ diff --git a/public/images/emoji/facebook_messenger/running_man.png b/public/images/emoji/facebook_messenger/running_man.png index 046d9b5ae6..e3e88578dc 100644 Binary files a/public/images/emoji/facebook_messenger/running_man.png and b/public/images/emoji/facebook_messenger/running_man.png differ diff --git a/public/images/emoji/facebook_messenger/running_shirt_with_sash.png b/public/images/emoji/facebook_messenger/running_shirt_with_sash.png index a513c91a73..bf671f029f 100644 Binary files a/public/images/emoji/facebook_messenger/running_shirt_with_sash.png and b/public/images/emoji/facebook_messenger/running_shirt_with_sash.png differ diff --git a/public/images/emoji/facebook_messenger/running_woman.png b/public/images/emoji/facebook_messenger/running_woman.png index d2e300af47..f41ea49266 100644 Binary files a/public/images/emoji/facebook_messenger/running_woman.png and b/public/images/emoji/facebook_messenger/running_woman.png differ diff --git a/public/images/emoji/facebook_messenger/rwanda.png b/public/images/emoji/facebook_messenger/rwanda.png index fa02c79c7c..d7abaabbae 100644 Binary files a/public/images/emoji/facebook_messenger/rwanda.png and b/public/images/emoji/facebook_messenger/rwanda.png differ diff --git a/public/images/emoji/facebook_messenger/sa.png b/public/images/emoji/facebook_messenger/sa.png index 4d0d6162a3..9aaf8d2c00 100644 Binary files a/public/images/emoji/facebook_messenger/sa.png and b/public/images/emoji/facebook_messenger/sa.png differ diff --git a/public/images/emoji/facebook_messenger/safety_pin.png b/public/images/emoji/facebook_messenger/safety_pin.png new file mode 100644 index 0000000000..b15166e2ab Binary files /dev/null and b/public/images/emoji/facebook_messenger/safety_pin.png differ diff --git a/public/images/emoji/facebook_messenger/sagittarius.png b/public/images/emoji/facebook_messenger/sagittarius.png index d834fda81f..c7caa34938 100644 Binary files a/public/images/emoji/facebook_messenger/sagittarius.png and b/public/images/emoji/facebook_messenger/sagittarius.png differ diff --git a/public/images/emoji/facebook_messenger/sailboat.png b/public/images/emoji/facebook_messenger/sailboat.png index 7ec6f21e9b..b06d0a211c 100644 Binary files a/public/images/emoji/facebook_messenger/sailboat.png and b/public/images/emoji/facebook_messenger/sailboat.png differ diff --git a/public/images/emoji/facebook_messenger/sake.png b/public/images/emoji/facebook_messenger/sake.png index 1017b9015b..5f78b0a15b 100644 Binary files a/public/images/emoji/facebook_messenger/sake.png and b/public/images/emoji/facebook_messenger/sake.png differ diff --git a/public/images/emoji/facebook_messenger/salt.png b/public/images/emoji/facebook_messenger/salt.png new file mode 100644 index 0000000000..053367714a Binary files /dev/null and b/public/images/emoji/facebook_messenger/salt.png differ diff --git a/public/images/emoji/facebook_messenger/samoa.png b/public/images/emoji/facebook_messenger/samoa.png index 294802b0a1..340681065b 100644 Binary files a/public/images/emoji/facebook_messenger/samoa.png and b/public/images/emoji/facebook_messenger/samoa.png differ diff --git a/public/images/emoji/facebook_messenger/san_marino.png b/public/images/emoji/facebook_messenger/san_marino.png index b5d217c064..611e440d7a 100644 Binary files a/public/images/emoji/facebook_messenger/san_marino.png and b/public/images/emoji/facebook_messenger/san_marino.png differ diff --git a/public/images/emoji/facebook_messenger/sandal.png b/public/images/emoji/facebook_messenger/sandal.png index 2d30646490..d189e01725 100644 Binary files a/public/images/emoji/facebook_messenger/sandal.png and b/public/images/emoji/facebook_messenger/sandal.png differ diff --git a/public/images/emoji/facebook_messenger/sandwich.png b/public/images/emoji/facebook_messenger/sandwich.png index 7052154c7d..654b098c13 100644 Binary files a/public/images/emoji/facebook_messenger/sandwich.png and b/public/images/emoji/facebook_messenger/sandwich.png differ diff --git a/public/images/emoji/facebook_messenger/santa.png b/public/images/emoji/facebook_messenger/santa.png index 8948582258..b126281852 100644 Binary files a/public/images/emoji/facebook_messenger/santa.png and b/public/images/emoji/facebook_messenger/santa.png differ diff --git a/public/images/emoji/facebook_messenger/sao_tome_principe.png b/public/images/emoji/facebook_messenger/sao_tome_principe.png index 3bb369a886..46d8904644 100644 Binary files a/public/images/emoji/facebook_messenger/sao_tome_principe.png and b/public/images/emoji/facebook_messenger/sao_tome_principe.png differ diff --git a/public/images/emoji/facebook_messenger/satellite.png b/public/images/emoji/facebook_messenger/satellite.png index f44c779fdb..295f500849 100644 Binary files a/public/images/emoji/facebook_messenger/satellite.png and b/public/images/emoji/facebook_messenger/satellite.png differ diff --git a/public/images/emoji/facebook_messenger/satellite_orbital.png b/public/images/emoji/facebook_messenger/satellite_orbital.png index d50cf91954..925d5503c9 100644 Binary files a/public/images/emoji/facebook_messenger/satellite_orbital.png and b/public/images/emoji/facebook_messenger/satellite_orbital.png differ diff --git a/public/images/emoji/facebook_messenger/satisfied.png b/public/images/emoji/facebook_messenger/satisfied.png index 039f7f9d6d..9a91d6097b 100644 Binary files a/public/images/emoji/facebook_messenger/satisfied.png and b/public/images/emoji/facebook_messenger/satisfied.png differ diff --git a/public/images/emoji/facebook_messenger/saudi_arabia.png b/public/images/emoji/facebook_messenger/saudi_arabia.png index 338ee58ddf..61d74860c9 100644 Binary files a/public/images/emoji/facebook_messenger/saudi_arabia.png and b/public/images/emoji/facebook_messenger/saudi_arabia.png differ diff --git a/public/images/emoji/facebook_messenger/sauropod.png b/public/images/emoji/facebook_messenger/sauropod.png index 9643afaf9d..fc3d3b16f7 100644 Binary files a/public/images/emoji/facebook_messenger/sauropod.png and b/public/images/emoji/facebook_messenger/sauropod.png differ diff --git a/public/images/emoji/facebook_messenger/saxophone.png b/public/images/emoji/facebook_messenger/saxophone.png index 3b93d50275..6fae49044e 100644 Binary files a/public/images/emoji/facebook_messenger/saxophone.png and b/public/images/emoji/facebook_messenger/saxophone.png differ diff --git a/public/images/emoji/facebook_messenger/scales.png b/public/images/emoji/facebook_messenger/scales.png index a9e4f53e97..9ac52d3b5d 100644 Binary files a/public/images/emoji/facebook_messenger/scales.png and b/public/images/emoji/facebook_messenger/scales.png differ diff --git a/public/images/emoji/facebook_messenger/scarf.png b/public/images/emoji/facebook_messenger/scarf.png index 78c876e3c5..f21be4c418 100644 Binary files a/public/images/emoji/facebook_messenger/scarf.png and b/public/images/emoji/facebook_messenger/scarf.png differ diff --git a/public/images/emoji/facebook_messenger/school.png b/public/images/emoji/facebook_messenger/school.png index 0fd055c385..a12a6ac3fb 100644 Binary files a/public/images/emoji/facebook_messenger/school.png and b/public/images/emoji/facebook_messenger/school.png differ diff --git a/public/images/emoji/facebook_messenger/school_satchel.png b/public/images/emoji/facebook_messenger/school_satchel.png index b9b685cf62..da370d3aa4 100644 Binary files a/public/images/emoji/facebook_messenger/school_satchel.png and b/public/images/emoji/facebook_messenger/school_satchel.png differ diff --git a/public/images/emoji/facebook_messenger/scissors.png b/public/images/emoji/facebook_messenger/scissors.png index 2dbf8355e2..78aeac0911 100644 Binary files a/public/images/emoji/facebook_messenger/scissors.png and b/public/images/emoji/facebook_messenger/scissors.png differ diff --git a/public/images/emoji/facebook_messenger/scorpion.png b/public/images/emoji/facebook_messenger/scorpion.png index 1b3291654f..3adcade7da 100644 Binary files a/public/images/emoji/facebook_messenger/scorpion.png and b/public/images/emoji/facebook_messenger/scorpion.png differ diff --git a/public/images/emoji/facebook_messenger/scorpius.png b/public/images/emoji/facebook_messenger/scorpius.png index dbbb9d5fd9..8ae3dbc11e 100644 Binary files a/public/images/emoji/facebook_messenger/scorpius.png and b/public/images/emoji/facebook_messenger/scorpius.png differ diff --git a/public/images/emoji/facebook_messenger/scream.png b/public/images/emoji/facebook_messenger/scream.png index 37cb489464..49a11e6182 100644 Binary files a/public/images/emoji/facebook_messenger/scream.png and b/public/images/emoji/facebook_messenger/scream.png differ diff --git a/public/images/emoji/facebook_messenger/scream_cat.png b/public/images/emoji/facebook_messenger/scream_cat.png index 5d23cfbc1e..1dfadea55b 100644 Binary files a/public/images/emoji/facebook_messenger/scream_cat.png and b/public/images/emoji/facebook_messenger/scream_cat.png differ diff --git a/public/images/emoji/facebook_messenger/scroll.png b/public/images/emoji/facebook_messenger/scroll.png index f3aee23f12..3b867290ac 100644 Binary files a/public/images/emoji/facebook_messenger/scroll.png and b/public/images/emoji/facebook_messenger/scroll.png differ diff --git a/public/images/emoji/facebook_messenger/seat.png b/public/images/emoji/facebook_messenger/seat.png index 05ab633a3f..d7e98b4fe9 100644 Binary files a/public/images/emoji/facebook_messenger/seat.png and b/public/images/emoji/facebook_messenger/seat.png differ diff --git a/public/images/emoji/facebook_messenger/secret.png b/public/images/emoji/facebook_messenger/secret.png index 228ac6c33c..7e74edb24f 100644 Binary files a/public/images/emoji/facebook_messenger/secret.png and b/public/images/emoji/facebook_messenger/secret.png differ diff --git a/public/images/emoji/facebook_messenger/see_no_evil.png b/public/images/emoji/facebook_messenger/see_no_evil.png index 95dd3c76d7..5260b4791a 100644 Binary files a/public/images/emoji/facebook_messenger/see_no_evil.png and b/public/images/emoji/facebook_messenger/see_no_evil.png differ diff --git a/public/images/emoji/facebook_messenger/seedling.png b/public/images/emoji/facebook_messenger/seedling.png index 66f2bfabd7..393d72dd12 100644 Binary files a/public/images/emoji/facebook_messenger/seedling.png and b/public/images/emoji/facebook_messenger/seedling.png differ diff --git a/public/images/emoji/facebook_messenger/selfie.png b/public/images/emoji/facebook_messenger/selfie.png index 85482791df..947c23591f 100644 Binary files a/public/images/emoji/facebook_messenger/selfie.png and b/public/images/emoji/facebook_messenger/selfie.png differ diff --git a/public/images/emoji/facebook_messenger/senegal.png b/public/images/emoji/facebook_messenger/senegal.png index 6537571def..32368238be 100644 Binary files a/public/images/emoji/facebook_messenger/senegal.png and b/public/images/emoji/facebook_messenger/senegal.png differ diff --git a/public/images/emoji/facebook_messenger/serbia.png b/public/images/emoji/facebook_messenger/serbia.png index ffefd9cbbc..1c8ce419c2 100644 Binary files a/public/images/emoji/facebook_messenger/serbia.png and b/public/images/emoji/facebook_messenger/serbia.png differ diff --git a/public/images/emoji/facebook_messenger/seven.png b/public/images/emoji/facebook_messenger/seven.png index dabca5cf61..ec9e5c971a 100644 Binary files a/public/images/emoji/facebook_messenger/seven.png and b/public/images/emoji/facebook_messenger/seven.png differ diff --git a/public/images/emoji/facebook_messenger/seychelles.png b/public/images/emoji/facebook_messenger/seychelles.png index 41e622e1ac..32e54b9b47 100644 Binary files a/public/images/emoji/facebook_messenger/seychelles.png and b/public/images/emoji/facebook_messenger/seychelles.png differ diff --git a/public/images/emoji/facebook_messenger/shallow_pan_of_food.png b/public/images/emoji/facebook_messenger/shallow_pan_of_food.png index 6957af4a31..cb8ddcc1b7 100644 Binary files a/public/images/emoji/facebook_messenger/shallow_pan_of_food.png and b/public/images/emoji/facebook_messenger/shallow_pan_of_food.png differ diff --git a/public/images/emoji/facebook_messenger/shamrock.png b/public/images/emoji/facebook_messenger/shamrock.png index af8d5459bc..3478f5065d 100644 Binary files a/public/images/emoji/facebook_messenger/shamrock.png and b/public/images/emoji/facebook_messenger/shamrock.png differ diff --git a/public/images/emoji/facebook_messenger/shark.png b/public/images/emoji/facebook_messenger/shark.png index 1e85effc03..c707321e4a 100644 Binary files a/public/images/emoji/facebook_messenger/shark.png and b/public/images/emoji/facebook_messenger/shark.png differ diff --git a/public/images/emoji/facebook_messenger/shaved_ice.png b/public/images/emoji/facebook_messenger/shaved_ice.png index 8319007167..37d264272b 100644 Binary files a/public/images/emoji/facebook_messenger/shaved_ice.png and b/public/images/emoji/facebook_messenger/shaved_ice.png differ diff --git a/public/images/emoji/facebook_messenger/sheep.png b/public/images/emoji/facebook_messenger/sheep.png index af3e4fe23d..0c665906bc 100644 Binary files a/public/images/emoji/facebook_messenger/sheep.png and b/public/images/emoji/facebook_messenger/sheep.png differ diff --git a/public/images/emoji/facebook_messenger/shell.png b/public/images/emoji/facebook_messenger/shell.png index 6a3641d11d..d0934d61a0 100644 Binary files a/public/images/emoji/facebook_messenger/shell.png and b/public/images/emoji/facebook_messenger/shell.png differ diff --git a/public/images/emoji/facebook_messenger/shield.png b/public/images/emoji/facebook_messenger/shield.png index 18219f103f..072f44451e 100644 Binary files a/public/images/emoji/facebook_messenger/shield.png and b/public/images/emoji/facebook_messenger/shield.png differ diff --git a/public/images/emoji/facebook_messenger/shinto_shrine.png b/public/images/emoji/facebook_messenger/shinto_shrine.png index b08ebea155..7691a4cf5e 100644 Binary files a/public/images/emoji/facebook_messenger/shinto_shrine.png and b/public/images/emoji/facebook_messenger/shinto_shrine.png differ diff --git a/public/images/emoji/facebook_messenger/ship.png b/public/images/emoji/facebook_messenger/ship.png index c51ac926ff..08130bee90 100644 Binary files a/public/images/emoji/facebook_messenger/ship.png and b/public/images/emoji/facebook_messenger/ship.png differ diff --git a/public/images/emoji/facebook_messenger/shirt.png b/public/images/emoji/facebook_messenger/shirt.png index 27ba96bfa0..44d68b3a69 100644 Binary files a/public/images/emoji/facebook_messenger/shirt.png and b/public/images/emoji/facebook_messenger/shirt.png differ diff --git a/public/images/emoji/facebook_messenger/shit.png b/public/images/emoji/facebook_messenger/shit.png index 7c3e519922..fa0dae8290 100644 Binary files a/public/images/emoji/facebook_messenger/shit.png and b/public/images/emoji/facebook_messenger/shit.png differ diff --git a/public/images/emoji/facebook_messenger/shopping.png b/public/images/emoji/facebook_messenger/shopping.png index 872a4daba7..8d4861b644 100644 Binary files a/public/images/emoji/facebook_messenger/shopping.png and b/public/images/emoji/facebook_messenger/shopping.png differ diff --git a/public/images/emoji/facebook_messenger/shopping_bags.png b/public/images/emoji/facebook_messenger/shopping_bags.png index 872a4daba7..8d4861b644 100644 Binary files a/public/images/emoji/facebook_messenger/shopping_bags.png and b/public/images/emoji/facebook_messenger/shopping_bags.png differ diff --git a/public/images/emoji/facebook_messenger/shopping_cart.png b/public/images/emoji/facebook_messenger/shopping_cart.png index 6989a2a4cd..265310ce60 100644 Binary files a/public/images/emoji/facebook_messenger/shopping_cart.png and b/public/images/emoji/facebook_messenger/shopping_cart.png differ diff --git a/public/images/emoji/facebook_messenger/shower.png b/public/images/emoji/facebook_messenger/shower.png index 2e0a7b2d9e..678548de4e 100644 Binary files a/public/images/emoji/facebook_messenger/shower.png and b/public/images/emoji/facebook_messenger/shower.png differ diff --git a/public/images/emoji/facebook_messenger/shrimp.png b/public/images/emoji/facebook_messenger/shrimp.png index c04a810296..7e191b604e 100644 Binary files a/public/images/emoji/facebook_messenger/shrimp.png and b/public/images/emoji/facebook_messenger/shrimp.png differ diff --git a/public/images/emoji/facebook_messenger/shushing_face.png b/public/images/emoji/facebook_messenger/shushing_face.png index cd0c5b5401..b8145b4dfa 100644 Binary files a/public/images/emoji/facebook_messenger/shushing_face.png and b/public/images/emoji/facebook_messenger/shushing_face.png differ diff --git a/public/images/emoji/facebook_messenger/sierra_leone.png b/public/images/emoji/facebook_messenger/sierra_leone.png index f7235d0a41..59e2c2ad49 100644 Binary files a/public/images/emoji/facebook_messenger/sierra_leone.png and b/public/images/emoji/facebook_messenger/sierra_leone.png differ diff --git a/public/images/emoji/facebook_messenger/sign_of_the_horns.png b/public/images/emoji/facebook_messenger/sign_of_the_horns.png index 42ebf7a6e4..a7aaf0fa88 100644 Binary files a/public/images/emoji/facebook_messenger/sign_of_the_horns.png and b/public/images/emoji/facebook_messenger/sign_of_the_horns.png differ diff --git a/public/images/emoji/facebook_messenger/signal_strength.png b/public/images/emoji/facebook_messenger/signal_strength.png index 54045b69a3..3dab60df6f 100644 Binary files a/public/images/emoji/facebook_messenger/signal_strength.png and b/public/images/emoji/facebook_messenger/signal_strength.png differ diff --git a/public/images/emoji/facebook_messenger/singapore.png b/public/images/emoji/facebook_messenger/singapore.png index f8efcc863f..f8174e15a7 100644 Binary files a/public/images/emoji/facebook_messenger/singapore.png and b/public/images/emoji/facebook_messenger/singapore.png differ diff --git a/public/images/emoji/facebook_messenger/sint_maarten.png b/public/images/emoji/facebook_messenger/sint_maarten.png index 87863f9b56..f609a9eabe 100644 Binary files a/public/images/emoji/facebook_messenger/sint_maarten.png and b/public/images/emoji/facebook_messenger/sint_maarten.png differ diff --git a/public/images/emoji/facebook_messenger/six.png b/public/images/emoji/facebook_messenger/six.png index 304bf0eda8..6d3cfb7a8a 100644 Binary files a/public/images/emoji/facebook_messenger/six.png and b/public/images/emoji/facebook_messenger/six.png differ diff --git a/public/images/emoji/facebook_messenger/six_pointed_star.png b/public/images/emoji/facebook_messenger/six_pointed_star.png index 70238181af..84d1d99624 100644 Binary files a/public/images/emoji/facebook_messenger/six_pointed_star.png and b/public/images/emoji/facebook_messenger/six_pointed_star.png differ diff --git a/public/images/emoji/facebook_messenger/skateboard.png b/public/images/emoji/facebook_messenger/skateboard.png new file mode 100644 index 0000000000..142b14d8d7 Binary files /dev/null and b/public/images/emoji/facebook_messenger/skateboard.png differ diff --git a/public/images/emoji/facebook_messenger/skeleton.png b/public/images/emoji/facebook_messenger/skeleton.png index c60e9f8a9f..4b281828c1 100644 Binary files a/public/images/emoji/facebook_messenger/skeleton.png and b/public/images/emoji/facebook_messenger/skeleton.png differ diff --git a/public/images/emoji/facebook_messenger/ski.png b/public/images/emoji/facebook_messenger/ski.png index 7faded1449..1376aed646 100644 Binary files a/public/images/emoji/facebook_messenger/ski.png and b/public/images/emoji/facebook_messenger/ski.png differ diff --git a/public/images/emoji/facebook_messenger/skier.png b/public/images/emoji/facebook_messenger/skier.png index 34e63f01c7..4917edd0af 100644 Binary files a/public/images/emoji/facebook_messenger/skier.png and b/public/images/emoji/facebook_messenger/skier.png differ diff --git a/public/images/emoji/facebook_messenger/skull.png b/public/images/emoji/facebook_messenger/skull.png index c60e9f8a9f..4b281828c1 100644 Binary files a/public/images/emoji/facebook_messenger/skull.png and b/public/images/emoji/facebook_messenger/skull.png differ diff --git a/public/images/emoji/facebook_messenger/skull_and_crossbones.png b/public/images/emoji/facebook_messenger/skull_and_crossbones.png index 686fd5afa9..a3f39889be 100644 Binary files a/public/images/emoji/facebook_messenger/skull_and_crossbones.png and b/public/images/emoji/facebook_messenger/skull_and_crossbones.png differ diff --git a/public/images/emoji/facebook_messenger/skull_crossbones.png b/public/images/emoji/facebook_messenger/skull_crossbones.png index 686fd5afa9..a3f39889be 100644 Binary files a/public/images/emoji/facebook_messenger/skull_crossbones.png and b/public/images/emoji/facebook_messenger/skull_crossbones.png differ diff --git a/public/images/emoji/facebook_messenger/sled.png b/public/images/emoji/facebook_messenger/sled.png index 68b35f4919..1deec8050e 100644 Binary files a/public/images/emoji/facebook_messenger/sled.png and b/public/images/emoji/facebook_messenger/sled.png differ diff --git a/public/images/emoji/facebook_messenger/sleeping.png b/public/images/emoji/facebook_messenger/sleeping.png index cad0d4518e..11d693897b 100644 Binary files a/public/images/emoji/facebook_messenger/sleeping.png and b/public/images/emoji/facebook_messenger/sleeping.png differ diff --git a/public/images/emoji/facebook_messenger/sleeping_accommodation.png b/public/images/emoji/facebook_messenger/sleeping_accommodation.png index 9fd8cfc18a..e2eddcba14 100644 Binary files a/public/images/emoji/facebook_messenger/sleeping_accommodation.png and b/public/images/emoji/facebook_messenger/sleeping_accommodation.png differ diff --git a/public/images/emoji/facebook_messenger/sleeping_bed.png b/public/images/emoji/facebook_messenger/sleeping_bed.png index 9fd8cfc18a..e2eddcba14 100644 Binary files a/public/images/emoji/facebook_messenger/sleeping_bed.png and b/public/images/emoji/facebook_messenger/sleeping_bed.png differ diff --git a/public/images/emoji/facebook_messenger/sleepy.png b/public/images/emoji/facebook_messenger/sleepy.png index 8fc4a251bf..e803388f8f 100644 Binary files a/public/images/emoji/facebook_messenger/sleepy.png and b/public/images/emoji/facebook_messenger/sleepy.png differ diff --git a/public/images/emoji/facebook_messenger/sleuth_or_spy.png b/public/images/emoji/facebook_messenger/sleuth_or_spy.png index 6734c6bde0..0d6160dd2b 100644 Binary files a/public/images/emoji/facebook_messenger/sleuth_or_spy.png and b/public/images/emoji/facebook_messenger/sleuth_or_spy.png differ diff --git a/public/images/emoji/facebook_messenger/slight_frown.png b/public/images/emoji/facebook_messenger/slight_frown.png index 8f4af59ea1..a7741fec3c 100644 Binary files a/public/images/emoji/facebook_messenger/slight_frown.png and b/public/images/emoji/facebook_messenger/slight_frown.png differ diff --git a/public/images/emoji/facebook_messenger/slight_smile.png b/public/images/emoji/facebook_messenger/slight_smile.png index adb507495f..afac7722b0 100644 Binary files a/public/images/emoji/facebook_messenger/slight_smile.png and b/public/images/emoji/facebook_messenger/slight_smile.png differ diff --git a/public/images/emoji/facebook_messenger/slightly_frowning_face.png b/public/images/emoji/facebook_messenger/slightly_frowning_face.png index 8f4af59ea1..a7741fec3c 100644 Binary files a/public/images/emoji/facebook_messenger/slightly_frowning_face.png and b/public/images/emoji/facebook_messenger/slightly_frowning_face.png differ diff --git a/public/images/emoji/facebook_messenger/slightly_smiling.png b/public/images/emoji/facebook_messenger/slightly_smiling.png index adb507495f..afac7722b0 100644 Binary files a/public/images/emoji/facebook_messenger/slightly_smiling.png and b/public/images/emoji/facebook_messenger/slightly_smiling.png differ diff --git a/public/images/emoji/facebook_messenger/slightly_smiling_face.png b/public/images/emoji/facebook_messenger/slightly_smiling_face.png index adb507495f..afac7722b0 100644 Binary files a/public/images/emoji/facebook_messenger/slightly_smiling_face.png and b/public/images/emoji/facebook_messenger/slightly_smiling_face.png differ diff --git a/public/images/emoji/facebook_messenger/slot_machine.png b/public/images/emoji/facebook_messenger/slot_machine.png index 13646f57df..dd3ed093de 100644 Binary files a/public/images/emoji/facebook_messenger/slot_machine.png and b/public/images/emoji/facebook_messenger/slot_machine.png differ diff --git a/public/images/emoji/facebook_messenger/slovakia.png b/public/images/emoji/facebook_messenger/slovakia.png index 9b947a59fe..f9e36f1333 100644 Binary files a/public/images/emoji/facebook_messenger/slovakia.png and b/public/images/emoji/facebook_messenger/slovakia.png differ diff --git a/public/images/emoji/facebook_messenger/slovenia.png b/public/images/emoji/facebook_messenger/slovenia.png index 355664c785..cbcfe0cf9f 100644 Binary files a/public/images/emoji/facebook_messenger/slovenia.png and b/public/images/emoji/facebook_messenger/slovenia.png differ diff --git a/public/images/emoji/facebook_messenger/small_airplane.png b/public/images/emoji/facebook_messenger/small_airplane.png index 110df28455..3675789917 100644 Binary files a/public/images/emoji/facebook_messenger/small_airplane.png and b/public/images/emoji/facebook_messenger/small_airplane.png differ diff --git a/public/images/emoji/facebook_messenger/small_blue_diamond.png b/public/images/emoji/facebook_messenger/small_blue_diamond.png index e1808f68bc..cac2268229 100644 Binary files a/public/images/emoji/facebook_messenger/small_blue_diamond.png and b/public/images/emoji/facebook_messenger/small_blue_diamond.png differ diff --git a/public/images/emoji/facebook_messenger/small_orange_diamond.png b/public/images/emoji/facebook_messenger/small_orange_diamond.png index 5505c64f79..46bc7ce044 100644 Binary files a/public/images/emoji/facebook_messenger/small_orange_diamond.png and b/public/images/emoji/facebook_messenger/small_orange_diamond.png differ diff --git a/public/images/emoji/facebook_messenger/small_red_triangle.png b/public/images/emoji/facebook_messenger/small_red_triangle.png index 8062fa40d7..6cd270974b 100644 Binary files a/public/images/emoji/facebook_messenger/small_red_triangle.png and b/public/images/emoji/facebook_messenger/small_red_triangle.png differ diff --git a/public/images/emoji/facebook_messenger/small_red_triangle_down.png b/public/images/emoji/facebook_messenger/small_red_triangle_down.png index b1a444e202..881d76e3a9 100644 Binary files a/public/images/emoji/facebook_messenger/small_red_triangle_down.png and b/public/images/emoji/facebook_messenger/small_red_triangle_down.png differ diff --git a/public/images/emoji/facebook_messenger/smile.png b/public/images/emoji/facebook_messenger/smile.png index 4597ec0c8a..212f51277d 100644 Binary files a/public/images/emoji/facebook_messenger/smile.png and b/public/images/emoji/facebook_messenger/smile.png differ diff --git a/public/images/emoji/facebook_messenger/smile_cat.png b/public/images/emoji/facebook_messenger/smile_cat.png index 09b32fa39e..e288c08f7c 100644 Binary files a/public/images/emoji/facebook_messenger/smile_cat.png and b/public/images/emoji/facebook_messenger/smile_cat.png differ diff --git a/public/images/emoji/facebook_messenger/smiley.png b/public/images/emoji/facebook_messenger/smiley.png index 479bfc2ffa..92c16d1ad8 100644 Binary files a/public/images/emoji/facebook_messenger/smiley.png and b/public/images/emoji/facebook_messenger/smiley.png differ diff --git a/public/images/emoji/facebook_messenger/smiley_cat.png b/public/images/emoji/facebook_messenger/smiley_cat.png index 81a35eb914..2a32101af0 100644 Binary files a/public/images/emoji/facebook_messenger/smiley_cat.png and b/public/images/emoji/facebook_messenger/smiley_cat.png differ diff --git a/public/images/emoji/facebook_messenger/smiling_face_with_three_hearts.png b/public/images/emoji/facebook_messenger/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..679e033e95 Binary files /dev/null and b/public/images/emoji/facebook_messenger/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/facebook_messenger/smiling_imp.png b/public/images/emoji/facebook_messenger/smiling_imp.png index e06a7ca2c9..3ebb81abf3 100644 Binary files a/public/images/emoji/facebook_messenger/smiling_imp.png and b/public/images/emoji/facebook_messenger/smiling_imp.png differ diff --git a/public/images/emoji/facebook_messenger/smirk.png b/public/images/emoji/facebook_messenger/smirk.png index 44728afa88..34ac381c0f 100644 Binary files a/public/images/emoji/facebook_messenger/smirk.png and b/public/images/emoji/facebook_messenger/smirk.png differ diff --git a/public/images/emoji/facebook_messenger/smirk_cat.png b/public/images/emoji/facebook_messenger/smirk_cat.png index b01633d8f1..5ff5789f3d 100644 Binary files a/public/images/emoji/facebook_messenger/smirk_cat.png and b/public/images/emoji/facebook_messenger/smirk_cat.png differ diff --git a/public/images/emoji/facebook_messenger/smoking.png b/public/images/emoji/facebook_messenger/smoking.png index cc203be650..94599ebc55 100644 Binary files a/public/images/emoji/facebook_messenger/smoking.png and b/public/images/emoji/facebook_messenger/smoking.png differ diff --git a/public/images/emoji/facebook_messenger/snail.png b/public/images/emoji/facebook_messenger/snail.png index 845a66020a..5563e30256 100644 Binary files a/public/images/emoji/facebook_messenger/snail.png and b/public/images/emoji/facebook_messenger/snail.png differ diff --git a/public/images/emoji/facebook_messenger/snake.png b/public/images/emoji/facebook_messenger/snake.png index 81dfa138a0..7a893d3b52 100644 Binary files a/public/images/emoji/facebook_messenger/snake.png and b/public/images/emoji/facebook_messenger/snake.png differ diff --git a/public/images/emoji/facebook_messenger/sneezing_face.png b/public/images/emoji/facebook_messenger/sneezing_face.png index 2b885dea7a..090c87ab69 100644 Binary files a/public/images/emoji/facebook_messenger/sneezing_face.png and b/public/images/emoji/facebook_messenger/sneezing_face.png differ diff --git a/public/images/emoji/facebook_messenger/snow_capped_mountain.png b/public/images/emoji/facebook_messenger/snow_capped_mountain.png index 5529c620de..118d62d5a6 100644 Binary files a/public/images/emoji/facebook_messenger/snow_capped_mountain.png and b/public/images/emoji/facebook_messenger/snow_capped_mountain.png differ diff --git a/public/images/emoji/facebook_messenger/snowboarder.png b/public/images/emoji/facebook_messenger/snowboarder.png index f9e77e2139..71bf2075b0 100644 Binary files a/public/images/emoji/facebook_messenger/snowboarder.png and b/public/images/emoji/facebook_messenger/snowboarder.png differ diff --git a/public/images/emoji/facebook_messenger/snowflake.png b/public/images/emoji/facebook_messenger/snowflake.png index 23f9a19a0f..2eb1f4dbd4 100644 Binary files a/public/images/emoji/facebook_messenger/snowflake.png and b/public/images/emoji/facebook_messenger/snowflake.png differ diff --git a/public/images/emoji/facebook_messenger/snowman.png b/public/images/emoji/facebook_messenger/snowman.png index e93ebca64f..9bda94c094 100644 Binary files a/public/images/emoji/facebook_messenger/snowman.png and b/public/images/emoji/facebook_messenger/snowman.png differ diff --git a/public/images/emoji/facebook_messenger/snowman2.png b/public/images/emoji/facebook_messenger/snowman2.png index d616df2b4b..f8b4d539ba 100644 Binary files a/public/images/emoji/facebook_messenger/snowman2.png and b/public/images/emoji/facebook_messenger/snowman2.png differ diff --git a/public/images/emoji/facebook_messenger/snowman_with_snow.png b/public/images/emoji/facebook_messenger/snowman_with_snow.png index d616df2b4b..f8b4d539ba 100644 Binary files a/public/images/emoji/facebook_messenger/snowman_with_snow.png and b/public/images/emoji/facebook_messenger/snowman_with_snow.png differ diff --git a/public/images/emoji/facebook_messenger/soap.png b/public/images/emoji/facebook_messenger/soap.png new file mode 100644 index 0000000000..3432ebceb1 Binary files /dev/null and b/public/images/emoji/facebook_messenger/soap.png differ diff --git a/public/images/emoji/facebook_messenger/sob.png b/public/images/emoji/facebook_messenger/sob.png index fbc4a2e292..c4ad5e9493 100644 Binary files a/public/images/emoji/facebook_messenger/sob.png and b/public/images/emoji/facebook_messenger/sob.png differ diff --git a/public/images/emoji/facebook_messenger/soccer.png b/public/images/emoji/facebook_messenger/soccer.png index 628f907dfb..e27beb863b 100644 Binary files a/public/images/emoji/facebook_messenger/soccer.png and b/public/images/emoji/facebook_messenger/soccer.png differ diff --git a/public/images/emoji/facebook_messenger/socks.png b/public/images/emoji/facebook_messenger/socks.png index 98b6a36339..cc9422f3b1 100644 Binary files a/public/images/emoji/facebook_messenger/socks.png and b/public/images/emoji/facebook_messenger/socks.png differ diff --git a/public/images/emoji/facebook_messenger/softball.png b/public/images/emoji/facebook_messenger/softball.png new file mode 100644 index 0000000000..b78c695486 Binary files /dev/null and b/public/images/emoji/facebook_messenger/softball.png differ diff --git a/public/images/emoji/facebook_messenger/solomon_islands.png b/public/images/emoji/facebook_messenger/solomon_islands.png index dfb732444b..6040f51326 100644 Binary files a/public/images/emoji/facebook_messenger/solomon_islands.png and b/public/images/emoji/facebook_messenger/solomon_islands.png differ diff --git a/public/images/emoji/facebook_messenger/somalia.png b/public/images/emoji/facebook_messenger/somalia.png index c55dd20203..dab664a5fc 100644 Binary files a/public/images/emoji/facebook_messenger/somalia.png and b/public/images/emoji/facebook_messenger/somalia.png differ diff --git a/public/images/emoji/facebook_messenger/soon.png b/public/images/emoji/facebook_messenger/soon.png index 49397d0ddd..733c46c204 100644 Binary files a/public/images/emoji/facebook_messenger/soon.png and b/public/images/emoji/facebook_messenger/soon.png differ diff --git a/public/images/emoji/facebook_messenger/sos.png b/public/images/emoji/facebook_messenger/sos.png index 9335e8bd34..24c7ac3a16 100644 Binary files a/public/images/emoji/facebook_messenger/sos.png and b/public/images/emoji/facebook_messenger/sos.png differ diff --git a/public/images/emoji/facebook_messenger/sound.png b/public/images/emoji/facebook_messenger/sound.png index 6cfe4a1333..b306d867c1 100644 Binary files a/public/images/emoji/facebook_messenger/sound.png and b/public/images/emoji/facebook_messenger/sound.png differ diff --git a/public/images/emoji/facebook_messenger/south_africa.png b/public/images/emoji/facebook_messenger/south_africa.png index db47d38be5..e654bd1ed9 100644 Binary files a/public/images/emoji/facebook_messenger/south_africa.png and b/public/images/emoji/facebook_messenger/south_africa.png differ diff --git a/public/images/emoji/facebook_messenger/south_georgia_south_sandwich_islands.png b/public/images/emoji/facebook_messenger/south_georgia_south_sandwich_islands.png index 8e6393d3d1..7d3f1b9c2d 100644 Binary files a/public/images/emoji/facebook_messenger/south_georgia_south_sandwich_islands.png and b/public/images/emoji/facebook_messenger/south_georgia_south_sandwich_islands.png differ diff --git a/public/images/emoji/facebook_messenger/south_sudan.png b/public/images/emoji/facebook_messenger/south_sudan.png index d2bf101734..8b0bbc6ea9 100644 Binary files a/public/images/emoji/facebook_messenger/south_sudan.png and b/public/images/emoji/facebook_messenger/south_sudan.png differ diff --git a/public/images/emoji/facebook_messenger/space_invader.png b/public/images/emoji/facebook_messenger/space_invader.png index 862aa6326d..eb0c0c40c0 100644 Binary files a/public/images/emoji/facebook_messenger/space_invader.png and b/public/images/emoji/facebook_messenger/space_invader.png differ diff --git a/public/images/emoji/facebook_messenger/spades.png b/public/images/emoji/facebook_messenger/spades.png index c7ba3971e8..a05c1badcf 100644 Binary files a/public/images/emoji/facebook_messenger/spades.png and b/public/images/emoji/facebook_messenger/spades.png differ diff --git a/public/images/emoji/facebook_messenger/spaghetti.png b/public/images/emoji/facebook_messenger/spaghetti.png index 595cb7cdb9..c0bf6b32b9 100644 Binary files a/public/images/emoji/facebook_messenger/spaghetti.png and b/public/images/emoji/facebook_messenger/spaghetti.png differ diff --git a/public/images/emoji/facebook_messenger/sparkle.png b/public/images/emoji/facebook_messenger/sparkle.png index 357e7e5e00..7e5ad035e3 100644 Binary files a/public/images/emoji/facebook_messenger/sparkle.png and b/public/images/emoji/facebook_messenger/sparkle.png differ diff --git a/public/images/emoji/facebook_messenger/sparkler.png b/public/images/emoji/facebook_messenger/sparkler.png index 78696de313..4b52f11dd3 100644 Binary files a/public/images/emoji/facebook_messenger/sparkler.png and b/public/images/emoji/facebook_messenger/sparkler.png differ diff --git a/public/images/emoji/facebook_messenger/sparkles.png b/public/images/emoji/facebook_messenger/sparkles.png index 028864b8cc..72fba7a283 100644 Binary files a/public/images/emoji/facebook_messenger/sparkles.png and b/public/images/emoji/facebook_messenger/sparkles.png differ diff --git a/public/images/emoji/facebook_messenger/sparkling_heart.png b/public/images/emoji/facebook_messenger/sparkling_heart.png index 33f0d7d4ac..add537de81 100644 Binary files a/public/images/emoji/facebook_messenger/sparkling_heart.png and b/public/images/emoji/facebook_messenger/sparkling_heart.png differ diff --git a/public/images/emoji/facebook_messenger/speak_no_evil.png b/public/images/emoji/facebook_messenger/speak_no_evil.png index c65adb7ad2..1e7f1a8dac 100644 Binary files a/public/images/emoji/facebook_messenger/speak_no_evil.png and b/public/images/emoji/facebook_messenger/speak_no_evil.png differ diff --git a/public/images/emoji/facebook_messenger/speaker.png b/public/images/emoji/facebook_messenger/speaker.png index b84def26e7..f91ef5dcb5 100644 Binary files a/public/images/emoji/facebook_messenger/speaker.png and b/public/images/emoji/facebook_messenger/speaker.png differ diff --git a/public/images/emoji/facebook_messenger/speaking_head.png b/public/images/emoji/facebook_messenger/speaking_head.png index 64d53b0d1c..f92d1d1dc1 100644 Binary files a/public/images/emoji/facebook_messenger/speaking_head.png and b/public/images/emoji/facebook_messenger/speaking_head.png differ diff --git a/public/images/emoji/facebook_messenger/speaking_head_in_silhouette.png b/public/images/emoji/facebook_messenger/speaking_head_in_silhouette.png index 64d53b0d1c..f92d1d1dc1 100644 Binary files a/public/images/emoji/facebook_messenger/speaking_head_in_silhouette.png and b/public/images/emoji/facebook_messenger/speaking_head_in_silhouette.png differ diff --git a/public/images/emoji/facebook_messenger/speech_balloon.png b/public/images/emoji/facebook_messenger/speech_balloon.png index 586a5bb263..ddb440cd6a 100644 Binary files a/public/images/emoji/facebook_messenger/speech_balloon.png and b/public/images/emoji/facebook_messenger/speech_balloon.png differ diff --git a/public/images/emoji/facebook_messenger/speedboat.png b/public/images/emoji/facebook_messenger/speedboat.png index f126b63d94..e8c01377a0 100644 Binary files a/public/images/emoji/facebook_messenger/speedboat.png and b/public/images/emoji/facebook_messenger/speedboat.png differ diff --git a/public/images/emoji/facebook_messenger/spider.png b/public/images/emoji/facebook_messenger/spider.png index 6eeffa4d4b..3e7f894ec2 100644 Binary files a/public/images/emoji/facebook_messenger/spider.png and b/public/images/emoji/facebook_messenger/spider.png differ diff --git a/public/images/emoji/facebook_messenger/spider_web.png b/public/images/emoji/facebook_messenger/spider_web.png index fdcf6eb8cc..c858c9fbf9 100644 Binary files a/public/images/emoji/facebook_messenger/spider_web.png and b/public/images/emoji/facebook_messenger/spider_web.png differ diff --git a/public/images/emoji/facebook_messenger/spiral_calendar.png b/public/images/emoji/facebook_messenger/spiral_calendar.png index ee07d24cb1..9c93fa0996 100644 Binary files a/public/images/emoji/facebook_messenger/spiral_calendar.png and b/public/images/emoji/facebook_messenger/spiral_calendar.png differ diff --git a/public/images/emoji/facebook_messenger/spiral_calendar_pad.png b/public/images/emoji/facebook_messenger/spiral_calendar_pad.png index ee07d24cb1..9c93fa0996 100644 Binary files a/public/images/emoji/facebook_messenger/spiral_calendar_pad.png and b/public/images/emoji/facebook_messenger/spiral_calendar_pad.png differ diff --git a/public/images/emoji/facebook_messenger/spiral_note_pad.png b/public/images/emoji/facebook_messenger/spiral_note_pad.png index e441801b07..54a49dbc5d 100644 Binary files a/public/images/emoji/facebook_messenger/spiral_note_pad.png and b/public/images/emoji/facebook_messenger/spiral_note_pad.png differ diff --git a/public/images/emoji/facebook_messenger/spiral_notepad.png b/public/images/emoji/facebook_messenger/spiral_notepad.png index e441801b07..54a49dbc5d 100644 Binary files a/public/images/emoji/facebook_messenger/spiral_notepad.png and b/public/images/emoji/facebook_messenger/spiral_notepad.png differ diff --git a/public/images/emoji/facebook_messenger/sponge.png b/public/images/emoji/facebook_messenger/sponge.png new file mode 100644 index 0000000000..1c7ee83f5e Binary files /dev/null and b/public/images/emoji/facebook_messenger/sponge.png differ diff --git a/public/images/emoji/facebook_messenger/spoon.png b/public/images/emoji/facebook_messenger/spoon.png index 61ceb0552d..1367040335 100644 Binary files a/public/images/emoji/facebook_messenger/spoon.png and b/public/images/emoji/facebook_messenger/spoon.png differ diff --git a/public/images/emoji/facebook_messenger/sports_medal.png b/public/images/emoji/facebook_messenger/sports_medal.png index 2f481eb281..158e4afbe8 100644 Binary files a/public/images/emoji/facebook_messenger/sports_medal.png and b/public/images/emoji/facebook_messenger/sports_medal.png differ diff --git a/public/images/emoji/facebook_messenger/spy.png b/public/images/emoji/facebook_messenger/spy.png index 6734c6bde0..0d6160dd2b 100644 Binary files a/public/images/emoji/facebook_messenger/spy.png and b/public/images/emoji/facebook_messenger/spy.png differ diff --git a/public/images/emoji/facebook_messenger/squid.png b/public/images/emoji/facebook_messenger/squid.png index 4b589aef41..1c7b70a82b 100644 Binary files a/public/images/emoji/facebook_messenger/squid.png and b/public/images/emoji/facebook_messenger/squid.png differ diff --git a/public/images/emoji/facebook_messenger/sri_lanka.png b/public/images/emoji/facebook_messenger/sri_lanka.png index 39e770f5fd..25d7a1d12b 100644 Binary files a/public/images/emoji/facebook_messenger/sri_lanka.png and b/public/images/emoji/facebook_messenger/sri_lanka.png differ diff --git a/public/images/emoji/facebook_messenger/st_barthelemy.png b/public/images/emoji/facebook_messenger/st_barthelemy.png index b0acdb50ff..aa793fb434 100644 Binary files a/public/images/emoji/facebook_messenger/st_barthelemy.png and b/public/images/emoji/facebook_messenger/st_barthelemy.png differ diff --git a/public/images/emoji/facebook_messenger/st_helena.png b/public/images/emoji/facebook_messenger/st_helena.png index d1fb896890..45d3df75a2 100644 Binary files a/public/images/emoji/facebook_messenger/st_helena.png and b/public/images/emoji/facebook_messenger/st_helena.png differ diff --git a/public/images/emoji/facebook_messenger/st_kitts_nevis.png b/public/images/emoji/facebook_messenger/st_kitts_nevis.png index 429af8b89e..7fc64523ee 100644 Binary files a/public/images/emoji/facebook_messenger/st_kitts_nevis.png and b/public/images/emoji/facebook_messenger/st_kitts_nevis.png differ diff --git a/public/images/emoji/facebook_messenger/st_lucia.png b/public/images/emoji/facebook_messenger/st_lucia.png index 0642436de4..153d545894 100644 Binary files a/public/images/emoji/facebook_messenger/st_lucia.png and b/public/images/emoji/facebook_messenger/st_lucia.png differ diff --git a/public/images/emoji/facebook_messenger/st_martin.png b/public/images/emoji/facebook_messenger/st_martin.png index 2ef71d792a..cf75e74cf2 100644 Binary files a/public/images/emoji/facebook_messenger/st_martin.png and b/public/images/emoji/facebook_messenger/st_martin.png differ diff --git a/public/images/emoji/facebook_messenger/st_pierre_miquelon.png b/public/images/emoji/facebook_messenger/st_pierre_miquelon.png index 697bcd6280..1abf7fcdea 100644 Binary files a/public/images/emoji/facebook_messenger/st_pierre_miquelon.png and b/public/images/emoji/facebook_messenger/st_pierre_miquelon.png differ diff --git a/public/images/emoji/facebook_messenger/st_vincent_grenadines.png b/public/images/emoji/facebook_messenger/st_vincent_grenadines.png index 30c54fb34a..d016950ba4 100644 Binary files a/public/images/emoji/facebook_messenger/st_vincent_grenadines.png and b/public/images/emoji/facebook_messenger/st_vincent_grenadines.png differ diff --git a/public/images/emoji/facebook_messenger/stadium.png b/public/images/emoji/facebook_messenger/stadium.png index c599f90bfb..3190d8df06 100644 Binary files a/public/images/emoji/facebook_messenger/stadium.png and b/public/images/emoji/facebook_messenger/stadium.png differ diff --git a/public/images/emoji/facebook_messenger/star.png b/public/images/emoji/facebook_messenger/star.png index 3817206170..7b270bf5b4 100644 Binary files a/public/images/emoji/facebook_messenger/star.png and b/public/images/emoji/facebook_messenger/star.png differ diff --git a/public/images/emoji/facebook_messenger/star2.png b/public/images/emoji/facebook_messenger/star2.png index 5a5acfa640..30355ebd40 100644 Binary files a/public/images/emoji/facebook_messenger/star2.png and b/public/images/emoji/facebook_messenger/star2.png differ diff --git a/public/images/emoji/facebook_messenger/star_and_crescent.png b/public/images/emoji/facebook_messenger/star_and_crescent.png index 977efca749..2dbdcf4acc 100644 Binary files a/public/images/emoji/facebook_messenger/star_and_crescent.png and b/public/images/emoji/facebook_messenger/star_and_crescent.png differ diff --git a/public/images/emoji/facebook_messenger/star_of_david.png b/public/images/emoji/facebook_messenger/star_of_david.png index a01e9c19e0..8c7f4cf855 100644 Binary files a/public/images/emoji/facebook_messenger/star_of_david.png and b/public/images/emoji/facebook_messenger/star_of_david.png differ diff --git a/public/images/emoji/facebook_messenger/star_struck.png b/public/images/emoji/facebook_messenger/star_struck.png index 88dde6c46b..9a18df76a6 100644 Binary files a/public/images/emoji/facebook_messenger/star_struck.png and b/public/images/emoji/facebook_messenger/star_struck.png differ diff --git a/public/images/emoji/facebook_messenger/stars.png b/public/images/emoji/facebook_messenger/stars.png index 72443a819a..de4feb7d40 100644 Binary files a/public/images/emoji/facebook_messenger/stars.png and b/public/images/emoji/facebook_messenger/stars.png differ diff --git a/public/images/emoji/facebook_messenger/station.png b/public/images/emoji/facebook_messenger/station.png index 68f40b18da..ebc4e5149f 100644 Binary files a/public/images/emoji/facebook_messenger/station.png and b/public/images/emoji/facebook_messenger/station.png differ diff --git a/public/images/emoji/facebook_messenger/statue_of_liberty.png b/public/images/emoji/facebook_messenger/statue_of_liberty.png index e1bdc292d9..3764fbccb8 100644 Binary files a/public/images/emoji/facebook_messenger/statue_of_liberty.png and b/public/images/emoji/facebook_messenger/statue_of_liberty.png differ diff --git a/public/images/emoji/facebook_messenger/steam_locomotive.png b/public/images/emoji/facebook_messenger/steam_locomotive.png index 551bc94b95..5d14c2bdfa 100644 Binary files a/public/images/emoji/facebook_messenger/steam_locomotive.png and b/public/images/emoji/facebook_messenger/steam_locomotive.png differ diff --git a/public/images/emoji/facebook_messenger/stew.png b/public/images/emoji/facebook_messenger/stew.png index 9dd0cb7546..63292462bb 100644 Binary files a/public/images/emoji/facebook_messenger/stew.png and b/public/images/emoji/facebook_messenger/stew.png differ diff --git a/public/images/emoji/facebook_messenger/stop_button.png b/public/images/emoji/facebook_messenger/stop_button.png index 564c188456..16dfe0cd04 100644 Binary files a/public/images/emoji/facebook_messenger/stop_button.png and b/public/images/emoji/facebook_messenger/stop_button.png differ diff --git a/public/images/emoji/facebook_messenger/stop_sign.png b/public/images/emoji/facebook_messenger/stop_sign.png index 2977d19141..46b2917eae 100644 Binary files a/public/images/emoji/facebook_messenger/stop_sign.png and b/public/images/emoji/facebook_messenger/stop_sign.png differ diff --git a/public/images/emoji/facebook_messenger/stopwatch.png b/public/images/emoji/facebook_messenger/stopwatch.png index f8e1dffd08..c6fdd06339 100644 Binary files a/public/images/emoji/facebook_messenger/stopwatch.png and b/public/images/emoji/facebook_messenger/stopwatch.png differ diff --git a/public/images/emoji/facebook_messenger/straight_ruler.png b/public/images/emoji/facebook_messenger/straight_ruler.png index 020871473d..796d0151ca 100644 Binary files a/public/images/emoji/facebook_messenger/straight_ruler.png and b/public/images/emoji/facebook_messenger/straight_ruler.png differ diff --git a/public/images/emoji/facebook_messenger/strawberry.png b/public/images/emoji/facebook_messenger/strawberry.png index a3528642ec..e51f584fab 100644 Binary files a/public/images/emoji/facebook_messenger/strawberry.png and b/public/images/emoji/facebook_messenger/strawberry.png differ diff --git a/public/images/emoji/facebook_messenger/stuck_out_tongue.png b/public/images/emoji/facebook_messenger/stuck_out_tongue.png index e5beeb121a..752137d659 100644 Binary files a/public/images/emoji/facebook_messenger/stuck_out_tongue.png and b/public/images/emoji/facebook_messenger/stuck_out_tongue.png differ diff --git a/public/images/emoji/facebook_messenger/stuck_out_tongue_closed_eyes.png b/public/images/emoji/facebook_messenger/stuck_out_tongue_closed_eyes.png index 8b8d41b4e1..05c7ed31da 100644 Binary files a/public/images/emoji/facebook_messenger/stuck_out_tongue_closed_eyes.png and b/public/images/emoji/facebook_messenger/stuck_out_tongue_closed_eyes.png differ diff --git a/public/images/emoji/facebook_messenger/stuck_out_tongue_winking_eye.png b/public/images/emoji/facebook_messenger/stuck_out_tongue_winking_eye.png index 649eba9a43..3a3d5119d8 100644 Binary files a/public/images/emoji/facebook_messenger/stuck_out_tongue_winking_eye.png and b/public/images/emoji/facebook_messenger/stuck_out_tongue_winking_eye.png differ diff --git a/public/images/emoji/facebook_messenger/studio_microphone.png b/public/images/emoji/facebook_messenger/studio_microphone.png index ed24a78f7f..15726b76d6 100644 Binary files a/public/images/emoji/facebook_messenger/studio_microphone.png and b/public/images/emoji/facebook_messenger/studio_microphone.png differ diff --git a/public/images/emoji/facebook_messenger/stuffed_flatbread.png b/public/images/emoji/facebook_messenger/stuffed_flatbread.png index b8e739742a..1ed0013f68 100644 Binary files a/public/images/emoji/facebook_messenger/stuffed_flatbread.png and b/public/images/emoji/facebook_messenger/stuffed_flatbread.png differ diff --git a/public/images/emoji/facebook_messenger/sudan.png b/public/images/emoji/facebook_messenger/sudan.png index 11efec7ed1..894fb7b457 100644 Binary files a/public/images/emoji/facebook_messenger/sudan.png and b/public/images/emoji/facebook_messenger/sudan.png differ diff --git a/public/images/emoji/facebook_messenger/sun_behind_large_cloud.png b/public/images/emoji/facebook_messenger/sun_behind_large_cloud.png index 17a5f1ff82..8814836a8b 100644 Binary files a/public/images/emoji/facebook_messenger/sun_behind_large_cloud.png and b/public/images/emoji/facebook_messenger/sun_behind_large_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/sun_behind_rain_cloud.png b/public/images/emoji/facebook_messenger/sun_behind_rain_cloud.png index ec92c38a2b..e8df44e7b1 100644 Binary files a/public/images/emoji/facebook_messenger/sun_behind_rain_cloud.png and b/public/images/emoji/facebook_messenger/sun_behind_rain_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/sun_behind_small_cloud.png b/public/images/emoji/facebook_messenger/sun_behind_small_cloud.png index 0a6ad08a98..a2c515c3d2 100644 Binary files a/public/images/emoji/facebook_messenger/sun_behind_small_cloud.png and b/public/images/emoji/facebook_messenger/sun_behind_small_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/sun_with_face.png b/public/images/emoji/facebook_messenger/sun_with_face.png index 60cdafd79e..bd988795f5 100644 Binary files a/public/images/emoji/facebook_messenger/sun_with_face.png and b/public/images/emoji/facebook_messenger/sun_with_face.png differ diff --git a/public/images/emoji/facebook_messenger/sunflower.png b/public/images/emoji/facebook_messenger/sunflower.png index 939ff0818b..4875b3b40b 100644 Binary files a/public/images/emoji/facebook_messenger/sunflower.png and b/public/images/emoji/facebook_messenger/sunflower.png differ diff --git a/public/images/emoji/facebook_messenger/sunglasses.png b/public/images/emoji/facebook_messenger/sunglasses.png index 430be8ac23..ccb30b51d1 100644 Binary files a/public/images/emoji/facebook_messenger/sunglasses.png and b/public/images/emoji/facebook_messenger/sunglasses.png differ diff --git a/public/images/emoji/facebook_messenger/sunny.png b/public/images/emoji/facebook_messenger/sunny.png index 0bbab9a719..188e4b9e08 100644 Binary files a/public/images/emoji/facebook_messenger/sunny.png and b/public/images/emoji/facebook_messenger/sunny.png differ diff --git a/public/images/emoji/facebook_messenger/sunrise.png b/public/images/emoji/facebook_messenger/sunrise.png index e5f45ef92c..f1c0721a18 100644 Binary files a/public/images/emoji/facebook_messenger/sunrise.png and b/public/images/emoji/facebook_messenger/sunrise.png differ diff --git a/public/images/emoji/facebook_messenger/sunrise_over_mountains.png b/public/images/emoji/facebook_messenger/sunrise_over_mountains.png index b5529673aa..5d91979112 100644 Binary files a/public/images/emoji/facebook_messenger/sunrise_over_mountains.png and b/public/images/emoji/facebook_messenger/sunrise_over_mountains.png differ diff --git a/public/images/emoji/facebook_messenger/superhero.png b/public/images/emoji/facebook_messenger/superhero.png new file mode 100644 index 0000000000..c66c1cb6a1 Binary files /dev/null and b/public/images/emoji/facebook_messenger/superhero.png differ diff --git a/public/images/emoji/facebook_messenger/supervillain.png b/public/images/emoji/facebook_messenger/supervillain.png new file mode 100644 index 0000000000..f80372bef7 Binary files /dev/null and b/public/images/emoji/facebook_messenger/supervillain.png differ diff --git a/public/images/emoji/facebook_messenger/surfer.png b/public/images/emoji/facebook_messenger/surfer.png index 1cbae8ae1f..c7df6a57f1 100644 Binary files a/public/images/emoji/facebook_messenger/surfer.png and b/public/images/emoji/facebook_messenger/surfer.png differ diff --git a/public/images/emoji/facebook_messenger/surfing_man.png b/public/images/emoji/facebook_messenger/surfing_man.png index 1cbae8ae1f..c7df6a57f1 100644 Binary files a/public/images/emoji/facebook_messenger/surfing_man.png and b/public/images/emoji/facebook_messenger/surfing_man.png differ diff --git a/public/images/emoji/facebook_messenger/surfing_woman.png b/public/images/emoji/facebook_messenger/surfing_woman.png index c48f0ec9b3..db97956f0c 100644 Binary files a/public/images/emoji/facebook_messenger/surfing_woman.png and b/public/images/emoji/facebook_messenger/surfing_woman.png differ diff --git a/public/images/emoji/facebook_messenger/suriname.png b/public/images/emoji/facebook_messenger/suriname.png index 86caff504a..98feb844b5 100644 Binary files a/public/images/emoji/facebook_messenger/suriname.png and b/public/images/emoji/facebook_messenger/suriname.png differ diff --git a/public/images/emoji/facebook_messenger/sushi.png b/public/images/emoji/facebook_messenger/sushi.png index f4bd6263b6..850f0a9ef4 100644 Binary files a/public/images/emoji/facebook_messenger/sushi.png and b/public/images/emoji/facebook_messenger/sushi.png differ diff --git a/public/images/emoji/facebook_messenger/suspension_railway.png b/public/images/emoji/facebook_messenger/suspension_railway.png index bab0b96ae4..d2a4307a9c 100644 Binary files a/public/images/emoji/facebook_messenger/suspension_railway.png and b/public/images/emoji/facebook_messenger/suspension_railway.png differ diff --git a/public/images/emoji/facebook_messenger/svalbard_and_jan_mayen.png b/public/images/emoji/facebook_messenger/svalbard_and_jan_mayen.png index d2cd8f67f2..9d31676eba 100644 Binary files a/public/images/emoji/facebook_messenger/svalbard_and_jan_mayen.png and b/public/images/emoji/facebook_messenger/svalbard_and_jan_mayen.png differ diff --git a/public/images/emoji/facebook_messenger/swan.png b/public/images/emoji/facebook_messenger/swan.png new file mode 100644 index 0000000000..8fedcfee6a Binary files /dev/null and b/public/images/emoji/facebook_messenger/swan.png differ diff --git a/public/images/emoji/facebook_messenger/swaziland.png b/public/images/emoji/facebook_messenger/swaziland.png index 8e83a676ae..d46292a193 100644 Binary files a/public/images/emoji/facebook_messenger/swaziland.png and b/public/images/emoji/facebook_messenger/swaziland.png differ diff --git a/public/images/emoji/facebook_messenger/sweat.png b/public/images/emoji/facebook_messenger/sweat.png index 4dfa75e54d..2efbb4b2eb 100644 Binary files a/public/images/emoji/facebook_messenger/sweat.png and b/public/images/emoji/facebook_messenger/sweat.png differ diff --git a/public/images/emoji/facebook_messenger/sweat_drops.png b/public/images/emoji/facebook_messenger/sweat_drops.png index 6f417fbfc1..226c6e14c2 100644 Binary files a/public/images/emoji/facebook_messenger/sweat_drops.png and b/public/images/emoji/facebook_messenger/sweat_drops.png differ diff --git a/public/images/emoji/facebook_messenger/sweat_smile.png b/public/images/emoji/facebook_messenger/sweat_smile.png index dc7c2a0f1e..13c01ef330 100644 Binary files a/public/images/emoji/facebook_messenger/sweat_smile.png and b/public/images/emoji/facebook_messenger/sweat_smile.png differ diff --git a/public/images/emoji/facebook_messenger/sweden.png b/public/images/emoji/facebook_messenger/sweden.png index 2235439563..77a36d67ba 100644 Binary files a/public/images/emoji/facebook_messenger/sweden.png and b/public/images/emoji/facebook_messenger/sweden.png differ diff --git a/public/images/emoji/facebook_messenger/sweet_potato.png b/public/images/emoji/facebook_messenger/sweet_potato.png index a977184a2b..d51ca97c75 100644 Binary files a/public/images/emoji/facebook_messenger/sweet_potato.png and b/public/images/emoji/facebook_messenger/sweet_potato.png differ diff --git a/public/images/emoji/facebook_messenger/swimmer.png b/public/images/emoji/facebook_messenger/swimmer.png index f60b6a5a32..666a1026a8 100644 Binary files a/public/images/emoji/facebook_messenger/swimmer.png and b/public/images/emoji/facebook_messenger/swimmer.png differ diff --git a/public/images/emoji/facebook_messenger/swimming_man.png b/public/images/emoji/facebook_messenger/swimming_man.png index f60b6a5a32..666a1026a8 100644 Binary files a/public/images/emoji/facebook_messenger/swimming_man.png and b/public/images/emoji/facebook_messenger/swimming_man.png differ diff --git a/public/images/emoji/facebook_messenger/swimming_woman.png b/public/images/emoji/facebook_messenger/swimming_woman.png index 3c6323c0c8..55edc8bd5c 100644 Binary files a/public/images/emoji/facebook_messenger/swimming_woman.png and b/public/images/emoji/facebook_messenger/swimming_woman.png differ diff --git a/public/images/emoji/facebook_messenger/switzerland.png b/public/images/emoji/facebook_messenger/switzerland.png index dc6c36ac89..b9d60ba9d4 100644 Binary files a/public/images/emoji/facebook_messenger/switzerland.png and b/public/images/emoji/facebook_messenger/switzerland.png differ diff --git a/public/images/emoji/facebook_messenger/symbols.png b/public/images/emoji/facebook_messenger/symbols.png index 87e3f439b6..9ada53491f 100644 Binary files a/public/images/emoji/facebook_messenger/symbols.png and b/public/images/emoji/facebook_messenger/symbols.png differ diff --git a/public/images/emoji/facebook_messenger/synagogue.png b/public/images/emoji/facebook_messenger/synagogue.png index b449930821..1489c7ee4e 100644 Binary files a/public/images/emoji/facebook_messenger/synagogue.png and b/public/images/emoji/facebook_messenger/synagogue.png differ diff --git a/public/images/emoji/facebook_messenger/syria.png b/public/images/emoji/facebook_messenger/syria.png index cc83b9c6a2..8bbedc1fa9 100644 Binary files a/public/images/emoji/facebook_messenger/syria.png and b/public/images/emoji/facebook_messenger/syria.png differ diff --git a/public/images/emoji/facebook_messenger/syringe.png b/public/images/emoji/facebook_messenger/syringe.png index 188e7156c6..7c32cbccb5 100644 Binary files a/public/images/emoji/facebook_messenger/syringe.png and b/public/images/emoji/facebook_messenger/syringe.png differ diff --git a/public/images/emoji/facebook_messenger/t_rex.png b/public/images/emoji/facebook_messenger/t_rex.png index d0d1c7b5d7..442c9bcb29 100644 Binary files a/public/images/emoji/facebook_messenger/t_rex.png and b/public/images/emoji/facebook_messenger/t_rex.png differ diff --git a/public/images/emoji/facebook_messenger/table_tennis.png b/public/images/emoji/facebook_messenger/table_tennis.png index 4b18adbad4..25b2ecba56 100644 Binary files a/public/images/emoji/facebook_messenger/table_tennis.png and b/public/images/emoji/facebook_messenger/table_tennis.png differ diff --git a/public/images/emoji/facebook_messenger/taco.png b/public/images/emoji/facebook_messenger/taco.png index a9e6dda0e0..5d4083f812 100644 Binary files a/public/images/emoji/facebook_messenger/taco.png and b/public/images/emoji/facebook_messenger/taco.png differ diff --git a/public/images/emoji/facebook_messenger/tada.png b/public/images/emoji/facebook_messenger/tada.png index ad69b893f8..739316c23f 100644 Binary files a/public/images/emoji/facebook_messenger/tada.png and b/public/images/emoji/facebook_messenger/tada.png differ diff --git a/public/images/emoji/facebook_messenger/taiwan.png b/public/images/emoji/facebook_messenger/taiwan.png index d214347a7b..d792c8842d 100644 Binary files a/public/images/emoji/facebook_messenger/taiwan.png and b/public/images/emoji/facebook_messenger/taiwan.png differ diff --git a/public/images/emoji/facebook_messenger/tajikistan.png b/public/images/emoji/facebook_messenger/tajikistan.png index f3a67c9a97..ca29e6a333 100644 Binary files a/public/images/emoji/facebook_messenger/tajikistan.png and b/public/images/emoji/facebook_messenger/tajikistan.png differ diff --git a/public/images/emoji/facebook_messenger/takeout_box.png b/public/images/emoji/facebook_messenger/takeout_box.png index 17c638d5c4..45442831d8 100644 Binary files a/public/images/emoji/facebook_messenger/takeout_box.png and b/public/images/emoji/facebook_messenger/takeout_box.png differ diff --git a/public/images/emoji/facebook_messenger/tanabata_tree.png b/public/images/emoji/facebook_messenger/tanabata_tree.png index 6c160bc7b3..3334f9608f 100644 Binary files a/public/images/emoji/facebook_messenger/tanabata_tree.png and b/public/images/emoji/facebook_messenger/tanabata_tree.png differ diff --git a/public/images/emoji/facebook_messenger/tangerine.png b/public/images/emoji/facebook_messenger/tangerine.png index f6b8068396..e50430eec5 100644 Binary files a/public/images/emoji/facebook_messenger/tangerine.png and b/public/images/emoji/facebook_messenger/tangerine.png differ diff --git a/public/images/emoji/facebook_messenger/tanzania.png b/public/images/emoji/facebook_messenger/tanzania.png index d79422df00..edd82dbf4d 100644 Binary files a/public/images/emoji/facebook_messenger/tanzania.png and b/public/images/emoji/facebook_messenger/tanzania.png differ diff --git a/public/images/emoji/facebook_messenger/taurus.png b/public/images/emoji/facebook_messenger/taurus.png index 6064dce482..81c79937ea 100644 Binary files a/public/images/emoji/facebook_messenger/taurus.png and b/public/images/emoji/facebook_messenger/taurus.png differ diff --git a/public/images/emoji/facebook_messenger/taxi.png b/public/images/emoji/facebook_messenger/taxi.png index 4e97b62afc..3134f33824 100644 Binary files a/public/images/emoji/facebook_messenger/taxi.png and b/public/images/emoji/facebook_messenger/taxi.png differ diff --git a/public/images/emoji/facebook_messenger/tea.png b/public/images/emoji/facebook_messenger/tea.png index 0b8d1891a9..37542a3cc1 100644 Binary files a/public/images/emoji/facebook_messenger/tea.png and b/public/images/emoji/facebook_messenger/tea.png differ diff --git a/public/images/emoji/facebook_messenger/teddy_bear.png b/public/images/emoji/facebook_messenger/teddy_bear.png new file mode 100644 index 0000000000..4ba5b7bb59 Binary files /dev/null and b/public/images/emoji/facebook_messenger/teddy_bear.png differ diff --git a/public/images/emoji/facebook_messenger/telephone.png b/public/images/emoji/facebook_messenger/telephone.png index 13b38ac3c6..9513793959 100644 Binary files a/public/images/emoji/facebook_messenger/telephone.png and b/public/images/emoji/facebook_messenger/telephone.png differ diff --git a/public/images/emoji/facebook_messenger/telephone_receiver.png b/public/images/emoji/facebook_messenger/telephone_receiver.png index d903dbd15b..f83a9f4fbf 100644 Binary files a/public/images/emoji/facebook_messenger/telephone_receiver.png and b/public/images/emoji/facebook_messenger/telephone_receiver.png differ diff --git a/public/images/emoji/facebook_messenger/telescope.png b/public/images/emoji/facebook_messenger/telescope.png index cc1a4c5b00..6a1e7a28b9 100644 Binary files a/public/images/emoji/facebook_messenger/telescope.png and b/public/images/emoji/facebook_messenger/telescope.png differ diff --git a/public/images/emoji/facebook_messenger/ten.png b/public/images/emoji/facebook_messenger/ten.png index c0beb67e22..f1e640952f 100644 Binary files a/public/images/emoji/facebook_messenger/ten.png and b/public/images/emoji/facebook_messenger/ten.png differ diff --git a/public/images/emoji/facebook_messenger/tennis.png b/public/images/emoji/facebook_messenger/tennis.png index bc7770211a..d45ed1b3f5 100644 Binary files a/public/images/emoji/facebook_messenger/tennis.png and b/public/images/emoji/facebook_messenger/tennis.png differ diff --git a/public/images/emoji/facebook_messenger/tent.png b/public/images/emoji/facebook_messenger/tent.png index c6d5353e41..c4047a5c97 100644 Binary files a/public/images/emoji/facebook_messenger/tent.png and b/public/images/emoji/facebook_messenger/tent.png differ diff --git a/public/images/emoji/facebook_messenger/test_tube.png b/public/images/emoji/facebook_messenger/test_tube.png new file mode 100644 index 0000000000..a004650181 Binary files /dev/null and b/public/images/emoji/facebook_messenger/test_tube.png differ diff --git a/public/images/emoji/facebook_messenger/thailand.png b/public/images/emoji/facebook_messenger/thailand.png index 62cc8d3d17..4109f87ecc 100644 Binary files a/public/images/emoji/facebook_messenger/thailand.png and b/public/images/emoji/facebook_messenger/thailand.png differ diff --git a/public/images/emoji/facebook_messenger/thermometer.png b/public/images/emoji/facebook_messenger/thermometer.png index 77638009bd..b0b700882a 100644 Binary files a/public/images/emoji/facebook_messenger/thermometer.png and b/public/images/emoji/facebook_messenger/thermometer.png differ diff --git a/public/images/emoji/facebook_messenger/thermometer_face.png b/public/images/emoji/facebook_messenger/thermometer_face.png index 9c4da3e1fc..4e49efcb3f 100644 Binary files a/public/images/emoji/facebook_messenger/thermometer_face.png and b/public/images/emoji/facebook_messenger/thermometer_face.png differ diff --git a/public/images/emoji/facebook_messenger/thinking.png b/public/images/emoji/facebook_messenger/thinking.png index 2d0aeb611b..e1fd97c96f 100644 Binary files a/public/images/emoji/facebook_messenger/thinking.png and b/public/images/emoji/facebook_messenger/thinking.png differ diff --git a/public/images/emoji/facebook_messenger/thinking_face.png b/public/images/emoji/facebook_messenger/thinking_face.png index 2d0aeb611b..e1fd97c96f 100644 Binary files a/public/images/emoji/facebook_messenger/thinking_face.png and b/public/images/emoji/facebook_messenger/thinking_face.png differ diff --git a/public/images/emoji/facebook_messenger/thought_balloon.png b/public/images/emoji/facebook_messenger/thought_balloon.png index 0c698c1a86..b3c35fc949 100644 Binary files a/public/images/emoji/facebook_messenger/thought_balloon.png and b/public/images/emoji/facebook_messenger/thought_balloon.png differ diff --git a/public/images/emoji/facebook_messenger/thread.png b/public/images/emoji/facebook_messenger/thread.png new file mode 100644 index 0000000000..b7b58f1b6a Binary files /dev/null and b/public/images/emoji/facebook_messenger/thread.png differ diff --git a/public/images/emoji/facebook_messenger/three.png b/public/images/emoji/facebook_messenger/three.png index 3fb7f86e6c..26f9121cec 100644 Binary files a/public/images/emoji/facebook_messenger/three.png and b/public/images/emoji/facebook_messenger/three.png differ diff --git a/public/images/emoji/facebook_messenger/three_button_mouse.png b/public/images/emoji/facebook_messenger/three_button_mouse.png index 53fdef1f76..f9917195e0 100644 Binary files a/public/images/emoji/facebook_messenger/three_button_mouse.png and b/public/images/emoji/facebook_messenger/three_button_mouse.png differ diff --git a/public/images/emoji/facebook_messenger/thumbsdown.png b/public/images/emoji/facebook_messenger/thumbsdown.png index 6a7dce2614..815bd92c8c 100644 Binary files a/public/images/emoji/facebook_messenger/thumbsdown.png and b/public/images/emoji/facebook_messenger/thumbsdown.png differ diff --git a/public/images/emoji/facebook_messenger/thumbsup.png b/public/images/emoji/facebook_messenger/thumbsup.png index 53f1b3d075..a97d9c978b 100644 Binary files a/public/images/emoji/facebook_messenger/thumbsup.png and b/public/images/emoji/facebook_messenger/thumbsup.png differ diff --git a/public/images/emoji/facebook_messenger/thunder_cloud_and_rain.png b/public/images/emoji/facebook_messenger/thunder_cloud_and_rain.png index 943482554f..98b648e37a 100644 Binary files a/public/images/emoji/facebook_messenger/thunder_cloud_and_rain.png and b/public/images/emoji/facebook_messenger/thunder_cloud_and_rain.png differ diff --git a/public/images/emoji/facebook_messenger/thunder_cloud_rain.png b/public/images/emoji/facebook_messenger/thunder_cloud_rain.png index 943482554f..98b648e37a 100644 Binary files a/public/images/emoji/facebook_messenger/thunder_cloud_rain.png and b/public/images/emoji/facebook_messenger/thunder_cloud_rain.png differ diff --git a/public/images/emoji/facebook_messenger/ticket.png b/public/images/emoji/facebook_messenger/ticket.png index 60ce4aea21..675952e9fe 100644 Binary files a/public/images/emoji/facebook_messenger/ticket.png and b/public/images/emoji/facebook_messenger/ticket.png differ diff --git a/public/images/emoji/facebook_messenger/tickets.png b/public/images/emoji/facebook_messenger/tickets.png index e863f088be..7e1f0bc5ef 100644 Binary files a/public/images/emoji/facebook_messenger/tickets.png and b/public/images/emoji/facebook_messenger/tickets.png differ diff --git a/public/images/emoji/facebook_messenger/tiger.png b/public/images/emoji/facebook_messenger/tiger.png index ddfd859a66..5bfe7bee20 100644 Binary files a/public/images/emoji/facebook_messenger/tiger.png and b/public/images/emoji/facebook_messenger/tiger.png differ diff --git a/public/images/emoji/facebook_messenger/tiger2.png b/public/images/emoji/facebook_messenger/tiger2.png index 9f117a0958..6f1ea946ea 100644 Binary files a/public/images/emoji/facebook_messenger/tiger2.png and b/public/images/emoji/facebook_messenger/tiger2.png differ diff --git a/public/images/emoji/facebook_messenger/timer.png b/public/images/emoji/facebook_messenger/timer.png index e3142522f7..38a6058584 100644 Binary files a/public/images/emoji/facebook_messenger/timer.png and b/public/images/emoji/facebook_messenger/timer.png differ diff --git a/public/images/emoji/facebook_messenger/timer_clock.png b/public/images/emoji/facebook_messenger/timer_clock.png index e3142522f7..38a6058584 100644 Binary files a/public/images/emoji/facebook_messenger/timer_clock.png and b/public/images/emoji/facebook_messenger/timer_clock.png differ diff --git a/public/images/emoji/facebook_messenger/timor_leste.png b/public/images/emoji/facebook_messenger/timor_leste.png index 68b2faeb7a..46c3a971f9 100644 Binary files a/public/images/emoji/facebook_messenger/timor_leste.png and b/public/images/emoji/facebook_messenger/timor_leste.png differ diff --git a/public/images/emoji/facebook_messenger/tipping_hand_man.png b/public/images/emoji/facebook_messenger/tipping_hand_man.png index 775e5ad35d..ff069ebe53 100644 Binary files a/public/images/emoji/facebook_messenger/tipping_hand_man.png and b/public/images/emoji/facebook_messenger/tipping_hand_man.png differ diff --git a/public/images/emoji/facebook_messenger/tipping_hand_woman.png b/public/images/emoji/facebook_messenger/tipping_hand_woman.png index 45ca8d273d..60d8f589ee 100644 Binary files a/public/images/emoji/facebook_messenger/tipping_hand_woman.png and b/public/images/emoji/facebook_messenger/tipping_hand_woman.png differ diff --git a/public/images/emoji/facebook_messenger/tired_face.png b/public/images/emoji/facebook_messenger/tired_face.png index 311464115c..5cf8ef5872 100644 Binary files a/public/images/emoji/facebook_messenger/tired_face.png and b/public/images/emoji/facebook_messenger/tired_face.png differ diff --git a/public/images/emoji/facebook_messenger/tm.png b/public/images/emoji/facebook_messenger/tm.png index 9d86f2f706..37bd8c6986 100644 Binary files a/public/images/emoji/facebook_messenger/tm.png and b/public/images/emoji/facebook_messenger/tm.png differ diff --git a/public/images/emoji/facebook_messenger/togo.png b/public/images/emoji/facebook_messenger/togo.png index 260a81c702..f85d09914e 100644 Binary files a/public/images/emoji/facebook_messenger/togo.png and b/public/images/emoji/facebook_messenger/togo.png differ diff --git a/public/images/emoji/facebook_messenger/toilet.png b/public/images/emoji/facebook_messenger/toilet.png index 273f4f16a8..33819cc6cd 100644 Binary files a/public/images/emoji/facebook_messenger/toilet.png and b/public/images/emoji/facebook_messenger/toilet.png differ diff --git a/public/images/emoji/facebook_messenger/tokelau.png b/public/images/emoji/facebook_messenger/tokelau.png index 86fd2423cb..033e610669 100644 Binary files a/public/images/emoji/facebook_messenger/tokelau.png and b/public/images/emoji/facebook_messenger/tokelau.png differ diff --git a/public/images/emoji/facebook_messenger/tokyo_tower.png b/public/images/emoji/facebook_messenger/tokyo_tower.png index d47cd01126..b39180421b 100644 Binary files a/public/images/emoji/facebook_messenger/tokyo_tower.png and b/public/images/emoji/facebook_messenger/tokyo_tower.png differ diff --git a/public/images/emoji/facebook_messenger/tomato.png b/public/images/emoji/facebook_messenger/tomato.png index ed7ad8276b..4aa6fb5388 100644 Binary files a/public/images/emoji/facebook_messenger/tomato.png and b/public/images/emoji/facebook_messenger/tomato.png differ diff --git a/public/images/emoji/facebook_messenger/tonga.png b/public/images/emoji/facebook_messenger/tonga.png index c30d9f9312..ecbc84c1b5 100644 Binary files a/public/images/emoji/facebook_messenger/tonga.png and b/public/images/emoji/facebook_messenger/tonga.png differ diff --git a/public/images/emoji/facebook_messenger/tongue.png b/public/images/emoji/facebook_messenger/tongue.png index 7b1a28827e..29d6898529 100644 Binary files a/public/images/emoji/facebook_messenger/tongue.png and b/public/images/emoji/facebook_messenger/tongue.png differ diff --git a/public/images/emoji/facebook_messenger/toolbox.png b/public/images/emoji/facebook_messenger/toolbox.png new file mode 100644 index 0000000000..f66bd60df4 Binary files /dev/null and b/public/images/emoji/facebook_messenger/toolbox.png differ diff --git a/public/images/emoji/facebook_messenger/tools.png b/public/images/emoji/facebook_messenger/tools.png index ed21302869..3b2646f5f7 100644 Binary files a/public/images/emoji/facebook_messenger/tools.png and b/public/images/emoji/facebook_messenger/tools.png differ diff --git a/public/images/emoji/facebook_messenger/tooth.png b/public/images/emoji/facebook_messenger/tooth.png new file mode 100644 index 0000000000..f5d32ea713 Binary files /dev/null and b/public/images/emoji/facebook_messenger/tooth.png differ diff --git a/public/images/emoji/facebook_messenger/top.png b/public/images/emoji/facebook_messenger/top.png index da7fbdd93b..ff0b17c229 100644 Binary files a/public/images/emoji/facebook_messenger/top.png and b/public/images/emoji/facebook_messenger/top.png differ diff --git a/public/images/emoji/facebook_messenger/tophat.png b/public/images/emoji/facebook_messenger/tophat.png index 6bbf03199d..f31439ed68 100644 Binary files a/public/images/emoji/facebook_messenger/tophat.png and b/public/images/emoji/facebook_messenger/tophat.png differ diff --git a/public/images/emoji/facebook_messenger/tornado.png b/public/images/emoji/facebook_messenger/tornado.png index 2de8ec4a69..c008264d3b 100644 Binary files a/public/images/emoji/facebook_messenger/tornado.png and b/public/images/emoji/facebook_messenger/tornado.png differ diff --git a/public/images/emoji/facebook_messenger/tr.png b/public/images/emoji/facebook_messenger/tr.png index 8f3fa9a933..c81b83446a 100644 Binary files a/public/images/emoji/facebook_messenger/tr.png and b/public/images/emoji/facebook_messenger/tr.png differ diff --git a/public/images/emoji/facebook_messenger/track_next.png b/public/images/emoji/facebook_messenger/track_next.png index 73c5fae8b8..ea6437b1bd 100644 Binary files a/public/images/emoji/facebook_messenger/track_next.png and b/public/images/emoji/facebook_messenger/track_next.png differ diff --git a/public/images/emoji/facebook_messenger/track_previous.png b/public/images/emoji/facebook_messenger/track_previous.png index 5794a548e0..b3061dcb50 100644 Binary files a/public/images/emoji/facebook_messenger/track_previous.png and b/public/images/emoji/facebook_messenger/track_previous.png differ diff --git a/public/images/emoji/facebook_messenger/trackball.png b/public/images/emoji/facebook_messenger/trackball.png index 3998927979..babe912c46 100644 Binary files a/public/images/emoji/facebook_messenger/trackball.png and b/public/images/emoji/facebook_messenger/trackball.png differ diff --git a/public/images/emoji/facebook_messenger/tractor.png b/public/images/emoji/facebook_messenger/tractor.png index 32e2263b83..f629be4617 100644 Binary files a/public/images/emoji/facebook_messenger/tractor.png and b/public/images/emoji/facebook_messenger/tractor.png differ diff --git a/public/images/emoji/facebook_messenger/traffic_light.png b/public/images/emoji/facebook_messenger/traffic_light.png index aa315f4d9c..4d3b6a4722 100644 Binary files a/public/images/emoji/facebook_messenger/traffic_light.png and b/public/images/emoji/facebook_messenger/traffic_light.png differ diff --git a/public/images/emoji/facebook_messenger/train.png b/public/images/emoji/facebook_messenger/train.png index 9374ae6ca7..c44a4ce9d4 100644 Binary files a/public/images/emoji/facebook_messenger/train.png and b/public/images/emoji/facebook_messenger/train.png differ diff --git a/public/images/emoji/facebook_messenger/train2.png b/public/images/emoji/facebook_messenger/train2.png index 6ffca5b139..1c99d71250 100644 Binary files a/public/images/emoji/facebook_messenger/train2.png and b/public/images/emoji/facebook_messenger/train2.png differ diff --git a/public/images/emoji/facebook_messenger/tram.png b/public/images/emoji/facebook_messenger/tram.png index c0ad1d6769..b34c7049cc 100644 Binary files a/public/images/emoji/facebook_messenger/tram.png and b/public/images/emoji/facebook_messenger/tram.png differ diff --git a/public/images/emoji/facebook_messenger/triangular_flag_on_post.png b/public/images/emoji/facebook_messenger/triangular_flag_on_post.png index 03f9a63b3e..fe94dffe5e 100644 Binary files a/public/images/emoji/facebook_messenger/triangular_flag_on_post.png and b/public/images/emoji/facebook_messenger/triangular_flag_on_post.png differ diff --git a/public/images/emoji/facebook_messenger/triangular_ruler.png b/public/images/emoji/facebook_messenger/triangular_ruler.png index db0ffd4fb4..2c4ce862ff 100644 Binary files a/public/images/emoji/facebook_messenger/triangular_ruler.png and b/public/images/emoji/facebook_messenger/triangular_ruler.png differ diff --git a/public/images/emoji/facebook_messenger/trident.png b/public/images/emoji/facebook_messenger/trident.png index c1ad0e9c65..358903438e 100644 Binary files a/public/images/emoji/facebook_messenger/trident.png and b/public/images/emoji/facebook_messenger/trident.png differ diff --git a/public/images/emoji/facebook_messenger/trinidad_tobago.png b/public/images/emoji/facebook_messenger/trinidad_tobago.png index bd3d9c1813..0987ca1e5a 100644 Binary files a/public/images/emoji/facebook_messenger/trinidad_tobago.png and b/public/images/emoji/facebook_messenger/trinidad_tobago.png differ diff --git a/public/images/emoji/facebook_messenger/tristan_da_cunha.png b/public/images/emoji/facebook_messenger/tristan_da_cunha.png index 9939cb1c31..e67a0d5c43 100644 Binary files a/public/images/emoji/facebook_messenger/tristan_da_cunha.png and b/public/images/emoji/facebook_messenger/tristan_da_cunha.png differ diff --git a/public/images/emoji/facebook_messenger/triumph.png b/public/images/emoji/facebook_messenger/triumph.png index d04981c806..c75c09d975 100644 Binary files a/public/images/emoji/facebook_messenger/triumph.png and b/public/images/emoji/facebook_messenger/triumph.png differ diff --git a/public/images/emoji/facebook_messenger/trolleybus.png b/public/images/emoji/facebook_messenger/trolleybus.png index 05631ee3be..bef4438a29 100644 Binary files a/public/images/emoji/facebook_messenger/trolleybus.png and b/public/images/emoji/facebook_messenger/trolleybus.png differ diff --git a/public/images/emoji/facebook_messenger/trophy.png b/public/images/emoji/facebook_messenger/trophy.png index 3c2036979d..ffeb68b31c 100644 Binary files a/public/images/emoji/facebook_messenger/trophy.png and b/public/images/emoji/facebook_messenger/trophy.png differ diff --git a/public/images/emoji/facebook_messenger/tropical_drink.png b/public/images/emoji/facebook_messenger/tropical_drink.png index f2ca1ee7f9..b809798390 100644 Binary files a/public/images/emoji/facebook_messenger/tropical_drink.png and b/public/images/emoji/facebook_messenger/tropical_drink.png differ diff --git a/public/images/emoji/facebook_messenger/tropical_fish.png b/public/images/emoji/facebook_messenger/tropical_fish.png index 653439ee0d..71d37150f6 100644 Binary files a/public/images/emoji/facebook_messenger/tropical_fish.png and b/public/images/emoji/facebook_messenger/tropical_fish.png differ diff --git a/public/images/emoji/facebook_messenger/truck.png b/public/images/emoji/facebook_messenger/truck.png index 4a6f2a03e8..3f07b0ddba 100644 Binary files a/public/images/emoji/facebook_messenger/truck.png and b/public/images/emoji/facebook_messenger/truck.png differ diff --git a/public/images/emoji/facebook_messenger/trumpet.png b/public/images/emoji/facebook_messenger/trumpet.png index 50410df53e..68f5e24f20 100644 Binary files a/public/images/emoji/facebook_messenger/trumpet.png and b/public/images/emoji/facebook_messenger/trumpet.png differ diff --git a/public/images/emoji/facebook_messenger/tshirt.png b/public/images/emoji/facebook_messenger/tshirt.png index 27ba96bfa0..44d68b3a69 100644 Binary files a/public/images/emoji/facebook_messenger/tshirt.png and b/public/images/emoji/facebook_messenger/tshirt.png differ diff --git a/public/images/emoji/facebook_messenger/tulip.png b/public/images/emoji/facebook_messenger/tulip.png index f7bb519dfd..a770e69bbd 100644 Binary files a/public/images/emoji/facebook_messenger/tulip.png and b/public/images/emoji/facebook_messenger/tulip.png differ diff --git a/public/images/emoji/facebook_messenger/tumbler_glass.png b/public/images/emoji/facebook_messenger/tumbler_glass.png index c00c2abcec..8051ccdefd 100644 Binary files a/public/images/emoji/facebook_messenger/tumbler_glass.png and b/public/images/emoji/facebook_messenger/tumbler_glass.png differ diff --git a/public/images/emoji/facebook_messenger/tunisia.png b/public/images/emoji/facebook_messenger/tunisia.png index d6f02aca4d..4dcee31fcf 100644 Binary files a/public/images/emoji/facebook_messenger/tunisia.png and b/public/images/emoji/facebook_messenger/tunisia.png differ diff --git a/public/images/emoji/facebook_messenger/turkey.png b/public/images/emoji/facebook_messenger/turkey.png index dadd27b6c2..19c4563ce1 100644 Binary files a/public/images/emoji/facebook_messenger/turkey.png and b/public/images/emoji/facebook_messenger/turkey.png differ diff --git a/public/images/emoji/facebook_messenger/turkmenistan.png b/public/images/emoji/facebook_messenger/turkmenistan.png index de872e5ab3..4c86bbb3b4 100644 Binary files a/public/images/emoji/facebook_messenger/turkmenistan.png and b/public/images/emoji/facebook_messenger/turkmenistan.png differ diff --git a/public/images/emoji/facebook_messenger/turks_caicos_islands.png b/public/images/emoji/facebook_messenger/turks_caicos_islands.png index 57e7224b05..024936487a 100644 Binary files a/public/images/emoji/facebook_messenger/turks_caicos_islands.png and b/public/images/emoji/facebook_messenger/turks_caicos_islands.png differ diff --git a/public/images/emoji/facebook_messenger/turtle.png b/public/images/emoji/facebook_messenger/turtle.png index a70d666d42..4cd0f46491 100644 Binary files a/public/images/emoji/facebook_messenger/turtle.png and b/public/images/emoji/facebook_messenger/turtle.png differ diff --git a/public/images/emoji/facebook_messenger/tuvalu.png b/public/images/emoji/facebook_messenger/tuvalu.png index 4ab8afadb5..66e2d0cf2a 100644 Binary files a/public/images/emoji/facebook_messenger/tuvalu.png and b/public/images/emoji/facebook_messenger/tuvalu.png differ diff --git a/public/images/emoji/facebook_messenger/tv.png b/public/images/emoji/facebook_messenger/tv.png index 39b6acee99..e6c56e72f6 100644 Binary files a/public/images/emoji/facebook_messenger/tv.png and b/public/images/emoji/facebook_messenger/tv.png differ diff --git a/public/images/emoji/facebook_messenger/twisted_rightwards_arrows.png b/public/images/emoji/facebook_messenger/twisted_rightwards_arrows.png index a9505e05ec..7b176225ac 100644 Binary files a/public/images/emoji/facebook_messenger/twisted_rightwards_arrows.png and b/public/images/emoji/facebook_messenger/twisted_rightwards_arrows.png differ diff --git a/public/images/emoji/facebook_messenger/two.png b/public/images/emoji/facebook_messenger/two.png index 735d778dae..7107372d6a 100644 Binary files a/public/images/emoji/facebook_messenger/two.png and b/public/images/emoji/facebook_messenger/two.png differ diff --git a/public/images/emoji/facebook_messenger/two_hearts.png b/public/images/emoji/facebook_messenger/two_hearts.png index 11ea848799..5e731ff4a5 100644 Binary files a/public/images/emoji/facebook_messenger/two_hearts.png and b/public/images/emoji/facebook_messenger/two_hearts.png differ diff --git a/public/images/emoji/facebook_messenger/two_men_holding_hands.png b/public/images/emoji/facebook_messenger/two_men_holding_hands.png index 7187ed27cd..45636c4ed1 100644 Binary files a/public/images/emoji/facebook_messenger/two_men_holding_hands.png and b/public/images/emoji/facebook_messenger/two_men_holding_hands.png differ diff --git a/public/images/emoji/facebook_messenger/two_women_holding_hands.png b/public/images/emoji/facebook_messenger/two_women_holding_hands.png index 1de782a805..ad18ef4941 100644 Binary files a/public/images/emoji/facebook_messenger/two_women_holding_hands.png and b/public/images/emoji/facebook_messenger/two_women_holding_hands.png differ diff --git a/public/images/emoji/facebook_messenger/u5272.png b/public/images/emoji/facebook_messenger/u5272.png index 58417da4bb..c7df8a0abc 100644 Binary files a/public/images/emoji/facebook_messenger/u5272.png and b/public/images/emoji/facebook_messenger/u5272.png differ diff --git a/public/images/emoji/facebook_messenger/u5408.png b/public/images/emoji/facebook_messenger/u5408.png index 34730b3531..30b7172fd4 100644 Binary files a/public/images/emoji/facebook_messenger/u5408.png and b/public/images/emoji/facebook_messenger/u5408.png differ diff --git a/public/images/emoji/facebook_messenger/u55b6.png b/public/images/emoji/facebook_messenger/u55b6.png index 524eb808cb..5965977c95 100644 Binary files a/public/images/emoji/facebook_messenger/u55b6.png and b/public/images/emoji/facebook_messenger/u55b6.png differ diff --git a/public/images/emoji/facebook_messenger/u6307.png b/public/images/emoji/facebook_messenger/u6307.png index f60c4c036b..a1f4ba2c28 100644 Binary files a/public/images/emoji/facebook_messenger/u6307.png and b/public/images/emoji/facebook_messenger/u6307.png differ diff --git a/public/images/emoji/facebook_messenger/u6708.png b/public/images/emoji/facebook_messenger/u6708.png index b01f8cf322..bc39a4faed 100644 Binary files a/public/images/emoji/facebook_messenger/u6708.png and b/public/images/emoji/facebook_messenger/u6708.png differ diff --git a/public/images/emoji/facebook_messenger/u6709.png b/public/images/emoji/facebook_messenger/u6709.png index 30a499cd4f..254a19a2e3 100644 Binary files a/public/images/emoji/facebook_messenger/u6709.png and b/public/images/emoji/facebook_messenger/u6709.png differ diff --git a/public/images/emoji/facebook_messenger/u6e80.png b/public/images/emoji/facebook_messenger/u6e80.png index 781042283b..273c548ed5 100644 Binary files a/public/images/emoji/facebook_messenger/u6e80.png and b/public/images/emoji/facebook_messenger/u6e80.png differ diff --git a/public/images/emoji/facebook_messenger/u7121.png b/public/images/emoji/facebook_messenger/u7121.png index 430203639d..caefa19466 100644 Binary files a/public/images/emoji/facebook_messenger/u7121.png and b/public/images/emoji/facebook_messenger/u7121.png differ diff --git a/public/images/emoji/facebook_messenger/u7533.png b/public/images/emoji/facebook_messenger/u7533.png index 2300499e3e..45a60937ac 100644 Binary files a/public/images/emoji/facebook_messenger/u7533.png and b/public/images/emoji/facebook_messenger/u7533.png differ diff --git a/public/images/emoji/facebook_messenger/u7981.png b/public/images/emoji/facebook_messenger/u7981.png index 489e87cad9..de5c782953 100644 Binary files a/public/images/emoji/facebook_messenger/u7981.png and b/public/images/emoji/facebook_messenger/u7981.png differ diff --git a/public/images/emoji/facebook_messenger/u7a7a.png b/public/images/emoji/facebook_messenger/u7a7a.png index 4b01a34b75..58d13fc6fa 100644 Binary files a/public/images/emoji/facebook_messenger/u7a7a.png and b/public/images/emoji/facebook_messenger/u7a7a.png differ diff --git a/public/images/emoji/facebook_messenger/uganda.png b/public/images/emoji/facebook_messenger/uganda.png index 8d6457b496..fe6536cfba 100644 Binary files a/public/images/emoji/facebook_messenger/uganda.png and b/public/images/emoji/facebook_messenger/uganda.png differ diff --git a/public/images/emoji/facebook_messenger/uk.png b/public/images/emoji/facebook_messenger/uk.png index 8ba8cda3ac..9064418988 100644 Binary files a/public/images/emoji/facebook_messenger/uk.png and b/public/images/emoji/facebook_messenger/uk.png differ diff --git a/public/images/emoji/facebook_messenger/ukraine.png b/public/images/emoji/facebook_messenger/ukraine.png index ca0845ef17..6df477917e 100644 Binary files a/public/images/emoji/facebook_messenger/ukraine.png and b/public/images/emoji/facebook_messenger/ukraine.png differ diff --git a/public/images/emoji/facebook_messenger/umbrella.png b/public/images/emoji/facebook_messenger/umbrella.png index f4b2475b4d..f5094eed13 100644 Binary files a/public/images/emoji/facebook_messenger/umbrella.png and b/public/images/emoji/facebook_messenger/umbrella.png differ diff --git a/public/images/emoji/facebook_messenger/umbrella2.png b/public/images/emoji/facebook_messenger/umbrella2.png index d84b97cb0c..0e5414f9a9 100644 Binary files a/public/images/emoji/facebook_messenger/umbrella2.png and b/public/images/emoji/facebook_messenger/umbrella2.png differ diff --git a/public/images/emoji/facebook_messenger/umbrella_on_ground.png b/public/images/emoji/facebook_messenger/umbrella_on_ground.png index 946097af1c..3239fb774e 100644 Binary files a/public/images/emoji/facebook_messenger/umbrella_on_ground.png and b/public/images/emoji/facebook_messenger/umbrella_on_ground.png differ diff --git a/public/images/emoji/facebook_messenger/unamused.png b/public/images/emoji/facebook_messenger/unamused.png index cc89284c39..fb8745db2e 100644 Binary files a/public/images/emoji/facebook_messenger/unamused.png and b/public/images/emoji/facebook_messenger/unamused.png differ diff --git a/public/images/emoji/facebook_messenger/underage.png b/public/images/emoji/facebook_messenger/underage.png index 7bbe01d86a..a585ac6c2c 100644 Binary files a/public/images/emoji/facebook_messenger/underage.png and b/public/images/emoji/facebook_messenger/underage.png differ diff --git a/public/images/emoji/facebook_messenger/unicorn.png b/public/images/emoji/facebook_messenger/unicorn.png index 82f69e1c5c..347047435d 100644 Binary files a/public/images/emoji/facebook_messenger/unicorn.png and b/public/images/emoji/facebook_messenger/unicorn.png differ diff --git a/public/images/emoji/facebook_messenger/unicorn_face.png b/public/images/emoji/facebook_messenger/unicorn_face.png index 82f69e1c5c..347047435d 100644 Binary files a/public/images/emoji/facebook_messenger/unicorn_face.png and b/public/images/emoji/facebook_messenger/unicorn_face.png differ diff --git a/public/images/emoji/facebook_messenger/united_arab_emirates.png b/public/images/emoji/facebook_messenger/united_arab_emirates.png index 808d5c203d..10b238d1e2 100644 Binary files a/public/images/emoji/facebook_messenger/united_arab_emirates.png and b/public/images/emoji/facebook_messenger/united_arab_emirates.png differ diff --git a/public/images/emoji/facebook_messenger/united_nations.png b/public/images/emoji/facebook_messenger/united_nations.png index 5b27fad62a..55bdc60e1d 100644 Binary files a/public/images/emoji/facebook_messenger/united_nations.png and b/public/images/emoji/facebook_messenger/united_nations.png differ diff --git a/public/images/emoji/facebook_messenger/unlock.png b/public/images/emoji/facebook_messenger/unlock.png index 1a4f4f8c79..9d3867d897 100644 Binary files a/public/images/emoji/facebook_messenger/unlock.png and b/public/images/emoji/facebook_messenger/unlock.png differ diff --git a/public/images/emoji/facebook_messenger/up.png b/public/images/emoji/facebook_messenger/up.png index f6732b83b2..13f4d9816e 100644 Binary files a/public/images/emoji/facebook_messenger/up.png and b/public/images/emoji/facebook_messenger/up.png differ diff --git a/public/images/emoji/facebook_messenger/upside_down.png b/public/images/emoji/facebook_messenger/upside_down.png index 8cb26e5968..87d7578870 100644 Binary files a/public/images/emoji/facebook_messenger/upside_down.png and b/public/images/emoji/facebook_messenger/upside_down.png differ diff --git a/public/images/emoji/facebook_messenger/upside_down_face.png b/public/images/emoji/facebook_messenger/upside_down_face.png index 8cb26e5968..87d7578870 100644 Binary files a/public/images/emoji/facebook_messenger/upside_down_face.png and b/public/images/emoji/facebook_messenger/upside_down_face.png differ diff --git a/public/images/emoji/facebook_messenger/urn.png b/public/images/emoji/facebook_messenger/urn.png index 818fa27fb8..3605e4e15f 100644 Binary files a/public/images/emoji/facebook_messenger/urn.png and b/public/images/emoji/facebook_messenger/urn.png differ diff --git a/public/images/emoji/facebook_messenger/uruguay.png b/public/images/emoji/facebook_messenger/uruguay.png index 7a8a93ca67..73892fcaae 100644 Binary files a/public/images/emoji/facebook_messenger/uruguay.png and b/public/images/emoji/facebook_messenger/uruguay.png differ diff --git a/public/images/emoji/facebook_messenger/us.png b/public/images/emoji/facebook_messenger/us.png index 103498e009..edbed579fc 100644 Binary files a/public/images/emoji/facebook_messenger/us.png and b/public/images/emoji/facebook_messenger/us.png differ diff --git a/public/images/emoji/facebook_messenger/us_outlying_islands.png b/public/images/emoji/facebook_messenger/us_outlying_islands.png index 103498e009..edbed579fc 100644 Binary files a/public/images/emoji/facebook_messenger/us_outlying_islands.png and b/public/images/emoji/facebook_messenger/us_outlying_islands.png differ diff --git a/public/images/emoji/facebook_messenger/us_virgin_islands.png b/public/images/emoji/facebook_messenger/us_virgin_islands.png index b4f7cd6f27..14f7797800 100644 Binary files a/public/images/emoji/facebook_messenger/us_virgin_islands.png and b/public/images/emoji/facebook_messenger/us_virgin_islands.png differ diff --git a/public/images/emoji/facebook_messenger/uzbekistan.png b/public/images/emoji/facebook_messenger/uzbekistan.png index 887f5016ab..c2427ae952 100644 Binary files a/public/images/emoji/facebook_messenger/uzbekistan.png and b/public/images/emoji/facebook_messenger/uzbekistan.png differ diff --git a/public/images/emoji/facebook_messenger/v.png b/public/images/emoji/facebook_messenger/v.png index 0518ccd01a..58e1f190e8 100644 Binary files a/public/images/emoji/facebook_messenger/v.png and b/public/images/emoji/facebook_messenger/v.png differ diff --git a/public/images/emoji/facebook_messenger/vampire.png b/public/images/emoji/facebook_messenger/vampire.png index 3f8b0cc23f..a09fb748ca 100644 Binary files a/public/images/emoji/facebook_messenger/vampire.png and b/public/images/emoji/facebook_messenger/vampire.png differ diff --git a/public/images/emoji/facebook_messenger/vanuatu.png b/public/images/emoji/facebook_messenger/vanuatu.png index 068442e937..f8819eb46a 100644 Binary files a/public/images/emoji/facebook_messenger/vanuatu.png and b/public/images/emoji/facebook_messenger/vanuatu.png differ diff --git a/public/images/emoji/facebook_messenger/vatican_city.png b/public/images/emoji/facebook_messenger/vatican_city.png index e38e58bb8b..eeb778f843 100644 Binary files a/public/images/emoji/facebook_messenger/vatican_city.png and b/public/images/emoji/facebook_messenger/vatican_city.png differ diff --git a/public/images/emoji/facebook_messenger/venezuela.png b/public/images/emoji/facebook_messenger/venezuela.png index 177c0326af..c214ad8daf 100644 Binary files a/public/images/emoji/facebook_messenger/venezuela.png and b/public/images/emoji/facebook_messenger/venezuela.png differ diff --git a/public/images/emoji/facebook_messenger/vertical_traffic_light.png b/public/images/emoji/facebook_messenger/vertical_traffic_light.png index 6721eb9b54..ee5452ebe1 100644 Binary files a/public/images/emoji/facebook_messenger/vertical_traffic_light.png and b/public/images/emoji/facebook_messenger/vertical_traffic_light.png differ diff --git a/public/images/emoji/facebook_messenger/vhs.png b/public/images/emoji/facebook_messenger/vhs.png index 76058d7c5d..b435cf7c14 100644 Binary files a/public/images/emoji/facebook_messenger/vhs.png and b/public/images/emoji/facebook_messenger/vhs.png differ diff --git a/public/images/emoji/facebook_messenger/vibration_mode.png b/public/images/emoji/facebook_messenger/vibration_mode.png index 02151e2ba6..5d5452b4c0 100644 Binary files a/public/images/emoji/facebook_messenger/vibration_mode.png and b/public/images/emoji/facebook_messenger/vibration_mode.png differ diff --git a/public/images/emoji/facebook_messenger/video_camera.png b/public/images/emoji/facebook_messenger/video_camera.png index a116affff5..a8267355d1 100644 Binary files a/public/images/emoji/facebook_messenger/video_camera.png and b/public/images/emoji/facebook_messenger/video_camera.png differ diff --git a/public/images/emoji/facebook_messenger/video_game.png b/public/images/emoji/facebook_messenger/video_game.png index c1e5d534da..ca339c8665 100644 Binary files a/public/images/emoji/facebook_messenger/video_game.png and b/public/images/emoji/facebook_messenger/video_game.png differ diff --git a/public/images/emoji/facebook_messenger/vietnam.png b/public/images/emoji/facebook_messenger/vietnam.png index e23af84a1e..dde0df17ad 100644 Binary files a/public/images/emoji/facebook_messenger/vietnam.png and b/public/images/emoji/facebook_messenger/vietnam.png differ diff --git a/public/images/emoji/facebook_messenger/violin.png b/public/images/emoji/facebook_messenger/violin.png index a37cee2212..fa69a55a86 100644 Binary files a/public/images/emoji/facebook_messenger/violin.png and b/public/images/emoji/facebook_messenger/violin.png differ diff --git a/public/images/emoji/facebook_messenger/virgo.png b/public/images/emoji/facebook_messenger/virgo.png index 584296d404..3324f7f9b4 100644 Binary files a/public/images/emoji/facebook_messenger/virgo.png and b/public/images/emoji/facebook_messenger/virgo.png differ diff --git a/public/images/emoji/facebook_messenger/volcano.png b/public/images/emoji/facebook_messenger/volcano.png index 40ae1681f4..426004e432 100644 Binary files a/public/images/emoji/facebook_messenger/volcano.png and b/public/images/emoji/facebook_messenger/volcano.png differ diff --git a/public/images/emoji/facebook_messenger/volleyball.png b/public/images/emoji/facebook_messenger/volleyball.png index 1ff3855a5e..df44e99d23 100644 Binary files a/public/images/emoji/facebook_messenger/volleyball.png and b/public/images/emoji/facebook_messenger/volleyball.png differ diff --git a/public/images/emoji/facebook_messenger/vs.png b/public/images/emoji/facebook_messenger/vs.png index 5e9b02045e..f0d8d5c34f 100644 Binary files a/public/images/emoji/facebook_messenger/vs.png and b/public/images/emoji/facebook_messenger/vs.png differ diff --git a/public/images/emoji/facebook_messenger/vulcan.png b/public/images/emoji/facebook_messenger/vulcan.png index af49237861..d217c8e52e 100644 Binary files a/public/images/emoji/facebook_messenger/vulcan.png and b/public/images/emoji/facebook_messenger/vulcan.png differ diff --git a/public/images/emoji/facebook_messenger/vulcan_salute.png b/public/images/emoji/facebook_messenger/vulcan_salute.png index af49237861..d217c8e52e 100644 Binary files a/public/images/emoji/facebook_messenger/vulcan_salute.png and b/public/images/emoji/facebook_messenger/vulcan_salute.png differ diff --git a/public/images/emoji/facebook_messenger/walking.png b/public/images/emoji/facebook_messenger/walking.png index 5805c83f64..40622dea11 100644 Binary files a/public/images/emoji/facebook_messenger/walking.png and b/public/images/emoji/facebook_messenger/walking.png differ diff --git a/public/images/emoji/facebook_messenger/walking_man.png b/public/images/emoji/facebook_messenger/walking_man.png index 5805c83f64..40622dea11 100644 Binary files a/public/images/emoji/facebook_messenger/walking_man.png and b/public/images/emoji/facebook_messenger/walking_man.png differ diff --git a/public/images/emoji/facebook_messenger/walking_woman.png b/public/images/emoji/facebook_messenger/walking_woman.png index 4815b287d7..c78dfcd9e1 100644 Binary files a/public/images/emoji/facebook_messenger/walking_woman.png and b/public/images/emoji/facebook_messenger/walking_woman.png differ diff --git a/public/images/emoji/facebook_messenger/wallis_futuna.png b/public/images/emoji/facebook_messenger/wallis_futuna.png index 3330920745..224f1e0c76 100644 Binary files a/public/images/emoji/facebook_messenger/wallis_futuna.png and b/public/images/emoji/facebook_messenger/wallis_futuna.png differ diff --git a/public/images/emoji/facebook_messenger/waning_crescent_moon.png b/public/images/emoji/facebook_messenger/waning_crescent_moon.png index 1320dfb8b2..6955a01464 100644 Binary files a/public/images/emoji/facebook_messenger/waning_crescent_moon.png and b/public/images/emoji/facebook_messenger/waning_crescent_moon.png differ diff --git a/public/images/emoji/facebook_messenger/waning_gibbous_moon.png b/public/images/emoji/facebook_messenger/waning_gibbous_moon.png index 3ec83220db..be84e2c946 100644 Binary files a/public/images/emoji/facebook_messenger/waning_gibbous_moon.png and b/public/images/emoji/facebook_messenger/waning_gibbous_moon.png differ diff --git a/public/images/emoji/facebook_messenger/warning.png b/public/images/emoji/facebook_messenger/warning.png index c4b09beb7c..b7f79b8f07 100644 Binary files a/public/images/emoji/facebook_messenger/warning.png and b/public/images/emoji/facebook_messenger/warning.png differ diff --git a/public/images/emoji/facebook_messenger/wastebasket.png b/public/images/emoji/facebook_messenger/wastebasket.png index 94f3b10113..043c8a153e 100644 Binary files a/public/images/emoji/facebook_messenger/wastebasket.png and b/public/images/emoji/facebook_messenger/wastebasket.png differ diff --git a/public/images/emoji/facebook_messenger/watch.png b/public/images/emoji/facebook_messenger/watch.png index b245572fa6..27a82bc995 100644 Binary files a/public/images/emoji/facebook_messenger/watch.png and b/public/images/emoji/facebook_messenger/watch.png differ diff --git a/public/images/emoji/facebook_messenger/water_buffalo.png b/public/images/emoji/facebook_messenger/water_buffalo.png index 3c99cb0157..20f3c74168 100644 Binary files a/public/images/emoji/facebook_messenger/water_buffalo.png and b/public/images/emoji/facebook_messenger/water_buffalo.png differ diff --git a/public/images/emoji/facebook_messenger/watermelon.png b/public/images/emoji/facebook_messenger/watermelon.png index d901fc0a6c..8e0900dc4e 100644 Binary files a/public/images/emoji/facebook_messenger/watermelon.png and b/public/images/emoji/facebook_messenger/watermelon.png differ diff --git a/public/images/emoji/facebook_messenger/wave.png b/public/images/emoji/facebook_messenger/wave.png index 3deca9f946..887bceafd3 100644 Binary files a/public/images/emoji/facebook_messenger/wave.png and b/public/images/emoji/facebook_messenger/wave.png differ diff --git a/public/images/emoji/facebook_messenger/waving_black_flag.png b/public/images/emoji/facebook_messenger/waving_black_flag.png index bc52913998..cf62460cc1 100644 Binary files a/public/images/emoji/facebook_messenger/waving_black_flag.png and b/public/images/emoji/facebook_messenger/waving_black_flag.png differ diff --git a/public/images/emoji/facebook_messenger/waving_white_flag.png b/public/images/emoji/facebook_messenger/waving_white_flag.png index 34dfcb802a..5be38ef018 100644 Binary files a/public/images/emoji/facebook_messenger/waving_white_flag.png and b/public/images/emoji/facebook_messenger/waving_white_flag.png differ diff --git a/public/images/emoji/facebook_messenger/wavy_dash.png b/public/images/emoji/facebook_messenger/wavy_dash.png index 4d8d75af54..72b59ef143 100644 Binary files a/public/images/emoji/facebook_messenger/wavy_dash.png and b/public/images/emoji/facebook_messenger/wavy_dash.png differ diff --git a/public/images/emoji/facebook_messenger/waxing_crescent_moon.png b/public/images/emoji/facebook_messenger/waxing_crescent_moon.png index 29c239ac4a..e42ad56f83 100644 Binary files a/public/images/emoji/facebook_messenger/waxing_crescent_moon.png and b/public/images/emoji/facebook_messenger/waxing_crescent_moon.png differ diff --git a/public/images/emoji/facebook_messenger/waxing_gibbous_moon.png b/public/images/emoji/facebook_messenger/waxing_gibbous_moon.png index 3fe69a7631..7762b73e76 100644 Binary files a/public/images/emoji/facebook_messenger/waxing_gibbous_moon.png and b/public/images/emoji/facebook_messenger/waxing_gibbous_moon.png differ diff --git a/public/images/emoji/facebook_messenger/wc.png b/public/images/emoji/facebook_messenger/wc.png index b22fc41385..abf9725131 100644 Binary files a/public/images/emoji/facebook_messenger/wc.png and b/public/images/emoji/facebook_messenger/wc.png differ diff --git a/public/images/emoji/facebook_messenger/weary.png b/public/images/emoji/facebook_messenger/weary.png index edf1b9b1a4..9b35390a90 100644 Binary files a/public/images/emoji/facebook_messenger/weary.png and b/public/images/emoji/facebook_messenger/weary.png differ diff --git a/public/images/emoji/facebook_messenger/wedding.png b/public/images/emoji/facebook_messenger/wedding.png index daa3309313..16e7ce471b 100644 Binary files a/public/images/emoji/facebook_messenger/wedding.png and b/public/images/emoji/facebook_messenger/wedding.png differ diff --git a/public/images/emoji/facebook_messenger/weight_lifter.png b/public/images/emoji/facebook_messenger/weight_lifter.png index 1ce6966153..b9b6ab8259 100644 Binary files a/public/images/emoji/facebook_messenger/weight_lifter.png and b/public/images/emoji/facebook_messenger/weight_lifter.png differ diff --git a/public/images/emoji/facebook_messenger/weight_lifting_man.png b/public/images/emoji/facebook_messenger/weight_lifting_man.png index 1ce6966153..b9b6ab8259 100644 Binary files a/public/images/emoji/facebook_messenger/weight_lifting_man.png and b/public/images/emoji/facebook_messenger/weight_lifting_man.png differ diff --git a/public/images/emoji/facebook_messenger/weight_lifting_woman.png b/public/images/emoji/facebook_messenger/weight_lifting_woman.png index 2c58497d14..820ac9f35a 100644 Binary files a/public/images/emoji/facebook_messenger/weight_lifting_woman.png and b/public/images/emoji/facebook_messenger/weight_lifting_woman.png differ diff --git a/public/images/emoji/facebook_messenger/western_sahara.png b/public/images/emoji/facebook_messenger/western_sahara.png index 2492b90de6..ebd13c19c0 100644 Binary files a/public/images/emoji/facebook_messenger/western_sahara.png and b/public/images/emoji/facebook_messenger/western_sahara.png differ diff --git a/public/images/emoji/facebook_messenger/whale.png b/public/images/emoji/facebook_messenger/whale.png index 94486fb19f..d18cc3f09c 100644 Binary files a/public/images/emoji/facebook_messenger/whale.png and b/public/images/emoji/facebook_messenger/whale.png differ diff --git a/public/images/emoji/facebook_messenger/whale2.png b/public/images/emoji/facebook_messenger/whale2.png index 4463fc2a4e..01e14ef8d4 100644 Binary files a/public/images/emoji/facebook_messenger/whale2.png and b/public/images/emoji/facebook_messenger/whale2.png differ diff --git a/public/images/emoji/facebook_messenger/wheel_of_dharma.png b/public/images/emoji/facebook_messenger/wheel_of_dharma.png index 0ba685ffa9..a514353d6d 100644 Binary files a/public/images/emoji/facebook_messenger/wheel_of_dharma.png and b/public/images/emoji/facebook_messenger/wheel_of_dharma.png differ diff --git a/public/images/emoji/facebook_messenger/wheelchair.png b/public/images/emoji/facebook_messenger/wheelchair.png index a0470f71ce..b78e6439d1 100644 Binary files a/public/images/emoji/facebook_messenger/wheelchair.png and b/public/images/emoji/facebook_messenger/wheelchair.png differ diff --git a/public/images/emoji/facebook_messenger/white_check_mark.png b/public/images/emoji/facebook_messenger/white_check_mark.png index 1f1fe8a9dd..10378d5806 100644 Binary files a/public/images/emoji/facebook_messenger/white_check_mark.png and b/public/images/emoji/facebook_messenger/white_check_mark.png differ diff --git a/public/images/emoji/facebook_messenger/white_circle.png b/public/images/emoji/facebook_messenger/white_circle.png index 69710af3c2..d302fde5d4 100644 Binary files a/public/images/emoji/facebook_messenger/white_circle.png and b/public/images/emoji/facebook_messenger/white_circle.png differ diff --git a/public/images/emoji/facebook_messenger/white_flag.png b/public/images/emoji/facebook_messenger/white_flag.png index 34dfcb802a..5be38ef018 100644 Binary files a/public/images/emoji/facebook_messenger/white_flag.png and b/public/images/emoji/facebook_messenger/white_flag.png differ diff --git a/public/images/emoji/facebook_messenger/white_flower.png b/public/images/emoji/facebook_messenger/white_flower.png index 7762659e8b..355d937a35 100644 Binary files a/public/images/emoji/facebook_messenger/white_flower.png and b/public/images/emoji/facebook_messenger/white_flower.png differ diff --git a/public/images/emoji/facebook_messenger/white_frowning_face.png b/public/images/emoji/facebook_messenger/white_frowning_face.png index e35c8cec02..5bd72b3eb4 100644 Binary files a/public/images/emoji/facebook_messenger/white_frowning_face.png and b/public/images/emoji/facebook_messenger/white_frowning_face.png differ diff --git a/public/images/emoji/facebook_messenger/white_large_square.png b/public/images/emoji/facebook_messenger/white_large_square.png index de0cffdc2f..23629e6744 100644 Binary files a/public/images/emoji/facebook_messenger/white_large_square.png and b/public/images/emoji/facebook_messenger/white_large_square.png differ diff --git a/public/images/emoji/facebook_messenger/white_medium_small_square.png b/public/images/emoji/facebook_messenger/white_medium_small_square.png index c3674c5635..99892b1220 100644 Binary files a/public/images/emoji/facebook_messenger/white_medium_small_square.png and b/public/images/emoji/facebook_messenger/white_medium_small_square.png differ diff --git a/public/images/emoji/facebook_messenger/white_medium_square.png b/public/images/emoji/facebook_messenger/white_medium_square.png index a77236a218..784623044e 100644 Binary files a/public/images/emoji/facebook_messenger/white_medium_square.png and b/public/images/emoji/facebook_messenger/white_medium_square.png differ diff --git a/public/images/emoji/facebook_messenger/white_small_square.png b/public/images/emoji/facebook_messenger/white_small_square.png index 4ef6be8258..486b2f79fb 100644 Binary files a/public/images/emoji/facebook_messenger/white_small_square.png and b/public/images/emoji/facebook_messenger/white_small_square.png differ diff --git a/public/images/emoji/facebook_messenger/white_square_button.png b/public/images/emoji/facebook_messenger/white_square_button.png index ce68bbbef7..8b8e590a6a 100644 Binary files a/public/images/emoji/facebook_messenger/white_square_button.png and b/public/images/emoji/facebook_messenger/white_square_button.png differ diff --git a/public/images/emoji/facebook_messenger/white_sun_behind_cloud.png b/public/images/emoji/facebook_messenger/white_sun_behind_cloud.png index 17a5f1ff82..8814836a8b 100644 Binary files a/public/images/emoji/facebook_messenger/white_sun_behind_cloud.png and b/public/images/emoji/facebook_messenger/white_sun_behind_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/white_sun_behind_cloud_with_rain.png b/public/images/emoji/facebook_messenger/white_sun_behind_cloud_with_rain.png index ec92c38a2b..e8df44e7b1 100644 Binary files a/public/images/emoji/facebook_messenger/white_sun_behind_cloud_with_rain.png and b/public/images/emoji/facebook_messenger/white_sun_behind_cloud_with_rain.png differ diff --git a/public/images/emoji/facebook_messenger/white_sun_cloud.png b/public/images/emoji/facebook_messenger/white_sun_cloud.png index 17a5f1ff82..8814836a8b 100644 Binary files a/public/images/emoji/facebook_messenger/white_sun_cloud.png and b/public/images/emoji/facebook_messenger/white_sun_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/white_sun_rain_cloud.png b/public/images/emoji/facebook_messenger/white_sun_rain_cloud.png index ec92c38a2b..e8df44e7b1 100644 Binary files a/public/images/emoji/facebook_messenger/white_sun_rain_cloud.png and b/public/images/emoji/facebook_messenger/white_sun_rain_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/white_sun_small_cloud.png b/public/images/emoji/facebook_messenger/white_sun_small_cloud.png index 8258b2f793..b4f3e1bdfa 100644 Binary files a/public/images/emoji/facebook_messenger/white_sun_small_cloud.png and b/public/images/emoji/facebook_messenger/white_sun_small_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/white_sun_with_small_cloud.png b/public/images/emoji/facebook_messenger/white_sun_with_small_cloud.png index 8258b2f793..b4f3e1bdfa 100644 Binary files a/public/images/emoji/facebook_messenger/white_sun_with_small_cloud.png and b/public/images/emoji/facebook_messenger/white_sun_with_small_cloud.png differ diff --git a/public/images/emoji/facebook_messenger/wilted_flower.png b/public/images/emoji/facebook_messenger/wilted_flower.png index f858df1886..4a58672811 100644 Binary files a/public/images/emoji/facebook_messenger/wilted_flower.png and b/public/images/emoji/facebook_messenger/wilted_flower.png differ diff --git a/public/images/emoji/facebook_messenger/wind_blowing_face.png b/public/images/emoji/facebook_messenger/wind_blowing_face.png index 5b7f972f44..0a3f6a4255 100644 Binary files a/public/images/emoji/facebook_messenger/wind_blowing_face.png and b/public/images/emoji/facebook_messenger/wind_blowing_face.png differ diff --git a/public/images/emoji/facebook_messenger/wind_chime.png b/public/images/emoji/facebook_messenger/wind_chime.png index b32d537e64..94ef49f113 100644 Binary files a/public/images/emoji/facebook_messenger/wind_chime.png and b/public/images/emoji/facebook_messenger/wind_chime.png differ diff --git a/public/images/emoji/facebook_messenger/wind_face.png b/public/images/emoji/facebook_messenger/wind_face.png index 5b7f972f44..0a3f6a4255 100644 Binary files a/public/images/emoji/facebook_messenger/wind_face.png and b/public/images/emoji/facebook_messenger/wind_face.png differ diff --git a/public/images/emoji/facebook_messenger/wine_glass.png b/public/images/emoji/facebook_messenger/wine_glass.png index e4d124c360..0939b1b706 100644 Binary files a/public/images/emoji/facebook_messenger/wine_glass.png and b/public/images/emoji/facebook_messenger/wine_glass.png differ diff --git a/public/images/emoji/facebook_messenger/wink.png b/public/images/emoji/facebook_messenger/wink.png index 52da6c4d18..3017176a3d 100644 Binary files a/public/images/emoji/facebook_messenger/wink.png and b/public/images/emoji/facebook_messenger/wink.png differ diff --git a/public/images/emoji/facebook_messenger/wolf.png b/public/images/emoji/facebook_messenger/wolf.png index 8cd9baec98..ce5ad24c3b 100644 Binary files a/public/images/emoji/facebook_messenger/wolf.png and b/public/images/emoji/facebook_messenger/wolf.png differ diff --git a/public/images/emoji/facebook_messenger/woman.png b/public/images/emoji/facebook_messenger/woman.png index c4a18fd7ff..786cf6dfe5 100644 Binary files a/public/images/emoji/facebook_messenger/woman.png and b/public/images/emoji/facebook_messenger/woman.png differ diff --git a/public/images/emoji/facebook_messenger/woman_artist.png b/public/images/emoji/facebook_messenger/woman_artist.png index d2ad4d7589..124d8fc2b7 100644 Binary files a/public/images/emoji/facebook_messenger/woman_artist.png and b/public/images/emoji/facebook_messenger/woman_artist.png differ diff --git a/public/images/emoji/facebook_messenger/woman_astronaut.png b/public/images/emoji/facebook_messenger/woman_astronaut.png index 40f8b2cf10..f2c77dc8b6 100644 Binary files a/public/images/emoji/facebook_messenger/woman_astronaut.png and b/public/images/emoji/facebook_messenger/woman_astronaut.png differ diff --git a/public/images/emoji/facebook_messenger/woman_bald.png b/public/images/emoji/facebook_messenger/woman_bald.png new file mode 100644 index 0000000000..2fe69f9458 Binary files /dev/null and b/public/images/emoji/facebook_messenger/woman_bald.png differ diff --git a/public/images/emoji/facebook_messenger/woman_cartwheeling.png b/public/images/emoji/facebook_messenger/woman_cartwheeling.png index 7ae0cac2ff..5dd68cba51 100644 Binary files a/public/images/emoji/facebook_messenger/woman_cartwheeling.png and b/public/images/emoji/facebook_messenger/woman_cartwheeling.png differ diff --git a/public/images/emoji/facebook_messenger/woman_climbing.png b/public/images/emoji/facebook_messenger/woman_climbing.png index a0001a92f5..1368fd7f8d 100644 Binary files a/public/images/emoji/facebook_messenger/woman_climbing.png and b/public/images/emoji/facebook_messenger/woman_climbing.png differ diff --git a/public/images/emoji/facebook_messenger/woman_cook.png b/public/images/emoji/facebook_messenger/woman_cook.png index 3afd6c3e3f..e9f8744707 100644 Binary files a/public/images/emoji/facebook_messenger/woman_cook.png and b/public/images/emoji/facebook_messenger/woman_cook.png differ diff --git a/public/images/emoji/facebook_messenger/woman_curly_haired.png b/public/images/emoji/facebook_messenger/woman_curly_haired.png new file mode 100644 index 0000000000..02e4675748 Binary files /dev/null and b/public/images/emoji/facebook_messenger/woman_curly_haired.png differ diff --git a/public/images/emoji/facebook_messenger/woman_facepalming.png b/public/images/emoji/facebook_messenger/woman_facepalming.png index b9e200299e..6ca79e64b1 100644 Binary files a/public/images/emoji/facebook_messenger/woman_facepalming.png and b/public/images/emoji/facebook_messenger/woman_facepalming.png differ diff --git a/public/images/emoji/facebook_messenger/woman_factory_worker.png b/public/images/emoji/facebook_messenger/woman_factory_worker.png index 3db83b0a45..fe90fe1343 100644 Binary files a/public/images/emoji/facebook_messenger/woman_factory_worker.png and b/public/images/emoji/facebook_messenger/woman_factory_worker.png differ diff --git a/public/images/emoji/facebook_messenger/woman_farmer.png b/public/images/emoji/facebook_messenger/woman_farmer.png index f2c4eeee03..3168ea478b 100644 Binary files a/public/images/emoji/facebook_messenger/woman_farmer.png and b/public/images/emoji/facebook_messenger/woman_farmer.png differ diff --git a/public/images/emoji/facebook_messenger/woman_firefighter.png b/public/images/emoji/facebook_messenger/woman_firefighter.png index 1476297bdc..b7d265dde3 100644 Binary files a/public/images/emoji/facebook_messenger/woman_firefighter.png and b/public/images/emoji/facebook_messenger/woman_firefighter.png differ diff --git a/public/images/emoji/facebook_messenger/woman_genie.png b/public/images/emoji/facebook_messenger/woman_genie.png index 475a0df4cf..05dc80963b 100644 Binary files a/public/images/emoji/facebook_messenger/woman_genie.png and b/public/images/emoji/facebook_messenger/woman_genie.png differ diff --git a/public/images/emoji/facebook_messenger/woman_health_worker.png b/public/images/emoji/facebook_messenger/woman_health_worker.png index ed0c321bf8..ea88b1ce6b 100644 Binary files a/public/images/emoji/facebook_messenger/woman_health_worker.png and b/public/images/emoji/facebook_messenger/woman_health_worker.png differ diff --git a/public/images/emoji/facebook_messenger/woman_in_lotus_position.png b/public/images/emoji/facebook_messenger/woman_in_lotus_position.png index 3e265ed93e..3aaf747507 100644 Binary files a/public/images/emoji/facebook_messenger/woman_in_lotus_position.png and b/public/images/emoji/facebook_messenger/woman_in_lotus_position.png differ diff --git a/public/images/emoji/facebook_messenger/woman_in_steamy_room.png b/public/images/emoji/facebook_messenger/woman_in_steamy_room.png index 00fecc6ce1..bd9c68027f 100644 Binary files a/public/images/emoji/facebook_messenger/woman_in_steamy_room.png and b/public/images/emoji/facebook_messenger/woman_in_steamy_room.png differ diff --git a/public/images/emoji/facebook_messenger/woman_judge.png b/public/images/emoji/facebook_messenger/woman_judge.png index c90b782a4e..967c889885 100644 Binary files a/public/images/emoji/facebook_messenger/woman_judge.png and b/public/images/emoji/facebook_messenger/woman_judge.png differ diff --git a/public/images/emoji/facebook_messenger/woman_juggling.png b/public/images/emoji/facebook_messenger/woman_juggling.png index afa07527b3..96ac32c598 100644 Binary files a/public/images/emoji/facebook_messenger/woman_juggling.png and b/public/images/emoji/facebook_messenger/woman_juggling.png differ diff --git a/public/images/emoji/facebook_messenger/woman_mage.png b/public/images/emoji/facebook_messenger/woman_mage.png index 29435771b8..11ce2d50b8 100644 Binary files a/public/images/emoji/facebook_messenger/woman_mage.png and b/public/images/emoji/facebook_messenger/woman_mage.png differ diff --git a/public/images/emoji/facebook_messenger/woman_mechanic.png b/public/images/emoji/facebook_messenger/woman_mechanic.png index 5b3b9f8ff6..9331a24672 100644 Binary files a/public/images/emoji/facebook_messenger/woman_mechanic.png and b/public/images/emoji/facebook_messenger/woman_mechanic.png differ diff --git a/public/images/emoji/facebook_messenger/woman_office_worker.png b/public/images/emoji/facebook_messenger/woman_office_worker.png index 8b4e28646a..c4caca26bc 100644 Binary files a/public/images/emoji/facebook_messenger/woman_office_worker.png and b/public/images/emoji/facebook_messenger/woman_office_worker.png differ diff --git a/public/images/emoji/facebook_messenger/woman_pilot.png b/public/images/emoji/facebook_messenger/woman_pilot.png index 1962bba010..b597032bbf 100644 Binary files a/public/images/emoji/facebook_messenger/woman_pilot.png and b/public/images/emoji/facebook_messenger/woman_pilot.png differ diff --git a/public/images/emoji/facebook_messenger/woman_playing_handball.png b/public/images/emoji/facebook_messenger/woman_playing_handball.png index 9eb1c81dbf..4def4de4cd 100644 Binary files a/public/images/emoji/facebook_messenger/woman_playing_handball.png and b/public/images/emoji/facebook_messenger/woman_playing_handball.png differ diff --git a/public/images/emoji/facebook_messenger/woman_playing_water_polo.png b/public/images/emoji/facebook_messenger/woman_playing_water_polo.png index 9f1c1c7d15..e8aa21c215 100644 Binary files a/public/images/emoji/facebook_messenger/woman_playing_water_polo.png and b/public/images/emoji/facebook_messenger/woman_playing_water_polo.png differ diff --git a/public/images/emoji/facebook_messenger/woman_red_haired.png b/public/images/emoji/facebook_messenger/woman_red_haired.png new file mode 100644 index 0000000000..7d85999a79 Binary files /dev/null and b/public/images/emoji/facebook_messenger/woman_red_haired.png differ diff --git a/public/images/emoji/facebook_messenger/woman_scientist.png b/public/images/emoji/facebook_messenger/woman_scientist.png index 398ed0c15b..cee46876e5 100644 Binary files a/public/images/emoji/facebook_messenger/woman_scientist.png and b/public/images/emoji/facebook_messenger/woman_scientist.png differ diff --git a/public/images/emoji/facebook_messenger/woman_shrugging.png b/public/images/emoji/facebook_messenger/woman_shrugging.png index 128d155407..8c54930bf9 100644 Binary files a/public/images/emoji/facebook_messenger/woman_shrugging.png and b/public/images/emoji/facebook_messenger/woman_shrugging.png differ diff --git a/public/images/emoji/facebook_messenger/woman_singer.png b/public/images/emoji/facebook_messenger/woman_singer.png index 911dbe2dff..a7451547fd 100644 Binary files a/public/images/emoji/facebook_messenger/woman_singer.png and b/public/images/emoji/facebook_messenger/woman_singer.png differ diff --git a/public/images/emoji/facebook_messenger/woman_student.png b/public/images/emoji/facebook_messenger/woman_student.png index c321c0d38d..c56e23d6e2 100644 Binary files a/public/images/emoji/facebook_messenger/woman_student.png and b/public/images/emoji/facebook_messenger/woman_student.png differ diff --git a/public/images/emoji/facebook_messenger/woman_superhero.png b/public/images/emoji/facebook_messenger/woman_superhero.png new file mode 100644 index 0000000000..153a0cf66a Binary files /dev/null and b/public/images/emoji/facebook_messenger/woman_superhero.png differ diff --git a/public/images/emoji/facebook_messenger/woman_supervillain.png b/public/images/emoji/facebook_messenger/woman_supervillain.png new file mode 100644 index 0000000000..2f941110bc Binary files /dev/null and b/public/images/emoji/facebook_messenger/woman_supervillain.png differ diff --git a/public/images/emoji/facebook_messenger/woman_teacher.png b/public/images/emoji/facebook_messenger/woman_teacher.png index 84b8d807b5..7a6992d4cc 100644 Binary files a/public/images/emoji/facebook_messenger/woman_teacher.png and b/public/images/emoji/facebook_messenger/woman_teacher.png differ diff --git a/public/images/emoji/facebook_messenger/woman_technologist.png b/public/images/emoji/facebook_messenger/woman_technologist.png index f81b5b4b6c..dbe59c1333 100644 Binary files a/public/images/emoji/facebook_messenger/woman_technologist.png and b/public/images/emoji/facebook_messenger/woman_technologist.png differ diff --git a/public/images/emoji/facebook_messenger/woman_white_haired.png b/public/images/emoji/facebook_messenger/woman_white_haired.png new file mode 100644 index 0000000000..a4a409c7e0 Binary files /dev/null and b/public/images/emoji/facebook_messenger/woman_white_haired.png differ diff --git a/public/images/emoji/facebook_messenger/woman_with_headscarf.png b/public/images/emoji/facebook_messenger/woman_with_headscarf.png index cf3f0f615c..8f781a5e61 100644 Binary files a/public/images/emoji/facebook_messenger/woman_with_headscarf.png and b/public/images/emoji/facebook_messenger/woman_with_headscarf.png differ diff --git a/public/images/emoji/facebook_messenger/woman_with_turban.png b/public/images/emoji/facebook_messenger/woman_with_turban.png index ae9465ead0..1d33f2cfdd 100644 Binary files a/public/images/emoji/facebook_messenger/woman_with_turban.png and b/public/images/emoji/facebook_messenger/woman_with_turban.png differ diff --git a/public/images/emoji/facebook_messenger/woman_zombie.png b/public/images/emoji/facebook_messenger/woman_zombie.png index 6623ffe5d3..fc2133294b 100644 Binary files a/public/images/emoji/facebook_messenger/woman_zombie.png and b/public/images/emoji/facebook_messenger/woman_zombie.png differ diff --git a/public/images/emoji/facebook_messenger/womans_clothes.png b/public/images/emoji/facebook_messenger/womans_clothes.png index 1d3125eb56..3b432ef063 100644 Binary files a/public/images/emoji/facebook_messenger/womans_clothes.png and b/public/images/emoji/facebook_messenger/womans_clothes.png differ diff --git a/public/images/emoji/facebook_messenger/womans_hat.png b/public/images/emoji/facebook_messenger/womans_hat.png index dc29f80127..a9cc8c9ab7 100644 Binary files a/public/images/emoji/facebook_messenger/womans_hat.png and b/public/images/emoji/facebook_messenger/womans_hat.png differ diff --git a/public/images/emoji/facebook_messenger/women_wrestling.png b/public/images/emoji/facebook_messenger/women_wrestling.png index fad1a7af59..ce346b3232 100644 Binary files a/public/images/emoji/facebook_messenger/women_wrestling.png and b/public/images/emoji/facebook_messenger/women_wrestling.png differ diff --git a/public/images/emoji/facebook_messenger/womens.png b/public/images/emoji/facebook_messenger/womens.png index 1a8b1d2f75..e4dea88e0c 100644 Binary files a/public/images/emoji/facebook_messenger/womens.png and b/public/images/emoji/facebook_messenger/womens.png differ diff --git a/public/images/emoji/facebook_messenger/woozy_face.png b/public/images/emoji/facebook_messenger/woozy_face.png new file mode 100644 index 0000000000..3c4a112bec Binary files /dev/null and b/public/images/emoji/facebook_messenger/woozy_face.png differ diff --git a/public/images/emoji/facebook_messenger/world_map.png b/public/images/emoji/facebook_messenger/world_map.png index f387ba2fd7..613f6de858 100644 Binary files a/public/images/emoji/facebook_messenger/world_map.png and b/public/images/emoji/facebook_messenger/world_map.png differ diff --git a/public/images/emoji/facebook_messenger/worried.png b/public/images/emoji/facebook_messenger/worried.png index ac743e0e24..a8031e1010 100644 Binary files a/public/images/emoji/facebook_messenger/worried.png and b/public/images/emoji/facebook_messenger/worried.png differ diff --git a/public/images/emoji/facebook_messenger/worship_symbol.png b/public/images/emoji/facebook_messenger/worship_symbol.png index 0f9025c3c4..e28b3e94ce 100644 Binary files a/public/images/emoji/facebook_messenger/worship_symbol.png and b/public/images/emoji/facebook_messenger/worship_symbol.png differ diff --git a/public/images/emoji/facebook_messenger/wrench.png b/public/images/emoji/facebook_messenger/wrench.png index 1b1bf131af..eac9f09139 100644 Binary files a/public/images/emoji/facebook_messenger/wrench.png and b/public/images/emoji/facebook_messenger/wrench.png differ diff --git a/public/images/emoji/facebook_messenger/writing_hand.png b/public/images/emoji/facebook_messenger/writing_hand.png index 524c4ec5c0..d8b7757f0b 100644 Binary files a/public/images/emoji/facebook_messenger/writing_hand.png and b/public/images/emoji/facebook_messenger/writing_hand.png differ diff --git a/public/images/emoji/facebook_messenger/x.png b/public/images/emoji/facebook_messenger/x.png index e73307a738..e0f4e16437 100644 Binary files a/public/images/emoji/facebook_messenger/x.png and b/public/images/emoji/facebook_messenger/x.png differ diff --git a/public/images/emoji/facebook_messenger/yarn.png b/public/images/emoji/facebook_messenger/yarn.png new file mode 100644 index 0000000000..005e38061f Binary files /dev/null and b/public/images/emoji/facebook_messenger/yarn.png differ diff --git a/public/images/emoji/facebook_messenger/yellow_heart.png b/public/images/emoji/facebook_messenger/yellow_heart.png index 8dbc5972f4..7f91d9eaca 100644 Binary files a/public/images/emoji/facebook_messenger/yellow_heart.png and b/public/images/emoji/facebook_messenger/yellow_heart.png differ diff --git a/public/images/emoji/facebook_messenger/yemen.png b/public/images/emoji/facebook_messenger/yemen.png index 56f80a8d74..914504c572 100644 Binary files a/public/images/emoji/facebook_messenger/yemen.png and b/public/images/emoji/facebook_messenger/yemen.png differ diff --git a/public/images/emoji/facebook_messenger/yen.png b/public/images/emoji/facebook_messenger/yen.png index 556fad7ed5..e5304ed203 100644 Binary files a/public/images/emoji/facebook_messenger/yen.png and b/public/images/emoji/facebook_messenger/yen.png differ diff --git a/public/images/emoji/facebook_messenger/yin_yang.png b/public/images/emoji/facebook_messenger/yin_yang.png index d37875455b..be149b44b9 100644 Binary files a/public/images/emoji/facebook_messenger/yin_yang.png and b/public/images/emoji/facebook_messenger/yin_yang.png differ diff --git a/public/images/emoji/facebook_messenger/yum.png b/public/images/emoji/facebook_messenger/yum.png index 0912dc8749..c83f7b4e4f 100644 Binary files a/public/images/emoji/facebook_messenger/yum.png and b/public/images/emoji/facebook_messenger/yum.png differ diff --git a/public/images/emoji/facebook_messenger/zambia.png b/public/images/emoji/facebook_messenger/zambia.png index 333fa806ca..a5a44762ac 100644 Binary files a/public/images/emoji/facebook_messenger/zambia.png and b/public/images/emoji/facebook_messenger/zambia.png differ diff --git a/public/images/emoji/facebook_messenger/zap.png b/public/images/emoji/facebook_messenger/zap.png index 5fbf5ee4c1..0e6f54be43 100644 Binary files a/public/images/emoji/facebook_messenger/zap.png and b/public/images/emoji/facebook_messenger/zap.png differ diff --git a/public/images/emoji/facebook_messenger/zebra.png b/public/images/emoji/facebook_messenger/zebra.png index 66dcfd1729..321ab344a5 100644 Binary files a/public/images/emoji/facebook_messenger/zebra.png and b/public/images/emoji/facebook_messenger/zebra.png differ diff --git a/public/images/emoji/facebook_messenger/zero.png b/public/images/emoji/facebook_messenger/zero.png index 9802904050..49ea9436ef 100644 Binary files a/public/images/emoji/facebook_messenger/zero.png and b/public/images/emoji/facebook_messenger/zero.png differ diff --git a/public/images/emoji/facebook_messenger/zimbabwe.png b/public/images/emoji/facebook_messenger/zimbabwe.png index 5f6e8647a3..be7d9b1ba6 100644 Binary files a/public/images/emoji/facebook_messenger/zimbabwe.png and b/public/images/emoji/facebook_messenger/zimbabwe.png differ diff --git a/public/images/emoji/facebook_messenger/zipper_mouth.png b/public/images/emoji/facebook_messenger/zipper_mouth.png index b7f5d24328..c131ff1bf5 100644 Binary files a/public/images/emoji/facebook_messenger/zipper_mouth.png and b/public/images/emoji/facebook_messenger/zipper_mouth.png differ diff --git a/public/images/emoji/facebook_messenger/zipper_mouth_face.png b/public/images/emoji/facebook_messenger/zipper_mouth_face.png index b7f5d24328..c131ff1bf5 100644 Binary files a/public/images/emoji/facebook_messenger/zipper_mouth_face.png and b/public/images/emoji/facebook_messenger/zipper_mouth_face.png differ diff --git a/public/images/emoji/facebook_messenger/zombie.png b/public/images/emoji/facebook_messenger/zombie.png index 6623ffe5d3..fc2133294b 100644 Binary files a/public/images/emoji/facebook_messenger/zombie.png and b/public/images/emoji/facebook_messenger/zombie.png differ diff --git a/public/images/emoji/facebook_messenger/zzz.png b/public/images/emoji/facebook_messenger/zzz.png index b57261cb2d..aea6f888a0 100644 Binary files a/public/images/emoji/facebook_messenger/zzz.png and b/public/images/emoji/facebook_messenger/zzz.png differ diff --git a/public/images/emoji/google/+1.png b/public/images/emoji/google/+1.png index 7e440eb6a8..9fc102006f 100644 Binary files a/public/images/emoji/google/+1.png and b/public/images/emoji/google/+1.png differ diff --git a/public/images/emoji/google/-1.png b/public/images/emoji/google/-1.png index 01e3d0ffa1..8fc6baacfb 100644 Binary files a/public/images/emoji/google/-1.png and b/public/images/emoji/google/-1.png differ diff --git a/public/images/emoji/google/100.png b/public/images/emoji/google/100.png index 947d38dc2f..9083c3aed2 100644 Binary files a/public/images/emoji/google/100.png and b/public/images/emoji/google/100.png differ diff --git a/public/images/emoji/google/1234.png b/public/images/emoji/google/1234.png index 4c52b73db1..bd7d731119 100644 Binary files a/public/images/emoji/google/1234.png and b/public/images/emoji/google/1234.png differ diff --git a/public/images/emoji/google/1st_place_medal.png b/public/images/emoji/google/1st_place_medal.png index 27865431cb..cc1b09857d 100644 Binary files a/public/images/emoji/google/1st_place_medal.png and b/public/images/emoji/google/1st_place_medal.png differ diff --git a/public/images/emoji/google/2nd_place_medal.png b/public/images/emoji/google/2nd_place_medal.png index f49b7bc555..60fd039694 100644 Binary files a/public/images/emoji/google/2nd_place_medal.png and b/public/images/emoji/google/2nd_place_medal.png differ diff --git a/public/images/emoji/google/3rd_place_medal.png b/public/images/emoji/google/3rd_place_medal.png index 474e5890f6..3e0ed0dcce 100644 Binary files a/public/images/emoji/google/3rd_place_medal.png and b/public/images/emoji/google/3rd_place_medal.png differ diff --git a/public/images/emoji/google/8ball.png b/public/images/emoji/google/8ball.png index 731079eb75..ce7ce0b175 100644 Binary files a/public/images/emoji/google/8ball.png and b/public/images/emoji/google/8ball.png differ diff --git a/public/images/emoji/google/a.png b/public/images/emoji/google/a.png index dcc2e925cd..49f462240a 100644 Binary files a/public/images/emoji/google/a.png and b/public/images/emoji/google/a.png differ diff --git a/public/images/emoji/google/ab.png b/public/images/emoji/google/ab.png index bc47162054..686e289a99 100644 Binary files a/public/images/emoji/google/ab.png and b/public/images/emoji/google/ab.png differ diff --git a/public/images/emoji/google/abacus.png b/public/images/emoji/google/abacus.png new file mode 100644 index 0000000000..b23f3819d9 Binary files /dev/null and b/public/images/emoji/google/abacus.png differ diff --git a/public/images/emoji/google/abc.png b/public/images/emoji/google/abc.png index 0aa4d7fa44..e8fe8dc8fa 100644 Binary files a/public/images/emoji/google/abc.png and b/public/images/emoji/google/abc.png differ diff --git a/public/images/emoji/google/abcd.png b/public/images/emoji/google/abcd.png index 7f5c5cd679..3cda3fcef6 100644 Binary files a/public/images/emoji/google/abcd.png and b/public/images/emoji/google/abcd.png differ diff --git a/public/images/emoji/google/accept.png b/public/images/emoji/google/accept.png index 85ac66b4ed..10e7694636 100644 Binary files a/public/images/emoji/google/accept.png and b/public/images/emoji/google/accept.png differ diff --git a/public/images/emoji/google/admission_tickets.png b/public/images/emoji/google/admission_tickets.png index 64ccba10db..ab18fb2141 100644 Binary files a/public/images/emoji/google/admission_tickets.png and b/public/images/emoji/google/admission_tickets.png differ diff --git a/public/images/emoji/google/adult.png b/public/images/emoji/google/adult.png index 48535bf92d..0b91d3bfbf 100644 Binary files a/public/images/emoji/google/adult.png and b/public/images/emoji/google/adult.png differ diff --git a/public/images/emoji/google/aerial_tramway.png b/public/images/emoji/google/aerial_tramway.png index 0e66e38b1f..84629a539b 100644 Binary files a/public/images/emoji/google/aerial_tramway.png and b/public/images/emoji/google/aerial_tramway.png differ diff --git a/public/images/emoji/google/afghanistan.png b/public/images/emoji/google/afghanistan.png index 4872b2f545..745f90a37d 100644 Binary files a/public/images/emoji/google/afghanistan.png and b/public/images/emoji/google/afghanistan.png differ diff --git a/public/images/emoji/google/airplane.png b/public/images/emoji/google/airplane.png index 482fb4f4ae..8032ca72ca 100644 Binary files a/public/images/emoji/google/airplane.png and b/public/images/emoji/google/airplane.png differ diff --git a/public/images/emoji/google/airplane_arriving.png b/public/images/emoji/google/airplane_arriving.png index baf6de740c..bc4ceda97d 100644 Binary files a/public/images/emoji/google/airplane_arriving.png and b/public/images/emoji/google/airplane_arriving.png differ diff --git a/public/images/emoji/google/airplane_departure.png b/public/images/emoji/google/airplane_departure.png index c5b13dc088..f40b696d58 100644 Binary files a/public/images/emoji/google/airplane_departure.png and b/public/images/emoji/google/airplane_departure.png differ diff --git a/public/images/emoji/google/airplane_small.png b/public/images/emoji/google/airplane_small.png index 1a44e4a7d1..5e589b26d6 100644 Binary files a/public/images/emoji/google/airplane_small.png and b/public/images/emoji/google/airplane_small.png differ diff --git a/public/images/emoji/google/aland_islands.png b/public/images/emoji/google/aland_islands.png index 5a1349cf6a..b5ab91d2c1 100644 Binary files a/public/images/emoji/google/aland_islands.png and b/public/images/emoji/google/aland_islands.png differ diff --git a/public/images/emoji/google/alarm_clock.png b/public/images/emoji/google/alarm_clock.png index 3ad07b27e5..f1094c4853 100644 Binary files a/public/images/emoji/google/alarm_clock.png and b/public/images/emoji/google/alarm_clock.png differ diff --git a/public/images/emoji/google/albania.png b/public/images/emoji/google/albania.png index b83555df6b..349449f506 100644 Binary files a/public/images/emoji/google/albania.png and b/public/images/emoji/google/albania.png differ diff --git a/public/images/emoji/google/alembic.png b/public/images/emoji/google/alembic.png index f6e68a91c6..c250168e4f 100644 Binary files a/public/images/emoji/google/alembic.png and b/public/images/emoji/google/alembic.png differ diff --git a/public/images/emoji/google/algeria.png b/public/images/emoji/google/algeria.png index ccbb144187..aa506c113c 100644 Binary files a/public/images/emoji/google/algeria.png and b/public/images/emoji/google/algeria.png differ diff --git a/public/images/emoji/google/alien.png b/public/images/emoji/google/alien.png index 90150e0ef0..f3f9900c69 100644 Binary files a/public/images/emoji/google/alien.png and b/public/images/emoji/google/alien.png differ diff --git a/public/images/emoji/google/ambulance.png b/public/images/emoji/google/ambulance.png index 95238d2858..bd162a3f51 100644 Binary files a/public/images/emoji/google/ambulance.png and b/public/images/emoji/google/ambulance.png differ diff --git a/public/images/emoji/google/american_samoa.png b/public/images/emoji/google/american_samoa.png index 267bb361f1..cb7f526732 100644 Binary files a/public/images/emoji/google/american_samoa.png and b/public/images/emoji/google/american_samoa.png differ diff --git a/public/images/emoji/google/amphora.png b/public/images/emoji/google/amphora.png index cb69f341d8..cdb1019efa 100644 Binary files a/public/images/emoji/google/amphora.png and b/public/images/emoji/google/amphora.png differ diff --git a/public/images/emoji/google/anchor.png b/public/images/emoji/google/anchor.png index 5ae2388b72..83aa3b0fd8 100644 Binary files a/public/images/emoji/google/anchor.png and b/public/images/emoji/google/anchor.png differ diff --git a/public/images/emoji/google/andorra.png b/public/images/emoji/google/andorra.png index ffcf0a6ee5..095a958502 100644 Binary files a/public/images/emoji/google/andorra.png and b/public/images/emoji/google/andorra.png differ diff --git a/public/images/emoji/google/angel.png b/public/images/emoji/google/angel.png index 4c755b4827..dc0b063117 100644 Binary files a/public/images/emoji/google/angel.png and b/public/images/emoji/google/angel.png differ diff --git a/public/images/emoji/google/anger.png b/public/images/emoji/google/anger.png index eb5c4886c3..812431c317 100644 Binary files a/public/images/emoji/google/anger.png and b/public/images/emoji/google/anger.png differ diff --git a/public/images/emoji/google/anger_right.png b/public/images/emoji/google/anger_right.png index 9ba99a5b35..92f3212367 100644 Binary files a/public/images/emoji/google/anger_right.png and b/public/images/emoji/google/anger_right.png differ diff --git a/public/images/emoji/google/angola.png b/public/images/emoji/google/angola.png index 0a4c13a436..ad7ef2338b 100644 Binary files a/public/images/emoji/google/angola.png and b/public/images/emoji/google/angola.png differ diff --git a/public/images/emoji/google/angry.png b/public/images/emoji/google/angry.png index c0e39aa290..1c1686497f 100644 Binary files a/public/images/emoji/google/angry.png and b/public/images/emoji/google/angry.png differ diff --git a/public/images/emoji/google/anguilla.png b/public/images/emoji/google/anguilla.png index 6ba27e284c..eb8524bda2 100644 Binary files a/public/images/emoji/google/anguilla.png and b/public/images/emoji/google/anguilla.png differ diff --git a/public/images/emoji/google/anguished.png b/public/images/emoji/google/anguished.png index e2059f1bf0..980f456597 100644 Binary files a/public/images/emoji/google/anguished.png and b/public/images/emoji/google/anguished.png differ diff --git a/public/images/emoji/google/ant.png b/public/images/emoji/google/ant.png index 8c66dbf0c7..52148884f0 100644 Binary files a/public/images/emoji/google/ant.png and b/public/images/emoji/google/ant.png differ diff --git a/public/images/emoji/google/antarctica.png b/public/images/emoji/google/antarctica.png index 4aeb8e774c..bc5c94f5b4 100644 Binary files a/public/images/emoji/google/antarctica.png and b/public/images/emoji/google/antarctica.png differ diff --git a/public/images/emoji/google/antigua_barbuda.png b/public/images/emoji/google/antigua_barbuda.png index 8be446d903..9ce45c6ed5 100644 Binary files a/public/images/emoji/google/antigua_barbuda.png and b/public/images/emoji/google/antigua_barbuda.png differ diff --git a/public/images/emoji/google/apple.png b/public/images/emoji/google/apple.png index 452dc36214..183726fbcf 100644 Binary files a/public/images/emoji/google/apple.png and b/public/images/emoji/google/apple.png differ diff --git a/public/images/emoji/google/aquarius.png b/public/images/emoji/google/aquarius.png index 322e51a694..972c997908 100644 Binary files a/public/images/emoji/google/aquarius.png and b/public/images/emoji/google/aquarius.png differ diff --git a/public/images/emoji/google/archery.png b/public/images/emoji/google/archery.png index 130e029ea5..b739fb81b3 100644 Binary files a/public/images/emoji/google/archery.png and b/public/images/emoji/google/archery.png differ diff --git a/public/images/emoji/google/argentina.png b/public/images/emoji/google/argentina.png index 6bdb15abe2..c7e607f904 100644 Binary files a/public/images/emoji/google/argentina.png and b/public/images/emoji/google/argentina.png differ diff --git a/public/images/emoji/google/aries.png b/public/images/emoji/google/aries.png index 7d59f6ec86..5a090369a9 100644 Binary files a/public/images/emoji/google/aries.png and b/public/images/emoji/google/aries.png differ diff --git a/public/images/emoji/google/armenia.png b/public/images/emoji/google/armenia.png index 1a585dd67f..33870d31c0 100644 Binary files a/public/images/emoji/google/armenia.png and b/public/images/emoji/google/armenia.png differ diff --git a/public/images/emoji/google/arrow_backward.png b/public/images/emoji/google/arrow_backward.png index 81b77f2444..a0e46bfd08 100644 Binary files a/public/images/emoji/google/arrow_backward.png and b/public/images/emoji/google/arrow_backward.png differ diff --git a/public/images/emoji/google/arrow_double_down.png b/public/images/emoji/google/arrow_double_down.png index b0bd62ec65..5309ffe266 100644 Binary files a/public/images/emoji/google/arrow_double_down.png and b/public/images/emoji/google/arrow_double_down.png differ diff --git a/public/images/emoji/google/arrow_double_up.png b/public/images/emoji/google/arrow_double_up.png index 1c5aea8cc3..e1d8b8d292 100644 Binary files a/public/images/emoji/google/arrow_double_up.png and b/public/images/emoji/google/arrow_double_up.png differ diff --git a/public/images/emoji/google/arrow_down.png b/public/images/emoji/google/arrow_down.png index 3adc145552..199e9e33bf 100644 Binary files a/public/images/emoji/google/arrow_down.png and b/public/images/emoji/google/arrow_down.png differ diff --git a/public/images/emoji/google/arrow_down_small.png b/public/images/emoji/google/arrow_down_small.png index 0a0d134044..233983c283 100644 Binary files a/public/images/emoji/google/arrow_down_small.png and b/public/images/emoji/google/arrow_down_small.png differ diff --git a/public/images/emoji/google/arrow_forward.png b/public/images/emoji/google/arrow_forward.png index a2521f3646..2b820c99b9 100644 Binary files a/public/images/emoji/google/arrow_forward.png and b/public/images/emoji/google/arrow_forward.png differ diff --git a/public/images/emoji/google/arrow_heading_down.png b/public/images/emoji/google/arrow_heading_down.png index 00503be9fa..c3227ce5c9 100644 Binary files a/public/images/emoji/google/arrow_heading_down.png and b/public/images/emoji/google/arrow_heading_down.png differ diff --git a/public/images/emoji/google/arrow_heading_up.png b/public/images/emoji/google/arrow_heading_up.png index b9c2461d3b..f19d3dd794 100644 Binary files a/public/images/emoji/google/arrow_heading_up.png and b/public/images/emoji/google/arrow_heading_up.png differ diff --git a/public/images/emoji/google/arrow_left.png b/public/images/emoji/google/arrow_left.png index 535043666b..54189a252b 100644 Binary files a/public/images/emoji/google/arrow_left.png and b/public/images/emoji/google/arrow_left.png differ diff --git a/public/images/emoji/google/arrow_lower_left.png b/public/images/emoji/google/arrow_lower_left.png index 92e1a5c5a9..708366c7b4 100644 Binary files a/public/images/emoji/google/arrow_lower_left.png and b/public/images/emoji/google/arrow_lower_left.png differ diff --git a/public/images/emoji/google/arrow_lower_right.png b/public/images/emoji/google/arrow_lower_right.png index 0c704dec18..d7063359a7 100644 Binary files a/public/images/emoji/google/arrow_lower_right.png and b/public/images/emoji/google/arrow_lower_right.png differ diff --git a/public/images/emoji/google/arrow_right.png b/public/images/emoji/google/arrow_right.png index 1188727ffa..f0b1d7a4c1 100644 Binary files a/public/images/emoji/google/arrow_right.png and b/public/images/emoji/google/arrow_right.png differ diff --git a/public/images/emoji/google/arrow_right_hook.png b/public/images/emoji/google/arrow_right_hook.png index 508a10100a..f2ffc078a3 100644 Binary files a/public/images/emoji/google/arrow_right_hook.png and b/public/images/emoji/google/arrow_right_hook.png differ diff --git a/public/images/emoji/google/arrow_up.png b/public/images/emoji/google/arrow_up.png index a2b5a49c8f..2ce7b347c8 100644 Binary files a/public/images/emoji/google/arrow_up.png and b/public/images/emoji/google/arrow_up.png differ diff --git a/public/images/emoji/google/arrow_up_down.png b/public/images/emoji/google/arrow_up_down.png index a9a7dd7396..4681bfd1fa 100644 Binary files a/public/images/emoji/google/arrow_up_down.png and b/public/images/emoji/google/arrow_up_down.png differ diff --git a/public/images/emoji/google/arrow_up_small.png b/public/images/emoji/google/arrow_up_small.png index 4ed38f7095..ce410b1145 100644 Binary files a/public/images/emoji/google/arrow_up_small.png and b/public/images/emoji/google/arrow_up_small.png differ diff --git a/public/images/emoji/google/arrow_upper_left.png b/public/images/emoji/google/arrow_upper_left.png index 0c6e3a65d8..57247fd347 100644 Binary files a/public/images/emoji/google/arrow_upper_left.png and b/public/images/emoji/google/arrow_upper_left.png differ diff --git a/public/images/emoji/google/arrow_upper_right.png b/public/images/emoji/google/arrow_upper_right.png index a1df4c37f6..e4314573c5 100644 Binary files a/public/images/emoji/google/arrow_upper_right.png and b/public/images/emoji/google/arrow_upper_right.png differ diff --git a/public/images/emoji/google/arrows_clockwise.png b/public/images/emoji/google/arrows_clockwise.png index 0806b60608..4b17b9d552 100644 Binary files a/public/images/emoji/google/arrows_clockwise.png and b/public/images/emoji/google/arrows_clockwise.png differ diff --git a/public/images/emoji/google/arrows_counterclockwise.png b/public/images/emoji/google/arrows_counterclockwise.png index 3362a4b424..8534640931 100644 Binary files a/public/images/emoji/google/arrows_counterclockwise.png and b/public/images/emoji/google/arrows_counterclockwise.png differ diff --git a/public/images/emoji/google/art.png b/public/images/emoji/google/art.png index 38b3aa804d..b22bb2e15b 100644 Binary files a/public/images/emoji/google/art.png and b/public/images/emoji/google/art.png differ diff --git a/public/images/emoji/google/articulated_lorry.png b/public/images/emoji/google/articulated_lorry.png index 8680f6b472..70e2a3e4c5 100644 Binary files a/public/images/emoji/google/articulated_lorry.png and b/public/images/emoji/google/articulated_lorry.png differ diff --git a/public/images/emoji/google/artificial_satellite.png b/public/images/emoji/google/artificial_satellite.png index 8f60cf4fc4..abffa9442b 100644 Binary files a/public/images/emoji/google/artificial_satellite.png and b/public/images/emoji/google/artificial_satellite.png differ diff --git a/public/images/emoji/google/aruba.png b/public/images/emoji/google/aruba.png index 2f6f6ab252..5dd8544f67 100644 Binary files a/public/images/emoji/google/aruba.png and b/public/images/emoji/google/aruba.png differ diff --git a/public/images/emoji/google/ascension_island.png b/public/images/emoji/google/ascension_island.png index d314bbbc78..57adedf4df 100644 Binary files a/public/images/emoji/google/ascension_island.png and b/public/images/emoji/google/ascension_island.png differ diff --git a/public/images/emoji/google/asterisk.png b/public/images/emoji/google/asterisk.png index ff8fbb5091..0b1a1d5605 100644 Binary files a/public/images/emoji/google/asterisk.png and b/public/images/emoji/google/asterisk.png differ diff --git a/public/images/emoji/google/astonished.png b/public/images/emoji/google/astonished.png index ffa8c01680..a3fb2ec9e9 100644 Binary files a/public/images/emoji/google/astonished.png and b/public/images/emoji/google/astonished.png differ diff --git a/public/images/emoji/google/athletic_shoe.png b/public/images/emoji/google/athletic_shoe.png index e3da2abcc5..ebc2112c1b 100644 Binary files a/public/images/emoji/google/athletic_shoe.png and b/public/images/emoji/google/athletic_shoe.png differ diff --git a/public/images/emoji/google/atm.png b/public/images/emoji/google/atm.png index 475ac6578a..01cfd88772 100644 Binary files a/public/images/emoji/google/atm.png and b/public/images/emoji/google/atm.png differ diff --git a/public/images/emoji/google/atom.png b/public/images/emoji/google/atom.png index 9a6fb28ddf..e7a4c7d7da 100644 Binary files a/public/images/emoji/google/atom.png and b/public/images/emoji/google/atom.png differ diff --git a/public/images/emoji/google/atom_symbol.png b/public/images/emoji/google/atom_symbol.png index 9a6fb28ddf..e7a4c7d7da 100644 Binary files a/public/images/emoji/google/atom_symbol.png and b/public/images/emoji/google/atom_symbol.png differ diff --git a/public/images/emoji/google/australia.png b/public/images/emoji/google/australia.png index fe795f0891..bbf27bc592 100644 Binary files a/public/images/emoji/google/australia.png and b/public/images/emoji/google/australia.png differ diff --git a/public/images/emoji/google/austria.png b/public/images/emoji/google/austria.png index c7854b7e0b..cf4897a626 100644 Binary files a/public/images/emoji/google/austria.png and b/public/images/emoji/google/austria.png differ diff --git a/public/images/emoji/google/automobile.png b/public/images/emoji/google/automobile.png index 7df8de6eb8..c350f786bd 100644 Binary files a/public/images/emoji/google/automobile.png and b/public/images/emoji/google/automobile.png differ diff --git a/public/images/emoji/google/avocado.png b/public/images/emoji/google/avocado.png index b72b7d0798..fa6b9246a3 100644 Binary files a/public/images/emoji/google/avocado.png and b/public/images/emoji/google/avocado.png differ diff --git a/public/images/emoji/google/azerbaijan.png b/public/images/emoji/google/azerbaijan.png index 11022dcdf7..f619398910 100644 Binary files a/public/images/emoji/google/azerbaijan.png and b/public/images/emoji/google/azerbaijan.png differ diff --git a/public/images/emoji/google/b.png b/public/images/emoji/google/b.png index b095d78ac3..886f81bd7f 100644 Binary files a/public/images/emoji/google/b.png and b/public/images/emoji/google/b.png differ diff --git a/public/images/emoji/google/baby.png b/public/images/emoji/google/baby.png index b4a87685e0..9adf818924 100644 Binary files a/public/images/emoji/google/baby.png and b/public/images/emoji/google/baby.png differ diff --git a/public/images/emoji/google/baby_bottle.png b/public/images/emoji/google/baby_bottle.png index 927df75cff..c71106b7a1 100644 Binary files a/public/images/emoji/google/baby_bottle.png and b/public/images/emoji/google/baby_bottle.png differ diff --git a/public/images/emoji/google/baby_chick.png b/public/images/emoji/google/baby_chick.png index 06c417f3fb..8339dc7715 100644 Binary files a/public/images/emoji/google/baby_chick.png and b/public/images/emoji/google/baby_chick.png differ diff --git a/public/images/emoji/google/baby_symbol.png b/public/images/emoji/google/baby_symbol.png index fa6939a61b..0c325fa22d 100644 Binary files a/public/images/emoji/google/baby_symbol.png and b/public/images/emoji/google/baby_symbol.png differ diff --git a/public/images/emoji/google/back.png b/public/images/emoji/google/back.png index 0bd77817ce..b28742a715 100644 Binary files a/public/images/emoji/google/back.png and b/public/images/emoji/google/back.png differ diff --git a/public/images/emoji/google/bacon.png b/public/images/emoji/google/bacon.png index f5c163e0fa..4dad95fae3 100644 Binary files a/public/images/emoji/google/bacon.png and b/public/images/emoji/google/bacon.png differ diff --git a/public/images/emoji/google/badger.png b/public/images/emoji/google/badger.png new file mode 100644 index 0000000000..1c50ce7956 Binary files /dev/null and b/public/images/emoji/google/badger.png differ diff --git a/public/images/emoji/google/badminton.png b/public/images/emoji/google/badminton.png index 882a71ee34..4207edeef8 100644 Binary files a/public/images/emoji/google/badminton.png and b/public/images/emoji/google/badminton.png differ diff --git a/public/images/emoji/google/bagel.png b/public/images/emoji/google/bagel.png new file mode 100644 index 0000000000..53e3ec1ecd Binary files /dev/null and b/public/images/emoji/google/bagel.png differ diff --git a/public/images/emoji/google/baggage_claim.png b/public/images/emoji/google/baggage_claim.png index 156124dc9b..7740ad74d3 100644 Binary files a/public/images/emoji/google/baggage_claim.png and b/public/images/emoji/google/baggage_claim.png differ diff --git a/public/images/emoji/google/baguette_bread.png b/public/images/emoji/google/baguette_bread.png index 6ebe4711d3..c45af1cada 100644 Binary files a/public/images/emoji/google/baguette_bread.png and b/public/images/emoji/google/baguette_bread.png differ diff --git a/public/images/emoji/google/bahamas.png b/public/images/emoji/google/bahamas.png index 2bc67c15e6..2602c88401 100644 Binary files a/public/images/emoji/google/bahamas.png and b/public/images/emoji/google/bahamas.png differ diff --git a/public/images/emoji/google/bahrain.png b/public/images/emoji/google/bahrain.png index cd454e4fbd..1c466f1a36 100644 Binary files a/public/images/emoji/google/bahrain.png and b/public/images/emoji/google/bahrain.png differ diff --git a/public/images/emoji/google/balance_scale.png b/public/images/emoji/google/balance_scale.png index 179fce7257..2ae2e3fd16 100644 Binary files a/public/images/emoji/google/balance_scale.png and b/public/images/emoji/google/balance_scale.png differ diff --git a/public/images/emoji/google/balloon.png b/public/images/emoji/google/balloon.png index 9d3b69e1c1..b4afd831ed 100644 Binary files a/public/images/emoji/google/balloon.png and b/public/images/emoji/google/balloon.png differ diff --git a/public/images/emoji/google/ballot_box.png b/public/images/emoji/google/ballot_box.png index 4b730a859a..755674e769 100644 Binary files a/public/images/emoji/google/ballot_box.png and b/public/images/emoji/google/ballot_box.png differ diff --git a/public/images/emoji/google/ballot_box_with_ballot.png b/public/images/emoji/google/ballot_box_with_ballot.png index 4b730a859a..755674e769 100644 Binary files a/public/images/emoji/google/ballot_box_with_ballot.png and b/public/images/emoji/google/ballot_box_with_ballot.png differ diff --git a/public/images/emoji/google/ballot_box_with_check.png b/public/images/emoji/google/ballot_box_with_check.png index 39d739cd09..1e9a2e9ec7 100644 Binary files a/public/images/emoji/google/ballot_box_with_check.png and b/public/images/emoji/google/ballot_box_with_check.png differ diff --git a/public/images/emoji/google/bamboo.png b/public/images/emoji/google/bamboo.png index 4d78882914..143d77a501 100644 Binary files a/public/images/emoji/google/bamboo.png and b/public/images/emoji/google/bamboo.png differ diff --git a/public/images/emoji/google/banana.png b/public/images/emoji/google/banana.png index 300ab267ca..957ab15e4b 100644 Binary files a/public/images/emoji/google/banana.png and b/public/images/emoji/google/banana.png differ diff --git a/public/images/emoji/google/bangbang.png b/public/images/emoji/google/bangbang.png index ea825f75f0..0641d412a3 100644 Binary files a/public/images/emoji/google/bangbang.png and b/public/images/emoji/google/bangbang.png differ diff --git a/public/images/emoji/google/bangladesh.png b/public/images/emoji/google/bangladesh.png index 78dc405958..387c3d95be 100644 Binary files a/public/images/emoji/google/bangladesh.png and b/public/images/emoji/google/bangladesh.png differ diff --git a/public/images/emoji/google/bank.png b/public/images/emoji/google/bank.png index 89b62c90e8..a585c1a251 100644 Binary files a/public/images/emoji/google/bank.png and b/public/images/emoji/google/bank.png differ diff --git a/public/images/emoji/google/bar_chart.png b/public/images/emoji/google/bar_chart.png index 4428742d91..3ed08b1fc7 100644 Binary files a/public/images/emoji/google/bar_chart.png and b/public/images/emoji/google/bar_chart.png differ diff --git a/public/images/emoji/google/barbados.png b/public/images/emoji/google/barbados.png index 523c99a550..e306987f00 100644 Binary files a/public/images/emoji/google/barbados.png and b/public/images/emoji/google/barbados.png differ diff --git a/public/images/emoji/google/barber.png b/public/images/emoji/google/barber.png index cd0b1e0c91..03ad9d86c4 100644 Binary files a/public/images/emoji/google/barber.png and b/public/images/emoji/google/barber.png differ diff --git a/public/images/emoji/google/baseball.png b/public/images/emoji/google/baseball.png index 1c302367d9..26e7976792 100644 Binary files a/public/images/emoji/google/baseball.png and b/public/images/emoji/google/baseball.png differ diff --git a/public/images/emoji/google/basket.png b/public/images/emoji/google/basket.png new file mode 100644 index 0000000000..027efec333 Binary files /dev/null and b/public/images/emoji/google/basket.png differ diff --git a/public/images/emoji/google/basketball.png b/public/images/emoji/google/basketball.png index 12ac7e4720..ca6de70465 100644 Binary files a/public/images/emoji/google/basketball.png and b/public/images/emoji/google/basketball.png differ diff --git a/public/images/emoji/google/basketball_man.png b/public/images/emoji/google/basketball_man.png index 4441fc46c5..72f015d486 100644 Binary files a/public/images/emoji/google/basketball_man.png and b/public/images/emoji/google/basketball_man.png differ diff --git a/public/images/emoji/google/basketball_player.png b/public/images/emoji/google/basketball_player.png index 4441fc46c5..72f015d486 100644 Binary files a/public/images/emoji/google/basketball_player.png and b/public/images/emoji/google/basketball_player.png differ diff --git a/public/images/emoji/google/basketball_woman.png b/public/images/emoji/google/basketball_woman.png index 1c90300615..0aedb998ed 100644 Binary files a/public/images/emoji/google/basketball_woman.png and b/public/images/emoji/google/basketball_woman.png differ diff --git a/public/images/emoji/google/bat.png b/public/images/emoji/google/bat.png index 99551fb570..cbddb0b892 100644 Binary files a/public/images/emoji/google/bat.png and b/public/images/emoji/google/bat.png differ diff --git a/public/images/emoji/google/bath.png b/public/images/emoji/google/bath.png index bb1ec3f5c0..c436eaa544 100644 Binary files a/public/images/emoji/google/bath.png and b/public/images/emoji/google/bath.png differ diff --git a/public/images/emoji/google/bathtub.png b/public/images/emoji/google/bathtub.png index f77fa95bf6..257c379497 100644 Binary files a/public/images/emoji/google/bathtub.png and b/public/images/emoji/google/bathtub.png differ diff --git a/public/images/emoji/google/battery.png b/public/images/emoji/google/battery.png index 0e64ef1e5c..708ccf07ca 100644 Binary files a/public/images/emoji/google/battery.png and b/public/images/emoji/google/battery.png differ diff --git a/public/images/emoji/google/beach.png b/public/images/emoji/google/beach.png index 859c09dff4..431ec77b91 100644 Binary files a/public/images/emoji/google/beach.png and b/public/images/emoji/google/beach.png differ diff --git a/public/images/emoji/google/beach_umbrella.png b/public/images/emoji/google/beach_umbrella.png index 859c09dff4..431ec77b91 100644 Binary files a/public/images/emoji/google/beach_umbrella.png and b/public/images/emoji/google/beach_umbrella.png differ diff --git a/public/images/emoji/google/beach_with_umbrella.png b/public/images/emoji/google/beach_with_umbrella.png index 859c09dff4..431ec77b91 100644 Binary files a/public/images/emoji/google/beach_with_umbrella.png and b/public/images/emoji/google/beach_with_umbrella.png differ diff --git a/public/images/emoji/google/bear.png b/public/images/emoji/google/bear.png index aeaf931f71..9175eb1b4e 100644 Binary files a/public/images/emoji/google/bear.png and b/public/images/emoji/google/bear.png differ diff --git a/public/images/emoji/google/bearded_person.png b/public/images/emoji/google/bearded_person.png index 8f22a46616..f566c34494 100644 Binary files a/public/images/emoji/google/bearded_person.png and b/public/images/emoji/google/bearded_person.png differ diff --git a/public/images/emoji/google/bed.png b/public/images/emoji/google/bed.png index 54f63be23f..9d4d683410 100644 Binary files a/public/images/emoji/google/bed.png and b/public/images/emoji/google/bed.png differ diff --git a/public/images/emoji/google/bee.png b/public/images/emoji/google/bee.png index 4f0f41d104..ba23617d37 100644 Binary files a/public/images/emoji/google/bee.png and b/public/images/emoji/google/bee.png differ diff --git a/public/images/emoji/google/beer.png b/public/images/emoji/google/beer.png index 48aaa236e3..1dfa80d496 100644 Binary files a/public/images/emoji/google/beer.png and b/public/images/emoji/google/beer.png differ diff --git a/public/images/emoji/google/beers.png b/public/images/emoji/google/beers.png index 4e8a97b982..897705c567 100644 Binary files a/public/images/emoji/google/beers.png and b/public/images/emoji/google/beers.png differ diff --git a/public/images/emoji/google/beetle.png b/public/images/emoji/google/beetle.png index ea8c81a3f1..66c37b161b 100644 Binary files a/public/images/emoji/google/beetle.png and b/public/images/emoji/google/beetle.png differ diff --git a/public/images/emoji/google/beginner.png b/public/images/emoji/google/beginner.png index 5bb5dd09e8..ea07ece29c 100644 Binary files a/public/images/emoji/google/beginner.png and b/public/images/emoji/google/beginner.png differ diff --git a/public/images/emoji/google/belarus.png b/public/images/emoji/google/belarus.png index 4a38227469..5132903858 100644 Binary files a/public/images/emoji/google/belarus.png and b/public/images/emoji/google/belarus.png differ diff --git a/public/images/emoji/google/belgium.png b/public/images/emoji/google/belgium.png index cf4a8b353b..bd904f867e 100644 Binary files a/public/images/emoji/google/belgium.png and b/public/images/emoji/google/belgium.png differ diff --git a/public/images/emoji/google/belize.png b/public/images/emoji/google/belize.png index b101bfc474..35d25f94c4 100644 Binary files a/public/images/emoji/google/belize.png and b/public/images/emoji/google/belize.png differ diff --git a/public/images/emoji/google/bell.png b/public/images/emoji/google/bell.png index 33b7e0231b..0714c93e6d 100644 Binary files a/public/images/emoji/google/bell.png and b/public/images/emoji/google/bell.png differ diff --git a/public/images/emoji/google/bellhop.png b/public/images/emoji/google/bellhop.png index 6c5233fc30..387636ef64 100644 Binary files a/public/images/emoji/google/bellhop.png and b/public/images/emoji/google/bellhop.png differ diff --git a/public/images/emoji/google/bellhop_bell.png b/public/images/emoji/google/bellhop_bell.png index 6c5233fc30..387636ef64 100644 Binary files a/public/images/emoji/google/bellhop_bell.png and b/public/images/emoji/google/bellhop_bell.png differ diff --git a/public/images/emoji/google/benin.png b/public/images/emoji/google/benin.png index ea2a4d8981..5656b9eaae 100644 Binary files a/public/images/emoji/google/benin.png and b/public/images/emoji/google/benin.png differ diff --git a/public/images/emoji/google/bento.png b/public/images/emoji/google/bento.png index e172064a1b..2eb01c9974 100644 Binary files a/public/images/emoji/google/bento.png and b/public/images/emoji/google/bento.png differ diff --git a/public/images/emoji/google/bermuda.png b/public/images/emoji/google/bermuda.png index c3f27a2def..0f9c46b14c 100644 Binary files a/public/images/emoji/google/bermuda.png and b/public/images/emoji/google/bermuda.png differ diff --git a/public/images/emoji/google/bhutan.png b/public/images/emoji/google/bhutan.png index 4d12abfba1..e2cd0e9582 100644 Binary files a/public/images/emoji/google/bhutan.png and b/public/images/emoji/google/bhutan.png differ diff --git a/public/images/emoji/google/bicyclist.png b/public/images/emoji/google/bicyclist.png index 5423030f49..4c14005249 100644 Binary files a/public/images/emoji/google/bicyclist.png and b/public/images/emoji/google/bicyclist.png differ diff --git a/public/images/emoji/google/bike.png b/public/images/emoji/google/bike.png index 05106eee6c..1677889707 100644 Binary files a/public/images/emoji/google/bike.png and b/public/images/emoji/google/bike.png differ diff --git a/public/images/emoji/google/biking_man.png b/public/images/emoji/google/biking_man.png index 5423030f49..4c14005249 100644 Binary files a/public/images/emoji/google/biking_man.png and b/public/images/emoji/google/biking_man.png differ diff --git a/public/images/emoji/google/biking_woman.png b/public/images/emoji/google/biking_woman.png index bb318aab4c..0411ab708b 100644 Binary files a/public/images/emoji/google/biking_woman.png and b/public/images/emoji/google/biking_woman.png differ diff --git a/public/images/emoji/google/bikini.png b/public/images/emoji/google/bikini.png index 9882db89fd..50bcea026c 100644 Binary files a/public/images/emoji/google/bikini.png and b/public/images/emoji/google/bikini.png differ diff --git a/public/images/emoji/google/billed_cap.png b/public/images/emoji/google/billed_cap.png index a4739440f3..2e8277cce2 100644 Binary files a/public/images/emoji/google/billed_cap.png and b/public/images/emoji/google/billed_cap.png differ diff --git a/public/images/emoji/google/biohazard.png b/public/images/emoji/google/biohazard.png index e345fcc45f..46565bbf98 100644 Binary files a/public/images/emoji/google/biohazard.png and b/public/images/emoji/google/biohazard.png differ diff --git a/public/images/emoji/google/biohazard_sign.png b/public/images/emoji/google/biohazard_sign.png index e345fcc45f..46565bbf98 100644 Binary files a/public/images/emoji/google/biohazard_sign.png and b/public/images/emoji/google/biohazard_sign.png differ diff --git a/public/images/emoji/google/bird.png b/public/images/emoji/google/bird.png index 1231be5e0a..fb0d563e93 100644 Binary files a/public/images/emoji/google/bird.png and b/public/images/emoji/google/bird.png differ diff --git a/public/images/emoji/google/birthday.png b/public/images/emoji/google/birthday.png index fd23ead864..e16ad07cca 100644 Binary files a/public/images/emoji/google/birthday.png and b/public/images/emoji/google/birthday.png differ diff --git a/public/images/emoji/google/black_circle.png b/public/images/emoji/google/black_circle.png index 4e51b2a577..cd7ce6a6fa 100644 Binary files a/public/images/emoji/google/black_circle.png and b/public/images/emoji/google/black_circle.png differ diff --git a/public/images/emoji/google/black_flag.png b/public/images/emoji/google/black_flag.png index fd30f1d882..874033398d 100644 Binary files a/public/images/emoji/google/black_flag.png and b/public/images/emoji/google/black_flag.png differ diff --git a/public/images/emoji/google/black_heart.png b/public/images/emoji/google/black_heart.png index 4c4f97fcae..4492aa2c3e 100644 Binary files a/public/images/emoji/google/black_heart.png and b/public/images/emoji/google/black_heart.png differ diff --git a/public/images/emoji/google/black_joker.png b/public/images/emoji/google/black_joker.png index f483d06284..620b14dcc1 100644 Binary files a/public/images/emoji/google/black_joker.png and b/public/images/emoji/google/black_joker.png differ diff --git a/public/images/emoji/google/black_large_square.png b/public/images/emoji/google/black_large_square.png index f55e1e34b5..ec5fc89c17 100644 Binary files a/public/images/emoji/google/black_large_square.png and b/public/images/emoji/google/black_large_square.png differ diff --git a/public/images/emoji/google/black_medium_small_square.png b/public/images/emoji/google/black_medium_small_square.png index d61362f516..b042f0a8ae 100644 Binary files a/public/images/emoji/google/black_medium_small_square.png and b/public/images/emoji/google/black_medium_small_square.png differ diff --git a/public/images/emoji/google/black_medium_square.png b/public/images/emoji/google/black_medium_square.png index f2b911b63b..62011bbfad 100644 Binary files a/public/images/emoji/google/black_medium_square.png and b/public/images/emoji/google/black_medium_square.png differ diff --git a/public/images/emoji/google/black_nib.png b/public/images/emoji/google/black_nib.png index 3efcc08d13..476b407f32 100644 Binary files a/public/images/emoji/google/black_nib.png and b/public/images/emoji/google/black_nib.png differ diff --git a/public/images/emoji/google/black_small_square.png b/public/images/emoji/google/black_small_square.png index 1afd623ea0..f36599672c 100644 Binary files a/public/images/emoji/google/black_small_square.png and b/public/images/emoji/google/black_small_square.png differ diff --git a/public/images/emoji/google/black_square_button.png b/public/images/emoji/google/black_square_button.png index 8241ed313e..ec17936ba8 100644 Binary files a/public/images/emoji/google/black_square_button.png and b/public/images/emoji/google/black_square_button.png differ diff --git a/public/images/emoji/google/blonde_man.png b/public/images/emoji/google/blonde_man.png index f5d7e0009b..40fd3dc631 100644 Binary files a/public/images/emoji/google/blonde_man.png and b/public/images/emoji/google/blonde_man.png differ diff --git a/public/images/emoji/google/blonde_woman.png b/public/images/emoji/google/blonde_woman.png index 9264a40c97..924330358c 100644 Binary files a/public/images/emoji/google/blonde_woman.png and b/public/images/emoji/google/blonde_woman.png differ diff --git a/public/images/emoji/google/blossom.png b/public/images/emoji/google/blossom.png index 3fc27e61b1..4b7bbe748b 100644 Binary files a/public/images/emoji/google/blossom.png and b/public/images/emoji/google/blossom.png differ diff --git a/public/images/emoji/google/blowfish.png b/public/images/emoji/google/blowfish.png index 0c18d3477c..406d1e50ae 100644 Binary files a/public/images/emoji/google/blowfish.png and b/public/images/emoji/google/blowfish.png differ diff --git a/public/images/emoji/google/blue_book.png b/public/images/emoji/google/blue_book.png index 27a97ee236..dc61a34acd 100644 Binary files a/public/images/emoji/google/blue_book.png and b/public/images/emoji/google/blue_book.png differ diff --git a/public/images/emoji/google/blue_car.png b/public/images/emoji/google/blue_car.png index c51bfe3e31..fa7669ed78 100644 Binary files a/public/images/emoji/google/blue_car.png and b/public/images/emoji/google/blue_car.png differ diff --git a/public/images/emoji/google/blue_heart.png b/public/images/emoji/google/blue_heart.png index 6e0ba37fe1..ba553e0454 100644 Binary files a/public/images/emoji/google/blue_heart.png and b/public/images/emoji/google/blue_heart.png differ diff --git a/public/images/emoji/google/blush.png b/public/images/emoji/google/blush.png index 67b84af327..3cb3bdc027 100644 Binary files a/public/images/emoji/google/blush.png and b/public/images/emoji/google/blush.png differ diff --git a/public/images/emoji/google/boar.png b/public/images/emoji/google/boar.png index 131508ad8e..f9227db5b4 100644 Binary files a/public/images/emoji/google/boar.png and b/public/images/emoji/google/boar.png differ diff --git a/public/images/emoji/google/boat.png b/public/images/emoji/google/boat.png index e26c5116c4..f0aac8ed25 100644 Binary files a/public/images/emoji/google/boat.png and b/public/images/emoji/google/boat.png differ diff --git a/public/images/emoji/google/bolivia.png b/public/images/emoji/google/bolivia.png index f25eb38f7a..8c63d9ab1f 100644 Binary files a/public/images/emoji/google/bolivia.png and b/public/images/emoji/google/bolivia.png differ diff --git a/public/images/emoji/google/bomb.png b/public/images/emoji/google/bomb.png index 7fb5f4e05d..f98a38f7d4 100644 Binary files a/public/images/emoji/google/bomb.png and b/public/images/emoji/google/bomb.png differ diff --git a/public/images/emoji/google/bone.png b/public/images/emoji/google/bone.png new file mode 100644 index 0000000000..ce6b1507b6 Binary files /dev/null and b/public/images/emoji/google/bone.png differ diff --git a/public/images/emoji/google/book.png b/public/images/emoji/google/book.png index fa30a7da66..3b58a6d375 100644 Binary files a/public/images/emoji/google/book.png and b/public/images/emoji/google/book.png differ diff --git a/public/images/emoji/google/bookmark.png b/public/images/emoji/google/bookmark.png index 494dc306a8..ad24cb8e5e 100644 Binary files a/public/images/emoji/google/bookmark.png and b/public/images/emoji/google/bookmark.png differ diff --git a/public/images/emoji/google/bookmark_tabs.png b/public/images/emoji/google/bookmark_tabs.png index 058dad0518..c12e9aae31 100644 Binary files a/public/images/emoji/google/bookmark_tabs.png and b/public/images/emoji/google/bookmark_tabs.png differ diff --git a/public/images/emoji/google/books.png b/public/images/emoji/google/books.png index d703234b81..43047e412a 100644 Binary files a/public/images/emoji/google/books.png and b/public/images/emoji/google/books.png differ diff --git a/public/images/emoji/google/boom.png b/public/images/emoji/google/boom.png index 43bddade27..78eacbcf74 100644 Binary files a/public/images/emoji/google/boom.png and b/public/images/emoji/google/boom.png differ diff --git a/public/images/emoji/google/boot.png b/public/images/emoji/google/boot.png index f37a13893d..c315933e10 100644 Binary files a/public/images/emoji/google/boot.png and b/public/images/emoji/google/boot.png differ diff --git a/public/images/emoji/google/bosnia_herzegovina.png b/public/images/emoji/google/bosnia_herzegovina.png index 4245196945..e1d807c62d 100644 Binary files a/public/images/emoji/google/bosnia_herzegovina.png and b/public/images/emoji/google/bosnia_herzegovina.png differ diff --git a/public/images/emoji/google/botswana.png b/public/images/emoji/google/botswana.png index 46d7ba7540..6e887446f5 100644 Binary files a/public/images/emoji/google/botswana.png and b/public/images/emoji/google/botswana.png differ diff --git a/public/images/emoji/google/bottle_with_popping_cork.png b/public/images/emoji/google/bottle_with_popping_cork.png index 998f04124e..0de663b783 100644 Binary files a/public/images/emoji/google/bottle_with_popping_cork.png and b/public/images/emoji/google/bottle_with_popping_cork.png differ diff --git a/public/images/emoji/google/bouquet.png b/public/images/emoji/google/bouquet.png index 2bc758860f..663370e02e 100644 Binary files a/public/images/emoji/google/bouquet.png and b/public/images/emoji/google/bouquet.png differ diff --git a/public/images/emoji/google/bouvet_island.png b/public/images/emoji/google/bouvet_island.png index d348a446ad..5e9e6ae5e3 100644 Binary files a/public/images/emoji/google/bouvet_island.png and b/public/images/emoji/google/bouvet_island.png differ diff --git a/public/images/emoji/google/bow.png b/public/images/emoji/google/bow.png index 9d660d3d6c..6d08ebd818 100644 Binary files a/public/images/emoji/google/bow.png and b/public/images/emoji/google/bow.png differ diff --git a/public/images/emoji/google/bow_and_arrow.png b/public/images/emoji/google/bow_and_arrow.png index 130e029ea5..b739fb81b3 100644 Binary files a/public/images/emoji/google/bow_and_arrow.png and b/public/images/emoji/google/bow_and_arrow.png differ diff --git a/public/images/emoji/google/bowing_man.png b/public/images/emoji/google/bowing_man.png index 9d660d3d6c..6d08ebd818 100644 Binary files a/public/images/emoji/google/bowing_man.png and b/public/images/emoji/google/bowing_man.png differ diff --git a/public/images/emoji/google/bowing_woman.png b/public/images/emoji/google/bowing_woman.png index b8cd8240c8..a0e6693ba3 100644 Binary files a/public/images/emoji/google/bowing_woman.png and b/public/images/emoji/google/bowing_woman.png differ diff --git a/public/images/emoji/google/bowl_with_spoon.png b/public/images/emoji/google/bowl_with_spoon.png index 1766741e16..908fd64a47 100644 Binary files a/public/images/emoji/google/bowl_with_spoon.png and b/public/images/emoji/google/bowl_with_spoon.png differ diff --git a/public/images/emoji/google/bowling.png b/public/images/emoji/google/bowling.png index 0f93021148..4c55b7ea5f 100644 Binary files a/public/images/emoji/google/bowling.png and b/public/images/emoji/google/bowling.png differ diff --git a/public/images/emoji/google/boxing_glove.png b/public/images/emoji/google/boxing_glove.png index 1dd45489f7..7010cc1066 100644 Binary files a/public/images/emoji/google/boxing_glove.png and b/public/images/emoji/google/boxing_glove.png differ diff --git a/public/images/emoji/google/boy.png b/public/images/emoji/google/boy.png index 8450f1acf2..73124c4986 100644 Binary files a/public/images/emoji/google/boy.png and b/public/images/emoji/google/boy.png differ diff --git a/public/images/emoji/google/brain.png b/public/images/emoji/google/brain.png index ca90998fde..c493957ff8 100644 Binary files a/public/images/emoji/google/brain.png and b/public/images/emoji/google/brain.png differ diff --git a/public/images/emoji/google/brazil.png b/public/images/emoji/google/brazil.png index 209e783894..a77200bdb0 100644 Binary files a/public/images/emoji/google/brazil.png and b/public/images/emoji/google/brazil.png differ diff --git a/public/images/emoji/google/bread.png b/public/images/emoji/google/bread.png index 521d17d1bc..ddee37ac9c 100644 Binary files a/public/images/emoji/google/bread.png and b/public/images/emoji/google/bread.png differ diff --git a/public/images/emoji/google/breast_feeding.png b/public/images/emoji/google/breast_feeding.png index 78abcbe47e..78c66fe91a 100644 Binary files a/public/images/emoji/google/breast_feeding.png and b/public/images/emoji/google/breast_feeding.png differ diff --git a/public/images/emoji/google/brick.png b/public/images/emoji/google/brick.png new file mode 100644 index 0000000000..9995626b52 Binary files /dev/null and b/public/images/emoji/google/brick.png differ diff --git a/public/images/emoji/google/bride_with_veil.png b/public/images/emoji/google/bride_with_veil.png index f831824732..8e899c26fd 100644 Binary files a/public/images/emoji/google/bride_with_veil.png and b/public/images/emoji/google/bride_with_veil.png differ diff --git a/public/images/emoji/google/bridge_at_night.png b/public/images/emoji/google/bridge_at_night.png index cba4aa13a6..43a6bb8734 100644 Binary files a/public/images/emoji/google/bridge_at_night.png and b/public/images/emoji/google/bridge_at_night.png differ diff --git a/public/images/emoji/google/briefcase.png b/public/images/emoji/google/briefcase.png index 4823cdbd64..a6d36228e4 100644 Binary files a/public/images/emoji/google/briefcase.png and b/public/images/emoji/google/briefcase.png differ diff --git a/public/images/emoji/google/british_indian_ocean_territory.png b/public/images/emoji/google/british_indian_ocean_territory.png index b450c90ccd..8295719837 100644 Binary files a/public/images/emoji/google/british_indian_ocean_territory.png and b/public/images/emoji/google/british_indian_ocean_territory.png differ diff --git a/public/images/emoji/google/british_virgin_islands.png b/public/images/emoji/google/british_virgin_islands.png index 3a79c95c9f..1ce280e4d1 100644 Binary files a/public/images/emoji/google/british_virgin_islands.png and b/public/images/emoji/google/british_virgin_islands.png differ diff --git a/public/images/emoji/google/broccoli.png b/public/images/emoji/google/broccoli.png index 842c33be49..5393c67092 100644 Binary files a/public/images/emoji/google/broccoli.png and b/public/images/emoji/google/broccoli.png differ diff --git a/public/images/emoji/google/broken_heart.png b/public/images/emoji/google/broken_heart.png index 0c82944d8b..c6acc4915c 100644 Binary files a/public/images/emoji/google/broken_heart.png and b/public/images/emoji/google/broken_heart.png differ diff --git a/public/images/emoji/google/broom.png b/public/images/emoji/google/broom.png new file mode 100644 index 0000000000..d37f903e3b Binary files /dev/null and b/public/images/emoji/google/broom.png differ diff --git a/public/images/emoji/google/brunei.png b/public/images/emoji/google/brunei.png index 15bf9bb5b4..eace51034a 100644 Binary files a/public/images/emoji/google/brunei.png and b/public/images/emoji/google/brunei.png differ diff --git a/public/images/emoji/google/bug.png b/public/images/emoji/google/bug.png index f5c2815622..ffe2acfa7d 100644 Binary files a/public/images/emoji/google/bug.png and b/public/images/emoji/google/bug.png differ diff --git a/public/images/emoji/google/building_construction.png b/public/images/emoji/google/building_construction.png index 444e3cd1ab..0b507cb370 100644 Binary files a/public/images/emoji/google/building_construction.png and b/public/images/emoji/google/building_construction.png differ diff --git a/public/images/emoji/google/bulb.png b/public/images/emoji/google/bulb.png index 002db3330c..dc4bcc7e04 100644 Binary files a/public/images/emoji/google/bulb.png and b/public/images/emoji/google/bulb.png differ diff --git a/public/images/emoji/google/bulgaria.png b/public/images/emoji/google/bulgaria.png index 69e671d403..e219c8f97d 100644 Binary files a/public/images/emoji/google/bulgaria.png and b/public/images/emoji/google/bulgaria.png differ diff --git a/public/images/emoji/google/bullettrain_front.png b/public/images/emoji/google/bullettrain_front.png index ff0ac0cdfa..b4b9467256 100644 Binary files a/public/images/emoji/google/bullettrain_front.png and b/public/images/emoji/google/bullettrain_front.png differ diff --git a/public/images/emoji/google/bullettrain_side.png b/public/images/emoji/google/bullettrain_side.png index 948d6598cb..ac618d78be 100644 Binary files a/public/images/emoji/google/bullettrain_side.png and b/public/images/emoji/google/bullettrain_side.png differ diff --git a/public/images/emoji/google/burkina_faso.png b/public/images/emoji/google/burkina_faso.png index eea5085cac..5bfbf5f3b4 100644 Binary files a/public/images/emoji/google/burkina_faso.png and b/public/images/emoji/google/burkina_faso.png differ diff --git a/public/images/emoji/google/burrito.png b/public/images/emoji/google/burrito.png index cb5d485777..5da03c6be5 100644 Binary files a/public/images/emoji/google/burrito.png and b/public/images/emoji/google/burrito.png differ diff --git a/public/images/emoji/google/burundi.png b/public/images/emoji/google/burundi.png index 1289ce0672..c6f322a60a 100644 Binary files a/public/images/emoji/google/burundi.png and b/public/images/emoji/google/burundi.png differ diff --git a/public/images/emoji/google/bus.png b/public/images/emoji/google/bus.png index bcd70c5080..4617da7298 100644 Binary files a/public/images/emoji/google/bus.png and b/public/images/emoji/google/bus.png differ diff --git a/public/images/emoji/google/business_suit_levitating.png b/public/images/emoji/google/business_suit_levitating.png index b7eea2e014..8f238ce960 100644 Binary files a/public/images/emoji/google/business_suit_levitating.png and b/public/images/emoji/google/business_suit_levitating.png differ diff --git a/public/images/emoji/google/busstop.png b/public/images/emoji/google/busstop.png index a6bfe6945e..d28a4ff1a0 100644 Binary files a/public/images/emoji/google/busstop.png and b/public/images/emoji/google/busstop.png differ diff --git a/public/images/emoji/google/bust_in_silhouette.png b/public/images/emoji/google/bust_in_silhouette.png index cab9010968..e41366ce4b 100644 Binary files a/public/images/emoji/google/bust_in_silhouette.png and b/public/images/emoji/google/bust_in_silhouette.png differ diff --git a/public/images/emoji/google/busts_in_silhouette.png b/public/images/emoji/google/busts_in_silhouette.png index 9457af969e..ad8c49c698 100644 Binary files a/public/images/emoji/google/busts_in_silhouette.png and b/public/images/emoji/google/busts_in_silhouette.png differ diff --git a/public/images/emoji/google/butterfly.png b/public/images/emoji/google/butterfly.png index 6f98b123ed..0103236881 100644 Binary files a/public/images/emoji/google/butterfly.png and b/public/images/emoji/google/butterfly.png differ diff --git a/public/images/emoji/google/cactus.png b/public/images/emoji/google/cactus.png index 7d67af3c9e..999b3cabe9 100644 Binary files a/public/images/emoji/google/cactus.png and b/public/images/emoji/google/cactus.png differ diff --git a/public/images/emoji/google/cake.png b/public/images/emoji/google/cake.png index d7a4947df9..e8fde178f3 100644 Binary files a/public/images/emoji/google/cake.png and b/public/images/emoji/google/cake.png differ diff --git a/public/images/emoji/google/calendar.png b/public/images/emoji/google/calendar.png index c216fcd633..fd05fe093a 100644 Binary files a/public/images/emoji/google/calendar.png and b/public/images/emoji/google/calendar.png differ diff --git a/public/images/emoji/google/calendar_spiral.png b/public/images/emoji/google/calendar_spiral.png index 8c19dc8104..874dcdb819 100644 Binary files a/public/images/emoji/google/calendar_spiral.png and b/public/images/emoji/google/calendar_spiral.png differ diff --git a/public/images/emoji/google/call_me_hand.png b/public/images/emoji/google/call_me_hand.png index 1aabe9df1d..0dcc1c66cd 100644 Binary files a/public/images/emoji/google/call_me_hand.png and b/public/images/emoji/google/call_me_hand.png differ diff --git a/public/images/emoji/google/calling.png b/public/images/emoji/google/calling.png index d64cb99599..0fbacc01d3 100644 Binary files a/public/images/emoji/google/calling.png and b/public/images/emoji/google/calling.png differ diff --git a/public/images/emoji/google/cambodia.png b/public/images/emoji/google/cambodia.png index fa94a8925b..1aad8ee332 100644 Binary files a/public/images/emoji/google/cambodia.png and b/public/images/emoji/google/cambodia.png differ diff --git a/public/images/emoji/google/camel.png b/public/images/emoji/google/camel.png index 55ed7d6703..c510099682 100644 Binary files a/public/images/emoji/google/camel.png and b/public/images/emoji/google/camel.png differ diff --git a/public/images/emoji/google/camera.png b/public/images/emoji/google/camera.png index d656e290fa..85b8e875f2 100644 Binary files a/public/images/emoji/google/camera.png and b/public/images/emoji/google/camera.png differ diff --git a/public/images/emoji/google/camera_flash.png b/public/images/emoji/google/camera_flash.png index 2d9bccceeb..0a7d28e93a 100644 Binary files a/public/images/emoji/google/camera_flash.png and b/public/images/emoji/google/camera_flash.png differ diff --git a/public/images/emoji/google/camera_with_flash.png b/public/images/emoji/google/camera_with_flash.png index 2d9bccceeb..0a7d28e93a 100644 Binary files a/public/images/emoji/google/camera_with_flash.png and b/public/images/emoji/google/camera_with_flash.png differ diff --git a/public/images/emoji/google/cameroon.png b/public/images/emoji/google/cameroon.png index 32cfd8f65c..f6947ef6b8 100644 Binary files a/public/images/emoji/google/cameroon.png and b/public/images/emoji/google/cameroon.png differ diff --git a/public/images/emoji/google/camping.png b/public/images/emoji/google/camping.png index c8f98531ba..f665431c9c 100644 Binary files a/public/images/emoji/google/camping.png and b/public/images/emoji/google/camping.png differ diff --git a/public/images/emoji/google/canada.png b/public/images/emoji/google/canada.png index f4d80e2603..3bc4f41ca3 100644 Binary files a/public/images/emoji/google/canada.png and b/public/images/emoji/google/canada.png differ diff --git a/public/images/emoji/google/canary_islands.png b/public/images/emoji/google/canary_islands.png index aec8595da1..25be886051 100644 Binary files a/public/images/emoji/google/canary_islands.png and b/public/images/emoji/google/canary_islands.png differ diff --git a/public/images/emoji/google/cancer.png b/public/images/emoji/google/cancer.png index 84f5880338..6e4a705fcb 100644 Binary files a/public/images/emoji/google/cancer.png and b/public/images/emoji/google/cancer.png differ diff --git a/public/images/emoji/google/candle.png b/public/images/emoji/google/candle.png index bbea78b101..4ac96aa8eb 100644 Binary files a/public/images/emoji/google/candle.png and b/public/images/emoji/google/candle.png differ diff --git a/public/images/emoji/google/candy.png b/public/images/emoji/google/candy.png index 758fe2a6dc..e60abcab52 100644 Binary files a/public/images/emoji/google/candy.png and b/public/images/emoji/google/candy.png differ diff --git a/public/images/emoji/google/canned_food.png b/public/images/emoji/google/canned_food.png index dfed4b50be..5e758bd180 100644 Binary files a/public/images/emoji/google/canned_food.png and b/public/images/emoji/google/canned_food.png differ diff --git a/public/images/emoji/google/canoe.png b/public/images/emoji/google/canoe.png index 2b64f57832..303d517e98 100644 Binary files a/public/images/emoji/google/canoe.png and b/public/images/emoji/google/canoe.png differ diff --git a/public/images/emoji/google/cape_verde.png b/public/images/emoji/google/cape_verde.png index 20058f6543..082ff50357 100644 Binary files a/public/images/emoji/google/cape_verde.png and b/public/images/emoji/google/cape_verde.png differ diff --git a/public/images/emoji/google/capital_abcd.png b/public/images/emoji/google/capital_abcd.png index 7fc35935d3..99f2e03ccd 100644 Binary files a/public/images/emoji/google/capital_abcd.png and b/public/images/emoji/google/capital_abcd.png differ diff --git a/public/images/emoji/google/capricorn.png b/public/images/emoji/google/capricorn.png index 6d9df53e65..9385bac233 100644 Binary files a/public/images/emoji/google/capricorn.png and b/public/images/emoji/google/capricorn.png differ diff --git a/public/images/emoji/google/car.png b/public/images/emoji/google/car.png index 7df8de6eb8..c350f786bd 100644 Binary files a/public/images/emoji/google/car.png and b/public/images/emoji/google/car.png differ diff --git a/public/images/emoji/google/card_box.png b/public/images/emoji/google/card_box.png index 40e8eea818..9cc0107d9c 100644 Binary files a/public/images/emoji/google/card_box.png and b/public/images/emoji/google/card_box.png differ diff --git a/public/images/emoji/google/card_file_box.png b/public/images/emoji/google/card_file_box.png index 40e8eea818..9cc0107d9c 100644 Binary files a/public/images/emoji/google/card_file_box.png and b/public/images/emoji/google/card_file_box.png differ diff --git a/public/images/emoji/google/card_index.png b/public/images/emoji/google/card_index.png index ea1769deea..8006c57ca5 100644 Binary files a/public/images/emoji/google/card_index.png and b/public/images/emoji/google/card_index.png differ diff --git a/public/images/emoji/google/card_index_dividers.png b/public/images/emoji/google/card_index_dividers.png index b07bdc1135..760534ac3e 100644 Binary files a/public/images/emoji/google/card_index_dividers.png and b/public/images/emoji/google/card_index_dividers.png differ diff --git a/public/images/emoji/google/caribbean_netherlands.png b/public/images/emoji/google/caribbean_netherlands.png index 4faf7e252e..7ec4a82f84 100644 Binary files a/public/images/emoji/google/caribbean_netherlands.png and b/public/images/emoji/google/caribbean_netherlands.png differ diff --git a/public/images/emoji/google/carousel_horse.png b/public/images/emoji/google/carousel_horse.png index 0b88504ac8..0d3862ae1e 100644 Binary files a/public/images/emoji/google/carousel_horse.png and b/public/images/emoji/google/carousel_horse.png differ diff --git a/public/images/emoji/google/carrot.png b/public/images/emoji/google/carrot.png index de775a0ac4..f5189ad4cd 100644 Binary files a/public/images/emoji/google/carrot.png and b/public/images/emoji/google/carrot.png differ diff --git a/public/images/emoji/google/cat.png b/public/images/emoji/google/cat.png index 5c5cb3cf38..e07f8b3547 100644 Binary files a/public/images/emoji/google/cat.png and b/public/images/emoji/google/cat.png differ diff --git a/public/images/emoji/google/cat2.png b/public/images/emoji/google/cat2.png index ebde91befe..0b81583531 100644 Binary files a/public/images/emoji/google/cat2.png and b/public/images/emoji/google/cat2.png differ diff --git a/public/images/emoji/google/cayman_islands.png b/public/images/emoji/google/cayman_islands.png index d0abde39fc..e414ee7cc9 100644 Binary files a/public/images/emoji/google/cayman_islands.png and b/public/images/emoji/google/cayman_islands.png differ diff --git a/public/images/emoji/google/cd.png b/public/images/emoji/google/cd.png index 487a77fe2e..8dc1565782 100644 Binary files a/public/images/emoji/google/cd.png and b/public/images/emoji/google/cd.png differ diff --git a/public/images/emoji/google/central_african_republic.png b/public/images/emoji/google/central_african_republic.png index 4537067070..4f858f9e83 100644 Binary files a/public/images/emoji/google/central_african_republic.png and b/public/images/emoji/google/central_african_republic.png differ diff --git a/public/images/emoji/google/ceuta_and_melilla.png b/public/images/emoji/google/ceuta_and_melilla.png index 4faf7e252e..e8ffa233cf 100644 Binary files a/public/images/emoji/google/ceuta_and_melilla.png and b/public/images/emoji/google/ceuta_and_melilla.png differ diff --git a/public/images/emoji/google/chad.png b/public/images/emoji/google/chad.png index 522d7b59a2..43726d4289 100644 Binary files a/public/images/emoji/google/chad.png and b/public/images/emoji/google/chad.png differ diff --git a/public/images/emoji/google/chains.png b/public/images/emoji/google/chains.png index b80ecc7991..715c697aba 100644 Binary files a/public/images/emoji/google/chains.png and b/public/images/emoji/google/chains.png differ diff --git a/public/images/emoji/google/champagne.png b/public/images/emoji/google/champagne.png index 998f04124e..0de663b783 100644 Binary files a/public/images/emoji/google/champagne.png and b/public/images/emoji/google/champagne.png differ diff --git a/public/images/emoji/google/chart.png b/public/images/emoji/google/chart.png index 11cbf557d3..20e369c89a 100644 Binary files a/public/images/emoji/google/chart.png and b/public/images/emoji/google/chart.png differ diff --git a/public/images/emoji/google/chart_with_downwards_trend.png b/public/images/emoji/google/chart_with_downwards_trend.png index b92c1479b8..316e32a000 100644 Binary files a/public/images/emoji/google/chart_with_downwards_trend.png and b/public/images/emoji/google/chart_with_downwards_trend.png differ diff --git a/public/images/emoji/google/chart_with_upwards_trend.png b/public/images/emoji/google/chart_with_upwards_trend.png index b1427d92b3..025ba8063d 100644 Binary files a/public/images/emoji/google/chart_with_upwards_trend.png and b/public/images/emoji/google/chart_with_upwards_trend.png differ diff --git a/public/images/emoji/google/checkered_flag.png b/public/images/emoji/google/checkered_flag.png index 15a07fcdb2..0f99af7532 100644 Binary files a/public/images/emoji/google/checkered_flag.png and b/public/images/emoji/google/checkered_flag.png differ diff --git a/public/images/emoji/google/cheese.png b/public/images/emoji/google/cheese.png index 4ec9446dd9..7c0fc74af9 100644 Binary files a/public/images/emoji/google/cheese.png and b/public/images/emoji/google/cheese.png differ diff --git a/public/images/emoji/google/cheese_wedge.png b/public/images/emoji/google/cheese_wedge.png index 4ec9446dd9..7c0fc74af9 100644 Binary files a/public/images/emoji/google/cheese_wedge.png and b/public/images/emoji/google/cheese_wedge.png differ diff --git a/public/images/emoji/google/cherries.png b/public/images/emoji/google/cherries.png index 3e8eeeea52..f5d7d18c0f 100644 Binary files a/public/images/emoji/google/cherries.png and b/public/images/emoji/google/cherries.png differ diff --git a/public/images/emoji/google/cherry_blossom.png b/public/images/emoji/google/cherry_blossom.png index 14464430d3..d2abd42fa0 100644 Binary files a/public/images/emoji/google/cherry_blossom.png and b/public/images/emoji/google/cherry_blossom.png differ diff --git a/public/images/emoji/google/chess_pawn.png b/public/images/emoji/google/chess_pawn.png new file mode 100644 index 0000000000..ef610a432f Binary files /dev/null and b/public/images/emoji/google/chess_pawn.png differ diff --git a/public/images/emoji/google/chestnut.png b/public/images/emoji/google/chestnut.png index 18a18705b7..092901cba3 100644 Binary files a/public/images/emoji/google/chestnut.png and b/public/images/emoji/google/chestnut.png differ diff --git a/public/images/emoji/google/chicken.png b/public/images/emoji/google/chicken.png index 4d38939cd6..25f31829a8 100644 Binary files a/public/images/emoji/google/chicken.png and b/public/images/emoji/google/chicken.png differ diff --git a/public/images/emoji/google/child.png b/public/images/emoji/google/child.png index c3bfaaab09..60a1cafca8 100644 Binary files a/public/images/emoji/google/child.png and b/public/images/emoji/google/child.png differ diff --git a/public/images/emoji/google/children_crossing.png b/public/images/emoji/google/children_crossing.png index 773c93de5a..ef904fd467 100644 Binary files a/public/images/emoji/google/children_crossing.png and b/public/images/emoji/google/children_crossing.png differ diff --git a/public/images/emoji/google/chile.png b/public/images/emoji/google/chile.png index e35e328a2f..d241612fad 100644 Binary files a/public/images/emoji/google/chile.png and b/public/images/emoji/google/chile.png differ diff --git a/public/images/emoji/google/chipmunk.png b/public/images/emoji/google/chipmunk.png index cacd8b9606..f111561b70 100644 Binary files a/public/images/emoji/google/chipmunk.png and b/public/images/emoji/google/chipmunk.png differ diff --git a/public/images/emoji/google/chocolate_bar.png b/public/images/emoji/google/chocolate_bar.png index 5e3313d8db..3614d5278d 100644 Binary files a/public/images/emoji/google/chocolate_bar.png and b/public/images/emoji/google/chocolate_bar.png differ diff --git a/public/images/emoji/google/chopsticks.png b/public/images/emoji/google/chopsticks.png index 75b7fb3138..8d3d808c1e 100644 Binary files a/public/images/emoji/google/chopsticks.png and b/public/images/emoji/google/chopsticks.png differ diff --git a/public/images/emoji/google/christmas_island.png b/public/images/emoji/google/christmas_island.png index 9b48743ac6..fa9985b763 100644 Binary files a/public/images/emoji/google/christmas_island.png and b/public/images/emoji/google/christmas_island.png differ diff --git a/public/images/emoji/google/christmas_tree.png b/public/images/emoji/google/christmas_tree.png index 4f34500546..2e61b41296 100644 Binary files a/public/images/emoji/google/christmas_tree.png and b/public/images/emoji/google/christmas_tree.png differ diff --git a/public/images/emoji/google/church.png b/public/images/emoji/google/church.png index d1d186d7e9..e4820fe0b9 100644 Binary files a/public/images/emoji/google/church.png and b/public/images/emoji/google/church.png differ diff --git a/public/images/emoji/google/cinema.png b/public/images/emoji/google/cinema.png index 5f0b648f95..74b944c3e2 100644 Binary files a/public/images/emoji/google/cinema.png and b/public/images/emoji/google/cinema.png differ diff --git a/public/images/emoji/google/circus_tent.png b/public/images/emoji/google/circus_tent.png index 71f546a4ca..b0fc0f1795 100644 Binary files a/public/images/emoji/google/circus_tent.png and b/public/images/emoji/google/circus_tent.png differ diff --git a/public/images/emoji/google/city_dusk.png b/public/images/emoji/google/city_dusk.png index 846f9e2ff4..8ba13940c9 100644 Binary files a/public/images/emoji/google/city_dusk.png and b/public/images/emoji/google/city_dusk.png differ diff --git a/public/images/emoji/google/city_sunrise.png b/public/images/emoji/google/city_sunrise.png index 94d6d5d5dc..cb4d278400 100644 Binary files a/public/images/emoji/google/city_sunrise.png and b/public/images/emoji/google/city_sunrise.png differ diff --git a/public/images/emoji/google/city_sunset.png b/public/images/emoji/google/city_sunset.png index 846f9e2ff4..8ba13940c9 100644 Binary files a/public/images/emoji/google/city_sunset.png and b/public/images/emoji/google/city_sunset.png differ diff --git a/public/images/emoji/google/cityscape.png b/public/images/emoji/google/cityscape.png index eeb70dfd68..34e9cee9f4 100644 Binary files a/public/images/emoji/google/cityscape.png and b/public/images/emoji/google/cityscape.png differ diff --git a/public/images/emoji/google/cl.png b/public/images/emoji/google/cl.png index 5a9debdf28..5e63e9e9d9 100644 Binary files a/public/images/emoji/google/cl.png and b/public/images/emoji/google/cl.png differ diff --git a/public/images/emoji/google/clamp.png b/public/images/emoji/google/clamp.png index b70ff09592..bf1c89d9c8 100644 Binary files a/public/images/emoji/google/clamp.png and b/public/images/emoji/google/clamp.png differ diff --git a/public/images/emoji/google/clap.png b/public/images/emoji/google/clap.png index 4834ca7b4f..48408b3c02 100644 Binary files a/public/images/emoji/google/clap.png and b/public/images/emoji/google/clap.png differ diff --git a/public/images/emoji/google/clapper.png b/public/images/emoji/google/clapper.png index 8cef95f95f..da649388a8 100644 Binary files a/public/images/emoji/google/clapper.png and b/public/images/emoji/google/clapper.png differ diff --git a/public/images/emoji/google/classical_building.png b/public/images/emoji/google/classical_building.png index 430c44a81c..6ab07ed6d6 100644 Binary files a/public/images/emoji/google/classical_building.png and b/public/images/emoji/google/classical_building.png differ diff --git a/public/images/emoji/google/clinking_glasses.png b/public/images/emoji/google/clinking_glasses.png index 3fabb8679f..53e9659c9b 100644 Binary files a/public/images/emoji/google/clinking_glasses.png and b/public/images/emoji/google/clinking_glasses.png differ diff --git a/public/images/emoji/google/clipboard.png b/public/images/emoji/google/clipboard.png index b146b4383b..769ffed928 100644 Binary files a/public/images/emoji/google/clipboard.png and b/public/images/emoji/google/clipboard.png differ diff --git a/public/images/emoji/google/clipperton_island.png b/public/images/emoji/google/clipperton_island.png index b836e555de..87b859be73 100644 Binary files a/public/images/emoji/google/clipperton_island.png and b/public/images/emoji/google/clipperton_island.png differ diff --git a/public/images/emoji/google/clock.png b/public/images/emoji/google/clock.png index ae0fcb7c98..68dac9ae11 100644 Binary files a/public/images/emoji/google/clock.png and b/public/images/emoji/google/clock.png differ diff --git a/public/images/emoji/google/clock1.png b/public/images/emoji/google/clock1.png index b969d97237..d5704b00f2 100644 Binary files a/public/images/emoji/google/clock1.png and b/public/images/emoji/google/clock1.png differ diff --git a/public/images/emoji/google/clock10.png b/public/images/emoji/google/clock10.png index 0e3e8cc098..8cbf6968d1 100644 Binary files a/public/images/emoji/google/clock10.png and b/public/images/emoji/google/clock10.png differ diff --git a/public/images/emoji/google/clock1030.png b/public/images/emoji/google/clock1030.png index e4229a52d1..3d16fca601 100644 Binary files a/public/images/emoji/google/clock1030.png and b/public/images/emoji/google/clock1030.png differ diff --git a/public/images/emoji/google/clock11.png b/public/images/emoji/google/clock11.png index 1056075d74..55cbfe9d0f 100644 Binary files a/public/images/emoji/google/clock11.png and b/public/images/emoji/google/clock11.png differ diff --git a/public/images/emoji/google/clock1130.png b/public/images/emoji/google/clock1130.png index 46b4f4b8df..272b603a4f 100644 Binary files a/public/images/emoji/google/clock1130.png and b/public/images/emoji/google/clock1130.png differ diff --git a/public/images/emoji/google/clock12.png b/public/images/emoji/google/clock12.png index 5528c719bf..7a3e57ab55 100644 Binary files a/public/images/emoji/google/clock12.png and b/public/images/emoji/google/clock12.png differ diff --git a/public/images/emoji/google/clock1230.png b/public/images/emoji/google/clock1230.png index 38e78462a5..1e2aa8db44 100644 Binary files a/public/images/emoji/google/clock1230.png and b/public/images/emoji/google/clock1230.png differ diff --git a/public/images/emoji/google/clock130.png b/public/images/emoji/google/clock130.png index 9312f24f4e..b7fe64382a 100644 Binary files a/public/images/emoji/google/clock130.png and b/public/images/emoji/google/clock130.png differ diff --git a/public/images/emoji/google/clock2.png b/public/images/emoji/google/clock2.png index dd6f8e81bf..2413e480a9 100644 Binary files a/public/images/emoji/google/clock2.png and b/public/images/emoji/google/clock2.png differ diff --git a/public/images/emoji/google/clock230.png b/public/images/emoji/google/clock230.png index 13043c02fc..963c186e54 100644 Binary files a/public/images/emoji/google/clock230.png and b/public/images/emoji/google/clock230.png differ diff --git a/public/images/emoji/google/clock3.png b/public/images/emoji/google/clock3.png index 8518680fd9..0b6d5486bd 100644 Binary files a/public/images/emoji/google/clock3.png and b/public/images/emoji/google/clock3.png differ diff --git a/public/images/emoji/google/clock330.png b/public/images/emoji/google/clock330.png index 97074ef680..b3ba931c36 100644 Binary files a/public/images/emoji/google/clock330.png and b/public/images/emoji/google/clock330.png differ diff --git a/public/images/emoji/google/clock4.png b/public/images/emoji/google/clock4.png index 18ba2d702f..e0e993be0b 100644 Binary files a/public/images/emoji/google/clock4.png and b/public/images/emoji/google/clock4.png differ diff --git a/public/images/emoji/google/clock430.png b/public/images/emoji/google/clock430.png index 6f88dab03a..6792e7106c 100644 Binary files a/public/images/emoji/google/clock430.png and b/public/images/emoji/google/clock430.png differ diff --git a/public/images/emoji/google/clock5.png b/public/images/emoji/google/clock5.png index 021346475e..b2db3814c0 100644 Binary files a/public/images/emoji/google/clock5.png and b/public/images/emoji/google/clock5.png differ diff --git a/public/images/emoji/google/clock530.png b/public/images/emoji/google/clock530.png index 577fd77c30..a84bf9ad3d 100644 Binary files a/public/images/emoji/google/clock530.png and b/public/images/emoji/google/clock530.png differ diff --git a/public/images/emoji/google/clock6.png b/public/images/emoji/google/clock6.png index dd2a20cae5..055f7883fb 100644 Binary files a/public/images/emoji/google/clock6.png and b/public/images/emoji/google/clock6.png differ diff --git a/public/images/emoji/google/clock630.png b/public/images/emoji/google/clock630.png index 0fe5b0a746..f9efe99933 100644 Binary files a/public/images/emoji/google/clock630.png and b/public/images/emoji/google/clock630.png differ diff --git a/public/images/emoji/google/clock7.png b/public/images/emoji/google/clock7.png index c2d3db29db..a4ed1d1146 100644 Binary files a/public/images/emoji/google/clock7.png and b/public/images/emoji/google/clock7.png differ diff --git a/public/images/emoji/google/clock730.png b/public/images/emoji/google/clock730.png index 918bda86c4..3bbdc34206 100644 Binary files a/public/images/emoji/google/clock730.png and b/public/images/emoji/google/clock730.png differ diff --git a/public/images/emoji/google/clock8.png b/public/images/emoji/google/clock8.png index eb74217338..f0dcaf80c4 100644 Binary files a/public/images/emoji/google/clock8.png and b/public/images/emoji/google/clock8.png differ diff --git a/public/images/emoji/google/clock830.png b/public/images/emoji/google/clock830.png index b2c8a9d9d7..a707d41bea 100644 Binary files a/public/images/emoji/google/clock830.png and b/public/images/emoji/google/clock830.png differ diff --git a/public/images/emoji/google/clock9.png b/public/images/emoji/google/clock9.png index 70deddca37..b2994641da 100644 Binary files a/public/images/emoji/google/clock9.png and b/public/images/emoji/google/clock9.png differ diff --git a/public/images/emoji/google/clock930.png b/public/images/emoji/google/clock930.png index cadf2f184e..19c7f52fa5 100644 Binary files a/public/images/emoji/google/clock930.png and b/public/images/emoji/google/clock930.png differ diff --git a/public/images/emoji/google/closed_book.png b/public/images/emoji/google/closed_book.png index 7ba63b1128..0e1f2c339c 100644 Binary files a/public/images/emoji/google/closed_book.png and b/public/images/emoji/google/closed_book.png differ diff --git a/public/images/emoji/google/closed_lock_with_key.png b/public/images/emoji/google/closed_lock_with_key.png index d3c4cbefc9..6e308b4222 100644 Binary files a/public/images/emoji/google/closed_lock_with_key.png and b/public/images/emoji/google/closed_lock_with_key.png differ diff --git a/public/images/emoji/google/closed_umbrella.png b/public/images/emoji/google/closed_umbrella.png index d62331eb2f..1093a05263 100644 Binary files a/public/images/emoji/google/closed_umbrella.png and b/public/images/emoji/google/closed_umbrella.png differ diff --git a/public/images/emoji/google/cloud.png b/public/images/emoji/google/cloud.png index cf348825c6..183f524fa5 100644 Binary files a/public/images/emoji/google/cloud.png and b/public/images/emoji/google/cloud.png differ diff --git a/public/images/emoji/google/cloud_lightning.png b/public/images/emoji/google/cloud_lightning.png index 0b7c9b0e4c..eef0031399 100644 Binary files a/public/images/emoji/google/cloud_lightning.png and b/public/images/emoji/google/cloud_lightning.png differ diff --git a/public/images/emoji/google/cloud_rain.png b/public/images/emoji/google/cloud_rain.png index 736dc43659..d96a1707f9 100644 Binary files a/public/images/emoji/google/cloud_rain.png and b/public/images/emoji/google/cloud_rain.png differ diff --git a/public/images/emoji/google/cloud_snow.png b/public/images/emoji/google/cloud_snow.png index c941135d9c..89f7117aa4 100644 Binary files a/public/images/emoji/google/cloud_snow.png and b/public/images/emoji/google/cloud_snow.png differ diff --git a/public/images/emoji/google/cloud_tornado.png b/public/images/emoji/google/cloud_tornado.png index b2e18065c1..01d681d1ca 100644 Binary files a/public/images/emoji/google/cloud_tornado.png and b/public/images/emoji/google/cloud_tornado.png differ diff --git a/public/images/emoji/google/cloud_with_lightning.png b/public/images/emoji/google/cloud_with_lightning.png index 0b7c9b0e4c..eef0031399 100644 Binary files a/public/images/emoji/google/cloud_with_lightning.png and b/public/images/emoji/google/cloud_with_lightning.png differ diff --git a/public/images/emoji/google/cloud_with_lightning_and_rain.png b/public/images/emoji/google/cloud_with_lightning_and_rain.png index 8cf3322c7d..e4bd4aa6fb 100644 Binary files a/public/images/emoji/google/cloud_with_lightning_and_rain.png and b/public/images/emoji/google/cloud_with_lightning_and_rain.png differ diff --git a/public/images/emoji/google/cloud_with_rain.png b/public/images/emoji/google/cloud_with_rain.png index 736dc43659..d96a1707f9 100644 Binary files a/public/images/emoji/google/cloud_with_rain.png and b/public/images/emoji/google/cloud_with_rain.png differ diff --git a/public/images/emoji/google/cloud_with_snow.png b/public/images/emoji/google/cloud_with_snow.png index c941135d9c..89f7117aa4 100644 Binary files a/public/images/emoji/google/cloud_with_snow.png and b/public/images/emoji/google/cloud_with_snow.png differ diff --git a/public/images/emoji/google/cloud_with_tornado.png b/public/images/emoji/google/cloud_with_tornado.png index b2e18065c1..01d681d1ca 100644 Binary files a/public/images/emoji/google/cloud_with_tornado.png and b/public/images/emoji/google/cloud_with_tornado.png differ diff --git a/public/images/emoji/google/clown_face.png b/public/images/emoji/google/clown_face.png index 7bb43404b1..33c91f31a3 100644 Binary files a/public/images/emoji/google/clown_face.png and b/public/images/emoji/google/clown_face.png differ diff --git a/public/images/emoji/google/clubs.png b/public/images/emoji/google/clubs.png index 3be8fce7da..003cf462b0 100644 Binary files a/public/images/emoji/google/clubs.png and b/public/images/emoji/google/clubs.png differ diff --git a/public/images/emoji/google/cn.png b/public/images/emoji/google/cn.png index 05a72fed32..36d01d441e 100644 Binary files a/public/images/emoji/google/cn.png and b/public/images/emoji/google/cn.png differ diff --git a/public/images/emoji/google/coat.png b/public/images/emoji/google/coat.png index 661f213c45..9094355bbb 100644 Binary files a/public/images/emoji/google/coat.png and b/public/images/emoji/google/coat.png differ diff --git a/public/images/emoji/google/cocktail.png b/public/images/emoji/google/cocktail.png index b62109ebf3..425c41a2aa 100644 Binary files a/public/images/emoji/google/cocktail.png and b/public/images/emoji/google/cocktail.png differ diff --git a/public/images/emoji/google/coconut.png b/public/images/emoji/google/coconut.png index fcb9d4f13b..d0d2f8dc55 100644 Binary files a/public/images/emoji/google/coconut.png and b/public/images/emoji/google/coconut.png differ diff --git a/public/images/emoji/google/cocos_islands.png b/public/images/emoji/google/cocos_islands.png index a89d19e515..228ef444af 100644 Binary files a/public/images/emoji/google/cocos_islands.png and b/public/images/emoji/google/cocos_islands.png differ diff --git a/public/images/emoji/google/coffee.png b/public/images/emoji/google/coffee.png index 49ab8d2685..e9d84f130f 100644 Binary files a/public/images/emoji/google/coffee.png and b/public/images/emoji/google/coffee.png differ diff --git a/public/images/emoji/google/coffin.png b/public/images/emoji/google/coffin.png index 0a7e93cf87..ea7e6907e3 100644 Binary files a/public/images/emoji/google/coffin.png and b/public/images/emoji/google/coffin.png differ diff --git a/public/images/emoji/google/cold_face.png b/public/images/emoji/google/cold_face.png new file mode 100644 index 0000000000..f86069b1d2 Binary files /dev/null and b/public/images/emoji/google/cold_face.png differ diff --git a/public/images/emoji/google/cold_sweat.png b/public/images/emoji/google/cold_sweat.png index ea6ce85653..9d4446274d 100644 Binary files a/public/images/emoji/google/cold_sweat.png and b/public/images/emoji/google/cold_sweat.png differ diff --git a/public/images/emoji/google/colombia.png b/public/images/emoji/google/colombia.png index 34b679f6b0..ca9dee2141 100644 Binary files a/public/images/emoji/google/colombia.png and b/public/images/emoji/google/colombia.png differ diff --git a/public/images/emoji/google/comet.png b/public/images/emoji/google/comet.png index a733737ca6..d5e6361919 100644 Binary files a/public/images/emoji/google/comet.png and b/public/images/emoji/google/comet.png differ diff --git a/public/images/emoji/google/comoros.png b/public/images/emoji/google/comoros.png index 5ba20ffe6a..ac3c54c2d7 100644 Binary files a/public/images/emoji/google/comoros.png and b/public/images/emoji/google/comoros.png differ diff --git a/public/images/emoji/google/compass.png b/public/images/emoji/google/compass.png new file mode 100644 index 0000000000..78351240fd Binary files /dev/null and b/public/images/emoji/google/compass.png differ diff --git a/public/images/emoji/google/compression.png b/public/images/emoji/google/compression.png index b70ff09592..bf1c89d9c8 100644 Binary files a/public/images/emoji/google/compression.png and b/public/images/emoji/google/compression.png differ diff --git a/public/images/emoji/google/computer.png b/public/images/emoji/google/computer.png index cd6240d204..685ba8be94 100644 Binary files a/public/images/emoji/google/computer.png and b/public/images/emoji/google/computer.png differ diff --git a/public/images/emoji/google/computer_mouse.png b/public/images/emoji/google/computer_mouse.png index 28785439fc..02d114d01c 100644 Binary files a/public/images/emoji/google/computer_mouse.png and b/public/images/emoji/google/computer_mouse.png differ diff --git a/public/images/emoji/google/confetti_ball.png b/public/images/emoji/google/confetti_ball.png index a5e8d180de..365da60a73 100644 Binary files a/public/images/emoji/google/confetti_ball.png and b/public/images/emoji/google/confetti_ball.png differ diff --git a/public/images/emoji/google/confounded.png b/public/images/emoji/google/confounded.png index bcb5fe8545..806884c374 100644 Binary files a/public/images/emoji/google/confounded.png and b/public/images/emoji/google/confounded.png differ diff --git a/public/images/emoji/google/confused.png b/public/images/emoji/google/confused.png index d87de27196..1cd3834ef6 100644 Binary files a/public/images/emoji/google/confused.png and b/public/images/emoji/google/confused.png differ diff --git a/public/images/emoji/google/congo_brazzaville.png b/public/images/emoji/google/congo_brazzaville.png index 2ee620fd1f..ac7011f59c 100644 Binary files a/public/images/emoji/google/congo_brazzaville.png and b/public/images/emoji/google/congo_brazzaville.png differ diff --git a/public/images/emoji/google/congo_kinshasa.png b/public/images/emoji/google/congo_kinshasa.png index ad278a35a8..288168e222 100644 Binary files a/public/images/emoji/google/congo_kinshasa.png and b/public/images/emoji/google/congo_kinshasa.png differ diff --git a/public/images/emoji/google/congratulations.png b/public/images/emoji/google/congratulations.png index 8ec344c39f..7cfbb5840f 100644 Binary files a/public/images/emoji/google/congratulations.png and b/public/images/emoji/google/congratulations.png differ diff --git a/public/images/emoji/google/construction.png b/public/images/emoji/google/construction.png index 879a85c1bf..e522f97a27 100644 Binary files a/public/images/emoji/google/construction.png and b/public/images/emoji/google/construction.png differ diff --git a/public/images/emoji/google/construction_site.png b/public/images/emoji/google/construction_site.png index 444e3cd1ab..0b507cb370 100644 Binary files a/public/images/emoji/google/construction_site.png and b/public/images/emoji/google/construction_site.png differ diff --git a/public/images/emoji/google/construction_worker.png b/public/images/emoji/google/construction_worker.png index 5b258a4408..7d4cbcd8aa 100644 Binary files a/public/images/emoji/google/construction_worker.png and b/public/images/emoji/google/construction_worker.png differ diff --git a/public/images/emoji/google/construction_worker_man.png b/public/images/emoji/google/construction_worker_man.png index 5b258a4408..7d4cbcd8aa 100644 Binary files a/public/images/emoji/google/construction_worker_man.png and b/public/images/emoji/google/construction_worker_man.png differ diff --git a/public/images/emoji/google/construction_worker_woman.png b/public/images/emoji/google/construction_worker_woman.png index 854f6106be..5952d95a50 100644 Binary files a/public/images/emoji/google/construction_worker_woman.png and b/public/images/emoji/google/construction_worker_woman.png differ diff --git a/public/images/emoji/google/control_knobs.png b/public/images/emoji/google/control_knobs.png index 46c651d40d..1f510319c6 100644 Binary files a/public/images/emoji/google/control_knobs.png and b/public/images/emoji/google/control_knobs.png differ diff --git a/public/images/emoji/google/convenience_store.png b/public/images/emoji/google/convenience_store.png index 327f9635ce..2b064bbe6d 100644 Binary files a/public/images/emoji/google/convenience_store.png and b/public/images/emoji/google/convenience_store.png differ diff --git a/public/images/emoji/google/cook_islands.png b/public/images/emoji/google/cook_islands.png index 65c4c79bf2..c980e08230 100644 Binary files a/public/images/emoji/google/cook_islands.png and b/public/images/emoji/google/cook_islands.png differ diff --git a/public/images/emoji/google/cookie.png b/public/images/emoji/google/cookie.png index 486a52c7c4..7fe946c66b 100644 Binary files a/public/images/emoji/google/cookie.png and b/public/images/emoji/google/cookie.png differ diff --git a/public/images/emoji/google/cool.png b/public/images/emoji/google/cool.png index 2601ef888a..7f2a0e8555 100644 Binary files a/public/images/emoji/google/cool.png and b/public/images/emoji/google/cool.png differ diff --git a/public/images/emoji/google/cop.png b/public/images/emoji/google/cop.png index 7cdf83e122..050f460be4 100644 Binary files a/public/images/emoji/google/cop.png and b/public/images/emoji/google/cop.png differ diff --git a/public/images/emoji/google/copyright.png b/public/images/emoji/google/copyright.png index 3ea187513d..beaae53a64 100644 Binary files a/public/images/emoji/google/copyright.png and b/public/images/emoji/google/copyright.png differ diff --git a/public/images/emoji/google/corn.png b/public/images/emoji/google/corn.png index 86acf71da5..5159d93302 100644 Binary files a/public/images/emoji/google/corn.png and b/public/images/emoji/google/corn.png differ diff --git a/public/images/emoji/google/costa_rica.png b/public/images/emoji/google/costa_rica.png index d8602d36dc..3072356889 100644 Binary files a/public/images/emoji/google/costa_rica.png and b/public/images/emoji/google/costa_rica.png differ diff --git a/public/images/emoji/google/cote_divoire.png b/public/images/emoji/google/cote_divoire.png index 76dfead63e..e2a7f1fff0 100644 Binary files a/public/images/emoji/google/cote_divoire.png and b/public/images/emoji/google/cote_divoire.png differ diff --git a/public/images/emoji/google/couch.png b/public/images/emoji/google/couch.png index 3d13dbc4e7..15a03b347d 100644 Binary files a/public/images/emoji/google/couch.png and b/public/images/emoji/google/couch.png differ diff --git a/public/images/emoji/google/couch_and_lamp.png b/public/images/emoji/google/couch_and_lamp.png index 3d13dbc4e7..15a03b347d 100644 Binary files a/public/images/emoji/google/couch_and_lamp.png and b/public/images/emoji/google/couch_and_lamp.png differ diff --git a/public/images/emoji/google/couple.png b/public/images/emoji/google/couple.png index cb562811b2..07ce7c3ebb 100644 Binary files a/public/images/emoji/google/couple.png and b/public/images/emoji/google/couple.png differ diff --git a/public/images/emoji/google/couple_with_heart.png b/public/images/emoji/google/couple_with_heart.png index d201b1a784..a1bc095d3a 100644 Binary files a/public/images/emoji/google/couple_with_heart.png and b/public/images/emoji/google/couple_with_heart.png differ diff --git a/public/images/emoji/google/couple_with_heart_man_man.png b/public/images/emoji/google/couple_with_heart_man_man.png index edfa25c9a0..409b96f0cf 100644 Binary files a/public/images/emoji/google/couple_with_heart_man_man.png and b/public/images/emoji/google/couple_with_heart_man_man.png differ diff --git a/public/images/emoji/google/couple_with_heart_woman_man.png b/public/images/emoji/google/couple_with_heart_woman_man.png index d201b1a784..a1bc095d3a 100644 Binary files a/public/images/emoji/google/couple_with_heart_woman_man.png and b/public/images/emoji/google/couple_with_heart_woman_man.png differ diff --git a/public/images/emoji/google/couple_with_heart_woman_woman.png b/public/images/emoji/google/couple_with_heart_woman_woman.png index f4b433aa95..5f56b093f2 100644 Binary files a/public/images/emoji/google/couple_with_heart_woman_woman.png and b/public/images/emoji/google/couple_with_heart_woman_woman.png differ diff --git a/public/images/emoji/google/couplekiss.png b/public/images/emoji/google/couplekiss.png index eb5249499a..776b3f6b0c 100644 Binary files a/public/images/emoji/google/couplekiss.png and b/public/images/emoji/google/couplekiss.png differ diff --git a/public/images/emoji/google/couplekiss_man_man.png b/public/images/emoji/google/couplekiss_man_man.png index 231fc8e523..b9f813d5a4 100644 Binary files a/public/images/emoji/google/couplekiss_man_man.png and b/public/images/emoji/google/couplekiss_man_man.png differ diff --git a/public/images/emoji/google/couplekiss_man_woman.png b/public/images/emoji/google/couplekiss_man_woman.png index eb5249499a..776b3f6b0c 100644 Binary files a/public/images/emoji/google/couplekiss_man_woman.png and b/public/images/emoji/google/couplekiss_man_woman.png differ diff --git a/public/images/emoji/google/couplekiss_woman_woman.png b/public/images/emoji/google/couplekiss_woman_woman.png index 0e516e9376..761a076318 100644 Binary files a/public/images/emoji/google/couplekiss_woman_woman.png and b/public/images/emoji/google/couplekiss_woman_woman.png differ diff --git a/public/images/emoji/google/cow.png b/public/images/emoji/google/cow.png index 3b0ed308f1..0dbe77ca6e 100644 Binary files a/public/images/emoji/google/cow.png and b/public/images/emoji/google/cow.png differ diff --git a/public/images/emoji/google/cow2.png b/public/images/emoji/google/cow2.png index 443b210900..68491c35b5 100644 Binary files a/public/images/emoji/google/cow2.png and b/public/images/emoji/google/cow2.png differ diff --git a/public/images/emoji/google/cowboy_hat_face.png b/public/images/emoji/google/cowboy_hat_face.png index 69a4bf6684..89a39b8604 100644 Binary files a/public/images/emoji/google/cowboy_hat_face.png and b/public/images/emoji/google/cowboy_hat_face.png differ diff --git a/public/images/emoji/google/crab.png b/public/images/emoji/google/crab.png index ba5e08c3bf..085bd1609e 100644 Binary files a/public/images/emoji/google/crab.png and b/public/images/emoji/google/crab.png differ diff --git a/public/images/emoji/google/crayon.png b/public/images/emoji/google/crayon.png index bec3b70573..aa13705fb2 100644 Binary files a/public/images/emoji/google/crayon.png and b/public/images/emoji/google/crayon.png differ diff --git a/public/images/emoji/google/crazy_face.png b/public/images/emoji/google/crazy_face.png index 8637fa7bf4..2b4cf69063 100644 Binary files a/public/images/emoji/google/crazy_face.png and b/public/images/emoji/google/crazy_face.png differ diff --git a/public/images/emoji/google/credit_card.png b/public/images/emoji/google/credit_card.png index 37ba1069d2..ff5834d5ab 100644 Binary files a/public/images/emoji/google/credit_card.png and b/public/images/emoji/google/credit_card.png differ diff --git a/public/images/emoji/google/crescent_moon.png b/public/images/emoji/google/crescent_moon.png index 50e2bdb4a5..d425854b6c 100644 Binary files a/public/images/emoji/google/crescent_moon.png and b/public/images/emoji/google/crescent_moon.png differ diff --git a/public/images/emoji/google/cricket.png b/public/images/emoji/google/cricket.png index fc747258e8..10916fde49 100644 Binary files a/public/images/emoji/google/cricket.png and b/public/images/emoji/google/cricket.png differ diff --git a/public/images/emoji/google/cricket_bat_and_ball.png b/public/images/emoji/google/cricket_bat_and_ball.png index d5309a3626..bda07ee0fe 100644 Binary files a/public/images/emoji/google/cricket_bat_and_ball.png and b/public/images/emoji/google/cricket_bat_and_ball.png differ diff --git a/public/images/emoji/google/cricket_bat_ball.png b/public/images/emoji/google/cricket_bat_ball.png index d5309a3626..bda07ee0fe 100644 Binary files a/public/images/emoji/google/cricket_bat_ball.png and b/public/images/emoji/google/cricket_bat_ball.png differ diff --git a/public/images/emoji/google/croatia.png b/public/images/emoji/google/croatia.png index 744eb40aba..4ec8541edf 100644 Binary files a/public/images/emoji/google/croatia.png and b/public/images/emoji/google/croatia.png differ diff --git a/public/images/emoji/google/crocodile.png b/public/images/emoji/google/crocodile.png index c8363736ba..c6d1b172a8 100644 Binary files a/public/images/emoji/google/crocodile.png and b/public/images/emoji/google/crocodile.png differ diff --git a/public/images/emoji/google/croissant.png b/public/images/emoji/google/croissant.png index 48be4a4c35..558b083847 100644 Binary files a/public/images/emoji/google/croissant.png and b/public/images/emoji/google/croissant.png differ diff --git a/public/images/emoji/google/cross.png b/public/images/emoji/google/cross.png index f0608264bb..d1294ac4c0 100644 Binary files a/public/images/emoji/google/cross.png and b/public/images/emoji/google/cross.png differ diff --git a/public/images/emoji/google/crossed_fingers.png b/public/images/emoji/google/crossed_fingers.png index 6fd03b7dcf..94757417d3 100644 Binary files a/public/images/emoji/google/crossed_fingers.png and b/public/images/emoji/google/crossed_fingers.png differ diff --git a/public/images/emoji/google/crossed_flags.png b/public/images/emoji/google/crossed_flags.png index a73fd11f40..d2f68159e1 100644 Binary files a/public/images/emoji/google/crossed_flags.png and b/public/images/emoji/google/crossed_flags.png differ diff --git a/public/images/emoji/google/crossed_swords.png b/public/images/emoji/google/crossed_swords.png index ce64a83108..37a5f065a0 100644 Binary files a/public/images/emoji/google/crossed_swords.png and b/public/images/emoji/google/crossed_swords.png differ diff --git a/public/images/emoji/google/crown.png b/public/images/emoji/google/crown.png index 8b8fc97136..b6feec1d62 100644 Binary files a/public/images/emoji/google/crown.png and b/public/images/emoji/google/crown.png differ diff --git a/public/images/emoji/google/cruise_ship.png b/public/images/emoji/google/cruise_ship.png index be03fc1343..562b56cc9a 100644 Binary files a/public/images/emoji/google/cruise_ship.png and b/public/images/emoji/google/cruise_ship.png differ diff --git a/public/images/emoji/google/cry.png b/public/images/emoji/google/cry.png index 793dc9c1c9..cb200543b0 100644 Binary files a/public/images/emoji/google/cry.png and b/public/images/emoji/google/cry.png differ diff --git a/public/images/emoji/google/crying_cat_face.png b/public/images/emoji/google/crying_cat_face.png index e79e6ab2f4..90c0c9a99f 100644 Binary files a/public/images/emoji/google/crying_cat_face.png and b/public/images/emoji/google/crying_cat_face.png differ diff --git a/public/images/emoji/google/crystal_ball.png b/public/images/emoji/google/crystal_ball.png index af49854884..e047f4c5a5 100644 Binary files a/public/images/emoji/google/crystal_ball.png and b/public/images/emoji/google/crystal_ball.png differ diff --git a/public/images/emoji/google/cuba.png b/public/images/emoji/google/cuba.png index 0167f57462..bd327e4b6a 100644 Binary files a/public/images/emoji/google/cuba.png and b/public/images/emoji/google/cuba.png differ diff --git a/public/images/emoji/google/cucumber.png b/public/images/emoji/google/cucumber.png index 959ee6e3a7..7fb1f7b800 100644 Binary files a/public/images/emoji/google/cucumber.png and b/public/images/emoji/google/cucumber.png differ diff --git a/public/images/emoji/google/cup_with_straw.png b/public/images/emoji/google/cup_with_straw.png index 5ee2beb2ab..5855231303 100644 Binary files a/public/images/emoji/google/cup_with_straw.png and b/public/images/emoji/google/cup_with_straw.png differ diff --git a/public/images/emoji/google/cupcake.png b/public/images/emoji/google/cupcake.png new file mode 100644 index 0000000000..364426e8af Binary files /dev/null and b/public/images/emoji/google/cupcake.png differ diff --git a/public/images/emoji/google/cupid.png b/public/images/emoji/google/cupid.png index f5652e31c0..3650563dfd 100644 Binary files a/public/images/emoji/google/cupid.png and b/public/images/emoji/google/cupid.png differ diff --git a/public/images/emoji/google/curacao.png b/public/images/emoji/google/curacao.png index 7fbc2eda4e..a172aacb9f 100644 Binary files a/public/images/emoji/google/curacao.png and b/public/images/emoji/google/curacao.png differ diff --git a/public/images/emoji/google/curling_stone.png b/public/images/emoji/google/curling_stone.png index 2403ad6699..787654be8c 100644 Binary files a/public/images/emoji/google/curling_stone.png and b/public/images/emoji/google/curling_stone.png differ diff --git a/public/images/emoji/google/curly_loop.png b/public/images/emoji/google/curly_loop.png index 5e5f2c88c1..e1a0b2ddc1 100644 Binary files a/public/images/emoji/google/curly_loop.png and b/public/images/emoji/google/curly_loop.png differ diff --git a/public/images/emoji/google/currency_exchange.png b/public/images/emoji/google/currency_exchange.png index adeb33caa7..f0344a1c41 100644 Binary files a/public/images/emoji/google/currency_exchange.png and b/public/images/emoji/google/currency_exchange.png differ diff --git a/public/images/emoji/google/curry.png b/public/images/emoji/google/curry.png index 02d76bbf84..2540ae5589 100644 Binary files a/public/images/emoji/google/curry.png and b/public/images/emoji/google/curry.png differ diff --git a/public/images/emoji/google/custard.png b/public/images/emoji/google/custard.png index 8d9ab7e81e..6d21dceae5 100644 Binary files a/public/images/emoji/google/custard.png and b/public/images/emoji/google/custard.png differ diff --git a/public/images/emoji/google/customs.png b/public/images/emoji/google/customs.png index 90af5690fa..2434be2ec8 100644 Binary files a/public/images/emoji/google/customs.png and b/public/images/emoji/google/customs.png differ diff --git a/public/images/emoji/google/cut_of_meat.png b/public/images/emoji/google/cut_of_meat.png index c224fe3616..dc403642a7 100644 Binary files a/public/images/emoji/google/cut_of_meat.png and b/public/images/emoji/google/cut_of_meat.png differ diff --git a/public/images/emoji/google/cyclone.png b/public/images/emoji/google/cyclone.png index cd30e74536..b1d50cd726 100644 Binary files a/public/images/emoji/google/cyclone.png and b/public/images/emoji/google/cyclone.png differ diff --git a/public/images/emoji/google/cyprus.png b/public/images/emoji/google/cyprus.png index 0111d9915c..bbdb68a3d0 100644 Binary files a/public/images/emoji/google/cyprus.png and b/public/images/emoji/google/cyprus.png differ diff --git a/public/images/emoji/google/czech_republic.png b/public/images/emoji/google/czech_republic.png index 84be3832e7..664db408e4 100644 Binary files a/public/images/emoji/google/czech_republic.png and b/public/images/emoji/google/czech_republic.png differ diff --git a/public/images/emoji/google/dagger.png b/public/images/emoji/google/dagger.png index 64e94594cf..75b55b6104 100644 Binary files a/public/images/emoji/google/dagger.png and b/public/images/emoji/google/dagger.png differ diff --git a/public/images/emoji/google/dagger_knife.png b/public/images/emoji/google/dagger_knife.png index 64e94594cf..75b55b6104 100644 Binary files a/public/images/emoji/google/dagger_knife.png and b/public/images/emoji/google/dagger_knife.png differ diff --git a/public/images/emoji/google/dancer.png b/public/images/emoji/google/dancer.png index 243ede417d..1daa8adb53 100644 Binary files a/public/images/emoji/google/dancer.png and b/public/images/emoji/google/dancer.png differ diff --git a/public/images/emoji/google/dancers.png b/public/images/emoji/google/dancers.png index 7f6e7c3747..daf2bffd53 100644 Binary files a/public/images/emoji/google/dancers.png and b/public/images/emoji/google/dancers.png differ diff --git a/public/images/emoji/google/dancing_men.png b/public/images/emoji/google/dancing_men.png index fc5f8d1ec5..649f99864a 100644 Binary files a/public/images/emoji/google/dancing_men.png and b/public/images/emoji/google/dancing_men.png differ diff --git a/public/images/emoji/google/dancing_women.png b/public/images/emoji/google/dancing_women.png index 7f6e7c3747..daf2bffd53 100644 Binary files a/public/images/emoji/google/dancing_women.png and b/public/images/emoji/google/dancing_women.png differ diff --git a/public/images/emoji/google/dango.png b/public/images/emoji/google/dango.png index e53b08a7eb..32f3c62d2e 100644 Binary files a/public/images/emoji/google/dango.png and b/public/images/emoji/google/dango.png differ diff --git a/public/images/emoji/google/dark_sunglasses.png b/public/images/emoji/google/dark_sunglasses.png index c808bd9c1f..57952895f7 100644 Binary files a/public/images/emoji/google/dark_sunglasses.png and b/public/images/emoji/google/dark_sunglasses.png differ diff --git a/public/images/emoji/google/dart.png b/public/images/emoji/google/dart.png index e001162b8a..57cd708f9b 100644 Binary files a/public/images/emoji/google/dart.png and b/public/images/emoji/google/dart.png differ diff --git a/public/images/emoji/google/dash.png b/public/images/emoji/google/dash.png index ae2834b322..a1b12cf6df 100644 Binary files a/public/images/emoji/google/dash.png and b/public/images/emoji/google/dash.png differ diff --git a/public/images/emoji/google/date.png b/public/images/emoji/google/date.png index 6318265bb9..5f89b33dc5 100644 Binary files a/public/images/emoji/google/date.png and b/public/images/emoji/google/date.png differ diff --git a/public/images/emoji/google/de.png b/public/images/emoji/google/de.png index 5110b322d1..a7756cea25 100644 Binary files a/public/images/emoji/google/de.png and b/public/images/emoji/google/de.png differ diff --git a/public/images/emoji/google/deciduous_tree.png b/public/images/emoji/google/deciduous_tree.png index 33c2ff94ef..2c54ff04f9 100644 Binary files a/public/images/emoji/google/deciduous_tree.png and b/public/images/emoji/google/deciduous_tree.png differ diff --git a/public/images/emoji/google/deer.png b/public/images/emoji/google/deer.png index 1b957d53e9..22679e6ef6 100644 Binary files a/public/images/emoji/google/deer.png and b/public/images/emoji/google/deer.png differ diff --git a/public/images/emoji/google/denmark.png b/public/images/emoji/google/denmark.png index 936d7cbb87..c4da57120c 100644 Binary files a/public/images/emoji/google/denmark.png and b/public/images/emoji/google/denmark.png differ diff --git a/public/images/emoji/google/department_store.png b/public/images/emoji/google/department_store.png index f92d750cea..d41c6ed69e 100644 Binary files a/public/images/emoji/google/department_store.png and b/public/images/emoji/google/department_store.png differ diff --git a/public/images/emoji/google/derelict_house.png b/public/images/emoji/google/derelict_house.png index 7b14c6c6cd..3bd3b89992 100644 Binary files a/public/images/emoji/google/derelict_house.png and b/public/images/emoji/google/derelict_house.png differ diff --git a/public/images/emoji/google/derelict_house_building.png b/public/images/emoji/google/derelict_house_building.png index 7b14c6c6cd..3bd3b89992 100644 Binary files a/public/images/emoji/google/derelict_house_building.png and b/public/images/emoji/google/derelict_house_building.png differ diff --git a/public/images/emoji/google/desert.png b/public/images/emoji/google/desert.png index 410b28f0a7..30221810af 100644 Binary files a/public/images/emoji/google/desert.png and b/public/images/emoji/google/desert.png differ diff --git a/public/images/emoji/google/desert_island.png b/public/images/emoji/google/desert_island.png index e68a3fe14f..a396a8e622 100644 Binary files a/public/images/emoji/google/desert_island.png and b/public/images/emoji/google/desert_island.png differ diff --git a/public/images/emoji/google/desktop.png b/public/images/emoji/google/desktop.png index 8345b9fd6f..be8dcf2e9d 100644 Binary files a/public/images/emoji/google/desktop.png and b/public/images/emoji/google/desktop.png differ diff --git a/public/images/emoji/google/desktop_computer.png b/public/images/emoji/google/desktop_computer.png index 8345b9fd6f..be8dcf2e9d 100644 Binary files a/public/images/emoji/google/desktop_computer.png and b/public/images/emoji/google/desktop_computer.png differ diff --git a/public/images/emoji/google/diamond_shape_with_a_dot_inside.png b/public/images/emoji/google/diamond_shape_with_a_dot_inside.png index f9c79355ce..9c707c53d8 100644 Binary files a/public/images/emoji/google/diamond_shape_with_a_dot_inside.png and b/public/images/emoji/google/diamond_shape_with_a_dot_inside.png differ diff --git a/public/images/emoji/google/diamonds.png b/public/images/emoji/google/diamonds.png index 055e6b8c9b..ce56d7497d 100644 Binary files a/public/images/emoji/google/diamonds.png and b/public/images/emoji/google/diamonds.png differ diff --git a/public/images/emoji/google/diego_garcia.png b/public/images/emoji/google/diego_garcia.png index 4faf7e252e..8295719837 100644 Binary files a/public/images/emoji/google/diego_garcia.png and b/public/images/emoji/google/diego_garcia.png differ diff --git a/public/images/emoji/google/disappointed.png b/public/images/emoji/google/disappointed.png index 4c532a6af4..65004a32b3 100644 Binary files a/public/images/emoji/google/disappointed.png and b/public/images/emoji/google/disappointed.png differ diff --git a/public/images/emoji/google/disappointed_relieved.png b/public/images/emoji/google/disappointed_relieved.png index c867494906..8f3d5a7aa1 100644 Binary files a/public/images/emoji/google/disappointed_relieved.png and b/public/images/emoji/google/disappointed_relieved.png differ diff --git a/public/images/emoji/google/dividers.png b/public/images/emoji/google/dividers.png index b07bdc1135..760534ac3e 100644 Binary files a/public/images/emoji/google/dividers.png and b/public/images/emoji/google/dividers.png differ diff --git a/public/images/emoji/google/dizzy.png b/public/images/emoji/google/dizzy.png index bc4b31029a..74fce87fc5 100644 Binary files a/public/images/emoji/google/dizzy.png and b/public/images/emoji/google/dizzy.png differ diff --git a/public/images/emoji/google/dizzy_face.png b/public/images/emoji/google/dizzy_face.png index 2956cb9e23..99c0eb3b8c 100644 Binary files a/public/images/emoji/google/dizzy_face.png and b/public/images/emoji/google/dizzy_face.png differ diff --git a/public/images/emoji/google/djibouti.png b/public/images/emoji/google/djibouti.png index 18f4c83cff..909bd45465 100644 Binary files a/public/images/emoji/google/djibouti.png and b/public/images/emoji/google/djibouti.png differ diff --git a/public/images/emoji/google/dna.png b/public/images/emoji/google/dna.png new file mode 100644 index 0000000000..68edc1e217 Binary files /dev/null and b/public/images/emoji/google/dna.png differ diff --git a/public/images/emoji/google/do_not_litter.png b/public/images/emoji/google/do_not_litter.png index 64e22aa45a..eda28e439d 100644 Binary files a/public/images/emoji/google/do_not_litter.png and b/public/images/emoji/google/do_not_litter.png differ diff --git a/public/images/emoji/google/dog.png b/public/images/emoji/google/dog.png index 10d887f5ec..4a30b9b1f7 100644 Binary files a/public/images/emoji/google/dog.png and b/public/images/emoji/google/dog.png differ diff --git a/public/images/emoji/google/dog2.png b/public/images/emoji/google/dog2.png index 4ae8781a8b..c802b5b8e5 100644 Binary files a/public/images/emoji/google/dog2.png and b/public/images/emoji/google/dog2.png differ diff --git a/public/images/emoji/google/dollar.png b/public/images/emoji/google/dollar.png index cd2a5892d4..f9232720e8 100644 Binary files a/public/images/emoji/google/dollar.png and b/public/images/emoji/google/dollar.png differ diff --git a/public/images/emoji/google/dolls.png b/public/images/emoji/google/dolls.png index 1462ab5558..719744a690 100644 Binary files a/public/images/emoji/google/dolls.png and b/public/images/emoji/google/dolls.png differ diff --git a/public/images/emoji/google/dolphin.png b/public/images/emoji/google/dolphin.png index 6a4db6a8b3..104ac52938 100644 Binary files a/public/images/emoji/google/dolphin.png and b/public/images/emoji/google/dolphin.png differ diff --git a/public/images/emoji/google/dominica.png b/public/images/emoji/google/dominica.png index 857e5d3db0..11e96db5cf 100644 Binary files a/public/images/emoji/google/dominica.png and b/public/images/emoji/google/dominica.png differ diff --git a/public/images/emoji/google/dominican_republic.png b/public/images/emoji/google/dominican_republic.png index ab8c9c2570..82586d2aa6 100644 Binary files a/public/images/emoji/google/dominican_republic.png and b/public/images/emoji/google/dominican_republic.png differ diff --git a/public/images/emoji/google/door.png b/public/images/emoji/google/door.png index 9cd796acf3..d998ee2df5 100644 Binary files a/public/images/emoji/google/door.png and b/public/images/emoji/google/door.png differ diff --git a/public/images/emoji/google/double_vertical_bar.png b/public/images/emoji/google/double_vertical_bar.png index 6e0b69634e..992d3a286c 100644 Binary files a/public/images/emoji/google/double_vertical_bar.png and b/public/images/emoji/google/double_vertical_bar.png differ diff --git a/public/images/emoji/google/doughnut.png b/public/images/emoji/google/doughnut.png index 9e5d43ee74..0f422d5107 100644 Binary files a/public/images/emoji/google/doughnut.png and b/public/images/emoji/google/doughnut.png differ diff --git a/public/images/emoji/google/dove.png b/public/images/emoji/google/dove.png index 60bc1f9e9a..7d548766ca 100644 Binary files a/public/images/emoji/google/dove.png and b/public/images/emoji/google/dove.png differ diff --git a/public/images/emoji/google/dove_of_peace.png b/public/images/emoji/google/dove_of_peace.png index 60bc1f9e9a..7d548766ca 100644 Binary files a/public/images/emoji/google/dove_of_peace.png and b/public/images/emoji/google/dove_of_peace.png differ diff --git a/public/images/emoji/google/dragon.png b/public/images/emoji/google/dragon.png index 618bbf1599..1131bafaed 100644 Binary files a/public/images/emoji/google/dragon.png and b/public/images/emoji/google/dragon.png differ diff --git a/public/images/emoji/google/dragon_face.png b/public/images/emoji/google/dragon_face.png index b256dc5311..c4a0999308 100644 Binary files a/public/images/emoji/google/dragon_face.png and b/public/images/emoji/google/dragon_face.png differ diff --git a/public/images/emoji/google/dress.png b/public/images/emoji/google/dress.png index 981f76bbe5..dafd238a17 100644 Binary files a/public/images/emoji/google/dress.png and b/public/images/emoji/google/dress.png differ diff --git a/public/images/emoji/google/dromedary_camel.png b/public/images/emoji/google/dromedary_camel.png index ca3eb91d09..65487cf066 100644 Binary files a/public/images/emoji/google/dromedary_camel.png and b/public/images/emoji/google/dromedary_camel.png differ diff --git a/public/images/emoji/google/drooling_face.png b/public/images/emoji/google/drooling_face.png index 9659d5c56d..57ae8f4e9a 100644 Binary files a/public/images/emoji/google/drooling_face.png and b/public/images/emoji/google/drooling_face.png differ diff --git a/public/images/emoji/google/droplet.png b/public/images/emoji/google/droplet.png index 6c0d7d2e06..f961926c2a 100644 Binary files a/public/images/emoji/google/droplet.png and b/public/images/emoji/google/droplet.png differ diff --git a/public/images/emoji/google/drum.png b/public/images/emoji/google/drum.png index 769b8750ee..64cf9dc743 100644 Binary files a/public/images/emoji/google/drum.png and b/public/images/emoji/google/drum.png differ diff --git a/public/images/emoji/google/duck.png b/public/images/emoji/google/duck.png index c010d6687b..10774e3590 100644 Binary files a/public/images/emoji/google/duck.png and b/public/images/emoji/google/duck.png differ diff --git a/public/images/emoji/google/dumpling.png b/public/images/emoji/google/dumpling.png index 86a7034319..37c1d60f95 100644 Binary files a/public/images/emoji/google/dumpling.png and b/public/images/emoji/google/dumpling.png differ diff --git a/public/images/emoji/google/dvd.png b/public/images/emoji/google/dvd.png index 467a13c313..51e603c527 100644 Binary files a/public/images/emoji/google/dvd.png and b/public/images/emoji/google/dvd.png differ diff --git a/public/images/emoji/google/e-mail.png b/public/images/emoji/google/e-mail.png index 8d22dbe77c..dca89da92f 100644 Binary files a/public/images/emoji/google/e-mail.png and b/public/images/emoji/google/e-mail.png differ diff --git a/public/images/emoji/google/eagle.png b/public/images/emoji/google/eagle.png index 4450af32f5..4987f3da49 100644 Binary files a/public/images/emoji/google/eagle.png and b/public/images/emoji/google/eagle.png differ diff --git a/public/images/emoji/google/ear.png b/public/images/emoji/google/ear.png index 79f258c08c..b021e696b6 100644 Binary files a/public/images/emoji/google/ear.png and b/public/images/emoji/google/ear.png differ diff --git a/public/images/emoji/google/ear_of_rice.png b/public/images/emoji/google/ear_of_rice.png index be92823950..277345016e 100644 Binary files a/public/images/emoji/google/ear_of_rice.png and b/public/images/emoji/google/ear_of_rice.png differ diff --git a/public/images/emoji/google/earth_africa.png b/public/images/emoji/google/earth_africa.png index 0f37c9adad..3ecb8b5391 100644 Binary files a/public/images/emoji/google/earth_africa.png and b/public/images/emoji/google/earth_africa.png differ diff --git a/public/images/emoji/google/earth_americas.png b/public/images/emoji/google/earth_americas.png index c7d6b9f10d..73cb1c4667 100644 Binary files a/public/images/emoji/google/earth_americas.png and b/public/images/emoji/google/earth_americas.png differ diff --git a/public/images/emoji/google/earth_asia.png b/public/images/emoji/google/earth_asia.png index 778ed8f5e8..1342edf001 100644 Binary files a/public/images/emoji/google/earth_asia.png and b/public/images/emoji/google/earth_asia.png differ diff --git a/public/images/emoji/google/ecuador.png b/public/images/emoji/google/ecuador.png index af0505296c..51919e54d9 100644 Binary files a/public/images/emoji/google/ecuador.png and b/public/images/emoji/google/ecuador.png differ diff --git a/public/images/emoji/google/egg.png b/public/images/emoji/google/egg.png index a90281c839..7792a34978 100644 Binary files a/public/images/emoji/google/egg.png and b/public/images/emoji/google/egg.png differ diff --git a/public/images/emoji/google/eggplant.png b/public/images/emoji/google/eggplant.png index 3f9e393587..4ff2926d49 100644 Binary files a/public/images/emoji/google/eggplant.png and b/public/images/emoji/google/eggplant.png differ diff --git a/public/images/emoji/google/egypt.png b/public/images/emoji/google/egypt.png index 59854066ef..8655287530 100644 Binary files a/public/images/emoji/google/egypt.png and b/public/images/emoji/google/egypt.png differ diff --git a/public/images/emoji/google/eight.png b/public/images/emoji/google/eight.png index c1d5dfc9e5..5850e4bd76 100644 Binary files a/public/images/emoji/google/eight.png and b/public/images/emoji/google/eight.png differ diff --git a/public/images/emoji/google/eight_pointed_black_star.png b/public/images/emoji/google/eight_pointed_black_star.png index a1a4e41a56..d368e82d13 100644 Binary files a/public/images/emoji/google/eight_pointed_black_star.png and b/public/images/emoji/google/eight_pointed_black_star.png differ diff --git a/public/images/emoji/google/eight_spoked_asterisk.png b/public/images/emoji/google/eight_spoked_asterisk.png index 58d1ad6b24..5ccd05a362 100644 Binary files a/public/images/emoji/google/eight_spoked_asterisk.png and b/public/images/emoji/google/eight_spoked_asterisk.png differ diff --git a/public/images/emoji/google/el_salvador.png b/public/images/emoji/google/el_salvador.png index d76c5efd16..aa78f5eb3e 100644 Binary files a/public/images/emoji/google/el_salvador.png and b/public/images/emoji/google/el_salvador.png differ diff --git a/public/images/emoji/google/electric_plug.png b/public/images/emoji/google/electric_plug.png index e42fcabaee..bd847ebf18 100644 Binary files a/public/images/emoji/google/electric_plug.png and b/public/images/emoji/google/electric_plug.png differ diff --git a/public/images/emoji/google/elephant.png b/public/images/emoji/google/elephant.png index 35d2d38953..358f541d11 100644 Binary files a/public/images/emoji/google/elephant.png and b/public/images/emoji/google/elephant.png differ diff --git a/public/images/emoji/google/elf.png b/public/images/emoji/google/elf.png index 7a5181c2a6..57df6c6cf4 100644 Binary files a/public/images/emoji/google/elf.png and b/public/images/emoji/google/elf.png differ diff --git a/public/images/emoji/google/email.png b/public/images/emoji/google/email.png index 8d22dbe77c..dca89da92f 100644 Binary files a/public/images/emoji/google/email.png and b/public/images/emoji/google/email.png differ diff --git a/public/images/emoji/google/end.png b/public/images/emoji/google/end.png index c19398bc5a..c976eb89f6 100644 Binary files a/public/images/emoji/google/end.png and b/public/images/emoji/google/end.png differ diff --git a/public/images/emoji/google/envelope.png b/public/images/emoji/google/envelope.png index 8d22dbe77c..dca89da92f 100644 Binary files a/public/images/emoji/google/envelope.png and b/public/images/emoji/google/envelope.png differ diff --git a/public/images/emoji/google/envelope_with_arrow.png b/public/images/emoji/google/envelope_with_arrow.png index ea4cfc79c4..afe07e688b 100644 Binary files a/public/images/emoji/google/envelope_with_arrow.png and b/public/images/emoji/google/envelope_with_arrow.png differ diff --git a/public/images/emoji/google/equatorial_guinea.png b/public/images/emoji/google/equatorial_guinea.png index 61fe3a6ae7..2c18fa1292 100644 Binary files a/public/images/emoji/google/equatorial_guinea.png and b/public/images/emoji/google/equatorial_guinea.png differ diff --git a/public/images/emoji/google/eritrea.png b/public/images/emoji/google/eritrea.png index 7a8134e58d..e98f6fa60c 100644 Binary files a/public/images/emoji/google/eritrea.png and b/public/images/emoji/google/eritrea.png differ diff --git a/public/images/emoji/google/es.png b/public/images/emoji/google/es.png index d46ba95844..e8ffa233cf 100644 Binary files a/public/images/emoji/google/es.png and b/public/images/emoji/google/es.png differ diff --git a/public/images/emoji/google/estonia.png b/public/images/emoji/google/estonia.png index f7957ed223..429b4295b6 100644 Binary files a/public/images/emoji/google/estonia.png and b/public/images/emoji/google/estonia.png differ diff --git a/public/images/emoji/google/ethiopia.png b/public/images/emoji/google/ethiopia.png index 026e49b254..ffbd937c8d 100644 Binary files a/public/images/emoji/google/ethiopia.png and b/public/images/emoji/google/ethiopia.png differ diff --git a/public/images/emoji/google/eu.png b/public/images/emoji/google/eu.png index 23496febc7..e64087b874 100644 Binary files a/public/images/emoji/google/eu.png and b/public/images/emoji/google/eu.png differ diff --git a/public/images/emoji/google/euro.png b/public/images/emoji/google/euro.png index d9d4013aba..53afa6a08c 100644 Binary files a/public/images/emoji/google/euro.png and b/public/images/emoji/google/euro.png differ diff --git a/public/images/emoji/google/european_castle.png b/public/images/emoji/google/european_castle.png index b818e32b18..f89d18857d 100644 Binary files a/public/images/emoji/google/european_castle.png and b/public/images/emoji/google/european_castle.png differ diff --git a/public/images/emoji/google/european_post_office.png b/public/images/emoji/google/european_post_office.png index 39fb3f261b..0ca5c18d04 100644 Binary files a/public/images/emoji/google/european_post_office.png and b/public/images/emoji/google/european_post_office.png differ diff --git a/public/images/emoji/google/evergreen_tree.png b/public/images/emoji/google/evergreen_tree.png index 1e29a1be5a..01a73dcc55 100644 Binary files a/public/images/emoji/google/evergreen_tree.png and b/public/images/emoji/google/evergreen_tree.png differ diff --git a/public/images/emoji/google/exclamation.png b/public/images/emoji/google/exclamation.png index b9037e77aa..996b5da180 100644 Binary files a/public/images/emoji/google/exclamation.png and b/public/images/emoji/google/exclamation.png differ diff --git a/public/images/emoji/google/exploding_head.png b/public/images/emoji/google/exploding_head.png index 42ea76dc0b..e48dbe99a0 100644 Binary files a/public/images/emoji/google/exploding_head.png and b/public/images/emoji/google/exploding_head.png differ diff --git a/public/images/emoji/google/expressionless.png b/public/images/emoji/google/expressionless.png index 6ffc551b69..b5fd2b1f89 100644 Binary files a/public/images/emoji/google/expressionless.png and b/public/images/emoji/google/expressionless.png differ diff --git a/public/images/emoji/google/eye.png b/public/images/emoji/google/eye.png index 6dbd5a0341..dc97db1081 100644 Binary files a/public/images/emoji/google/eye.png and b/public/images/emoji/google/eye.png differ diff --git a/public/images/emoji/google/eyeglasses.png b/public/images/emoji/google/eyeglasses.png index eff784e5d3..91246443e4 100644 Binary files a/public/images/emoji/google/eyeglasses.png and b/public/images/emoji/google/eyeglasses.png differ diff --git a/public/images/emoji/google/eyes.png b/public/images/emoji/google/eyes.png index 35e9ed21be..c5ebfda4ad 100644 Binary files a/public/images/emoji/google/eyes.png and b/public/images/emoji/google/eyes.png differ diff --git a/public/images/emoji/google/face_vomiting.png b/public/images/emoji/google/face_vomiting.png index d3ce5f69bd..8713c15c9e 100644 Binary files a/public/images/emoji/google/face_vomiting.png and b/public/images/emoji/google/face_vomiting.png differ diff --git a/public/images/emoji/google/face_with_hand_over_mouth.png b/public/images/emoji/google/face_with_hand_over_mouth.png index d965e07a83..8c5c046110 100644 Binary files a/public/images/emoji/google/face_with_hand_over_mouth.png and b/public/images/emoji/google/face_with_hand_over_mouth.png differ diff --git a/public/images/emoji/google/face_with_head_bandage.png b/public/images/emoji/google/face_with_head_bandage.png index 8618abf0ee..eb976220e1 100644 Binary files a/public/images/emoji/google/face_with_head_bandage.png and b/public/images/emoji/google/face_with_head_bandage.png differ diff --git a/public/images/emoji/google/face_with_monocle.png b/public/images/emoji/google/face_with_monocle.png index b08f768088..5789a3ebbf 100644 Binary files a/public/images/emoji/google/face_with_monocle.png and b/public/images/emoji/google/face_with_monocle.png differ diff --git a/public/images/emoji/google/face_with_raised_eyebrow.png b/public/images/emoji/google/face_with_raised_eyebrow.png index 778435a939..78d1076b5f 100644 Binary files a/public/images/emoji/google/face_with_raised_eyebrow.png and b/public/images/emoji/google/face_with_raised_eyebrow.png differ diff --git a/public/images/emoji/google/face_with_rolling_eyes.png b/public/images/emoji/google/face_with_rolling_eyes.png index 55577e34a9..aa97ec1605 100644 Binary files a/public/images/emoji/google/face_with_rolling_eyes.png and b/public/images/emoji/google/face_with_rolling_eyes.png differ diff --git a/public/images/emoji/google/face_with_symbols_over_mouth.png b/public/images/emoji/google/face_with_symbols_over_mouth.png index ae0735e8bf..4a67be7bd3 100644 Binary files a/public/images/emoji/google/face_with_symbols_over_mouth.png and b/public/images/emoji/google/face_with_symbols_over_mouth.png differ diff --git a/public/images/emoji/google/face_with_thermometer.png b/public/images/emoji/google/face_with_thermometer.png index 296fe80618..35cdd26ad1 100644 Binary files a/public/images/emoji/google/face_with_thermometer.png and b/public/images/emoji/google/face_with_thermometer.png differ diff --git a/public/images/emoji/google/facepunch.png b/public/images/emoji/google/facepunch.png index 2ef7ed2091..e043b26f7a 100644 Binary files a/public/images/emoji/google/facepunch.png and b/public/images/emoji/google/facepunch.png differ diff --git a/public/images/emoji/google/factory.png b/public/images/emoji/google/factory.png index 5ba250b02e..50f5792847 100644 Binary files a/public/images/emoji/google/factory.png and b/public/images/emoji/google/factory.png differ diff --git a/public/images/emoji/google/fairy.png b/public/images/emoji/google/fairy.png index ddec9b8338..922ac2fe2c 100644 Binary files a/public/images/emoji/google/fairy.png and b/public/images/emoji/google/fairy.png differ diff --git a/public/images/emoji/google/falkland_islands.png b/public/images/emoji/google/falkland_islands.png index 4faf7e252e..0e4e4e5457 100644 Binary files a/public/images/emoji/google/falkland_islands.png and b/public/images/emoji/google/falkland_islands.png differ diff --git a/public/images/emoji/google/fallen_leaf.png b/public/images/emoji/google/fallen_leaf.png index 36558e98e3..1eda7ff728 100644 Binary files a/public/images/emoji/google/fallen_leaf.png and b/public/images/emoji/google/fallen_leaf.png differ diff --git a/public/images/emoji/google/family.png b/public/images/emoji/google/family.png index 8ab2ce0b95..9e414eb5ca 100644 Binary files a/public/images/emoji/google/family.png and b/public/images/emoji/google/family.png differ diff --git a/public/images/emoji/google/family_man_boy.png b/public/images/emoji/google/family_man_boy.png index 93014de1c2..0567465af5 100644 Binary files a/public/images/emoji/google/family_man_boy.png and b/public/images/emoji/google/family_man_boy.png differ diff --git a/public/images/emoji/google/family_man_boy_boy.png b/public/images/emoji/google/family_man_boy_boy.png index 210034c60c..459d4ff6a0 100644 Binary files a/public/images/emoji/google/family_man_boy_boy.png and b/public/images/emoji/google/family_man_boy_boy.png differ diff --git a/public/images/emoji/google/family_man_girl.png b/public/images/emoji/google/family_man_girl.png index 8b78af075f..0a79bb5712 100644 Binary files a/public/images/emoji/google/family_man_girl.png and b/public/images/emoji/google/family_man_girl.png differ diff --git a/public/images/emoji/google/family_man_girl_boy.png b/public/images/emoji/google/family_man_girl_boy.png index 1c0e714a74..666b77b409 100644 Binary files a/public/images/emoji/google/family_man_girl_boy.png and b/public/images/emoji/google/family_man_girl_boy.png differ diff --git a/public/images/emoji/google/family_man_girl_girl.png b/public/images/emoji/google/family_man_girl_girl.png index 4de877ae33..fc2f0b6800 100644 Binary files a/public/images/emoji/google/family_man_girl_girl.png and b/public/images/emoji/google/family_man_girl_girl.png differ diff --git a/public/images/emoji/google/family_man_man_boy.png b/public/images/emoji/google/family_man_man_boy.png index 207ec96ce5..94f5e52976 100644 Binary files a/public/images/emoji/google/family_man_man_boy.png and b/public/images/emoji/google/family_man_man_boy.png differ diff --git a/public/images/emoji/google/family_man_man_boy_boy.png b/public/images/emoji/google/family_man_man_boy_boy.png index 50cb7f5225..c5e61f9a93 100644 Binary files a/public/images/emoji/google/family_man_man_boy_boy.png and b/public/images/emoji/google/family_man_man_boy_boy.png differ diff --git a/public/images/emoji/google/family_man_man_girl.png b/public/images/emoji/google/family_man_man_girl.png index efd6fcfeb7..763303b4c5 100644 Binary files a/public/images/emoji/google/family_man_man_girl.png and b/public/images/emoji/google/family_man_man_girl.png differ diff --git a/public/images/emoji/google/family_man_man_girl_boy.png b/public/images/emoji/google/family_man_man_girl_boy.png index b2cab1c97d..b3b939b605 100644 Binary files a/public/images/emoji/google/family_man_man_girl_boy.png and b/public/images/emoji/google/family_man_man_girl_boy.png differ diff --git a/public/images/emoji/google/family_man_man_girl_girl.png b/public/images/emoji/google/family_man_man_girl_girl.png index e913a910fc..2deb916385 100644 Binary files a/public/images/emoji/google/family_man_man_girl_girl.png and b/public/images/emoji/google/family_man_man_girl_girl.png differ diff --git a/public/images/emoji/google/family_man_woman_boy.png b/public/images/emoji/google/family_man_woman_boy.png index 141f756a55..605f24d109 100644 Binary files a/public/images/emoji/google/family_man_woman_boy.png and b/public/images/emoji/google/family_man_woman_boy.png differ diff --git a/public/images/emoji/google/family_man_woman_boy_boy.png b/public/images/emoji/google/family_man_woman_boy_boy.png index 6eb38cba5b..b027843aa0 100644 Binary files a/public/images/emoji/google/family_man_woman_boy_boy.png and b/public/images/emoji/google/family_man_woman_boy_boy.png differ diff --git a/public/images/emoji/google/family_man_woman_boys.png b/public/images/emoji/google/family_man_woman_boys.png index 6eb38cba5b..b027843aa0 100644 Binary files a/public/images/emoji/google/family_man_woman_boys.png and b/public/images/emoji/google/family_man_woman_boys.png differ diff --git a/public/images/emoji/google/family_man_woman_girl.png b/public/images/emoji/google/family_man_woman_girl.png index 4ba95b4bde..07aac196ad 100644 Binary files a/public/images/emoji/google/family_man_woman_girl.png and b/public/images/emoji/google/family_man_woman_girl.png differ diff --git a/public/images/emoji/google/family_man_woman_girl_boy.png b/public/images/emoji/google/family_man_woman_girl_boy.png index 8ab2ce0b95..9e414eb5ca 100644 Binary files a/public/images/emoji/google/family_man_woman_girl_boy.png and b/public/images/emoji/google/family_man_woman_girl_boy.png differ diff --git a/public/images/emoji/google/family_man_woman_girl_girl.png b/public/images/emoji/google/family_man_woman_girl_girl.png index 83d6ec866f..ba614f5c2a 100644 Binary files a/public/images/emoji/google/family_man_woman_girl_girl.png and b/public/images/emoji/google/family_man_woman_girl_girl.png differ diff --git a/public/images/emoji/google/family_man_woman_girls.png b/public/images/emoji/google/family_man_woman_girls.png index 83d6ec866f..ba614f5c2a 100644 Binary files a/public/images/emoji/google/family_man_woman_girls.png and b/public/images/emoji/google/family_man_woman_girls.png differ diff --git a/public/images/emoji/google/family_men_boy.png b/public/images/emoji/google/family_men_boy.png index 207ec96ce5..94f5e52976 100644 Binary files a/public/images/emoji/google/family_men_boy.png and b/public/images/emoji/google/family_men_boy.png differ diff --git a/public/images/emoji/google/family_men_boys.png b/public/images/emoji/google/family_men_boys.png index 50cb7f5225..c5e61f9a93 100644 Binary files a/public/images/emoji/google/family_men_boys.png and b/public/images/emoji/google/family_men_boys.png differ diff --git a/public/images/emoji/google/family_men_girl.png b/public/images/emoji/google/family_men_girl.png index efd6fcfeb7..763303b4c5 100644 Binary files a/public/images/emoji/google/family_men_girl.png and b/public/images/emoji/google/family_men_girl.png differ diff --git a/public/images/emoji/google/family_men_girl_boy.png b/public/images/emoji/google/family_men_girl_boy.png index b2cab1c97d..b3b939b605 100644 Binary files a/public/images/emoji/google/family_men_girl_boy.png and b/public/images/emoji/google/family_men_girl_boy.png differ diff --git a/public/images/emoji/google/family_men_girls.png b/public/images/emoji/google/family_men_girls.png index e913a910fc..2deb916385 100644 Binary files a/public/images/emoji/google/family_men_girls.png and b/public/images/emoji/google/family_men_girls.png differ diff --git a/public/images/emoji/google/family_woman_boy.png b/public/images/emoji/google/family_woman_boy.png index 2858bbedf1..bb4714bfea 100644 Binary files a/public/images/emoji/google/family_woman_boy.png and b/public/images/emoji/google/family_woman_boy.png differ diff --git a/public/images/emoji/google/family_woman_boy_boy.png b/public/images/emoji/google/family_woman_boy_boy.png index 7f45656e36..fc5c48cd96 100644 Binary files a/public/images/emoji/google/family_woman_boy_boy.png and b/public/images/emoji/google/family_woman_boy_boy.png differ diff --git a/public/images/emoji/google/family_woman_girl.png b/public/images/emoji/google/family_woman_girl.png index 2948674f29..8ed745d3e0 100644 Binary files a/public/images/emoji/google/family_woman_girl.png and b/public/images/emoji/google/family_woman_girl.png differ diff --git a/public/images/emoji/google/family_woman_girl_boy.png b/public/images/emoji/google/family_woman_girl_boy.png index 50a2510a74..e2a95bbf06 100644 Binary files a/public/images/emoji/google/family_woman_girl_boy.png and b/public/images/emoji/google/family_woman_girl_boy.png differ diff --git a/public/images/emoji/google/family_woman_girl_girl.png b/public/images/emoji/google/family_woman_girl_girl.png index 4751357bb0..87aa05e5fe 100644 Binary files a/public/images/emoji/google/family_woman_girl_girl.png and b/public/images/emoji/google/family_woman_girl_girl.png differ diff --git a/public/images/emoji/google/family_woman_woman_boy.png b/public/images/emoji/google/family_woman_woman_boy.png index 55a0ea5814..5f404c4443 100644 Binary files a/public/images/emoji/google/family_woman_woman_boy.png and b/public/images/emoji/google/family_woman_woman_boy.png differ diff --git a/public/images/emoji/google/family_woman_woman_boy_boy.png b/public/images/emoji/google/family_woman_woman_boy_boy.png index 793d5e3432..dcf4179228 100644 Binary files a/public/images/emoji/google/family_woman_woman_boy_boy.png and b/public/images/emoji/google/family_woman_woman_boy_boy.png differ diff --git a/public/images/emoji/google/family_woman_woman_girl.png b/public/images/emoji/google/family_woman_woman_girl.png index abafe71f60..7243b15a1c 100644 Binary files a/public/images/emoji/google/family_woman_woman_girl.png and b/public/images/emoji/google/family_woman_woman_girl.png differ diff --git a/public/images/emoji/google/family_woman_woman_girl_boy.png b/public/images/emoji/google/family_woman_woman_girl_boy.png index 7a2c267fc7..cbf284081b 100644 Binary files a/public/images/emoji/google/family_woman_woman_girl_boy.png and b/public/images/emoji/google/family_woman_woman_girl_boy.png differ diff --git a/public/images/emoji/google/family_woman_woman_girl_girl.png b/public/images/emoji/google/family_woman_woman_girl_girl.png index 7e07c19c2e..6f1b8e5cb4 100644 Binary files a/public/images/emoji/google/family_woman_woman_girl_girl.png and b/public/images/emoji/google/family_woman_woman_girl_girl.png differ diff --git a/public/images/emoji/google/family_women_boy.png b/public/images/emoji/google/family_women_boy.png index 55a0ea5814..5f404c4443 100644 Binary files a/public/images/emoji/google/family_women_boy.png and b/public/images/emoji/google/family_women_boy.png differ diff --git a/public/images/emoji/google/family_women_boys.png b/public/images/emoji/google/family_women_boys.png index 793d5e3432..dcf4179228 100644 Binary files a/public/images/emoji/google/family_women_boys.png and b/public/images/emoji/google/family_women_boys.png differ diff --git a/public/images/emoji/google/family_women_girl.png b/public/images/emoji/google/family_women_girl.png index abafe71f60..7243b15a1c 100644 Binary files a/public/images/emoji/google/family_women_girl.png and b/public/images/emoji/google/family_women_girl.png differ diff --git a/public/images/emoji/google/family_women_girl_boy.png b/public/images/emoji/google/family_women_girl_boy.png index 7a2c267fc7..cbf284081b 100644 Binary files a/public/images/emoji/google/family_women_girl_boy.png and b/public/images/emoji/google/family_women_girl_boy.png differ diff --git a/public/images/emoji/google/family_women_girls.png b/public/images/emoji/google/family_women_girls.png index 7e07c19c2e..6f1b8e5cb4 100644 Binary files a/public/images/emoji/google/family_women_girls.png and b/public/images/emoji/google/family_women_girls.png differ diff --git a/public/images/emoji/google/faroe_islands.png b/public/images/emoji/google/faroe_islands.png index 70546f10e1..c617200d52 100644 Binary files a/public/images/emoji/google/faroe_islands.png and b/public/images/emoji/google/faroe_islands.png differ diff --git a/public/images/emoji/google/fast_forward.png b/public/images/emoji/google/fast_forward.png index b71d3c68ba..758e833dcc 100644 Binary files a/public/images/emoji/google/fast_forward.png and b/public/images/emoji/google/fast_forward.png differ diff --git a/public/images/emoji/google/fax.png b/public/images/emoji/google/fax.png index 633119cf9a..546e542015 100644 Binary files a/public/images/emoji/google/fax.png and b/public/images/emoji/google/fax.png differ diff --git a/public/images/emoji/google/fearful.png b/public/images/emoji/google/fearful.png index 04e86b5709..102da2ebaf 100644 Binary files a/public/images/emoji/google/fearful.png and b/public/images/emoji/google/fearful.png differ diff --git a/public/images/emoji/google/feet.png b/public/images/emoji/google/feet.png index afb3166151..83356378e3 100644 Binary files a/public/images/emoji/google/feet.png and b/public/images/emoji/google/feet.png differ diff --git a/public/images/emoji/google/female_couple_with_heart.png b/public/images/emoji/google/female_couple_with_heart.png index f4b433aa95..5f56b093f2 100644 Binary files a/public/images/emoji/google/female_couple_with_heart.png and b/public/images/emoji/google/female_couple_with_heart.png differ diff --git a/public/images/emoji/google/female_couplekiss.png b/public/images/emoji/google/female_couplekiss.png index 0e516e9376..761a076318 100644 Binary files a/public/images/emoji/google/female_couplekiss.png and b/public/images/emoji/google/female_couplekiss.png differ diff --git a/public/images/emoji/google/female_detective.png b/public/images/emoji/google/female_detective.png index 256199d4aa..4ef0b26432 100644 Binary files a/public/images/emoji/google/female_detective.png and b/public/images/emoji/google/female_detective.png differ diff --git a/public/images/emoji/google/ferris_wheel.png b/public/images/emoji/google/ferris_wheel.png index ef08c478ac..519786f34a 100644 Binary files a/public/images/emoji/google/ferris_wheel.png and b/public/images/emoji/google/ferris_wheel.png differ diff --git a/public/images/emoji/google/ferry.png b/public/images/emoji/google/ferry.png index e81c20eddc..1493fc1bb8 100644 Binary files a/public/images/emoji/google/ferry.png and b/public/images/emoji/google/ferry.png differ diff --git a/public/images/emoji/google/field_hockey.png b/public/images/emoji/google/field_hockey.png index af49131fb2..954c38b9e6 100644 Binary files a/public/images/emoji/google/field_hockey.png and b/public/images/emoji/google/field_hockey.png differ diff --git a/public/images/emoji/google/fiji.png b/public/images/emoji/google/fiji.png index 1ce07af931..bb8bb7b5df 100644 Binary files a/public/images/emoji/google/fiji.png and b/public/images/emoji/google/fiji.png differ diff --git a/public/images/emoji/google/file_cabinet.png b/public/images/emoji/google/file_cabinet.png index dd1ded02b5..b3072a9432 100644 Binary files a/public/images/emoji/google/file_cabinet.png and b/public/images/emoji/google/file_cabinet.png differ diff --git a/public/images/emoji/google/file_folder.png b/public/images/emoji/google/file_folder.png index 202bf1217f..a7b9012eac 100644 Binary files a/public/images/emoji/google/file_folder.png and b/public/images/emoji/google/file_folder.png differ diff --git a/public/images/emoji/google/film_frames.png b/public/images/emoji/google/film_frames.png index ddd02c16eb..6690290835 100644 Binary files a/public/images/emoji/google/film_frames.png and b/public/images/emoji/google/film_frames.png differ diff --git a/public/images/emoji/google/film_projector.png b/public/images/emoji/google/film_projector.png index a420005a79..c2678f7a94 100644 Binary files a/public/images/emoji/google/film_projector.png and b/public/images/emoji/google/film_projector.png differ diff --git a/public/images/emoji/google/film_strip.png b/public/images/emoji/google/film_strip.png index ddd02c16eb..6690290835 100644 Binary files a/public/images/emoji/google/film_strip.png and b/public/images/emoji/google/film_strip.png differ diff --git a/public/images/emoji/google/finland.png b/public/images/emoji/google/finland.png index 2e4109ca0c..15be4b330b 100644 Binary files a/public/images/emoji/google/finland.png and b/public/images/emoji/google/finland.png differ diff --git a/public/images/emoji/google/fire.png b/public/images/emoji/google/fire.png index 56800b219d..08a4e7847f 100644 Binary files a/public/images/emoji/google/fire.png and b/public/images/emoji/google/fire.png differ diff --git a/public/images/emoji/google/fire_engine.png b/public/images/emoji/google/fire_engine.png index b64569c9cd..d91e083903 100644 Binary files a/public/images/emoji/google/fire_engine.png and b/public/images/emoji/google/fire_engine.png differ diff --git a/public/images/emoji/google/fire_extinguisher.png b/public/images/emoji/google/fire_extinguisher.png new file mode 100644 index 0000000000..14ad2371f4 Binary files /dev/null and b/public/images/emoji/google/fire_extinguisher.png differ diff --git a/public/images/emoji/google/firecracker.png b/public/images/emoji/google/firecracker.png new file mode 100644 index 0000000000..59fa6bf229 Binary files /dev/null and b/public/images/emoji/google/firecracker.png differ diff --git a/public/images/emoji/google/fireworks.png b/public/images/emoji/google/fireworks.png index 48bd693d79..215492209f 100644 Binary files a/public/images/emoji/google/fireworks.png and b/public/images/emoji/google/fireworks.png differ diff --git a/public/images/emoji/google/first_quarter_moon.png b/public/images/emoji/google/first_quarter_moon.png index bca9cc51ab..182f7bd8a5 100644 Binary files a/public/images/emoji/google/first_quarter_moon.png and b/public/images/emoji/google/first_quarter_moon.png differ diff --git a/public/images/emoji/google/first_quarter_moon_with_face.png b/public/images/emoji/google/first_quarter_moon_with_face.png index 7699a212d8..3b8faab1ef 100644 Binary files a/public/images/emoji/google/first_quarter_moon_with_face.png and b/public/images/emoji/google/first_quarter_moon_with_face.png differ diff --git a/public/images/emoji/google/fish.png b/public/images/emoji/google/fish.png index f83107734a..c2eca31c9d 100644 Binary files a/public/images/emoji/google/fish.png and b/public/images/emoji/google/fish.png differ diff --git a/public/images/emoji/google/fish_cake.png b/public/images/emoji/google/fish_cake.png index e35ca0af9a..4c5c0bed5d 100644 Binary files a/public/images/emoji/google/fish_cake.png and b/public/images/emoji/google/fish_cake.png differ diff --git a/public/images/emoji/google/fishing_pole_and_fish.png b/public/images/emoji/google/fishing_pole_and_fish.png index 15989dda8a..86ba037947 100644 Binary files a/public/images/emoji/google/fishing_pole_and_fish.png and b/public/images/emoji/google/fishing_pole_and_fish.png differ diff --git a/public/images/emoji/google/fist.png b/public/images/emoji/google/fist.png index c552652293..2a6bcd321c 100644 Binary files a/public/images/emoji/google/fist.png and b/public/images/emoji/google/fist.png differ diff --git a/public/images/emoji/google/fist_left.png b/public/images/emoji/google/fist_left.png index 8f6421169b..270e3063cc 100644 Binary files a/public/images/emoji/google/fist_left.png and b/public/images/emoji/google/fist_left.png differ diff --git a/public/images/emoji/google/fist_right.png b/public/images/emoji/google/fist_right.png index 619830874c..8127c76075 100644 Binary files a/public/images/emoji/google/fist_right.png and b/public/images/emoji/google/fist_right.png differ diff --git a/public/images/emoji/google/five.png b/public/images/emoji/google/five.png index b1fa2d376d..22eb48a369 100644 Binary files a/public/images/emoji/google/five.png and b/public/images/emoji/google/five.png differ diff --git a/public/images/emoji/google/flag_black.png b/public/images/emoji/google/flag_black.png index fd30f1d882..874033398d 100644 Binary files a/public/images/emoji/google/flag_black.png and b/public/images/emoji/google/flag_black.png differ diff --git a/public/images/emoji/google/flag_cn.png b/public/images/emoji/google/flag_cn.png index 05a72fed32..36d01d441e 100644 Binary files a/public/images/emoji/google/flag_cn.png and b/public/images/emoji/google/flag_cn.png differ diff --git a/public/images/emoji/google/flag_de.png b/public/images/emoji/google/flag_de.png index 5110b322d1..a7756cea25 100644 Binary files a/public/images/emoji/google/flag_de.png and b/public/images/emoji/google/flag_de.png differ diff --git a/public/images/emoji/google/flag_es.png b/public/images/emoji/google/flag_es.png index d46ba95844..e8ffa233cf 100644 Binary files a/public/images/emoji/google/flag_es.png and b/public/images/emoji/google/flag_es.png differ diff --git a/public/images/emoji/google/flag_fr.png b/public/images/emoji/google/flag_fr.png index b836e555de..87b859be73 100644 Binary files a/public/images/emoji/google/flag_fr.png and b/public/images/emoji/google/flag_fr.png differ diff --git a/public/images/emoji/google/flag_gb.png b/public/images/emoji/google/flag_gb.png index e7f3da7ea8..eac8318094 100644 Binary files a/public/images/emoji/google/flag_gb.png and b/public/images/emoji/google/flag_gb.png differ diff --git a/public/images/emoji/google/flag_it.png b/public/images/emoji/google/flag_it.png index 605e128012..8f0a8da011 100644 Binary files a/public/images/emoji/google/flag_it.png and b/public/images/emoji/google/flag_it.png differ diff --git a/public/images/emoji/google/flag_jp.png b/public/images/emoji/google/flag_jp.png index c75dad0d10..c9983140ec 100644 Binary files a/public/images/emoji/google/flag_jp.png and b/public/images/emoji/google/flag_jp.png differ diff --git a/public/images/emoji/google/flag_kr.png b/public/images/emoji/google/flag_kr.png index 048ceeb3e4..7eb3980e61 100644 Binary files a/public/images/emoji/google/flag_kr.png and b/public/images/emoji/google/flag_kr.png differ diff --git a/public/images/emoji/google/flag_ru.png b/public/images/emoji/google/flag_ru.png index f42d2705cf..ef5efea0fa 100644 Binary files a/public/images/emoji/google/flag_ru.png and b/public/images/emoji/google/flag_ru.png differ diff --git a/public/images/emoji/google/flag_us.png b/public/images/emoji/google/flag_us.png index 44daa43947..db9012d588 100644 Binary files a/public/images/emoji/google/flag_us.png and b/public/images/emoji/google/flag_us.png differ diff --git a/public/images/emoji/google/flag_white.png b/public/images/emoji/google/flag_white.png index 07d1f0ac70..4564730aab 100644 Binary files a/public/images/emoji/google/flag_white.png and b/public/images/emoji/google/flag_white.png differ diff --git a/public/images/emoji/google/flags.png b/public/images/emoji/google/flags.png index 43fb86cb94..ec5e9d77df 100644 Binary files a/public/images/emoji/google/flags.png and b/public/images/emoji/google/flags.png differ diff --git a/public/images/emoji/google/flame.png b/public/images/emoji/google/flame.png index 56800b219d..08a4e7847f 100644 Binary files a/public/images/emoji/google/flame.png and b/public/images/emoji/google/flame.png differ diff --git a/public/images/emoji/google/flashlight.png b/public/images/emoji/google/flashlight.png index 9fa7a8855d..7426681c75 100644 Binary files a/public/images/emoji/google/flashlight.png and b/public/images/emoji/google/flashlight.png differ diff --git a/public/images/emoji/google/flat_shoe.png b/public/images/emoji/google/flat_shoe.png new file mode 100644 index 0000000000..07372d1feb Binary files /dev/null and b/public/images/emoji/google/flat_shoe.png differ diff --git a/public/images/emoji/google/fleur-de-lis.png b/public/images/emoji/google/fleur-de-lis.png index 84f1ecdcd7..a5250fbe54 100644 Binary files a/public/images/emoji/google/fleur-de-lis.png and b/public/images/emoji/google/fleur-de-lis.png differ diff --git a/public/images/emoji/google/fleur_de_lis.png b/public/images/emoji/google/fleur_de_lis.png index 84f1ecdcd7..a5250fbe54 100644 Binary files a/public/images/emoji/google/fleur_de_lis.png and b/public/images/emoji/google/fleur_de_lis.png differ diff --git a/public/images/emoji/google/flight_arrival.png b/public/images/emoji/google/flight_arrival.png index baf6de740c..bc4ceda97d 100644 Binary files a/public/images/emoji/google/flight_arrival.png and b/public/images/emoji/google/flight_arrival.png differ diff --git a/public/images/emoji/google/flight_departure.png b/public/images/emoji/google/flight_departure.png index c5b13dc088..f40b696d58 100644 Binary files a/public/images/emoji/google/flight_departure.png and b/public/images/emoji/google/flight_departure.png differ diff --git a/public/images/emoji/google/floppy_disk.png b/public/images/emoji/google/floppy_disk.png index e94e5adb09..7d4de67699 100644 Binary files a/public/images/emoji/google/floppy_disk.png and b/public/images/emoji/google/floppy_disk.png differ diff --git a/public/images/emoji/google/flower_playing_cards.png b/public/images/emoji/google/flower_playing_cards.png index 347bf56aca..cc99580fe5 100644 Binary files a/public/images/emoji/google/flower_playing_cards.png and b/public/images/emoji/google/flower_playing_cards.png differ diff --git a/public/images/emoji/google/flushed.png b/public/images/emoji/google/flushed.png index 023cde180d..262ca67635 100644 Binary files a/public/images/emoji/google/flushed.png and b/public/images/emoji/google/flushed.png differ diff --git a/public/images/emoji/google/flying_disc.png b/public/images/emoji/google/flying_disc.png new file mode 100644 index 0000000000..463cf342d2 Binary files /dev/null and b/public/images/emoji/google/flying_disc.png differ diff --git a/public/images/emoji/google/flying_saucer.png b/public/images/emoji/google/flying_saucer.png index c1a5dc84ce..ac16bbaf71 100644 Binary files a/public/images/emoji/google/flying_saucer.png and b/public/images/emoji/google/flying_saucer.png differ diff --git a/public/images/emoji/google/fog.png b/public/images/emoji/google/fog.png index 6693869c10..35ad720f73 100644 Binary files a/public/images/emoji/google/fog.png and b/public/images/emoji/google/fog.png differ diff --git a/public/images/emoji/google/foggy.png b/public/images/emoji/google/foggy.png index 88b02cdbbd..1316cbd571 100644 Binary files a/public/images/emoji/google/foggy.png and b/public/images/emoji/google/foggy.png differ diff --git a/public/images/emoji/google/foot.png b/public/images/emoji/google/foot.png new file mode 100644 index 0000000000..c2f392c461 Binary files /dev/null and b/public/images/emoji/google/foot.png differ diff --git a/public/images/emoji/google/football.png b/public/images/emoji/google/football.png index 40a9177beb..916cc59702 100644 Binary files a/public/images/emoji/google/football.png and b/public/images/emoji/google/football.png differ diff --git a/public/images/emoji/google/footprints.png b/public/images/emoji/google/footprints.png index afb3166151..83356378e3 100644 Binary files a/public/images/emoji/google/footprints.png and b/public/images/emoji/google/footprints.png differ diff --git a/public/images/emoji/google/fork_and_knife.png b/public/images/emoji/google/fork_and_knife.png index 25d8e5a2a4..9444b103ce 100644 Binary files a/public/images/emoji/google/fork_and_knife.png and b/public/images/emoji/google/fork_and_knife.png differ diff --git a/public/images/emoji/google/fork_and_knife_with_plate.png b/public/images/emoji/google/fork_and_knife_with_plate.png index c0ed1e0ed6..cc64021462 100644 Binary files a/public/images/emoji/google/fork_and_knife_with_plate.png and b/public/images/emoji/google/fork_and_knife_with_plate.png differ diff --git a/public/images/emoji/google/fork_knife_plate.png b/public/images/emoji/google/fork_knife_plate.png index c0ed1e0ed6..cc64021462 100644 Binary files a/public/images/emoji/google/fork_knife_plate.png and b/public/images/emoji/google/fork_knife_plate.png differ diff --git a/public/images/emoji/google/fortune_cookie.png b/public/images/emoji/google/fortune_cookie.png index 9874e4d428..b69deb3924 100644 Binary files a/public/images/emoji/google/fortune_cookie.png and b/public/images/emoji/google/fortune_cookie.png differ diff --git a/public/images/emoji/google/fountain.png b/public/images/emoji/google/fountain.png index 69e14cd2ea..ed3f99cf74 100644 Binary files a/public/images/emoji/google/fountain.png and b/public/images/emoji/google/fountain.png differ diff --git a/public/images/emoji/google/fountain_pen.png b/public/images/emoji/google/fountain_pen.png index 3d8ba60471..91f31b4580 100644 Binary files a/public/images/emoji/google/fountain_pen.png and b/public/images/emoji/google/fountain_pen.png differ diff --git a/public/images/emoji/google/four.png b/public/images/emoji/google/four.png index fa8956aeb5..58fb456304 100644 Binary files a/public/images/emoji/google/four.png and b/public/images/emoji/google/four.png differ diff --git a/public/images/emoji/google/four_leaf_clover.png b/public/images/emoji/google/four_leaf_clover.png index 120a9a6dd8..77db54eb39 100644 Binary files a/public/images/emoji/google/four_leaf_clover.png and b/public/images/emoji/google/four_leaf_clover.png differ diff --git a/public/images/emoji/google/fox_face.png b/public/images/emoji/google/fox_face.png index c53e239571..52b5f47a80 100644 Binary files a/public/images/emoji/google/fox_face.png and b/public/images/emoji/google/fox_face.png differ diff --git a/public/images/emoji/google/fr.png b/public/images/emoji/google/fr.png index b836e555de..87b859be73 100644 Binary files a/public/images/emoji/google/fr.png and b/public/images/emoji/google/fr.png differ diff --git a/public/images/emoji/google/frame_photo.png b/public/images/emoji/google/frame_photo.png index ff74a48b6e..8c5ccefab4 100644 Binary files a/public/images/emoji/google/frame_photo.png and b/public/images/emoji/google/frame_photo.png differ diff --git a/public/images/emoji/google/frame_with_picture.png b/public/images/emoji/google/frame_with_picture.png index ff74a48b6e..8c5ccefab4 100644 Binary files a/public/images/emoji/google/frame_with_picture.png and b/public/images/emoji/google/frame_with_picture.png differ diff --git a/public/images/emoji/google/framed_picture.png b/public/images/emoji/google/framed_picture.png index ff74a48b6e..8c5ccefab4 100644 Binary files a/public/images/emoji/google/framed_picture.png and b/public/images/emoji/google/framed_picture.png differ diff --git a/public/images/emoji/google/free.png b/public/images/emoji/google/free.png index 45019d566a..798efe32d5 100644 Binary files a/public/images/emoji/google/free.png and b/public/images/emoji/google/free.png differ diff --git a/public/images/emoji/google/french_guiana.png b/public/images/emoji/google/french_guiana.png index 4faf7e252e..6eb40180aa 100644 Binary files a/public/images/emoji/google/french_guiana.png and b/public/images/emoji/google/french_guiana.png differ diff --git a/public/images/emoji/google/french_polynesia.png b/public/images/emoji/google/french_polynesia.png index c9bdb3ae62..006e50b216 100644 Binary files a/public/images/emoji/google/french_polynesia.png and b/public/images/emoji/google/french_polynesia.png differ diff --git a/public/images/emoji/google/french_southern_territories.png b/public/images/emoji/google/french_southern_territories.png index 4faf7e252e..7ec4a82f84 100644 Binary files a/public/images/emoji/google/french_southern_territories.png and b/public/images/emoji/google/french_southern_territories.png differ diff --git a/public/images/emoji/google/fried_egg.png b/public/images/emoji/google/fried_egg.png index 3091a82901..377cb008bc 100644 Binary files a/public/images/emoji/google/fried_egg.png and b/public/images/emoji/google/fried_egg.png differ diff --git a/public/images/emoji/google/fried_shrimp.png b/public/images/emoji/google/fried_shrimp.png index 03d4376047..3365363cfa 100644 Binary files a/public/images/emoji/google/fried_shrimp.png and b/public/images/emoji/google/fried_shrimp.png differ diff --git a/public/images/emoji/google/fries.png b/public/images/emoji/google/fries.png index fa6218a5f1..bf201bd0f4 100644 Binary files a/public/images/emoji/google/fries.png and b/public/images/emoji/google/fries.png differ diff --git a/public/images/emoji/google/frog.png b/public/images/emoji/google/frog.png index f29051d817..5de5399dbb 100644 Binary files a/public/images/emoji/google/frog.png and b/public/images/emoji/google/frog.png differ diff --git a/public/images/emoji/google/frowning.png b/public/images/emoji/google/frowning.png index 6ea95a7ce0..b94c934373 100644 Binary files a/public/images/emoji/google/frowning.png and b/public/images/emoji/google/frowning.png differ diff --git a/public/images/emoji/google/frowning2.png b/public/images/emoji/google/frowning2.png index a8a41ad7c2..bb1b74c970 100644 Binary files a/public/images/emoji/google/frowning2.png and b/public/images/emoji/google/frowning2.png differ diff --git a/public/images/emoji/google/frowning_face.png b/public/images/emoji/google/frowning_face.png index a8a41ad7c2..bb1b74c970 100644 Binary files a/public/images/emoji/google/frowning_face.png and b/public/images/emoji/google/frowning_face.png differ diff --git a/public/images/emoji/google/frowning_man.png b/public/images/emoji/google/frowning_man.png index 7c04b60e67..a6e2bfad9d 100644 Binary files a/public/images/emoji/google/frowning_man.png and b/public/images/emoji/google/frowning_man.png differ diff --git a/public/images/emoji/google/frowning_woman.png b/public/images/emoji/google/frowning_woman.png index 0378dfe42e..6e2ca45269 100644 Binary files a/public/images/emoji/google/frowning_woman.png and b/public/images/emoji/google/frowning_woman.png differ diff --git a/public/images/emoji/google/fu.png b/public/images/emoji/google/fu.png index 71e8d8b3e9..ac5a0ef314 100644 Binary files a/public/images/emoji/google/fu.png and b/public/images/emoji/google/fu.png differ diff --git a/public/images/emoji/google/fuelpump.png b/public/images/emoji/google/fuelpump.png index 7f5ed77e62..f77e0def8b 100644 Binary files a/public/images/emoji/google/fuelpump.png and b/public/images/emoji/google/fuelpump.png differ diff --git a/public/images/emoji/google/full_moon.png b/public/images/emoji/google/full_moon.png index 52e5f1b1d4..8fbe47e8b8 100644 Binary files a/public/images/emoji/google/full_moon.png and b/public/images/emoji/google/full_moon.png differ diff --git a/public/images/emoji/google/full_moon_with_face.png b/public/images/emoji/google/full_moon_with_face.png index cdafaa94a1..2ae31b289f 100644 Binary files a/public/images/emoji/google/full_moon_with_face.png and b/public/images/emoji/google/full_moon_with_face.png differ diff --git a/public/images/emoji/google/funeral_urn.png b/public/images/emoji/google/funeral_urn.png index 2276468356..37ed3bc27d 100644 Binary files a/public/images/emoji/google/funeral_urn.png and b/public/images/emoji/google/funeral_urn.png differ diff --git a/public/images/emoji/google/gabon.png b/public/images/emoji/google/gabon.png index 0d07cbdb15..3dea502371 100644 Binary files a/public/images/emoji/google/gabon.png and b/public/images/emoji/google/gabon.png differ diff --git a/public/images/emoji/google/gambia.png b/public/images/emoji/google/gambia.png index 09cf69ab20..150e125017 100644 Binary files a/public/images/emoji/google/gambia.png and b/public/images/emoji/google/gambia.png differ diff --git a/public/images/emoji/google/game_die.png b/public/images/emoji/google/game_die.png index 90def81e5d..f3069892ce 100644 Binary files a/public/images/emoji/google/game_die.png and b/public/images/emoji/google/game_die.png differ diff --git a/public/images/emoji/google/gb.png b/public/images/emoji/google/gb.png index e7f3da7ea8..eac8318094 100644 Binary files a/public/images/emoji/google/gb.png and b/public/images/emoji/google/gb.png differ diff --git a/public/images/emoji/google/gear.png b/public/images/emoji/google/gear.png index 388f1cc6b5..548698afd0 100644 Binary files a/public/images/emoji/google/gear.png and b/public/images/emoji/google/gear.png differ diff --git a/public/images/emoji/google/gem.png b/public/images/emoji/google/gem.png index f0518d8cf9..fd35acb219 100644 Binary files a/public/images/emoji/google/gem.png and b/public/images/emoji/google/gem.png differ diff --git a/public/images/emoji/google/gemini.png b/public/images/emoji/google/gemini.png index a7c2a1448e..5a4a0892ef 100644 Binary files a/public/images/emoji/google/gemini.png and b/public/images/emoji/google/gemini.png differ diff --git a/public/images/emoji/google/genie.png b/public/images/emoji/google/genie.png index 19c606d424..0c228ad64c 100644 Binary files a/public/images/emoji/google/genie.png and b/public/images/emoji/google/genie.png differ diff --git a/public/images/emoji/google/georgia.png b/public/images/emoji/google/georgia.png index 9f21b04f7e..390af7ab5f 100644 Binary files a/public/images/emoji/google/georgia.png and b/public/images/emoji/google/georgia.png differ diff --git a/public/images/emoji/google/ghana.png b/public/images/emoji/google/ghana.png index f145d43c5a..ace426f59a 100644 Binary files a/public/images/emoji/google/ghana.png and b/public/images/emoji/google/ghana.png differ diff --git a/public/images/emoji/google/ghost.png b/public/images/emoji/google/ghost.png index 0733991c67..cbd2678c39 100644 Binary files a/public/images/emoji/google/ghost.png and b/public/images/emoji/google/ghost.png differ diff --git a/public/images/emoji/google/gibraltar.png b/public/images/emoji/google/gibraltar.png index e874972a0f..4744777f2e 100644 Binary files a/public/images/emoji/google/gibraltar.png and b/public/images/emoji/google/gibraltar.png differ diff --git a/public/images/emoji/google/gift.png b/public/images/emoji/google/gift.png index 15442c00b8..7208e63cd4 100644 Binary files a/public/images/emoji/google/gift.png and b/public/images/emoji/google/gift.png differ diff --git a/public/images/emoji/google/gift_heart.png b/public/images/emoji/google/gift_heart.png index 5cfe77ab2e..1e802feee3 100644 Binary files a/public/images/emoji/google/gift_heart.png and b/public/images/emoji/google/gift_heart.png differ diff --git a/public/images/emoji/google/giraffe.png b/public/images/emoji/google/giraffe.png index 9f5d19d3b4..6367132211 100644 Binary files a/public/images/emoji/google/giraffe.png and b/public/images/emoji/google/giraffe.png differ diff --git a/public/images/emoji/google/girl.png b/public/images/emoji/google/girl.png index 8d0daa3dcd..ff7892dd0a 100644 Binary files a/public/images/emoji/google/girl.png and b/public/images/emoji/google/girl.png differ diff --git a/public/images/emoji/google/globe_with_meridians.png b/public/images/emoji/google/globe_with_meridians.png index fb2d85c999..770d9ec39c 100644 Binary files a/public/images/emoji/google/globe_with_meridians.png and b/public/images/emoji/google/globe_with_meridians.png differ diff --git a/public/images/emoji/google/gloves.png b/public/images/emoji/google/gloves.png index f7a133190a..5cea6b6552 100644 Binary files a/public/images/emoji/google/gloves.png and b/public/images/emoji/google/gloves.png differ diff --git a/public/images/emoji/google/goal_net.png b/public/images/emoji/google/goal_net.png index 12e3b0dc32..2565467b1d 100644 Binary files a/public/images/emoji/google/goal_net.png and b/public/images/emoji/google/goal_net.png differ diff --git a/public/images/emoji/google/goat.png b/public/images/emoji/google/goat.png index 7958b1d38f..d57fa87a40 100644 Binary files a/public/images/emoji/google/goat.png and b/public/images/emoji/google/goat.png differ diff --git a/public/images/emoji/google/goggles.png b/public/images/emoji/google/goggles.png new file mode 100644 index 0000000000..3dc26bd8d5 Binary files /dev/null and b/public/images/emoji/google/goggles.png differ diff --git a/public/images/emoji/google/golf.png b/public/images/emoji/google/golf.png index 894702a9b0..44f94fc09d 100644 Binary files a/public/images/emoji/google/golf.png and b/public/images/emoji/google/golf.png differ diff --git a/public/images/emoji/google/golfer.png b/public/images/emoji/google/golfer.png index 62d945bfe8..a309fa1b29 100644 Binary files a/public/images/emoji/google/golfer.png and b/public/images/emoji/google/golfer.png differ diff --git a/public/images/emoji/google/golfing_man.png b/public/images/emoji/google/golfing_man.png index 62d945bfe8..a309fa1b29 100644 Binary files a/public/images/emoji/google/golfing_man.png and b/public/images/emoji/google/golfing_man.png differ diff --git a/public/images/emoji/google/golfing_woman.png b/public/images/emoji/google/golfing_woman.png index 0b2cec7411..5ba14ecff2 100644 Binary files a/public/images/emoji/google/golfing_woman.png and b/public/images/emoji/google/golfing_woman.png differ diff --git a/public/images/emoji/google/gorilla.png b/public/images/emoji/google/gorilla.png index 89bd5c51ed..a9f5270b44 100644 Binary files a/public/images/emoji/google/gorilla.png and b/public/images/emoji/google/gorilla.png differ diff --git a/public/images/emoji/google/grandma.png b/public/images/emoji/google/grandma.png index 1d07afb892..febc8a3d2b 100644 Binary files a/public/images/emoji/google/grandma.png and b/public/images/emoji/google/grandma.png differ diff --git a/public/images/emoji/google/grapes.png b/public/images/emoji/google/grapes.png index 391f9005dc..1284673ec4 100644 Binary files a/public/images/emoji/google/grapes.png and b/public/images/emoji/google/grapes.png differ diff --git a/public/images/emoji/google/greece.png b/public/images/emoji/google/greece.png index a54c5a3853..32337ccb93 100644 Binary files a/public/images/emoji/google/greece.png and b/public/images/emoji/google/greece.png differ diff --git a/public/images/emoji/google/green_apple.png b/public/images/emoji/google/green_apple.png index 1ce9eaa20e..acce0ce643 100644 Binary files a/public/images/emoji/google/green_apple.png and b/public/images/emoji/google/green_apple.png differ diff --git a/public/images/emoji/google/green_book.png b/public/images/emoji/google/green_book.png index ae6885adc5..1280921e97 100644 Binary files a/public/images/emoji/google/green_book.png and b/public/images/emoji/google/green_book.png differ diff --git a/public/images/emoji/google/green_heart.png b/public/images/emoji/google/green_heart.png index cde0bf984e..6fb7ba0848 100644 Binary files a/public/images/emoji/google/green_heart.png and b/public/images/emoji/google/green_heart.png differ diff --git a/public/images/emoji/google/green_salad.png b/public/images/emoji/google/green_salad.png index 4f88c9842e..a144b6e02d 100644 Binary files a/public/images/emoji/google/green_salad.png and b/public/images/emoji/google/green_salad.png differ diff --git a/public/images/emoji/google/greenland.png b/public/images/emoji/google/greenland.png index 1ab257cd06..f850318e6f 100644 Binary files a/public/images/emoji/google/greenland.png and b/public/images/emoji/google/greenland.png differ diff --git a/public/images/emoji/google/grenada.png b/public/images/emoji/google/grenada.png index 43f6d8c2cd..f9c5f83c45 100644 Binary files a/public/images/emoji/google/grenada.png and b/public/images/emoji/google/grenada.png differ diff --git a/public/images/emoji/google/grey_exclamation.png b/public/images/emoji/google/grey_exclamation.png index fe132124ae..c9037d5fd2 100644 Binary files a/public/images/emoji/google/grey_exclamation.png and b/public/images/emoji/google/grey_exclamation.png differ diff --git a/public/images/emoji/google/grey_question.png b/public/images/emoji/google/grey_question.png index 2078b5ed74..349251a1a5 100644 Binary files a/public/images/emoji/google/grey_question.png and b/public/images/emoji/google/grey_question.png differ diff --git a/public/images/emoji/google/grimacing.png b/public/images/emoji/google/grimacing.png index 6053a903cb..048fdf6d9b 100644 Binary files a/public/images/emoji/google/grimacing.png and b/public/images/emoji/google/grimacing.png differ diff --git a/public/images/emoji/google/grin.png b/public/images/emoji/google/grin.png index 963c41fa42..de66471a21 100644 Binary files a/public/images/emoji/google/grin.png and b/public/images/emoji/google/grin.png differ diff --git a/public/images/emoji/google/grinning.png b/public/images/emoji/google/grinning.png index 75116805a9..58a80c2fdf 100644 Binary files a/public/images/emoji/google/grinning.png and b/public/images/emoji/google/grinning.png differ diff --git a/public/images/emoji/google/guadeloupe.png b/public/images/emoji/google/guadeloupe.png index 4faf7e252e..3e579b476e 100644 Binary files a/public/images/emoji/google/guadeloupe.png and b/public/images/emoji/google/guadeloupe.png differ diff --git a/public/images/emoji/google/guam.png b/public/images/emoji/google/guam.png index 9a679174cb..ee829ed15a 100644 Binary files a/public/images/emoji/google/guam.png and b/public/images/emoji/google/guam.png differ diff --git a/public/images/emoji/google/guardsman.png b/public/images/emoji/google/guardsman.png index bbaa4b095f..a6e7b4f4af 100644 Binary files a/public/images/emoji/google/guardsman.png and b/public/images/emoji/google/guardsman.png differ diff --git a/public/images/emoji/google/guardswoman.png b/public/images/emoji/google/guardswoman.png index b7b1af5e2c..c3abad3759 100644 Binary files a/public/images/emoji/google/guardswoman.png and b/public/images/emoji/google/guardswoman.png differ diff --git a/public/images/emoji/google/guatemala.png b/public/images/emoji/google/guatemala.png index e0e6188ff7..bd22d387f0 100644 Binary files a/public/images/emoji/google/guatemala.png and b/public/images/emoji/google/guatemala.png differ diff --git a/public/images/emoji/google/guernsey.png b/public/images/emoji/google/guernsey.png index 8d16284123..991715af24 100644 Binary files a/public/images/emoji/google/guernsey.png and b/public/images/emoji/google/guernsey.png differ diff --git a/public/images/emoji/google/guinea.png b/public/images/emoji/google/guinea.png index 86b4aa84b0..cb068ee08d 100644 Binary files a/public/images/emoji/google/guinea.png and b/public/images/emoji/google/guinea.png differ diff --git a/public/images/emoji/google/guinea_bissau.png b/public/images/emoji/google/guinea_bissau.png index 0fc5486c2a..f272e47a09 100644 Binary files a/public/images/emoji/google/guinea_bissau.png and b/public/images/emoji/google/guinea_bissau.png differ diff --git a/public/images/emoji/google/guitar.png b/public/images/emoji/google/guitar.png index 4fd8cccea5..972e9c3f49 100644 Binary files a/public/images/emoji/google/guitar.png and b/public/images/emoji/google/guitar.png differ diff --git a/public/images/emoji/google/gun.png b/public/images/emoji/google/gun.png index 0e86cc080a..0afab91510 100644 Binary files a/public/images/emoji/google/gun.png and b/public/images/emoji/google/gun.png differ diff --git a/public/images/emoji/google/guyana.png b/public/images/emoji/google/guyana.png index 3452f5bf8d..7d26602834 100644 Binary files a/public/images/emoji/google/guyana.png and b/public/images/emoji/google/guyana.png differ diff --git a/public/images/emoji/google/haircut.png b/public/images/emoji/google/haircut.png index dad82f0f4e..f9833a0f0d 100644 Binary files a/public/images/emoji/google/haircut.png and b/public/images/emoji/google/haircut.png differ diff --git a/public/images/emoji/google/haircut_man.png b/public/images/emoji/google/haircut_man.png index f629747bf6..2a55e4ee6b 100644 Binary files a/public/images/emoji/google/haircut_man.png and b/public/images/emoji/google/haircut_man.png differ diff --git a/public/images/emoji/google/haircut_woman.png b/public/images/emoji/google/haircut_woman.png index dad82f0f4e..f9833a0f0d 100644 Binary files a/public/images/emoji/google/haircut_woman.png and b/public/images/emoji/google/haircut_woman.png differ diff --git a/public/images/emoji/google/haiti.png b/public/images/emoji/google/haiti.png index 14359b7264..1a15137ad4 100644 Binary files a/public/images/emoji/google/haiti.png and b/public/images/emoji/google/haiti.png differ diff --git a/public/images/emoji/google/hamburger.png b/public/images/emoji/google/hamburger.png index 9cf2945dbe..baba13de9a 100644 Binary files a/public/images/emoji/google/hamburger.png and b/public/images/emoji/google/hamburger.png differ diff --git a/public/images/emoji/google/hammer.png b/public/images/emoji/google/hammer.png index 9de50231ec..4f9d2dac86 100644 Binary files a/public/images/emoji/google/hammer.png and b/public/images/emoji/google/hammer.png differ diff --git a/public/images/emoji/google/hammer_and_pick.png b/public/images/emoji/google/hammer_and_pick.png index fe453343d8..7176696cb4 100644 Binary files a/public/images/emoji/google/hammer_and_pick.png and b/public/images/emoji/google/hammer_and_pick.png differ diff --git a/public/images/emoji/google/hammer_and_wrench.png b/public/images/emoji/google/hammer_and_wrench.png index f0fe70817f..71d0be2388 100644 Binary files a/public/images/emoji/google/hammer_and_wrench.png and b/public/images/emoji/google/hammer_and_wrench.png differ diff --git a/public/images/emoji/google/hammer_pick.png b/public/images/emoji/google/hammer_pick.png index fe453343d8..7176696cb4 100644 Binary files a/public/images/emoji/google/hammer_pick.png and b/public/images/emoji/google/hammer_pick.png differ diff --git a/public/images/emoji/google/hamster.png b/public/images/emoji/google/hamster.png index 8a5c4cb479..6a6e1056dc 100644 Binary files a/public/images/emoji/google/hamster.png and b/public/images/emoji/google/hamster.png differ diff --git a/public/images/emoji/google/hand.png b/public/images/emoji/google/hand.png index de95a84981..3f33c9fb12 100644 Binary files a/public/images/emoji/google/hand.png and b/public/images/emoji/google/hand.png differ diff --git a/public/images/emoji/google/hand_splayed.png b/public/images/emoji/google/hand_splayed.png index 12fee02f17..6863e74761 100644 Binary files a/public/images/emoji/google/hand_splayed.png and b/public/images/emoji/google/hand_splayed.png differ diff --git a/public/images/emoji/google/handbag.png b/public/images/emoji/google/handbag.png index 2c20f745fb..0c109ac867 100644 Binary files a/public/images/emoji/google/handbag.png and b/public/images/emoji/google/handbag.png differ diff --git a/public/images/emoji/google/handshake.png b/public/images/emoji/google/handshake.png index 26dd6b5491..aeef0658a0 100644 Binary files a/public/images/emoji/google/handshake.png and b/public/images/emoji/google/handshake.png differ diff --git a/public/images/emoji/google/hankey.png b/public/images/emoji/google/hankey.png index de476df01c..2d0740a6d5 100644 Binary files a/public/images/emoji/google/hankey.png and b/public/images/emoji/google/hankey.png differ diff --git a/public/images/emoji/google/hash.png b/public/images/emoji/google/hash.png index c0b84b964a..542ef83bab 100644 Binary files a/public/images/emoji/google/hash.png and b/public/images/emoji/google/hash.png differ diff --git a/public/images/emoji/google/hatched_chick.png b/public/images/emoji/google/hatched_chick.png index aea53232bd..6c02e25870 100644 Binary files a/public/images/emoji/google/hatched_chick.png and b/public/images/emoji/google/hatched_chick.png differ diff --git a/public/images/emoji/google/hatching_chick.png b/public/images/emoji/google/hatching_chick.png index cb467cf4d9..85936872f1 100644 Binary files a/public/images/emoji/google/hatching_chick.png and b/public/images/emoji/google/hatching_chick.png differ diff --git a/public/images/emoji/google/head_bandage.png b/public/images/emoji/google/head_bandage.png index 8618abf0ee..eb976220e1 100644 Binary files a/public/images/emoji/google/head_bandage.png and b/public/images/emoji/google/head_bandage.png differ diff --git a/public/images/emoji/google/headphones.png b/public/images/emoji/google/headphones.png index d192700359..a87303916f 100644 Binary files a/public/images/emoji/google/headphones.png and b/public/images/emoji/google/headphones.png differ diff --git a/public/images/emoji/google/hear_no_evil.png b/public/images/emoji/google/hear_no_evil.png index babbbc3114..346560553c 100644 Binary files a/public/images/emoji/google/hear_no_evil.png and b/public/images/emoji/google/hear_no_evil.png differ diff --git a/public/images/emoji/google/heard_and_mc_donald_islands.png b/public/images/emoji/google/heard_and_mc_donald_islands.png index fe795f0891..bbf27bc592 100644 Binary files a/public/images/emoji/google/heard_and_mc_donald_islands.png and b/public/images/emoji/google/heard_and_mc_donald_islands.png differ diff --git a/public/images/emoji/google/heart.png b/public/images/emoji/google/heart.png index efe5045aaf..865f5dcc04 100644 Binary files a/public/images/emoji/google/heart.png and b/public/images/emoji/google/heart.png differ diff --git a/public/images/emoji/google/heart_decoration.png b/public/images/emoji/google/heart_decoration.png index 61efd3a7d0..0bc84f2bd8 100644 Binary files a/public/images/emoji/google/heart_decoration.png and b/public/images/emoji/google/heart_decoration.png differ diff --git a/public/images/emoji/google/heart_exclamation.png b/public/images/emoji/google/heart_exclamation.png index a465293831..cb8bf22302 100644 Binary files a/public/images/emoji/google/heart_exclamation.png and b/public/images/emoji/google/heart_exclamation.png differ diff --git a/public/images/emoji/google/heart_eyes.png b/public/images/emoji/google/heart_eyes.png index 153a193297..f8ab83596f 100644 Binary files a/public/images/emoji/google/heart_eyes.png and b/public/images/emoji/google/heart_eyes.png differ diff --git a/public/images/emoji/google/heart_eyes_cat.png b/public/images/emoji/google/heart_eyes_cat.png index bcfeed0d8a..37f5d7f67e 100644 Binary files a/public/images/emoji/google/heart_eyes_cat.png and b/public/images/emoji/google/heart_eyes_cat.png differ diff --git a/public/images/emoji/google/heartbeat.png b/public/images/emoji/google/heartbeat.png index eb73e5b128..68a72106a7 100644 Binary files a/public/images/emoji/google/heartbeat.png and b/public/images/emoji/google/heartbeat.png differ diff --git a/public/images/emoji/google/heartpulse.png b/public/images/emoji/google/heartpulse.png index 6afab2f1ed..897a1ce91a 100644 Binary files a/public/images/emoji/google/heartpulse.png and b/public/images/emoji/google/heartpulse.png differ diff --git a/public/images/emoji/google/hearts.png b/public/images/emoji/google/hearts.png index 80a50d493c..6095725653 100644 Binary files a/public/images/emoji/google/hearts.png and b/public/images/emoji/google/hearts.png differ diff --git a/public/images/emoji/google/heavy_check_mark.png b/public/images/emoji/google/heavy_check_mark.png index 633cf8d619..e3a9c6a818 100644 Binary files a/public/images/emoji/google/heavy_check_mark.png and b/public/images/emoji/google/heavy_check_mark.png differ diff --git a/public/images/emoji/google/heavy_division_sign.png b/public/images/emoji/google/heavy_division_sign.png index 0f8274255c..66faac9d1d 100644 Binary files a/public/images/emoji/google/heavy_division_sign.png and b/public/images/emoji/google/heavy_division_sign.png differ diff --git a/public/images/emoji/google/heavy_dollar_sign.png b/public/images/emoji/google/heavy_dollar_sign.png index 9ca374652a..94f8cc0c2b 100644 Binary files a/public/images/emoji/google/heavy_dollar_sign.png and b/public/images/emoji/google/heavy_dollar_sign.png differ diff --git a/public/images/emoji/google/heavy_heart_exclamation.png b/public/images/emoji/google/heavy_heart_exclamation.png index a465293831..cb8bf22302 100644 Binary files a/public/images/emoji/google/heavy_heart_exclamation.png and b/public/images/emoji/google/heavy_heart_exclamation.png differ diff --git a/public/images/emoji/google/heavy_heart_exclamation_mark_ornament.png b/public/images/emoji/google/heavy_heart_exclamation_mark_ornament.png index a465293831..cb8bf22302 100644 Binary files a/public/images/emoji/google/heavy_heart_exclamation_mark_ornament.png and b/public/images/emoji/google/heavy_heart_exclamation_mark_ornament.png differ diff --git a/public/images/emoji/google/heavy_minus_sign.png b/public/images/emoji/google/heavy_minus_sign.png index 3f6a745872..c62ada662d 100644 Binary files a/public/images/emoji/google/heavy_minus_sign.png and b/public/images/emoji/google/heavy_minus_sign.png differ diff --git a/public/images/emoji/google/heavy_multiplication_x.png b/public/images/emoji/google/heavy_multiplication_x.png index ea6c96babe..1eacbe1feb 100644 Binary files a/public/images/emoji/google/heavy_multiplication_x.png and b/public/images/emoji/google/heavy_multiplication_x.png differ diff --git a/public/images/emoji/google/heavy_plus_sign.png b/public/images/emoji/google/heavy_plus_sign.png index c018223ed0..e66d0d4bd6 100644 Binary files a/public/images/emoji/google/heavy_plus_sign.png and b/public/images/emoji/google/heavy_plus_sign.png differ diff --git a/public/images/emoji/google/hedgehog.png b/public/images/emoji/google/hedgehog.png index e7de055476..41c9a6edc1 100644 Binary files a/public/images/emoji/google/hedgehog.png and b/public/images/emoji/google/hedgehog.png differ diff --git a/public/images/emoji/google/helicopter.png b/public/images/emoji/google/helicopter.png index c60b6ed1ee..99bc69e933 100644 Binary files a/public/images/emoji/google/helicopter.png and b/public/images/emoji/google/helicopter.png differ diff --git a/public/images/emoji/google/helmet_with_cross.png b/public/images/emoji/google/helmet_with_cross.png index 8d3d37d3ea..d992220980 100644 Binary files a/public/images/emoji/google/helmet_with_cross.png and b/public/images/emoji/google/helmet_with_cross.png differ diff --git a/public/images/emoji/google/helmet_with_white_cross.png b/public/images/emoji/google/helmet_with_white_cross.png index 8d3d37d3ea..d992220980 100644 Binary files a/public/images/emoji/google/helmet_with_white_cross.png and b/public/images/emoji/google/helmet_with_white_cross.png differ diff --git a/public/images/emoji/google/herb.png b/public/images/emoji/google/herb.png index 8527bdd60b..e6417b621e 100644 Binary files a/public/images/emoji/google/herb.png and b/public/images/emoji/google/herb.png differ diff --git a/public/images/emoji/google/hibiscus.png b/public/images/emoji/google/hibiscus.png index 5addab1524..54e4853171 100644 Binary files a/public/images/emoji/google/hibiscus.png and b/public/images/emoji/google/hibiscus.png differ diff --git a/public/images/emoji/google/high_brightness.png b/public/images/emoji/google/high_brightness.png index 1251c058e2..ad974d9ec9 100644 Binary files a/public/images/emoji/google/high_brightness.png and b/public/images/emoji/google/high_brightness.png differ diff --git a/public/images/emoji/google/high_heel.png b/public/images/emoji/google/high_heel.png index 521b4c044c..6169427a18 100644 Binary files a/public/images/emoji/google/high_heel.png and b/public/images/emoji/google/high_heel.png differ diff --git a/public/images/emoji/google/hiking_boot.png b/public/images/emoji/google/hiking_boot.png new file mode 100644 index 0000000000..4b7c351135 Binary files /dev/null and b/public/images/emoji/google/hiking_boot.png differ diff --git a/public/images/emoji/google/hippopotamus.png b/public/images/emoji/google/hippopotamus.png new file mode 100644 index 0000000000..f29ff13011 Binary files /dev/null and b/public/images/emoji/google/hippopotamus.png differ diff --git a/public/images/emoji/google/hocho.png b/public/images/emoji/google/hocho.png index d9e532c12b..c6f55dc458 100644 Binary files a/public/images/emoji/google/hocho.png and b/public/images/emoji/google/hocho.png differ diff --git a/public/images/emoji/google/hockey.png b/public/images/emoji/google/hockey.png index 81cb026d24..bc511ef0b8 100644 Binary files a/public/images/emoji/google/hockey.png and b/public/images/emoji/google/hockey.png differ diff --git a/public/images/emoji/google/hole.png b/public/images/emoji/google/hole.png index 10eff943c1..8357234e37 100644 Binary files a/public/images/emoji/google/hole.png and b/public/images/emoji/google/hole.png differ diff --git a/public/images/emoji/google/homes.png b/public/images/emoji/google/homes.png index 4e312a6768..85d3bc0122 100644 Binary files a/public/images/emoji/google/homes.png and b/public/images/emoji/google/homes.png differ diff --git a/public/images/emoji/google/honduras.png b/public/images/emoji/google/honduras.png index fa15bde301..1c04806dba 100644 Binary files a/public/images/emoji/google/honduras.png and b/public/images/emoji/google/honduras.png differ diff --git a/public/images/emoji/google/honey_pot.png b/public/images/emoji/google/honey_pot.png index da49c8ce70..a654359b43 100644 Binary files a/public/images/emoji/google/honey_pot.png and b/public/images/emoji/google/honey_pot.png differ diff --git a/public/images/emoji/google/honeybee.png b/public/images/emoji/google/honeybee.png index 4f0f41d104..ba23617d37 100644 Binary files a/public/images/emoji/google/honeybee.png and b/public/images/emoji/google/honeybee.png differ diff --git a/public/images/emoji/google/hong_kong.png b/public/images/emoji/google/hong_kong.png index 1ec01f1589..04087844e5 100644 Binary files a/public/images/emoji/google/hong_kong.png and b/public/images/emoji/google/hong_kong.png differ diff --git a/public/images/emoji/google/horse.png b/public/images/emoji/google/horse.png index 0bcd34f330..cfd8b33494 100644 Binary files a/public/images/emoji/google/horse.png and b/public/images/emoji/google/horse.png differ diff --git a/public/images/emoji/google/horse_racing.png b/public/images/emoji/google/horse_racing.png index c6f10035c3..60e52d8c19 100644 Binary files a/public/images/emoji/google/horse_racing.png and b/public/images/emoji/google/horse_racing.png differ diff --git a/public/images/emoji/google/hospital.png b/public/images/emoji/google/hospital.png index 93842ebe24..601189226a 100644 Binary files a/public/images/emoji/google/hospital.png and b/public/images/emoji/google/hospital.png differ diff --git a/public/images/emoji/google/hot_dog.png b/public/images/emoji/google/hot_dog.png index 535696a755..0823839016 100644 Binary files a/public/images/emoji/google/hot_dog.png and b/public/images/emoji/google/hot_dog.png differ diff --git a/public/images/emoji/google/hot_face.png b/public/images/emoji/google/hot_face.png new file mode 100644 index 0000000000..c2144e83e6 Binary files /dev/null and b/public/images/emoji/google/hot_face.png differ diff --git a/public/images/emoji/google/hot_pepper.png b/public/images/emoji/google/hot_pepper.png index 81ec80a8f1..70bb83a985 100644 Binary files a/public/images/emoji/google/hot_pepper.png and b/public/images/emoji/google/hot_pepper.png differ diff --git a/public/images/emoji/google/hotdog.png b/public/images/emoji/google/hotdog.png index 535696a755..0823839016 100644 Binary files a/public/images/emoji/google/hotdog.png and b/public/images/emoji/google/hotdog.png differ diff --git a/public/images/emoji/google/hotel.png b/public/images/emoji/google/hotel.png index 4ba11ec09d..99f881e1d9 100644 Binary files a/public/images/emoji/google/hotel.png and b/public/images/emoji/google/hotel.png differ diff --git a/public/images/emoji/google/hotsprings.png b/public/images/emoji/google/hotsprings.png index f4e7d6e15c..04ad6ff1cc 100644 Binary files a/public/images/emoji/google/hotsprings.png and b/public/images/emoji/google/hotsprings.png differ diff --git a/public/images/emoji/google/hourglass.png b/public/images/emoji/google/hourglass.png index 20ef82a19e..427cf97e20 100644 Binary files a/public/images/emoji/google/hourglass.png and b/public/images/emoji/google/hourglass.png differ diff --git a/public/images/emoji/google/hourglass_flowing_sand.png b/public/images/emoji/google/hourglass_flowing_sand.png index 31203e46e5..a9af7290a2 100644 Binary files a/public/images/emoji/google/hourglass_flowing_sand.png and b/public/images/emoji/google/hourglass_flowing_sand.png differ diff --git a/public/images/emoji/google/house.png b/public/images/emoji/google/house.png index c16b89e3e3..47876cf8ac 100644 Binary files a/public/images/emoji/google/house.png and b/public/images/emoji/google/house.png differ diff --git a/public/images/emoji/google/house_abandoned.png b/public/images/emoji/google/house_abandoned.png index 7b14c6c6cd..3bd3b89992 100644 Binary files a/public/images/emoji/google/house_abandoned.png and b/public/images/emoji/google/house_abandoned.png differ diff --git a/public/images/emoji/google/house_buildings.png b/public/images/emoji/google/house_buildings.png index 4e312a6768..85d3bc0122 100644 Binary files a/public/images/emoji/google/house_buildings.png and b/public/images/emoji/google/house_buildings.png differ diff --git a/public/images/emoji/google/house_with_garden.png b/public/images/emoji/google/house_with_garden.png index a0007d6608..7934fd51e1 100644 Binary files a/public/images/emoji/google/house_with_garden.png and b/public/images/emoji/google/house_with_garden.png differ diff --git a/public/images/emoji/google/houses.png b/public/images/emoji/google/houses.png index 4e312a6768..85d3bc0122 100644 Binary files a/public/images/emoji/google/houses.png and b/public/images/emoji/google/houses.png differ diff --git a/public/images/emoji/google/hugging.png b/public/images/emoji/google/hugging.png index f951d015c8..63d6ef138c 100644 Binary files a/public/images/emoji/google/hugging.png and b/public/images/emoji/google/hugging.png differ diff --git a/public/images/emoji/google/hugging_face.png b/public/images/emoji/google/hugging_face.png index f951d015c8..63d6ef138c 100644 Binary files a/public/images/emoji/google/hugging_face.png and b/public/images/emoji/google/hugging_face.png differ diff --git a/public/images/emoji/google/hugs.png b/public/images/emoji/google/hugs.png index f951d015c8..63d6ef138c 100644 Binary files a/public/images/emoji/google/hugs.png and b/public/images/emoji/google/hugs.png differ diff --git a/public/images/emoji/google/hungary.png b/public/images/emoji/google/hungary.png index 94646900ed..62d8c4336e 100644 Binary files a/public/images/emoji/google/hungary.png and b/public/images/emoji/google/hungary.png differ diff --git a/public/images/emoji/google/hushed.png b/public/images/emoji/google/hushed.png index c9e3b896ef..7102e0f344 100644 Binary files a/public/images/emoji/google/hushed.png and b/public/images/emoji/google/hushed.png differ diff --git a/public/images/emoji/google/ice_cream.png b/public/images/emoji/google/ice_cream.png index 3c8459f6f8..1346dd2baa 100644 Binary files a/public/images/emoji/google/ice_cream.png and b/public/images/emoji/google/ice_cream.png differ diff --git a/public/images/emoji/google/ice_hockey.png b/public/images/emoji/google/ice_hockey.png index 81cb026d24..bc511ef0b8 100644 Binary files a/public/images/emoji/google/ice_hockey.png and b/public/images/emoji/google/ice_hockey.png differ diff --git a/public/images/emoji/google/ice_skate.png b/public/images/emoji/google/ice_skate.png index bee3a0681f..7bb26e921f 100644 Binary files a/public/images/emoji/google/ice_skate.png and b/public/images/emoji/google/ice_skate.png differ diff --git a/public/images/emoji/google/icecream.png b/public/images/emoji/google/icecream.png index b3c6bac259..5c0b9e8108 100644 Binary files a/public/images/emoji/google/icecream.png and b/public/images/emoji/google/icecream.png differ diff --git a/public/images/emoji/google/iceland.png b/public/images/emoji/google/iceland.png index 21e1e41471..7e3b6ad1b4 100644 Binary files a/public/images/emoji/google/iceland.png and b/public/images/emoji/google/iceland.png differ diff --git a/public/images/emoji/google/id.png b/public/images/emoji/google/id.png index 4d7df3b1d6..eb77942374 100644 Binary files a/public/images/emoji/google/id.png and b/public/images/emoji/google/id.png differ diff --git a/public/images/emoji/google/ideograph_advantage.png b/public/images/emoji/google/ideograph_advantage.png index 02338e73e3..83fb1161d2 100644 Binary files a/public/images/emoji/google/ideograph_advantage.png and b/public/images/emoji/google/ideograph_advantage.png differ diff --git a/public/images/emoji/google/imp.png b/public/images/emoji/google/imp.png index fc24a43237..cd237345c3 100644 Binary files a/public/images/emoji/google/imp.png and b/public/images/emoji/google/imp.png differ diff --git a/public/images/emoji/google/inbox_tray.png b/public/images/emoji/google/inbox_tray.png index 2b63923817..b6f12b211c 100644 Binary files a/public/images/emoji/google/inbox_tray.png and b/public/images/emoji/google/inbox_tray.png differ diff --git a/public/images/emoji/google/incoming_envelope.png b/public/images/emoji/google/incoming_envelope.png index 4ada98ed64..e7d261d006 100644 Binary files a/public/images/emoji/google/incoming_envelope.png and b/public/images/emoji/google/incoming_envelope.png differ diff --git a/public/images/emoji/google/india.png b/public/images/emoji/google/india.png index e8b79d2986..c3e5389e25 100644 Binary files a/public/images/emoji/google/india.png and b/public/images/emoji/google/india.png differ diff --git a/public/images/emoji/google/indonesia.png b/public/images/emoji/google/indonesia.png index a409c19f42..f847c5dcff 100644 Binary files a/public/images/emoji/google/indonesia.png and b/public/images/emoji/google/indonesia.png differ diff --git a/public/images/emoji/google/infinity.png b/public/images/emoji/google/infinity.png new file mode 100644 index 0000000000..1afa586f9a Binary files /dev/null and b/public/images/emoji/google/infinity.png differ diff --git a/public/images/emoji/google/information_desk_person.png b/public/images/emoji/google/information_desk_person.png index 5a1a1083dd..8c9e966b3f 100644 Binary files a/public/images/emoji/google/information_desk_person.png and b/public/images/emoji/google/information_desk_person.png differ diff --git a/public/images/emoji/google/information_source.png b/public/images/emoji/google/information_source.png index 7e44ae84e9..cef4aa54e7 100644 Binary files a/public/images/emoji/google/information_source.png and b/public/images/emoji/google/information_source.png differ diff --git a/public/images/emoji/google/innocent.png b/public/images/emoji/google/innocent.png index acaf768d45..eaa5de4543 100644 Binary files a/public/images/emoji/google/innocent.png and b/public/images/emoji/google/innocent.png differ diff --git a/public/images/emoji/google/interrobang.png b/public/images/emoji/google/interrobang.png index d7edc4dc6d..9d530eb139 100644 Binary files a/public/images/emoji/google/interrobang.png and b/public/images/emoji/google/interrobang.png differ diff --git a/public/images/emoji/google/iphone.png b/public/images/emoji/google/iphone.png index bf384be461..ca7800665d 100644 Binary files a/public/images/emoji/google/iphone.png and b/public/images/emoji/google/iphone.png differ diff --git a/public/images/emoji/google/iran.png b/public/images/emoji/google/iran.png index 1105d156fd..bd89507649 100644 Binary files a/public/images/emoji/google/iran.png and b/public/images/emoji/google/iran.png differ diff --git a/public/images/emoji/google/iraq.png b/public/images/emoji/google/iraq.png index b5ae6b8de9..bf0f429a4a 100644 Binary files a/public/images/emoji/google/iraq.png and b/public/images/emoji/google/iraq.png differ diff --git a/public/images/emoji/google/ireland.png b/public/images/emoji/google/ireland.png index 9d5cc18875..f4b6b4ae84 100644 Binary files a/public/images/emoji/google/ireland.png and b/public/images/emoji/google/ireland.png differ diff --git a/public/images/emoji/google/island.png b/public/images/emoji/google/island.png index e68a3fe14f..a396a8e622 100644 Binary files a/public/images/emoji/google/island.png and b/public/images/emoji/google/island.png differ diff --git a/public/images/emoji/google/isle_of_man.png b/public/images/emoji/google/isle_of_man.png index 4f30ad3ffd..4119ecb31e 100644 Binary files a/public/images/emoji/google/isle_of_man.png and b/public/images/emoji/google/isle_of_man.png differ diff --git a/public/images/emoji/google/israel.png b/public/images/emoji/google/israel.png index e32f46c9c2..47cf318931 100644 Binary files a/public/images/emoji/google/israel.png and b/public/images/emoji/google/israel.png differ diff --git a/public/images/emoji/google/it.png b/public/images/emoji/google/it.png index 605e128012..8f0a8da011 100644 Binary files a/public/images/emoji/google/it.png and b/public/images/emoji/google/it.png differ diff --git a/public/images/emoji/google/izakaya_lantern.png b/public/images/emoji/google/izakaya_lantern.png index 3e34d70fd1..79474abe50 100644 Binary files a/public/images/emoji/google/izakaya_lantern.png and b/public/images/emoji/google/izakaya_lantern.png differ diff --git a/public/images/emoji/google/jack_o_lantern.png b/public/images/emoji/google/jack_o_lantern.png index 60a2363975..78e627b713 100644 Binary files a/public/images/emoji/google/jack_o_lantern.png and b/public/images/emoji/google/jack_o_lantern.png differ diff --git a/public/images/emoji/google/jamaica.png b/public/images/emoji/google/jamaica.png index 71f190ac1c..88d4b9d3cc 100644 Binary files a/public/images/emoji/google/jamaica.png and b/public/images/emoji/google/jamaica.png differ diff --git a/public/images/emoji/google/japan.png b/public/images/emoji/google/japan.png index 79fd5a80af..9dee663903 100644 Binary files a/public/images/emoji/google/japan.png and b/public/images/emoji/google/japan.png differ diff --git a/public/images/emoji/google/japanese_castle.png b/public/images/emoji/google/japanese_castle.png index fc55df18a3..78a9dd42c2 100644 Binary files a/public/images/emoji/google/japanese_castle.png and b/public/images/emoji/google/japanese_castle.png differ diff --git a/public/images/emoji/google/japanese_goblin.png b/public/images/emoji/google/japanese_goblin.png index c4c1181803..5899164177 100644 Binary files a/public/images/emoji/google/japanese_goblin.png and b/public/images/emoji/google/japanese_goblin.png differ diff --git a/public/images/emoji/google/japanese_ogre.png b/public/images/emoji/google/japanese_ogre.png index 5dfe0cb039..0f3880dd62 100644 Binary files a/public/images/emoji/google/japanese_ogre.png and b/public/images/emoji/google/japanese_ogre.png differ diff --git a/public/images/emoji/google/jeans.png b/public/images/emoji/google/jeans.png index 2c85072f3c..9aa734458e 100644 Binary files a/public/images/emoji/google/jeans.png and b/public/images/emoji/google/jeans.png differ diff --git a/public/images/emoji/google/jersey.png b/public/images/emoji/google/jersey.png index 03fc51703e..803b643a9e 100644 Binary files a/public/images/emoji/google/jersey.png and b/public/images/emoji/google/jersey.png differ diff --git a/public/images/emoji/google/jigsaw.png b/public/images/emoji/google/jigsaw.png new file mode 100644 index 0000000000..ccf1128752 Binary files /dev/null and b/public/images/emoji/google/jigsaw.png differ diff --git a/public/images/emoji/google/jordan.png b/public/images/emoji/google/jordan.png index 53697f64ca..d5fd5a0cd9 100644 Binary files a/public/images/emoji/google/jordan.png and b/public/images/emoji/google/jordan.png differ diff --git a/public/images/emoji/google/joy.png b/public/images/emoji/google/joy.png index 30bc7110dd..664cbfe393 100644 Binary files a/public/images/emoji/google/joy.png and b/public/images/emoji/google/joy.png differ diff --git a/public/images/emoji/google/joy_cat.png b/public/images/emoji/google/joy_cat.png index dc7e21465f..78762d3706 100644 Binary files a/public/images/emoji/google/joy_cat.png and b/public/images/emoji/google/joy_cat.png differ diff --git a/public/images/emoji/google/joystick.png b/public/images/emoji/google/joystick.png index 18598ecb9a..de5b8f772a 100644 Binary files a/public/images/emoji/google/joystick.png and b/public/images/emoji/google/joystick.png differ diff --git a/public/images/emoji/google/jp.png b/public/images/emoji/google/jp.png index c75dad0d10..c9983140ec 100644 Binary files a/public/images/emoji/google/jp.png and b/public/images/emoji/google/jp.png differ diff --git a/public/images/emoji/google/kaaba.png b/public/images/emoji/google/kaaba.png index 9e552ab0f6..f585c610ce 100644 Binary files a/public/images/emoji/google/kaaba.png and b/public/images/emoji/google/kaaba.png differ diff --git a/public/images/emoji/google/kangaroo.png b/public/images/emoji/google/kangaroo.png new file mode 100644 index 0000000000..06e7bd982e Binary files /dev/null and b/public/images/emoji/google/kangaroo.png differ diff --git a/public/images/emoji/google/kazakhstan.png b/public/images/emoji/google/kazakhstan.png index d2a5e07df6..19570e8668 100644 Binary files a/public/images/emoji/google/kazakhstan.png and b/public/images/emoji/google/kazakhstan.png differ diff --git a/public/images/emoji/google/kenya.png b/public/images/emoji/google/kenya.png index f1bf336597..23a1795757 100644 Binary files a/public/images/emoji/google/kenya.png and b/public/images/emoji/google/kenya.png differ diff --git a/public/images/emoji/google/key.png b/public/images/emoji/google/key.png index e54c3b358c..9d3d73d379 100644 Binary files a/public/images/emoji/google/key.png and b/public/images/emoji/google/key.png differ diff --git a/public/images/emoji/google/key2.png b/public/images/emoji/google/key2.png index 6083982335..8df5d2ca80 100644 Binary files a/public/images/emoji/google/key2.png and b/public/images/emoji/google/key2.png differ diff --git a/public/images/emoji/google/keyboard.png b/public/images/emoji/google/keyboard.png index d040041c67..f75c0ea360 100644 Binary files a/public/images/emoji/google/keyboard.png and b/public/images/emoji/google/keyboard.png differ diff --git a/public/images/emoji/google/keycap_star.png b/public/images/emoji/google/keycap_star.png index ff8fbb5091..0b1a1d5605 100644 Binary files a/public/images/emoji/google/keycap_star.png and b/public/images/emoji/google/keycap_star.png differ diff --git a/public/images/emoji/google/keycap_ten.png b/public/images/emoji/google/keycap_ten.png index 26d2af616c..6535583925 100644 Binary files a/public/images/emoji/google/keycap_ten.png and b/public/images/emoji/google/keycap_ten.png differ diff --git a/public/images/emoji/google/kick_scooter.png b/public/images/emoji/google/kick_scooter.png index 12949d8c6e..36648753bb 100644 Binary files a/public/images/emoji/google/kick_scooter.png and b/public/images/emoji/google/kick_scooter.png differ diff --git a/public/images/emoji/google/kimono.png b/public/images/emoji/google/kimono.png index 2699b7cc0f..3ca4fa6bae 100644 Binary files a/public/images/emoji/google/kimono.png and b/public/images/emoji/google/kimono.png differ diff --git a/public/images/emoji/google/kiribati.png b/public/images/emoji/google/kiribati.png index 98ccbd9c5a..e8db4b7a64 100644 Binary files a/public/images/emoji/google/kiribati.png and b/public/images/emoji/google/kiribati.png differ diff --git a/public/images/emoji/google/kiss.png b/public/images/emoji/google/kiss.png index 96fbc506de..1c751a052f 100644 Binary files a/public/images/emoji/google/kiss.png and b/public/images/emoji/google/kiss.png differ diff --git a/public/images/emoji/google/kissing.png b/public/images/emoji/google/kissing.png index e4c9b7196c..aa3a5a3b15 100644 Binary files a/public/images/emoji/google/kissing.png and b/public/images/emoji/google/kissing.png differ diff --git a/public/images/emoji/google/kissing_cat.png b/public/images/emoji/google/kissing_cat.png index d5d9962f76..3d1d8834ed 100644 Binary files a/public/images/emoji/google/kissing_cat.png and b/public/images/emoji/google/kissing_cat.png differ diff --git a/public/images/emoji/google/kissing_closed_eyes.png b/public/images/emoji/google/kissing_closed_eyes.png index 90c7791db5..650712f21b 100644 Binary files a/public/images/emoji/google/kissing_closed_eyes.png and b/public/images/emoji/google/kissing_closed_eyes.png differ diff --git a/public/images/emoji/google/kissing_heart.png b/public/images/emoji/google/kissing_heart.png index 99c1f3981e..9027958ae1 100644 Binary files a/public/images/emoji/google/kissing_heart.png and b/public/images/emoji/google/kissing_heart.png differ diff --git a/public/images/emoji/google/kissing_smiling_eyes.png b/public/images/emoji/google/kissing_smiling_eyes.png index e376812155..0f4f536056 100644 Binary files a/public/images/emoji/google/kissing_smiling_eyes.png and b/public/images/emoji/google/kissing_smiling_eyes.png differ diff --git a/public/images/emoji/google/kiwi_fruit.png b/public/images/emoji/google/kiwi_fruit.png index fee1445b0f..4d81bf7920 100644 Binary files a/public/images/emoji/google/kiwi_fruit.png and b/public/images/emoji/google/kiwi_fruit.png differ diff --git a/public/images/emoji/google/knife.png b/public/images/emoji/google/knife.png index d9e532c12b..c6f55dc458 100644 Binary files a/public/images/emoji/google/knife.png and b/public/images/emoji/google/knife.png differ diff --git a/public/images/emoji/google/koala.png b/public/images/emoji/google/koala.png index a70f78e23d..9523c2e4ac 100644 Binary files a/public/images/emoji/google/koala.png and b/public/images/emoji/google/koala.png differ diff --git a/public/images/emoji/google/koko.png b/public/images/emoji/google/koko.png index ccabba4449..0c80f46d49 100644 Binary files a/public/images/emoji/google/koko.png and b/public/images/emoji/google/koko.png differ diff --git a/public/images/emoji/google/kosovo.png b/public/images/emoji/google/kosovo.png index 4faf7e252e..f3df64312f 100644 Binary files a/public/images/emoji/google/kosovo.png and b/public/images/emoji/google/kosovo.png differ diff --git a/public/images/emoji/google/kr.png b/public/images/emoji/google/kr.png index 048ceeb3e4..7eb3980e61 100644 Binary files a/public/images/emoji/google/kr.png and b/public/images/emoji/google/kr.png differ diff --git a/public/images/emoji/google/kuwait.png b/public/images/emoji/google/kuwait.png index da41db123e..6c17d9e9f1 100644 Binary files a/public/images/emoji/google/kuwait.png and b/public/images/emoji/google/kuwait.png differ diff --git a/public/images/emoji/google/kyrgyzstan.png b/public/images/emoji/google/kyrgyzstan.png index 1fb2105a91..fff2b56ca8 100644 Binary files a/public/images/emoji/google/kyrgyzstan.png and b/public/images/emoji/google/kyrgyzstan.png differ diff --git a/public/images/emoji/google/lab_coat.png b/public/images/emoji/google/lab_coat.png new file mode 100644 index 0000000000..6e23b3cc00 Binary files /dev/null and b/public/images/emoji/google/lab_coat.png differ diff --git a/public/images/emoji/google/label.png b/public/images/emoji/google/label.png index 2544282029..e82d798179 100644 Binary files a/public/images/emoji/google/label.png and b/public/images/emoji/google/label.png differ diff --git a/public/images/emoji/google/lacrosse.png b/public/images/emoji/google/lacrosse.png new file mode 100644 index 0000000000..3d35eaa619 Binary files /dev/null and b/public/images/emoji/google/lacrosse.png differ diff --git a/public/images/emoji/google/laos.png b/public/images/emoji/google/laos.png index 2ac96b742b..46c0bf6c08 100644 Binary files a/public/images/emoji/google/laos.png and b/public/images/emoji/google/laos.png differ diff --git a/public/images/emoji/google/large_blue_circle.png b/public/images/emoji/google/large_blue_circle.png index 79e1630641..470d03708f 100644 Binary files a/public/images/emoji/google/large_blue_circle.png and b/public/images/emoji/google/large_blue_circle.png differ diff --git a/public/images/emoji/google/large_blue_diamond.png b/public/images/emoji/google/large_blue_diamond.png index 2086e95adb..9ce6a7ec46 100644 Binary files a/public/images/emoji/google/large_blue_diamond.png and b/public/images/emoji/google/large_blue_diamond.png differ diff --git a/public/images/emoji/google/large_orange_diamond.png b/public/images/emoji/google/large_orange_diamond.png index fce5aeae50..aad2664615 100644 Binary files a/public/images/emoji/google/large_orange_diamond.png and b/public/images/emoji/google/large_orange_diamond.png differ diff --git a/public/images/emoji/google/last_quarter_moon.png b/public/images/emoji/google/last_quarter_moon.png index 474ad185a6..417a31e9d7 100644 Binary files a/public/images/emoji/google/last_quarter_moon.png and b/public/images/emoji/google/last_quarter_moon.png differ diff --git a/public/images/emoji/google/last_quarter_moon_with_face.png b/public/images/emoji/google/last_quarter_moon_with_face.png index c4bea25ef7..a2ca0c3c3a 100644 Binary files a/public/images/emoji/google/last_quarter_moon_with_face.png and b/public/images/emoji/google/last_quarter_moon_with_face.png differ diff --git a/public/images/emoji/google/latin_cross.png b/public/images/emoji/google/latin_cross.png index f0608264bb..d1294ac4c0 100644 Binary files a/public/images/emoji/google/latin_cross.png and b/public/images/emoji/google/latin_cross.png differ diff --git a/public/images/emoji/google/latvia.png b/public/images/emoji/google/latvia.png index 8bd9d34140..466ba19f81 100644 Binary files a/public/images/emoji/google/latvia.png and b/public/images/emoji/google/latvia.png differ diff --git a/public/images/emoji/google/laughing.png b/public/images/emoji/google/laughing.png index 2fdeacfbbc..ec03b4cd0f 100644 Binary files a/public/images/emoji/google/laughing.png and b/public/images/emoji/google/laughing.png differ diff --git a/public/images/emoji/google/leafy_green.png b/public/images/emoji/google/leafy_green.png new file mode 100644 index 0000000000..06ef35bc58 Binary files /dev/null and b/public/images/emoji/google/leafy_green.png differ diff --git a/public/images/emoji/google/leaves.png b/public/images/emoji/google/leaves.png index 68220fe003..726199d191 100644 Binary files a/public/images/emoji/google/leaves.png and b/public/images/emoji/google/leaves.png differ diff --git a/public/images/emoji/google/lebanon.png b/public/images/emoji/google/lebanon.png index bbcf9c9cf5..e614f972de 100644 Binary files a/public/images/emoji/google/lebanon.png and b/public/images/emoji/google/lebanon.png differ diff --git a/public/images/emoji/google/ledger.png b/public/images/emoji/google/ledger.png index 759754c471..cd17fd850c 100644 Binary files a/public/images/emoji/google/ledger.png and b/public/images/emoji/google/ledger.png differ diff --git a/public/images/emoji/google/left_luggage.png b/public/images/emoji/google/left_luggage.png index 53fdbe4e47..1bc80818d1 100644 Binary files a/public/images/emoji/google/left_luggage.png and b/public/images/emoji/google/left_luggage.png differ diff --git a/public/images/emoji/google/left_right_arrow.png b/public/images/emoji/google/left_right_arrow.png index cbc0c43e0e..e36fde815f 100644 Binary files a/public/images/emoji/google/left_right_arrow.png and b/public/images/emoji/google/left_right_arrow.png differ diff --git a/public/images/emoji/google/left_speech_bubble.png b/public/images/emoji/google/left_speech_bubble.png index f9c1779ebe..f2ea28479c 100644 Binary files a/public/images/emoji/google/left_speech_bubble.png and b/public/images/emoji/google/left_speech_bubble.png differ diff --git a/public/images/emoji/google/leftwards_arrow_with_hook.png b/public/images/emoji/google/leftwards_arrow_with_hook.png index 6ea31fa331..cd58a78b50 100644 Binary files a/public/images/emoji/google/leftwards_arrow_with_hook.png and b/public/images/emoji/google/leftwards_arrow_with_hook.png differ diff --git a/public/images/emoji/google/leg.png b/public/images/emoji/google/leg.png new file mode 100644 index 0000000000..befe781f0a Binary files /dev/null and b/public/images/emoji/google/leg.png differ diff --git a/public/images/emoji/google/lemon.png b/public/images/emoji/google/lemon.png index c4fb9838ff..fb7733b518 100644 Binary files a/public/images/emoji/google/lemon.png and b/public/images/emoji/google/lemon.png differ diff --git a/public/images/emoji/google/leo.png b/public/images/emoji/google/leo.png index 1397081a26..eeeac5447b 100644 Binary files a/public/images/emoji/google/leo.png and b/public/images/emoji/google/leo.png differ diff --git a/public/images/emoji/google/leopard.png b/public/images/emoji/google/leopard.png index bef21cdd35..fd3f380dbe 100644 Binary files a/public/images/emoji/google/leopard.png and b/public/images/emoji/google/leopard.png differ diff --git a/public/images/emoji/google/lesotho.png b/public/images/emoji/google/lesotho.png index d175a10c77..efb79d0498 100644 Binary files a/public/images/emoji/google/lesotho.png and b/public/images/emoji/google/lesotho.png differ diff --git a/public/images/emoji/google/level_slider.png b/public/images/emoji/google/level_slider.png index e3840083c2..e5db8008f7 100644 Binary files a/public/images/emoji/google/level_slider.png and b/public/images/emoji/google/level_slider.png differ diff --git a/public/images/emoji/google/levitate.png b/public/images/emoji/google/levitate.png index b7eea2e014..8f238ce960 100644 Binary files a/public/images/emoji/google/levitate.png and b/public/images/emoji/google/levitate.png differ diff --git a/public/images/emoji/google/liberia.png b/public/images/emoji/google/liberia.png index 7e962415d4..cdefc5dcc1 100644 Binary files a/public/images/emoji/google/liberia.png and b/public/images/emoji/google/liberia.png differ diff --git a/public/images/emoji/google/libra.png b/public/images/emoji/google/libra.png index 55862258b1..300826839d 100644 Binary files a/public/images/emoji/google/libra.png and b/public/images/emoji/google/libra.png differ diff --git a/public/images/emoji/google/libya.png b/public/images/emoji/google/libya.png index ec473782ae..9fa0e2dcf0 100644 Binary files a/public/images/emoji/google/libya.png and b/public/images/emoji/google/libya.png differ diff --git a/public/images/emoji/google/liechtenstein.png b/public/images/emoji/google/liechtenstein.png index e429b5bc3e..16e19a4654 100644 Binary files a/public/images/emoji/google/liechtenstein.png and b/public/images/emoji/google/liechtenstein.png differ diff --git a/public/images/emoji/google/lifter.png b/public/images/emoji/google/lifter.png index d570f812ae..45a93f757a 100644 Binary files a/public/images/emoji/google/lifter.png and b/public/images/emoji/google/lifter.png differ diff --git a/public/images/emoji/google/light_rail.png b/public/images/emoji/google/light_rail.png index 514374ec9e..1edd380e83 100644 Binary files a/public/images/emoji/google/light_rail.png and b/public/images/emoji/google/light_rail.png differ diff --git a/public/images/emoji/google/link.png b/public/images/emoji/google/link.png index cda895e350..b4669799e0 100644 Binary files a/public/images/emoji/google/link.png and b/public/images/emoji/google/link.png differ diff --git a/public/images/emoji/google/linked_paperclips.png b/public/images/emoji/google/linked_paperclips.png index 56d7279a5c..af91dafb77 100644 Binary files a/public/images/emoji/google/linked_paperclips.png and b/public/images/emoji/google/linked_paperclips.png differ diff --git a/public/images/emoji/google/lion.png b/public/images/emoji/google/lion.png index 52448031ce..c5d9cf399d 100644 Binary files a/public/images/emoji/google/lion.png and b/public/images/emoji/google/lion.png differ diff --git a/public/images/emoji/google/lion_face.png b/public/images/emoji/google/lion_face.png index 52448031ce..c5d9cf399d 100644 Binary files a/public/images/emoji/google/lion_face.png and b/public/images/emoji/google/lion_face.png differ diff --git a/public/images/emoji/google/lips.png b/public/images/emoji/google/lips.png index 9f78922d42..c3998ac03f 100644 Binary files a/public/images/emoji/google/lips.png and b/public/images/emoji/google/lips.png differ diff --git a/public/images/emoji/google/lipstick.png b/public/images/emoji/google/lipstick.png index 86b59270fd..78b377ca6a 100644 Binary files a/public/images/emoji/google/lipstick.png and b/public/images/emoji/google/lipstick.png differ diff --git a/public/images/emoji/google/lithuania.png b/public/images/emoji/google/lithuania.png index 598a8e5663..67defce08b 100644 Binary files a/public/images/emoji/google/lithuania.png and b/public/images/emoji/google/lithuania.png differ diff --git a/public/images/emoji/google/lizard.png b/public/images/emoji/google/lizard.png index 1026acfbcd..4fa872231d 100644 Binary files a/public/images/emoji/google/lizard.png and b/public/images/emoji/google/lizard.png differ diff --git a/public/images/emoji/google/llama.png b/public/images/emoji/google/llama.png new file mode 100644 index 0000000000..2f93589bd1 Binary files /dev/null and b/public/images/emoji/google/llama.png differ diff --git a/public/images/emoji/google/lobster.png b/public/images/emoji/google/lobster.png new file mode 100644 index 0000000000..1f412955b5 Binary files /dev/null and b/public/images/emoji/google/lobster.png differ diff --git a/public/images/emoji/google/lock.png b/public/images/emoji/google/lock.png index b74fad6ead..5769aec137 100644 Binary files a/public/images/emoji/google/lock.png and b/public/images/emoji/google/lock.png differ diff --git a/public/images/emoji/google/lock_with_ink_pen.png b/public/images/emoji/google/lock_with_ink_pen.png index dc89f2c993..e5ae80fa0f 100644 Binary files a/public/images/emoji/google/lock_with_ink_pen.png and b/public/images/emoji/google/lock_with_ink_pen.png differ diff --git a/public/images/emoji/google/lollipop.png b/public/images/emoji/google/lollipop.png index a381976a26..ea69c310e0 100644 Binary files a/public/images/emoji/google/lollipop.png and b/public/images/emoji/google/lollipop.png differ diff --git a/public/images/emoji/google/loop.png b/public/images/emoji/google/loop.png index 14faa3939e..3cbd0e145e 100644 Binary files a/public/images/emoji/google/loop.png and b/public/images/emoji/google/loop.png differ diff --git a/public/images/emoji/google/lotion_bottle.png b/public/images/emoji/google/lotion_bottle.png new file mode 100644 index 0000000000..42fbe30777 Binary files /dev/null and b/public/images/emoji/google/lotion_bottle.png differ diff --git a/public/images/emoji/google/loud_sound.png b/public/images/emoji/google/loud_sound.png index 749dc5a816..5a5bed59cb 100644 Binary files a/public/images/emoji/google/loud_sound.png and b/public/images/emoji/google/loud_sound.png differ diff --git a/public/images/emoji/google/loudspeaker.png b/public/images/emoji/google/loudspeaker.png index b844d9ce7c..0df2bcb065 100644 Binary files a/public/images/emoji/google/loudspeaker.png and b/public/images/emoji/google/loudspeaker.png differ diff --git a/public/images/emoji/google/love_hotel.png b/public/images/emoji/google/love_hotel.png index eed33686f4..84033b1de8 100644 Binary files a/public/images/emoji/google/love_hotel.png and b/public/images/emoji/google/love_hotel.png differ diff --git a/public/images/emoji/google/love_letter.png b/public/images/emoji/google/love_letter.png index 5edb3681f0..52c4136ab9 100644 Binary files a/public/images/emoji/google/love_letter.png and b/public/images/emoji/google/love_letter.png differ diff --git a/public/images/emoji/google/love_you_gesture.png b/public/images/emoji/google/love_you_gesture.png index ad51606a93..115eb41b42 100644 Binary files a/public/images/emoji/google/love_you_gesture.png and b/public/images/emoji/google/love_you_gesture.png differ diff --git a/public/images/emoji/google/low_brightness.png b/public/images/emoji/google/low_brightness.png index 26fe0fc95f..bb450f7d60 100644 Binary files a/public/images/emoji/google/low_brightness.png and b/public/images/emoji/google/low_brightness.png differ diff --git a/public/images/emoji/google/lower_left_ballpoint_pen.png b/public/images/emoji/google/lower_left_ballpoint_pen.png index a3312810ec..3ad636f5b5 100644 Binary files a/public/images/emoji/google/lower_left_ballpoint_pen.png and b/public/images/emoji/google/lower_left_ballpoint_pen.png differ diff --git a/public/images/emoji/google/lower_left_crayon.png b/public/images/emoji/google/lower_left_crayon.png index bec3b70573..aa13705fb2 100644 Binary files a/public/images/emoji/google/lower_left_crayon.png and b/public/images/emoji/google/lower_left_crayon.png differ diff --git a/public/images/emoji/google/lower_left_fountain_pen.png b/public/images/emoji/google/lower_left_fountain_pen.png index 3d8ba60471..91f31b4580 100644 Binary files a/public/images/emoji/google/lower_left_fountain_pen.png and b/public/images/emoji/google/lower_left_fountain_pen.png differ diff --git a/public/images/emoji/google/lower_left_paintbrush.png b/public/images/emoji/google/lower_left_paintbrush.png index bde63a8092..a0af9ebb49 100644 Binary files a/public/images/emoji/google/lower_left_paintbrush.png and b/public/images/emoji/google/lower_left_paintbrush.png differ diff --git a/public/images/emoji/google/luggage.png b/public/images/emoji/google/luggage.png new file mode 100644 index 0000000000..5386c2ff45 Binary files /dev/null and b/public/images/emoji/google/luggage.png differ diff --git a/public/images/emoji/google/luxembourg.png b/public/images/emoji/google/luxembourg.png index f1b83bbc52..751e6303e9 100644 Binary files a/public/images/emoji/google/luxembourg.png and b/public/images/emoji/google/luxembourg.png differ diff --git a/public/images/emoji/google/lying_face.png b/public/images/emoji/google/lying_face.png index 8a33f01cf5..1e36bb211a 100644 Binary files a/public/images/emoji/google/lying_face.png and b/public/images/emoji/google/lying_face.png differ diff --git a/public/images/emoji/google/m.png b/public/images/emoji/google/m.png index eac88f2c31..a54c757345 100644 Binary files a/public/images/emoji/google/m.png and b/public/images/emoji/google/m.png differ diff --git a/public/images/emoji/google/macau.png b/public/images/emoji/google/macau.png index 551bd77cf0..5be0cfffad 100644 Binary files a/public/images/emoji/google/macau.png and b/public/images/emoji/google/macau.png differ diff --git a/public/images/emoji/google/macedonia.png b/public/images/emoji/google/macedonia.png index f1f975d94d..29bbe5a5d9 100644 Binary files a/public/images/emoji/google/macedonia.png and b/public/images/emoji/google/macedonia.png differ diff --git a/public/images/emoji/google/madagascar.png b/public/images/emoji/google/madagascar.png index 36745e2626..c76d7371ce 100644 Binary files a/public/images/emoji/google/madagascar.png and b/public/images/emoji/google/madagascar.png differ diff --git a/public/images/emoji/google/mag.png b/public/images/emoji/google/mag.png index ef6581c19e..45d0c886ca 100644 Binary files a/public/images/emoji/google/mag.png and b/public/images/emoji/google/mag.png differ diff --git a/public/images/emoji/google/mag_right.png b/public/images/emoji/google/mag_right.png index 3a6245beb7..eed4eb96ce 100644 Binary files a/public/images/emoji/google/mag_right.png and b/public/images/emoji/google/mag_right.png differ diff --git a/public/images/emoji/google/mage.png b/public/images/emoji/google/mage.png index 887a5bbfa9..f19be0d06d 100644 Binary files a/public/images/emoji/google/mage.png and b/public/images/emoji/google/mage.png differ diff --git a/public/images/emoji/google/magnet.png b/public/images/emoji/google/magnet.png new file mode 100644 index 0000000000..f5cd7151b5 Binary files /dev/null and b/public/images/emoji/google/magnet.png differ diff --git a/public/images/emoji/google/mahjong.png b/public/images/emoji/google/mahjong.png index c235b290bf..12705aa90f 100644 Binary files a/public/images/emoji/google/mahjong.png and b/public/images/emoji/google/mahjong.png differ diff --git a/public/images/emoji/google/mailbox.png b/public/images/emoji/google/mailbox.png index b61b523ab8..07a35abd3d 100644 Binary files a/public/images/emoji/google/mailbox.png and b/public/images/emoji/google/mailbox.png differ diff --git a/public/images/emoji/google/mailbox_closed.png b/public/images/emoji/google/mailbox_closed.png index c8c931456c..fe6525d5d2 100644 Binary files a/public/images/emoji/google/mailbox_closed.png and b/public/images/emoji/google/mailbox_closed.png differ diff --git a/public/images/emoji/google/mailbox_with_mail.png b/public/images/emoji/google/mailbox_with_mail.png index 5d4408c2eb..2c421197d7 100644 Binary files a/public/images/emoji/google/mailbox_with_mail.png and b/public/images/emoji/google/mailbox_with_mail.png differ diff --git a/public/images/emoji/google/mailbox_with_no_mail.png b/public/images/emoji/google/mailbox_with_no_mail.png index b08cbc6c3a..e4ddb12241 100644 Binary files a/public/images/emoji/google/mailbox_with_no_mail.png and b/public/images/emoji/google/mailbox_with_no_mail.png differ diff --git a/public/images/emoji/google/malawi.png b/public/images/emoji/google/malawi.png index 3c510c7b2b..8bee10521c 100644 Binary files a/public/images/emoji/google/malawi.png and b/public/images/emoji/google/malawi.png differ diff --git a/public/images/emoji/google/malaysia.png b/public/images/emoji/google/malaysia.png index e26107e19d..b880f7e7df 100644 Binary files a/public/images/emoji/google/malaysia.png and b/public/images/emoji/google/malaysia.png differ diff --git a/public/images/emoji/google/maldives.png b/public/images/emoji/google/maldives.png index 6b87598488..cd3fb32dc5 100644 Binary files a/public/images/emoji/google/maldives.png and b/public/images/emoji/google/maldives.png differ diff --git a/public/images/emoji/google/male_couple_with_heart.png b/public/images/emoji/google/male_couple_with_heart.png index edfa25c9a0..409b96f0cf 100644 Binary files a/public/images/emoji/google/male_couple_with_heart.png and b/public/images/emoji/google/male_couple_with_heart.png differ diff --git a/public/images/emoji/google/male_couplekiss.png b/public/images/emoji/google/male_couplekiss.png index 231fc8e523..b9f813d5a4 100644 Binary files a/public/images/emoji/google/male_couplekiss.png and b/public/images/emoji/google/male_couplekiss.png differ diff --git a/public/images/emoji/google/male_detective.png b/public/images/emoji/google/male_detective.png index cee46f4861..f7b30f9bed 100644 Binary files a/public/images/emoji/google/male_detective.png and b/public/images/emoji/google/male_detective.png differ diff --git a/public/images/emoji/google/mali.png b/public/images/emoji/google/mali.png index 00d9d28bfd..93260c34f9 100644 Binary files a/public/images/emoji/google/mali.png and b/public/images/emoji/google/mali.png differ diff --git a/public/images/emoji/google/malta.png b/public/images/emoji/google/malta.png index 11ac5dc598..8edf050c3c 100644 Binary files a/public/images/emoji/google/malta.png and b/public/images/emoji/google/malta.png differ diff --git a/public/images/emoji/google/man.png b/public/images/emoji/google/man.png index 73248596d2..b48072885c 100644 Binary files a/public/images/emoji/google/man.png and b/public/images/emoji/google/man.png differ diff --git a/public/images/emoji/google/man_artist.png b/public/images/emoji/google/man_artist.png index a2d882de41..d9aeb9b162 100644 Binary files a/public/images/emoji/google/man_artist.png and b/public/images/emoji/google/man_artist.png differ diff --git a/public/images/emoji/google/man_astronaut.png b/public/images/emoji/google/man_astronaut.png index f471dfb2ea..d2cc64e6b6 100644 Binary files a/public/images/emoji/google/man_astronaut.png and b/public/images/emoji/google/man_astronaut.png differ diff --git a/public/images/emoji/google/man_bald.png b/public/images/emoji/google/man_bald.png new file mode 100644 index 0000000000..b09f9ce9d9 Binary files /dev/null and b/public/images/emoji/google/man_bald.png differ diff --git a/public/images/emoji/google/man_cartwheeling.png b/public/images/emoji/google/man_cartwheeling.png index eee329a726..5269da08c1 100644 Binary files a/public/images/emoji/google/man_cartwheeling.png and b/public/images/emoji/google/man_cartwheeling.png differ diff --git a/public/images/emoji/google/man_cook.png b/public/images/emoji/google/man_cook.png index bddc359d00..7cc56867b7 100644 Binary files a/public/images/emoji/google/man_cook.png and b/public/images/emoji/google/man_cook.png differ diff --git a/public/images/emoji/google/man_curly_haired.png b/public/images/emoji/google/man_curly_haired.png new file mode 100644 index 0000000000..de0bf13054 Binary files /dev/null and b/public/images/emoji/google/man_curly_haired.png differ diff --git a/public/images/emoji/google/man_dancing.png b/public/images/emoji/google/man_dancing.png index f2ffd6a849..b20a13e684 100644 Binary files a/public/images/emoji/google/man_dancing.png and b/public/images/emoji/google/man_dancing.png differ diff --git a/public/images/emoji/google/man_facepalming.png b/public/images/emoji/google/man_facepalming.png index 2b20104ca7..bf7303c961 100644 Binary files a/public/images/emoji/google/man_facepalming.png and b/public/images/emoji/google/man_facepalming.png differ diff --git a/public/images/emoji/google/man_factory_worker.png b/public/images/emoji/google/man_factory_worker.png index ccb3ff070d..e381ed5e1e 100644 Binary files a/public/images/emoji/google/man_factory_worker.png and b/public/images/emoji/google/man_factory_worker.png differ diff --git a/public/images/emoji/google/man_farmer.png b/public/images/emoji/google/man_farmer.png index 434efc59f4..9e7a442d33 100644 Binary files a/public/images/emoji/google/man_farmer.png and b/public/images/emoji/google/man_farmer.png differ diff --git a/public/images/emoji/google/man_firefighter.png b/public/images/emoji/google/man_firefighter.png index 4422f5aa0a..788deb741e 100644 Binary files a/public/images/emoji/google/man_firefighter.png and b/public/images/emoji/google/man_firefighter.png differ diff --git a/public/images/emoji/google/man_health_worker.png b/public/images/emoji/google/man_health_worker.png index 68ceb2fc83..ce9bd8fa2a 100644 Binary files a/public/images/emoji/google/man_health_worker.png and b/public/images/emoji/google/man_health_worker.png differ diff --git a/public/images/emoji/google/man_in_business_suit_levitating.png b/public/images/emoji/google/man_in_business_suit_levitating.png index b7eea2e014..8f238ce960 100644 Binary files a/public/images/emoji/google/man_in_business_suit_levitating.png and b/public/images/emoji/google/man_in_business_suit_levitating.png differ diff --git a/public/images/emoji/google/man_in_tuxedo.png b/public/images/emoji/google/man_in_tuxedo.png index 3e63dafa40..b3b9dd599b 100644 Binary files a/public/images/emoji/google/man_in_tuxedo.png and b/public/images/emoji/google/man_in_tuxedo.png differ diff --git a/public/images/emoji/google/man_judge.png b/public/images/emoji/google/man_judge.png index f9368e5c71..07bf121d95 100644 Binary files a/public/images/emoji/google/man_judge.png and b/public/images/emoji/google/man_judge.png differ diff --git a/public/images/emoji/google/man_juggling.png b/public/images/emoji/google/man_juggling.png index ff435cc4ee..b1564ba45d 100644 Binary files a/public/images/emoji/google/man_juggling.png and b/public/images/emoji/google/man_juggling.png differ diff --git a/public/images/emoji/google/man_mechanic.png b/public/images/emoji/google/man_mechanic.png index 0bf3f5cc6f..420974feee 100644 Binary files a/public/images/emoji/google/man_mechanic.png and b/public/images/emoji/google/man_mechanic.png differ diff --git a/public/images/emoji/google/man_office_worker.png b/public/images/emoji/google/man_office_worker.png index d771e728e2..1514a0b6b8 100644 Binary files a/public/images/emoji/google/man_office_worker.png and b/public/images/emoji/google/man_office_worker.png differ diff --git a/public/images/emoji/google/man_pilot.png b/public/images/emoji/google/man_pilot.png index 1bc2daaa54..1e57546b4e 100644 Binary files a/public/images/emoji/google/man_pilot.png and b/public/images/emoji/google/man_pilot.png differ diff --git a/public/images/emoji/google/man_playing_handball.png b/public/images/emoji/google/man_playing_handball.png index 34abedad54..28ef7204fc 100644 Binary files a/public/images/emoji/google/man_playing_handball.png and b/public/images/emoji/google/man_playing_handball.png differ diff --git a/public/images/emoji/google/man_playing_water_polo.png b/public/images/emoji/google/man_playing_water_polo.png index 4ad26fc79c..09e6a5df5d 100644 Binary files a/public/images/emoji/google/man_playing_water_polo.png and b/public/images/emoji/google/man_playing_water_polo.png differ diff --git a/public/images/emoji/google/man_red_haired.png b/public/images/emoji/google/man_red_haired.png new file mode 100644 index 0000000000..634513be0e Binary files /dev/null and b/public/images/emoji/google/man_red_haired.png differ diff --git a/public/images/emoji/google/man_scientist.png b/public/images/emoji/google/man_scientist.png index 945ac639a9..049e526fe5 100644 Binary files a/public/images/emoji/google/man_scientist.png and b/public/images/emoji/google/man_scientist.png differ diff --git a/public/images/emoji/google/man_shrugging.png b/public/images/emoji/google/man_shrugging.png index a48a2eeae5..b51317926b 100644 Binary files a/public/images/emoji/google/man_shrugging.png and b/public/images/emoji/google/man_shrugging.png differ diff --git a/public/images/emoji/google/man_singer.png b/public/images/emoji/google/man_singer.png index 33a6d67213..9cc52bc51a 100644 Binary files a/public/images/emoji/google/man_singer.png and b/public/images/emoji/google/man_singer.png differ diff --git a/public/images/emoji/google/man_student.png b/public/images/emoji/google/man_student.png index 9de5aec637..2dfc2f6195 100644 Binary files a/public/images/emoji/google/man_student.png and b/public/images/emoji/google/man_student.png differ diff --git a/public/images/emoji/google/man_superhero.png b/public/images/emoji/google/man_superhero.png new file mode 100644 index 0000000000..f6c154b8d1 Binary files /dev/null and b/public/images/emoji/google/man_superhero.png differ diff --git a/public/images/emoji/google/man_supervillain.png b/public/images/emoji/google/man_supervillain.png new file mode 100644 index 0000000000..aef33ae18a Binary files /dev/null and b/public/images/emoji/google/man_supervillain.png differ diff --git a/public/images/emoji/google/man_teacher.png b/public/images/emoji/google/man_teacher.png index 1854c8e5ca..adb3b7672f 100644 Binary files a/public/images/emoji/google/man_teacher.png and b/public/images/emoji/google/man_teacher.png differ diff --git a/public/images/emoji/google/man_technologist.png b/public/images/emoji/google/man_technologist.png index 2f055257ba..d81281f7ce 100644 Binary files a/public/images/emoji/google/man_technologist.png and b/public/images/emoji/google/man_technologist.png differ diff --git a/public/images/emoji/google/man_white_haired.png b/public/images/emoji/google/man_white_haired.png new file mode 100644 index 0000000000..c7302b35ae Binary files /dev/null and b/public/images/emoji/google/man_white_haired.png differ diff --git a/public/images/emoji/google/man_with_gua_pi_mao.png b/public/images/emoji/google/man_with_gua_pi_mao.png index 039935db1e..5b7b90db68 100644 Binary files a/public/images/emoji/google/man_with_gua_pi_mao.png and b/public/images/emoji/google/man_with_gua_pi_mao.png differ diff --git a/public/images/emoji/google/man_with_turban.png b/public/images/emoji/google/man_with_turban.png index bfb08a0607..34e2102bc0 100644 Binary files a/public/images/emoji/google/man_with_turban.png and b/public/images/emoji/google/man_with_turban.png differ diff --git a/public/images/emoji/google/mango.png b/public/images/emoji/google/mango.png new file mode 100644 index 0000000000..b7aeaf23be Binary files /dev/null and b/public/images/emoji/google/mango.png differ diff --git a/public/images/emoji/google/mans_shoe.png b/public/images/emoji/google/mans_shoe.png index c2c6bc1514..0fa650f565 100644 Binary files a/public/images/emoji/google/mans_shoe.png and b/public/images/emoji/google/mans_shoe.png differ diff --git a/public/images/emoji/google/mantelpiece_clock.png b/public/images/emoji/google/mantelpiece_clock.png index ae0fcb7c98..68dac9ae11 100644 Binary files a/public/images/emoji/google/mantelpiece_clock.png and b/public/images/emoji/google/mantelpiece_clock.png differ diff --git a/public/images/emoji/google/map.png b/public/images/emoji/google/map.png index 349e4d46c3..79b4db6529 100644 Binary files a/public/images/emoji/google/map.png and b/public/images/emoji/google/map.png differ diff --git a/public/images/emoji/google/maple_leaf.png b/public/images/emoji/google/maple_leaf.png index 3d4f34c4d5..435af480ae 100644 Binary files a/public/images/emoji/google/maple_leaf.png and b/public/images/emoji/google/maple_leaf.png differ diff --git a/public/images/emoji/google/marshall_islands.png b/public/images/emoji/google/marshall_islands.png index d32ede8967..e3890063e8 100644 Binary files a/public/images/emoji/google/marshall_islands.png and b/public/images/emoji/google/marshall_islands.png differ diff --git a/public/images/emoji/google/martial_arts_uniform.png b/public/images/emoji/google/martial_arts_uniform.png index 7f0523ab92..c2a073ecb5 100644 Binary files a/public/images/emoji/google/martial_arts_uniform.png and b/public/images/emoji/google/martial_arts_uniform.png differ diff --git a/public/images/emoji/google/martinique.png b/public/images/emoji/google/martinique.png index 4faf7e252e..7ec4a82f84 100644 Binary files a/public/images/emoji/google/martinique.png and b/public/images/emoji/google/martinique.png differ diff --git a/public/images/emoji/google/mask.png b/public/images/emoji/google/mask.png index cd6590ac5e..917fc890bd 100644 Binary files a/public/images/emoji/google/mask.png and b/public/images/emoji/google/mask.png differ diff --git a/public/images/emoji/google/massage.png b/public/images/emoji/google/massage.png index 7ebc6c0940..5d108593dc 100644 Binary files a/public/images/emoji/google/massage.png and b/public/images/emoji/google/massage.png differ diff --git a/public/images/emoji/google/massage_man.png b/public/images/emoji/google/massage_man.png index d329e3ffac..626194b526 100644 Binary files a/public/images/emoji/google/massage_man.png and b/public/images/emoji/google/massage_man.png differ diff --git a/public/images/emoji/google/massage_woman.png b/public/images/emoji/google/massage_woman.png index 7ebc6c0940..5d108593dc 100644 Binary files a/public/images/emoji/google/massage_woman.png and b/public/images/emoji/google/massage_woman.png differ diff --git a/public/images/emoji/google/mauritania.png b/public/images/emoji/google/mauritania.png index 2e2ef05ee8..a9adc1742c 100644 Binary files a/public/images/emoji/google/mauritania.png and b/public/images/emoji/google/mauritania.png differ diff --git a/public/images/emoji/google/mauritius.png b/public/images/emoji/google/mauritius.png index e6808bc0ef..c4dc2cf10c 100644 Binary files a/public/images/emoji/google/mauritius.png and b/public/images/emoji/google/mauritius.png differ diff --git a/public/images/emoji/google/mayotte.png b/public/images/emoji/google/mayotte.png index 4faf7e252e..77c802c98a 100644 Binary files a/public/images/emoji/google/mayotte.png and b/public/images/emoji/google/mayotte.png differ diff --git a/public/images/emoji/google/meat_on_bone.png b/public/images/emoji/google/meat_on_bone.png index e7e76e39e4..dc8fe3c711 100644 Binary files a/public/images/emoji/google/meat_on_bone.png and b/public/images/emoji/google/meat_on_bone.png differ diff --git a/public/images/emoji/google/medal.png b/public/images/emoji/google/medal.png index 2ff8d191cb..1d01f5767a 100644 Binary files a/public/images/emoji/google/medal.png and b/public/images/emoji/google/medal.png differ diff --git a/public/images/emoji/google/medal_military.png b/public/images/emoji/google/medal_military.png index bf10fca3d8..a28d5a6412 100644 Binary files a/public/images/emoji/google/medal_military.png and b/public/images/emoji/google/medal_military.png differ diff --git a/public/images/emoji/google/medal_sports.png b/public/images/emoji/google/medal_sports.png index 2ff8d191cb..1d01f5767a 100644 Binary files a/public/images/emoji/google/medal_sports.png and b/public/images/emoji/google/medal_sports.png differ diff --git a/public/images/emoji/google/mega.png b/public/images/emoji/google/mega.png index 4695a60e2f..eb29f4ff9d 100644 Binary files a/public/images/emoji/google/mega.png and b/public/images/emoji/google/mega.png differ diff --git a/public/images/emoji/google/melon.png b/public/images/emoji/google/melon.png index 0e104f75ee..c1da589557 100644 Binary files a/public/images/emoji/google/melon.png and b/public/images/emoji/google/melon.png differ diff --git a/public/images/emoji/google/memo.png b/public/images/emoji/google/memo.png index 5a3bd6cd09..62ee8c58e4 100644 Binary files a/public/images/emoji/google/memo.png and b/public/images/emoji/google/memo.png differ diff --git a/public/images/emoji/google/men_wrestling.png b/public/images/emoji/google/men_wrestling.png index e501870c4c..993b1f4b42 100644 Binary files a/public/images/emoji/google/men_wrestling.png and b/public/images/emoji/google/men_wrestling.png differ diff --git a/public/images/emoji/google/menorah.png b/public/images/emoji/google/menorah.png index 377b9099c6..29337f4a70 100644 Binary files a/public/images/emoji/google/menorah.png and b/public/images/emoji/google/menorah.png differ diff --git a/public/images/emoji/google/mens.png b/public/images/emoji/google/mens.png index a2fee620c9..3b792de101 100644 Binary files a/public/images/emoji/google/mens.png and b/public/images/emoji/google/mens.png differ diff --git a/public/images/emoji/google/mermaid.png b/public/images/emoji/google/mermaid.png index 712ace66b6..7a63a2a79f 100644 Binary files a/public/images/emoji/google/mermaid.png and b/public/images/emoji/google/mermaid.png differ diff --git a/public/images/emoji/google/merman.png b/public/images/emoji/google/merman.png index ce644bfbb5..61edcbd9da 100644 Binary files a/public/images/emoji/google/merman.png and b/public/images/emoji/google/merman.png differ diff --git a/public/images/emoji/google/metal.png b/public/images/emoji/google/metal.png index 8d868d12d5..b2c275a1c3 100644 Binary files a/public/images/emoji/google/metal.png and b/public/images/emoji/google/metal.png differ diff --git a/public/images/emoji/google/metro.png b/public/images/emoji/google/metro.png index 2efb9ec09a..789880869b 100644 Binary files a/public/images/emoji/google/metro.png and b/public/images/emoji/google/metro.png differ diff --git a/public/images/emoji/google/mexico.png b/public/images/emoji/google/mexico.png index 687334adf5..bf362a5d66 100644 Binary files a/public/images/emoji/google/mexico.png and b/public/images/emoji/google/mexico.png differ diff --git a/public/images/emoji/google/microbe.png b/public/images/emoji/google/microbe.png new file mode 100644 index 0000000000..b1069a6e85 Binary files /dev/null and b/public/images/emoji/google/microbe.png differ diff --git a/public/images/emoji/google/micronesia.png b/public/images/emoji/google/micronesia.png index b75cc40ccf..3770f54519 100644 Binary files a/public/images/emoji/google/micronesia.png and b/public/images/emoji/google/micronesia.png differ diff --git a/public/images/emoji/google/microphone.png b/public/images/emoji/google/microphone.png index 7fe93419b7..67f98c07bf 100644 Binary files a/public/images/emoji/google/microphone.png and b/public/images/emoji/google/microphone.png differ diff --git a/public/images/emoji/google/microphone2.png b/public/images/emoji/google/microphone2.png index 070e657d8c..ed094fecf0 100644 Binary files a/public/images/emoji/google/microphone2.png and b/public/images/emoji/google/microphone2.png differ diff --git a/public/images/emoji/google/microscope.png b/public/images/emoji/google/microscope.png index 0aa19f044a..e1b7be0b40 100644 Binary files a/public/images/emoji/google/microscope.png and b/public/images/emoji/google/microscope.png differ diff --git a/public/images/emoji/google/middle_finger.png b/public/images/emoji/google/middle_finger.png index 71e8d8b3e9..ac5a0ef314 100644 Binary files a/public/images/emoji/google/middle_finger.png and b/public/images/emoji/google/middle_finger.png differ diff --git a/public/images/emoji/google/military_medal.png b/public/images/emoji/google/military_medal.png index bf10fca3d8..a28d5a6412 100644 Binary files a/public/images/emoji/google/military_medal.png and b/public/images/emoji/google/military_medal.png differ diff --git a/public/images/emoji/google/milk_glass.png b/public/images/emoji/google/milk_glass.png index 1313cda868..4ecc422139 100644 Binary files a/public/images/emoji/google/milk_glass.png and b/public/images/emoji/google/milk_glass.png differ diff --git a/public/images/emoji/google/milky_way.png b/public/images/emoji/google/milky_way.png index 9af21154a3..c4a60dc5de 100644 Binary files a/public/images/emoji/google/milky_way.png and b/public/images/emoji/google/milky_way.png differ diff --git a/public/images/emoji/google/minibus.png b/public/images/emoji/google/minibus.png index 8a37e23c91..93c20f82ad 100644 Binary files a/public/images/emoji/google/minibus.png and b/public/images/emoji/google/minibus.png differ diff --git a/public/images/emoji/google/minidisc.png b/public/images/emoji/google/minidisc.png index 089fd50de9..66468114e5 100644 Binary files a/public/images/emoji/google/minidisc.png and b/public/images/emoji/google/minidisc.png differ diff --git a/public/images/emoji/google/mobile_phone_off.png b/public/images/emoji/google/mobile_phone_off.png index 53fed21865..3b8a7f426a 100644 Binary files a/public/images/emoji/google/mobile_phone_off.png and b/public/images/emoji/google/mobile_phone_off.png differ diff --git a/public/images/emoji/google/moldova.png b/public/images/emoji/google/moldova.png index a961b32adc..48e556f73a 100644 Binary files a/public/images/emoji/google/moldova.png and b/public/images/emoji/google/moldova.png differ diff --git a/public/images/emoji/google/monaco.png b/public/images/emoji/google/monaco.png index 459a849095..61d037db0a 100644 Binary files a/public/images/emoji/google/monaco.png and b/public/images/emoji/google/monaco.png differ diff --git a/public/images/emoji/google/money_mouth.png b/public/images/emoji/google/money_mouth.png index 1d6bc0dc9e..836279b0b6 100644 Binary files a/public/images/emoji/google/money_mouth.png and b/public/images/emoji/google/money_mouth.png differ diff --git a/public/images/emoji/google/money_mouth_face.png b/public/images/emoji/google/money_mouth_face.png index 1d6bc0dc9e..836279b0b6 100644 Binary files a/public/images/emoji/google/money_mouth_face.png and b/public/images/emoji/google/money_mouth_face.png differ diff --git a/public/images/emoji/google/money_with_wings.png b/public/images/emoji/google/money_with_wings.png index b7f80015f8..4618ca8742 100644 Binary files a/public/images/emoji/google/money_with_wings.png and b/public/images/emoji/google/money_with_wings.png differ diff --git a/public/images/emoji/google/moneybag.png b/public/images/emoji/google/moneybag.png index 9f0d81f2fe..8b8683aa68 100644 Binary files a/public/images/emoji/google/moneybag.png and b/public/images/emoji/google/moneybag.png differ diff --git a/public/images/emoji/google/mongolia.png b/public/images/emoji/google/mongolia.png index 7beb51c703..396298d147 100644 Binary files a/public/images/emoji/google/mongolia.png and b/public/images/emoji/google/mongolia.png differ diff --git a/public/images/emoji/google/monkey.png b/public/images/emoji/google/monkey.png index f8930cb0e3..904544862b 100644 Binary files a/public/images/emoji/google/monkey.png and b/public/images/emoji/google/monkey.png differ diff --git a/public/images/emoji/google/monkey_face.png b/public/images/emoji/google/monkey_face.png index d6b5f2a58b..18c56bc0de 100644 Binary files a/public/images/emoji/google/monkey_face.png and b/public/images/emoji/google/monkey_face.png differ diff --git a/public/images/emoji/google/monorail.png b/public/images/emoji/google/monorail.png index 160117ab2c..8b0f64d192 100644 Binary files a/public/images/emoji/google/monorail.png and b/public/images/emoji/google/monorail.png differ diff --git a/public/images/emoji/google/montenegro.png b/public/images/emoji/google/montenegro.png index 0e2cca21b9..2cf28f0286 100644 Binary files a/public/images/emoji/google/montenegro.png and b/public/images/emoji/google/montenegro.png differ diff --git a/public/images/emoji/google/montserrat.png b/public/images/emoji/google/montserrat.png index a6069d9296..82a7a0c4eb 100644 Binary files a/public/images/emoji/google/montserrat.png and b/public/images/emoji/google/montserrat.png differ diff --git a/public/images/emoji/google/moon.png b/public/images/emoji/google/moon.png index 878497f3f8..ae30e32cff 100644 Binary files a/public/images/emoji/google/moon.png and b/public/images/emoji/google/moon.png differ diff --git a/public/images/emoji/google/moon_cake.png b/public/images/emoji/google/moon_cake.png new file mode 100644 index 0000000000..d1654a60c2 Binary files /dev/null and b/public/images/emoji/google/moon_cake.png differ diff --git a/public/images/emoji/google/morocco.png b/public/images/emoji/google/morocco.png index 8cdf1480ef..aa9451e16f 100644 Binary files a/public/images/emoji/google/morocco.png and b/public/images/emoji/google/morocco.png differ diff --git a/public/images/emoji/google/mortar_board.png b/public/images/emoji/google/mortar_board.png index d1e7fa1283..a43655d6ee 100644 Binary files a/public/images/emoji/google/mortar_board.png and b/public/images/emoji/google/mortar_board.png differ diff --git a/public/images/emoji/google/mosque.png b/public/images/emoji/google/mosque.png index b3fe9a9184..678aabed2c 100644 Binary files a/public/images/emoji/google/mosque.png and b/public/images/emoji/google/mosque.png differ diff --git a/public/images/emoji/google/mosquito.png b/public/images/emoji/google/mosquito.png new file mode 100644 index 0000000000..4f165667a4 Binary files /dev/null and b/public/images/emoji/google/mosquito.png differ diff --git a/public/images/emoji/google/motor_boat.png b/public/images/emoji/google/motor_boat.png index e26c5116c4..f0aac8ed25 100644 Binary files a/public/images/emoji/google/motor_boat.png and b/public/images/emoji/google/motor_boat.png differ diff --git a/public/images/emoji/google/motor_scooter.png b/public/images/emoji/google/motor_scooter.png index ad0290cec4..1470a0b1be 100644 Binary files a/public/images/emoji/google/motor_scooter.png and b/public/images/emoji/google/motor_scooter.png differ diff --git a/public/images/emoji/google/motorboat.png b/public/images/emoji/google/motorboat.png index e26c5116c4..f0aac8ed25 100644 Binary files a/public/images/emoji/google/motorboat.png and b/public/images/emoji/google/motorboat.png differ diff --git a/public/images/emoji/google/motorcycle.png b/public/images/emoji/google/motorcycle.png index f665d143ef..3d25123755 100644 Binary files a/public/images/emoji/google/motorcycle.png and b/public/images/emoji/google/motorcycle.png differ diff --git a/public/images/emoji/google/motorway.png b/public/images/emoji/google/motorway.png index 1c8e95fed0..2980b36157 100644 Binary files a/public/images/emoji/google/motorway.png and b/public/images/emoji/google/motorway.png differ diff --git a/public/images/emoji/google/mount_fuji.png b/public/images/emoji/google/mount_fuji.png index 2a6de78a10..00af86d7f1 100644 Binary files a/public/images/emoji/google/mount_fuji.png and b/public/images/emoji/google/mount_fuji.png differ diff --git a/public/images/emoji/google/mountain.png b/public/images/emoji/google/mountain.png index fac790f782..f88caabff8 100644 Binary files a/public/images/emoji/google/mountain.png and b/public/images/emoji/google/mountain.png differ diff --git a/public/images/emoji/google/mountain_bicyclist.png b/public/images/emoji/google/mountain_bicyclist.png index 238e3f052e..b60b3dd635 100644 Binary files a/public/images/emoji/google/mountain_bicyclist.png and b/public/images/emoji/google/mountain_bicyclist.png differ diff --git a/public/images/emoji/google/mountain_biking_man.png b/public/images/emoji/google/mountain_biking_man.png index 238e3f052e..b60b3dd635 100644 Binary files a/public/images/emoji/google/mountain_biking_man.png and b/public/images/emoji/google/mountain_biking_man.png differ diff --git a/public/images/emoji/google/mountain_biking_woman.png b/public/images/emoji/google/mountain_biking_woman.png index 1c22d49f94..03f73e9362 100644 Binary files a/public/images/emoji/google/mountain_biking_woman.png and b/public/images/emoji/google/mountain_biking_woman.png differ diff --git a/public/images/emoji/google/mountain_cableway.png b/public/images/emoji/google/mountain_cableway.png index 02ec4de089..8fbb1d5515 100644 Binary files a/public/images/emoji/google/mountain_cableway.png and b/public/images/emoji/google/mountain_cableway.png differ diff --git a/public/images/emoji/google/mountain_railway.png b/public/images/emoji/google/mountain_railway.png index 4793182118..a372878cc2 100644 Binary files a/public/images/emoji/google/mountain_railway.png and b/public/images/emoji/google/mountain_railway.png differ diff --git a/public/images/emoji/google/mountain_snow.png b/public/images/emoji/google/mountain_snow.png index 394c96bb61..7bcc70e4e9 100644 Binary files a/public/images/emoji/google/mountain_snow.png and b/public/images/emoji/google/mountain_snow.png differ diff --git a/public/images/emoji/google/mouse.png b/public/images/emoji/google/mouse.png index 1e157c89c0..d0c164938e 100644 Binary files a/public/images/emoji/google/mouse.png and b/public/images/emoji/google/mouse.png differ diff --git a/public/images/emoji/google/mouse2.png b/public/images/emoji/google/mouse2.png index 4c93a0d248..1318db54fa 100644 Binary files a/public/images/emoji/google/mouse2.png and b/public/images/emoji/google/mouse2.png differ diff --git a/public/images/emoji/google/mouse_three_button.png b/public/images/emoji/google/mouse_three_button.png index 28785439fc..02d114d01c 100644 Binary files a/public/images/emoji/google/mouse_three_button.png and b/public/images/emoji/google/mouse_three_button.png differ diff --git a/public/images/emoji/google/movie_camera.png b/public/images/emoji/google/movie_camera.png index b1ba75a16d..1ec9310d16 100644 Binary files a/public/images/emoji/google/movie_camera.png and b/public/images/emoji/google/movie_camera.png differ diff --git a/public/images/emoji/google/moyai.png b/public/images/emoji/google/moyai.png index 723cd7c626..1730324e65 100644 Binary files a/public/images/emoji/google/moyai.png and b/public/images/emoji/google/moyai.png differ diff --git a/public/images/emoji/google/mozambique.png b/public/images/emoji/google/mozambique.png index 363860590d..6656647d3b 100644 Binary files a/public/images/emoji/google/mozambique.png and b/public/images/emoji/google/mozambique.png differ diff --git a/public/images/emoji/google/mrs_claus.png b/public/images/emoji/google/mrs_claus.png index 2edec50ec4..05f808a251 100644 Binary files a/public/images/emoji/google/mrs_claus.png and b/public/images/emoji/google/mrs_claus.png differ diff --git a/public/images/emoji/google/muscle.png b/public/images/emoji/google/muscle.png index b905e7189c..064159bcf5 100644 Binary files a/public/images/emoji/google/muscle.png and b/public/images/emoji/google/muscle.png differ diff --git a/public/images/emoji/google/mushroom.png b/public/images/emoji/google/mushroom.png index bdddb34cd8..1919c8cf78 100644 Binary files a/public/images/emoji/google/mushroom.png and b/public/images/emoji/google/mushroom.png differ diff --git a/public/images/emoji/google/musical_keyboard.png b/public/images/emoji/google/musical_keyboard.png index cc794312f6..598fc2659f 100644 Binary files a/public/images/emoji/google/musical_keyboard.png and b/public/images/emoji/google/musical_keyboard.png differ diff --git a/public/images/emoji/google/musical_note.png b/public/images/emoji/google/musical_note.png index 4e7e9a306d..35b2510ad8 100644 Binary files a/public/images/emoji/google/musical_note.png and b/public/images/emoji/google/musical_note.png differ diff --git a/public/images/emoji/google/musical_score.png b/public/images/emoji/google/musical_score.png index 4df0ffb8be..6a6a32b8df 100644 Binary files a/public/images/emoji/google/musical_score.png and b/public/images/emoji/google/musical_score.png differ diff --git a/public/images/emoji/google/mute.png b/public/images/emoji/google/mute.png index af176d1cda..8a2f1a9148 100644 Binary files a/public/images/emoji/google/mute.png and b/public/images/emoji/google/mute.png differ diff --git a/public/images/emoji/google/myanmar.png b/public/images/emoji/google/myanmar.png index d28635d296..3eaddf5e5e 100644 Binary files a/public/images/emoji/google/myanmar.png and b/public/images/emoji/google/myanmar.png differ diff --git a/public/images/emoji/google/nail_care.png b/public/images/emoji/google/nail_care.png index a845554d6c..9e71351017 100644 Binary files a/public/images/emoji/google/nail_care.png and b/public/images/emoji/google/nail_care.png differ diff --git a/public/images/emoji/google/name_badge.png b/public/images/emoji/google/name_badge.png index 0627940cc7..ada5741b9f 100644 Binary files a/public/images/emoji/google/name_badge.png and b/public/images/emoji/google/name_badge.png differ diff --git a/public/images/emoji/google/namibia.png b/public/images/emoji/google/namibia.png index ccc0114785..0d8e75dfa2 100644 Binary files a/public/images/emoji/google/namibia.png and b/public/images/emoji/google/namibia.png differ diff --git a/public/images/emoji/google/national_park.png b/public/images/emoji/google/national_park.png index d98082e0cd..540cdbe1a0 100644 Binary files a/public/images/emoji/google/national_park.png and b/public/images/emoji/google/national_park.png differ diff --git a/public/images/emoji/google/nauru.png b/public/images/emoji/google/nauru.png index 5a3001c320..f9a9a74cda 100644 Binary files a/public/images/emoji/google/nauru.png and b/public/images/emoji/google/nauru.png differ diff --git a/public/images/emoji/google/nauseated_face.png b/public/images/emoji/google/nauseated_face.png index 59787d849e..8d5e129c76 100644 Binary files a/public/images/emoji/google/nauseated_face.png and b/public/images/emoji/google/nauseated_face.png differ diff --git a/public/images/emoji/google/nazar_amulet.png b/public/images/emoji/google/nazar_amulet.png new file mode 100644 index 0000000000..01296c65de Binary files /dev/null and b/public/images/emoji/google/nazar_amulet.png differ diff --git a/public/images/emoji/google/necktie.png b/public/images/emoji/google/necktie.png index 8b011b7da6..6b388bc187 100644 Binary files a/public/images/emoji/google/necktie.png and b/public/images/emoji/google/necktie.png differ diff --git a/public/images/emoji/google/negative_squared_cross_mark.png b/public/images/emoji/google/negative_squared_cross_mark.png index 7dc46a44ba..f06a3c24ec 100644 Binary files a/public/images/emoji/google/negative_squared_cross_mark.png and b/public/images/emoji/google/negative_squared_cross_mark.png differ diff --git a/public/images/emoji/google/nepal.png b/public/images/emoji/google/nepal.png index 0936526831..d8518606c2 100644 Binary files a/public/images/emoji/google/nepal.png and b/public/images/emoji/google/nepal.png differ diff --git a/public/images/emoji/google/nerd.png b/public/images/emoji/google/nerd.png index 3d7385639f..7267429dc0 100644 Binary files a/public/images/emoji/google/nerd.png and b/public/images/emoji/google/nerd.png differ diff --git a/public/images/emoji/google/nerd_face.png b/public/images/emoji/google/nerd_face.png index 3d7385639f..7267429dc0 100644 Binary files a/public/images/emoji/google/nerd_face.png and b/public/images/emoji/google/nerd_face.png differ diff --git a/public/images/emoji/google/netherlands.png b/public/images/emoji/google/netherlands.png index a7cce65956..93581f5a82 100644 Binary files a/public/images/emoji/google/netherlands.png and b/public/images/emoji/google/netherlands.png differ diff --git a/public/images/emoji/google/neutral_face.png b/public/images/emoji/google/neutral_face.png index 440cbb2032..8a6d787eee 100644 Binary files a/public/images/emoji/google/neutral_face.png and b/public/images/emoji/google/neutral_face.png differ diff --git a/public/images/emoji/google/new.png b/public/images/emoji/google/new.png index d3577384f7..dbc568acd3 100644 Binary files a/public/images/emoji/google/new.png and b/public/images/emoji/google/new.png differ diff --git a/public/images/emoji/google/new_caledonia.png b/public/images/emoji/google/new_caledonia.png index 4faf7e252e..9a06906909 100644 Binary files a/public/images/emoji/google/new_caledonia.png and b/public/images/emoji/google/new_caledonia.png differ diff --git a/public/images/emoji/google/new_moon.png b/public/images/emoji/google/new_moon.png index 878497f3f8..ae30e32cff 100644 Binary files a/public/images/emoji/google/new_moon.png and b/public/images/emoji/google/new_moon.png differ diff --git a/public/images/emoji/google/new_moon_with_face.png b/public/images/emoji/google/new_moon_with_face.png index 927390dd78..d67e49d719 100644 Binary files a/public/images/emoji/google/new_moon_with_face.png and b/public/images/emoji/google/new_moon_with_face.png differ diff --git a/public/images/emoji/google/new_zealand.png b/public/images/emoji/google/new_zealand.png index 0fed03d9d8..b5f34b1683 100644 Binary files a/public/images/emoji/google/new_zealand.png and b/public/images/emoji/google/new_zealand.png differ diff --git a/public/images/emoji/google/newspaper.png b/public/images/emoji/google/newspaper.png index 1012580dc6..fa1e267224 100644 Binary files a/public/images/emoji/google/newspaper.png and b/public/images/emoji/google/newspaper.png differ diff --git a/public/images/emoji/google/newspaper2.png b/public/images/emoji/google/newspaper2.png index 3cdda353ac..f244658610 100644 Binary files a/public/images/emoji/google/newspaper2.png and b/public/images/emoji/google/newspaper2.png differ diff --git a/public/images/emoji/google/newspaper_roll.png b/public/images/emoji/google/newspaper_roll.png index 3cdda353ac..f244658610 100644 Binary files a/public/images/emoji/google/newspaper_roll.png and b/public/images/emoji/google/newspaper_roll.png differ diff --git a/public/images/emoji/google/next_track.png b/public/images/emoji/google/next_track.png index 1faa13a2d5..c6c35e6132 100644 Binary files a/public/images/emoji/google/next_track.png and b/public/images/emoji/google/next_track.png differ diff --git a/public/images/emoji/google/next_track_button.png b/public/images/emoji/google/next_track_button.png index 1faa13a2d5..c6c35e6132 100644 Binary files a/public/images/emoji/google/next_track_button.png and b/public/images/emoji/google/next_track_button.png differ diff --git a/public/images/emoji/google/ng.png b/public/images/emoji/google/ng.png index 2a26ea50f9..e1232a8a69 100644 Binary files a/public/images/emoji/google/ng.png and b/public/images/emoji/google/ng.png differ diff --git a/public/images/emoji/google/nicaragua.png b/public/images/emoji/google/nicaragua.png index 8280f1dcf8..4984695aa9 100644 Binary files a/public/images/emoji/google/nicaragua.png and b/public/images/emoji/google/nicaragua.png differ diff --git a/public/images/emoji/google/niger.png b/public/images/emoji/google/niger.png index cc986c395c..94e068ba97 100644 Binary files a/public/images/emoji/google/niger.png and b/public/images/emoji/google/niger.png differ diff --git a/public/images/emoji/google/nigeria.png b/public/images/emoji/google/nigeria.png index 755a7ba291..7118267cc0 100644 Binary files a/public/images/emoji/google/nigeria.png and b/public/images/emoji/google/nigeria.png differ diff --git a/public/images/emoji/google/night_with_stars.png b/public/images/emoji/google/night_with_stars.png index f408f477ab..bcd33d0989 100644 Binary files a/public/images/emoji/google/night_with_stars.png and b/public/images/emoji/google/night_with_stars.png differ diff --git a/public/images/emoji/google/nine.png b/public/images/emoji/google/nine.png index f228da9f19..ab69bd90ad 100644 Binary files a/public/images/emoji/google/nine.png and b/public/images/emoji/google/nine.png differ diff --git a/public/images/emoji/google/niue.png b/public/images/emoji/google/niue.png index af0081c41d..e80ccb809f 100644 Binary files a/public/images/emoji/google/niue.png and b/public/images/emoji/google/niue.png differ diff --git a/public/images/emoji/google/no_bell.png b/public/images/emoji/google/no_bell.png index f3530a0706..5d331a26a9 100644 Binary files a/public/images/emoji/google/no_bell.png and b/public/images/emoji/google/no_bell.png differ diff --git a/public/images/emoji/google/no_bicycles.png b/public/images/emoji/google/no_bicycles.png index 71aec38e09..de19f85b85 100644 Binary files a/public/images/emoji/google/no_bicycles.png and b/public/images/emoji/google/no_bicycles.png differ diff --git a/public/images/emoji/google/no_entry.png b/public/images/emoji/google/no_entry.png index 6a5c2cb600..a54616bb3d 100644 Binary files a/public/images/emoji/google/no_entry.png and b/public/images/emoji/google/no_entry.png differ diff --git a/public/images/emoji/google/no_entry_sign.png b/public/images/emoji/google/no_entry_sign.png index 6b52bda422..0f1d8b27fa 100644 Binary files a/public/images/emoji/google/no_entry_sign.png and b/public/images/emoji/google/no_entry_sign.png differ diff --git a/public/images/emoji/google/no_good.png b/public/images/emoji/google/no_good.png index a639813593..13b5b8219d 100644 Binary files a/public/images/emoji/google/no_good.png and b/public/images/emoji/google/no_good.png differ diff --git a/public/images/emoji/google/no_good_man.png b/public/images/emoji/google/no_good_man.png index e938d0243c..31d6741d8f 100644 Binary files a/public/images/emoji/google/no_good_man.png and b/public/images/emoji/google/no_good_man.png differ diff --git a/public/images/emoji/google/no_good_woman.png b/public/images/emoji/google/no_good_woman.png index a639813593..13b5b8219d 100644 Binary files a/public/images/emoji/google/no_good_woman.png and b/public/images/emoji/google/no_good_woman.png differ diff --git a/public/images/emoji/google/no_mobile_phones.png b/public/images/emoji/google/no_mobile_phones.png index e3b14e1415..9bd86f678d 100644 Binary files a/public/images/emoji/google/no_mobile_phones.png and b/public/images/emoji/google/no_mobile_phones.png differ diff --git a/public/images/emoji/google/no_mouth.png b/public/images/emoji/google/no_mouth.png index 04ffae31a1..f1d1c39994 100644 Binary files a/public/images/emoji/google/no_mouth.png and b/public/images/emoji/google/no_mouth.png differ diff --git a/public/images/emoji/google/no_pedestrians.png b/public/images/emoji/google/no_pedestrians.png index 1098d68e2a..b5e3ca0eb8 100644 Binary files a/public/images/emoji/google/no_pedestrians.png and b/public/images/emoji/google/no_pedestrians.png differ diff --git a/public/images/emoji/google/no_smoking.png b/public/images/emoji/google/no_smoking.png index 43a3b70f7d..e761333b48 100644 Binary files a/public/images/emoji/google/no_smoking.png and b/public/images/emoji/google/no_smoking.png differ diff --git a/public/images/emoji/google/non-potable_water.png b/public/images/emoji/google/non-potable_water.png index 28ca6fbfbd..cef8d7e5cf 100644 Binary files a/public/images/emoji/google/non-potable_water.png and b/public/images/emoji/google/non-potable_water.png differ diff --git a/public/images/emoji/google/norfolk_island.png b/public/images/emoji/google/norfolk_island.png index 113c7827c2..13d43ddc34 100644 Binary files a/public/images/emoji/google/norfolk_island.png and b/public/images/emoji/google/norfolk_island.png differ diff --git a/public/images/emoji/google/north_korea.png b/public/images/emoji/google/north_korea.png index bc3460d32e..2b9a9a3688 100644 Binary files a/public/images/emoji/google/north_korea.png and b/public/images/emoji/google/north_korea.png differ diff --git a/public/images/emoji/google/northern_mariana_islands.png b/public/images/emoji/google/northern_mariana_islands.png index 5bc53d8da2..5dd1ae3ef2 100644 Binary files a/public/images/emoji/google/northern_mariana_islands.png and b/public/images/emoji/google/northern_mariana_islands.png differ diff --git a/public/images/emoji/google/norway.png b/public/images/emoji/google/norway.png index d348a446ad..5e9e6ae5e3 100644 Binary files a/public/images/emoji/google/norway.png and b/public/images/emoji/google/norway.png differ diff --git a/public/images/emoji/google/nose.png b/public/images/emoji/google/nose.png index 6ae23f4271..12aafc7613 100644 Binary files a/public/images/emoji/google/nose.png and b/public/images/emoji/google/nose.png differ diff --git a/public/images/emoji/google/notebook.png b/public/images/emoji/google/notebook.png index 31238241c9..1df2ef2e36 100644 Binary files a/public/images/emoji/google/notebook.png and b/public/images/emoji/google/notebook.png differ diff --git a/public/images/emoji/google/notebook_with_decorative_cover.png b/public/images/emoji/google/notebook_with_decorative_cover.png index 12176ab45d..077639bc3e 100644 Binary files a/public/images/emoji/google/notebook_with_decorative_cover.png and b/public/images/emoji/google/notebook_with_decorative_cover.png differ diff --git a/public/images/emoji/google/notepad_spiral.png b/public/images/emoji/google/notepad_spiral.png index 72e515dc60..39166b1333 100644 Binary files a/public/images/emoji/google/notepad_spiral.png and b/public/images/emoji/google/notepad_spiral.png differ diff --git a/public/images/emoji/google/notes.png b/public/images/emoji/google/notes.png index e4c0acc7be..1053848670 100644 Binary files a/public/images/emoji/google/notes.png and b/public/images/emoji/google/notes.png differ diff --git a/public/images/emoji/google/nut_and_bolt.png b/public/images/emoji/google/nut_and_bolt.png index 4e788ca5cc..13ba9e8ffc 100644 Binary files a/public/images/emoji/google/nut_and_bolt.png and b/public/images/emoji/google/nut_and_bolt.png differ diff --git a/public/images/emoji/google/o.png b/public/images/emoji/google/o.png index 214e7b57db..407495fd47 100644 Binary files a/public/images/emoji/google/o.png and b/public/images/emoji/google/o.png differ diff --git a/public/images/emoji/google/o2.png b/public/images/emoji/google/o2.png index 2c809565c2..eb0d827df6 100644 Binary files a/public/images/emoji/google/o2.png and b/public/images/emoji/google/o2.png differ diff --git a/public/images/emoji/google/ocean.png b/public/images/emoji/google/ocean.png index d536ba9b4b..27335ff765 100644 Binary files a/public/images/emoji/google/ocean.png and b/public/images/emoji/google/ocean.png differ diff --git a/public/images/emoji/google/octopus.png b/public/images/emoji/google/octopus.png index 34e1fa5ace..fb7b316a52 100644 Binary files a/public/images/emoji/google/octopus.png and b/public/images/emoji/google/octopus.png differ diff --git a/public/images/emoji/google/oden.png b/public/images/emoji/google/oden.png index 0175691f49..c179c09971 100644 Binary files a/public/images/emoji/google/oden.png and b/public/images/emoji/google/oden.png differ diff --git a/public/images/emoji/google/office.png b/public/images/emoji/google/office.png index e0da8d29ca..10fb675557 100644 Binary files a/public/images/emoji/google/office.png and b/public/images/emoji/google/office.png differ diff --git a/public/images/emoji/google/oil.png b/public/images/emoji/google/oil.png index e2bea27a97..e039ca2d09 100644 Binary files a/public/images/emoji/google/oil.png and b/public/images/emoji/google/oil.png differ diff --git a/public/images/emoji/google/oil_drum.png b/public/images/emoji/google/oil_drum.png index e2bea27a97..e039ca2d09 100644 Binary files a/public/images/emoji/google/oil_drum.png and b/public/images/emoji/google/oil_drum.png differ diff --git a/public/images/emoji/google/ok.png b/public/images/emoji/google/ok.png index c596df58e5..4c02b76db9 100644 Binary files a/public/images/emoji/google/ok.png and b/public/images/emoji/google/ok.png differ diff --git a/public/images/emoji/google/ok_hand.png b/public/images/emoji/google/ok_hand.png index 446cfd0546..2e5cb7ea63 100644 Binary files a/public/images/emoji/google/ok_hand.png and b/public/images/emoji/google/ok_hand.png differ diff --git a/public/images/emoji/google/ok_man.png b/public/images/emoji/google/ok_man.png index f508195e7c..5bf2d4a2e8 100644 Binary files a/public/images/emoji/google/ok_man.png and b/public/images/emoji/google/ok_man.png differ diff --git a/public/images/emoji/google/ok_woman.png b/public/images/emoji/google/ok_woman.png index 4b8c844a3d..33a4ee67c4 100644 Binary files a/public/images/emoji/google/ok_woman.png and b/public/images/emoji/google/ok_woman.png differ diff --git a/public/images/emoji/google/old_key.png b/public/images/emoji/google/old_key.png index 6083982335..8df5d2ca80 100644 Binary files a/public/images/emoji/google/old_key.png and b/public/images/emoji/google/old_key.png differ diff --git a/public/images/emoji/google/older_adult.png b/public/images/emoji/google/older_adult.png index 7d94d0b329..93dcc3a072 100644 Binary files a/public/images/emoji/google/older_adult.png and b/public/images/emoji/google/older_adult.png differ diff --git a/public/images/emoji/google/older_man.png b/public/images/emoji/google/older_man.png index d2de212e7a..2e4b1ab56c 100644 Binary files a/public/images/emoji/google/older_man.png and b/public/images/emoji/google/older_man.png differ diff --git a/public/images/emoji/google/older_woman.png b/public/images/emoji/google/older_woman.png index 1d07afb892..febc8a3d2b 100644 Binary files a/public/images/emoji/google/older_woman.png and b/public/images/emoji/google/older_woman.png differ diff --git a/public/images/emoji/google/om.png b/public/images/emoji/google/om.png index f77f1842b1..095e39afd2 100644 Binary files a/public/images/emoji/google/om.png and b/public/images/emoji/google/om.png differ diff --git a/public/images/emoji/google/om_symbol.png b/public/images/emoji/google/om_symbol.png index f77f1842b1..095e39afd2 100644 Binary files a/public/images/emoji/google/om_symbol.png and b/public/images/emoji/google/om_symbol.png differ diff --git a/public/images/emoji/google/oman.png b/public/images/emoji/google/oman.png index 23a64ef5d6..df328c54fb 100644 Binary files a/public/images/emoji/google/oman.png and b/public/images/emoji/google/oman.png differ diff --git a/public/images/emoji/google/on.png b/public/images/emoji/google/on.png index 8dbf124728..ff04377f60 100644 Binary files a/public/images/emoji/google/on.png and b/public/images/emoji/google/on.png differ diff --git a/public/images/emoji/google/oncoming_automobile.png b/public/images/emoji/google/oncoming_automobile.png index 7df8de6eb8..c350f786bd 100644 Binary files a/public/images/emoji/google/oncoming_automobile.png and b/public/images/emoji/google/oncoming_automobile.png differ diff --git a/public/images/emoji/google/oncoming_bus.png b/public/images/emoji/google/oncoming_bus.png index ed61c14726..5480ec6df5 100644 Binary files a/public/images/emoji/google/oncoming_bus.png and b/public/images/emoji/google/oncoming_bus.png differ diff --git a/public/images/emoji/google/oncoming_police_car.png b/public/images/emoji/google/oncoming_police_car.png index 39015e59af..f6c593ec16 100644 Binary files a/public/images/emoji/google/oncoming_police_car.png and b/public/images/emoji/google/oncoming_police_car.png differ diff --git a/public/images/emoji/google/oncoming_taxi.png b/public/images/emoji/google/oncoming_taxi.png index 8732bafedf..a00fd49851 100644 Binary files a/public/images/emoji/google/oncoming_taxi.png and b/public/images/emoji/google/oncoming_taxi.png differ diff --git a/public/images/emoji/google/one.png b/public/images/emoji/google/one.png index b6f6dac44f..f34eb211a6 100644 Binary files a/public/images/emoji/google/one.png and b/public/images/emoji/google/one.png differ diff --git a/public/images/emoji/google/open_book.png b/public/images/emoji/google/open_book.png index fa30a7da66..3b58a6d375 100644 Binary files a/public/images/emoji/google/open_book.png and b/public/images/emoji/google/open_book.png differ diff --git a/public/images/emoji/google/open_file_folder.png b/public/images/emoji/google/open_file_folder.png index e057711924..c762adc483 100644 Binary files a/public/images/emoji/google/open_file_folder.png and b/public/images/emoji/google/open_file_folder.png differ diff --git a/public/images/emoji/google/open_hands.png b/public/images/emoji/google/open_hands.png index ba6ecd42f4..f21c9a9389 100644 Binary files a/public/images/emoji/google/open_hands.png and b/public/images/emoji/google/open_hands.png differ diff --git a/public/images/emoji/google/open_mouth.png b/public/images/emoji/google/open_mouth.png index 6d8a030605..b45d703f66 100644 Binary files a/public/images/emoji/google/open_mouth.png and b/public/images/emoji/google/open_mouth.png differ diff --git a/public/images/emoji/google/open_umbrella.png b/public/images/emoji/google/open_umbrella.png index fb2f8bb58b..31954e3c1e 100644 Binary files a/public/images/emoji/google/open_umbrella.png and b/public/images/emoji/google/open_umbrella.png differ diff --git a/public/images/emoji/google/ophiuchus.png b/public/images/emoji/google/ophiuchus.png index ecb2822153..9d91099f45 100644 Binary files a/public/images/emoji/google/ophiuchus.png and b/public/images/emoji/google/ophiuchus.png differ diff --git a/public/images/emoji/google/orange_book.png b/public/images/emoji/google/orange_book.png index 909be4d855..7b9106ba38 100644 Binary files a/public/images/emoji/google/orange_book.png and b/public/images/emoji/google/orange_book.png differ diff --git a/public/images/emoji/google/orange_heart.png b/public/images/emoji/google/orange_heart.png index 5f66108e03..b3517e7bdc 100644 Binary files a/public/images/emoji/google/orange_heart.png and b/public/images/emoji/google/orange_heart.png differ diff --git a/public/images/emoji/google/orthodox_cross.png b/public/images/emoji/google/orthodox_cross.png index 98bda28535..7bef2865eb 100644 Binary files a/public/images/emoji/google/orthodox_cross.png and b/public/images/emoji/google/orthodox_cross.png differ diff --git a/public/images/emoji/google/outbox_tray.png b/public/images/emoji/google/outbox_tray.png index 4204b73676..862fb68dd1 100644 Binary files a/public/images/emoji/google/outbox_tray.png and b/public/images/emoji/google/outbox_tray.png differ diff --git a/public/images/emoji/google/owl.png b/public/images/emoji/google/owl.png index b5b8d7775a..78220445b2 100644 Binary files a/public/images/emoji/google/owl.png and b/public/images/emoji/google/owl.png differ diff --git a/public/images/emoji/google/ox.png b/public/images/emoji/google/ox.png index c0e276e6d5..5151349263 100644 Binary files a/public/images/emoji/google/ox.png and b/public/images/emoji/google/ox.png differ diff --git a/public/images/emoji/google/package.png b/public/images/emoji/google/package.png index 253553a2f2..13cbdc067f 100644 Binary files a/public/images/emoji/google/package.png and b/public/images/emoji/google/package.png differ diff --git a/public/images/emoji/google/page_facing_up.png b/public/images/emoji/google/page_facing_up.png index a2c7af4a79..5064ae2ca0 100644 Binary files a/public/images/emoji/google/page_facing_up.png and b/public/images/emoji/google/page_facing_up.png differ diff --git a/public/images/emoji/google/page_with_curl.png b/public/images/emoji/google/page_with_curl.png index d4d9805e35..6327cf85fe 100644 Binary files a/public/images/emoji/google/page_with_curl.png and b/public/images/emoji/google/page_with_curl.png differ diff --git a/public/images/emoji/google/pager.png b/public/images/emoji/google/pager.png index 446e4dc64d..f510e90c77 100644 Binary files a/public/images/emoji/google/pager.png and b/public/images/emoji/google/pager.png differ diff --git a/public/images/emoji/google/paintbrush.png b/public/images/emoji/google/paintbrush.png index bde63a8092..a0af9ebb49 100644 Binary files a/public/images/emoji/google/paintbrush.png and b/public/images/emoji/google/paintbrush.png differ diff --git a/public/images/emoji/google/pakistan.png b/public/images/emoji/google/pakistan.png index 908744de36..c6a316b055 100644 Binary files a/public/images/emoji/google/pakistan.png and b/public/images/emoji/google/pakistan.png differ diff --git a/public/images/emoji/google/palau.png b/public/images/emoji/google/palau.png index 959e48a630..4048d9fb68 100644 Binary files a/public/images/emoji/google/palau.png and b/public/images/emoji/google/palau.png differ diff --git a/public/images/emoji/google/palestinian_territories.png b/public/images/emoji/google/palestinian_territories.png index ca3ab3a3b2..d61014a8b2 100644 Binary files a/public/images/emoji/google/palestinian_territories.png and b/public/images/emoji/google/palestinian_territories.png differ diff --git a/public/images/emoji/google/palm_tree.png b/public/images/emoji/google/palm_tree.png index 54f17fcab5..16964678fb 100644 Binary files a/public/images/emoji/google/palm_tree.png and b/public/images/emoji/google/palm_tree.png differ diff --git a/public/images/emoji/google/palms_up_together.png b/public/images/emoji/google/palms_up_together.png index 91f2aee46b..529b08ff98 100644 Binary files a/public/images/emoji/google/palms_up_together.png and b/public/images/emoji/google/palms_up_together.png differ diff --git a/public/images/emoji/google/panama.png b/public/images/emoji/google/panama.png index b673e35fd6..30a6e9840a 100644 Binary files a/public/images/emoji/google/panama.png and b/public/images/emoji/google/panama.png differ diff --git a/public/images/emoji/google/pancakes.png b/public/images/emoji/google/pancakes.png index b4afd25781..ee4186cb90 100644 Binary files a/public/images/emoji/google/pancakes.png and b/public/images/emoji/google/pancakes.png differ diff --git a/public/images/emoji/google/panda_face.png b/public/images/emoji/google/panda_face.png index db4f8c79af..6fa2c883d5 100644 Binary files a/public/images/emoji/google/panda_face.png and b/public/images/emoji/google/panda_face.png differ diff --git a/public/images/emoji/google/paperclip.png b/public/images/emoji/google/paperclip.png index ff08039930..e1bbf6c405 100644 Binary files a/public/images/emoji/google/paperclip.png and b/public/images/emoji/google/paperclip.png differ diff --git a/public/images/emoji/google/paperclips.png b/public/images/emoji/google/paperclips.png index 56d7279a5c..af91dafb77 100644 Binary files a/public/images/emoji/google/paperclips.png and b/public/images/emoji/google/paperclips.png differ diff --git a/public/images/emoji/google/papua_new_guinea.png b/public/images/emoji/google/papua_new_guinea.png index 6f90f6e147..ccbb8e13ca 100644 Binary files a/public/images/emoji/google/papua_new_guinea.png and b/public/images/emoji/google/papua_new_guinea.png differ diff --git a/public/images/emoji/google/paraguay.png b/public/images/emoji/google/paraguay.png index 81f2b67ed0..bd7b9b8477 100644 Binary files a/public/images/emoji/google/paraguay.png and b/public/images/emoji/google/paraguay.png differ diff --git a/public/images/emoji/google/parasol_on_ground.png b/public/images/emoji/google/parasol_on_ground.png index c7358ec949..d56d26df8c 100644 Binary files a/public/images/emoji/google/parasol_on_ground.png and b/public/images/emoji/google/parasol_on_ground.png differ diff --git a/public/images/emoji/google/park.png b/public/images/emoji/google/park.png index d98082e0cd..540cdbe1a0 100644 Binary files a/public/images/emoji/google/park.png and b/public/images/emoji/google/park.png differ diff --git a/public/images/emoji/google/parking.png b/public/images/emoji/google/parking.png index 03dfb7c3db..69b11efc79 100644 Binary files a/public/images/emoji/google/parking.png and b/public/images/emoji/google/parking.png differ diff --git a/public/images/emoji/google/parrot.png b/public/images/emoji/google/parrot.png new file mode 100644 index 0000000000..67af3c62ab Binary files /dev/null and b/public/images/emoji/google/parrot.png differ diff --git a/public/images/emoji/google/part_alternation_mark.png b/public/images/emoji/google/part_alternation_mark.png index 01e88ba945..38157f9a71 100644 Binary files a/public/images/emoji/google/part_alternation_mark.png and b/public/images/emoji/google/part_alternation_mark.png differ diff --git a/public/images/emoji/google/partly_sunny.png b/public/images/emoji/google/partly_sunny.png index 91998ebb31..f212aa58ea 100644 Binary files a/public/images/emoji/google/partly_sunny.png and b/public/images/emoji/google/partly_sunny.png differ diff --git a/public/images/emoji/google/partying_face.png b/public/images/emoji/google/partying_face.png new file mode 100644 index 0000000000..4a3370dc56 Binary files /dev/null and b/public/images/emoji/google/partying_face.png differ diff --git a/public/images/emoji/google/passenger_ship.png b/public/images/emoji/google/passenger_ship.png index be03fc1343..562b56cc9a 100644 Binary files a/public/images/emoji/google/passenger_ship.png and b/public/images/emoji/google/passenger_ship.png differ diff --git a/public/images/emoji/google/passport_control.png b/public/images/emoji/google/passport_control.png index a061db8257..b638465c46 100644 Binary files a/public/images/emoji/google/passport_control.png and b/public/images/emoji/google/passport_control.png differ diff --git a/public/images/emoji/google/pause_button.png b/public/images/emoji/google/pause_button.png index 6e0b69634e..992d3a286c 100644 Binary files a/public/images/emoji/google/pause_button.png and b/public/images/emoji/google/pause_button.png differ diff --git a/public/images/emoji/google/paw_prints.png b/public/images/emoji/google/paw_prints.png index 6e4aa21695..633ee4012d 100644 Binary files a/public/images/emoji/google/paw_prints.png and b/public/images/emoji/google/paw_prints.png differ diff --git a/public/images/emoji/google/peace.png b/public/images/emoji/google/peace.png index 54452f3f19..a66aaed2f2 100644 Binary files a/public/images/emoji/google/peace.png and b/public/images/emoji/google/peace.png differ diff --git a/public/images/emoji/google/peace_symbol.png b/public/images/emoji/google/peace_symbol.png index 54452f3f19..a66aaed2f2 100644 Binary files a/public/images/emoji/google/peace_symbol.png and b/public/images/emoji/google/peace_symbol.png differ diff --git a/public/images/emoji/google/peach.png b/public/images/emoji/google/peach.png index e386582c38..b276f4c670 100644 Binary files a/public/images/emoji/google/peach.png and b/public/images/emoji/google/peach.png differ diff --git a/public/images/emoji/google/peacock.png b/public/images/emoji/google/peacock.png new file mode 100644 index 0000000000..635026f87a Binary files /dev/null and b/public/images/emoji/google/peacock.png differ diff --git a/public/images/emoji/google/peanuts.png b/public/images/emoji/google/peanuts.png index 55433e7b6c..8d6c40d467 100644 Binary files a/public/images/emoji/google/peanuts.png and b/public/images/emoji/google/peanuts.png differ diff --git a/public/images/emoji/google/pear.png b/public/images/emoji/google/pear.png index cc672a6a2e..4976919d2a 100644 Binary files a/public/images/emoji/google/pear.png and b/public/images/emoji/google/pear.png differ diff --git a/public/images/emoji/google/pen.png b/public/images/emoji/google/pen.png index a3312810ec..3ad636f5b5 100644 Binary files a/public/images/emoji/google/pen.png and b/public/images/emoji/google/pen.png differ diff --git a/public/images/emoji/google/pen_ballpoint.png b/public/images/emoji/google/pen_ballpoint.png index a3312810ec..3ad636f5b5 100644 Binary files a/public/images/emoji/google/pen_ballpoint.png and b/public/images/emoji/google/pen_ballpoint.png differ diff --git a/public/images/emoji/google/pen_fountain.png b/public/images/emoji/google/pen_fountain.png index 3d8ba60471..91f31b4580 100644 Binary files a/public/images/emoji/google/pen_fountain.png and b/public/images/emoji/google/pen_fountain.png differ diff --git a/public/images/emoji/google/pencil.png b/public/images/emoji/google/pencil.png index 5a3bd6cd09..62ee8c58e4 100644 Binary files a/public/images/emoji/google/pencil.png and b/public/images/emoji/google/pencil.png differ diff --git a/public/images/emoji/google/pencil2.png b/public/images/emoji/google/pencil2.png index 7f7ebda566..9ffa993c68 100644 Binary files a/public/images/emoji/google/pencil2.png and b/public/images/emoji/google/pencil2.png differ diff --git a/public/images/emoji/google/penguin.png b/public/images/emoji/google/penguin.png index 4f4d284cc3..4c0e75586a 100644 Binary files a/public/images/emoji/google/penguin.png and b/public/images/emoji/google/penguin.png differ diff --git a/public/images/emoji/google/pensive.png b/public/images/emoji/google/pensive.png index 22e6e65f5b..44eca8501b 100644 Binary files a/public/images/emoji/google/pensive.png and b/public/images/emoji/google/pensive.png differ diff --git a/public/images/emoji/google/performing_arts.png b/public/images/emoji/google/performing_arts.png index 96908a7533..aea25a8509 100644 Binary files a/public/images/emoji/google/performing_arts.png and b/public/images/emoji/google/performing_arts.png differ diff --git a/public/images/emoji/google/persevere.png b/public/images/emoji/google/persevere.png index 7183637f2f..77c6d2fa91 100644 Binary files a/public/images/emoji/google/persevere.png and b/public/images/emoji/google/persevere.png differ diff --git a/public/images/emoji/google/person_climbing.png b/public/images/emoji/google/person_climbing.png index 021a0b719a..cf541159e6 100644 Binary files a/public/images/emoji/google/person_climbing.png and b/public/images/emoji/google/person_climbing.png differ diff --git a/public/images/emoji/google/person_fencing.png b/public/images/emoji/google/person_fencing.png index d088819d7a..48cb1f3560 100644 Binary files a/public/images/emoji/google/person_fencing.png and b/public/images/emoji/google/person_fencing.png differ diff --git a/public/images/emoji/google/person_frowning.png b/public/images/emoji/google/person_frowning.png index 0378dfe42e..6e2ca45269 100644 Binary files a/public/images/emoji/google/person_frowning.png and b/public/images/emoji/google/person_frowning.png differ diff --git a/public/images/emoji/google/person_in_lotus_position.png b/public/images/emoji/google/person_in_lotus_position.png index 17aaf80ab6..06640cec30 100644 Binary files a/public/images/emoji/google/person_in_lotus_position.png and b/public/images/emoji/google/person_in_lotus_position.png differ diff --git a/public/images/emoji/google/person_in_steamy_room.png b/public/images/emoji/google/person_in_steamy_room.png index 1395f737c3..ab8cad151b 100644 Binary files a/public/images/emoji/google/person_in_steamy_room.png and b/public/images/emoji/google/person_in_steamy_room.png differ diff --git a/public/images/emoji/google/person_with_ball.png b/public/images/emoji/google/person_with_ball.png index 4441fc46c5..72f015d486 100644 Binary files a/public/images/emoji/google/person_with_ball.png and b/public/images/emoji/google/person_with_ball.png differ diff --git a/public/images/emoji/google/person_with_blond_hair.png b/public/images/emoji/google/person_with_blond_hair.png index f5d7e0009b..40fd3dc631 100644 Binary files a/public/images/emoji/google/person_with_blond_hair.png and b/public/images/emoji/google/person_with_blond_hair.png differ diff --git a/public/images/emoji/google/person_with_pouting_face.png b/public/images/emoji/google/person_with_pouting_face.png index db8208ab0d..7503ffe38e 100644 Binary files a/public/images/emoji/google/person_with_pouting_face.png and b/public/images/emoji/google/person_with_pouting_face.png differ diff --git a/public/images/emoji/google/peru.png b/public/images/emoji/google/peru.png index 84281c7ec8..a482417919 100644 Binary files a/public/images/emoji/google/peru.png and b/public/images/emoji/google/peru.png differ diff --git a/public/images/emoji/google/petri_dish.png b/public/images/emoji/google/petri_dish.png new file mode 100644 index 0000000000..707c801adb Binary files /dev/null and b/public/images/emoji/google/petri_dish.png differ diff --git a/public/images/emoji/google/philippines.png b/public/images/emoji/google/philippines.png index 117684b404..c83e12c636 100644 Binary files a/public/images/emoji/google/philippines.png and b/public/images/emoji/google/philippines.png differ diff --git a/public/images/emoji/google/phone.png b/public/images/emoji/google/phone.png index 3eca2e7d80..eb4131c4c9 100644 Binary files a/public/images/emoji/google/phone.png and b/public/images/emoji/google/phone.png differ diff --git a/public/images/emoji/google/pick.png b/public/images/emoji/google/pick.png index 372dbef256..13c1b575a5 100644 Binary files a/public/images/emoji/google/pick.png and b/public/images/emoji/google/pick.png differ diff --git a/public/images/emoji/google/pie.png b/public/images/emoji/google/pie.png index 0aa66b4de8..85d1a43a1d 100644 Binary files a/public/images/emoji/google/pie.png and b/public/images/emoji/google/pie.png differ diff --git a/public/images/emoji/google/pig.png b/public/images/emoji/google/pig.png index 028092eb83..a444f05d1a 100644 Binary files a/public/images/emoji/google/pig.png and b/public/images/emoji/google/pig.png differ diff --git a/public/images/emoji/google/pig2.png b/public/images/emoji/google/pig2.png index 25e4e10a3a..3d972a0f0c 100644 Binary files a/public/images/emoji/google/pig2.png and b/public/images/emoji/google/pig2.png differ diff --git a/public/images/emoji/google/pig_nose.png b/public/images/emoji/google/pig_nose.png index 6633f59519..a1760a3847 100644 Binary files a/public/images/emoji/google/pig_nose.png and b/public/images/emoji/google/pig_nose.png differ diff --git a/public/images/emoji/google/pill.png b/public/images/emoji/google/pill.png index 9d589f8906..ed88b31224 100644 Binary files a/public/images/emoji/google/pill.png and b/public/images/emoji/google/pill.png differ diff --git a/public/images/emoji/google/pineapple.png b/public/images/emoji/google/pineapple.png index 92a53419e5..a4c9fd208f 100644 Binary files a/public/images/emoji/google/pineapple.png and b/public/images/emoji/google/pineapple.png differ diff --git a/public/images/emoji/google/ping_pong.png b/public/images/emoji/google/ping_pong.png index 60444a0a3a..c64fc50cb3 100644 Binary files a/public/images/emoji/google/ping_pong.png and b/public/images/emoji/google/ping_pong.png differ diff --git a/public/images/emoji/google/pirate_flag.png b/public/images/emoji/google/pirate_flag.png new file mode 100644 index 0000000000..d428336608 Binary files /dev/null and b/public/images/emoji/google/pirate_flag.png differ diff --git a/public/images/emoji/google/pisces.png b/public/images/emoji/google/pisces.png index c3983ce4d8..29e7fcb117 100644 Binary files a/public/images/emoji/google/pisces.png and b/public/images/emoji/google/pisces.png differ diff --git a/public/images/emoji/google/pitcairn_islands.png b/public/images/emoji/google/pitcairn_islands.png index 09a98b8ef6..64d7c8a60b 100644 Binary files a/public/images/emoji/google/pitcairn_islands.png and b/public/images/emoji/google/pitcairn_islands.png differ diff --git a/public/images/emoji/google/pizza.png b/public/images/emoji/google/pizza.png index 72b60d4934..2988db7c45 100644 Binary files a/public/images/emoji/google/pizza.png and b/public/images/emoji/google/pizza.png differ diff --git a/public/images/emoji/google/place_of_worship.png b/public/images/emoji/google/place_of_worship.png index 6e4d8a9248..a9a2024235 100644 Binary files a/public/images/emoji/google/place_of_worship.png and b/public/images/emoji/google/place_of_worship.png differ diff --git a/public/images/emoji/google/plate_with_cutlery.png b/public/images/emoji/google/plate_with_cutlery.png index c0ed1e0ed6..cc64021462 100644 Binary files a/public/images/emoji/google/plate_with_cutlery.png and b/public/images/emoji/google/plate_with_cutlery.png differ diff --git a/public/images/emoji/google/play_or_pause_button.png b/public/images/emoji/google/play_or_pause_button.png index 962fbe1652..a3c19095bb 100644 Binary files a/public/images/emoji/google/play_or_pause_button.png and b/public/images/emoji/google/play_or_pause_button.png differ diff --git a/public/images/emoji/google/play_pause.png b/public/images/emoji/google/play_pause.png index 962fbe1652..a3c19095bb 100644 Binary files a/public/images/emoji/google/play_pause.png and b/public/images/emoji/google/play_pause.png differ diff --git a/public/images/emoji/google/pleading_face.png b/public/images/emoji/google/pleading_face.png new file mode 100644 index 0000000000..a23edf41eb Binary files /dev/null and b/public/images/emoji/google/pleading_face.png differ diff --git a/public/images/emoji/google/point_down.png b/public/images/emoji/google/point_down.png index 303aeb3c0c..3481f64a60 100644 Binary files a/public/images/emoji/google/point_down.png and b/public/images/emoji/google/point_down.png differ diff --git a/public/images/emoji/google/point_left.png b/public/images/emoji/google/point_left.png index a8ff5b2c6a..4e256e5fa3 100644 Binary files a/public/images/emoji/google/point_left.png and b/public/images/emoji/google/point_left.png differ diff --git a/public/images/emoji/google/point_right.png b/public/images/emoji/google/point_right.png index 118d3b2010..26ad04fa50 100644 Binary files a/public/images/emoji/google/point_right.png and b/public/images/emoji/google/point_right.png differ diff --git a/public/images/emoji/google/point_up.png b/public/images/emoji/google/point_up.png index eb2ecf782d..7665d46c35 100644 Binary files a/public/images/emoji/google/point_up.png and b/public/images/emoji/google/point_up.png differ diff --git a/public/images/emoji/google/point_up_2.png b/public/images/emoji/google/point_up_2.png index d10b6dd3f8..40192356f3 100644 Binary files a/public/images/emoji/google/point_up_2.png and b/public/images/emoji/google/point_up_2.png differ diff --git a/public/images/emoji/google/poland.png b/public/images/emoji/google/poland.png index 0299ecfd9b..c5989624c4 100644 Binary files a/public/images/emoji/google/poland.png and b/public/images/emoji/google/poland.png differ diff --git a/public/images/emoji/google/police_car.png b/public/images/emoji/google/police_car.png index 2b15c56b32..4789bc11c2 100644 Binary files a/public/images/emoji/google/police_car.png and b/public/images/emoji/google/police_car.png differ diff --git a/public/images/emoji/google/policeman.png b/public/images/emoji/google/policeman.png index 7cdf83e122..050f460be4 100644 Binary files a/public/images/emoji/google/policeman.png and b/public/images/emoji/google/policeman.png differ diff --git a/public/images/emoji/google/policewoman.png b/public/images/emoji/google/policewoman.png index b0834ac8c7..8bd1b5479f 100644 Binary files a/public/images/emoji/google/policewoman.png and b/public/images/emoji/google/policewoman.png differ diff --git a/public/images/emoji/google/poo.png b/public/images/emoji/google/poo.png index de476df01c..2d0740a6d5 100644 Binary files a/public/images/emoji/google/poo.png and b/public/images/emoji/google/poo.png differ diff --git a/public/images/emoji/google/poodle.png b/public/images/emoji/google/poodle.png index 34b13b44d5..e7f157f727 100644 Binary files a/public/images/emoji/google/poodle.png and b/public/images/emoji/google/poodle.png differ diff --git a/public/images/emoji/google/poop.png b/public/images/emoji/google/poop.png index de476df01c..2d0740a6d5 100644 Binary files a/public/images/emoji/google/poop.png and b/public/images/emoji/google/poop.png differ diff --git a/public/images/emoji/google/popcorn.png b/public/images/emoji/google/popcorn.png index 0fb9b10c89..764765d169 100644 Binary files a/public/images/emoji/google/popcorn.png and b/public/images/emoji/google/popcorn.png differ diff --git a/public/images/emoji/google/portugal.png b/public/images/emoji/google/portugal.png index c7fb67e041..ce06d1d1d4 100644 Binary files a/public/images/emoji/google/portugal.png and b/public/images/emoji/google/portugal.png differ diff --git a/public/images/emoji/google/post_office.png b/public/images/emoji/google/post_office.png index c18d81cdb8..c004f4cf61 100644 Binary files a/public/images/emoji/google/post_office.png and b/public/images/emoji/google/post_office.png differ diff --git a/public/images/emoji/google/postal_horn.png b/public/images/emoji/google/postal_horn.png index a942600f88..2d38a9951f 100644 Binary files a/public/images/emoji/google/postal_horn.png and b/public/images/emoji/google/postal_horn.png differ diff --git a/public/images/emoji/google/postbox.png b/public/images/emoji/google/postbox.png index 8b1601ae39..85e33c351f 100644 Binary files a/public/images/emoji/google/postbox.png and b/public/images/emoji/google/postbox.png differ diff --git a/public/images/emoji/google/potable_water.png b/public/images/emoji/google/potable_water.png index 9f92c3e6fe..9d8f5ae21a 100644 Binary files a/public/images/emoji/google/potable_water.png and b/public/images/emoji/google/potable_water.png differ diff --git a/public/images/emoji/google/potato.png b/public/images/emoji/google/potato.png index cb25568ac5..37a53c7583 100644 Binary files a/public/images/emoji/google/potato.png and b/public/images/emoji/google/potato.png differ diff --git a/public/images/emoji/google/pouch.png b/public/images/emoji/google/pouch.png index 87b988753d..2869b0242e 100644 Binary files a/public/images/emoji/google/pouch.png and b/public/images/emoji/google/pouch.png differ diff --git a/public/images/emoji/google/poultry_leg.png b/public/images/emoji/google/poultry_leg.png index 4cc37087c5..c37870dce7 100644 Binary files a/public/images/emoji/google/poultry_leg.png and b/public/images/emoji/google/poultry_leg.png differ diff --git a/public/images/emoji/google/pound.png b/public/images/emoji/google/pound.png index 67f5f4abba..8b1e3833ce 100644 Binary files a/public/images/emoji/google/pound.png and b/public/images/emoji/google/pound.png differ diff --git a/public/images/emoji/google/pouting_cat.png b/public/images/emoji/google/pouting_cat.png index b904b3dc75..b8e78e6973 100644 Binary files a/public/images/emoji/google/pouting_cat.png and b/public/images/emoji/google/pouting_cat.png differ diff --git a/public/images/emoji/google/pouting_man.png b/public/images/emoji/google/pouting_man.png index 3cee46d882..0a9c5bb643 100644 Binary files a/public/images/emoji/google/pouting_man.png and b/public/images/emoji/google/pouting_man.png differ diff --git a/public/images/emoji/google/pouting_woman.png b/public/images/emoji/google/pouting_woman.png index db8208ab0d..7503ffe38e 100644 Binary files a/public/images/emoji/google/pouting_woman.png and b/public/images/emoji/google/pouting_woman.png differ diff --git a/public/images/emoji/google/pray.png b/public/images/emoji/google/pray.png index 7a42c71cf8..59dcbf4828 100644 Binary files a/public/images/emoji/google/pray.png and b/public/images/emoji/google/pray.png differ diff --git a/public/images/emoji/google/prayer_beads.png b/public/images/emoji/google/prayer_beads.png index 4fa186fdec..9fc7282b25 100644 Binary files a/public/images/emoji/google/prayer_beads.png and b/public/images/emoji/google/prayer_beads.png differ diff --git a/public/images/emoji/google/pregnant_woman.png b/public/images/emoji/google/pregnant_woman.png index 1c88f42f6d..b23d1fcdd1 100644 Binary files a/public/images/emoji/google/pregnant_woman.png and b/public/images/emoji/google/pregnant_woman.png differ diff --git a/public/images/emoji/google/pretzel.png b/public/images/emoji/google/pretzel.png index dd725a6360..26d80987b4 100644 Binary files a/public/images/emoji/google/pretzel.png and b/public/images/emoji/google/pretzel.png differ diff --git a/public/images/emoji/google/previous_track.png b/public/images/emoji/google/previous_track.png index 87e948c080..d636e75dbe 100644 Binary files a/public/images/emoji/google/previous_track.png and b/public/images/emoji/google/previous_track.png differ diff --git a/public/images/emoji/google/previous_track_button.png b/public/images/emoji/google/previous_track_button.png index 87e948c080..d636e75dbe 100644 Binary files a/public/images/emoji/google/previous_track_button.png and b/public/images/emoji/google/previous_track_button.png differ diff --git a/public/images/emoji/google/prince.png b/public/images/emoji/google/prince.png index 035304bda1..8b30e20c99 100644 Binary files a/public/images/emoji/google/prince.png and b/public/images/emoji/google/prince.png differ diff --git a/public/images/emoji/google/princess.png b/public/images/emoji/google/princess.png index 094e61c4e5..7c7ca07d54 100644 Binary files a/public/images/emoji/google/princess.png and b/public/images/emoji/google/princess.png differ diff --git a/public/images/emoji/google/printer.png b/public/images/emoji/google/printer.png index 76bf56bfdf..fa88161f18 100644 Binary files a/public/images/emoji/google/printer.png and b/public/images/emoji/google/printer.png differ diff --git a/public/images/emoji/google/projector.png b/public/images/emoji/google/projector.png index a420005a79..c2678f7a94 100644 Binary files a/public/images/emoji/google/projector.png and b/public/images/emoji/google/projector.png differ diff --git a/public/images/emoji/google/puerto_rico.png b/public/images/emoji/google/puerto_rico.png index 4787f3af45..24b8b72918 100644 Binary files a/public/images/emoji/google/puerto_rico.png and b/public/images/emoji/google/puerto_rico.png differ diff --git a/public/images/emoji/google/puke.png b/public/images/emoji/google/puke.png index d3ce5f69bd..8713c15c9e 100644 Binary files a/public/images/emoji/google/puke.png and b/public/images/emoji/google/puke.png differ diff --git a/public/images/emoji/google/punch.png b/public/images/emoji/google/punch.png index 2ef7ed2091..e043b26f7a 100644 Binary files a/public/images/emoji/google/punch.png and b/public/images/emoji/google/punch.png differ diff --git a/public/images/emoji/google/purple_heart.png b/public/images/emoji/google/purple_heart.png index 70c7bbd206..fe2f0d4fc6 100644 Binary files a/public/images/emoji/google/purple_heart.png and b/public/images/emoji/google/purple_heart.png differ diff --git a/public/images/emoji/google/purse.png b/public/images/emoji/google/purse.png index fe533f5c17..c5555fad56 100644 Binary files a/public/images/emoji/google/purse.png and b/public/images/emoji/google/purse.png differ diff --git a/public/images/emoji/google/pushpin.png b/public/images/emoji/google/pushpin.png index 0dfa0a3779..6add7aee2e 100644 Binary files a/public/images/emoji/google/pushpin.png and b/public/images/emoji/google/pushpin.png differ diff --git a/public/images/emoji/google/put_litter_in_its_place.png b/public/images/emoji/google/put_litter_in_its_place.png index a19ae024c8..329dd64da2 100644 Binary files a/public/images/emoji/google/put_litter_in_its_place.png and b/public/images/emoji/google/put_litter_in_its_place.png differ diff --git a/public/images/emoji/google/qatar.png b/public/images/emoji/google/qatar.png index 02db227af7..80e31fc4f5 100644 Binary files a/public/images/emoji/google/qatar.png and b/public/images/emoji/google/qatar.png differ diff --git a/public/images/emoji/google/question.png b/public/images/emoji/google/question.png index 691e7345f8..aa462167d1 100644 Binary files a/public/images/emoji/google/question.png and b/public/images/emoji/google/question.png differ diff --git a/public/images/emoji/google/rabbit.png b/public/images/emoji/google/rabbit.png index 6597050419..8fb965512f 100644 Binary files a/public/images/emoji/google/rabbit.png and b/public/images/emoji/google/rabbit.png differ diff --git a/public/images/emoji/google/rabbit2.png b/public/images/emoji/google/rabbit2.png index 3f5ce5c83a..f167568327 100644 Binary files a/public/images/emoji/google/rabbit2.png and b/public/images/emoji/google/rabbit2.png differ diff --git a/public/images/emoji/google/raccoon.png b/public/images/emoji/google/raccoon.png new file mode 100644 index 0000000000..d6422dd8e0 Binary files /dev/null and b/public/images/emoji/google/raccoon.png differ diff --git a/public/images/emoji/google/race_car.png b/public/images/emoji/google/race_car.png index efee3e6d65..e32f9c337e 100644 Binary files a/public/images/emoji/google/race_car.png and b/public/images/emoji/google/race_car.png differ diff --git a/public/images/emoji/google/racehorse.png b/public/images/emoji/google/racehorse.png index 4d15d59b81..5837076bab 100644 Binary files a/public/images/emoji/google/racehorse.png and b/public/images/emoji/google/racehorse.png differ diff --git a/public/images/emoji/google/racing_car.png b/public/images/emoji/google/racing_car.png index efee3e6d65..e32f9c337e 100644 Binary files a/public/images/emoji/google/racing_car.png and b/public/images/emoji/google/racing_car.png differ diff --git a/public/images/emoji/google/racing_motorcycle.png b/public/images/emoji/google/racing_motorcycle.png index f665d143ef..3d25123755 100644 Binary files a/public/images/emoji/google/racing_motorcycle.png and b/public/images/emoji/google/racing_motorcycle.png differ diff --git a/public/images/emoji/google/radio.png b/public/images/emoji/google/radio.png index 57b9231d1f..bf98f638d9 100644 Binary files a/public/images/emoji/google/radio.png and b/public/images/emoji/google/radio.png differ diff --git a/public/images/emoji/google/radio_button.png b/public/images/emoji/google/radio_button.png index 24b7e14c1b..8199797be7 100644 Binary files a/public/images/emoji/google/radio_button.png and b/public/images/emoji/google/radio_button.png differ diff --git a/public/images/emoji/google/radioactive.png b/public/images/emoji/google/radioactive.png index bbac164719..5e43295588 100644 Binary files a/public/images/emoji/google/radioactive.png and b/public/images/emoji/google/radioactive.png differ diff --git a/public/images/emoji/google/radioactive_sign.png b/public/images/emoji/google/radioactive_sign.png index bbac164719..5e43295588 100644 Binary files a/public/images/emoji/google/radioactive_sign.png and b/public/images/emoji/google/radioactive_sign.png differ diff --git a/public/images/emoji/google/rage.png b/public/images/emoji/google/rage.png index b7ad83ce85..1c6a2110ed 100644 Binary files a/public/images/emoji/google/rage.png and b/public/images/emoji/google/rage.png differ diff --git a/public/images/emoji/google/railroad_track.png b/public/images/emoji/google/railroad_track.png index fc0f3211f6..71468aa045 100644 Binary files a/public/images/emoji/google/railroad_track.png and b/public/images/emoji/google/railroad_track.png differ diff --git a/public/images/emoji/google/railway_car.png b/public/images/emoji/google/railway_car.png index 47347e49db..367aec188d 100644 Binary files a/public/images/emoji/google/railway_car.png and b/public/images/emoji/google/railway_car.png differ diff --git a/public/images/emoji/google/railway_track.png b/public/images/emoji/google/railway_track.png index fc0f3211f6..71468aa045 100644 Binary files a/public/images/emoji/google/railway_track.png and b/public/images/emoji/google/railway_track.png differ diff --git a/public/images/emoji/google/rainbow.png b/public/images/emoji/google/rainbow.png index 93cda09148..7f2ed911a7 100644 Binary files a/public/images/emoji/google/rainbow.png and b/public/images/emoji/google/rainbow.png differ diff --git a/public/images/emoji/google/rainbow_flag.png b/public/images/emoji/google/rainbow_flag.png index 994f82d473..2c41b21a27 100644 Binary files a/public/images/emoji/google/rainbow_flag.png and b/public/images/emoji/google/rainbow_flag.png differ diff --git a/public/images/emoji/google/raised_back_of_hand.png b/public/images/emoji/google/raised_back_of_hand.png index 694ded58aa..ce74013d11 100644 Binary files a/public/images/emoji/google/raised_back_of_hand.png and b/public/images/emoji/google/raised_back_of_hand.png differ diff --git a/public/images/emoji/google/raised_hand.png b/public/images/emoji/google/raised_hand.png index de95a84981..3f33c9fb12 100644 Binary files a/public/images/emoji/google/raised_hand.png and b/public/images/emoji/google/raised_hand.png differ diff --git a/public/images/emoji/google/raised_hand_with_fingers_splayed.png b/public/images/emoji/google/raised_hand_with_fingers_splayed.png index 12fee02f17..6863e74761 100644 Binary files a/public/images/emoji/google/raised_hand_with_fingers_splayed.png and b/public/images/emoji/google/raised_hand_with_fingers_splayed.png differ diff --git a/public/images/emoji/google/raised_hand_with_part_between_middle_and_ring_fingers.png b/public/images/emoji/google/raised_hand_with_part_between_middle_and_ring_fingers.png index bbedc6b2dc..68de8f25e0 100644 Binary files a/public/images/emoji/google/raised_hand_with_part_between_middle_and_ring_fingers.png and b/public/images/emoji/google/raised_hand_with_part_between_middle_and_ring_fingers.png differ diff --git a/public/images/emoji/google/raised_hands.png b/public/images/emoji/google/raised_hands.png index f9dcc714d3..617d3f1289 100644 Binary files a/public/images/emoji/google/raised_hands.png and b/public/images/emoji/google/raised_hands.png differ diff --git a/public/images/emoji/google/raising_hand.png b/public/images/emoji/google/raising_hand.png index 96a4c2b148..3ef9e5586b 100644 Binary files a/public/images/emoji/google/raising_hand.png and b/public/images/emoji/google/raising_hand.png differ diff --git a/public/images/emoji/google/raising_hand_man.png b/public/images/emoji/google/raising_hand_man.png index 0d2e1c82e0..9b6335cee4 100644 Binary files a/public/images/emoji/google/raising_hand_man.png and b/public/images/emoji/google/raising_hand_man.png differ diff --git a/public/images/emoji/google/raising_hand_woman.png b/public/images/emoji/google/raising_hand_woman.png index 96a4c2b148..3ef9e5586b 100644 Binary files a/public/images/emoji/google/raising_hand_woman.png and b/public/images/emoji/google/raising_hand_woman.png differ diff --git a/public/images/emoji/google/ram.png b/public/images/emoji/google/ram.png index 9fb9628a5a..9f28ad19c5 100644 Binary files a/public/images/emoji/google/ram.png and b/public/images/emoji/google/ram.png differ diff --git a/public/images/emoji/google/ramen.png b/public/images/emoji/google/ramen.png index ae507fd1df..f87de28332 100644 Binary files a/public/images/emoji/google/ramen.png and b/public/images/emoji/google/ramen.png differ diff --git a/public/images/emoji/google/rat.png b/public/images/emoji/google/rat.png index 0dd92253dc..dc91e1aaf0 100644 Binary files a/public/images/emoji/google/rat.png and b/public/images/emoji/google/rat.png differ diff --git a/public/images/emoji/google/receipt.png b/public/images/emoji/google/receipt.png new file mode 100644 index 0000000000..55b815a38d Binary files /dev/null and b/public/images/emoji/google/receipt.png differ diff --git a/public/images/emoji/google/record_button.png b/public/images/emoji/google/record_button.png index e82b55b21b..1a6727a09a 100644 Binary files a/public/images/emoji/google/record_button.png and b/public/images/emoji/google/record_button.png differ diff --git a/public/images/emoji/google/recycle.png b/public/images/emoji/google/recycle.png index 6058f1eda6..2ce1bcd823 100644 Binary files a/public/images/emoji/google/recycle.png and b/public/images/emoji/google/recycle.png differ diff --git a/public/images/emoji/google/red_car.png b/public/images/emoji/google/red_car.png index b57c33d210..5b7424c554 100644 Binary files a/public/images/emoji/google/red_car.png and b/public/images/emoji/google/red_car.png differ diff --git a/public/images/emoji/google/red_circle.png b/public/images/emoji/google/red_circle.png index dc7cdfef39..80520a3073 100644 Binary files a/public/images/emoji/google/red_circle.png and b/public/images/emoji/google/red_circle.png differ diff --git a/public/images/emoji/google/red_gift_envelope.png b/public/images/emoji/google/red_gift_envelope.png new file mode 100644 index 0000000000..9ad2158f57 Binary files /dev/null and b/public/images/emoji/google/red_gift_envelope.png differ diff --git a/public/images/emoji/google/registered.png b/public/images/emoji/google/registered.png index 744b55c968..0e2e6d1326 100644 Binary files a/public/images/emoji/google/registered.png and b/public/images/emoji/google/registered.png differ diff --git a/public/images/emoji/google/relaxed.png b/public/images/emoji/google/relaxed.png index cb971a027e..50750ae489 100644 Binary files a/public/images/emoji/google/relaxed.png and b/public/images/emoji/google/relaxed.png differ diff --git a/public/images/emoji/google/relieved.png b/public/images/emoji/google/relieved.png index 363596dd5c..1e595645ed 100644 Binary files a/public/images/emoji/google/relieved.png and b/public/images/emoji/google/relieved.png differ diff --git a/public/images/emoji/google/reminder_ribbon.png b/public/images/emoji/google/reminder_ribbon.png index 6464fd8f7d..a57fd6c97c 100644 Binary files a/public/images/emoji/google/reminder_ribbon.png and b/public/images/emoji/google/reminder_ribbon.png differ diff --git a/public/images/emoji/google/repeat.png b/public/images/emoji/google/repeat.png index a62308dc77..00a7528087 100644 Binary files a/public/images/emoji/google/repeat.png and b/public/images/emoji/google/repeat.png differ diff --git a/public/images/emoji/google/repeat_one.png b/public/images/emoji/google/repeat_one.png index 714c35cad5..df366ab443 100644 Binary files a/public/images/emoji/google/repeat_one.png and b/public/images/emoji/google/repeat_one.png differ diff --git a/public/images/emoji/google/rescue_worker_helmet.png b/public/images/emoji/google/rescue_worker_helmet.png index 8d3d37d3ea..d992220980 100644 Binary files a/public/images/emoji/google/rescue_worker_helmet.png and b/public/images/emoji/google/rescue_worker_helmet.png differ diff --git a/public/images/emoji/google/restroom.png b/public/images/emoji/google/restroom.png index 1ffe8d0065..21e1fa860d 100644 Binary files a/public/images/emoji/google/restroom.png and b/public/images/emoji/google/restroom.png differ diff --git a/public/images/emoji/google/reunion.png b/public/images/emoji/google/reunion.png index 4faf7e252e..7ec4a82f84 100644 Binary files a/public/images/emoji/google/reunion.png and b/public/images/emoji/google/reunion.png differ diff --git a/public/images/emoji/google/reversed_hand_with_middle_finger_extended.png b/public/images/emoji/google/reversed_hand_with_middle_finger_extended.png index 71e8d8b3e9..ac5a0ef314 100644 Binary files a/public/images/emoji/google/reversed_hand_with_middle_finger_extended.png and b/public/images/emoji/google/reversed_hand_with_middle_finger_extended.png differ diff --git a/public/images/emoji/google/revolving_hearts.png b/public/images/emoji/google/revolving_hearts.png index bb76af8353..e363d4da39 100644 Binary files a/public/images/emoji/google/revolving_hearts.png and b/public/images/emoji/google/revolving_hearts.png differ diff --git a/public/images/emoji/google/rewind.png b/public/images/emoji/google/rewind.png index cd0363422b..e87e333fb7 100644 Binary files a/public/images/emoji/google/rewind.png and b/public/images/emoji/google/rewind.png differ diff --git a/public/images/emoji/google/rhinoceros.png b/public/images/emoji/google/rhinoceros.png index fbb1a76132..04d1b27fcd 100644 Binary files a/public/images/emoji/google/rhinoceros.png and b/public/images/emoji/google/rhinoceros.png differ diff --git a/public/images/emoji/google/ribbon.png b/public/images/emoji/google/ribbon.png index d67963e857..e88599bcdb 100644 Binary files a/public/images/emoji/google/ribbon.png and b/public/images/emoji/google/ribbon.png differ diff --git a/public/images/emoji/google/rice.png b/public/images/emoji/google/rice.png index 22fdceeda6..a53b7ddf8f 100644 Binary files a/public/images/emoji/google/rice.png and b/public/images/emoji/google/rice.png differ diff --git a/public/images/emoji/google/rice_ball.png b/public/images/emoji/google/rice_ball.png index 5251001691..f9e40a3968 100644 Binary files a/public/images/emoji/google/rice_ball.png and b/public/images/emoji/google/rice_ball.png differ diff --git a/public/images/emoji/google/rice_cracker.png b/public/images/emoji/google/rice_cracker.png index 73a04eaf77..b7bba8387d 100644 Binary files a/public/images/emoji/google/rice_cracker.png and b/public/images/emoji/google/rice_cracker.png differ diff --git a/public/images/emoji/google/rice_scene.png b/public/images/emoji/google/rice_scene.png index 623ca5c0db..5f86a8d8e3 100644 Binary files a/public/images/emoji/google/rice_scene.png and b/public/images/emoji/google/rice_scene.png differ diff --git a/public/images/emoji/google/right_anger_bubble.png b/public/images/emoji/google/right_anger_bubble.png index 9ba99a5b35..92f3212367 100644 Binary files a/public/images/emoji/google/right_anger_bubble.png and b/public/images/emoji/google/right_anger_bubble.png differ diff --git a/public/images/emoji/google/ring.png b/public/images/emoji/google/ring.png index e7f4193fe7..3d5badaf91 100644 Binary files a/public/images/emoji/google/ring.png and b/public/images/emoji/google/ring.png differ diff --git a/public/images/emoji/google/robot.png b/public/images/emoji/google/robot.png index efc8bfc340..31f65eb656 100644 Binary files a/public/images/emoji/google/robot.png and b/public/images/emoji/google/robot.png differ diff --git a/public/images/emoji/google/robot_face.png b/public/images/emoji/google/robot_face.png index efc8bfc340..31f65eb656 100644 Binary files a/public/images/emoji/google/robot_face.png and b/public/images/emoji/google/robot_face.png differ diff --git a/public/images/emoji/google/rocket.png b/public/images/emoji/google/rocket.png index 25c442966f..5bcf077a48 100644 Binary files a/public/images/emoji/google/rocket.png and b/public/images/emoji/google/rocket.png differ diff --git a/public/images/emoji/google/rofl.png b/public/images/emoji/google/rofl.png index 047f61002f..7a18fac8e1 100644 Binary files a/public/images/emoji/google/rofl.png and b/public/images/emoji/google/rofl.png differ diff --git a/public/images/emoji/google/roll_eyes.png b/public/images/emoji/google/roll_eyes.png index 55577e34a9..aa97ec1605 100644 Binary files a/public/images/emoji/google/roll_eyes.png and b/public/images/emoji/google/roll_eyes.png differ diff --git a/public/images/emoji/google/roll_of_toilet_paper.png b/public/images/emoji/google/roll_of_toilet_paper.png new file mode 100644 index 0000000000..cf30043aa3 Binary files /dev/null and b/public/images/emoji/google/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/google/rolled_up_newspaper.png b/public/images/emoji/google/rolled_up_newspaper.png index 3cdda353ac..f244658610 100644 Binary files a/public/images/emoji/google/rolled_up_newspaper.png and b/public/images/emoji/google/rolled_up_newspaper.png differ diff --git a/public/images/emoji/google/roller_coaster.png b/public/images/emoji/google/roller_coaster.png index 3c40783864..61caa74fff 100644 Binary files a/public/images/emoji/google/roller_coaster.png and b/public/images/emoji/google/roller_coaster.png differ diff --git a/public/images/emoji/google/rolling_eyes.png b/public/images/emoji/google/rolling_eyes.png index 55577e34a9..aa97ec1605 100644 Binary files a/public/images/emoji/google/rolling_eyes.png and b/public/images/emoji/google/rolling_eyes.png differ diff --git a/public/images/emoji/google/romania.png b/public/images/emoji/google/romania.png index 1fe9c40916..9c8171aebc 100644 Binary files a/public/images/emoji/google/romania.png and b/public/images/emoji/google/romania.png differ diff --git a/public/images/emoji/google/rooster.png b/public/images/emoji/google/rooster.png index 72917b8397..7659e33490 100644 Binary files a/public/images/emoji/google/rooster.png and b/public/images/emoji/google/rooster.png differ diff --git a/public/images/emoji/google/rose.png b/public/images/emoji/google/rose.png index aee576a9bf..46f718f7e6 100644 Binary files a/public/images/emoji/google/rose.png and b/public/images/emoji/google/rose.png differ diff --git a/public/images/emoji/google/rosette.png b/public/images/emoji/google/rosette.png index 85f9409308..08bf59a5d7 100644 Binary files a/public/images/emoji/google/rosette.png and b/public/images/emoji/google/rosette.png differ diff --git a/public/images/emoji/google/rotating_light.png b/public/images/emoji/google/rotating_light.png index 49ffae8ea7..70164551d1 100644 Binary files a/public/images/emoji/google/rotating_light.png and b/public/images/emoji/google/rotating_light.png differ diff --git a/public/images/emoji/google/round_pushpin.png b/public/images/emoji/google/round_pushpin.png index f17c6ab799..3d152ac5a2 100644 Binary files a/public/images/emoji/google/round_pushpin.png and b/public/images/emoji/google/round_pushpin.png differ diff --git a/public/images/emoji/google/rowboat.png b/public/images/emoji/google/rowboat.png index 7e8acc5441..458725cbc9 100644 Binary files a/public/images/emoji/google/rowboat.png and b/public/images/emoji/google/rowboat.png differ diff --git a/public/images/emoji/google/rowing_man.png b/public/images/emoji/google/rowing_man.png index 7e8acc5441..458725cbc9 100644 Binary files a/public/images/emoji/google/rowing_man.png and b/public/images/emoji/google/rowing_man.png differ diff --git a/public/images/emoji/google/rowing_woman.png b/public/images/emoji/google/rowing_woman.png index 03fbe7b97c..af800592af 100644 Binary files a/public/images/emoji/google/rowing_woman.png and b/public/images/emoji/google/rowing_woman.png differ diff --git a/public/images/emoji/google/ru.png b/public/images/emoji/google/ru.png index f42d2705cf..ef5efea0fa 100644 Binary files a/public/images/emoji/google/ru.png and b/public/images/emoji/google/ru.png differ diff --git a/public/images/emoji/google/rugby_football.png b/public/images/emoji/google/rugby_football.png index 0b417bd28c..ebb2edd3c0 100644 Binary files a/public/images/emoji/google/rugby_football.png and b/public/images/emoji/google/rugby_football.png differ diff --git a/public/images/emoji/google/runner.png b/public/images/emoji/google/runner.png index cc56401f9b..3e742e83f7 100644 Binary files a/public/images/emoji/google/runner.png and b/public/images/emoji/google/runner.png differ diff --git a/public/images/emoji/google/running_man.png b/public/images/emoji/google/running_man.png index cc56401f9b..3e742e83f7 100644 Binary files a/public/images/emoji/google/running_man.png and b/public/images/emoji/google/running_man.png differ diff --git a/public/images/emoji/google/running_shirt_with_sash.png b/public/images/emoji/google/running_shirt_with_sash.png index 4bd73a9354..43154ed512 100644 Binary files a/public/images/emoji/google/running_shirt_with_sash.png and b/public/images/emoji/google/running_shirt_with_sash.png differ diff --git a/public/images/emoji/google/running_woman.png b/public/images/emoji/google/running_woman.png index a8f12eae56..7b3eebd2f3 100644 Binary files a/public/images/emoji/google/running_woman.png and b/public/images/emoji/google/running_woman.png differ diff --git a/public/images/emoji/google/rwanda.png b/public/images/emoji/google/rwanda.png index 85b83fb107..ae0595c69e 100644 Binary files a/public/images/emoji/google/rwanda.png and b/public/images/emoji/google/rwanda.png differ diff --git a/public/images/emoji/google/sa.png b/public/images/emoji/google/sa.png index a6f433f3fb..9368b2743f 100644 Binary files a/public/images/emoji/google/sa.png and b/public/images/emoji/google/sa.png differ diff --git a/public/images/emoji/google/safety_pin.png b/public/images/emoji/google/safety_pin.png new file mode 100644 index 0000000000..34f7d4fbfc Binary files /dev/null and b/public/images/emoji/google/safety_pin.png differ diff --git a/public/images/emoji/google/sagittarius.png b/public/images/emoji/google/sagittarius.png index f54041679a..155c0cf3ad 100644 Binary files a/public/images/emoji/google/sagittarius.png and b/public/images/emoji/google/sagittarius.png differ diff --git a/public/images/emoji/google/sailboat.png b/public/images/emoji/google/sailboat.png index e80c768d22..2febecbb50 100644 Binary files a/public/images/emoji/google/sailboat.png and b/public/images/emoji/google/sailboat.png differ diff --git a/public/images/emoji/google/sake.png b/public/images/emoji/google/sake.png index 525fa28751..05b30e306c 100644 Binary files a/public/images/emoji/google/sake.png and b/public/images/emoji/google/sake.png differ diff --git a/public/images/emoji/google/salt.png b/public/images/emoji/google/salt.png new file mode 100644 index 0000000000..f588217abc Binary files /dev/null and b/public/images/emoji/google/salt.png differ diff --git a/public/images/emoji/google/samoa.png b/public/images/emoji/google/samoa.png index 34ebac1110..750dbf8326 100644 Binary files a/public/images/emoji/google/samoa.png and b/public/images/emoji/google/samoa.png differ diff --git a/public/images/emoji/google/san_marino.png b/public/images/emoji/google/san_marino.png index d5f8895dd6..dfb5587788 100644 Binary files a/public/images/emoji/google/san_marino.png and b/public/images/emoji/google/san_marino.png differ diff --git a/public/images/emoji/google/sandal.png b/public/images/emoji/google/sandal.png index 809f5f3fd4..07921719d8 100644 Binary files a/public/images/emoji/google/sandal.png and b/public/images/emoji/google/sandal.png differ diff --git a/public/images/emoji/google/sandwich.png b/public/images/emoji/google/sandwich.png index e602240b1e..6b87ac641b 100644 Binary files a/public/images/emoji/google/sandwich.png and b/public/images/emoji/google/sandwich.png differ diff --git a/public/images/emoji/google/santa.png b/public/images/emoji/google/santa.png index 85a8bed419..644ea245b9 100644 Binary files a/public/images/emoji/google/santa.png and b/public/images/emoji/google/santa.png differ diff --git a/public/images/emoji/google/sao_tome_principe.png b/public/images/emoji/google/sao_tome_principe.png index 6cda2118f9..5506d19e60 100644 Binary files a/public/images/emoji/google/sao_tome_principe.png and b/public/images/emoji/google/sao_tome_principe.png differ diff --git a/public/images/emoji/google/satellite.png b/public/images/emoji/google/satellite.png index c529409ae3..6f18698e40 100644 Binary files a/public/images/emoji/google/satellite.png and b/public/images/emoji/google/satellite.png differ diff --git a/public/images/emoji/google/satellite_orbital.png b/public/images/emoji/google/satellite_orbital.png index 8f60cf4fc4..abffa9442b 100644 Binary files a/public/images/emoji/google/satellite_orbital.png and b/public/images/emoji/google/satellite_orbital.png differ diff --git a/public/images/emoji/google/satisfied.png b/public/images/emoji/google/satisfied.png index 2fdeacfbbc..ec03b4cd0f 100644 Binary files a/public/images/emoji/google/satisfied.png and b/public/images/emoji/google/satisfied.png differ diff --git a/public/images/emoji/google/saudi_arabia.png b/public/images/emoji/google/saudi_arabia.png index 62a83e09cc..3dcceb68d7 100644 Binary files a/public/images/emoji/google/saudi_arabia.png and b/public/images/emoji/google/saudi_arabia.png differ diff --git a/public/images/emoji/google/sauropod.png b/public/images/emoji/google/sauropod.png index 12b0a2f966..c8409094ab 100644 Binary files a/public/images/emoji/google/sauropod.png and b/public/images/emoji/google/sauropod.png differ diff --git a/public/images/emoji/google/saxophone.png b/public/images/emoji/google/saxophone.png index 60d7d1917a..72f82fd9d9 100644 Binary files a/public/images/emoji/google/saxophone.png and b/public/images/emoji/google/saxophone.png differ diff --git a/public/images/emoji/google/scales.png b/public/images/emoji/google/scales.png index 179fce7257..2ae2e3fd16 100644 Binary files a/public/images/emoji/google/scales.png and b/public/images/emoji/google/scales.png differ diff --git a/public/images/emoji/google/scarf.png b/public/images/emoji/google/scarf.png index 87f561fc75..a89518f8c6 100644 Binary files a/public/images/emoji/google/scarf.png and b/public/images/emoji/google/scarf.png differ diff --git a/public/images/emoji/google/school.png b/public/images/emoji/google/school.png index 0f166fd45d..fcc40834e5 100644 Binary files a/public/images/emoji/google/school.png and b/public/images/emoji/google/school.png differ diff --git a/public/images/emoji/google/school_satchel.png b/public/images/emoji/google/school_satchel.png index 72303930de..370b4c242f 100644 Binary files a/public/images/emoji/google/school_satchel.png and b/public/images/emoji/google/school_satchel.png differ diff --git a/public/images/emoji/google/scissors.png b/public/images/emoji/google/scissors.png index 10ace8ca7b..9af9370b97 100644 Binary files a/public/images/emoji/google/scissors.png and b/public/images/emoji/google/scissors.png differ diff --git a/public/images/emoji/google/scorpion.png b/public/images/emoji/google/scorpion.png index 0535591749..ac1892cb01 100644 Binary files a/public/images/emoji/google/scorpion.png and b/public/images/emoji/google/scorpion.png differ diff --git a/public/images/emoji/google/scorpius.png b/public/images/emoji/google/scorpius.png index af75a5b21b..40807eaae8 100644 Binary files a/public/images/emoji/google/scorpius.png and b/public/images/emoji/google/scorpius.png differ diff --git a/public/images/emoji/google/scream.png b/public/images/emoji/google/scream.png index 48b3623476..2176132e2e 100644 Binary files a/public/images/emoji/google/scream.png and b/public/images/emoji/google/scream.png differ diff --git a/public/images/emoji/google/scream_cat.png b/public/images/emoji/google/scream_cat.png index a4d252e85d..32f198da87 100644 Binary files a/public/images/emoji/google/scream_cat.png and b/public/images/emoji/google/scream_cat.png differ diff --git a/public/images/emoji/google/scroll.png b/public/images/emoji/google/scroll.png index 94d259b5c9..496a017c79 100644 Binary files a/public/images/emoji/google/scroll.png and b/public/images/emoji/google/scroll.png differ diff --git a/public/images/emoji/google/seat.png b/public/images/emoji/google/seat.png index 5884684762..97d7abaedb 100644 Binary files a/public/images/emoji/google/seat.png and b/public/images/emoji/google/seat.png differ diff --git a/public/images/emoji/google/secret.png b/public/images/emoji/google/secret.png index 624efa4bc6..6eec3d848d 100644 Binary files a/public/images/emoji/google/secret.png and b/public/images/emoji/google/secret.png differ diff --git a/public/images/emoji/google/see_no_evil.png b/public/images/emoji/google/see_no_evil.png index 0e2efd450d..36f670bbd2 100644 Binary files a/public/images/emoji/google/see_no_evil.png and b/public/images/emoji/google/see_no_evil.png differ diff --git a/public/images/emoji/google/seedling.png b/public/images/emoji/google/seedling.png index 76962e8252..02a3fc07bc 100644 Binary files a/public/images/emoji/google/seedling.png and b/public/images/emoji/google/seedling.png differ diff --git a/public/images/emoji/google/selfie.png b/public/images/emoji/google/selfie.png index d8a2434235..bb88e2ea10 100644 Binary files a/public/images/emoji/google/selfie.png and b/public/images/emoji/google/selfie.png differ diff --git a/public/images/emoji/google/senegal.png b/public/images/emoji/google/senegal.png index e6421d59ed..20d38c8f0d 100644 Binary files a/public/images/emoji/google/senegal.png and b/public/images/emoji/google/senegal.png differ diff --git a/public/images/emoji/google/serbia.png b/public/images/emoji/google/serbia.png index c7f08aabf6..e1508c950f 100644 Binary files a/public/images/emoji/google/serbia.png and b/public/images/emoji/google/serbia.png differ diff --git a/public/images/emoji/google/seven.png b/public/images/emoji/google/seven.png index dc175f1243..167a80d9d5 100644 Binary files a/public/images/emoji/google/seven.png and b/public/images/emoji/google/seven.png differ diff --git a/public/images/emoji/google/seychelles.png b/public/images/emoji/google/seychelles.png index 1974c8861b..deef9637f2 100644 Binary files a/public/images/emoji/google/seychelles.png and b/public/images/emoji/google/seychelles.png differ diff --git a/public/images/emoji/google/shallow_pan_of_food.png b/public/images/emoji/google/shallow_pan_of_food.png index b25a76c85d..2255b476e3 100644 Binary files a/public/images/emoji/google/shallow_pan_of_food.png and b/public/images/emoji/google/shallow_pan_of_food.png differ diff --git a/public/images/emoji/google/shamrock.png b/public/images/emoji/google/shamrock.png index e0fb96fcc4..e095a0bc94 100644 Binary files a/public/images/emoji/google/shamrock.png and b/public/images/emoji/google/shamrock.png differ diff --git a/public/images/emoji/google/shark.png b/public/images/emoji/google/shark.png index 7df57eff4c..3d22bda761 100644 Binary files a/public/images/emoji/google/shark.png and b/public/images/emoji/google/shark.png differ diff --git a/public/images/emoji/google/shaved_ice.png b/public/images/emoji/google/shaved_ice.png index c08647fe44..5aae862bf7 100644 Binary files a/public/images/emoji/google/shaved_ice.png and b/public/images/emoji/google/shaved_ice.png differ diff --git a/public/images/emoji/google/sheep.png b/public/images/emoji/google/sheep.png index 62e783dadd..5fd56ac96d 100644 Binary files a/public/images/emoji/google/sheep.png and b/public/images/emoji/google/sheep.png differ diff --git a/public/images/emoji/google/shell.png b/public/images/emoji/google/shell.png index 5c3d10c973..8c4417bfa8 100644 Binary files a/public/images/emoji/google/shell.png and b/public/images/emoji/google/shell.png differ diff --git a/public/images/emoji/google/shield.png b/public/images/emoji/google/shield.png index 050fe14fc5..e9b73470bc 100644 Binary files a/public/images/emoji/google/shield.png and b/public/images/emoji/google/shield.png differ diff --git a/public/images/emoji/google/shinto_shrine.png b/public/images/emoji/google/shinto_shrine.png index a226f5947e..d12bb5a914 100644 Binary files a/public/images/emoji/google/shinto_shrine.png and b/public/images/emoji/google/shinto_shrine.png differ diff --git a/public/images/emoji/google/ship.png b/public/images/emoji/google/ship.png index 82a74d1180..6736fd96b0 100644 Binary files a/public/images/emoji/google/ship.png and b/public/images/emoji/google/ship.png differ diff --git a/public/images/emoji/google/shirt.png b/public/images/emoji/google/shirt.png index d93268cc4e..dcb4c613a0 100644 Binary files a/public/images/emoji/google/shirt.png and b/public/images/emoji/google/shirt.png differ diff --git a/public/images/emoji/google/shit.png b/public/images/emoji/google/shit.png index de476df01c..2d0740a6d5 100644 Binary files a/public/images/emoji/google/shit.png and b/public/images/emoji/google/shit.png differ diff --git a/public/images/emoji/google/shopping.png b/public/images/emoji/google/shopping.png index 4d0d5bfe2b..c92d4cc274 100644 Binary files a/public/images/emoji/google/shopping.png and b/public/images/emoji/google/shopping.png differ diff --git a/public/images/emoji/google/shopping_bags.png b/public/images/emoji/google/shopping_bags.png index 4d0d5bfe2b..c92d4cc274 100644 Binary files a/public/images/emoji/google/shopping_bags.png and b/public/images/emoji/google/shopping_bags.png differ diff --git a/public/images/emoji/google/shopping_cart.png b/public/images/emoji/google/shopping_cart.png index 37fdb5ac23..a90834ccac 100644 Binary files a/public/images/emoji/google/shopping_cart.png and b/public/images/emoji/google/shopping_cart.png differ diff --git a/public/images/emoji/google/shower.png b/public/images/emoji/google/shower.png index 5036bfeb13..22cb066e09 100644 Binary files a/public/images/emoji/google/shower.png and b/public/images/emoji/google/shower.png differ diff --git a/public/images/emoji/google/shrimp.png b/public/images/emoji/google/shrimp.png index 9f20fcf1d7..a60356e65f 100644 Binary files a/public/images/emoji/google/shrimp.png and b/public/images/emoji/google/shrimp.png differ diff --git a/public/images/emoji/google/shushing_face.png b/public/images/emoji/google/shushing_face.png index 80a058d518..1287f8bc04 100644 Binary files a/public/images/emoji/google/shushing_face.png and b/public/images/emoji/google/shushing_face.png differ diff --git a/public/images/emoji/google/sierra_leone.png b/public/images/emoji/google/sierra_leone.png index 309f4e3387..1569b84d94 100644 Binary files a/public/images/emoji/google/sierra_leone.png and b/public/images/emoji/google/sierra_leone.png differ diff --git a/public/images/emoji/google/sign_of_the_horns.png b/public/images/emoji/google/sign_of_the_horns.png index 8d868d12d5..b2c275a1c3 100644 Binary files a/public/images/emoji/google/sign_of_the_horns.png and b/public/images/emoji/google/sign_of_the_horns.png differ diff --git a/public/images/emoji/google/signal_strength.png b/public/images/emoji/google/signal_strength.png index 80c8853889..1973229701 100644 Binary files a/public/images/emoji/google/signal_strength.png and b/public/images/emoji/google/signal_strength.png differ diff --git a/public/images/emoji/google/singapore.png b/public/images/emoji/google/singapore.png index 184f6b243d..d2b2265988 100644 Binary files a/public/images/emoji/google/singapore.png and b/public/images/emoji/google/singapore.png differ diff --git a/public/images/emoji/google/sint_maarten.png b/public/images/emoji/google/sint_maarten.png index a7e338f025..bf63ac3d60 100644 Binary files a/public/images/emoji/google/sint_maarten.png and b/public/images/emoji/google/sint_maarten.png differ diff --git a/public/images/emoji/google/six.png b/public/images/emoji/google/six.png index a88e7401fb..401a97419c 100644 Binary files a/public/images/emoji/google/six.png and b/public/images/emoji/google/six.png differ diff --git a/public/images/emoji/google/six_pointed_star.png b/public/images/emoji/google/six_pointed_star.png index 83f018d0e4..7e32cb6bf0 100644 Binary files a/public/images/emoji/google/six_pointed_star.png and b/public/images/emoji/google/six_pointed_star.png differ diff --git a/public/images/emoji/google/skateboard.png b/public/images/emoji/google/skateboard.png new file mode 100644 index 0000000000..6858a5b796 Binary files /dev/null and b/public/images/emoji/google/skateboard.png differ diff --git a/public/images/emoji/google/skeleton.png b/public/images/emoji/google/skeleton.png index 569ca61771..e66bcaa140 100644 Binary files a/public/images/emoji/google/skeleton.png and b/public/images/emoji/google/skeleton.png differ diff --git a/public/images/emoji/google/ski.png b/public/images/emoji/google/ski.png index 7791a0ff97..c7d0ed846f 100644 Binary files a/public/images/emoji/google/ski.png and b/public/images/emoji/google/ski.png differ diff --git a/public/images/emoji/google/skier.png b/public/images/emoji/google/skier.png index ff1e017863..113c05d56e 100644 Binary files a/public/images/emoji/google/skier.png and b/public/images/emoji/google/skier.png differ diff --git a/public/images/emoji/google/skull.png b/public/images/emoji/google/skull.png index 569ca61771..e66bcaa140 100644 Binary files a/public/images/emoji/google/skull.png and b/public/images/emoji/google/skull.png differ diff --git a/public/images/emoji/google/skull_and_crossbones.png b/public/images/emoji/google/skull_and_crossbones.png index 4a4dccb02f..0e8e710b0c 100644 Binary files a/public/images/emoji/google/skull_and_crossbones.png and b/public/images/emoji/google/skull_and_crossbones.png differ diff --git a/public/images/emoji/google/skull_crossbones.png b/public/images/emoji/google/skull_crossbones.png index 4a4dccb02f..0e8e710b0c 100644 Binary files a/public/images/emoji/google/skull_crossbones.png and b/public/images/emoji/google/skull_crossbones.png differ diff --git a/public/images/emoji/google/sled.png b/public/images/emoji/google/sled.png index 60a1a502e9..8d60815103 100644 Binary files a/public/images/emoji/google/sled.png and b/public/images/emoji/google/sled.png differ diff --git a/public/images/emoji/google/sleeping.png b/public/images/emoji/google/sleeping.png index 2a5ff936b9..30c67d4177 100644 Binary files a/public/images/emoji/google/sleeping.png and b/public/images/emoji/google/sleeping.png differ diff --git a/public/images/emoji/google/sleeping_accommodation.png b/public/images/emoji/google/sleeping_accommodation.png index be40bf9c43..034dac40c0 100644 Binary files a/public/images/emoji/google/sleeping_accommodation.png and b/public/images/emoji/google/sleeping_accommodation.png differ diff --git a/public/images/emoji/google/sleeping_bed.png b/public/images/emoji/google/sleeping_bed.png index be40bf9c43..034dac40c0 100644 Binary files a/public/images/emoji/google/sleeping_bed.png and b/public/images/emoji/google/sleeping_bed.png differ diff --git a/public/images/emoji/google/sleepy.png b/public/images/emoji/google/sleepy.png index 0c8a806699..9f245d7e31 100644 Binary files a/public/images/emoji/google/sleepy.png and b/public/images/emoji/google/sleepy.png differ diff --git a/public/images/emoji/google/sleuth_or_spy.png b/public/images/emoji/google/sleuth_or_spy.png index cee46f4861..f7b30f9bed 100644 Binary files a/public/images/emoji/google/sleuth_or_spy.png and b/public/images/emoji/google/sleuth_or_spy.png differ diff --git a/public/images/emoji/google/slight_frown.png b/public/images/emoji/google/slight_frown.png index 5cf676c797..69e1cea25d 100644 Binary files a/public/images/emoji/google/slight_frown.png and b/public/images/emoji/google/slight_frown.png differ diff --git a/public/images/emoji/google/slight_smile.png b/public/images/emoji/google/slight_smile.png index 7689ff0d4f..1ee0bb88af 100644 Binary files a/public/images/emoji/google/slight_smile.png and b/public/images/emoji/google/slight_smile.png differ diff --git a/public/images/emoji/google/slightly_frowning_face.png b/public/images/emoji/google/slightly_frowning_face.png index 5cf676c797..69e1cea25d 100644 Binary files a/public/images/emoji/google/slightly_frowning_face.png and b/public/images/emoji/google/slightly_frowning_face.png differ diff --git a/public/images/emoji/google/slightly_smiling.png b/public/images/emoji/google/slightly_smiling.png index 7689ff0d4f..1ee0bb88af 100644 Binary files a/public/images/emoji/google/slightly_smiling.png and b/public/images/emoji/google/slightly_smiling.png differ diff --git a/public/images/emoji/google/slightly_smiling_face.png b/public/images/emoji/google/slightly_smiling_face.png index 7689ff0d4f..1ee0bb88af 100644 Binary files a/public/images/emoji/google/slightly_smiling_face.png and b/public/images/emoji/google/slightly_smiling_face.png differ diff --git a/public/images/emoji/google/slot_machine.png b/public/images/emoji/google/slot_machine.png index bb8f1a9ab7..d84cc7fc10 100644 Binary files a/public/images/emoji/google/slot_machine.png and b/public/images/emoji/google/slot_machine.png differ diff --git a/public/images/emoji/google/slovakia.png b/public/images/emoji/google/slovakia.png index ee2249e809..bee49abe89 100644 Binary files a/public/images/emoji/google/slovakia.png and b/public/images/emoji/google/slovakia.png differ diff --git a/public/images/emoji/google/slovenia.png b/public/images/emoji/google/slovenia.png index 3972876b0a..fb0ebda30d 100644 Binary files a/public/images/emoji/google/slovenia.png and b/public/images/emoji/google/slovenia.png differ diff --git a/public/images/emoji/google/small_airplane.png b/public/images/emoji/google/small_airplane.png index 1a44e4a7d1..5e589b26d6 100644 Binary files a/public/images/emoji/google/small_airplane.png and b/public/images/emoji/google/small_airplane.png differ diff --git a/public/images/emoji/google/small_blue_diamond.png b/public/images/emoji/google/small_blue_diamond.png index 40e9b333b6..e5e7fd9b03 100644 Binary files a/public/images/emoji/google/small_blue_diamond.png and b/public/images/emoji/google/small_blue_diamond.png differ diff --git a/public/images/emoji/google/small_orange_diamond.png b/public/images/emoji/google/small_orange_diamond.png index 1e46d414ba..67df5bd09b 100644 Binary files a/public/images/emoji/google/small_orange_diamond.png and b/public/images/emoji/google/small_orange_diamond.png differ diff --git a/public/images/emoji/google/small_red_triangle.png b/public/images/emoji/google/small_red_triangle.png index e9ed94ddce..6849ca5358 100644 Binary files a/public/images/emoji/google/small_red_triangle.png and b/public/images/emoji/google/small_red_triangle.png differ diff --git a/public/images/emoji/google/small_red_triangle_down.png b/public/images/emoji/google/small_red_triangle_down.png index e1265da028..bfc30b9a82 100644 Binary files a/public/images/emoji/google/small_red_triangle_down.png and b/public/images/emoji/google/small_red_triangle_down.png differ diff --git a/public/images/emoji/google/smile.png b/public/images/emoji/google/smile.png index 6a936c2137..79555b8924 100644 Binary files a/public/images/emoji/google/smile.png and b/public/images/emoji/google/smile.png differ diff --git a/public/images/emoji/google/smile_cat.png b/public/images/emoji/google/smile_cat.png index 5fb633152c..ce985a130a 100644 Binary files a/public/images/emoji/google/smile_cat.png and b/public/images/emoji/google/smile_cat.png differ diff --git a/public/images/emoji/google/smiley.png b/public/images/emoji/google/smiley.png index eed981022c..d494267589 100644 Binary files a/public/images/emoji/google/smiley.png and b/public/images/emoji/google/smiley.png differ diff --git a/public/images/emoji/google/smiley_cat.png b/public/images/emoji/google/smiley_cat.png index ad018ba4a4..a0b71e6918 100644 Binary files a/public/images/emoji/google/smiley_cat.png and b/public/images/emoji/google/smiley_cat.png differ diff --git a/public/images/emoji/google/smiling_face_with_three_hearts.png b/public/images/emoji/google/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..b62a5a29db Binary files /dev/null and b/public/images/emoji/google/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/google/smiling_imp.png b/public/images/emoji/google/smiling_imp.png index f5b64b98d0..7feb516995 100644 Binary files a/public/images/emoji/google/smiling_imp.png and b/public/images/emoji/google/smiling_imp.png differ diff --git a/public/images/emoji/google/smirk.png b/public/images/emoji/google/smirk.png index 61c0475431..3182349670 100644 Binary files a/public/images/emoji/google/smirk.png and b/public/images/emoji/google/smirk.png differ diff --git a/public/images/emoji/google/smirk_cat.png b/public/images/emoji/google/smirk_cat.png index c3b8c295f4..98c4a3f466 100644 Binary files a/public/images/emoji/google/smirk_cat.png and b/public/images/emoji/google/smirk_cat.png differ diff --git a/public/images/emoji/google/smoking.png b/public/images/emoji/google/smoking.png index d91ab4e697..1227907b17 100644 Binary files a/public/images/emoji/google/smoking.png and b/public/images/emoji/google/smoking.png differ diff --git a/public/images/emoji/google/snail.png b/public/images/emoji/google/snail.png index bb4fa4ebe5..f215b89ea4 100644 Binary files a/public/images/emoji/google/snail.png and b/public/images/emoji/google/snail.png differ diff --git a/public/images/emoji/google/snake.png b/public/images/emoji/google/snake.png index e17372a161..31d4451c70 100644 Binary files a/public/images/emoji/google/snake.png and b/public/images/emoji/google/snake.png differ diff --git a/public/images/emoji/google/sneezing_face.png b/public/images/emoji/google/sneezing_face.png index b14d1a3ec7..1832dc20c8 100644 Binary files a/public/images/emoji/google/sneezing_face.png and b/public/images/emoji/google/sneezing_face.png differ diff --git a/public/images/emoji/google/snow_capped_mountain.png b/public/images/emoji/google/snow_capped_mountain.png index 394c96bb61..7bcc70e4e9 100644 Binary files a/public/images/emoji/google/snow_capped_mountain.png and b/public/images/emoji/google/snow_capped_mountain.png differ diff --git a/public/images/emoji/google/snowboarder.png b/public/images/emoji/google/snowboarder.png index 31d43ca744..8cda830315 100644 Binary files a/public/images/emoji/google/snowboarder.png and b/public/images/emoji/google/snowboarder.png differ diff --git a/public/images/emoji/google/snowflake.png b/public/images/emoji/google/snowflake.png index 1b1101c81c..c0c6015371 100644 Binary files a/public/images/emoji/google/snowflake.png and b/public/images/emoji/google/snowflake.png differ diff --git a/public/images/emoji/google/snowman.png b/public/images/emoji/google/snowman.png index b619f10252..c0e8233733 100644 Binary files a/public/images/emoji/google/snowman.png and b/public/images/emoji/google/snowman.png differ diff --git a/public/images/emoji/google/snowman2.png b/public/images/emoji/google/snowman2.png index a013b61937..c4e0ae7f6e 100644 Binary files a/public/images/emoji/google/snowman2.png and b/public/images/emoji/google/snowman2.png differ diff --git a/public/images/emoji/google/snowman_with_snow.png b/public/images/emoji/google/snowman_with_snow.png index a013b61937..c4e0ae7f6e 100644 Binary files a/public/images/emoji/google/snowman_with_snow.png and b/public/images/emoji/google/snowman_with_snow.png differ diff --git a/public/images/emoji/google/soap.png b/public/images/emoji/google/soap.png new file mode 100644 index 0000000000..055e6d771f Binary files /dev/null and b/public/images/emoji/google/soap.png differ diff --git a/public/images/emoji/google/sob.png b/public/images/emoji/google/sob.png index 9de97eb13f..54764fee34 100644 Binary files a/public/images/emoji/google/sob.png and b/public/images/emoji/google/sob.png differ diff --git a/public/images/emoji/google/soccer.png b/public/images/emoji/google/soccer.png index 60f7c6c99a..b9a69d68cc 100644 Binary files a/public/images/emoji/google/soccer.png and b/public/images/emoji/google/soccer.png differ diff --git a/public/images/emoji/google/socks.png b/public/images/emoji/google/socks.png index 6916b59ea5..62ed231fff 100644 Binary files a/public/images/emoji/google/socks.png and b/public/images/emoji/google/socks.png differ diff --git a/public/images/emoji/google/softball.png b/public/images/emoji/google/softball.png new file mode 100644 index 0000000000..a6ba6a0546 Binary files /dev/null and b/public/images/emoji/google/softball.png differ diff --git a/public/images/emoji/google/solomon_islands.png b/public/images/emoji/google/solomon_islands.png index 72e3631644..f8dd5b7c68 100644 Binary files a/public/images/emoji/google/solomon_islands.png and b/public/images/emoji/google/solomon_islands.png differ diff --git a/public/images/emoji/google/somalia.png b/public/images/emoji/google/somalia.png index 9e24767dde..73f1913999 100644 Binary files a/public/images/emoji/google/somalia.png and b/public/images/emoji/google/somalia.png differ diff --git a/public/images/emoji/google/soon.png b/public/images/emoji/google/soon.png index 4c4a7befe3..10de6fde36 100644 Binary files a/public/images/emoji/google/soon.png and b/public/images/emoji/google/soon.png differ diff --git a/public/images/emoji/google/sos.png b/public/images/emoji/google/sos.png index 87ec93daa9..125fcb573a 100644 Binary files a/public/images/emoji/google/sos.png and b/public/images/emoji/google/sos.png differ diff --git a/public/images/emoji/google/sound.png b/public/images/emoji/google/sound.png index fd28f9552c..a91129882e 100644 Binary files a/public/images/emoji/google/sound.png and b/public/images/emoji/google/sound.png differ diff --git a/public/images/emoji/google/south_africa.png b/public/images/emoji/google/south_africa.png index 4651afef50..249ef5f3d6 100644 Binary files a/public/images/emoji/google/south_africa.png and b/public/images/emoji/google/south_africa.png differ diff --git a/public/images/emoji/google/south_georgia_south_sandwich_islands.png b/public/images/emoji/google/south_georgia_south_sandwich_islands.png index 4faf7e252e..5f89ca8629 100644 Binary files a/public/images/emoji/google/south_georgia_south_sandwich_islands.png and b/public/images/emoji/google/south_georgia_south_sandwich_islands.png differ diff --git a/public/images/emoji/google/south_sudan.png b/public/images/emoji/google/south_sudan.png index 2b5eec6f83..37e3aa1842 100644 Binary files a/public/images/emoji/google/south_sudan.png and b/public/images/emoji/google/south_sudan.png differ diff --git a/public/images/emoji/google/space_invader.png b/public/images/emoji/google/space_invader.png index bb7ab9d328..205543141f 100644 Binary files a/public/images/emoji/google/space_invader.png and b/public/images/emoji/google/space_invader.png differ diff --git a/public/images/emoji/google/spades.png b/public/images/emoji/google/spades.png index c431765c1b..8c0fb7e40e 100644 Binary files a/public/images/emoji/google/spades.png and b/public/images/emoji/google/spades.png differ diff --git a/public/images/emoji/google/spaghetti.png b/public/images/emoji/google/spaghetti.png index 8ac16a61e6..f24935a301 100644 Binary files a/public/images/emoji/google/spaghetti.png and b/public/images/emoji/google/spaghetti.png differ diff --git a/public/images/emoji/google/sparkle.png b/public/images/emoji/google/sparkle.png index 1cd76f241c..f9e975a5c5 100644 Binary files a/public/images/emoji/google/sparkle.png and b/public/images/emoji/google/sparkle.png differ diff --git a/public/images/emoji/google/sparkler.png b/public/images/emoji/google/sparkler.png index 5d6b45741f..6e2b60de22 100644 Binary files a/public/images/emoji/google/sparkler.png and b/public/images/emoji/google/sparkler.png differ diff --git a/public/images/emoji/google/sparkles.png b/public/images/emoji/google/sparkles.png index f24a561af9..4505d558f9 100644 Binary files a/public/images/emoji/google/sparkles.png and b/public/images/emoji/google/sparkles.png differ diff --git a/public/images/emoji/google/sparkling_heart.png b/public/images/emoji/google/sparkling_heart.png index b8fa996c0f..dfaae6c01c 100644 Binary files a/public/images/emoji/google/sparkling_heart.png and b/public/images/emoji/google/sparkling_heart.png differ diff --git a/public/images/emoji/google/speak_no_evil.png b/public/images/emoji/google/speak_no_evil.png index b693b6d5d6..aeaf767ac4 100644 Binary files a/public/images/emoji/google/speak_no_evil.png and b/public/images/emoji/google/speak_no_evil.png differ diff --git a/public/images/emoji/google/speaker.png b/public/images/emoji/google/speaker.png index 717ac0b814..94a4b3064c 100644 Binary files a/public/images/emoji/google/speaker.png and b/public/images/emoji/google/speaker.png differ diff --git a/public/images/emoji/google/speaking_head.png b/public/images/emoji/google/speaking_head.png index e59ef7c3d6..8bbf33bb7f 100644 Binary files a/public/images/emoji/google/speaking_head.png and b/public/images/emoji/google/speaking_head.png differ diff --git a/public/images/emoji/google/speaking_head_in_silhouette.png b/public/images/emoji/google/speaking_head_in_silhouette.png index e59ef7c3d6..8bbf33bb7f 100644 Binary files a/public/images/emoji/google/speaking_head_in_silhouette.png and b/public/images/emoji/google/speaking_head_in_silhouette.png differ diff --git a/public/images/emoji/google/speech_balloon.png b/public/images/emoji/google/speech_balloon.png index aa4c10145a..4aba747028 100644 Binary files a/public/images/emoji/google/speech_balloon.png and b/public/images/emoji/google/speech_balloon.png differ diff --git a/public/images/emoji/google/speedboat.png b/public/images/emoji/google/speedboat.png index 9141b21d1b..407e7d9b76 100644 Binary files a/public/images/emoji/google/speedboat.png and b/public/images/emoji/google/speedboat.png differ diff --git a/public/images/emoji/google/spider.png b/public/images/emoji/google/spider.png index dda421e407..f9621280c1 100644 Binary files a/public/images/emoji/google/spider.png and b/public/images/emoji/google/spider.png differ diff --git a/public/images/emoji/google/spider_web.png b/public/images/emoji/google/spider_web.png index ee898cd60e..97ab8d6c53 100644 Binary files a/public/images/emoji/google/spider_web.png and b/public/images/emoji/google/spider_web.png differ diff --git a/public/images/emoji/google/spiral_calendar.png b/public/images/emoji/google/spiral_calendar.png index 8c19dc8104..874dcdb819 100644 Binary files a/public/images/emoji/google/spiral_calendar.png and b/public/images/emoji/google/spiral_calendar.png differ diff --git a/public/images/emoji/google/spiral_calendar_pad.png b/public/images/emoji/google/spiral_calendar_pad.png index 8c19dc8104..874dcdb819 100644 Binary files a/public/images/emoji/google/spiral_calendar_pad.png and b/public/images/emoji/google/spiral_calendar_pad.png differ diff --git a/public/images/emoji/google/spiral_note_pad.png b/public/images/emoji/google/spiral_note_pad.png index 72e515dc60..39166b1333 100644 Binary files a/public/images/emoji/google/spiral_note_pad.png and b/public/images/emoji/google/spiral_note_pad.png differ diff --git a/public/images/emoji/google/spiral_notepad.png b/public/images/emoji/google/spiral_notepad.png index 72e515dc60..39166b1333 100644 Binary files a/public/images/emoji/google/spiral_notepad.png and b/public/images/emoji/google/spiral_notepad.png differ diff --git a/public/images/emoji/google/sponge.png b/public/images/emoji/google/sponge.png new file mode 100644 index 0000000000..f19997fb20 Binary files /dev/null and b/public/images/emoji/google/sponge.png differ diff --git a/public/images/emoji/google/spoon.png b/public/images/emoji/google/spoon.png index 2cb2c2fb31..6ba43da533 100644 Binary files a/public/images/emoji/google/spoon.png and b/public/images/emoji/google/spoon.png differ diff --git a/public/images/emoji/google/sports_medal.png b/public/images/emoji/google/sports_medal.png index 2ff8d191cb..1d01f5767a 100644 Binary files a/public/images/emoji/google/sports_medal.png and b/public/images/emoji/google/sports_medal.png differ diff --git a/public/images/emoji/google/spy.png b/public/images/emoji/google/spy.png index cee46f4861..f7b30f9bed 100644 Binary files a/public/images/emoji/google/spy.png and b/public/images/emoji/google/spy.png differ diff --git a/public/images/emoji/google/squid.png b/public/images/emoji/google/squid.png index 62b19a17eb..609da8b4ef 100644 Binary files a/public/images/emoji/google/squid.png and b/public/images/emoji/google/squid.png differ diff --git a/public/images/emoji/google/sri_lanka.png b/public/images/emoji/google/sri_lanka.png index 9ebcd7343f..6683ed543e 100644 Binary files a/public/images/emoji/google/sri_lanka.png and b/public/images/emoji/google/sri_lanka.png differ diff --git a/public/images/emoji/google/st_barthelemy.png b/public/images/emoji/google/st_barthelemy.png index 4faf7e252e..7ec4a82f84 100644 Binary files a/public/images/emoji/google/st_barthelemy.png and b/public/images/emoji/google/st_barthelemy.png differ diff --git a/public/images/emoji/google/st_helena.png b/public/images/emoji/google/st_helena.png index 1826670769..c7e22bed5f 100644 Binary files a/public/images/emoji/google/st_helena.png and b/public/images/emoji/google/st_helena.png differ diff --git a/public/images/emoji/google/st_kitts_nevis.png b/public/images/emoji/google/st_kitts_nevis.png index 0fa2a78ac5..2cae7a4fa8 100644 Binary files a/public/images/emoji/google/st_kitts_nevis.png and b/public/images/emoji/google/st_kitts_nevis.png differ diff --git a/public/images/emoji/google/st_lucia.png b/public/images/emoji/google/st_lucia.png index d1620548fb..c89d04f0c7 100644 Binary files a/public/images/emoji/google/st_lucia.png and b/public/images/emoji/google/st_lucia.png differ diff --git a/public/images/emoji/google/st_martin.png b/public/images/emoji/google/st_martin.png index 4faf7e252e..87b859be73 100644 Binary files a/public/images/emoji/google/st_martin.png and b/public/images/emoji/google/st_martin.png differ diff --git a/public/images/emoji/google/st_pierre_miquelon.png b/public/images/emoji/google/st_pierre_miquelon.png index 4faf7e252e..d089b4b1b1 100644 Binary files a/public/images/emoji/google/st_pierre_miquelon.png and b/public/images/emoji/google/st_pierre_miquelon.png differ diff --git a/public/images/emoji/google/st_vincent_grenadines.png b/public/images/emoji/google/st_vincent_grenadines.png index df27c5e9be..05bc702b63 100644 Binary files a/public/images/emoji/google/st_vincent_grenadines.png and b/public/images/emoji/google/st_vincent_grenadines.png differ diff --git a/public/images/emoji/google/stadium.png b/public/images/emoji/google/stadium.png index 67c816ed4a..46a83cfde0 100644 Binary files a/public/images/emoji/google/stadium.png and b/public/images/emoji/google/stadium.png differ diff --git a/public/images/emoji/google/star.png b/public/images/emoji/google/star.png index 9005baa0f2..3c4f34ec83 100644 Binary files a/public/images/emoji/google/star.png and b/public/images/emoji/google/star.png differ diff --git a/public/images/emoji/google/star2.png b/public/images/emoji/google/star2.png index 926f65170a..01ae986b88 100644 Binary files a/public/images/emoji/google/star2.png and b/public/images/emoji/google/star2.png differ diff --git a/public/images/emoji/google/star_and_crescent.png b/public/images/emoji/google/star_and_crescent.png index 978b71111a..9d501ca096 100644 Binary files a/public/images/emoji/google/star_and_crescent.png and b/public/images/emoji/google/star_and_crescent.png differ diff --git a/public/images/emoji/google/star_of_david.png b/public/images/emoji/google/star_of_david.png index 5b2e88e995..a95c789164 100644 Binary files a/public/images/emoji/google/star_of_david.png and b/public/images/emoji/google/star_of_david.png differ diff --git a/public/images/emoji/google/star_struck.png b/public/images/emoji/google/star_struck.png index 9cc6aebfbb..0d852915d7 100644 Binary files a/public/images/emoji/google/star_struck.png and b/public/images/emoji/google/star_struck.png differ diff --git a/public/images/emoji/google/stars.png b/public/images/emoji/google/stars.png index 9e996a147b..e322fd2d27 100644 Binary files a/public/images/emoji/google/stars.png and b/public/images/emoji/google/stars.png differ diff --git a/public/images/emoji/google/station.png b/public/images/emoji/google/station.png index 75759512a7..dc0f195df1 100644 Binary files a/public/images/emoji/google/station.png and b/public/images/emoji/google/station.png differ diff --git a/public/images/emoji/google/statue_of_liberty.png b/public/images/emoji/google/statue_of_liberty.png index b7322ad3b0..7995b75902 100644 Binary files a/public/images/emoji/google/statue_of_liberty.png and b/public/images/emoji/google/statue_of_liberty.png differ diff --git a/public/images/emoji/google/steam_locomotive.png b/public/images/emoji/google/steam_locomotive.png index 0367f96b6a..623c84ad17 100644 Binary files a/public/images/emoji/google/steam_locomotive.png and b/public/images/emoji/google/steam_locomotive.png differ diff --git a/public/images/emoji/google/stew.png b/public/images/emoji/google/stew.png index 8dbd3a9c58..f84a6e098c 100644 Binary files a/public/images/emoji/google/stew.png and b/public/images/emoji/google/stew.png differ diff --git a/public/images/emoji/google/stop_button.png b/public/images/emoji/google/stop_button.png index 26b01fc233..98e6abb4ce 100644 Binary files a/public/images/emoji/google/stop_button.png and b/public/images/emoji/google/stop_button.png differ diff --git a/public/images/emoji/google/stop_sign.png b/public/images/emoji/google/stop_sign.png index 4e310d0abf..22a1843779 100644 Binary files a/public/images/emoji/google/stop_sign.png and b/public/images/emoji/google/stop_sign.png differ diff --git a/public/images/emoji/google/stopwatch.png b/public/images/emoji/google/stopwatch.png index beca228159..08251f354a 100644 Binary files a/public/images/emoji/google/stopwatch.png and b/public/images/emoji/google/stopwatch.png differ diff --git a/public/images/emoji/google/straight_ruler.png b/public/images/emoji/google/straight_ruler.png index 5c04bdb434..d9f3b302c7 100644 Binary files a/public/images/emoji/google/straight_ruler.png and b/public/images/emoji/google/straight_ruler.png differ diff --git a/public/images/emoji/google/strawberry.png b/public/images/emoji/google/strawberry.png index 31be9c8730..c6d76bd012 100644 Binary files a/public/images/emoji/google/strawberry.png and b/public/images/emoji/google/strawberry.png differ diff --git a/public/images/emoji/google/stuck_out_tongue.png b/public/images/emoji/google/stuck_out_tongue.png index c5d4dd1824..e962df7276 100644 Binary files a/public/images/emoji/google/stuck_out_tongue.png and b/public/images/emoji/google/stuck_out_tongue.png differ diff --git a/public/images/emoji/google/stuck_out_tongue_closed_eyes.png b/public/images/emoji/google/stuck_out_tongue_closed_eyes.png index 262d610b21..47260a130c 100644 Binary files a/public/images/emoji/google/stuck_out_tongue_closed_eyes.png and b/public/images/emoji/google/stuck_out_tongue_closed_eyes.png differ diff --git a/public/images/emoji/google/stuck_out_tongue_winking_eye.png b/public/images/emoji/google/stuck_out_tongue_winking_eye.png index 81693a1e81..8974250319 100644 Binary files a/public/images/emoji/google/stuck_out_tongue_winking_eye.png and b/public/images/emoji/google/stuck_out_tongue_winking_eye.png differ diff --git a/public/images/emoji/google/studio_microphone.png b/public/images/emoji/google/studio_microphone.png index 070e657d8c..ed094fecf0 100644 Binary files a/public/images/emoji/google/studio_microphone.png and b/public/images/emoji/google/studio_microphone.png differ diff --git a/public/images/emoji/google/stuffed_flatbread.png b/public/images/emoji/google/stuffed_flatbread.png index e4e0713a28..d6ded07177 100644 Binary files a/public/images/emoji/google/stuffed_flatbread.png and b/public/images/emoji/google/stuffed_flatbread.png differ diff --git a/public/images/emoji/google/sudan.png b/public/images/emoji/google/sudan.png index d159d9b693..11c266bbfe 100644 Binary files a/public/images/emoji/google/sudan.png and b/public/images/emoji/google/sudan.png differ diff --git a/public/images/emoji/google/sun_behind_large_cloud.png b/public/images/emoji/google/sun_behind_large_cloud.png index 2adf6fc83e..9f630911f5 100644 Binary files a/public/images/emoji/google/sun_behind_large_cloud.png and b/public/images/emoji/google/sun_behind_large_cloud.png differ diff --git a/public/images/emoji/google/sun_behind_rain_cloud.png b/public/images/emoji/google/sun_behind_rain_cloud.png index 1d5cfc81bf..003349f4c4 100644 Binary files a/public/images/emoji/google/sun_behind_rain_cloud.png and b/public/images/emoji/google/sun_behind_rain_cloud.png differ diff --git a/public/images/emoji/google/sun_behind_small_cloud.png b/public/images/emoji/google/sun_behind_small_cloud.png index 0e1dfbf0b4..f7743568d7 100644 Binary files a/public/images/emoji/google/sun_behind_small_cloud.png and b/public/images/emoji/google/sun_behind_small_cloud.png differ diff --git a/public/images/emoji/google/sun_with_face.png b/public/images/emoji/google/sun_with_face.png index e21136c7c4..5bd5103b2a 100644 Binary files a/public/images/emoji/google/sun_with_face.png and b/public/images/emoji/google/sun_with_face.png differ diff --git a/public/images/emoji/google/sunflower.png b/public/images/emoji/google/sunflower.png index 2d2ae55d7f..fe8c960af4 100644 Binary files a/public/images/emoji/google/sunflower.png and b/public/images/emoji/google/sunflower.png differ diff --git a/public/images/emoji/google/sunglasses.png b/public/images/emoji/google/sunglasses.png index acc11c1414..896b71cde2 100644 Binary files a/public/images/emoji/google/sunglasses.png and b/public/images/emoji/google/sunglasses.png differ diff --git a/public/images/emoji/google/sunny.png b/public/images/emoji/google/sunny.png index 67141b1fc5..97b757b902 100644 Binary files a/public/images/emoji/google/sunny.png and b/public/images/emoji/google/sunny.png differ diff --git a/public/images/emoji/google/sunrise.png b/public/images/emoji/google/sunrise.png index c11803c6d5..d13b6ebc2f 100644 Binary files a/public/images/emoji/google/sunrise.png and b/public/images/emoji/google/sunrise.png differ diff --git a/public/images/emoji/google/sunrise_over_mountains.png b/public/images/emoji/google/sunrise_over_mountains.png index 59eb7cbe36..b449e9e7cb 100644 Binary files a/public/images/emoji/google/sunrise_over_mountains.png and b/public/images/emoji/google/sunrise_over_mountains.png differ diff --git a/public/images/emoji/google/superhero.png b/public/images/emoji/google/superhero.png new file mode 100644 index 0000000000..0161e4b0da Binary files /dev/null and b/public/images/emoji/google/superhero.png differ diff --git a/public/images/emoji/google/supervillain.png b/public/images/emoji/google/supervillain.png new file mode 100644 index 0000000000..133e2145e4 Binary files /dev/null and b/public/images/emoji/google/supervillain.png differ diff --git a/public/images/emoji/google/surfer.png b/public/images/emoji/google/surfer.png index c8b5a34eee..24f0d88437 100644 Binary files a/public/images/emoji/google/surfer.png and b/public/images/emoji/google/surfer.png differ diff --git a/public/images/emoji/google/surfing_man.png b/public/images/emoji/google/surfing_man.png index c8b5a34eee..24f0d88437 100644 Binary files a/public/images/emoji/google/surfing_man.png and b/public/images/emoji/google/surfing_man.png differ diff --git a/public/images/emoji/google/surfing_woman.png b/public/images/emoji/google/surfing_woman.png index d8812f2391..ecb975a5a9 100644 Binary files a/public/images/emoji/google/surfing_woman.png and b/public/images/emoji/google/surfing_woman.png differ diff --git a/public/images/emoji/google/suriname.png b/public/images/emoji/google/suriname.png index 190b80cfaf..a5e820c50c 100644 Binary files a/public/images/emoji/google/suriname.png and b/public/images/emoji/google/suriname.png differ diff --git a/public/images/emoji/google/sushi.png b/public/images/emoji/google/sushi.png index 0beae8fa26..d70d1aaa43 100644 Binary files a/public/images/emoji/google/sushi.png and b/public/images/emoji/google/sushi.png differ diff --git a/public/images/emoji/google/suspension_railway.png b/public/images/emoji/google/suspension_railway.png index 90daf5684b..7ad1d5bf42 100644 Binary files a/public/images/emoji/google/suspension_railway.png and b/public/images/emoji/google/suspension_railway.png differ diff --git a/public/images/emoji/google/svalbard_and_jan_mayen.png b/public/images/emoji/google/svalbard_and_jan_mayen.png index d348a446ad..5e9e6ae5e3 100644 Binary files a/public/images/emoji/google/svalbard_and_jan_mayen.png and b/public/images/emoji/google/svalbard_and_jan_mayen.png differ diff --git a/public/images/emoji/google/swan.png b/public/images/emoji/google/swan.png new file mode 100644 index 0000000000..b65d97e3fa Binary files /dev/null and b/public/images/emoji/google/swan.png differ diff --git a/public/images/emoji/google/swaziland.png b/public/images/emoji/google/swaziland.png index 598a3c5dd7..9b59c733a4 100644 Binary files a/public/images/emoji/google/swaziland.png and b/public/images/emoji/google/swaziland.png differ diff --git a/public/images/emoji/google/sweat.png b/public/images/emoji/google/sweat.png index 97a87884a8..b7e87769ca 100644 Binary files a/public/images/emoji/google/sweat.png and b/public/images/emoji/google/sweat.png differ diff --git a/public/images/emoji/google/sweat_drops.png b/public/images/emoji/google/sweat_drops.png index b00dcc47cb..2c63b34884 100644 Binary files a/public/images/emoji/google/sweat_drops.png and b/public/images/emoji/google/sweat_drops.png differ diff --git a/public/images/emoji/google/sweat_smile.png b/public/images/emoji/google/sweat_smile.png index d062356602..9c133c9130 100644 Binary files a/public/images/emoji/google/sweat_smile.png and b/public/images/emoji/google/sweat_smile.png differ diff --git a/public/images/emoji/google/sweden.png b/public/images/emoji/google/sweden.png index 63a38804ec..025e3defe1 100644 Binary files a/public/images/emoji/google/sweden.png and b/public/images/emoji/google/sweden.png differ diff --git a/public/images/emoji/google/sweet_potato.png b/public/images/emoji/google/sweet_potato.png index c512770352..dff230e2af 100644 Binary files a/public/images/emoji/google/sweet_potato.png and b/public/images/emoji/google/sweet_potato.png differ diff --git a/public/images/emoji/google/swimmer.png b/public/images/emoji/google/swimmer.png index e244fc6805..90a1eef6e3 100644 Binary files a/public/images/emoji/google/swimmer.png and b/public/images/emoji/google/swimmer.png differ diff --git a/public/images/emoji/google/swimming_man.png b/public/images/emoji/google/swimming_man.png index e244fc6805..90a1eef6e3 100644 Binary files a/public/images/emoji/google/swimming_man.png and b/public/images/emoji/google/swimming_man.png differ diff --git a/public/images/emoji/google/swimming_woman.png b/public/images/emoji/google/swimming_woman.png index 12835c023c..0cc10a3b1d 100644 Binary files a/public/images/emoji/google/swimming_woman.png and b/public/images/emoji/google/swimming_woman.png differ diff --git a/public/images/emoji/google/switzerland.png b/public/images/emoji/google/switzerland.png index 9c404cf21d..4db879fee7 100644 Binary files a/public/images/emoji/google/switzerland.png and b/public/images/emoji/google/switzerland.png differ diff --git a/public/images/emoji/google/symbols.png b/public/images/emoji/google/symbols.png index 9453639f60..79a25ebffc 100644 Binary files a/public/images/emoji/google/symbols.png and b/public/images/emoji/google/symbols.png differ diff --git a/public/images/emoji/google/synagogue.png b/public/images/emoji/google/synagogue.png index f9e15d15af..1ff9f90dac 100644 Binary files a/public/images/emoji/google/synagogue.png and b/public/images/emoji/google/synagogue.png differ diff --git a/public/images/emoji/google/syria.png b/public/images/emoji/google/syria.png index 64ca1a6225..971d1aa02b 100644 Binary files a/public/images/emoji/google/syria.png and b/public/images/emoji/google/syria.png differ diff --git a/public/images/emoji/google/syringe.png b/public/images/emoji/google/syringe.png index dbccda32ef..08f3029571 100644 Binary files a/public/images/emoji/google/syringe.png and b/public/images/emoji/google/syringe.png differ diff --git a/public/images/emoji/google/t_rex.png b/public/images/emoji/google/t_rex.png index 7c3482e649..64c1e03612 100644 Binary files a/public/images/emoji/google/t_rex.png and b/public/images/emoji/google/t_rex.png differ diff --git a/public/images/emoji/google/table_tennis.png b/public/images/emoji/google/table_tennis.png index 60444a0a3a..c64fc50cb3 100644 Binary files a/public/images/emoji/google/table_tennis.png and b/public/images/emoji/google/table_tennis.png differ diff --git a/public/images/emoji/google/taco.png b/public/images/emoji/google/taco.png index f62f76fa27..616b9bad2f 100644 Binary files a/public/images/emoji/google/taco.png and b/public/images/emoji/google/taco.png differ diff --git a/public/images/emoji/google/tada.png b/public/images/emoji/google/tada.png index 43e5142120..25ca3d5dae 100644 Binary files a/public/images/emoji/google/tada.png and b/public/images/emoji/google/tada.png differ diff --git a/public/images/emoji/google/taiwan.png b/public/images/emoji/google/taiwan.png index 098f9b22ac..cd1b266928 100644 Binary files a/public/images/emoji/google/taiwan.png and b/public/images/emoji/google/taiwan.png differ diff --git a/public/images/emoji/google/tajikistan.png b/public/images/emoji/google/tajikistan.png index 037e6bf599..bf269f435a 100644 Binary files a/public/images/emoji/google/tajikistan.png and b/public/images/emoji/google/tajikistan.png differ diff --git a/public/images/emoji/google/takeout_box.png b/public/images/emoji/google/takeout_box.png index 82a48a4faa..65017697ed 100644 Binary files a/public/images/emoji/google/takeout_box.png and b/public/images/emoji/google/takeout_box.png differ diff --git a/public/images/emoji/google/tanabata_tree.png b/public/images/emoji/google/tanabata_tree.png index 434827a75d..a34cbbee79 100644 Binary files a/public/images/emoji/google/tanabata_tree.png and b/public/images/emoji/google/tanabata_tree.png differ diff --git a/public/images/emoji/google/tangerine.png b/public/images/emoji/google/tangerine.png index 049fe86ae0..9e9ccae81e 100644 Binary files a/public/images/emoji/google/tangerine.png and b/public/images/emoji/google/tangerine.png differ diff --git a/public/images/emoji/google/tanzania.png b/public/images/emoji/google/tanzania.png index 43eae86742..11a832fa95 100644 Binary files a/public/images/emoji/google/tanzania.png and b/public/images/emoji/google/tanzania.png differ diff --git a/public/images/emoji/google/taurus.png b/public/images/emoji/google/taurus.png index b2cc9dd032..5a3f65d15d 100644 Binary files a/public/images/emoji/google/taurus.png and b/public/images/emoji/google/taurus.png differ diff --git a/public/images/emoji/google/taxi.png b/public/images/emoji/google/taxi.png index 73acc0dea2..fb87d297f2 100644 Binary files a/public/images/emoji/google/taxi.png and b/public/images/emoji/google/taxi.png differ diff --git a/public/images/emoji/google/tea.png b/public/images/emoji/google/tea.png index 0c42b544e1..6fc35e12ed 100644 Binary files a/public/images/emoji/google/tea.png and b/public/images/emoji/google/tea.png differ diff --git a/public/images/emoji/google/teddy_bear.png b/public/images/emoji/google/teddy_bear.png new file mode 100644 index 0000000000..1d070c3aaa Binary files /dev/null and b/public/images/emoji/google/teddy_bear.png differ diff --git a/public/images/emoji/google/telephone.png b/public/images/emoji/google/telephone.png index 3eca2e7d80..eb4131c4c9 100644 Binary files a/public/images/emoji/google/telephone.png and b/public/images/emoji/google/telephone.png differ diff --git a/public/images/emoji/google/telephone_receiver.png b/public/images/emoji/google/telephone_receiver.png index 1fbf0f5d36..d2c087af0b 100644 Binary files a/public/images/emoji/google/telephone_receiver.png and b/public/images/emoji/google/telephone_receiver.png differ diff --git a/public/images/emoji/google/telescope.png b/public/images/emoji/google/telescope.png index d1b0cfafda..4c3c03cef4 100644 Binary files a/public/images/emoji/google/telescope.png and b/public/images/emoji/google/telescope.png differ diff --git a/public/images/emoji/google/ten.png b/public/images/emoji/google/ten.png index 26d2af616c..6535583925 100644 Binary files a/public/images/emoji/google/ten.png and b/public/images/emoji/google/ten.png differ diff --git a/public/images/emoji/google/tennis.png b/public/images/emoji/google/tennis.png index d99dbd1fa7..a9c7e3c2d1 100644 Binary files a/public/images/emoji/google/tennis.png and b/public/images/emoji/google/tennis.png differ diff --git a/public/images/emoji/google/tent.png b/public/images/emoji/google/tent.png index ad3fa23f39..38a5c7d7de 100644 Binary files a/public/images/emoji/google/tent.png and b/public/images/emoji/google/tent.png differ diff --git a/public/images/emoji/google/test_tube.png b/public/images/emoji/google/test_tube.png new file mode 100644 index 0000000000..aa4d455433 Binary files /dev/null and b/public/images/emoji/google/test_tube.png differ diff --git a/public/images/emoji/google/thailand.png b/public/images/emoji/google/thailand.png index acb9054331..b0eda006e9 100644 Binary files a/public/images/emoji/google/thailand.png and b/public/images/emoji/google/thailand.png differ diff --git a/public/images/emoji/google/thermometer.png b/public/images/emoji/google/thermometer.png index 0b37dbfe0a..112bfd1c6e 100644 Binary files a/public/images/emoji/google/thermometer.png and b/public/images/emoji/google/thermometer.png differ diff --git a/public/images/emoji/google/thermometer_face.png b/public/images/emoji/google/thermometer_face.png index 296fe80618..35cdd26ad1 100644 Binary files a/public/images/emoji/google/thermometer_face.png and b/public/images/emoji/google/thermometer_face.png differ diff --git a/public/images/emoji/google/thinking.png b/public/images/emoji/google/thinking.png index afcbc3d3b1..287829194c 100644 Binary files a/public/images/emoji/google/thinking.png and b/public/images/emoji/google/thinking.png differ diff --git a/public/images/emoji/google/thinking_face.png b/public/images/emoji/google/thinking_face.png index afcbc3d3b1..287829194c 100644 Binary files a/public/images/emoji/google/thinking_face.png and b/public/images/emoji/google/thinking_face.png differ diff --git a/public/images/emoji/google/thought_balloon.png b/public/images/emoji/google/thought_balloon.png index 3a2ac4e766..cabdc0f84f 100644 Binary files a/public/images/emoji/google/thought_balloon.png and b/public/images/emoji/google/thought_balloon.png differ diff --git a/public/images/emoji/google/thread.png b/public/images/emoji/google/thread.png new file mode 100644 index 0000000000..a049328efa Binary files /dev/null and b/public/images/emoji/google/thread.png differ diff --git a/public/images/emoji/google/three.png b/public/images/emoji/google/three.png index ec65e3f24c..61ef4c06df 100644 Binary files a/public/images/emoji/google/three.png and b/public/images/emoji/google/three.png differ diff --git a/public/images/emoji/google/three_button_mouse.png b/public/images/emoji/google/three_button_mouse.png index 28785439fc..02d114d01c 100644 Binary files a/public/images/emoji/google/three_button_mouse.png and b/public/images/emoji/google/three_button_mouse.png differ diff --git a/public/images/emoji/google/thumbsdown.png b/public/images/emoji/google/thumbsdown.png index 01e3d0ffa1..8fc6baacfb 100644 Binary files a/public/images/emoji/google/thumbsdown.png and b/public/images/emoji/google/thumbsdown.png differ diff --git a/public/images/emoji/google/thumbsup.png b/public/images/emoji/google/thumbsup.png index 7e440eb6a8..9fc102006f 100644 Binary files a/public/images/emoji/google/thumbsup.png and b/public/images/emoji/google/thumbsup.png differ diff --git a/public/images/emoji/google/thunder_cloud_and_rain.png b/public/images/emoji/google/thunder_cloud_and_rain.png index 8cf3322c7d..e4bd4aa6fb 100644 Binary files a/public/images/emoji/google/thunder_cloud_and_rain.png and b/public/images/emoji/google/thunder_cloud_and_rain.png differ diff --git a/public/images/emoji/google/thunder_cloud_rain.png b/public/images/emoji/google/thunder_cloud_rain.png index 8cf3322c7d..e4bd4aa6fb 100644 Binary files a/public/images/emoji/google/thunder_cloud_rain.png and b/public/images/emoji/google/thunder_cloud_rain.png differ diff --git a/public/images/emoji/google/ticket.png b/public/images/emoji/google/ticket.png index 6bd78c8329..8426156453 100644 Binary files a/public/images/emoji/google/ticket.png and b/public/images/emoji/google/ticket.png differ diff --git a/public/images/emoji/google/tickets.png b/public/images/emoji/google/tickets.png index 64ccba10db..ab18fb2141 100644 Binary files a/public/images/emoji/google/tickets.png and b/public/images/emoji/google/tickets.png differ diff --git a/public/images/emoji/google/tiger.png b/public/images/emoji/google/tiger.png index 2c24a0e1cd..8e665e0e35 100644 Binary files a/public/images/emoji/google/tiger.png and b/public/images/emoji/google/tiger.png differ diff --git a/public/images/emoji/google/tiger2.png b/public/images/emoji/google/tiger2.png index 1b3d49a0cc..743dd7dca9 100644 Binary files a/public/images/emoji/google/tiger2.png and b/public/images/emoji/google/tiger2.png differ diff --git a/public/images/emoji/google/timer.png b/public/images/emoji/google/timer.png index fde01751ff..e5c095508b 100644 Binary files a/public/images/emoji/google/timer.png and b/public/images/emoji/google/timer.png differ diff --git a/public/images/emoji/google/timer_clock.png b/public/images/emoji/google/timer_clock.png index fde01751ff..e5c095508b 100644 Binary files a/public/images/emoji/google/timer_clock.png and b/public/images/emoji/google/timer_clock.png differ diff --git a/public/images/emoji/google/timor_leste.png b/public/images/emoji/google/timor_leste.png index e88ff74a77..eb054649e8 100644 Binary files a/public/images/emoji/google/timor_leste.png and b/public/images/emoji/google/timor_leste.png differ diff --git a/public/images/emoji/google/tipping_hand_man.png b/public/images/emoji/google/tipping_hand_man.png index 1eb3a089aa..57249df5ee 100644 Binary files a/public/images/emoji/google/tipping_hand_man.png and b/public/images/emoji/google/tipping_hand_man.png differ diff --git a/public/images/emoji/google/tipping_hand_woman.png b/public/images/emoji/google/tipping_hand_woman.png index 5a1a1083dd..8c9e966b3f 100644 Binary files a/public/images/emoji/google/tipping_hand_woman.png and b/public/images/emoji/google/tipping_hand_woman.png differ diff --git a/public/images/emoji/google/tired_face.png b/public/images/emoji/google/tired_face.png index c89739037b..16f7fda895 100644 Binary files a/public/images/emoji/google/tired_face.png and b/public/images/emoji/google/tired_face.png differ diff --git a/public/images/emoji/google/tm.png b/public/images/emoji/google/tm.png index 6957cfe1f2..0e8667e5c7 100644 Binary files a/public/images/emoji/google/tm.png and b/public/images/emoji/google/tm.png differ diff --git a/public/images/emoji/google/togo.png b/public/images/emoji/google/togo.png index 9d20ca89fd..7fd6cde0d6 100644 Binary files a/public/images/emoji/google/togo.png and b/public/images/emoji/google/togo.png differ diff --git a/public/images/emoji/google/toilet.png b/public/images/emoji/google/toilet.png index b13d4f4cb7..85009a8fa2 100644 Binary files a/public/images/emoji/google/toilet.png and b/public/images/emoji/google/toilet.png differ diff --git a/public/images/emoji/google/tokelau.png b/public/images/emoji/google/tokelau.png index 5e5337f223..9f56efd771 100644 Binary files a/public/images/emoji/google/tokelau.png and b/public/images/emoji/google/tokelau.png differ diff --git a/public/images/emoji/google/tokyo_tower.png b/public/images/emoji/google/tokyo_tower.png index 0405e76372..b9a47b7180 100644 Binary files a/public/images/emoji/google/tokyo_tower.png and b/public/images/emoji/google/tokyo_tower.png differ diff --git a/public/images/emoji/google/tomato.png b/public/images/emoji/google/tomato.png index 6ed016c0ce..b19e6f2b7c 100644 Binary files a/public/images/emoji/google/tomato.png and b/public/images/emoji/google/tomato.png differ diff --git a/public/images/emoji/google/tonga.png b/public/images/emoji/google/tonga.png index dd067f20f3..05f16bf47e 100644 Binary files a/public/images/emoji/google/tonga.png and b/public/images/emoji/google/tonga.png differ diff --git a/public/images/emoji/google/tongue.png b/public/images/emoji/google/tongue.png index bdca4a075c..1180e76e17 100644 Binary files a/public/images/emoji/google/tongue.png and b/public/images/emoji/google/tongue.png differ diff --git a/public/images/emoji/google/toolbox.png b/public/images/emoji/google/toolbox.png new file mode 100644 index 0000000000..81ab1bb94f Binary files /dev/null and b/public/images/emoji/google/toolbox.png differ diff --git a/public/images/emoji/google/tools.png b/public/images/emoji/google/tools.png index f0fe70817f..71d0be2388 100644 Binary files a/public/images/emoji/google/tools.png and b/public/images/emoji/google/tools.png differ diff --git a/public/images/emoji/google/tooth.png b/public/images/emoji/google/tooth.png new file mode 100644 index 0000000000..89bfdfcd72 Binary files /dev/null and b/public/images/emoji/google/tooth.png differ diff --git a/public/images/emoji/google/top.png b/public/images/emoji/google/top.png index c348a87084..09a7383520 100644 Binary files a/public/images/emoji/google/top.png and b/public/images/emoji/google/top.png differ diff --git a/public/images/emoji/google/tophat.png b/public/images/emoji/google/tophat.png index 8ef667b90f..7be90eeaa3 100644 Binary files a/public/images/emoji/google/tophat.png and b/public/images/emoji/google/tophat.png differ diff --git a/public/images/emoji/google/tornado.png b/public/images/emoji/google/tornado.png index b2e18065c1..01d681d1ca 100644 Binary files a/public/images/emoji/google/tornado.png and b/public/images/emoji/google/tornado.png differ diff --git a/public/images/emoji/google/tr.png b/public/images/emoji/google/tr.png index d1c0e60886..ec3af52eb3 100644 Binary files a/public/images/emoji/google/tr.png and b/public/images/emoji/google/tr.png differ diff --git a/public/images/emoji/google/track_next.png b/public/images/emoji/google/track_next.png index 1faa13a2d5..c6c35e6132 100644 Binary files a/public/images/emoji/google/track_next.png and b/public/images/emoji/google/track_next.png differ diff --git a/public/images/emoji/google/track_previous.png b/public/images/emoji/google/track_previous.png index 87e948c080..d636e75dbe 100644 Binary files a/public/images/emoji/google/track_previous.png and b/public/images/emoji/google/track_previous.png differ diff --git a/public/images/emoji/google/trackball.png b/public/images/emoji/google/trackball.png index 82db185aa2..14e4ed429f 100644 Binary files a/public/images/emoji/google/trackball.png and b/public/images/emoji/google/trackball.png differ diff --git a/public/images/emoji/google/tractor.png b/public/images/emoji/google/tractor.png index 9732a429ba..d6321352f4 100644 Binary files a/public/images/emoji/google/tractor.png and b/public/images/emoji/google/tractor.png differ diff --git a/public/images/emoji/google/traffic_light.png b/public/images/emoji/google/traffic_light.png index c3c6814d71..8394eb38cf 100644 Binary files a/public/images/emoji/google/traffic_light.png and b/public/images/emoji/google/traffic_light.png differ diff --git a/public/images/emoji/google/train.png b/public/images/emoji/google/train.png index 24b28d4767..2eb63c5b58 100644 Binary files a/public/images/emoji/google/train.png and b/public/images/emoji/google/train.png differ diff --git a/public/images/emoji/google/train2.png b/public/images/emoji/google/train2.png index 5e514a0745..d7ef259550 100644 Binary files a/public/images/emoji/google/train2.png and b/public/images/emoji/google/train2.png differ diff --git a/public/images/emoji/google/tram.png b/public/images/emoji/google/tram.png index b85824ca9c..a545111100 100644 Binary files a/public/images/emoji/google/tram.png and b/public/images/emoji/google/tram.png differ diff --git a/public/images/emoji/google/triangular_flag_on_post.png b/public/images/emoji/google/triangular_flag_on_post.png index 1357e1e60d..58c760cf21 100644 Binary files a/public/images/emoji/google/triangular_flag_on_post.png and b/public/images/emoji/google/triangular_flag_on_post.png differ diff --git a/public/images/emoji/google/triangular_ruler.png b/public/images/emoji/google/triangular_ruler.png index 9c3d45e3f4..bc74a979fe 100644 Binary files a/public/images/emoji/google/triangular_ruler.png and b/public/images/emoji/google/triangular_ruler.png differ diff --git a/public/images/emoji/google/trident.png b/public/images/emoji/google/trident.png index 068d173f4a..8578c5374f 100644 Binary files a/public/images/emoji/google/trident.png and b/public/images/emoji/google/trident.png differ diff --git a/public/images/emoji/google/trinidad_tobago.png b/public/images/emoji/google/trinidad_tobago.png index 050048d1a3..b0b6545009 100644 Binary files a/public/images/emoji/google/trinidad_tobago.png and b/public/images/emoji/google/trinidad_tobago.png differ diff --git a/public/images/emoji/google/tristan_da_cunha.png b/public/images/emoji/google/tristan_da_cunha.png index 49802d9dc6..f689afa2e4 100644 Binary files a/public/images/emoji/google/tristan_da_cunha.png and b/public/images/emoji/google/tristan_da_cunha.png differ diff --git a/public/images/emoji/google/triumph.png b/public/images/emoji/google/triumph.png index 0f05869abe..dc8893bbd0 100644 Binary files a/public/images/emoji/google/triumph.png and b/public/images/emoji/google/triumph.png differ diff --git a/public/images/emoji/google/trolleybus.png b/public/images/emoji/google/trolleybus.png index f53242ed7e..9bbbeb07bf 100644 Binary files a/public/images/emoji/google/trolleybus.png and b/public/images/emoji/google/trolleybus.png differ diff --git a/public/images/emoji/google/trophy.png b/public/images/emoji/google/trophy.png index efa8d1d2ed..0ab067fdf5 100644 Binary files a/public/images/emoji/google/trophy.png and b/public/images/emoji/google/trophy.png differ diff --git a/public/images/emoji/google/tropical_drink.png b/public/images/emoji/google/tropical_drink.png index 6ded42bfee..2e6b0593bd 100644 Binary files a/public/images/emoji/google/tropical_drink.png and b/public/images/emoji/google/tropical_drink.png differ diff --git a/public/images/emoji/google/tropical_fish.png b/public/images/emoji/google/tropical_fish.png index 03ae21be6a..5a5be45311 100644 Binary files a/public/images/emoji/google/tropical_fish.png and b/public/images/emoji/google/tropical_fish.png differ diff --git a/public/images/emoji/google/truck.png b/public/images/emoji/google/truck.png index 88143531a5..ed29a1d3f9 100644 Binary files a/public/images/emoji/google/truck.png and b/public/images/emoji/google/truck.png differ diff --git a/public/images/emoji/google/trumpet.png b/public/images/emoji/google/trumpet.png index 2d82a5dd9a..534002e8a3 100644 Binary files a/public/images/emoji/google/trumpet.png and b/public/images/emoji/google/trumpet.png differ diff --git a/public/images/emoji/google/tshirt.png b/public/images/emoji/google/tshirt.png index d93268cc4e..dcb4c613a0 100644 Binary files a/public/images/emoji/google/tshirt.png and b/public/images/emoji/google/tshirt.png differ diff --git a/public/images/emoji/google/tulip.png b/public/images/emoji/google/tulip.png index c881369686..be9d12156f 100644 Binary files a/public/images/emoji/google/tulip.png and b/public/images/emoji/google/tulip.png differ diff --git a/public/images/emoji/google/tumbler_glass.png b/public/images/emoji/google/tumbler_glass.png index 565017fe1f..d5afd4f3a6 100644 Binary files a/public/images/emoji/google/tumbler_glass.png and b/public/images/emoji/google/tumbler_glass.png differ diff --git a/public/images/emoji/google/tunisia.png b/public/images/emoji/google/tunisia.png index 0d947c90e9..0633decccf 100644 Binary files a/public/images/emoji/google/tunisia.png and b/public/images/emoji/google/tunisia.png differ diff --git a/public/images/emoji/google/turkey.png b/public/images/emoji/google/turkey.png index 04781c09f9..d3638aca70 100644 Binary files a/public/images/emoji/google/turkey.png and b/public/images/emoji/google/turkey.png differ diff --git a/public/images/emoji/google/turkmenistan.png b/public/images/emoji/google/turkmenistan.png index 6e9a7883cb..96d243585b 100644 Binary files a/public/images/emoji/google/turkmenistan.png and b/public/images/emoji/google/turkmenistan.png differ diff --git a/public/images/emoji/google/turks_caicos_islands.png b/public/images/emoji/google/turks_caicos_islands.png index 7eb5cd1fff..c51fd9cdd5 100644 Binary files a/public/images/emoji/google/turks_caicos_islands.png and b/public/images/emoji/google/turks_caicos_islands.png differ diff --git a/public/images/emoji/google/turtle.png b/public/images/emoji/google/turtle.png index aa422d075d..407f7325d1 100644 Binary files a/public/images/emoji/google/turtle.png and b/public/images/emoji/google/turtle.png differ diff --git a/public/images/emoji/google/tuvalu.png b/public/images/emoji/google/tuvalu.png index ad163e6a52..4c607aef1f 100644 Binary files a/public/images/emoji/google/tuvalu.png and b/public/images/emoji/google/tuvalu.png differ diff --git a/public/images/emoji/google/tv.png b/public/images/emoji/google/tv.png index 5b28652dfb..e70ac0e45f 100644 Binary files a/public/images/emoji/google/tv.png and b/public/images/emoji/google/tv.png differ diff --git a/public/images/emoji/google/twisted_rightwards_arrows.png b/public/images/emoji/google/twisted_rightwards_arrows.png index 6fa5fe3dd0..51300f21b8 100644 Binary files a/public/images/emoji/google/twisted_rightwards_arrows.png and b/public/images/emoji/google/twisted_rightwards_arrows.png differ diff --git a/public/images/emoji/google/two.png b/public/images/emoji/google/two.png index 481a50da6c..721a9748d3 100644 Binary files a/public/images/emoji/google/two.png and b/public/images/emoji/google/two.png differ diff --git a/public/images/emoji/google/two_hearts.png b/public/images/emoji/google/two_hearts.png index 98b87b653d..ee527cc643 100644 Binary files a/public/images/emoji/google/two_hearts.png and b/public/images/emoji/google/two_hearts.png differ diff --git a/public/images/emoji/google/two_men_holding_hands.png b/public/images/emoji/google/two_men_holding_hands.png index ffbd370b8c..68d4914135 100644 Binary files a/public/images/emoji/google/two_men_holding_hands.png and b/public/images/emoji/google/two_men_holding_hands.png differ diff --git a/public/images/emoji/google/two_women_holding_hands.png b/public/images/emoji/google/two_women_holding_hands.png index adde4bc2c1..50989d9180 100644 Binary files a/public/images/emoji/google/two_women_holding_hands.png and b/public/images/emoji/google/two_women_holding_hands.png differ diff --git a/public/images/emoji/google/u5272.png b/public/images/emoji/google/u5272.png index 49cec56a31..9efc459d0d 100644 Binary files a/public/images/emoji/google/u5272.png and b/public/images/emoji/google/u5272.png differ diff --git a/public/images/emoji/google/u5408.png b/public/images/emoji/google/u5408.png index 3bedae2e11..99c69c2eb8 100644 Binary files a/public/images/emoji/google/u5408.png and b/public/images/emoji/google/u5408.png differ diff --git a/public/images/emoji/google/u55b6.png b/public/images/emoji/google/u55b6.png index 1760e7153b..ded9c5b0d1 100644 Binary files a/public/images/emoji/google/u55b6.png and b/public/images/emoji/google/u55b6.png differ diff --git a/public/images/emoji/google/u6307.png b/public/images/emoji/google/u6307.png index 284502f7c3..b835a2d733 100644 Binary files a/public/images/emoji/google/u6307.png and b/public/images/emoji/google/u6307.png differ diff --git a/public/images/emoji/google/u6708.png b/public/images/emoji/google/u6708.png index 77ea2c0a7a..4f38afa2ab 100644 Binary files a/public/images/emoji/google/u6708.png and b/public/images/emoji/google/u6708.png differ diff --git a/public/images/emoji/google/u6709.png b/public/images/emoji/google/u6709.png index ec40330a6d..8857e2bd99 100644 Binary files a/public/images/emoji/google/u6709.png and b/public/images/emoji/google/u6709.png differ diff --git a/public/images/emoji/google/u6e80.png b/public/images/emoji/google/u6e80.png index 9bf638e0e0..c993e98024 100644 Binary files a/public/images/emoji/google/u6e80.png and b/public/images/emoji/google/u6e80.png differ diff --git a/public/images/emoji/google/u7121.png b/public/images/emoji/google/u7121.png index bc74187293..1c86e843f8 100644 Binary files a/public/images/emoji/google/u7121.png and b/public/images/emoji/google/u7121.png differ diff --git a/public/images/emoji/google/u7533.png b/public/images/emoji/google/u7533.png index 47807c431e..b5a91b184d 100644 Binary files a/public/images/emoji/google/u7533.png and b/public/images/emoji/google/u7533.png differ diff --git a/public/images/emoji/google/u7981.png b/public/images/emoji/google/u7981.png index cb0a60d06e..107a0d9875 100644 Binary files a/public/images/emoji/google/u7981.png and b/public/images/emoji/google/u7981.png differ diff --git a/public/images/emoji/google/u7a7a.png b/public/images/emoji/google/u7a7a.png index b28ebcaf6a..094531a7cc 100644 Binary files a/public/images/emoji/google/u7a7a.png and b/public/images/emoji/google/u7a7a.png differ diff --git a/public/images/emoji/google/uganda.png b/public/images/emoji/google/uganda.png index 9f5dda6aa2..c0565e109c 100644 Binary files a/public/images/emoji/google/uganda.png and b/public/images/emoji/google/uganda.png differ diff --git a/public/images/emoji/google/uk.png b/public/images/emoji/google/uk.png index e7f3da7ea8..eac8318094 100644 Binary files a/public/images/emoji/google/uk.png and b/public/images/emoji/google/uk.png differ diff --git a/public/images/emoji/google/ukraine.png b/public/images/emoji/google/ukraine.png index a45fa0d5b1..49fbfcb708 100644 Binary files a/public/images/emoji/google/ukraine.png and b/public/images/emoji/google/ukraine.png differ diff --git a/public/images/emoji/google/umbrella.png b/public/images/emoji/google/umbrella.png index acd0e9db07..696dc1d9c9 100644 Binary files a/public/images/emoji/google/umbrella.png and b/public/images/emoji/google/umbrella.png differ diff --git a/public/images/emoji/google/umbrella2.png b/public/images/emoji/google/umbrella2.png index fb2f8bb58b..31954e3c1e 100644 Binary files a/public/images/emoji/google/umbrella2.png and b/public/images/emoji/google/umbrella2.png differ diff --git a/public/images/emoji/google/umbrella_on_ground.png b/public/images/emoji/google/umbrella_on_ground.png index c7358ec949..d56d26df8c 100644 Binary files a/public/images/emoji/google/umbrella_on_ground.png and b/public/images/emoji/google/umbrella_on_ground.png differ diff --git a/public/images/emoji/google/unamused.png b/public/images/emoji/google/unamused.png index 6086fa81e5..452b2f0bcd 100644 Binary files a/public/images/emoji/google/unamused.png and b/public/images/emoji/google/unamused.png differ diff --git a/public/images/emoji/google/underage.png b/public/images/emoji/google/underage.png index bdbc877885..5507353a3d 100644 Binary files a/public/images/emoji/google/underage.png and b/public/images/emoji/google/underage.png differ diff --git a/public/images/emoji/google/unicorn.png b/public/images/emoji/google/unicorn.png index 63f23b2971..f8baaa4697 100644 Binary files a/public/images/emoji/google/unicorn.png and b/public/images/emoji/google/unicorn.png differ diff --git a/public/images/emoji/google/unicorn_face.png b/public/images/emoji/google/unicorn_face.png index 63f23b2971..f8baaa4697 100644 Binary files a/public/images/emoji/google/unicorn_face.png and b/public/images/emoji/google/unicorn_face.png differ diff --git a/public/images/emoji/google/united_arab_emirates.png b/public/images/emoji/google/united_arab_emirates.png index 34cae172b2..f9a77fce88 100644 Binary files a/public/images/emoji/google/united_arab_emirates.png and b/public/images/emoji/google/united_arab_emirates.png differ diff --git a/public/images/emoji/google/united_nations.png b/public/images/emoji/google/united_nations.png index 2319f40a5d..c1039f7fca 100644 Binary files a/public/images/emoji/google/united_nations.png and b/public/images/emoji/google/united_nations.png differ diff --git a/public/images/emoji/google/unlock.png b/public/images/emoji/google/unlock.png index e85fdcb0ed..41c3d3a54e 100644 Binary files a/public/images/emoji/google/unlock.png and b/public/images/emoji/google/unlock.png differ diff --git a/public/images/emoji/google/up.png b/public/images/emoji/google/up.png index e755f1c17c..4a1203dd53 100644 Binary files a/public/images/emoji/google/up.png and b/public/images/emoji/google/up.png differ diff --git a/public/images/emoji/google/upside_down.png b/public/images/emoji/google/upside_down.png index 9a2cb935c3..c642d9c621 100644 Binary files a/public/images/emoji/google/upside_down.png and b/public/images/emoji/google/upside_down.png differ diff --git a/public/images/emoji/google/upside_down_face.png b/public/images/emoji/google/upside_down_face.png index 9a2cb935c3..c642d9c621 100644 Binary files a/public/images/emoji/google/upside_down_face.png and b/public/images/emoji/google/upside_down_face.png differ diff --git a/public/images/emoji/google/urn.png b/public/images/emoji/google/urn.png index 2276468356..37ed3bc27d 100644 Binary files a/public/images/emoji/google/urn.png and b/public/images/emoji/google/urn.png differ diff --git a/public/images/emoji/google/uruguay.png b/public/images/emoji/google/uruguay.png index 67e76bd9d7..55195c9d31 100644 Binary files a/public/images/emoji/google/uruguay.png and b/public/images/emoji/google/uruguay.png differ diff --git a/public/images/emoji/google/us.png b/public/images/emoji/google/us.png index 44daa43947..db9012d588 100644 Binary files a/public/images/emoji/google/us.png and b/public/images/emoji/google/us.png differ diff --git a/public/images/emoji/google/us_outlying_islands.png b/public/images/emoji/google/us_outlying_islands.png index 44daa43947..db9012d588 100644 Binary files a/public/images/emoji/google/us_outlying_islands.png and b/public/images/emoji/google/us_outlying_islands.png differ diff --git a/public/images/emoji/google/us_virgin_islands.png b/public/images/emoji/google/us_virgin_islands.png index dc8b621abc..b8d84b41e6 100644 Binary files a/public/images/emoji/google/us_virgin_islands.png and b/public/images/emoji/google/us_virgin_islands.png differ diff --git a/public/images/emoji/google/uzbekistan.png b/public/images/emoji/google/uzbekistan.png index 69a3a188df..28cc9fbf3f 100644 Binary files a/public/images/emoji/google/uzbekistan.png and b/public/images/emoji/google/uzbekistan.png differ diff --git a/public/images/emoji/google/v.png b/public/images/emoji/google/v.png index f27b956aad..17a790223c 100644 Binary files a/public/images/emoji/google/v.png and b/public/images/emoji/google/v.png differ diff --git a/public/images/emoji/google/vampire.png b/public/images/emoji/google/vampire.png index ddfba45650..6f9ec22dd8 100644 Binary files a/public/images/emoji/google/vampire.png and b/public/images/emoji/google/vampire.png differ diff --git a/public/images/emoji/google/vanuatu.png b/public/images/emoji/google/vanuatu.png index 7ef97a0665..cac51892db 100644 Binary files a/public/images/emoji/google/vanuatu.png and b/public/images/emoji/google/vanuatu.png differ diff --git a/public/images/emoji/google/vatican_city.png b/public/images/emoji/google/vatican_city.png index 932dc6f9db..2e8da03a22 100644 Binary files a/public/images/emoji/google/vatican_city.png and b/public/images/emoji/google/vatican_city.png differ diff --git a/public/images/emoji/google/venezuela.png b/public/images/emoji/google/venezuela.png index b62256b171..9ff8c9fab5 100644 Binary files a/public/images/emoji/google/venezuela.png and b/public/images/emoji/google/venezuela.png differ diff --git a/public/images/emoji/google/vertical_traffic_light.png b/public/images/emoji/google/vertical_traffic_light.png index 716a33c3ac..5a55025364 100644 Binary files a/public/images/emoji/google/vertical_traffic_light.png and b/public/images/emoji/google/vertical_traffic_light.png differ diff --git a/public/images/emoji/google/vhs.png b/public/images/emoji/google/vhs.png index 6f90d54b09..0cc6b66516 100644 Binary files a/public/images/emoji/google/vhs.png and b/public/images/emoji/google/vhs.png differ diff --git a/public/images/emoji/google/vibration_mode.png b/public/images/emoji/google/vibration_mode.png index fe9ec4f2bd..d34263c54b 100644 Binary files a/public/images/emoji/google/vibration_mode.png and b/public/images/emoji/google/vibration_mode.png differ diff --git a/public/images/emoji/google/video_camera.png b/public/images/emoji/google/video_camera.png index cdafa01e10..2378f1ba50 100644 Binary files a/public/images/emoji/google/video_camera.png and b/public/images/emoji/google/video_camera.png differ diff --git a/public/images/emoji/google/video_game.png b/public/images/emoji/google/video_game.png index 6e25166a2f..a52a5eaef6 100644 Binary files a/public/images/emoji/google/video_game.png and b/public/images/emoji/google/video_game.png differ diff --git a/public/images/emoji/google/vietnam.png b/public/images/emoji/google/vietnam.png index 2f7e14c2d2..0d80162e53 100644 Binary files a/public/images/emoji/google/vietnam.png and b/public/images/emoji/google/vietnam.png differ diff --git a/public/images/emoji/google/violin.png b/public/images/emoji/google/violin.png index 1c97e6b86b..eb827d5ed0 100644 Binary files a/public/images/emoji/google/violin.png and b/public/images/emoji/google/violin.png differ diff --git a/public/images/emoji/google/virgo.png b/public/images/emoji/google/virgo.png index 686f14ed27..4a8f46e9bd 100644 Binary files a/public/images/emoji/google/virgo.png and b/public/images/emoji/google/virgo.png differ diff --git a/public/images/emoji/google/volcano.png b/public/images/emoji/google/volcano.png index 2002387c66..ab9aaeb280 100644 Binary files a/public/images/emoji/google/volcano.png and b/public/images/emoji/google/volcano.png differ diff --git a/public/images/emoji/google/volleyball.png b/public/images/emoji/google/volleyball.png index 29570e66d3..c7005c7080 100644 Binary files a/public/images/emoji/google/volleyball.png and b/public/images/emoji/google/volleyball.png differ diff --git a/public/images/emoji/google/vs.png b/public/images/emoji/google/vs.png index 3a5791a6cb..e47fc717e2 100644 Binary files a/public/images/emoji/google/vs.png and b/public/images/emoji/google/vs.png differ diff --git a/public/images/emoji/google/vulcan.png b/public/images/emoji/google/vulcan.png index bbedc6b2dc..68de8f25e0 100644 Binary files a/public/images/emoji/google/vulcan.png and b/public/images/emoji/google/vulcan.png differ diff --git a/public/images/emoji/google/vulcan_salute.png b/public/images/emoji/google/vulcan_salute.png index bbedc6b2dc..68de8f25e0 100644 Binary files a/public/images/emoji/google/vulcan_salute.png and b/public/images/emoji/google/vulcan_salute.png differ diff --git a/public/images/emoji/google/walking.png b/public/images/emoji/google/walking.png index 56b2b54379..25d3c6a01a 100644 Binary files a/public/images/emoji/google/walking.png and b/public/images/emoji/google/walking.png differ diff --git a/public/images/emoji/google/walking_man.png b/public/images/emoji/google/walking_man.png index 56b2b54379..25d3c6a01a 100644 Binary files a/public/images/emoji/google/walking_man.png and b/public/images/emoji/google/walking_man.png differ diff --git a/public/images/emoji/google/walking_woman.png b/public/images/emoji/google/walking_woman.png index 2b87e8537a..2f7a61cd23 100644 Binary files a/public/images/emoji/google/walking_woman.png and b/public/images/emoji/google/walking_woman.png differ diff --git a/public/images/emoji/google/wallis_futuna.png b/public/images/emoji/google/wallis_futuna.png index 4faf7e252e..e0eb84c996 100644 Binary files a/public/images/emoji/google/wallis_futuna.png and b/public/images/emoji/google/wallis_futuna.png differ diff --git a/public/images/emoji/google/waning_crescent_moon.png b/public/images/emoji/google/waning_crescent_moon.png index 58c850524b..11c6c7bb9a 100644 Binary files a/public/images/emoji/google/waning_crescent_moon.png and b/public/images/emoji/google/waning_crescent_moon.png differ diff --git a/public/images/emoji/google/waning_gibbous_moon.png b/public/images/emoji/google/waning_gibbous_moon.png index ccf5a37369..3715f02bfe 100644 Binary files a/public/images/emoji/google/waning_gibbous_moon.png and b/public/images/emoji/google/waning_gibbous_moon.png differ diff --git a/public/images/emoji/google/warning.png b/public/images/emoji/google/warning.png index f33839b22a..f5725e353c 100644 Binary files a/public/images/emoji/google/warning.png and b/public/images/emoji/google/warning.png differ diff --git a/public/images/emoji/google/wastebasket.png b/public/images/emoji/google/wastebasket.png index a7f3c2c755..5cfd4481f3 100644 Binary files a/public/images/emoji/google/wastebasket.png and b/public/images/emoji/google/wastebasket.png differ diff --git a/public/images/emoji/google/watch.png b/public/images/emoji/google/watch.png index 23dd719800..04c6d24dc9 100644 Binary files a/public/images/emoji/google/watch.png and b/public/images/emoji/google/watch.png differ diff --git a/public/images/emoji/google/water_buffalo.png b/public/images/emoji/google/water_buffalo.png index 4875eabcf8..9ea58237bc 100644 Binary files a/public/images/emoji/google/water_buffalo.png and b/public/images/emoji/google/water_buffalo.png differ diff --git a/public/images/emoji/google/watermelon.png b/public/images/emoji/google/watermelon.png index d42382a85f..0a142c5eb2 100644 Binary files a/public/images/emoji/google/watermelon.png and b/public/images/emoji/google/watermelon.png differ diff --git a/public/images/emoji/google/wave.png b/public/images/emoji/google/wave.png index 03d613d6e3..354d1e4248 100644 Binary files a/public/images/emoji/google/wave.png and b/public/images/emoji/google/wave.png differ diff --git a/public/images/emoji/google/waving_black_flag.png b/public/images/emoji/google/waving_black_flag.png index fd30f1d882..874033398d 100644 Binary files a/public/images/emoji/google/waving_black_flag.png and b/public/images/emoji/google/waving_black_flag.png differ diff --git a/public/images/emoji/google/waving_white_flag.png b/public/images/emoji/google/waving_white_flag.png index 07d1f0ac70..4564730aab 100644 Binary files a/public/images/emoji/google/waving_white_flag.png and b/public/images/emoji/google/waving_white_flag.png differ diff --git a/public/images/emoji/google/wavy_dash.png b/public/images/emoji/google/wavy_dash.png index 89ce4b9975..71edce96c2 100644 Binary files a/public/images/emoji/google/wavy_dash.png and b/public/images/emoji/google/wavy_dash.png differ diff --git a/public/images/emoji/google/waxing_crescent_moon.png b/public/images/emoji/google/waxing_crescent_moon.png index e3c4042085..0386195112 100644 Binary files a/public/images/emoji/google/waxing_crescent_moon.png and b/public/images/emoji/google/waxing_crescent_moon.png differ diff --git a/public/images/emoji/google/waxing_gibbous_moon.png b/public/images/emoji/google/waxing_gibbous_moon.png index 046e3415c8..477192bb8e 100644 Binary files a/public/images/emoji/google/waxing_gibbous_moon.png and b/public/images/emoji/google/waxing_gibbous_moon.png differ diff --git a/public/images/emoji/google/wc.png b/public/images/emoji/google/wc.png index 4ded4875ad..fa4b9ad952 100644 Binary files a/public/images/emoji/google/wc.png and b/public/images/emoji/google/wc.png differ diff --git a/public/images/emoji/google/weary.png b/public/images/emoji/google/weary.png index 819cd5cc46..bb10646e5c 100644 Binary files a/public/images/emoji/google/weary.png and b/public/images/emoji/google/weary.png differ diff --git a/public/images/emoji/google/wedding.png b/public/images/emoji/google/wedding.png index 1edc1ca2e6..196b6d8475 100644 Binary files a/public/images/emoji/google/wedding.png and b/public/images/emoji/google/wedding.png differ diff --git a/public/images/emoji/google/weight_lifter.png b/public/images/emoji/google/weight_lifter.png index d570f812ae..45a93f757a 100644 Binary files a/public/images/emoji/google/weight_lifter.png and b/public/images/emoji/google/weight_lifter.png differ diff --git a/public/images/emoji/google/weight_lifting_man.png b/public/images/emoji/google/weight_lifting_man.png index d570f812ae..45a93f757a 100644 Binary files a/public/images/emoji/google/weight_lifting_man.png and b/public/images/emoji/google/weight_lifting_man.png differ diff --git a/public/images/emoji/google/weight_lifting_woman.png b/public/images/emoji/google/weight_lifting_woman.png index d47ac9688c..a3360f0aa3 100644 Binary files a/public/images/emoji/google/weight_lifting_woman.png and b/public/images/emoji/google/weight_lifting_woman.png differ diff --git a/public/images/emoji/google/western_sahara.png b/public/images/emoji/google/western_sahara.png index 4faf7e252e..b55ac9b9c9 100644 Binary files a/public/images/emoji/google/western_sahara.png and b/public/images/emoji/google/western_sahara.png differ diff --git a/public/images/emoji/google/whale.png b/public/images/emoji/google/whale.png index 698ee64a11..6244e66aea 100644 Binary files a/public/images/emoji/google/whale.png and b/public/images/emoji/google/whale.png differ diff --git a/public/images/emoji/google/whale2.png b/public/images/emoji/google/whale2.png index 93eac3af50..c2c4b897b9 100644 Binary files a/public/images/emoji/google/whale2.png and b/public/images/emoji/google/whale2.png differ diff --git a/public/images/emoji/google/wheel_of_dharma.png b/public/images/emoji/google/wheel_of_dharma.png index 08c8f26116..28e2fe50fe 100644 Binary files a/public/images/emoji/google/wheel_of_dharma.png and b/public/images/emoji/google/wheel_of_dharma.png differ diff --git a/public/images/emoji/google/wheelchair.png b/public/images/emoji/google/wheelchair.png index 8dcf463590..885518e183 100644 Binary files a/public/images/emoji/google/wheelchair.png and b/public/images/emoji/google/wheelchair.png differ diff --git a/public/images/emoji/google/white_check_mark.png b/public/images/emoji/google/white_check_mark.png index 2383fb4046..7142b7cc40 100644 Binary files a/public/images/emoji/google/white_check_mark.png and b/public/images/emoji/google/white_check_mark.png differ diff --git a/public/images/emoji/google/white_circle.png b/public/images/emoji/google/white_circle.png index ac6931ad0f..88d3cdd62c 100644 Binary files a/public/images/emoji/google/white_circle.png and b/public/images/emoji/google/white_circle.png differ diff --git a/public/images/emoji/google/white_flag.png b/public/images/emoji/google/white_flag.png index 07d1f0ac70..4564730aab 100644 Binary files a/public/images/emoji/google/white_flag.png and b/public/images/emoji/google/white_flag.png differ diff --git a/public/images/emoji/google/white_flower.png b/public/images/emoji/google/white_flower.png index 578e06c423..f33841281d 100644 Binary files a/public/images/emoji/google/white_flower.png and b/public/images/emoji/google/white_flower.png differ diff --git a/public/images/emoji/google/white_frowning_face.png b/public/images/emoji/google/white_frowning_face.png index a8a41ad7c2..bb1b74c970 100644 Binary files a/public/images/emoji/google/white_frowning_face.png and b/public/images/emoji/google/white_frowning_face.png differ diff --git a/public/images/emoji/google/white_large_square.png b/public/images/emoji/google/white_large_square.png index 78b8fc961a..4b50acf0e6 100644 Binary files a/public/images/emoji/google/white_large_square.png and b/public/images/emoji/google/white_large_square.png differ diff --git a/public/images/emoji/google/white_medium_small_square.png b/public/images/emoji/google/white_medium_small_square.png index 56d54d96ab..34a1841646 100644 Binary files a/public/images/emoji/google/white_medium_small_square.png and b/public/images/emoji/google/white_medium_small_square.png differ diff --git a/public/images/emoji/google/white_medium_square.png b/public/images/emoji/google/white_medium_square.png index 9f5e3266fa..d1d7997091 100644 Binary files a/public/images/emoji/google/white_medium_square.png and b/public/images/emoji/google/white_medium_square.png differ diff --git a/public/images/emoji/google/white_small_square.png b/public/images/emoji/google/white_small_square.png index 574c4681f0..24a12867fb 100644 Binary files a/public/images/emoji/google/white_small_square.png and b/public/images/emoji/google/white_small_square.png differ diff --git a/public/images/emoji/google/white_square_button.png b/public/images/emoji/google/white_square_button.png index 8450f15814..4f1e26054a 100644 Binary files a/public/images/emoji/google/white_square_button.png and b/public/images/emoji/google/white_square_button.png differ diff --git a/public/images/emoji/google/white_sun_behind_cloud.png b/public/images/emoji/google/white_sun_behind_cloud.png index 2adf6fc83e..9f630911f5 100644 Binary files a/public/images/emoji/google/white_sun_behind_cloud.png and b/public/images/emoji/google/white_sun_behind_cloud.png differ diff --git a/public/images/emoji/google/white_sun_behind_cloud_with_rain.png b/public/images/emoji/google/white_sun_behind_cloud_with_rain.png index 1d5cfc81bf..003349f4c4 100644 Binary files a/public/images/emoji/google/white_sun_behind_cloud_with_rain.png and b/public/images/emoji/google/white_sun_behind_cloud_with_rain.png differ diff --git a/public/images/emoji/google/white_sun_cloud.png b/public/images/emoji/google/white_sun_cloud.png index 2adf6fc83e..9f630911f5 100644 Binary files a/public/images/emoji/google/white_sun_cloud.png and b/public/images/emoji/google/white_sun_cloud.png differ diff --git a/public/images/emoji/google/white_sun_rain_cloud.png b/public/images/emoji/google/white_sun_rain_cloud.png index 1d5cfc81bf..003349f4c4 100644 Binary files a/public/images/emoji/google/white_sun_rain_cloud.png and b/public/images/emoji/google/white_sun_rain_cloud.png differ diff --git a/public/images/emoji/google/white_sun_small_cloud.png b/public/images/emoji/google/white_sun_small_cloud.png index 91998ebb31..f212aa58ea 100644 Binary files a/public/images/emoji/google/white_sun_small_cloud.png and b/public/images/emoji/google/white_sun_small_cloud.png differ diff --git a/public/images/emoji/google/white_sun_with_small_cloud.png b/public/images/emoji/google/white_sun_with_small_cloud.png index 91998ebb31..f212aa58ea 100644 Binary files a/public/images/emoji/google/white_sun_with_small_cloud.png and b/public/images/emoji/google/white_sun_with_small_cloud.png differ diff --git a/public/images/emoji/google/wilted_flower.png b/public/images/emoji/google/wilted_flower.png index 837b38c2e3..15dd37a91e 100644 Binary files a/public/images/emoji/google/wilted_flower.png and b/public/images/emoji/google/wilted_flower.png differ diff --git a/public/images/emoji/google/wind_blowing_face.png b/public/images/emoji/google/wind_blowing_face.png index 9d4564b7d8..e8a93d9825 100644 Binary files a/public/images/emoji/google/wind_blowing_face.png and b/public/images/emoji/google/wind_blowing_face.png differ diff --git a/public/images/emoji/google/wind_chime.png b/public/images/emoji/google/wind_chime.png index ffe151334a..d4197faaa9 100644 Binary files a/public/images/emoji/google/wind_chime.png and b/public/images/emoji/google/wind_chime.png differ diff --git a/public/images/emoji/google/wind_face.png b/public/images/emoji/google/wind_face.png index 9d4564b7d8..e8a93d9825 100644 Binary files a/public/images/emoji/google/wind_face.png and b/public/images/emoji/google/wind_face.png differ diff --git a/public/images/emoji/google/wine_glass.png b/public/images/emoji/google/wine_glass.png index 4bbae3e731..d79da43097 100644 Binary files a/public/images/emoji/google/wine_glass.png and b/public/images/emoji/google/wine_glass.png differ diff --git a/public/images/emoji/google/wink.png b/public/images/emoji/google/wink.png index 10bad34b20..89bacf47b1 100644 Binary files a/public/images/emoji/google/wink.png and b/public/images/emoji/google/wink.png differ diff --git a/public/images/emoji/google/wolf.png b/public/images/emoji/google/wolf.png index 65207a1ec6..9acb43a253 100644 Binary files a/public/images/emoji/google/wolf.png and b/public/images/emoji/google/wolf.png differ diff --git a/public/images/emoji/google/woman.png b/public/images/emoji/google/woman.png index 3435d4c5a6..8a4e74c415 100644 Binary files a/public/images/emoji/google/woman.png and b/public/images/emoji/google/woman.png differ diff --git a/public/images/emoji/google/woman_artist.png b/public/images/emoji/google/woman_artist.png index c9f5f02115..b1ba16c97e 100644 Binary files a/public/images/emoji/google/woman_artist.png and b/public/images/emoji/google/woman_artist.png differ diff --git a/public/images/emoji/google/woman_astronaut.png b/public/images/emoji/google/woman_astronaut.png index 1c5f4fc51f..32874e51d6 100644 Binary files a/public/images/emoji/google/woman_astronaut.png and b/public/images/emoji/google/woman_astronaut.png differ diff --git a/public/images/emoji/google/woman_bald.png b/public/images/emoji/google/woman_bald.png new file mode 100644 index 0000000000..26da9a32fd Binary files /dev/null and b/public/images/emoji/google/woman_bald.png differ diff --git a/public/images/emoji/google/woman_cartwheeling.png b/public/images/emoji/google/woman_cartwheeling.png index 4bb67d8513..1bb593cc18 100644 Binary files a/public/images/emoji/google/woman_cartwheeling.png and b/public/images/emoji/google/woman_cartwheeling.png differ diff --git a/public/images/emoji/google/woman_climbing.png b/public/images/emoji/google/woman_climbing.png index 021a0b719a..cf541159e6 100644 Binary files a/public/images/emoji/google/woman_climbing.png and b/public/images/emoji/google/woman_climbing.png differ diff --git a/public/images/emoji/google/woman_cook.png b/public/images/emoji/google/woman_cook.png index 2d3c1889ea..f3525e3d4e 100644 Binary files a/public/images/emoji/google/woman_cook.png and b/public/images/emoji/google/woman_cook.png differ diff --git a/public/images/emoji/google/woman_curly_haired.png b/public/images/emoji/google/woman_curly_haired.png new file mode 100644 index 0000000000..8b88e8e16b Binary files /dev/null and b/public/images/emoji/google/woman_curly_haired.png differ diff --git a/public/images/emoji/google/woman_facepalming.png b/public/images/emoji/google/woman_facepalming.png index fd22474456..2834c7677b 100644 Binary files a/public/images/emoji/google/woman_facepalming.png and b/public/images/emoji/google/woman_facepalming.png differ diff --git a/public/images/emoji/google/woman_factory_worker.png b/public/images/emoji/google/woman_factory_worker.png index 8e050581c8..ecb19ddeca 100644 Binary files a/public/images/emoji/google/woman_factory_worker.png and b/public/images/emoji/google/woman_factory_worker.png differ diff --git a/public/images/emoji/google/woman_farmer.png b/public/images/emoji/google/woman_farmer.png index 7a3a131c26..0d8b5448bc 100644 Binary files a/public/images/emoji/google/woman_farmer.png and b/public/images/emoji/google/woman_farmer.png differ diff --git a/public/images/emoji/google/woman_firefighter.png b/public/images/emoji/google/woman_firefighter.png index b6d109ae50..a6cab3b94d 100644 Binary files a/public/images/emoji/google/woman_firefighter.png and b/public/images/emoji/google/woman_firefighter.png differ diff --git a/public/images/emoji/google/woman_genie.png b/public/images/emoji/google/woman_genie.png index 19c606d424..0c228ad64c 100644 Binary files a/public/images/emoji/google/woman_genie.png and b/public/images/emoji/google/woman_genie.png differ diff --git a/public/images/emoji/google/woman_health_worker.png b/public/images/emoji/google/woman_health_worker.png index 810c445fc2..cceb75b746 100644 Binary files a/public/images/emoji/google/woman_health_worker.png and b/public/images/emoji/google/woman_health_worker.png differ diff --git a/public/images/emoji/google/woman_in_lotus_position.png b/public/images/emoji/google/woman_in_lotus_position.png index 17aaf80ab6..06640cec30 100644 Binary files a/public/images/emoji/google/woman_in_lotus_position.png and b/public/images/emoji/google/woman_in_lotus_position.png differ diff --git a/public/images/emoji/google/woman_in_steamy_room.png b/public/images/emoji/google/woman_in_steamy_room.png index 1395f737c3..ab8cad151b 100644 Binary files a/public/images/emoji/google/woman_in_steamy_room.png and b/public/images/emoji/google/woman_in_steamy_room.png differ diff --git a/public/images/emoji/google/woman_judge.png b/public/images/emoji/google/woman_judge.png index ebee12d4a9..05c3f63a42 100644 Binary files a/public/images/emoji/google/woman_judge.png and b/public/images/emoji/google/woman_judge.png differ diff --git a/public/images/emoji/google/woman_juggling.png b/public/images/emoji/google/woman_juggling.png index b843d5530c..f0d45794e9 100644 Binary files a/public/images/emoji/google/woman_juggling.png and b/public/images/emoji/google/woman_juggling.png differ diff --git a/public/images/emoji/google/woman_mage.png b/public/images/emoji/google/woman_mage.png index 887a5bbfa9..f19be0d06d 100644 Binary files a/public/images/emoji/google/woman_mage.png and b/public/images/emoji/google/woman_mage.png differ diff --git a/public/images/emoji/google/woman_mechanic.png b/public/images/emoji/google/woman_mechanic.png index 70af3085a4..7377c990d3 100644 Binary files a/public/images/emoji/google/woman_mechanic.png and b/public/images/emoji/google/woman_mechanic.png differ diff --git a/public/images/emoji/google/woman_office_worker.png b/public/images/emoji/google/woman_office_worker.png index 7778c68537..68036b7f62 100644 Binary files a/public/images/emoji/google/woman_office_worker.png and b/public/images/emoji/google/woman_office_worker.png differ diff --git a/public/images/emoji/google/woman_pilot.png b/public/images/emoji/google/woman_pilot.png index 5b3ad9ff31..718a8f2b7e 100644 Binary files a/public/images/emoji/google/woman_pilot.png and b/public/images/emoji/google/woman_pilot.png differ diff --git a/public/images/emoji/google/woman_playing_handball.png b/public/images/emoji/google/woman_playing_handball.png index f204321526..6014a9ef85 100644 Binary files a/public/images/emoji/google/woman_playing_handball.png and b/public/images/emoji/google/woman_playing_handball.png differ diff --git a/public/images/emoji/google/woman_playing_water_polo.png b/public/images/emoji/google/woman_playing_water_polo.png index e83877e5ee..1226affcb8 100644 Binary files a/public/images/emoji/google/woman_playing_water_polo.png and b/public/images/emoji/google/woman_playing_water_polo.png differ diff --git a/public/images/emoji/google/woman_red_haired.png b/public/images/emoji/google/woman_red_haired.png new file mode 100644 index 0000000000..d345e4e24e Binary files /dev/null and b/public/images/emoji/google/woman_red_haired.png differ diff --git a/public/images/emoji/google/woman_scientist.png b/public/images/emoji/google/woman_scientist.png index fc03c53a8b..0388805e0c 100644 Binary files a/public/images/emoji/google/woman_scientist.png and b/public/images/emoji/google/woman_scientist.png differ diff --git a/public/images/emoji/google/woman_shrugging.png b/public/images/emoji/google/woman_shrugging.png index 4de665abd3..f16f251ebe 100644 Binary files a/public/images/emoji/google/woman_shrugging.png and b/public/images/emoji/google/woman_shrugging.png differ diff --git a/public/images/emoji/google/woman_singer.png b/public/images/emoji/google/woman_singer.png index b6fb24c2c5..86e33860ba 100644 Binary files a/public/images/emoji/google/woman_singer.png and b/public/images/emoji/google/woman_singer.png differ diff --git a/public/images/emoji/google/woman_student.png b/public/images/emoji/google/woman_student.png index 6b80f9e6e1..71833dabf6 100644 Binary files a/public/images/emoji/google/woman_student.png and b/public/images/emoji/google/woman_student.png differ diff --git a/public/images/emoji/google/woman_superhero.png b/public/images/emoji/google/woman_superhero.png new file mode 100644 index 0000000000..0161e4b0da Binary files /dev/null and b/public/images/emoji/google/woman_superhero.png differ diff --git a/public/images/emoji/google/woman_supervillain.png b/public/images/emoji/google/woman_supervillain.png new file mode 100644 index 0000000000..133e2145e4 Binary files /dev/null and b/public/images/emoji/google/woman_supervillain.png differ diff --git a/public/images/emoji/google/woman_teacher.png b/public/images/emoji/google/woman_teacher.png index 7c14455208..18131b7be4 100644 Binary files a/public/images/emoji/google/woman_teacher.png and b/public/images/emoji/google/woman_teacher.png differ diff --git a/public/images/emoji/google/woman_technologist.png b/public/images/emoji/google/woman_technologist.png index aa4d0dbfbd..0fa5efbb2c 100644 Binary files a/public/images/emoji/google/woman_technologist.png and b/public/images/emoji/google/woman_technologist.png differ diff --git a/public/images/emoji/google/woman_white_haired.png b/public/images/emoji/google/woman_white_haired.png new file mode 100644 index 0000000000..35a2835677 Binary files /dev/null and b/public/images/emoji/google/woman_white_haired.png differ diff --git a/public/images/emoji/google/woman_with_headscarf.png b/public/images/emoji/google/woman_with_headscarf.png index a7618a078e..3c4ec8ac51 100644 Binary files a/public/images/emoji/google/woman_with_headscarf.png and b/public/images/emoji/google/woman_with_headscarf.png differ diff --git a/public/images/emoji/google/woman_with_turban.png b/public/images/emoji/google/woman_with_turban.png index b185935f8a..1937b63cd3 100644 Binary files a/public/images/emoji/google/woman_with_turban.png and b/public/images/emoji/google/woman_with_turban.png differ diff --git a/public/images/emoji/google/woman_zombie.png b/public/images/emoji/google/woman_zombie.png index 10ad1aa869..b3f46ce4c8 100644 Binary files a/public/images/emoji/google/woman_zombie.png and b/public/images/emoji/google/woman_zombie.png differ diff --git a/public/images/emoji/google/womans_clothes.png b/public/images/emoji/google/womans_clothes.png index 3d25e5f0fb..5027f06111 100644 Binary files a/public/images/emoji/google/womans_clothes.png and b/public/images/emoji/google/womans_clothes.png differ diff --git a/public/images/emoji/google/womans_hat.png b/public/images/emoji/google/womans_hat.png index aeb6810c68..e67c592557 100644 Binary files a/public/images/emoji/google/womans_hat.png and b/public/images/emoji/google/womans_hat.png differ diff --git a/public/images/emoji/google/women_wrestling.png b/public/images/emoji/google/women_wrestling.png index e36f803bc1..c9d79ca613 100644 Binary files a/public/images/emoji/google/women_wrestling.png and b/public/images/emoji/google/women_wrestling.png differ diff --git a/public/images/emoji/google/womens.png b/public/images/emoji/google/womens.png index fbed788577..9588b32919 100644 Binary files a/public/images/emoji/google/womens.png and b/public/images/emoji/google/womens.png differ diff --git a/public/images/emoji/google/woozy_face.png b/public/images/emoji/google/woozy_face.png new file mode 100644 index 0000000000..b10c5bf975 Binary files /dev/null and b/public/images/emoji/google/woozy_face.png differ diff --git a/public/images/emoji/google/world_map.png b/public/images/emoji/google/world_map.png index 349e4d46c3..79b4db6529 100644 Binary files a/public/images/emoji/google/world_map.png and b/public/images/emoji/google/world_map.png differ diff --git a/public/images/emoji/google/worried.png b/public/images/emoji/google/worried.png index d8b79a0027..48c7246770 100644 Binary files a/public/images/emoji/google/worried.png and b/public/images/emoji/google/worried.png differ diff --git a/public/images/emoji/google/worship_symbol.png b/public/images/emoji/google/worship_symbol.png index 6e4d8a9248..a9a2024235 100644 Binary files a/public/images/emoji/google/worship_symbol.png and b/public/images/emoji/google/worship_symbol.png differ diff --git a/public/images/emoji/google/wrench.png b/public/images/emoji/google/wrench.png index 0e29e42350..d7c180ee75 100644 Binary files a/public/images/emoji/google/wrench.png and b/public/images/emoji/google/wrench.png differ diff --git a/public/images/emoji/google/writing_hand.png b/public/images/emoji/google/writing_hand.png index 1b2437ce16..93b86c4261 100644 Binary files a/public/images/emoji/google/writing_hand.png and b/public/images/emoji/google/writing_hand.png differ diff --git a/public/images/emoji/google/x.png b/public/images/emoji/google/x.png index ad0b48ae1d..6bbe1973ca 100644 Binary files a/public/images/emoji/google/x.png and b/public/images/emoji/google/x.png differ diff --git a/public/images/emoji/google/yarn.png b/public/images/emoji/google/yarn.png new file mode 100644 index 0000000000..778027f310 Binary files /dev/null and b/public/images/emoji/google/yarn.png differ diff --git a/public/images/emoji/google/yellow_heart.png b/public/images/emoji/google/yellow_heart.png index 2257f32872..1f1f9cb634 100644 Binary files a/public/images/emoji/google/yellow_heart.png and b/public/images/emoji/google/yellow_heart.png differ diff --git a/public/images/emoji/google/yemen.png b/public/images/emoji/google/yemen.png index 625b500446..89b32f1cf3 100644 Binary files a/public/images/emoji/google/yemen.png and b/public/images/emoji/google/yemen.png differ diff --git a/public/images/emoji/google/yen.png b/public/images/emoji/google/yen.png index 68278ea169..c7695d3816 100644 Binary files a/public/images/emoji/google/yen.png and b/public/images/emoji/google/yen.png differ diff --git a/public/images/emoji/google/yin_yang.png b/public/images/emoji/google/yin_yang.png index c373421039..60638f1b1f 100644 Binary files a/public/images/emoji/google/yin_yang.png and b/public/images/emoji/google/yin_yang.png differ diff --git a/public/images/emoji/google/yum.png b/public/images/emoji/google/yum.png index 745c3142d8..5827f5d7a0 100644 Binary files a/public/images/emoji/google/yum.png and b/public/images/emoji/google/yum.png differ diff --git a/public/images/emoji/google/zambia.png b/public/images/emoji/google/zambia.png index 7792a4e44a..a7c3ef3716 100644 Binary files a/public/images/emoji/google/zambia.png and b/public/images/emoji/google/zambia.png differ diff --git a/public/images/emoji/google/zap.png b/public/images/emoji/google/zap.png index 5b3e5105eb..64cbe99972 100644 Binary files a/public/images/emoji/google/zap.png and b/public/images/emoji/google/zap.png differ diff --git a/public/images/emoji/google/zebra.png b/public/images/emoji/google/zebra.png index b00eceb4ba..05efed0b35 100644 Binary files a/public/images/emoji/google/zebra.png and b/public/images/emoji/google/zebra.png differ diff --git a/public/images/emoji/google/zero.png b/public/images/emoji/google/zero.png index 532f2f316d..79bbf7fbe0 100644 Binary files a/public/images/emoji/google/zero.png and b/public/images/emoji/google/zero.png differ diff --git a/public/images/emoji/google/zimbabwe.png b/public/images/emoji/google/zimbabwe.png index 5cb7e4bf1a..19f8317850 100644 Binary files a/public/images/emoji/google/zimbabwe.png and b/public/images/emoji/google/zimbabwe.png differ diff --git a/public/images/emoji/google/zipper_mouth.png b/public/images/emoji/google/zipper_mouth.png index 9743cd48eb..3757acba82 100644 Binary files a/public/images/emoji/google/zipper_mouth.png and b/public/images/emoji/google/zipper_mouth.png differ diff --git a/public/images/emoji/google/zipper_mouth_face.png b/public/images/emoji/google/zipper_mouth_face.png index 9743cd48eb..3757acba82 100644 Binary files a/public/images/emoji/google/zipper_mouth_face.png and b/public/images/emoji/google/zipper_mouth_face.png differ diff --git a/public/images/emoji/google/zombie.png b/public/images/emoji/google/zombie.png index 10ad1aa869..b3f46ce4c8 100644 Binary files a/public/images/emoji/google/zombie.png and b/public/images/emoji/google/zombie.png differ diff --git a/public/images/emoji/google/zzz.png b/public/images/emoji/google/zzz.png index 7f0b4a2577..fa25468471 100644 Binary files a/public/images/emoji/google/zzz.png and b/public/images/emoji/google/zzz.png differ diff --git a/public/images/emoji/google_classic/abacus.png b/public/images/emoji/google_classic/abacus.png new file mode 100644 index 0000000000..e56e558529 Binary files /dev/null and b/public/images/emoji/google_classic/abacus.png differ diff --git a/public/images/emoji/google_classic/adult.png b/public/images/emoji/google_classic/adult.png index 53a5eb2ccb..edc9805e76 100644 Binary files a/public/images/emoji/google_classic/adult.png and b/public/images/emoji/google_classic/adult.png differ diff --git a/public/images/emoji/google_classic/badger.png b/public/images/emoji/google_classic/badger.png new file mode 100644 index 0000000000..3428da8863 Binary files /dev/null and b/public/images/emoji/google_classic/badger.png differ diff --git a/public/images/emoji/google_classic/bagel.png b/public/images/emoji/google_classic/bagel.png new file mode 100644 index 0000000000..99312be2fe Binary files /dev/null and b/public/images/emoji/google_classic/bagel.png differ diff --git a/public/images/emoji/google_classic/basket.png b/public/images/emoji/google_classic/basket.png new file mode 100644 index 0000000000..020899092f Binary files /dev/null and b/public/images/emoji/google_classic/basket.png differ diff --git a/public/images/emoji/google_classic/bearded_person.png b/public/images/emoji/google_classic/bearded_person.png index ed22a6cb38..db4c1a2725 100644 Binary files a/public/images/emoji/google_classic/bearded_person.png and b/public/images/emoji/google_classic/bearded_person.png differ diff --git a/public/images/emoji/google_classic/billed_cap.png b/public/images/emoji/google_classic/billed_cap.png index 5cc92e307e..1441df8c83 100644 Binary files a/public/images/emoji/google_classic/billed_cap.png and b/public/images/emoji/google_classic/billed_cap.png differ diff --git a/public/images/emoji/google_classic/bone.png b/public/images/emoji/google_classic/bone.png new file mode 100644 index 0000000000..0b54e2b72a Binary files /dev/null and b/public/images/emoji/google_classic/bone.png differ diff --git a/public/images/emoji/google_classic/bowl_with_spoon.png b/public/images/emoji/google_classic/bowl_with_spoon.png index b0d88a73b9..2905488376 100644 Binary files a/public/images/emoji/google_classic/bowl_with_spoon.png and b/public/images/emoji/google_classic/bowl_with_spoon.png differ diff --git a/public/images/emoji/google_classic/brain.png b/public/images/emoji/google_classic/brain.png index c8e889faec..1c3928ae8b 100644 Binary files a/public/images/emoji/google_classic/brain.png and b/public/images/emoji/google_classic/brain.png differ diff --git a/public/images/emoji/google_classic/breast_feeding.png b/public/images/emoji/google_classic/breast_feeding.png index 815538138b..dba766f9a0 100644 Binary files a/public/images/emoji/google_classic/breast_feeding.png and b/public/images/emoji/google_classic/breast_feeding.png differ diff --git a/public/images/emoji/google_classic/brick.png b/public/images/emoji/google_classic/brick.png new file mode 100644 index 0000000000..5b87f50c8d Binary files /dev/null and b/public/images/emoji/google_classic/brick.png differ diff --git a/public/images/emoji/google_classic/broccoli.png b/public/images/emoji/google_classic/broccoli.png index 5e03a6d23b..ddff80ceda 100644 Binary files a/public/images/emoji/google_classic/broccoli.png and b/public/images/emoji/google_classic/broccoli.png differ diff --git a/public/images/emoji/google_classic/broom.png b/public/images/emoji/google_classic/broom.png new file mode 100644 index 0000000000..88fe3eeb3b Binary files /dev/null and b/public/images/emoji/google_classic/broom.png differ diff --git a/public/images/emoji/google_classic/canned_food.png b/public/images/emoji/google_classic/canned_food.png index 2e5976e9d2..0c6ef0fadd 100644 Binary files a/public/images/emoji/google_classic/canned_food.png and b/public/images/emoji/google_classic/canned_food.png differ diff --git a/public/images/emoji/google_classic/chess_pawn.png b/public/images/emoji/google_classic/chess_pawn.png new file mode 100644 index 0000000000..5ec149c62a Binary files /dev/null and b/public/images/emoji/google_classic/chess_pawn.png differ diff --git a/public/images/emoji/google_classic/child.png b/public/images/emoji/google_classic/child.png index 33e50494a3..f50324d8a6 100644 Binary files a/public/images/emoji/google_classic/child.png and b/public/images/emoji/google_classic/child.png differ diff --git a/public/images/emoji/google_classic/chopsticks.png b/public/images/emoji/google_classic/chopsticks.png index 5706420297..8284c128fe 100644 Binary files a/public/images/emoji/google_classic/chopsticks.png and b/public/images/emoji/google_classic/chopsticks.png differ diff --git a/public/images/emoji/google_classic/coat.png b/public/images/emoji/google_classic/coat.png index c409f9f4c4..22d04aef56 100644 Binary files a/public/images/emoji/google_classic/coat.png and b/public/images/emoji/google_classic/coat.png differ diff --git a/public/images/emoji/google_classic/coconut.png b/public/images/emoji/google_classic/coconut.png index e76b533149..aef109db3c 100644 Binary files a/public/images/emoji/google_classic/coconut.png and b/public/images/emoji/google_classic/coconut.png differ diff --git a/public/images/emoji/google_classic/cold_face.png b/public/images/emoji/google_classic/cold_face.png new file mode 100644 index 0000000000..6d14820c56 Binary files /dev/null and b/public/images/emoji/google_classic/cold_face.png differ diff --git a/public/images/emoji/google_classic/compass.png b/public/images/emoji/google_classic/compass.png new file mode 100644 index 0000000000..ff199d4822 Binary files /dev/null and b/public/images/emoji/google_classic/compass.png differ diff --git a/public/images/emoji/google_classic/crazy_face.png b/public/images/emoji/google_classic/crazy_face.png index 0aaa1cf765..6b99ce4e08 100644 Binary files a/public/images/emoji/google_classic/crazy_face.png and b/public/images/emoji/google_classic/crazy_face.png differ diff --git a/public/images/emoji/google_classic/cup_with_straw.png b/public/images/emoji/google_classic/cup_with_straw.png index 4b2f313f9b..230ddbffb0 100644 Binary files a/public/images/emoji/google_classic/cup_with_straw.png and b/public/images/emoji/google_classic/cup_with_straw.png differ diff --git a/public/images/emoji/google_classic/cupcake.png b/public/images/emoji/google_classic/cupcake.png new file mode 100644 index 0000000000..68d3be724f Binary files /dev/null and b/public/images/emoji/google_classic/cupcake.png differ diff --git a/public/images/emoji/google_classic/curling_stone.png b/public/images/emoji/google_classic/curling_stone.png index 09027a2fb2..65228c2db8 100644 Binary files a/public/images/emoji/google_classic/curling_stone.png and b/public/images/emoji/google_classic/curling_stone.png differ diff --git a/public/images/emoji/google_classic/cut_of_meat.png b/public/images/emoji/google_classic/cut_of_meat.png index b66d427e09..5eab364621 100644 Binary files a/public/images/emoji/google_classic/cut_of_meat.png and b/public/images/emoji/google_classic/cut_of_meat.png differ diff --git a/public/images/emoji/google_classic/dna.png b/public/images/emoji/google_classic/dna.png new file mode 100644 index 0000000000..66efccf23c Binary files /dev/null and b/public/images/emoji/google_classic/dna.png differ diff --git a/public/images/emoji/google_classic/dumpling.png b/public/images/emoji/google_classic/dumpling.png index 489a779bf6..82136b8ef4 100644 Binary files a/public/images/emoji/google_classic/dumpling.png and b/public/images/emoji/google_classic/dumpling.png differ diff --git a/public/images/emoji/google_classic/elf.png b/public/images/emoji/google_classic/elf.png index f8b6dd873e..79eeb23e9b 100644 Binary files a/public/images/emoji/google_classic/elf.png and b/public/images/emoji/google_classic/elf.png differ diff --git a/public/images/emoji/google_classic/exploding_head.png b/public/images/emoji/google_classic/exploding_head.png index 85532dadc7..f7eaf580ba 100644 Binary files a/public/images/emoji/google_classic/exploding_head.png and b/public/images/emoji/google_classic/exploding_head.png differ diff --git a/public/images/emoji/google_classic/face_vomiting.png b/public/images/emoji/google_classic/face_vomiting.png index cd7c3d1f2b..40eae56836 100644 Binary files a/public/images/emoji/google_classic/face_vomiting.png and b/public/images/emoji/google_classic/face_vomiting.png differ diff --git a/public/images/emoji/google_classic/face_with_hand_over_mouth.png b/public/images/emoji/google_classic/face_with_hand_over_mouth.png index aed8f62e0b..3aa3b67de2 100644 Binary files a/public/images/emoji/google_classic/face_with_hand_over_mouth.png and b/public/images/emoji/google_classic/face_with_hand_over_mouth.png differ diff --git a/public/images/emoji/google_classic/face_with_monocle.png b/public/images/emoji/google_classic/face_with_monocle.png index c6fbb4481d..33b85f47a0 100644 Binary files a/public/images/emoji/google_classic/face_with_monocle.png and b/public/images/emoji/google_classic/face_with_monocle.png differ diff --git a/public/images/emoji/google_classic/face_with_raised_eyebrow.png b/public/images/emoji/google_classic/face_with_raised_eyebrow.png index 887f70e365..db22dd7d2f 100644 Binary files a/public/images/emoji/google_classic/face_with_raised_eyebrow.png and b/public/images/emoji/google_classic/face_with_raised_eyebrow.png differ diff --git a/public/images/emoji/google_classic/face_with_symbols_over_mouth.png b/public/images/emoji/google_classic/face_with_symbols_over_mouth.png index 84bb9ec9c5..5cde0c98da 100644 Binary files a/public/images/emoji/google_classic/face_with_symbols_over_mouth.png and b/public/images/emoji/google_classic/face_with_symbols_over_mouth.png differ diff --git a/public/images/emoji/google_classic/fairy.png b/public/images/emoji/google_classic/fairy.png index 429938294b..b4a1e9a4f9 100644 Binary files a/public/images/emoji/google_classic/fairy.png and b/public/images/emoji/google_classic/fairy.png differ diff --git a/public/images/emoji/google_classic/fire_extinguisher.png b/public/images/emoji/google_classic/fire_extinguisher.png new file mode 100644 index 0000000000..f05d9276a1 Binary files /dev/null and b/public/images/emoji/google_classic/fire_extinguisher.png differ diff --git a/public/images/emoji/google_classic/firecracker.png b/public/images/emoji/google_classic/firecracker.png new file mode 100644 index 0000000000..0364e240bd Binary files /dev/null and b/public/images/emoji/google_classic/firecracker.png differ diff --git a/public/images/emoji/google_classic/flat_shoe.png b/public/images/emoji/google_classic/flat_shoe.png new file mode 100644 index 0000000000..2898e55dc0 Binary files /dev/null and b/public/images/emoji/google_classic/flat_shoe.png differ diff --git a/public/images/emoji/google_classic/flying_disc.png b/public/images/emoji/google_classic/flying_disc.png new file mode 100644 index 0000000000..ef34259ead Binary files /dev/null and b/public/images/emoji/google_classic/flying_disc.png differ diff --git a/public/images/emoji/google_classic/flying_saucer.png b/public/images/emoji/google_classic/flying_saucer.png index 7d5c862855..ae7b217a2f 100644 Binary files a/public/images/emoji/google_classic/flying_saucer.png and b/public/images/emoji/google_classic/flying_saucer.png differ diff --git a/public/images/emoji/google_classic/foot.png b/public/images/emoji/google_classic/foot.png new file mode 100644 index 0000000000..ed57c2bd9c Binary files /dev/null and b/public/images/emoji/google_classic/foot.png differ diff --git a/public/images/emoji/google_classic/fortune_cookie.png b/public/images/emoji/google_classic/fortune_cookie.png index 94a8cdca40..a1e8958af7 100644 Binary files a/public/images/emoji/google_classic/fortune_cookie.png and b/public/images/emoji/google_classic/fortune_cookie.png differ diff --git a/public/images/emoji/google_classic/genie.png b/public/images/emoji/google_classic/genie.png index f0eddcc91a..beea2145b1 100644 Binary files a/public/images/emoji/google_classic/genie.png and b/public/images/emoji/google_classic/genie.png differ diff --git a/public/images/emoji/google_classic/giraffe.png b/public/images/emoji/google_classic/giraffe.png index be0e85d289..5d8aedfefe 100644 Binary files a/public/images/emoji/google_classic/giraffe.png and b/public/images/emoji/google_classic/giraffe.png differ diff --git a/public/images/emoji/google_classic/gloves.png b/public/images/emoji/google_classic/gloves.png index 1a11dd2c56..ba0a2af68b 100644 Binary files a/public/images/emoji/google_classic/gloves.png and b/public/images/emoji/google_classic/gloves.png differ diff --git a/public/images/emoji/google_classic/goggles.png b/public/images/emoji/google_classic/goggles.png new file mode 100644 index 0000000000..0cf62133d7 Binary files /dev/null and b/public/images/emoji/google_classic/goggles.png differ diff --git a/public/images/emoji/google_classic/hedgehog.png b/public/images/emoji/google_classic/hedgehog.png index 9b978b3540..6f92de0e03 100644 Binary files a/public/images/emoji/google_classic/hedgehog.png and b/public/images/emoji/google_classic/hedgehog.png differ diff --git a/public/images/emoji/google_classic/hiking_boot.png b/public/images/emoji/google_classic/hiking_boot.png new file mode 100644 index 0000000000..1e97c61b01 Binary files /dev/null and b/public/images/emoji/google_classic/hiking_boot.png differ diff --git a/public/images/emoji/google_classic/hippopotamus.png b/public/images/emoji/google_classic/hippopotamus.png new file mode 100644 index 0000000000..87048aaa59 Binary files /dev/null and b/public/images/emoji/google_classic/hippopotamus.png differ diff --git a/public/images/emoji/google_classic/hot_face.png b/public/images/emoji/google_classic/hot_face.png new file mode 100644 index 0000000000..08e3a353d4 Binary files /dev/null and b/public/images/emoji/google_classic/hot_face.png differ diff --git a/public/images/emoji/google_classic/infinity.png b/public/images/emoji/google_classic/infinity.png new file mode 100644 index 0000000000..778e87b2e4 Binary files /dev/null and b/public/images/emoji/google_classic/infinity.png differ diff --git a/public/images/emoji/google_classic/jigsaw.png b/public/images/emoji/google_classic/jigsaw.png new file mode 100644 index 0000000000..3039cfa0a3 Binary files /dev/null and b/public/images/emoji/google_classic/jigsaw.png differ diff --git a/public/images/emoji/google_classic/kangaroo.png b/public/images/emoji/google_classic/kangaroo.png new file mode 100644 index 0000000000..40444a28e8 Binary files /dev/null and b/public/images/emoji/google_classic/kangaroo.png differ diff --git a/public/images/emoji/google_classic/lab_coat.png b/public/images/emoji/google_classic/lab_coat.png new file mode 100644 index 0000000000..fcce6d1f47 Binary files /dev/null and b/public/images/emoji/google_classic/lab_coat.png differ diff --git a/public/images/emoji/google_classic/lacrosse.png b/public/images/emoji/google_classic/lacrosse.png new file mode 100644 index 0000000000..c4209eef02 Binary files /dev/null and b/public/images/emoji/google_classic/lacrosse.png differ diff --git a/public/images/emoji/google_classic/leafy_green.png b/public/images/emoji/google_classic/leafy_green.png new file mode 100644 index 0000000000..31601f0505 Binary files /dev/null and b/public/images/emoji/google_classic/leafy_green.png differ diff --git a/public/images/emoji/google_classic/leg.png b/public/images/emoji/google_classic/leg.png new file mode 100644 index 0000000000..b0087b4926 Binary files /dev/null and b/public/images/emoji/google_classic/leg.png differ diff --git a/public/images/emoji/google_classic/llama.png b/public/images/emoji/google_classic/llama.png new file mode 100644 index 0000000000..d43ae19ae1 Binary files /dev/null and b/public/images/emoji/google_classic/llama.png differ diff --git a/public/images/emoji/google_classic/lobster.png b/public/images/emoji/google_classic/lobster.png new file mode 100644 index 0000000000..17f50fa439 Binary files /dev/null and b/public/images/emoji/google_classic/lobster.png differ diff --git a/public/images/emoji/google_classic/lotion_bottle.png b/public/images/emoji/google_classic/lotion_bottle.png new file mode 100644 index 0000000000..48684bc139 Binary files /dev/null and b/public/images/emoji/google_classic/lotion_bottle.png differ diff --git a/public/images/emoji/google_classic/love_you_gesture.png b/public/images/emoji/google_classic/love_you_gesture.png index 14ef7c72b2..c9dd359430 100644 Binary files a/public/images/emoji/google_classic/love_you_gesture.png and b/public/images/emoji/google_classic/love_you_gesture.png differ diff --git a/public/images/emoji/google_classic/luggage.png b/public/images/emoji/google_classic/luggage.png new file mode 100644 index 0000000000..1da11d48c5 Binary files /dev/null and b/public/images/emoji/google_classic/luggage.png differ diff --git a/public/images/emoji/google_classic/mage.png b/public/images/emoji/google_classic/mage.png index 71c1b13f92..604d0e4968 100644 Binary files a/public/images/emoji/google_classic/mage.png and b/public/images/emoji/google_classic/mage.png differ diff --git a/public/images/emoji/google_classic/magnet.png b/public/images/emoji/google_classic/magnet.png new file mode 100644 index 0000000000..6cbe88e681 Binary files /dev/null and b/public/images/emoji/google_classic/magnet.png differ diff --git a/public/images/emoji/google_classic/man_bald.png b/public/images/emoji/google_classic/man_bald.png new file mode 100644 index 0000000000..8e3a838506 Binary files /dev/null and b/public/images/emoji/google_classic/man_bald.png differ diff --git a/public/images/emoji/google_classic/man_curly_haired.png b/public/images/emoji/google_classic/man_curly_haired.png new file mode 100644 index 0000000000..6c1396b114 Binary files /dev/null and b/public/images/emoji/google_classic/man_curly_haired.png differ diff --git a/public/images/emoji/google_classic/man_red_haired.png b/public/images/emoji/google_classic/man_red_haired.png new file mode 100644 index 0000000000..4d5ef0e840 Binary files /dev/null and b/public/images/emoji/google_classic/man_red_haired.png differ diff --git a/public/images/emoji/google_classic/man_superhero.png b/public/images/emoji/google_classic/man_superhero.png new file mode 100644 index 0000000000..9082575ce9 Binary files /dev/null and b/public/images/emoji/google_classic/man_superhero.png differ diff --git a/public/images/emoji/google_classic/man_supervillain.png b/public/images/emoji/google_classic/man_supervillain.png new file mode 100644 index 0000000000..634a3f4920 Binary files /dev/null and b/public/images/emoji/google_classic/man_supervillain.png differ diff --git a/public/images/emoji/google_classic/man_white_haired.png b/public/images/emoji/google_classic/man_white_haired.png new file mode 100644 index 0000000000..f31b3a078c Binary files /dev/null and b/public/images/emoji/google_classic/man_white_haired.png differ diff --git a/public/images/emoji/google_classic/mango.png b/public/images/emoji/google_classic/mango.png new file mode 100644 index 0000000000..96d630c7bf Binary files /dev/null and b/public/images/emoji/google_classic/mango.png differ diff --git a/public/images/emoji/google_classic/mermaid.png b/public/images/emoji/google_classic/mermaid.png index ee1b999e0d..9418465ed4 100644 Binary files a/public/images/emoji/google_classic/mermaid.png and b/public/images/emoji/google_classic/mermaid.png differ diff --git a/public/images/emoji/google_classic/merman.png b/public/images/emoji/google_classic/merman.png index ab9e191536..cae53f4d68 100644 Binary files a/public/images/emoji/google_classic/merman.png and b/public/images/emoji/google_classic/merman.png differ diff --git a/public/images/emoji/google_classic/microbe.png b/public/images/emoji/google_classic/microbe.png new file mode 100644 index 0000000000..1b687cbe7b Binary files /dev/null and b/public/images/emoji/google_classic/microbe.png differ diff --git a/public/images/emoji/google_classic/moon_cake.png b/public/images/emoji/google_classic/moon_cake.png new file mode 100644 index 0000000000..409640aa73 Binary files /dev/null and b/public/images/emoji/google_classic/moon_cake.png differ diff --git a/public/images/emoji/google_classic/mosquito.png b/public/images/emoji/google_classic/mosquito.png new file mode 100644 index 0000000000..325c90ea79 Binary files /dev/null and b/public/images/emoji/google_classic/mosquito.png differ diff --git a/public/images/emoji/google_classic/nazar_amulet.png b/public/images/emoji/google_classic/nazar_amulet.png new file mode 100644 index 0000000000..a5e55b990f Binary files /dev/null and b/public/images/emoji/google_classic/nazar_amulet.png differ diff --git a/public/images/emoji/google_classic/older_adult.png b/public/images/emoji/google_classic/older_adult.png index 8796829b87..e32b255570 100644 Binary files a/public/images/emoji/google_classic/older_adult.png and b/public/images/emoji/google_classic/older_adult.png differ diff --git a/public/images/emoji/google_classic/orange_heart.png b/public/images/emoji/google_classic/orange_heart.png index f217c930a7..dd82255078 100644 Binary files a/public/images/emoji/google_classic/orange_heart.png and b/public/images/emoji/google_classic/orange_heart.png differ diff --git a/public/images/emoji/google_classic/palms_up_together.png b/public/images/emoji/google_classic/palms_up_together.png index fb66ba11c4..7114175189 100644 Binary files a/public/images/emoji/google_classic/palms_up_together.png and b/public/images/emoji/google_classic/palms_up_together.png differ diff --git a/public/images/emoji/google_classic/parrot.png b/public/images/emoji/google_classic/parrot.png new file mode 100644 index 0000000000..e9e3a5e0d0 Binary files /dev/null and b/public/images/emoji/google_classic/parrot.png differ diff --git a/public/images/emoji/google_classic/partying_face.png b/public/images/emoji/google_classic/partying_face.png new file mode 100644 index 0000000000..cf02521ccc Binary files /dev/null and b/public/images/emoji/google_classic/partying_face.png differ diff --git a/public/images/emoji/google_classic/peacock.png b/public/images/emoji/google_classic/peacock.png new file mode 100644 index 0000000000..59602cdcf0 Binary files /dev/null and b/public/images/emoji/google_classic/peacock.png differ diff --git a/public/images/emoji/google_classic/person_climbing.png b/public/images/emoji/google_classic/person_climbing.png index d8a6229d6b..a689019417 100644 Binary files a/public/images/emoji/google_classic/person_climbing.png and b/public/images/emoji/google_classic/person_climbing.png differ diff --git a/public/images/emoji/google_classic/person_in_lotus_position.png b/public/images/emoji/google_classic/person_in_lotus_position.png index e9404fd525..1e519915c4 100644 Binary files a/public/images/emoji/google_classic/person_in_lotus_position.png and b/public/images/emoji/google_classic/person_in_lotus_position.png differ diff --git a/public/images/emoji/google_classic/person_in_steamy_room.png b/public/images/emoji/google_classic/person_in_steamy_room.png index 65a0790d92..0885157783 100644 Binary files a/public/images/emoji/google_classic/person_in_steamy_room.png and b/public/images/emoji/google_classic/person_in_steamy_room.png differ diff --git a/public/images/emoji/google_classic/petri_dish.png b/public/images/emoji/google_classic/petri_dish.png new file mode 100644 index 0000000000..3a07b493c2 Binary files /dev/null and b/public/images/emoji/google_classic/petri_dish.png differ diff --git a/public/images/emoji/google_classic/pie.png b/public/images/emoji/google_classic/pie.png index 4f5f474d82..2687a56214 100644 Binary files a/public/images/emoji/google_classic/pie.png and b/public/images/emoji/google_classic/pie.png differ diff --git a/public/images/emoji/google_classic/pirate_flag.png b/public/images/emoji/google_classic/pirate_flag.png new file mode 100644 index 0000000000..91f599b478 Binary files /dev/null and b/public/images/emoji/google_classic/pirate_flag.png differ diff --git a/public/images/emoji/google_classic/pleading_face.png b/public/images/emoji/google_classic/pleading_face.png new file mode 100644 index 0000000000..e3c26b3dc1 Binary files /dev/null and b/public/images/emoji/google_classic/pleading_face.png differ diff --git a/public/images/emoji/google_classic/pretzel.png b/public/images/emoji/google_classic/pretzel.png index 9116d6ee9a..61984d26a9 100644 Binary files a/public/images/emoji/google_classic/pretzel.png and b/public/images/emoji/google_classic/pretzel.png differ diff --git a/public/images/emoji/google_classic/puke.png b/public/images/emoji/google_classic/puke.png index cd7c3d1f2b..40eae56836 100644 Binary files a/public/images/emoji/google_classic/puke.png and b/public/images/emoji/google_classic/puke.png differ diff --git a/public/images/emoji/google_classic/raccoon.png b/public/images/emoji/google_classic/raccoon.png new file mode 100644 index 0000000000..1d3916b94b Binary files /dev/null and b/public/images/emoji/google_classic/raccoon.png differ diff --git a/public/images/emoji/google_classic/receipt.png b/public/images/emoji/google_classic/receipt.png new file mode 100644 index 0000000000..b5f1ba925f Binary files /dev/null and b/public/images/emoji/google_classic/receipt.png differ diff --git a/public/images/emoji/google_classic/red_gift_envelope.png b/public/images/emoji/google_classic/red_gift_envelope.png new file mode 100644 index 0000000000..e88d858d58 Binary files /dev/null and b/public/images/emoji/google_classic/red_gift_envelope.png differ diff --git a/public/images/emoji/google_classic/roll_of_toilet_paper.png b/public/images/emoji/google_classic/roll_of_toilet_paper.png new file mode 100644 index 0000000000..00a5a9ecf6 Binary files /dev/null and b/public/images/emoji/google_classic/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/google_classic/safety_pin.png b/public/images/emoji/google_classic/safety_pin.png new file mode 100644 index 0000000000..b15166e2ab Binary files /dev/null and b/public/images/emoji/google_classic/safety_pin.png differ diff --git a/public/images/emoji/google_classic/salt.png b/public/images/emoji/google_classic/salt.png new file mode 100644 index 0000000000..053367714a Binary files /dev/null and b/public/images/emoji/google_classic/salt.png differ diff --git a/public/images/emoji/google_classic/sandwich.png b/public/images/emoji/google_classic/sandwich.png index ba3f9a1cdb..63b1f54f65 100644 Binary files a/public/images/emoji/google_classic/sandwich.png and b/public/images/emoji/google_classic/sandwich.png differ diff --git a/public/images/emoji/google_classic/sauropod.png b/public/images/emoji/google_classic/sauropod.png index 2f4d619997..e8ea445a66 100644 Binary files a/public/images/emoji/google_classic/sauropod.png and b/public/images/emoji/google_classic/sauropod.png differ diff --git a/public/images/emoji/google_classic/scarf.png b/public/images/emoji/google_classic/scarf.png index 73653eee2b..89f97c5ced 100644 Binary files a/public/images/emoji/google_classic/scarf.png and b/public/images/emoji/google_classic/scarf.png differ diff --git a/public/images/emoji/google_classic/shushing_face.png b/public/images/emoji/google_classic/shushing_face.png index e4427cbd15..a7d89b5d25 100644 Binary files a/public/images/emoji/google_classic/shushing_face.png and b/public/images/emoji/google_classic/shushing_face.png differ diff --git a/public/images/emoji/google_classic/skateboard.png b/public/images/emoji/google_classic/skateboard.png new file mode 100644 index 0000000000..142b14d8d7 Binary files /dev/null and b/public/images/emoji/google_classic/skateboard.png differ diff --git a/public/images/emoji/google_classic/sled.png b/public/images/emoji/google_classic/sled.png index 01805b1fe7..e0f5eb7ee9 100644 Binary files a/public/images/emoji/google_classic/sled.png and b/public/images/emoji/google_classic/sled.png differ diff --git a/public/images/emoji/google_classic/smiling_face_with_three_hearts.png b/public/images/emoji/google_classic/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..679e033e95 Binary files /dev/null and b/public/images/emoji/google_classic/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/google_classic/soap.png b/public/images/emoji/google_classic/soap.png new file mode 100644 index 0000000000..3432ebceb1 Binary files /dev/null and b/public/images/emoji/google_classic/soap.png differ diff --git a/public/images/emoji/google_classic/socks.png b/public/images/emoji/google_classic/socks.png index 8f2b9bbe9e..924c953098 100644 Binary files a/public/images/emoji/google_classic/socks.png and b/public/images/emoji/google_classic/socks.png differ diff --git a/public/images/emoji/google_classic/softball.png b/public/images/emoji/google_classic/softball.png new file mode 100644 index 0000000000..b78c695486 Binary files /dev/null and b/public/images/emoji/google_classic/softball.png differ diff --git a/public/images/emoji/google_classic/sponge.png b/public/images/emoji/google_classic/sponge.png new file mode 100644 index 0000000000..1c7ee83f5e Binary files /dev/null and b/public/images/emoji/google_classic/sponge.png differ diff --git a/public/images/emoji/google_classic/star_struck.png b/public/images/emoji/google_classic/star_struck.png index 7da8183f39..8c7912ddef 100644 Binary files a/public/images/emoji/google_classic/star_struck.png and b/public/images/emoji/google_classic/star_struck.png differ diff --git a/public/images/emoji/google_classic/superhero.png b/public/images/emoji/google_classic/superhero.png new file mode 100644 index 0000000000..91080cba2e Binary files /dev/null and b/public/images/emoji/google_classic/superhero.png differ diff --git a/public/images/emoji/google_classic/supervillain.png b/public/images/emoji/google_classic/supervillain.png new file mode 100644 index 0000000000..9fb7495003 Binary files /dev/null and b/public/images/emoji/google_classic/supervillain.png differ diff --git a/public/images/emoji/google_classic/swan.png b/public/images/emoji/google_classic/swan.png new file mode 100644 index 0000000000..8fedcfee6a Binary files /dev/null and b/public/images/emoji/google_classic/swan.png differ diff --git a/public/images/emoji/google_classic/t_rex.png b/public/images/emoji/google_classic/t_rex.png index d8811a5638..9b69bbf2bb 100644 Binary files a/public/images/emoji/google_classic/t_rex.png and b/public/images/emoji/google_classic/t_rex.png differ diff --git a/public/images/emoji/google_classic/takeout_box.png b/public/images/emoji/google_classic/takeout_box.png index 08aa6a4843..7746b2b8cd 100644 Binary files a/public/images/emoji/google_classic/takeout_box.png and b/public/images/emoji/google_classic/takeout_box.png differ diff --git a/public/images/emoji/google_classic/teddy_bear.png b/public/images/emoji/google_classic/teddy_bear.png new file mode 100644 index 0000000000..4ba5b7bb59 Binary files /dev/null and b/public/images/emoji/google_classic/teddy_bear.png differ diff --git a/public/images/emoji/google_classic/test_tube.png b/public/images/emoji/google_classic/test_tube.png new file mode 100644 index 0000000000..a004650181 Binary files /dev/null and b/public/images/emoji/google_classic/test_tube.png differ diff --git a/public/images/emoji/google_classic/thread.png b/public/images/emoji/google_classic/thread.png new file mode 100644 index 0000000000..b7b58f1b6a Binary files /dev/null and b/public/images/emoji/google_classic/thread.png differ diff --git a/public/images/emoji/google_classic/toolbox.png b/public/images/emoji/google_classic/toolbox.png new file mode 100644 index 0000000000..f66bd60df4 Binary files /dev/null and b/public/images/emoji/google_classic/toolbox.png differ diff --git a/public/images/emoji/google_classic/tooth.png b/public/images/emoji/google_classic/tooth.png new file mode 100644 index 0000000000..f5d32ea713 Binary files /dev/null and b/public/images/emoji/google_classic/tooth.png differ diff --git a/public/images/emoji/google_classic/united_nations.png b/public/images/emoji/google_classic/united_nations.png index d695a5cac0..ea7fc4c7d7 100644 Binary files a/public/images/emoji/google_classic/united_nations.png and b/public/images/emoji/google_classic/united_nations.png differ diff --git a/public/images/emoji/google_classic/vampire.png b/public/images/emoji/google_classic/vampire.png index 962288bd17..b8c59422d8 100644 Binary files a/public/images/emoji/google_classic/vampire.png and b/public/images/emoji/google_classic/vampire.png differ diff --git a/public/images/emoji/google_classic/woman_bald.png b/public/images/emoji/google_classic/woman_bald.png new file mode 100644 index 0000000000..2fe69f9458 Binary files /dev/null and b/public/images/emoji/google_classic/woman_bald.png differ diff --git a/public/images/emoji/google_classic/woman_climbing.png b/public/images/emoji/google_classic/woman_climbing.png index 590704f805..651a7c70cb 100644 Binary files a/public/images/emoji/google_classic/woman_climbing.png and b/public/images/emoji/google_classic/woman_climbing.png differ diff --git a/public/images/emoji/google_classic/woman_curly_haired.png b/public/images/emoji/google_classic/woman_curly_haired.png new file mode 100644 index 0000000000..02e4675748 Binary files /dev/null and b/public/images/emoji/google_classic/woman_curly_haired.png differ diff --git a/public/images/emoji/google_classic/woman_genie.png b/public/images/emoji/google_classic/woman_genie.png index 88743cfd1f..d1a5608de9 100644 Binary files a/public/images/emoji/google_classic/woman_genie.png and b/public/images/emoji/google_classic/woman_genie.png differ diff --git a/public/images/emoji/google_classic/woman_in_lotus_position.png b/public/images/emoji/google_classic/woman_in_lotus_position.png index 85de0d5c02..d8c76d069b 100644 Binary files a/public/images/emoji/google_classic/woman_in_lotus_position.png and b/public/images/emoji/google_classic/woman_in_lotus_position.png differ diff --git a/public/images/emoji/google_classic/woman_in_steamy_room.png b/public/images/emoji/google_classic/woman_in_steamy_room.png index fe4d976d22..0885157783 100644 Binary files a/public/images/emoji/google_classic/woman_in_steamy_room.png and b/public/images/emoji/google_classic/woman_in_steamy_room.png differ diff --git a/public/images/emoji/google_classic/woman_mage.png b/public/images/emoji/google_classic/woman_mage.png index cf6c7d2569..bb18c4f90c 100644 Binary files a/public/images/emoji/google_classic/woman_mage.png and b/public/images/emoji/google_classic/woman_mage.png differ diff --git a/public/images/emoji/google_classic/woman_red_haired.png b/public/images/emoji/google_classic/woman_red_haired.png new file mode 100644 index 0000000000..7d85999a79 Binary files /dev/null and b/public/images/emoji/google_classic/woman_red_haired.png differ diff --git a/public/images/emoji/google_classic/woman_superhero.png b/public/images/emoji/google_classic/woman_superhero.png new file mode 100644 index 0000000000..153a0cf66a Binary files /dev/null and b/public/images/emoji/google_classic/woman_superhero.png differ diff --git a/public/images/emoji/google_classic/woman_supervillain.png b/public/images/emoji/google_classic/woman_supervillain.png new file mode 100644 index 0000000000..2f941110bc Binary files /dev/null and b/public/images/emoji/google_classic/woman_supervillain.png differ diff --git a/public/images/emoji/google_classic/woman_white_haired.png b/public/images/emoji/google_classic/woman_white_haired.png new file mode 100644 index 0000000000..a4a409c7e0 Binary files /dev/null and b/public/images/emoji/google_classic/woman_white_haired.png differ diff --git a/public/images/emoji/google_classic/woman_with_headscarf.png b/public/images/emoji/google_classic/woman_with_headscarf.png index 6b3731cac8..95f5f82b7b 100644 Binary files a/public/images/emoji/google_classic/woman_with_headscarf.png and b/public/images/emoji/google_classic/woman_with_headscarf.png differ diff --git a/public/images/emoji/google_classic/woman_zombie.png b/public/images/emoji/google_classic/woman_zombie.png index 2f740b721f..cdaa255dc5 100644 Binary files a/public/images/emoji/google_classic/woman_zombie.png and b/public/images/emoji/google_classic/woman_zombie.png differ diff --git a/public/images/emoji/google_classic/woozy_face.png b/public/images/emoji/google_classic/woozy_face.png new file mode 100644 index 0000000000..3c4a112bec Binary files /dev/null and b/public/images/emoji/google_classic/woozy_face.png differ diff --git a/public/images/emoji/google_classic/yarn.png b/public/images/emoji/google_classic/yarn.png new file mode 100644 index 0000000000..005e38061f Binary files /dev/null and b/public/images/emoji/google_classic/yarn.png differ diff --git a/public/images/emoji/google_classic/zebra.png b/public/images/emoji/google_classic/zebra.png index 6faa14f55d..4c080f3006 100644 Binary files a/public/images/emoji/google_classic/zebra.png and b/public/images/emoji/google_classic/zebra.png differ diff --git a/public/images/emoji/google_classic/zombie.png b/public/images/emoji/google_classic/zombie.png index 1bf288fcd4..c597d50dd8 100644 Binary files a/public/images/emoji/google_classic/zombie.png and b/public/images/emoji/google_classic/zombie.png differ diff --git a/public/images/emoji/twitter/+1.png b/public/images/emoji/twitter/+1.png index a64fb47520..5bae81d159 100644 Binary files a/public/images/emoji/twitter/+1.png and b/public/images/emoji/twitter/+1.png differ diff --git a/public/images/emoji/twitter/-1.png b/public/images/emoji/twitter/-1.png index 4f345c5355..3801fe8f3e 100644 Binary files a/public/images/emoji/twitter/-1.png and b/public/images/emoji/twitter/-1.png differ diff --git a/public/images/emoji/twitter/100.png b/public/images/emoji/twitter/100.png index bd3ed04d9a..6a8fb87e7c 100644 Binary files a/public/images/emoji/twitter/100.png and b/public/images/emoji/twitter/100.png differ diff --git a/public/images/emoji/twitter/1234.png b/public/images/emoji/twitter/1234.png index 723bc8cd76..84c2082306 100644 Binary files a/public/images/emoji/twitter/1234.png and b/public/images/emoji/twitter/1234.png differ diff --git a/public/images/emoji/twitter/1st_place_medal.png b/public/images/emoji/twitter/1st_place_medal.png index 92235c693c..797f29935c 100644 Binary files a/public/images/emoji/twitter/1st_place_medal.png and b/public/images/emoji/twitter/1st_place_medal.png differ diff --git a/public/images/emoji/twitter/2nd_place_medal.png b/public/images/emoji/twitter/2nd_place_medal.png index 6eb5db8e21..cb3d7bd169 100644 Binary files a/public/images/emoji/twitter/2nd_place_medal.png and b/public/images/emoji/twitter/2nd_place_medal.png differ diff --git a/public/images/emoji/twitter/3rd_place_medal.png b/public/images/emoji/twitter/3rd_place_medal.png index 4676f24e21..820284db32 100644 Binary files a/public/images/emoji/twitter/3rd_place_medal.png and b/public/images/emoji/twitter/3rd_place_medal.png differ diff --git a/public/images/emoji/twitter/8ball.png b/public/images/emoji/twitter/8ball.png index e3e6bb6677..6c8ef385a0 100644 Binary files a/public/images/emoji/twitter/8ball.png and b/public/images/emoji/twitter/8ball.png differ diff --git a/public/images/emoji/twitter/a.png b/public/images/emoji/twitter/a.png index 3520ead38a..8944eac4ff 100644 Binary files a/public/images/emoji/twitter/a.png and b/public/images/emoji/twitter/a.png differ diff --git a/public/images/emoji/twitter/ab.png b/public/images/emoji/twitter/ab.png index 5cc77e2824..0c6879c699 100644 Binary files a/public/images/emoji/twitter/ab.png and b/public/images/emoji/twitter/ab.png differ diff --git a/public/images/emoji/twitter/abacus.png b/public/images/emoji/twitter/abacus.png new file mode 100644 index 0000000000..e56e558529 Binary files /dev/null and b/public/images/emoji/twitter/abacus.png differ diff --git a/public/images/emoji/twitter/abc.png b/public/images/emoji/twitter/abc.png index 323f59e4f9..b45afa2b7a 100644 Binary files a/public/images/emoji/twitter/abc.png and b/public/images/emoji/twitter/abc.png differ diff --git a/public/images/emoji/twitter/abcd.png b/public/images/emoji/twitter/abcd.png index 79e6d407ab..bf1ed590eb 100644 Binary files a/public/images/emoji/twitter/abcd.png and b/public/images/emoji/twitter/abcd.png differ diff --git a/public/images/emoji/twitter/accept.png b/public/images/emoji/twitter/accept.png index b1c1d071a5..bc0802fcc4 100644 Binary files a/public/images/emoji/twitter/accept.png and b/public/images/emoji/twitter/accept.png differ diff --git a/public/images/emoji/twitter/admission_tickets.png b/public/images/emoji/twitter/admission_tickets.png index 295e9bbdc6..d79c8e5d47 100644 Binary files a/public/images/emoji/twitter/admission_tickets.png and b/public/images/emoji/twitter/admission_tickets.png differ diff --git a/public/images/emoji/twitter/adult.png b/public/images/emoji/twitter/adult.png index 53a5eb2ccb..edc9805e76 100644 Binary files a/public/images/emoji/twitter/adult.png and b/public/images/emoji/twitter/adult.png differ diff --git a/public/images/emoji/twitter/aerial_tramway.png b/public/images/emoji/twitter/aerial_tramway.png index 24ddd85c99..2c7469a4f2 100644 Binary files a/public/images/emoji/twitter/aerial_tramway.png and b/public/images/emoji/twitter/aerial_tramway.png differ diff --git a/public/images/emoji/twitter/afghanistan.png b/public/images/emoji/twitter/afghanistan.png index 50c4c6b272..7a37ec27e7 100644 Binary files a/public/images/emoji/twitter/afghanistan.png and b/public/images/emoji/twitter/afghanistan.png differ diff --git a/public/images/emoji/twitter/airplane.png b/public/images/emoji/twitter/airplane.png index f5a217ef09..a9d7c3322c 100644 Binary files a/public/images/emoji/twitter/airplane.png and b/public/images/emoji/twitter/airplane.png differ diff --git a/public/images/emoji/twitter/airplane_arriving.png b/public/images/emoji/twitter/airplane_arriving.png index 0585a1c36c..f44f5c295e 100644 Binary files a/public/images/emoji/twitter/airplane_arriving.png and b/public/images/emoji/twitter/airplane_arriving.png differ diff --git a/public/images/emoji/twitter/airplane_departure.png b/public/images/emoji/twitter/airplane_departure.png index dc86670a86..34531e823c 100644 Binary files a/public/images/emoji/twitter/airplane_departure.png and b/public/images/emoji/twitter/airplane_departure.png differ diff --git a/public/images/emoji/twitter/airplane_small.png b/public/images/emoji/twitter/airplane_small.png index 47399184f7..32bc40c7f7 100644 Binary files a/public/images/emoji/twitter/airplane_small.png and b/public/images/emoji/twitter/airplane_small.png differ diff --git a/public/images/emoji/twitter/aland_islands.png b/public/images/emoji/twitter/aland_islands.png index 2ce958b920..99178f14d6 100644 Binary files a/public/images/emoji/twitter/aland_islands.png and b/public/images/emoji/twitter/aland_islands.png differ diff --git a/public/images/emoji/twitter/alarm_clock.png b/public/images/emoji/twitter/alarm_clock.png index 09794594d7..1e16c4f64f 100644 Binary files a/public/images/emoji/twitter/alarm_clock.png and b/public/images/emoji/twitter/alarm_clock.png differ diff --git a/public/images/emoji/twitter/albania.png b/public/images/emoji/twitter/albania.png index 8d428869d4..a6d45735f3 100644 Binary files a/public/images/emoji/twitter/albania.png and b/public/images/emoji/twitter/albania.png differ diff --git a/public/images/emoji/twitter/alembic.png b/public/images/emoji/twitter/alembic.png index cc2853f6d9..24249f4516 100644 Binary files a/public/images/emoji/twitter/alembic.png and b/public/images/emoji/twitter/alembic.png differ diff --git a/public/images/emoji/twitter/algeria.png b/public/images/emoji/twitter/algeria.png index cd3dc01ab2..176f755df6 100644 Binary files a/public/images/emoji/twitter/algeria.png and b/public/images/emoji/twitter/algeria.png differ diff --git a/public/images/emoji/twitter/alien.png b/public/images/emoji/twitter/alien.png index da3fcd90e3..e722644aa2 100644 Binary files a/public/images/emoji/twitter/alien.png and b/public/images/emoji/twitter/alien.png differ diff --git a/public/images/emoji/twitter/ambulance.png b/public/images/emoji/twitter/ambulance.png index 2c0bb4c7ab..f4d26c7c16 100644 Binary files a/public/images/emoji/twitter/ambulance.png and b/public/images/emoji/twitter/ambulance.png differ diff --git a/public/images/emoji/twitter/american_samoa.png b/public/images/emoji/twitter/american_samoa.png index f4f58e2e25..a5cdfccbcd 100644 Binary files a/public/images/emoji/twitter/american_samoa.png and b/public/images/emoji/twitter/american_samoa.png differ diff --git a/public/images/emoji/twitter/amphora.png b/public/images/emoji/twitter/amphora.png index 550f047067..83caa8d108 100644 Binary files a/public/images/emoji/twitter/amphora.png and b/public/images/emoji/twitter/amphora.png differ diff --git a/public/images/emoji/twitter/anchor.png b/public/images/emoji/twitter/anchor.png index 30f47eaba1..277f85ec4d 100644 Binary files a/public/images/emoji/twitter/anchor.png and b/public/images/emoji/twitter/anchor.png differ diff --git a/public/images/emoji/twitter/andorra.png b/public/images/emoji/twitter/andorra.png index 0fd73782c2..d2d47502e7 100644 Binary files a/public/images/emoji/twitter/andorra.png and b/public/images/emoji/twitter/andorra.png differ diff --git a/public/images/emoji/twitter/angel.png b/public/images/emoji/twitter/angel.png index 718fed87a3..584cd15d4d 100644 Binary files a/public/images/emoji/twitter/angel.png and b/public/images/emoji/twitter/angel.png differ diff --git a/public/images/emoji/twitter/anger.png b/public/images/emoji/twitter/anger.png index 604f86707a..0630d37eca 100644 Binary files a/public/images/emoji/twitter/anger.png and b/public/images/emoji/twitter/anger.png differ diff --git a/public/images/emoji/twitter/anger_right.png b/public/images/emoji/twitter/anger_right.png index 3d3ee7dcfa..ea4f27ae72 100644 Binary files a/public/images/emoji/twitter/anger_right.png and b/public/images/emoji/twitter/anger_right.png differ diff --git a/public/images/emoji/twitter/angola.png b/public/images/emoji/twitter/angola.png index 5aca11a07e..78acffcd20 100644 Binary files a/public/images/emoji/twitter/angola.png and b/public/images/emoji/twitter/angola.png differ diff --git a/public/images/emoji/twitter/angry.png b/public/images/emoji/twitter/angry.png index 19c39aab22..31ecddc815 100644 Binary files a/public/images/emoji/twitter/angry.png and b/public/images/emoji/twitter/angry.png differ diff --git a/public/images/emoji/twitter/anguilla.png b/public/images/emoji/twitter/anguilla.png index d1006c6c19..73f0c20398 100644 Binary files a/public/images/emoji/twitter/anguilla.png and b/public/images/emoji/twitter/anguilla.png differ diff --git a/public/images/emoji/twitter/anguished.png b/public/images/emoji/twitter/anguished.png index 0d749f6587..293a06e62b 100644 Binary files a/public/images/emoji/twitter/anguished.png and b/public/images/emoji/twitter/anguished.png differ diff --git a/public/images/emoji/twitter/ant.png b/public/images/emoji/twitter/ant.png index 9be09a0287..dc842fd7b0 100644 Binary files a/public/images/emoji/twitter/ant.png and b/public/images/emoji/twitter/ant.png differ diff --git a/public/images/emoji/twitter/antarctica.png b/public/images/emoji/twitter/antarctica.png index 5a6759de63..d21e4bafd2 100644 Binary files a/public/images/emoji/twitter/antarctica.png and b/public/images/emoji/twitter/antarctica.png differ diff --git a/public/images/emoji/twitter/antigua_barbuda.png b/public/images/emoji/twitter/antigua_barbuda.png index e3ff113cba..068f45ea90 100644 Binary files a/public/images/emoji/twitter/antigua_barbuda.png and b/public/images/emoji/twitter/antigua_barbuda.png differ diff --git a/public/images/emoji/twitter/apple.png b/public/images/emoji/twitter/apple.png index 74e85a59fe..f26ed49591 100644 Binary files a/public/images/emoji/twitter/apple.png and b/public/images/emoji/twitter/apple.png differ diff --git a/public/images/emoji/twitter/aquarius.png b/public/images/emoji/twitter/aquarius.png index 5ee69f3fb0..de34060dd3 100644 Binary files a/public/images/emoji/twitter/aquarius.png and b/public/images/emoji/twitter/aquarius.png differ diff --git a/public/images/emoji/twitter/archery.png b/public/images/emoji/twitter/archery.png index f50a1389fe..87dea7a594 100644 Binary files a/public/images/emoji/twitter/archery.png and b/public/images/emoji/twitter/archery.png differ diff --git a/public/images/emoji/twitter/argentina.png b/public/images/emoji/twitter/argentina.png index 1e5e815098..a7d8a31dd1 100644 Binary files a/public/images/emoji/twitter/argentina.png and b/public/images/emoji/twitter/argentina.png differ diff --git a/public/images/emoji/twitter/aries.png b/public/images/emoji/twitter/aries.png index f8e33e10ce..0798e87b7e 100644 Binary files a/public/images/emoji/twitter/aries.png and b/public/images/emoji/twitter/aries.png differ diff --git a/public/images/emoji/twitter/armenia.png b/public/images/emoji/twitter/armenia.png index 846307fcf3..5282660ee6 100644 Binary files a/public/images/emoji/twitter/armenia.png and b/public/images/emoji/twitter/armenia.png differ diff --git a/public/images/emoji/twitter/arrow_backward.png b/public/images/emoji/twitter/arrow_backward.png index cf27562c15..2721eabe55 100644 Binary files a/public/images/emoji/twitter/arrow_backward.png and b/public/images/emoji/twitter/arrow_backward.png differ diff --git a/public/images/emoji/twitter/arrow_double_down.png b/public/images/emoji/twitter/arrow_double_down.png index 257ec16e10..de3f2c1313 100644 Binary files a/public/images/emoji/twitter/arrow_double_down.png and b/public/images/emoji/twitter/arrow_double_down.png differ diff --git a/public/images/emoji/twitter/arrow_double_up.png b/public/images/emoji/twitter/arrow_double_up.png index fd5e16c402..3311acf024 100644 Binary files a/public/images/emoji/twitter/arrow_double_up.png and b/public/images/emoji/twitter/arrow_double_up.png differ diff --git a/public/images/emoji/twitter/arrow_down.png b/public/images/emoji/twitter/arrow_down.png index 1f6759138d..887a306829 100644 Binary files a/public/images/emoji/twitter/arrow_down.png and b/public/images/emoji/twitter/arrow_down.png differ diff --git a/public/images/emoji/twitter/arrow_down_small.png b/public/images/emoji/twitter/arrow_down_small.png index 5c10745d0a..70b308b6ca 100644 Binary files a/public/images/emoji/twitter/arrow_down_small.png and b/public/images/emoji/twitter/arrow_down_small.png differ diff --git a/public/images/emoji/twitter/arrow_forward.png b/public/images/emoji/twitter/arrow_forward.png index 6d6dd60964..b0bf29e5b4 100644 Binary files a/public/images/emoji/twitter/arrow_forward.png and b/public/images/emoji/twitter/arrow_forward.png differ diff --git a/public/images/emoji/twitter/arrow_heading_down.png b/public/images/emoji/twitter/arrow_heading_down.png index 51ab299f59..759c831161 100644 Binary files a/public/images/emoji/twitter/arrow_heading_down.png and b/public/images/emoji/twitter/arrow_heading_down.png differ diff --git a/public/images/emoji/twitter/arrow_heading_up.png b/public/images/emoji/twitter/arrow_heading_up.png index d01ded935b..bafb601bb6 100644 Binary files a/public/images/emoji/twitter/arrow_heading_up.png and b/public/images/emoji/twitter/arrow_heading_up.png differ diff --git a/public/images/emoji/twitter/arrow_left.png b/public/images/emoji/twitter/arrow_left.png index 0eb80529d2..2c05e83e84 100644 Binary files a/public/images/emoji/twitter/arrow_left.png and b/public/images/emoji/twitter/arrow_left.png differ diff --git a/public/images/emoji/twitter/arrow_lower_left.png b/public/images/emoji/twitter/arrow_lower_left.png index 611aabcf40..41b24fe673 100644 Binary files a/public/images/emoji/twitter/arrow_lower_left.png and b/public/images/emoji/twitter/arrow_lower_left.png differ diff --git a/public/images/emoji/twitter/arrow_lower_right.png b/public/images/emoji/twitter/arrow_lower_right.png index 4243209b2e..5135705c6f 100644 Binary files a/public/images/emoji/twitter/arrow_lower_right.png and b/public/images/emoji/twitter/arrow_lower_right.png differ diff --git a/public/images/emoji/twitter/arrow_right.png b/public/images/emoji/twitter/arrow_right.png index 6effcdc001..1cf8b3d683 100644 Binary files a/public/images/emoji/twitter/arrow_right.png and b/public/images/emoji/twitter/arrow_right.png differ diff --git a/public/images/emoji/twitter/arrow_right_hook.png b/public/images/emoji/twitter/arrow_right_hook.png index 2ca2fbe413..7a0b709d25 100644 Binary files a/public/images/emoji/twitter/arrow_right_hook.png and b/public/images/emoji/twitter/arrow_right_hook.png differ diff --git a/public/images/emoji/twitter/arrow_up.png b/public/images/emoji/twitter/arrow_up.png index af67b30319..4f2a411021 100644 Binary files a/public/images/emoji/twitter/arrow_up.png and b/public/images/emoji/twitter/arrow_up.png differ diff --git a/public/images/emoji/twitter/arrow_up_down.png b/public/images/emoji/twitter/arrow_up_down.png index 634e14c3c2..cbbe269e4e 100644 Binary files a/public/images/emoji/twitter/arrow_up_down.png and b/public/images/emoji/twitter/arrow_up_down.png differ diff --git a/public/images/emoji/twitter/arrow_up_small.png b/public/images/emoji/twitter/arrow_up_small.png index e6035b02ec..7c78843ecd 100644 Binary files a/public/images/emoji/twitter/arrow_up_small.png and b/public/images/emoji/twitter/arrow_up_small.png differ diff --git a/public/images/emoji/twitter/arrow_upper_left.png b/public/images/emoji/twitter/arrow_upper_left.png index ff1b73f217..c3f9bdfce5 100644 Binary files a/public/images/emoji/twitter/arrow_upper_left.png and b/public/images/emoji/twitter/arrow_upper_left.png differ diff --git a/public/images/emoji/twitter/arrow_upper_right.png b/public/images/emoji/twitter/arrow_upper_right.png index dcd0d6a295..08eb63ceed 100644 Binary files a/public/images/emoji/twitter/arrow_upper_right.png and b/public/images/emoji/twitter/arrow_upper_right.png differ diff --git a/public/images/emoji/twitter/arrows_clockwise.png b/public/images/emoji/twitter/arrows_clockwise.png index 55928af7b1..a955030f54 100644 Binary files a/public/images/emoji/twitter/arrows_clockwise.png and b/public/images/emoji/twitter/arrows_clockwise.png differ diff --git a/public/images/emoji/twitter/arrows_counterclockwise.png b/public/images/emoji/twitter/arrows_counterclockwise.png index 03fe43f5ec..62af6feb54 100644 Binary files a/public/images/emoji/twitter/arrows_counterclockwise.png and b/public/images/emoji/twitter/arrows_counterclockwise.png differ diff --git a/public/images/emoji/twitter/art.png b/public/images/emoji/twitter/art.png index 8e7eb89646..1dda3e0c6e 100644 Binary files a/public/images/emoji/twitter/art.png and b/public/images/emoji/twitter/art.png differ diff --git a/public/images/emoji/twitter/articulated_lorry.png b/public/images/emoji/twitter/articulated_lorry.png index e69ae7319b..5f51b4564f 100644 Binary files a/public/images/emoji/twitter/articulated_lorry.png and b/public/images/emoji/twitter/articulated_lorry.png differ diff --git a/public/images/emoji/twitter/artificial_satellite.png b/public/images/emoji/twitter/artificial_satellite.png index 81715516af..962c6034c3 100644 Binary files a/public/images/emoji/twitter/artificial_satellite.png and b/public/images/emoji/twitter/artificial_satellite.png differ diff --git a/public/images/emoji/twitter/aruba.png b/public/images/emoji/twitter/aruba.png index 459facc13b..e250be924b 100644 Binary files a/public/images/emoji/twitter/aruba.png and b/public/images/emoji/twitter/aruba.png differ diff --git a/public/images/emoji/twitter/ascension_island.png b/public/images/emoji/twitter/ascension_island.png index 2e3a1fdd73..8e7a630b92 100644 Binary files a/public/images/emoji/twitter/ascension_island.png and b/public/images/emoji/twitter/ascension_island.png differ diff --git a/public/images/emoji/twitter/asterisk.png b/public/images/emoji/twitter/asterisk.png index 2bfefce2be..85e9f0c1b4 100644 Binary files a/public/images/emoji/twitter/asterisk.png and b/public/images/emoji/twitter/asterisk.png differ diff --git a/public/images/emoji/twitter/astonished.png b/public/images/emoji/twitter/astonished.png index 5deec18db8..21e979af89 100644 Binary files a/public/images/emoji/twitter/astonished.png and b/public/images/emoji/twitter/astonished.png differ diff --git a/public/images/emoji/twitter/athletic_shoe.png b/public/images/emoji/twitter/athletic_shoe.png index 8273a4738b..fe7db6fb74 100644 Binary files a/public/images/emoji/twitter/athletic_shoe.png and b/public/images/emoji/twitter/athletic_shoe.png differ diff --git a/public/images/emoji/twitter/atm.png b/public/images/emoji/twitter/atm.png index 3414c38eec..1e36fefdbd 100644 Binary files a/public/images/emoji/twitter/atm.png and b/public/images/emoji/twitter/atm.png differ diff --git a/public/images/emoji/twitter/atom.png b/public/images/emoji/twitter/atom.png index 3d27cd8953..7daedd8e40 100644 Binary files a/public/images/emoji/twitter/atom.png and b/public/images/emoji/twitter/atom.png differ diff --git a/public/images/emoji/twitter/atom_symbol.png b/public/images/emoji/twitter/atom_symbol.png index 3d27cd8953..7daedd8e40 100644 Binary files a/public/images/emoji/twitter/atom_symbol.png and b/public/images/emoji/twitter/atom_symbol.png differ diff --git a/public/images/emoji/twitter/australia.png b/public/images/emoji/twitter/australia.png index 5dbc804e86..e42aa01037 100644 Binary files a/public/images/emoji/twitter/australia.png and b/public/images/emoji/twitter/australia.png differ diff --git a/public/images/emoji/twitter/austria.png b/public/images/emoji/twitter/austria.png index 58141c9f3c..3937efe840 100644 Binary files a/public/images/emoji/twitter/austria.png and b/public/images/emoji/twitter/austria.png differ diff --git a/public/images/emoji/twitter/automobile.png b/public/images/emoji/twitter/automobile.png index 2fbf351b83..683c0425ea 100644 Binary files a/public/images/emoji/twitter/automobile.png and b/public/images/emoji/twitter/automobile.png differ diff --git a/public/images/emoji/twitter/avocado.png b/public/images/emoji/twitter/avocado.png index faa8c8fbe7..76661c311c 100644 Binary files a/public/images/emoji/twitter/avocado.png and b/public/images/emoji/twitter/avocado.png differ diff --git a/public/images/emoji/twitter/azerbaijan.png b/public/images/emoji/twitter/azerbaijan.png index 59b4ecf2a0..4f0c1c8678 100644 Binary files a/public/images/emoji/twitter/azerbaijan.png and b/public/images/emoji/twitter/azerbaijan.png differ diff --git a/public/images/emoji/twitter/b.png b/public/images/emoji/twitter/b.png index 6902b1ec37..6662ffefc4 100644 Binary files a/public/images/emoji/twitter/b.png and b/public/images/emoji/twitter/b.png differ diff --git a/public/images/emoji/twitter/baby.png b/public/images/emoji/twitter/baby.png index aa1908186f..f093e36bb9 100644 Binary files a/public/images/emoji/twitter/baby.png and b/public/images/emoji/twitter/baby.png differ diff --git a/public/images/emoji/twitter/baby_bottle.png b/public/images/emoji/twitter/baby_bottle.png index e603a091f6..6dc01772f0 100644 Binary files a/public/images/emoji/twitter/baby_bottle.png and b/public/images/emoji/twitter/baby_bottle.png differ diff --git a/public/images/emoji/twitter/baby_chick.png b/public/images/emoji/twitter/baby_chick.png index 5a0ad7d4da..83e9cca048 100644 Binary files a/public/images/emoji/twitter/baby_chick.png and b/public/images/emoji/twitter/baby_chick.png differ diff --git a/public/images/emoji/twitter/baby_symbol.png b/public/images/emoji/twitter/baby_symbol.png index 41d9d0ff7e..4195611226 100644 Binary files a/public/images/emoji/twitter/baby_symbol.png and b/public/images/emoji/twitter/baby_symbol.png differ diff --git a/public/images/emoji/twitter/back.png b/public/images/emoji/twitter/back.png index ffe5dcc6d3..ef3be0d7e0 100644 Binary files a/public/images/emoji/twitter/back.png and b/public/images/emoji/twitter/back.png differ diff --git a/public/images/emoji/twitter/bacon.png b/public/images/emoji/twitter/bacon.png index b1cfa9dc3b..6b2418e79a 100644 Binary files a/public/images/emoji/twitter/bacon.png and b/public/images/emoji/twitter/bacon.png differ diff --git a/public/images/emoji/twitter/badger.png b/public/images/emoji/twitter/badger.png new file mode 100644 index 0000000000..3428da8863 Binary files /dev/null and b/public/images/emoji/twitter/badger.png differ diff --git a/public/images/emoji/twitter/badminton.png b/public/images/emoji/twitter/badminton.png index 3b5d0df295..9f2b09dcd0 100644 Binary files a/public/images/emoji/twitter/badminton.png and b/public/images/emoji/twitter/badminton.png differ diff --git a/public/images/emoji/twitter/bagel.png b/public/images/emoji/twitter/bagel.png new file mode 100644 index 0000000000..99312be2fe Binary files /dev/null and b/public/images/emoji/twitter/bagel.png differ diff --git a/public/images/emoji/twitter/baggage_claim.png b/public/images/emoji/twitter/baggage_claim.png index 2e83dd5bbf..6c15f41ed7 100644 Binary files a/public/images/emoji/twitter/baggage_claim.png and b/public/images/emoji/twitter/baggage_claim.png differ diff --git a/public/images/emoji/twitter/baguette_bread.png b/public/images/emoji/twitter/baguette_bread.png index 3be5a53903..70708f7707 100644 Binary files a/public/images/emoji/twitter/baguette_bread.png and b/public/images/emoji/twitter/baguette_bread.png differ diff --git a/public/images/emoji/twitter/bahamas.png b/public/images/emoji/twitter/bahamas.png index ed95128e19..f959101b26 100644 Binary files a/public/images/emoji/twitter/bahamas.png and b/public/images/emoji/twitter/bahamas.png differ diff --git a/public/images/emoji/twitter/bahrain.png b/public/images/emoji/twitter/bahrain.png index 815a93ef0b..28c3ec6f69 100644 Binary files a/public/images/emoji/twitter/bahrain.png and b/public/images/emoji/twitter/bahrain.png differ diff --git a/public/images/emoji/twitter/balance_scale.png b/public/images/emoji/twitter/balance_scale.png index 75713abc23..e4b2ea9ab5 100644 Binary files a/public/images/emoji/twitter/balance_scale.png and b/public/images/emoji/twitter/balance_scale.png differ diff --git a/public/images/emoji/twitter/balloon.png b/public/images/emoji/twitter/balloon.png index 9e48a78872..f003fbea2e 100644 Binary files a/public/images/emoji/twitter/balloon.png and b/public/images/emoji/twitter/balloon.png differ diff --git a/public/images/emoji/twitter/ballot_box.png b/public/images/emoji/twitter/ballot_box.png index 59bfa2ae2f..55dde42e02 100644 Binary files a/public/images/emoji/twitter/ballot_box.png and b/public/images/emoji/twitter/ballot_box.png differ diff --git a/public/images/emoji/twitter/ballot_box_with_ballot.png b/public/images/emoji/twitter/ballot_box_with_ballot.png index 59bfa2ae2f..55dde42e02 100644 Binary files a/public/images/emoji/twitter/ballot_box_with_ballot.png and b/public/images/emoji/twitter/ballot_box_with_ballot.png differ diff --git a/public/images/emoji/twitter/ballot_box_with_check.png b/public/images/emoji/twitter/ballot_box_with_check.png index 0f9112c178..4b530a8faa 100644 Binary files a/public/images/emoji/twitter/ballot_box_with_check.png and b/public/images/emoji/twitter/ballot_box_with_check.png differ diff --git a/public/images/emoji/twitter/bamboo.png b/public/images/emoji/twitter/bamboo.png index d5ba8b1867..6f99ebf421 100644 Binary files a/public/images/emoji/twitter/bamboo.png and b/public/images/emoji/twitter/bamboo.png differ diff --git a/public/images/emoji/twitter/banana.png b/public/images/emoji/twitter/banana.png index b6e8b94639..9a0f2c5731 100644 Binary files a/public/images/emoji/twitter/banana.png and b/public/images/emoji/twitter/banana.png differ diff --git a/public/images/emoji/twitter/bangbang.png b/public/images/emoji/twitter/bangbang.png index 99c1263232..2334a7f5c1 100644 Binary files a/public/images/emoji/twitter/bangbang.png and b/public/images/emoji/twitter/bangbang.png differ diff --git a/public/images/emoji/twitter/bangladesh.png b/public/images/emoji/twitter/bangladesh.png index caab400018..c1c933e092 100644 Binary files a/public/images/emoji/twitter/bangladesh.png and b/public/images/emoji/twitter/bangladesh.png differ diff --git a/public/images/emoji/twitter/bank.png b/public/images/emoji/twitter/bank.png index b26c6fbd07..04de53a186 100644 Binary files a/public/images/emoji/twitter/bank.png and b/public/images/emoji/twitter/bank.png differ diff --git a/public/images/emoji/twitter/bar_chart.png b/public/images/emoji/twitter/bar_chart.png index 3702be9fe7..b93558c6b4 100644 Binary files a/public/images/emoji/twitter/bar_chart.png and b/public/images/emoji/twitter/bar_chart.png differ diff --git a/public/images/emoji/twitter/barbados.png b/public/images/emoji/twitter/barbados.png index 830578344d..e6fb3edddb 100644 Binary files a/public/images/emoji/twitter/barbados.png and b/public/images/emoji/twitter/barbados.png differ diff --git a/public/images/emoji/twitter/barber.png b/public/images/emoji/twitter/barber.png index e968f48536..5c19ed5067 100644 Binary files a/public/images/emoji/twitter/barber.png and b/public/images/emoji/twitter/barber.png differ diff --git a/public/images/emoji/twitter/baseball.png b/public/images/emoji/twitter/baseball.png index b7ad17d4d7..b69c9c765b 100644 Binary files a/public/images/emoji/twitter/baseball.png and b/public/images/emoji/twitter/baseball.png differ diff --git a/public/images/emoji/twitter/basket.png b/public/images/emoji/twitter/basket.png new file mode 100644 index 0000000000..020899092f Binary files /dev/null and b/public/images/emoji/twitter/basket.png differ diff --git a/public/images/emoji/twitter/basketball.png b/public/images/emoji/twitter/basketball.png index d836f405d6..144a5d6acc 100644 Binary files a/public/images/emoji/twitter/basketball.png and b/public/images/emoji/twitter/basketball.png differ diff --git a/public/images/emoji/twitter/basketball_man.png b/public/images/emoji/twitter/basketball_man.png index ac6a6c2c9f..080e813ae0 100644 Binary files a/public/images/emoji/twitter/basketball_man.png and b/public/images/emoji/twitter/basketball_man.png differ diff --git a/public/images/emoji/twitter/basketball_player.png b/public/images/emoji/twitter/basketball_player.png index ac6a6c2c9f..080e813ae0 100644 Binary files a/public/images/emoji/twitter/basketball_player.png and b/public/images/emoji/twitter/basketball_player.png differ diff --git a/public/images/emoji/twitter/basketball_woman.png b/public/images/emoji/twitter/basketball_woman.png index 7df66bcfb7..1ce1647559 100644 Binary files a/public/images/emoji/twitter/basketball_woman.png and b/public/images/emoji/twitter/basketball_woman.png differ diff --git a/public/images/emoji/twitter/bat.png b/public/images/emoji/twitter/bat.png index d997111fc5..ae2a6d874b 100644 Binary files a/public/images/emoji/twitter/bat.png and b/public/images/emoji/twitter/bat.png differ diff --git a/public/images/emoji/twitter/bath.png b/public/images/emoji/twitter/bath.png index ed94dd59b4..476a0c174b 100644 Binary files a/public/images/emoji/twitter/bath.png and b/public/images/emoji/twitter/bath.png differ diff --git a/public/images/emoji/twitter/bathtub.png b/public/images/emoji/twitter/bathtub.png index 1df1f5ca50..cac11d9aa1 100644 Binary files a/public/images/emoji/twitter/bathtub.png and b/public/images/emoji/twitter/bathtub.png differ diff --git a/public/images/emoji/twitter/battery.png b/public/images/emoji/twitter/battery.png index 8c75b30c8f..62953aed7d 100644 Binary files a/public/images/emoji/twitter/battery.png and b/public/images/emoji/twitter/battery.png differ diff --git a/public/images/emoji/twitter/beach.png b/public/images/emoji/twitter/beach.png index 894e33bee1..19cf9ce916 100644 Binary files a/public/images/emoji/twitter/beach.png and b/public/images/emoji/twitter/beach.png differ diff --git a/public/images/emoji/twitter/beach_umbrella.png b/public/images/emoji/twitter/beach_umbrella.png index 894e33bee1..19cf9ce916 100644 Binary files a/public/images/emoji/twitter/beach_umbrella.png and b/public/images/emoji/twitter/beach_umbrella.png differ diff --git a/public/images/emoji/twitter/beach_with_umbrella.png b/public/images/emoji/twitter/beach_with_umbrella.png index 894e33bee1..19cf9ce916 100644 Binary files a/public/images/emoji/twitter/beach_with_umbrella.png and b/public/images/emoji/twitter/beach_with_umbrella.png differ diff --git a/public/images/emoji/twitter/bear.png b/public/images/emoji/twitter/bear.png index 2f5d8e3ec2..7f75ec0897 100644 Binary files a/public/images/emoji/twitter/bear.png and b/public/images/emoji/twitter/bear.png differ diff --git a/public/images/emoji/twitter/bearded_person.png b/public/images/emoji/twitter/bearded_person.png index ed22a6cb38..db4c1a2725 100644 Binary files a/public/images/emoji/twitter/bearded_person.png and b/public/images/emoji/twitter/bearded_person.png differ diff --git a/public/images/emoji/twitter/bed.png b/public/images/emoji/twitter/bed.png index 98d795e847..1c5a08fa7c 100644 Binary files a/public/images/emoji/twitter/bed.png and b/public/images/emoji/twitter/bed.png differ diff --git a/public/images/emoji/twitter/bee.png b/public/images/emoji/twitter/bee.png index 1dde5bac0d..ad8434e748 100644 Binary files a/public/images/emoji/twitter/bee.png and b/public/images/emoji/twitter/bee.png differ diff --git a/public/images/emoji/twitter/beer.png b/public/images/emoji/twitter/beer.png index 2301c44270..4fb6668732 100644 Binary files a/public/images/emoji/twitter/beer.png and b/public/images/emoji/twitter/beer.png differ diff --git a/public/images/emoji/twitter/beers.png b/public/images/emoji/twitter/beers.png index 898db27f1d..ad7800d64b 100644 Binary files a/public/images/emoji/twitter/beers.png and b/public/images/emoji/twitter/beers.png differ diff --git a/public/images/emoji/twitter/beetle.png b/public/images/emoji/twitter/beetle.png index 47ba5e5871..e475c40cf9 100644 Binary files a/public/images/emoji/twitter/beetle.png and b/public/images/emoji/twitter/beetle.png differ diff --git a/public/images/emoji/twitter/beginner.png b/public/images/emoji/twitter/beginner.png index d0c3d5200f..e513fb368a 100644 Binary files a/public/images/emoji/twitter/beginner.png and b/public/images/emoji/twitter/beginner.png differ diff --git a/public/images/emoji/twitter/belarus.png b/public/images/emoji/twitter/belarus.png index e75dc9ec50..fc2051bf7e 100644 Binary files a/public/images/emoji/twitter/belarus.png and b/public/images/emoji/twitter/belarus.png differ diff --git a/public/images/emoji/twitter/belgium.png b/public/images/emoji/twitter/belgium.png index ca401e5985..5fa8040164 100644 Binary files a/public/images/emoji/twitter/belgium.png and b/public/images/emoji/twitter/belgium.png differ diff --git a/public/images/emoji/twitter/belize.png b/public/images/emoji/twitter/belize.png index 5f6dded80b..0c23f8075a 100644 Binary files a/public/images/emoji/twitter/belize.png and b/public/images/emoji/twitter/belize.png differ diff --git a/public/images/emoji/twitter/bell.png b/public/images/emoji/twitter/bell.png index d709170bda..6626232b61 100644 Binary files a/public/images/emoji/twitter/bell.png and b/public/images/emoji/twitter/bell.png differ diff --git a/public/images/emoji/twitter/bellhop.png b/public/images/emoji/twitter/bellhop.png index 21a073029d..82d49dab57 100644 Binary files a/public/images/emoji/twitter/bellhop.png and b/public/images/emoji/twitter/bellhop.png differ diff --git a/public/images/emoji/twitter/bellhop_bell.png b/public/images/emoji/twitter/bellhop_bell.png index 21a073029d..82d49dab57 100644 Binary files a/public/images/emoji/twitter/bellhop_bell.png and b/public/images/emoji/twitter/bellhop_bell.png differ diff --git a/public/images/emoji/twitter/benin.png b/public/images/emoji/twitter/benin.png index bb74e98818..d680841fc2 100644 Binary files a/public/images/emoji/twitter/benin.png and b/public/images/emoji/twitter/benin.png differ diff --git a/public/images/emoji/twitter/bento.png b/public/images/emoji/twitter/bento.png index 14261e4878..fde795df59 100644 Binary files a/public/images/emoji/twitter/bento.png and b/public/images/emoji/twitter/bento.png differ diff --git a/public/images/emoji/twitter/bermuda.png b/public/images/emoji/twitter/bermuda.png index 75f2fac760..13531297f2 100644 Binary files a/public/images/emoji/twitter/bermuda.png and b/public/images/emoji/twitter/bermuda.png differ diff --git a/public/images/emoji/twitter/bhutan.png b/public/images/emoji/twitter/bhutan.png index d9a2d20fc1..3e4ce7df33 100644 Binary files a/public/images/emoji/twitter/bhutan.png and b/public/images/emoji/twitter/bhutan.png differ diff --git a/public/images/emoji/twitter/bicyclist.png b/public/images/emoji/twitter/bicyclist.png index 809093cea9..ec41d94038 100644 Binary files a/public/images/emoji/twitter/bicyclist.png and b/public/images/emoji/twitter/bicyclist.png differ diff --git a/public/images/emoji/twitter/bike.png b/public/images/emoji/twitter/bike.png index e2c20735ff..3c3b5f88bc 100644 Binary files a/public/images/emoji/twitter/bike.png and b/public/images/emoji/twitter/bike.png differ diff --git a/public/images/emoji/twitter/biking_man.png b/public/images/emoji/twitter/biking_man.png index 809093cea9..ec41d94038 100644 Binary files a/public/images/emoji/twitter/biking_man.png and b/public/images/emoji/twitter/biking_man.png differ diff --git a/public/images/emoji/twitter/biking_woman.png b/public/images/emoji/twitter/biking_woman.png index eab8bcf9f6..bf9729e40c 100644 Binary files a/public/images/emoji/twitter/biking_woman.png and b/public/images/emoji/twitter/biking_woman.png differ diff --git a/public/images/emoji/twitter/bikini.png b/public/images/emoji/twitter/bikini.png index a3e74a1ac6..abce9b55f2 100644 Binary files a/public/images/emoji/twitter/bikini.png and b/public/images/emoji/twitter/bikini.png differ diff --git a/public/images/emoji/twitter/billed_cap.png b/public/images/emoji/twitter/billed_cap.png index 5cc92e307e..1441df8c83 100644 Binary files a/public/images/emoji/twitter/billed_cap.png and b/public/images/emoji/twitter/billed_cap.png differ diff --git a/public/images/emoji/twitter/biohazard.png b/public/images/emoji/twitter/biohazard.png index 95f312482c..5d8d42b02b 100644 Binary files a/public/images/emoji/twitter/biohazard.png and b/public/images/emoji/twitter/biohazard.png differ diff --git a/public/images/emoji/twitter/biohazard_sign.png b/public/images/emoji/twitter/biohazard_sign.png index 95f312482c..5d8d42b02b 100644 Binary files a/public/images/emoji/twitter/biohazard_sign.png and b/public/images/emoji/twitter/biohazard_sign.png differ diff --git a/public/images/emoji/twitter/bird.png b/public/images/emoji/twitter/bird.png index 43ba2d4a9d..d129ac778f 100644 Binary files a/public/images/emoji/twitter/bird.png and b/public/images/emoji/twitter/bird.png differ diff --git a/public/images/emoji/twitter/birthday.png b/public/images/emoji/twitter/birthday.png index 9c8a879b67..54a6232020 100644 Binary files a/public/images/emoji/twitter/birthday.png and b/public/images/emoji/twitter/birthday.png differ diff --git a/public/images/emoji/twitter/black_circle.png b/public/images/emoji/twitter/black_circle.png index 006d9ec3ef..1f53307fbf 100644 Binary files a/public/images/emoji/twitter/black_circle.png and b/public/images/emoji/twitter/black_circle.png differ diff --git a/public/images/emoji/twitter/black_flag.png b/public/images/emoji/twitter/black_flag.png index 5c1237bdad..3f676418d3 100644 Binary files a/public/images/emoji/twitter/black_flag.png and b/public/images/emoji/twitter/black_flag.png differ diff --git a/public/images/emoji/twitter/black_heart.png b/public/images/emoji/twitter/black_heart.png index b237819755..4607b11e70 100644 Binary files a/public/images/emoji/twitter/black_heart.png and b/public/images/emoji/twitter/black_heart.png differ diff --git a/public/images/emoji/twitter/black_joker.png b/public/images/emoji/twitter/black_joker.png index eea3a53bcf..5530110afe 100644 Binary files a/public/images/emoji/twitter/black_joker.png and b/public/images/emoji/twitter/black_joker.png differ diff --git a/public/images/emoji/twitter/black_large_square.png b/public/images/emoji/twitter/black_large_square.png index 732f04789f..5e674ab3c6 100644 Binary files a/public/images/emoji/twitter/black_large_square.png and b/public/images/emoji/twitter/black_large_square.png differ diff --git a/public/images/emoji/twitter/black_medium_small_square.png b/public/images/emoji/twitter/black_medium_small_square.png index 3119431da0..c8c416751b 100644 Binary files a/public/images/emoji/twitter/black_medium_small_square.png and b/public/images/emoji/twitter/black_medium_small_square.png differ diff --git a/public/images/emoji/twitter/black_medium_square.png b/public/images/emoji/twitter/black_medium_square.png index 6bd2a150c1..f2bc810dff 100644 Binary files a/public/images/emoji/twitter/black_medium_square.png and b/public/images/emoji/twitter/black_medium_square.png differ diff --git a/public/images/emoji/twitter/black_nib.png b/public/images/emoji/twitter/black_nib.png index ec98edd0c6..422d140725 100644 Binary files a/public/images/emoji/twitter/black_nib.png and b/public/images/emoji/twitter/black_nib.png differ diff --git a/public/images/emoji/twitter/black_small_square.png b/public/images/emoji/twitter/black_small_square.png index b3bfb1c633..b1655918e9 100644 Binary files a/public/images/emoji/twitter/black_small_square.png and b/public/images/emoji/twitter/black_small_square.png differ diff --git a/public/images/emoji/twitter/black_square_button.png b/public/images/emoji/twitter/black_square_button.png index d271e6aa9d..06d70ca30a 100644 Binary files a/public/images/emoji/twitter/black_square_button.png and b/public/images/emoji/twitter/black_square_button.png differ diff --git a/public/images/emoji/twitter/blonde_man.png b/public/images/emoji/twitter/blonde_man.png index 419c5d22c5..381a8d4381 100644 Binary files a/public/images/emoji/twitter/blonde_man.png and b/public/images/emoji/twitter/blonde_man.png differ diff --git a/public/images/emoji/twitter/blonde_woman.png b/public/images/emoji/twitter/blonde_woman.png index 11e258fa61..f5718a8c28 100644 Binary files a/public/images/emoji/twitter/blonde_woman.png and b/public/images/emoji/twitter/blonde_woman.png differ diff --git a/public/images/emoji/twitter/blossom.png b/public/images/emoji/twitter/blossom.png index 058f31fd55..12f5ce461f 100644 Binary files a/public/images/emoji/twitter/blossom.png and b/public/images/emoji/twitter/blossom.png differ diff --git a/public/images/emoji/twitter/blowfish.png b/public/images/emoji/twitter/blowfish.png index 089e190335..1dc9bd9a0e 100644 Binary files a/public/images/emoji/twitter/blowfish.png and b/public/images/emoji/twitter/blowfish.png differ diff --git a/public/images/emoji/twitter/blue_book.png b/public/images/emoji/twitter/blue_book.png index 716bc24d30..7def58a660 100644 Binary files a/public/images/emoji/twitter/blue_book.png and b/public/images/emoji/twitter/blue_book.png differ diff --git a/public/images/emoji/twitter/blue_car.png b/public/images/emoji/twitter/blue_car.png index 45f6be3e91..4563409213 100644 Binary files a/public/images/emoji/twitter/blue_car.png and b/public/images/emoji/twitter/blue_car.png differ diff --git a/public/images/emoji/twitter/blue_heart.png b/public/images/emoji/twitter/blue_heart.png index 86fa978455..736bc85cae 100644 Binary files a/public/images/emoji/twitter/blue_heart.png and b/public/images/emoji/twitter/blue_heart.png differ diff --git a/public/images/emoji/twitter/blush.png b/public/images/emoji/twitter/blush.png index 5a2c5d0463..8a5b034e05 100644 Binary files a/public/images/emoji/twitter/blush.png and b/public/images/emoji/twitter/blush.png differ diff --git a/public/images/emoji/twitter/boar.png b/public/images/emoji/twitter/boar.png index ad255bc8eb..f03e94dc0e 100644 Binary files a/public/images/emoji/twitter/boar.png and b/public/images/emoji/twitter/boar.png differ diff --git a/public/images/emoji/twitter/boat.png b/public/images/emoji/twitter/boat.png index 3eba365766..e841e34b68 100644 Binary files a/public/images/emoji/twitter/boat.png and b/public/images/emoji/twitter/boat.png differ diff --git a/public/images/emoji/twitter/bolivia.png b/public/images/emoji/twitter/bolivia.png index af9bd4d5e7..21c555bdd6 100644 Binary files a/public/images/emoji/twitter/bolivia.png and b/public/images/emoji/twitter/bolivia.png differ diff --git a/public/images/emoji/twitter/bomb.png b/public/images/emoji/twitter/bomb.png index 00fad57501..300674706f 100644 Binary files a/public/images/emoji/twitter/bomb.png and b/public/images/emoji/twitter/bomb.png differ diff --git a/public/images/emoji/twitter/bone.png b/public/images/emoji/twitter/bone.png new file mode 100644 index 0000000000..0b54e2b72a Binary files /dev/null and b/public/images/emoji/twitter/bone.png differ diff --git a/public/images/emoji/twitter/book.png b/public/images/emoji/twitter/book.png index 6f220c4b0b..3655af87a3 100644 Binary files a/public/images/emoji/twitter/book.png and b/public/images/emoji/twitter/book.png differ diff --git a/public/images/emoji/twitter/bookmark.png b/public/images/emoji/twitter/bookmark.png index 1cdbf48a23..af2e95ea82 100644 Binary files a/public/images/emoji/twitter/bookmark.png and b/public/images/emoji/twitter/bookmark.png differ diff --git a/public/images/emoji/twitter/bookmark_tabs.png b/public/images/emoji/twitter/bookmark_tabs.png index 77cc253be0..f264f93140 100644 Binary files a/public/images/emoji/twitter/bookmark_tabs.png and b/public/images/emoji/twitter/bookmark_tabs.png differ diff --git a/public/images/emoji/twitter/books.png b/public/images/emoji/twitter/books.png index 755010dfab..d59038434f 100644 Binary files a/public/images/emoji/twitter/books.png and b/public/images/emoji/twitter/books.png differ diff --git a/public/images/emoji/twitter/boom.png b/public/images/emoji/twitter/boom.png index 3ff0419233..8bf99d6434 100644 Binary files a/public/images/emoji/twitter/boom.png and b/public/images/emoji/twitter/boom.png differ diff --git a/public/images/emoji/twitter/boot.png b/public/images/emoji/twitter/boot.png index fc1467a5f7..4e32ccbf65 100644 Binary files a/public/images/emoji/twitter/boot.png and b/public/images/emoji/twitter/boot.png differ diff --git a/public/images/emoji/twitter/bosnia_herzegovina.png b/public/images/emoji/twitter/bosnia_herzegovina.png index 91493ade75..3ffe114d94 100644 Binary files a/public/images/emoji/twitter/bosnia_herzegovina.png and b/public/images/emoji/twitter/bosnia_herzegovina.png differ diff --git a/public/images/emoji/twitter/botswana.png b/public/images/emoji/twitter/botswana.png index 3697a723dd..bd99bb4bf3 100644 Binary files a/public/images/emoji/twitter/botswana.png and b/public/images/emoji/twitter/botswana.png differ diff --git a/public/images/emoji/twitter/bottle_with_popping_cork.png b/public/images/emoji/twitter/bottle_with_popping_cork.png index 49ea37f389..2342f1bdec 100644 Binary files a/public/images/emoji/twitter/bottle_with_popping_cork.png and b/public/images/emoji/twitter/bottle_with_popping_cork.png differ diff --git a/public/images/emoji/twitter/bouquet.png b/public/images/emoji/twitter/bouquet.png index 1afe2438e2..79bdf474e6 100644 Binary files a/public/images/emoji/twitter/bouquet.png and b/public/images/emoji/twitter/bouquet.png differ diff --git a/public/images/emoji/twitter/bouvet_island.png b/public/images/emoji/twitter/bouvet_island.png index 801a577654..5f86c9a176 100644 Binary files a/public/images/emoji/twitter/bouvet_island.png and b/public/images/emoji/twitter/bouvet_island.png differ diff --git a/public/images/emoji/twitter/bow.png b/public/images/emoji/twitter/bow.png index c602d42a91..2d03b55a33 100644 Binary files a/public/images/emoji/twitter/bow.png and b/public/images/emoji/twitter/bow.png differ diff --git a/public/images/emoji/twitter/bow_and_arrow.png b/public/images/emoji/twitter/bow_and_arrow.png index f50a1389fe..87dea7a594 100644 Binary files a/public/images/emoji/twitter/bow_and_arrow.png and b/public/images/emoji/twitter/bow_and_arrow.png differ diff --git a/public/images/emoji/twitter/bowing_man.png b/public/images/emoji/twitter/bowing_man.png index c602d42a91..2d03b55a33 100644 Binary files a/public/images/emoji/twitter/bowing_man.png and b/public/images/emoji/twitter/bowing_man.png differ diff --git a/public/images/emoji/twitter/bowing_woman.png b/public/images/emoji/twitter/bowing_woman.png index bbe859ce67..d452a985c9 100644 Binary files a/public/images/emoji/twitter/bowing_woman.png and b/public/images/emoji/twitter/bowing_woman.png differ diff --git a/public/images/emoji/twitter/bowl_with_spoon.png b/public/images/emoji/twitter/bowl_with_spoon.png index b0d88a73b9..2905488376 100644 Binary files a/public/images/emoji/twitter/bowl_with_spoon.png and b/public/images/emoji/twitter/bowl_with_spoon.png differ diff --git a/public/images/emoji/twitter/bowling.png b/public/images/emoji/twitter/bowling.png index 9c334abe13..187da74f08 100644 Binary files a/public/images/emoji/twitter/bowling.png and b/public/images/emoji/twitter/bowling.png differ diff --git a/public/images/emoji/twitter/boxing_glove.png b/public/images/emoji/twitter/boxing_glove.png index abb4d24834..334c35535f 100644 Binary files a/public/images/emoji/twitter/boxing_glove.png and b/public/images/emoji/twitter/boxing_glove.png differ diff --git a/public/images/emoji/twitter/boy.png b/public/images/emoji/twitter/boy.png index a1babeb1cd..0d7bcf2a83 100644 Binary files a/public/images/emoji/twitter/boy.png and b/public/images/emoji/twitter/boy.png differ diff --git a/public/images/emoji/twitter/brain.png b/public/images/emoji/twitter/brain.png index c8e889faec..1c3928ae8b 100644 Binary files a/public/images/emoji/twitter/brain.png and b/public/images/emoji/twitter/brain.png differ diff --git a/public/images/emoji/twitter/brazil.png b/public/images/emoji/twitter/brazil.png index a68b1e6b58..642f3a520d 100644 Binary files a/public/images/emoji/twitter/brazil.png and b/public/images/emoji/twitter/brazil.png differ diff --git a/public/images/emoji/twitter/bread.png b/public/images/emoji/twitter/bread.png index b4bc050820..bf86b18a3b 100644 Binary files a/public/images/emoji/twitter/bread.png and b/public/images/emoji/twitter/bread.png differ diff --git a/public/images/emoji/twitter/breast_feeding.png b/public/images/emoji/twitter/breast_feeding.png index 815538138b..dba766f9a0 100644 Binary files a/public/images/emoji/twitter/breast_feeding.png and b/public/images/emoji/twitter/breast_feeding.png differ diff --git a/public/images/emoji/twitter/brick.png b/public/images/emoji/twitter/brick.png new file mode 100644 index 0000000000..5b87f50c8d Binary files /dev/null and b/public/images/emoji/twitter/brick.png differ diff --git a/public/images/emoji/twitter/bride_with_veil.png b/public/images/emoji/twitter/bride_with_veil.png index ca5bcd13fc..a5b1e1b824 100644 Binary files a/public/images/emoji/twitter/bride_with_veil.png and b/public/images/emoji/twitter/bride_with_veil.png differ diff --git a/public/images/emoji/twitter/bridge_at_night.png b/public/images/emoji/twitter/bridge_at_night.png index 290ac91ae1..aed3c92655 100644 Binary files a/public/images/emoji/twitter/bridge_at_night.png and b/public/images/emoji/twitter/bridge_at_night.png differ diff --git a/public/images/emoji/twitter/briefcase.png b/public/images/emoji/twitter/briefcase.png index 7bbdc1d050..08670c075a 100644 Binary files a/public/images/emoji/twitter/briefcase.png and b/public/images/emoji/twitter/briefcase.png differ diff --git a/public/images/emoji/twitter/british_indian_ocean_territory.png b/public/images/emoji/twitter/british_indian_ocean_territory.png index e3d2479344..894316f63a 100644 Binary files a/public/images/emoji/twitter/british_indian_ocean_territory.png and b/public/images/emoji/twitter/british_indian_ocean_territory.png differ diff --git a/public/images/emoji/twitter/british_virgin_islands.png b/public/images/emoji/twitter/british_virgin_islands.png index 9f758979a1..72017181c9 100644 Binary files a/public/images/emoji/twitter/british_virgin_islands.png and b/public/images/emoji/twitter/british_virgin_islands.png differ diff --git a/public/images/emoji/twitter/broccoli.png b/public/images/emoji/twitter/broccoli.png index 5e03a6d23b..ddff80ceda 100644 Binary files a/public/images/emoji/twitter/broccoli.png and b/public/images/emoji/twitter/broccoli.png differ diff --git a/public/images/emoji/twitter/broken_heart.png b/public/images/emoji/twitter/broken_heart.png index 09760a2b81..7ffe859e32 100644 Binary files a/public/images/emoji/twitter/broken_heart.png and b/public/images/emoji/twitter/broken_heart.png differ diff --git a/public/images/emoji/twitter/broom.png b/public/images/emoji/twitter/broom.png new file mode 100644 index 0000000000..88fe3eeb3b Binary files /dev/null and b/public/images/emoji/twitter/broom.png differ diff --git a/public/images/emoji/twitter/brunei.png b/public/images/emoji/twitter/brunei.png index 647e1c4d79..03dda7489f 100644 Binary files a/public/images/emoji/twitter/brunei.png and b/public/images/emoji/twitter/brunei.png differ diff --git a/public/images/emoji/twitter/bug.png b/public/images/emoji/twitter/bug.png index d15d3f6d09..d38a6ca6be 100644 Binary files a/public/images/emoji/twitter/bug.png and b/public/images/emoji/twitter/bug.png differ diff --git a/public/images/emoji/twitter/building_construction.png b/public/images/emoji/twitter/building_construction.png index 24cdec2e5f..0c6e9dffe5 100644 Binary files a/public/images/emoji/twitter/building_construction.png and b/public/images/emoji/twitter/building_construction.png differ diff --git a/public/images/emoji/twitter/bulb.png b/public/images/emoji/twitter/bulb.png index 0fcc38b2a5..ae01adac42 100644 Binary files a/public/images/emoji/twitter/bulb.png and b/public/images/emoji/twitter/bulb.png differ diff --git a/public/images/emoji/twitter/bulgaria.png b/public/images/emoji/twitter/bulgaria.png index 5185700c63..0519f963c5 100644 Binary files a/public/images/emoji/twitter/bulgaria.png and b/public/images/emoji/twitter/bulgaria.png differ diff --git a/public/images/emoji/twitter/bullettrain_front.png b/public/images/emoji/twitter/bullettrain_front.png index 92ba37009d..243397fc7c 100644 Binary files a/public/images/emoji/twitter/bullettrain_front.png and b/public/images/emoji/twitter/bullettrain_front.png differ diff --git a/public/images/emoji/twitter/bullettrain_side.png b/public/images/emoji/twitter/bullettrain_side.png index 299aa8a159..d2f39a7312 100644 Binary files a/public/images/emoji/twitter/bullettrain_side.png and b/public/images/emoji/twitter/bullettrain_side.png differ diff --git a/public/images/emoji/twitter/burkina_faso.png b/public/images/emoji/twitter/burkina_faso.png index c519f8a954..dad580a778 100644 Binary files a/public/images/emoji/twitter/burkina_faso.png and b/public/images/emoji/twitter/burkina_faso.png differ diff --git a/public/images/emoji/twitter/burrito.png b/public/images/emoji/twitter/burrito.png index 74894241cc..6e2327063a 100644 Binary files a/public/images/emoji/twitter/burrito.png and b/public/images/emoji/twitter/burrito.png differ diff --git a/public/images/emoji/twitter/burundi.png b/public/images/emoji/twitter/burundi.png index 83e731cc34..7133116525 100644 Binary files a/public/images/emoji/twitter/burundi.png and b/public/images/emoji/twitter/burundi.png differ diff --git a/public/images/emoji/twitter/bus.png b/public/images/emoji/twitter/bus.png index 13d73d3b5e..dec4523268 100644 Binary files a/public/images/emoji/twitter/bus.png and b/public/images/emoji/twitter/bus.png differ diff --git a/public/images/emoji/twitter/business_suit_levitating.png b/public/images/emoji/twitter/business_suit_levitating.png index 5231c708a0..c03dcfc6b6 100644 Binary files a/public/images/emoji/twitter/business_suit_levitating.png and b/public/images/emoji/twitter/business_suit_levitating.png differ diff --git a/public/images/emoji/twitter/busstop.png b/public/images/emoji/twitter/busstop.png index afcf2415d4..06a7892894 100644 Binary files a/public/images/emoji/twitter/busstop.png and b/public/images/emoji/twitter/busstop.png differ diff --git a/public/images/emoji/twitter/bust_in_silhouette.png b/public/images/emoji/twitter/bust_in_silhouette.png index 2c06f942b8..eee4d32c8e 100644 Binary files a/public/images/emoji/twitter/bust_in_silhouette.png and b/public/images/emoji/twitter/bust_in_silhouette.png differ diff --git a/public/images/emoji/twitter/busts_in_silhouette.png b/public/images/emoji/twitter/busts_in_silhouette.png index 741dca4fc7..ec831acef1 100644 Binary files a/public/images/emoji/twitter/busts_in_silhouette.png and b/public/images/emoji/twitter/busts_in_silhouette.png differ diff --git a/public/images/emoji/twitter/butterfly.png b/public/images/emoji/twitter/butterfly.png index 995ea58f80..17701e7906 100644 Binary files a/public/images/emoji/twitter/butterfly.png and b/public/images/emoji/twitter/butterfly.png differ diff --git a/public/images/emoji/twitter/cactus.png b/public/images/emoji/twitter/cactus.png index de2f19e12e..76c5096d17 100644 Binary files a/public/images/emoji/twitter/cactus.png and b/public/images/emoji/twitter/cactus.png differ diff --git a/public/images/emoji/twitter/cake.png b/public/images/emoji/twitter/cake.png index 5734838437..311ffe7705 100644 Binary files a/public/images/emoji/twitter/cake.png and b/public/images/emoji/twitter/cake.png differ diff --git a/public/images/emoji/twitter/calendar.png b/public/images/emoji/twitter/calendar.png index f2ccc32917..a691f60331 100644 Binary files a/public/images/emoji/twitter/calendar.png and b/public/images/emoji/twitter/calendar.png differ diff --git a/public/images/emoji/twitter/calendar_spiral.png b/public/images/emoji/twitter/calendar_spiral.png index 8cd3bd7e57..d7a94f62ad 100644 Binary files a/public/images/emoji/twitter/calendar_spiral.png and b/public/images/emoji/twitter/calendar_spiral.png differ diff --git a/public/images/emoji/twitter/call_me_hand.png b/public/images/emoji/twitter/call_me_hand.png index 6e50aea9ee..6a4dcb42de 100644 Binary files a/public/images/emoji/twitter/call_me_hand.png and b/public/images/emoji/twitter/call_me_hand.png differ diff --git a/public/images/emoji/twitter/calling.png b/public/images/emoji/twitter/calling.png index 0d3fd14374..876bfb8cf6 100644 Binary files a/public/images/emoji/twitter/calling.png and b/public/images/emoji/twitter/calling.png differ diff --git a/public/images/emoji/twitter/cambodia.png b/public/images/emoji/twitter/cambodia.png index 0a7ca06fb4..5be917325f 100644 Binary files a/public/images/emoji/twitter/cambodia.png and b/public/images/emoji/twitter/cambodia.png differ diff --git a/public/images/emoji/twitter/camel.png b/public/images/emoji/twitter/camel.png index befca3ead3..af4a976b32 100644 Binary files a/public/images/emoji/twitter/camel.png and b/public/images/emoji/twitter/camel.png differ diff --git a/public/images/emoji/twitter/camera.png b/public/images/emoji/twitter/camera.png index a85081aaac..fe5438903e 100644 Binary files a/public/images/emoji/twitter/camera.png and b/public/images/emoji/twitter/camera.png differ diff --git a/public/images/emoji/twitter/camera_flash.png b/public/images/emoji/twitter/camera_flash.png index fd49394ac1..434d7f87e4 100644 Binary files a/public/images/emoji/twitter/camera_flash.png and b/public/images/emoji/twitter/camera_flash.png differ diff --git a/public/images/emoji/twitter/camera_with_flash.png b/public/images/emoji/twitter/camera_with_flash.png index fd49394ac1..434d7f87e4 100644 Binary files a/public/images/emoji/twitter/camera_with_flash.png and b/public/images/emoji/twitter/camera_with_flash.png differ diff --git a/public/images/emoji/twitter/cameroon.png b/public/images/emoji/twitter/cameroon.png index b9aaf46348..c9eab9a4d1 100644 Binary files a/public/images/emoji/twitter/cameroon.png and b/public/images/emoji/twitter/cameroon.png differ diff --git a/public/images/emoji/twitter/camping.png b/public/images/emoji/twitter/camping.png index 414dc9caf6..73d9df795c 100644 Binary files a/public/images/emoji/twitter/camping.png and b/public/images/emoji/twitter/camping.png differ diff --git a/public/images/emoji/twitter/canada.png b/public/images/emoji/twitter/canada.png index 82664ad79e..fe777da3f5 100644 Binary files a/public/images/emoji/twitter/canada.png and b/public/images/emoji/twitter/canada.png differ diff --git a/public/images/emoji/twitter/canary_islands.png b/public/images/emoji/twitter/canary_islands.png index 68ccf48d0d..80f670c87e 100644 Binary files a/public/images/emoji/twitter/canary_islands.png and b/public/images/emoji/twitter/canary_islands.png differ diff --git a/public/images/emoji/twitter/cancer.png b/public/images/emoji/twitter/cancer.png index 9c669df80d..9d14919ebf 100644 Binary files a/public/images/emoji/twitter/cancer.png and b/public/images/emoji/twitter/cancer.png differ diff --git a/public/images/emoji/twitter/candle.png b/public/images/emoji/twitter/candle.png index 0a27def4ef..60378d6652 100644 Binary files a/public/images/emoji/twitter/candle.png and b/public/images/emoji/twitter/candle.png differ diff --git a/public/images/emoji/twitter/candy.png b/public/images/emoji/twitter/candy.png index 83a40d2216..de50bdd580 100644 Binary files a/public/images/emoji/twitter/candy.png and b/public/images/emoji/twitter/candy.png differ diff --git a/public/images/emoji/twitter/canned_food.png b/public/images/emoji/twitter/canned_food.png index 2e5976e9d2..0c6ef0fadd 100644 Binary files a/public/images/emoji/twitter/canned_food.png and b/public/images/emoji/twitter/canned_food.png differ diff --git a/public/images/emoji/twitter/canoe.png b/public/images/emoji/twitter/canoe.png index 4ee3c9caa7..2a84c04cf6 100644 Binary files a/public/images/emoji/twitter/canoe.png and b/public/images/emoji/twitter/canoe.png differ diff --git a/public/images/emoji/twitter/cape_verde.png b/public/images/emoji/twitter/cape_verde.png index 1252c37a6d..4c50734580 100644 Binary files a/public/images/emoji/twitter/cape_verde.png and b/public/images/emoji/twitter/cape_verde.png differ diff --git a/public/images/emoji/twitter/capital_abcd.png b/public/images/emoji/twitter/capital_abcd.png index 2b2060e2f1..7d1ffbab61 100644 Binary files a/public/images/emoji/twitter/capital_abcd.png and b/public/images/emoji/twitter/capital_abcd.png differ diff --git a/public/images/emoji/twitter/capricorn.png b/public/images/emoji/twitter/capricorn.png index 58ce893273..2f631f1d9b 100644 Binary files a/public/images/emoji/twitter/capricorn.png and b/public/images/emoji/twitter/capricorn.png differ diff --git a/public/images/emoji/twitter/car.png b/public/images/emoji/twitter/car.png index 2fbf351b83..683c0425ea 100644 Binary files a/public/images/emoji/twitter/car.png and b/public/images/emoji/twitter/car.png differ diff --git a/public/images/emoji/twitter/card_box.png b/public/images/emoji/twitter/card_box.png index 5f2766de91..81f451e649 100644 Binary files a/public/images/emoji/twitter/card_box.png and b/public/images/emoji/twitter/card_box.png differ diff --git a/public/images/emoji/twitter/card_file_box.png b/public/images/emoji/twitter/card_file_box.png index 5f2766de91..81f451e649 100644 Binary files a/public/images/emoji/twitter/card_file_box.png and b/public/images/emoji/twitter/card_file_box.png differ diff --git a/public/images/emoji/twitter/card_index.png b/public/images/emoji/twitter/card_index.png index c2a628dfdc..eded4f9dcb 100644 Binary files a/public/images/emoji/twitter/card_index.png and b/public/images/emoji/twitter/card_index.png differ diff --git a/public/images/emoji/twitter/card_index_dividers.png b/public/images/emoji/twitter/card_index_dividers.png index b1e27091c9..89495773de 100644 Binary files a/public/images/emoji/twitter/card_index_dividers.png and b/public/images/emoji/twitter/card_index_dividers.png differ diff --git a/public/images/emoji/twitter/caribbean_netherlands.png b/public/images/emoji/twitter/caribbean_netherlands.png index 7780a4a036..be922b0c12 100644 Binary files a/public/images/emoji/twitter/caribbean_netherlands.png and b/public/images/emoji/twitter/caribbean_netherlands.png differ diff --git a/public/images/emoji/twitter/carousel_horse.png b/public/images/emoji/twitter/carousel_horse.png index 1aeaf5f5b0..41fb66baaa 100644 Binary files a/public/images/emoji/twitter/carousel_horse.png and b/public/images/emoji/twitter/carousel_horse.png differ diff --git a/public/images/emoji/twitter/carrot.png b/public/images/emoji/twitter/carrot.png index 939b6874ea..c6ad9622e9 100644 Binary files a/public/images/emoji/twitter/carrot.png and b/public/images/emoji/twitter/carrot.png differ diff --git a/public/images/emoji/twitter/cat.png b/public/images/emoji/twitter/cat.png index a0bddf1ffe..03782108df 100644 Binary files a/public/images/emoji/twitter/cat.png and b/public/images/emoji/twitter/cat.png differ diff --git a/public/images/emoji/twitter/cat2.png b/public/images/emoji/twitter/cat2.png index 18f100d243..847b24f83e 100644 Binary files a/public/images/emoji/twitter/cat2.png and b/public/images/emoji/twitter/cat2.png differ diff --git a/public/images/emoji/twitter/cayman_islands.png b/public/images/emoji/twitter/cayman_islands.png index 70d8309d8c..158d5899b0 100644 Binary files a/public/images/emoji/twitter/cayman_islands.png and b/public/images/emoji/twitter/cayman_islands.png differ diff --git a/public/images/emoji/twitter/cd.png b/public/images/emoji/twitter/cd.png index d5e151d74f..319a0f68a4 100644 Binary files a/public/images/emoji/twitter/cd.png and b/public/images/emoji/twitter/cd.png differ diff --git a/public/images/emoji/twitter/central_african_republic.png b/public/images/emoji/twitter/central_african_republic.png index a344cb3ae8..2b28051981 100644 Binary files a/public/images/emoji/twitter/central_african_republic.png and b/public/images/emoji/twitter/central_african_republic.png differ diff --git a/public/images/emoji/twitter/ceuta_and_melilla.png b/public/images/emoji/twitter/ceuta_and_melilla.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/twitter/ceuta_and_melilla.png and b/public/images/emoji/twitter/ceuta_and_melilla.png differ diff --git a/public/images/emoji/twitter/chad.png b/public/images/emoji/twitter/chad.png index 26b77c821c..77184f4d06 100644 Binary files a/public/images/emoji/twitter/chad.png and b/public/images/emoji/twitter/chad.png differ diff --git a/public/images/emoji/twitter/chains.png b/public/images/emoji/twitter/chains.png index 610d0e4734..c9ce49bafb 100644 Binary files a/public/images/emoji/twitter/chains.png and b/public/images/emoji/twitter/chains.png differ diff --git a/public/images/emoji/twitter/champagne.png b/public/images/emoji/twitter/champagne.png index 49ea37f389..2342f1bdec 100644 Binary files a/public/images/emoji/twitter/champagne.png and b/public/images/emoji/twitter/champagne.png differ diff --git a/public/images/emoji/twitter/chart.png b/public/images/emoji/twitter/chart.png index f8b5a0b7e6..c83f0d6209 100644 Binary files a/public/images/emoji/twitter/chart.png and b/public/images/emoji/twitter/chart.png differ diff --git a/public/images/emoji/twitter/chart_with_downwards_trend.png b/public/images/emoji/twitter/chart_with_downwards_trend.png index b56cfd1cfb..148382a66a 100644 Binary files a/public/images/emoji/twitter/chart_with_downwards_trend.png and b/public/images/emoji/twitter/chart_with_downwards_trend.png differ diff --git a/public/images/emoji/twitter/chart_with_upwards_trend.png b/public/images/emoji/twitter/chart_with_upwards_trend.png index 8aa20317c8..c287a06ba1 100644 Binary files a/public/images/emoji/twitter/chart_with_upwards_trend.png and b/public/images/emoji/twitter/chart_with_upwards_trend.png differ diff --git a/public/images/emoji/twitter/checkered_flag.png b/public/images/emoji/twitter/checkered_flag.png index d9765d7e9f..30435336d3 100644 Binary files a/public/images/emoji/twitter/checkered_flag.png and b/public/images/emoji/twitter/checkered_flag.png differ diff --git a/public/images/emoji/twitter/cheese.png b/public/images/emoji/twitter/cheese.png index c3a4b402b1..64ad4c6930 100644 Binary files a/public/images/emoji/twitter/cheese.png and b/public/images/emoji/twitter/cheese.png differ diff --git a/public/images/emoji/twitter/cheese_wedge.png b/public/images/emoji/twitter/cheese_wedge.png index c3a4b402b1..64ad4c6930 100644 Binary files a/public/images/emoji/twitter/cheese_wedge.png and b/public/images/emoji/twitter/cheese_wedge.png differ diff --git a/public/images/emoji/twitter/cherries.png b/public/images/emoji/twitter/cherries.png index 52f9b89d91..3625899834 100644 Binary files a/public/images/emoji/twitter/cherries.png and b/public/images/emoji/twitter/cherries.png differ diff --git a/public/images/emoji/twitter/cherry_blossom.png b/public/images/emoji/twitter/cherry_blossom.png index 8c5a8f8c09..3983b94fb2 100644 Binary files a/public/images/emoji/twitter/cherry_blossom.png and b/public/images/emoji/twitter/cherry_blossom.png differ diff --git a/public/images/emoji/twitter/chess_pawn.png b/public/images/emoji/twitter/chess_pawn.png new file mode 100644 index 0000000000..5ec149c62a Binary files /dev/null and b/public/images/emoji/twitter/chess_pawn.png differ diff --git a/public/images/emoji/twitter/chestnut.png b/public/images/emoji/twitter/chestnut.png index 4314004c40..6c2617c8a0 100644 Binary files a/public/images/emoji/twitter/chestnut.png and b/public/images/emoji/twitter/chestnut.png differ diff --git a/public/images/emoji/twitter/chicken.png b/public/images/emoji/twitter/chicken.png index 2299ae10ec..b6cfed1f66 100644 Binary files a/public/images/emoji/twitter/chicken.png and b/public/images/emoji/twitter/chicken.png differ diff --git a/public/images/emoji/twitter/child.png b/public/images/emoji/twitter/child.png index 33e50494a3..f50324d8a6 100644 Binary files a/public/images/emoji/twitter/child.png and b/public/images/emoji/twitter/child.png differ diff --git a/public/images/emoji/twitter/children_crossing.png b/public/images/emoji/twitter/children_crossing.png index 4d50799550..17057333bd 100644 Binary files a/public/images/emoji/twitter/children_crossing.png and b/public/images/emoji/twitter/children_crossing.png differ diff --git a/public/images/emoji/twitter/chile.png b/public/images/emoji/twitter/chile.png index 740d09658e..5aded633e7 100644 Binary files a/public/images/emoji/twitter/chile.png and b/public/images/emoji/twitter/chile.png differ diff --git a/public/images/emoji/twitter/chipmunk.png b/public/images/emoji/twitter/chipmunk.png index e46b2790d6..a80c540c20 100644 Binary files a/public/images/emoji/twitter/chipmunk.png and b/public/images/emoji/twitter/chipmunk.png differ diff --git a/public/images/emoji/twitter/chocolate_bar.png b/public/images/emoji/twitter/chocolate_bar.png index 735209e166..2f7e59bbbd 100644 Binary files a/public/images/emoji/twitter/chocolate_bar.png and b/public/images/emoji/twitter/chocolate_bar.png differ diff --git a/public/images/emoji/twitter/chopsticks.png b/public/images/emoji/twitter/chopsticks.png index 5706420297..8284c128fe 100644 Binary files a/public/images/emoji/twitter/chopsticks.png and b/public/images/emoji/twitter/chopsticks.png differ diff --git a/public/images/emoji/twitter/christmas_island.png b/public/images/emoji/twitter/christmas_island.png index 6958b7d8d8..b6f3608554 100644 Binary files a/public/images/emoji/twitter/christmas_island.png and b/public/images/emoji/twitter/christmas_island.png differ diff --git a/public/images/emoji/twitter/christmas_tree.png b/public/images/emoji/twitter/christmas_tree.png index 4ee6b2fef0..9e3e83a853 100644 Binary files a/public/images/emoji/twitter/christmas_tree.png and b/public/images/emoji/twitter/christmas_tree.png differ diff --git a/public/images/emoji/twitter/church.png b/public/images/emoji/twitter/church.png index 393798e2dc..3d84412bb9 100644 Binary files a/public/images/emoji/twitter/church.png and b/public/images/emoji/twitter/church.png differ diff --git a/public/images/emoji/twitter/cinema.png b/public/images/emoji/twitter/cinema.png index 26a9f3f371..7d22c83f7b 100644 Binary files a/public/images/emoji/twitter/cinema.png and b/public/images/emoji/twitter/cinema.png differ diff --git a/public/images/emoji/twitter/circus_tent.png b/public/images/emoji/twitter/circus_tent.png index 4f04b745a8..685c18bfb0 100644 Binary files a/public/images/emoji/twitter/circus_tent.png and b/public/images/emoji/twitter/circus_tent.png differ diff --git a/public/images/emoji/twitter/city_dusk.png b/public/images/emoji/twitter/city_dusk.png index 17dcd8e49f..768e2d22d9 100644 Binary files a/public/images/emoji/twitter/city_dusk.png and b/public/images/emoji/twitter/city_dusk.png differ diff --git a/public/images/emoji/twitter/city_sunrise.png b/public/images/emoji/twitter/city_sunrise.png index d34ac7ece6..328dbf2305 100644 Binary files a/public/images/emoji/twitter/city_sunrise.png and b/public/images/emoji/twitter/city_sunrise.png differ diff --git a/public/images/emoji/twitter/city_sunset.png b/public/images/emoji/twitter/city_sunset.png index 17dcd8e49f..768e2d22d9 100644 Binary files a/public/images/emoji/twitter/city_sunset.png and b/public/images/emoji/twitter/city_sunset.png differ diff --git a/public/images/emoji/twitter/cityscape.png b/public/images/emoji/twitter/cityscape.png index 24bcea239b..048591245f 100644 Binary files a/public/images/emoji/twitter/cityscape.png and b/public/images/emoji/twitter/cityscape.png differ diff --git a/public/images/emoji/twitter/cl.png b/public/images/emoji/twitter/cl.png index 0420f14e24..d4cb3afc63 100644 Binary files a/public/images/emoji/twitter/cl.png and b/public/images/emoji/twitter/cl.png differ diff --git a/public/images/emoji/twitter/clamp.png b/public/images/emoji/twitter/clamp.png index e17edcfc70..4ab1cd7284 100644 Binary files a/public/images/emoji/twitter/clamp.png and b/public/images/emoji/twitter/clamp.png differ diff --git a/public/images/emoji/twitter/clap.png b/public/images/emoji/twitter/clap.png index c14c8c90d6..e3072fd963 100644 Binary files a/public/images/emoji/twitter/clap.png and b/public/images/emoji/twitter/clap.png differ diff --git a/public/images/emoji/twitter/clapper.png b/public/images/emoji/twitter/clapper.png index e180b0340a..9c901d759d 100644 Binary files a/public/images/emoji/twitter/clapper.png and b/public/images/emoji/twitter/clapper.png differ diff --git a/public/images/emoji/twitter/classical_building.png b/public/images/emoji/twitter/classical_building.png index 00dfbe29d3..08c03b0b87 100644 Binary files a/public/images/emoji/twitter/classical_building.png and b/public/images/emoji/twitter/classical_building.png differ diff --git a/public/images/emoji/twitter/clinking_glasses.png b/public/images/emoji/twitter/clinking_glasses.png index 1b24d16ae0..d44af1b12a 100644 Binary files a/public/images/emoji/twitter/clinking_glasses.png and b/public/images/emoji/twitter/clinking_glasses.png differ diff --git a/public/images/emoji/twitter/clipboard.png b/public/images/emoji/twitter/clipboard.png index b894ad398a..9a2a5559fd 100644 Binary files a/public/images/emoji/twitter/clipboard.png and b/public/images/emoji/twitter/clipboard.png differ diff --git a/public/images/emoji/twitter/clipperton_island.png b/public/images/emoji/twitter/clipperton_island.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/twitter/clipperton_island.png and b/public/images/emoji/twitter/clipperton_island.png differ diff --git a/public/images/emoji/twitter/clock.png b/public/images/emoji/twitter/clock.png index 62a0e89459..d46583a38f 100644 Binary files a/public/images/emoji/twitter/clock.png and b/public/images/emoji/twitter/clock.png differ diff --git a/public/images/emoji/twitter/clock1.png b/public/images/emoji/twitter/clock1.png index 465f188856..4fd13e3d50 100644 Binary files a/public/images/emoji/twitter/clock1.png and b/public/images/emoji/twitter/clock1.png differ diff --git a/public/images/emoji/twitter/clock10.png b/public/images/emoji/twitter/clock10.png index 300f45aec5..25e6dabf0a 100644 Binary files a/public/images/emoji/twitter/clock10.png and b/public/images/emoji/twitter/clock10.png differ diff --git a/public/images/emoji/twitter/clock1030.png b/public/images/emoji/twitter/clock1030.png index 4b643e0215..f8af392f87 100644 Binary files a/public/images/emoji/twitter/clock1030.png and b/public/images/emoji/twitter/clock1030.png differ diff --git a/public/images/emoji/twitter/clock11.png b/public/images/emoji/twitter/clock11.png index e030c67773..51c70f80c8 100644 Binary files a/public/images/emoji/twitter/clock11.png and b/public/images/emoji/twitter/clock11.png differ diff --git a/public/images/emoji/twitter/clock1130.png b/public/images/emoji/twitter/clock1130.png index 3ee235f0f4..c4134e8e5a 100644 Binary files a/public/images/emoji/twitter/clock1130.png and b/public/images/emoji/twitter/clock1130.png differ diff --git a/public/images/emoji/twitter/clock12.png b/public/images/emoji/twitter/clock12.png index 1e2e220d5b..1b20c8aeb4 100644 Binary files a/public/images/emoji/twitter/clock12.png and b/public/images/emoji/twitter/clock12.png differ diff --git a/public/images/emoji/twitter/clock1230.png b/public/images/emoji/twitter/clock1230.png index 1dac51d5b4..9e6bb465ee 100644 Binary files a/public/images/emoji/twitter/clock1230.png and b/public/images/emoji/twitter/clock1230.png differ diff --git a/public/images/emoji/twitter/clock130.png b/public/images/emoji/twitter/clock130.png index 9298daad7a..741b630a75 100644 Binary files a/public/images/emoji/twitter/clock130.png and b/public/images/emoji/twitter/clock130.png differ diff --git a/public/images/emoji/twitter/clock2.png b/public/images/emoji/twitter/clock2.png index 11a1d1881b..14fa3f30f4 100644 Binary files a/public/images/emoji/twitter/clock2.png and b/public/images/emoji/twitter/clock2.png differ diff --git a/public/images/emoji/twitter/clock230.png b/public/images/emoji/twitter/clock230.png index 4418b2023c..58a1af0d56 100644 Binary files a/public/images/emoji/twitter/clock230.png and b/public/images/emoji/twitter/clock230.png differ diff --git a/public/images/emoji/twitter/clock3.png b/public/images/emoji/twitter/clock3.png index 6567c42449..b3f1ea41fa 100644 Binary files a/public/images/emoji/twitter/clock3.png and b/public/images/emoji/twitter/clock3.png differ diff --git a/public/images/emoji/twitter/clock330.png b/public/images/emoji/twitter/clock330.png index 6ed01eaeda..112d5c452c 100644 Binary files a/public/images/emoji/twitter/clock330.png and b/public/images/emoji/twitter/clock330.png differ diff --git a/public/images/emoji/twitter/clock4.png b/public/images/emoji/twitter/clock4.png index 7d50089288..4c6107313b 100644 Binary files a/public/images/emoji/twitter/clock4.png and b/public/images/emoji/twitter/clock4.png differ diff --git a/public/images/emoji/twitter/clock430.png b/public/images/emoji/twitter/clock430.png index 889bb8e6df..14ddea9f30 100644 Binary files a/public/images/emoji/twitter/clock430.png and b/public/images/emoji/twitter/clock430.png differ diff --git a/public/images/emoji/twitter/clock5.png b/public/images/emoji/twitter/clock5.png index 1c457c7366..07c7e8ffc9 100644 Binary files a/public/images/emoji/twitter/clock5.png and b/public/images/emoji/twitter/clock5.png differ diff --git a/public/images/emoji/twitter/clock530.png b/public/images/emoji/twitter/clock530.png index 0149b40ae3..b30c623abd 100644 Binary files a/public/images/emoji/twitter/clock530.png and b/public/images/emoji/twitter/clock530.png differ diff --git a/public/images/emoji/twitter/clock6.png b/public/images/emoji/twitter/clock6.png index 47fed8c8ef..71a04ff4ba 100644 Binary files a/public/images/emoji/twitter/clock6.png and b/public/images/emoji/twitter/clock6.png differ diff --git a/public/images/emoji/twitter/clock630.png b/public/images/emoji/twitter/clock630.png index 1bb3de16c6..2753c64c54 100644 Binary files a/public/images/emoji/twitter/clock630.png and b/public/images/emoji/twitter/clock630.png differ diff --git a/public/images/emoji/twitter/clock7.png b/public/images/emoji/twitter/clock7.png index d3576b6618..72a0b9a48b 100644 Binary files a/public/images/emoji/twitter/clock7.png and b/public/images/emoji/twitter/clock7.png differ diff --git a/public/images/emoji/twitter/clock730.png b/public/images/emoji/twitter/clock730.png index b33c7dfd39..a4e4cb5dbb 100644 Binary files a/public/images/emoji/twitter/clock730.png and b/public/images/emoji/twitter/clock730.png differ diff --git a/public/images/emoji/twitter/clock8.png b/public/images/emoji/twitter/clock8.png index d82dd28a67..bb9753cc8a 100644 Binary files a/public/images/emoji/twitter/clock8.png and b/public/images/emoji/twitter/clock8.png differ diff --git a/public/images/emoji/twitter/clock830.png b/public/images/emoji/twitter/clock830.png index d378dfcdf3..ca7e45feab 100644 Binary files a/public/images/emoji/twitter/clock830.png and b/public/images/emoji/twitter/clock830.png differ diff --git a/public/images/emoji/twitter/clock9.png b/public/images/emoji/twitter/clock9.png index 6f64f11744..70d5adbeee 100644 Binary files a/public/images/emoji/twitter/clock9.png and b/public/images/emoji/twitter/clock9.png differ diff --git a/public/images/emoji/twitter/clock930.png b/public/images/emoji/twitter/clock930.png index 8c64802f32..9c3582dafe 100644 Binary files a/public/images/emoji/twitter/clock930.png and b/public/images/emoji/twitter/clock930.png differ diff --git a/public/images/emoji/twitter/closed_book.png b/public/images/emoji/twitter/closed_book.png index 45f263cce0..3663825d8e 100644 Binary files a/public/images/emoji/twitter/closed_book.png and b/public/images/emoji/twitter/closed_book.png differ diff --git a/public/images/emoji/twitter/closed_lock_with_key.png b/public/images/emoji/twitter/closed_lock_with_key.png index c58128ba3c..c9537b294f 100644 Binary files a/public/images/emoji/twitter/closed_lock_with_key.png and b/public/images/emoji/twitter/closed_lock_with_key.png differ diff --git a/public/images/emoji/twitter/closed_umbrella.png b/public/images/emoji/twitter/closed_umbrella.png index 095c563173..4f92968ee8 100644 Binary files a/public/images/emoji/twitter/closed_umbrella.png and b/public/images/emoji/twitter/closed_umbrella.png differ diff --git a/public/images/emoji/twitter/cloud.png b/public/images/emoji/twitter/cloud.png index ef97171995..6b1fead8ac 100644 Binary files a/public/images/emoji/twitter/cloud.png and b/public/images/emoji/twitter/cloud.png differ diff --git a/public/images/emoji/twitter/cloud_lightning.png b/public/images/emoji/twitter/cloud_lightning.png index f45cd42199..0d6a16b344 100644 Binary files a/public/images/emoji/twitter/cloud_lightning.png and b/public/images/emoji/twitter/cloud_lightning.png differ diff --git a/public/images/emoji/twitter/cloud_rain.png b/public/images/emoji/twitter/cloud_rain.png index ffd91a25b4..950061b359 100644 Binary files a/public/images/emoji/twitter/cloud_rain.png and b/public/images/emoji/twitter/cloud_rain.png differ diff --git a/public/images/emoji/twitter/cloud_snow.png b/public/images/emoji/twitter/cloud_snow.png index 24834e2de3..107a96316d 100644 Binary files a/public/images/emoji/twitter/cloud_snow.png and b/public/images/emoji/twitter/cloud_snow.png differ diff --git a/public/images/emoji/twitter/cloud_tornado.png b/public/images/emoji/twitter/cloud_tornado.png index fd843824ed..63f4e7c05f 100644 Binary files a/public/images/emoji/twitter/cloud_tornado.png and b/public/images/emoji/twitter/cloud_tornado.png differ diff --git a/public/images/emoji/twitter/cloud_with_lightning.png b/public/images/emoji/twitter/cloud_with_lightning.png index f45cd42199..0d6a16b344 100644 Binary files a/public/images/emoji/twitter/cloud_with_lightning.png and b/public/images/emoji/twitter/cloud_with_lightning.png differ diff --git a/public/images/emoji/twitter/cloud_with_lightning_and_rain.png b/public/images/emoji/twitter/cloud_with_lightning_and_rain.png index be44d531a7..699b775ce6 100644 Binary files a/public/images/emoji/twitter/cloud_with_lightning_and_rain.png and b/public/images/emoji/twitter/cloud_with_lightning_and_rain.png differ diff --git a/public/images/emoji/twitter/cloud_with_rain.png b/public/images/emoji/twitter/cloud_with_rain.png index ffd91a25b4..950061b359 100644 Binary files a/public/images/emoji/twitter/cloud_with_rain.png and b/public/images/emoji/twitter/cloud_with_rain.png differ diff --git a/public/images/emoji/twitter/cloud_with_snow.png b/public/images/emoji/twitter/cloud_with_snow.png index 24834e2de3..107a96316d 100644 Binary files a/public/images/emoji/twitter/cloud_with_snow.png and b/public/images/emoji/twitter/cloud_with_snow.png differ diff --git a/public/images/emoji/twitter/cloud_with_tornado.png b/public/images/emoji/twitter/cloud_with_tornado.png index fd843824ed..63f4e7c05f 100644 Binary files a/public/images/emoji/twitter/cloud_with_tornado.png and b/public/images/emoji/twitter/cloud_with_tornado.png differ diff --git a/public/images/emoji/twitter/clown_face.png b/public/images/emoji/twitter/clown_face.png index c78134fdee..befcd928f3 100644 Binary files a/public/images/emoji/twitter/clown_face.png and b/public/images/emoji/twitter/clown_face.png differ diff --git a/public/images/emoji/twitter/clubs.png b/public/images/emoji/twitter/clubs.png index 410881d4b8..30ce513618 100644 Binary files a/public/images/emoji/twitter/clubs.png and b/public/images/emoji/twitter/clubs.png differ diff --git a/public/images/emoji/twitter/cn.png b/public/images/emoji/twitter/cn.png index 67efed2e4d..1543a73051 100644 Binary files a/public/images/emoji/twitter/cn.png and b/public/images/emoji/twitter/cn.png differ diff --git a/public/images/emoji/twitter/coat.png b/public/images/emoji/twitter/coat.png index c409f9f4c4..22d04aef56 100644 Binary files a/public/images/emoji/twitter/coat.png and b/public/images/emoji/twitter/coat.png differ diff --git a/public/images/emoji/twitter/cocktail.png b/public/images/emoji/twitter/cocktail.png index fab0609689..d6e4c8da5f 100644 Binary files a/public/images/emoji/twitter/cocktail.png and b/public/images/emoji/twitter/cocktail.png differ diff --git a/public/images/emoji/twitter/coconut.png b/public/images/emoji/twitter/coconut.png index e76b533149..aef109db3c 100644 Binary files a/public/images/emoji/twitter/coconut.png and b/public/images/emoji/twitter/coconut.png differ diff --git a/public/images/emoji/twitter/cocos_islands.png b/public/images/emoji/twitter/cocos_islands.png index c9025e34e4..02f32975b9 100644 Binary files a/public/images/emoji/twitter/cocos_islands.png and b/public/images/emoji/twitter/cocos_islands.png differ diff --git a/public/images/emoji/twitter/coffee.png b/public/images/emoji/twitter/coffee.png index fbea94471b..5ce8931e1d 100644 Binary files a/public/images/emoji/twitter/coffee.png and b/public/images/emoji/twitter/coffee.png differ diff --git a/public/images/emoji/twitter/coffin.png b/public/images/emoji/twitter/coffin.png index cbf6ba5696..b42a888f50 100644 Binary files a/public/images/emoji/twitter/coffin.png and b/public/images/emoji/twitter/coffin.png differ diff --git a/public/images/emoji/twitter/cold_face.png b/public/images/emoji/twitter/cold_face.png new file mode 100644 index 0000000000..6d14820c56 Binary files /dev/null and b/public/images/emoji/twitter/cold_face.png differ diff --git a/public/images/emoji/twitter/cold_sweat.png b/public/images/emoji/twitter/cold_sweat.png index 3c022b9795..248ec17673 100644 Binary files a/public/images/emoji/twitter/cold_sweat.png and b/public/images/emoji/twitter/cold_sweat.png differ diff --git a/public/images/emoji/twitter/colombia.png b/public/images/emoji/twitter/colombia.png index 680f77b22d..0d2cf35564 100644 Binary files a/public/images/emoji/twitter/colombia.png and b/public/images/emoji/twitter/colombia.png differ diff --git a/public/images/emoji/twitter/comet.png b/public/images/emoji/twitter/comet.png index fceafe31e0..d32ec68d58 100644 Binary files a/public/images/emoji/twitter/comet.png and b/public/images/emoji/twitter/comet.png differ diff --git a/public/images/emoji/twitter/comoros.png b/public/images/emoji/twitter/comoros.png index e765f50715..43af8492c8 100644 Binary files a/public/images/emoji/twitter/comoros.png and b/public/images/emoji/twitter/comoros.png differ diff --git a/public/images/emoji/twitter/compass.png b/public/images/emoji/twitter/compass.png new file mode 100644 index 0000000000..ff199d4822 Binary files /dev/null and b/public/images/emoji/twitter/compass.png differ diff --git a/public/images/emoji/twitter/compression.png b/public/images/emoji/twitter/compression.png index e17edcfc70..4ab1cd7284 100644 Binary files a/public/images/emoji/twitter/compression.png and b/public/images/emoji/twitter/compression.png differ diff --git a/public/images/emoji/twitter/computer.png b/public/images/emoji/twitter/computer.png index 02fbfa6e36..fd5fec59d8 100644 Binary files a/public/images/emoji/twitter/computer.png and b/public/images/emoji/twitter/computer.png differ diff --git a/public/images/emoji/twitter/computer_mouse.png b/public/images/emoji/twitter/computer_mouse.png index 3a71c800c6..a8c2b82f50 100644 Binary files a/public/images/emoji/twitter/computer_mouse.png and b/public/images/emoji/twitter/computer_mouse.png differ diff --git a/public/images/emoji/twitter/confetti_ball.png b/public/images/emoji/twitter/confetti_ball.png index 44528c70ac..f604d32fa2 100644 Binary files a/public/images/emoji/twitter/confetti_ball.png and b/public/images/emoji/twitter/confetti_ball.png differ diff --git a/public/images/emoji/twitter/confounded.png b/public/images/emoji/twitter/confounded.png index f208507008..abe3afe512 100644 Binary files a/public/images/emoji/twitter/confounded.png and b/public/images/emoji/twitter/confounded.png differ diff --git a/public/images/emoji/twitter/confused.png b/public/images/emoji/twitter/confused.png index 5b439d34ff..02cd1fe2d3 100644 Binary files a/public/images/emoji/twitter/confused.png and b/public/images/emoji/twitter/confused.png differ diff --git a/public/images/emoji/twitter/congo_brazzaville.png b/public/images/emoji/twitter/congo_brazzaville.png index 2eef1d6c17..113face155 100644 Binary files a/public/images/emoji/twitter/congo_brazzaville.png and b/public/images/emoji/twitter/congo_brazzaville.png differ diff --git a/public/images/emoji/twitter/congo_kinshasa.png b/public/images/emoji/twitter/congo_kinshasa.png index a34af9d64a..f0855b2738 100644 Binary files a/public/images/emoji/twitter/congo_kinshasa.png and b/public/images/emoji/twitter/congo_kinshasa.png differ diff --git a/public/images/emoji/twitter/congratulations.png b/public/images/emoji/twitter/congratulations.png index 27bc1589ee..ac83914e0a 100644 Binary files a/public/images/emoji/twitter/congratulations.png and b/public/images/emoji/twitter/congratulations.png differ diff --git a/public/images/emoji/twitter/construction.png b/public/images/emoji/twitter/construction.png index fe724686b4..b4e63faff1 100644 Binary files a/public/images/emoji/twitter/construction.png and b/public/images/emoji/twitter/construction.png differ diff --git a/public/images/emoji/twitter/construction_site.png b/public/images/emoji/twitter/construction_site.png index 24cdec2e5f..0c6e9dffe5 100644 Binary files a/public/images/emoji/twitter/construction_site.png and b/public/images/emoji/twitter/construction_site.png differ diff --git a/public/images/emoji/twitter/construction_worker.png b/public/images/emoji/twitter/construction_worker.png index 32c0607d30..aaff2ecfe5 100644 Binary files a/public/images/emoji/twitter/construction_worker.png and b/public/images/emoji/twitter/construction_worker.png differ diff --git a/public/images/emoji/twitter/construction_worker_man.png b/public/images/emoji/twitter/construction_worker_man.png index 32c0607d30..aaff2ecfe5 100644 Binary files a/public/images/emoji/twitter/construction_worker_man.png and b/public/images/emoji/twitter/construction_worker_man.png differ diff --git a/public/images/emoji/twitter/construction_worker_woman.png b/public/images/emoji/twitter/construction_worker_woman.png index 7963262606..be6734afed 100644 Binary files a/public/images/emoji/twitter/construction_worker_woman.png and b/public/images/emoji/twitter/construction_worker_woman.png differ diff --git a/public/images/emoji/twitter/control_knobs.png b/public/images/emoji/twitter/control_knobs.png index 471e812ed3..8997c21b9d 100644 Binary files a/public/images/emoji/twitter/control_knobs.png and b/public/images/emoji/twitter/control_knobs.png differ diff --git a/public/images/emoji/twitter/convenience_store.png b/public/images/emoji/twitter/convenience_store.png index faccc26b0c..bb84d3e665 100644 Binary files a/public/images/emoji/twitter/convenience_store.png and b/public/images/emoji/twitter/convenience_store.png differ diff --git a/public/images/emoji/twitter/cook_islands.png b/public/images/emoji/twitter/cook_islands.png index d1e4afbaca..c021ccda23 100644 Binary files a/public/images/emoji/twitter/cook_islands.png and b/public/images/emoji/twitter/cook_islands.png differ diff --git a/public/images/emoji/twitter/cookie.png b/public/images/emoji/twitter/cookie.png index eb681f03e3..2eab609276 100644 Binary files a/public/images/emoji/twitter/cookie.png and b/public/images/emoji/twitter/cookie.png differ diff --git a/public/images/emoji/twitter/cool.png b/public/images/emoji/twitter/cool.png index cdd509982d..e1b49863d0 100644 Binary files a/public/images/emoji/twitter/cool.png and b/public/images/emoji/twitter/cool.png differ diff --git a/public/images/emoji/twitter/cop.png b/public/images/emoji/twitter/cop.png index fe7b77444a..d93f63a287 100644 Binary files a/public/images/emoji/twitter/cop.png and b/public/images/emoji/twitter/cop.png differ diff --git a/public/images/emoji/twitter/copyright.png b/public/images/emoji/twitter/copyright.png index de88dfc0ff..066c93a068 100644 Binary files a/public/images/emoji/twitter/copyright.png and b/public/images/emoji/twitter/copyright.png differ diff --git a/public/images/emoji/twitter/corn.png b/public/images/emoji/twitter/corn.png index 0bb05b4c1b..5f1d62b10a 100644 Binary files a/public/images/emoji/twitter/corn.png and b/public/images/emoji/twitter/corn.png differ diff --git a/public/images/emoji/twitter/costa_rica.png b/public/images/emoji/twitter/costa_rica.png index e6c16e4ea0..9a7cc50ed5 100644 Binary files a/public/images/emoji/twitter/costa_rica.png and b/public/images/emoji/twitter/costa_rica.png differ diff --git a/public/images/emoji/twitter/cote_divoire.png b/public/images/emoji/twitter/cote_divoire.png index c8e9c1eace..e18e0bb120 100644 Binary files a/public/images/emoji/twitter/cote_divoire.png and b/public/images/emoji/twitter/cote_divoire.png differ diff --git a/public/images/emoji/twitter/couch.png b/public/images/emoji/twitter/couch.png index e46d4de859..61af83620c 100644 Binary files a/public/images/emoji/twitter/couch.png and b/public/images/emoji/twitter/couch.png differ diff --git a/public/images/emoji/twitter/couch_and_lamp.png b/public/images/emoji/twitter/couch_and_lamp.png index e46d4de859..61af83620c 100644 Binary files a/public/images/emoji/twitter/couch_and_lamp.png and b/public/images/emoji/twitter/couch_and_lamp.png differ diff --git a/public/images/emoji/twitter/couple.png b/public/images/emoji/twitter/couple.png index c17e182f54..b1d47fb991 100644 Binary files a/public/images/emoji/twitter/couple.png and b/public/images/emoji/twitter/couple.png differ diff --git a/public/images/emoji/twitter/couple_with_heart.png b/public/images/emoji/twitter/couple_with_heart.png index 98680b826f..a4eda5d2b9 100644 Binary files a/public/images/emoji/twitter/couple_with_heart.png and b/public/images/emoji/twitter/couple_with_heart.png differ diff --git a/public/images/emoji/twitter/couple_with_heart_man_man.png b/public/images/emoji/twitter/couple_with_heart_man_man.png index 56d8afc89a..3748948536 100644 Binary files a/public/images/emoji/twitter/couple_with_heart_man_man.png and b/public/images/emoji/twitter/couple_with_heart_man_man.png differ diff --git a/public/images/emoji/twitter/couple_with_heart_woman_man.png b/public/images/emoji/twitter/couple_with_heart_woman_man.png index 98680b826f..a4eda5d2b9 100644 Binary files a/public/images/emoji/twitter/couple_with_heart_woman_man.png and b/public/images/emoji/twitter/couple_with_heart_woman_man.png differ diff --git a/public/images/emoji/twitter/couple_with_heart_woman_woman.png b/public/images/emoji/twitter/couple_with_heart_woman_woman.png index 8381dc5b8e..f5187c966d 100644 Binary files a/public/images/emoji/twitter/couple_with_heart_woman_woman.png and b/public/images/emoji/twitter/couple_with_heart_woman_woman.png differ diff --git a/public/images/emoji/twitter/couplekiss.png b/public/images/emoji/twitter/couplekiss.png index 576b77fc17..6a16ae39d1 100644 Binary files a/public/images/emoji/twitter/couplekiss.png and b/public/images/emoji/twitter/couplekiss.png differ diff --git a/public/images/emoji/twitter/couplekiss_man_man.png b/public/images/emoji/twitter/couplekiss_man_man.png index 2de6d98e2f..f503d82991 100644 Binary files a/public/images/emoji/twitter/couplekiss_man_man.png and b/public/images/emoji/twitter/couplekiss_man_man.png differ diff --git a/public/images/emoji/twitter/couplekiss_man_woman.png b/public/images/emoji/twitter/couplekiss_man_woman.png index 576b77fc17..6a16ae39d1 100644 Binary files a/public/images/emoji/twitter/couplekiss_man_woman.png and b/public/images/emoji/twitter/couplekiss_man_woman.png differ diff --git a/public/images/emoji/twitter/couplekiss_woman_woman.png b/public/images/emoji/twitter/couplekiss_woman_woman.png index f238608d9a..5973df0c97 100644 Binary files a/public/images/emoji/twitter/couplekiss_woman_woman.png and b/public/images/emoji/twitter/couplekiss_woman_woman.png differ diff --git a/public/images/emoji/twitter/cow.png b/public/images/emoji/twitter/cow.png index 23a2ba41a1..c872a5fe67 100644 Binary files a/public/images/emoji/twitter/cow.png and b/public/images/emoji/twitter/cow.png differ diff --git a/public/images/emoji/twitter/cow2.png b/public/images/emoji/twitter/cow2.png index e98639283c..6546ebc7bd 100644 Binary files a/public/images/emoji/twitter/cow2.png and b/public/images/emoji/twitter/cow2.png differ diff --git a/public/images/emoji/twitter/cowboy_hat_face.png b/public/images/emoji/twitter/cowboy_hat_face.png index efe2c6fcd1..179af9fc12 100644 Binary files a/public/images/emoji/twitter/cowboy_hat_face.png and b/public/images/emoji/twitter/cowboy_hat_face.png differ diff --git a/public/images/emoji/twitter/crab.png b/public/images/emoji/twitter/crab.png index 549988455d..915354ca2f 100644 Binary files a/public/images/emoji/twitter/crab.png and b/public/images/emoji/twitter/crab.png differ diff --git a/public/images/emoji/twitter/crayon.png b/public/images/emoji/twitter/crayon.png index 0ad5b02c2d..ffa2e36762 100644 Binary files a/public/images/emoji/twitter/crayon.png and b/public/images/emoji/twitter/crayon.png differ diff --git a/public/images/emoji/twitter/crazy_face.png b/public/images/emoji/twitter/crazy_face.png index 0aaa1cf765..6b99ce4e08 100644 Binary files a/public/images/emoji/twitter/crazy_face.png and b/public/images/emoji/twitter/crazy_face.png differ diff --git a/public/images/emoji/twitter/credit_card.png b/public/images/emoji/twitter/credit_card.png index 3a53503d63..68ad38d02e 100644 Binary files a/public/images/emoji/twitter/credit_card.png and b/public/images/emoji/twitter/credit_card.png differ diff --git a/public/images/emoji/twitter/crescent_moon.png b/public/images/emoji/twitter/crescent_moon.png index 5462ab485e..01900bea79 100644 Binary files a/public/images/emoji/twitter/crescent_moon.png and b/public/images/emoji/twitter/crescent_moon.png differ diff --git a/public/images/emoji/twitter/cricket.png b/public/images/emoji/twitter/cricket.png index 1e3c9dfa38..125aaad783 100644 Binary files a/public/images/emoji/twitter/cricket.png and b/public/images/emoji/twitter/cricket.png differ diff --git a/public/images/emoji/twitter/cricket_bat_and_ball.png b/public/images/emoji/twitter/cricket_bat_and_ball.png index 8a0bf65a6c..5df1bb8c55 100644 Binary files a/public/images/emoji/twitter/cricket_bat_and_ball.png and b/public/images/emoji/twitter/cricket_bat_and_ball.png differ diff --git a/public/images/emoji/twitter/cricket_bat_ball.png b/public/images/emoji/twitter/cricket_bat_ball.png index 8a0bf65a6c..5df1bb8c55 100644 Binary files a/public/images/emoji/twitter/cricket_bat_ball.png and b/public/images/emoji/twitter/cricket_bat_ball.png differ diff --git a/public/images/emoji/twitter/croatia.png b/public/images/emoji/twitter/croatia.png index 6cc9a0e748..8f772364df 100644 Binary files a/public/images/emoji/twitter/croatia.png and b/public/images/emoji/twitter/croatia.png differ diff --git a/public/images/emoji/twitter/crocodile.png b/public/images/emoji/twitter/crocodile.png index e8a07ebbff..18d00e41dc 100644 Binary files a/public/images/emoji/twitter/crocodile.png and b/public/images/emoji/twitter/crocodile.png differ diff --git a/public/images/emoji/twitter/croissant.png b/public/images/emoji/twitter/croissant.png index c2cea2221f..6c9dc59ec5 100644 Binary files a/public/images/emoji/twitter/croissant.png and b/public/images/emoji/twitter/croissant.png differ diff --git a/public/images/emoji/twitter/cross.png b/public/images/emoji/twitter/cross.png index f11e296dd9..ddb604a4b7 100644 Binary files a/public/images/emoji/twitter/cross.png and b/public/images/emoji/twitter/cross.png differ diff --git a/public/images/emoji/twitter/crossed_fingers.png b/public/images/emoji/twitter/crossed_fingers.png index 9ba3b1ff09..89f42b06c0 100644 Binary files a/public/images/emoji/twitter/crossed_fingers.png and b/public/images/emoji/twitter/crossed_fingers.png differ diff --git a/public/images/emoji/twitter/crossed_flags.png b/public/images/emoji/twitter/crossed_flags.png index 07b18f7659..e65ed9a0f6 100644 Binary files a/public/images/emoji/twitter/crossed_flags.png and b/public/images/emoji/twitter/crossed_flags.png differ diff --git a/public/images/emoji/twitter/crossed_swords.png b/public/images/emoji/twitter/crossed_swords.png index ec1da04367..f443239ea4 100644 Binary files a/public/images/emoji/twitter/crossed_swords.png and b/public/images/emoji/twitter/crossed_swords.png differ diff --git a/public/images/emoji/twitter/crown.png b/public/images/emoji/twitter/crown.png index 6e7c89586e..28425ae489 100644 Binary files a/public/images/emoji/twitter/crown.png and b/public/images/emoji/twitter/crown.png differ diff --git a/public/images/emoji/twitter/cruise_ship.png b/public/images/emoji/twitter/cruise_ship.png index b1ee561346..de29c2e98b 100644 Binary files a/public/images/emoji/twitter/cruise_ship.png and b/public/images/emoji/twitter/cruise_ship.png differ diff --git a/public/images/emoji/twitter/cry.png b/public/images/emoji/twitter/cry.png index 7202e049e1..3eeed6b16a 100644 Binary files a/public/images/emoji/twitter/cry.png and b/public/images/emoji/twitter/cry.png differ diff --git a/public/images/emoji/twitter/crying_cat_face.png b/public/images/emoji/twitter/crying_cat_face.png index c262ae3288..7906eee0a6 100644 Binary files a/public/images/emoji/twitter/crying_cat_face.png and b/public/images/emoji/twitter/crying_cat_face.png differ diff --git a/public/images/emoji/twitter/crystal_ball.png b/public/images/emoji/twitter/crystal_ball.png index 131a6971b5..7e42658581 100644 Binary files a/public/images/emoji/twitter/crystal_ball.png and b/public/images/emoji/twitter/crystal_ball.png differ diff --git a/public/images/emoji/twitter/cuba.png b/public/images/emoji/twitter/cuba.png index 4436dee31e..88170e96bf 100644 Binary files a/public/images/emoji/twitter/cuba.png and b/public/images/emoji/twitter/cuba.png differ diff --git a/public/images/emoji/twitter/cucumber.png b/public/images/emoji/twitter/cucumber.png index 392fdddcc1..55a71b1666 100644 Binary files a/public/images/emoji/twitter/cucumber.png and b/public/images/emoji/twitter/cucumber.png differ diff --git a/public/images/emoji/twitter/cup_with_straw.png b/public/images/emoji/twitter/cup_with_straw.png index 4b2f313f9b..230ddbffb0 100644 Binary files a/public/images/emoji/twitter/cup_with_straw.png and b/public/images/emoji/twitter/cup_with_straw.png differ diff --git a/public/images/emoji/twitter/cupcake.png b/public/images/emoji/twitter/cupcake.png new file mode 100644 index 0000000000..68d3be724f Binary files /dev/null and b/public/images/emoji/twitter/cupcake.png differ diff --git a/public/images/emoji/twitter/cupid.png b/public/images/emoji/twitter/cupid.png index 0e44661a91..ba4dbcadc8 100644 Binary files a/public/images/emoji/twitter/cupid.png and b/public/images/emoji/twitter/cupid.png differ diff --git a/public/images/emoji/twitter/curacao.png b/public/images/emoji/twitter/curacao.png index e29bde1f8b..5ea30eb8db 100644 Binary files a/public/images/emoji/twitter/curacao.png and b/public/images/emoji/twitter/curacao.png differ diff --git a/public/images/emoji/twitter/curling_stone.png b/public/images/emoji/twitter/curling_stone.png index 09027a2fb2..65228c2db8 100644 Binary files a/public/images/emoji/twitter/curling_stone.png and b/public/images/emoji/twitter/curling_stone.png differ diff --git a/public/images/emoji/twitter/curly_loop.png b/public/images/emoji/twitter/curly_loop.png index 2ce37d4618..2ff202212b 100644 Binary files a/public/images/emoji/twitter/curly_loop.png and b/public/images/emoji/twitter/curly_loop.png differ diff --git a/public/images/emoji/twitter/currency_exchange.png b/public/images/emoji/twitter/currency_exchange.png index 713615ce17..875cb793e1 100644 Binary files a/public/images/emoji/twitter/currency_exchange.png and b/public/images/emoji/twitter/currency_exchange.png differ diff --git a/public/images/emoji/twitter/curry.png b/public/images/emoji/twitter/curry.png index e9e2879731..0826dca835 100644 Binary files a/public/images/emoji/twitter/curry.png and b/public/images/emoji/twitter/curry.png differ diff --git a/public/images/emoji/twitter/custard.png b/public/images/emoji/twitter/custard.png index 7e0d040771..ce9b0ff7ab 100644 Binary files a/public/images/emoji/twitter/custard.png and b/public/images/emoji/twitter/custard.png differ diff --git a/public/images/emoji/twitter/customs.png b/public/images/emoji/twitter/customs.png index bd95e5d1c0..b065c8d0da 100644 Binary files a/public/images/emoji/twitter/customs.png and b/public/images/emoji/twitter/customs.png differ diff --git a/public/images/emoji/twitter/cut_of_meat.png b/public/images/emoji/twitter/cut_of_meat.png index b66d427e09..5eab364621 100644 Binary files a/public/images/emoji/twitter/cut_of_meat.png and b/public/images/emoji/twitter/cut_of_meat.png differ diff --git a/public/images/emoji/twitter/cyclone.png b/public/images/emoji/twitter/cyclone.png index 06bd2c2d0a..12726261ee 100644 Binary files a/public/images/emoji/twitter/cyclone.png and b/public/images/emoji/twitter/cyclone.png differ diff --git a/public/images/emoji/twitter/cyprus.png b/public/images/emoji/twitter/cyprus.png index 7f80f4ed57..5c333b0781 100644 Binary files a/public/images/emoji/twitter/cyprus.png and b/public/images/emoji/twitter/cyprus.png differ diff --git a/public/images/emoji/twitter/czech_republic.png b/public/images/emoji/twitter/czech_republic.png index 88558e4ab2..6bf97ba35d 100644 Binary files a/public/images/emoji/twitter/czech_republic.png and b/public/images/emoji/twitter/czech_republic.png differ diff --git a/public/images/emoji/twitter/dagger.png b/public/images/emoji/twitter/dagger.png index 8e56922aa6..885830c6eb 100644 Binary files a/public/images/emoji/twitter/dagger.png and b/public/images/emoji/twitter/dagger.png differ diff --git a/public/images/emoji/twitter/dagger_knife.png b/public/images/emoji/twitter/dagger_knife.png index 8e56922aa6..885830c6eb 100644 Binary files a/public/images/emoji/twitter/dagger_knife.png and b/public/images/emoji/twitter/dagger_knife.png differ diff --git a/public/images/emoji/twitter/dancer.png b/public/images/emoji/twitter/dancer.png index 78122daaa5..0828824a0f 100644 Binary files a/public/images/emoji/twitter/dancer.png and b/public/images/emoji/twitter/dancer.png differ diff --git a/public/images/emoji/twitter/dancers.png b/public/images/emoji/twitter/dancers.png index f972cc2a77..4145fc296f 100644 Binary files a/public/images/emoji/twitter/dancers.png and b/public/images/emoji/twitter/dancers.png differ diff --git a/public/images/emoji/twitter/dancing_men.png b/public/images/emoji/twitter/dancing_men.png index dec9fb054b..d3ebff5fa8 100644 Binary files a/public/images/emoji/twitter/dancing_men.png and b/public/images/emoji/twitter/dancing_men.png differ diff --git a/public/images/emoji/twitter/dancing_women.png b/public/images/emoji/twitter/dancing_women.png index f972cc2a77..4145fc296f 100644 Binary files a/public/images/emoji/twitter/dancing_women.png and b/public/images/emoji/twitter/dancing_women.png differ diff --git a/public/images/emoji/twitter/dango.png b/public/images/emoji/twitter/dango.png index ab78084560..386542bdb1 100644 Binary files a/public/images/emoji/twitter/dango.png and b/public/images/emoji/twitter/dango.png differ diff --git a/public/images/emoji/twitter/dark_sunglasses.png b/public/images/emoji/twitter/dark_sunglasses.png index a4a0514f9c..809f15be30 100644 Binary files a/public/images/emoji/twitter/dark_sunglasses.png and b/public/images/emoji/twitter/dark_sunglasses.png differ diff --git a/public/images/emoji/twitter/dart.png b/public/images/emoji/twitter/dart.png index 80dd960877..604f7c97da 100644 Binary files a/public/images/emoji/twitter/dart.png and b/public/images/emoji/twitter/dart.png differ diff --git a/public/images/emoji/twitter/dash.png b/public/images/emoji/twitter/dash.png index 0c75613aa9..9688e7129d 100644 Binary files a/public/images/emoji/twitter/dash.png and b/public/images/emoji/twitter/dash.png differ diff --git a/public/images/emoji/twitter/date.png b/public/images/emoji/twitter/date.png index 367d67c7ec..37ea0f2391 100644 Binary files a/public/images/emoji/twitter/date.png and b/public/images/emoji/twitter/date.png differ diff --git a/public/images/emoji/twitter/de.png b/public/images/emoji/twitter/de.png index 746bf11011..52b93beeef 100644 Binary files a/public/images/emoji/twitter/de.png and b/public/images/emoji/twitter/de.png differ diff --git a/public/images/emoji/twitter/deciduous_tree.png b/public/images/emoji/twitter/deciduous_tree.png index 4b24d956ce..0d51f232e3 100644 Binary files a/public/images/emoji/twitter/deciduous_tree.png and b/public/images/emoji/twitter/deciduous_tree.png differ diff --git a/public/images/emoji/twitter/deer.png b/public/images/emoji/twitter/deer.png index 92aa546e94..62eee53119 100644 Binary files a/public/images/emoji/twitter/deer.png and b/public/images/emoji/twitter/deer.png differ diff --git a/public/images/emoji/twitter/denmark.png b/public/images/emoji/twitter/denmark.png index 821499e02c..b7c4bed7a1 100644 Binary files a/public/images/emoji/twitter/denmark.png and b/public/images/emoji/twitter/denmark.png differ diff --git a/public/images/emoji/twitter/department_store.png b/public/images/emoji/twitter/department_store.png index 43138883cb..5c94977ebd 100644 Binary files a/public/images/emoji/twitter/department_store.png and b/public/images/emoji/twitter/department_store.png differ diff --git a/public/images/emoji/twitter/derelict_house.png b/public/images/emoji/twitter/derelict_house.png index a48da60494..af42d3c133 100644 Binary files a/public/images/emoji/twitter/derelict_house.png and b/public/images/emoji/twitter/derelict_house.png differ diff --git a/public/images/emoji/twitter/derelict_house_building.png b/public/images/emoji/twitter/derelict_house_building.png index a48da60494..af42d3c133 100644 Binary files a/public/images/emoji/twitter/derelict_house_building.png and b/public/images/emoji/twitter/derelict_house_building.png differ diff --git a/public/images/emoji/twitter/desert.png b/public/images/emoji/twitter/desert.png index 3ec8a867b4..7775db168d 100644 Binary files a/public/images/emoji/twitter/desert.png and b/public/images/emoji/twitter/desert.png differ diff --git a/public/images/emoji/twitter/desert_island.png b/public/images/emoji/twitter/desert_island.png index 2d2e8919ff..c8a6edaab0 100644 Binary files a/public/images/emoji/twitter/desert_island.png and b/public/images/emoji/twitter/desert_island.png differ diff --git a/public/images/emoji/twitter/desktop.png b/public/images/emoji/twitter/desktop.png index 120faa7536..ac11f31e76 100644 Binary files a/public/images/emoji/twitter/desktop.png and b/public/images/emoji/twitter/desktop.png differ diff --git a/public/images/emoji/twitter/desktop_computer.png b/public/images/emoji/twitter/desktop_computer.png index 120faa7536..ac11f31e76 100644 Binary files a/public/images/emoji/twitter/desktop_computer.png and b/public/images/emoji/twitter/desktop_computer.png differ diff --git a/public/images/emoji/twitter/diamond_shape_with_a_dot_inside.png b/public/images/emoji/twitter/diamond_shape_with_a_dot_inside.png index 7e62b15369..3e22818d4a 100644 Binary files a/public/images/emoji/twitter/diamond_shape_with_a_dot_inside.png and b/public/images/emoji/twitter/diamond_shape_with_a_dot_inside.png differ diff --git a/public/images/emoji/twitter/diamonds.png b/public/images/emoji/twitter/diamonds.png index 78d2b4e5da..edf052a2e2 100644 Binary files a/public/images/emoji/twitter/diamonds.png and b/public/images/emoji/twitter/diamonds.png differ diff --git a/public/images/emoji/twitter/diego_garcia.png b/public/images/emoji/twitter/diego_garcia.png index 881e01a927..4a509c935c 100644 Binary files a/public/images/emoji/twitter/diego_garcia.png and b/public/images/emoji/twitter/diego_garcia.png differ diff --git a/public/images/emoji/twitter/disappointed.png b/public/images/emoji/twitter/disappointed.png index 7d0b56d482..ecd00adc52 100644 Binary files a/public/images/emoji/twitter/disappointed.png and b/public/images/emoji/twitter/disappointed.png differ diff --git a/public/images/emoji/twitter/disappointed_relieved.png b/public/images/emoji/twitter/disappointed_relieved.png index c6da502005..c4c4a2a367 100644 Binary files a/public/images/emoji/twitter/disappointed_relieved.png and b/public/images/emoji/twitter/disappointed_relieved.png differ diff --git a/public/images/emoji/twitter/dividers.png b/public/images/emoji/twitter/dividers.png index b1e27091c9..89495773de 100644 Binary files a/public/images/emoji/twitter/dividers.png and b/public/images/emoji/twitter/dividers.png differ diff --git a/public/images/emoji/twitter/dizzy.png b/public/images/emoji/twitter/dizzy.png index 3621508276..87a7b7eab4 100644 Binary files a/public/images/emoji/twitter/dizzy.png and b/public/images/emoji/twitter/dizzy.png differ diff --git a/public/images/emoji/twitter/dizzy_face.png b/public/images/emoji/twitter/dizzy_face.png index 527b0bed24..3db251c49c 100644 Binary files a/public/images/emoji/twitter/dizzy_face.png and b/public/images/emoji/twitter/dizzy_face.png differ diff --git a/public/images/emoji/twitter/djibouti.png b/public/images/emoji/twitter/djibouti.png index 606fe6a1ee..cc3ceca8b8 100644 Binary files a/public/images/emoji/twitter/djibouti.png and b/public/images/emoji/twitter/djibouti.png differ diff --git a/public/images/emoji/twitter/dna.png b/public/images/emoji/twitter/dna.png new file mode 100644 index 0000000000..66efccf23c Binary files /dev/null and b/public/images/emoji/twitter/dna.png differ diff --git a/public/images/emoji/twitter/do_not_litter.png b/public/images/emoji/twitter/do_not_litter.png index 518466b08a..ea8d6db1e6 100644 Binary files a/public/images/emoji/twitter/do_not_litter.png and b/public/images/emoji/twitter/do_not_litter.png differ diff --git a/public/images/emoji/twitter/dog.png b/public/images/emoji/twitter/dog.png index 797c62e8cc..2c77efde7e 100644 Binary files a/public/images/emoji/twitter/dog.png and b/public/images/emoji/twitter/dog.png differ diff --git a/public/images/emoji/twitter/dog2.png b/public/images/emoji/twitter/dog2.png index d922415786..20315ef2d6 100644 Binary files a/public/images/emoji/twitter/dog2.png and b/public/images/emoji/twitter/dog2.png differ diff --git a/public/images/emoji/twitter/dollar.png b/public/images/emoji/twitter/dollar.png index 7cf0fbcf44..d70492dd85 100644 Binary files a/public/images/emoji/twitter/dollar.png and b/public/images/emoji/twitter/dollar.png differ diff --git a/public/images/emoji/twitter/dolls.png b/public/images/emoji/twitter/dolls.png index a69e389862..d026c99989 100644 Binary files a/public/images/emoji/twitter/dolls.png and b/public/images/emoji/twitter/dolls.png differ diff --git a/public/images/emoji/twitter/dolphin.png b/public/images/emoji/twitter/dolphin.png index 1055ea9cbe..664828eef2 100644 Binary files a/public/images/emoji/twitter/dolphin.png and b/public/images/emoji/twitter/dolphin.png differ diff --git a/public/images/emoji/twitter/dominica.png b/public/images/emoji/twitter/dominica.png index 588ece3f43..cfc96bc83a 100644 Binary files a/public/images/emoji/twitter/dominica.png and b/public/images/emoji/twitter/dominica.png differ diff --git a/public/images/emoji/twitter/dominican_republic.png b/public/images/emoji/twitter/dominican_republic.png index de48ff449c..b06ccbafe8 100644 Binary files a/public/images/emoji/twitter/dominican_republic.png and b/public/images/emoji/twitter/dominican_republic.png differ diff --git a/public/images/emoji/twitter/door.png b/public/images/emoji/twitter/door.png index 3c95081698..13847d57bf 100644 Binary files a/public/images/emoji/twitter/door.png and b/public/images/emoji/twitter/door.png differ diff --git a/public/images/emoji/twitter/double_vertical_bar.png b/public/images/emoji/twitter/double_vertical_bar.png index 624e2df711..37897c0f54 100644 Binary files a/public/images/emoji/twitter/double_vertical_bar.png and b/public/images/emoji/twitter/double_vertical_bar.png differ diff --git a/public/images/emoji/twitter/doughnut.png b/public/images/emoji/twitter/doughnut.png index 5c85e0b83c..1275e5998e 100644 Binary files a/public/images/emoji/twitter/doughnut.png and b/public/images/emoji/twitter/doughnut.png differ diff --git a/public/images/emoji/twitter/dove.png b/public/images/emoji/twitter/dove.png index 9fdcff829a..877642ac08 100644 Binary files a/public/images/emoji/twitter/dove.png and b/public/images/emoji/twitter/dove.png differ diff --git a/public/images/emoji/twitter/dove_of_peace.png b/public/images/emoji/twitter/dove_of_peace.png index 9fdcff829a..877642ac08 100644 Binary files a/public/images/emoji/twitter/dove_of_peace.png and b/public/images/emoji/twitter/dove_of_peace.png differ diff --git a/public/images/emoji/twitter/dragon.png b/public/images/emoji/twitter/dragon.png index 951a35d0cb..824e37d940 100644 Binary files a/public/images/emoji/twitter/dragon.png and b/public/images/emoji/twitter/dragon.png differ diff --git a/public/images/emoji/twitter/dragon_face.png b/public/images/emoji/twitter/dragon_face.png index 64acc92aa9..88a42e2fba 100644 Binary files a/public/images/emoji/twitter/dragon_face.png and b/public/images/emoji/twitter/dragon_face.png differ diff --git a/public/images/emoji/twitter/dress.png b/public/images/emoji/twitter/dress.png index 12aea7082a..82ca8778da 100644 Binary files a/public/images/emoji/twitter/dress.png and b/public/images/emoji/twitter/dress.png differ diff --git a/public/images/emoji/twitter/dromedary_camel.png b/public/images/emoji/twitter/dromedary_camel.png index fce8435bb2..4ede95a2aa 100644 Binary files a/public/images/emoji/twitter/dromedary_camel.png and b/public/images/emoji/twitter/dromedary_camel.png differ diff --git a/public/images/emoji/twitter/drooling_face.png b/public/images/emoji/twitter/drooling_face.png index 2ad3f8a41b..47733cd9f2 100644 Binary files a/public/images/emoji/twitter/drooling_face.png and b/public/images/emoji/twitter/drooling_face.png differ diff --git a/public/images/emoji/twitter/droplet.png b/public/images/emoji/twitter/droplet.png index f7d7aeb013..c3398a2d09 100644 Binary files a/public/images/emoji/twitter/droplet.png and b/public/images/emoji/twitter/droplet.png differ diff --git a/public/images/emoji/twitter/drum.png b/public/images/emoji/twitter/drum.png index d0c94c34e4..19c427bdfd 100644 Binary files a/public/images/emoji/twitter/drum.png and b/public/images/emoji/twitter/drum.png differ diff --git a/public/images/emoji/twitter/duck.png b/public/images/emoji/twitter/duck.png index 6adaf8cddb..680d86b946 100644 Binary files a/public/images/emoji/twitter/duck.png and b/public/images/emoji/twitter/duck.png differ diff --git a/public/images/emoji/twitter/dumpling.png b/public/images/emoji/twitter/dumpling.png index 489a779bf6..82136b8ef4 100644 Binary files a/public/images/emoji/twitter/dumpling.png and b/public/images/emoji/twitter/dumpling.png differ diff --git a/public/images/emoji/twitter/dvd.png b/public/images/emoji/twitter/dvd.png index c5823e4d88..29af382987 100644 Binary files a/public/images/emoji/twitter/dvd.png and b/public/images/emoji/twitter/dvd.png differ diff --git a/public/images/emoji/twitter/e-mail.png b/public/images/emoji/twitter/e-mail.png index fcdd33b0d7..90023eb685 100644 Binary files a/public/images/emoji/twitter/e-mail.png and b/public/images/emoji/twitter/e-mail.png differ diff --git a/public/images/emoji/twitter/eagle.png b/public/images/emoji/twitter/eagle.png index c9cce258ae..c8869604fb 100644 Binary files a/public/images/emoji/twitter/eagle.png and b/public/images/emoji/twitter/eagle.png differ diff --git a/public/images/emoji/twitter/ear.png b/public/images/emoji/twitter/ear.png index 06f66ba7c3..25de93aab9 100644 Binary files a/public/images/emoji/twitter/ear.png and b/public/images/emoji/twitter/ear.png differ diff --git a/public/images/emoji/twitter/ear_of_rice.png b/public/images/emoji/twitter/ear_of_rice.png index 0bfd35ba74..5899de351b 100644 Binary files a/public/images/emoji/twitter/ear_of_rice.png and b/public/images/emoji/twitter/ear_of_rice.png differ diff --git a/public/images/emoji/twitter/earth_africa.png b/public/images/emoji/twitter/earth_africa.png index 2a949c2f1b..b5f62c3310 100644 Binary files a/public/images/emoji/twitter/earth_africa.png and b/public/images/emoji/twitter/earth_africa.png differ diff --git a/public/images/emoji/twitter/earth_americas.png b/public/images/emoji/twitter/earth_americas.png index 593af30740..d74ff449d5 100644 Binary files a/public/images/emoji/twitter/earth_americas.png and b/public/images/emoji/twitter/earth_americas.png differ diff --git a/public/images/emoji/twitter/earth_asia.png b/public/images/emoji/twitter/earth_asia.png index b4c2b8e3ac..e960e382f4 100644 Binary files a/public/images/emoji/twitter/earth_asia.png and b/public/images/emoji/twitter/earth_asia.png differ diff --git a/public/images/emoji/twitter/ecuador.png b/public/images/emoji/twitter/ecuador.png index cf86fbaad6..05b0a2ace0 100644 Binary files a/public/images/emoji/twitter/ecuador.png and b/public/images/emoji/twitter/ecuador.png differ diff --git a/public/images/emoji/twitter/egg.png b/public/images/emoji/twitter/egg.png index cec55b549a..8baf3893b3 100644 Binary files a/public/images/emoji/twitter/egg.png and b/public/images/emoji/twitter/egg.png differ diff --git a/public/images/emoji/twitter/eggplant.png b/public/images/emoji/twitter/eggplant.png index e224fee2c1..83f1ffabd3 100644 Binary files a/public/images/emoji/twitter/eggplant.png and b/public/images/emoji/twitter/eggplant.png differ diff --git a/public/images/emoji/twitter/egypt.png b/public/images/emoji/twitter/egypt.png index bbbdefa653..29dfd5bad8 100644 Binary files a/public/images/emoji/twitter/egypt.png and b/public/images/emoji/twitter/egypt.png differ diff --git a/public/images/emoji/twitter/eight.png b/public/images/emoji/twitter/eight.png index 302a381ec0..72864ef1bf 100644 Binary files a/public/images/emoji/twitter/eight.png and b/public/images/emoji/twitter/eight.png differ diff --git a/public/images/emoji/twitter/eight_pointed_black_star.png b/public/images/emoji/twitter/eight_pointed_black_star.png index 20c01bbe1d..f2a50b5063 100644 Binary files a/public/images/emoji/twitter/eight_pointed_black_star.png and b/public/images/emoji/twitter/eight_pointed_black_star.png differ diff --git a/public/images/emoji/twitter/eight_spoked_asterisk.png b/public/images/emoji/twitter/eight_spoked_asterisk.png index d691fd82e3..1f393dae53 100644 Binary files a/public/images/emoji/twitter/eight_spoked_asterisk.png and b/public/images/emoji/twitter/eight_spoked_asterisk.png differ diff --git a/public/images/emoji/twitter/el_salvador.png b/public/images/emoji/twitter/el_salvador.png index 0f24a98369..ad30dcd86f 100644 Binary files a/public/images/emoji/twitter/el_salvador.png and b/public/images/emoji/twitter/el_salvador.png differ diff --git a/public/images/emoji/twitter/electric_plug.png b/public/images/emoji/twitter/electric_plug.png index 160aa73551..75d3193c9a 100644 Binary files a/public/images/emoji/twitter/electric_plug.png and b/public/images/emoji/twitter/electric_plug.png differ diff --git a/public/images/emoji/twitter/elephant.png b/public/images/emoji/twitter/elephant.png index 21aa28aab4..c903120e00 100644 Binary files a/public/images/emoji/twitter/elephant.png and b/public/images/emoji/twitter/elephant.png differ diff --git a/public/images/emoji/twitter/elf.png b/public/images/emoji/twitter/elf.png index f8b6dd873e..79eeb23e9b 100644 Binary files a/public/images/emoji/twitter/elf.png and b/public/images/emoji/twitter/elf.png differ diff --git a/public/images/emoji/twitter/email.png b/public/images/emoji/twitter/email.png index fcdd33b0d7..90023eb685 100644 Binary files a/public/images/emoji/twitter/email.png and b/public/images/emoji/twitter/email.png differ diff --git a/public/images/emoji/twitter/end.png b/public/images/emoji/twitter/end.png index 6becf76bb1..8beee82130 100644 Binary files a/public/images/emoji/twitter/end.png and b/public/images/emoji/twitter/end.png differ diff --git a/public/images/emoji/twitter/envelope.png b/public/images/emoji/twitter/envelope.png index fcdd33b0d7..90023eb685 100644 Binary files a/public/images/emoji/twitter/envelope.png and b/public/images/emoji/twitter/envelope.png differ diff --git a/public/images/emoji/twitter/envelope_with_arrow.png b/public/images/emoji/twitter/envelope_with_arrow.png index 2c4b6cc895..fcc82875c2 100644 Binary files a/public/images/emoji/twitter/envelope_with_arrow.png and b/public/images/emoji/twitter/envelope_with_arrow.png differ diff --git a/public/images/emoji/twitter/equatorial_guinea.png b/public/images/emoji/twitter/equatorial_guinea.png index 38e992318c..02b7aec5fd 100644 Binary files a/public/images/emoji/twitter/equatorial_guinea.png and b/public/images/emoji/twitter/equatorial_guinea.png differ diff --git a/public/images/emoji/twitter/eritrea.png b/public/images/emoji/twitter/eritrea.png index 630fd66415..dea7458475 100644 Binary files a/public/images/emoji/twitter/eritrea.png and b/public/images/emoji/twitter/eritrea.png differ diff --git a/public/images/emoji/twitter/es.png b/public/images/emoji/twitter/es.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/twitter/es.png and b/public/images/emoji/twitter/es.png differ diff --git a/public/images/emoji/twitter/estonia.png b/public/images/emoji/twitter/estonia.png index 2553a5dbf7..94d8d46443 100644 Binary files a/public/images/emoji/twitter/estonia.png and b/public/images/emoji/twitter/estonia.png differ diff --git a/public/images/emoji/twitter/ethiopia.png b/public/images/emoji/twitter/ethiopia.png index d0d78350cd..4f4e7fc249 100644 Binary files a/public/images/emoji/twitter/ethiopia.png and b/public/images/emoji/twitter/ethiopia.png differ diff --git a/public/images/emoji/twitter/eu.png b/public/images/emoji/twitter/eu.png index 938b488ddb..4f0b5d7f4f 100644 Binary files a/public/images/emoji/twitter/eu.png and b/public/images/emoji/twitter/eu.png differ diff --git a/public/images/emoji/twitter/euro.png b/public/images/emoji/twitter/euro.png index 6178f2182e..2d2e4d3267 100644 Binary files a/public/images/emoji/twitter/euro.png and b/public/images/emoji/twitter/euro.png differ diff --git a/public/images/emoji/twitter/european_castle.png b/public/images/emoji/twitter/european_castle.png index 8ccf21a04a..a1223721b6 100644 Binary files a/public/images/emoji/twitter/european_castle.png and b/public/images/emoji/twitter/european_castle.png differ diff --git a/public/images/emoji/twitter/european_post_office.png b/public/images/emoji/twitter/european_post_office.png index 3d68524b8c..a8c456e818 100644 Binary files a/public/images/emoji/twitter/european_post_office.png and b/public/images/emoji/twitter/european_post_office.png differ diff --git a/public/images/emoji/twitter/evergreen_tree.png b/public/images/emoji/twitter/evergreen_tree.png index a719428f35..3266497509 100644 Binary files a/public/images/emoji/twitter/evergreen_tree.png and b/public/images/emoji/twitter/evergreen_tree.png differ diff --git a/public/images/emoji/twitter/exclamation.png b/public/images/emoji/twitter/exclamation.png index 05ec6365eb..9c48a72739 100644 Binary files a/public/images/emoji/twitter/exclamation.png and b/public/images/emoji/twitter/exclamation.png differ diff --git a/public/images/emoji/twitter/exploding_head.png b/public/images/emoji/twitter/exploding_head.png index 85532dadc7..f7eaf580ba 100644 Binary files a/public/images/emoji/twitter/exploding_head.png and b/public/images/emoji/twitter/exploding_head.png differ diff --git a/public/images/emoji/twitter/expressionless.png b/public/images/emoji/twitter/expressionless.png index a388cb4b18..fda6326aff 100644 Binary files a/public/images/emoji/twitter/expressionless.png and b/public/images/emoji/twitter/expressionless.png differ diff --git a/public/images/emoji/twitter/eye.png b/public/images/emoji/twitter/eye.png index 5c77590cb2..fbf41effe2 100644 Binary files a/public/images/emoji/twitter/eye.png and b/public/images/emoji/twitter/eye.png differ diff --git a/public/images/emoji/twitter/eyeglasses.png b/public/images/emoji/twitter/eyeglasses.png index 265ff3dde2..595667fa6d 100644 Binary files a/public/images/emoji/twitter/eyeglasses.png and b/public/images/emoji/twitter/eyeglasses.png differ diff --git a/public/images/emoji/twitter/eyes.png b/public/images/emoji/twitter/eyes.png index 9f7ea04906..a2d54daedf 100644 Binary files a/public/images/emoji/twitter/eyes.png and b/public/images/emoji/twitter/eyes.png differ diff --git a/public/images/emoji/twitter/face_vomiting.png b/public/images/emoji/twitter/face_vomiting.png index cd7c3d1f2b..40eae56836 100644 Binary files a/public/images/emoji/twitter/face_vomiting.png and b/public/images/emoji/twitter/face_vomiting.png differ diff --git a/public/images/emoji/twitter/face_with_hand_over_mouth.png b/public/images/emoji/twitter/face_with_hand_over_mouth.png index aed8f62e0b..3aa3b67de2 100644 Binary files a/public/images/emoji/twitter/face_with_hand_over_mouth.png and b/public/images/emoji/twitter/face_with_hand_over_mouth.png differ diff --git a/public/images/emoji/twitter/face_with_head_bandage.png b/public/images/emoji/twitter/face_with_head_bandage.png index 97bec4d11f..7b5422bb4a 100644 Binary files a/public/images/emoji/twitter/face_with_head_bandage.png and b/public/images/emoji/twitter/face_with_head_bandage.png differ diff --git a/public/images/emoji/twitter/face_with_monocle.png b/public/images/emoji/twitter/face_with_monocle.png index c6fbb4481d..33b85f47a0 100644 Binary files a/public/images/emoji/twitter/face_with_monocle.png and b/public/images/emoji/twitter/face_with_monocle.png differ diff --git a/public/images/emoji/twitter/face_with_raised_eyebrow.png b/public/images/emoji/twitter/face_with_raised_eyebrow.png index 887f70e365..db22dd7d2f 100644 Binary files a/public/images/emoji/twitter/face_with_raised_eyebrow.png and b/public/images/emoji/twitter/face_with_raised_eyebrow.png differ diff --git a/public/images/emoji/twitter/face_with_rolling_eyes.png b/public/images/emoji/twitter/face_with_rolling_eyes.png index 8a864a00bd..1bafe2a637 100644 Binary files a/public/images/emoji/twitter/face_with_rolling_eyes.png and b/public/images/emoji/twitter/face_with_rolling_eyes.png differ diff --git a/public/images/emoji/twitter/face_with_symbols_over_mouth.png b/public/images/emoji/twitter/face_with_symbols_over_mouth.png index 84bb9ec9c5..5cde0c98da 100644 Binary files a/public/images/emoji/twitter/face_with_symbols_over_mouth.png and b/public/images/emoji/twitter/face_with_symbols_over_mouth.png differ diff --git a/public/images/emoji/twitter/face_with_thermometer.png b/public/images/emoji/twitter/face_with_thermometer.png index c9440239c0..79d49eb0a6 100644 Binary files a/public/images/emoji/twitter/face_with_thermometer.png and b/public/images/emoji/twitter/face_with_thermometer.png differ diff --git a/public/images/emoji/twitter/facepunch.png b/public/images/emoji/twitter/facepunch.png index 28448af2fb..2ab3e926ea 100644 Binary files a/public/images/emoji/twitter/facepunch.png and b/public/images/emoji/twitter/facepunch.png differ diff --git a/public/images/emoji/twitter/factory.png b/public/images/emoji/twitter/factory.png index aa8a0a7a54..555c8a7ed5 100644 Binary files a/public/images/emoji/twitter/factory.png and b/public/images/emoji/twitter/factory.png differ diff --git a/public/images/emoji/twitter/fairy.png b/public/images/emoji/twitter/fairy.png index 429938294b..b4a1e9a4f9 100644 Binary files a/public/images/emoji/twitter/fairy.png and b/public/images/emoji/twitter/fairy.png differ diff --git a/public/images/emoji/twitter/falkland_islands.png b/public/images/emoji/twitter/falkland_islands.png index d97a84cea1..5b2ecff4e4 100644 Binary files a/public/images/emoji/twitter/falkland_islands.png and b/public/images/emoji/twitter/falkland_islands.png differ diff --git a/public/images/emoji/twitter/fallen_leaf.png b/public/images/emoji/twitter/fallen_leaf.png index 778e3e3924..077a941a39 100644 Binary files a/public/images/emoji/twitter/fallen_leaf.png and b/public/images/emoji/twitter/fallen_leaf.png differ diff --git a/public/images/emoji/twitter/family.png b/public/images/emoji/twitter/family.png index 3d59c46f5a..76663a74ee 100644 Binary files a/public/images/emoji/twitter/family.png and b/public/images/emoji/twitter/family.png differ diff --git a/public/images/emoji/twitter/family_man_boy.png b/public/images/emoji/twitter/family_man_boy.png index d31b0f6209..76513b6f11 100644 Binary files a/public/images/emoji/twitter/family_man_boy.png and b/public/images/emoji/twitter/family_man_boy.png differ diff --git a/public/images/emoji/twitter/family_man_boy_boy.png b/public/images/emoji/twitter/family_man_boy_boy.png index 67d15f282c..6a05ea907d 100644 Binary files a/public/images/emoji/twitter/family_man_boy_boy.png and b/public/images/emoji/twitter/family_man_boy_boy.png differ diff --git a/public/images/emoji/twitter/family_man_girl.png b/public/images/emoji/twitter/family_man_girl.png index 4bb3d823f8..1804a244a5 100644 Binary files a/public/images/emoji/twitter/family_man_girl.png and b/public/images/emoji/twitter/family_man_girl.png differ diff --git a/public/images/emoji/twitter/family_man_girl_boy.png b/public/images/emoji/twitter/family_man_girl_boy.png index a8b6469dcb..26f69648a2 100644 Binary files a/public/images/emoji/twitter/family_man_girl_boy.png and b/public/images/emoji/twitter/family_man_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_man_girl_girl.png b/public/images/emoji/twitter/family_man_girl_girl.png index e1aa1a80db..229540a574 100644 Binary files a/public/images/emoji/twitter/family_man_girl_girl.png and b/public/images/emoji/twitter/family_man_girl_girl.png differ diff --git a/public/images/emoji/twitter/family_man_man_boy.png b/public/images/emoji/twitter/family_man_man_boy.png index f908ca5943..6d4a88febe 100644 Binary files a/public/images/emoji/twitter/family_man_man_boy.png and b/public/images/emoji/twitter/family_man_man_boy.png differ diff --git a/public/images/emoji/twitter/family_man_man_boy_boy.png b/public/images/emoji/twitter/family_man_man_boy_boy.png index 3a5450aa90..0431738f3a 100644 Binary files a/public/images/emoji/twitter/family_man_man_boy_boy.png and b/public/images/emoji/twitter/family_man_man_boy_boy.png differ diff --git a/public/images/emoji/twitter/family_man_man_girl.png b/public/images/emoji/twitter/family_man_man_girl.png index 40cc392a93..82981a5616 100644 Binary files a/public/images/emoji/twitter/family_man_man_girl.png and b/public/images/emoji/twitter/family_man_man_girl.png differ diff --git a/public/images/emoji/twitter/family_man_man_girl_boy.png b/public/images/emoji/twitter/family_man_man_girl_boy.png index 3dac9f07fe..29461eeaf2 100644 Binary files a/public/images/emoji/twitter/family_man_man_girl_boy.png and b/public/images/emoji/twitter/family_man_man_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_man_man_girl_girl.png b/public/images/emoji/twitter/family_man_man_girl_girl.png index 985c53eb3c..5fa7a1cbf3 100644 Binary files a/public/images/emoji/twitter/family_man_man_girl_girl.png and b/public/images/emoji/twitter/family_man_man_girl_girl.png differ diff --git a/public/images/emoji/twitter/family_man_woman_boy.png b/public/images/emoji/twitter/family_man_woman_boy.png index 90526b27fc..db1bf51631 100644 Binary files a/public/images/emoji/twitter/family_man_woman_boy.png and b/public/images/emoji/twitter/family_man_woman_boy.png differ diff --git a/public/images/emoji/twitter/family_man_woman_boy_boy.png b/public/images/emoji/twitter/family_man_woman_boy_boy.png index e8abd120b1..6a14c29f03 100644 Binary files a/public/images/emoji/twitter/family_man_woman_boy_boy.png and b/public/images/emoji/twitter/family_man_woman_boy_boy.png differ diff --git a/public/images/emoji/twitter/family_man_woman_boys.png b/public/images/emoji/twitter/family_man_woman_boys.png index e8abd120b1..6a14c29f03 100644 Binary files a/public/images/emoji/twitter/family_man_woman_boys.png and b/public/images/emoji/twitter/family_man_woman_boys.png differ diff --git a/public/images/emoji/twitter/family_man_woman_girl.png b/public/images/emoji/twitter/family_man_woman_girl.png index b948f1cbca..c23b12cb1c 100644 Binary files a/public/images/emoji/twitter/family_man_woman_girl.png and b/public/images/emoji/twitter/family_man_woman_girl.png differ diff --git a/public/images/emoji/twitter/family_man_woman_girl_boy.png b/public/images/emoji/twitter/family_man_woman_girl_boy.png index 3d59c46f5a..76663a74ee 100644 Binary files a/public/images/emoji/twitter/family_man_woman_girl_boy.png and b/public/images/emoji/twitter/family_man_woman_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_man_woman_girl_girl.png b/public/images/emoji/twitter/family_man_woman_girl_girl.png index 8d6fa3ac3e..3c3325e692 100644 Binary files a/public/images/emoji/twitter/family_man_woman_girl_girl.png and b/public/images/emoji/twitter/family_man_woman_girl_girl.png differ diff --git a/public/images/emoji/twitter/family_man_woman_girls.png b/public/images/emoji/twitter/family_man_woman_girls.png index 8d6fa3ac3e..3c3325e692 100644 Binary files a/public/images/emoji/twitter/family_man_woman_girls.png and b/public/images/emoji/twitter/family_man_woman_girls.png differ diff --git a/public/images/emoji/twitter/family_men_boy.png b/public/images/emoji/twitter/family_men_boy.png index f908ca5943..6d4a88febe 100644 Binary files a/public/images/emoji/twitter/family_men_boy.png and b/public/images/emoji/twitter/family_men_boy.png differ diff --git a/public/images/emoji/twitter/family_men_boys.png b/public/images/emoji/twitter/family_men_boys.png index 3a5450aa90..0431738f3a 100644 Binary files a/public/images/emoji/twitter/family_men_boys.png and b/public/images/emoji/twitter/family_men_boys.png differ diff --git a/public/images/emoji/twitter/family_men_girl.png b/public/images/emoji/twitter/family_men_girl.png index 40cc392a93..82981a5616 100644 Binary files a/public/images/emoji/twitter/family_men_girl.png and b/public/images/emoji/twitter/family_men_girl.png differ diff --git a/public/images/emoji/twitter/family_men_girl_boy.png b/public/images/emoji/twitter/family_men_girl_boy.png index 3dac9f07fe..29461eeaf2 100644 Binary files a/public/images/emoji/twitter/family_men_girl_boy.png and b/public/images/emoji/twitter/family_men_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_men_girls.png b/public/images/emoji/twitter/family_men_girls.png index 985c53eb3c..5fa7a1cbf3 100644 Binary files a/public/images/emoji/twitter/family_men_girls.png and b/public/images/emoji/twitter/family_men_girls.png differ diff --git a/public/images/emoji/twitter/family_woman_boy.png b/public/images/emoji/twitter/family_woman_boy.png index 3b0f755fd8..cb5c353579 100644 Binary files a/public/images/emoji/twitter/family_woman_boy.png and b/public/images/emoji/twitter/family_woman_boy.png differ diff --git a/public/images/emoji/twitter/family_woman_boy_boy.png b/public/images/emoji/twitter/family_woman_boy_boy.png index f9a1813738..26b9d2918a 100644 Binary files a/public/images/emoji/twitter/family_woman_boy_boy.png and b/public/images/emoji/twitter/family_woman_boy_boy.png differ diff --git a/public/images/emoji/twitter/family_woman_girl.png b/public/images/emoji/twitter/family_woman_girl.png index 966c36a0b9..65ef0c898c 100644 Binary files a/public/images/emoji/twitter/family_woman_girl.png and b/public/images/emoji/twitter/family_woman_girl.png differ diff --git a/public/images/emoji/twitter/family_woman_girl_boy.png b/public/images/emoji/twitter/family_woman_girl_boy.png index 68b9671817..ad1a7aebd0 100644 Binary files a/public/images/emoji/twitter/family_woman_girl_boy.png and b/public/images/emoji/twitter/family_woman_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_woman_girl_girl.png b/public/images/emoji/twitter/family_woman_girl_girl.png index 1e1995f8bf..f4d14a7519 100644 Binary files a/public/images/emoji/twitter/family_woman_girl_girl.png and b/public/images/emoji/twitter/family_woman_girl_girl.png differ diff --git a/public/images/emoji/twitter/family_woman_woman_boy.png b/public/images/emoji/twitter/family_woman_woman_boy.png index e9ce323487..76c73c70dc 100644 Binary files a/public/images/emoji/twitter/family_woman_woman_boy.png and b/public/images/emoji/twitter/family_woman_woman_boy.png differ diff --git a/public/images/emoji/twitter/family_woman_woman_boy_boy.png b/public/images/emoji/twitter/family_woman_woman_boy_boy.png index 9913749162..fd9cd351ce 100644 Binary files a/public/images/emoji/twitter/family_woman_woman_boy_boy.png and b/public/images/emoji/twitter/family_woman_woman_boy_boy.png differ diff --git a/public/images/emoji/twitter/family_woman_woman_girl.png b/public/images/emoji/twitter/family_woman_woman_girl.png index ce0352c19b..8cf2edb894 100644 Binary files a/public/images/emoji/twitter/family_woman_woman_girl.png and b/public/images/emoji/twitter/family_woman_woman_girl.png differ diff --git a/public/images/emoji/twitter/family_woman_woman_girl_boy.png b/public/images/emoji/twitter/family_woman_woman_girl_boy.png index cb294dd7c0..b0d01ae365 100644 Binary files a/public/images/emoji/twitter/family_woman_woman_girl_boy.png and b/public/images/emoji/twitter/family_woman_woman_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_woman_woman_girl_girl.png b/public/images/emoji/twitter/family_woman_woman_girl_girl.png index e751a27401..5e736a9fe2 100644 Binary files a/public/images/emoji/twitter/family_woman_woman_girl_girl.png and b/public/images/emoji/twitter/family_woman_woman_girl_girl.png differ diff --git a/public/images/emoji/twitter/family_women_boy.png b/public/images/emoji/twitter/family_women_boy.png index e9ce323487..76c73c70dc 100644 Binary files a/public/images/emoji/twitter/family_women_boy.png and b/public/images/emoji/twitter/family_women_boy.png differ diff --git a/public/images/emoji/twitter/family_women_boys.png b/public/images/emoji/twitter/family_women_boys.png index 9913749162..fd9cd351ce 100644 Binary files a/public/images/emoji/twitter/family_women_boys.png and b/public/images/emoji/twitter/family_women_boys.png differ diff --git a/public/images/emoji/twitter/family_women_girl.png b/public/images/emoji/twitter/family_women_girl.png index ce0352c19b..8cf2edb894 100644 Binary files a/public/images/emoji/twitter/family_women_girl.png and b/public/images/emoji/twitter/family_women_girl.png differ diff --git a/public/images/emoji/twitter/family_women_girl_boy.png b/public/images/emoji/twitter/family_women_girl_boy.png index cb294dd7c0..b0d01ae365 100644 Binary files a/public/images/emoji/twitter/family_women_girl_boy.png and b/public/images/emoji/twitter/family_women_girl_boy.png differ diff --git a/public/images/emoji/twitter/family_women_girls.png b/public/images/emoji/twitter/family_women_girls.png index e751a27401..5e736a9fe2 100644 Binary files a/public/images/emoji/twitter/family_women_girls.png and b/public/images/emoji/twitter/family_women_girls.png differ diff --git a/public/images/emoji/twitter/faroe_islands.png b/public/images/emoji/twitter/faroe_islands.png index 5da7953f8d..59c59453aa 100644 Binary files a/public/images/emoji/twitter/faroe_islands.png and b/public/images/emoji/twitter/faroe_islands.png differ diff --git a/public/images/emoji/twitter/fast_forward.png b/public/images/emoji/twitter/fast_forward.png index fe39be2221..b1424d0d36 100644 Binary files a/public/images/emoji/twitter/fast_forward.png and b/public/images/emoji/twitter/fast_forward.png differ diff --git a/public/images/emoji/twitter/fax.png b/public/images/emoji/twitter/fax.png index 1c3438cde0..c9b62aca2f 100644 Binary files a/public/images/emoji/twitter/fax.png and b/public/images/emoji/twitter/fax.png differ diff --git a/public/images/emoji/twitter/fearful.png b/public/images/emoji/twitter/fearful.png index a8e9ccbb60..893fd26d3a 100644 Binary files a/public/images/emoji/twitter/fearful.png and b/public/images/emoji/twitter/fearful.png differ diff --git a/public/images/emoji/twitter/feet.png b/public/images/emoji/twitter/feet.png index 1869c3930a..ec68b0e0a5 100644 Binary files a/public/images/emoji/twitter/feet.png and b/public/images/emoji/twitter/feet.png differ diff --git a/public/images/emoji/twitter/female_couple_with_heart.png b/public/images/emoji/twitter/female_couple_with_heart.png index 8381dc5b8e..f5187c966d 100644 Binary files a/public/images/emoji/twitter/female_couple_with_heart.png and b/public/images/emoji/twitter/female_couple_with_heart.png differ diff --git a/public/images/emoji/twitter/female_couplekiss.png b/public/images/emoji/twitter/female_couplekiss.png index f238608d9a..5973df0c97 100644 Binary files a/public/images/emoji/twitter/female_couplekiss.png and b/public/images/emoji/twitter/female_couplekiss.png differ diff --git a/public/images/emoji/twitter/female_detective.png b/public/images/emoji/twitter/female_detective.png index c1703a7c86..dd3d5f0db0 100644 Binary files a/public/images/emoji/twitter/female_detective.png and b/public/images/emoji/twitter/female_detective.png differ diff --git a/public/images/emoji/twitter/ferris_wheel.png b/public/images/emoji/twitter/ferris_wheel.png index 68e00d62fe..253a33bfb2 100644 Binary files a/public/images/emoji/twitter/ferris_wheel.png and b/public/images/emoji/twitter/ferris_wheel.png differ diff --git a/public/images/emoji/twitter/ferry.png b/public/images/emoji/twitter/ferry.png index b56a1cb3ff..b869b30199 100644 Binary files a/public/images/emoji/twitter/ferry.png and b/public/images/emoji/twitter/ferry.png differ diff --git a/public/images/emoji/twitter/field_hockey.png b/public/images/emoji/twitter/field_hockey.png index fb4f1e573a..a663a0ca6e 100644 Binary files a/public/images/emoji/twitter/field_hockey.png and b/public/images/emoji/twitter/field_hockey.png differ diff --git a/public/images/emoji/twitter/fiji.png b/public/images/emoji/twitter/fiji.png index df504caef6..fd38d20489 100644 Binary files a/public/images/emoji/twitter/fiji.png and b/public/images/emoji/twitter/fiji.png differ diff --git a/public/images/emoji/twitter/file_cabinet.png b/public/images/emoji/twitter/file_cabinet.png index f94b0fd46a..9b19e2e8a2 100644 Binary files a/public/images/emoji/twitter/file_cabinet.png and b/public/images/emoji/twitter/file_cabinet.png differ diff --git a/public/images/emoji/twitter/file_folder.png b/public/images/emoji/twitter/file_folder.png index 0c7de7866a..bce385bd25 100644 Binary files a/public/images/emoji/twitter/file_folder.png and b/public/images/emoji/twitter/file_folder.png differ diff --git a/public/images/emoji/twitter/film_frames.png b/public/images/emoji/twitter/film_frames.png index f0fcd6fc1d..431b759e64 100644 Binary files a/public/images/emoji/twitter/film_frames.png and b/public/images/emoji/twitter/film_frames.png differ diff --git a/public/images/emoji/twitter/film_projector.png b/public/images/emoji/twitter/film_projector.png index 3acb6ea9c3..224392a3eb 100644 Binary files a/public/images/emoji/twitter/film_projector.png and b/public/images/emoji/twitter/film_projector.png differ diff --git a/public/images/emoji/twitter/film_strip.png b/public/images/emoji/twitter/film_strip.png index f0fcd6fc1d..431b759e64 100644 Binary files a/public/images/emoji/twitter/film_strip.png and b/public/images/emoji/twitter/film_strip.png differ diff --git a/public/images/emoji/twitter/finland.png b/public/images/emoji/twitter/finland.png index 5eda4bb864..9caec14db9 100644 Binary files a/public/images/emoji/twitter/finland.png and b/public/images/emoji/twitter/finland.png differ diff --git a/public/images/emoji/twitter/fire.png b/public/images/emoji/twitter/fire.png index df992620e7..717523f17e 100644 Binary files a/public/images/emoji/twitter/fire.png and b/public/images/emoji/twitter/fire.png differ diff --git a/public/images/emoji/twitter/fire_engine.png b/public/images/emoji/twitter/fire_engine.png index a25281a2d6..13e66f7766 100644 Binary files a/public/images/emoji/twitter/fire_engine.png and b/public/images/emoji/twitter/fire_engine.png differ diff --git a/public/images/emoji/twitter/fire_extinguisher.png b/public/images/emoji/twitter/fire_extinguisher.png new file mode 100644 index 0000000000..f05d9276a1 Binary files /dev/null and b/public/images/emoji/twitter/fire_extinguisher.png differ diff --git a/public/images/emoji/twitter/firecracker.png b/public/images/emoji/twitter/firecracker.png new file mode 100644 index 0000000000..0364e240bd Binary files /dev/null and b/public/images/emoji/twitter/firecracker.png differ diff --git a/public/images/emoji/twitter/fireworks.png b/public/images/emoji/twitter/fireworks.png index 1f7f056b57..cf4348e21c 100644 Binary files a/public/images/emoji/twitter/fireworks.png and b/public/images/emoji/twitter/fireworks.png differ diff --git a/public/images/emoji/twitter/first_quarter_moon.png b/public/images/emoji/twitter/first_quarter_moon.png index 5713cc73b0..a45bdb9369 100644 Binary files a/public/images/emoji/twitter/first_quarter_moon.png and b/public/images/emoji/twitter/first_quarter_moon.png differ diff --git a/public/images/emoji/twitter/first_quarter_moon_with_face.png b/public/images/emoji/twitter/first_quarter_moon_with_face.png index 1d702357e6..e8287b8909 100644 Binary files a/public/images/emoji/twitter/first_quarter_moon_with_face.png and b/public/images/emoji/twitter/first_quarter_moon_with_face.png differ diff --git a/public/images/emoji/twitter/fish.png b/public/images/emoji/twitter/fish.png index 5108b00bb3..4bcda2f56d 100644 Binary files a/public/images/emoji/twitter/fish.png and b/public/images/emoji/twitter/fish.png differ diff --git a/public/images/emoji/twitter/fish_cake.png b/public/images/emoji/twitter/fish_cake.png index 2bf8bbc0f8..b98a7419ca 100644 Binary files a/public/images/emoji/twitter/fish_cake.png and b/public/images/emoji/twitter/fish_cake.png differ diff --git a/public/images/emoji/twitter/fishing_pole_and_fish.png b/public/images/emoji/twitter/fishing_pole_and_fish.png index 936e1559a4..aa7b3e9b74 100644 Binary files a/public/images/emoji/twitter/fishing_pole_and_fish.png and b/public/images/emoji/twitter/fishing_pole_and_fish.png differ diff --git a/public/images/emoji/twitter/fist.png b/public/images/emoji/twitter/fist.png index 30d7e1e214..439df41155 100644 Binary files a/public/images/emoji/twitter/fist.png and b/public/images/emoji/twitter/fist.png differ diff --git a/public/images/emoji/twitter/fist_left.png b/public/images/emoji/twitter/fist_left.png index f1ebb97514..0f44a9f4e8 100644 Binary files a/public/images/emoji/twitter/fist_left.png and b/public/images/emoji/twitter/fist_left.png differ diff --git a/public/images/emoji/twitter/fist_right.png b/public/images/emoji/twitter/fist_right.png index 010432f201..13ac5dd272 100644 Binary files a/public/images/emoji/twitter/fist_right.png and b/public/images/emoji/twitter/fist_right.png differ diff --git a/public/images/emoji/twitter/five.png b/public/images/emoji/twitter/five.png index d547d1df55..a234308fd7 100644 Binary files a/public/images/emoji/twitter/five.png and b/public/images/emoji/twitter/five.png differ diff --git a/public/images/emoji/twitter/flag_black.png b/public/images/emoji/twitter/flag_black.png index 5c1237bdad..3f676418d3 100644 Binary files a/public/images/emoji/twitter/flag_black.png and b/public/images/emoji/twitter/flag_black.png differ diff --git a/public/images/emoji/twitter/flag_cn.png b/public/images/emoji/twitter/flag_cn.png index 67efed2e4d..1543a73051 100644 Binary files a/public/images/emoji/twitter/flag_cn.png and b/public/images/emoji/twitter/flag_cn.png differ diff --git a/public/images/emoji/twitter/flag_de.png b/public/images/emoji/twitter/flag_de.png index 746bf11011..52b93beeef 100644 Binary files a/public/images/emoji/twitter/flag_de.png and b/public/images/emoji/twitter/flag_de.png differ diff --git a/public/images/emoji/twitter/flag_es.png b/public/images/emoji/twitter/flag_es.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/twitter/flag_es.png and b/public/images/emoji/twitter/flag_es.png differ diff --git a/public/images/emoji/twitter/flag_fr.png b/public/images/emoji/twitter/flag_fr.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/twitter/flag_fr.png and b/public/images/emoji/twitter/flag_fr.png differ diff --git a/public/images/emoji/twitter/flag_gb.png b/public/images/emoji/twitter/flag_gb.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/twitter/flag_gb.png and b/public/images/emoji/twitter/flag_gb.png differ diff --git a/public/images/emoji/twitter/flag_it.png b/public/images/emoji/twitter/flag_it.png index 13bbb1b1f8..589002bb34 100644 Binary files a/public/images/emoji/twitter/flag_it.png and b/public/images/emoji/twitter/flag_it.png differ diff --git a/public/images/emoji/twitter/flag_jp.png b/public/images/emoji/twitter/flag_jp.png index cca79ffb9d..dd515aa063 100644 Binary files a/public/images/emoji/twitter/flag_jp.png and b/public/images/emoji/twitter/flag_jp.png differ diff --git a/public/images/emoji/twitter/flag_kr.png b/public/images/emoji/twitter/flag_kr.png index 82486f8812..8ff7ccd3ff 100644 Binary files a/public/images/emoji/twitter/flag_kr.png and b/public/images/emoji/twitter/flag_kr.png differ diff --git a/public/images/emoji/twitter/flag_ru.png b/public/images/emoji/twitter/flag_ru.png index 3ecaefd941..47752f3f0c 100644 Binary files a/public/images/emoji/twitter/flag_ru.png and b/public/images/emoji/twitter/flag_ru.png differ diff --git a/public/images/emoji/twitter/flag_us.png b/public/images/emoji/twitter/flag_us.png index 450853eca4..0ba064250e 100644 Binary files a/public/images/emoji/twitter/flag_us.png and b/public/images/emoji/twitter/flag_us.png differ diff --git a/public/images/emoji/twitter/flag_white.png b/public/images/emoji/twitter/flag_white.png index 5f052fff2a..49317273b4 100644 Binary files a/public/images/emoji/twitter/flag_white.png and b/public/images/emoji/twitter/flag_white.png differ diff --git a/public/images/emoji/twitter/flags.png b/public/images/emoji/twitter/flags.png index 76909f76f1..4371ba79e9 100644 Binary files a/public/images/emoji/twitter/flags.png and b/public/images/emoji/twitter/flags.png differ diff --git a/public/images/emoji/twitter/flame.png b/public/images/emoji/twitter/flame.png index df992620e7..717523f17e 100644 Binary files a/public/images/emoji/twitter/flame.png and b/public/images/emoji/twitter/flame.png differ diff --git a/public/images/emoji/twitter/flashlight.png b/public/images/emoji/twitter/flashlight.png index b9b6635c04..d071d1c986 100644 Binary files a/public/images/emoji/twitter/flashlight.png and b/public/images/emoji/twitter/flashlight.png differ diff --git a/public/images/emoji/twitter/flat_shoe.png b/public/images/emoji/twitter/flat_shoe.png new file mode 100644 index 0000000000..2898e55dc0 Binary files /dev/null and b/public/images/emoji/twitter/flat_shoe.png differ diff --git a/public/images/emoji/twitter/fleur-de-lis.png b/public/images/emoji/twitter/fleur-de-lis.png index 27cd209049..7ad56ad454 100644 Binary files a/public/images/emoji/twitter/fleur-de-lis.png and b/public/images/emoji/twitter/fleur-de-lis.png differ diff --git a/public/images/emoji/twitter/fleur_de_lis.png b/public/images/emoji/twitter/fleur_de_lis.png index 27cd209049..7ad56ad454 100644 Binary files a/public/images/emoji/twitter/fleur_de_lis.png and b/public/images/emoji/twitter/fleur_de_lis.png differ diff --git a/public/images/emoji/twitter/flight_arrival.png b/public/images/emoji/twitter/flight_arrival.png index 0585a1c36c..f44f5c295e 100644 Binary files a/public/images/emoji/twitter/flight_arrival.png and b/public/images/emoji/twitter/flight_arrival.png differ diff --git a/public/images/emoji/twitter/flight_departure.png b/public/images/emoji/twitter/flight_departure.png index dc86670a86..34531e823c 100644 Binary files a/public/images/emoji/twitter/flight_departure.png and b/public/images/emoji/twitter/flight_departure.png differ diff --git a/public/images/emoji/twitter/floppy_disk.png b/public/images/emoji/twitter/floppy_disk.png index 757a9877ae..1c460fd0ae 100644 Binary files a/public/images/emoji/twitter/floppy_disk.png and b/public/images/emoji/twitter/floppy_disk.png differ diff --git a/public/images/emoji/twitter/flower_playing_cards.png b/public/images/emoji/twitter/flower_playing_cards.png index c0fe22e7d2..fac5a14145 100644 Binary files a/public/images/emoji/twitter/flower_playing_cards.png and b/public/images/emoji/twitter/flower_playing_cards.png differ diff --git a/public/images/emoji/twitter/flushed.png b/public/images/emoji/twitter/flushed.png index e3cf5ad6ca..3c2f8ac6a9 100644 Binary files a/public/images/emoji/twitter/flushed.png and b/public/images/emoji/twitter/flushed.png differ diff --git a/public/images/emoji/twitter/flying_disc.png b/public/images/emoji/twitter/flying_disc.png new file mode 100644 index 0000000000..ef34259ead Binary files /dev/null and b/public/images/emoji/twitter/flying_disc.png differ diff --git a/public/images/emoji/twitter/flying_saucer.png b/public/images/emoji/twitter/flying_saucer.png index 7d5c862855..ae7b217a2f 100644 Binary files a/public/images/emoji/twitter/flying_saucer.png and b/public/images/emoji/twitter/flying_saucer.png differ diff --git a/public/images/emoji/twitter/fog.png b/public/images/emoji/twitter/fog.png index f8aee2c7b5..0addc72eef 100644 Binary files a/public/images/emoji/twitter/fog.png and b/public/images/emoji/twitter/fog.png differ diff --git a/public/images/emoji/twitter/foggy.png b/public/images/emoji/twitter/foggy.png index 44febb1d1a..22284c8034 100644 Binary files a/public/images/emoji/twitter/foggy.png and b/public/images/emoji/twitter/foggy.png differ diff --git a/public/images/emoji/twitter/foot.png b/public/images/emoji/twitter/foot.png new file mode 100644 index 0000000000..ed57c2bd9c Binary files /dev/null and b/public/images/emoji/twitter/foot.png differ diff --git a/public/images/emoji/twitter/football.png b/public/images/emoji/twitter/football.png index 36dc68b7f9..4ff4d5e43a 100644 Binary files a/public/images/emoji/twitter/football.png and b/public/images/emoji/twitter/football.png differ diff --git a/public/images/emoji/twitter/footprints.png b/public/images/emoji/twitter/footprints.png index 1869c3930a..ec68b0e0a5 100644 Binary files a/public/images/emoji/twitter/footprints.png and b/public/images/emoji/twitter/footprints.png differ diff --git a/public/images/emoji/twitter/fork_and_knife.png b/public/images/emoji/twitter/fork_and_knife.png index c61873438c..1e8b70d304 100644 Binary files a/public/images/emoji/twitter/fork_and_knife.png and b/public/images/emoji/twitter/fork_and_knife.png differ diff --git a/public/images/emoji/twitter/fork_and_knife_with_plate.png b/public/images/emoji/twitter/fork_and_knife_with_plate.png index df63dcc4f4..5e8cf40778 100644 Binary files a/public/images/emoji/twitter/fork_and_knife_with_plate.png and b/public/images/emoji/twitter/fork_and_knife_with_plate.png differ diff --git a/public/images/emoji/twitter/fork_knife_plate.png b/public/images/emoji/twitter/fork_knife_plate.png index df63dcc4f4..5e8cf40778 100644 Binary files a/public/images/emoji/twitter/fork_knife_plate.png and b/public/images/emoji/twitter/fork_knife_plate.png differ diff --git a/public/images/emoji/twitter/fortune_cookie.png b/public/images/emoji/twitter/fortune_cookie.png index 94a8cdca40..a1e8958af7 100644 Binary files a/public/images/emoji/twitter/fortune_cookie.png and b/public/images/emoji/twitter/fortune_cookie.png differ diff --git a/public/images/emoji/twitter/fountain.png b/public/images/emoji/twitter/fountain.png index 06b6307c05..545c3eb85e 100644 Binary files a/public/images/emoji/twitter/fountain.png and b/public/images/emoji/twitter/fountain.png differ diff --git a/public/images/emoji/twitter/fountain_pen.png b/public/images/emoji/twitter/fountain_pen.png index 96584c9f57..39b1f567da 100644 Binary files a/public/images/emoji/twitter/fountain_pen.png and b/public/images/emoji/twitter/fountain_pen.png differ diff --git a/public/images/emoji/twitter/four.png b/public/images/emoji/twitter/four.png index 91b21c1d94..55fea0c3f2 100644 Binary files a/public/images/emoji/twitter/four.png and b/public/images/emoji/twitter/four.png differ diff --git a/public/images/emoji/twitter/four_leaf_clover.png b/public/images/emoji/twitter/four_leaf_clover.png index eb7ba46286..265e245a96 100644 Binary files a/public/images/emoji/twitter/four_leaf_clover.png and b/public/images/emoji/twitter/four_leaf_clover.png differ diff --git a/public/images/emoji/twitter/fox_face.png b/public/images/emoji/twitter/fox_face.png index 74bcddb7e7..fccdd16d60 100644 Binary files a/public/images/emoji/twitter/fox_face.png and b/public/images/emoji/twitter/fox_face.png differ diff --git a/public/images/emoji/twitter/fr.png b/public/images/emoji/twitter/fr.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/twitter/fr.png and b/public/images/emoji/twitter/fr.png differ diff --git a/public/images/emoji/twitter/frame_photo.png b/public/images/emoji/twitter/frame_photo.png index ad38ccf08d..dbaac89c62 100644 Binary files a/public/images/emoji/twitter/frame_photo.png and b/public/images/emoji/twitter/frame_photo.png differ diff --git a/public/images/emoji/twitter/frame_with_picture.png b/public/images/emoji/twitter/frame_with_picture.png index ad38ccf08d..dbaac89c62 100644 Binary files a/public/images/emoji/twitter/frame_with_picture.png and b/public/images/emoji/twitter/frame_with_picture.png differ diff --git a/public/images/emoji/twitter/framed_picture.png b/public/images/emoji/twitter/framed_picture.png index ad38ccf08d..dbaac89c62 100644 Binary files a/public/images/emoji/twitter/framed_picture.png and b/public/images/emoji/twitter/framed_picture.png differ diff --git a/public/images/emoji/twitter/free.png b/public/images/emoji/twitter/free.png index 86454606ce..20c351632c 100644 Binary files a/public/images/emoji/twitter/free.png and b/public/images/emoji/twitter/free.png differ diff --git a/public/images/emoji/twitter/french_guiana.png b/public/images/emoji/twitter/french_guiana.png index b67d58af24..a175d1a292 100644 Binary files a/public/images/emoji/twitter/french_guiana.png and b/public/images/emoji/twitter/french_guiana.png differ diff --git a/public/images/emoji/twitter/french_polynesia.png b/public/images/emoji/twitter/french_polynesia.png index 8e67281736..f89b755744 100644 Binary files a/public/images/emoji/twitter/french_polynesia.png and b/public/images/emoji/twitter/french_polynesia.png differ diff --git a/public/images/emoji/twitter/french_southern_territories.png b/public/images/emoji/twitter/french_southern_territories.png index ecc9bec0fa..2c17f5e70a 100644 Binary files a/public/images/emoji/twitter/french_southern_territories.png and b/public/images/emoji/twitter/french_southern_territories.png differ diff --git a/public/images/emoji/twitter/fried_egg.png b/public/images/emoji/twitter/fried_egg.png index 596a7389b8..7b1a2e7b32 100644 Binary files a/public/images/emoji/twitter/fried_egg.png and b/public/images/emoji/twitter/fried_egg.png differ diff --git a/public/images/emoji/twitter/fried_shrimp.png b/public/images/emoji/twitter/fried_shrimp.png index 0769d43e83..b1797f11f5 100644 Binary files a/public/images/emoji/twitter/fried_shrimp.png and b/public/images/emoji/twitter/fried_shrimp.png differ diff --git a/public/images/emoji/twitter/fries.png b/public/images/emoji/twitter/fries.png index 3c52d6b402..41a5a180ae 100644 Binary files a/public/images/emoji/twitter/fries.png and b/public/images/emoji/twitter/fries.png differ diff --git a/public/images/emoji/twitter/frog.png b/public/images/emoji/twitter/frog.png index a323ed6a3d..ba498e4783 100644 Binary files a/public/images/emoji/twitter/frog.png and b/public/images/emoji/twitter/frog.png differ diff --git a/public/images/emoji/twitter/frowning.png b/public/images/emoji/twitter/frowning.png index 3cef24e85c..1e97bcc4ac 100644 Binary files a/public/images/emoji/twitter/frowning.png and b/public/images/emoji/twitter/frowning.png differ diff --git a/public/images/emoji/twitter/frowning2.png b/public/images/emoji/twitter/frowning2.png index 1c5988a20b..9d9698f6b7 100644 Binary files a/public/images/emoji/twitter/frowning2.png and b/public/images/emoji/twitter/frowning2.png differ diff --git a/public/images/emoji/twitter/frowning_face.png b/public/images/emoji/twitter/frowning_face.png index 1c5988a20b..9d9698f6b7 100644 Binary files a/public/images/emoji/twitter/frowning_face.png and b/public/images/emoji/twitter/frowning_face.png differ diff --git a/public/images/emoji/twitter/frowning_man.png b/public/images/emoji/twitter/frowning_man.png index e10ce817f8..f0f65b27a8 100644 Binary files a/public/images/emoji/twitter/frowning_man.png and b/public/images/emoji/twitter/frowning_man.png differ diff --git a/public/images/emoji/twitter/frowning_woman.png b/public/images/emoji/twitter/frowning_woman.png index f1ca30e538..2a8f8653f4 100644 Binary files a/public/images/emoji/twitter/frowning_woman.png and b/public/images/emoji/twitter/frowning_woman.png differ diff --git a/public/images/emoji/twitter/fu.png b/public/images/emoji/twitter/fu.png index 8e7fce2f49..9b5de31144 100644 Binary files a/public/images/emoji/twitter/fu.png and b/public/images/emoji/twitter/fu.png differ diff --git a/public/images/emoji/twitter/fuelpump.png b/public/images/emoji/twitter/fuelpump.png index c1a741c68a..e209b907c3 100644 Binary files a/public/images/emoji/twitter/fuelpump.png and b/public/images/emoji/twitter/fuelpump.png differ diff --git a/public/images/emoji/twitter/full_moon.png b/public/images/emoji/twitter/full_moon.png index 27497f7202..0af89584c0 100644 Binary files a/public/images/emoji/twitter/full_moon.png and b/public/images/emoji/twitter/full_moon.png differ diff --git a/public/images/emoji/twitter/full_moon_with_face.png b/public/images/emoji/twitter/full_moon_with_face.png index decb957645..2f0025dff9 100644 Binary files a/public/images/emoji/twitter/full_moon_with_face.png and b/public/images/emoji/twitter/full_moon_with_face.png differ diff --git a/public/images/emoji/twitter/funeral_urn.png b/public/images/emoji/twitter/funeral_urn.png index 56112c50ed..72e745fa07 100644 Binary files a/public/images/emoji/twitter/funeral_urn.png and b/public/images/emoji/twitter/funeral_urn.png differ diff --git a/public/images/emoji/twitter/gabon.png b/public/images/emoji/twitter/gabon.png index 6563b2a69f..5ac1191c7b 100644 Binary files a/public/images/emoji/twitter/gabon.png and b/public/images/emoji/twitter/gabon.png differ diff --git a/public/images/emoji/twitter/gambia.png b/public/images/emoji/twitter/gambia.png index 707ca2a121..db1f863384 100644 Binary files a/public/images/emoji/twitter/gambia.png and b/public/images/emoji/twitter/gambia.png differ diff --git a/public/images/emoji/twitter/game_die.png b/public/images/emoji/twitter/game_die.png index 5e5732a995..c70ee4822c 100644 Binary files a/public/images/emoji/twitter/game_die.png and b/public/images/emoji/twitter/game_die.png differ diff --git a/public/images/emoji/twitter/gb.png b/public/images/emoji/twitter/gb.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/twitter/gb.png and b/public/images/emoji/twitter/gb.png differ diff --git a/public/images/emoji/twitter/gear.png b/public/images/emoji/twitter/gear.png index 6a9d3b8d1b..b78e56447a 100644 Binary files a/public/images/emoji/twitter/gear.png and b/public/images/emoji/twitter/gear.png differ diff --git a/public/images/emoji/twitter/gem.png b/public/images/emoji/twitter/gem.png index 7f48782f4a..c1a2bc0be9 100644 Binary files a/public/images/emoji/twitter/gem.png and b/public/images/emoji/twitter/gem.png differ diff --git a/public/images/emoji/twitter/gemini.png b/public/images/emoji/twitter/gemini.png index 83616019f8..7bdc7b1002 100644 Binary files a/public/images/emoji/twitter/gemini.png and b/public/images/emoji/twitter/gemini.png differ diff --git a/public/images/emoji/twitter/genie.png b/public/images/emoji/twitter/genie.png index f0eddcc91a..beea2145b1 100644 Binary files a/public/images/emoji/twitter/genie.png and b/public/images/emoji/twitter/genie.png differ diff --git a/public/images/emoji/twitter/georgia.png b/public/images/emoji/twitter/georgia.png index 673f81ef6f..31af12832b 100644 Binary files a/public/images/emoji/twitter/georgia.png and b/public/images/emoji/twitter/georgia.png differ diff --git a/public/images/emoji/twitter/ghana.png b/public/images/emoji/twitter/ghana.png index f1b8829dba..3f01ca0288 100644 Binary files a/public/images/emoji/twitter/ghana.png and b/public/images/emoji/twitter/ghana.png differ diff --git a/public/images/emoji/twitter/ghost.png b/public/images/emoji/twitter/ghost.png index dce153060e..200a4a5db1 100644 Binary files a/public/images/emoji/twitter/ghost.png and b/public/images/emoji/twitter/ghost.png differ diff --git a/public/images/emoji/twitter/gibraltar.png b/public/images/emoji/twitter/gibraltar.png index cbe9f11a12..26d4ef755e 100644 Binary files a/public/images/emoji/twitter/gibraltar.png and b/public/images/emoji/twitter/gibraltar.png differ diff --git a/public/images/emoji/twitter/gift.png b/public/images/emoji/twitter/gift.png index aa70fc8f5c..af0b07e48b 100644 Binary files a/public/images/emoji/twitter/gift.png and b/public/images/emoji/twitter/gift.png differ diff --git a/public/images/emoji/twitter/gift_heart.png b/public/images/emoji/twitter/gift_heart.png index bcbd13ba4c..ffe313881a 100644 Binary files a/public/images/emoji/twitter/gift_heart.png and b/public/images/emoji/twitter/gift_heart.png differ diff --git a/public/images/emoji/twitter/giraffe.png b/public/images/emoji/twitter/giraffe.png index be0e85d289..5d8aedfefe 100644 Binary files a/public/images/emoji/twitter/giraffe.png and b/public/images/emoji/twitter/giraffe.png differ diff --git a/public/images/emoji/twitter/girl.png b/public/images/emoji/twitter/girl.png index b76ac7118b..13fe5bebb0 100644 Binary files a/public/images/emoji/twitter/girl.png and b/public/images/emoji/twitter/girl.png differ diff --git a/public/images/emoji/twitter/globe_with_meridians.png b/public/images/emoji/twitter/globe_with_meridians.png index b20eb5c66c..89469caa7e 100644 Binary files a/public/images/emoji/twitter/globe_with_meridians.png and b/public/images/emoji/twitter/globe_with_meridians.png differ diff --git a/public/images/emoji/twitter/gloves.png b/public/images/emoji/twitter/gloves.png index 1a11dd2c56..ba0a2af68b 100644 Binary files a/public/images/emoji/twitter/gloves.png and b/public/images/emoji/twitter/gloves.png differ diff --git a/public/images/emoji/twitter/goal_net.png b/public/images/emoji/twitter/goal_net.png index 4773a63cf9..5719747c1d 100644 Binary files a/public/images/emoji/twitter/goal_net.png and b/public/images/emoji/twitter/goal_net.png differ diff --git a/public/images/emoji/twitter/goat.png b/public/images/emoji/twitter/goat.png index 1f7c85cbb9..696e91c93a 100644 Binary files a/public/images/emoji/twitter/goat.png and b/public/images/emoji/twitter/goat.png differ diff --git a/public/images/emoji/twitter/goggles.png b/public/images/emoji/twitter/goggles.png new file mode 100644 index 0000000000..0cf62133d7 Binary files /dev/null and b/public/images/emoji/twitter/goggles.png differ diff --git a/public/images/emoji/twitter/golf.png b/public/images/emoji/twitter/golf.png index a378ccce28..ab1b02ab0a 100644 Binary files a/public/images/emoji/twitter/golf.png and b/public/images/emoji/twitter/golf.png differ diff --git a/public/images/emoji/twitter/golfer.png b/public/images/emoji/twitter/golfer.png index 36609a5670..ee0e9d0027 100644 Binary files a/public/images/emoji/twitter/golfer.png and b/public/images/emoji/twitter/golfer.png differ diff --git a/public/images/emoji/twitter/golfing_man.png b/public/images/emoji/twitter/golfing_man.png index 36609a5670..ee0e9d0027 100644 Binary files a/public/images/emoji/twitter/golfing_man.png and b/public/images/emoji/twitter/golfing_man.png differ diff --git a/public/images/emoji/twitter/golfing_woman.png b/public/images/emoji/twitter/golfing_woman.png index 115ceac8f0..9a9f9bd5fd 100644 Binary files a/public/images/emoji/twitter/golfing_woman.png and b/public/images/emoji/twitter/golfing_woman.png differ diff --git a/public/images/emoji/twitter/gorilla.png b/public/images/emoji/twitter/gorilla.png index bd7d3d17fb..e63392d91a 100644 Binary files a/public/images/emoji/twitter/gorilla.png and b/public/images/emoji/twitter/gorilla.png differ diff --git a/public/images/emoji/twitter/grandma.png b/public/images/emoji/twitter/grandma.png index 8fe6dc8f16..e9d04f9e69 100644 Binary files a/public/images/emoji/twitter/grandma.png and b/public/images/emoji/twitter/grandma.png differ diff --git a/public/images/emoji/twitter/grapes.png b/public/images/emoji/twitter/grapes.png index 6462d613f3..f5787535a1 100644 Binary files a/public/images/emoji/twitter/grapes.png and b/public/images/emoji/twitter/grapes.png differ diff --git a/public/images/emoji/twitter/greece.png b/public/images/emoji/twitter/greece.png index c274ffb629..0478442a41 100644 Binary files a/public/images/emoji/twitter/greece.png and b/public/images/emoji/twitter/greece.png differ diff --git a/public/images/emoji/twitter/green_apple.png b/public/images/emoji/twitter/green_apple.png index f45abc5517..ac7be3e39f 100644 Binary files a/public/images/emoji/twitter/green_apple.png and b/public/images/emoji/twitter/green_apple.png differ diff --git a/public/images/emoji/twitter/green_book.png b/public/images/emoji/twitter/green_book.png index 156f1992d4..e1a254ce16 100644 Binary files a/public/images/emoji/twitter/green_book.png and b/public/images/emoji/twitter/green_book.png differ diff --git a/public/images/emoji/twitter/green_heart.png b/public/images/emoji/twitter/green_heart.png index 93f1538f04..fc8bd0d31a 100644 Binary files a/public/images/emoji/twitter/green_heart.png and b/public/images/emoji/twitter/green_heart.png differ diff --git a/public/images/emoji/twitter/green_salad.png b/public/images/emoji/twitter/green_salad.png index e3325b048e..f255f4d6ec 100644 Binary files a/public/images/emoji/twitter/green_salad.png and b/public/images/emoji/twitter/green_salad.png differ diff --git a/public/images/emoji/twitter/greenland.png b/public/images/emoji/twitter/greenland.png index 31c8707a43..5df66b33ec 100644 Binary files a/public/images/emoji/twitter/greenland.png and b/public/images/emoji/twitter/greenland.png differ diff --git a/public/images/emoji/twitter/grenada.png b/public/images/emoji/twitter/grenada.png index 87f17a6ff2..66f160e0e7 100644 Binary files a/public/images/emoji/twitter/grenada.png and b/public/images/emoji/twitter/grenada.png differ diff --git a/public/images/emoji/twitter/grey_exclamation.png b/public/images/emoji/twitter/grey_exclamation.png index 126c3f9e45..0b173031e2 100644 Binary files a/public/images/emoji/twitter/grey_exclamation.png and b/public/images/emoji/twitter/grey_exclamation.png differ diff --git a/public/images/emoji/twitter/grey_question.png b/public/images/emoji/twitter/grey_question.png index b0a3399ff6..a28b30475a 100644 Binary files a/public/images/emoji/twitter/grey_question.png and b/public/images/emoji/twitter/grey_question.png differ diff --git a/public/images/emoji/twitter/grimacing.png b/public/images/emoji/twitter/grimacing.png index 31239b76c1..59ee2e84e1 100644 Binary files a/public/images/emoji/twitter/grimacing.png and b/public/images/emoji/twitter/grimacing.png differ diff --git a/public/images/emoji/twitter/grin.png b/public/images/emoji/twitter/grin.png index 9625aa5100..3a73f9d906 100644 Binary files a/public/images/emoji/twitter/grin.png and b/public/images/emoji/twitter/grin.png differ diff --git a/public/images/emoji/twitter/grinning.png b/public/images/emoji/twitter/grinning.png index 39e0a68f19..e864c216b0 100644 Binary files a/public/images/emoji/twitter/grinning.png and b/public/images/emoji/twitter/grinning.png differ diff --git a/public/images/emoji/twitter/guadeloupe.png b/public/images/emoji/twitter/guadeloupe.png index c9c437901d..97a3dd9be7 100644 Binary files a/public/images/emoji/twitter/guadeloupe.png and b/public/images/emoji/twitter/guadeloupe.png differ diff --git a/public/images/emoji/twitter/guam.png b/public/images/emoji/twitter/guam.png index d291c89c97..75c0945cfe 100644 Binary files a/public/images/emoji/twitter/guam.png and b/public/images/emoji/twitter/guam.png differ diff --git a/public/images/emoji/twitter/guardsman.png b/public/images/emoji/twitter/guardsman.png index 62f207fa74..29198ad209 100644 Binary files a/public/images/emoji/twitter/guardsman.png and b/public/images/emoji/twitter/guardsman.png differ diff --git a/public/images/emoji/twitter/guardswoman.png b/public/images/emoji/twitter/guardswoman.png index fefb6c23e5..db3181a9e1 100644 Binary files a/public/images/emoji/twitter/guardswoman.png and b/public/images/emoji/twitter/guardswoman.png differ diff --git a/public/images/emoji/twitter/guatemala.png b/public/images/emoji/twitter/guatemala.png index b7e7259bc8..efa2d04ded 100644 Binary files a/public/images/emoji/twitter/guatemala.png and b/public/images/emoji/twitter/guatemala.png differ diff --git a/public/images/emoji/twitter/guernsey.png b/public/images/emoji/twitter/guernsey.png index f92e78a324..72ac329c84 100644 Binary files a/public/images/emoji/twitter/guernsey.png and b/public/images/emoji/twitter/guernsey.png differ diff --git a/public/images/emoji/twitter/guinea.png b/public/images/emoji/twitter/guinea.png index dd1482188c..dc4a63147c 100644 Binary files a/public/images/emoji/twitter/guinea.png and b/public/images/emoji/twitter/guinea.png differ diff --git a/public/images/emoji/twitter/guinea_bissau.png b/public/images/emoji/twitter/guinea_bissau.png index c2ab6fb507..639bc926bd 100644 Binary files a/public/images/emoji/twitter/guinea_bissau.png and b/public/images/emoji/twitter/guinea_bissau.png differ diff --git a/public/images/emoji/twitter/guitar.png b/public/images/emoji/twitter/guitar.png index 3ef8ad93b6..90590b2a5d 100644 Binary files a/public/images/emoji/twitter/guitar.png and b/public/images/emoji/twitter/guitar.png differ diff --git a/public/images/emoji/twitter/gun.png b/public/images/emoji/twitter/gun.png index 1d754b2bd7..e3f5d67061 100644 Binary files a/public/images/emoji/twitter/gun.png and b/public/images/emoji/twitter/gun.png differ diff --git a/public/images/emoji/twitter/guyana.png b/public/images/emoji/twitter/guyana.png index 2ceb411ad2..481b04c3d6 100644 Binary files a/public/images/emoji/twitter/guyana.png and b/public/images/emoji/twitter/guyana.png differ diff --git a/public/images/emoji/twitter/haircut.png b/public/images/emoji/twitter/haircut.png index 50259f54fe..502be473c3 100644 Binary files a/public/images/emoji/twitter/haircut.png and b/public/images/emoji/twitter/haircut.png differ diff --git a/public/images/emoji/twitter/haircut_man.png b/public/images/emoji/twitter/haircut_man.png index b5a80561e4..8b290f6dc2 100644 Binary files a/public/images/emoji/twitter/haircut_man.png and b/public/images/emoji/twitter/haircut_man.png differ diff --git a/public/images/emoji/twitter/haircut_woman.png b/public/images/emoji/twitter/haircut_woman.png index 50259f54fe..502be473c3 100644 Binary files a/public/images/emoji/twitter/haircut_woman.png and b/public/images/emoji/twitter/haircut_woman.png differ diff --git a/public/images/emoji/twitter/haiti.png b/public/images/emoji/twitter/haiti.png index 53d2160f9a..afbf0287b6 100644 Binary files a/public/images/emoji/twitter/haiti.png and b/public/images/emoji/twitter/haiti.png differ diff --git a/public/images/emoji/twitter/hamburger.png b/public/images/emoji/twitter/hamburger.png index 10cca5ac3d..c6e7e93b56 100644 Binary files a/public/images/emoji/twitter/hamburger.png and b/public/images/emoji/twitter/hamburger.png differ diff --git a/public/images/emoji/twitter/hammer.png b/public/images/emoji/twitter/hammer.png index e82bd5f9e0..d76ec56de0 100644 Binary files a/public/images/emoji/twitter/hammer.png and b/public/images/emoji/twitter/hammer.png differ diff --git a/public/images/emoji/twitter/hammer_and_pick.png b/public/images/emoji/twitter/hammer_and_pick.png index 71bb73f2c5..055a8e7aa0 100644 Binary files a/public/images/emoji/twitter/hammer_and_pick.png and b/public/images/emoji/twitter/hammer_and_pick.png differ diff --git a/public/images/emoji/twitter/hammer_and_wrench.png b/public/images/emoji/twitter/hammer_and_wrench.png index 2b7c33b207..5adbd1c5de 100644 Binary files a/public/images/emoji/twitter/hammer_and_wrench.png and b/public/images/emoji/twitter/hammer_and_wrench.png differ diff --git a/public/images/emoji/twitter/hammer_pick.png b/public/images/emoji/twitter/hammer_pick.png index 71bb73f2c5..055a8e7aa0 100644 Binary files a/public/images/emoji/twitter/hammer_pick.png and b/public/images/emoji/twitter/hammer_pick.png differ diff --git a/public/images/emoji/twitter/hamster.png b/public/images/emoji/twitter/hamster.png index eaee91f7a7..42a07e6e4e 100644 Binary files a/public/images/emoji/twitter/hamster.png and b/public/images/emoji/twitter/hamster.png differ diff --git a/public/images/emoji/twitter/hand.png b/public/images/emoji/twitter/hand.png index e18572e405..83cc2e2fc9 100644 Binary files a/public/images/emoji/twitter/hand.png and b/public/images/emoji/twitter/hand.png differ diff --git a/public/images/emoji/twitter/hand_splayed.png b/public/images/emoji/twitter/hand_splayed.png index f41f01af47..7464170185 100644 Binary files a/public/images/emoji/twitter/hand_splayed.png and b/public/images/emoji/twitter/hand_splayed.png differ diff --git a/public/images/emoji/twitter/handbag.png b/public/images/emoji/twitter/handbag.png index 36b1a929ba..ad1aad4c47 100644 Binary files a/public/images/emoji/twitter/handbag.png and b/public/images/emoji/twitter/handbag.png differ diff --git a/public/images/emoji/twitter/handshake.png b/public/images/emoji/twitter/handshake.png index 6ac8b5fdf6..e04a959754 100644 Binary files a/public/images/emoji/twitter/handshake.png and b/public/images/emoji/twitter/handshake.png differ diff --git a/public/images/emoji/twitter/hankey.png b/public/images/emoji/twitter/hankey.png index 51661e5dff..bf8eac64da 100644 Binary files a/public/images/emoji/twitter/hankey.png and b/public/images/emoji/twitter/hankey.png differ diff --git a/public/images/emoji/twitter/hash.png b/public/images/emoji/twitter/hash.png index 5309b3d0c9..465566f2be 100644 Binary files a/public/images/emoji/twitter/hash.png and b/public/images/emoji/twitter/hash.png differ diff --git a/public/images/emoji/twitter/hatched_chick.png b/public/images/emoji/twitter/hatched_chick.png index 2a9103aeaf..645f5e6c18 100644 Binary files a/public/images/emoji/twitter/hatched_chick.png and b/public/images/emoji/twitter/hatched_chick.png differ diff --git a/public/images/emoji/twitter/hatching_chick.png b/public/images/emoji/twitter/hatching_chick.png index 66af0792c9..a236295387 100644 Binary files a/public/images/emoji/twitter/hatching_chick.png and b/public/images/emoji/twitter/hatching_chick.png differ diff --git a/public/images/emoji/twitter/head_bandage.png b/public/images/emoji/twitter/head_bandage.png index 97bec4d11f..7b5422bb4a 100644 Binary files a/public/images/emoji/twitter/head_bandage.png and b/public/images/emoji/twitter/head_bandage.png differ diff --git a/public/images/emoji/twitter/headphones.png b/public/images/emoji/twitter/headphones.png index d97d79e33e..6510d94f90 100644 Binary files a/public/images/emoji/twitter/headphones.png and b/public/images/emoji/twitter/headphones.png differ diff --git a/public/images/emoji/twitter/hear_no_evil.png b/public/images/emoji/twitter/hear_no_evil.png index ddce1643cb..bf4209928b 100644 Binary files a/public/images/emoji/twitter/hear_no_evil.png and b/public/images/emoji/twitter/hear_no_evil.png differ diff --git a/public/images/emoji/twitter/heard_and_mc_donald_islands.png b/public/images/emoji/twitter/heard_and_mc_donald_islands.png index 1b5bf7b178..32d62da17f 100644 Binary files a/public/images/emoji/twitter/heard_and_mc_donald_islands.png and b/public/images/emoji/twitter/heard_and_mc_donald_islands.png differ diff --git a/public/images/emoji/twitter/heart.png b/public/images/emoji/twitter/heart.png index 0da147f1e6..158e2e175d 100644 Binary files a/public/images/emoji/twitter/heart.png and b/public/images/emoji/twitter/heart.png differ diff --git a/public/images/emoji/twitter/heart_decoration.png b/public/images/emoji/twitter/heart_decoration.png index 7d34340257..d29a0d606c 100644 Binary files a/public/images/emoji/twitter/heart_decoration.png and b/public/images/emoji/twitter/heart_decoration.png differ diff --git a/public/images/emoji/twitter/heart_exclamation.png b/public/images/emoji/twitter/heart_exclamation.png index 1cb11ddf8b..9813c1b3b9 100644 Binary files a/public/images/emoji/twitter/heart_exclamation.png and b/public/images/emoji/twitter/heart_exclamation.png differ diff --git a/public/images/emoji/twitter/heart_eyes.png b/public/images/emoji/twitter/heart_eyes.png index 9f2cef47d3..43b8dc884a 100644 Binary files a/public/images/emoji/twitter/heart_eyes.png and b/public/images/emoji/twitter/heart_eyes.png differ diff --git a/public/images/emoji/twitter/heart_eyes_cat.png b/public/images/emoji/twitter/heart_eyes_cat.png index dfc121a0bb..1292512993 100644 Binary files a/public/images/emoji/twitter/heart_eyes_cat.png and b/public/images/emoji/twitter/heart_eyes_cat.png differ diff --git a/public/images/emoji/twitter/heartbeat.png b/public/images/emoji/twitter/heartbeat.png index 9e6cceee8b..d5f8e13fd0 100644 Binary files a/public/images/emoji/twitter/heartbeat.png and b/public/images/emoji/twitter/heartbeat.png differ diff --git a/public/images/emoji/twitter/heartpulse.png b/public/images/emoji/twitter/heartpulse.png index 749f70460f..2149870431 100644 Binary files a/public/images/emoji/twitter/heartpulse.png and b/public/images/emoji/twitter/heartpulse.png differ diff --git a/public/images/emoji/twitter/hearts.png b/public/images/emoji/twitter/hearts.png index 0f2ba60e30..f91d170dfd 100644 Binary files a/public/images/emoji/twitter/hearts.png and b/public/images/emoji/twitter/hearts.png differ diff --git a/public/images/emoji/twitter/heavy_check_mark.png b/public/images/emoji/twitter/heavy_check_mark.png index fcb2d676aa..d903249661 100644 Binary files a/public/images/emoji/twitter/heavy_check_mark.png and b/public/images/emoji/twitter/heavy_check_mark.png differ diff --git a/public/images/emoji/twitter/heavy_division_sign.png b/public/images/emoji/twitter/heavy_division_sign.png index 3f95c3d205..1186c2820c 100644 Binary files a/public/images/emoji/twitter/heavy_division_sign.png and b/public/images/emoji/twitter/heavy_division_sign.png differ diff --git a/public/images/emoji/twitter/heavy_dollar_sign.png b/public/images/emoji/twitter/heavy_dollar_sign.png index de17bb9cb2..9027873e8c 100644 Binary files a/public/images/emoji/twitter/heavy_dollar_sign.png and b/public/images/emoji/twitter/heavy_dollar_sign.png differ diff --git a/public/images/emoji/twitter/heavy_heart_exclamation.png b/public/images/emoji/twitter/heavy_heart_exclamation.png index 1cb11ddf8b..9813c1b3b9 100644 Binary files a/public/images/emoji/twitter/heavy_heart_exclamation.png and b/public/images/emoji/twitter/heavy_heart_exclamation.png differ diff --git a/public/images/emoji/twitter/heavy_heart_exclamation_mark_ornament.png b/public/images/emoji/twitter/heavy_heart_exclamation_mark_ornament.png index 1cb11ddf8b..9813c1b3b9 100644 Binary files a/public/images/emoji/twitter/heavy_heart_exclamation_mark_ornament.png and b/public/images/emoji/twitter/heavy_heart_exclamation_mark_ornament.png differ diff --git a/public/images/emoji/twitter/heavy_minus_sign.png b/public/images/emoji/twitter/heavy_minus_sign.png index 7bcdae2c09..208e5ac1e8 100644 Binary files a/public/images/emoji/twitter/heavy_minus_sign.png and b/public/images/emoji/twitter/heavy_minus_sign.png differ diff --git a/public/images/emoji/twitter/heavy_multiplication_x.png b/public/images/emoji/twitter/heavy_multiplication_x.png index f0beeb8b38..df09b7fedb 100644 Binary files a/public/images/emoji/twitter/heavy_multiplication_x.png and b/public/images/emoji/twitter/heavy_multiplication_x.png differ diff --git a/public/images/emoji/twitter/heavy_plus_sign.png b/public/images/emoji/twitter/heavy_plus_sign.png index 16d121d928..65828c016a 100644 Binary files a/public/images/emoji/twitter/heavy_plus_sign.png and b/public/images/emoji/twitter/heavy_plus_sign.png differ diff --git a/public/images/emoji/twitter/hedgehog.png b/public/images/emoji/twitter/hedgehog.png index 9b978b3540..6f92de0e03 100644 Binary files a/public/images/emoji/twitter/hedgehog.png and b/public/images/emoji/twitter/hedgehog.png differ diff --git a/public/images/emoji/twitter/helicopter.png b/public/images/emoji/twitter/helicopter.png index 91a6fd1599..10796dfb77 100644 Binary files a/public/images/emoji/twitter/helicopter.png and b/public/images/emoji/twitter/helicopter.png differ diff --git a/public/images/emoji/twitter/helmet_with_cross.png b/public/images/emoji/twitter/helmet_with_cross.png index ad220c2eef..d99f6046f5 100644 Binary files a/public/images/emoji/twitter/helmet_with_cross.png and b/public/images/emoji/twitter/helmet_with_cross.png differ diff --git a/public/images/emoji/twitter/helmet_with_white_cross.png b/public/images/emoji/twitter/helmet_with_white_cross.png index ad220c2eef..d99f6046f5 100644 Binary files a/public/images/emoji/twitter/helmet_with_white_cross.png and b/public/images/emoji/twitter/helmet_with_white_cross.png differ diff --git a/public/images/emoji/twitter/herb.png b/public/images/emoji/twitter/herb.png index 2cd2474b51..9d6384a989 100644 Binary files a/public/images/emoji/twitter/herb.png and b/public/images/emoji/twitter/herb.png differ diff --git a/public/images/emoji/twitter/hibiscus.png b/public/images/emoji/twitter/hibiscus.png index 00bdf1ea52..955d1f1c68 100644 Binary files a/public/images/emoji/twitter/hibiscus.png and b/public/images/emoji/twitter/hibiscus.png differ diff --git a/public/images/emoji/twitter/high_brightness.png b/public/images/emoji/twitter/high_brightness.png index de41727448..f84a19af53 100644 Binary files a/public/images/emoji/twitter/high_brightness.png and b/public/images/emoji/twitter/high_brightness.png differ diff --git a/public/images/emoji/twitter/high_heel.png b/public/images/emoji/twitter/high_heel.png index daf3efc3c5..02325941a2 100644 Binary files a/public/images/emoji/twitter/high_heel.png and b/public/images/emoji/twitter/high_heel.png differ diff --git a/public/images/emoji/twitter/hiking_boot.png b/public/images/emoji/twitter/hiking_boot.png new file mode 100644 index 0000000000..1e97c61b01 Binary files /dev/null and b/public/images/emoji/twitter/hiking_boot.png differ diff --git a/public/images/emoji/twitter/hippopotamus.png b/public/images/emoji/twitter/hippopotamus.png new file mode 100644 index 0000000000..87048aaa59 Binary files /dev/null and b/public/images/emoji/twitter/hippopotamus.png differ diff --git a/public/images/emoji/twitter/hocho.png b/public/images/emoji/twitter/hocho.png index a7425d8c39..46794f850c 100644 Binary files a/public/images/emoji/twitter/hocho.png and b/public/images/emoji/twitter/hocho.png differ diff --git a/public/images/emoji/twitter/hockey.png b/public/images/emoji/twitter/hockey.png index 7b5a1105c3..9430b3bbee 100644 Binary files a/public/images/emoji/twitter/hockey.png and b/public/images/emoji/twitter/hockey.png differ diff --git a/public/images/emoji/twitter/hole.png b/public/images/emoji/twitter/hole.png index 6df8ea8c4c..41c8d2e895 100644 Binary files a/public/images/emoji/twitter/hole.png and b/public/images/emoji/twitter/hole.png differ diff --git a/public/images/emoji/twitter/homes.png b/public/images/emoji/twitter/homes.png index 5f9a0a658b..b2a7dd09d1 100644 Binary files a/public/images/emoji/twitter/homes.png and b/public/images/emoji/twitter/homes.png differ diff --git a/public/images/emoji/twitter/honduras.png b/public/images/emoji/twitter/honduras.png index d0aff11833..e1617778cb 100644 Binary files a/public/images/emoji/twitter/honduras.png and b/public/images/emoji/twitter/honduras.png differ diff --git a/public/images/emoji/twitter/honey_pot.png b/public/images/emoji/twitter/honey_pot.png index a55fe609b3..b6114f4e22 100644 Binary files a/public/images/emoji/twitter/honey_pot.png and b/public/images/emoji/twitter/honey_pot.png differ diff --git a/public/images/emoji/twitter/honeybee.png b/public/images/emoji/twitter/honeybee.png index 1dde5bac0d..ad8434e748 100644 Binary files a/public/images/emoji/twitter/honeybee.png and b/public/images/emoji/twitter/honeybee.png differ diff --git a/public/images/emoji/twitter/hong_kong.png b/public/images/emoji/twitter/hong_kong.png index 9db8cbc102..412b6841f8 100644 Binary files a/public/images/emoji/twitter/hong_kong.png and b/public/images/emoji/twitter/hong_kong.png differ diff --git a/public/images/emoji/twitter/horse.png b/public/images/emoji/twitter/horse.png index 10279f4134..79d0ba1ee5 100644 Binary files a/public/images/emoji/twitter/horse.png and b/public/images/emoji/twitter/horse.png differ diff --git a/public/images/emoji/twitter/horse_racing.png b/public/images/emoji/twitter/horse_racing.png index 309fc3aa7a..7944b08423 100644 Binary files a/public/images/emoji/twitter/horse_racing.png and b/public/images/emoji/twitter/horse_racing.png differ diff --git a/public/images/emoji/twitter/hospital.png b/public/images/emoji/twitter/hospital.png index 7c46f8e097..5781697a90 100644 Binary files a/public/images/emoji/twitter/hospital.png and b/public/images/emoji/twitter/hospital.png differ diff --git a/public/images/emoji/twitter/hot_dog.png b/public/images/emoji/twitter/hot_dog.png index 0fe32af15f..ef158292f4 100644 Binary files a/public/images/emoji/twitter/hot_dog.png and b/public/images/emoji/twitter/hot_dog.png differ diff --git a/public/images/emoji/twitter/hot_face.png b/public/images/emoji/twitter/hot_face.png new file mode 100644 index 0000000000..08e3a353d4 Binary files /dev/null and b/public/images/emoji/twitter/hot_face.png differ diff --git a/public/images/emoji/twitter/hot_pepper.png b/public/images/emoji/twitter/hot_pepper.png index d72eba3a1a..b0e51a9d28 100644 Binary files a/public/images/emoji/twitter/hot_pepper.png and b/public/images/emoji/twitter/hot_pepper.png differ diff --git a/public/images/emoji/twitter/hotdog.png b/public/images/emoji/twitter/hotdog.png index 0fe32af15f..ef158292f4 100644 Binary files a/public/images/emoji/twitter/hotdog.png and b/public/images/emoji/twitter/hotdog.png differ diff --git a/public/images/emoji/twitter/hotel.png b/public/images/emoji/twitter/hotel.png index ecdb4809af..8b45eae7b2 100644 Binary files a/public/images/emoji/twitter/hotel.png and b/public/images/emoji/twitter/hotel.png differ diff --git a/public/images/emoji/twitter/hotsprings.png b/public/images/emoji/twitter/hotsprings.png index 88315d1bbd..6ca91542f1 100644 Binary files a/public/images/emoji/twitter/hotsprings.png and b/public/images/emoji/twitter/hotsprings.png differ diff --git a/public/images/emoji/twitter/hourglass.png b/public/images/emoji/twitter/hourglass.png index 9ffa136776..8e9196f3cd 100644 Binary files a/public/images/emoji/twitter/hourglass.png and b/public/images/emoji/twitter/hourglass.png differ diff --git a/public/images/emoji/twitter/hourglass_flowing_sand.png b/public/images/emoji/twitter/hourglass_flowing_sand.png index c15779d538..b86946b324 100644 Binary files a/public/images/emoji/twitter/hourglass_flowing_sand.png and b/public/images/emoji/twitter/hourglass_flowing_sand.png differ diff --git a/public/images/emoji/twitter/house.png b/public/images/emoji/twitter/house.png index 82904fe8db..a804a62786 100644 Binary files a/public/images/emoji/twitter/house.png and b/public/images/emoji/twitter/house.png differ diff --git a/public/images/emoji/twitter/house_abandoned.png b/public/images/emoji/twitter/house_abandoned.png index a48da60494..af42d3c133 100644 Binary files a/public/images/emoji/twitter/house_abandoned.png and b/public/images/emoji/twitter/house_abandoned.png differ diff --git a/public/images/emoji/twitter/house_buildings.png b/public/images/emoji/twitter/house_buildings.png index 5f9a0a658b..b2a7dd09d1 100644 Binary files a/public/images/emoji/twitter/house_buildings.png and b/public/images/emoji/twitter/house_buildings.png differ diff --git a/public/images/emoji/twitter/house_with_garden.png b/public/images/emoji/twitter/house_with_garden.png index 355631d3e7..2b0d8497a6 100644 Binary files a/public/images/emoji/twitter/house_with_garden.png and b/public/images/emoji/twitter/house_with_garden.png differ diff --git a/public/images/emoji/twitter/houses.png b/public/images/emoji/twitter/houses.png index 5f9a0a658b..b2a7dd09d1 100644 Binary files a/public/images/emoji/twitter/houses.png and b/public/images/emoji/twitter/houses.png differ diff --git a/public/images/emoji/twitter/hugging.png b/public/images/emoji/twitter/hugging.png index f0eb7db322..6d0f049fac 100644 Binary files a/public/images/emoji/twitter/hugging.png and b/public/images/emoji/twitter/hugging.png differ diff --git a/public/images/emoji/twitter/hugging_face.png b/public/images/emoji/twitter/hugging_face.png index f0eb7db322..6d0f049fac 100644 Binary files a/public/images/emoji/twitter/hugging_face.png and b/public/images/emoji/twitter/hugging_face.png differ diff --git a/public/images/emoji/twitter/hugs.png b/public/images/emoji/twitter/hugs.png index f0eb7db322..6d0f049fac 100644 Binary files a/public/images/emoji/twitter/hugs.png and b/public/images/emoji/twitter/hugs.png differ diff --git a/public/images/emoji/twitter/hungary.png b/public/images/emoji/twitter/hungary.png index 98963a97c9..2d69737f2a 100644 Binary files a/public/images/emoji/twitter/hungary.png and b/public/images/emoji/twitter/hungary.png differ diff --git a/public/images/emoji/twitter/hushed.png b/public/images/emoji/twitter/hushed.png index 3d6332f5da..11433a2c64 100644 Binary files a/public/images/emoji/twitter/hushed.png and b/public/images/emoji/twitter/hushed.png differ diff --git a/public/images/emoji/twitter/ice_cream.png b/public/images/emoji/twitter/ice_cream.png index 939a2efca6..f142b35f99 100644 Binary files a/public/images/emoji/twitter/ice_cream.png and b/public/images/emoji/twitter/ice_cream.png differ diff --git a/public/images/emoji/twitter/ice_hockey.png b/public/images/emoji/twitter/ice_hockey.png index 7b5a1105c3..9430b3bbee 100644 Binary files a/public/images/emoji/twitter/ice_hockey.png and b/public/images/emoji/twitter/ice_hockey.png differ diff --git a/public/images/emoji/twitter/ice_skate.png b/public/images/emoji/twitter/ice_skate.png index a9e9fcbbe5..aedf5af158 100644 Binary files a/public/images/emoji/twitter/ice_skate.png and b/public/images/emoji/twitter/ice_skate.png differ diff --git a/public/images/emoji/twitter/icecream.png b/public/images/emoji/twitter/icecream.png index 7093cbd1e4..b1ac286333 100644 Binary files a/public/images/emoji/twitter/icecream.png and b/public/images/emoji/twitter/icecream.png differ diff --git a/public/images/emoji/twitter/iceland.png b/public/images/emoji/twitter/iceland.png index 399f5a4e85..bbe1022fdf 100644 Binary files a/public/images/emoji/twitter/iceland.png and b/public/images/emoji/twitter/iceland.png differ diff --git a/public/images/emoji/twitter/id.png b/public/images/emoji/twitter/id.png index a2c7163505..d2a9c0ac69 100644 Binary files a/public/images/emoji/twitter/id.png and b/public/images/emoji/twitter/id.png differ diff --git a/public/images/emoji/twitter/ideograph_advantage.png b/public/images/emoji/twitter/ideograph_advantage.png index 5d0fd3d9b2..0fdf4db9fd 100644 Binary files a/public/images/emoji/twitter/ideograph_advantage.png and b/public/images/emoji/twitter/ideograph_advantage.png differ diff --git a/public/images/emoji/twitter/imp.png b/public/images/emoji/twitter/imp.png index a42152e8cb..5bc58b3ddd 100644 Binary files a/public/images/emoji/twitter/imp.png and b/public/images/emoji/twitter/imp.png differ diff --git a/public/images/emoji/twitter/inbox_tray.png b/public/images/emoji/twitter/inbox_tray.png index afe867188d..7588c05d17 100644 Binary files a/public/images/emoji/twitter/inbox_tray.png and b/public/images/emoji/twitter/inbox_tray.png differ diff --git a/public/images/emoji/twitter/incoming_envelope.png b/public/images/emoji/twitter/incoming_envelope.png index 2faf6b75b0..4491e98927 100644 Binary files a/public/images/emoji/twitter/incoming_envelope.png and b/public/images/emoji/twitter/incoming_envelope.png differ diff --git a/public/images/emoji/twitter/india.png b/public/images/emoji/twitter/india.png index b95563b787..e237fb1a7e 100644 Binary files a/public/images/emoji/twitter/india.png and b/public/images/emoji/twitter/india.png differ diff --git a/public/images/emoji/twitter/indonesia.png b/public/images/emoji/twitter/indonesia.png index 09e63e6b9f..ab74052019 100644 Binary files a/public/images/emoji/twitter/indonesia.png and b/public/images/emoji/twitter/indonesia.png differ diff --git a/public/images/emoji/twitter/infinity.png b/public/images/emoji/twitter/infinity.png new file mode 100644 index 0000000000..778e87b2e4 Binary files /dev/null and b/public/images/emoji/twitter/infinity.png differ diff --git a/public/images/emoji/twitter/information_desk_person.png b/public/images/emoji/twitter/information_desk_person.png index 03f5030410..7d947fe533 100644 Binary files a/public/images/emoji/twitter/information_desk_person.png and b/public/images/emoji/twitter/information_desk_person.png differ diff --git a/public/images/emoji/twitter/information_source.png b/public/images/emoji/twitter/information_source.png index b5fef15f8d..ce3754b4e9 100644 Binary files a/public/images/emoji/twitter/information_source.png and b/public/images/emoji/twitter/information_source.png differ diff --git a/public/images/emoji/twitter/innocent.png b/public/images/emoji/twitter/innocent.png index 5cb5888fc1..dba5194ea6 100644 Binary files a/public/images/emoji/twitter/innocent.png and b/public/images/emoji/twitter/innocent.png differ diff --git a/public/images/emoji/twitter/interrobang.png b/public/images/emoji/twitter/interrobang.png index 3c7893dac2..c5304bf141 100644 Binary files a/public/images/emoji/twitter/interrobang.png and b/public/images/emoji/twitter/interrobang.png differ diff --git a/public/images/emoji/twitter/iphone.png b/public/images/emoji/twitter/iphone.png index 66512c75d8..535bfaddb7 100644 Binary files a/public/images/emoji/twitter/iphone.png and b/public/images/emoji/twitter/iphone.png differ diff --git a/public/images/emoji/twitter/iran.png b/public/images/emoji/twitter/iran.png index e30df4c1f5..728b0c817a 100644 Binary files a/public/images/emoji/twitter/iran.png and b/public/images/emoji/twitter/iran.png differ diff --git a/public/images/emoji/twitter/iraq.png b/public/images/emoji/twitter/iraq.png index cccd140ba3..81de697331 100644 Binary files a/public/images/emoji/twitter/iraq.png and b/public/images/emoji/twitter/iraq.png differ diff --git a/public/images/emoji/twitter/ireland.png b/public/images/emoji/twitter/ireland.png index b97ecbcbd4..3d908bd857 100644 Binary files a/public/images/emoji/twitter/ireland.png and b/public/images/emoji/twitter/ireland.png differ diff --git a/public/images/emoji/twitter/island.png b/public/images/emoji/twitter/island.png index 2d2e8919ff..c8a6edaab0 100644 Binary files a/public/images/emoji/twitter/island.png and b/public/images/emoji/twitter/island.png differ diff --git a/public/images/emoji/twitter/isle_of_man.png b/public/images/emoji/twitter/isle_of_man.png index 7829f538f8..99304fca91 100644 Binary files a/public/images/emoji/twitter/isle_of_man.png and b/public/images/emoji/twitter/isle_of_man.png differ diff --git a/public/images/emoji/twitter/israel.png b/public/images/emoji/twitter/israel.png index f7bc67925d..33e880aa19 100644 Binary files a/public/images/emoji/twitter/israel.png and b/public/images/emoji/twitter/israel.png differ diff --git a/public/images/emoji/twitter/it.png b/public/images/emoji/twitter/it.png index 13bbb1b1f8..589002bb34 100644 Binary files a/public/images/emoji/twitter/it.png and b/public/images/emoji/twitter/it.png differ diff --git a/public/images/emoji/twitter/izakaya_lantern.png b/public/images/emoji/twitter/izakaya_lantern.png index 28fb9c8ed2..a6e883285d 100644 Binary files a/public/images/emoji/twitter/izakaya_lantern.png and b/public/images/emoji/twitter/izakaya_lantern.png differ diff --git a/public/images/emoji/twitter/jack_o_lantern.png b/public/images/emoji/twitter/jack_o_lantern.png index 66651e49b7..3e68cb5290 100644 Binary files a/public/images/emoji/twitter/jack_o_lantern.png and b/public/images/emoji/twitter/jack_o_lantern.png differ diff --git a/public/images/emoji/twitter/jamaica.png b/public/images/emoji/twitter/jamaica.png index dc2c807511..2a48a73a5e 100644 Binary files a/public/images/emoji/twitter/jamaica.png and b/public/images/emoji/twitter/jamaica.png differ diff --git a/public/images/emoji/twitter/japan.png b/public/images/emoji/twitter/japan.png index 283666100c..b223c92c0b 100644 Binary files a/public/images/emoji/twitter/japan.png and b/public/images/emoji/twitter/japan.png differ diff --git a/public/images/emoji/twitter/japanese_castle.png b/public/images/emoji/twitter/japanese_castle.png index 0bed2c95c2..3819a53812 100644 Binary files a/public/images/emoji/twitter/japanese_castle.png and b/public/images/emoji/twitter/japanese_castle.png differ diff --git a/public/images/emoji/twitter/japanese_goblin.png b/public/images/emoji/twitter/japanese_goblin.png index e1f040623f..7108bf3623 100644 Binary files a/public/images/emoji/twitter/japanese_goblin.png and b/public/images/emoji/twitter/japanese_goblin.png differ diff --git a/public/images/emoji/twitter/japanese_ogre.png b/public/images/emoji/twitter/japanese_ogre.png index 77d35ce126..d799db8b75 100644 Binary files a/public/images/emoji/twitter/japanese_ogre.png and b/public/images/emoji/twitter/japanese_ogre.png differ diff --git a/public/images/emoji/twitter/jeans.png b/public/images/emoji/twitter/jeans.png index 94a93c06e0..44713902ee 100644 Binary files a/public/images/emoji/twitter/jeans.png and b/public/images/emoji/twitter/jeans.png differ diff --git a/public/images/emoji/twitter/jersey.png b/public/images/emoji/twitter/jersey.png index adfdbc3c1a..bc974c1272 100644 Binary files a/public/images/emoji/twitter/jersey.png and b/public/images/emoji/twitter/jersey.png differ diff --git a/public/images/emoji/twitter/jigsaw.png b/public/images/emoji/twitter/jigsaw.png new file mode 100644 index 0000000000..3039cfa0a3 Binary files /dev/null and b/public/images/emoji/twitter/jigsaw.png differ diff --git a/public/images/emoji/twitter/jordan.png b/public/images/emoji/twitter/jordan.png index 43a2f9139f..8f70256926 100644 Binary files a/public/images/emoji/twitter/jordan.png and b/public/images/emoji/twitter/jordan.png differ diff --git a/public/images/emoji/twitter/joy.png b/public/images/emoji/twitter/joy.png index eaa38f615a..e1113e8e3f 100644 Binary files a/public/images/emoji/twitter/joy.png and b/public/images/emoji/twitter/joy.png differ diff --git a/public/images/emoji/twitter/joy_cat.png b/public/images/emoji/twitter/joy_cat.png index 9f541c69f2..f3e18e16fe 100644 Binary files a/public/images/emoji/twitter/joy_cat.png and b/public/images/emoji/twitter/joy_cat.png differ diff --git a/public/images/emoji/twitter/joystick.png b/public/images/emoji/twitter/joystick.png index 8e5c09d59b..3d70b20889 100644 Binary files a/public/images/emoji/twitter/joystick.png and b/public/images/emoji/twitter/joystick.png differ diff --git a/public/images/emoji/twitter/jp.png b/public/images/emoji/twitter/jp.png index cca79ffb9d..dd515aa063 100644 Binary files a/public/images/emoji/twitter/jp.png and b/public/images/emoji/twitter/jp.png differ diff --git a/public/images/emoji/twitter/kaaba.png b/public/images/emoji/twitter/kaaba.png index 73219d28c1..89899e709d 100644 Binary files a/public/images/emoji/twitter/kaaba.png and b/public/images/emoji/twitter/kaaba.png differ diff --git a/public/images/emoji/twitter/kangaroo.png b/public/images/emoji/twitter/kangaroo.png new file mode 100644 index 0000000000..40444a28e8 Binary files /dev/null and b/public/images/emoji/twitter/kangaroo.png differ diff --git a/public/images/emoji/twitter/kazakhstan.png b/public/images/emoji/twitter/kazakhstan.png index 731858e2cf..d7e3401def 100644 Binary files a/public/images/emoji/twitter/kazakhstan.png and b/public/images/emoji/twitter/kazakhstan.png differ diff --git a/public/images/emoji/twitter/kenya.png b/public/images/emoji/twitter/kenya.png index cc55fd6981..468ab957ac 100644 Binary files a/public/images/emoji/twitter/kenya.png and b/public/images/emoji/twitter/kenya.png differ diff --git a/public/images/emoji/twitter/key.png b/public/images/emoji/twitter/key.png index 94e9e00230..7b1d7807dd 100644 Binary files a/public/images/emoji/twitter/key.png and b/public/images/emoji/twitter/key.png differ diff --git a/public/images/emoji/twitter/key2.png b/public/images/emoji/twitter/key2.png index 18b9399432..e38e31fcb0 100644 Binary files a/public/images/emoji/twitter/key2.png and b/public/images/emoji/twitter/key2.png differ diff --git a/public/images/emoji/twitter/keyboard.png b/public/images/emoji/twitter/keyboard.png index a16457d533..22a0a7dbce 100644 Binary files a/public/images/emoji/twitter/keyboard.png and b/public/images/emoji/twitter/keyboard.png differ diff --git a/public/images/emoji/twitter/keycap_star.png b/public/images/emoji/twitter/keycap_star.png index 2bfefce2be..85e9f0c1b4 100644 Binary files a/public/images/emoji/twitter/keycap_star.png and b/public/images/emoji/twitter/keycap_star.png differ diff --git a/public/images/emoji/twitter/keycap_ten.png b/public/images/emoji/twitter/keycap_ten.png index 77727fec80..bc4b0fd18b 100644 Binary files a/public/images/emoji/twitter/keycap_ten.png and b/public/images/emoji/twitter/keycap_ten.png differ diff --git a/public/images/emoji/twitter/kick_scooter.png b/public/images/emoji/twitter/kick_scooter.png index f04615710f..e295628a9f 100644 Binary files a/public/images/emoji/twitter/kick_scooter.png and b/public/images/emoji/twitter/kick_scooter.png differ diff --git a/public/images/emoji/twitter/kimono.png b/public/images/emoji/twitter/kimono.png index 10610f889f..1c3d46b183 100644 Binary files a/public/images/emoji/twitter/kimono.png and b/public/images/emoji/twitter/kimono.png differ diff --git a/public/images/emoji/twitter/kiribati.png b/public/images/emoji/twitter/kiribati.png index 138fd3f2b5..ee10d01349 100644 Binary files a/public/images/emoji/twitter/kiribati.png and b/public/images/emoji/twitter/kiribati.png differ diff --git a/public/images/emoji/twitter/kiss.png b/public/images/emoji/twitter/kiss.png index f5bfa3d3c5..cd60966cbf 100644 Binary files a/public/images/emoji/twitter/kiss.png and b/public/images/emoji/twitter/kiss.png differ diff --git a/public/images/emoji/twitter/kissing.png b/public/images/emoji/twitter/kissing.png index a95585467f..22c9bd93b5 100644 Binary files a/public/images/emoji/twitter/kissing.png and b/public/images/emoji/twitter/kissing.png differ diff --git a/public/images/emoji/twitter/kissing_cat.png b/public/images/emoji/twitter/kissing_cat.png index ca752f4ae2..7ee1b8d315 100644 Binary files a/public/images/emoji/twitter/kissing_cat.png and b/public/images/emoji/twitter/kissing_cat.png differ diff --git a/public/images/emoji/twitter/kissing_closed_eyes.png b/public/images/emoji/twitter/kissing_closed_eyes.png index 32e0e5642b..43e50ee9cf 100644 Binary files a/public/images/emoji/twitter/kissing_closed_eyes.png and b/public/images/emoji/twitter/kissing_closed_eyes.png differ diff --git a/public/images/emoji/twitter/kissing_heart.png b/public/images/emoji/twitter/kissing_heart.png index 6313639a3b..f5c93bb7a6 100644 Binary files a/public/images/emoji/twitter/kissing_heart.png and b/public/images/emoji/twitter/kissing_heart.png differ diff --git a/public/images/emoji/twitter/kissing_smiling_eyes.png b/public/images/emoji/twitter/kissing_smiling_eyes.png index 633126c96f..0118638138 100644 Binary files a/public/images/emoji/twitter/kissing_smiling_eyes.png and b/public/images/emoji/twitter/kissing_smiling_eyes.png differ diff --git a/public/images/emoji/twitter/kiwi_fruit.png b/public/images/emoji/twitter/kiwi_fruit.png index 1abebdab60..3ba423b22f 100644 Binary files a/public/images/emoji/twitter/kiwi_fruit.png and b/public/images/emoji/twitter/kiwi_fruit.png differ diff --git a/public/images/emoji/twitter/knife.png b/public/images/emoji/twitter/knife.png index a7425d8c39..46794f850c 100644 Binary files a/public/images/emoji/twitter/knife.png and b/public/images/emoji/twitter/knife.png differ diff --git a/public/images/emoji/twitter/koala.png b/public/images/emoji/twitter/koala.png index 45da85c1fe..fad7941a07 100644 Binary files a/public/images/emoji/twitter/koala.png and b/public/images/emoji/twitter/koala.png differ diff --git a/public/images/emoji/twitter/koko.png b/public/images/emoji/twitter/koko.png index 8497b7f9ce..31952eaf9e 100644 Binary files a/public/images/emoji/twitter/koko.png and b/public/images/emoji/twitter/koko.png differ diff --git a/public/images/emoji/twitter/kosovo.png b/public/images/emoji/twitter/kosovo.png index efea0b70bd..043e9b514d 100644 Binary files a/public/images/emoji/twitter/kosovo.png and b/public/images/emoji/twitter/kosovo.png differ diff --git a/public/images/emoji/twitter/kr.png b/public/images/emoji/twitter/kr.png index 82486f8812..8ff7ccd3ff 100644 Binary files a/public/images/emoji/twitter/kr.png and b/public/images/emoji/twitter/kr.png differ diff --git a/public/images/emoji/twitter/kuwait.png b/public/images/emoji/twitter/kuwait.png index 32b00e4806..37c5cd60dd 100644 Binary files a/public/images/emoji/twitter/kuwait.png and b/public/images/emoji/twitter/kuwait.png differ diff --git a/public/images/emoji/twitter/kyrgyzstan.png b/public/images/emoji/twitter/kyrgyzstan.png index 6ecfc717c9..d1173028eb 100644 Binary files a/public/images/emoji/twitter/kyrgyzstan.png and b/public/images/emoji/twitter/kyrgyzstan.png differ diff --git a/public/images/emoji/twitter/lab_coat.png b/public/images/emoji/twitter/lab_coat.png new file mode 100644 index 0000000000..fcce6d1f47 Binary files /dev/null and b/public/images/emoji/twitter/lab_coat.png differ diff --git a/public/images/emoji/twitter/label.png b/public/images/emoji/twitter/label.png index 36f91eb31c..b32a229123 100644 Binary files a/public/images/emoji/twitter/label.png and b/public/images/emoji/twitter/label.png differ diff --git a/public/images/emoji/twitter/lacrosse.png b/public/images/emoji/twitter/lacrosse.png new file mode 100644 index 0000000000..c4209eef02 Binary files /dev/null and b/public/images/emoji/twitter/lacrosse.png differ diff --git a/public/images/emoji/twitter/laos.png b/public/images/emoji/twitter/laos.png index 5dca502f80..44f5e8da70 100644 Binary files a/public/images/emoji/twitter/laos.png and b/public/images/emoji/twitter/laos.png differ diff --git a/public/images/emoji/twitter/large_blue_circle.png b/public/images/emoji/twitter/large_blue_circle.png index ebb8454285..de9927d965 100644 Binary files a/public/images/emoji/twitter/large_blue_circle.png and b/public/images/emoji/twitter/large_blue_circle.png differ diff --git a/public/images/emoji/twitter/large_blue_diamond.png b/public/images/emoji/twitter/large_blue_diamond.png index 967ce3a059..9c2363d71b 100644 Binary files a/public/images/emoji/twitter/large_blue_diamond.png and b/public/images/emoji/twitter/large_blue_diamond.png differ diff --git a/public/images/emoji/twitter/large_orange_diamond.png b/public/images/emoji/twitter/large_orange_diamond.png index f3001bd709..71b8e82da7 100644 Binary files a/public/images/emoji/twitter/large_orange_diamond.png and b/public/images/emoji/twitter/large_orange_diamond.png differ diff --git a/public/images/emoji/twitter/last_quarter_moon.png b/public/images/emoji/twitter/last_quarter_moon.png index a8ce1493ca..ecf8a151c5 100644 Binary files a/public/images/emoji/twitter/last_quarter_moon.png and b/public/images/emoji/twitter/last_quarter_moon.png differ diff --git a/public/images/emoji/twitter/last_quarter_moon_with_face.png b/public/images/emoji/twitter/last_quarter_moon_with_face.png index 7a31d13484..c83627cc2b 100644 Binary files a/public/images/emoji/twitter/last_quarter_moon_with_face.png and b/public/images/emoji/twitter/last_quarter_moon_with_face.png differ diff --git a/public/images/emoji/twitter/latin_cross.png b/public/images/emoji/twitter/latin_cross.png index f11e296dd9..ddb604a4b7 100644 Binary files a/public/images/emoji/twitter/latin_cross.png and b/public/images/emoji/twitter/latin_cross.png differ diff --git a/public/images/emoji/twitter/latvia.png b/public/images/emoji/twitter/latvia.png index a23d4c4e2e..627b031561 100644 Binary files a/public/images/emoji/twitter/latvia.png and b/public/images/emoji/twitter/latvia.png differ diff --git a/public/images/emoji/twitter/laughing.png b/public/images/emoji/twitter/laughing.png index 2632d89749..957f711b6d 100644 Binary files a/public/images/emoji/twitter/laughing.png and b/public/images/emoji/twitter/laughing.png differ diff --git a/public/images/emoji/twitter/leafy_green.png b/public/images/emoji/twitter/leafy_green.png new file mode 100644 index 0000000000..31601f0505 Binary files /dev/null and b/public/images/emoji/twitter/leafy_green.png differ diff --git a/public/images/emoji/twitter/leaves.png b/public/images/emoji/twitter/leaves.png index 2ba7484259..c43a538a0e 100644 Binary files a/public/images/emoji/twitter/leaves.png and b/public/images/emoji/twitter/leaves.png differ diff --git a/public/images/emoji/twitter/lebanon.png b/public/images/emoji/twitter/lebanon.png index 5b8710dfd7..f506228dd6 100644 Binary files a/public/images/emoji/twitter/lebanon.png and b/public/images/emoji/twitter/lebanon.png differ diff --git a/public/images/emoji/twitter/ledger.png b/public/images/emoji/twitter/ledger.png index 4254116157..d4ba357a59 100644 Binary files a/public/images/emoji/twitter/ledger.png and b/public/images/emoji/twitter/ledger.png differ diff --git a/public/images/emoji/twitter/left_luggage.png b/public/images/emoji/twitter/left_luggage.png index fa49f0ecbd..4133968d71 100644 Binary files a/public/images/emoji/twitter/left_luggage.png and b/public/images/emoji/twitter/left_luggage.png differ diff --git a/public/images/emoji/twitter/left_right_arrow.png b/public/images/emoji/twitter/left_right_arrow.png index 87bc8c8a1b..d0cb730c83 100644 Binary files a/public/images/emoji/twitter/left_right_arrow.png and b/public/images/emoji/twitter/left_right_arrow.png differ diff --git a/public/images/emoji/twitter/left_speech_bubble.png b/public/images/emoji/twitter/left_speech_bubble.png index 8cb3b728e0..ee9daef15e 100644 Binary files a/public/images/emoji/twitter/left_speech_bubble.png and b/public/images/emoji/twitter/left_speech_bubble.png differ diff --git a/public/images/emoji/twitter/leftwards_arrow_with_hook.png b/public/images/emoji/twitter/leftwards_arrow_with_hook.png index df1515b475..1df93e6906 100644 Binary files a/public/images/emoji/twitter/leftwards_arrow_with_hook.png and b/public/images/emoji/twitter/leftwards_arrow_with_hook.png differ diff --git a/public/images/emoji/twitter/leg.png b/public/images/emoji/twitter/leg.png new file mode 100644 index 0000000000..b0087b4926 Binary files /dev/null and b/public/images/emoji/twitter/leg.png differ diff --git a/public/images/emoji/twitter/lemon.png b/public/images/emoji/twitter/lemon.png index 263a61ad0f..78b6f953d0 100644 Binary files a/public/images/emoji/twitter/lemon.png and b/public/images/emoji/twitter/lemon.png differ diff --git a/public/images/emoji/twitter/leo.png b/public/images/emoji/twitter/leo.png index 66a13b19f6..a1009e9a0d 100644 Binary files a/public/images/emoji/twitter/leo.png and b/public/images/emoji/twitter/leo.png differ diff --git a/public/images/emoji/twitter/leopard.png b/public/images/emoji/twitter/leopard.png index 06e75164b0..590e710a15 100644 Binary files a/public/images/emoji/twitter/leopard.png and b/public/images/emoji/twitter/leopard.png differ diff --git a/public/images/emoji/twitter/lesotho.png b/public/images/emoji/twitter/lesotho.png index 136ea59d3d..77c7544679 100644 Binary files a/public/images/emoji/twitter/lesotho.png and b/public/images/emoji/twitter/lesotho.png differ diff --git a/public/images/emoji/twitter/level_slider.png b/public/images/emoji/twitter/level_slider.png index d7c8408ead..9b013eed6a 100644 Binary files a/public/images/emoji/twitter/level_slider.png and b/public/images/emoji/twitter/level_slider.png differ diff --git a/public/images/emoji/twitter/levitate.png b/public/images/emoji/twitter/levitate.png index 5231c708a0..c03dcfc6b6 100644 Binary files a/public/images/emoji/twitter/levitate.png and b/public/images/emoji/twitter/levitate.png differ diff --git a/public/images/emoji/twitter/liberia.png b/public/images/emoji/twitter/liberia.png index 2828cee4c8..8ed6a5a877 100644 Binary files a/public/images/emoji/twitter/liberia.png and b/public/images/emoji/twitter/liberia.png differ diff --git a/public/images/emoji/twitter/libra.png b/public/images/emoji/twitter/libra.png index 5e241d9011..f06a78cf2e 100644 Binary files a/public/images/emoji/twitter/libra.png and b/public/images/emoji/twitter/libra.png differ diff --git a/public/images/emoji/twitter/libya.png b/public/images/emoji/twitter/libya.png index a6c90e15d4..426e9319db 100644 Binary files a/public/images/emoji/twitter/libya.png and b/public/images/emoji/twitter/libya.png differ diff --git a/public/images/emoji/twitter/liechtenstein.png b/public/images/emoji/twitter/liechtenstein.png index 93605ebfd5..20f3bb9ada 100644 Binary files a/public/images/emoji/twitter/liechtenstein.png and b/public/images/emoji/twitter/liechtenstein.png differ diff --git a/public/images/emoji/twitter/lifter.png b/public/images/emoji/twitter/lifter.png index be0473304d..06058abc7f 100644 Binary files a/public/images/emoji/twitter/lifter.png and b/public/images/emoji/twitter/lifter.png differ diff --git a/public/images/emoji/twitter/light_rail.png b/public/images/emoji/twitter/light_rail.png index a1653394fc..dae854c0d8 100644 Binary files a/public/images/emoji/twitter/light_rail.png and b/public/images/emoji/twitter/light_rail.png differ diff --git a/public/images/emoji/twitter/link.png b/public/images/emoji/twitter/link.png index 98646f7852..89c78eb63f 100644 Binary files a/public/images/emoji/twitter/link.png and b/public/images/emoji/twitter/link.png differ diff --git a/public/images/emoji/twitter/linked_paperclips.png b/public/images/emoji/twitter/linked_paperclips.png index b4080878f6..048cde6fb8 100644 Binary files a/public/images/emoji/twitter/linked_paperclips.png and b/public/images/emoji/twitter/linked_paperclips.png differ diff --git a/public/images/emoji/twitter/lion.png b/public/images/emoji/twitter/lion.png index aace4fa00b..9c7fa8c833 100644 Binary files a/public/images/emoji/twitter/lion.png and b/public/images/emoji/twitter/lion.png differ diff --git a/public/images/emoji/twitter/lion_face.png b/public/images/emoji/twitter/lion_face.png index aace4fa00b..9c7fa8c833 100644 Binary files a/public/images/emoji/twitter/lion_face.png and b/public/images/emoji/twitter/lion_face.png differ diff --git a/public/images/emoji/twitter/lips.png b/public/images/emoji/twitter/lips.png index 8c792a1f85..903afb345c 100644 Binary files a/public/images/emoji/twitter/lips.png and b/public/images/emoji/twitter/lips.png differ diff --git a/public/images/emoji/twitter/lipstick.png b/public/images/emoji/twitter/lipstick.png index d245f32302..f5ec93a704 100644 Binary files a/public/images/emoji/twitter/lipstick.png and b/public/images/emoji/twitter/lipstick.png differ diff --git a/public/images/emoji/twitter/lithuania.png b/public/images/emoji/twitter/lithuania.png index d4e7e6766a..a8a8aeece7 100644 Binary files a/public/images/emoji/twitter/lithuania.png and b/public/images/emoji/twitter/lithuania.png differ diff --git a/public/images/emoji/twitter/lizard.png b/public/images/emoji/twitter/lizard.png index 302081914b..dc7b028272 100644 Binary files a/public/images/emoji/twitter/lizard.png and b/public/images/emoji/twitter/lizard.png differ diff --git a/public/images/emoji/twitter/llama.png b/public/images/emoji/twitter/llama.png new file mode 100644 index 0000000000..d43ae19ae1 Binary files /dev/null and b/public/images/emoji/twitter/llama.png differ diff --git a/public/images/emoji/twitter/lobster.png b/public/images/emoji/twitter/lobster.png new file mode 100644 index 0000000000..17f50fa439 Binary files /dev/null and b/public/images/emoji/twitter/lobster.png differ diff --git a/public/images/emoji/twitter/lock.png b/public/images/emoji/twitter/lock.png index 15bef7d078..4a91357b5a 100644 Binary files a/public/images/emoji/twitter/lock.png and b/public/images/emoji/twitter/lock.png differ diff --git a/public/images/emoji/twitter/lock_with_ink_pen.png b/public/images/emoji/twitter/lock_with_ink_pen.png index d849c87192..dba3e1ea9e 100644 Binary files a/public/images/emoji/twitter/lock_with_ink_pen.png and b/public/images/emoji/twitter/lock_with_ink_pen.png differ diff --git a/public/images/emoji/twitter/lollipop.png b/public/images/emoji/twitter/lollipop.png index 6a436dcb63..d87f8e1f4f 100644 Binary files a/public/images/emoji/twitter/lollipop.png and b/public/images/emoji/twitter/lollipop.png differ diff --git a/public/images/emoji/twitter/loop.png b/public/images/emoji/twitter/loop.png index f9e9290a0f..e01c0c2dd6 100644 Binary files a/public/images/emoji/twitter/loop.png and b/public/images/emoji/twitter/loop.png differ diff --git a/public/images/emoji/twitter/lotion_bottle.png b/public/images/emoji/twitter/lotion_bottle.png new file mode 100644 index 0000000000..48684bc139 Binary files /dev/null and b/public/images/emoji/twitter/lotion_bottle.png differ diff --git a/public/images/emoji/twitter/loud_sound.png b/public/images/emoji/twitter/loud_sound.png index 4ea14e9eeb..16a3b36e06 100644 Binary files a/public/images/emoji/twitter/loud_sound.png and b/public/images/emoji/twitter/loud_sound.png differ diff --git a/public/images/emoji/twitter/loudspeaker.png b/public/images/emoji/twitter/loudspeaker.png index 710b5c0668..7dd304837b 100644 Binary files a/public/images/emoji/twitter/loudspeaker.png and b/public/images/emoji/twitter/loudspeaker.png differ diff --git a/public/images/emoji/twitter/love_hotel.png b/public/images/emoji/twitter/love_hotel.png index 53ab884a76..59f9f08e60 100644 Binary files a/public/images/emoji/twitter/love_hotel.png and b/public/images/emoji/twitter/love_hotel.png differ diff --git a/public/images/emoji/twitter/love_letter.png b/public/images/emoji/twitter/love_letter.png index 52f62ad159..edaa9ac596 100644 Binary files a/public/images/emoji/twitter/love_letter.png and b/public/images/emoji/twitter/love_letter.png differ diff --git a/public/images/emoji/twitter/love_you_gesture.png b/public/images/emoji/twitter/love_you_gesture.png index 14ef7c72b2..c9dd359430 100644 Binary files a/public/images/emoji/twitter/love_you_gesture.png and b/public/images/emoji/twitter/love_you_gesture.png differ diff --git a/public/images/emoji/twitter/low_brightness.png b/public/images/emoji/twitter/low_brightness.png index bcd7b18696..5a2249c260 100644 Binary files a/public/images/emoji/twitter/low_brightness.png and b/public/images/emoji/twitter/low_brightness.png differ diff --git a/public/images/emoji/twitter/lower_left_ballpoint_pen.png b/public/images/emoji/twitter/lower_left_ballpoint_pen.png index 6219ae26cc..3958a3d0d6 100644 Binary files a/public/images/emoji/twitter/lower_left_ballpoint_pen.png and b/public/images/emoji/twitter/lower_left_ballpoint_pen.png differ diff --git a/public/images/emoji/twitter/lower_left_crayon.png b/public/images/emoji/twitter/lower_left_crayon.png index 0ad5b02c2d..ffa2e36762 100644 Binary files a/public/images/emoji/twitter/lower_left_crayon.png and b/public/images/emoji/twitter/lower_left_crayon.png differ diff --git a/public/images/emoji/twitter/lower_left_fountain_pen.png b/public/images/emoji/twitter/lower_left_fountain_pen.png index 96584c9f57..39b1f567da 100644 Binary files a/public/images/emoji/twitter/lower_left_fountain_pen.png and b/public/images/emoji/twitter/lower_left_fountain_pen.png differ diff --git a/public/images/emoji/twitter/lower_left_paintbrush.png b/public/images/emoji/twitter/lower_left_paintbrush.png index c7d649a378..16f127c8fd 100644 Binary files a/public/images/emoji/twitter/lower_left_paintbrush.png and b/public/images/emoji/twitter/lower_left_paintbrush.png differ diff --git a/public/images/emoji/twitter/luggage.png b/public/images/emoji/twitter/luggage.png new file mode 100644 index 0000000000..1da11d48c5 Binary files /dev/null and b/public/images/emoji/twitter/luggage.png differ diff --git a/public/images/emoji/twitter/luxembourg.png b/public/images/emoji/twitter/luxembourg.png index a8c6737d1b..c2c49482b0 100644 Binary files a/public/images/emoji/twitter/luxembourg.png and b/public/images/emoji/twitter/luxembourg.png differ diff --git a/public/images/emoji/twitter/lying_face.png b/public/images/emoji/twitter/lying_face.png index e31e547296..98fc089012 100644 Binary files a/public/images/emoji/twitter/lying_face.png and b/public/images/emoji/twitter/lying_face.png differ diff --git a/public/images/emoji/twitter/m.png b/public/images/emoji/twitter/m.png index cfd35e566e..64e209fd09 100644 Binary files a/public/images/emoji/twitter/m.png and b/public/images/emoji/twitter/m.png differ diff --git a/public/images/emoji/twitter/macau.png b/public/images/emoji/twitter/macau.png index 70620e1d54..2fe5c8cb83 100644 Binary files a/public/images/emoji/twitter/macau.png and b/public/images/emoji/twitter/macau.png differ diff --git a/public/images/emoji/twitter/macedonia.png b/public/images/emoji/twitter/macedonia.png index a4c8ef41d2..379bb4a3d7 100644 Binary files a/public/images/emoji/twitter/macedonia.png and b/public/images/emoji/twitter/macedonia.png differ diff --git a/public/images/emoji/twitter/madagascar.png b/public/images/emoji/twitter/madagascar.png index 708ec7416c..09e5f33936 100644 Binary files a/public/images/emoji/twitter/madagascar.png and b/public/images/emoji/twitter/madagascar.png differ diff --git a/public/images/emoji/twitter/mag.png b/public/images/emoji/twitter/mag.png index 3f7a09edcc..a70f609eaa 100644 Binary files a/public/images/emoji/twitter/mag.png and b/public/images/emoji/twitter/mag.png differ diff --git a/public/images/emoji/twitter/mag_right.png b/public/images/emoji/twitter/mag_right.png index b490e1e14b..81a7af4870 100644 Binary files a/public/images/emoji/twitter/mag_right.png and b/public/images/emoji/twitter/mag_right.png differ diff --git a/public/images/emoji/twitter/mage.png b/public/images/emoji/twitter/mage.png index 71c1b13f92..604d0e4968 100644 Binary files a/public/images/emoji/twitter/mage.png and b/public/images/emoji/twitter/mage.png differ diff --git a/public/images/emoji/twitter/magnet.png b/public/images/emoji/twitter/magnet.png new file mode 100644 index 0000000000..6cbe88e681 Binary files /dev/null and b/public/images/emoji/twitter/magnet.png differ diff --git a/public/images/emoji/twitter/mahjong.png b/public/images/emoji/twitter/mahjong.png index 1cb30fe6cb..57454d0335 100644 Binary files a/public/images/emoji/twitter/mahjong.png and b/public/images/emoji/twitter/mahjong.png differ diff --git a/public/images/emoji/twitter/mailbox.png b/public/images/emoji/twitter/mailbox.png index 3cf1938454..e93a77709e 100644 Binary files a/public/images/emoji/twitter/mailbox.png and b/public/images/emoji/twitter/mailbox.png differ diff --git a/public/images/emoji/twitter/mailbox_closed.png b/public/images/emoji/twitter/mailbox_closed.png index 53d797b5a9..54f12b9376 100644 Binary files a/public/images/emoji/twitter/mailbox_closed.png and b/public/images/emoji/twitter/mailbox_closed.png differ diff --git a/public/images/emoji/twitter/mailbox_with_mail.png b/public/images/emoji/twitter/mailbox_with_mail.png index a6e9af05f6..cfe3a287f7 100644 Binary files a/public/images/emoji/twitter/mailbox_with_mail.png and b/public/images/emoji/twitter/mailbox_with_mail.png differ diff --git a/public/images/emoji/twitter/mailbox_with_no_mail.png b/public/images/emoji/twitter/mailbox_with_no_mail.png index 18eeb43495..38e0b34dc2 100644 Binary files a/public/images/emoji/twitter/mailbox_with_no_mail.png and b/public/images/emoji/twitter/mailbox_with_no_mail.png differ diff --git a/public/images/emoji/twitter/malawi.png b/public/images/emoji/twitter/malawi.png index 854fd4ce85..bc81407e00 100644 Binary files a/public/images/emoji/twitter/malawi.png and b/public/images/emoji/twitter/malawi.png differ diff --git a/public/images/emoji/twitter/malaysia.png b/public/images/emoji/twitter/malaysia.png index 13137b15ad..108dd99dac 100644 Binary files a/public/images/emoji/twitter/malaysia.png and b/public/images/emoji/twitter/malaysia.png differ diff --git a/public/images/emoji/twitter/maldives.png b/public/images/emoji/twitter/maldives.png index e0fec7e04b..c666d7ae6d 100644 Binary files a/public/images/emoji/twitter/maldives.png and b/public/images/emoji/twitter/maldives.png differ diff --git a/public/images/emoji/twitter/male_couple_with_heart.png b/public/images/emoji/twitter/male_couple_with_heart.png index 56d8afc89a..3748948536 100644 Binary files a/public/images/emoji/twitter/male_couple_with_heart.png and b/public/images/emoji/twitter/male_couple_with_heart.png differ diff --git a/public/images/emoji/twitter/male_couplekiss.png b/public/images/emoji/twitter/male_couplekiss.png index 2de6d98e2f..f503d82991 100644 Binary files a/public/images/emoji/twitter/male_couplekiss.png and b/public/images/emoji/twitter/male_couplekiss.png differ diff --git a/public/images/emoji/twitter/male_detective.png b/public/images/emoji/twitter/male_detective.png index 587e506d98..785d67d45f 100644 Binary files a/public/images/emoji/twitter/male_detective.png and b/public/images/emoji/twitter/male_detective.png differ diff --git a/public/images/emoji/twitter/mali.png b/public/images/emoji/twitter/mali.png index ef19c197c7..d7db7397c1 100644 Binary files a/public/images/emoji/twitter/mali.png and b/public/images/emoji/twitter/mali.png differ diff --git a/public/images/emoji/twitter/malta.png b/public/images/emoji/twitter/malta.png index f6850d6276..5cc7d787d5 100644 Binary files a/public/images/emoji/twitter/malta.png and b/public/images/emoji/twitter/malta.png differ diff --git a/public/images/emoji/twitter/man.png b/public/images/emoji/twitter/man.png index 6c53f4e21e..2910d7b3b5 100644 Binary files a/public/images/emoji/twitter/man.png and b/public/images/emoji/twitter/man.png differ diff --git a/public/images/emoji/twitter/man_artist.png b/public/images/emoji/twitter/man_artist.png index 1cc6650697..00af96eb89 100644 Binary files a/public/images/emoji/twitter/man_artist.png and b/public/images/emoji/twitter/man_artist.png differ diff --git a/public/images/emoji/twitter/man_astronaut.png b/public/images/emoji/twitter/man_astronaut.png index 3248c7ea4b..42fa72258a 100644 Binary files a/public/images/emoji/twitter/man_astronaut.png and b/public/images/emoji/twitter/man_astronaut.png differ diff --git a/public/images/emoji/twitter/man_bald.png b/public/images/emoji/twitter/man_bald.png new file mode 100644 index 0000000000..8e3a838506 Binary files /dev/null and b/public/images/emoji/twitter/man_bald.png differ diff --git a/public/images/emoji/twitter/man_cartwheeling.png b/public/images/emoji/twitter/man_cartwheeling.png index aaf7c70f74..95fe0e4924 100644 Binary files a/public/images/emoji/twitter/man_cartwheeling.png and b/public/images/emoji/twitter/man_cartwheeling.png differ diff --git a/public/images/emoji/twitter/man_cook.png b/public/images/emoji/twitter/man_cook.png index 8fb843406f..c4ea54916f 100644 Binary files a/public/images/emoji/twitter/man_cook.png and b/public/images/emoji/twitter/man_cook.png differ diff --git a/public/images/emoji/twitter/man_curly_haired.png b/public/images/emoji/twitter/man_curly_haired.png new file mode 100644 index 0000000000..6c1396b114 Binary files /dev/null and b/public/images/emoji/twitter/man_curly_haired.png differ diff --git a/public/images/emoji/twitter/man_dancing.png b/public/images/emoji/twitter/man_dancing.png index f3f2a5b04c..8c824a2c3f 100644 Binary files a/public/images/emoji/twitter/man_dancing.png and b/public/images/emoji/twitter/man_dancing.png differ diff --git a/public/images/emoji/twitter/man_facepalming.png b/public/images/emoji/twitter/man_facepalming.png index c819f4029a..f2ab512add 100644 Binary files a/public/images/emoji/twitter/man_facepalming.png and b/public/images/emoji/twitter/man_facepalming.png differ diff --git a/public/images/emoji/twitter/man_factory_worker.png b/public/images/emoji/twitter/man_factory_worker.png index 4f8d7b6339..e934a5ada3 100644 Binary files a/public/images/emoji/twitter/man_factory_worker.png and b/public/images/emoji/twitter/man_factory_worker.png differ diff --git a/public/images/emoji/twitter/man_farmer.png b/public/images/emoji/twitter/man_farmer.png index a275fe56a7..4e19aff530 100644 Binary files a/public/images/emoji/twitter/man_farmer.png and b/public/images/emoji/twitter/man_farmer.png differ diff --git a/public/images/emoji/twitter/man_firefighter.png b/public/images/emoji/twitter/man_firefighter.png index a43787bc20..07fa090b4f 100644 Binary files a/public/images/emoji/twitter/man_firefighter.png and b/public/images/emoji/twitter/man_firefighter.png differ diff --git a/public/images/emoji/twitter/man_health_worker.png b/public/images/emoji/twitter/man_health_worker.png index 266219eec1..0155f25b7b 100644 Binary files a/public/images/emoji/twitter/man_health_worker.png and b/public/images/emoji/twitter/man_health_worker.png differ diff --git a/public/images/emoji/twitter/man_in_business_suit_levitating.png b/public/images/emoji/twitter/man_in_business_suit_levitating.png index 5231c708a0..c03dcfc6b6 100644 Binary files a/public/images/emoji/twitter/man_in_business_suit_levitating.png and b/public/images/emoji/twitter/man_in_business_suit_levitating.png differ diff --git a/public/images/emoji/twitter/man_in_tuxedo.png b/public/images/emoji/twitter/man_in_tuxedo.png index 68a5498555..44f327a162 100644 Binary files a/public/images/emoji/twitter/man_in_tuxedo.png and b/public/images/emoji/twitter/man_in_tuxedo.png differ diff --git a/public/images/emoji/twitter/man_judge.png b/public/images/emoji/twitter/man_judge.png index b20c0cd734..ffba6a5cc3 100644 Binary files a/public/images/emoji/twitter/man_judge.png and b/public/images/emoji/twitter/man_judge.png differ diff --git a/public/images/emoji/twitter/man_juggling.png b/public/images/emoji/twitter/man_juggling.png index d6cc6a380d..555d35ccd9 100644 Binary files a/public/images/emoji/twitter/man_juggling.png and b/public/images/emoji/twitter/man_juggling.png differ diff --git a/public/images/emoji/twitter/man_mechanic.png b/public/images/emoji/twitter/man_mechanic.png index df912ad255..d731a12c7c 100644 Binary files a/public/images/emoji/twitter/man_mechanic.png and b/public/images/emoji/twitter/man_mechanic.png differ diff --git a/public/images/emoji/twitter/man_office_worker.png b/public/images/emoji/twitter/man_office_worker.png index 641784af02..a3cd19b053 100644 Binary files a/public/images/emoji/twitter/man_office_worker.png and b/public/images/emoji/twitter/man_office_worker.png differ diff --git a/public/images/emoji/twitter/man_pilot.png b/public/images/emoji/twitter/man_pilot.png index 196949a366..9f7bbb145f 100644 Binary files a/public/images/emoji/twitter/man_pilot.png and b/public/images/emoji/twitter/man_pilot.png differ diff --git a/public/images/emoji/twitter/man_playing_handball.png b/public/images/emoji/twitter/man_playing_handball.png index 8d9964cf03..5b93b6ad6e 100644 Binary files a/public/images/emoji/twitter/man_playing_handball.png and b/public/images/emoji/twitter/man_playing_handball.png differ diff --git a/public/images/emoji/twitter/man_playing_water_polo.png b/public/images/emoji/twitter/man_playing_water_polo.png index 14bc7c68d1..b0c8a9e364 100644 Binary files a/public/images/emoji/twitter/man_playing_water_polo.png and b/public/images/emoji/twitter/man_playing_water_polo.png differ diff --git a/public/images/emoji/twitter/man_red_haired.png b/public/images/emoji/twitter/man_red_haired.png new file mode 100644 index 0000000000..4d5ef0e840 Binary files /dev/null and b/public/images/emoji/twitter/man_red_haired.png differ diff --git a/public/images/emoji/twitter/man_scientist.png b/public/images/emoji/twitter/man_scientist.png index af1f36d1cd..10d2db918c 100644 Binary files a/public/images/emoji/twitter/man_scientist.png and b/public/images/emoji/twitter/man_scientist.png differ diff --git a/public/images/emoji/twitter/man_shrugging.png b/public/images/emoji/twitter/man_shrugging.png index 61e00fd0b0..65b6386414 100644 Binary files a/public/images/emoji/twitter/man_shrugging.png and b/public/images/emoji/twitter/man_shrugging.png differ diff --git a/public/images/emoji/twitter/man_singer.png b/public/images/emoji/twitter/man_singer.png index f3df881028..e45c0323b4 100644 Binary files a/public/images/emoji/twitter/man_singer.png and b/public/images/emoji/twitter/man_singer.png differ diff --git a/public/images/emoji/twitter/man_student.png b/public/images/emoji/twitter/man_student.png index 897c8af412..c8a472a648 100644 Binary files a/public/images/emoji/twitter/man_student.png and b/public/images/emoji/twitter/man_student.png differ diff --git a/public/images/emoji/twitter/man_superhero.png b/public/images/emoji/twitter/man_superhero.png new file mode 100644 index 0000000000..9082575ce9 Binary files /dev/null and b/public/images/emoji/twitter/man_superhero.png differ diff --git a/public/images/emoji/twitter/man_supervillain.png b/public/images/emoji/twitter/man_supervillain.png new file mode 100644 index 0000000000..634a3f4920 Binary files /dev/null and b/public/images/emoji/twitter/man_supervillain.png differ diff --git a/public/images/emoji/twitter/man_teacher.png b/public/images/emoji/twitter/man_teacher.png index b85d905466..9af7e86d7a 100644 Binary files a/public/images/emoji/twitter/man_teacher.png and b/public/images/emoji/twitter/man_teacher.png differ diff --git a/public/images/emoji/twitter/man_technologist.png b/public/images/emoji/twitter/man_technologist.png index 4d8208bbe1..b55ddcb360 100644 Binary files a/public/images/emoji/twitter/man_technologist.png and b/public/images/emoji/twitter/man_technologist.png differ diff --git a/public/images/emoji/twitter/man_white_haired.png b/public/images/emoji/twitter/man_white_haired.png new file mode 100644 index 0000000000..f31b3a078c Binary files /dev/null and b/public/images/emoji/twitter/man_white_haired.png differ diff --git a/public/images/emoji/twitter/man_with_gua_pi_mao.png b/public/images/emoji/twitter/man_with_gua_pi_mao.png index 79b9ed91ff..eaac3cf449 100644 Binary files a/public/images/emoji/twitter/man_with_gua_pi_mao.png and b/public/images/emoji/twitter/man_with_gua_pi_mao.png differ diff --git a/public/images/emoji/twitter/man_with_turban.png b/public/images/emoji/twitter/man_with_turban.png index ca077edb9f..e49f4a159d 100644 Binary files a/public/images/emoji/twitter/man_with_turban.png and b/public/images/emoji/twitter/man_with_turban.png differ diff --git a/public/images/emoji/twitter/mango.png b/public/images/emoji/twitter/mango.png new file mode 100644 index 0000000000..96d630c7bf Binary files /dev/null and b/public/images/emoji/twitter/mango.png differ diff --git a/public/images/emoji/twitter/mans_shoe.png b/public/images/emoji/twitter/mans_shoe.png index b6b7b28701..44b9a2dc73 100644 Binary files a/public/images/emoji/twitter/mans_shoe.png and b/public/images/emoji/twitter/mans_shoe.png differ diff --git a/public/images/emoji/twitter/mantelpiece_clock.png b/public/images/emoji/twitter/mantelpiece_clock.png index 62a0e89459..d46583a38f 100644 Binary files a/public/images/emoji/twitter/mantelpiece_clock.png and b/public/images/emoji/twitter/mantelpiece_clock.png differ diff --git a/public/images/emoji/twitter/map.png b/public/images/emoji/twitter/map.png index 8c102ea49d..c03959d257 100644 Binary files a/public/images/emoji/twitter/map.png and b/public/images/emoji/twitter/map.png differ diff --git a/public/images/emoji/twitter/maple_leaf.png b/public/images/emoji/twitter/maple_leaf.png index 5afc3c1e4e..3eadf4bcfa 100644 Binary files a/public/images/emoji/twitter/maple_leaf.png and b/public/images/emoji/twitter/maple_leaf.png differ diff --git a/public/images/emoji/twitter/marshall_islands.png b/public/images/emoji/twitter/marshall_islands.png index 35a77d3ec6..6b69a8d551 100644 Binary files a/public/images/emoji/twitter/marshall_islands.png and b/public/images/emoji/twitter/marshall_islands.png differ diff --git a/public/images/emoji/twitter/martial_arts_uniform.png b/public/images/emoji/twitter/martial_arts_uniform.png index 50e9d87cd5..30fee1e368 100644 Binary files a/public/images/emoji/twitter/martial_arts_uniform.png and b/public/images/emoji/twitter/martial_arts_uniform.png differ diff --git a/public/images/emoji/twitter/martinique.png b/public/images/emoji/twitter/martinique.png index 20265c357a..aa46f114c2 100644 Binary files a/public/images/emoji/twitter/martinique.png and b/public/images/emoji/twitter/martinique.png differ diff --git a/public/images/emoji/twitter/mask.png b/public/images/emoji/twitter/mask.png index 2488cea0de..1ff3bb81e7 100644 Binary files a/public/images/emoji/twitter/mask.png and b/public/images/emoji/twitter/mask.png differ diff --git a/public/images/emoji/twitter/massage.png b/public/images/emoji/twitter/massage.png index e8364a6f97..6cfa679049 100644 Binary files a/public/images/emoji/twitter/massage.png and b/public/images/emoji/twitter/massage.png differ diff --git a/public/images/emoji/twitter/massage_man.png b/public/images/emoji/twitter/massage_man.png index b2d809725e..abd167ce6a 100644 Binary files a/public/images/emoji/twitter/massage_man.png and b/public/images/emoji/twitter/massage_man.png differ diff --git a/public/images/emoji/twitter/massage_woman.png b/public/images/emoji/twitter/massage_woman.png index e8364a6f97..6cfa679049 100644 Binary files a/public/images/emoji/twitter/massage_woman.png and b/public/images/emoji/twitter/massage_woman.png differ diff --git a/public/images/emoji/twitter/mauritania.png b/public/images/emoji/twitter/mauritania.png index 23fa26e4ce..e9767976cf 100644 Binary files a/public/images/emoji/twitter/mauritania.png and b/public/images/emoji/twitter/mauritania.png differ diff --git a/public/images/emoji/twitter/mauritius.png b/public/images/emoji/twitter/mauritius.png index 846272e367..04d339cd1b 100644 Binary files a/public/images/emoji/twitter/mauritius.png and b/public/images/emoji/twitter/mauritius.png differ diff --git a/public/images/emoji/twitter/mayotte.png b/public/images/emoji/twitter/mayotte.png index 43a7879d24..642b133c08 100644 Binary files a/public/images/emoji/twitter/mayotte.png and b/public/images/emoji/twitter/mayotte.png differ diff --git a/public/images/emoji/twitter/meat_on_bone.png b/public/images/emoji/twitter/meat_on_bone.png index 8e7f0fedbe..cf2b070df1 100644 Binary files a/public/images/emoji/twitter/meat_on_bone.png and b/public/images/emoji/twitter/meat_on_bone.png differ diff --git a/public/images/emoji/twitter/medal.png b/public/images/emoji/twitter/medal.png index 57fbc8512f..5417b3251b 100644 Binary files a/public/images/emoji/twitter/medal.png and b/public/images/emoji/twitter/medal.png differ diff --git a/public/images/emoji/twitter/medal_military.png b/public/images/emoji/twitter/medal_military.png index 857488da67..ca543aa07c 100644 Binary files a/public/images/emoji/twitter/medal_military.png and b/public/images/emoji/twitter/medal_military.png differ diff --git a/public/images/emoji/twitter/medal_sports.png b/public/images/emoji/twitter/medal_sports.png index 57fbc8512f..5417b3251b 100644 Binary files a/public/images/emoji/twitter/medal_sports.png and b/public/images/emoji/twitter/medal_sports.png differ diff --git a/public/images/emoji/twitter/mega.png b/public/images/emoji/twitter/mega.png index 3224f29417..718aa2f627 100644 Binary files a/public/images/emoji/twitter/mega.png and b/public/images/emoji/twitter/mega.png differ diff --git a/public/images/emoji/twitter/melon.png b/public/images/emoji/twitter/melon.png index ee09a13fd1..4ead598af8 100644 Binary files a/public/images/emoji/twitter/melon.png and b/public/images/emoji/twitter/melon.png differ diff --git a/public/images/emoji/twitter/memo.png b/public/images/emoji/twitter/memo.png index 9cefdba7eb..7d3ac834be 100644 Binary files a/public/images/emoji/twitter/memo.png and b/public/images/emoji/twitter/memo.png differ diff --git a/public/images/emoji/twitter/men_wrestling.png b/public/images/emoji/twitter/men_wrestling.png index ab63e2f4f0..259c87e7c1 100644 Binary files a/public/images/emoji/twitter/men_wrestling.png and b/public/images/emoji/twitter/men_wrestling.png differ diff --git a/public/images/emoji/twitter/menorah.png b/public/images/emoji/twitter/menorah.png index fe2a128793..4e031b2e13 100644 Binary files a/public/images/emoji/twitter/menorah.png and b/public/images/emoji/twitter/menorah.png differ diff --git a/public/images/emoji/twitter/mens.png b/public/images/emoji/twitter/mens.png index cf452ae48d..ea42e7ff64 100644 Binary files a/public/images/emoji/twitter/mens.png and b/public/images/emoji/twitter/mens.png differ diff --git a/public/images/emoji/twitter/mermaid.png b/public/images/emoji/twitter/mermaid.png index ee1b999e0d..9418465ed4 100644 Binary files a/public/images/emoji/twitter/mermaid.png and b/public/images/emoji/twitter/mermaid.png differ diff --git a/public/images/emoji/twitter/merman.png b/public/images/emoji/twitter/merman.png index ab9e191536..cae53f4d68 100644 Binary files a/public/images/emoji/twitter/merman.png and b/public/images/emoji/twitter/merman.png differ diff --git a/public/images/emoji/twitter/metal.png b/public/images/emoji/twitter/metal.png index 72d987aadc..e8718d1494 100644 Binary files a/public/images/emoji/twitter/metal.png and b/public/images/emoji/twitter/metal.png differ diff --git a/public/images/emoji/twitter/metro.png b/public/images/emoji/twitter/metro.png index 3121a36afa..41dd7ba5d7 100644 Binary files a/public/images/emoji/twitter/metro.png and b/public/images/emoji/twitter/metro.png differ diff --git a/public/images/emoji/twitter/mexico.png b/public/images/emoji/twitter/mexico.png index 95e838852b..61775bf729 100644 Binary files a/public/images/emoji/twitter/mexico.png and b/public/images/emoji/twitter/mexico.png differ diff --git a/public/images/emoji/twitter/microbe.png b/public/images/emoji/twitter/microbe.png new file mode 100644 index 0000000000..1b687cbe7b Binary files /dev/null and b/public/images/emoji/twitter/microbe.png differ diff --git a/public/images/emoji/twitter/micronesia.png b/public/images/emoji/twitter/micronesia.png index 549d03fdc7..0fc25e88f9 100644 Binary files a/public/images/emoji/twitter/micronesia.png and b/public/images/emoji/twitter/micronesia.png differ diff --git a/public/images/emoji/twitter/microphone.png b/public/images/emoji/twitter/microphone.png index bb4de70715..123d2673c9 100644 Binary files a/public/images/emoji/twitter/microphone.png and b/public/images/emoji/twitter/microphone.png differ diff --git a/public/images/emoji/twitter/microphone2.png b/public/images/emoji/twitter/microphone2.png index d10b32281f..8574cb4b2d 100644 Binary files a/public/images/emoji/twitter/microphone2.png and b/public/images/emoji/twitter/microphone2.png differ diff --git a/public/images/emoji/twitter/microscope.png b/public/images/emoji/twitter/microscope.png index e1c985062c..aad8ecd371 100644 Binary files a/public/images/emoji/twitter/microscope.png and b/public/images/emoji/twitter/microscope.png differ diff --git a/public/images/emoji/twitter/middle_finger.png b/public/images/emoji/twitter/middle_finger.png index 8e7fce2f49..9b5de31144 100644 Binary files a/public/images/emoji/twitter/middle_finger.png and b/public/images/emoji/twitter/middle_finger.png differ diff --git a/public/images/emoji/twitter/military_medal.png b/public/images/emoji/twitter/military_medal.png index 857488da67..ca543aa07c 100644 Binary files a/public/images/emoji/twitter/military_medal.png and b/public/images/emoji/twitter/military_medal.png differ diff --git a/public/images/emoji/twitter/milk_glass.png b/public/images/emoji/twitter/milk_glass.png index d2de8252bb..2416c2434b 100644 Binary files a/public/images/emoji/twitter/milk_glass.png and b/public/images/emoji/twitter/milk_glass.png differ diff --git a/public/images/emoji/twitter/milky_way.png b/public/images/emoji/twitter/milky_way.png index 80d626a4cc..1a8566bc6a 100644 Binary files a/public/images/emoji/twitter/milky_way.png and b/public/images/emoji/twitter/milky_way.png differ diff --git a/public/images/emoji/twitter/minibus.png b/public/images/emoji/twitter/minibus.png index 936d739bc1..bb4b4d925b 100644 Binary files a/public/images/emoji/twitter/minibus.png and b/public/images/emoji/twitter/minibus.png differ diff --git a/public/images/emoji/twitter/minidisc.png b/public/images/emoji/twitter/minidisc.png index 78fd10044d..56e974f863 100644 Binary files a/public/images/emoji/twitter/minidisc.png and b/public/images/emoji/twitter/minidisc.png differ diff --git a/public/images/emoji/twitter/mobile_phone_off.png b/public/images/emoji/twitter/mobile_phone_off.png index 7a6666ebea..abc1b821be 100644 Binary files a/public/images/emoji/twitter/mobile_phone_off.png and b/public/images/emoji/twitter/mobile_phone_off.png differ diff --git a/public/images/emoji/twitter/moldova.png b/public/images/emoji/twitter/moldova.png index d4463a0147..4852033fce 100644 Binary files a/public/images/emoji/twitter/moldova.png and b/public/images/emoji/twitter/moldova.png differ diff --git a/public/images/emoji/twitter/monaco.png b/public/images/emoji/twitter/monaco.png index 17833f535a..4f57a0405c 100644 Binary files a/public/images/emoji/twitter/monaco.png and b/public/images/emoji/twitter/monaco.png differ diff --git a/public/images/emoji/twitter/money_mouth.png b/public/images/emoji/twitter/money_mouth.png index cd2459518e..e392e769dd 100644 Binary files a/public/images/emoji/twitter/money_mouth.png and b/public/images/emoji/twitter/money_mouth.png differ diff --git a/public/images/emoji/twitter/money_mouth_face.png b/public/images/emoji/twitter/money_mouth_face.png index cd2459518e..e392e769dd 100644 Binary files a/public/images/emoji/twitter/money_mouth_face.png and b/public/images/emoji/twitter/money_mouth_face.png differ diff --git a/public/images/emoji/twitter/money_with_wings.png b/public/images/emoji/twitter/money_with_wings.png index 53121e555a..1e1f55ecc1 100644 Binary files a/public/images/emoji/twitter/money_with_wings.png and b/public/images/emoji/twitter/money_with_wings.png differ diff --git a/public/images/emoji/twitter/moneybag.png b/public/images/emoji/twitter/moneybag.png index 76531a4e67..8b2e49b859 100644 Binary files a/public/images/emoji/twitter/moneybag.png and b/public/images/emoji/twitter/moneybag.png differ diff --git a/public/images/emoji/twitter/mongolia.png b/public/images/emoji/twitter/mongolia.png index cf97894508..7f2225c80b 100644 Binary files a/public/images/emoji/twitter/mongolia.png and b/public/images/emoji/twitter/mongolia.png differ diff --git a/public/images/emoji/twitter/monkey.png b/public/images/emoji/twitter/monkey.png index deb60541b3..cf52ab1518 100644 Binary files a/public/images/emoji/twitter/monkey.png and b/public/images/emoji/twitter/monkey.png differ diff --git a/public/images/emoji/twitter/monkey_face.png b/public/images/emoji/twitter/monkey_face.png index 77f6e15786..0ce67572c9 100644 Binary files a/public/images/emoji/twitter/monkey_face.png and b/public/images/emoji/twitter/monkey_face.png differ diff --git a/public/images/emoji/twitter/monorail.png b/public/images/emoji/twitter/monorail.png index 78acdf4f5b..6f7df07bdd 100644 Binary files a/public/images/emoji/twitter/monorail.png and b/public/images/emoji/twitter/monorail.png differ diff --git a/public/images/emoji/twitter/montenegro.png b/public/images/emoji/twitter/montenegro.png index 7cbd07cef3..ed5d0c4198 100644 Binary files a/public/images/emoji/twitter/montenegro.png and b/public/images/emoji/twitter/montenegro.png differ diff --git a/public/images/emoji/twitter/montserrat.png b/public/images/emoji/twitter/montserrat.png index 28712de519..fd6b759a34 100644 Binary files a/public/images/emoji/twitter/montserrat.png and b/public/images/emoji/twitter/montserrat.png differ diff --git a/public/images/emoji/twitter/moon.png b/public/images/emoji/twitter/moon.png index 826e38b1b3..941206c2e4 100644 Binary files a/public/images/emoji/twitter/moon.png and b/public/images/emoji/twitter/moon.png differ diff --git a/public/images/emoji/twitter/moon_cake.png b/public/images/emoji/twitter/moon_cake.png new file mode 100644 index 0000000000..409640aa73 Binary files /dev/null and b/public/images/emoji/twitter/moon_cake.png differ diff --git a/public/images/emoji/twitter/morocco.png b/public/images/emoji/twitter/morocco.png index 7f16d0a66d..10d4d98ba7 100644 Binary files a/public/images/emoji/twitter/morocco.png and b/public/images/emoji/twitter/morocco.png differ diff --git a/public/images/emoji/twitter/mortar_board.png b/public/images/emoji/twitter/mortar_board.png index 1c2539280c..eaa28fe62c 100644 Binary files a/public/images/emoji/twitter/mortar_board.png and b/public/images/emoji/twitter/mortar_board.png differ diff --git a/public/images/emoji/twitter/mosque.png b/public/images/emoji/twitter/mosque.png index b0a68fffb5..0ffb68aa44 100644 Binary files a/public/images/emoji/twitter/mosque.png and b/public/images/emoji/twitter/mosque.png differ diff --git a/public/images/emoji/twitter/mosquito.png b/public/images/emoji/twitter/mosquito.png new file mode 100644 index 0000000000..325c90ea79 Binary files /dev/null and b/public/images/emoji/twitter/mosquito.png differ diff --git a/public/images/emoji/twitter/motor_boat.png b/public/images/emoji/twitter/motor_boat.png index 3eba365766..e841e34b68 100644 Binary files a/public/images/emoji/twitter/motor_boat.png and b/public/images/emoji/twitter/motor_boat.png differ diff --git a/public/images/emoji/twitter/motor_scooter.png b/public/images/emoji/twitter/motor_scooter.png index b9659e99a3..32549eb3b0 100644 Binary files a/public/images/emoji/twitter/motor_scooter.png and b/public/images/emoji/twitter/motor_scooter.png differ diff --git a/public/images/emoji/twitter/motorboat.png b/public/images/emoji/twitter/motorboat.png index 3eba365766..e841e34b68 100644 Binary files a/public/images/emoji/twitter/motorboat.png and b/public/images/emoji/twitter/motorboat.png differ diff --git a/public/images/emoji/twitter/motorcycle.png b/public/images/emoji/twitter/motorcycle.png index ba7fb373ba..ac675cf4a0 100644 Binary files a/public/images/emoji/twitter/motorcycle.png and b/public/images/emoji/twitter/motorcycle.png differ diff --git a/public/images/emoji/twitter/motorway.png b/public/images/emoji/twitter/motorway.png index 2d5622664b..50d3dca2b1 100644 Binary files a/public/images/emoji/twitter/motorway.png and b/public/images/emoji/twitter/motorway.png differ diff --git a/public/images/emoji/twitter/mount_fuji.png b/public/images/emoji/twitter/mount_fuji.png index f3048fe89b..491a268a2a 100644 Binary files a/public/images/emoji/twitter/mount_fuji.png and b/public/images/emoji/twitter/mount_fuji.png differ diff --git a/public/images/emoji/twitter/mountain.png b/public/images/emoji/twitter/mountain.png index 6b545f0058..b65ee2d0f1 100644 Binary files a/public/images/emoji/twitter/mountain.png and b/public/images/emoji/twitter/mountain.png differ diff --git a/public/images/emoji/twitter/mountain_bicyclist.png b/public/images/emoji/twitter/mountain_bicyclist.png index 57a9ff5b9e..402bf39c84 100644 Binary files a/public/images/emoji/twitter/mountain_bicyclist.png and b/public/images/emoji/twitter/mountain_bicyclist.png differ diff --git a/public/images/emoji/twitter/mountain_biking_man.png b/public/images/emoji/twitter/mountain_biking_man.png index 57a9ff5b9e..402bf39c84 100644 Binary files a/public/images/emoji/twitter/mountain_biking_man.png and b/public/images/emoji/twitter/mountain_biking_man.png differ diff --git a/public/images/emoji/twitter/mountain_biking_woman.png b/public/images/emoji/twitter/mountain_biking_woman.png index f752e9cdf3..442571a93a 100644 Binary files a/public/images/emoji/twitter/mountain_biking_woman.png and b/public/images/emoji/twitter/mountain_biking_woman.png differ diff --git a/public/images/emoji/twitter/mountain_cableway.png b/public/images/emoji/twitter/mountain_cableway.png index 22651ca203..3fdf51e6d7 100644 Binary files a/public/images/emoji/twitter/mountain_cableway.png and b/public/images/emoji/twitter/mountain_cableway.png differ diff --git a/public/images/emoji/twitter/mountain_railway.png b/public/images/emoji/twitter/mountain_railway.png index e6c7864250..528a7c90dc 100644 Binary files a/public/images/emoji/twitter/mountain_railway.png and b/public/images/emoji/twitter/mountain_railway.png differ diff --git a/public/images/emoji/twitter/mountain_snow.png b/public/images/emoji/twitter/mountain_snow.png index b3e246f09b..a64401b8e8 100644 Binary files a/public/images/emoji/twitter/mountain_snow.png and b/public/images/emoji/twitter/mountain_snow.png differ diff --git a/public/images/emoji/twitter/mouse.png b/public/images/emoji/twitter/mouse.png index 86b89c2fdc..bc5e74885a 100644 Binary files a/public/images/emoji/twitter/mouse.png and b/public/images/emoji/twitter/mouse.png differ diff --git a/public/images/emoji/twitter/mouse2.png b/public/images/emoji/twitter/mouse2.png index e3e5558f4a..e2509b0729 100644 Binary files a/public/images/emoji/twitter/mouse2.png and b/public/images/emoji/twitter/mouse2.png differ diff --git a/public/images/emoji/twitter/mouse_three_button.png b/public/images/emoji/twitter/mouse_three_button.png index 3a71c800c6..a8c2b82f50 100644 Binary files a/public/images/emoji/twitter/mouse_three_button.png and b/public/images/emoji/twitter/mouse_three_button.png differ diff --git a/public/images/emoji/twitter/movie_camera.png b/public/images/emoji/twitter/movie_camera.png index 767f7c81ff..52539764e8 100644 Binary files a/public/images/emoji/twitter/movie_camera.png and b/public/images/emoji/twitter/movie_camera.png differ diff --git a/public/images/emoji/twitter/moyai.png b/public/images/emoji/twitter/moyai.png index afdea80225..09b71d9ea2 100644 Binary files a/public/images/emoji/twitter/moyai.png and b/public/images/emoji/twitter/moyai.png differ diff --git a/public/images/emoji/twitter/mozambique.png b/public/images/emoji/twitter/mozambique.png index 07d5cd56f0..1a33e0c69e 100644 Binary files a/public/images/emoji/twitter/mozambique.png and b/public/images/emoji/twitter/mozambique.png differ diff --git a/public/images/emoji/twitter/mrs_claus.png b/public/images/emoji/twitter/mrs_claus.png index 1923fbd8e9..56dc794884 100644 Binary files a/public/images/emoji/twitter/mrs_claus.png and b/public/images/emoji/twitter/mrs_claus.png differ diff --git a/public/images/emoji/twitter/muscle.png b/public/images/emoji/twitter/muscle.png index 9d55e38f01..1e195f9099 100644 Binary files a/public/images/emoji/twitter/muscle.png and b/public/images/emoji/twitter/muscle.png differ diff --git a/public/images/emoji/twitter/mushroom.png b/public/images/emoji/twitter/mushroom.png index 47a2bfb3ee..c9009b6551 100644 Binary files a/public/images/emoji/twitter/mushroom.png and b/public/images/emoji/twitter/mushroom.png differ diff --git a/public/images/emoji/twitter/musical_keyboard.png b/public/images/emoji/twitter/musical_keyboard.png index fcc417d6c0..0aea780ea5 100644 Binary files a/public/images/emoji/twitter/musical_keyboard.png and b/public/images/emoji/twitter/musical_keyboard.png differ diff --git a/public/images/emoji/twitter/musical_note.png b/public/images/emoji/twitter/musical_note.png index ad3b1615f7..dde36d4f98 100644 Binary files a/public/images/emoji/twitter/musical_note.png and b/public/images/emoji/twitter/musical_note.png differ diff --git a/public/images/emoji/twitter/musical_score.png b/public/images/emoji/twitter/musical_score.png index f84f6a3124..dc684b91a8 100644 Binary files a/public/images/emoji/twitter/musical_score.png and b/public/images/emoji/twitter/musical_score.png differ diff --git a/public/images/emoji/twitter/mute.png b/public/images/emoji/twitter/mute.png index 9e3b2b8e21..bad0c7b26c 100644 Binary files a/public/images/emoji/twitter/mute.png and b/public/images/emoji/twitter/mute.png differ diff --git a/public/images/emoji/twitter/myanmar.png b/public/images/emoji/twitter/myanmar.png index 345829e2a3..42d00994e2 100644 Binary files a/public/images/emoji/twitter/myanmar.png and b/public/images/emoji/twitter/myanmar.png differ diff --git a/public/images/emoji/twitter/nail_care.png b/public/images/emoji/twitter/nail_care.png index 22044a204b..cba5a05fcf 100644 Binary files a/public/images/emoji/twitter/nail_care.png and b/public/images/emoji/twitter/nail_care.png differ diff --git a/public/images/emoji/twitter/name_badge.png b/public/images/emoji/twitter/name_badge.png index 8697a7d537..fc4a0e50fe 100644 Binary files a/public/images/emoji/twitter/name_badge.png and b/public/images/emoji/twitter/name_badge.png differ diff --git a/public/images/emoji/twitter/namibia.png b/public/images/emoji/twitter/namibia.png index f505b371fd..ba546e8227 100644 Binary files a/public/images/emoji/twitter/namibia.png and b/public/images/emoji/twitter/namibia.png differ diff --git a/public/images/emoji/twitter/national_park.png b/public/images/emoji/twitter/national_park.png index db29d2dff9..478bacc9c3 100644 Binary files a/public/images/emoji/twitter/national_park.png and b/public/images/emoji/twitter/national_park.png differ diff --git a/public/images/emoji/twitter/nauru.png b/public/images/emoji/twitter/nauru.png index 443c1a5e93..1748da9cab 100644 Binary files a/public/images/emoji/twitter/nauru.png and b/public/images/emoji/twitter/nauru.png differ diff --git a/public/images/emoji/twitter/nauseated_face.png b/public/images/emoji/twitter/nauseated_face.png index 0ec48392c2..8a5ba41415 100644 Binary files a/public/images/emoji/twitter/nauseated_face.png and b/public/images/emoji/twitter/nauseated_face.png differ diff --git a/public/images/emoji/twitter/nazar_amulet.png b/public/images/emoji/twitter/nazar_amulet.png new file mode 100644 index 0000000000..a5e55b990f Binary files /dev/null and b/public/images/emoji/twitter/nazar_amulet.png differ diff --git a/public/images/emoji/twitter/necktie.png b/public/images/emoji/twitter/necktie.png index dd887e4870..2e42c6f099 100644 Binary files a/public/images/emoji/twitter/necktie.png and b/public/images/emoji/twitter/necktie.png differ diff --git a/public/images/emoji/twitter/negative_squared_cross_mark.png b/public/images/emoji/twitter/negative_squared_cross_mark.png index 4b433900f2..a96a67c92d 100644 Binary files a/public/images/emoji/twitter/negative_squared_cross_mark.png and b/public/images/emoji/twitter/negative_squared_cross_mark.png differ diff --git a/public/images/emoji/twitter/nepal.png b/public/images/emoji/twitter/nepal.png index cd57822d80..48acf5f2b7 100644 Binary files a/public/images/emoji/twitter/nepal.png and b/public/images/emoji/twitter/nepal.png differ diff --git a/public/images/emoji/twitter/nerd.png b/public/images/emoji/twitter/nerd.png index b844baf25b..ab5b3e9f82 100644 Binary files a/public/images/emoji/twitter/nerd.png and b/public/images/emoji/twitter/nerd.png differ diff --git a/public/images/emoji/twitter/nerd_face.png b/public/images/emoji/twitter/nerd_face.png index b844baf25b..ab5b3e9f82 100644 Binary files a/public/images/emoji/twitter/nerd_face.png and b/public/images/emoji/twitter/nerd_face.png differ diff --git a/public/images/emoji/twitter/netherlands.png b/public/images/emoji/twitter/netherlands.png index 1e37d79d5d..6963f32b59 100644 Binary files a/public/images/emoji/twitter/netherlands.png and b/public/images/emoji/twitter/netherlands.png differ diff --git a/public/images/emoji/twitter/neutral_face.png b/public/images/emoji/twitter/neutral_face.png index d120878e99..17628f9534 100644 Binary files a/public/images/emoji/twitter/neutral_face.png and b/public/images/emoji/twitter/neutral_face.png differ diff --git a/public/images/emoji/twitter/new.png b/public/images/emoji/twitter/new.png index 3043b9f793..9c0693701c 100644 Binary files a/public/images/emoji/twitter/new.png and b/public/images/emoji/twitter/new.png differ diff --git a/public/images/emoji/twitter/new_caledonia.png b/public/images/emoji/twitter/new_caledonia.png index 45914c48c7..325fce6fcc 100644 Binary files a/public/images/emoji/twitter/new_caledonia.png and b/public/images/emoji/twitter/new_caledonia.png differ diff --git a/public/images/emoji/twitter/new_moon.png b/public/images/emoji/twitter/new_moon.png index 826e38b1b3..941206c2e4 100644 Binary files a/public/images/emoji/twitter/new_moon.png and b/public/images/emoji/twitter/new_moon.png differ diff --git a/public/images/emoji/twitter/new_moon_with_face.png b/public/images/emoji/twitter/new_moon_with_face.png index f4aa3f3320..b7c0767032 100644 Binary files a/public/images/emoji/twitter/new_moon_with_face.png and b/public/images/emoji/twitter/new_moon_with_face.png differ diff --git a/public/images/emoji/twitter/new_zealand.png b/public/images/emoji/twitter/new_zealand.png index 9ab60df7b7..753db4eb2a 100644 Binary files a/public/images/emoji/twitter/new_zealand.png and b/public/images/emoji/twitter/new_zealand.png differ diff --git a/public/images/emoji/twitter/newspaper.png b/public/images/emoji/twitter/newspaper.png index 70b1aaf3bd..fe60a8f36c 100644 Binary files a/public/images/emoji/twitter/newspaper.png and b/public/images/emoji/twitter/newspaper.png differ diff --git a/public/images/emoji/twitter/newspaper2.png b/public/images/emoji/twitter/newspaper2.png index 052dcce75f..51b0392c01 100644 Binary files a/public/images/emoji/twitter/newspaper2.png and b/public/images/emoji/twitter/newspaper2.png differ diff --git a/public/images/emoji/twitter/newspaper_roll.png b/public/images/emoji/twitter/newspaper_roll.png index 052dcce75f..51b0392c01 100644 Binary files a/public/images/emoji/twitter/newspaper_roll.png and b/public/images/emoji/twitter/newspaper_roll.png differ diff --git a/public/images/emoji/twitter/next_track.png b/public/images/emoji/twitter/next_track.png index 13953da5d7..a69200295c 100644 Binary files a/public/images/emoji/twitter/next_track.png and b/public/images/emoji/twitter/next_track.png differ diff --git a/public/images/emoji/twitter/next_track_button.png b/public/images/emoji/twitter/next_track_button.png index 13953da5d7..a69200295c 100644 Binary files a/public/images/emoji/twitter/next_track_button.png and b/public/images/emoji/twitter/next_track_button.png differ diff --git a/public/images/emoji/twitter/ng.png b/public/images/emoji/twitter/ng.png index ab8234e77e..fb3b7baee7 100644 Binary files a/public/images/emoji/twitter/ng.png and b/public/images/emoji/twitter/ng.png differ diff --git a/public/images/emoji/twitter/nicaragua.png b/public/images/emoji/twitter/nicaragua.png index e405151e2d..0906eeb4e7 100644 Binary files a/public/images/emoji/twitter/nicaragua.png and b/public/images/emoji/twitter/nicaragua.png differ diff --git a/public/images/emoji/twitter/niger.png b/public/images/emoji/twitter/niger.png index fb6c4a4d37..6249ba305f 100644 Binary files a/public/images/emoji/twitter/niger.png and b/public/images/emoji/twitter/niger.png differ diff --git a/public/images/emoji/twitter/nigeria.png b/public/images/emoji/twitter/nigeria.png index 23c9d9a762..6cbb424d3d 100644 Binary files a/public/images/emoji/twitter/nigeria.png and b/public/images/emoji/twitter/nigeria.png differ diff --git a/public/images/emoji/twitter/night_with_stars.png b/public/images/emoji/twitter/night_with_stars.png index eb2f416dee..4d0d89d404 100644 Binary files a/public/images/emoji/twitter/night_with_stars.png and b/public/images/emoji/twitter/night_with_stars.png differ diff --git a/public/images/emoji/twitter/nine.png b/public/images/emoji/twitter/nine.png index ff2bfa73c3..c3fa3eedcd 100644 Binary files a/public/images/emoji/twitter/nine.png and b/public/images/emoji/twitter/nine.png differ diff --git a/public/images/emoji/twitter/niue.png b/public/images/emoji/twitter/niue.png index daaa26cc16..9bd5ec1ada 100644 Binary files a/public/images/emoji/twitter/niue.png and b/public/images/emoji/twitter/niue.png differ diff --git a/public/images/emoji/twitter/no_bell.png b/public/images/emoji/twitter/no_bell.png index f9971547db..7421cfa06f 100644 Binary files a/public/images/emoji/twitter/no_bell.png and b/public/images/emoji/twitter/no_bell.png differ diff --git a/public/images/emoji/twitter/no_bicycles.png b/public/images/emoji/twitter/no_bicycles.png index 06b01f625a..9d911de7f8 100644 Binary files a/public/images/emoji/twitter/no_bicycles.png and b/public/images/emoji/twitter/no_bicycles.png differ diff --git a/public/images/emoji/twitter/no_entry.png b/public/images/emoji/twitter/no_entry.png index 7bcdf65ec1..d4410559be 100644 Binary files a/public/images/emoji/twitter/no_entry.png and b/public/images/emoji/twitter/no_entry.png differ diff --git a/public/images/emoji/twitter/no_entry_sign.png b/public/images/emoji/twitter/no_entry_sign.png index f723884aa8..43aba4d3fd 100644 Binary files a/public/images/emoji/twitter/no_entry_sign.png and b/public/images/emoji/twitter/no_entry_sign.png differ diff --git a/public/images/emoji/twitter/no_good.png b/public/images/emoji/twitter/no_good.png index 8e7851dcce..1aac7c5d5f 100644 Binary files a/public/images/emoji/twitter/no_good.png and b/public/images/emoji/twitter/no_good.png differ diff --git a/public/images/emoji/twitter/no_good_man.png b/public/images/emoji/twitter/no_good_man.png index 482a4698d1..96771ace5f 100644 Binary files a/public/images/emoji/twitter/no_good_man.png and b/public/images/emoji/twitter/no_good_man.png differ diff --git a/public/images/emoji/twitter/no_good_woman.png b/public/images/emoji/twitter/no_good_woman.png index 8e7851dcce..1aac7c5d5f 100644 Binary files a/public/images/emoji/twitter/no_good_woman.png and b/public/images/emoji/twitter/no_good_woman.png differ diff --git a/public/images/emoji/twitter/no_mobile_phones.png b/public/images/emoji/twitter/no_mobile_phones.png index bbeacfc248..3fe41b355a 100644 Binary files a/public/images/emoji/twitter/no_mobile_phones.png and b/public/images/emoji/twitter/no_mobile_phones.png differ diff --git a/public/images/emoji/twitter/no_mouth.png b/public/images/emoji/twitter/no_mouth.png index 0ea6a5760d..4d7d903a2b 100644 Binary files a/public/images/emoji/twitter/no_mouth.png and b/public/images/emoji/twitter/no_mouth.png differ diff --git a/public/images/emoji/twitter/no_pedestrians.png b/public/images/emoji/twitter/no_pedestrians.png index 03a7652b10..92bfa62a99 100644 Binary files a/public/images/emoji/twitter/no_pedestrians.png and b/public/images/emoji/twitter/no_pedestrians.png differ diff --git a/public/images/emoji/twitter/no_smoking.png b/public/images/emoji/twitter/no_smoking.png index a89ddf2dbf..e6cc79b233 100644 Binary files a/public/images/emoji/twitter/no_smoking.png and b/public/images/emoji/twitter/no_smoking.png differ diff --git a/public/images/emoji/twitter/non-potable_water.png b/public/images/emoji/twitter/non-potable_water.png index 8336a41d9a..41ee54ab9e 100644 Binary files a/public/images/emoji/twitter/non-potable_water.png and b/public/images/emoji/twitter/non-potable_water.png differ diff --git a/public/images/emoji/twitter/norfolk_island.png b/public/images/emoji/twitter/norfolk_island.png index 574acba100..599da68e6b 100644 Binary files a/public/images/emoji/twitter/norfolk_island.png and b/public/images/emoji/twitter/norfolk_island.png differ diff --git a/public/images/emoji/twitter/north_korea.png b/public/images/emoji/twitter/north_korea.png index d15d10aece..7e05f75fc6 100644 Binary files a/public/images/emoji/twitter/north_korea.png and b/public/images/emoji/twitter/north_korea.png differ diff --git a/public/images/emoji/twitter/northern_mariana_islands.png b/public/images/emoji/twitter/northern_mariana_islands.png index 962a6171b9..a581fbf72d 100644 Binary files a/public/images/emoji/twitter/northern_mariana_islands.png and b/public/images/emoji/twitter/northern_mariana_islands.png differ diff --git a/public/images/emoji/twitter/norway.png b/public/images/emoji/twitter/norway.png index 004a11d830..151484e1db 100644 Binary files a/public/images/emoji/twitter/norway.png and b/public/images/emoji/twitter/norway.png differ diff --git a/public/images/emoji/twitter/nose.png b/public/images/emoji/twitter/nose.png index 8bb47186e9..ece7bb8dd8 100644 Binary files a/public/images/emoji/twitter/nose.png and b/public/images/emoji/twitter/nose.png differ diff --git a/public/images/emoji/twitter/notebook.png b/public/images/emoji/twitter/notebook.png index 7c01906362..b516e952b0 100644 Binary files a/public/images/emoji/twitter/notebook.png and b/public/images/emoji/twitter/notebook.png differ diff --git a/public/images/emoji/twitter/notebook_with_decorative_cover.png b/public/images/emoji/twitter/notebook_with_decorative_cover.png index 0fd6e82ee1..27cf8f9ee1 100644 Binary files a/public/images/emoji/twitter/notebook_with_decorative_cover.png and b/public/images/emoji/twitter/notebook_with_decorative_cover.png differ diff --git a/public/images/emoji/twitter/notepad_spiral.png b/public/images/emoji/twitter/notepad_spiral.png index b8ebfe080a..d242e6d90a 100644 Binary files a/public/images/emoji/twitter/notepad_spiral.png and b/public/images/emoji/twitter/notepad_spiral.png differ diff --git a/public/images/emoji/twitter/notes.png b/public/images/emoji/twitter/notes.png index 7b6e995d00..75b6f53721 100644 Binary files a/public/images/emoji/twitter/notes.png and b/public/images/emoji/twitter/notes.png differ diff --git a/public/images/emoji/twitter/nut_and_bolt.png b/public/images/emoji/twitter/nut_and_bolt.png index bf485d6e99..4703011c53 100644 Binary files a/public/images/emoji/twitter/nut_and_bolt.png and b/public/images/emoji/twitter/nut_and_bolt.png differ diff --git a/public/images/emoji/twitter/o.png b/public/images/emoji/twitter/o.png index 2da812f9dc..8106cde260 100644 Binary files a/public/images/emoji/twitter/o.png and b/public/images/emoji/twitter/o.png differ diff --git a/public/images/emoji/twitter/o2.png b/public/images/emoji/twitter/o2.png index f450cd8175..93069c399d 100644 Binary files a/public/images/emoji/twitter/o2.png and b/public/images/emoji/twitter/o2.png differ diff --git a/public/images/emoji/twitter/ocean.png b/public/images/emoji/twitter/ocean.png index 238ed91371..fd9b5589c7 100644 Binary files a/public/images/emoji/twitter/ocean.png and b/public/images/emoji/twitter/ocean.png differ diff --git a/public/images/emoji/twitter/octopus.png b/public/images/emoji/twitter/octopus.png index 6bb3e2a0b5..ea81811bde 100644 Binary files a/public/images/emoji/twitter/octopus.png and b/public/images/emoji/twitter/octopus.png differ diff --git a/public/images/emoji/twitter/oden.png b/public/images/emoji/twitter/oden.png index deae776690..5b10c40b85 100644 Binary files a/public/images/emoji/twitter/oden.png and b/public/images/emoji/twitter/oden.png differ diff --git a/public/images/emoji/twitter/office.png b/public/images/emoji/twitter/office.png index 8c0599fa66..a0bf79dc54 100644 Binary files a/public/images/emoji/twitter/office.png and b/public/images/emoji/twitter/office.png differ diff --git a/public/images/emoji/twitter/oil.png b/public/images/emoji/twitter/oil.png index 7c6d9e728f..32b10f1aa3 100644 Binary files a/public/images/emoji/twitter/oil.png and b/public/images/emoji/twitter/oil.png differ diff --git a/public/images/emoji/twitter/oil_drum.png b/public/images/emoji/twitter/oil_drum.png index 7c6d9e728f..32b10f1aa3 100644 Binary files a/public/images/emoji/twitter/oil_drum.png and b/public/images/emoji/twitter/oil_drum.png differ diff --git a/public/images/emoji/twitter/ok.png b/public/images/emoji/twitter/ok.png index e8ae7f51df..90763be704 100644 Binary files a/public/images/emoji/twitter/ok.png and b/public/images/emoji/twitter/ok.png differ diff --git a/public/images/emoji/twitter/ok_hand.png b/public/images/emoji/twitter/ok_hand.png index 8630c33d36..507e7976eb 100644 Binary files a/public/images/emoji/twitter/ok_hand.png and b/public/images/emoji/twitter/ok_hand.png differ diff --git a/public/images/emoji/twitter/ok_man.png b/public/images/emoji/twitter/ok_man.png index a409be9d6e..94d87d8c28 100644 Binary files a/public/images/emoji/twitter/ok_man.png and b/public/images/emoji/twitter/ok_man.png differ diff --git a/public/images/emoji/twitter/ok_woman.png b/public/images/emoji/twitter/ok_woman.png index 2cdb61d84d..5522740216 100644 Binary files a/public/images/emoji/twitter/ok_woman.png and b/public/images/emoji/twitter/ok_woman.png differ diff --git a/public/images/emoji/twitter/old_key.png b/public/images/emoji/twitter/old_key.png index 18b9399432..e38e31fcb0 100644 Binary files a/public/images/emoji/twitter/old_key.png and b/public/images/emoji/twitter/old_key.png differ diff --git a/public/images/emoji/twitter/older_adult.png b/public/images/emoji/twitter/older_adult.png index 8796829b87..e32b255570 100644 Binary files a/public/images/emoji/twitter/older_adult.png and b/public/images/emoji/twitter/older_adult.png differ diff --git a/public/images/emoji/twitter/older_man.png b/public/images/emoji/twitter/older_man.png index 0953bf4b68..159a2dcabc 100644 Binary files a/public/images/emoji/twitter/older_man.png and b/public/images/emoji/twitter/older_man.png differ diff --git a/public/images/emoji/twitter/older_woman.png b/public/images/emoji/twitter/older_woman.png index 8fe6dc8f16..e9d04f9e69 100644 Binary files a/public/images/emoji/twitter/older_woman.png and b/public/images/emoji/twitter/older_woman.png differ diff --git a/public/images/emoji/twitter/om.png b/public/images/emoji/twitter/om.png index bcd7113141..1b9b93ce02 100644 Binary files a/public/images/emoji/twitter/om.png and b/public/images/emoji/twitter/om.png differ diff --git a/public/images/emoji/twitter/om_symbol.png b/public/images/emoji/twitter/om_symbol.png index bcd7113141..1b9b93ce02 100644 Binary files a/public/images/emoji/twitter/om_symbol.png and b/public/images/emoji/twitter/om_symbol.png differ diff --git a/public/images/emoji/twitter/oman.png b/public/images/emoji/twitter/oman.png index 59e0df087e..1822af946a 100644 Binary files a/public/images/emoji/twitter/oman.png and b/public/images/emoji/twitter/oman.png differ diff --git a/public/images/emoji/twitter/on.png b/public/images/emoji/twitter/on.png index af2da0876d..9fec4f852b 100644 Binary files a/public/images/emoji/twitter/on.png and b/public/images/emoji/twitter/on.png differ diff --git a/public/images/emoji/twitter/oncoming_automobile.png b/public/images/emoji/twitter/oncoming_automobile.png index 2fbf351b83..683c0425ea 100644 Binary files a/public/images/emoji/twitter/oncoming_automobile.png and b/public/images/emoji/twitter/oncoming_automobile.png differ diff --git a/public/images/emoji/twitter/oncoming_bus.png b/public/images/emoji/twitter/oncoming_bus.png index ad73d9041d..e0804b144e 100644 Binary files a/public/images/emoji/twitter/oncoming_bus.png and b/public/images/emoji/twitter/oncoming_bus.png differ diff --git a/public/images/emoji/twitter/oncoming_police_car.png b/public/images/emoji/twitter/oncoming_police_car.png index e0969d0113..1a8c9d742b 100644 Binary files a/public/images/emoji/twitter/oncoming_police_car.png and b/public/images/emoji/twitter/oncoming_police_car.png differ diff --git a/public/images/emoji/twitter/oncoming_taxi.png b/public/images/emoji/twitter/oncoming_taxi.png index 20ac2e2a96..116b2b4364 100644 Binary files a/public/images/emoji/twitter/oncoming_taxi.png and b/public/images/emoji/twitter/oncoming_taxi.png differ diff --git a/public/images/emoji/twitter/one.png b/public/images/emoji/twitter/one.png index 9ebc934a30..1717e9757f 100644 Binary files a/public/images/emoji/twitter/one.png and b/public/images/emoji/twitter/one.png differ diff --git a/public/images/emoji/twitter/open_book.png b/public/images/emoji/twitter/open_book.png index 6f220c4b0b..3655af87a3 100644 Binary files a/public/images/emoji/twitter/open_book.png and b/public/images/emoji/twitter/open_book.png differ diff --git a/public/images/emoji/twitter/open_file_folder.png b/public/images/emoji/twitter/open_file_folder.png index e094a56fa3..a5b05c24e0 100644 Binary files a/public/images/emoji/twitter/open_file_folder.png and b/public/images/emoji/twitter/open_file_folder.png differ diff --git a/public/images/emoji/twitter/open_hands.png b/public/images/emoji/twitter/open_hands.png index 195fc14ac1..9380de4157 100644 Binary files a/public/images/emoji/twitter/open_hands.png and b/public/images/emoji/twitter/open_hands.png differ diff --git a/public/images/emoji/twitter/open_mouth.png b/public/images/emoji/twitter/open_mouth.png index be96806fbd..102ba23d88 100644 Binary files a/public/images/emoji/twitter/open_mouth.png and b/public/images/emoji/twitter/open_mouth.png differ diff --git a/public/images/emoji/twitter/open_umbrella.png b/public/images/emoji/twitter/open_umbrella.png index ec99aeb164..94a1eea680 100644 Binary files a/public/images/emoji/twitter/open_umbrella.png and b/public/images/emoji/twitter/open_umbrella.png differ diff --git a/public/images/emoji/twitter/ophiuchus.png b/public/images/emoji/twitter/ophiuchus.png index 6ab20a8f4b..24fbd8a748 100644 Binary files a/public/images/emoji/twitter/ophiuchus.png and b/public/images/emoji/twitter/ophiuchus.png differ diff --git a/public/images/emoji/twitter/orange_book.png b/public/images/emoji/twitter/orange_book.png index 23f446928d..1526fbfc88 100644 Binary files a/public/images/emoji/twitter/orange_book.png and b/public/images/emoji/twitter/orange_book.png differ diff --git a/public/images/emoji/twitter/orange_heart.png b/public/images/emoji/twitter/orange_heart.png index f217c930a7..dd82255078 100644 Binary files a/public/images/emoji/twitter/orange_heart.png and b/public/images/emoji/twitter/orange_heart.png differ diff --git a/public/images/emoji/twitter/orthodox_cross.png b/public/images/emoji/twitter/orthodox_cross.png index 5b398f5cf2..b9f0e3a866 100644 Binary files a/public/images/emoji/twitter/orthodox_cross.png and b/public/images/emoji/twitter/orthodox_cross.png differ diff --git a/public/images/emoji/twitter/outbox_tray.png b/public/images/emoji/twitter/outbox_tray.png index c26dd23ef5..246875f21d 100644 Binary files a/public/images/emoji/twitter/outbox_tray.png and b/public/images/emoji/twitter/outbox_tray.png differ diff --git a/public/images/emoji/twitter/owl.png b/public/images/emoji/twitter/owl.png index 905115e712..3bcdd6c239 100644 Binary files a/public/images/emoji/twitter/owl.png and b/public/images/emoji/twitter/owl.png differ diff --git a/public/images/emoji/twitter/ox.png b/public/images/emoji/twitter/ox.png index d9ba4840b0..e20bd7d42b 100644 Binary files a/public/images/emoji/twitter/ox.png and b/public/images/emoji/twitter/ox.png differ diff --git a/public/images/emoji/twitter/package.png b/public/images/emoji/twitter/package.png index 44189c349b..7e2bab3d03 100644 Binary files a/public/images/emoji/twitter/package.png and b/public/images/emoji/twitter/package.png differ diff --git a/public/images/emoji/twitter/page_facing_up.png b/public/images/emoji/twitter/page_facing_up.png index 2dd1bb85f3..a726b05706 100644 Binary files a/public/images/emoji/twitter/page_facing_up.png and b/public/images/emoji/twitter/page_facing_up.png differ diff --git a/public/images/emoji/twitter/page_with_curl.png b/public/images/emoji/twitter/page_with_curl.png index 31a59dcf50..4cbfd058f8 100644 Binary files a/public/images/emoji/twitter/page_with_curl.png and b/public/images/emoji/twitter/page_with_curl.png differ diff --git a/public/images/emoji/twitter/pager.png b/public/images/emoji/twitter/pager.png index b4a37b3598..f8fe470d7e 100644 Binary files a/public/images/emoji/twitter/pager.png and b/public/images/emoji/twitter/pager.png differ diff --git a/public/images/emoji/twitter/paintbrush.png b/public/images/emoji/twitter/paintbrush.png index c7d649a378..16f127c8fd 100644 Binary files a/public/images/emoji/twitter/paintbrush.png and b/public/images/emoji/twitter/paintbrush.png differ diff --git a/public/images/emoji/twitter/pakistan.png b/public/images/emoji/twitter/pakistan.png index f4c74d1d49..77b7edf3eb 100644 Binary files a/public/images/emoji/twitter/pakistan.png and b/public/images/emoji/twitter/pakistan.png differ diff --git a/public/images/emoji/twitter/palau.png b/public/images/emoji/twitter/palau.png index 69aace7555..8a7aea6a9d 100644 Binary files a/public/images/emoji/twitter/palau.png and b/public/images/emoji/twitter/palau.png differ diff --git a/public/images/emoji/twitter/palestinian_territories.png b/public/images/emoji/twitter/palestinian_territories.png index 2e4399d762..2c22aef4c7 100644 Binary files a/public/images/emoji/twitter/palestinian_territories.png and b/public/images/emoji/twitter/palestinian_territories.png differ diff --git a/public/images/emoji/twitter/palm_tree.png b/public/images/emoji/twitter/palm_tree.png index 4f431333b5..c21785f256 100644 Binary files a/public/images/emoji/twitter/palm_tree.png and b/public/images/emoji/twitter/palm_tree.png differ diff --git a/public/images/emoji/twitter/palms_up_together.png b/public/images/emoji/twitter/palms_up_together.png index fb66ba11c4..7114175189 100644 Binary files a/public/images/emoji/twitter/palms_up_together.png and b/public/images/emoji/twitter/palms_up_together.png differ diff --git a/public/images/emoji/twitter/panama.png b/public/images/emoji/twitter/panama.png index 2a564db426..72a821c163 100644 Binary files a/public/images/emoji/twitter/panama.png and b/public/images/emoji/twitter/panama.png differ diff --git a/public/images/emoji/twitter/pancakes.png b/public/images/emoji/twitter/pancakes.png index ebd14eecd0..cfed92d339 100644 Binary files a/public/images/emoji/twitter/pancakes.png and b/public/images/emoji/twitter/pancakes.png differ diff --git a/public/images/emoji/twitter/panda_face.png b/public/images/emoji/twitter/panda_face.png index 24934af650..26ce6f69b3 100644 Binary files a/public/images/emoji/twitter/panda_face.png and b/public/images/emoji/twitter/panda_face.png differ diff --git a/public/images/emoji/twitter/paperclip.png b/public/images/emoji/twitter/paperclip.png index eab8b01fa1..65701e6d85 100644 Binary files a/public/images/emoji/twitter/paperclip.png and b/public/images/emoji/twitter/paperclip.png differ diff --git a/public/images/emoji/twitter/paperclips.png b/public/images/emoji/twitter/paperclips.png index b4080878f6..048cde6fb8 100644 Binary files a/public/images/emoji/twitter/paperclips.png and b/public/images/emoji/twitter/paperclips.png differ diff --git a/public/images/emoji/twitter/papua_new_guinea.png b/public/images/emoji/twitter/papua_new_guinea.png index b449d67794..d75762c30a 100644 Binary files a/public/images/emoji/twitter/papua_new_guinea.png and b/public/images/emoji/twitter/papua_new_guinea.png differ diff --git a/public/images/emoji/twitter/paraguay.png b/public/images/emoji/twitter/paraguay.png index d9eab9434c..967fb4cd45 100644 Binary files a/public/images/emoji/twitter/paraguay.png and b/public/images/emoji/twitter/paraguay.png differ diff --git a/public/images/emoji/twitter/parasol_on_ground.png b/public/images/emoji/twitter/parasol_on_ground.png index 2bb23697b7..120de456f7 100644 Binary files a/public/images/emoji/twitter/parasol_on_ground.png and b/public/images/emoji/twitter/parasol_on_ground.png differ diff --git a/public/images/emoji/twitter/park.png b/public/images/emoji/twitter/park.png index db29d2dff9..478bacc9c3 100644 Binary files a/public/images/emoji/twitter/park.png and b/public/images/emoji/twitter/park.png differ diff --git a/public/images/emoji/twitter/parking.png b/public/images/emoji/twitter/parking.png index 8b5ed7869d..afa850c900 100644 Binary files a/public/images/emoji/twitter/parking.png and b/public/images/emoji/twitter/parking.png differ diff --git a/public/images/emoji/twitter/parrot.png b/public/images/emoji/twitter/parrot.png new file mode 100644 index 0000000000..e9e3a5e0d0 Binary files /dev/null and b/public/images/emoji/twitter/parrot.png differ diff --git a/public/images/emoji/twitter/part_alternation_mark.png b/public/images/emoji/twitter/part_alternation_mark.png index 3e2642155a..ec51a877c1 100644 Binary files a/public/images/emoji/twitter/part_alternation_mark.png and b/public/images/emoji/twitter/part_alternation_mark.png differ diff --git a/public/images/emoji/twitter/partly_sunny.png b/public/images/emoji/twitter/partly_sunny.png index 544e6eafea..13ff46049f 100644 Binary files a/public/images/emoji/twitter/partly_sunny.png and b/public/images/emoji/twitter/partly_sunny.png differ diff --git a/public/images/emoji/twitter/partying_face.png b/public/images/emoji/twitter/partying_face.png new file mode 100644 index 0000000000..cf02521ccc Binary files /dev/null and b/public/images/emoji/twitter/partying_face.png differ diff --git a/public/images/emoji/twitter/passenger_ship.png b/public/images/emoji/twitter/passenger_ship.png index b1ee561346..de29c2e98b 100644 Binary files a/public/images/emoji/twitter/passenger_ship.png and b/public/images/emoji/twitter/passenger_ship.png differ diff --git a/public/images/emoji/twitter/passport_control.png b/public/images/emoji/twitter/passport_control.png index de4b774c19..4a96df041a 100644 Binary files a/public/images/emoji/twitter/passport_control.png and b/public/images/emoji/twitter/passport_control.png differ diff --git a/public/images/emoji/twitter/pause_button.png b/public/images/emoji/twitter/pause_button.png index 624e2df711..37897c0f54 100644 Binary files a/public/images/emoji/twitter/pause_button.png and b/public/images/emoji/twitter/pause_button.png differ diff --git a/public/images/emoji/twitter/paw_prints.png b/public/images/emoji/twitter/paw_prints.png index 5d89252f0e..2c6266d248 100644 Binary files a/public/images/emoji/twitter/paw_prints.png and b/public/images/emoji/twitter/paw_prints.png differ diff --git a/public/images/emoji/twitter/peace.png b/public/images/emoji/twitter/peace.png index 4eeaef2b55..7076d7db56 100644 Binary files a/public/images/emoji/twitter/peace.png and b/public/images/emoji/twitter/peace.png differ diff --git a/public/images/emoji/twitter/peace_symbol.png b/public/images/emoji/twitter/peace_symbol.png index 4eeaef2b55..7076d7db56 100644 Binary files a/public/images/emoji/twitter/peace_symbol.png and b/public/images/emoji/twitter/peace_symbol.png differ diff --git a/public/images/emoji/twitter/peach.png b/public/images/emoji/twitter/peach.png index c715727860..32e026cb1a 100644 Binary files a/public/images/emoji/twitter/peach.png and b/public/images/emoji/twitter/peach.png differ diff --git a/public/images/emoji/twitter/peacock.png b/public/images/emoji/twitter/peacock.png new file mode 100644 index 0000000000..59602cdcf0 Binary files /dev/null and b/public/images/emoji/twitter/peacock.png differ diff --git a/public/images/emoji/twitter/peanuts.png b/public/images/emoji/twitter/peanuts.png index 34f4eed2d5..e8f17a1a97 100644 Binary files a/public/images/emoji/twitter/peanuts.png and b/public/images/emoji/twitter/peanuts.png differ diff --git a/public/images/emoji/twitter/pear.png b/public/images/emoji/twitter/pear.png index b84c90c158..0f578599be 100644 Binary files a/public/images/emoji/twitter/pear.png and b/public/images/emoji/twitter/pear.png differ diff --git a/public/images/emoji/twitter/pen.png b/public/images/emoji/twitter/pen.png index 6219ae26cc..3958a3d0d6 100644 Binary files a/public/images/emoji/twitter/pen.png and b/public/images/emoji/twitter/pen.png differ diff --git a/public/images/emoji/twitter/pen_ballpoint.png b/public/images/emoji/twitter/pen_ballpoint.png index 6219ae26cc..3958a3d0d6 100644 Binary files a/public/images/emoji/twitter/pen_ballpoint.png and b/public/images/emoji/twitter/pen_ballpoint.png differ diff --git a/public/images/emoji/twitter/pen_fountain.png b/public/images/emoji/twitter/pen_fountain.png index 96584c9f57..39b1f567da 100644 Binary files a/public/images/emoji/twitter/pen_fountain.png and b/public/images/emoji/twitter/pen_fountain.png differ diff --git a/public/images/emoji/twitter/pencil.png b/public/images/emoji/twitter/pencil.png index 9cefdba7eb..7d3ac834be 100644 Binary files a/public/images/emoji/twitter/pencil.png and b/public/images/emoji/twitter/pencil.png differ diff --git a/public/images/emoji/twitter/pencil2.png b/public/images/emoji/twitter/pencil2.png index 195bad416e..934c15a27b 100644 Binary files a/public/images/emoji/twitter/pencil2.png and b/public/images/emoji/twitter/pencil2.png differ diff --git a/public/images/emoji/twitter/penguin.png b/public/images/emoji/twitter/penguin.png index f0820a8c33..2ee0dbc6ae 100644 Binary files a/public/images/emoji/twitter/penguin.png and b/public/images/emoji/twitter/penguin.png differ diff --git a/public/images/emoji/twitter/pensive.png b/public/images/emoji/twitter/pensive.png index 642bfd3303..1357dd9c7a 100644 Binary files a/public/images/emoji/twitter/pensive.png and b/public/images/emoji/twitter/pensive.png differ diff --git a/public/images/emoji/twitter/performing_arts.png b/public/images/emoji/twitter/performing_arts.png index 1d2796a278..60de5b74d7 100644 Binary files a/public/images/emoji/twitter/performing_arts.png and b/public/images/emoji/twitter/performing_arts.png differ diff --git a/public/images/emoji/twitter/persevere.png b/public/images/emoji/twitter/persevere.png index e2ea3c297c..007139dc3a 100644 Binary files a/public/images/emoji/twitter/persevere.png and b/public/images/emoji/twitter/persevere.png differ diff --git a/public/images/emoji/twitter/person_climbing.png b/public/images/emoji/twitter/person_climbing.png index d8a6229d6b..a689019417 100644 Binary files a/public/images/emoji/twitter/person_climbing.png and b/public/images/emoji/twitter/person_climbing.png differ diff --git a/public/images/emoji/twitter/person_fencing.png b/public/images/emoji/twitter/person_fencing.png index 064b747aae..4222c81f70 100644 Binary files a/public/images/emoji/twitter/person_fencing.png and b/public/images/emoji/twitter/person_fencing.png differ diff --git a/public/images/emoji/twitter/person_frowning.png b/public/images/emoji/twitter/person_frowning.png index f1ca30e538..2a8f8653f4 100644 Binary files a/public/images/emoji/twitter/person_frowning.png and b/public/images/emoji/twitter/person_frowning.png differ diff --git a/public/images/emoji/twitter/person_in_lotus_position.png b/public/images/emoji/twitter/person_in_lotus_position.png index e9404fd525..1e519915c4 100644 Binary files a/public/images/emoji/twitter/person_in_lotus_position.png and b/public/images/emoji/twitter/person_in_lotus_position.png differ diff --git a/public/images/emoji/twitter/person_in_steamy_room.png b/public/images/emoji/twitter/person_in_steamy_room.png index 65a0790d92..0885157783 100644 Binary files a/public/images/emoji/twitter/person_in_steamy_room.png and b/public/images/emoji/twitter/person_in_steamy_room.png differ diff --git a/public/images/emoji/twitter/person_with_ball.png b/public/images/emoji/twitter/person_with_ball.png index ac6a6c2c9f..080e813ae0 100644 Binary files a/public/images/emoji/twitter/person_with_ball.png and b/public/images/emoji/twitter/person_with_ball.png differ diff --git a/public/images/emoji/twitter/person_with_blond_hair.png b/public/images/emoji/twitter/person_with_blond_hair.png index 419c5d22c5..381a8d4381 100644 Binary files a/public/images/emoji/twitter/person_with_blond_hair.png and b/public/images/emoji/twitter/person_with_blond_hair.png differ diff --git a/public/images/emoji/twitter/person_with_pouting_face.png b/public/images/emoji/twitter/person_with_pouting_face.png index 8d764bf4f3..6eb3bac0fb 100644 Binary files a/public/images/emoji/twitter/person_with_pouting_face.png and b/public/images/emoji/twitter/person_with_pouting_face.png differ diff --git a/public/images/emoji/twitter/peru.png b/public/images/emoji/twitter/peru.png index bbb5523f93..f7e54091a9 100644 Binary files a/public/images/emoji/twitter/peru.png and b/public/images/emoji/twitter/peru.png differ diff --git a/public/images/emoji/twitter/petri_dish.png b/public/images/emoji/twitter/petri_dish.png new file mode 100644 index 0000000000..3a07b493c2 Binary files /dev/null and b/public/images/emoji/twitter/petri_dish.png differ diff --git a/public/images/emoji/twitter/philippines.png b/public/images/emoji/twitter/philippines.png index b26fa86ac2..a0adbef2cf 100644 Binary files a/public/images/emoji/twitter/philippines.png and b/public/images/emoji/twitter/philippines.png differ diff --git a/public/images/emoji/twitter/phone.png b/public/images/emoji/twitter/phone.png index 749e9f38ae..cbee27cc53 100644 Binary files a/public/images/emoji/twitter/phone.png and b/public/images/emoji/twitter/phone.png differ diff --git a/public/images/emoji/twitter/pick.png b/public/images/emoji/twitter/pick.png index cc216bfcae..88bbdc73e5 100644 Binary files a/public/images/emoji/twitter/pick.png and b/public/images/emoji/twitter/pick.png differ diff --git a/public/images/emoji/twitter/pie.png b/public/images/emoji/twitter/pie.png index 4f5f474d82..2687a56214 100644 Binary files a/public/images/emoji/twitter/pie.png and b/public/images/emoji/twitter/pie.png differ diff --git a/public/images/emoji/twitter/pig.png b/public/images/emoji/twitter/pig.png index f7e2cadb03..5272447b16 100644 Binary files a/public/images/emoji/twitter/pig.png and b/public/images/emoji/twitter/pig.png differ diff --git a/public/images/emoji/twitter/pig2.png b/public/images/emoji/twitter/pig2.png index 120baeb2ae..1bb3b6e5bc 100644 Binary files a/public/images/emoji/twitter/pig2.png and b/public/images/emoji/twitter/pig2.png differ diff --git a/public/images/emoji/twitter/pig_nose.png b/public/images/emoji/twitter/pig_nose.png index 65e0d1c5f5..1aee7931c0 100644 Binary files a/public/images/emoji/twitter/pig_nose.png and b/public/images/emoji/twitter/pig_nose.png differ diff --git a/public/images/emoji/twitter/pill.png b/public/images/emoji/twitter/pill.png index 282d510e4f..970be0dc11 100644 Binary files a/public/images/emoji/twitter/pill.png and b/public/images/emoji/twitter/pill.png differ diff --git a/public/images/emoji/twitter/pineapple.png b/public/images/emoji/twitter/pineapple.png index 274e691cc0..949edeab1f 100644 Binary files a/public/images/emoji/twitter/pineapple.png and b/public/images/emoji/twitter/pineapple.png differ diff --git a/public/images/emoji/twitter/ping_pong.png b/public/images/emoji/twitter/ping_pong.png index 935993c860..6d5a36dbf3 100644 Binary files a/public/images/emoji/twitter/ping_pong.png and b/public/images/emoji/twitter/ping_pong.png differ diff --git a/public/images/emoji/twitter/pirate_flag.png b/public/images/emoji/twitter/pirate_flag.png new file mode 100644 index 0000000000..91f599b478 Binary files /dev/null and b/public/images/emoji/twitter/pirate_flag.png differ diff --git a/public/images/emoji/twitter/pisces.png b/public/images/emoji/twitter/pisces.png index a8f2ab6ba8..84d436f39a 100644 Binary files a/public/images/emoji/twitter/pisces.png and b/public/images/emoji/twitter/pisces.png differ diff --git a/public/images/emoji/twitter/pitcairn_islands.png b/public/images/emoji/twitter/pitcairn_islands.png index 3e3d79bca5..a7ced0f12c 100644 Binary files a/public/images/emoji/twitter/pitcairn_islands.png and b/public/images/emoji/twitter/pitcairn_islands.png differ diff --git a/public/images/emoji/twitter/pizza.png b/public/images/emoji/twitter/pizza.png index 010da4d208..af89d3deee 100644 Binary files a/public/images/emoji/twitter/pizza.png and b/public/images/emoji/twitter/pizza.png differ diff --git a/public/images/emoji/twitter/place_of_worship.png b/public/images/emoji/twitter/place_of_worship.png index 19e1150b30..9341dd0ba0 100644 Binary files a/public/images/emoji/twitter/place_of_worship.png and b/public/images/emoji/twitter/place_of_worship.png differ diff --git a/public/images/emoji/twitter/plate_with_cutlery.png b/public/images/emoji/twitter/plate_with_cutlery.png index df63dcc4f4..5e8cf40778 100644 Binary files a/public/images/emoji/twitter/plate_with_cutlery.png and b/public/images/emoji/twitter/plate_with_cutlery.png differ diff --git a/public/images/emoji/twitter/play_or_pause_button.png b/public/images/emoji/twitter/play_or_pause_button.png index 64b9998541..4de7931bee 100644 Binary files a/public/images/emoji/twitter/play_or_pause_button.png and b/public/images/emoji/twitter/play_or_pause_button.png differ diff --git a/public/images/emoji/twitter/play_pause.png b/public/images/emoji/twitter/play_pause.png index 64b9998541..4de7931bee 100644 Binary files a/public/images/emoji/twitter/play_pause.png and b/public/images/emoji/twitter/play_pause.png differ diff --git a/public/images/emoji/twitter/pleading_face.png b/public/images/emoji/twitter/pleading_face.png new file mode 100644 index 0000000000..e3c26b3dc1 Binary files /dev/null and b/public/images/emoji/twitter/pleading_face.png differ diff --git a/public/images/emoji/twitter/point_down.png b/public/images/emoji/twitter/point_down.png index 2bcb778a1b..b5d06ca53b 100644 Binary files a/public/images/emoji/twitter/point_down.png and b/public/images/emoji/twitter/point_down.png differ diff --git a/public/images/emoji/twitter/point_left.png b/public/images/emoji/twitter/point_left.png index 349d9eb341..441c2f819a 100644 Binary files a/public/images/emoji/twitter/point_left.png and b/public/images/emoji/twitter/point_left.png differ diff --git a/public/images/emoji/twitter/point_right.png b/public/images/emoji/twitter/point_right.png index 4aaaf53609..85c300aaa8 100644 Binary files a/public/images/emoji/twitter/point_right.png and b/public/images/emoji/twitter/point_right.png differ diff --git a/public/images/emoji/twitter/point_up.png b/public/images/emoji/twitter/point_up.png index f921a890da..d1d18f3587 100644 Binary files a/public/images/emoji/twitter/point_up.png and b/public/images/emoji/twitter/point_up.png differ diff --git a/public/images/emoji/twitter/point_up_2.png b/public/images/emoji/twitter/point_up_2.png index 2ad37c859a..8a5dfb10b0 100644 Binary files a/public/images/emoji/twitter/point_up_2.png and b/public/images/emoji/twitter/point_up_2.png differ diff --git a/public/images/emoji/twitter/poland.png b/public/images/emoji/twitter/poland.png index c8872ee52e..af38b9a8e2 100644 Binary files a/public/images/emoji/twitter/poland.png and b/public/images/emoji/twitter/poland.png differ diff --git a/public/images/emoji/twitter/police_car.png b/public/images/emoji/twitter/police_car.png index 7e383292b1..48ccae4d38 100644 Binary files a/public/images/emoji/twitter/police_car.png and b/public/images/emoji/twitter/police_car.png differ diff --git a/public/images/emoji/twitter/policeman.png b/public/images/emoji/twitter/policeman.png index fe7b77444a..d93f63a287 100644 Binary files a/public/images/emoji/twitter/policeman.png and b/public/images/emoji/twitter/policeman.png differ diff --git a/public/images/emoji/twitter/policewoman.png b/public/images/emoji/twitter/policewoman.png index 566f93771b..13ed498d63 100644 Binary files a/public/images/emoji/twitter/policewoman.png and b/public/images/emoji/twitter/policewoman.png differ diff --git a/public/images/emoji/twitter/poo.png b/public/images/emoji/twitter/poo.png index 51661e5dff..bf8eac64da 100644 Binary files a/public/images/emoji/twitter/poo.png and b/public/images/emoji/twitter/poo.png differ diff --git a/public/images/emoji/twitter/poodle.png b/public/images/emoji/twitter/poodle.png index aa6690d790..c995075ead 100644 Binary files a/public/images/emoji/twitter/poodle.png and b/public/images/emoji/twitter/poodle.png differ diff --git a/public/images/emoji/twitter/poop.png b/public/images/emoji/twitter/poop.png index 51661e5dff..bf8eac64da 100644 Binary files a/public/images/emoji/twitter/poop.png and b/public/images/emoji/twitter/poop.png differ diff --git a/public/images/emoji/twitter/popcorn.png b/public/images/emoji/twitter/popcorn.png index ccdc42f6c6..7ec92a516c 100644 Binary files a/public/images/emoji/twitter/popcorn.png and b/public/images/emoji/twitter/popcorn.png differ diff --git a/public/images/emoji/twitter/portugal.png b/public/images/emoji/twitter/portugal.png index 5646de0622..246e2ceede 100644 Binary files a/public/images/emoji/twitter/portugal.png and b/public/images/emoji/twitter/portugal.png differ diff --git a/public/images/emoji/twitter/post_office.png b/public/images/emoji/twitter/post_office.png index ae06897524..4bb852a10b 100644 Binary files a/public/images/emoji/twitter/post_office.png and b/public/images/emoji/twitter/post_office.png differ diff --git a/public/images/emoji/twitter/postal_horn.png b/public/images/emoji/twitter/postal_horn.png index 5e3c044e46..d69b814525 100644 Binary files a/public/images/emoji/twitter/postal_horn.png and b/public/images/emoji/twitter/postal_horn.png differ diff --git a/public/images/emoji/twitter/postbox.png b/public/images/emoji/twitter/postbox.png index dac21ed2cd..959041dd84 100644 Binary files a/public/images/emoji/twitter/postbox.png and b/public/images/emoji/twitter/postbox.png differ diff --git a/public/images/emoji/twitter/potable_water.png b/public/images/emoji/twitter/potable_water.png index 76c9dc2c25..e50afb54b4 100644 Binary files a/public/images/emoji/twitter/potable_water.png and b/public/images/emoji/twitter/potable_water.png differ diff --git a/public/images/emoji/twitter/potato.png b/public/images/emoji/twitter/potato.png index 3f097365d9..bf3d9b9c47 100644 Binary files a/public/images/emoji/twitter/potato.png and b/public/images/emoji/twitter/potato.png differ diff --git a/public/images/emoji/twitter/pouch.png b/public/images/emoji/twitter/pouch.png index 7cc75779f5..e6535a2003 100644 Binary files a/public/images/emoji/twitter/pouch.png and b/public/images/emoji/twitter/pouch.png differ diff --git a/public/images/emoji/twitter/poultry_leg.png b/public/images/emoji/twitter/poultry_leg.png index 7829ee6020..a32c8a6af4 100644 Binary files a/public/images/emoji/twitter/poultry_leg.png and b/public/images/emoji/twitter/poultry_leg.png differ diff --git a/public/images/emoji/twitter/pound.png b/public/images/emoji/twitter/pound.png index b68ce11396..257ed90fe0 100644 Binary files a/public/images/emoji/twitter/pound.png and b/public/images/emoji/twitter/pound.png differ diff --git a/public/images/emoji/twitter/pouting_cat.png b/public/images/emoji/twitter/pouting_cat.png index 973f479afb..5cf62f9592 100644 Binary files a/public/images/emoji/twitter/pouting_cat.png and b/public/images/emoji/twitter/pouting_cat.png differ diff --git a/public/images/emoji/twitter/pouting_man.png b/public/images/emoji/twitter/pouting_man.png index c6392b40a6..f26e391aa4 100644 Binary files a/public/images/emoji/twitter/pouting_man.png and b/public/images/emoji/twitter/pouting_man.png differ diff --git a/public/images/emoji/twitter/pouting_woman.png b/public/images/emoji/twitter/pouting_woman.png index 8d764bf4f3..6eb3bac0fb 100644 Binary files a/public/images/emoji/twitter/pouting_woman.png and b/public/images/emoji/twitter/pouting_woman.png differ diff --git a/public/images/emoji/twitter/pray.png b/public/images/emoji/twitter/pray.png index c0f43f9999..b18f35a7f6 100644 Binary files a/public/images/emoji/twitter/pray.png and b/public/images/emoji/twitter/pray.png differ diff --git a/public/images/emoji/twitter/prayer_beads.png b/public/images/emoji/twitter/prayer_beads.png index 71d6e55ae0..be750c49da 100644 Binary files a/public/images/emoji/twitter/prayer_beads.png and b/public/images/emoji/twitter/prayer_beads.png differ diff --git a/public/images/emoji/twitter/pregnant_woman.png b/public/images/emoji/twitter/pregnant_woman.png index d965748c88..685a2e7ec5 100644 Binary files a/public/images/emoji/twitter/pregnant_woman.png and b/public/images/emoji/twitter/pregnant_woman.png differ diff --git a/public/images/emoji/twitter/pretzel.png b/public/images/emoji/twitter/pretzel.png index 9116d6ee9a..61984d26a9 100644 Binary files a/public/images/emoji/twitter/pretzel.png and b/public/images/emoji/twitter/pretzel.png differ diff --git a/public/images/emoji/twitter/previous_track.png b/public/images/emoji/twitter/previous_track.png index ada39abc33..cf46498466 100644 Binary files a/public/images/emoji/twitter/previous_track.png and b/public/images/emoji/twitter/previous_track.png differ diff --git a/public/images/emoji/twitter/previous_track_button.png b/public/images/emoji/twitter/previous_track_button.png index ada39abc33..cf46498466 100644 Binary files a/public/images/emoji/twitter/previous_track_button.png and b/public/images/emoji/twitter/previous_track_button.png differ diff --git a/public/images/emoji/twitter/prince.png b/public/images/emoji/twitter/prince.png index 5ec0ddf76b..f4e8ceb190 100644 Binary files a/public/images/emoji/twitter/prince.png and b/public/images/emoji/twitter/prince.png differ diff --git a/public/images/emoji/twitter/princess.png b/public/images/emoji/twitter/princess.png index a0a5e8698e..c4b69a64fb 100644 Binary files a/public/images/emoji/twitter/princess.png and b/public/images/emoji/twitter/princess.png differ diff --git a/public/images/emoji/twitter/printer.png b/public/images/emoji/twitter/printer.png index 3fbfb20f27..094e0d57b4 100644 Binary files a/public/images/emoji/twitter/printer.png and b/public/images/emoji/twitter/printer.png differ diff --git a/public/images/emoji/twitter/projector.png b/public/images/emoji/twitter/projector.png index 3acb6ea9c3..224392a3eb 100644 Binary files a/public/images/emoji/twitter/projector.png and b/public/images/emoji/twitter/projector.png differ diff --git a/public/images/emoji/twitter/puerto_rico.png b/public/images/emoji/twitter/puerto_rico.png index 05a929944d..6d8a9634fa 100644 Binary files a/public/images/emoji/twitter/puerto_rico.png and b/public/images/emoji/twitter/puerto_rico.png differ diff --git a/public/images/emoji/twitter/puke.png b/public/images/emoji/twitter/puke.png index cd7c3d1f2b..40eae56836 100644 Binary files a/public/images/emoji/twitter/puke.png and b/public/images/emoji/twitter/puke.png differ diff --git a/public/images/emoji/twitter/punch.png b/public/images/emoji/twitter/punch.png index 28448af2fb..2ab3e926ea 100644 Binary files a/public/images/emoji/twitter/punch.png and b/public/images/emoji/twitter/punch.png differ diff --git a/public/images/emoji/twitter/purple_heart.png b/public/images/emoji/twitter/purple_heart.png index 015e60fa4c..c68892cc28 100644 Binary files a/public/images/emoji/twitter/purple_heart.png and b/public/images/emoji/twitter/purple_heart.png differ diff --git a/public/images/emoji/twitter/purse.png b/public/images/emoji/twitter/purse.png index 6aeb938679..1b0de42436 100644 Binary files a/public/images/emoji/twitter/purse.png and b/public/images/emoji/twitter/purse.png differ diff --git a/public/images/emoji/twitter/pushpin.png b/public/images/emoji/twitter/pushpin.png index 52d71021d5..f442f25924 100644 Binary files a/public/images/emoji/twitter/pushpin.png and b/public/images/emoji/twitter/pushpin.png differ diff --git a/public/images/emoji/twitter/put_litter_in_its_place.png b/public/images/emoji/twitter/put_litter_in_its_place.png index 6195047166..5636443371 100644 Binary files a/public/images/emoji/twitter/put_litter_in_its_place.png and b/public/images/emoji/twitter/put_litter_in_its_place.png differ diff --git a/public/images/emoji/twitter/qatar.png b/public/images/emoji/twitter/qatar.png index f51ae1d0ff..363099051c 100644 Binary files a/public/images/emoji/twitter/qatar.png and b/public/images/emoji/twitter/qatar.png differ diff --git a/public/images/emoji/twitter/question.png b/public/images/emoji/twitter/question.png index ad5cc0dc0d..1f337b2214 100644 Binary files a/public/images/emoji/twitter/question.png and b/public/images/emoji/twitter/question.png differ diff --git a/public/images/emoji/twitter/rabbit.png b/public/images/emoji/twitter/rabbit.png index 5641d5690a..b6c4d79ab1 100644 Binary files a/public/images/emoji/twitter/rabbit.png and b/public/images/emoji/twitter/rabbit.png differ diff --git a/public/images/emoji/twitter/rabbit2.png b/public/images/emoji/twitter/rabbit2.png index 3599137f59..afbdaf3b0d 100644 Binary files a/public/images/emoji/twitter/rabbit2.png and b/public/images/emoji/twitter/rabbit2.png differ diff --git a/public/images/emoji/twitter/raccoon.png b/public/images/emoji/twitter/raccoon.png new file mode 100644 index 0000000000..1d3916b94b Binary files /dev/null and b/public/images/emoji/twitter/raccoon.png differ diff --git a/public/images/emoji/twitter/race_car.png b/public/images/emoji/twitter/race_car.png index 894f1b62c2..732ab9ff2f 100644 Binary files a/public/images/emoji/twitter/race_car.png and b/public/images/emoji/twitter/race_car.png differ diff --git a/public/images/emoji/twitter/racehorse.png b/public/images/emoji/twitter/racehorse.png index af92b7244a..dc91a0d91f 100644 Binary files a/public/images/emoji/twitter/racehorse.png and b/public/images/emoji/twitter/racehorse.png differ diff --git a/public/images/emoji/twitter/racing_car.png b/public/images/emoji/twitter/racing_car.png index 894f1b62c2..732ab9ff2f 100644 Binary files a/public/images/emoji/twitter/racing_car.png and b/public/images/emoji/twitter/racing_car.png differ diff --git a/public/images/emoji/twitter/racing_motorcycle.png b/public/images/emoji/twitter/racing_motorcycle.png index ba7fb373ba..ac675cf4a0 100644 Binary files a/public/images/emoji/twitter/racing_motorcycle.png and b/public/images/emoji/twitter/racing_motorcycle.png differ diff --git a/public/images/emoji/twitter/radio.png b/public/images/emoji/twitter/radio.png index cc1cccd525..9609bbef83 100644 Binary files a/public/images/emoji/twitter/radio.png and b/public/images/emoji/twitter/radio.png differ diff --git a/public/images/emoji/twitter/radio_button.png b/public/images/emoji/twitter/radio_button.png index 7cf5335a43..49d062b28a 100644 Binary files a/public/images/emoji/twitter/radio_button.png and b/public/images/emoji/twitter/radio_button.png differ diff --git a/public/images/emoji/twitter/radioactive.png b/public/images/emoji/twitter/radioactive.png index 8fdf276cd2..6b167878b1 100644 Binary files a/public/images/emoji/twitter/radioactive.png and b/public/images/emoji/twitter/radioactive.png differ diff --git a/public/images/emoji/twitter/radioactive_sign.png b/public/images/emoji/twitter/radioactive_sign.png index 8fdf276cd2..6b167878b1 100644 Binary files a/public/images/emoji/twitter/radioactive_sign.png and b/public/images/emoji/twitter/radioactive_sign.png differ diff --git a/public/images/emoji/twitter/rage.png b/public/images/emoji/twitter/rage.png index c72b5eebd5..3921022f59 100644 Binary files a/public/images/emoji/twitter/rage.png and b/public/images/emoji/twitter/rage.png differ diff --git a/public/images/emoji/twitter/railroad_track.png b/public/images/emoji/twitter/railroad_track.png index 7b456ff579..fa1547075c 100644 Binary files a/public/images/emoji/twitter/railroad_track.png and b/public/images/emoji/twitter/railroad_track.png differ diff --git a/public/images/emoji/twitter/railway_car.png b/public/images/emoji/twitter/railway_car.png index d47d078657..1d9e502621 100644 Binary files a/public/images/emoji/twitter/railway_car.png and b/public/images/emoji/twitter/railway_car.png differ diff --git a/public/images/emoji/twitter/railway_track.png b/public/images/emoji/twitter/railway_track.png index 7b456ff579..fa1547075c 100644 Binary files a/public/images/emoji/twitter/railway_track.png and b/public/images/emoji/twitter/railway_track.png differ diff --git a/public/images/emoji/twitter/rainbow.png b/public/images/emoji/twitter/rainbow.png index 3da4abbbc3..58b40bc27c 100644 Binary files a/public/images/emoji/twitter/rainbow.png and b/public/images/emoji/twitter/rainbow.png differ diff --git a/public/images/emoji/twitter/rainbow_flag.png b/public/images/emoji/twitter/rainbow_flag.png index af14c94a4f..2a47509f02 100644 Binary files a/public/images/emoji/twitter/rainbow_flag.png and b/public/images/emoji/twitter/rainbow_flag.png differ diff --git a/public/images/emoji/twitter/raised_back_of_hand.png b/public/images/emoji/twitter/raised_back_of_hand.png index 7e8bd4c6ad..2437170ca6 100644 Binary files a/public/images/emoji/twitter/raised_back_of_hand.png and b/public/images/emoji/twitter/raised_back_of_hand.png differ diff --git a/public/images/emoji/twitter/raised_hand.png b/public/images/emoji/twitter/raised_hand.png index e18572e405..83cc2e2fc9 100644 Binary files a/public/images/emoji/twitter/raised_hand.png and b/public/images/emoji/twitter/raised_hand.png differ diff --git a/public/images/emoji/twitter/raised_hand_with_fingers_splayed.png b/public/images/emoji/twitter/raised_hand_with_fingers_splayed.png index f41f01af47..7464170185 100644 Binary files a/public/images/emoji/twitter/raised_hand_with_fingers_splayed.png and b/public/images/emoji/twitter/raised_hand_with_fingers_splayed.png differ diff --git a/public/images/emoji/twitter/raised_hand_with_part_between_middle_and_ring_fingers.png b/public/images/emoji/twitter/raised_hand_with_part_between_middle_and_ring_fingers.png index 6245929457..0778c7bc57 100644 Binary files a/public/images/emoji/twitter/raised_hand_with_part_between_middle_and_ring_fingers.png and b/public/images/emoji/twitter/raised_hand_with_part_between_middle_and_ring_fingers.png differ diff --git a/public/images/emoji/twitter/raised_hands.png b/public/images/emoji/twitter/raised_hands.png index 6c1962a676..e634507a0b 100644 Binary files a/public/images/emoji/twitter/raised_hands.png and b/public/images/emoji/twitter/raised_hands.png differ diff --git a/public/images/emoji/twitter/raising_hand.png b/public/images/emoji/twitter/raising_hand.png index 88082b4082..452f774d34 100644 Binary files a/public/images/emoji/twitter/raising_hand.png and b/public/images/emoji/twitter/raising_hand.png differ diff --git a/public/images/emoji/twitter/raising_hand_man.png b/public/images/emoji/twitter/raising_hand_man.png index 888c2e010f..0765061675 100644 Binary files a/public/images/emoji/twitter/raising_hand_man.png and b/public/images/emoji/twitter/raising_hand_man.png differ diff --git a/public/images/emoji/twitter/raising_hand_woman.png b/public/images/emoji/twitter/raising_hand_woman.png index 88082b4082..452f774d34 100644 Binary files a/public/images/emoji/twitter/raising_hand_woman.png and b/public/images/emoji/twitter/raising_hand_woman.png differ diff --git a/public/images/emoji/twitter/ram.png b/public/images/emoji/twitter/ram.png index a0255d2e78..96380f1497 100644 Binary files a/public/images/emoji/twitter/ram.png and b/public/images/emoji/twitter/ram.png differ diff --git a/public/images/emoji/twitter/ramen.png b/public/images/emoji/twitter/ramen.png index 017fb91638..04f5c6402a 100644 Binary files a/public/images/emoji/twitter/ramen.png and b/public/images/emoji/twitter/ramen.png differ diff --git a/public/images/emoji/twitter/rat.png b/public/images/emoji/twitter/rat.png index 0ec83c0dbc..a2150f2d3b 100644 Binary files a/public/images/emoji/twitter/rat.png and b/public/images/emoji/twitter/rat.png differ diff --git a/public/images/emoji/twitter/receipt.png b/public/images/emoji/twitter/receipt.png new file mode 100644 index 0000000000..b5f1ba925f Binary files /dev/null and b/public/images/emoji/twitter/receipt.png differ diff --git a/public/images/emoji/twitter/record_button.png b/public/images/emoji/twitter/record_button.png index 9015b0fde1..8f14600a24 100644 Binary files a/public/images/emoji/twitter/record_button.png and b/public/images/emoji/twitter/record_button.png differ diff --git a/public/images/emoji/twitter/recycle.png b/public/images/emoji/twitter/recycle.png index e967360d49..97c09767f3 100644 Binary files a/public/images/emoji/twitter/recycle.png and b/public/images/emoji/twitter/recycle.png differ diff --git a/public/images/emoji/twitter/red_car.png b/public/images/emoji/twitter/red_car.png index d4613010a8..fb0f6c86b6 100644 Binary files a/public/images/emoji/twitter/red_car.png and b/public/images/emoji/twitter/red_car.png differ diff --git a/public/images/emoji/twitter/red_circle.png b/public/images/emoji/twitter/red_circle.png index db691f4d56..721075df18 100644 Binary files a/public/images/emoji/twitter/red_circle.png and b/public/images/emoji/twitter/red_circle.png differ diff --git a/public/images/emoji/twitter/red_gift_envelope.png b/public/images/emoji/twitter/red_gift_envelope.png new file mode 100644 index 0000000000..e88d858d58 Binary files /dev/null and b/public/images/emoji/twitter/red_gift_envelope.png differ diff --git a/public/images/emoji/twitter/registered.png b/public/images/emoji/twitter/registered.png index 0cd3b0aa2d..72f80e9261 100644 Binary files a/public/images/emoji/twitter/registered.png and b/public/images/emoji/twitter/registered.png differ diff --git a/public/images/emoji/twitter/relaxed.png b/public/images/emoji/twitter/relaxed.png index 0ba406c8dd..29c80a226f 100644 Binary files a/public/images/emoji/twitter/relaxed.png and b/public/images/emoji/twitter/relaxed.png differ diff --git a/public/images/emoji/twitter/relieved.png b/public/images/emoji/twitter/relieved.png index c050abd24f..4fb75cffec 100644 Binary files a/public/images/emoji/twitter/relieved.png and b/public/images/emoji/twitter/relieved.png differ diff --git a/public/images/emoji/twitter/reminder_ribbon.png b/public/images/emoji/twitter/reminder_ribbon.png index 09d8d0e308..692a5ecf08 100644 Binary files a/public/images/emoji/twitter/reminder_ribbon.png and b/public/images/emoji/twitter/reminder_ribbon.png differ diff --git a/public/images/emoji/twitter/repeat.png b/public/images/emoji/twitter/repeat.png index 5714e85ef9..a2ae9a301f 100644 Binary files a/public/images/emoji/twitter/repeat.png and b/public/images/emoji/twitter/repeat.png differ diff --git a/public/images/emoji/twitter/repeat_one.png b/public/images/emoji/twitter/repeat_one.png index 382d5f112d..a8a0ce467b 100644 Binary files a/public/images/emoji/twitter/repeat_one.png and b/public/images/emoji/twitter/repeat_one.png differ diff --git a/public/images/emoji/twitter/rescue_worker_helmet.png b/public/images/emoji/twitter/rescue_worker_helmet.png index ad220c2eef..d99f6046f5 100644 Binary files a/public/images/emoji/twitter/rescue_worker_helmet.png and b/public/images/emoji/twitter/rescue_worker_helmet.png differ diff --git a/public/images/emoji/twitter/restroom.png b/public/images/emoji/twitter/restroom.png index 2d042e4eab..51e06918c2 100644 Binary files a/public/images/emoji/twitter/restroom.png and b/public/images/emoji/twitter/restroom.png differ diff --git a/public/images/emoji/twitter/reunion.png b/public/images/emoji/twitter/reunion.png index 1679d4c5b9..188d989778 100644 Binary files a/public/images/emoji/twitter/reunion.png and b/public/images/emoji/twitter/reunion.png differ diff --git a/public/images/emoji/twitter/reversed_hand_with_middle_finger_extended.png b/public/images/emoji/twitter/reversed_hand_with_middle_finger_extended.png index 8e7fce2f49..9b5de31144 100644 Binary files a/public/images/emoji/twitter/reversed_hand_with_middle_finger_extended.png and b/public/images/emoji/twitter/reversed_hand_with_middle_finger_extended.png differ diff --git a/public/images/emoji/twitter/revolving_hearts.png b/public/images/emoji/twitter/revolving_hearts.png index c0bb8f1104..5cd4036770 100644 Binary files a/public/images/emoji/twitter/revolving_hearts.png and b/public/images/emoji/twitter/revolving_hearts.png differ diff --git a/public/images/emoji/twitter/rewind.png b/public/images/emoji/twitter/rewind.png index 1648d7185c..9018ecf7eb 100644 Binary files a/public/images/emoji/twitter/rewind.png and b/public/images/emoji/twitter/rewind.png differ diff --git a/public/images/emoji/twitter/rhinoceros.png b/public/images/emoji/twitter/rhinoceros.png index e81681a603..9b43bbf25b 100644 Binary files a/public/images/emoji/twitter/rhinoceros.png and b/public/images/emoji/twitter/rhinoceros.png differ diff --git a/public/images/emoji/twitter/ribbon.png b/public/images/emoji/twitter/ribbon.png index b99af7c8a0..3c61195d40 100644 Binary files a/public/images/emoji/twitter/ribbon.png and b/public/images/emoji/twitter/ribbon.png differ diff --git a/public/images/emoji/twitter/rice.png b/public/images/emoji/twitter/rice.png index c8092aac54..a0ff523cec 100644 Binary files a/public/images/emoji/twitter/rice.png and b/public/images/emoji/twitter/rice.png differ diff --git a/public/images/emoji/twitter/rice_ball.png b/public/images/emoji/twitter/rice_ball.png index 066d4203e8..d294d11755 100644 Binary files a/public/images/emoji/twitter/rice_ball.png and b/public/images/emoji/twitter/rice_ball.png differ diff --git a/public/images/emoji/twitter/rice_cracker.png b/public/images/emoji/twitter/rice_cracker.png index a4bd346c6b..a813e05076 100644 Binary files a/public/images/emoji/twitter/rice_cracker.png and b/public/images/emoji/twitter/rice_cracker.png differ diff --git a/public/images/emoji/twitter/rice_scene.png b/public/images/emoji/twitter/rice_scene.png index 5e2fba15f6..004a110f50 100644 Binary files a/public/images/emoji/twitter/rice_scene.png and b/public/images/emoji/twitter/rice_scene.png differ diff --git a/public/images/emoji/twitter/right_anger_bubble.png b/public/images/emoji/twitter/right_anger_bubble.png index 3d3ee7dcfa..ea4f27ae72 100644 Binary files a/public/images/emoji/twitter/right_anger_bubble.png and b/public/images/emoji/twitter/right_anger_bubble.png differ diff --git a/public/images/emoji/twitter/ring.png b/public/images/emoji/twitter/ring.png index 780842e3c6..f9a1fce4f1 100644 Binary files a/public/images/emoji/twitter/ring.png and b/public/images/emoji/twitter/ring.png differ diff --git a/public/images/emoji/twitter/robot.png b/public/images/emoji/twitter/robot.png index c728ecf9c1..2865859f23 100644 Binary files a/public/images/emoji/twitter/robot.png and b/public/images/emoji/twitter/robot.png differ diff --git a/public/images/emoji/twitter/robot_face.png b/public/images/emoji/twitter/robot_face.png index c728ecf9c1..2865859f23 100644 Binary files a/public/images/emoji/twitter/robot_face.png and b/public/images/emoji/twitter/robot_face.png differ diff --git a/public/images/emoji/twitter/rocket.png b/public/images/emoji/twitter/rocket.png index c5b0e8bd9c..5b5c8d065a 100644 Binary files a/public/images/emoji/twitter/rocket.png and b/public/images/emoji/twitter/rocket.png differ diff --git a/public/images/emoji/twitter/rofl.png b/public/images/emoji/twitter/rofl.png index ab648dd83d..9af7443656 100644 Binary files a/public/images/emoji/twitter/rofl.png and b/public/images/emoji/twitter/rofl.png differ diff --git a/public/images/emoji/twitter/roll_eyes.png b/public/images/emoji/twitter/roll_eyes.png index 8a864a00bd..1bafe2a637 100644 Binary files a/public/images/emoji/twitter/roll_eyes.png and b/public/images/emoji/twitter/roll_eyes.png differ diff --git a/public/images/emoji/twitter/roll_of_toilet_paper.png b/public/images/emoji/twitter/roll_of_toilet_paper.png new file mode 100644 index 0000000000..00a5a9ecf6 Binary files /dev/null and b/public/images/emoji/twitter/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/twitter/rolled_up_newspaper.png b/public/images/emoji/twitter/rolled_up_newspaper.png index 052dcce75f..51b0392c01 100644 Binary files a/public/images/emoji/twitter/rolled_up_newspaper.png and b/public/images/emoji/twitter/rolled_up_newspaper.png differ diff --git a/public/images/emoji/twitter/roller_coaster.png b/public/images/emoji/twitter/roller_coaster.png index 73ab9964d8..c7fad25637 100644 Binary files a/public/images/emoji/twitter/roller_coaster.png and b/public/images/emoji/twitter/roller_coaster.png differ diff --git a/public/images/emoji/twitter/rolling_eyes.png b/public/images/emoji/twitter/rolling_eyes.png index 8a864a00bd..1bafe2a637 100644 Binary files a/public/images/emoji/twitter/rolling_eyes.png and b/public/images/emoji/twitter/rolling_eyes.png differ diff --git a/public/images/emoji/twitter/romania.png b/public/images/emoji/twitter/romania.png index 2b16324878..953098b82d 100644 Binary files a/public/images/emoji/twitter/romania.png and b/public/images/emoji/twitter/romania.png differ diff --git a/public/images/emoji/twitter/rooster.png b/public/images/emoji/twitter/rooster.png index 9e499840f6..61a94d4729 100644 Binary files a/public/images/emoji/twitter/rooster.png and b/public/images/emoji/twitter/rooster.png differ diff --git a/public/images/emoji/twitter/rose.png b/public/images/emoji/twitter/rose.png index 400fd8a709..238abc731d 100644 Binary files a/public/images/emoji/twitter/rose.png and b/public/images/emoji/twitter/rose.png differ diff --git a/public/images/emoji/twitter/rosette.png b/public/images/emoji/twitter/rosette.png index b21ae33e63..5634561816 100644 Binary files a/public/images/emoji/twitter/rosette.png and b/public/images/emoji/twitter/rosette.png differ diff --git a/public/images/emoji/twitter/rotating_light.png b/public/images/emoji/twitter/rotating_light.png index 0b5c6aa718..13acf0efac 100644 Binary files a/public/images/emoji/twitter/rotating_light.png and b/public/images/emoji/twitter/rotating_light.png differ diff --git a/public/images/emoji/twitter/round_pushpin.png b/public/images/emoji/twitter/round_pushpin.png index 17c2a7493a..01080d32a2 100644 Binary files a/public/images/emoji/twitter/round_pushpin.png and b/public/images/emoji/twitter/round_pushpin.png differ diff --git a/public/images/emoji/twitter/rowboat.png b/public/images/emoji/twitter/rowboat.png index 72560f2e25..5183484f73 100644 Binary files a/public/images/emoji/twitter/rowboat.png and b/public/images/emoji/twitter/rowboat.png differ diff --git a/public/images/emoji/twitter/rowing_man.png b/public/images/emoji/twitter/rowing_man.png index 72560f2e25..5183484f73 100644 Binary files a/public/images/emoji/twitter/rowing_man.png and b/public/images/emoji/twitter/rowing_man.png differ diff --git a/public/images/emoji/twitter/rowing_woman.png b/public/images/emoji/twitter/rowing_woman.png index 621b0acc04..9136789ede 100644 Binary files a/public/images/emoji/twitter/rowing_woman.png and b/public/images/emoji/twitter/rowing_woman.png differ diff --git a/public/images/emoji/twitter/ru.png b/public/images/emoji/twitter/ru.png index 3ecaefd941..47752f3f0c 100644 Binary files a/public/images/emoji/twitter/ru.png and b/public/images/emoji/twitter/ru.png differ diff --git a/public/images/emoji/twitter/rugby_football.png b/public/images/emoji/twitter/rugby_football.png index fb3d3d712e..1d533f99d6 100644 Binary files a/public/images/emoji/twitter/rugby_football.png and b/public/images/emoji/twitter/rugby_football.png differ diff --git a/public/images/emoji/twitter/runner.png b/public/images/emoji/twitter/runner.png index 10ab7874a0..0b5e3c15af 100644 Binary files a/public/images/emoji/twitter/runner.png and b/public/images/emoji/twitter/runner.png differ diff --git a/public/images/emoji/twitter/running_man.png b/public/images/emoji/twitter/running_man.png index 10ab7874a0..0b5e3c15af 100644 Binary files a/public/images/emoji/twitter/running_man.png and b/public/images/emoji/twitter/running_man.png differ diff --git a/public/images/emoji/twitter/running_shirt_with_sash.png b/public/images/emoji/twitter/running_shirt_with_sash.png index e28ae6ff4f..970d4167f4 100644 Binary files a/public/images/emoji/twitter/running_shirt_with_sash.png and b/public/images/emoji/twitter/running_shirt_with_sash.png differ diff --git a/public/images/emoji/twitter/running_woman.png b/public/images/emoji/twitter/running_woman.png index 01418f1a8d..68b1a9aeb2 100644 Binary files a/public/images/emoji/twitter/running_woman.png and b/public/images/emoji/twitter/running_woman.png differ diff --git a/public/images/emoji/twitter/rwanda.png b/public/images/emoji/twitter/rwanda.png index a45a988ff5..2802d1a2d7 100644 Binary files a/public/images/emoji/twitter/rwanda.png and b/public/images/emoji/twitter/rwanda.png differ diff --git a/public/images/emoji/twitter/sa.png b/public/images/emoji/twitter/sa.png index f6cb5820cc..d12881eda2 100644 Binary files a/public/images/emoji/twitter/sa.png and b/public/images/emoji/twitter/sa.png differ diff --git a/public/images/emoji/twitter/safety_pin.png b/public/images/emoji/twitter/safety_pin.png new file mode 100644 index 0000000000..b15166e2ab Binary files /dev/null and b/public/images/emoji/twitter/safety_pin.png differ diff --git a/public/images/emoji/twitter/sagittarius.png b/public/images/emoji/twitter/sagittarius.png index 12a424a76e..57919345ec 100644 Binary files a/public/images/emoji/twitter/sagittarius.png and b/public/images/emoji/twitter/sagittarius.png differ diff --git a/public/images/emoji/twitter/sailboat.png b/public/images/emoji/twitter/sailboat.png index ebb0c029f6..fec46102f2 100644 Binary files a/public/images/emoji/twitter/sailboat.png and b/public/images/emoji/twitter/sailboat.png differ diff --git a/public/images/emoji/twitter/sake.png b/public/images/emoji/twitter/sake.png index b892cbd753..db30dd2201 100644 Binary files a/public/images/emoji/twitter/sake.png and b/public/images/emoji/twitter/sake.png differ diff --git a/public/images/emoji/twitter/salt.png b/public/images/emoji/twitter/salt.png new file mode 100644 index 0000000000..053367714a Binary files /dev/null and b/public/images/emoji/twitter/salt.png differ diff --git a/public/images/emoji/twitter/samoa.png b/public/images/emoji/twitter/samoa.png index de81c048d0..5356f6d468 100644 Binary files a/public/images/emoji/twitter/samoa.png and b/public/images/emoji/twitter/samoa.png differ diff --git a/public/images/emoji/twitter/san_marino.png b/public/images/emoji/twitter/san_marino.png index fa20a00808..ddecba8b9e 100644 Binary files a/public/images/emoji/twitter/san_marino.png and b/public/images/emoji/twitter/san_marino.png differ diff --git a/public/images/emoji/twitter/sandal.png b/public/images/emoji/twitter/sandal.png index 3f6d145943..3b417ab4b4 100644 Binary files a/public/images/emoji/twitter/sandal.png and b/public/images/emoji/twitter/sandal.png differ diff --git a/public/images/emoji/twitter/sandwich.png b/public/images/emoji/twitter/sandwich.png index ba3f9a1cdb..63b1f54f65 100644 Binary files a/public/images/emoji/twitter/sandwich.png and b/public/images/emoji/twitter/sandwich.png differ diff --git a/public/images/emoji/twitter/santa.png b/public/images/emoji/twitter/santa.png index fd2297327f..44e75755f2 100644 Binary files a/public/images/emoji/twitter/santa.png and b/public/images/emoji/twitter/santa.png differ diff --git a/public/images/emoji/twitter/sao_tome_principe.png b/public/images/emoji/twitter/sao_tome_principe.png index bbfcbd18df..e39a8e259f 100644 Binary files a/public/images/emoji/twitter/sao_tome_principe.png and b/public/images/emoji/twitter/sao_tome_principe.png differ diff --git a/public/images/emoji/twitter/satellite.png b/public/images/emoji/twitter/satellite.png index 63ee7b9131..c1b86f723f 100644 Binary files a/public/images/emoji/twitter/satellite.png and b/public/images/emoji/twitter/satellite.png differ diff --git a/public/images/emoji/twitter/satellite_orbital.png b/public/images/emoji/twitter/satellite_orbital.png index 81715516af..962c6034c3 100644 Binary files a/public/images/emoji/twitter/satellite_orbital.png and b/public/images/emoji/twitter/satellite_orbital.png differ diff --git a/public/images/emoji/twitter/satisfied.png b/public/images/emoji/twitter/satisfied.png index 2632d89749..957f711b6d 100644 Binary files a/public/images/emoji/twitter/satisfied.png and b/public/images/emoji/twitter/satisfied.png differ diff --git a/public/images/emoji/twitter/saudi_arabia.png b/public/images/emoji/twitter/saudi_arabia.png index 59954eccbc..5f90f43d4b 100644 Binary files a/public/images/emoji/twitter/saudi_arabia.png and b/public/images/emoji/twitter/saudi_arabia.png differ diff --git a/public/images/emoji/twitter/sauropod.png b/public/images/emoji/twitter/sauropod.png index 2f4d619997..e8ea445a66 100644 Binary files a/public/images/emoji/twitter/sauropod.png and b/public/images/emoji/twitter/sauropod.png differ diff --git a/public/images/emoji/twitter/saxophone.png b/public/images/emoji/twitter/saxophone.png index 3f9041ac17..61345d802c 100644 Binary files a/public/images/emoji/twitter/saxophone.png and b/public/images/emoji/twitter/saxophone.png differ diff --git a/public/images/emoji/twitter/scales.png b/public/images/emoji/twitter/scales.png index 75713abc23..e4b2ea9ab5 100644 Binary files a/public/images/emoji/twitter/scales.png and b/public/images/emoji/twitter/scales.png differ diff --git a/public/images/emoji/twitter/scarf.png b/public/images/emoji/twitter/scarf.png index 73653eee2b..89f97c5ced 100644 Binary files a/public/images/emoji/twitter/scarf.png and b/public/images/emoji/twitter/scarf.png differ diff --git a/public/images/emoji/twitter/school.png b/public/images/emoji/twitter/school.png index 1fad20176e..ae15884cc2 100644 Binary files a/public/images/emoji/twitter/school.png and b/public/images/emoji/twitter/school.png differ diff --git a/public/images/emoji/twitter/school_satchel.png b/public/images/emoji/twitter/school_satchel.png index a17dea66b4..f05c2eddf5 100644 Binary files a/public/images/emoji/twitter/school_satchel.png and b/public/images/emoji/twitter/school_satchel.png differ diff --git a/public/images/emoji/twitter/scissors.png b/public/images/emoji/twitter/scissors.png index de918c6a29..ba94dc6418 100644 Binary files a/public/images/emoji/twitter/scissors.png and b/public/images/emoji/twitter/scissors.png differ diff --git a/public/images/emoji/twitter/scorpion.png b/public/images/emoji/twitter/scorpion.png index 2215d4642f..767cf550d0 100644 Binary files a/public/images/emoji/twitter/scorpion.png and b/public/images/emoji/twitter/scorpion.png differ diff --git a/public/images/emoji/twitter/scorpius.png b/public/images/emoji/twitter/scorpius.png index 38ac5b0625..2ca7e0b9c2 100644 Binary files a/public/images/emoji/twitter/scorpius.png and b/public/images/emoji/twitter/scorpius.png differ diff --git a/public/images/emoji/twitter/scream.png b/public/images/emoji/twitter/scream.png index 9960ab5065..f021fc18fa 100644 Binary files a/public/images/emoji/twitter/scream.png and b/public/images/emoji/twitter/scream.png differ diff --git a/public/images/emoji/twitter/scream_cat.png b/public/images/emoji/twitter/scream_cat.png index 55ea2a5693..01a1640655 100644 Binary files a/public/images/emoji/twitter/scream_cat.png and b/public/images/emoji/twitter/scream_cat.png differ diff --git a/public/images/emoji/twitter/scroll.png b/public/images/emoji/twitter/scroll.png index 401706f224..624b4ba14b 100644 Binary files a/public/images/emoji/twitter/scroll.png and b/public/images/emoji/twitter/scroll.png differ diff --git a/public/images/emoji/twitter/seat.png b/public/images/emoji/twitter/seat.png index 6462fb8c61..eafeeff8d5 100644 Binary files a/public/images/emoji/twitter/seat.png and b/public/images/emoji/twitter/seat.png differ diff --git a/public/images/emoji/twitter/secret.png b/public/images/emoji/twitter/secret.png index c2dac64925..01cc93d982 100644 Binary files a/public/images/emoji/twitter/secret.png and b/public/images/emoji/twitter/secret.png differ diff --git a/public/images/emoji/twitter/see_no_evil.png b/public/images/emoji/twitter/see_no_evil.png index 490b2993af..1f4275180b 100644 Binary files a/public/images/emoji/twitter/see_no_evil.png and b/public/images/emoji/twitter/see_no_evil.png differ diff --git a/public/images/emoji/twitter/seedling.png b/public/images/emoji/twitter/seedling.png index 67fd8389b5..57aaddb55c 100644 Binary files a/public/images/emoji/twitter/seedling.png and b/public/images/emoji/twitter/seedling.png differ diff --git a/public/images/emoji/twitter/selfie.png b/public/images/emoji/twitter/selfie.png index f6411e5444..857416d7c4 100644 Binary files a/public/images/emoji/twitter/selfie.png and b/public/images/emoji/twitter/selfie.png differ diff --git a/public/images/emoji/twitter/senegal.png b/public/images/emoji/twitter/senegal.png index 2d32427625..caf9e4578b 100644 Binary files a/public/images/emoji/twitter/senegal.png and b/public/images/emoji/twitter/senegal.png differ diff --git a/public/images/emoji/twitter/serbia.png b/public/images/emoji/twitter/serbia.png index a7af1346e5..cc11163b5f 100644 Binary files a/public/images/emoji/twitter/serbia.png and b/public/images/emoji/twitter/serbia.png differ diff --git a/public/images/emoji/twitter/seven.png b/public/images/emoji/twitter/seven.png index 8ef72161fe..308e89ca0a 100644 Binary files a/public/images/emoji/twitter/seven.png and b/public/images/emoji/twitter/seven.png differ diff --git a/public/images/emoji/twitter/seychelles.png b/public/images/emoji/twitter/seychelles.png index e69ca6add1..908f6b88e6 100644 Binary files a/public/images/emoji/twitter/seychelles.png and b/public/images/emoji/twitter/seychelles.png differ diff --git a/public/images/emoji/twitter/shallow_pan_of_food.png b/public/images/emoji/twitter/shallow_pan_of_food.png index 300f700fcc..39b64e069e 100644 Binary files a/public/images/emoji/twitter/shallow_pan_of_food.png and b/public/images/emoji/twitter/shallow_pan_of_food.png differ diff --git a/public/images/emoji/twitter/shamrock.png b/public/images/emoji/twitter/shamrock.png index dfad1cfc70..f987099ff7 100644 Binary files a/public/images/emoji/twitter/shamrock.png and b/public/images/emoji/twitter/shamrock.png differ diff --git a/public/images/emoji/twitter/shark.png b/public/images/emoji/twitter/shark.png index 856894743d..88ccc81e30 100644 Binary files a/public/images/emoji/twitter/shark.png and b/public/images/emoji/twitter/shark.png differ diff --git a/public/images/emoji/twitter/shaved_ice.png b/public/images/emoji/twitter/shaved_ice.png index 7cd17c20e6..70860c53a8 100644 Binary files a/public/images/emoji/twitter/shaved_ice.png and b/public/images/emoji/twitter/shaved_ice.png differ diff --git a/public/images/emoji/twitter/sheep.png b/public/images/emoji/twitter/sheep.png index 68ace29904..f803dd80b8 100644 Binary files a/public/images/emoji/twitter/sheep.png and b/public/images/emoji/twitter/sheep.png differ diff --git a/public/images/emoji/twitter/shell.png b/public/images/emoji/twitter/shell.png index 2d28936509..11c4d39f56 100644 Binary files a/public/images/emoji/twitter/shell.png and b/public/images/emoji/twitter/shell.png differ diff --git a/public/images/emoji/twitter/shield.png b/public/images/emoji/twitter/shield.png index 4fbc6a5915..b29d246639 100644 Binary files a/public/images/emoji/twitter/shield.png and b/public/images/emoji/twitter/shield.png differ diff --git a/public/images/emoji/twitter/shinto_shrine.png b/public/images/emoji/twitter/shinto_shrine.png index 52c368a6a6..0fb5d1286d 100644 Binary files a/public/images/emoji/twitter/shinto_shrine.png and b/public/images/emoji/twitter/shinto_shrine.png differ diff --git a/public/images/emoji/twitter/ship.png b/public/images/emoji/twitter/ship.png index ea28e555b5..ad78950b0e 100644 Binary files a/public/images/emoji/twitter/ship.png and b/public/images/emoji/twitter/ship.png differ diff --git a/public/images/emoji/twitter/shirt.png b/public/images/emoji/twitter/shirt.png index 4723c7947a..1dc1d91d40 100644 Binary files a/public/images/emoji/twitter/shirt.png and b/public/images/emoji/twitter/shirt.png differ diff --git a/public/images/emoji/twitter/shit.png b/public/images/emoji/twitter/shit.png index 51661e5dff..bf8eac64da 100644 Binary files a/public/images/emoji/twitter/shit.png and b/public/images/emoji/twitter/shit.png differ diff --git a/public/images/emoji/twitter/shopping.png b/public/images/emoji/twitter/shopping.png index ee15abd993..4c9b51bdd8 100644 Binary files a/public/images/emoji/twitter/shopping.png and b/public/images/emoji/twitter/shopping.png differ diff --git a/public/images/emoji/twitter/shopping_bags.png b/public/images/emoji/twitter/shopping_bags.png index ee15abd993..4c9b51bdd8 100644 Binary files a/public/images/emoji/twitter/shopping_bags.png and b/public/images/emoji/twitter/shopping_bags.png differ diff --git a/public/images/emoji/twitter/shopping_cart.png b/public/images/emoji/twitter/shopping_cart.png index 419cc70376..69911e9841 100644 Binary files a/public/images/emoji/twitter/shopping_cart.png and b/public/images/emoji/twitter/shopping_cart.png differ diff --git a/public/images/emoji/twitter/shower.png b/public/images/emoji/twitter/shower.png index e47369360e..59619c4bba 100644 Binary files a/public/images/emoji/twitter/shower.png and b/public/images/emoji/twitter/shower.png differ diff --git a/public/images/emoji/twitter/shrimp.png b/public/images/emoji/twitter/shrimp.png index e45d741b47..1c4d6e4e0b 100644 Binary files a/public/images/emoji/twitter/shrimp.png and b/public/images/emoji/twitter/shrimp.png differ diff --git a/public/images/emoji/twitter/shushing_face.png b/public/images/emoji/twitter/shushing_face.png index e4427cbd15..a7d89b5d25 100644 Binary files a/public/images/emoji/twitter/shushing_face.png and b/public/images/emoji/twitter/shushing_face.png differ diff --git a/public/images/emoji/twitter/sierra_leone.png b/public/images/emoji/twitter/sierra_leone.png index 816f090002..de88763d0d 100644 Binary files a/public/images/emoji/twitter/sierra_leone.png and b/public/images/emoji/twitter/sierra_leone.png differ diff --git a/public/images/emoji/twitter/sign_of_the_horns.png b/public/images/emoji/twitter/sign_of_the_horns.png index 72d987aadc..e8718d1494 100644 Binary files a/public/images/emoji/twitter/sign_of_the_horns.png and b/public/images/emoji/twitter/sign_of_the_horns.png differ diff --git a/public/images/emoji/twitter/signal_strength.png b/public/images/emoji/twitter/signal_strength.png index 762da75acd..f4f93cfdc7 100644 Binary files a/public/images/emoji/twitter/signal_strength.png and b/public/images/emoji/twitter/signal_strength.png differ diff --git a/public/images/emoji/twitter/singapore.png b/public/images/emoji/twitter/singapore.png index 4cf2332d20..454b82a079 100644 Binary files a/public/images/emoji/twitter/singapore.png and b/public/images/emoji/twitter/singapore.png differ diff --git a/public/images/emoji/twitter/sint_maarten.png b/public/images/emoji/twitter/sint_maarten.png index 5248152aba..72401f5fcd 100644 Binary files a/public/images/emoji/twitter/sint_maarten.png and b/public/images/emoji/twitter/sint_maarten.png differ diff --git a/public/images/emoji/twitter/six.png b/public/images/emoji/twitter/six.png index f229efebf1..6e2c0e22b3 100644 Binary files a/public/images/emoji/twitter/six.png and b/public/images/emoji/twitter/six.png differ diff --git a/public/images/emoji/twitter/six_pointed_star.png b/public/images/emoji/twitter/six_pointed_star.png index 25fd08b612..b6f1d4f896 100644 Binary files a/public/images/emoji/twitter/six_pointed_star.png and b/public/images/emoji/twitter/six_pointed_star.png differ diff --git a/public/images/emoji/twitter/skateboard.png b/public/images/emoji/twitter/skateboard.png new file mode 100644 index 0000000000..142b14d8d7 Binary files /dev/null and b/public/images/emoji/twitter/skateboard.png differ diff --git a/public/images/emoji/twitter/skeleton.png b/public/images/emoji/twitter/skeleton.png index e9a1ff9416..3ec66641b8 100644 Binary files a/public/images/emoji/twitter/skeleton.png and b/public/images/emoji/twitter/skeleton.png differ diff --git a/public/images/emoji/twitter/ski.png b/public/images/emoji/twitter/ski.png index 09fe52fa17..c5f5037702 100644 Binary files a/public/images/emoji/twitter/ski.png and b/public/images/emoji/twitter/ski.png differ diff --git a/public/images/emoji/twitter/skier.png b/public/images/emoji/twitter/skier.png index a4cffe7aca..cb6106fca8 100644 Binary files a/public/images/emoji/twitter/skier.png and b/public/images/emoji/twitter/skier.png differ diff --git a/public/images/emoji/twitter/skull.png b/public/images/emoji/twitter/skull.png index e9a1ff9416..3ec66641b8 100644 Binary files a/public/images/emoji/twitter/skull.png and b/public/images/emoji/twitter/skull.png differ diff --git a/public/images/emoji/twitter/skull_and_crossbones.png b/public/images/emoji/twitter/skull_and_crossbones.png index df4531d2b0..2ec1c47b1b 100644 Binary files a/public/images/emoji/twitter/skull_and_crossbones.png and b/public/images/emoji/twitter/skull_and_crossbones.png differ diff --git a/public/images/emoji/twitter/skull_crossbones.png b/public/images/emoji/twitter/skull_crossbones.png index df4531d2b0..2ec1c47b1b 100644 Binary files a/public/images/emoji/twitter/skull_crossbones.png and b/public/images/emoji/twitter/skull_crossbones.png differ diff --git a/public/images/emoji/twitter/sled.png b/public/images/emoji/twitter/sled.png index 01805b1fe7..e0f5eb7ee9 100644 Binary files a/public/images/emoji/twitter/sled.png and b/public/images/emoji/twitter/sled.png differ diff --git a/public/images/emoji/twitter/sleeping.png b/public/images/emoji/twitter/sleeping.png index 0a7e19d0be..67468060f4 100644 Binary files a/public/images/emoji/twitter/sleeping.png and b/public/images/emoji/twitter/sleeping.png differ diff --git a/public/images/emoji/twitter/sleeping_accommodation.png b/public/images/emoji/twitter/sleeping_accommodation.png index 70398fd097..432262ecaf 100644 Binary files a/public/images/emoji/twitter/sleeping_accommodation.png and b/public/images/emoji/twitter/sleeping_accommodation.png differ diff --git a/public/images/emoji/twitter/sleeping_bed.png b/public/images/emoji/twitter/sleeping_bed.png index 70398fd097..432262ecaf 100644 Binary files a/public/images/emoji/twitter/sleeping_bed.png and b/public/images/emoji/twitter/sleeping_bed.png differ diff --git a/public/images/emoji/twitter/sleepy.png b/public/images/emoji/twitter/sleepy.png index ff62e35880..00b3e5f27f 100644 Binary files a/public/images/emoji/twitter/sleepy.png and b/public/images/emoji/twitter/sleepy.png differ diff --git a/public/images/emoji/twitter/sleuth_or_spy.png b/public/images/emoji/twitter/sleuth_or_spy.png index 587e506d98..785d67d45f 100644 Binary files a/public/images/emoji/twitter/sleuth_or_spy.png and b/public/images/emoji/twitter/sleuth_or_spy.png differ diff --git a/public/images/emoji/twitter/slight_frown.png b/public/images/emoji/twitter/slight_frown.png index d7dfe0e848..3fb5e718b4 100644 Binary files a/public/images/emoji/twitter/slight_frown.png and b/public/images/emoji/twitter/slight_frown.png differ diff --git a/public/images/emoji/twitter/slight_smile.png b/public/images/emoji/twitter/slight_smile.png index 89e96a6120..cf82dac0e0 100644 Binary files a/public/images/emoji/twitter/slight_smile.png and b/public/images/emoji/twitter/slight_smile.png differ diff --git a/public/images/emoji/twitter/slightly_frowning_face.png b/public/images/emoji/twitter/slightly_frowning_face.png index d7dfe0e848..3fb5e718b4 100644 Binary files a/public/images/emoji/twitter/slightly_frowning_face.png and b/public/images/emoji/twitter/slightly_frowning_face.png differ diff --git a/public/images/emoji/twitter/slightly_smiling.png b/public/images/emoji/twitter/slightly_smiling.png index 89e96a6120..cf82dac0e0 100644 Binary files a/public/images/emoji/twitter/slightly_smiling.png and b/public/images/emoji/twitter/slightly_smiling.png differ diff --git a/public/images/emoji/twitter/slightly_smiling_face.png b/public/images/emoji/twitter/slightly_smiling_face.png index 89e96a6120..cf82dac0e0 100644 Binary files a/public/images/emoji/twitter/slightly_smiling_face.png and b/public/images/emoji/twitter/slightly_smiling_face.png differ diff --git a/public/images/emoji/twitter/slot_machine.png b/public/images/emoji/twitter/slot_machine.png index bcadcc4192..10ae639b77 100644 Binary files a/public/images/emoji/twitter/slot_machine.png and b/public/images/emoji/twitter/slot_machine.png differ diff --git a/public/images/emoji/twitter/slovakia.png b/public/images/emoji/twitter/slovakia.png index 9b716032fd..276c387e03 100644 Binary files a/public/images/emoji/twitter/slovakia.png and b/public/images/emoji/twitter/slovakia.png differ diff --git a/public/images/emoji/twitter/slovenia.png b/public/images/emoji/twitter/slovenia.png index 6dfbe6eae2..473b67634f 100644 Binary files a/public/images/emoji/twitter/slovenia.png and b/public/images/emoji/twitter/slovenia.png differ diff --git a/public/images/emoji/twitter/small_airplane.png b/public/images/emoji/twitter/small_airplane.png index 47399184f7..32bc40c7f7 100644 Binary files a/public/images/emoji/twitter/small_airplane.png and b/public/images/emoji/twitter/small_airplane.png differ diff --git a/public/images/emoji/twitter/small_blue_diamond.png b/public/images/emoji/twitter/small_blue_diamond.png index b5544beb36..89ce677201 100644 Binary files a/public/images/emoji/twitter/small_blue_diamond.png and b/public/images/emoji/twitter/small_blue_diamond.png differ diff --git a/public/images/emoji/twitter/small_orange_diamond.png b/public/images/emoji/twitter/small_orange_diamond.png index 3e39911f97..2d3b7ee114 100644 Binary files a/public/images/emoji/twitter/small_orange_diamond.png and b/public/images/emoji/twitter/small_orange_diamond.png differ diff --git a/public/images/emoji/twitter/small_red_triangle.png b/public/images/emoji/twitter/small_red_triangle.png index 6412caf001..470f3d3748 100644 Binary files a/public/images/emoji/twitter/small_red_triangle.png and b/public/images/emoji/twitter/small_red_triangle.png differ diff --git a/public/images/emoji/twitter/small_red_triangle_down.png b/public/images/emoji/twitter/small_red_triangle_down.png index f392496266..ece2885060 100644 Binary files a/public/images/emoji/twitter/small_red_triangle_down.png and b/public/images/emoji/twitter/small_red_triangle_down.png differ diff --git a/public/images/emoji/twitter/smile.png b/public/images/emoji/twitter/smile.png index 4726416680..e032945e68 100644 Binary files a/public/images/emoji/twitter/smile.png and b/public/images/emoji/twitter/smile.png differ diff --git a/public/images/emoji/twitter/smile_cat.png b/public/images/emoji/twitter/smile_cat.png index 104ab4e73a..56a3acf62f 100644 Binary files a/public/images/emoji/twitter/smile_cat.png and b/public/images/emoji/twitter/smile_cat.png differ diff --git a/public/images/emoji/twitter/smiley.png b/public/images/emoji/twitter/smiley.png index f77bf3e339..e24b685f61 100644 Binary files a/public/images/emoji/twitter/smiley.png and b/public/images/emoji/twitter/smiley.png differ diff --git a/public/images/emoji/twitter/smiley_cat.png b/public/images/emoji/twitter/smiley_cat.png index ea9ae4eb56..7308864f38 100644 Binary files a/public/images/emoji/twitter/smiley_cat.png and b/public/images/emoji/twitter/smiley_cat.png differ diff --git a/public/images/emoji/twitter/smiling_face_with_three_hearts.png b/public/images/emoji/twitter/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..679e033e95 Binary files /dev/null and b/public/images/emoji/twitter/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/twitter/smiling_imp.png b/public/images/emoji/twitter/smiling_imp.png index 22b29c96a9..3e1a54cd10 100644 Binary files a/public/images/emoji/twitter/smiling_imp.png and b/public/images/emoji/twitter/smiling_imp.png differ diff --git a/public/images/emoji/twitter/smirk.png b/public/images/emoji/twitter/smirk.png index 9e1d880214..4fca129f12 100644 Binary files a/public/images/emoji/twitter/smirk.png and b/public/images/emoji/twitter/smirk.png differ diff --git a/public/images/emoji/twitter/smirk_cat.png b/public/images/emoji/twitter/smirk_cat.png index 315fdb0578..63ec3c5970 100644 Binary files a/public/images/emoji/twitter/smirk_cat.png and b/public/images/emoji/twitter/smirk_cat.png differ diff --git a/public/images/emoji/twitter/smoking.png b/public/images/emoji/twitter/smoking.png index 8e2fdd5b3f..ec1b357237 100644 Binary files a/public/images/emoji/twitter/smoking.png and b/public/images/emoji/twitter/smoking.png differ diff --git a/public/images/emoji/twitter/snail.png b/public/images/emoji/twitter/snail.png index 2c8545a395..5130904229 100644 Binary files a/public/images/emoji/twitter/snail.png and b/public/images/emoji/twitter/snail.png differ diff --git a/public/images/emoji/twitter/snake.png b/public/images/emoji/twitter/snake.png index b734332f61..920bc69382 100644 Binary files a/public/images/emoji/twitter/snake.png and b/public/images/emoji/twitter/snake.png differ diff --git a/public/images/emoji/twitter/sneezing_face.png b/public/images/emoji/twitter/sneezing_face.png index b1801ae41f..d5c7e832df 100644 Binary files a/public/images/emoji/twitter/sneezing_face.png and b/public/images/emoji/twitter/sneezing_face.png differ diff --git a/public/images/emoji/twitter/snow_capped_mountain.png b/public/images/emoji/twitter/snow_capped_mountain.png index b3e246f09b..a64401b8e8 100644 Binary files a/public/images/emoji/twitter/snow_capped_mountain.png and b/public/images/emoji/twitter/snow_capped_mountain.png differ diff --git a/public/images/emoji/twitter/snowboarder.png b/public/images/emoji/twitter/snowboarder.png index 74f312e46e..ecffe685b8 100644 Binary files a/public/images/emoji/twitter/snowboarder.png and b/public/images/emoji/twitter/snowboarder.png differ diff --git a/public/images/emoji/twitter/snowflake.png b/public/images/emoji/twitter/snowflake.png index bc9fb18279..ee53c86873 100644 Binary files a/public/images/emoji/twitter/snowflake.png and b/public/images/emoji/twitter/snowflake.png differ diff --git a/public/images/emoji/twitter/snowman.png b/public/images/emoji/twitter/snowman.png index b6c90da48d..70518ad8ed 100644 Binary files a/public/images/emoji/twitter/snowman.png and b/public/images/emoji/twitter/snowman.png differ diff --git a/public/images/emoji/twitter/snowman2.png b/public/images/emoji/twitter/snowman2.png index abefab7234..821cc967b7 100644 Binary files a/public/images/emoji/twitter/snowman2.png and b/public/images/emoji/twitter/snowman2.png differ diff --git a/public/images/emoji/twitter/snowman_with_snow.png b/public/images/emoji/twitter/snowman_with_snow.png index abefab7234..821cc967b7 100644 Binary files a/public/images/emoji/twitter/snowman_with_snow.png and b/public/images/emoji/twitter/snowman_with_snow.png differ diff --git a/public/images/emoji/twitter/soap.png b/public/images/emoji/twitter/soap.png new file mode 100644 index 0000000000..3432ebceb1 Binary files /dev/null and b/public/images/emoji/twitter/soap.png differ diff --git a/public/images/emoji/twitter/sob.png b/public/images/emoji/twitter/sob.png index faf0b07ede..554edf044f 100644 Binary files a/public/images/emoji/twitter/sob.png and b/public/images/emoji/twitter/sob.png differ diff --git a/public/images/emoji/twitter/soccer.png b/public/images/emoji/twitter/soccer.png index 28b1b60076..f19fb29a71 100644 Binary files a/public/images/emoji/twitter/soccer.png and b/public/images/emoji/twitter/soccer.png differ diff --git a/public/images/emoji/twitter/socks.png b/public/images/emoji/twitter/socks.png index 8f2b9bbe9e..924c953098 100644 Binary files a/public/images/emoji/twitter/socks.png and b/public/images/emoji/twitter/socks.png differ diff --git a/public/images/emoji/twitter/softball.png b/public/images/emoji/twitter/softball.png new file mode 100644 index 0000000000..b78c695486 Binary files /dev/null and b/public/images/emoji/twitter/softball.png differ diff --git a/public/images/emoji/twitter/solomon_islands.png b/public/images/emoji/twitter/solomon_islands.png index e4476e1880..0be05b8cd0 100644 Binary files a/public/images/emoji/twitter/solomon_islands.png and b/public/images/emoji/twitter/solomon_islands.png differ diff --git a/public/images/emoji/twitter/somalia.png b/public/images/emoji/twitter/somalia.png index 209fffeaed..eec2a4dd43 100644 Binary files a/public/images/emoji/twitter/somalia.png and b/public/images/emoji/twitter/somalia.png differ diff --git a/public/images/emoji/twitter/soon.png b/public/images/emoji/twitter/soon.png index 9edaecce85..41ad416744 100644 Binary files a/public/images/emoji/twitter/soon.png and b/public/images/emoji/twitter/soon.png differ diff --git a/public/images/emoji/twitter/sos.png b/public/images/emoji/twitter/sos.png index 38c28308b9..7eaed0602b 100644 Binary files a/public/images/emoji/twitter/sos.png and b/public/images/emoji/twitter/sos.png differ diff --git a/public/images/emoji/twitter/sound.png b/public/images/emoji/twitter/sound.png index e329e82f81..dd3b69384d 100644 Binary files a/public/images/emoji/twitter/sound.png and b/public/images/emoji/twitter/sound.png differ diff --git a/public/images/emoji/twitter/south_africa.png b/public/images/emoji/twitter/south_africa.png index d40f1c75c8..d6dde19b4e 100644 Binary files a/public/images/emoji/twitter/south_africa.png and b/public/images/emoji/twitter/south_africa.png differ diff --git a/public/images/emoji/twitter/south_georgia_south_sandwich_islands.png b/public/images/emoji/twitter/south_georgia_south_sandwich_islands.png index 58f47bcd9b..da4bbff9c6 100644 Binary files a/public/images/emoji/twitter/south_georgia_south_sandwich_islands.png and b/public/images/emoji/twitter/south_georgia_south_sandwich_islands.png differ diff --git a/public/images/emoji/twitter/south_sudan.png b/public/images/emoji/twitter/south_sudan.png index c7cbc6967c..d87839b822 100644 Binary files a/public/images/emoji/twitter/south_sudan.png and b/public/images/emoji/twitter/south_sudan.png differ diff --git a/public/images/emoji/twitter/space_invader.png b/public/images/emoji/twitter/space_invader.png index 6d38507079..043e4950ac 100644 Binary files a/public/images/emoji/twitter/space_invader.png and b/public/images/emoji/twitter/space_invader.png differ diff --git a/public/images/emoji/twitter/spades.png b/public/images/emoji/twitter/spades.png index e5eea9eed6..fe799b4e27 100644 Binary files a/public/images/emoji/twitter/spades.png and b/public/images/emoji/twitter/spades.png differ diff --git a/public/images/emoji/twitter/spaghetti.png b/public/images/emoji/twitter/spaghetti.png index 4dc8ee44d1..d03a14d2a4 100644 Binary files a/public/images/emoji/twitter/spaghetti.png and b/public/images/emoji/twitter/spaghetti.png differ diff --git a/public/images/emoji/twitter/sparkle.png b/public/images/emoji/twitter/sparkle.png index 4f242cf1e6..c89055b076 100644 Binary files a/public/images/emoji/twitter/sparkle.png and b/public/images/emoji/twitter/sparkle.png differ diff --git a/public/images/emoji/twitter/sparkler.png b/public/images/emoji/twitter/sparkler.png index 29979fb696..aed653bb06 100644 Binary files a/public/images/emoji/twitter/sparkler.png and b/public/images/emoji/twitter/sparkler.png differ diff --git a/public/images/emoji/twitter/sparkles.png b/public/images/emoji/twitter/sparkles.png index d67e396ec9..39dea598bb 100644 Binary files a/public/images/emoji/twitter/sparkles.png and b/public/images/emoji/twitter/sparkles.png differ diff --git a/public/images/emoji/twitter/sparkling_heart.png b/public/images/emoji/twitter/sparkling_heart.png index 1090b79082..b44faf40ce 100644 Binary files a/public/images/emoji/twitter/sparkling_heart.png and b/public/images/emoji/twitter/sparkling_heart.png differ diff --git a/public/images/emoji/twitter/speak_no_evil.png b/public/images/emoji/twitter/speak_no_evil.png index 7f4bf5c327..9aa4f55a97 100644 Binary files a/public/images/emoji/twitter/speak_no_evil.png and b/public/images/emoji/twitter/speak_no_evil.png differ diff --git a/public/images/emoji/twitter/speaker.png b/public/images/emoji/twitter/speaker.png index 2ae9cac2ad..7338446b9a 100644 Binary files a/public/images/emoji/twitter/speaker.png and b/public/images/emoji/twitter/speaker.png differ diff --git a/public/images/emoji/twitter/speaking_head.png b/public/images/emoji/twitter/speaking_head.png index edf252b9bd..0af72ad19c 100644 Binary files a/public/images/emoji/twitter/speaking_head.png and b/public/images/emoji/twitter/speaking_head.png differ diff --git a/public/images/emoji/twitter/speaking_head_in_silhouette.png b/public/images/emoji/twitter/speaking_head_in_silhouette.png index edf252b9bd..0af72ad19c 100644 Binary files a/public/images/emoji/twitter/speaking_head_in_silhouette.png and b/public/images/emoji/twitter/speaking_head_in_silhouette.png differ diff --git a/public/images/emoji/twitter/speech_balloon.png b/public/images/emoji/twitter/speech_balloon.png index f833a7f2e8..6a1a15effd 100644 Binary files a/public/images/emoji/twitter/speech_balloon.png and b/public/images/emoji/twitter/speech_balloon.png differ diff --git a/public/images/emoji/twitter/speedboat.png b/public/images/emoji/twitter/speedboat.png index 212bd89406..2fea9d256f 100644 Binary files a/public/images/emoji/twitter/speedboat.png and b/public/images/emoji/twitter/speedboat.png differ diff --git a/public/images/emoji/twitter/spider.png b/public/images/emoji/twitter/spider.png index 12ef291fa0..6a2d5d8869 100644 Binary files a/public/images/emoji/twitter/spider.png and b/public/images/emoji/twitter/spider.png differ diff --git a/public/images/emoji/twitter/spider_web.png b/public/images/emoji/twitter/spider_web.png index 568c1dec8a..7b5fbf6015 100644 Binary files a/public/images/emoji/twitter/spider_web.png and b/public/images/emoji/twitter/spider_web.png differ diff --git a/public/images/emoji/twitter/spiral_calendar.png b/public/images/emoji/twitter/spiral_calendar.png index 8cd3bd7e57..d7a94f62ad 100644 Binary files a/public/images/emoji/twitter/spiral_calendar.png and b/public/images/emoji/twitter/spiral_calendar.png differ diff --git a/public/images/emoji/twitter/spiral_calendar_pad.png b/public/images/emoji/twitter/spiral_calendar_pad.png index 8cd3bd7e57..d7a94f62ad 100644 Binary files a/public/images/emoji/twitter/spiral_calendar_pad.png and b/public/images/emoji/twitter/spiral_calendar_pad.png differ diff --git a/public/images/emoji/twitter/spiral_note_pad.png b/public/images/emoji/twitter/spiral_note_pad.png index b8ebfe080a..d242e6d90a 100644 Binary files a/public/images/emoji/twitter/spiral_note_pad.png and b/public/images/emoji/twitter/spiral_note_pad.png differ diff --git a/public/images/emoji/twitter/spiral_notepad.png b/public/images/emoji/twitter/spiral_notepad.png index b8ebfe080a..d242e6d90a 100644 Binary files a/public/images/emoji/twitter/spiral_notepad.png and b/public/images/emoji/twitter/spiral_notepad.png differ diff --git a/public/images/emoji/twitter/sponge.png b/public/images/emoji/twitter/sponge.png new file mode 100644 index 0000000000..1c7ee83f5e Binary files /dev/null and b/public/images/emoji/twitter/sponge.png differ diff --git a/public/images/emoji/twitter/spoon.png b/public/images/emoji/twitter/spoon.png index 960cba2bf7..1c418ebd9f 100644 Binary files a/public/images/emoji/twitter/spoon.png and b/public/images/emoji/twitter/spoon.png differ diff --git a/public/images/emoji/twitter/sports_medal.png b/public/images/emoji/twitter/sports_medal.png index 57fbc8512f..5417b3251b 100644 Binary files a/public/images/emoji/twitter/sports_medal.png and b/public/images/emoji/twitter/sports_medal.png differ diff --git a/public/images/emoji/twitter/spy.png b/public/images/emoji/twitter/spy.png index 587e506d98..785d67d45f 100644 Binary files a/public/images/emoji/twitter/spy.png and b/public/images/emoji/twitter/spy.png differ diff --git a/public/images/emoji/twitter/squid.png b/public/images/emoji/twitter/squid.png index 8e1b95f60e..8e1aa1e27a 100644 Binary files a/public/images/emoji/twitter/squid.png and b/public/images/emoji/twitter/squid.png differ diff --git a/public/images/emoji/twitter/sri_lanka.png b/public/images/emoji/twitter/sri_lanka.png index f15b9be56d..8f8d0b3aea 100644 Binary files a/public/images/emoji/twitter/sri_lanka.png and b/public/images/emoji/twitter/sri_lanka.png differ diff --git a/public/images/emoji/twitter/st_barthelemy.png b/public/images/emoji/twitter/st_barthelemy.png index e213bf7e40..f879335239 100644 Binary files a/public/images/emoji/twitter/st_barthelemy.png and b/public/images/emoji/twitter/st_barthelemy.png differ diff --git a/public/images/emoji/twitter/st_helena.png b/public/images/emoji/twitter/st_helena.png index 90fefd0cab..2d0df5102e 100644 Binary files a/public/images/emoji/twitter/st_helena.png and b/public/images/emoji/twitter/st_helena.png differ diff --git a/public/images/emoji/twitter/st_kitts_nevis.png b/public/images/emoji/twitter/st_kitts_nevis.png index d7686f8b60..e021417b87 100644 Binary files a/public/images/emoji/twitter/st_kitts_nevis.png and b/public/images/emoji/twitter/st_kitts_nevis.png differ diff --git a/public/images/emoji/twitter/st_lucia.png b/public/images/emoji/twitter/st_lucia.png index 92eafffe94..1b7e53a859 100644 Binary files a/public/images/emoji/twitter/st_lucia.png and b/public/images/emoji/twitter/st_lucia.png differ diff --git a/public/images/emoji/twitter/st_martin.png b/public/images/emoji/twitter/st_martin.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/twitter/st_martin.png and b/public/images/emoji/twitter/st_martin.png differ diff --git a/public/images/emoji/twitter/st_pierre_miquelon.png b/public/images/emoji/twitter/st_pierre_miquelon.png index b05828b47c..357a863146 100644 Binary files a/public/images/emoji/twitter/st_pierre_miquelon.png and b/public/images/emoji/twitter/st_pierre_miquelon.png differ diff --git a/public/images/emoji/twitter/st_vincent_grenadines.png b/public/images/emoji/twitter/st_vincent_grenadines.png index ddfd25fd22..0ace0a610d 100644 Binary files a/public/images/emoji/twitter/st_vincent_grenadines.png and b/public/images/emoji/twitter/st_vincent_grenadines.png differ diff --git a/public/images/emoji/twitter/stadium.png b/public/images/emoji/twitter/stadium.png index 0ad57f80a4..37ff5d23c3 100644 Binary files a/public/images/emoji/twitter/stadium.png and b/public/images/emoji/twitter/stadium.png differ diff --git a/public/images/emoji/twitter/star.png b/public/images/emoji/twitter/star.png index 05c465d8bc..0590867e07 100644 Binary files a/public/images/emoji/twitter/star.png and b/public/images/emoji/twitter/star.png differ diff --git a/public/images/emoji/twitter/star2.png b/public/images/emoji/twitter/star2.png index 3243a0a11b..133a3aaa31 100644 Binary files a/public/images/emoji/twitter/star2.png and b/public/images/emoji/twitter/star2.png differ diff --git a/public/images/emoji/twitter/star_and_crescent.png b/public/images/emoji/twitter/star_and_crescent.png index a89f689ad5..c7538a524b 100644 Binary files a/public/images/emoji/twitter/star_and_crescent.png and b/public/images/emoji/twitter/star_and_crescent.png differ diff --git a/public/images/emoji/twitter/star_of_david.png b/public/images/emoji/twitter/star_of_david.png index 96462ffd58..149560071a 100644 Binary files a/public/images/emoji/twitter/star_of_david.png and b/public/images/emoji/twitter/star_of_david.png differ diff --git a/public/images/emoji/twitter/star_struck.png b/public/images/emoji/twitter/star_struck.png index 7da8183f39..8c7912ddef 100644 Binary files a/public/images/emoji/twitter/star_struck.png and b/public/images/emoji/twitter/star_struck.png differ diff --git a/public/images/emoji/twitter/stars.png b/public/images/emoji/twitter/stars.png index 2eac0bd6ba..95f4f25d5b 100644 Binary files a/public/images/emoji/twitter/stars.png and b/public/images/emoji/twitter/stars.png differ diff --git a/public/images/emoji/twitter/station.png b/public/images/emoji/twitter/station.png index 10758831eb..596d8d6142 100644 Binary files a/public/images/emoji/twitter/station.png and b/public/images/emoji/twitter/station.png differ diff --git a/public/images/emoji/twitter/statue_of_liberty.png b/public/images/emoji/twitter/statue_of_liberty.png index a7323b5e91..77f2d8f7e9 100644 Binary files a/public/images/emoji/twitter/statue_of_liberty.png and b/public/images/emoji/twitter/statue_of_liberty.png differ diff --git a/public/images/emoji/twitter/steam_locomotive.png b/public/images/emoji/twitter/steam_locomotive.png index 37b6bee920..cbad8b0189 100644 Binary files a/public/images/emoji/twitter/steam_locomotive.png and b/public/images/emoji/twitter/steam_locomotive.png differ diff --git a/public/images/emoji/twitter/stew.png b/public/images/emoji/twitter/stew.png index 708d29b733..22775a2c2f 100644 Binary files a/public/images/emoji/twitter/stew.png and b/public/images/emoji/twitter/stew.png differ diff --git a/public/images/emoji/twitter/stop_button.png b/public/images/emoji/twitter/stop_button.png index bbdb0b7b75..20e5a17043 100644 Binary files a/public/images/emoji/twitter/stop_button.png and b/public/images/emoji/twitter/stop_button.png differ diff --git a/public/images/emoji/twitter/stop_sign.png b/public/images/emoji/twitter/stop_sign.png index cf08756ebf..583f00dfd6 100644 Binary files a/public/images/emoji/twitter/stop_sign.png and b/public/images/emoji/twitter/stop_sign.png differ diff --git a/public/images/emoji/twitter/stopwatch.png b/public/images/emoji/twitter/stopwatch.png index 74bff44004..34d7f141a0 100644 Binary files a/public/images/emoji/twitter/stopwatch.png and b/public/images/emoji/twitter/stopwatch.png differ diff --git a/public/images/emoji/twitter/straight_ruler.png b/public/images/emoji/twitter/straight_ruler.png index 1e7ae4b9de..c37f26ee7a 100644 Binary files a/public/images/emoji/twitter/straight_ruler.png and b/public/images/emoji/twitter/straight_ruler.png differ diff --git a/public/images/emoji/twitter/strawberry.png b/public/images/emoji/twitter/strawberry.png index 9471d8e545..4be38e7c9f 100644 Binary files a/public/images/emoji/twitter/strawberry.png and b/public/images/emoji/twitter/strawberry.png differ diff --git a/public/images/emoji/twitter/stuck_out_tongue.png b/public/images/emoji/twitter/stuck_out_tongue.png index dca4ab017e..ef8fc79716 100644 Binary files a/public/images/emoji/twitter/stuck_out_tongue.png and b/public/images/emoji/twitter/stuck_out_tongue.png differ diff --git a/public/images/emoji/twitter/stuck_out_tongue_closed_eyes.png b/public/images/emoji/twitter/stuck_out_tongue_closed_eyes.png index dd35229ed1..d1b36d4154 100644 Binary files a/public/images/emoji/twitter/stuck_out_tongue_closed_eyes.png and b/public/images/emoji/twitter/stuck_out_tongue_closed_eyes.png differ diff --git a/public/images/emoji/twitter/stuck_out_tongue_winking_eye.png b/public/images/emoji/twitter/stuck_out_tongue_winking_eye.png index 3bd49a186c..5042a48dac 100644 Binary files a/public/images/emoji/twitter/stuck_out_tongue_winking_eye.png and b/public/images/emoji/twitter/stuck_out_tongue_winking_eye.png differ diff --git a/public/images/emoji/twitter/studio_microphone.png b/public/images/emoji/twitter/studio_microphone.png index d10b32281f..8574cb4b2d 100644 Binary files a/public/images/emoji/twitter/studio_microphone.png and b/public/images/emoji/twitter/studio_microphone.png differ diff --git a/public/images/emoji/twitter/stuffed_flatbread.png b/public/images/emoji/twitter/stuffed_flatbread.png index f5dca14bd2..f3377b9382 100644 Binary files a/public/images/emoji/twitter/stuffed_flatbread.png and b/public/images/emoji/twitter/stuffed_flatbread.png differ diff --git a/public/images/emoji/twitter/sudan.png b/public/images/emoji/twitter/sudan.png index 3974a07328..56bc0f0b5c 100644 Binary files a/public/images/emoji/twitter/sudan.png and b/public/images/emoji/twitter/sudan.png differ diff --git a/public/images/emoji/twitter/sun_behind_large_cloud.png b/public/images/emoji/twitter/sun_behind_large_cloud.png index 3ceb40a9ec..93a39d5083 100644 Binary files a/public/images/emoji/twitter/sun_behind_large_cloud.png and b/public/images/emoji/twitter/sun_behind_large_cloud.png differ diff --git a/public/images/emoji/twitter/sun_behind_rain_cloud.png b/public/images/emoji/twitter/sun_behind_rain_cloud.png index ef892f1f88..e0ebf7437d 100644 Binary files a/public/images/emoji/twitter/sun_behind_rain_cloud.png and b/public/images/emoji/twitter/sun_behind_rain_cloud.png differ diff --git a/public/images/emoji/twitter/sun_behind_small_cloud.png b/public/images/emoji/twitter/sun_behind_small_cloud.png index 90af3591e0..61c53ff910 100644 Binary files a/public/images/emoji/twitter/sun_behind_small_cloud.png and b/public/images/emoji/twitter/sun_behind_small_cloud.png differ diff --git a/public/images/emoji/twitter/sun_with_face.png b/public/images/emoji/twitter/sun_with_face.png index 05d645ea07..4a928c085e 100644 Binary files a/public/images/emoji/twitter/sun_with_face.png and b/public/images/emoji/twitter/sun_with_face.png differ diff --git a/public/images/emoji/twitter/sunflower.png b/public/images/emoji/twitter/sunflower.png index 04867d738d..7770c79ae2 100644 Binary files a/public/images/emoji/twitter/sunflower.png and b/public/images/emoji/twitter/sunflower.png differ diff --git a/public/images/emoji/twitter/sunglasses.png b/public/images/emoji/twitter/sunglasses.png index 5a9c57a7be..1a0560df6d 100644 Binary files a/public/images/emoji/twitter/sunglasses.png and b/public/images/emoji/twitter/sunglasses.png differ diff --git a/public/images/emoji/twitter/sunny.png b/public/images/emoji/twitter/sunny.png index 99a9c31e9c..718b31db31 100644 Binary files a/public/images/emoji/twitter/sunny.png and b/public/images/emoji/twitter/sunny.png differ diff --git a/public/images/emoji/twitter/sunrise.png b/public/images/emoji/twitter/sunrise.png index effc33940c..5bd0b0b503 100644 Binary files a/public/images/emoji/twitter/sunrise.png and b/public/images/emoji/twitter/sunrise.png differ diff --git a/public/images/emoji/twitter/sunrise_over_mountains.png b/public/images/emoji/twitter/sunrise_over_mountains.png index 13c27a2f32..f51b09ed8a 100644 Binary files a/public/images/emoji/twitter/sunrise_over_mountains.png and b/public/images/emoji/twitter/sunrise_over_mountains.png differ diff --git a/public/images/emoji/twitter/superhero.png b/public/images/emoji/twitter/superhero.png new file mode 100644 index 0000000000..91080cba2e Binary files /dev/null and b/public/images/emoji/twitter/superhero.png differ diff --git a/public/images/emoji/twitter/supervillain.png b/public/images/emoji/twitter/supervillain.png new file mode 100644 index 0000000000..9fb7495003 Binary files /dev/null and b/public/images/emoji/twitter/supervillain.png differ diff --git a/public/images/emoji/twitter/surfer.png b/public/images/emoji/twitter/surfer.png index a8ebb68584..f8621531c4 100644 Binary files a/public/images/emoji/twitter/surfer.png and b/public/images/emoji/twitter/surfer.png differ diff --git a/public/images/emoji/twitter/surfing_man.png b/public/images/emoji/twitter/surfing_man.png index a8ebb68584..f8621531c4 100644 Binary files a/public/images/emoji/twitter/surfing_man.png and b/public/images/emoji/twitter/surfing_man.png differ diff --git a/public/images/emoji/twitter/surfing_woman.png b/public/images/emoji/twitter/surfing_woman.png index 5a5e1cefda..2ee4ea1530 100644 Binary files a/public/images/emoji/twitter/surfing_woman.png and b/public/images/emoji/twitter/surfing_woman.png differ diff --git a/public/images/emoji/twitter/suriname.png b/public/images/emoji/twitter/suriname.png index 48afc4adac..7c1afcdceb 100644 Binary files a/public/images/emoji/twitter/suriname.png and b/public/images/emoji/twitter/suriname.png differ diff --git a/public/images/emoji/twitter/sushi.png b/public/images/emoji/twitter/sushi.png index ffe8a7f7fe..5c703ff7c7 100644 Binary files a/public/images/emoji/twitter/sushi.png and b/public/images/emoji/twitter/sushi.png differ diff --git a/public/images/emoji/twitter/suspension_railway.png b/public/images/emoji/twitter/suspension_railway.png index fd713c6dce..b4c7142f16 100644 Binary files a/public/images/emoji/twitter/suspension_railway.png and b/public/images/emoji/twitter/suspension_railway.png differ diff --git a/public/images/emoji/twitter/svalbard_and_jan_mayen.png b/public/images/emoji/twitter/svalbard_and_jan_mayen.png index 004a11d830..151484e1db 100644 Binary files a/public/images/emoji/twitter/svalbard_and_jan_mayen.png and b/public/images/emoji/twitter/svalbard_and_jan_mayen.png differ diff --git a/public/images/emoji/twitter/swan.png b/public/images/emoji/twitter/swan.png new file mode 100644 index 0000000000..8fedcfee6a Binary files /dev/null and b/public/images/emoji/twitter/swan.png differ diff --git a/public/images/emoji/twitter/swaziland.png b/public/images/emoji/twitter/swaziland.png index fb5ee97ba2..0cf3fb1d73 100644 Binary files a/public/images/emoji/twitter/swaziland.png and b/public/images/emoji/twitter/swaziland.png differ diff --git a/public/images/emoji/twitter/sweat.png b/public/images/emoji/twitter/sweat.png index d8588f6a7f..eabfb69ef0 100644 Binary files a/public/images/emoji/twitter/sweat.png and b/public/images/emoji/twitter/sweat.png differ diff --git a/public/images/emoji/twitter/sweat_drops.png b/public/images/emoji/twitter/sweat_drops.png index 9ac6c5fced..6bec97d0c0 100644 Binary files a/public/images/emoji/twitter/sweat_drops.png and b/public/images/emoji/twitter/sweat_drops.png differ diff --git a/public/images/emoji/twitter/sweat_smile.png b/public/images/emoji/twitter/sweat_smile.png index 3ceaa5bf38..bfc7c287f5 100644 Binary files a/public/images/emoji/twitter/sweat_smile.png and b/public/images/emoji/twitter/sweat_smile.png differ diff --git a/public/images/emoji/twitter/sweden.png b/public/images/emoji/twitter/sweden.png index 3b46fe18ab..4afbdcac76 100644 Binary files a/public/images/emoji/twitter/sweden.png and b/public/images/emoji/twitter/sweden.png differ diff --git a/public/images/emoji/twitter/sweet_potato.png b/public/images/emoji/twitter/sweet_potato.png index 63c6cc807c..fc200f21da 100644 Binary files a/public/images/emoji/twitter/sweet_potato.png and b/public/images/emoji/twitter/sweet_potato.png differ diff --git a/public/images/emoji/twitter/swimmer.png b/public/images/emoji/twitter/swimmer.png index 030252ec90..662964474c 100644 Binary files a/public/images/emoji/twitter/swimmer.png and b/public/images/emoji/twitter/swimmer.png differ diff --git a/public/images/emoji/twitter/swimming_man.png b/public/images/emoji/twitter/swimming_man.png index 030252ec90..662964474c 100644 Binary files a/public/images/emoji/twitter/swimming_man.png and b/public/images/emoji/twitter/swimming_man.png differ diff --git a/public/images/emoji/twitter/swimming_woman.png b/public/images/emoji/twitter/swimming_woman.png index 9963221f61..5f3f0483fc 100644 Binary files a/public/images/emoji/twitter/swimming_woman.png and b/public/images/emoji/twitter/swimming_woman.png differ diff --git a/public/images/emoji/twitter/switzerland.png b/public/images/emoji/twitter/switzerland.png index e0caa61ba6..bc50b99e54 100644 Binary files a/public/images/emoji/twitter/switzerland.png and b/public/images/emoji/twitter/switzerland.png differ diff --git a/public/images/emoji/twitter/symbols.png b/public/images/emoji/twitter/symbols.png index e2c4d08d86..fa2d4ec815 100644 Binary files a/public/images/emoji/twitter/symbols.png and b/public/images/emoji/twitter/symbols.png differ diff --git a/public/images/emoji/twitter/synagogue.png b/public/images/emoji/twitter/synagogue.png index c72b028f24..5fdd4be596 100644 Binary files a/public/images/emoji/twitter/synagogue.png and b/public/images/emoji/twitter/synagogue.png differ diff --git a/public/images/emoji/twitter/syria.png b/public/images/emoji/twitter/syria.png index 53606f3e07..3dae2a2fcc 100644 Binary files a/public/images/emoji/twitter/syria.png and b/public/images/emoji/twitter/syria.png differ diff --git a/public/images/emoji/twitter/syringe.png b/public/images/emoji/twitter/syringe.png index 0064516f1b..5e16324c89 100644 Binary files a/public/images/emoji/twitter/syringe.png and b/public/images/emoji/twitter/syringe.png differ diff --git a/public/images/emoji/twitter/t_rex.png b/public/images/emoji/twitter/t_rex.png index d8811a5638..9b69bbf2bb 100644 Binary files a/public/images/emoji/twitter/t_rex.png and b/public/images/emoji/twitter/t_rex.png differ diff --git a/public/images/emoji/twitter/table_tennis.png b/public/images/emoji/twitter/table_tennis.png index 935993c860..6d5a36dbf3 100644 Binary files a/public/images/emoji/twitter/table_tennis.png and b/public/images/emoji/twitter/table_tennis.png differ diff --git a/public/images/emoji/twitter/taco.png b/public/images/emoji/twitter/taco.png index 14247eb307..258b70337e 100644 Binary files a/public/images/emoji/twitter/taco.png and b/public/images/emoji/twitter/taco.png differ diff --git a/public/images/emoji/twitter/tada.png b/public/images/emoji/twitter/tada.png index 02ad12d282..863661cd75 100644 Binary files a/public/images/emoji/twitter/tada.png and b/public/images/emoji/twitter/tada.png differ diff --git a/public/images/emoji/twitter/taiwan.png b/public/images/emoji/twitter/taiwan.png index dde348b40d..08123315bb 100644 Binary files a/public/images/emoji/twitter/taiwan.png and b/public/images/emoji/twitter/taiwan.png differ diff --git a/public/images/emoji/twitter/tajikistan.png b/public/images/emoji/twitter/tajikistan.png index 7b3697952d..7754926396 100644 Binary files a/public/images/emoji/twitter/tajikistan.png and b/public/images/emoji/twitter/tajikistan.png differ diff --git a/public/images/emoji/twitter/takeout_box.png b/public/images/emoji/twitter/takeout_box.png index 08aa6a4843..7746b2b8cd 100644 Binary files a/public/images/emoji/twitter/takeout_box.png and b/public/images/emoji/twitter/takeout_box.png differ diff --git a/public/images/emoji/twitter/tanabata_tree.png b/public/images/emoji/twitter/tanabata_tree.png index eb67d0ef81..8fe41cf130 100644 Binary files a/public/images/emoji/twitter/tanabata_tree.png and b/public/images/emoji/twitter/tanabata_tree.png differ diff --git a/public/images/emoji/twitter/tangerine.png b/public/images/emoji/twitter/tangerine.png index b6f8853844..446614f3ce 100644 Binary files a/public/images/emoji/twitter/tangerine.png and b/public/images/emoji/twitter/tangerine.png differ diff --git a/public/images/emoji/twitter/tanzania.png b/public/images/emoji/twitter/tanzania.png index d4026fea32..911f48da8b 100644 Binary files a/public/images/emoji/twitter/tanzania.png and b/public/images/emoji/twitter/tanzania.png differ diff --git a/public/images/emoji/twitter/taurus.png b/public/images/emoji/twitter/taurus.png index a6cddc2740..f0637c72c5 100644 Binary files a/public/images/emoji/twitter/taurus.png and b/public/images/emoji/twitter/taurus.png differ diff --git a/public/images/emoji/twitter/taxi.png b/public/images/emoji/twitter/taxi.png index 51348cd962..118ac470c3 100644 Binary files a/public/images/emoji/twitter/taxi.png and b/public/images/emoji/twitter/taxi.png differ diff --git a/public/images/emoji/twitter/tea.png b/public/images/emoji/twitter/tea.png index 19a6fdb7e5..c43459850e 100644 Binary files a/public/images/emoji/twitter/tea.png and b/public/images/emoji/twitter/tea.png differ diff --git a/public/images/emoji/twitter/teddy_bear.png b/public/images/emoji/twitter/teddy_bear.png new file mode 100644 index 0000000000..4ba5b7bb59 Binary files /dev/null and b/public/images/emoji/twitter/teddy_bear.png differ diff --git a/public/images/emoji/twitter/telephone.png b/public/images/emoji/twitter/telephone.png index 749e9f38ae..cbee27cc53 100644 Binary files a/public/images/emoji/twitter/telephone.png and b/public/images/emoji/twitter/telephone.png differ diff --git a/public/images/emoji/twitter/telephone_receiver.png b/public/images/emoji/twitter/telephone_receiver.png index 11edc3ce8f..7d33fe67a1 100644 Binary files a/public/images/emoji/twitter/telephone_receiver.png and b/public/images/emoji/twitter/telephone_receiver.png differ diff --git a/public/images/emoji/twitter/telescope.png b/public/images/emoji/twitter/telescope.png index efa940750b..f180454c6c 100644 Binary files a/public/images/emoji/twitter/telescope.png and b/public/images/emoji/twitter/telescope.png differ diff --git a/public/images/emoji/twitter/ten.png b/public/images/emoji/twitter/ten.png index 77727fec80..bc4b0fd18b 100644 Binary files a/public/images/emoji/twitter/ten.png and b/public/images/emoji/twitter/ten.png differ diff --git a/public/images/emoji/twitter/tennis.png b/public/images/emoji/twitter/tennis.png index 7e45256cc7..6eb3a19dc9 100644 Binary files a/public/images/emoji/twitter/tennis.png and b/public/images/emoji/twitter/tennis.png differ diff --git a/public/images/emoji/twitter/tent.png b/public/images/emoji/twitter/tent.png index 6cbddd76d6..1763e75167 100644 Binary files a/public/images/emoji/twitter/tent.png and b/public/images/emoji/twitter/tent.png differ diff --git a/public/images/emoji/twitter/test_tube.png b/public/images/emoji/twitter/test_tube.png new file mode 100644 index 0000000000..a004650181 Binary files /dev/null and b/public/images/emoji/twitter/test_tube.png differ diff --git a/public/images/emoji/twitter/thailand.png b/public/images/emoji/twitter/thailand.png index 81499f1616..218a284af0 100644 Binary files a/public/images/emoji/twitter/thailand.png and b/public/images/emoji/twitter/thailand.png differ diff --git a/public/images/emoji/twitter/thermometer.png b/public/images/emoji/twitter/thermometer.png index eef50895b0..c317b7e187 100644 Binary files a/public/images/emoji/twitter/thermometer.png and b/public/images/emoji/twitter/thermometer.png differ diff --git a/public/images/emoji/twitter/thermometer_face.png b/public/images/emoji/twitter/thermometer_face.png index c9440239c0..79d49eb0a6 100644 Binary files a/public/images/emoji/twitter/thermometer_face.png and b/public/images/emoji/twitter/thermometer_face.png differ diff --git a/public/images/emoji/twitter/thinking.png b/public/images/emoji/twitter/thinking.png index f1bc0726a2..7ca53a0a67 100644 Binary files a/public/images/emoji/twitter/thinking.png and b/public/images/emoji/twitter/thinking.png differ diff --git a/public/images/emoji/twitter/thinking_face.png b/public/images/emoji/twitter/thinking_face.png index f1bc0726a2..7ca53a0a67 100644 Binary files a/public/images/emoji/twitter/thinking_face.png and b/public/images/emoji/twitter/thinking_face.png differ diff --git a/public/images/emoji/twitter/thought_balloon.png b/public/images/emoji/twitter/thought_balloon.png index cffdcb58f7..f31b046294 100644 Binary files a/public/images/emoji/twitter/thought_balloon.png and b/public/images/emoji/twitter/thought_balloon.png differ diff --git a/public/images/emoji/twitter/thread.png b/public/images/emoji/twitter/thread.png new file mode 100644 index 0000000000..b7b58f1b6a Binary files /dev/null and b/public/images/emoji/twitter/thread.png differ diff --git a/public/images/emoji/twitter/three.png b/public/images/emoji/twitter/three.png index ed9281a364..4b77c2d792 100644 Binary files a/public/images/emoji/twitter/three.png and b/public/images/emoji/twitter/three.png differ diff --git a/public/images/emoji/twitter/three_button_mouse.png b/public/images/emoji/twitter/three_button_mouse.png index 3a71c800c6..a8c2b82f50 100644 Binary files a/public/images/emoji/twitter/three_button_mouse.png and b/public/images/emoji/twitter/three_button_mouse.png differ diff --git a/public/images/emoji/twitter/thumbsdown.png b/public/images/emoji/twitter/thumbsdown.png index 4f345c5355..3801fe8f3e 100644 Binary files a/public/images/emoji/twitter/thumbsdown.png and b/public/images/emoji/twitter/thumbsdown.png differ diff --git a/public/images/emoji/twitter/thumbsup.png b/public/images/emoji/twitter/thumbsup.png index a64fb47520..5bae81d159 100644 Binary files a/public/images/emoji/twitter/thumbsup.png and b/public/images/emoji/twitter/thumbsup.png differ diff --git a/public/images/emoji/twitter/thunder_cloud_and_rain.png b/public/images/emoji/twitter/thunder_cloud_and_rain.png index be44d531a7..699b775ce6 100644 Binary files a/public/images/emoji/twitter/thunder_cloud_and_rain.png and b/public/images/emoji/twitter/thunder_cloud_and_rain.png differ diff --git a/public/images/emoji/twitter/thunder_cloud_rain.png b/public/images/emoji/twitter/thunder_cloud_rain.png index be44d531a7..699b775ce6 100644 Binary files a/public/images/emoji/twitter/thunder_cloud_rain.png and b/public/images/emoji/twitter/thunder_cloud_rain.png differ diff --git a/public/images/emoji/twitter/ticket.png b/public/images/emoji/twitter/ticket.png index c304049b2f..072235f16e 100644 Binary files a/public/images/emoji/twitter/ticket.png and b/public/images/emoji/twitter/ticket.png differ diff --git a/public/images/emoji/twitter/tickets.png b/public/images/emoji/twitter/tickets.png index 295e9bbdc6..d79c8e5d47 100644 Binary files a/public/images/emoji/twitter/tickets.png and b/public/images/emoji/twitter/tickets.png differ diff --git a/public/images/emoji/twitter/tiger.png b/public/images/emoji/twitter/tiger.png index 9ef50eda88..cb9915252d 100644 Binary files a/public/images/emoji/twitter/tiger.png and b/public/images/emoji/twitter/tiger.png differ diff --git a/public/images/emoji/twitter/tiger2.png b/public/images/emoji/twitter/tiger2.png index c7ff0c963c..eb20e615c5 100644 Binary files a/public/images/emoji/twitter/tiger2.png and b/public/images/emoji/twitter/tiger2.png differ diff --git a/public/images/emoji/twitter/timer.png b/public/images/emoji/twitter/timer.png index 31f31d8937..54df03187e 100644 Binary files a/public/images/emoji/twitter/timer.png and b/public/images/emoji/twitter/timer.png differ diff --git a/public/images/emoji/twitter/timer_clock.png b/public/images/emoji/twitter/timer_clock.png index 31f31d8937..54df03187e 100644 Binary files a/public/images/emoji/twitter/timer_clock.png and b/public/images/emoji/twitter/timer_clock.png differ diff --git a/public/images/emoji/twitter/timor_leste.png b/public/images/emoji/twitter/timor_leste.png index 6706def991..ab697eea2e 100644 Binary files a/public/images/emoji/twitter/timor_leste.png and b/public/images/emoji/twitter/timor_leste.png differ diff --git a/public/images/emoji/twitter/tipping_hand_man.png b/public/images/emoji/twitter/tipping_hand_man.png index 63e5492220..0c1369ab73 100644 Binary files a/public/images/emoji/twitter/tipping_hand_man.png and b/public/images/emoji/twitter/tipping_hand_man.png differ diff --git a/public/images/emoji/twitter/tipping_hand_woman.png b/public/images/emoji/twitter/tipping_hand_woman.png index 03f5030410..7d947fe533 100644 Binary files a/public/images/emoji/twitter/tipping_hand_woman.png and b/public/images/emoji/twitter/tipping_hand_woman.png differ diff --git a/public/images/emoji/twitter/tired_face.png b/public/images/emoji/twitter/tired_face.png index 4da81b158c..db9edc1eb7 100644 Binary files a/public/images/emoji/twitter/tired_face.png and b/public/images/emoji/twitter/tired_face.png differ diff --git a/public/images/emoji/twitter/tm.png b/public/images/emoji/twitter/tm.png index 8727b45e63..ab522a9a71 100644 Binary files a/public/images/emoji/twitter/tm.png and b/public/images/emoji/twitter/tm.png differ diff --git a/public/images/emoji/twitter/togo.png b/public/images/emoji/twitter/togo.png index 7a542547e0..1e3706997e 100644 Binary files a/public/images/emoji/twitter/togo.png and b/public/images/emoji/twitter/togo.png differ diff --git a/public/images/emoji/twitter/toilet.png b/public/images/emoji/twitter/toilet.png index 8031faeb2a..12ef0f7d83 100644 Binary files a/public/images/emoji/twitter/toilet.png and b/public/images/emoji/twitter/toilet.png differ diff --git a/public/images/emoji/twitter/tokelau.png b/public/images/emoji/twitter/tokelau.png index f42f868631..122903dfe2 100644 Binary files a/public/images/emoji/twitter/tokelau.png and b/public/images/emoji/twitter/tokelau.png differ diff --git a/public/images/emoji/twitter/tokyo_tower.png b/public/images/emoji/twitter/tokyo_tower.png index 9d88cb1e27..7bb1b9764b 100644 Binary files a/public/images/emoji/twitter/tokyo_tower.png and b/public/images/emoji/twitter/tokyo_tower.png differ diff --git a/public/images/emoji/twitter/tomato.png b/public/images/emoji/twitter/tomato.png index 95d1e38fba..93eaaae6ef 100644 Binary files a/public/images/emoji/twitter/tomato.png and b/public/images/emoji/twitter/tomato.png differ diff --git a/public/images/emoji/twitter/tonga.png b/public/images/emoji/twitter/tonga.png index bfff80acf4..22d9eb5d37 100644 Binary files a/public/images/emoji/twitter/tonga.png and b/public/images/emoji/twitter/tonga.png differ diff --git a/public/images/emoji/twitter/tongue.png b/public/images/emoji/twitter/tongue.png index e700e9344a..ffa8136d6c 100644 Binary files a/public/images/emoji/twitter/tongue.png and b/public/images/emoji/twitter/tongue.png differ diff --git a/public/images/emoji/twitter/toolbox.png b/public/images/emoji/twitter/toolbox.png new file mode 100644 index 0000000000..f66bd60df4 Binary files /dev/null and b/public/images/emoji/twitter/toolbox.png differ diff --git a/public/images/emoji/twitter/tools.png b/public/images/emoji/twitter/tools.png index 2b7c33b207..5adbd1c5de 100644 Binary files a/public/images/emoji/twitter/tools.png and b/public/images/emoji/twitter/tools.png differ diff --git a/public/images/emoji/twitter/tooth.png b/public/images/emoji/twitter/tooth.png new file mode 100644 index 0000000000..f5d32ea713 Binary files /dev/null and b/public/images/emoji/twitter/tooth.png differ diff --git a/public/images/emoji/twitter/top.png b/public/images/emoji/twitter/top.png index 41074daeac..51ed12598b 100644 Binary files a/public/images/emoji/twitter/top.png and b/public/images/emoji/twitter/top.png differ diff --git a/public/images/emoji/twitter/tophat.png b/public/images/emoji/twitter/tophat.png index be0f1d2a0f..5fee11c3fe 100644 Binary files a/public/images/emoji/twitter/tophat.png and b/public/images/emoji/twitter/tophat.png differ diff --git a/public/images/emoji/twitter/tornado.png b/public/images/emoji/twitter/tornado.png index fd843824ed..63f4e7c05f 100644 Binary files a/public/images/emoji/twitter/tornado.png and b/public/images/emoji/twitter/tornado.png differ diff --git a/public/images/emoji/twitter/tr.png b/public/images/emoji/twitter/tr.png index 3b6fc16379..a80ec23d64 100644 Binary files a/public/images/emoji/twitter/tr.png and b/public/images/emoji/twitter/tr.png differ diff --git a/public/images/emoji/twitter/track_next.png b/public/images/emoji/twitter/track_next.png index 13953da5d7..a69200295c 100644 Binary files a/public/images/emoji/twitter/track_next.png and b/public/images/emoji/twitter/track_next.png differ diff --git a/public/images/emoji/twitter/track_previous.png b/public/images/emoji/twitter/track_previous.png index ada39abc33..cf46498466 100644 Binary files a/public/images/emoji/twitter/track_previous.png and b/public/images/emoji/twitter/track_previous.png differ diff --git a/public/images/emoji/twitter/trackball.png b/public/images/emoji/twitter/trackball.png index c2258edc12..bc385aa745 100644 Binary files a/public/images/emoji/twitter/trackball.png and b/public/images/emoji/twitter/trackball.png differ diff --git a/public/images/emoji/twitter/tractor.png b/public/images/emoji/twitter/tractor.png index c441c89305..715c1511d5 100644 Binary files a/public/images/emoji/twitter/tractor.png and b/public/images/emoji/twitter/tractor.png differ diff --git a/public/images/emoji/twitter/traffic_light.png b/public/images/emoji/twitter/traffic_light.png index ef646b3292..9755cdc410 100644 Binary files a/public/images/emoji/twitter/traffic_light.png and b/public/images/emoji/twitter/traffic_light.png differ diff --git a/public/images/emoji/twitter/train.png b/public/images/emoji/twitter/train.png index 5d31926cad..4b4ec0c30b 100644 Binary files a/public/images/emoji/twitter/train.png and b/public/images/emoji/twitter/train.png differ diff --git a/public/images/emoji/twitter/train2.png b/public/images/emoji/twitter/train2.png index 744c7e9586..3f7f8c0b4b 100644 Binary files a/public/images/emoji/twitter/train2.png and b/public/images/emoji/twitter/train2.png differ diff --git a/public/images/emoji/twitter/tram.png b/public/images/emoji/twitter/tram.png index 51b66575a6..1af96a06bd 100644 Binary files a/public/images/emoji/twitter/tram.png and b/public/images/emoji/twitter/tram.png differ diff --git a/public/images/emoji/twitter/triangular_flag_on_post.png b/public/images/emoji/twitter/triangular_flag_on_post.png index 1fde97f945..aa650d6dcb 100644 Binary files a/public/images/emoji/twitter/triangular_flag_on_post.png and b/public/images/emoji/twitter/triangular_flag_on_post.png differ diff --git a/public/images/emoji/twitter/triangular_ruler.png b/public/images/emoji/twitter/triangular_ruler.png index cd1ccf67a4..ccc5b2cd7b 100644 Binary files a/public/images/emoji/twitter/triangular_ruler.png and b/public/images/emoji/twitter/triangular_ruler.png differ diff --git a/public/images/emoji/twitter/trident.png b/public/images/emoji/twitter/trident.png index 3f5eac141a..938f89898c 100644 Binary files a/public/images/emoji/twitter/trident.png and b/public/images/emoji/twitter/trident.png differ diff --git a/public/images/emoji/twitter/trinidad_tobago.png b/public/images/emoji/twitter/trinidad_tobago.png index 14355ce15f..7052a392b7 100644 Binary files a/public/images/emoji/twitter/trinidad_tobago.png and b/public/images/emoji/twitter/trinidad_tobago.png differ diff --git a/public/images/emoji/twitter/tristan_da_cunha.png b/public/images/emoji/twitter/tristan_da_cunha.png index dff4791d41..15e4c3e159 100644 Binary files a/public/images/emoji/twitter/tristan_da_cunha.png and b/public/images/emoji/twitter/tristan_da_cunha.png differ diff --git a/public/images/emoji/twitter/triumph.png b/public/images/emoji/twitter/triumph.png index c71d3a89cb..564088c1be 100644 Binary files a/public/images/emoji/twitter/triumph.png and b/public/images/emoji/twitter/triumph.png differ diff --git a/public/images/emoji/twitter/trolleybus.png b/public/images/emoji/twitter/trolleybus.png index 98633d3564..79fa15ceff 100644 Binary files a/public/images/emoji/twitter/trolleybus.png and b/public/images/emoji/twitter/trolleybus.png differ diff --git a/public/images/emoji/twitter/trophy.png b/public/images/emoji/twitter/trophy.png index fea06478b2..8b3523bf21 100644 Binary files a/public/images/emoji/twitter/trophy.png and b/public/images/emoji/twitter/trophy.png differ diff --git a/public/images/emoji/twitter/tropical_drink.png b/public/images/emoji/twitter/tropical_drink.png index 08fb02b1ca..8b67833066 100644 Binary files a/public/images/emoji/twitter/tropical_drink.png and b/public/images/emoji/twitter/tropical_drink.png differ diff --git a/public/images/emoji/twitter/tropical_fish.png b/public/images/emoji/twitter/tropical_fish.png index 550c8e296c..b7a8caf023 100644 Binary files a/public/images/emoji/twitter/tropical_fish.png and b/public/images/emoji/twitter/tropical_fish.png differ diff --git a/public/images/emoji/twitter/truck.png b/public/images/emoji/twitter/truck.png index 12e1365f2e..27360443c3 100644 Binary files a/public/images/emoji/twitter/truck.png and b/public/images/emoji/twitter/truck.png differ diff --git a/public/images/emoji/twitter/trumpet.png b/public/images/emoji/twitter/trumpet.png index d3b1fec701..f17dd60ce6 100644 Binary files a/public/images/emoji/twitter/trumpet.png and b/public/images/emoji/twitter/trumpet.png differ diff --git a/public/images/emoji/twitter/tshirt.png b/public/images/emoji/twitter/tshirt.png index 4723c7947a..1dc1d91d40 100644 Binary files a/public/images/emoji/twitter/tshirt.png and b/public/images/emoji/twitter/tshirt.png differ diff --git a/public/images/emoji/twitter/tulip.png b/public/images/emoji/twitter/tulip.png index d617275fcd..57ceff246f 100644 Binary files a/public/images/emoji/twitter/tulip.png and b/public/images/emoji/twitter/tulip.png differ diff --git a/public/images/emoji/twitter/tumbler_glass.png b/public/images/emoji/twitter/tumbler_glass.png index 78db9d6036..a495095feb 100644 Binary files a/public/images/emoji/twitter/tumbler_glass.png and b/public/images/emoji/twitter/tumbler_glass.png differ diff --git a/public/images/emoji/twitter/tunisia.png b/public/images/emoji/twitter/tunisia.png index 2691b42f09..8b762b44d9 100644 Binary files a/public/images/emoji/twitter/tunisia.png and b/public/images/emoji/twitter/tunisia.png differ diff --git a/public/images/emoji/twitter/turkey.png b/public/images/emoji/twitter/turkey.png index 829f5ffdfc..5368b61e88 100644 Binary files a/public/images/emoji/twitter/turkey.png and b/public/images/emoji/twitter/turkey.png differ diff --git a/public/images/emoji/twitter/turkmenistan.png b/public/images/emoji/twitter/turkmenistan.png index a0729e2c29..8e6fbb11c5 100644 Binary files a/public/images/emoji/twitter/turkmenistan.png and b/public/images/emoji/twitter/turkmenistan.png differ diff --git a/public/images/emoji/twitter/turks_caicos_islands.png b/public/images/emoji/twitter/turks_caicos_islands.png index bb04d27666..7380100153 100644 Binary files a/public/images/emoji/twitter/turks_caicos_islands.png and b/public/images/emoji/twitter/turks_caicos_islands.png differ diff --git a/public/images/emoji/twitter/turtle.png b/public/images/emoji/twitter/turtle.png index 0ff7f79a9d..6a112a47c6 100644 Binary files a/public/images/emoji/twitter/turtle.png and b/public/images/emoji/twitter/turtle.png differ diff --git a/public/images/emoji/twitter/tuvalu.png b/public/images/emoji/twitter/tuvalu.png index 60fad11afc..44880afa7b 100644 Binary files a/public/images/emoji/twitter/tuvalu.png and b/public/images/emoji/twitter/tuvalu.png differ diff --git a/public/images/emoji/twitter/tv.png b/public/images/emoji/twitter/tv.png index 06de17907e..1d69fa6df9 100644 Binary files a/public/images/emoji/twitter/tv.png and b/public/images/emoji/twitter/tv.png differ diff --git a/public/images/emoji/twitter/twisted_rightwards_arrows.png b/public/images/emoji/twitter/twisted_rightwards_arrows.png index 943f924fe5..fbe6dd1270 100644 Binary files a/public/images/emoji/twitter/twisted_rightwards_arrows.png and b/public/images/emoji/twitter/twisted_rightwards_arrows.png differ diff --git a/public/images/emoji/twitter/two.png b/public/images/emoji/twitter/two.png index 572ce89681..dbb85d1f99 100644 Binary files a/public/images/emoji/twitter/two.png and b/public/images/emoji/twitter/two.png differ diff --git a/public/images/emoji/twitter/two_hearts.png b/public/images/emoji/twitter/two_hearts.png index a2bf464627..2765cd73e6 100644 Binary files a/public/images/emoji/twitter/two_hearts.png and b/public/images/emoji/twitter/two_hearts.png differ diff --git a/public/images/emoji/twitter/two_men_holding_hands.png b/public/images/emoji/twitter/two_men_holding_hands.png index 1e7e303e10..8a515cd14b 100644 Binary files a/public/images/emoji/twitter/two_men_holding_hands.png and b/public/images/emoji/twitter/two_men_holding_hands.png differ diff --git a/public/images/emoji/twitter/two_women_holding_hands.png b/public/images/emoji/twitter/two_women_holding_hands.png index bf1afc8459..4fa07f435d 100644 Binary files a/public/images/emoji/twitter/two_women_holding_hands.png and b/public/images/emoji/twitter/two_women_holding_hands.png differ diff --git a/public/images/emoji/twitter/u5272.png b/public/images/emoji/twitter/u5272.png index 39e3ed851b..b1b151b8ab 100644 Binary files a/public/images/emoji/twitter/u5272.png and b/public/images/emoji/twitter/u5272.png differ diff --git a/public/images/emoji/twitter/u5408.png b/public/images/emoji/twitter/u5408.png index 4c486f5a00..f5129eff29 100644 Binary files a/public/images/emoji/twitter/u5408.png and b/public/images/emoji/twitter/u5408.png differ diff --git a/public/images/emoji/twitter/u55b6.png b/public/images/emoji/twitter/u55b6.png index 706605d7b9..de0e715dc9 100644 Binary files a/public/images/emoji/twitter/u55b6.png and b/public/images/emoji/twitter/u55b6.png differ diff --git a/public/images/emoji/twitter/u6307.png b/public/images/emoji/twitter/u6307.png index ed4775ce00..b07ad0826a 100644 Binary files a/public/images/emoji/twitter/u6307.png and b/public/images/emoji/twitter/u6307.png differ diff --git a/public/images/emoji/twitter/u6708.png b/public/images/emoji/twitter/u6708.png index 21bca19f0e..a8a13729c4 100644 Binary files a/public/images/emoji/twitter/u6708.png and b/public/images/emoji/twitter/u6708.png differ diff --git a/public/images/emoji/twitter/u6709.png b/public/images/emoji/twitter/u6709.png index 79ec215b86..503ca0f311 100644 Binary files a/public/images/emoji/twitter/u6709.png and b/public/images/emoji/twitter/u6709.png differ diff --git a/public/images/emoji/twitter/u6e80.png b/public/images/emoji/twitter/u6e80.png index 79d5083a08..2ef4e02c81 100644 Binary files a/public/images/emoji/twitter/u6e80.png and b/public/images/emoji/twitter/u6e80.png differ diff --git a/public/images/emoji/twitter/u7121.png b/public/images/emoji/twitter/u7121.png index 1cb4be4682..671699d6fe 100644 Binary files a/public/images/emoji/twitter/u7121.png and b/public/images/emoji/twitter/u7121.png differ diff --git a/public/images/emoji/twitter/u7533.png b/public/images/emoji/twitter/u7533.png index 2c503dbddd..c85c702091 100644 Binary files a/public/images/emoji/twitter/u7533.png and b/public/images/emoji/twitter/u7533.png differ diff --git a/public/images/emoji/twitter/u7981.png b/public/images/emoji/twitter/u7981.png index 4ec660b541..37ad941cf4 100644 Binary files a/public/images/emoji/twitter/u7981.png and b/public/images/emoji/twitter/u7981.png differ diff --git a/public/images/emoji/twitter/u7a7a.png b/public/images/emoji/twitter/u7a7a.png index 204ac0670d..ba07498b30 100644 Binary files a/public/images/emoji/twitter/u7a7a.png and b/public/images/emoji/twitter/u7a7a.png differ diff --git a/public/images/emoji/twitter/uganda.png b/public/images/emoji/twitter/uganda.png index 9541a9fe43..2926eb5072 100644 Binary files a/public/images/emoji/twitter/uganda.png and b/public/images/emoji/twitter/uganda.png differ diff --git a/public/images/emoji/twitter/uk.png b/public/images/emoji/twitter/uk.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/twitter/uk.png and b/public/images/emoji/twitter/uk.png differ diff --git a/public/images/emoji/twitter/ukraine.png b/public/images/emoji/twitter/ukraine.png index d24b4e827b..d76c090dc4 100644 Binary files a/public/images/emoji/twitter/ukraine.png and b/public/images/emoji/twitter/ukraine.png differ diff --git a/public/images/emoji/twitter/umbrella.png b/public/images/emoji/twitter/umbrella.png index 869523fd2c..6cb5f03eff 100644 Binary files a/public/images/emoji/twitter/umbrella.png and b/public/images/emoji/twitter/umbrella.png differ diff --git a/public/images/emoji/twitter/umbrella2.png b/public/images/emoji/twitter/umbrella2.png index ec99aeb164..94a1eea680 100644 Binary files a/public/images/emoji/twitter/umbrella2.png and b/public/images/emoji/twitter/umbrella2.png differ diff --git a/public/images/emoji/twitter/umbrella_on_ground.png b/public/images/emoji/twitter/umbrella_on_ground.png index 2bb23697b7..120de456f7 100644 Binary files a/public/images/emoji/twitter/umbrella_on_ground.png and b/public/images/emoji/twitter/umbrella_on_ground.png differ diff --git a/public/images/emoji/twitter/unamused.png b/public/images/emoji/twitter/unamused.png index d1f66ad9dc..53c52ecd31 100644 Binary files a/public/images/emoji/twitter/unamused.png and b/public/images/emoji/twitter/unamused.png differ diff --git a/public/images/emoji/twitter/underage.png b/public/images/emoji/twitter/underage.png index 15ac7fdbd5..ea100db7f2 100644 Binary files a/public/images/emoji/twitter/underage.png and b/public/images/emoji/twitter/underage.png differ diff --git a/public/images/emoji/twitter/unicorn.png b/public/images/emoji/twitter/unicorn.png index 7b53a8b310..a28ef76f4a 100644 Binary files a/public/images/emoji/twitter/unicorn.png and b/public/images/emoji/twitter/unicorn.png differ diff --git a/public/images/emoji/twitter/unicorn_face.png b/public/images/emoji/twitter/unicorn_face.png index 7b53a8b310..a28ef76f4a 100644 Binary files a/public/images/emoji/twitter/unicorn_face.png and b/public/images/emoji/twitter/unicorn_face.png differ diff --git a/public/images/emoji/twitter/united_arab_emirates.png b/public/images/emoji/twitter/united_arab_emirates.png index 0aac4c4b1e..12ff444d51 100644 Binary files a/public/images/emoji/twitter/united_arab_emirates.png and b/public/images/emoji/twitter/united_arab_emirates.png differ diff --git a/public/images/emoji/twitter/united_nations.png b/public/images/emoji/twitter/united_nations.png index d695a5cac0..ea7fc4c7d7 100644 Binary files a/public/images/emoji/twitter/united_nations.png and b/public/images/emoji/twitter/united_nations.png differ diff --git a/public/images/emoji/twitter/unlock.png b/public/images/emoji/twitter/unlock.png index 420adafd49..ac2f5865f7 100644 Binary files a/public/images/emoji/twitter/unlock.png and b/public/images/emoji/twitter/unlock.png differ diff --git a/public/images/emoji/twitter/up.png b/public/images/emoji/twitter/up.png index b7eac2ee8a..177ee60634 100644 Binary files a/public/images/emoji/twitter/up.png and b/public/images/emoji/twitter/up.png differ diff --git a/public/images/emoji/twitter/upside_down.png b/public/images/emoji/twitter/upside_down.png index 85c96142cf..6c5f72b5ff 100644 Binary files a/public/images/emoji/twitter/upside_down.png and b/public/images/emoji/twitter/upside_down.png differ diff --git a/public/images/emoji/twitter/upside_down_face.png b/public/images/emoji/twitter/upside_down_face.png index 85c96142cf..6c5f72b5ff 100644 Binary files a/public/images/emoji/twitter/upside_down_face.png and b/public/images/emoji/twitter/upside_down_face.png differ diff --git a/public/images/emoji/twitter/urn.png b/public/images/emoji/twitter/urn.png index 56112c50ed..72e745fa07 100644 Binary files a/public/images/emoji/twitter/urn.png and b/public/images/emoji/twitter/urn.png differ diff --git a/public/images/emoji/twitter/uruguay.png b/public/images/emoji/twitter/uruguay.png index 8196541e26..8667234f6a 100644 Binary files a/public/images/emoji/twitter/uruguay.png and b/public/images/emoji/twitter/uruguay.png differ diff --git a/public/images/emoji/twitter/us.png b/public/images/emoji/twitter/us.png index 450853eca4..0ba064250e 100644 Binary files a/public/images/emoji/twitter/us.png and b/public/images/emoji/twitter/us.png differ diff --git a/public/images/emoji/twitter/us_outlying_islands.png b/public/images/emoji/twitter/us_outlying_islands.png index 450853eca4..bae619c110 100644 Binary files a/public/images/emoji/twitter/us_outlying_islands.png and b/public/images/emoji/twitter/us_outlying_islands.png differ diff --git a/public/images/emoji/twitter/us_virgin_islands.png b/public/images/emoji/twitter/us_virgin_islands.png index 2352c2610b..c117aff7f2 100644 Binary files a/public/images/emoji/twitter/us_virgin_islands.png and b/public/images/emoji/twitter/us_virgin_islands.png differ diff --git a/public/images/emoji/twitter/uzbekistan.png b/public/images/emoji/twitter/uzbekistan.png index c268b7f0b2..19004d72d4 100644 Binary files a/public/images/emoji/twitter/uzbekistan.png and b/public/images/emoji/twitter/uzbekistan.png differ diff --git a/public/images/emoji/twitter/v.png b/public/images/emoji/twitter/v.png index 0a54bd6834..56a893d29d 100644 Binary files a/public/images/emoji/twitter/v.png and b/public/images/emoji/twitter/v.png differ diff --git a/public/images/emoji/twitter/vampire.png b/public/images/emoji/twitter/vampire.png index 962288bd17..b8c59422d8 100644 Binary files a/public/images/emoji/twitter/vampire.png and b/public/images/emoji/twitter/vampire.png differ diff --git a/public/images/emoji/twitter/vanuatu.png b/public/images/emoji/twitter/vanuatu.png index ebf4b69315..df4766669c 100644 Binary files a/public/images/emoji/twitter/vanuatu.png and b/public/images/emoji/twitter/vanuatu.png differ diff --git a/public/images/emoji/twitter/vatican_city.png b/public/images/emoji/twitter/vatican_city.png index a91fed8815..f0fe36f9ad 100644 Binary files a/public/images/emoji/twitter/vatican_city.png and b/public/images/emoji/twitter/vatican_city.png differ diff --git a/public/images/emoji/twitter/venezuela.png b/public/images/emoji/twitter/venezuela.png index e2b7cff1d8..70a249fec6 100644 Binary files a/public/images/emoji/twitter/venezuela.png and b/public/images/emoji/twitter/venezuela.png differ diff --git a/public/images/emoji/twitter/vertical_traffic_light.png b/public/images/emoji/twitter/vertical_traffic_light.png index 1763565024..ebd29db704 100644 Binary files a/public/images/emoji/twitter/vertical_traffic_light.png and b/public/images/emoji/twitter/vertical_traffic_light.png differ diff --git a/public/images/emoji/twitter/vhs.png b/public/images/emoji/twitter/vhs.png index 7aa14dd85e..e5d6f0d0e6 100644 Binary files a/public/images/emoji/twitter/vhs.png and b/public/images/emoji/twitter/vhs.png differ diff --git a/public/images/emoji/twitter/vibration_mode.png b/public/images/emoji/twitter/vibration_mode.png index be3fe8b25a..c332ca7aa6 100644 Binary files a/public/images/emoji/twitter/vibration_mode.png and b/public/images/emoji/twitter/vibration_mode.png differ diff --git a/public/images/emoji/twitter/video_camera.png b/public/images/emoji/twitter/video_camera.png index 895fbf2c50..6890d4dbc2 100644 Binary files a/public/images/emoji/twitter/video_camera.png and b/public/images/emoji/twitter/video_camera.png differ diff --git a/public/images/emoji/twitter/video_game.png b/public/images/emoji/twitter/video_game.png index 3ec88b8eec..366e6017bf 100644 Binary files a/public/images/emoji/twitter/video_game.png and b/public/images/emoji/twitter/video_game.png differ diff --git a/public/images/emoji/twitter/vietnam.png b/public/images/emoji/twitter/vietnam.png index f888ea9435..5282bd4343 100644 Binary files a/public/images/emoji/twitter/vietnam.png and b/public/images/emoji/twitter/vietnam.png differ diff --git a/public/images/emoji/twitter/violin.png b/public/images/emoji/twitter/violin.png index 352f08ba65..c796acb2d0 100644 Binary files a/public/images/emoji/twitter/violin.png and b/public/images/emoji/twitter/violin.png differ diff --git a/public/images/emoji/twitter/virgo.png b/public/images/emoji/twitter/virgo.png index ca2056f07d..8bf788774b 100644 Binary files a/public/images/emoji/twitter/virgo.png and b/public/images/emoji/twitter/virgo.png differ diff --git a/public/images/emoji/twitter/volcano.png b/public/images/emoji/twitter/volcano.png index 1c08d50815..4c220af1d8 100644 Binary files a/public/images/emoji/twitter/volcano.png and b/public/images/emoji/twitter/volcano.png differ diff --git a/public/images/emoji/twitter/volleyball.png b/public/images/emoji/twitter/volleyball.png index 5d6921c81e..8f4484b26d 100644 Binary files a/public/images/emoji/twitter/volleyball.png and b/public/images/emoji/twitter/volleyball.png differ diff --git a/public/images/emoji/twitter/vs.png b/public/images/emoji/twitter/vs.png index 5bd20200ea..9f26ffe7f7 100644 Binary files a/public/images/emoji/twitter/vs.png and b/public/images/emoji/twitter/vs.png differ diff --git a/public/images/emoji/twitter/vulcan.png b/public/images/emoji/twitter/vulcan.png index 6245929457..0778c7bc57 100644 Binary files a/public/images/emoji/twitter/vulcan.png and b/public/images/emoji/twitter/vulcan.png differ diff --git a/public/images/emoji/twitter/vulcan_salute.png b/public/images/emoji/twitter/vulcan_salute.png index 6245929457..0778c7bc57 100644 Binary files a/public/images/emoji/twitter/vulcan_salute.png and b/public/images/emoji/twitter/vulcan_salute.png differ diff --git a/public/images/emoji/twitter/walking.png b/public/images/emoji/twitter/walking.png index 620e3d3b36..53cd2997bd 100644 Binary files a/public/images/emoji/twitter/walking.png and b/public/images/emoji/twitter/walking.png differ diff --git a/public/images/emoji/twitter/walking_man.png b/public/images/emoji/twitter/walking_man.png index 620e3d3b36..53cd2997bd 100644 Binary files a/public/images/emoji/twitter/walking_man.png and b/public/images/emoji/twitter/walking_man.png differ diff --git a/public/images/emoji/twitter/walking_woman.png b/public/images/emoji/twitter/walking_woman.png index 5541bff1ed..968fdc5ba2 100644 Binary files a/public/images/emoji/twitter/walking_woman.png and b/public/images/emoji/twitter/walking_woman.png differ diff --git a/public/images/emoji/twitter/wallis_futuna.png b/public/images/emoji/twitter/wallis_futuna.png index 4672eabedb..c75c4db34e 100644 Binary files a/public/images/emoji/twitter/wallis_futuna.png and b/public/images/emoji/twitter/wallis_futuna.png differ diff --git a/public/images/emoji/twitter/waning_crescent_moon.png b/public/images/emoji/twitter/waning_crescent_moon.png index b6acf24d55..f335dcabf3 100644 Binary files a/public/images/emoji/twitter/waning_crescent_moon.png and b/public/images/emoji/twitter/waning_crescent_moon.png differ diff --git a/public/images/emoji/twitter/waning_gibbous_moon.png b/public/images/emoji/twitter/waning_gibbous_moon.png index 9ce1113fda..ddd2293b6a 100644 Binary files a/public/images/emoji/twitter/waning_gibbous_moon.png and b/public/images/emoji/twitter/waning_gibbous_moon.png differ diff --git a/public/images/emoji/twitter/warning.png b/public/images/emoji/twitter/warning.png index 034b267bef..88ad895442 100644 Binary files a/public/images/emoji/twitter/warning.png and b/public/images/emoji/twitter/warning.png differ diff --git a/public/images/emoji/twitter/wastebasket.png b/public/images/emoji/twitter/wastebasket.png index 65b0729097..bdd43bc6e0 100644 Binary files a/public/images/emoji/twitter/wastebasket.png and b/public/images/emoji/twitter/wastebasket.png differ diff --git a/public/images/emoji/twitter/watch.png b/public/images/emoji/twitter/watch.png index 3fb6ff7b3b..b5e7ffc2a7 100644 Binary files a/public/images/emoji/twitter/watch.png and b/public/images/emoji/twitter/watch.png differ diff --git a/public/images/emoji/twitter/water_buffalo.png b/public/images/emoji/twitter/water_buffalo.png index 5c8d0c6dcf..27377fd6bb 100644 Binary files a/public/images/emoji/twitter/water_buffalo.png and b/public/images/emoji/twitter/water_buffalo.png differ diff --git a/public/images/emoji/twitter/watermelon.png b/public/images/emoji/twitter/watermelon.png index 6d87561e56..f8635ea924 100644 Binary files a/public/images/emoji/twitter/watermelon.png and b/public/images/emoji/twitter/watermelon.png differ diff --git a/public/images/emoji/twitter/wave.png b/public/images/emoji/twitter/wave.png index 62e28e168b..a064dc0b8e 100644 Binary files a/public/images/emoji/twitter/wave.png and b/public/images/emoji/twitter/wave.png differ diff --git a/public/images/emoji/twitter/waving_black_flag.png b/public/images/emoji/twitter/waving_black_flag.png index 5c1237bdad..3f676418d3 100644 Binary files a/public/images/emoji/twitter/waving_black_flag.png and b/public/images/emoji/twitter/waving_black_flag.png differ diff --git a/public/images/emoji/twitter/waving_white_flag.png b/public/images/emoji/twitter/waving_white_flag.png index 5f052fff2a..49317273b4 100644 Binary files a/public/images/emoji/twitter/waving_white_flag.png and b/public/images/emoji/twitter/waving_white_flag.png differ diff --git a/public/images/emoji/twitter/wavy_dash.png b/public/images/emoji/twitter/wavy_dash.png index f1b17b38cf..8e74f9b895 100644 Binary files a/public/images/emoji/twitter/wavy_dash.png and b/public/images/emoji/twitter/wavy_dash.png differ diff --git a/public/images/emoji/twitter/waxing_crescent_moon.png b/public/images/emoji/twitter/waxing_crescent_moon.png index 519cce3793..3274000fa6 100644 Binary files a/public/images/emoji/twitter/waxing_crescent_moon.png and b/public/images/emoji/twitter/waxing_crescent_moon.png differ diff --git a/public/images/emoji/twitter/waxing_gibbous_moon.png b/public/images/emoji/twitter/waxing_gibbous_moon.png index 0f9dfcc0d1..7f66282272 100644 Binary files a/public/images/emoji/twitter/waxing_gibbous_moon.png and b/public/images/emoji/twitter/waxing_gibbous_moon.png differ diff --git a/public/images/emoji/twitter/wc.png b/public/images/emoji/twitter/wc.png index 975f3626db..9583065733 100644 Binary files a/public/images/emoji/twitter/wc.png and b/public/images/emoji/twitter/wc.png differ diff --git a/public/images/emoji/twitter/weary.png b/public/images/emoji/twitter/weary.png index 2836e023db..b5c72eb60f 100644 Binary files a/public/images/emoji/twitter/weary.png and b/public/images/emoji/twitter/weary.png differ diff --git a/public/images/emoji/twitter/wedding.png b/public/images/emoji/twitter/wedding.png index ba45ce4cb5..83625f13e4 100644 Binary files a/public/images/emoji/twitter/wedding.png and b/public/images/emoji/twitter/wedding.png differ diff --git a/public/images/emoji/twitter/weight_lifter.png b/public/images/emoji/twitter/weight_lifter.png index be0473304d..06058abc7f 100644 Binary files a/public/images/emoji/twitter/weight_lifter.png and b/public/images/emoji/twitter/weight_lifter.png differ diff --git a/public/images/emoji/twitter/weight_lifting_man.png b/public/images/emoji/twitter/weight_lifting_man.png index be0473304d..06058abc7f 100644 Binary files a/public/images/emoji/twitter/weight_lifting_man.png and b/public/images/emoji/twitter/weight_lifting_man.png differ diff --git a/public/images/emoji/twitter/weight_lifting_woman.png b/public/images/emoji/twitter/weight_lifting_woman.png index 2279709c85..eca804e102 100644 Binary files a/public/images/emoji/twitter/weight_lifting_woman.png and b/public/images/emoji/twitter/weight_lifting_woman.png differ diff --git a/public/images/emoji/twitter/western_sahara.png b/public/images/emoji/twitter/western_sahara.png index 44c0ea20dd..3b6afaa73a 100644 Binary files a/public/images/emoji/twitter/western_sahara.png and b/public/images/emoji/twitter/western_sahara.png differ diff --git a/public/images/emoji/twitter/whale.png b/public/images/emoji/twitter/whale.png index 393536a816..48048499e4 100644 Binary files a/public/images/emoji/twitter/whale.png and b/public/images/emoji/twitter/whale.png differ diff --git a/public/images/emoji/twitter/whale2.png b/public/images/emoji/twitter/whale2.png index da221d06e1..4df2b5d52d 100644 Binary files a/public/images/emoji/twitter/whale2.png and b/public/images/emoji/twitter/whale2.png differ diff --git a/public/images/emoji/twitter/wheel_of_dharma.png b/public/images/emoji/twitter/wheel_of_dharma.png index 8792718a1e..e3a3e9210a 100644 Binary files a/public/images/emoji/twitter/wheel_of_dharma.png and b/public/images/emoji/twitter/wheel_of_dharma.png differ diff --git a/public/images/emoji/twitter/wheelchair.png b/public/images/emoji/twitter/wheelchair.png index d59215454f..b747295556 100644 Binary files a/public/images/emoji/twitter/wheelchair.png and b/public/images/emoji/twitter/wheelchair.png differ diff --git a/public/images/emoji/twitter/white_check_mark.png b/public/images/emoji/twitter/white_check_mark.png index c7013082b7..e6a5b466c1 100644 Binary files a/public/images/emoji/twitter/white_check_mark.png and b/public/images/emoji/twitter/white_check_mark.png differ diff --git a/public/images/emoji/twitter/white_circle.png b/public/images/emoji/twitter/white_circle.png index b2a720a289..1d5ec9319f 100644 Binary files a/public/images/emoji/twitter/white_circle.png and b/public/images/emoji/twitter/white_circle.png differ diff --git a/public/images/emoji/twitter/white_flag.png b/public/images/emoji/twitter/white_flag.png index 5f052fff2a..49317273b4 100644 Binary files a/public/images/emoji/twitter/white_flag.png and b/public/images/emoji/twitter/white_flag.png differ diff --git a/public/images/emoji/twitter/white_flower.png b/public/images/emoji/twitter/white_flower.png index e7a2a1b600..6f50636178 100644 Binary files a/public/images/emoji/twitter/white_flower.png and b/public/images/emoji/twitter/white_flower.png differ diff --git a/public/images/emoji/twitter/white_frowning_face.png b/public/images/emoji/twitter/white_frowning_face.png index 1c5988a20b..9d9698f6b7 100644 Binary files a/public/images/emoji/twitter/white_frowning_face.png and b/public/images/emoji/twitter/white_frowning_face.png differ diff --git a/public/images/emoji/twitter/white_large_square.png b/public/images/emoji/twitter/white_large_square.png index 2b4dee8dda..5f76e52ee3 100644 Binary files a/public/images/emoji/twitter/white_large_square.png and b/public/images/emoji/twitter/white_large_square.png differ diff --git a/public/images/emoji/twitter/white_medium_small_square.png b/public/images/emoji/twitter/white_medium_small_square.png index 29603217aa..a7de8524b8 100644 Binary files a/public/images/emoji/twitter/white_medium_small_square.png and b/public/images/emoji/twitter/white_medium_small_square.png differ diff --git a/public/images/emoji/twitter/white_medium_square.png b/public/images/emoji/twitter/white_medium_square.png index 9027152154..42d2917967 100644 Binary files a/public/images/emoji/twitter/white_medium_square.png and b/public/images/emoji/twitter/white_medium_square.png differ diff --git a/public/images/emoji/twitter/white_small_square.png b/public/images/emoji/twitter/white_small_square.png index a0b93a8c1c..250060020d 100644 Binary files a/public/images/emoji/twitter/white_small_square.png and b/public/images/emoji/twitter/white_small_square.png differ diff --git a/public/images/emoji/twitter/white_square_button.png b/public/images/emoji/twitter/white_square_button.png index b066f0a7d2..cfa7a2bc86 100644 Binary files a/public/images/emoji/twitter/white_square_button.png and b/public/images/emoji/twitter/white_square_button.png differ diff --git a/public/images/emoji/twitter/white_sun_behind_cloud.png b/public/images/emoji/twitter/white_sun_behind_cloud.png index 3ceb40a9ec..93a39d5083 100644 Binary files a/public/images/emoji/twitter/white_sun_behind_cloud.png and b/public/images/emoji/twitter/white_sun_behind_cloud.png differ diff --git a/public/images/emoji/twitter/white_sun_behind_cloud_with_rain.png b/public/images/emoji/twitter/white_sun_behind_cloud_with_rain.png index ef892f1f88..e0ebf7437d 100644 Binary files a/public/images/emoji/twitter/white_sun_behind_cloud_with_rain.png and b/public/images/emoji/twitter/white_sun_behind_cloud_with_rain.png differ diff --git a/public/images/emoji/twitter/white_sun_cloud.png b/public/images/emoji/twitter/white_sun_cloud.png index 3ceb40a9ec..93a39d5083 100644 Binary files a/public/images/emoji/twitter/white_sun_cloud.png and b/public/images/emoji/twitter/white_sun_cloud.png differ diff --git a/public/images/emoji/twitter/white_sun_rain_cloud.png b/public/images/emoji/twitter/white_sun_rain_cloud.png index ef892f1f88..e0ebf7437d 100644 Binary files a/public/images/emoji/twitter/white_sun_rain_cloud.png and b/public/images/emoji/twitter/white_sun_rain_cloud.png differ diff --git a/public/images/emoji/twitter/white_sun_small_cloud.png b/public/images/emoji/twitter/white_sun_small_cloud.png index 544e6eafea..13ff46049f 100644 Binary files a/public/images/emoji/twitter/white_sun_small_cloud.png and b/public/images/emoji/twitter/white_sun_small_cloud.png differ diff --git a/public/images/emoji/twitter/white_sun_with_small_cloud.png b/public/images/emoji/twitter/white_sun_with_small_cloud.png index 544e6eafea..13ff46049f 100644 Binary files a/public/images/emoji/twitter/white_sun_with_small_cloud.png and b/public/images/emoji/twitter/white_sun_with_small_cloud.png differ diff --git a/public/images/emoji/twitter/wilted_flower.png b/public/images/emoji/twitter/wilted_flower.png index a4e69ff073..9390ebfcbc 100644 Binary files a/public/images/emoji/twitter/wilted_flower.png and b/public/images/emoji/twitter/wilted_flower.png differ diff --git a/public/images/emoji/twitter/wind_blowing_face.png b/public/images/emoji/twitter/wind_blowing_face.png index f89ef444f7..de0949b78f 100644 Binary files a/public/images/emoji/twitter/wind_blowing_face.png and b/public/images/emoji/twitter/wind_blowing_face.png differ diff --git a/public/images/emoji/twitter/wind_chime.png b/public/images/emoji/twitter/wind_chime.png index 4e76dc6e6f..1e24a5fbfa 100644 Binary files a/public/images/emoji/twitter/wind_chime.png and b/public/images/emoji/twitter/wind_chime.png differ diff --git a/public/images/emoji/twitter/wind_face.png b/public/images/emoji/twitter/wind_face.png index f89ef444f7..de0949b78f 100644 Binary files a/public/images/emoji/twitter/wind_face.png and b/public/images/emoji/twitter/wind_face.png differ diff --git a/public/images/emoji/twitter/wine_glass.png b/public/images/emoji/twitter/wine_glass.png index b7b4e4f1f4..94d9830518 100644 Binary files a/public/images/emoji/twitter/wine_glass.png and b/public/images/emoji/twitter/wine_glass.png differ diff --git a/public/images/emoji/twitter/wink.png b/public/images/emoji/twitter/wink.png index 06fd7d6a87..703a50e098 100644 Binary files a/public/images/emoji/twitter/wink.png and b/public/images/emoji/twitter/wink.png differ diff --git a/public/images/emoji/twitter/wolf.png b/public/images/emoji/twitter/wolf.png index 36be904476..7c98bd35f8 100644 Binary files a/public/images/emoji/twitter/wolf.png and b/public/images/emoji/twitter/wolf.png differ diff --git a/public/images/emoji/twitter/woman.png b/public/images/emoji/twitter/woman.png index 67254813c9..cc67ccd8bb 100644 Binary files a/public/images/emoji/twitter/woman.png and b/public/images/emoji/twitter/woman.png differ diff --git a/public/images/emoji/twitter/woman_artist.png b/public/images/emoji/twitter/woman_artist.png index 59bef6499a..7c50ca6ca4 100644 Binary files a/public/images/emoji/twitter/woman_artist.png and b/public/images/emoji/twitter/woman_artist.png differ diff --git a/public/images/emoji/twitter/woman_astronaut.png b/public/images/emoji/twitter/woman_astronaut.png index cdd72ce56d..fd750fba5c 100644 Binary files a/public/images/emoji/twitter/woman_astronaut.png and b/public/images/emoji/twitter/woman_astronaut.png differ diff --git a/public/images/emoji/twitter/woman_bald.png b/public/images/emoji/twitter/woman_bald.png new file mode 100644 index 0000000000..2fe69f9458 Binary files /dev/null and b/public/images/emoji/twitter/woman_bald.png differ diff --git a/public/images/emoji/twitter/woman_cartwheeling.png b/public/images/emoji/twitter/woman_cartwheeling.png index 124763691f..795f012a4d 100644 Binary files a/public/images/emoji/twitter/woman_cartwheeling.png and b/public/images/emoji/twitter/woman_cartwheeling.png differ diff --git a/public/images/emoji/twitter/woman_climbing.png b/public/images/emoji/twitter/woman_climbing.png index 590704f805..651a7c70cb 100644 Binary files a/public/images/emoji/twitter/woman_climbing.png and b/public/images/emoji/twitter/woman_climbing.png differ diff --git a/public/images/emoji/twitter/woman_cook.png b/public/images/emoji/twitter/woman_cook.png index fb47369863..e045a44287 100644 Binary files a/public/images/emoji/twitter/woman_cook.png and b/public/images/emoji/twitter/woman_cook.png differ diff --git a/public/images/emoji/twitter/woman_curly_haired.png b/public/images/emoji/twitter/woman_curly_haired.png new file mode 100644 index 0000000000..02e4675748 Binary files /dev/null and b/public/images/emoji/twitter/woman_curly_haired.png differ diff --git a/public/images/emoji/twitter/woman_facepalming.png b/public/images/emoji/twitter/woman_facepalming.png index 0862f45755..4c9504ac99 100644 Binary files a/public/images/emoji/twitter/woman_facepalming.png and b/public/images/emoji/twitter/woman_facepalming.png differ diff --git a/public/images/emoji/twitter/woman_factory_worker.png b/public/images/emoji/twitter/woman_factory_worker.png index 22e9ab5b8d..0334ba101f 100644 Binary files a/public/images/emoji/twitter/woman_factory_worker.png and b/public/images/emoji/twitter/woman_factory_worker.png differ diff --git a/public/images/emoji/twitter/woman_farmer.png b/public/images/emoji/twitter/woman_farmer.png index edb763b8c0..039da46e99 100644 Binary files a/public/images/emoji/twitter/woman_farmer.png and b/public/images/emoji/twitter/woman_farmer.png differ diff --git a/public/images/emoji/twitter/woman_firefighter.png b/public/images/emoji/twitter/woman_firefighter.png index ec9fc0dd0a..282f50cb47 100644 Binary files a/public/images/emoji/twitter/woman_firefighter.png and b/public/images/emoji/twitter/woman_firefighter.png differ diff --git a/public/images/emoji/twitter/woman_genie.png b/public/images/emoji/twitter/woman_genie.png index 88743cfd1f..d1a5608de9 100644 Binary files a/public/images/emoji/twitter/woman_genie.png and b/public/images/emoji/twitter/woman_genie.png differ diff --git a/public/images/emoji/twitter/woman_health_worker.png b/public/images/emoji/twitter/woman_health_worker.png index bdd57f781c..c33e27829f 100644 Binary files a/public/images/emoji/twitter/woman_health_worker.png and b/public/images/emoji/twitter/woman_health_worker.png differ diff --git a/public/images/emoji/twitter/woman_in_lotus_position.png b/public/images/emoji/twitter/woman_in_lotus_position.png index 85de0d5c02..d8c76d069b 100644 Binary files a/public/images/emoji/twitter/woman_in_lotus_position.png and b/public/images/emoji/twitter/woman_in_lotus_position.png differ diff --git a/public/images/emoji/twitter/woman_in_steamy_room.png b/public/images/emoji/twitter/woman_in_steamy_room.png index fe4d976d22..0885157783 100644 Binary files a/public/images/emoji/twitter/woman_in_steamy_room.png and b/public/images/emoji/twitter/woman_in_steamy_room.png differ diff --git a/public/images/emoji/twitter/woman_judge.png b/public/images/emoji/twitter/woman_judge.png index 302f1fbdd7..65e7b72694 100644 Binary files a/public/images/emoji/twitter/woman_judge.png and b/public/images/emoji/twitter/woman_judge.png differ diff --git a/public/images/emoji/twitter/woman_juggling.png b/public/images/emoji/twitter/woman_juggling.png index 5c3deb2d49..482bf46dec 100644 Binary files a/public/images/emoji/twitter/woman_juggling.png and b/public/images/emoji/twitter/woman_juggling.png differ diff --git a/public/images/emoji/twitter/woman_mage.png b/public/images/emoji/twitter/woman_mage.png index cf6c7d2569..bb18c4f90c 100644 Binary files a/public/images/emoji/twitter/woman_mage.png and b/public/images/emoji/twitter/woman_mage.png differ diff --git a/public/images/emoji/twitter/woman_mechanic.png b/public/images/emoji/twitter/woman_mechanic.png index 00c01f4dc7..fadf6cf870 100644 Binary files a/public/images/emoji/twitter/woman_mechanic.png and b/public/images/emoji/twitter/woman_mechanic.png differ diff --git a/public/images/emoji/twitter/woman_office_worker.png b/public/images/emoji/twitter/woman_office_worker.png index 3ed967832b..1646ce6498 100644 Binary files a/public/images/emoji/twitter/woman_office_worker.png and b/public/images/emoji/twitter/woman_office_worker.png differ diff --git a/public/images/emoji/twitter/woman_pilot.png b/public/images/emoji/twitter/woman_pilot.png index bdb1f781ee..45013151c5 100644 Binary files a/public/images/emoji/twitter/woman_pilot.png and b/public/images/emoji/twitter/woman_pilot.png differ diff --git a/public/images/emoji/twitter/woman_playing_handball.png b/public/images/emoji/twitter/woman_playing_handball.png index 731f747ab2..f7930641c7 100644 Binary files a/public/images/emoji/twitter/woman_playing_handball.png and b/public/images/emoji/twitter/woman_playing_handball.png differ diff --git a/public/images/emoji/twitter/woman_playing_water_polo.png b/public/images/emoji/twitter/woman_playing_water_polo.png index 9f1a2e79e9..557d2a9e59 100644 Binary files a/public/images/emoji/twitter/woman_playing_water_polo.png and b/public/images/emoji/twitter/woman_playing_water_polo.png differ diff --git a/public/images/emoji/twitter/woman_red_haired.png b/public/images/emoji/twitter/woman_red_haired.png new file mode 100644 index 0000000000..7d85999a79 Binary files /dev/null and b/public/images/emoji/twitter/woman_red_haired.png differ diff --git a/public/images/emoji/twitter/woman_scientist.png b/public/images/emoji/twitter/woman_scientist.png index debc8aa07e..d53c8636f0 100644 Binary files a/public/images/emoji/twitter/woman_scientist.png and b/public/images/emoji/twitter/woman_scientist.png differ diff --git a/public/images/emoji/twitter/woman_shrugging.png b/public/images/emoji/twitter/woman_shrugging.png index 3839c5eacd..6abc216672 100644 Binary files a/public/images/emoji/twitter/woman_shrugging.png and b/public/images/emoji/twitter/woman_shrugging.png differ diff --git a/public/images/emoji/twitter/woman_singer.png b/public/images/emoji/twitter/woman_singer.png index 07f59ab15f..06d534d439 100644 Binary files a/public/images/emoji/twitter/woman_singer.png and b/public/images/emoji/twitter/woman_singer.png differ diff --git a/public/images/emoji/twitter/woman_student.png b/public/images/emoji/twitter/woman_student.png index 60e3c075eb..5f23ccf46c 100644 Binary files a/public/images/emoji/twitter/woman_student.png and b/public/images/emoji/twitter/woman_student.png differ diff --git a/public/images/emoji/twitter/woman_superhero.png b/public/images/emoji/twitter/woman_superhero.png new file mode 100644 index 0000000000..153a0cf66a Binary files /dev/null and b/public/images/emoji/twitter/woman_superhero.png differ diff --git a/public/images/emoji/twitter/woman_supervillain.png b/public/images/emoji/twitter/woman_supervillain.png new file mode 100644 index 0000000000..2f941110bc Binary files /dev/null and b/public/images/emoji/twitter/woman_supervillain.png differ diff --git a/public/images/emoji/twitter/woman_teacher.png b/public/images/emoji/twitter/woman_teacher.png index d98448f85b..72bca8879c 100644 Binary files a/public/images/emoji/twitter/woman_teacher.png and b/public/images/emoji/twitter/woman_teacher.png differ diff --git a/public/images/emoji/twitter/woman_technologist.png b/public/images/emoji/twitter/woman_technologist.png index d74e604a64..dc59eb06f3 100644 Binary files a/public/images/emoji/twitter/woman_technologist.png and b/public/images/emoji/twitter/woman_technologist.png differ diff --git a/public/images/emoji/twitter/woman_white_haired.png b/public/images/emoji/twitter/woman_white_haired.png new file mode 100644 index 0000000000..a4a409c7e0 Binary files /dev/null and b/public/images/emoji/twitter/woman_white_haired.png differ diff --git a/public/images/emoji/twitter/woman_with_headscarf.png b/public/images/emoji/twitter/woman_with_headscarf.png index 6b3731cac8..95f5f82b7b 100644 Binary files a/public/images/emoji/twitter/woman_with_headscarf.png and b/public/images/emoji/twitter/woman_with_headscarf.png differ diff --git a/public/images/emoji/twitter/woman_with_turban.png b/public/images/emoji/twitter/woman_with_turban.png index 884af5800c..102b138b6d 100644 Binary files a/public/images/emoji/twitter/woman_with_turban.png and b/public/images/emoji/twitter/woman_with_turban.png differ diff --git a/public/images/emoji/twitter/woman_zombie.png b/public/images/emoji/twitter/woman_zombie.png index 2f740b721f..cdaa255dc5 100644 Binary files a/public/images/emoji/twitter/woman_zombie.png and b/public/images/emoji/twitter/woman_zombie.png differ diff --git a/public/images/emoji/twitter/womans_clothes.png b/public/images/emoji/twitter/womans_clothes.png index 9c04266a2d..5a168f68a0 100644 Binary files a/public/images/emoji/twitter/womans_clothes.png and b/public/images/emoji/twitter/womans_clothes.png differ diff --git a/public/images/emoji/twitter/womans_hat.png b/public/images/emoji/twitter/womans_hat.png index 730a48c645..ae6e88c2bc 100644 Binary files a/public/images/emoji/twitter/womans_hat.png and b/public/images/emoji/twitter/womans_hat.png differ diff --git a/public/images/emoji/twitter/women_wrestling.png b/public/images/emoji/twitter/women_wrestling.png index 11fa66fd95..a736a9eb9a 100644 Binary files a/public/images/emoji/twitter/women_wrestling.png and b/public/images/emoji/twitter/women_wrestling.png differ diff --git a/public/images/emoji/twitter/womens.png b/public/images/emoji/twitter/womens.png index 0a2d8600d1..636d05b632 100644 Binary files a/public/images/emoji/twitter/womens.png and b/public/images/emoji/twitter/womens.png differ diff --git a/public/images/emoji/twitter/woozy_face.png b/public/images/emoji/twitter/woozy_face.png new file mode 100644 index 0000000000..3c4a112bec Binary files /dev/null and b/public/images/emoji/twitter/woozy_face.png differ diff --git a/public/images/emoji/twitter/world_map.png b/public/images/emoji/twitter/world_map.png index 8c102ea49d..c03959d257 100644 Binary files a/public/images/emoji/twitter/world_map.png and b/public/images/emoji/twitter/world_map.png differ diff --git a/public/images/emoji/twitter/worried.png b/public/images/emoji/twitter/worried.png index f18147f1fd..b0f9051901 100644 Binary files a/public/images/emoji/twitter/worried.png and b/public/images/emoji/twitter/worried.png differ diff --git a/public/images/emoji/twitter/worship_symbol.png b/public/images/emoji/twitter/worship_symbol.png index 19e1150b30..9341dd0ba0 100644 Binary files a/public/images/emoji/twitter/worship_symbol.png and b/public/images/emoji/twitter/worship_symbol.png differ diff --git a/public/images/emoji/twitter/wrench.png b/public/images/emoji/twitter/wrench.png index 5d3c6359bb..f16a78613d 100644 Binary files a/public/images/emoji/twitter/wrench.png and b/public/images/emoji/twitter/wrench.png differ diff --git a/public/images/emoji/twitter/writing_hand.png b/public/images/emoji/twitter/writing_hand.png index 8ec2032bf4..86f753c3d2 100644 Binary files a/public/images/emoji/twitter/writing_hand.png and b/public/images/emoji/twitter/writing_hand.png differ diff --git a/public/images/emoji/twitter/x.png b/public/images/emoji/twitter/x.png index 7ab7ae1f29..8347c7bad5 100644 Binary files a/public/images/emoji/twitter/x.png and b/public/images/emoji/twitter/x.png differ diff --git a/public/images/emoji/twitter/yarn.png b/public/images/emoji/twitter/yarn.png new file mode 100644 index 0000000000..005e38061f Binary files /dev/null and b/public/images/emoji/twitter/yarn.png differ diff --git a/public/images/emoji/twitter/yellow_heart.png b/public/images/emoji/twitter/yellow_heart.png index 48cf5c51b6..215fb3c6e0 100644 Binary files a/public/images/emoji/twitter/yellow_heart.png and b/public/images/emoji/twitter/yellow_heart.png differ diff --git a/public/images/emoji/twitter/yemen.png b/public/images/emoji/twitter/yemen.png index 3a37c85041..e858bb2c19 100644 Binary files a/public/images/emoji/twitter/yemen.png and b/public/images/emoji/twitter/yemen.png differ diff --git a/public/images/emoji/twitter/yen.png b/public/images/emoji/twitter/yen.png index 9ce585e7cd..bb74fef78c 100644 Binary files a/public/images/emoji/twitter/yen.png and b/public/images/emoji/twitter/yen.png differ diff --git a/public/images/emoji/twitter/yin_yang.png b/public/images/emoji/twitter/yin_yang.png index 9e6fbd048a..82faf77a03 100644 Binary files a/public/images/emoji/twitter/yin_yang.png and b/public/images/emoji/twitter/yin_yang.png differ diff --git a/public/images/emoji/twitter/yum.png b/public/images/emoji/twitter/yum.png index 1c51124338..d25e2e3f4b 100644 Binary files a/public/images/emoji/twitter/yum.png and b/public/images/emoji/twitter/yum.png differ diff --git a/public/images/emoji/twitter/zambia.png b/public/images/emoji/twitter/zambia.png index 3e7d4cbea5..6283325081 100644 Binary files a/public/images/emoji/twitter/zambia.png and b/public/images/emoji/twitter/zambia.png differ diff --git a/public/images/emoji/twitter/zap.png b/public/images/emoji/twitter/zap.png index 7d798c92df..797d3ca938 100644 Binary files a/public/images/emoji/twitter/zap.png and b/public/images/emoji/twitter/zap.png differ diff --git a/public/images/emoji/twitter/zebra.png b/public/images/emoji/twitter/zebra.png index 6faa14f55d..4c080f3006 100644 Binary files a/public/images/emoji/twitter/zebra.png and b/public/images/emoji/twitter/zebra.png differ diff --git a/public/images/emoji/twitter/zero.png b/public/images/emoji/twitter/zero.png index f4244918d5..f0d5615acf 100644 Binary files a/public/images/emoji/twitter/zero.png and b/public/images/emoji/twitter/zero.png differ diff --git a/public/images/emoji/twitter/zimbabwe.png b/public/images/emoji/twitter/zimbabwe.png index c3af3c54d7..d87fd6ac15 100644 Binary files a/public/images/emoji/twitter/zimbabwe.png and b/public/images/emoji/twitter/zimbabwe.png differ diff --git a/public/images/emoji/twitter/zipper_mouth.png b/public/images/emoji/twitter/zipper_mouth.png index d764a0fe1a..c3fe67d283 100644 Binary files a/public/images/emoji/twitter/zipper_mouth.png and b/public/images/emoji/twitter/zipper_mouth.png differ diff --git a/public/images/emoji/twitter/zipper_mouth_face.png b/public/images/emoji/twitter/zipper_mouth_face.png index d764a0fe1a..c3fe67d283 100644 Binary files a/public/images/emoji/twitter/zipper_mouth_face.png and b/public/images/emoji/twitter/zipper_mouth_face.png differ diff --git a/public/images/emoji/twitter/zombie.png b/public/images/emoji/twitter/zombie.png index 1bf288fcd4..c597d50dd8 100644 Binary files a/public/images/emoji/twitter/zombie.png and b/public/images/emoji/twitter/zombie.png differ diff --git a/public/images/emoji/twitter/zzz.png b/public/images/emoji/twitter/zzz.png index 89da8c120b..0b3671fb5e 100644 Binary files a/public/images/emoji/twitter/zzz.png and b/public/images/emoji/twitter/zzz.png differ diff --git a/public/images/emoji/win10/abacus.png b/public/images/emoji/win10/abacus.png new file mode 100644 index 0000000000..7513647d79 Binary files /dev/null and b/public/images/emoji/win10/abacus.png differ diff --git a/public/images/emoji/win10/afghanistan.png b/public/images/emoji/win10/afghanistan.png index 50c4c6b272..7a37ec27e7 100644 Binary files a/public/images/emoji/win10/afghanistan.png and b/public/images/emoji/win10/afghanistan.png differ diff --git a/public/images/emoji/win10/aland_islands.png b/public/images/emoji/win10/aland_islands.png index 2ce958b920..99178f14d6 100644 Binary files a/public/images/emoji/win10/aland_islands.png and b/public/images/emoji/win10/aland_islands.png differ diff --git a/public/images/emoji/win10/albania.png b/public/images/emoji/win10/albania.png index 8d428869d4..a6d45735f3 100644 Binary files a/public/images/emoji/win10/albania.png and b/public/images/emoji/win10/albania.png differ diff --git a/public/images/emoji/win10/alembic.png b/public/images/emoji/win10/alembic.png index 774f287f4f..e5f900fc27 100644 Binary files a/public/images/emoji/win10/alembic.png and b/public/images/emoji/win10/alembic.png differ diff --git a/public/images/emoji/win10/algeria.png b/public/images/emoji/win10/algeria.png index cd3dc01ab2..176f755df6 100644 Binary files a/public/images/emoji/win10/algeria.png and b/public/images/emoji/win10/algeria.png differ diff --git a/public/images/emoji/win10/american_samoa.png b/public/images/emoji/win10/american_samoa.png index f4f58e2e25..a5cdfccbcd 100644 Binary files a/public/images/emoji/win10/american_samoa.png and b/public/images/emoji/win10/american_samoa.png differ diff --git a/public/images/emoji/win10/andorra.png b/public/images/emoji/win10/andorra.png index 0fd73782c2..d2d47502e7 100644 Binary files a/public/images/emoji/win10/andorra.png and b/public/images/emoji/win10/andorra.png differ diff --git a/public/images/emoji/win10/angola.png b/public/images/emoji/win10/angola.png index 5aca11a07e..78acffcd20 100644 Binary files a/public/images/emoji/win10/angola.png and b/public/images/emoji/win10/angola.png differ diff --git a/public/images/emoji/win10/anguilla.png b/public/images/emoji/win10/anguilla.png index d1006c6c19..73f0c20398 100644 Binary files a/public/images/emoji/win10/anguilla.png and b/public/images/emoji/win10/anguilla.png differ diff --git a/public/images/emoji/win10/anguished.png b/public/images/emoji/win10/anguished.png index 5f9129be96..21354c31fa 100644 Binary files a/public/images/emoji/win10/anguished.png and b/public/images/emoji/win10/anguished.png differ diff --git a/public/images/emoji/win10/antarctica.png b/public/images/emoji/win10/antarctica.png index 5a6759de63..d21e4bafd2 100644 Binary files a/public/images/emoji/win10/antarctica.png and b/public/images/emoji/win10/antarctica.png differ diff --git a/public/images/emoji/win10/antigua_barbuda.png b/public/images/emoji/win10/antigua_barbuda.png index e3ff113cba..068f45ea90 100644 Binary files a/public/images/emoji/win10/antigua_barbuda.png and b/public/images/emoji/win10/antigua_barbuda.png differ diff --git a/public/images/emoji/win10/argentina.png b/public/images/emoji/win10/argentina.png index 1e5e815098..a7d8a31dd1 100644 Binary files a/public/images/emoji/win10/argentina.png and b/public/images/emoji/win10/argentina.png differ diff --git a/public/images/emoji/win10/armenia.png b/public/images/emoji/win10/armenia.png index 846307fcf3..5282660ee6 100644 Binary files a/public/images/emoji/win10/armenia.png and b/public/images/emoji/win10/armenia.png differ diff --git a/public/images/emoji/win10/artificial_satellite.png b/public/images/emoji/win10/artificial_satellite.png index 1b1553a6b6..fb98ebf1cb 100644 Binary files a/public/images/emoji/win10/artificial_satellite.png and b/public/images/emoji/win10/artificial_satellite.png differ diff --git a/public/images/emoji/win10/aruba.png b/public/images/emoji/win10/aruba.png index 459facc13b..e250be924b 100644 Binary files a/public/images/emoji/win10/aruba.png and b/public/images/emoji/win10/aruba.png differ diff --git a/public/images/emoji/win10/ascension_island.png b/public/images/emoji/win10/ascension_island.png index 2e3a1fdd73..8e7a630b92 100644 Binary files a/public/images/emoji/win10/ascension_island.png and b/public/images/emoji/win10/ascension_island.png differ diff --git a/public/images/emoji/win10/asterisk.png b/public/images/emoji/win10/asterisk.png index 302650d81e..93344040ad 100644 Binary files a/public/images/emoji/win10/asterisk.png and b/public/images/emoji/win10/asterisk.png differ diff --git a/public/images/emoji/win10/astonished.png b/public/images/emoji/win10/astonished.png index 0d64a44038..a8aa1c5b0c 100644 Binary files a/public/images/emoji/win10/astonished.png and b/public/images/emoji/win10/astonished.png differ diff --git a/public/images/emoji/win10/australia.png b/public/images/emoji/win10/australia.png index 5dbc804e86..e42aa01037 100644 Binary files a/public/images/emoji/win10/australia.png and b/public/images/emoji/win10/australia.png differ diff --git a/public/images/emoji/win10/austria.png b/public/images/emoji/win10/austria.png index 58141c9f3c..3937efe840 100644 Binary files a/public/images/emoji/win10/austria.png and b/public/images/emoji/win10/austria.png differ diff --git a/public/images/emoji/win10/azerbaijan.png b/public/images/emoji/win10/azerbaijan.png index 59b4ecf2a0..4f0c1c8678 100644 Binary files a/public/images/emoji/win10/azerbaijan.png and b/public/images/emoji/win10/azerbaijan.png differ diff --git a/public/images/emoji/win10/badger.png b/public/images/emoji/win10/badger.png new file mode 100644 index 0000000000..740a93ab10 Binary files /dev/null and b/public/images/emoji/win10/badger.png differ diff --git a/public/images/emoji/win10/bagel.png b/public/images/emoji/win10/bagel.png new file mode 100644 index 0000000000..4e72f9af32 Binary files /dev/null and b/public/images/emoji/win10/bagel.png differ diff --git a/public/images/emoji/win10/bahamas.png b/public/images/emoji/win10/bahamas.png index ed95128e19..f959101b26 100644 Binary files a/public/images/emoji/win10/bahamas.png and b/public/images/emoji/win10/bahamas.png differ diff --git a/public/images/emoji/win10/bahrain.png b/public/images/emoji/win10/bahrain.png index 815a93ef0b..28c3ec6f69 100644 Binary files a/public/images/emoji/win10/bahrain.png and b/public/images/emoji/win10/bahrain.png differ diff --git a/public/images/emoji/win10/bangladesh.png b/public/images/emoji/win10/bangladesh.png index caab400018..c1c933e092 100644 Binary files a/public/images/emoji/win10/bangladesh.png and b/public/images/emoji/win10/bangladesh.png differ diff --git a/public/images/emoji/win10/barbados.png b/public/images/emoji/win10/barbados.png index 830578344d..e6fb3edddb 100644 Binary files a/public/images/emoji/win10/barbados.png and b/public/images/emoji/win10/barbados.png differ diff --git a/public/images/emoji/win10/baseball.png b/public/images/emoji/win10/baseball.png index 4ca82dd499..7873b632b2 100644 Binary files a/public/images/emoji/win10/baseball.png and b/public/images/emoji/win10/baseball.png differ diff --git a/public/images/emoji/win10/basket.png b/public/images/emoji/win10/basket.png new file mode 100644 index 0000000000..f471492976 Binary files /dev/null and b/public/images/emoji/win10/basket.png differ diff --git a/public/images/emoji/win10/bee.png b/public/images/emoji/win10/bee.png index 6b08780115..666e4c8bab 100644 Binary files a/public/images/emoji/win10/bee.png and b/public/images/emoji/win10/bee.png differ diff --git a/public/images/emoji/win10/beetle.png b/public/images/emoji/win10/beetle.png index 5ef256e9b8..6ff855c4f2 100644 Binary files a/public/images/emoji/win10/beetle.png and b/public/images/emoji/win10/beetle.png differ diff --git a/public/images/emoji/win10/belarus.png b/public/images/emoji/win10/belarus.png index e75dc9ec50..fc2051bf7e 100644 Binary files a/public/images/emoji/win10/belarus.png and b/public/images/emoji/win10/belarus.png differ diff --git a/public/images/emoji/win10/belgium.png b/public/images/emoji/win10/belgium.png index ca401e5985..5fa8040164 100644 Binary files a/public/images/emoji/win10/belgium.png and b/public/images/emoji/win10/belgium.png differ diff --git a/public/images/emoji/win10/belize.png b/public/images/emoji/win10/belize.png index 5f6dded80b..0c23f8075a 100644 Binary files a/public/images/emoji/win10/belize.png and b/public/images/emoji/win10/belize.png differ diff --git a/public/images/emoji/win10/benin.png b/public/images/emoji/win10/benin.png index bb74e98818..d680841fc2 100644 Binary files a/public/images/emoji/win10/benin.png and b/public/images/emoji/win10/benin.png differ diff --git a/public/images/emoji/win10/bermuda.png b/public/images/emoji/win10/bermuda.png index 75f2fac760..13531297f2 100644 Binary files a/public/images/emoji/win10/bermuda.png and b/public/images/emoji/win10/bermuda.png differ diff --git a/public/images/emoji/win10/bhutan.png b/public/images/emoji/win10/bhutan.png index d9a2d20fc1..3e4ce7df33 100644 Binary files a/public/images/emoji/win10/bhutan.png and b/public/images/emoji/win10/bhutan.png differ diff --git a/public/images/emoji/win10/bolivia.png b/public/images/emoji/win10/bolivia.png index af9bd4d5e7..21c555bdd6 100644 Binary files a/public/images/emoji/win10/bolivia.png and b/public/images/emoji/win10/bolivia.png differ diff --git a/public/images/emoji/win10/bone.png b/public/images/emoji/win10/bone.png new file mode 100644 index 0000000000..694e21badc Binary files /dev/null and b/public/images/emoji/win10/bone.png differ diff --git a/public/images/emoji/win10/bosnia_herzegovina.png b/public/images/emoji/win10/bosnia_herzegovina.png index 91493ade75..3ffe114d94 100644 Binary files a/public/images/emoji/win10/bosnia_herzegovina.png and b/public/images/emoji/win10/bosnia_herzegovina.png differ diff --git a/public/images/emoji/win10/botswana.png b/public/images/emoji/win10/botswana.png index 3697a723dd..bd99bb4bf3 100644 Binary files a/public/images/emoji/win10/botswana.png and b/public/images/emoji/win10/botswana.png differ diff --git a/public/images/emoji/win10/bouvet_island.png b/public/images/emoji/win10/bouvet_island.png index 801a577654..5f86c9a176 100644 Binary files a/public/images/emoji/win10/bouvet_island.png and b/public/images/emoji/win10/bouvet_island.png differ diff --git a/public/images/emoji/win10/brazil.png b/public/images/emoji/win10/brazil.png index a68b1e6b58..642f3a520d 100644 Binary files a/public/images/emoji/win10/brazil.png and b/public/images/emoji/win10/brazil.png differ diff --git a/public/images/emoji/win10/brick.png b/public/images/emoji/win10/brick.png new file mode 100644 index 0000000000..5610d63281 Binary files /dev/null and b/public/images/emoji/win10/brick.png differ diff --git a/public/images/emoji/win10/british_indian_ocean_territory.png b/public/images/emoji/win10/british_indian_ocean_territory.png index e3d2479344..894316f63a 100644 Binary files a/public/images/emoji/win10/british_indian_ocean_territory.png and b/public/images/emoji/win10/british_indian_ocean_territory.png differ diff --git a/public/images/emoji/win10/british_virgin_islands.png b/public/images/emoji/win10/british_virgin_islands.png index 9f758979a1..72017181c9 100644 Binary files a/public/images/emoji/win10/british_virgin_islands.png and b/public/images/emoji/win10/british_virgin_islands.png differ diff --git a/public/images/emoji/win10/broom.png b/public/images/emoji/win10/broom.png new file mode 100644 index 0000000000..8997f1cd6c Binary files /dev/null and b/public/images/emoji/win10/broom.png differ diff --git a/public/images/emoji/win10/brunei.png b/public/images/emoji/win10/brunei.png index 647e1c4d79..03dda7489f 100644 Binary files a/public/images/emoji/win10/brunei.png and b/public/images/emoji/win10/brunei.png differ diff --git a/public/images/emoji/win10/bulgaria.png b/public/images/emoji/win10/bulgaria.png index 5185700c63..0519f963c5 100644 Binary files a/public/images/emoji/win10/bulgaria.png and b/public/images/emoji/win10/bulgaria.png differ diff --git a/public/images/emoji/win10/burkina_faso.png b/public/images/emoji/win10/burkina_faso.png index c519f8a954..dad580a778 100644 Binary files a/public/images/emoji/win10/burkina_faso.png and b/public/images/emoji/win10/burkina_faso.png differ diff --git a/public/images/emoji/win10/burundi.png b/public/images/emoji/win10/burundi.png index 83e731cc34..7133116525 100644 Binary files a/public/images/emoji/win10/burundi.png and b/public/images/emoji/win10/burundi.png differ diff --git a/public/images/emoji/win10/cambodia.png b/public/images/emoji/win10/cambodia.png index 0a7ca06fb4..5be917325f 100644 Binary files a/public/images/emoji/win10/cambodia.png and b/public/images/emoji/win10/cambodia.png differ diff --git a/public/images/emoji/win10/cameroon.png b/public/images/emoji/win10/cameroon.png index b9aaf46348..c9eab9a4d1 100644 Binary files a/public/images/emoji/win10/cameroon.png and b/public/images/emoji/win10/cameroon.png differ diff --git a/public/images/emoji/win10/canada.png b/public/images/emoji/win10/canada.png index 82664ad79e..fe777da3f5 100644 Binary files a/public/images/emoji/win10/canada.png and b/public/images/emoji/win10/canada.png differ diff --git a/public/images/emoji/win10/canary_islands.png b/public/images/emoji/win10/canary_islands.png index 68ccf48d0d..80f670c87e 100644 Binary files a/public/images/emoji/win10/canary_islands.png and b/public/images/emoji/win10/canary_islands.png differ diff --git a/public/images/emoji/win10/cape_verde.png b/public/images/emoji/win10/cape_verde.png index 1252c37a6d..4c50734580 100644 Binary files a/public/images/emoji/win10/cape_verde.png and b/public/images/emoji/win10/cape_verde.png differ diff --git a/public/images/emoji/win10/caribbean_netherlands.png b/public/images/emoji/win10/caribbean_netherlands.png index 7780a4a036..be922b0c12 100644 Binary files a/public/images/emoji/win10/caribbean_netherlands.png and b/public/images/emoji/win10/caribbean_netherlands.png differ diff --git a/public/images/emoji/win10/carrot.png b/public/images/emoji/win10/carrot.png index 848a88be28..80c8486c2e 100644 Binary files a/public/images/emoji/win10/carrot.png and b/public/images/emoji/win10/carrot.png differ diff --git a/public/images/emoji/win10/cayman_islands.png b/public/images/emoji/win10/cayman_islands.png index 70d8309d8c..158d5899b0 100644 Binary files a/public/images/emoji/win10/cayman_islands.png and b/public/images/emoji/win10/cayman_islands.png differ diff --git a/public/images/emoji/win10/central_african_republic.png b/public/images/emoji/win10/central_african_republic.png index a344cb3ae8..2b28051981 100644 Binary files a/public/images/emoji/win10/central_african_republic.png and b/public/images/emoji/win10/central_african_republic.png differ diff --git a/public/images/emoji/win10/ceuta_and_melilla.png b/public/images/emoji/win10/ceuta_and_melilla.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/win10/ceuta_and_melilla.png and b/public/images/emoji/win10/ceuta_and_melilla.png differ diff --git a/public/images/emoji/win10/chad.png b/public/images/emoji/win10/chad.png index 26b77c821c..77184f4d06 100644 Binary files a/public/images/emoji/win10/chad.png and b/public/images/emoji/win10/chad.png differ diff --git a/public/images/emoji/win10/chart_with_downwards_trend.png b/public/images/emoji/win10/chart_with_downwards_trend.png index 270b84bd8c..9eb193a050 100644 Binary files a/public/images/emoji/win10/chart_with_downwards_trend.png and b/public/images/emoji/win10/chart_with_downwards_trend.png differ diff --git a/public/images/emoji/win10/chart_with_upwards_trend.png b/public/images/emoji/win10/chart_with_upwards_trend.png index d1706b206f..b541415744 100644 Binary files a/public/images/emoji/win10/chart_with_upwards_trend.png and b/public/images/emoji/win10/chart_with_upwards_trend.png differ diff --git a/public/images/emoji/win10/chess_pawn.png b/public/images/emoji/win10/chess_pawn.png new file mode 100644 index 0000000000..26d14294db Binary files /dev/null and b/public/images/emoji/win10/chess_pawn.png differ diff --git a/public/images/emoji/win10/chile.png b/public/images/emoji/win10/chile.png index 740d09658e..5aded633e7 100644 Binary files a/public/images/emoji/win10/chile.png and b/public/images/emoji/win10/chile.png differ diff --git a/public/images/emoji/win10/christmas_island.png b/public/images/emoji/win10/christmas_island.png index 6958b7d8d8..b6f3608554 100644 Binary files a/public/images/emoji/win10/christmas_island.png and b/public/images/emoji/win10/christmas_island.png differ diff --git a/public/images/emoji/win10/cinema.png b/public/images/emoji/win10/cinema.png index 84e6c9c204..549a8f8515 100644 Binary files a/public/images/emoji/win10/cinema.png and b/public/images/emoji/win10/cinema.png differ diff --git a/public/images/emoji/win10/circus_tent.png b/public/images/emoji/win10/circus_tent.png index 140a83012f..1f271f6773 100644 Binary files a/public/images/emoji/win10/circus_tent.png and b/public/images/emoji/win10/circus_tent.png differ diff --git a/public/images/emoji/win10/clipperton_island.png b/public/images/emoji/win10/clipperton_island.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/win10/clipperton_island.png and b/public/images/emoji/win10/clipperton_island.png differ diff --git a/public/images/emoji/win10/cloud_lightning.png b/public/images/emoji/win10/cloud_lightning.png index 4e099a80e9..116f3c7955 100644 Binary files a/public/images/emoji/win10/cloud_lightning.png and b/public/images/emoji/win10/cloud_lightning.png differ diff --git a/public/images/emoji/win10/cloud_rain.png b/public/images/emoji/win10/cloud_rain.png index 6c1ad868af..f776fc5682 100644 Binary files a/public/images/emoji/win10/cloud_rain.png and b/public/images/emoji/win10/cloud_rain.png differ diff --git a/public/images/emoji/win10/cloud_snow.png b/public/images/emoji/win10/cloud_snow.png index 4967d28a83..13d98a9b6d 100644 Binary files a/public/images/emoji/win10/cloud_snow.png and b/public/images/emoji/win10/cloud_snow.png differ diff --git a/public/images/emoji/win10/cloud_tornado.png b/public/images/emoji/win10/cloud_tornado.png index 8269d47872..4dc37f41b2 100644 Binary files a/public/images/emoji/win10/cloud_tornado.png and b/public/images/emoji/win10/cloud_tornado.png differ diff --git a/public/images/emoji/win10/cloud_with_lightning.png b/public/images/emoji/win10/cloud_with_lightning.png index 4e099a80e9..116f3c7955 100644 Binary files a/public/images/emoji/win10/cloud_with_lightning.png and b/public/images/emoji/win10/cloud_with_lightning.png differ diff --git a/public/images/emoji/win10/cloud_with_lightning_and_rain.png b/public/images/emoji/win10/cloud_with_lightning_and_rain.png index b987488447..81bc5124aa 100644 Binary files a/public/images/emoji/win10/cloud_with_lightning_and_rain.png and b/public/images/emoji/win10/cloud_with_lightning_and_rain.png differ diff --git a/public/images/emoji/win10/cloud_with_rain.png b/public/images/emoji/win10/cloud_with_rain.png index 6c1ad868af..f776fc5682 100644 Binary files a/public/images/emoji/win10/cloud_with_rain.png and b/public/images/emoji/win10/cloud_with_rain.png differ diff --git a/public/images/emoji/win10/cloud_with_snow.png b/public/images/emoji/win10/cloud_with_snow.png index 4967d28a83..13d98a9b6d 100644 Binary files a/public/images/emoji/win10/cloud_with_snow.png and b/public/images/emoji/win10/cloud_with_snow.png differ diff --git a/public/images/emoji/win10/cloud_with_tornado.png b/public/images/emoji/win10/cloud_with_tornado.png index 8269d47872..4dc37f41b2 100644 Binary files a/public/images/emoji/win10/cloud_with_tornado.png and b/public/images/emoji/win10/cloud_with_tornado.png differ diff --git a/public/images/emoji/win10/cn.png b/public/images/emoji/win10/cn.png index 67efed2e4d..1543a73051 100644 Binary files a/public/images/emoji/win10/cn.png and b/public/images/emoji/win10/cn.png differ diff --git a/public/images/emoji/win10/cocos_islands.png b/public/images/emoji/win10/cocos_islands.png index c9025e34e4..02f32975b9 100644 Binary files a/public/images/emoji/win10/cocos_islands.png and b/public/images/emoji/win10/cocos_islands.png differ diff --git a/public/images/emoji/win10/cold_face.png b/public/images/emoji/win10/cold_face.png new file mode 100644 index 0000000000..88c6036075 Binary files /dev/null and b/public/images/emoji/win10/cold_face.png differ diff --git a/public/images/emoji/win10/cold_sweat.png b/public/images/emoji/win10/cold_sweat.png index d57d71d0e9..6eb63ffdc6 100644 Binary files a/public/images/emoji/win10/cold_sweat.png and b/public/images/emoji/win10/cold_sweat.png differ diff --git a/public/images/emoji/win10/colombia.png b/public/images/emoji/win10/colombia.png index 680f77b22d..0d2cf35564 100644 Binary files a/public/images/emoji/win10/colombia.png and b/public/images/emoji/win10/colombia.png differ diff --git a/public/images/emoji/win10/comoros.png b/public/images/emoji/win10/comoros.png index e765f50715..43af8492c8 100644 Binary files a/public/images/emoji/win10/comoros.png and b/public/images/emoji/win10/comoros.png differ diff --git a/public/images/emoji/win10/compass.png b/public/images/emoji/win10/compass.png new file mode 100644 index 0000000000..b55c8061f4 Binary files /dev/null and b/public/images/emoji/win10/compass.png differ diff --git a/public/images/emoji/win10/computer.png b/public/images/emoji/win10/computer.png index 95314bf9e1..e5c77a3d39 100644 Binary files a/public/images/emoji/win10/computer.png and b/public/images/emoji/win10/computer.png differ diff --git a/public/images/emoji/win10/computer_mouse.png b/public/images/emoji/win10/computer_mouse.png index 3e39c0f398..db8e3fa2de 100644 Binary files a/public/images/emoji/win10/computer_mouse.png and b/public/images/emoji/win10/computer_mouse.png differ diff --git a/public/images/emoji/win10/congo_brazzaville.png b/public/images/emoji/win10/congo_brazzaville.png index 2eef1d6c17..113face155 100644 Binary files a/public/images/emoji/win10/congo_brazzaville.png and b/public/images/emoji/win10/congo_brazzaville.png differ diff --git a/public/images/emoji/win10/congo_kinshasa.png b/public/images/emoji/win10/congo_kinshasa.png index a34af9d64a..f0855b2738 100644 Binary files a/public/images/emoji/win10/congo_kinshasa.png and b/public/images/emoji/win10/congo_kinshasa.png differ diff --git a/public/images/emoji/win10/construction_worker.png b/public/images/emoji/win10/construction_worker.png index dcf043a510..1b9492fff5 100644 Binary files a/public/images/emoji/win10/construction_worker.png and b/public/images/emoji/win10/construction_worker.png differ diff --git a/public/images/emoji/win10/construction_worker_man.png b/public/images/emoji/win10/construction_worker_man.png index dcf043a510..1b9492fff5 100644 Binary files a/public/images/emoji/win10/construction_worker_man.png and b/public/images/emoji/win10/construction_worker_man.png differ diff --git a/public/images/emoji/win10/construction_worker_woman.png b/public/images/emoji/win10/construction_worker_woman.png index fcb4278dc1..2d5f7ebe92 100644 Binary files a/public/images/emoji/win10/construction_worker_woman.png and b/public/images/emoji/win10/construction_worker_woman.png differ diff --git a/public/images/emoji/win10/cook_islands.png b/public/images/emoji/win10/cook_islands.png index d1e4afbaca..c021ccda23 100644 Binary files a/public/images/emoji/win10/cook_islands.png and b/public/images/emoji/win10/cook_islands.png differ diff --git a/public/images/emoji/win10/cop.png b/public/images/emoji/win10/cop.png index 9de63c18d8..1ef59de124 100644 Binary files a/public/images/emoji/win10/cop.png and b/public/images/emoji/win10/cop.png differ diff --git a/public/images/emoji/win10/costa_rica.png b/public/images/emoji/win10/costa_rica.png index e6c16e4ea0..9a7cc50ed5 100644 Binary files a/public/images/emoji/win10/costa_rica.png and b/public/images/emoji/win10/costa_rica.png differ diff --git a/public/images/emoji/win10/cote_divoire.png b/public/images/emoji/win10/cote_divoire.png index c8e9c1eace..e18e0bb120 100644 Binary files a/public/images/emoji/win10/cote_divoire.png and b/public/images/emoji/win10/cote_divoire.png differ diff --git a/public/images/emoji/win10/croatia.png b/public/images/emoji/win10/croatia.png index 6cc9a0e748..8f772364df 100644 Binary files a/public/images/emoji/win10/croatia.png and b/public/images/emoji/win10/croatia.png differ diff --git a/public/images/emoji/win10/croissant.png b/public/images/emoji/win10/croissant.png index 117d8e025a..72284308e8 100644 Binary files a/public/images/emoji/win10/croissant.png and b/public/images/emoji/win10/croissant.png differ diff --git a/public/images/emoji/win10/crossed_swords.png b/public/images/emoji/win10/crossed_swords.png index 547329b1f0..5a5ae16198 100644 Binary files a/public/images/emoji/win10/crossed_swords.png and b/public/images/emoji/win10/crossed_swords.png differ diff --git a/public/images/emoji/win10/cry.png b/public/images/emoji/win10/cry.png index 97be3a7204..b254be755e 100644 Binary files a/public/images/emoji/win10/cry.png and b/public/images/emoji/win10/cry.png differ diff --git a/public/images/emoji/win10/cuba.png b/public/images/emoji/win10/cuba.png index 4436dee31e..88170e96bf 100644 Binary files a/public/images/emoji/win10/cuba.png and b/public/images/emoji/win10/cuba.png differ diff --git a/public/images/emoji/win10/cucumber.png b/public/images/emoji/win10/cucumber.png index cdac0debb1..e5028da1b6 100644 Binary files a/public/images/emoji/win10/cucumber.png and b/public/images/emoji/win10/cucumber.png differ diff --git a/public/images/emoji/win10/cupcake.png b/public/images/emoji/win10/cupcake.png new file mode 100644 index 0000000000..efa79fe903 Binary files /dev/null and b/public/images/emoji/win10/cupcake.png differ diff --git a/public/images/emoji/win10/curacao.png b/public/images/emoji/win10/curacao.png index e29bde1f8b..5ea30eb8db 100644 Binary files a/public/images/emoji/win10/curacao.png and b/public/images/emoji/win10/curacao.png differ diff --git a/public/images/emoji/win10/custard.png b/public/images/emoji/win10/custard.png index 55391b0f90..d0c3eaba74 100644 Binary files a/public/images/emoji/win10/custard.png and b/public/images/emoji/win10/custard.png differ diff --git a/public/images/emoji/win10/cyprus.png b/public/images/emoji/win10/cyprus.png index 7f80f4ed57..5c333b0781 100644 Binary files a/public/images/emoji/win10/cyprus.png and b/public/images/emoji/win10/cyprus.png differ diff --git a/public/images/emoji/win10/czech_republic.png b/public/images/emoji/win10/czech_republic.png index 88558e4ab2..6bf97ba35d 100644 Binary files a/public/images/emoji/win10/czech_republic.png and b/public/images/emoji/win10/czech_republic.png differ diff --git a/public/images/emoji/win10/de.png b/public/images/emoji/win10/de.png index 746bf11011..52b93beeef 100644 Binary files a/public/images/emoji/win10/de.png and b/public/images/emoji/win10/de.png differ diff --git a/public/images/emoji/win10/denmark.png b/public/images/emoji/win10/denmark.png index 821499e02c..b7c4bed7a1 100644 Binary files a/public/images/emoji/win10/denmark.png and b/public/images/emoji/win10/denmark.png differ diff --git a/public/images/emoji/win10/desert_island.png b/public/images/emoji/win10/desert_island.png index d9c37a0230..0e73d39425 100644 Binary files a/public/images/emoji/win10/desert_island.png and b/public/images/emoji/win10/desert_island.png differ diff --git a/public/images/emoji/win10/desktop.png b/public/images/emoji/win10/desktop.png index 5730c042e9..3bb34b8922 100644 Binary files a/public/images/emoji/win10/desktop.png and b/public/images/emoji/win10/desktop.png differ diff --git a/public/images/emoji/win10/desktop_computer.png b/public/images/emoji/win10/desktop_computer.png index 5730c042e9..3bb34b8922 100644 Binary files a/public/images/emoji/win10/desktop_computer.png and b/public/images/emoji/win10/desktop_computer.png differ diff --git a/public/images/emoji/win10/diego_garcia.png b/public/images/emoji/win10/diego_garcia.png index 881e01a927..4a509c935c 100644 Binary files a/public/images/emoji/win10/diego_garcia.png and b/public/images/emoji/win10/diego_garcia.png differ diff --git a/public/images/emoji/win10/disappointed_relieved.png b/public/images/emoji/win10/disappointed_relieved.png index 52069e7e21..5ef1a4954b 100644 Binary files a/public/images/emoji/win10/disappointed_relieved.png and b/public/images/emoji/win10/disappointed_relieved.png differ diff --git a/public/images/emoji/win10/dizzy_face.png b/public/images/emoji/win10/dizzy_face.png index 7208b349a7..863d411c96 100644 Binary files a/public/images/emoji/win10/dizzy_face.png and b/public/images/emoji/win10/dizzy_face.png differ diff --git a/public/images/emoji/win10/djibouti.png b/public/images/emoji/win10/djibouti.png index 606fe6a1ee..cc3ceca8b8 100644 Binary files a/public/images/emoji/win10/djibouti.png and b/public/images/emoji/win10/djibouti.png differ diff --git a/public/images/emoji/win10/dna.png b/public/images/emoji/win10/dna.png new file mode 100644 index 0000000000..bc13f4940f Binary files /dev/null and b/public/images/emoji/win10/dna.png differ diff --git a/public/images/emoji/win10/do_not_litter.png b/public/images/emoji/win10/do_not_litter.png index 082c801226..5c01c8f259 100644 Binary files a/public/images/emoji/win10/do_not_litter.png and b/public/images/emoji/win10/do_not_litter.png differ diff --git a/public/images/emoji/win10/dolphin.png b/public/images/emoji/win10/dolphin.png index 2b18f118b4..7fa498964e 100644 Binary files a/public/images/emoji/win10/dolphin.png and b/public/images/emoji/win10/dolphin.png differ diff --git a/public/images/emoji/win10/dominica.png b/public/images/emoji/win10/dominica.png index 588ece3f43..cfc96bc83a 100644 Binary files a/public/images/emoji/win10/dominica.png and b/public/images/emoji/win10/dominica.png differ diff --git a/public/images/emoji/win10/dominican_republic.png b/public/images/emoji/win10/dominican_republic.png index de48ff449c..b06ccbafe8 100644 Binary files a/public/images/emoji/win10/dominican_republic.png and b/public/images/emoji/win10/dominican_republic.png differ diff --git a/public/images/emoji/win10/dove.png b/public/images/emoji/win10/dove.png index 0293ef44a2..f5a08f9cea 100644 Binary files a/public/images/emoji/win10/dove.png and b/public/images/emoji/win10/dove.png differ diff --git a/public/images/emoji/win10/dove_of_peace.png b/public/images/emoji/win10/dove_of_peace.png index 0293ef44a2..f5a08f9cea 100644 Binary files a/public/images/emoji/win10/dove_of_peace.png and b/public/images/emoji/win10/dove_of_peace.png differ diff --git a/public/images/emoji/win10/drooling_face.png b/public/images/emoji/win10/drooling_face.png index e6fba4d9f6..20229ea66f 100644 Binary files a/public/images/emoji/win10/drooling_face.png and b/public/images/emoji/win10/drooling_face.png differ diff --git a/public/images/emoji/win10/ecuador.png b/public/images/emoji/win10/ecuador.png index cf86fbaad6..05b0a2ace0 100644 Binary files a/public/images/emoji/win10/ecuador.png and b/public/images/emoji/win10/ecuador.png differ diff --git a/public/images/emoji/win10/egypt.png b/public/images/emoji/win10/egypt.png index bbbdefa653..29dfd5bad8 100644 Binary files a/public/images/emoji/win10/egypt.png and b/public/images/emoji/win10/egypt.png differ diff --git a/public/images/emoji/win10/eight.png b/public/images/emoji/win10/eight.png index 8ad89e371c..46f0261459 100644 Binary files a/public/images/emoji/win10/eight.png and b/public/images/emoji/win10/eight.png differ diff --git a/public/images/emoji/win10/el_salvador.png b/public/images/emoji/win10/el_salvador.png index 0f24a98369..ad30dcd86f 100644 Binary files a/public/images/emoji/win10/el_salvador.png and b/public/images/emoji/win10/el_salvador.png differ diff --git a/public/images/emoji/win10/equatorial_guinea.png b/public/images/emoji/win10/equatorial_guinea.png index 38e992318c..02b7aec5fd 100644 Binary files a/public/images/emoji/win10/equatorial_guinea.png and b/public/images/emoji/win10/equatorial_guinea.png differ diff --git a/public/images/emoji/win10/eritrea.png b/public/images/emoji/win10/eritrea.png index 630fd66415..dea7458475 100644 Binary files a/public/images/emoji/win10/eritrea.png and b/public/images/emoji/win10/eritrea.png differ diff --git a/public/images/emoji/win10/es.png b/public/images/emoji/win10/es.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/win10/es.png and b/public/images/emoji/win10/es.png differ diff --git a/public/images/emoji/win10/estonia.png b/public/images/emoji/win10/estonia.png index 2553a5dbf7..94d8d46443 100644 Binary files a/public/images/emoji/win10/estonia.png and b/public/images/emoji/win10/estonia.png differ diff --git a/public/images/emoji/win10/ethiopia.png b/public/images/emoji/win10/ethiopia.png index d0d78350cd..4f4e7fc249 100644 Binary files a/public/images/emoji/win10/ethiopia.png and b/public/images/emoji/win10/ethiopia.png differ diff --git a/public/images/emoji/win10/eu.png b/public/images/emoji/win10/eu.png index 938b488ddb..4f0b5d7f4f 100644 Binary files a/public/images/emoji/win10/eu.png and b/public/images/emoji/win10/eu.png differ diff --git a/public/images/emoji/win10/falkland_islands.png b/public/images/emoji/win10/falkland_islands.png index d97a84cea1..5b2ecff4e4 100644 Binary files a/public/images/emoji/win10/falkland_islands.png and b/public/images/emoji/win10/falkland_islands.png differ diff --git a/public/images/emoji/win10/faroe_islands.png b/public/images/emoji/win10/faroe_islands.png index 5da7953f8d..59c59453aa 100644 Binary files a/public/images/emoji/win10/faroe_islands.png and b/public/images/emoji/win10/faroe_islands.png differ diff --git a/public/images/emoji/win10/fearful.png b/public/images/emoji/win10/fearful.png index ce68936b37..e884569c20 100644 Binary files a/public/images/emoji/win10/fearful.png and b/public/images/emoji/win10/fearful.png differ diff --git a/public/images/emoji/win10/fiji.png b/public/images/emoji/win10/fiji.png index df504caef6..fd38d20489 100644 Binary files a/public/images/emoji/win10/fiji.png and b/public/images/emoji/win10/fiji.png differ diff --git a/public/images/emoji/win10/finland.png b/public/images/emoji/win10/finland.png index 5eda4bb864..9caec14db9 100644 Binary files a/public/images/emoji/win10/finland.png and b/public/images/emoji/win10/finland.png differ diff --git a/public/images/emoji/win10/fire_extinguisher.png b/public/images/emoji/win10/fire_extinguisher.png new file mode 100644 index 0000000000..ac9fb41816 Binary files /dev/null and b/public/images/emoji/win10/fire_extinguisher.png differ diff --git a/public/images/emoji/win10/firecracker.png b/public/images/emoji/win10/firecracker.png new file mode 100644 index 0000000000..865aafc6fc Binary files /dev/null and b/public/images/emoji/win10/firecracker.png differ diff --git a/public/images/emoji/win10/five.png b/public/images/emoji/win10/five.png index 964b73bfc6..576b07ac21 100644 Binary files a/public/images/emoji/win10/five.png and b/public/images/emoji/win10/five.png differ diff --git a/public/images/emoji/win10/flag_cn.png b/public/images/emoji/win10/flag_cn.png index 67efed2e4d..1543a73051 100644 Binary files a/public/images/emoji/win10/flag_cn.png and b/public/images/emoji/win10/flag_cn.png differ diff --git a/public/images/emoji/win10/flag_de.png b/public/images/emoji/win10/flag_de.png index 746bf11011..52b93beeef 100644 Binary files a/public/images/emoji/win10/flag_de.png and b/public/images/emoji/win10/flag_de.png differ diff --git a/public/images/emoji/win10/flag_es.png b/public/images/emoji/win10/flag_es.png index e0da30d5a6..99a3aebfac 100644 Binary files a/public/images/emoji/win10/flag_es.png and b/public/images/emoji/win10/flag_es.png differ diff --git a/public/images/emoji/win10/flag_fr.png b/public/images/emoji/win10/flag_fr.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/win10/flag_fr.png and b/public/images/emoji/win10/flag_fr.png differ diff --git a/public/images/emoji/win10/flag_gb.png b/public/images/emoji/win10/flag_gb.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/win10/flag_gb.png and b/public/images/emoji/win10/flag_gb.png differ diff --git a/public/images/emoji/win10/flag_it.png b/public/images/emoji/win10/flag_it.png index 13bbb1b1f8..589002bb34 100644 Binary files a/public/images/emoji/win10/flag_it.png and b/public/images/emoji/win10/flag_it.png differ diff --git a/public/images/emoji/win10/flag_jp.png b/public/images/emoji/win10/flag_jp.png index cca79ffb9d..dd515aa063 100644 Binary files a/public/images/emoji/win10/flag_jp.png and b/public/images/emoji/win10/flag_jp.png differ diff --git a/public/images/emoji/win10/flag_kr.png b/public/images/emoji/win10/flag_kr.png index 82486f8812..8ff7ccd3ff 100644 Binary files a/public/images/emoji/win10/flag_kr.png and b/public/images/emoji/win10/flag_kr.png differ diff --git a/public/images/emoji/win10/flag_ru.png b/public/images/emoji/win10/flag_ru.png index 3ecaefd941..47752f3f0c 100644 Binary files a/public/images/emoji/win10/flag_ru.png and b/public/images/emoji/win10/flag_ru.png differ diff --git a/public/images/emoji/win10/flag_us.png b/public/images/emoji/win10/flag_us.png index 450853eca4..0ba064250e 100644 Binary files a/public/images/emoji/win10/flag_us.png and b/public/images/emoji/win10/flag_us.png differ diff --git a/public/images/emoji/win10/flat_shoe.png b/public/images/emoji/win10/flat_shoe.png new file mode 100644 index 0000000000..45954721e7 Binary files /dev/null and b/public/images/emoji/win10/flat_shoe.png differ diff --git a/public/images/emoji/win10/flying_disc.png b/public/images/emoji/win10/flying_disc.png new file mode 100644 index 0000000000..c289ec92b4 Binary files /dev/null and b/public/images/emoji/win10/flying_disc.png differ diff --git a/public/images/emoji/win10/foot.png b/public/images/emoji/win10/foot.png new file mode 100644 index 0000000000..32a810506f Binary files /dev/null and b/public/images/emoji/win10/foot.png differ diff --git a/public/images/emoji/win10/four.png b/public/images/emoji/win10/four.png index 523c26e10b..1ff3819e16 100644 Binary files a/public/images/emoji/win10/four.png and b/public/images/emoji/win10/four.png differ diff --git a/public/images/emoji/win10/fr.png b/public/images/emoji/win10/fr.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/win10/fr.png and b/public/images/emoji/win10/fr.png differ diff --git a/public/images/emoji/win10/french_guiana.png b/public/images/emoji/win10/french_guiana.png index b67d58af24..a175d1a292 100644 Binary files a/public/images/emoji/win10/french_guiana.png and b/public/images/emoji/win10/french_guiana.png differ diff --git a/public/images/emoji/win10/french_polynesia.png b/public/images/emoji/win10/french_polynesia.png index 8e67281736..f89b755744 100644 Binary files a/public/images/emoji/win10/french_polynesia.png and b/public/images/emoji/win10/french_polynesia.png differ diff --git a/public/images/emoji/win10/french_southern_territories.png b/public/images/emoji/win10/french_southern_territories.png index ecc9bec0fa..2c17f5e70a 100644 Binary files a/public/images/emoji/win10/french_southern_territories.png and b/public/images/emoji/win10/french_southern_territories.png differ diff --git a/public/images/emoji/win10/fried_shrimp.png b/public/images/emoji/win10/fried_shrimp.png index 193a6a909d..07c6daf7c6 100644 Binary files a/public/images/emoji/win10/fried_shrimp.png and b/public/images/emoji/win10/fried_shrimp.png differ diff --git a/public/images/emoji/win10/frowning.png b/public/images/emoji/win10/frowning.png index 2359ddb10a..3544779e8c 100644 Binary files a/public/images/emoji/win10/frowning.png and b/public/images/emoji/win10/frowning.png differ diff --git a/public/images/emoji/win10/gabon.png b/public/images/emoji/win10/gabon.png index 6563b2a69f..5ac1191c7b 100644 Binary files a/public/images/emoji/win10/gabon.png and b/public/images/emoji/win10/gabon.png differ diff --git a/public/images/emoji/win10/gambia.png b/public/images/emoji/win10/gambia.png index 707ca2a121..db1f863384 100644 Binary files a/public/images/emoji/win10/gambia.png and b/public/images/emoji/win10/gambia.png differ diff --git a/public/images/emoji/win10/gb.png b/public/images/emoji/win10/gb.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/win10/gb.png and b/public/images/emoji/win10/gb.png differ diff --git a/public/images/emoji/win10/georgia.png b/public/images/emoji/win10/georgia.png index 673f81ef6f..31af12832b 100644 Binary files a/public/images/emoji/win10/georgia.png and b/public/images/emoji/win10/georgia.png differ diff --git a/public/images/emoji/win10/ghana.png b/public/images/emoji/win10/ghana.png index f1b8829dba..3f01ca0288 100644 Binary files a/public/images/emoji/win10/ghana.png and b/public/images/emoji/win10/ghana.png differ diff --git a/public/images/emoji/win10/gibraltar.png b/public/images/emoji/win10/gibraltar.png index cbe9f11a12..26d4ef755e 100644 Binary files a/public/images/emoji/win10/gibraltar.png and b/public/images/emoji/win10/gibraltar.png differ diff --git a/public/images/emoji/win10/goal_net.png b/public/images/emoji/win10/goal_net.png index 2b504c0693..ea334260c3 100644 Binary files a/public/images/emoji/win10/goal_net.png and b/public/images/emoji/win10/goal_net.png differ diff --git a/public/images/emoji/win10/goggles.png b/public/images/emoji/win10/goggles.png new file mode 100644 index 0000000000..8c9e9885e9 Binary files /dev/null and b/public/images/emoji/win10/goggles.png differ diff --git a/public/images/emoji/win10/grapes.png b/public/images/emoji/win10/grapes.png index d8e52f07bb..81f5b8464b 100644 Binary files a/public/images/emoji/win10/grapes.png and b/public/images/emoji/win10/grapes.png differ diff --git a/public/images/emoji/win10/greece.png b/public/images/emoji/win10/greece.png index c274ffb629..0478442a41 100644 Binary files a/public/images/emoji/win10/greece.png and b/public/images/emoji/win10/greece.png differ diff --git a/public/images/emoji/win10/greenland.png b/public/images/emoji/win10/greenland.png index 31c8707a43..5df66b33ec 100644 Binary files a/public/images/emoji/win10/greenland.png and b/public/images/emoji/win10/greenland.png differ diff --git a/public/images/emoji/win10/grenada.png b/public/images/emoji/win10/grenada.png index 87f17a6ff2..66f160e0e7 100644 Binary files a/public/images/emoji/win10/grenada.png and b/public/images/emoji/win10/grenada.png differ diff --git a/public/images/emoji/win10/guadeloupe.png b/public/images/emoji/win10/guadeloupe.png index c9c437901d..97a3dd9be7 100644 Binary files a/public/images/emoji/win10/guadeloupe.png and b/public/images/emoji/win10/guadeloupe.png differ diff --git a/public/images/emoji/win10/guam.png b/public/images/emoji/win10/guam.png index d291c89c97..75c0945cfe 100644 Binary files a/public/images/emoji/win10/guam.png and b/public/images/emoji/win10/guam.png differ diff --git a/public/images/emoji/win10/guardsman.png b/public/images/emoji/win10/guardsman.png index e027f43d79..63c6e20eb0 100644 Binary files a/public/images/emoji/win10/guardsman.png and b/public/images/emoji/win10/guardsman.png differ diff --git a/public/images/emoji/win10/guardswoman.png b/public/images/emoji/win10/guardswoman.png index 44cb5e0854..3b1d2b8a98 100644 Binary files a/public/images/emoji/win10/guardswoman.png and b/public/images/emoji/win10/guardswoman.png differ diff --git a/public/images/emoji/win10/guatemala.png b/public/images/emoji/win10/guatemala.png index b7e7259bc8..efa2d04ded 100644 Binary files a/public/images/emoji/win10/guatemala.png and b/public/images/emoji/win10/guatemala.png differ diff --git a/public/images/emoji/win10/guernsey.png b/public/images/emoji/win10/guernsey.png index f92e78a324..72ac329c84 100644 Binary files a/public/images/emoji/win10/guernsey.png and b/public/images/emoji/win10/guernsey.png differ diff --git a/public/images/emoji/win10/guinea.png b/public/images/emoji/win10/guinea.png index dd1482188c..dc4a63147c 100644 Binary files a/public/images/emoji/win10/guinea.png and b/public/images/emoji/win10/guinea.png differ diff --git a/public/images/emoji/win10/guinea_bissau.png b/public/images/emoji/win10/guinea_bissau.png index c2ab6fb507..639bc926bd 100644 Binary files a/public/images/emoji/win10/guinea_bissau.png and b/public/images/emoji/win10/guinea_bissau.png differ diff --git a/public/images/emoji/win10/gun.png b/public/images/emoji/win10/gun.png index 6908d3d827..4cdf438e3f 100644 Binary files a/public/images/emoji/win10/gun.png and b/public/images/emoji/win10/gun.png differ diff --git a/public/images/emoji/win10/guyana.png b/public/images/emoji/win10/guyana.png index 2ceb411ad2..481b04c3d6 100644 Binary files a/public/images/emoji/win10/guyana.png and b/public/images/emoji/win10/guyana.png differ diff --git a/public/images/emoji/win10/haircut.png b/public/images/emoji/win10/haircut.png index b1ba7f551d..352b05a281 100644 Binary files a/public/images/emoji/win10/haircut.png and b/public/images/emoji/win10/haircut.png differ diff --git a/public/images/emoji/win10/haircut_woman.png b/public/images/emoji/win10/haircut_woman.png index b1ba7f551d..352b05a281 100644 Binary files a/public/images/emoji/win10/haircut_woman.png and b/public/images/emoji/win10/haircut_woman.png differ diff --git a/public/images/emoji/win10/haiti.png b/public/images/emoji/win10/haiti.png index 53d2160f9a..afbf0287b6 100644 Binary files a/public/images/emoji/win10/haiti.png and b/public/images/emoji/win10/haiti.png differ diff --git a/public/images/emoji/win10/hash.png b/public/images/emoji/win10/hash.png index 36fcb63881..e77d8bb185 100644 Binary files a/public/images/emoji/win10/hash.png and b/public/images/emoji/win10/hash.png differ diff --git a/public/images/emoji/win10/heard_and_mc_donald_islands.png b/public/images/emoji/win10/heard_and_mc_donald_islands.png index 1b5bf7b178..32d62da17f 100644 Binary files a/public/images/emoji/win10/heard_and_mc_donald_islands.png and b/public/images/emoji/win10/heard_and_mc_donald_islands.png differ diff --git a/public/images/emoji/win10/heart_eyes.png b/public/images/emoji/win10/heart_eyes.png index fb971d06be..360cfe0d1c 100644 Binary files a/public/images/emoji/win10/heart_eyes.png and b/public/images/emoji/win10/heart_eyes.png differ diff --git a/public/images/emoji/win10/heart_eyes_cat.png b/public/images/emoji/win10/heart_eyes_cat.png index ac759ff5e0..2439cab2a6 100644 Binary files a/public/images/emoji/win10/heart_eyes_cat.png and b/public/images/emoji/win10/heart_eyes_cat.png differ diff --git a/public/images/emoji/win10/hiking_boot.png b/public/images/emoji/win10/hiking_boot.png new file mode 100644 index 0000000000..94948d8351 Binary files /dev/null and b/public/images/emoji/win10/hiking_boot.png differ diff --git a/public/images/emoji/win10/hippopotamus.png b/public/images/emoji/win10/hippopotamus.png new file mode 100644 index 0000000000..d176d99976 Binary files /dev/null and b/public/images/emoji/win10/hippopotamus.png differ diff --git a/public/images/emoji/win10/hockey.png b/public/images/emoji/win10/hockey.png index f47c9cd731..61b115f00a 100644 Binary files a/public/images/emoji/win10/hockey.png and b/public/images/emoji/win10/hockey.png differ diff --git a/public/images/emoji/win10/honduras.png b/public/images/emoji/win10/honduras.png index d0aff11833..e1617778cb 100644 Binary files a/public/images/emoji/win10/honduras.png and b/public/images/emoji/win10/honduras.png differ diff --git a/public/images/emoji/win10/honeybee.png b/public/images/emoji/win10/honeybee.png index 6b08780115..666e4c8bab 100644 Binary files a/public/images/emoji/win10/honeybee.png and b/public/images/emoji/win10/honeybee.png differ diff --git a/public/images/emoji/win10/hong_kong.png b/public/images/emoji/win10/hong_kong.png index 9db8cbc102..412b6841f8 100644 Binary files a/public/images/emoji/win10/hong_kong.png and b/public/images/emoji/win10/hong_kong.png differ diff --git a/public/images/emoji/win10/hot_face.png b/public/images/emoji/win10/hot_face.png new file mode 100644 index 0000000000..7b510358a1 Binary files /dev/null and b/public/images/emoji/win10/hot_face.png differ diff --git a/public/images/emoji/win10/hungary.png b/public/images/emoji/win10/hungary.png index 98963a97c9..2d69737f2a 100644 Binary files a/public/images/emoji/win10/hungary.png and b/public/images/emoji/win10/hungary.png differ diff --git a/public/images/emoji/win10/ice_hockey.png b/public/images/emoji/win10/ice_hockey.png index f47c9cd731..61b115f00a 100644 Binary files a/public/images/emoji/win10/ice_hockey.png and b/public/images/emoji/win10/ice_hockey.png differ diff --git a/public/images/emoji/win10/iceland.png b/public/images/emoji/win10/iceland.png index 399f5a4e85..bbe1022fdf 100644 Binary files a/public/images/emoji/win10/iceland.png and b/public/images/emoji/win10/iceland.png differ diff --git a/public/images/emoji/win10/india.png b/public/images/emoji/win10/india.png index b95563b787..e237fb1a7e 100644 Binary files a/public/images/emoji/win10/india.png and b/public/images/emoji/win10/india.png differ diff --git a/public/images/emoji/win10/indonesia.png b/public/images/emoji/win10/indonesia.png index 09e63e6b9f..ab74052019 100644 Binary files a/public/images/emoji/win10/indonesia.png and b/public/images/emoji/win10/indonesia.png differ diff --git a/public/images/emoji/win10/infinity.png b/public/images/emoji/win10/infinity.png new file mode 100644 index 0000000000..778e87b2e4 Binary files /dev/null and b/public/images/emoji/win10/infinity.png differ diff --git a/public/images/emoji/win10/iran.png b/public/images/emoji/win10/iran.png index e30df4c1f5..728b0c817a 100644 Binary files a/public/images/emoji/win10/iran.png and b/public/images/emoji/win10/iran.png differ diff --git a/public/images/emoji/win10/iraq.png b/public/images/emoji/win10/iraq.png index cccd140ba3..81de697331 100644 Binary files a/public/images/emoji/win10/iraq.png and b/public/images/emoji/win10/iraq.png differ diff --git a/public/images/emoji/win10/ireland.png b/public/images/emoji/win10/ireland.png index b97ecbcbd4..3d908bd857 100644 Binary files a/public/images/emoji/win10/ireland.png and b/public/images/emoji/win10/ireland.png differ diff --git a/public/images/emoji/win10/island.png b/public/images/emoji/win10/island.png index d9c37a0230..0e73d39425 100644 Binary files a/public/images/emoji/win10/island.png and b/public/images/emoji/win10/island.png differ diff --git a/public/images/emoji/win10/isle_of_man.png b/public/images/emoji/win10/isle_of_man.png index 7829f538f8..99304fca91 100644 Binary files a/public/images/emoji/win10/isle_of_man.png and b/public/images/emoji/win10/isle_of_man.png differ diff --git a/public/images/emoji/win10/israel.png b/public/images/emoji/win10/israel.png index f7bc67925d..33e880aa19 100644 Binary files a/public/images/emoji/win10/israel.png and b/public/images/emoji/win10/israel.png differ diff --git a/public/images/emoji/win10/it.png b/public/images/emoji/win10/it.png index 13bbb1b1f8..589002bb34 100644 Binary files a/public/images/emoji/win10/it.png and b/public/images/emoji/win10/it.png differ diff --git a/public/images/emoji/win10/jamaica.png b/public/images/emoji/win10/jamaica.png index dc2c807511..2a48a73a5e 100644 Binary files a/public/images/emoji/win10/jamaica.png and b/public/images/emoji/win10/jamaica.png differ diff --git a/public/images/emoji/win10/jersey.png b/public/images/emoji/win10/jersey.png index adfdbc3c1a..bc974c1272 100644 Binary files a/public/images/emoji/win10/jersey.png and b/public/images/emoji/win10/jersey.png differ diff --git a/public/images/emoji/win10/jigsaw.png b/public/images/emoji/win10/jigsaw.png new file mode 100644 index 0000000000..bb7e417a98 Binary files /dev/null and b/public/images/emoji/win10/jigsaw.png differ diff --git a/public/images/emoji/win10/jordan.png b/public/images/emoji/win10/jordan.png index 43a2f9139f..8f70256926 100644 Binary files a/public/images/emoji/win10/jordan.png and b/public/images/emoji/win10/jordan.png differ diff --git a/public/images/emoji/win10/joy.png b/public/images/emoji/win10/joy.png index 1561756b4f..08680d66bc 100644 Binary files a/public/images/emoji/win10/joy.png and b/public/images/emoji/win10/joy.png differ diff --git a/public/images/emoji/win10/joy_cat.png b/public/images/emoji/win10/joy_cat.png index 6fe9f1f6dc..694a055aee 100644 Binary files a/public/images/emoji/win10/joy_cat.png and b/public/images/emoji/win10/joy_cat.png differ diff --git a/public/images/emoji/win10/jp.png b/public/images/emoji/win10/jp.png index cca79ffb9d..dd515aa063 100644 Binary files a/public/images/emoji/win10/jp.png and b/public/images/emoji/win10/jp.png differ diff --git a/public/images/emoji/win10/kangaroo.png b/public/images/emoji/win10/kangaroo.png new file mode 100644 index 0000000000..ecc33ddd06 Binary files /dev/null and b/public/images/emoji/win10/kangaroo.png differ diff --git a/public/images/emoji/win10/kazakhstan.png b/public/images/emoji/win10/kazakhstan.png index 731858e2cf..d7e3401def 100644 Binary files a/public/images/emoji/win10/kazakhstan.png and b/public/images/emoji/win10/kazakhstan.png differ diff --git a/public/images/emoji/win10/kenya.png b/public/images/emoji/win10/kenya.png index cc55fd6981..468ab957ac 100644 Binary files a/public/images/emoji/win10/kenya.png and b/public/images/emoji/win10/kenya.png differ diff --git a/public/images/emoji/win10/keycap_star.png b/public/images/emoji/win10/keycap_star.png index 302650d81e..93344040ad 100644 Binary files a/public/images/emoji/win10/keycap_star.png and b/public/images/emoji/win10/keycap_star.png differ diff --git a/public/images/emoji/win10/kiribati.png b/public/images/emoji/win10/kiribati.png index 138fd3f2b5..ee10d01349 100644 Binary files a/public/images/emoji/win10/kiribati.png and b/public/images/emoji/win10/kiribati.png differ diff --git a/public/images/emoji/win10/kiwi_fruit.png b/public/images/emoji/win10/kiwi_fruit.png index e597ed22d9..ba8568d15e 100644 Binary files a/public/images/emoji/win10/kiwi_fruit.png and b/public/images/emoji/win10/kiwi_fruit.png differ diff --git a/public/images/emoji/win10/kosovo.png b/public/images/emoji/win10/kosovo.png index efea0b70bd..043e9b514d 100644 Binary files a/public/images/emoji/win10/kosovo.png and b/public/images/emoji/win10/kosovo.png differ diff --git a/public/images/emoji/win10/kr.png b/public/images/emoji/win10/kr.png index 82486f8812..8ff7ccd3ff 100644 Binary files a/public/images/emoji/win10/kr.png and b/public/images/emoji/win10/kr.png differ diff --git a/public/images/emoji/win10/kuwait.png b/public/images/emoji/win10/kuwait.png index 32b00e4806..37c5cd60dd 100644 Binary files a/public/images/emoji/win10/kuwait.png and b/public/images/emoji/win10/kuwait.png differ diff --git a/public/images/emoji/win10/kyrgyzstan.png b/public/images/emoji/win10/kyrgyzstan.png index 6ecfc717c9..d1173028eb 100644 Binary files a/public/images/emoji/win10/kyrgyzstan.png and b/public/images/emoji/win10/kyrgyzstan.png differ diff --git a/public/images/emoji/win10/lab_coat.png b/public/images/emoji/win10/lab_coat.png new file mode 100644 index 0000000000..a36d141ff4 Binary files /dev/null and b/public/images/emoji/win10/lab_coat.png differ diff --git a/public/images/emoji/win10/lacrosse.png b/public/images/emoji/win10/lacrosse.png new file mode 100644 index 0000000000..cc052feb16 Binary files /dev/null and b/public/images/emoji/win10/lacrosse.png differ diff --git a/public/images/emoji/win10/laos.png b/public/images/emoji/win10/laos.png index 5dca502f80..44f5e8da70 100644 Binary files a/public/images/emoji/win10/laos.png and b/public/images/emoji/win10/laos.png differ diff --git a/public/images/emoji/win10/latvia.png b/public/images/emoji/win10/latvia.png index a23d4c4e2e..627b031561 100644 Binary files a/public/images/emoji/win10/latvia.png and b/public/images/emoji/win10/latvia.png differ diff --git a/public/images/emoji/win10/laughing.png b/public/images/emoji/win10/laughing.png index 2d3cc4adfe..9bb8ccd117 100644 Binary files a/public/images/emoji/win10/laughing.png and b/public/images/emoji/win10/laughing.png differ diff --git a/public/images/emoji/win10/leafy_green.png b/public/images/emoji/win10/leafy_green.png new file mode 100644 index 0000000000..0ed919f857 Binary files /dev/null and b/public/images/emoji/win10/leafy_green.png differ diff --git a/public/images/emoji/win10/lebanon.png b/public/images/emoji/win10/lebanon.png index 5b8710dfd7..f506228dd6 100644 Binary files a/public/images/emoji/win10/lebanon.png and b/public/images/emoji/win10/lebanon.png differ diff --git a/public/images/emoji/win10/leg.png b/public/images/emoji/win10/leg.png new file mode 100644 index 0000000000..628103506f Binary files /dev/null and b/public/images/emoji/win10/leg.png differ diff --git a/public/images/emoji/win10/lesotho.png b/public/images/emoji/win10/lesotho.png index 136ea59d3d..77c7544679 100644 Binary files a/public/images/emoji/win10/lesotho.png and b/public/images/emoji/win10/lesotho.png differ diff --git a/public/images/emoji/win10/liberia.png b/public/images/emoji/win10/liberia.png index 2828cee4c8..8ed6a5a877 100644 Binary files a/public/images/emoji/win10/liberia.png and b/public/images/emoji/win10/liberia.png differ diff --git a/public/images/emoji/win10/libya.png b/public/images/emoji/win10/libya.png index a6c90e15d4..426e9319db 100644 Binary files a/public/images/emoji/win10/libya.png and b/public/images/emoji/win10/libya.png differ diff --git a/public/images/emoji/win10/liechtenstein.png b/public/images/emoji/win10/liechtenstein.png index 93605ebfd5..20f3bb9ada 100644 Binary files a/public/images/emoji/win10/liechtenstein.png and b/public/images/emoji/win10/liechtenstein.png differ diff --git a/public/images/emoji/win10/lithuania.png b/public/images/emoji/win10/lithuania.png index d4e7e6766a..a8a8aeece7 100644 Binary files a/public/images/emoji/win10/lithuania.png and b/public/images/emoji/win10/lithuania.png differ diff --git a/public/images/emoji/win10/llama.png b/public/images/emoji/win10/llama.png new file mode 100644 index 0000000000..750f4c14b8 Binary files /dev/null and b/public/images/emoji/win10/llama.png differ diff --git a/public/images/emoji/win10/lobster.png b/public/images/emoji/win10/lobster.png new file mode 100644 index 0000000000..94877a17e2 Binary files /dev/null and b/public/images/emoji/win10/lobster.png differ diff --git a/public/images/emoji/win10/lotion_bottle.png b/public/images/emoji/win10/lotion_bottle.png new file mode 100644 index 0000000000..abd89b272d Binary files /dev/null and b/public/images/emoji/win10/lotion_bottle.png differ diff --git a/public/images/emoji/win10/luggage.png b/public/images/emoji/win10/luggage.png new file mode 100644 index 0000000000..decc7eaf36 Binary files /dev/null and b/public/images/emoji/win10/luggage.png differ diff --git a/public/images/emoji/win10/luxembourg.png b/public/images/emoji/win10/luxembourg.png index a8c6737d1b..c2c49482b0 100644 Binary files a/public/images/emoji/win10/luxembourg.png and b/public/images/emoji/win10/luxembourg.png differ diff --git a/public/images/emoji/win10/macau.png b/public/images/emoji/win10/macau.png index 70620e1d54..2fe5c8cb83 100644 Binary files a/public/images/emoji/win10/macau.png and b/public/images/emoji/win10/macau.png differ diff --git a/public/images/emoji/win10/macedonia.png b/public/images/emoji/win10/macedonia.png index a4c8ef41d2..379bb4a3d7 100644 Binary files a/public/images/emoji/win10/macedonia.png and b/public/images/emoji/win10/macedonia.png differ diff --git a/public/images/emoji/win10/madagascar.png b/public/images/emoji/win10/madagascar.png index 708ec7416c..09e5f33936 100644 Binary files a/public/images/emoji/win10/madagascar.png and b/public/images/emoji/win10/madagascar.png differ diff --git a/public/images/emoji/win10/mag.png b/public/images/emoji/win10/mag.png index 9ed9210f3a..48ac911465 100644 Binary files a/public/images/emoji/win10/mag.png and b/public/images/emoji/win10/mag.png differ diff --git a/public/images/emoji/win10/mag_right.png b/public/images/emoji/win10/mag_right.png index c6b0bb5a77..bd85cb76bc 100644 Binary files a/public/images/emoji/win10/mag_right.png and b/public/images/emoji/win10/mag_right.png differ diff --git a/public/images/emoji/win10/magnet.png b/public/images/emoji/win10/magnet.png new file mode 100644 index 0000000000..00f4c1a710 Binary files /dev/null and b/public/images/emoji/win10/magnet.png differ diff --git a/public/images/emoji/win10/malawi.png b/public/images/emoji/win10/malawi.png index 854fd4ce85..bc81407e00 100644 Binary files a/public/images/emoji/win10/malawi.png and b/public/images/emoji/win10/malawi.png differ diff --git a/public/images/emoji/win10/malaysia.png b/public/images/emoji/win10/malaysia.png index 13137b15ad..108dd99dac 100644 Binary files a/public/images/emoji/win10/malaysia.png and b/public/images/emoji/win10/malaysia.png differ diff --git a/public/images/emoji/win10/maldives.png b/public/images/emoji/win10/maldives.png index e0fec7e04b..c666d7ae6d 100644 Binary files a/public/images/emoji/win10/maldives.png and b/public/images/emoji/win10/maldives.png differ diff --git a/public/images/emoji/win10/male_detective.png b/public/images/emoji/win10/male_detective.png index 625c4ee813..14eb06c59f 100644 Binary files a/public/images/emoji/win10/male_detective.png and b/public/images/emoji/win10/male_detective.png differ diff --git a/public/images/emoji/win10/mali.png b/public/images/emoji/win10/mali.png index ef19c197c7..d7db7397c1 100644 Binary files a/public/images/emoji/win10/mali.png and b/public/images/emoji/win10/mali.png differ diff --git a/public/images/emoji/win10/malta.png b/public/images/emoji/win10/malta.png index f6850d6276..5cc7d787d5 100644 Binary files a/public/images/emoji/win10/malta.png and b/public/images/emoji/win10/malta.png differ diff --git a/public/images/emoji/win10/man_bald.png b/public/images/emoji/win10/man_bald.png new file mode 100644 index 0000000000..631017ea00 Binary files /dev/null and b/public/images/emoji/win10/man_bald.png differ diff --git a/public/images/emoji/win10/man_cook.png b/public/images/emoji/win10/man_cook.png index 86bc19a3b6..64fc99ce9e 100644 Binary files a/public/images/emoji/win10/man_cook.png and b/public/images/emoji/win10/man_cook.png differ diff --git a/public/images/emoji/win10/man_curly_haired.png b/public/images/emoji/win10/man_curly_haired.png new file mode 100644 index 0000000000..307240b5fb Binary files /dev/null and b/public/images/emoji/win10/man_curly_haired.png differ diff --git a/public/images/emoji/win10/man_red_haired.png b/public/images/emoji/win10/man_red_haired.png new file mode 100644 index 0000000000..1f513fded5 Binary files /dev/null and b/public/images/emoji/win10/man_red_haired.png differ diff --git a/public/images/emoji/win10/man_superhero.png b/public/images/emoji/win10/man_superhero.png new file mode 100644 index 0000000000..9082575ce9 Binary files /dev/null and b/public/images/emoji/win10/man_superhero.png differ diff --git a/public/images/emoji/win10/man_supervillain.png b/public/images/emoji/win10/man_supervillain.png new file mode 100644 index 0000000000..634a3f4920 Binary files /dev/null and b/public/images/emoji/win10/man_supervillain.png differ diff --git a/public/images/emoji/win10/man_white_haired.png b/public/images/emoji/win10/man_white_haired.png new file mode 100644 index 0000000000..52d496ae15 Binary files /dev/null and b/public/images/emoji/win10/man_white_haired.png differ diff --git a/public/images/emoji/win10/mango.png b/public/images/emoji/win10/mango.png new file mode 100644 index 0000000000..22e9d08cd9 Binary files /dev/null and b/public/images/emoji/win10/mango.png differ diff --git a/public/images/emoji/win10/marshall_islands.png b/public/images/emoji/win10/marshall_islands.png index 35a77d3ec6..6b69a8d551 100644 Binary files a/public/images/emoji/win10/marshall_islands.png and b/public/images/emoji/win10/marshall_islands.png differ diff --git a/public/images/emoji/win10/martinique.png b/public/images/emoji/win10/martinique.png index 20265c357a..aa46f114c2 100644 Binary files a/public/images/emoji/win10/martinique.png and b/public/images/emoji/win10/martinique.png differ diff --git a/public/images/emoji/win10/mauritania.png b/public/images/emoji/win10/mauritania.png index 23fa26e4ce..e9767976cf 100644 Binary files a/public/images/emoji/win10/mauritania.png and b/public/images/emoji/win10/mauritania.png differ diff --git a/public/images/emoji/win10/mauritius.png b/public/images/emoji/win10/mauritius.png index 846272e367..04d339cd1b 100644 Binary files a/public/images/emoji/win10/mauritius.png and b/public/images/emoji/win10/mauritius.png differ diff --git a/public/images/emoji/win10/mayotte.png b/public/images/emoji/win10/mayotte.png index 43a7879d24..642b133c08 100644 Binary files a/public/images/emoji/win10/mayotte.png and b/public/images/emoji/win10/mayotte.png differ diff --git a/public/images/emoji/win10/mexico.png b/public/images/emoji/win10/mexico.png index 95e838852b..61775bf729 100644 Binary files a/public/images/emoji/win10/mexico.png and b/public/images/emoji/win10/mexico.png differ diff --git a/public/images/emoji/win10/microbe.png b/public/images/emoji/win10/microbe.png new file mode 100644 index 0000000000..5a9d6f639b Binary files /dev/null and b/public/images/emoji/win10/microbe.png differ diff --git a/public/images/emoji/win10/micronesia.png b/public/images/emoji/win10/micronesia.png index 549d03fdc7..0fc25e88f9 100644 Binary files a/public/images/emoji/win10/micronesia.png and b/public/images/emoji/win10/micronesia.png differ diff --git a/public/images/emoji/win10/milk_glass.png b/public/images/emoji/win10/milk_glass.png index 8aaefb7fe9..55c19957c2 100644 Binary files a/public/images/emoji/win10/milk_glass.png and b/public/images/emoji/win10/milk_glass.png differ diff --git a/public/images/emoji/win10/moldova.png b/public/images/emoji/win10/moldova.png index d4463a0147..4852033fce 100644 Binary files a/public/images/emoji/win10/moldova.png and b/public/images/emoji/win10/moldova.png differ diff --git a/public/images/emoji/win10/monaco.png b/public/images/emoji/win10/monaco.png index 17833f535a..4f57a0405c 100644 Binary files a/public/images/emoji/win10/monaco.png and b/public/images/emoji/win10/monaco.png differ diff --git a/public/images/emoji/win10/mongolia.png b/public/images/emoji/win10/mongolia.png index cf97894508..7f2225c80b 100644 Binary files a/public/images/emoji/win10/mongolia.png and b/public/images/emoji/win10/mongolia.png differ diff --git a/public/images/emoji/win10/montenegro.png b/public/images/emoji/win10/montenegro.png index 7cbd07cef3..ed5d0c4198 100644 Binary files a/public/images/emoji/win10/montenegro.png and b/public/images/emoji/win10/montenegro.png differ diff --git a/public/images/emoji/win10/montserrat.png b/public/images/emoji/win10/montserrat.png index 28712de519..fd6b759a34 100644 Binary files a/public/images/emoji/win10/montserrat.png and b/public/images/emoji/win10/montserrat.png differ diff --git a/public/images/emoji/win10/moon_cake.png b/public/images/emoji/win10/moon_cake.png new file mode 100644 index 0000000000..43cedd8236 Binary files /dev/null and b/public/images/emoji/win10/moon_cake.png differ diff --git a/public/images/emoji/win10/morocco.png b/public/images/emoji/win10/morocco.png index 7f16d0a66d..10d4d98ba7 100644 Binary files a/public/images/emoji/win10/morocco.png and b/public/images/emoji/win10/morocco.png differ diff --git a/public/images/emoji/win10/mosquito.png b/public/images/emoji/win10/mosquito.png new file mode 100644 index 0000000000..66ece3ca86 Binary files /dev/null and b/public/images/emoji/win10/mosquito.png differ diff --git a/public/images/emoji/win10/mouse_three_button.png b/public/images/emoji/win10/mouse_three_button.png index 3e39c0f398..db8e3fa2de 100644 Binary files a/public/images/emoji/win10/mouse_three_button.png and b/public/images/emoji/win10/mouse_three_button.png differ diff --git a/public/images/emoji/win10/mozambique.png b/public/images/emoji/win10/mozambique.png index 07d5cd56f0..1a33e0c69e 100644 Binary files a/public/images/emoji/win10/mozambique.png and b/public/images/emoji/win10/mozambique.png differ diff --git a/public/images/emoji/win10/musical_keyboard.png b/public/images/emoji/win10/musical_keyboard.png index ffc3758ccb..9599097d81 100644 Binary files a/public/images/emoji/win10/musical_keyboard.png and b/public/images/emoji/win10/musical_keyboard.png differ diff --git a/public/images/emoji/win10/myanmar.png b/public/images/emoji/win10/myanmar.png index 345829e2a3..42d00994e2 100644 Binary files a/public/images/emoji/win10/myanmar.png and b/public/images/emoji/win10/myanmar.png differ diff --git a/public/images/emoji/win10/namibia.png b/public/images/emoji/win10/namibia.png index f505b371fd..ba546e8227 100644 Binary files a/public/images/emoji/win10/namibia.png and b/public/images/emoji/win10/namibia.png differ diff --git a/public/images/emoji/win10/nauru.png b/public/images/emoji/win10/nauru.png index 443c1a5e93..1748da9cab 100644 Binary files a/public/images/emoji/win10/nauru.png and b/public/images/emoji/win10/nauru.png differ diff --git a/public/images/emoji/win10/nazar_amulet.png b/public/images/emoji/win10/nazar_amulet.png new file mode 100644 index 0000000000..3ba6c6b050 Binary files /dev/null and b/public/images/emoji/win10/nazar_amulet.png differ diff --git a/public/images/emoji/win10/nepal.png b/public/images/emoji/win10/nepal.png index cd57822d80..48acf5f2b7 100644 Binary files a/public/images/emoji/win10/nepal.png and b/public/images/emoji/win10/nepal.png differ diff --git a/public/images/emoji/win10/netherlands.png b/public/images/emoji/win10/netherlands.png index 1e37d79d5d..6963f32b59 100644 Binary files a/public/images/emoji/win10/netherlands.png and b/public/images/emoji/win10/netherlands.png differ diff --git a/public/images/emoji/win10/new_caledonia.png b/public/images/emoji/win10/new_caledonia.png index 45914c48c7..325fce6fcc 100644 Binary files a/public/images/emoji/win10/new_caledonia.png and b/public/images/emoji/win10/new_caledonia.png differ diff --git a/public/images/emoji/win10/new_zealand.png b/public/images/emoji/win10/new_zealand.png index 9ab60df7b7..753db4eb2a 100644 Binary files a/public/images/emoji/win10/new_zealand.png and b/public/images/emoji/win10/new_zealand.png differ diff --git a/public/images/emoji/win10/nicaragua.png b/public/images/emoji/win10/nicaragua.png index e405151e2d..0906eeb4e7 100644 Binary files a/public/images/emoji/win10/nicaragua.png and b/public/images/emoji/win10/nicaragua.png differ diff --git a/public/images/emoji/win10/niger.png b/public/images/emoji/win10/niger.png index fb6c4a4d37..6249ba305f 100644 Binary files a/public/images/emoji/win10/niger.png and b/public/images/emoji/win10/niger.png differ diff --git a/public/images/emoji/win10/nigeria.png b/public/images/emoji/win10/nigeria.png index 23c9d9a762..6cbb424d3d 100644 Binary files a/public/images/emoji/win10/nigeria.png and b/public/images/emoji/win10/nigeria.png differ diff --git a/public/images/emoji/win10/nine.png b/public/images/emoji/win10/nine.png index 413829efbf..935a35d3a9 100644 Binary files a/public/images/emoji/win10/nine.png and b/public/images/emoji/win10/nine.png differ diff --git a/public/images/emoji/win10/niue.png b/public/images/emoji/win10/niue.png index daaa26cc16..9bd5ec1ada 100644 Binary files a/public/images/emoji/win10/niue.png and b/public/images/emoji/win10/niue.png differ diff --git a/public/images/emoji/win10/norfolk_island.png b/public/images/emoji/win10/norfolk_island.png index 574acba100..599da68e6b 100644 Binary files a/public/images/emoji/win10/norfolk_island.png and b/public/images/emoji/win10/norfolk_island.png differ diff --git a/public/images/emoji/win10/north_korea.png b/public/images/emoji/win10/north_korea.png index d15d10aece..7e05f75fc6 100644 Binary files a/public/images/emoji/win10/north_korea.png and b/public/images/emoji/win10/north_korea.png differ diff --git a/public/images/emoji/win10/northern_mariana_islands.png b/public/images/emoji/win10/northern_mariana_islands.png index 962a6171b9..a581fbf72d 100644 Binary files a/public/images/emoji/win10/northern_mariana_islands.png and b/public/images/emoji/win10/northern_mariana_islands.png differ diff --git a/public/images/emoji/win10/norway.png b/public/images/emoji/win10/norway.png index 004a11d830..151484e1db 100644 Binary files a/public/images/emoji/win10/norway.png and b/public/images/emoji/win10/norway.png differ diff --git a/public/images/emoji/win10/octopus.png b/public/images/emoji/win10/octopus.png index 8c93aab175..8525f6c6b8 100644 Binary files a/public/images/emoji/win10/octopus.png and b/public/images/emoji/win10/octopus.png differ diff --git a/public/images/emoji/win10/oman.png b/public/images/emoji/win10/oman.png index 59e0df087e..1822af946a 100644 Binary files a/public/images/emoji/win10/oman.png and b/public/images/emoji/win10/oman.png differ diff --git a/public/images/emoji/win10/one.png b/public/images/emoji/win10/one.png index 350636c23d..203400c2c9 100644 Binary files a/public/images/emoji/win10/one.png and b/public/images/emoji/win10/one.png differ diff --git a/public/images/emoji/win10/open_mouth.png b/public/images/emoji/win10/open_mouth.png index 17e126277b..fddf940be7 100644 Binary files a/public/images/emoji/win10/open_mouth.png and b/public/images/emoji/win10/open_mouth.png differ diff --git a/public/images/emoji/win10/pakistan.png b/public/images/emoji/win10/pakistan.png index f4c74d1d49..77b7edf3eb 100644 Binary files a/public/images/emoji/win10/pakistan.png and b/public/images/emoji/win10/pakistan.png differ diff --git a/public/images/emoji/win10/palau.png b/public/images/emoji/win10/palau.png index 69aace7555..8a7aea6a9d 100644 Binary files a/public/images/emoji/win10/palau.png and b/public/images/emoji/win10/palau.png differ diff --git a/public/images/emoji/win10/palestinian_territories.png b/public/images/emoji/win10/palestinian_territories.png index 2e4399d762..2c22aef4c7 100644 Binary files a/public/images/emoji/win10/palestinian_territories.png and b/public/images/emoji/win10/palestinian_territories.png differ diff --git a/public/images/emoji/win10/palm_tree.png b/public/images/emoji/win10/palm_tree.png index 5b10d281c7..f8d07c9cfe 100644 Binary files a/public/images/emoji/win10/palm_tree.png and b/public/images/emoji/win10/palm_tree.png differ diff --git a/public/images/emoji/win10/panama.png b/public/images/emoji/win10/panama.png index 2a564db426..72a821c163 100644 Binary files a/public/images/emoji/win10/panama.png and b/public/images/emoji/win10/panama.png differ diff --git a/public/images/emoji/win10/papua_new_guinea.png b/public/images/emoji/win10/papua_new_guinea.png index b449d67794..d75762c30a 100644 Binary files a/public/images/emoji/win10/papua_new_guinea.png and b/public/images/emoji/win10/papua_new_guinea.png differ diff --git a/public/images/emoji/win10/paraguay.png b/public/images/emoji/win10/paraguay.png index d9eab9434c..967fb4cd45 100644 Binary files a/public/images/emoji/win10/paraguay.png and b/public/images/emoji/win10/paraguay.png differ diff --git a/public/images/emoji/win10/parrot.png b/public/images/emoji/win10/parrot.png new file mode 100644 index 0000000000..943be0fdb3 Binary files /dev/null and b/public/images/emoji/win10/parrot.png differ diff --git a/public/images/emoji/win10/partly_sunny.png b/public/images/emoji/win10/partly_sunny.png index c8f11a93af..b3a60292fc 100644 Binary files a/public/images/emoji/win10/partly_sunny.png and b/public/images/emoji/win10/partly_sunny.png differ diff --git a/public/images/emoji/win10/partying_face.png b/public/images/emoji/win10/partying_face.png new file mode 100644 index 0000000000..e8d2de04cc Binary files /dev/null and b/public/images/emoji/win10/partying_face.png differ diff --git a/public/images/emoji/win10/peach.png b/public/images/emoji/win10/peach.png index 445245f32f..45654dd71d 100644 Binary files a/public/images/emoji/win10/peach.png and b/public/images/emoji/win10/peach.png differ diff --git a/public/images/emoji/win10/peacock.png b/public/images/emoji/win10/peacock.png new file mode 100644 index 0000000000..a716998709 Binary files /dev/null and b/public/images/emoji/win10/peacock.png differ diff --git a/public/images/emoji/win10/performing_arts.png b/public/images/emoji/win10/performing_arts.png index 809a3f3901..bd4ff0510b 100644 Binary files a/public/images/emoji/win10/performing_arts.png and b/public/images/emoji/win10/performing_arts.png differ diff --git a/public/images/emoji/win10/peru.png b/public/images/emoji/win10/peru.png index bbb5523f93..f7e54091a9 100644 Binary files a/public/images/emoji/win10/peru.png and b/public/images/emoji/win10/peru.png differ diff --git a/public/images/emoji/win10/petri_dish.png b/public/images/emoji/win10/petri_dish.png new file mode 100644 index 0000000000..a676fbc83c Binary files /dev/null and b/public/images/emoji/win10/petri_dish.png differ diff --git a/public/images/emoji/win10/philippines.png b/public/images/emoji/win10/philippines.png index b26fa86ac2..a0adbef2cf 100644 Binary files a/public/images/emoji/win10/philippines.png and b/public/images/emoji/win10/philippines.png differ diff --git a/public/images/emoji/win10/pirate_flag.png b/public/images/emoji/win10/pirate_flag.png new file mode 100644 index 0000000000..91f599b478 Binary files /dev/null and b/public/images/emoji/win10/pirate_flag.png differ diff --git a/public/images/emoji/win10/pitcairn_islands.png b/public/images/emoji/win10/pitcairn_islands.png index 3e3d79bca5..a7ced0f12c 100644 Binary files a/public/images/emoji/win10/pitcairn_islands.png and b/public/images/emoji/win10/pitcairn_islands.png differ diff --git a/public/images/emoji/win10/place_of_worship.png b/public/images/emoji/win10/place_of_worship.png index 23c37f3023..6fabf5538b 100644 Binary files a/public/images/emoji/win10/place_of_worship.png and b/public/images/emoji/win10/place_of_worship.png differ diff --git a/public/images/emoji/win10/pleading_face.png b/public/images/emoji/win10/pleading_face.png new file mode 100644 index 0000000000..e8c60791bd Binary files /dev/null and b/public/images/emoji/win10/pleading_face.png differ diff --git a/public/images/emoji/win10/poland.png b/public/images/emoji/win10/poland.png index c8872ee52e..af38b9a8e2 100644 Binary files a/public/images/emoji/win10/poland.png and b/public/images/emoji/win10/poland.png differ diff --git a/public/images/emoji/win10/policeman.png b/public/images/emoji/win10/policeman.png index 9de63c18d8..1ef59de124 100644 Binary files a/public/images/emoji/win10/policeman.png and b/public/images/emoji/win10/policeman.png differ diff --git a/public/images/emoji/win10/policewoman.png b/public/images/emoji/win10/policewoman.png index 33297dcab3..1274e321ff 100644 Binary files a/public/images/emoji/win10/policewoman.png and b/public/images/emoji/win10/policewoman.png differ diff --git a/public/images/emoji/win10/portugal.png b/public/images/emoji/win10/portugal.png index 5646de0622..246e2ceede 100644 Binary files a/public/images/emoji/win10/portugal.png and b/public/images/emoji/win10/portugal.png differ diff --git a/public/images/emoji/win10/potato.png b/public/images/emoji/win10/potato.png index 95225a806d..2b324bb783 100644 Binary files a/public/images/emoji/win10/potato.png and b/public/images/emoji/win10/potato.png differ diff --git a/public/images/emoji/win10/puerto_rico.png b/public/images/emoji/win10/puerto_rico.png index 05a929944d..6d8a9634fa 100644 Binary files a/public/images/emoji/win10/puerto_rico.png and b/public/images/emoji/win10/puerto_rico.png differ diff --git a/public/images/emoji/win10/qatar.png b/public/images/emoji/win10/qatar.png index f51ae1d0ff..363099051c 100644 Binary files a/public/images/emoji/win10/qatar.png and b/public/images/emoji/win10/qatar.png differ diff --git a/public/images/emoji/win10/raccoon.png b/public/images/emoji/win10/raccoon.png new file mode 100644 index 0000000000..9a785b5a05 Binary files /dev/null and b/public/images/emoji/win10/raccoon.png differ diff --git a/public/images/emoji/win10/rainbow.png b/public/images/emoji/win10/rainbow.png index f4261568d0..c01302a77c 100644 Binary files a/public/images/emoji/win10/rainbow.png and b/public/images/emoji/win10/rainbow.png differ diff --git a/public/images/emoji/win10/receipt.png b/public/images/emoji/win10/receipt.png new file mode 100644 index 0000000000..a250e0298c Binary files /dev/null and b/public/images/emoji/win10/receipt.png differ diff --git a/public/images/emoji/win10/red_gift_envelope.png b/public/images/emoji/win10/red_gift_envelope.png new file mode 100644 index 0000000000..1e6f917b2a Binary files /dev/null and b/public/images/emoji/win10/red_gift_envelope.png differ diff --git a/public/images/emoji/win10/reunion.png b/public/images/emoji/win10/reunion.png index 1679d4c5b9..188d989778 100644 Binary files a/public/images/emoji/win10/reunion.png and b/public/images/emoji/win10/reunion.png differ diff --git a/public/images/emoji/win10/rofl.png b/public/images/emoji/win10/rofl.png index 47cf2e8e38..83f2441d90 100644 Binary files a/public/images/emoji/win10/rofl.png and b/public/images/emoji/win10/rofl.png differ diff --git a/public/images/emoji/win10/roll_of_toilet_paper.png b/public/images/emoji/win10/roll_of_toilet_paper.png new file mode 100644 index 0000000000..c0adf34dde Binary files /dev/null and b/public/images/emoji/win10/roll_of_toilet_paper.png differ diff --git a/public/images/emoji/win10/romania.png b/public/images/emoji/win10/romania.png index 2b16324878..953098b82d 100644 Binary files a/public/images/emoji/win10/romania.png and b/public/images/emoji/win10/romania.png differ diff --git a/public/images/emoji/win10/ru.png b/public/images/emoji/win10/ru.png index 3ecaefd941..47752f3f0c 100644 Binary files a/public/images/emoji/win10/ru.png and b/public/images/emoji/win10/ru.png differ diff --git a/public/images/emoji/win10/rwanda.png b/public/images/emoji/win10/rwanda.png index a45a988ff5..2802d1a2d7 100644 Binary files a/public/images/emoji/win10/rwanda.png and b/public/images/emoji/win10/rwanda.png differ diff --git a/public/images/emoji/win10/safety_pin.png b/public/images/emoji/win10/safety_pin.png new file mode 100644 index 0000000000..de85efa2dd Binary files /dev/null and b/public/images/emoji/win10/safety_pin.png differ diff --git a/public/images/emoji/win10/salt.png b/public/images/emoji/win10/salt.png new file mode 100644 index 0000000000..ef1e7cc454 Binary files /dev/null and b/public/images/emoji/win10/salt.png differ diff --git a/public/images/emoji/win10/samoa.png b/public/images/emoji/win10/samoa.png index de81c048d0..5356f6d468 100644 Binary files a/public/images/emoji/win10/samoa.png and b/public/images/emoji/win10/samoa.png differ diff --git a/public/images/emoji/win10/san_marino.png b/public/images/emoji/win10/san_marino.png index fa20a00808..ddecba8b9e 100644 Binary files a/public/images/emoji/win10/san_marino.png and b/public/images/emoji/win10/san_marino.png differ diff --git a/public/images/emoji/win10/sao_tome_principe.png b/public/images/emoji/win10/sao_tome_principe.png index bbfcbd18df..e39a8e259f 100644 Binary files a/public/images/emoji/win10/sao_tome_principe.png and b/public/images/emoji/win10/sao_tome_principe.png differ diff --git a/public/images/emoji/win10/satellite_orbital.png b/public/images/emoji/win10/satellite_orbital.png index 1b1553a6b6..fb98ebf1cb 100644 Binary files a/public/images/emoji/win10/satellite_orbital.png and b/public/images/emoji/win10/satellite_orbital.png differ diff --git a/public/images/emoji/win10/satisfied.png b/public/images/emoji/win10/satisfied.png index 2d3cc4adfe..9bb8ccd117 100644 Binary files a/public/images/emoji/win10/satisfied.png and b/public/images/emoji/win10/satisfied.png differ diff --git a/public/images/emoji/win10/saudi_arabia.png b/public/images/emoji/win10/saudi_arabia.png index 59954eccbc..5f90f43d4b 100644 Binary files a/public/images/emoji/win10/saudi_arabia.png and b/public/images/emoji/win10/saudi_arabia.png differ diff --git a/public/images/emoji/win10/scissors.png b/public/images/emoji/win10/scissors.png index 9bb7bb4416..d5a474d9d1 100644 Binary files a/public/images/emoji/win10/scissors.png and b/public/images/emoji/win10/scissors.png differ diff --git a/public/images/emoji/win10/scorpion.png b/public/images/emoji/win10/scorpion.png index d562f238b6..1ce45ffab3 100644 Binary files a/public/images/emoji/win10/scorpion.png and b/public/images/emoji/win10/scorpion.png differ diff --git a/public/images/emoji/win10/scream.png b/public/images/emoji/win10/scream.png index b527b2a2f0..da05bf15c5 100644 Binary files a/public/images/emoji/win10/scream.png and b/public/images/emoji/win10/scream.png differ diff --git a/public/images/emoji/win10/scream_cat.png b/public/images/emoji/win10/scream_cat.png index 6bd0bd2a52..317087639c 100644 Binary files a/public/images/emoji/win10/scream_cat.png and b/public/images/emoji/win10/scream_cat.png differ diff --git a/public/images/emoji/win10/senegal.png b/public/images/emoji/win10/senegal.png index 2d32427625..caf9e4578b 100644 Binary files a/public/images/emoji/win10/senegal.png and b/public/images/emoji/win10/senegal.png differ diff --git a/public/images/emoji/win10/serbia.png b/public/images/emoji/win10/serbia.png index a7af1346e5..cc11163b5f 100644 Binary files a/public/images/emoji/win10/serbia.png and b/public/images/emoji/win10/serbia.png differ diff --git a/public/images/emoji/win10/seven.png b/public/images/emoji/win10/seven.png index c2239b38fc..e893bcd06d 100644 Binary files a/public/images/emoji/win10/seven.png and b/public/images/emoji/win10/seven.png differ diff --git a/public/images/emoji/win10/seychelles.png b/public/images/emoji/win10/seychelles.png index e69ca6add1..908f6b88e6 100644 Binary files a/public/images/emoji/win10/seychelles.png and b/public/images/emoji/win10/seychelles.png differ diff --git a/public/images/emoji/win10/shark.png b/public/images/emoji/win10/shark.png index 312241778c..b970cef2bd 100644 Binary files a/public/images/emoji/win10/shark.png and b/public/images/emoji/win10/shark.png differ diff --git a/public/images/emoji/win10/sierra_leone.png b/public/images/emoji/win10/sierra_leone.png index 816f090002..de88763d0d 100644 Binary files a/public/images/emoji/win10/sierra_leone.png and b/public/images/emoji/win10/sierra_leone.png differ diff --git a/public/images/emoji/win10/singapore.png b/public/images/emoji/win10/singapore.png index 4cf2332d20..454b82a079 100644 Binary files a/public/images/emoji/win10/singapore.png and b/public/images/emoji/win10/singapore.png differ diff --git a/public/images/emoji/win10/sint_maarten.png b/public/images/emoji/win10/sint_maarten.png index 5248152aba..72401f5fcd 100644 Binary files a/public/images/emoji/win10/sint_maarten.png and b/public/images/emoji/win10/sint_maarten.png differ diff --git a/public/images/emoji/win10/six.png b/public/images/emoji/win10/six.png index 8ec9cdb10a..55b736a1c7 100644 Binary files a/public/images/emoji/win10/six.png and b/public/images/emoji/win10/six.png differ diff --git a/public/images/emoji/win10/skateboard.png b/public/images/emoji/win10/skateboard.png new file mode 100644 index 0000000000..a2398e8cda Binary files /dev/null and b/public/images/emoji/win10/skateboard.png differ diff --git a/public/images/emoji/win10/skeleton.png b/public/images/emoji/win10/skeleton.png index 05f12ca1da..01c6fd593c 100644 Binary files a/public/images/emoji/win10/skeleton.png and b/public/images/emoji/win10/skeleton.png differ diff --git a/public/images/emoji/win10/skull.png b/public/images/emoji/win10/skull.png index 05f12ca1da..01c6fd593c 100644 Binary files a/public/images/emoji/win10/skull.png and b/public/images/emoji/win10/skull.png differ diff --git a/public/images/emoji/win10/skull_and_crossbones.png b/public/images/emoji/win10/skull_and_crossbones.png index 7c3982e6cc..ac4ba9bb55 100644 Binary files a/public/images/emoji/win10/skull_and_crossbones.png and b/public/images/emoji/win10/skull_and_crossbones.png differ diff --git a/public/images/emoji/win10/skull_crossbones.png b/public/images/emoji/win10/skull_crossbones.png index 7c3982e6cc..ac4ba9bb55 100644 Binary files a/public/images/emoji/win10/skull_crossbones.png and b/public/images/emoji/win10/skull_crossbones.png differ diff --git a/public/images/emoji/win10/sleepy.png b/public/images/emoji/win10/sleepy.png index bed793c1f8..990be956a7 100644 Binary files a/public/images/emoji/win10/sleepy.png and b/public/images/emoji/win10/sleepy.png differ diff --git a/public/images/emoji/win10/sleuth_or_spy.png b/public/images/emoji/win10/sleuth_or_spy.png index 625c4ee813..14eb06c59f 100644 Binary files a/public/images/emoji/win10/sleuth_or_spy.png and b/public/images/emoji/win10/sleuth_or_spy.png differ diff --git a/public/images/emoji/win10/slovakia.png b/public/images/emoji/win10/slovakia.png index 9b716032fd..276c387e03 100644 Binary files a/public/images/emoji/win10/slovakia.png and b/public/images/emoji/win10/slovakia.png differ diff --git a/public/images/emoji/win10/slovenia.png b/public/images/emoji/win10/slovenia.png index 6dfbe6eae2..473b67634f 100644 Binary files a/public/images/emoji/win10/slovenia.png and b/public/images/emoji/win10/slovenia.png differ diff --git a/public/images/emoji/win10/smile.png b/public/images/emoji/win10/smile.png index 624cb82e4b..bae7477116 100644 Binary files a/public/images/emoji/win10/smile.png and b/public/images/emoji/win10/smile.png differ diff --git a/public/images/emoji/win10/smile_cat.png b/public/images/emoji/win10/smile_cat.png index 2dd668e3c9..5c295ee567 100644 Binary files a/public/images/emoji/win10/smile_cat.png and b/public/images/emoji/win10/smile_cat.png differ diff --git a/public/images/emoji/win10/smiley.png b/public/images/emoji/win10/smiley.png index 04f0108c26..a45b84ddc7 100644 Binary files a/public/images/emoji/win10/smiley.png and b/public/images/emoji/win10/smiley.png differ diff --git a/public/images/emoji/win10/smiley_cat.png b/public/images/emoji/win10/smiley_cat.png index 83655cb6f8..1c1f29e608 100644 Binary files a/public/images/emoji/win10/smiley_cat.png and b/public/images/emoji/win10/smiley_cat.png differ diff --git a/public/images/emoji/win10/smiling_face_with_three_hearts.png b/public/images/emoji/win10/smiling_face_with_three_hearts.png new file mode 100644 index 0000000000..4cfa1ec23c Binary files /dev/null and b/public/images/emoji/win10/smiling_face_with_three_hearts.png differ diff --git a/public/images/emoji/win10/snake.png b/public/images/emoji/win10/snake.png index e961c09bc0..a1448b6fd5 100644 Binary files a/public/images/emoji/win10/snake.png and b/public/images/emoji/win10/snake.png differ diff --git a/public/images/emoji/win10/soap.png b/public/images/emoji/win10/soap.png new file mode 100644 index 0000000000..d6805a7dd8 Binary files /dev/null and b/public/images/emoji/win10/soap.png differ diff --git a/public/images/emoji/win10/sob.png b/public/images/emoji/win10/sob.png index 135f9df420..1647ab8bcb 100644 Binary files a/public/images/emoji/win10/sob.png and b/public/images/emoji/win10/sob.png differ diff --git a/public/images/emoji/win10/softball.png b/public/images/emoji/win10/softball.png new file mode 100644 index 0000000000..31047d6b5a Binary files /dev/null and b/public/images/emoji/win10/softball.png differ diff --git a/public/images/emoji/win10/solomon_islands.png b/public/images/emoji/win10/solomon_islands.png index e4476e1880..0be05b8cd0 100644 Binary files a/public/images/emoji/win10/solomon_islands.png and b/public/images/emoji/win10/solomon_islands.png differ diff --git a/public/images/emoji/win10/somalia.png b/public/images/emoji/win10/somalia.png index 209fffeaed..eec2a4dd43 100644 Binary files a/public/images/emoji/win10/somalia.png and b/public/images/emoji/win10/somalia.png differ diff --git a/public/images/emoji/win10/south_africa.png b/public/images/emoji/win10/south_africa.png index d40f1c75c8..d6dde19b4e 100644 Binary files a/public/images/emoji/win10/south_africa.png and b/public/images/emoji/win10/south_africa.png differ diff --git a/public/images/emoji/win10/south_georgia_south_sandwich_islands.png b/public/images/emoji/win10/south_georgia_south_sandwich_islands.png index 58f47bcd9b..da4bbff9c6 100644 Binary files a/public/images/emoji/win10/south_georgia_south_sandwich_islands.png and b/public/images/emoji/win10/south_georgia_south_sandwich_islands.png differ diff --git a/public/images/emoji/win10/south_sudan.png b/public/images/emoji/win10/south_sudan.png index c7cbc6967c..d87839b822 100644 Binary files a/public/images/emoji/win10/south_sudan.png and b/public/images/emoji/win10/south_sudan.png differ diff --git a/public/images/emoji/win10/spider.png b/public/images/emoji/win10/spider.png index 1758e31b44..e1ca649007 100644 Binary files a/public/images/emoji/win10/spider.png and b/public/images/emoji/win10/spider.png differ diff --git a/public/images/emoji/win10/sponge.png b/public/images/emoji/win10/sponge.png new file mode 100644 index 0000000000..68f6a88390 Binary files /dev/null and b/public/images/emoji/win10/sponge.png differ diff --git a/public/images/emoji/win10/spy.png b/public/images/emoji/win10/spy.png index 625c4ee813..14eb06c59f 100644 Binary files a/public/images/emoji/win10/spy.png and b/public/images/emoji/win10/spy.png differ diff --git a/public/images/emoji/win10/squid.png b/public/images/emoji/win10/squid.png index 1ef1123926..4fab4bf5c0 100644 Binary files a/public/images/emoji/win10/squid.png and b/public/images/emoji/win10/squid.png differ diff --git a/public/images/emoji/win10/sri_lanka.png b/public/images/emoji/win10/sri_lanka.png index f15b9be56d..8f8d0b3aea 100644 Binary files a/public/images/emoji/win10/sri_lanka.png and b/public/images/emoji/win10/sri_lanka.png differ diff --git a/public/images/emoji/win10/st_barthelemy.png b/public/images/emoji/win10/st_barthelemy.png index e213bf7e40..f879335239 100644 Binary files a/public/images/emoji/win10/st_barthelemy.png and b/public/images/emoji/win10/st_barthelemy.png differ diff --git a/public/images/emoji/win10/st_helena.png b/public/images/emoji/win10/st_helena.png index 90fefd0cab..2d0df5102e 100644 Binary files a/public/images/emoji/win10/st_helena.png and b/public/images/emoji/win10/st_helena.png differ diff --git a/public/images/emoji/win10/st_kitts_nevis.png b/public/images/emoji/win10/st_kitts_nevis.png index d7686f8b60..e021417b87 100644 Binary files a/public/images/emoji/win10/st_kitts_nevis.png and b/public/images/emoji/win10/st_kitts_nevis.png differ diff --git a/public/images/emoji/win10/st_lucia.png b/public/images/emoji/win10/st_lucia.png index 92eafffe94..1b7e53a859 100644 Binary files a/public/images/emoji/win10/st_lucia.png and b/public/images/emoji/win10/st_lucia.png differ diff --git a/public/images/emoji/win10/st_martin.png b/public/images/emoji/win10/st_martin.png index 7943b73f67..e97579a6cb 100644 Binary files a/public/images/emoji/win10/st_martin.png and b/public/images/emoji/win10/st_martin.png differ diff --git a/public/images/emoji/win10/st_pierre_miquelon.png b/public/images/emoji/win10/st_pierre_miquelon.png index b05828b47c..357a863146 100644 Binary files a/public/images/emoji/win10/st_pierre_miquelon.png and b/public/images/emoji/win10/st_pierre_miquelon.png differ diff --git a/public/images/emoji/win10/st_vincent_grenadines.png b/public/images/emoji/win10/st_vincent_grenadines.png index ddfd25fd22..0ace0a610d 100644 Binary files a/public/images/emoji/win10/st_vincent_grenadines.png and b/public/images/emoji/win10/st_vincent_grenadines.png differ diff --git a/public/images/emoji/win10/star.png b/public/images/emoji/win10/star.png index 6b36125e0c..47a09f65a3 100644 Binary files a/public/images/emoji/win10/star.png and b/public/images/emoji/win10/star.png differ diff --git a/public/images/emoji/win10/stuffed_flatbread.png b/public/images/emoji/win10/stuffed_flatbread.png index 00397d3734..93911861f4 100644 Binary files a/public/images/emoji/win10/stuffed_flatbread.png and b/public/images/emoji/win10/stuffed_flatbread.png differ diff --git a/public/images/emoji/win10/sudan.png b/public/images/emoji/win10/sudan.png index 3974a07328..56bc0f0b5c 100644 Binary files a/public/images/emoji/win10/sudan.png and b/public/images/emoji/win10/sudan.png differ diff --git a/public/images/emoji/win10/sun_behind_large_cloud.png b/public/images/emoji/win10/sun_behind_large_cloud.png index fd650f5bb3..e03f20ca89 100644 Binary files a/public/images/emoji/win10/sun_behind_large_cloud.png and b/public/images/emoji/win10/sun_behind_large_cloud.png differ diff --git a/public/images/emoji/win10/sun_behind_rain_cloud.png b/public/images/emoji/win10/sun_behind_rain_cloud.png index 7013ea4de5..245fcc6cb3 100644 Binary files a/public/images/emoji/win10/sun_behind_rain_cloud.png and b/public/images/emoji/win10/sun_behind_rain_cloud.png differ diff --git a/public/images/emoji/win10/sun_behind_small_cloud.png b/public/images/emoji/win10/sun_behind_small_cloud.png index 5352521371..ef99abad31 100644 Binary files a/public/images/emoji/win10/sun_behind_small_cloud.png and b/public/images/emoji/win10/sun_behind_small_cloud.png differ diff --git a/public/images/emoji/win10/sun_with_face.png b/public/images/emoji/win10/sun_with_face.png index aa065812d7..0b817f7863 100644 Binary files a/public/images/emoji/win10/sun_with_face.png and b/public/images/emoji/win10/sun_with_face.png differ diff --git a/public/images/emoji/win10/sunflower.png b/public/images/emoji/win10/sunflower.png index 48120d2ba8..581708acf5 100644 Binary files a/public/images/emoji/win10/sunflower.png and b/public/images/emoji/win10/sunflower.png differ diff --git a/public/images/emoji/win10/sunny.png b/public/images/emoji/win10/sunny.png index 5ea70c91aa..135a350706 100644 Binary files a/public/images/emoji/win10/sunny.png and b/public/images/emoji/win10/sunny.png differ diff --git a/public/images/emoji/win10/superhero.png b/public/images/emoji/win10/superhero.png new file mode 100644 index 0000000000..a8156ff292 Binary files /dev/null and b/public/images/emoji/win10/superhero.png differ diff --git a/public/images/emoji/win10/supervillain.png b/public/images/emoji/win10/supervillain.png new file mode 100644 index 0000000000..437314d831 Binary files /dev/null and b/public/images/emoji/win10/supervillain.png differ diff --git a/public/images/emoji/win10/suriname.png b/public/images/emoji/win10/suriname.png index 48afc4adac..7c1afcdceb 100644 Binary files a/public/images/emoji/win10/suriname.png and b/public/images/emoji/win10/suriname.png differ diff --git a/public/images/emoji/win10/svalbard_and_jan_mayen.png b/public/images/emoji/win10/svalbard_and_jan_mayen.png index 004a11d830..151484e1db 100644 Binary files a/public/images/emoji/win10/svalbard_and_jan_mayen.png and b/public/images/emoji/win10/svalbard_and_jan_mayen.png differ diff --git a/public/images/emoji/win10/swan.png b/public/images/emoji/win10/swan.png new file mode 100644 index 0000000000..cc8d1e37e9 Binary files /dev/null and b/public/images/emoji/win10/swan.png differ diff --git a/public/images/emoji/win10/swaziland.png b/public/images/emoji/win10/swaziland.png index fb5ee97ba2..0cf3fb1d73 100644 Binary files a/public/images/emoji/win10/swaziland.png and b/public/images/emoji/win10/swaziland.png differ diff --git a/public/images/emoji/win10/sweat_smile.png b/public/images/emoji/win10/sweat_smile.png index 299bc02f3d..c6b2a4969d 100644 Binary files a/public/images/emoji/win10/sweat_smile.png and b/public/images/emoji/win10/sweat_smile.png differ diff --git a/public/images/emoji/win10/sweden.png b/public/images/emoji/win10/sweden.png index 3b46fe18ab..4afbdcac76 100644 Binary files a/public/images/emoji/win10/sweden.png and b/public/images/emoji/win10/sweden.png differ diff --git a/public/images/emoji/win10/switzerland.png b/public/images/emoji/win10/switzerland.png index e0caa61ba6..bc50b99e54 100644 Binary files a/public/images/emoji/win10/switzerland.png and b/public/images/emoji/win10/switzerland.png differ diff --git a/public/images/emoji/win10/syria.png b/public/images/emoji/win10/syria.png index 53606f3e07..3dae2a2fcc 100644 Binary files a/public/images/emoji/win10/syria.png and b/public/images/emoji/win10/syria.png differ diff --git a/public/images/emoji/win10/taiwan.png b/public/images/emoji/win10/taiwan.png index dde348b40d..08123315bb 100644 Binary files a/public/images/emoji/win10/taiwan.png and b/public/images/emoji/win10/taiwan.png differ diff --git a/public/images/emoji/win10/tajikistan.png b/public/images/emoji/win10/tajikistan.png index 7b3697952d..7754926396 100644 Binary files a/public/images/emoji/win10/tajikistan.png and b/public/images/emoji/win10/tajikistan.png differ diff --git a/public/images/emoji/win10/tanzania.png b/public/images/emoji/win10/tanzania.png index d4026fea32..911f48da8b 100644 Binary files a/public/images/emoji/win10/tanzania.png and b/public/images/emoji/win10/tanzania.png differ diff --git a/public/images/emoji/win10/teddy_bear.png b/public/images/emoji/win10/teddy_bear.png new file mode 100644 index 0000000000..e1d802f910 Binary files /dev/null and b/public/images/emoji/win10/teddy_bear.png differ diff --git a/public/images/emoji/win10/test_tube.png b/public/images/emoji/win10/test_tube.png new file mode 100644 index 0000000000..6c5c527698 Binary files /dev/null and b/public/images/emoji/win10/test_tube.png differ diff --git a/public/images/emoji/win10/thailand.png b/public/images/emoji/win10/thailand.png index 81499f1616..218a284af0 100644 Binary files a/public/images/emoji/win10/thailand.png and b/public/images/emoji/win10/thailand.png differ diff --git a/public/images/emoji/win10/thread.png b/public/images/emoji/win10/thread.png new file mode 100644 index 0000000000..529541eae0 Binary files /dev/null and b/public/images/emoji/win10/thread.png differ diff --git a/public/images/emoji/win10/three.png b/public/images/emoji/win10/three.png index efec792b5b..beaa8d091e 100644 Binary files a/public/images/emoji/win10/three.png and b/public/images/emoji/win10/three.png differ diff --git a/public/images/emoji/win10/three_button_mouse.png b/public/images/emoji/win10/three_button_mouse.png index 3e39c0f398..db8e3fa2de 100644 Binary files a/public/images/emoji/win10/three_button_mouse.png and b/public/images/emoji/win10/three_button_mouse.png differ diff --git a/public/images/emoji/win10/thunder_cloud_and_rain.png b/public/images/emoji/win10/thunder_cloud_and_rain.png index b987488447..81bc5124aa 100644 Binary files a/public/images/emoji/win10/thunder_cloud_and_rain.png and b/public/images/emoji/win10/thunder_cloud_and_rain.png differ diff --git a/public/images/emoji/win10/thunder_cloud_rain.png b/public/images/emoji/win10/thunder_cloud_rain.png index b987488447..81bc5124aa 100644 Binary files a/public/images/emoji/win10/thunder_cloud_rain.png and b/public/images/emoji/win10/thunder_cloud_rain.png differ diff --git a/public/images/emoji/win10/timor_leste.png b/public/images/emoji/win10/timor_leste.png index 6706def991..ab697eea2e 100644 Binary files a/public/images/emoji/win10/timor_leste.png and b/public/images/emoji/win10/timor_leste.png differ diff --git a/public/images/emoji/win10/tired_face.png b/public/images/emoji/win10/tired_face.png index 3f1c72dce5..b548226143 100644 Binary files a/public/images/emoji/win10/tired_face.png and b/public/images/emoji/win10/tired_face.png differ diff --git a/public/images/emoji/win10/togo.png b/public/images/emoji/win10/togo.png index 7a542547e0..1e3706997e 100644 Binary files a/public/images/emoji/win10/togo.png and b/public/images/emoji/win10/togo.png differ diff --git a/public/images/emoji/win10/tokelau.png b/public/images/emoji/win10/tokelau.png index f42f868631..122903dfe2 100644 Binary files a/public/images/emoji/win10/tokelau.png and b/public/images/emoji/win10/tokelau.png differ diff --git a/public/images/emoji/win10/tonga.png b/public/images/emoji/win10/tonga.png index bfff80acf4..22d9eb5d37 100644 Binary files a/public/images/emoji/win10/tonga.png and b/public/images/emoji/win10/tonga.png differ diff --git a/public/images/emoji/win10/toolbox.png b/public/images/emoji/win10/toolbox.png new file mode 100644 index 0000000000..cde61c7a17 Binary files /dev/null and b/public/images/emoji/win10/toolbox.png differ diff --git a/public/images/emoji/win10/tooth.png b/public/images/emoji/win10/tooth.png new file mode 100644 index 0000000000..dc840f1998 Binary files /dev/null and b/public/images/emoji/win10/tooth.png differ diff --git a/public/images/emoji/win10/tornado.png b/public/images/emoji/win10/tornado.png index 8269d47872..4dc37f41b2 100644 Binary files a/public/images/emoji/win10/tornado.png and b/public/images/emoji/win10/tornado.png differ diff --git a/public/images/emoji/win10/tr.png b/public/images/emoji/win10/tr.png index 3b6fc16379..a80ec23d64 100644 Binary files a/public/images/emoji/win10/tr.png and b/public/images/emoji/win10/tr.png differ diff --git a/public/images/emoji/win10/trinidad_tobago.png b/public/images/emoji/win10/trinidad_tobago.png index 14355ce15f..7052a392b7 100644 Binary files a/public/images/emoji/win10/trinidad_tobago.png and b/public/images/emoji/win10/trinidad_tobago.png differ diff --git a/public/images/emoji/win10/tristan_da_cunha.png b/public/images/emoji/win10/tristan_da_cunha.png index dff4791d41..15e4c3e159 100644 Binary files a/public/images/emoji/win10/tristan_da_cunha.png and b/public/images/emoji/win10/tristan_da_cunha.png differ diff --git a/public/images/emoji/win10/tulip.png b/public/images/emoji/win10/tulip.png index b23c9fec6d..b477444efa 100644 Binary files a/public/images/emoji/win10/tulip.png and b/public/images/emoji/win10/tulip.png differ diff --git a/public/images/emoji/win10/tunisia.png b/public/images/emoji/win10/tunisia.png index 2691b42f09..8b762b44d9 100644 Binary files a/public/images/emoji/win10/tunisia.png and b/public/images/emoji/win10/tunisia.png differ diff --git a/public/images/emoji/win10/turkmenistan.png b/public/images/emoji/win10/turkmenistan.png index a0729e2c29..8e6fbb11c5 100644 Binary files a/public/images/emoji/win10/turkmenistan.png and b/public/images/emoji/win10/turkmenistan.png differ diff --git a/public/images/emoji/win10/turks_caicos_islands.png b/public/images/emoji/win10/turks_caicos_islands.png index bb04d27666..7380100153 100644 Binary files a/public/images/emoji/win10/turks_caicos_islands.png and b/public/images/emoji/win10/turks_caicos_islands.png differ diff --git a/public/images/emoji/win10/tuvalu.png b/public/images/emoji/win10/tuvalu.png index 60fad11afc..44880afa7b 100644 Binary files a/public/images/emoji/win10/tuvalu.png and b/public/images/emoji/win10/tuvalu.png differ diff --git a/public/images/emoji/win10/two.png b/public/images/emoji/win10/two.png index ecef05090d..78f7a5ae88 100644 Binary files a/public/images/emoji/win10/two.png and b/public/images/emoji/win10/two.png differ diff --git a/public/images/emoji/win10/uganda.png b/public/images/emoji/win10/uganda.png index 9541a9fe43..2926eb5072 100644 Binary files a/public/images/emoji/win10/uganda.png and b/public/images/emoji/win10/uganda.png differ diff --git a/public/images/emoji/win10/uk.png b/public/images/emoji/win10/uk.png index ad2a6622e4..af56765726 100644 Binary files a/public/images/emoji/win10/uk.png and b/public/images/emoji/win10/uk.png differ diff --git a/public/images/emoji/win10/ukraine.png b/public/images/emoji/win10/ukraine.png index d24b4e827b..d76c090dc4 100644 Binary files a/public/images/emoji/win10/ukraine.png and b/public/images/emoji/win10/ukraine.png differ diff --git a/public/images/emoji/win10/united_arab_emirates.png b/public/images/emoji/win10/united_arab_emirates.png index 0aac4c4b1e..12ff444d51 100644 Binary files a/public/images/emoji/win10/united_arab_emirates.png and b/public/images/emoji/win10/united_arab_emirates.png differ diff --git a/public/images/emoji/win10/united_nations.png b/public/images/emoji/win10/united_nations.png index d695a5cac0..ea7fc4c7d7 100644 Binary files a/public/images/emoji/win10/united_nations.png and b/public/images/emoji/win10/united_nations.png differ diff --git a/public/images/emoji/win10/uruguay.png b/public/images/emoji/win10/uruguay.png index 8196541e26..8667234f6a 100644 Binary files a/public/images/emoji/win10/uruguay.png and b/public/images/emoji/win10/uruguay.png differ diff --git a/public/images/emoji/win10/us.png b/public/images/emoji/win10/us.png index 450853eca4..0ba064250e 100644 Binary files a/public/images/emoji/win10/us.png and b/public/images/emoji/win10/us.png differ diff --git a/public/images/emoji/win10/us_outlying_islands.png b/public/images/emoji/win10/us_outlying_islands.png index 450853eca4..bae619c110 100644 Binary files a/public/images/emoji/win10/us_outlying_islands.png and b/public/images/emoji/win10/us_outlying_islands.png differ diff --git a/public/images/emoji/win10/us_virgin_islands.png b/public/images/emoji/win10/us_virgin_islands.png index 2352c2610b..c117aff7f2 100644 Binary files a/public/images/emoji/win10/us_virgin_islands.png and b/public/images/emoji/win10/us_virgin_islands.png differ diff --git a/public/images/emoji/win10/uzbekistan.png b/public/images/emoji/win10/uzbekistan.png index c268b7f0b2..19004d72d4 100644 Binary files a/public/images/emoji/win10/uzbekistan.png and b/public/images/emoji/win10/uzbekistan.png differ diff --git a/public/images/emoji/win10/vanuatu.png b/public/images/emoji/win10/vanuatu.png index ebf4b69315..df4766669c 100644 Binary files a/public/images/emoji/win10/vanuatu.png and b/public/images/emoji/win10/vanuatu.png differ diff --git a/public/images/emoji/win10/vatican_city.png b/public/images/emoji/win10/vatican_city.png index a91fed8815..f0fe36f9ad 100644 Binary files a/public/images/emoji/win10/vatican_city.png and b/public/images/emoji/win10/vatican_city.png differ diff --git a/public/images/emoji/win10/venezuela.png b/public/images/emoji/win10/venezuela.png index e2b7cff1d8..70a249fec6 100644 Binary files a/public/images/emoji/win10/venezuela.png and b/public/images/emoji/win10/venezuela.png differ diff --git a/public/images/emoji/win10/vietnam.png b/public/images/emoji/win10/vietnam.png index f888ea9435..5282bd4343 100644 Binary files a/public/images/emoji/win10/vietnam.png and b/public/images/emoji/win10/vietnam.png differ diff --git a/public/images/emoji/win10/volleyball.png b/public/images/emoji/win10/volleyball.png index d67c4c7ffc..68db494a45 100644 Binary files a/public/images/emoji/win10/volleyball.png and b/public/images/emoji/win10/volleyball.png differ diff --git a/public/images/emoji/win10/wallis_futuna.png b/public/images/emoji/win10/wallis_futuna.png index 4672eabedb..c75c4db34e 100644 Binary files a/public/images/emoji/win10/wallis_futuna.png and b/public/images/emoji/win10/wallis_futuna.png differ diff --git a/public/images/emoji/win10/warning.png b/public/images/emoji/win10/warning.png index f65379fcdf..93f1a77f1f 100644 Binary files a/public/images/emoji/win10/warning.png and b/public/images/emoji/win10/warning.png differ diff --git a/public/images/emoji/win10/wastebasket.png b/public/images/emoji/win10/wastebasket.png index a0ddcddad6..ec3f007b40 100644 Binary files a/public/images/emoji/win10/wastebasket.png and b/public/images/emoji/win10/wastebasket.png differ diff --git a/public/images/emoji/win10/weary.png b/public/images/emoji/win10/weary.png index 7bc0d5da0e..1aa8c0c22d 100644 Binary files a/public/images/emoji/win10/weary.png and b/public/images/emoji/win10/weary.png differ diff --git a/public/images/emoji/win10/western_sahara.png b/public/images/emoji/win10/western_sahara.png index 44c0ea20dd..3b6afaa73a 100644 Binary files a/public/images/emoji/win10/western_sahara.png and b/public/images/emoji/win10/western_sahara.png differ diff --git a/public/images/emoji/win10/white_sun_behind_cloud.png b/public/images/emoji/win10/white_sun_behind_cloud.png index fd650f5bb3..e03f20ca89 100644 Binary files a/public/images/emoji/win10/white_sun_behind_cloud.png and b/public/images/emoji/win10/white_sun_behind_cloud.png differ diff --git a/public/images/emoji/win10/white_sun_behind_cloud_with_rain.png b/public/images/emoji/win10/white_sun_behind_cloud_with_rain.png index 7013ea4de5..245fcc6cb3 100644 Binary files a/public/images/emoji/win10/white_sun_behind_cloud_with_rain.png and b/public/images/emoji/win10/white_sun_behind_cloud_with_rain.png differ diff --git a/public/images/emoji/win10/white_sun_cloud.png b/public/images/emoji/win10/white_sun_cloud.png index fd650f5bb3..e03f20ca89 100644 Binary files a/public/images/emoji/win10/white_sun_cloud.png and b/public/images/emoji/win10/white_sun_cloud.png differ diff --git a/public/images/emoji/win10/white_sun_rain_cloud.png b/public/images/emoji/win10/white_sun_rain_cloud.png index 7013ea4de5..245fcc6cb3 100644 Binary files a/public/images/emoji/win10/white_sun_rain_cloud.png and b/public/images/emoji/win10/white_sun_rain_cloud.png differ diff --git a/public/images/emoji/win10/white_sun_small_cloud.png b/public/images/emoji/win10/white_sun_small_cloud.png index c8f11a93af..b3a60292fc 100644 Binary files a/public/images/emoji/win10/white_sun_small_cloud.png and b/public/images/emoji/win10/white_sun_small_cloud.png differ diff --git a/public/images/emoji/win10/white_sun_with_small_cloud.png b/public/images/emoji/win10/white_sun_with_small_cloud.png index c8f11a93af..b3a60292fc 100644 Binary files a/public/images/emoji/win10/white_sun_with_small_cloud.png and b/public/images/emoji/win10/white_sun_with_small_cloud.png differ diff --git a/public/images/emoji/win10/woman_bald.png b/public/images/emoji/win10/woman_bald.png new file mode 100644 index 0000000000..03b2a92b17 Binary files /dev/null and b/public/images/emoji/win10/woman_bald.png differ diff --git a/public/images/emoji/win10/woman_cook.png b/public/images/emoji/win10/woman_cook.png index 5226f887eb..e8ad89217d 100644 Binary files a/public/images/emoji/win10/woman_cook.png and b/public/images/emoji/win10/woman_cook.png differ diff --git a/public/images/emoji/win10/woman_curly_haired.png b/public/images/emoji/win10/woman_curly_haired.png new file mode 100644 index 0000000000..30cdcb480a Binary files /dev/null and b/public/images/emoji/win10/woman_curly_haired.png differ diff --git a/public/images/emoji/win10/woman_red_haired.png b/public/images/emoji/win10/woman_red_haired.png new file mode 100644 index 0000000000..6e9358d1ba Binary files /dev/null and b/public/images/emoji/win10/woman_red_haired.png differ diff --git a/public/images/emoji/win10/woman_superhero.png b/public/images/emoji/win10/woman_superhero.png new file mode 100644 index 0000000000..153a0cf66a Binary files /dev/null and b/public/images/emoji/win10/woman_superhero.png differ diff --git a/public/images/emoji/win10/woman_supervillain.png b/public/images/emoji/win10/woman_supervillain.png new file mode 100644 index 0000000000..2f941110bc Binary files /dev/null and b/public/images/emoji/win10/woman_supervillain.png differ diff --git a/public/images/emoji/win10/woman_white_haired.png b/public/images/emoji/win10/woman_white_haired.png new file mode 100644 index 0000000000..3a2226380e Binary files /dev/null and b/public/images/emoji/win10/woman_white_haired.png differ diff --git a/public/images/emoji/win10/woozy_face.png b/public/images/emoji/win10/woozy_face.png new file mode 100644 index 0000000000..2866b58038 Binary files /dev/null and b/public/images/emoji/win10/woozy_face.png differ diff --git a/public/images/emoji/win10/worship_symbol.png b/public/images/emoji/win10/worship_symbol.png index 23c37f3023..6fabf5538b 100644 Binary files a/public/images/emoji/win10/worship_symbol.png and b/public/images/emoji/win10/worship_symbol.png differ diff --git a/public/images/emoji/win10/yarn.png b/public/images/emoji/win10/yarn.png new file mode 100644 index 0000000000..767672bf6b Binary files /dev/null and b/public/images/emoji/win10/yarn.png differ diff --git a/public/images/emoji/win10/yemen.png b/public/images/emoji/win10/yemen.png index 3a37c85041..e858bb2c19 100644 Binary files a/public/images/emoji/win10/yemen.png and b/public/images/emoji/win10/yemen.png differ diff --git a/public/images/emoji/win10/yin_yang.png b/public/images/emoji/win10/yin_yang.png index 7d8e832b14..178312d752 100644 Binary files a/public/images/emoji/win10/yin_yang.png and b/public/images/emoji/win10/yin_yang.png differ diff --git a/public/images/emoji/win10/zambia.png b/public/images/emoji/win10/zambia.png index 3e7d4cbea5..6283325081 100644 Binary files a/public/images/emoji/win10/zambia.png and b/public/images/emoji/win10/zambia.png differ diff --git a/public/images/emoji/win10/zebra.png b/public/images/emoji/win10/zebra.png index 2ec3223339..51e2ef751b 100644 Binary files a/public/images/emoji/win10/zebra.png and b/public/images/emoji/win10/zebra.png differ diff --git a/public/images/emoji/win10/zero.png b/public/images/emoji/win10/zero.png index c95d92d98d..1609de94ee 100644 Binary files a/public/images/emoji/win10/zero.png and b/public/images/emoji/win10/zero.png differ diff --git a/public/images/emoji/win10/zimbabwe.png b/public/images/emoji/win10/zimbabwe.png index c3af3c54d7..d87fd6ac15 100644 Binary files a/public/images/emoji/win10/zimbabwe.png and b/public/images/emoji/win10/zimbabwe.png differ diff --git a/public/javascripts/embed.js b/public/javascripts/embed.js index 024dacb61e..3d2f9838b5 100644 --- a/public/javascripts/embed.js +++ b/public/javascripts/embed.js @@ -4,7 +4,7 @@ var comments = document.getElementById('discourse-comments'); var iframe = document.createElement('iframe'); - ['discourseUrl', 'discourseEmbedUrl', 'discourseUserName'].forEach(function(i) { + ['discourseUrl', 'discourseEmbedUrl', 'discourseUserName', 'discourseReferrerPolicy'].forEach(function(i) { if (window[i]) { DE[i] = DE[i] || window[i]; } }); @@ -44,6 +44,10 @@ iframe.width = "100%"; iframe.frameBorder = "0"; iframe.scrolling = "no"; + if (DE.discourseReferrerPolicy) { + // See https://www.w3.org/TR/html5/semantics-embedded-content.html#the-iframe-element + iframe.referrerPolicy = DE.discourseReferrerPolicy; + } comments.appendChild(iframe); // Thanks http://amendsoft-javascript.blogspot.ca/2010/04/find-x-and-y-coordinate-of-html-control.html diff --git a/script/bulk_import/base.rb b/script/bulk_import/base.rb index 57a7eac029..a9188f6b17 100644 --- a/script/bulk_import/base.rb +++ b/script/bulk_import/base.rb @@ -58,6 +58,7 @@ class BulkImport::Base db = ActiveRecord::Base.connection_config @encoder = PG::TextEncoder::CopyRow.new @raw_connection = PG.connect(dbname: db[:database], host: db[:host_names]&.first, port: db[:port]) + # @raw_connection = PG.connect(dbname: db[:database], host: db[:host_names]&.first, port: db[:port], password: "discourse") @uploader = ImportScripts::Uploader.new @html_entities = HTMLEntities.new @encoding = CHARSET_MAP[charset] @@ -580,13 +581,18 @@ class BulkImport::Base @raw_connection.copy_data(sql, @encoder) do rows.each do |row| - mapped = yield(row) - next unless mapped - processed = send(process_method_name, mapped) - imported_ids << mapped[:imported_id] unless mapped[:imported_id].nil? - imported_ids |= mapped[:imported_ids] unless mapped[:imported_ids].nil? - @raw_connection.put_copy_data columns.map { |c| processed[c] } - print "\r%7d - %6d/sec".freeze % [imported_ids.size, imported_ids.size.to_f / (Time.now - start)] if imported_ids.size % 5000 == 0 + begin + mapped = yield(row) + next unless mapped + processed = send(process_method_name, mapped) + imported_ids << mapped[:imported_id] unless mapped[:imported_id].nil? + imported_ids |= mapped[:imported_ids] unless mapped[:imported_ids].nil? + @raw_connection.put_copy_data columns.map { |c| processed[c] } + print "\r%7d - %6d/sec".freeze % [imported_ids.size, imported_ids.size.to_f / (Time.now - start)] if imported_ids.size % 5000 == 0 + rescue => e + puts "\n" + puts "ERROR: #{e.inspect}" + end end end @@ -624,6 +630,10 @@ class BulkImport::Base @uploader.create_upload(user_id, path, source_filename) end + def html_for_upload(upload, display_filename) + @uploader.html_for_upload(upload, display_filename) + end + def fix_name(name) name.scrub! if name.valid_encoding? == false return if name.blank? diff --git a/script/bulk_import/discourse_merger.rb b/script/bulk_import/discourse_merger.rb new file mode 100644 index 0000000000..e3d4a752b0 --- /dev/null +++ b/script/bulk_import/discourse_merger.rb @@ -0,0 +1,797 @@ +require_relative "base" + +class BulkImport::DiscourseMerger < BulkImport::Base + + NOW ||= "now()".freeze + CUSTOM_FIELDS = ['category', 'group', 'post', 'topic', 'user'] + + # DB_NAME: name of database being merged into the current local db + # DB_HOST: hostname of database being merged + # UPLOADS_PATH: absolute path of the directory containing "original" + # and "optimized" dirs. e.g. /home/discourse/other-site/public/uploads/default + # SOURCE_BASE_URL: base url of the site being merged. e.g. https://meta.discourse.org + # SOURCE_CDN: (optional) base url of the CDN of the site being merged. + # e.g. https://discourse-cdn-sjc1.com/business4 + + def initialize + local_db = ActiveRecord::Base.connection_config + @raw_connection = PG.connect(dbname: local_db[:database], host: 'localhost', port: local_db[:port]) + + @source_db_config = { + dbname: ENV["DB_NAME"] || 'dd_demo', + host: ENV["DB_HOST"] || 'localhost' + } + + raise "SOURCE_BASE_URL missing!" unless ENV['SOURCE_BASE_URL'] + + @source_base_url = ENV["SOURCE_BASE_URL"] + @uploads_path = ENV['UPLOADS_PATH'] + @uploader = ImportScripts::Uploader.new + + if ENV['SOURCE_CDN'] + @source_cdn = ENV['SOURCE_CDN'] + end + + local_version = @raw_connection.exec("select max(version) from schema_migrations") + local_version = local_version.first['max'] + source_version = source_raw_connection.exec("select max(version) from schema_migrations") + source_version = source_version.first['max'] + + if local_version != source_version + raise "DB schema mismatch. Databases must be at the same migration version. Local is #{local_version}, other is #{source_version}" + end + + @encoder = PG::TextEncoder::CopyRow.new + + @merged_user_ids = [] + @tags = {} + @tag_groups = {} + @uploads = {} + @post_actions = {} + @notifications = {} + @badge_groupings = {} + @badges = {} + @email_tokens = {} + + @auto_group_ids = Group::AUTO_GROUPS.values + + # add your authorized extensions here: + SiteSetting.authorized_extensions = ['jpg', 'jpeg', 'png', 'gif'].join('|') + + @sequences = {} + end + + def start + run + ensure + @raw_connection&.close + source_raw_connection&.close + end + + def execute + @first_new_user_id = @last_user_id + 1 + @first_new_topic_id = @last_topic_id + 1 + + copy_users + copy_user_stuff + copy_groups + copy_categories + copy_topics + copy_posts + copy_tags + copy_uploads if @uploads_path + copy_everything_else + copy_badges + + fix_user_columns + fix_category_descriptions + fix_topic_links + end + + def source_raw_connection + @source_raw_connection ||= PG.connect(@source_db_config) + end + + def copy_users + puts '', "merging users..." + + imported_ids = [] + + usernames_lower = User.unscoped.pluck(:username_lower).to_set + + columns = User.columns.map(&:name) + sql = "COPY users (#{columns.map { |c| "\"#{c}\"" }.join(",")}) FROM STDIN" + + @raw_connection.copy_data(sql, @encoder) do + source_raw_connection.exec("SELECT #{columns.map { |c| "u.\"#{c}\"" }.join(",")}, e.email FROM users u INNER JOIN user_emails e ON (u.id = e.user_id AND e.primary = TRUE) WHERE u.id > 0").each do |row| + old_user_id = row['id']&.to_i + if existing = UserEmail.where(email: row.delete('email')).first&.user + # Merge these users + @users[old_user_id.to_s] = existing.id + @merged_user_ids << old_user_id + next + else + # New user + unless usernames_lower.add?(row['username_lower']) + username = row['username'] + "_1" + username.next! until usernames_lower.add?(username.downcase) + row['username'] = username + row['username_lower'] = row['username'].downcase + end + + row['id'] = (@last_user_id += 1) + @users[old_user_id.to_s] = row['id'] + + @raw_connection.put_copy_data row.values + end + imported_ids << old_user_id + end + end + + @sequences[User.sequence_name] = @last_user_id + 1 if @last_user_id + + create_custom_fields('user', 'id', imported_ids) do |old_user_id| + { value: old_user_id, record_id: user_id_from_imported_id(old_user_id) } + end + end + + def copy_user_stuff + copy_model( + EmailToken, + skip_if_merged: true, + is_a_user_model: true, + skip_processing: true, + mapping: @email_tokens + ) + + [ + UserEmail, UserStat, UserOption, UserProfile, + UserVisit, UserSearchData, GivenDailyLike, UserSecondFactor, UserOpenId + ].each do |c| + copy_model(c, skip_if_merged: true, is_a_user_model: true, skip_processing: true) + end + + [FacebookUserInfo, GithubUserInfo, GoogleUserInfo, InstagramUserInfo, Oauth2UserInfo, + SingleSignOnRecord, TwitterUserInfo, EmailChangeRequest + ].each do |c| + copy_model(c, skip_if_merged: true, is_a_user_model: true) + end + end + + def copy_groups + copy_model(Group, + mapping: @groups, + skip_processing: true, + select_sql: "SELECT #{Group.columns.map { |c| "\"#{c.name}\"" }.join(', ')} FROM groups WHERE automatic = false" + ) + + copy_model(GroupUser, skip_if_merged: true) + end + + def copy_categories + puts "merging categories..." + + columns = Category.columns.map(&:name) + imported_ids = [] + last_id = Category.unscoped.maximum(:id) + + sql = "COPY categories (#{columns.map { |c| "\"#{c}\"" }.join(', ')}) FROM STDIN" + @raw_connection.copy_data(sql, @encoder) do + source_raw_connection.exec("SELECT #{columns.map { |c| "\"#{c}\"" }.join(', ')} FROM categories").each do |row| + + if existing = Category.where(name: row['name']).first + @categories[row['id']] = existing.id + next + end + + old_user_id = row['user_id'].to_i + if old_user_id >= 1 + row['user_id'] = user_id_from_imported_id(old_user_id) || -1 + end + + if row['parent_category_id'] + row['parent_category_id'] = category_id_from_imported_id(row['parent_category_id']) + end + + old_id = row['id'] + row['id'] = (last_id += 1) + imported_ids << old_id + @categories[old_id.to_s] = row['id'] + + @raw_connection.put_copy_data(row.values) + end + end + + @sequences[Category.sequence_name] = last_id + 1 + + create_custom_fields('category', 'id', imported_ids) do |imported_id| + { + record_id: category_id_from_imported_id(imported_id), + value: imported_id, + } + end + end + + def fix_category_descriptions + puts 'updating category description topic ids...' + + @categories.each do |old_id, new_id| + category = Category.find(new_id) + if description_topic_id = topic_id_from_imported_id(category.topic_id) + category.topic_id = description_topic_id + category.save! + end + end + end + + def copy_topics + copy_model(Topic, mapping: @topics) + [TopicAllowedGroup, TopicAllowedUser, TopicEmbed, TopicSearchData, + TopicTimer, TopicUser, TopicViewItem + ].each do |k| + copy_model(k, skip_processing: true) + end + end + + def copy_posts + copy_model(Post, skip_processing: true, mapping: @posts) + copy_model(PostAction, mapping: @post_actions) + [PostReply, TopicLink, UserAction, QuotedPost].each do |k| + copy_model(k) + end + [PostStat, IncomingEmail, PostDetail, PostRevision].each do |k| + copy_model(k, skip_processing: true) + end + end + + def copy_tags + puts "merging tags..." + + columns = Tag.columns.map(&:name) + imported_ids = [] + last_id = Tag.unscoped.maximum(:id) + + sql = "COPY tags (#{columns.map { |c| "\"#{c}\"" }.join(', ')}) FROM STDIN" + @raw_connection.copy_data(sql, @encoder) do + source_raw_connection.exec("SELECT #{columns.map { |c| "\"#{c}\"" }.join(', ')} FROM tags").each do |row| + + if existing = Tag.where(name: row['name']).first + @tags[row['id']] = existing.id + next + end + + old_id = row['id'] + row['id'] = (last_id += 1) + @tags[old_id.to_s] = row['id'] + + @raw_connection.put_copy_data(row.values) + end + end + + @sequences[Tag.sequence_name] = last_id + 1 + + [TagUser, TopicTag, CategoryTag, CategoryTagStat].each do |k| + copy_model(k) + end + copy_model(TagGroup, mapping: @tag_groups) + [TagGroupMembership, CategoryTagGroup].each do |k| + copy_model(k, skip_processing: true) + end + + col_list = TagGroupPermission.columns.map { |c| "\"#{c.name}\"" }.join(', ') + copy_model(TagGroupPermission, + skip_processing: true, + select_sql: "SELECT #{col_list} FROM tag_group_permissions WHERE group_id NOT IN (#{@auto_group_ids.join(', ')})" + ) + end + + def copy_uploads + puts '' + print "copying uploads..." + + FileUtils.cp_r( + File.join(@uploads_path, '.'), + File.join(Rails.root, 'public', 'uploads', 'default') + ) + + columns = Upload.columns.map(&:name) + last_id = Upload.unscoped.maximum(:id) || 1 + sql = "COPY uploads (#{columns.map { |c| "\"#{c}\"" }.join(', ')}) FROM STDIN" + + @raw_connection.copy_data(sql, @encoder) do + source_raw_connection.exec("SELECT #{columns.map { |c| "\"#{c}\"" }.join(', ')} FROM uploads").each do |row| + + next if Upload.where(sha1: row['sha1']).exists? + + rel_filename = row['url'].gsub(/^\/uploads\/[^\/]+\//, '') + rel_filename = rel_filename.gsub(/^\/\/[^\/]+\.amazonaws\.com\//, '') + absolute_filename = File.join(@uploads_path, rel_filename) + + old_id = row['id'] + if old_id && last_id + row['id'] = (last_id += 1) + @uploads[old_id.to_s] = row['id'] + end + + old_user_id = row['user_id'].to_i + if old_user_id >= 1 + row['user_id'] = user_id_from_imported_id(old_user_id) + next if row['user_id'].nil? + end + + row['url'] = "/uploads/default/#{rel_filename}" if File.exists?(absolute_filename) + + @raw_connection.put_copy_data(row.values) + end + end + + @sequences[Upload.sequence_name] = last_id + 1 + + puts '' + + copy_model(PostUpload) + copy_model(UserAvatar) + + # Users have a column "uploaded_avatar_id" which needs to be mapped now. + User.where("id >= ?", @first_new_user_id).find_each do |u| + if u.uploaded_avatar_id + u.uploaded_avatar_id = upload_id_from_imported_id(u.uploaded_avatar_id) + u.save! unless u.uploaded_avatar_id.nil? + end + end + end + + def copy_everything_else + [PostTiming, UserArchivedMessage, UnsubscribeKey, GroupMention].each do |k| + copy_model(k, skip_processing: true) + end + + [UserHistory, UserWarning, GroupArchivedMessage].each do |k| + copy_model(k) + end + + copy_model(Notification, mapping: @notifications) + + [CategoryGroup, GroupHistory].each do |k| + col_list = k.columns.map { |c| "\"#{c.name}\"" }.join(', ') + copy_model(k, + select_sql: "SELECT #{col_list} FROM #{k.table_name} WHERE group_id NOT IN (#{@auto_group_ids.join(', ')})" + ) + end + end + + def copy_badges + copy_model(BadgeGrouping, mapping: @badge_groupings, skip_processing: true) + + puts "merging badges..." + columns = Badge.columns.map(&:name) + imported_ids = [] + last_id = Badge.unscoped.maximum(:id) + + sql = "COPY badges (#{columns.map { |c| "\"#{c}\"" }.join(', ')}) FROM STDIN" + @raw_connection.copy_data(sql, @encoder) do + source_raw_connection.exec("SELECT #{columns.map { |c| "\"#{c}\"" }.join(', ')} FROM badges").each do |row| + + if existing = Badge.where(name: row['name']).first + @badges[row['id']] = existing.id + next + end + + old_id = row['id'] + row['id'] = (last_id += 1) + @badges[old_id.to_s] = row['id'] + + row['badge_grouping_id'] = @badge_groupings[row['badge_grouping_id']] if row['badge_grouping_id'] + + @raw_connection.put_copy_data(row.values) + end + end + + @sequences[Badge.sequence_name] = last_id + 1 + + copy_model(UserBadge, is_a_user_model: true) + end + + def copy_model(klass, skip_if_merged: false, is_a_user_model: false, skip_processing: false, mapping: nil, select_sql: nil) + + puts "copying #{klass.table_name}..." + + columns = klass.columns.map(&:name) + has_custom_fields = CUSTOM_FIELDS.include?(klass.name.downcase) + imported_ids = [] + last_id = columns.include?('id') ? (klass.unscoped.maximum(:id) || 1) : nil + + sql = "COPY #{klass.table_name} (#{columns.map { |c| "\"#{c}\"" }.join(', ')}) FROM STDIN" + @raw_connection.copy_data(sql, @encoder) do + source_raw_connection.exec(select_sql || "SELECT #{columns.map { |c| "\"#{c}\"" }.join(', ')} FROM #{klass.table_name}").each do |row| + if row['user_id'] + old_user_id = row['user_id'].to_i + + next if skip_if_merged && @merged_user_ids.include?(old_user_id) + + if is_a_user_model + next if old_user_id < 1 + next if user_id_from_imported_id(old_user_id).nil? + end + + if old_user_id >= 1 + row['user_id'] = user_id_from_imported_id(old_user_id) + if is_a_user_model && row['user_id'].nil? + raise "user_id nil for user id '#{old_user_id}'" + end + next if row['user_id'].nil? # associated record for a deleted user + end + end + + row['group_id'] = group_id_from_imported_id(row['group_id']) if row['group_id'] + row['category_id'] = category_id_from_imported_id(row['category_id']) if row['category_id'] + if row['topic_id'] && klass != Category + row['topic_id'] = topic_id_from_imported_id(row['topic_id']) + next if row['topic_id'].nil? + end + if row['post_id'] + row['post_id'] = post_id_from_imported_id(row['post_id']) + next if row['post_id'].nil? + end + row['tag_id'] = tag_id_from_imported_id(row['tag_id']) if row['tag_id'] + row['tag_group_id'] = tag_group_id_from_imported_id(row['tag_group_id']) if row['tag_group_id'] + row['upload_id'] = upload_id_from_imported_id(row['upload_id']) if row['upload_id'] + row['deleted_by_id'] = user_id_from_imported_id(row['deleted_by_id']) if row['deleted_by_id'] + row['badge_id'] = badge_id_from_imported_id(row['badge_id']) if row['badge_id'] + + old_id = row['id'] + if old_id && last_id + row['id'] = (last_id += 1) + imported_ids << old_id if has_custom_fields + mapping[old_id.to_s] = row['id'] if mapping + end + + if skip_processing + @raw_connection.put_copy_data(row.values) + else + process_method_name = "process_#{klass.name.underscore}" + + processed = respond_to?(process_method_name) ? send(process_method_name, HashWithIndifferentAccess.new(row)) : row + + if processed + @raw_connection.put_copy_data columns.map { |c| processed[c] } + end + end + end + end + + @sequences[klass.sequence_name] = last_id + 1 if last_id + + if has_custom_fields + id_mapping_method_name = "#{klass.name.downcase}_id_from_imported_id".freeze + return unless respond_to?(id_mapping_method_name) + create_custom_fields(klass.name.downcase, "id", imported_ids) do |imported_id| + { + record_id: send(id_mapping_method_name, imported_id), + value: imported_id, + } + end + end + end + + def process_topic(topic) + return nil if topic['category_id'].nil? && topic['archetype'] != Archetype.private_message + topic['last_post_user_id'] = user_id_from_imported_id(topic['last_post_user_id']) || -1 + topic['featured_user1_id'] = user_id_from_imported_id(topic['featured_user1_id']) || -1 + topic['featured_user2_id'] = user_id_from_imported_id(topic['featured_user2_id']) || -1 + topic['featured_user3_id'] = user_id_from_imported_id(topic['featured_user3_id']) || -1 + topic['featured_user4_id'] = user_id_from_imported_id(topic['featured_user4_id']) || -1 + topic + end + + def process_post(post) + post['last_editor_id'] = user_id_from_imported_id(post['last_editor_id']) || -1 + post['reply_to_user_id'] = user_id_from_imported_id(post['reply_to_user_id']) || -1 + post['locked_by_id'] = user_id_from_imported_id(post['locked_by_id']) || -1 + @topic_id_by_post_id[post[:id]] = post[:topic_id] + post + end + + def process_post_reply(post_reply) + post_reply['reply_id'] = post_id_from_imported_id(post_reply['reply_id']) if post_reply['reply_id'] + post_reply + end + + def process_quoted_post(quoted_post) + quoted_post['quoted_post_id'] = post_id_from_imported_id(quoted_post['quoted_post_id']) if quoted_post['quoted_post_id'] + return nil if quoted_post['quoted_post_id'].nil? + quoted_post + end + + def process_topic_link(topic_link) + old_topic_id = topic_link['link_topic_id'] + topic_link['link_topic_id'] = topic_id_from_imported_id(topic_link['link_topic_id']) if topic_link['link_topic_id'] + topic_link['link_post_id'] = post_id_from_imported_id(topic_link['link_post_id']) if topic_link['link_post_id'] + return nil if topic_link['link_topic_id'].nil? + + r = Regexp.new("^#{@source_base_url}/t/([^\/]+)/#{old_topic_id}(.*)") + if m = r.match(topic_link['url']) + topic_link['url'] = "#{@source_base_url}/t/#{m[1]}/#{topic_link['link_topic_id']}#{m[2]}" + end + + topic_link + end + + def process_post_action(post_action) + return nil unless post_action['post_id'].present? + post_action['related_post_id'] = post_id_from_imported_id(post_action['related_post_id']) + post_action['deferred_by_id'] = user_id_from_imported_id(post_action['deferred_by_id']) + post_action['agreed_by_id'] = user_id_from_imported_id(post_action['agreed_by_id']) + post_action['disagreed_by_id'] = user_id_from_imported_id(post_action['disagreed_by_id']) + post_action + end + + def process_user_action(user_action) + user_action['target_topic_id'] = topic_id_from_imported_id(user_action['target_topic_id']) if user_action['target_topic_id'] + user_action['target_post_id'] = post_id_from_imported_id(user_action['target_post_id']) if user_action['target_post_id'] + user_action['target_user_id'] = user_id_from_imported_id(user_action['target_user_id']) if user_action['target_user_id'] + user_action['acting_user_id'] = user_id_from_imported_id(user_action['acting_user_id']) if user_action['acting_user_id'] + user_action['queued_post_id'] = post_id_from_imported_id(user_action['queued_post_id']) if user_action['queued_post_id'] + user_action + end + + def process_tag_group(tag_group) + tag_group['parent_tag_id'] = tag_id_from_imported_id(tag_group['parent_tag_id']) if tag_group['parent_tag_id'] + tag_group + end + + def process_category_group(category_group) + return nil if category_group['category_id'].nil? || category_group['group_id'].nil? + category_group + end + + def process_group_user(group_user) + if @auto_group_ids.include?(group_user['group_id'].to_i) && + @merged_user_ids.include?(group_user['user_id'].to_i) + return nil + end + return nil if group_user['user_id'].to_i < 1 + group_user + end + + def process_group_history(group_history) + group_history['acting_user_id'] = user_id_from_imported_id(group_history['acting_user_id']) if group_history['acting_user_id'] + group_history['target_user_id'] = user_id_from_imported_id(group_history['target_user_id']) if group_history['target_user_id'] + group_history + end + + def process_group_archived_message(gam) + return nil unless gam['topic_id'].present? && gam['group_id'].present? + gam + end + + def process_topic_link(topic_link) + topic_link['link_topic_id'] = topic_id_from_imported_id(topic_link['link_topic_id']) if topic_link['link_topic_id'] + topic_link['link_post_id'] = post_id_from_imported_id(topic_link['link_post_id']) if topic_link['link_post_id'] + topic_link + end + + def process_user_avatar(user_avatar) + user_avatar['custom_upload_id'] = upload_id_from_imported_id(user_avatar['custom_upload_id']) if user_avatar['custom_upload_id'] + user_avatar['gravatar_upload_id'] = upload_id_from_imported_id(user_avatar['gravatar_upload_id']) if user_avatar['gravatar_upload_id'] + return nil unless user_avatar['custom_upload_id'].present? || user_avatar['gravatar_upload_id'].present? + user_avatar + end + + def process_user_history(user_history) + user_history['acting_user_id'] = user_id_from_imported_id(user_history['acting_user_id']) if user_history['acting_user_id'] + user_history['target_user_id'] = user_id_from_imported_id(user_history['target_user_id']) if user_history['target_user_id'] + user_history + end + + def process_user_warning(user_warning) + user_warning['created_by_id'] = user_id_from_imported_id(user_warning['created_by_id']) if user_warning['created_by_id'] + user_warning + end + + def process_post_upload(post_upload) + return nil unless post_upload['upload_id'].present? + + @imported_post_uploads ||= {} + return nil if @imported_post_uploads[post_upload['post_id']]&.include?(post_upload['upload_id']) + @imported_post_uploads[post_upload['post_id']] ||= [] + @imported_post_uploads[post_upload['post_id']] << post_upload['upload_id'] + + return nil if PostUpload.where(post_id: post_upload['post_id'], upload_id: post_upload['upload_id']).exists? + + post_upload + end + + def process_notification(notification) + notification['post_action_id'] = post_action_id_from_imported_id(notification['post_action_id']) if notification['post_action_id'] + notification + end + + def process_facebook_user_info(r) + return nil if FacebookUserInfo.where(facebook_user_id: r['facebook_user_id']).exists? + r + end + + def process_github_user_info(r) + return nil if GithubUserInfo.where(github_user_id: r['github_user_id']).exists? + r + end + + def process_google_user_info(r) + return nil if GoogleUserInfo.where(google_user_id: r['google_user_id']).exists? + r + end + + def process_instagram_user_info(r) + return nil if InstagramUserInfo.where(instagram_user_id: r['instagram_user_id']).exists? + r + end + + def process_oauth2_user_info(r) + return nil if Oauth2UserInfo.where(uid: r['uid'], provider: r['provider']).exists? + r + end + + def process_single_sign_on_record(r) + return nil if SingleSignOnRecord.where(external_id: r['external_id']).exists? + r + end + + def process_twitter_user_info(r) + return nil if TwitterUserInfo.where(twitter_user_id: r['twitter_user_id']).exists? + r + end + + def process_user_badge(user_badge) + user_badge['granted_by_id'] = user_id_from_imported_id(user_badge['granted_by_id']) if user_badge['granted_by_id'] + user_badge['notification_id'] = notification_id_from_imported_id(user_badge['notification_id']) if user_badge['notification_id'] + return nil if UserBadge.where(user_id: user_badge['user_id'], badge_id: user_badge['badge_id']).exists? + user_badge + end + + def process_email_change_request(ecr) + ecr['old_email_token_id'] = email_token_id_from_imported_id(ecr['old_email_token_id']) if ecr['old_email_token_id'] + ecr['new_email_token_id'] = email_token_id_from_imported_id(ecr['new_email_token_id']) if ecr['new_email_token_id'] + ecr + end + + def process_tag_user(x) + return nil if TagUser.where(tag_id: x['tag_id'], user_id: x['user_id']).exists? + x + end + + def process_topic_tag(x) + return nil if TopicTag.where(topic_id: x['topic_id'], tag_id: x['tag_id']).exists? + x + end + + def process_category_tag(x) + return nil if CategoryTag.where(category_id: x['category_id'], tag_id: x['tag_id']).exists? + x + end + + def process_category_tag_stat(x) + return nil if CategoryTagStat.where(category_id: x['category_id'], tag_id: x['tag_id']).exists? + x + end + + def user_id_from_imported_id(id) + return id if id.to_i < 1 + super(id) + end + + def group_id_from_imported_id(id) + return id if @auto_group_ids.include?(id&.to_i) + super(id) + end + + def tag_id_from_imported_id(id) + @tags[id.to_s] + end + + def tag_group_id_from_imported_id(id) + @tag_groups[id.to_s] + end + + def upload_id_from_imported_id(id) + @uploads[id.to_s] + end + + def post_action_id_from_imported_id(id) + @post_actions[id.to_s] + end + + def badge_id_from_imported_id(id) + @badges[id.to_s] + end + + def notification_id_from_imported_id(id) + @notifications[id.to_s] + end + + def email_token_id_from_imported_id(id) + @email_tokens[id.to_s] + end + + def fix_primary_keys + @sequences.each do |sequence_name, val| + sql = "SELECT setval('#{sequence_name}', #{val})" + puts sql + @raw_connection.exec(sql) + end + end + + def fix_user_columns + puts "updating foreign keys in the users table..." + + User.where('id >= ?', @first_new_user_id).find_each do |u| + arr = [] + sql = "UPDATE users SET" + + if new_approved_by_id = user_id_from_imported_id(u.approved_by_id) + arr << " approved_by_id = #{new_approved_by_id}" + end + if new_primary_group_id = group_id_from_imported_id(u.primary_group_id) + arr << " primary_group_id = #{new_primary_group_id}" + end + if new_notification_id = notification_id_from_imported_id(u.seen_notification_id) + arr << " seen_notification_id = #{new_notification_id}" + end + + next if arr.empty? + + sql << arr.join(', ') + sql << " WHERE id = #{u.id}" + + @raw_connection.exec(sql) + end + end + + def fix_topic_links + puts "updating topic links in posts..." + + update_count = 0 + total = @topics.size + current = 0 + + @topics.each do |old_topic_id, new_topic_id| + current += 1 + percent = (current * 100) / total + puts "#{current} (#{percent}\%) completed. #{update_count} rows updated." if current % 200 == 0 + + if topic = Topic.find_by_id(new_topic_id) + replace_arg = [ + "#{@source_base_url}/t/#{topic.slug}/#{old_topic_id}", + "#{@source_base_url}/t/#{topic.slug}/#{new_topic_id}" + ] + + r = @raw_connection.async_exec( + "UPDATE posts + SET raw = replace(raw, $1, $2) + WHERE NOT raw IS NULL + AND topic_id >= #{@first_new_topic_id} + AND raw <> replace(raw, $1, $2)", + replace_arg + ) + + update_count += r.cmd_tuples + + r = @raw_connection.async_exec( + "UPDATE posts + SET cooked = replace(cooked, $1, $2) + WHERE NOT cooked IS NULL + AND topic_id >= #{@first_new_topic_id} + AND cooked <> replace(cooked, $1, $2)", + replace_arg + ) + + update_count += r.cmd_tuples + end + end + + puts "updated #{update_count} rows" + end + +end + +BulkImport::DiscourseMerger.new.start diff --git a/script/bulk_import/vanilla.rb b/script/bulk_import/vanilla.rb index 771a3ef67b..3e11130e97 100644 --- a/script/bulk_import/vanilla.rb +++ b/script/bulk_import/vanilla.rb @@ -1,6 +1,7 @@ require_relative "base" require "mysql2" require "rake" +require "htmlentities" class BulkImport::Vanilla < BulkImport::Base @@ -18,7 +19,9 @@ class BulkImport::Vanilla < BulkImport::Base @client = Mysql2::Client.new( host: "localhost", username: "root", - database: VANILLA_DB + database: VANILLA_DB, + password: "", + reconnect: true ) @import_tags = false @@ -42,6 +45,7 @@ class BulkImport::Vanilla < BulkImport::Base import_avatars # slow create_permalinks # TODO: do it bulk style + import_attachments # slow end def execute @@ -54,8 +58,14 @@ class BulkImport::Vanilla < BulkImport::Base # other good ones: # SiteSetting.port = 3000 + # SiteSetting.permalink_normalizations = "/discussion\/(\d+)\/.*/discussion/\1" # SiteSetting.automatic_backups_enabled = false - # SiteSetting.disable_emails = true + # SiteSetting.disable_emails = "non-staff" + # SiteSetting.authorized_extensions = '*' + # SiteSetting.max_image_size_kb = 102400 + # SiteSetting.max_attachment_size_kb = 102400 + # SiteSetting.clean_up_uploads = false + # SiteSetting.clean_orphan_uploads_grace_period_hours = 43200 # etc. import_users @@ -250,6 +260,86 @@ class BulkImport::Vanilla < BulkImport::Base end end + def import_attachments + if ATTACHMENTS_BASE_DIR && File.exists?(ATTACHMENTS_BASE_DIR) + puts "", "importing attachments" + + start = Time.now + count = 0 + + # https://us.v-cdn.net/1234567/uploads/editor/xyz/image.jpg + cdn_regex = /https:\/\/us.v-cdn.net\/1234567\/uploads\/(\S+\/(\w|-)+.\w+)/i + # [attachment=10109:Screen Shot 2012-04-01 at 3.47.35 AM.png] + attachment_regex = /\[attachment=(\d+):(.*?)\]/i + + Post.where("raw LIKE '%/us.v-cdn.net/%' OR raw LIKE '%[attachment%'").find_each do |post| + count += 1 + print "\r%7d - %6d/sec".freeze % [count, count.to_f / (Time.now - start)] + new_raw = post.raw.dup + + new_raw.gsub!(attachment_regex) do |s| + matches = attachment_regex.match(s) + attachment_id = matches[1] + file_name = matches[2] + next unless attachment_id + + r = mysql_query("SELECT Path, Name FROM #{TABLE_PREFIX}Media WHERE MediaID = #{attachment_id};").first + next if r.nil? + path = r["Path"] + name = r["Name"] + next unless path.present? + + path.gsub!("s3://content/", "") + path.gsub!("s3://uploads/", "") + file_path = "#{ATTACHMENTS_BASE_DIR}/#{path}" + + if File.exists?(file_path) + upload = create_upload(post.user.id, file_path, File.basename(file_path)) + if upload && upload.errors.empty? + # upload.url + filename = name || file_name || File.basename(file_path) + html_for_upload(upload, normalize_text(filename)) + else + puts "Error: Upload did not persist for #{post.id} #{attachment_id}!" + end + else + puts "Couldn't find file for #{attachment_id}. Skipping." + next + end + end + + new_raw.gsub!(cdn_regex) do |s| + matches = cdn_regex.match(s) + attachment_id = matches[1] + + file_path = "#{ATTACHMENTS_BASE_DIR}/#{attachment_id}" + + if File.exists?(file_path) + upload = create_upload(post.user.id, file_path, File.basename(file_path)) + if upload && upload.errors.empty? + upload.url + else + puts "Error: Upload did not persist for #{post.id} #{attachment_id}!" + end + else + puts "Couldn't find file for #{attachment_id}. Skipping." + next + end + end + + if new_raw != post.raw + begin + PostRevisor.new(post).revise!(post.user, { raw: new_raw }, skip_revision: true, skip_validations: true, bypass_bump: true) + rescue + puts "PostRevisor error for #{post.id}" + post.raw = new_raw + post.save(validate: false) + end + end + end + end + end + def find_photo_file(path, base_filename) base_guess = base_filename.dup full_guess = File.join(path, base_guess) # often an exact match exists @@ -538,16 +628,18 @@ class BulkImport::Vanilla < BulkImport::Base pcf = post.custom_fields if pcf && pcf["import_id"] topic = post.topic - id = pcf["import_id"].split('-').last - if post.post_number == 1 - slug = Slug.for(topic.title) # probably matches what vanilla would do... - @raw_connection.put_copy_data( - ["discussion/#{id}/#{slug}", topic.id, nil, now, now] - ) - else - @raw_connection.put_copy_data( - ["discussion/comment/#{id}", nil, post.id, now, now] - ) + if topic.present? + id = pcf["import_id"].split('-').last + if post.post_number == 1 + slug = Slug.for(topic.title) # probably matches what vanilla would do... + @raw_connection.put_copy_data( + ["discussion/#{id}/#{slug}", topic.id, nil, now, now] + ) + else + @raw_connection.put_copy_data( + ["discussion/comment/#{id}", nil, post.id, now, now] + ) + end end end @@ -559,10 +651,46 @@ class BulkImport::Vanilla < BulkImport::Base def clean_up(raw) # post id is sometimes prefixed with "c-" raw.gsub!(/\[QUOTE="([^;]+);c-(\d+)"\]/i) { "[QUOTE=#{$1};#{$2}]" } + raw = raw.delete("\u0000") + raw = process_raw_text(raw) raw end + def process_raw_text(raw) + return "" if raw.blank? + text = raw.dup + text = CGI.unescapeHTML(text) + + text.gsub!(/:(?:\w{8})\]/, ']') + + # Some links look like this: http://www.onegameamonth.com + text.gsub!(/(.+)<\/a>/i, '[\2](\1)') + + # phpBB shortens link text like this, which breaks our markdown processing: + # [http://answers.yahoo.com/question/index ... 223AAkkPli](http://answers.yahoo.com/question/index?qid=20070920134223AAkkPli) + # + # Work around it for now: + text.gsub!(/\[http(s)?:\/\/(www\.)?/i, '[') + + # convert list tags to ul and list=1 tags to ol + # list=a is not supported, so handle it like list=1 + # list=9 and list=x have the same result as list=1 and list=a + text.gsub!(/\[list\](.*?)\[\/list:u\]/mi, '[ul]\1[/ul]') + text.gsub!(/\[list=.*?\](.*?)\[\/list:o\]/mi, '[ol]\1[/ol]') + + # convert *-tags to li-tags so bbcode-to-md can do its magic on phpBB's lists: + text.gsub!(/\[\*\](.*?)\[\/\*:m\]/mi, '[li]\1[/li]') + + # [QUOTE=""] -- add newline + text.gsub!(/(\[quote="[a-zA-Z\d]+"\])/i) { "#{$1}\n" } + + # [/QUOTE] -- add newline + text.gsub!(/(\[\/quote\])/i) { "\n#{$1}" } + + text + end + def staff_guardian @_staff_guardian ||= Guardian.new(Discourse.system_user) end diff --git a/script/bulk_import/vbulletin.rb b/script/bulk_import/vbulletin.rb index 830c330e93..bde627df94 100644 --- a/script/bulk_import/vbulletin.rb +++ b/script/bulk_import/vbulletin.rb @@ -97,6 +97,7 @@ class BulkImport::VBulletin < BulkImport::Base u = { imported_id: row[0], username: normalize_text(row[1]), + name: normalize_text(row[1]), created_at: Time.zone.at(row[3]), date_of_birth: parse_birthday(row[4]), primary_group_id: group_id_from_imported_id(row[6]), diff --git a/script/discourse b/script/discourse index 13894282dd..d0fccded04 100755 --- a/script/discourse +++ b/script/discourse @@ -30,6 +30,7 @@ class DiscourseCLI < Thor option :regex, type: :boolean def remap(from, to) load_rails + require 'remap' if options[:regex] puts "Rewriting all occurences of #{from} to #{to} using regexp_replace" @@ -94,7 +95,7 @@ class DiscourseCLI < Thor if !filename puts "You must provide a filename to restore. Did you mean one of the following?\n\n" - Dir["public/backups/default/*"].sort_by { |filename| File.mtime(filename) }.reverse.each do |f| + Dir["public/backups/default/*"].sort_by { |path| File.mtime(path) }.reverse.each do |f| puts "#{discourse} restore #{File.basename(f)}" end @@ -237,34 +238,13 @@ class DiscourseCLI < Thor end def do_remap(from, to, regex = false) - sql = "SELECT table_name, column_name -FROM information_schema.columns -WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%') and is_updatable = 'YES'" - - cnn = ActiveRecord::Base.connection.raw_connection - - results = cnn.async_exec(sql).to_a - - results.each do |result| - table_name = result["table_name"] - column_name = result["column_name"] - puts "Remapping #{table_name} #{column_name}" - begin - result = if regex - cnn.async_exec("UPDATE #{table_name} - SET #{column_name} = regexp_replace(#{column_name}, $1, $2, 'g') - WHERE NOT #{column_name} IS NULL - AND #{column_name} <> regexp_replace(#{column_name}, $1, $2, 'g')", [from, to]) - else - cnn.async_exec("UPDATE #{table_name} - SET #{column_name} = replace(#{column_name}, $1, $2) - WHERE NOT #{column_name} IS NULL - AND #{column_name} <> replace(#{column_name}, $1, $2)", [from, to]) - end - puts "#{result.cmd_tuples} rows affected!" - rescue => ex - puts "Error: #{ex}" - end + begin + Remap.new(from, to, regex: regex, verbose: true).perform + puts 'Done', '' + rescue => ex + puts "Error: #{ex}" + puts "The remap has only been partially applied due to the error above. Please re-run the script again." + exit(1) end end diff --git a/script/import_scripts/base.rb b/script/import_scripts/base.rb index fc50cc13cd..880150c11f 100644 --- a/script/import_scripts/base.rb +++ b/script/import_scripts/base.rb @@ -32,6 +32,7 @@ class ImportScripts::Base @old_site_settings = {} @start_times = { import: Time.now } @skip_updates = false + @next_category_color_index = {} end def preload_i18n @@ -75,7 +76,7 @@ class ImportScripts::Base min_personal_message_post_length: 1, min_personal_message_title_length: 1, allow_duplicate_topic_titles: true, - disable_emails: true, + disable_emails: 'yes', max_attachment_size_kb: 102400, max_image_size_kb: 102400, authorized_extensions: '*' @@ -83,6 +84,12 @@ class ImportScripts::Base end def change_site_settings + if SiteSetting.bootstrap_mode_enabled + SiteSetting.default_trust_level = TrustLevel[0] if SiteSetting.default_trust_level == TrustLevel[1] + SiteSetting.default_email_digest_frequency = 10080 if SiteSetting.default_email_digest_frequency == 1440 + SiteSetting.bootstrap_mode_enabled = false + end + @site_settings_during_import = get_site_settings_for_import @site_settings_during_import.each do |key, value| @@ -445,7 +452,7 @@ class ImportScripts::Base user_id: opts[:user_id] || opts[:user].try(:id) || Discourse::SYSTEM_USER_ID, position: opts[:position], parent_category_id: opts[:parent_category_id], - color: opts[:color] || category_color, + color: opts[:color] || category_color(opts[:parent_category_id]), text_color: opts[:text_color] || "FFF", read_restricted: opts[:read_restricted] || false, ) @@ -466,11 +473,11 @@ class ImportScripts::Base new_category end - def category_color + def category_color(parent_category_id) @category_colors ||= SiteSetting.category_colors.split('|') - index = @next_category_color_index.presence || 0 - @next_category_color_index = index + 1 >= @category_colors.count ? 0 : index + 1 + index = @next_category_color_index[parent_category_id].presence || 0 + @next_category_color_index[parent_category_id] = index + 1 >= @category_colors.count ? 0 : index + 1 @category_colors[index] end @@ -626,7 +633,7 @@ class ImportScripts::Base def update_topic_status puts "", "Updating topic status" - Topic.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE topics AS t SET closed = TRUE WHERE EXISTS( @@ -636,7 +643,7 @@ class ImportScripts::Base ) SQL - Topic.exec_sql(<<~SQL) + DB.exec(<<~SQL) UPDATE topics AS t SET archived = TRUE WHERE EXISTS( @@ -646,7 +653,7 @@ class ImportScripts::Base ) SQL - TopicCustomField.exec_sql(<<~SQL) + DB.exec(<<~SQL) DELETE FROM topic_custom_fields WHERE name IN ('import_closed', 'import_archived') SQL @@ -654,7 +661,7 @@ class ImportScripts::Base def update_bumped_at puts "", "Updating bumped_at on topics" - Post.exec_sql("update topics t set bumped_at = COALESCE((select max(created_at) from posts where topic_id = t.id and post_type = #{Post.types[:regular]}), bumped_at)") + DB.exec("update topics t set bumped_at = COALESCE((select max(created_at) from posts where topic_id = t.id and post_type = #{Post.types[:regular]}), bumped_at)") end def update_last_posted_at @@ -674,7 +681,7 @@ class ImportScripts::Base AND users.last_posted_at <> lpa.last_posted_at SQL - User.exec_sql(sql) + DB.exec(sql) end def update_user_stats @@ -707,7 +714,7 @@ class ImportScripts::Base AND user_stats.first_post_created_at <> sub.first_post_created_at SQL - User.exec_sql(sql) + DB.exec(sql) puts "", "Updating user post_count..." @@ -725,7 +732,7 @@ class ImportScripts::Base AND user_stats.post_count <> sub.post_count SQL - User.exec_sql(sql) + DB.exec(sql) puts "", "Updating user topic_count..." @@ -743,15 +750,15 @@ class ImportScripts::Base AND user_stats.topic_count <> sub.topic_count SQL - User.exec_sql(sql) + DB.exec(sql) end # scripts that are able to import last_seen_at from the source data should override this method def update_last_seen_at puts "", "Updating last seen at on users" - User.exec_sql("UPDATE users SET last_seen_at = created_at WHERE last_seen_at IS NULL") - User.exec_sql("UPDATE users SET last_seen_at = last_posted_at WHERE last_posted_at IS NOT NULL") + DB.exec("UPDATE users SET last_seen_at = created_at WHERE last_seen_at IS NULL") + DB.exec("UPDATE users SET last_seen_at = last_posted_at WHERE last_posted_at IS NOT NULL") end def update_feature_topic_users @@ -866,7 +873,7 @@ class ImportScripts::Base @start_times.fetch(key) { |k| @start_times[k] = Time.now } end - def batches(batch_size) + def batches(batch_size = 1000) offset = 0 loop do yield offset diff --git a/script/import_scripts/base/generic_database.rb b/script/import_scripts/base/generic_database.rb index 5b7df59cf4..39284a4d34 100644 --- a/script/import_scripts/base/generic_database.rb +++ b/script/import_scripts/base/generic_database.rb @@ -125,6 +125,10 @@ module ImportScripts @db.execute(sql) end + def get_first_value(sql) + @db.get_first_value(sql) + end + private def configure_database diff --git a/script/import_scripts/base/uploader.rb b/script/import_scripts/base/uploader.rb index ca7b65bb1d..2d25a3e9ae 100644 --- a/script/import_scripts/base/uploader.rb +++ b/script/import_scripts/base/uploader.rb @@ -9,21 +9,36 @@ module ImportScripts # Expects path to be the full path and filename of the source file. # @return [Upload] def create_upload(user_id, path, source_filename) - tmp = Tempfile.new('discourse-upload') - src = File.open(path) - FileUtils.copy_stream(src, tmp) - src.close - tmp.rewind + tmp = copy_to_tempfile(path) UploadCreator.new(tmp, source_filename).create_for(user_id) rescue => e - Rails.logger.error("Failed to create upload: #{e}") + STDERR.puts "Failed to create upload: #{e}" nil ensure tmp.close rescue nil tmp.unlink rescue nil end + def create_avatar(user, avatar_path) + tempfile = copy_to_tempfile(avatar_path) + filename = "avatar#{File.extname(avatar_path)}" + upload = UploadCreator.new(tempfile, filename, type: "avatar").create_for(user.id) + + if upload.present? && upload.persisted? + user.create_user_avatar + user.user_avatar.update(custom_upload_id: upload.id) + user.update(uploaded_avatar_id: upload.id) + else + STDERR.puts "Failed to upload avatar for user #{user.username}: #{avatar_path}" + STDERR.puts upload.errors.inspect if upload + end + rescue + STDERR.puts "Failed to create avatar for user #{user.username}: #{avatar_path}" + ensure + tempfile.close! if tempfile + end + def html_for_upload(upload, display_filename) if FileHelper.is_image?(upload.url) embedded_image_html(upload) @@ -35,11 +50,26 @@ module ImportScripts def embedded_image_html(upload) image_width = [upload.width, SiteSetting.max_image_width].compact.min image_height = [upload.height, SiteSetting.max_image_height].compact.min - %Q[
] + upload_name = upload.short_url || upload.url + %Q~![#{upload.original_filename}|#{image_width}x#{image_height}](#{upload_name})~ end def attachment_html(upload, display_filename) "#{display_filename} (#{number_to_human_size(upload.filesize)})" end + + private + + def copy_to_tempfile(source_path) + extension = File.extname(source_path) + tmp = Tempfile.new(['discourse-upload', extension]) + + File.open(source_path) do |source_stream| + IO.copy_stream(source_stream, tmp) + end + + tmp.rewind + tmp + end end end diff --git a/script/import_scripts/discuz_x.rb b/script/import_scripts/discuz_x.rb index 8f99ae4911..54c5071917 100644 --- a/script/import_scripts/discuz_x.rb +++ b/script/import_scripts/discuz_x.rb @@ -393,12 +393,12 @@ class ImportScripts::DiscuzX < ImportScripts::Base end if m['status'] & 1 == 1 || mapped[:raw].blank? - mapped[:post_create_action] = lambda do |post| - PostDestroyer.new(Discourse.system_user, post).perform_delete + mapped[:post_create_action] = lambda do |action_post| + PostDestroyer.new(Discourse.system_user, action_post).perform_delete end elsif (m['status'] & 2) >> 1 == 1 # waiting for approve - mapped[:post_create_action] = lambda do |post| - PostAction.act(Discourse.system_user, post, 6, take_action: false) + mapped[:post_create_action] = lambda do |action_post| + PostAction.act(Discourse.system_user, action_post, 6, take_action: false) end end skip ? nil : mapped diff --git a/script/import_scripts/ipboard.rb b/script/import_scripts/ipboard.rb index 18708898bf..f1b10b6a5b 100644 --- a/script/import_scripts/ipboard.rb +++ b/script/import_scripts/ipboard.rb @@ -70,7 +70,7 @@ class ImportScripts::IpboardSQL < ImportScripts::Base # Site settings # ################# # don't send any emails - SiteSetting.disable_emails = true + SiteSetting.disable_emails = "non-staff" # don't send digests (so you can enable email without users noticing) SiteSetting.disable_digest_emails = true # keep site and users private diff --git a/script/import_scripts/ipboard3.rb b/script/import_scripts/ipboard3.rb index 5a9812f85d..53d808aa69 100644 --- a/script/import_scripts/ipboard3.rb +++ b/script/import_scripts/ipboard3.rb @@ -267,7 +267,7 @@ class ImportScripts::IPBoard3 < ImportScripts::Base WHERE id IN (SELECT topic_id FROM closed_topic_ids) SQL - Topic.exec_sql(sql, @closed_topic_ids) + DB.exec(sql, @closed_topic_ids) end def import_personal_topics diff --git a/script/import_scripts/jive_api.rb b/script/import_scripts/jive_api.rb index f8c3734a35..923904aef8 100644 --- a/script/import_scripts/jive_api.rb +++ b/script/import_scripts/jive_api.rb @@ -325,7 +325,7 @@ class ImportScripts::JiveApi < ImportScripts::Base def mark_topics_as_solved puts "", "Marking topics as solved..." - PostAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT INTO topic_custom_fields (name, value, topic_id, created_at, updated_at) SELECT 'accepted_answer_post_id', pcf.post_id, p.topic_id, p.created_at, p.created_at FROM post_custom_fields pcf diff --git a/script/import_scripts/lithium.rb b/script/import_scripts/lithium.rb index 108fec921e..442df14f8a 100644 --- a/script/import_scripts/lithium.rb +++ b/script/import_scripts/lithium.rb @@ -70,6 +70,7 @@ class ImportScripts::Lithium < ImportScripts::Base import_groups import_categories import_users + import_user_visits import_topics import_posts import_likes @@ -103,6 +104,7 @@ class ImportScripts::Lithium < ImportScripts::Base user_count = mysql_query("SELECT COUNT(*) count FROM users").first["count"] avatar_files = Dir.entries(AVATAR_DIR) + duplicate_emails = mysql_query("SELECT email_lower FROM users GROUP BY email_lower HAVING COUNT(email_lower) > 1").map { |e| [e["email_lower"], 0] }.to_h batches(BATCH_SIZE) do |offset| users = mysql_query <<-SQL @@ -129,17 +131,25 @@ class ImportScripts::Lithium < ImportScripts::Base SQL create_users(users, total: user_count, offset: offset) do |user| - profile = profiles.select { |p| p["user_id"] == user["id"] } + user_id = user["id"] + profile = profiles.select { |p| p["user_id"] == user_id } result = profile.select { |p| p["param"] == "profile.location" } location = result.count > 0 ? result.first["nvalue"] : nil username = user["login_canon"] username = USERNAME_MAPPINGS[username] if USERNAME_MAPPINGS[username].present? + email = user["email"].presence || fake_email + email_lower = email.downcase + if duplicate_emails.key?(email_lower) + duplicate_emails[email_lower] += 1 + email.sub!("@", "+#{duplicate_emails[email_lower]}@") if duplicate_emails[email_lower] > 1 + end + { - id: user["id"], + id: user_id, name: user["nlogin"], username: username, - email: user["email"].presence || fake_email, + email: email, location: location, custom_fields: user_custom_fields(user, profile), # website: user["homepage"].strip, @@ -176,6 +186,35 @@ class ImportScripts::Lithium < ImportScripts::Base end end + def import_user_visits + puts "", "importing user visits" + + batches(BATCH_SIZE) do |offset| + visits = mysql_query <<-SQL + SELECT user_id, login_time + FROM user_log + ORDER BY user_id + LIMIT #{BATCH_SIZE} + OFFSET #{offset} + SQL + + break if visits.size < 1 + + user_ids = visits.uniq { |v| v["user_id"] } + + user_ids.each do |user_id| + user = UserCustomField.find_by(name: "import_id", value: user_id).try(:user) + raise "User not found for id #{user_id}" if user.blank? + + user_visits = visits.select { |v| v["user_id"] == user_id } + user_visits.each do |v| + date = unix_time(v["login_time"]) + user.update_visit_record!(date) + end + end + end + end + def user_custom_fields(user, profile) fields = Hash.new @@ -496,7 +535,7 @@ class ImportScripts::Lithium < ImportScripts::Base end puts "loading data into temp table" - PostAction.exec_sql("create temp table like_data(user_id int, post_id int, created_at timestamp without time zone)") + DB.exec("create temp table like_data(user_id int, post_id int, created_at timestamp without time zone)") PostAction.transaction do results.each do |result| @@ -505,17 +544,17 @@ class ImportScripts::Lithium < ImportScripts::Base next unless result["user_id"] && result["post_id"] - PostAction.exec_sql("INSERT INTO like_data VALUES (:user_id,:post_id,:created_at)", - user_id: result["user_id"], - post_id: result["post_id"], - created_at: result["created_at"] - ) + DB.exec("INSERT INTO like_data VALUES (:user_id,:post_id,:created_at)", + user_id: result["user_id"], + post_id: result["post_id"], + created_at: result["created_at"] + ) end end puts "creating missing post actions" - PostAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT INTO post_actions (post_id, user_id, post_action_type_id, created_at, updated_at) SELECT l.post_id, l.user_id, 2, l.created_at, l.created_at FROM like_data l @@ -524,7 +563,7 @@ class ImportScripts::Lithium < ImportScripts::Base SQL puts "creating missing user actions" - UserAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT INTO user_actions (user_id, action_type, target_topic_id, target_post_id, acting_user_id, created_at, updated_at) SELECT pa.user_id, 1, p.topic_id, p.id, pa.user_id, pa.created_at, pa.created_at FROM post_actions pa @@ -535,7 +574,7 @@ class ImportScripts::Lithium < ImportScripts::Base SQL # reverse action - UserAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT INTO user_actions (user_id, action_type, target_topic_id, target_post_id, acting_user_id, created_at, updated_at) SELECT p.user_id, 2, p.topic_id, p.id, pa.user_id, pa.created_at, pa.created_at FROM post_actions pa @@ -547,7 +586,7 @@ class ImportScripts::Lithium < ImportScripts::Base SQL puts "updating like counts on posts" - Post.exec_sql <<-SQL + DB.exec <<~SQL UPDATE posts SET like_count = coalesce(cnt,0) FROM ( SELECT post_id, count(*) cnt @@ -561,7 +600,7 @@ class ImportScripts::Lithium < ImportScripts::Base puts "updating like counts on topics" - Post.exec_sql <<-SQL + DB.exec <<-SQL UPDATE topics SET like_count = coalesce(cnt,0) FROM ( SELECT topic_id, sum(like_count) cnt @@ -588,7 +627,7 @@ class ImportScripts::Lithium < ImportScripts::Base end puts "loading data into temp table" - PostAction.exec_sql("create temp table accepted_data(post_id int primary key)") + DB.exec("create temp table accepted_data(post_id int primary key)") PostAction.transaction do results.each do |result| @@ -596,7 +635,7 @@ class ImportScripts::Lithium < ImportScripts::Base next unless result["post_id"] - PostAction.exec_sql("INSERT INTO accepted_data VALUES (:post_id)", + DB.exec("INSERT INTO accepted_data VALUES (:post_id)", post_id: result["post_id"] ) @@ -604,7 +643,7 @@ class ImportScripts::Lithium < ImportScripts::Base end puts "deleting dupe answers" - PostAction.exec_sql <<-SQL + DB.exec <<~SQL DELETE FROM accepted_data WHERE post_id NOT IN ( SELECT post_id FROM ( @@ -617,7 +656,7 @@ class ImportScripts::Lithium < ImportScripts::Base SQL puts "importing accepted answers" - PostAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT into post_custom_fields (name, value, post_id, created_at, updated_at) SELECT 'is_accepted_answer', 'true', a.post_id, current_timestamp, current_timestamp FROM accepted_data a @@ -626,7 +665,7 @@ class ImportScripts::Lithium < ImportScripts::Base SQL puts "marking accepted topics" - PostAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT into topic_custom_fields (name, value, topic_id, created_at, updated_at) SELECT 'accepted_answer_post_id', a.post_id::varchar, p.topic_id, current_timestamp, current_timestamp FROM accepted_data a @@ -758,10 +797,10 @@ class ImportScripts::Lithium < ImportScripts::Base results.map { |r| r["post_id"] }.each_slice(500) do |ids| mapped = ids.map { |id| existing_map[id] }.compact - Topic.exec_sql(" - UPDATE topics SET closed = true - WHERE id IN (SELECT topic_id FROM posts where id in (:ids)) - ", ids: mapped) if mapped.present? + DB.exec(<<~SQL, ids: mapped) if mapped.present? + UPDATE topics SET closed = true + WHERE id IN (SELECT topic_id FROM posts where id in (:ids)) + SQL end end @@ -780,8 +819,8 @@ class ImportScripts::Lithium < ImportScripts::Base WHERE pm.id IS NULL AND f.name = 'import_unique_id' SQL - r = Permalink.exec_sql sql - puts "#{r.cmd_tuples} permalinks to topics added!" + r = DB.exec sql + puts "#{r} permalinks to topics added!" sql = <<-SQL INSERT INTO permalinks (url, post_id, created_at, updated_at) @@ -792,13 +831,14 @@ SQL WHERE pm.id IS NULL AND f.name = 'import_unique_id' SQL - r = Permalink.exec_sql sql - puts "#{r.cmd_tuples} permalinks to posts added!" + r = DB.exec sql + puts "#{r} permalinks to posts added!" end def find_upload(user_id, attachment_id, real_filename) - filename = File.join(ATTACHMENT_DIR, "#{attachment_id.to_s.rjust(4, "0")}.dat") + filename = attachment_id.to_s.rjust(4, "0") + filename = File.join(ATTACHMENT_DIR, "000#{filename[0]}/#{filename}.dat") unless File.exists?(filename) puts "Attachment file doesn't exist: #{filename}" @@ -846,7 +886,7 @@ SQL post.raw = new_raw post.cooked = post.cook(new_raw) cpp = CookedPostProcessor.new(post) - cpp.keep_reverse_index_up_to_date + cpp.link_post_uploads post.custom_fields["import_post_process"] = true post.save end @@ -863,6 +903,13 @@ SQL end def postprocess_post_raw(raw, user_id) + matches = raw.match(//m) || [] + matches.each do |match| + hash = Hash.from_xml(match) + template = hash["messagetemplate"]["zone"]["item"] + content = (template[0] || template)["content"] || "" + raw.sub!(match, content) + end doc = Nokogiri::HTML.fragment(raw) @@ -952,7 +999,7 @@ SQL user = UserCustomField.find_by(name: 'import_id', value: uid).try(:user) if user.present? username = user.username - span = doc.create_element "span" + span = l.document.create_element "span" span.inner_html = "@#{username}" l.replace span end diff --git a/script/import_scripts/mbox.rb b/script/import_scripts/mbox.rb index d0b379aa12..2f125cbf33 100755 --- a/script/import_scripts/mbox.rb +++ b/script/import_scripts/mbox.rb @@ -27,7 +27,7 @@ class ImportScripts::Mbox < ImportScripts::Base BATCH_SIZE = 1000 # Site settings - SiteSetting.disable_emails = true + SiteSetting.disable_emails = "non-staff" # Comment out if each file contains a single message # Use formail to split yourself: http://linuxcommand.org/man_pages/formail1.html diff --git a/script/import_scripts/mbox/importer.rb b/script/import_scripts/mbox/importer.rb index 4615f10524..db0269d888 100644 --- a/script/import_scripts/mbox/importer.rb +++ b/script/import_scripts/mbox/importer.rb @@ -93,7 +93,10 @@ module ImportScripts::Mbox next if all_records_exist?(:posts, rows.map { |row| row['msg_id'] }) create_posts(rows, total: total_count, offset: offset) do |row| - if row['in_reply_to'].blank? + if row['email_date'].blank? + puts "Date is missing. Skipping #{row['msg_id']}" + nil + elsif row['in_reply_to'].blank? map_first_post(row) else map_reply(row) @@ -163,8 +166,8 @@ module ImportScripts::Mbox ) end - def to_time(datetime) - Time.zone.at(DateTime.iso8601(datetime)) if datetime + def to_time(timestamp) + Time.zone.at(timestamp) if timestamp end end end diff --git a/script/import_scripts/mbox/settings.yml b/script/import_scripts/mbox/settings.yml index a4b449a3d6..cac3996a90 100644 --- a/script/import_scripts/mbox/settings.yml +++ b/script/import_scripts/mbox/settings.yml @@ -1,7 +1,7 @@ data_dir: /shared/import/data # mbox files -split_regex: "^From .+" +split_regex: "^From .+@.+" #split_regex: "^From .+@example.com.+" # individual emails @@ -11,7 +11,7 @@ split_regex: "^From .+" #split_regex: "^=========================================================================" default_trust_level: 1 -prefer_html: false +prefer_html: true staged: true index_only: false diff --git a/script/import_scripts/mbox/support/database.rb b/script/import_scripts/mbox/support/database.rb index 6121e23a5e..a7415a0327 100644 --- a/script/import_scripts/mbox/support/database.rb +++ b/script/import_scripts/mbox/support/database.rb @@ -97,19 +97,20 @@ module ImportScripts::Mbox @db.execute <<-SQL WITH RECURSIVE - messages(msg_id, level, email_date) AS ( - SELECT msg_id, 0 AS level, email_date + messages(msg_id, level, email_date, in_reply_to) AS ( + SELECT msg_id, 0 AS level, email_date, in_reply_to FROM email WHERE in_reply_to IS NULL UNION ALL - SELECT e.msg_id, m.level + 1, e.email_date + SELECT e.msg_id, m.level + 1, e.email_date, e.in_reply_to FROM email e JOIN messages m ON e.in_reply_to = m.msg_id - ORDER BY level, email_date, msg_id ) INSERT INTO email_order (msg_id) - SELECT msg_id - FROM messages + SELECT c.msg_id + FROM messages c + LEFT OUTER JOIN messages p ON (c.in_reply_to = p.msg_id) + ORDER BY MAX(c.email_date, p.email_date), c.level, c.email_date, c.msg_id SQL end @@ -175,7 +176,6 @@ module ImportScripts::Mbox @db.get_first_value <<-SQL SELECT COUNT(*) FROM email - WHERE email_date IS NOT NULL SQL end @@ -185,8 +185,7 @@ module ImportScripts::Mbox raw_message, body, elided, format, attachment_count, category FROM email e JOIN email_order o USING (msg_id) - WHERE email_date IS NOT NULL AND - o.ROWID > :last_row_id + WHERE o.ROWID > :last_row_id ORDER BY o.ROWID LIMIT #{@batch_size} SQL diff --git a/script/import_scripts/mbox/support/indexer.rb b/script/import_scripts/mbox/support/indexer.rb index dfaf74f68f..1a2260525a 100644 --- a/script/import_scripts/mbox/support/indexer.rb +++ b/script/import_scripts/mbox/support/indexer.rb @@ -74,7 +74,7 @@ module ImportScripts::Mbox from_email: from_email, from_name: from_display_name, subject: extract_subject(receiver, category_name), - email_date: parsed_email.date&.to_s, + email_date: timestamp(parsed_email.date), raw_message: receiver.raw_email, body: body, elided: elided, @@ -256,5 +256,9 @@ module ImportScripts::Mbox def monotonic_time Process.clock_gettime(Process::CLOCK_MONOTONIC) end + + def timestamp(datetime) + Time.zone.at(datetime).to_i if datetime + end end end diff --git a/script/import_scripts/modx.rb b/script/import_scripts/modx.rb index 191135f6bf..eeaa21be95 100644 --- a/script/import_scripts/modx.rb +++ b/script/import_scripts/modx.rb @@ -24,7 +24,7 @@ class ImportScripts::Modx < ImportScripts::Base def initialize super - SiteSetting.disable_emails = true + SiteSetting.disable_emails = "non-staff" @old_username_to_new_usernames = {} @@ -236,7 +236,7 @@ FROM #{TABLE_PREFIX}discuss_users def not_mark_topics_as_solved puts "", "Marking topics as solved..." - PostAction.exec_sql <<-SQL + DB.exec <<~SQL INSERT INTO topic_custom_fields (name, value, topic_id, created_at, updated_at) SELECT 'accepted_answer_post_id', pcf.post_id, p.topic_id, p.created_at, p.created_at FROM post_custom_fields pcf @@ -469,7 +469,7 @@ FROM #{TABLE_PREFIX}discuss_users WHERE id IN (SELECT topic_id FROM closed_topic_ids) SQL - Topic.exec_sql(sql, closed_topic_ids) + DB.exec(sql, closed_topic_ids) end def not_post_process_posts diff --git a/script/import_scripts/mybb.rb b/script/import_scripts/mybb.rb index f9201ecacf..cc3ed9e662 100644 --- a/script/import_scripts/mybb.rb +++ b/script/import_scripts/mybb.rb @@ -37,7 +37,7 @@ class ImportScripts::MyBB < ImportScripts::Base end def execute - SiteSetting.disable_emails = true + SiteSetting.disable_emails = "non-staff" import_users import_categories import_posts diff --git a/script/import_scripts/mylittleforum.rb b/script/import_scripts/mylittleforum.rb index f0ec152472..4b10494eb4 100644 --- a/script/import_scripts/mylittleforum.rb +++ b/script/import_scripts/mylittleforum.rb @@ -33,7 +33,7 @@ class ImportScripts::MylittleforumSQL < ImportScripts::Base QUIET = true # Site settings - SiteSetting.disable_emails = true + SiteSetting.disable_emails = "non-staff" if FORCE_HOSTNAME SiteSetting.force_hostname = FORCE_HOSTNAME end diff --git a/script/import_scripts/phpbb3/importers/avatar_importer.rb b/script/import_scripts/phpbb3/importers/avatar_importer.rb index a9cd22d4c9..2178ed800c 100644 --- a/script/import_scripts/phpbb3/importers/avatar_importer.rb +++ b/script/import_scripts/phpbb3/importers/avatar_importer.rb @@ -47,16 +47,16 @@ module ImportScripts::PhpBB3 def get_avatar_path(avatar_type, filename) case avatar_type - when Constants::AVATAR_TYPE_UPLOADED then + when Constants::AVATAR_TYPE_UPLOADED, Constants::AVATAR_TYPE_STRING_UPLOADED then filename.gsub!(/_[0-9]+\./, '.') # we need 1337.jpg, not 1337_2983745.jpg get_uploaded_path(filename) - when Constants::AVATAR_TYPE_GALLERY then + when Constants::AVATAR_TYPE_GALLERY, Constants::AVATAR_TYPE_STRING_GALLERY then get_gallery_path(filename) - when Constants::AVATAR_TYPE_REMOTE then + when Constants::AVATAR_TYPE_REMOTE, Constants::AVATAR_TYPE_STRING_REMOTE then download_avatar(filename) - else - Rails.logger.error("Invalid avatar type #{avatar_type}. Skipping...") - nil + else + puts "Invalid avatar type #{avatar_type}. Skipping..." + nil end end @@ -97,13 +97,13 @@ module ImportScripts::PhpBB3 def is_allowed_avatar_type?(avatar_type) case avatar_type - when Constants::AVATAR_TYPE_UPLOADED then + when Constants::AVATAR_TYPE_UPLOADED, Constants::AVATAR_TYPE_STRING_UPLOADED then @settings.import_uploaded_avatars - when Constants::AVATAR_TYPE_REMOTE then + when Constants::AVATAR_TYPE_REMOTE, Constants::AVATAR_TYPE_STRING_REMOTE then @settings.import_remote_avatars - when Constants::AVATAR_TYPE_GALLERY then + when Constants::AVATAR_TYPE_GALLERY, Constants::AVATAR_TYPE_STRING_GALLERY then @settings.import_gallery_avatars - else + else false end end diff --git a/script/import_scripts/phpbb3/support/constants.rb b/script/import_scripts/phpbb3/support/constants.rb index af7482d5da..6e9612e678 100644 --- a/script/import_scripts/phpbb3/support/constants.rb +++ b/script/import_scripts/phpbb3/support/constants.rb @@ -19,6 +19,10 @@ module ImportScripts::PhpBB3 AVATAR_TYPE_REMOTE = 2 AVATAR_TYPE_GALLERY = 3 + AVATAR_TYPE_STRING_UPLOADED = 'avatar.driver.upload' + AVATAR_TYPE_STRING_REMOTE = 'avatar.driver.remote' + AVATAR_TYPE_STRING_GALLERY = 'avatar.driver.local' + FORUM_TYPE_CATEGORY = 0 FORUM_TYPE_POST = 1 FORUM_TYPE_LINK = 2 diff --git a/script/import_scripts/quandora/quandora_question.rb b/script/import_scripts/quandora/quandora_question.rb index 6105ef895d..9eb59c9e30 100644 --- a/script/import_scripts/quandora/quandora_question.rb +++ b/script/import_scripts/quandora/quandora_question.rb @@ -8,102 +8,102 @@ class QuandoraQuestion @question = JSON.parse question_json end - def topic - topic = {} - topic[:id] = @question['uid'] - topic[:author_id] = @question['author']['uid'] - topic[:title] = unescape @question['title'] - topic[:raw] = unescape @question['content'] - topic[:created_at] = Time.parse @question['created'] - topic - end + def topic + topic = {} + topic[:id] = @question['uid'] + topic[:author_id] = @question['author']['uid'] + topic[:title] = unescape @question['title'] + topic[:raw] = unescape @question['content'] + topic[:created_at] = Time.parse @question['created'] + topic + end - def users - users = {} - user = user_from_author @question['author'] - users[user[:id]] = user - replies.each do |reply| - user = user_from_author reply[:author] - users[user[:id]] = user - end - users.values.to_a - end + def users + users = {} + user = user_from_author @question['author'] + users[user[:id]] = user + replies.each do |reply| + user = user_from_author reply[:author] + users[user[:id]] = user + end + users.values.to_a + end - def user_from_author(author) - email = author['email'] - email = "#{author['uid']}@noemail.com" unless email + def user_from_author(author) + email = author['email'] + email = "#{author['uid']}@noemail.com" unless email - user = {} - user[:id] = author['uid'] - user[:name] = "#{author['firstName']} #{author['lastName']}" - user[:email] = email - user[:staged] = true - user - end + user = {} + user[:id] = author['uid'] + user[:name] = "#{author['firstName']} #{author['lastName']}" + user[:email] = email + user[:staged] = true + user + end - def replies - posts = [] - answers = @question['answersList'] - comments = @question['comments'] - comments.each_with_index do |comment, i| - posts << post_from_comment(comment, i, @question) - end - answers.each do |answer| - posts << post_from_answer(answer) - comments = answer['comments'] - comments.each_with_index do |comment, i| - posts << post_from_comment(comment, i, answer) - end - end - order_replies posts - end + def replies + posts = [] + answers = @question['answersList'] + comments = @question['comments'] + comments.each_with_index do |comment, i| + posts << post_from_comment(comment, i, @question) + end + answers.each do |answer| + posts << post_from_answer(answer) + comments = answer['comments'] + comments.each_with_index do |comment, i| + posts << post_from_comment(comment, i, answer) + end + end + order_replies posts + end - def order_replies(posts) - posts = posts.sort_by { |p| p[:created_at] } - posts.each_with_index do |p, i| - p[:post_number] = i + 2 - end - posts.each do |p| - parent = posts.select { |pp| pp[:id] == p[:parent_id] } - p[:reply_to_post_number] = parent[0][:post_number] if parent.size > 0 - end - posts - end + def order_replies(posts) + posts = posts.sort_by { |p| p[:created_at] } + posts.each_with_index do |p, i| + p[:post_number] = i + 2 + end + posts.each do |p| + parent = posts.select { |pp| pp[:id] == p[:parent_id] } + p[:reply_to_post_number] = parent[0][:post_number] if parent.size > 0 + end + posts + end - def post_from_answer(answer) - post = {} - post[:id] = answer['uid'] - post[:parent_id] = @question['uid'] - post[:author] = answer['author'] - post[:author_id] = answer['author']['uid'] - post[:raw] = unescape answer['content'] - post[:created_at] = Time.parse answer['created'] - post - end + def post_from_answer(answer) + post = {} + post[:id] = answer['uid'] + post[:parent_id] = @question['uid'] + post[:author] = answer['author'] + post[:author_id] = answer['author']['uid'] + post[:raw] = unescape answer['content'] + post[:created_at] = Time.parse answer['created'] + post + end - def post_from_comment(comment, index, parent) - if comment['created'] - created_at = Time.parse comment['created'] - else - created_at = Time.parse parent['created'] - end - parent_id = parent['uid'] - parent_id = "#{parent['uid']}-#{index - 1}" if index > 0 - post = {} - id = "#{parent['uid']}-#{index}" - post[:id] = id - post[:parent_id] = parent_id - post[:author] = comment['author'] - post[:author_id] = comment['author']['uid'] - post[:raw] = unescape comment['text'] - post[:created_at] = created_at - post - end + def post_from_comment(comment, index, parent) + if comment['created'] + created_at = Time.parse comment['created'] + else + created_at = Time.parse parent['created'] + end + parent_id = parent['uid'] + parent_id = "#{parent['uid']}-#{index - 1}" if index > 0 + post = {} + id = "#{parent['uid']}-#{index}" + post[:id] = id + post[:parent_id] = parent_id + post[:author] = comment['author'] + post[:author_id] = comment['author']['uid'] + post[:raw] = unescape comment['text'] + post[:created_at] = created_at + post + end private - def unescape(html) - return nil unless html - CGI.unescapeHTML html - end + def unescape(html) + return nil unless html + CGI.unescapeHTML html + end end diff --git a/script/import_scripts/question2answer.rb b/script/import_scripts/question2answer.rb new file mode 100644 index 0000000000..49eb3eddc5 --- /dev/null +++ b/script/import_scripts/question2answer.rb @@ -0,0 +1,564 @@ +require 'mysql2' +require File.expand_path(File.dirname(__FILE__) + "/base.rb") +require 'htmlentities' +begin + require 'php_serialize' # https://github.com/jqr/php-serialize +rescue LoadError + puts + puts 'php_serialize not found.' + puts 'Add to Gemfile, like this: ' + puts + puts "echo gem \\'php-serialize\\' >> Gemfile" + puts "bundle install" + exit +end + +class ImportScripts::Question2Answer < ImportScripts::Base + BATCH_SIZE = 1000 + + # CHANGE THESE BEFORE RUNNING THE IMPORTER + + DB_HOST ||= ENV['DB_HOST'] || "localhost" + DB_NAME ||= ENV['DB_NAME'] + DB_PW ||= ENV['DB_PW'] + DB_USER ||= ENV['DB_USER'] + TIMEZONE ||= ENV['TIMEZONE'] || "America/Los_Angeles" + TABLE_PREFIX ||= ENV['TABLE_PREFIX'] || "qa_" + MAIN_APP_DB_NAME = "primary_db" + + puts "#{DB_USER}:#{DB_PW}@#{DB_HOST} wants #{DB_NAME}" + + def initialize + super + + @old_username_to_new_usernames = {} + + @tz = TZInfo::Timezone.get(TIMEZONE) + + @htmlentities = HTMLEntities.new + + @client = Mysql2::Client.new( + host: DB_HOST, + username: DB_USER, + password: DB_PW, + database: DB_NAME + ) + rescue Exception => e + puts '=' * 50 + puts e.message + puts < #{last_user_id} AND + (EXISTS (SELECT 1 FROM #{TABLE_PREFIX}posts p WHERE p.userid=u.id) or EXISTS (SELECT 1 FROM #{TABLE_PREFIX}uservotes u WHERE u.userid=u.id)) + ORDER BY u.id + LIMIT #{BATCH_SIZE} + SQL + ).to_a + + break if users.empty? + + last_user_id = users[-1]["id"] + users.reject! { |u| @lookup.user_already_imported?(u["id"].to_i) } + + create_users(users, total: user_count, offset: offset) do |user| + email = user["email"].presence + + username = @htmlentities.decode(user["email"]).strip.split("@").first + avatar_url = "https://your_image_bucket/#{user['cdn_slug']}" if user['cdn_slug'] + { + id: user["id"], + name: "#{user['first_name']} #{user['last_name']}", + username: username, + website: user['website'], + email: email, + avatar_url: avatar_url, + custom_fields: user["custom_field_1"] ? { user_field_1: user["custom_field_1"] } : {}, + location: user["city"] && user["state"] ? "#{user['city']}, #{user['state']}" : nil, + created_at: user["created_at"], + last_seen_at: user["last_sign_in_at"], + post_create_action: proc do |u| + @old_username_to_new_usernames[user["username"]] = u.username + end + } + end + end + end + + def import_categories + puts "", "importing top level categories..." + + categories = mysql_query("SELECT categoryid, parentid, title, position FROM #{TABLE_PREFIX}categories ORDER BY categoryid").to_a + + top_level_categories = categories.select { |c| c["parentid"].nil? } + + create_categories(top_level_categories) do |category| + { + id: category["categoryid"], + name: @htmlentities.decode(category["title"]).strip, + position: category["position"] + } + end + + puts "", "importing children categories..." + + children_categories = categories.select { |c| !c["parentid"].nil? } + top_level_category_ids = Set.new(top_level_categories.map { |c| c["categoryid"] }) + + # cut down the tree to only 2 levels of categories + children_categories.each do |cc| + while !top_level_category_ids.include?(cc["parentid"]) + cc["parentid"] = categories.detect { |c| c["categoryid"] == cc["parentid"] }["parentid"] + end + end + + create_categories(children_categories) do |category| + { + id: category["categoryid"], + name: @htmlentities.decode(category["title"]).strip, + position: category["position"], + parent_category_id: category_id_from_imported_category_id(category["parentid"]) + } + end + end + + def import_topics + puts "", "importing topics..." + + topic_count = mysql_query("SELECT COUNT(postid) count FROM #{TABLE_PREFIX}posts WHERE type in ('Q', 'Q_HIDDEN')").first["count"] + + last_topic_id = -1 + + batches(BATCH_SIZE) do |offset| + topics = mysql_query(<<-SQL + SELECT p.postid, p.type, p.categoryid, p.closedbyid, p.userid postuserid, p.views, p.created, p.title, p.content raw + FROM #{TABLE_PREFIX}posts p + WHERE p.postid > #{last_topic_id} + and p.parentid IS NULL + and type IN ('Q', 'Q_HIDDEN') + ORDER BY p.postid + LIMIT #{BATCH_SIZE} + SQL + ).to_a + + break if topics.empty? + + last_topic_id = topics[-1]["postid"] + topics.reject! { |t| @lookup.post_already_imported?("thread-#{t["postid"]}") } + + create_posts(topics, total: topic_count, offset: offset) do |topic| + begin + raw = preprocess_post_raw(topic["raw"]) + rescue => e + puts e.message + end + + topic_id = "thread-#{topic["postid"]}" + t = { + id: topic_id, + user_id: user_id_from_imported_user_id(topic["postuserid"]) || Discourse::SYSTEM_USER_ID, + title: @htmlentities.decode(topic["title"]).strip[0...255], + category: category_id_from_imported_category_id(topic["categoryid"]), + raw: raw, + created_at: topic["created"], + visible: topic["closedbyid"].to_i == 0 && topic["type"] != 'Q_HIDDEN', + views: topic["views"], + } + t + end + + # uncomment below lines to create permalink + topics.each do |thread| + topic_id = "thread-#{thread["postid"]}" + topic = topic_lookup_from_imported_post_id(topic_id) + if topic.present? + title_slugified = slugify(thread["title"], false, 50) if thread["title"].present? + url_slug = "#{thread["postid"]}/#{title_slugified}" if thread["title"].present? + Permalink.create(url: url_slug, topic_id: topic[:topic_id].to_i) if url_slug.present? && topic[:topic_id].present? + end + end + + end + end + + def slugify(title, ascii_only, max_length) + words = title.downcase.gsub(/[^a-zA-Z0-9\s]/, '').split(" ") + word_lengths = {} + + words.each_with_index do |word, idx| + word_lengths[idx] = word.length + end + + remaining = max_length + if word_lengths.inject(0) { |sum, (_, v)| sum + v } > remaining + word_lengths = Hash[word_lengths.sort { |x, y| y[1] <=> x[1] }] + word_lengths.each do |idx, word_length| + if remaining > 0 + remaining -= word_length + else + words[idx] = nil + end + end + end + words = words.compact.join("-") + end + + def import_posts + puts "", "importing posts..." + + post_count = mysql_query(<<-SQL + SELECT COUNT(postid) count + FROM #{TABLE_PREFIX}posts p + WHERE p.parentid IS NOT NULL + SQL + ).first["count"] + + last_post_id = -1 + + batches(BATCH_SIZE) do |offset| + posts = mysql_query(<<-SQL + SELECT p.postid, p.type, p.parentid, p.categoryid, p.closedbyid, p.userid, p.views, p.created, p.title, p.content + FROM #{TABLE_PREFIX}posts p + WHERE p.parentid IS NOT NULL + AND p.postid > #{last_post_id} + AND type in ('A') + AND closedbyid IS NULL + ORDER BY p.postid + LIMIT #{BATCH_SIZE} + SQL + ).to_a + + break if posts.empty? + last_post_id = posts[-1]["postid"] + posts.reject! { |p| @lookup.post_already_imported?(p["postid"].to_i) } + + create_posts(posts, total: post_count, offset: offset) do |post| + begin + raw = preprocess_post_raw(post["content"]) + rescue => e + puts e.message + end + next if raw.blank? + next unless topic = topic_lookup_from_imported_post_id("thread-#{post["parentid"]}") + + p = { + id: post["postid"], + user_id: user_id_from_imported_user_id(post["userid"]) || Discourse::SYSTEM_USER_ID, + topic_id: topic[:topic_id], + raw: raw, + created_at: post["created"], + } + if parent = topic_lookup_from_imported_post_id(post["parentid"]) + p[:reply_to_post_number] = parent[:post_number] + end + p + end + end + end + + def import_likes + puts "", "importing likes..." + likes = mysql_query(<<-SQL + SELECT postid, userid + FROM #{TABLE_PREFIX}uservotes u + WHERE u.vote=1 + SQL + ).to_a + likes.each do |like| + post = Post.find_by(id: post_id_from_imported_post_id("thread-#{like['postid']}")) + user = User.find_by(id: user_id_from_imported_user_id(like["userid"])) + begin + PostAction.act(user, post, 2) if user && post + rescue => e + puts "error acting on post #{e}" + end + end + end + + def post_process_posts + puts "", "Postprocessing posts..." + + current = 0 + max = Post.count + + Post.find_each do |post| + begin + new_raw = postprocess_post_raw(post.raw) + if new_raw != post.raw + post.raw = new_raw + post.save + end + rescue PrettyText::JavaScriptError + nil + ensure + print_status(current += 1, max) + end + end + end + + def preprocess_post_raw(raw) + return "" if raw.blank? + + # decode HTML entities + raw = @htmlentities.decode(raw) + raw = ActionView::Base.full_sanitizer.sanitize raw + + # fix whitespaces + raw.gsub!(/(\\r)?\\n/, "\n") + raw.gsub!("\\t", "\t") + + raw.gsub!('
', "\n") + + # [HTML]...[/HTML] + raw.gsub!(/\[html\]/i, "\n```html\n") + raw.gsub!(/\[\/html\]/i, "\n```\n") + + # [PHP]...[/PHP] + raw.gsub!(/\[php\]/i, "\n```php\n") + raw.gsub!(/\[\/php\]/i, "\n```\n") + + # [HIGHLIGHT="..."] + raw.gsub!(/\[highlight="?(\w+)"?\]/i) { "\n```#{$1.downcase}\n" } + + # [CODE]...[/CODE] + # [HIGHLIGHT]...[/HIGHLIGHT] + raw.gsub!(/\[\/?code\]/i, "\n```\n") + raw.gsub!(/\[\/?highlight\]/i, "\n```\n") + + # [SAMP]...[/SAMP] + raw.gsub!(/\[\/?samp\]/i, "`") + + # replace all chevrons with HTML entities + # NOTE: must be done + # - AFTER all the "code" processing + # - BEFORE the "quote" processing + raw.gsub!(/`([^`]+)`/im) { "`" + $1.gsub("<", "\u2603") + "`" } + raw.gsub!("<", "<") + raw.gsub!("\u2603", "<") + + raw.gsub!(/`([^`]+)`/im) { "`" + $1.gsub(">", "\u2603") + "`" } + raw.gsub!(">", ">") + raw.gsub!("\u2603", ">") + + # [URL=...]...[/URL] + raw.gsub!(/\[url="?([^"]+?)"?\](.*?)\[\/url\]/im) { "[#{$2.strip}](#{$1})" } + raw.gsub!(/\[url="?(.+?)"?\](.+)\[\/url\]/im) { "[#{$2.strip}](#{$1})" } + + # [URL]...[/URL] + # [MP3]...[/MP3] + raw.gsub!(/\[\/?url\]/i, "") + raw.gsub!(/\[\/?mp3\]/i, "") + + # [MENTION][/MENTION] + raw.gsub!(/\[mention\](.+?)\[\/mention\]/i) do + old_username = $1 + if @old_username_to_new_usernames.has_key?(old_username) + old_username = @old_username_to_new_usernames[old_username] + end + "@#{old_username}" + end + + # [FONT=blah] and [COLOR=blah] + raw.gsub!(/\[FONT=.*?\](.*?)\[\/FONT\]/im, '\1') + raw.gsub!(/\[COLOR=.*?\](.*?)\[\/COLOR\]/im, '\1') + raw.gsub!(/\[COLOR=#.*?\](.*?)\[\/COLOR\]/im, '\1') + + raw.gsub!(/\[SIZE=.*?\](.*?)\[\/SIZE\]/im, '\1') + raw.gsub!(/\[h=.*?\](.*?)\[\/h\]/im, '\1') + + # [CENTER]...[/CENTER] + raw.gsub!(/\[CENTER\](.*?)\[\/CENTER\]/im, '\1') + + # [INDENT]...[/INDENT] + raw.gsub!(/\[INDENT\](.*?)\[\/INDENT\]/im, '\1') + raw.gsub!(/\[TABLE\](.*?)\[\/TABLE\]/im, '\1') + raw.gsub!(/\[TR\](.*?)\[\/TR\]/im, '\1') + raw.gsub!(/\[TD\](.*?)\[\/TD\]/im, '\1') + raw.gsub!(/\[TD="?.*?"?\](.*?)\[\/TD\]/im, '\1') + + # [QUOTE]...[/QUOTE] + raw.gsub!(/\[quote\](.+?)\[\/quote\]/im) { |quote| + quote.gsub!(/\[quote\](.+?)\[\/quote\]/im) { "\n#{$1}\n" } + quote.gsub!(/\n(.+?)/) { "\n> #{$1}" } + } + + # [QUOTE=]...[/QUOTE] + raw.gsub!(/\[quote=([^;\]]+)\](.+?)\[\/quote\]/im) do + old_username, quote = $1, $2 + if @old_username_to_new_usernames.has_key?(old_username) + old_username = @old_username_to_new_usernames[old_username] + end + "\n[quote=\"#{old_username}\"]\n#{quote}\n[/quote]\n" + end + + # [YOUTUBE][/YOUTUBE] + raw.gsub!(/\[youtube\](.+?)\[\/youtube\]/i) { "\n//youtu.be/#{$1}\n" } + + # [VIDEO=youtube;]...[/VIDEO] + raw.gsub!(/\[video=youtube;([^\]]+)\].*?\[\/video\]/i) { "\n//youtu.be/#{$1}\n" } + + # More Additions .... + + # [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler] + raw.gsub!(/\[spoiler="?(.+?)"?\](.+?)\[\/spoiler\]/im) { "\n#{$1}\n[spoiler]#{$2}[/spoiler]\n" } + + # [IMG][IMG]http://i63.tinypic.com/akga3r.jpg[/IMG][/IMG] + raw.gsub!(/\[IMG\]\[IMG\](.+?)\[\/IMG\]\[\/IMG\]/i) { "[IMG]#{$1}[/IMG]" } + + # convert list tags to ul and list=1 tags to ol + # (basically, we're only missing list=a here...) + # (https://meta.discourse.org/t/phpbb-3-importer-old/17397) + raw.gsub!(/\[list\](.*?)\[\/list\]/im, '[ul]\1[/ul]') + raw.gsub!(/\[list=1\](.*?)\[\/list\]/im, '[ol]\1[/ol]') + raw.gsub!(/\[list\](.*?)\[\/list:u\]/im, '[ul]\1[/ul]') + raw.gsub!(/\[list=1\](.*?)\[\/list:o\]/im, '[ol]\1[/ol]') + # convert *-tags to li-tags so bbcode-to-md can do its magic on phpBB's lists: + raw.gsub!(/\[\*\]\n/, '') + raw.gsub!(/\[\*\](.*?)\[\/\*:m\]/, '[li]\1[/li]') + raw.gsub!(/\[\*\](.*?)\n/, '[li]\1[/li]') + raw.gsub!(/\[\*=1\]/, '') + + raw.strip! + raw + end + + def postprocess_post_raw(raw) + # [QUOTE=;]...[/QUOTE] + raw.gsub!(/\[quote=([^;]+);(\d+)\](.+?)\[\/quote\]/im) do + old_username, post_id, quote = $1, $2, $3 + + if @old_username_to_new_usernames.has_key?(old_username) + old_username = @old_username_to_new_usernames[old_username] + end + + if topic_lookup = topic_lookup_from_imported_post_id(post_id) + post_number = topic_lookup[:post_number] + topic_id = topic_lookup[:topic_id] + "\n[quote=\"#{old_username},post:#{post_number},topic:#{topic_id}\"]\n#{quote}\n[/quote]\n" + else + "\n[quote=\"#{old_username}\"]\n#{quote}\n[/quote]\n" + end + end + + # remove attachments + raw.gsub!(/\[attach[^\]]*\]\d+\[\/attach\]/i, "") + + # [THREAD][/THREAD] + # ==> http://my.discourse.org/t/slug/ + raw.gsub!(/\[thread\](\d+)\[\/thread\]/i) do + thread_id = $1 + if topic_lookup = topic_lookup_from_imported_post_id("thread-#{thread_id}") + topic_lookup[:url] + else + $& + end + end + + # [THREAD=]...[/THREAD] + # ==> [...](http://my.discourse.org/t/slug/) + raw.gsub!(/\[thread=(\d+)\](.+?)\[\/thread\]/i) do + thread_id, link = $1, $2 + if topic_lookup = topic_lookup_from_imported_post_id("thread-#{thread_id}") + url = topic_lookup[:url] + "[#{link}](#{url})" + else + $& + end + end + + # [POST][/POST] + # ==> http://my.discourse.org/t/slug// + raw.gsub!(/\[post\](\d+)\[\/post\]/i) do + post_id = $1 + if topic_lookup = topic_lookup_from_imported_post_id(post_id) + topic_lookup[:url] + else + $& + end + end + + # [POST=]...[/POST] + # ==> [...](http://my.discourse.org/t///) + raw.gsub!(/\[post=(\d+)\](.+?)\[\/post\]/i) do + post_id, link = $1, $2 + if topic_lookup = topic_lookup_from_imported_post_id(post_id) + url = topic_lookup[:url] + "[#{link}](#{url})" + else + $& + end + end + + raw + end + + def create_permalinks + puts '', 'Creating Permalink File...', '' + #creates permalinks for q2a category links + Category.find_each do |category| + ccf = category.custom_fields + + if ccf && ccf["import_id"] + url = category.parent_category ? "#{category.parent_category.slug}/#{category.slug}" : category.slug + Permalink.create(url: url, category_id: category.id) rescue nil + end + end + end + + def parse_timestamp(timestamp) + Time.zone.at(@tz.utc_to_local(timestamp)) + end + + def fake_email + SecureRandom.hex << "@domain.com" + end + + def mysql_query(sql) + @client.query(sql, cache_rows: true) + end + +end + +ImportScripts::Question2Answer.new.perform diff --git a/script/import_scripts/smf1.rb b/script/import_scripts/smf1.rb index 858e98823f..7230450e0c 100644 --- a/script/import_scripts/smf1.rb +++ b/script/import_scripts/smf1.rb @@ -113,6 +113,7 @@ class ImportScripts::Smf1 < ImportScripts::Base , memberIP2 , is_activated , additionalGroups + , avatar , id_attach , attachmentType , filename @@ -167,7 +168,17 @@ class ImportScripts::Smf1 < ImportScripts::Base end # avatar - avatar_url = if u["attachmentType"] == 0 && u["id_attach"].present? + avatar_url = nil + + if u["avatar"].present? + if u["avatar"].start_with?("http") + avatar_url = u["avatar"] + elsif u["avatar"].start_with?("avatar_") + avatar_url = "#{FORUM_URL}/avatar-members/#{u["avatar"]}" + end + end + + avatar_url ||= if u["attachmentType"] == 0 && u["id_attach"].present? "#{FORUM_URL}/index.php?action=dlattach;attach=#{u["id_attach"]};type=avatar" elsif u["attachmentType"] == 1 && u["filename"].present? "#{FORUM_URL}/avatar-members/#{u["filename"]}" @@ -344,10 +355,10 @@ class ImportScripts::Smf1 < ImportScripts::Base post[:archetype] = Archetype.private_message post[:title] = title post[:target_usernames] = User.where(id: recipients).pluck(:username) - post[:post_create_action] = proc do |p| + post[:post_create_action] = proc do |action_post| @pm_mapping[users] ||= {} @pm_mapping[users][title] ||= [] - @pm_mapping[users][title] << p.topic_id + @pm_mapping[users][title] << action_post.topic_id end end @@ -402,7 +413,7 @@ class ImportScripts::Smf1 < ImportScripts::Base if upload = create_upload(post.user_id, path, u["filename"]) html = html_for_upload(upload, u["filename"]) - unless post.raw[html] + unless post.raw[html] || PostUpload.where(upload: upload, post: post).exists? post.raw += "\n\n#{html}\n\n" post.save PostUpload.create(upload: upload, post: post) @@ -459,8 +470,8 @@ class ImportScripts::Smf1 < ImportScripts::Base SQL ).each do |f| print_status(count += 1, total, get_start_time("feedbacks")) - next unless user_id_from = user_id_from_imported_user_id(f["id_member"]) - next unless user_id_to = user_id_from_imported_user_id(f["feedbackmember_id"]) + next unless user_id_from = user_id_from_imported_user_id(f["feedbackmember_id"]) + next unless user_id_to = user_id_from_imported_user_id(f["id_member"]) next unless user = User.find_by(id: user_id_to) feedbacks = user.custom_fields[FEEDBACKS] || [] @@ -550,8 +561,8 @@ class ImportScripts::Smf1 < ImportScripts::Base end IGNORED_BBCODE ||= %w{ - black blue center color email flash font glow green img iurl left list move - red right shadown size table time white + black blue center color email flash font glow green iurl left list move red + right shadown size table time white } def pre_process_raw(raw) @@ -560,7 +571,7 @@ class ImportScripts::Smf1 < ImportScripts::Base raw = @htmlentities.decode(raw) # [acronym] - raw.gsub!(/\[acronym=([^\]]+)\](.*?)\[\/acronym\]/im, %{#{$2}}) + raw.gsub!(/\[acronym=([^\]]+)\](.*?)\[\/acronym\]/im) { %{#{$2}} } # [br] raw.gsub!(/\[br\]/i, "\n") @@ -569,9 +580,9 @@ class ImportScripts::Smf1 < ImportScripts::Base raw.gsub!(/\[hr\]/i, "
") # [sub] - raw.gsub!(/\[sub\](.*?)\[\/sub\]/im, "#{$1}") + raw.gsub!(/\[sub\](.*?)\[\/sub\]/im) { "#{$1}" } # [sup] - raw.gsub!(/\[sup\](.*?)\[\/sup\]/im, "#{$1}") + raw.gsub!(/\[sup\](.*?)\[\/sup\]/im) { "#{$1}" } # [html] raw.gsub!(/\[html\]/i, "\n```html\n") @@ -595,13 +606,16 @@ class ImportScripts::Smf1 < ImportScripts::Base raw.gsub!(/\[\/ftp\]/i, "[/url]") # [me] - raw.gsub!(/\[me=([^\]]*)\](.*?)\[\/me\]/im, "_\\* #{$1} #{$2}_") + raw.gsub!(/\[me=([^\]]*)\](.*?)\[\/me\]/im) { "_\\* #{$1} #{$2}_" } # [li] - raw.gsub!(/\[li\](.*?)\[\/li\]/im, "- #{$1}") + raw.gsub!(/\[li\](.*?)\[\/li\]/im) { "- #{$1}" } + + # puts [img] on their own line + raw.gsub!(/\[img[^\]]*\](.*?)\[\/img\]/im) { "\n#{$1}\n" } # puts [youtube] on their own line - raw.gsub!(/\[youtube\](.*?)\[\/youtube\]/im, "\n#{$1}\n") + raw.gsub!(/\[youtube\](.*?)\[\/youtube\]/im) { "\n#{$1}\n" } IGNORED_BBCODE.each { |code| raw.gsub!(/\[#{code}[^\]]*\](.*?)\[\/#{code}\]/im, '\1') } @@ -626,6 +640,9 @@ class ImportScripts::Smf1 < ImportScripts::Base raw.gsub!(/Sent from .+? using \[url=.*?\].+?\[\/url\]/i, "") raw.gsub!(/Sent from .+? using .+?\z/i, "") + # clean URLs + raw.gsub!(/\[url=(.+?)\]\1\[\/url\]/i, '\1') + raw end diff --git a/script/import_scripts/smf2.rb b/script/import_scripts/smf2.rb index 5dc36d4453..354a69ce48 100644 --- a/script/import_scripts/smf2.rb +++ b/script/import_scripts/smf2.rb @@ -201,15 +201,17 @@ class ImportScripts::Smf2 < ImportScripts::Base SQL skip = false ignore_quotes = false + post = { id: message[:id_msg], user_id: user_id_from_imported_user_id(message[:id_member]) || -1, created_at: Time.zone.at(message[:poster_time]), - post_create_action: ignore_quotes && proc do |post| - post.custom_fields['import_rebake'] = 't' - post.save + post_create_action: ignore_quotes && proc do |p| + p.custom_fields['import_rebake'] = 't' + p.save end } + if message[:id_msg] == message[:id_first_msg] post[:category] = category_id_from_imported_category_id(message[:id_board]) post[:title] = decode_entities(message[:subject]) diff --git a/script/import_scripts/socialcast/socialcast_message.rb b/script/import_scripts/socialcast/socialcast_message.rb index a82149f2ab..e121c5695d 100644 --- a/script/import_scripts/socialcast/socialcast_message.rb +++ b/script/import_scripts/socialcast/socialcast_message.rb @@ -18,81 +18,81 @@ class SocialcastMessage } } - def initialize(message_json) - @parsed_json = JSON.parse message_json - end + def initialize(message_json) + @parsed_json = JSON.parse message_json + end - def topic - topic = {} - topic[:id] = @parsed_json['id'] - topic[:author_id] = @parsed_json['user']['id'] - topic[:title] = title - topic[:raw] = @parsed_json['body'] - topic[:created_at] = Time.parse @parsed_json['created_at'] - topic[:tags] = tags - topic[:category] = category - topic - end + def topic + topic = {} + topic[:id] = @parsed_json['id'] + topic[:author_id] = @parsed_json['user']['id'] + topic[:title] = title + topic[:raw] = @parsed_json['body'] + topic[:created_at] = Time.parse @parsed_json['created_at'] + topic[:tags] = tags + topic[:category] = category + topic + end - def title - CreateTitle.from_body @parsed_json['body'] - end + def title + CreateTitle.from_body @parsed_json['body'] + end - def tags - tags = [] - if group - if TAGS_AND_CATEGORIES[group] - tags = TAGS_AND_CATEGORIES[group][:tags] - else - tags << group - end - end - tags << DEFAULT_TAG - tags - end + def tags + tags = [] + if group + if TAGS_AND_CATEGORIES[group] + tags = TAGS_AND_CATEGORIES[group][:tags] + else + tags << group + end + end + tags << DEFAULT_TAG + tags + end - def category - category = DEFAULT_CATEGORY - if group && TAGS_AND_CATEGORIES[group] - category = TAGS_AND_CATEGORIES[group][:category] - end - category - end + def category + category = DEFAULT_CATEGORY + if group && TAGS_AND_CATEGORIES[group] + category = TAGS_AND_CATEGORIES[group][:category] + end + category + end - def group - @parsed_json['group']['groupname'].downcase if @parsed_json['group'] && @parsed_json['group']['groupname'] - end + def group + @parsed_json['group']['groupname'].downcase if @parsed_json['group'] && @parsed_json['group']['groupname'] + end - def url - @parsed_json['url'] - end + def url + @parsed_json['url'] + end - def message_type - @parsed_json['message_type'] - end + def message_type + @parsed_json['message_type'] + end - def replies - posts = [] - comments = @parsed_json['comments'] - comments.each do |comment| - posts << post_from_comment(comment) - end - posts - end + def replies + posts = [] + comments = @parsed_json['comments'] + comments.each do |comment| + posts << post_from_comment(comment) + end + posts + end - def post_from_comment(comment) - post = {} - post[:id] = comment['id'] - post[:author_id] = comment['user']['id'] - post[:raw] = comment['text'] - post[:created_at] = Time.parse comment['created_at'] - post - end + def post_from_comment(comment) + post = {} + post[:id] = comment['id'] + post[:author_id] = comment['user']['id'] + post[:raw] = comment['text'] + post[:created_at] = Time.parse comment['created_at'] + post + end - private + private - def unescape(html) - return nil unless html - CGI.unescapeHTML html - end + def unescape(html) + return nil unless html + CGI.unescapeHTML html + end end diff --git a/script/import_scripts/socialcast/socialcast_user.rb b/script/import_scripts/socialcast/socialcast_user.rb index 54107b4636..fb4217318c 100644 --- a/script/import_scripts/socialcast/socialcast_user.rb +++ b/script/import_scripts/socialcast/socialcast_user.rb @@ -8,17 +8,17 @@ class SocialcastUser @parsed_json = JSON.parse user_json end - def user - email = @parsed_json['contact_info']['email'] - email = "#{@parsed_json['id']}@noemail.com" unless email + def user + email = @parsed_json['contact_info']['email'] + email = "#{@parsed_json['id']}@noemail.com" unless email - user = {} - user[:id] = @parsed_json['id'] - user[:name] = @parsed_json['name'] - user[:username] = @parsed_json['username'] - user[:email] = email - user[:staged] = true - user - end + user = {} + user[:id] = @parsed_json['id'] + user[:name] = @parsed_json['name'] + user[:username] = @parsed_json['username'] + user[:email] = email + user[:staged] = true + user + end end diff --git a/script/import_scripts/stack_overflow.rb b/script/import_scripts/stack_overflow.rb new file mode 100644 index 0000000000..06754fa0b2 --- /dev/null +++ b/script/import_scripts/stack_overflow.rb @@ -0,0 +1,255 @@ +# cf. https://github.com/rails-sqlserver/tiny_tds#install +require "tiny_tds" +require File.expand_path(File.dirname(__FILE__) + "/base.rb") + +class ImportScripts::StackOverflow < ImportScripts::Base + + BATCH_SIZE ||= 1000 + + def initialize + super + + @client = TinyTds::Client.new( + host: ENV["DB_HOST"], + username: ENV["DB_USERNAME"], + password: ENV["DB_PASSWORD"], + database: ENV["DB_NAME"], + ) + end + + def execute + SiteSetting.tagging_enabled = true + + # TODO: import_groups + import_users + import_posts + import_likes + mark_topics_as_solved + end + + def import_users + puts "", "Importing users..." + + last_user_id = -1 + total = query("SELECT COUNT(*) count FROM Users WHERE Id > 0").first["count"] + + batches(BATCH_SIZE) do |offset| + users = query(<<~SQL + SELECT TOP #{BATCH_SIZE} + Id + , UserTypeId + , CreationDate + , LastLoginDate + , LastLoginIP + , Email + , DisplayName + , WebsiteUrl + , RealName + , Location + , Birthday + , ProfileImageUrl + FROM Users + WHERE Id > 0 + AND Id > #{last_user_id} + ORDER BY Id + SQL + ).to_a + + break if users.empty? + + last_user_id = users[-1]["Id"] + user_ids = users.map { |u| u["Id"] } + + next if all_records_exist?(:users, user_ids) + + create_users(users, total: total, offset: offset) do |u| + { + id: u["Id"], + admin: u["UserTypeId"] == 4, + created_at: u["CreationDate"], + last_seen_at: u["LastLoginDate"], + ip_address: u["LastLoginIP"], + email: u["Email"], + username: u["DisplayName"], + website: u["WebsiteUrl"], + name: u["RealName"], + location: u["Location"], + date_of_birth: u["Birthday"], + post_create_action: proc do |user| + if u["ProfileImageUrl"].present? + UserAvatar.import_url_for_user(u["ProfileImageUrl"], user) rescue nil + end + end + } + end + end + end + + def import_posts + puts "", "Importing posts..." + + last_post_id = -1 + total = query("SELECT COUNT(*) count FROM Posts WHERE PostTypeId IN (1,2,3)").first["count"] + + query("SELECT COUNT(*) count FROM PostComments WHERE PostId IN (SELECT Id FROM Posts WHERE PostTypeId IN (1,2,3))").first["count"] + + batches(BATCH_SIZE) do |offset| + posts = query(<<~SQL + SELECT TOP #{BATCH_SIZE} + Id + , PostTypeId + , CreationDate + , Body + , OwnerUserId AS UserId + , Title + , Tags + , DeletionDate + , ParentId + , IsAcceptedAnswer + , CASE WHEN (ClosedDate IS NOT NULL OR LockedDate IS NOT NULL) THEN 1 ELSE 0 END AS Closed + FROM Posts + WHERE PostTypeId IN (1,2,3) + AND Id > #{last_post_id} + ORDER BY Id + SQL + ).to_a + + break if posts.empty? + + last_post_id = posts[-1]["Id"] + post_ids = posts.map { |p| p["Id"] } + + comments = query(<<~SQL + SELECT CONCAT('Comment-', Id) AS Id + , PostId AS ParentId + , Text + , CreationDate + , UserId + FROM PostComments + WHERE PostId IN (#{post_ids.join(",")}) + ORDER BY Id + SQL + ).to_a + + posts_and_comments = (posts + comments).sort_by { |p| p["CreationDate"] } + post_and_comment_ids = posts_and_comments.map { |p| p["Id"] } + + next if all_records_exist?(:posts, post_and_comment_ids) + + create_posts(posts_and_comments, total: total, offset: offset) do |p| + raw = p["Body"].present? ? HtmlToMarkdown.new(p["Body"]).to_markdown : p["Text"] + + post = { + id: p["Id"], + created_at: p["CreationDate"], + raw: raw, + user_id: user_id_from_imported_user_id(p["UserId"]) || -1, + } + + if p["Title"].present? + post[:wiki] = p["PostTypeId"] = 3 + post[:title] = p["Title"] + post[:tags] = p["Tags"].split("|") + post[:deleted_at] = p["DeletionDate"] + post[:closed] = p["Closed"] == 1 + elsif t = topic_lookup_from_imported_post_id(p["ParentId"]) + post[:custom_fields] = { is_accepted_answer: true } if p["IsAcceptedAnswer"] + post[:topic_id] = t[:topic_id] + post[:reply_to_post_number] = t[:post_number] + else + puts "", "", "#{p["Id"]} was not imported", "", "" + next + end + + post + end + end + end + + LIKE ||= PostActionType.types[:like] + + def import_likes + puts "", "Importing post likes..." + + last_like_id = -1 + + batches(BATCH_SIZE) do |offset| + likes = query(<<~SQL + SELECT TOP #{BATCH_SIZE} + Id + , PostId + , UserId + , CreationDate + FROM Posts2Votes + WHERE VoteTypeId = 2 + AND DeletionDate IS NULL + AND Id > #{last_like_id} + ORDER BY Id + SQL + ).to_a + + break if likes.empty? + + last_like_id = likes[-1]["Id"] + + likes.each do |l| + next unless user_id = user_id_from_imported_user_id(l["UserId"]) + next unless post_id = post_id_from_imported_post_id(l["PostId"]) + next unless user = User.find_by(id: user_id) + next unless post = Post.find_by(id: post_id) + PostAction.act(user, post, LIKE) rescue nil + end + end + + puts "", "Importing comment likes..." + + last_like_id = -1 + total = query("SELECT COUNT(*) count FROM Comments2Votes WHERE VoteTypeId = 2 AND DeletionDate IS NULL").first["count"] + + batches(BATCH_SIZE) do |offset| + likes = query(<<~SQL + SELECT TOP #{BATCH_SIZE} + Id + , CONCAT('Comment-', PostCommentId) AS PostCommentId + , UserId + , CreationDate + FROM Comments2Votes + WHERE VoteTypeId = 2 + AND DeletionDate IS NULL + AND Id > #{last_like_id} + ORDER BY Id + SQL + ).to_a + + break if likes.empty? + + last_like_id = likes[-1]["Id"] + + likes.each do |l| + next unless user_id = user_id_from_imported_user_id(l["UserId"]) + next unless post_id = post_id_from_imported_post_id(l["PostCommentId"]) + next unless user = User.find_by(id: user_id) + next unless post = Post.find_by(id: post_id) + PostAction.act(user, post, LIKE) rescue nil + end + end + end + + def mark_topics_as_solved + puts "", "Marking topics as solved..." + + DB.exec <<~SQL + INSERT INTO topic_custom_fields (name, value, topic_id, created_at, updated_at) + SELECT 'accepted_answer_post_id', pcf.post_id, p.topic_id, p.created_at, p.created_at + FROM post_custom_fields pcf + JOIN posts p ON p.id = pcf.post_id + WHERE pcf.name = 'is_accepted_answer' + SQL + end + + def query(sql) + @client.execute(sql) + end + +end + +ImportScripts::StackOverflow.new.perform diff --git a/script/import_scripts/telligent.rb b/script/import_scripts/telligent.rb new file mode 100644 index 0000000000..7981e1d5ca --- /dev/null +++ b/script/import_scripts/telligent.rb @@ -0,0 +1,492 @@ +require_relative 'base' +require 'tiny_tds' + +# Import script for Telligent communities +# +# Users are currently imported from a temp table. This will need some +# work the next time this import script is used, because that table +# won't exist. Also, it's really hard to find all attachments, but +# the script tries to do it anyway. + +class ImportScripts::Telligent < ImportScripts::Base + BATCH_SIZE ||= 1000 + LOCAL_AVATAR_REGEX ||= /\A~\/.*(?communityserver-components-(?:selectable)?avatars)\/(?[^\/]+)\/(?.+)/i + REMOTE_AVATAR_REGEX ||= /\Ahttps?:\/\//i + EMBEDDED_ATTACHMENT_REGEX ||= /(?.*?)<\/a>/i + + CATEGORY_LINK_NORMALIZATION = '/.*?(f\/\d+)$/\1' + TOPIC_LINK_NORMALIZATION = '/.*?(f\/\d+\/t\/\d+)$/\1' + + def initialize + super() + + @client = TinyTds::Client.new( + host: ENV["DB_HOST"], + username: ENV["DB_USERNAME"], + password: ENV["DB_PASSWORD"], + database: ENV["DB_NAME"] + ) + end + + def execute + add_permalink_normalizations + import_users + import_categories + import_topics + import_posts + mark_topics_as_solved + end + + def import_users + puts "", "Importing users..." + + user_conditions = <<~SQL + ( + EXISTS(SELECT 1 + FROM te_Forum_Threads t + WHERE t.UserId = u.UserID) OR + EXISTS(SELECT 1 + FROM te_Forum_ThreadReplies r + WHERE r.UserId = u.UserID) + ) + SQL + + last_user_id = -1 + total_count = count(<<~SQL) + SELECT COUNT(1) AS count + FROM temp_User u + WHERE #{user_conditions} + SQL + + batches do |offset| + rows = query(<<~SQL) + SELECT TOP #{BATCH_SIZE} * + FROM + ( + SELECT + u.UserID, + u.Email, + u.UserName, + u.CommonName, + u.CreateDate, + p.PropertyName, + p.PropertyValue + FROM temp_User u + LEFT OUTER JOIN temp_UserProperties p ON (u.UserID = p.UserID) + WHERE u.UserID > #{last_user_id} AND #{user_conditions} + ) x + PIVOT ( + MAX(PropertyValue) + FOR PropertyName + IN (avatarUrl, bio, Location, webAddress, BannedUntil, UserBanReason) + ) y + ORDER BY UserID + SQL + + break if rows.blank? + last_user_id = rows[-1]["UserID"] + next if all_records_exist?(:users, rows.map { |row| row["UserID"] }) + + create_users(rows, total: total_count, offset: offset) do |row| + { + id: row["UserID"], + email: row["Email"], + username: row["UserName"], + name: row["CommonName"], + created_at: row["CreateDate"], + bio_raw: html_to_markdown(row["bio"]), + location: row["Location"], + website: row["webAddress"], + post_create_action: proc do |user| + import_avatar(user, row["avatarUrl"]) + suspend_user(user, row["BannedUntil"], row["UserBanReason"]) + end + } + end + end + end + + # TODO move into base importer (create_user) and use consistent error handling + def import_avatar(user, avatar_url) + return if avatar_url.blank? || avatar_url.include?("anonymous") + + if match_data = avatar_url.match(LOCAL_AVATAR_REGEX) + avatar_path = File.join(ENV["FILE_BASE_DIR"], + match_data[:directory].gsub("-", "."), + match_data[:path].split("-"), + match_data[:filename]) + + if File.exists?(avatar_path) + @uploader.create_avatar(user, avatar_path) + else + STDERR.puts "Could not find avatar: #{avatar_path}" + end + elsif avatar_url.match?(REMOTE_AVATAR_REGEX) + UserAvatar.import_url_for_user(avatar_url, user) rescue nil + end + end + + def suspend_user(user, banned_until, ban_reason) + return if banned_until.blank? + + if banned_until = DateTime.parse(banned_until) > DateTime.now + user.suspended_till = banned_until + user.suspended_at = DateTime.now + user.save! + + StaffActionLogger.new(Discourse.system_user).log_user_suspend(user, ban_reason) + end + end + + def import_categories + @new_parent_categories = {} + @new_parent_categories[:archives] = create_category({ name: "Archives" }, nil) + @new_parent_categories[:spotlight] = create_category({ name: "Spotlight" }, nil) + @new_parent_categories[:optimizer] = create_category({ name: "SQL Optimizer" }, nil) + + puts "", "Importing parent categories..." + parent_categories = query(<<~SQL) + SELECT + GroupID, + Name, HtmlDescription, + DateCreated, SortOrder + FROM cs_Groups g + WHERE (SELECT COUNT(1) + FROM te_Forum_Forums f + WHERE f.GroupId = g.GroupID) > 1 + ORDER BY SortOrder, Name + SQL + + create_categories(parent_categories) do |row| + { + id: "G#{row['GroupID']}", + name: clean_category_name(row["Name"]), + description: html_to_markdown(row["HtmlDescription"]), + position: row["SortOrder"] + } + end + + puts "", "Importing child categories..." + child_categories = query(<<~SQL) + SELECT + ForumId, GroupId, + Name, Description, + DateCreated, SortOrder + FROM te_Forum_Forums + ORDER BY GroupId, SortOrder, Name + SQL + + create_categories(child_categories) do |row| + parent_category_id = parent_category_id_for(row) + + if category_id = replace_with_category_id(row, child_categories, parent_category_id) + add_category(row['ForumId'], Category.find_by_id(category_id)) + url = "f/#{row['ForumId']}" + Permalink.create(url: url, category_id: category_id) unless Permalink.exists?(url: url) + nil + else + { + id: row['ForumId'], + parent_category_id: parent_category_id, + name: clean_category_name(row["Name"]), + description: html_to_markdown(row["Description"]), + position: row["SortOrder"] + } + end + end + end + + def parent_category_id_for(row) + name = row["Name"].downcase + + if name.include?("beta") + @new_parent_categories[:archives].id + elsif name.include?("spotlight") + @new_parent_categories[:spotlight].id + elsif name.include?("optimizer") + @new_parent_categories[:optimizer].id + elsif row.key?("GroupId") + category_id_from_imported_category_id("G#{row['GroupId']}") + else + nil + end + end + + def replace_with_category_id(row, child_categories, parent_category_id) + name = row["Name"].downcase + + if name.include?("data modeler") || name.include?("benchmark") + category_id_from_imported_category_id("G#{row['GroupId']}") + elsif only_child?(child_categories, parent_category_id) + parent_category_id + end + end + + def only_child?(child_categories, parent_category_id) + count = 0 + + child_categories.each do |row| + count += 1 if parent_category_id_for(row) == parent_category_id + end + + count == 1 + end + + def clean_category_name(name) + CGI.unescapeHTML(name) + .sub(/(?:\- )?Forum/i, "") + .strip + end + + def import_topics + puts "", "Importing topics..." + + last_topic_id = -1 + total_count = count("SELECT COUNT(1) AS count FROM te_Forum_Threads") + + batches do |offset| + rows = query(<<~SQL) + SELECT TOP #{BATCH_SIZE} + t.ThreadId, t.ForumId, t.UserId, + t.Subject, t.Body, t.DateCreated, t.IsLocked, t.StickyDate, + a.ApplicationTypeId, a.ApplicationId, a.ApplicationContentTypeId, a.ContentId, a.FileName + FROM te_Forum_Threads t + LEFT JOIN te_Attachments a + ON (a.ApplicationId = t.ForumId AND a.ApplicationTypeId = 0 AND a.ContentId = t.ThreadId AND + a.ApplicationContentTypeId = 0) + WHERE t.ThreadId > #{last_topic_id} + ORDER BY t.ThreadId + SQL + + break if rows.blank? + last_topic_id = rows[-1]["ThreadId"] + next if all_records_exist?(:post, rows.map { |row| import_topic_id(row["ThreadId"]) }) + + create_posts(rows, total: total_count, offset: offset) do |row| + user_id = user_id_from_imported_user_id(row["UserId"]) || Discourse::SYSTEM_USER_ID + + post = { + id: import_topic_id(row["ThreadId"]), + title: CGI.unescapeHTML(row["Subject"]), + raw: raw_with_attachment(row, user_id), + category: category_id_from_imported_category_id(row["ForumId"]), + user_id: user_id, + created_at: row["DateCreated"], + closed: row["IsLocked"], + post_create_action: proc do |action_post| + topic = action_post.topic + Jobs.enqueue_at(topic.pinned_until, :unpin_topic, topic_id: topic.id) if topic.pinned_until + url = "f/#{row['ForumId']}/t/#{row['ThreadId']}" + Permalink.create(url: url, topic_id: topic.id) unless Permalink.exists?(url: url) + end + } + + if row["StickyDate"] > Time.now + post[:pinned_until] = row["StickyDate"] + post[:pinned_at] = row["DateCreated"] + end + + post + end + end + end + + def import_topic_id(topic_id) + "T#{topic_id}" + end + + def import_posts + puts "", "Importing posts..." + + last_post_id = -1 + total_count = count("SELECT COUNT(1) AS count FROM te_Forum_ThreadReplies") + + batches do |offset| + rows = query(<<~SQL) + SELECT TOP #{BATCH_SIZE} + tr.ThreadReplyId, tr.ThreadId, tr.UserId, tr.ParentReplyId, + tr.Body, tr.ThreadReplyDate, + CONVERT(BIT, + CASE WHEN tr.AnswerVerifiedUtcDate IS NOT NULL AND NOT EXISTS( + SELECT 1 + FROM te_Forum_ThreadReplies x + WHERE + x.ThreadId = tr.ThreadId AND x.ThreadReplyId < tr.ThreadReplyId AND x.AnswerVerifiedUtcDate IS NOT NULL + ) + THEN 1 + ELSE 0 END) AS IsFirstVerifiedAnswer, + a.ApplicationTypeId, a.ApplicationId, a.ApplicationContentTypeId, a.ContentId, a.FileName + FROM te_Forum_ThreadReplies tr + JOIN te_Forum_Threads t ON (tr.ThreadId = t.ThreadId) + LEFT JOIN te_Attachments a + ON (a.ApplicationId = t.ForumId AND a.ApplicationTypeId = 0 AND a.ContentId = tr.ThreadReplyId AND + a.ApplicationContentTypeId = 1) + WHERE tr.ThreadReplyId > #{last_post_id} + ORDER BY tr.ThreadReplyId + SQL + + break if rows.blank? + last_post_id = rows[-1]["ThreadReplyId"] + next if all_records_exist?(:post, rows.map { |row| row["ThreadReplyId"] }) + + create_posts(rows, total: total_count, offset: offset) do |row| + imported_parent_id = row["ParentReplyId"] > 0 ? row["ParentReplyId"] : import_topic_id(row["ThreadId"]) + parent_post = topic_lookup_from_imported_post_id(imported_parent_id) + user_id = user_id_from_imported_user_id(row["UserId"]) || Discourse::SYSTEM_USER_ID + + if parent_post + post = { + id: row["ThreadReplyId"], + raw: raw_with_attachment(row, user_id), + user_id: user_id, + topic_id: parent_post[:topic_id], + created_at: row["ThreadReplyDate"], + reply_to_post_number: parent_post[:post_number] + } + + post[:custom_fields] = { is_accepted_answer: "true" } if row["IsFirstVerifiedAnswer"] + post + else + puts "Failed to import post #{row['ThreadReplyId']}. Parent was not found." + end + end + end + end + + def raw_with_attachment(row, user_id) + raw, embedded_paths, upload_ids = replace_embedded_attachments(row["Body"], user_id) + raw = html_to_markdown(raw) || "" + + filename = row["FileName"] + return raw if filename.blank? + + path = File.join( + ENV["FILE_BASE_DIR"], + "telligent.evolution.components.attachments", + "%02d" % row["ApplicationTypeId"], + "%02d" % row["ApplicationId"], + "%02d" % row["ApplicationContentTypeId"], + ("%010d" % row["ContentId"]).scan(/.{2}/), + clean_filename(filename) + ) + + unless embedded_paths.include?(path) + if File.exists?(path) + upload = @uploader.create_upload(user_id, path, filename) + + if upload.present? && upload.persisted? && !upload_ids.include?(upload.id) + raw << "\n" << @uploader.html_for_upload(upload, filename) + end + else + STDERR.puts "Could not find file: #{path}" + end + end + + raw + end + + def replace_embedded_attachments(raw, user_id) + paths = [] + upload_ids = [] + + raw = raw.gsub(EMBEDDED_ATTACHMENT_REGEX) do + filename, path = attachment_path(Regexp.last_match) + + if File.exists?(path) + upload = @uploader.create_upload(user_id, path, filename) + + if upload.present? && upload.persisted? + paths << path + upload_ids << upload.id + @uploader.html_for_upload(upload, filename) + end + else + STDERR.puts "Could not find file: #{path}" + end + end + + [raw, paths, upload_ids] + end + + def clean_filename(filename) + CGI.unescapeHTML(filename) + .gsub(/[\x00\/\\:\*\?\"<>\|]/, '_') + .gsub(/_(?:2B00|2E00|2D00|5B00|5D00|5F00)/, '') + end + + def attachment_path(match_data) + filename, path = join_attachment_path(match_data, filename_index: 2) + filename, path = join_attachment_path(match_data, filename_index: 1) unless File.exists?(path) + [filename, path] + end + + # filenames are a total mess - try to guess the correct filename + # works for 70% of all files + def join_attachment_path(match_data, filename_index:) + filename = clean_filename(match_data[:"filename#{filename_index}"]) + base_path = File.join( + ENV["FILE_BASE_DIR"], + match_data[:directory].gsub("-", "."), + match_data[:path].split("-") + ) + + path = File.join(base_path, filename) + return [filename, path] if File.exists?(path) + + original_filename = filename.dup + + filename = filename.gsub("-", " ") + path = File.join(base_path, filename) + return [filename, path] if File.exists?(path) + + filename = filename.gsub("_", "-") + path = File.join(base_path, filename) + return [filename, path] if File.exists?(path) + + [original_filename, File.join(base_path, original_filename)] + end + + def mark_topics_as_solved + puts "", "Marking topics as solved..." + + DB.exec <<~SQL + INSERT INTO topic_custom_fields (name, value, topic_id, created_at, updated_at) + SELECT 'accepted_answer_post_id', pcf.post_id, p.topic_id, p.created_at, p.created_at + FROM post_custom_fields pcf + JOIN posts p ON p.id = pcf.post_id + WHERE pcf.name = 'is_accepted_answer' AND pcf.value = 'true' + SQL + end + + def html_to_markdown(html) + HtmlToMarkdown.new(html).to_markdown if html.present? + end + + def add_permalink_normalizations + normalizations = SiteSetting.permalink_normalizations + normalizations = normalizations.blank? ? [] : normalizations.split('|') + + add_normalization(normalizations, CATEGORY_LINK_NORMALIZATION) + add_normalization(normalizations, TOPIC_LINK_NORMALIZATION) + + SiteSetting.permalink_normalizations = normalizations.join('|') + end + + def add_normalization(normalizations, normalization) + normalizations << normalization unless normalizations.include?(normalization) + end + + def batches + super(BATCH_SIZE) + end + + def query(sql) + @client.execute(sql).to_a + end + + def count(sql) + query(sql).first["count"] + end +end + +ImportScripts::Telligent.new.perform diff --git a/script/import_scripts/vanilla.rb b/script/import_scripts/vanilla.rb index 9471290559..0a9b057eec 100644 --- a/script/import_scripts/vanilla.rb +++ b/script/import_scripts/vanilla.rb @@ -28,226 +28,226 @@ class ImportScripts::Vanilla < ImportScripts::Base private - def check_file_exist - raise ArgumentError.new("File does not exist: #{@vanilla_file}") unless File.exist?(@vanilla_file) - end + def check_file_exist + raise ArgumentError.new("File does not exist: #{@vanilla_file}") unless File.exist?(@vanilla_file) + end - def parse_file - puts "parsing file..." - file = read_file + def parse_file + puts "parsing file..." + file = read_file - # TODO: parse header & validate version number - header = file.readline + # TODO: parse header & validate version number + header = file.readline - until file.eof? - line = file.readline - next if line.blank? - next if line.start_with?("//") + until file.eof? + line = file.readline + next if line.blank? + next if line.start_with?("//") - if m = /^Table: (\w+)/.match(line) - # extract table name - table = m[1].underscore.pluralize - # read the data until an empty line - data = [] - # first line is the table definition, turn that into a proper csv header - data << file.readline.split(",").map { |c| c.split(":")[0].underscore }.join(",") - until (line = file.readline).blank? - data << line.strip - end - # PERF: don't parse useless tables - useless_tables = ["user_meta"] - useless_tables << "activities" unless @use_lastest_activity_as_user_bio - next if useless_tables.include?(table) - # parse the data - puts "parsing #{table}..." - parsed_data = CSV.parse(data.join("\n"), headers: true, header_converters: :symbol).map { |row| row.to_hash } - instance_variable_set("@#{table}".to_sym, parsed_data) + if m = /^Table: (\w+)/.match(line) + # extract table name + table = m[1].underscore.pluralize + # read the data until an empty line + data = [] + # first line is the table definition, turn that into a proper csv header + data << file.readline.split(",").map { |c| c.split(":")[0].underscore }.join(",") + until (line = file.readline).blank? + data << line.strip end + # PERF: don't parse useless tables + useless_tables = ["user_meta"] + useless_tables << "activities" unless @use_lastest_activity_as_user_bio + next if useless_tables.include?(table) + # parse the data + puts "parsing #{table}..." + parsed_data = CSV.parse(data.join("\n"), headers: true, header_converters: :symbol).map { |row| row.to_hash } + instance_variable_set("@#{table}".to_sym, parsed_data) end end + end - def read_file - puts "reading file..." - string = File.read(@vanilla_file).gsub("\\N", "") - .gsub(/\\$\n/m, "\\n") - .gsub("\\,", ",") - .gsub(/(? 0 - puts "", "importing first-level categories..." - create_categories(first_level_categories) { |category| import_category(category) } - - # adds other categories - second_level_categories = @categories.select { |c| c[:parent_category_id] != "-1" } - if second_level_categories.count > 0 - puts "", "importing second-level categories..." - create_categories(second_level_categories) { |category| import_category(category) } - end - end - end - - def import_category(category) - c = { - id: category[:category_id], - name: category[:name], - user_id: user_id_from_imported_user_id(category[:insert_user_id]) || Discourse::SYSTEM_USER_ID, - position: category[:sort].to_i, - created_at: parse_category_date(category[:date_inserted]), - description: clean_up(category[:description]), + u = { + id: user[:user_id], + email: user[:email], + username: user[:name], + created_at: parse_date(user[:date_inserted]), + bio_raw: clean_up(bio_raw), + avatar_url: user[:photo], + moderator: @user_roles.select { |ur| ur[:user_id] == user[:user_id] }.map { |ur| ur[:role_id] }.include?(moderator_role_id), + admin: @user_roles.select { |ur| ur[:user_id] == user[:user_id] }.map { |ur| ur[:role_id] }.include?(admin_role_id), } - if category[:parent_category_id] != "-1" - c[:parent_category_id] = category_id_from_imported_category_id(category[:parent_category_id]) - end - c + + u end + end - def parse_category_date(date) - date == "0000-00-00 00:00:00" ? @root_category_created_at : parse_date(date) - end + def import_categories + puts "", "importing categories..." - def import_topics - puts "", "importing topics..." + # save some information about the root category + @root_category = @categories.select { |c| c[:category_id] == "-1" }.first + @root_category_created_at = parse_date(@root_category[:date_inserted]) - create_posts(@discussions) do |discussion| - { - id: "discussion#" + discussion[:discussion_id], - user_id: user_id_from_imported_user_id(discussion[:insert_user_id]) || Discourse::SYSTEM_USER_ID, - title: discussion[:name], - category: category_id_from_imported_category_id(discussion[:category_id]), - raw: clean_up(discussion[:body]), - created_at: parse_date(discussion[:date_inserted]), - } + # removes root category + @categories.reject! { |c| c[:category_id] == "-1" } + + # adds root's child categories + first_level_categories = @categories.select { |c| c[:parent_category_id] == "-1" } + if first_level_categories.count > 0 + puts "", "importing first-level categories..." + create_categories(first_level_categories) { |category| import_category(category) } + + # adds other categories + second_level_categories = @categories.select { |c| c[:parent_category_id] != "-1" } + if second_level_categories.count > 0 + puts "", "importing second-level categories..." + create_categories(second_level_categories) { |category| import_category(category) } end end + end - def import_posts - puts "", "importing posts..." - - create_posts(@comments) do |comment| - next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id]) - - { - id: "comment#" + comment[:comment_id], - user_id: user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID, - topic_id: t[:topic_id], - raw: clean_up(comment[:body]), - created_at: parse_date(comment[:date_inserted]), - } - end + def import_category(category) + c = { + id: category[:category_id], + name: category[:name], + user_id: user_id_from_imported_user_id(category[:insert_user_id]) || Discourse::SYSTEM_USER_ID, + position: category[:sort].to_i, + created_at: parse_category_date(category[:date_inserted]), + description: clean_up(category[:description]), + } + if category[:parent_category_id] != "-1" + c[:parent_category_id] = category_id_from_imported_category_id(category[:parent_category_id]) end + c + end - def import_private_topics - puts "", "importing private topics..." + def parse_category_date(date) + date == "0000-00-00 00:00:00" ? @root_category_created_at : parse_date(date) + end - create_posts(@conversations) do |conversation| - next if conversation[:first_message_id].blank? + def import_topics + puts "", "importing topics..." - # list all other user ids in the conversation - user_ids_in_conversation = @user_conversations.select { |uc| uc[:conversation_id] == conversation[:conversation_id] && uc[:user_id] != conversation[:insert_user_id] } - .map { |uc| uc[:user_id] } - # retrieve their emails - user_emails_in_conversation = @users.select { |u| user_ids_in_conversation.include?(u[:user_id]) } - .map { |u| u[:email] } - # retrieve their usernames from the database - target_usernames = User.where("email IN (?)", user_emails_in_conversation).pluck(:username).to_a - - next if target_usernames.blank? - - user = find_user_by_import_id(conversation[:insert_user_id]) || Discourse.system_user - first_message = @conversation_messages.select { |cm| cm[:message_id] == conversation[:first_message_id] }.first - - { - archetype: Archetype.private_message, - id: "conversation#" + conversation[:conversation_id], - user_id: user.id, - title: "Private message from #{user.username}", - target_usernames: target_usernames, - raw: clean_up(first_message[:body]), - created_at: parse_date(conversation[:date_inserted]), - } - end + create_posts(@discussions) do |discussion| + { + id: "discussion#" + discussion[:discussion_id], + user_id: user_id_from_imported_user_id(discussion[:insert_user_id]) || Discourse::SYSTEM_USER_ID, + title: discussion[:name], + category: category_id_from_imported_category_id(discussion[:category_id]), + raw: clean_up(discussion[:body]), + created_at: parse_date(discussion[:date_inserted]), + } end + end - def import_private_posts - puts "", "importing private posts..." + def import_posts + puts "", "importing posts..." - first_message_ids = Set.new(@conversations.map { |c| c[:first_message_id] }.to_a) - @conversation_messages.reject! { |cm| first_message_ids.include?(cm[:message_id]) } + create_posts(@comments) do |comment| + next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id]) - create_posts(@conversation_messages) do |message| - next unless t = topic_lookup_from_imported_post_id("conversation#" + message[:conversation_id]) - - { - archetype: Archetype.private_message, - id: "message#" + message[:message_id], - user_id: user_id_from_imported_user_id(message[:insert_user_id]) || Discourse::SYSTEM_USER_ID, - topic_id: t[:topic_id], - raw: clean_up(message[:body]), - created_at: parse_date(message[:date_inserted]), - } - end + { + id: "comment#" + comment[:comment_id], + user_id: user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID, + topic_id: t[:topic_id], + raw: clean_up(comment[:body]), + created_at: parse_date(comment[:date_inserted]), + } end + end - def parse_date(date) - DateTime.strptime(date, "%Y-%m-%d %H:%M:%S") - end + def import_private_topics + puts "", "importing private topics..." - def clean_up(raw) - return "" if raw.blank? - raw.gsub("\\n", "\n") - .gsub(/<\/?pre\s*>/i, "\n```\n") - .gsub(/<\/?code\s*>/i, "`") - .gsub("<", "<") - .gsub(">", ">") + create_posts(@conversations) do |conversation| + next if conversation[:first_message_id].blank? + + # list all other user ids in the conversation + user_ids_in_conversation = @user_conversations.select { |uc| uc[:conversation_id] == conversation[:conversation_id] && uc[:user_id] != conversation[:insert_user_id] } + .map { |uc| uc[:user_id] } + # retrieve their emails + user_emails_in_conversation = @users.select { |u| user_ids_in_conversation.include?(u[:user_id]) } + .map { |u| u[:email] } + # retrieve their usernames from the database + target_usernames = User.where("email IN (?)", user_emails_in_conversation).pluck(:username).to_a + + next if target_usernames.blank? + + user = find_user_by_import_id(conversation[:insert_user_id]) || Discourse.system_user + first_message = @conversation_messages.select { |cm| cm[:message_id] == conversation[:first_message_id] }.first + + { + archetype: Archetype.private_message, + id: "conversation#" + conversation[:conversation_id], + user_id: user.id, + title: "Private message from #{user.username}", + target_usernames: target_usernames, + raw: clean_up(first_message[:body]), + created_at: parse_date(conversation[:date_inserted]), + } end + end + + def import_private_posts + puts "", "importing private posts..." + + first_message_ids = Set.new(@conversations.map { |c| c[:first_message_id] }.to_a) + @conversation_messages.reject! { |cm| first_message_ids.include?(cm[:message_id]) } + + create_posts(@conversation_messages) do |message| + next unless t = topic_lookup_from_imported_post_id("conversation#" + message[:conversation_id]) + + { + archetype: Archetype.private_message, + id: "message#" + message[:message_id], + user_id: user_id_from_imported_user_id(message[:insert_user_id]) || Discourse::SYSTEM_USER_ID, + topic_id: t[:topic_id], + raw: clean_up(message[:body]), + created_at: parse_date(message[:date_inserted]), + } + end + end + + def parse_date(date) + DateTime.strptime(date, "%Y-%m-%d %H:%M:%S") + end + + def clean_up(raw) + return "" if raw.blank? + raw.gsub("\\n", "\n") + .gsub(/<\/?pre\s*>/i, "\n```\n") + .gsub(/<\/?code\s*>/i, "`") + .gsub("<", "<") + .gsub(">", ">") + end end diff --git a/script/import_scripts/vbulletin.rb b/script/import_scripts/vbulletin.rb index 048fea099b..23923d0baa 100644 --- a/script/import_scripts/vbulletin.rb +++ b/script/import_scripts/vbulletin.rb @@ -32,9 +32,11 @@ class ImportScripts::VBulletin < ImportScripts::Base puts "#{DB_USER}:#{DB_PW}@#{DB_HOST} wants #{DB_NAME}" def initialize + @bbcode_to_md = true + super - @old_username_to_new_usernames = {} + @usernames = {} @tz = TZInfo::Timezone.get(TIMEZONE) @@ -107,6 +109,14 @@ EOM end end + def get_username_for_old_username(old_username) + if @usernames.has_key?(old_username) + @usernames[old_username] + else + old_username + end + end + def import_users puts "", "importing users" @@ -116,7 +126,8 @@ EOM batches(BATCH_SIZE) do |offset| users = mysql_query(<<-SQL - SELECT userid, username, homepage, usertitle, usergroupid, joindate, email + SELECT userid, username, homepage, usertitle, usergroupid, joindate, email, + CONCAT(password, ':', salt) AS crypted_password FROM #{TABLE_PREFIX}user WHERE userid > #{last_user_id} ORDER BY userid @@ -140,6 +151,7 @@ EOM id: user["userid"], name: username, username: username, + password: user["crypted_password"], email: email, website: user["homepage"].strip, title: @htmlentities.decode(user["usertitle"]).strip, @@ -147,13 +159,15 @@ EOM created_at: parse_timestamp(user["joindate"]), last_seen_at: parse_timestamp(user["lastvisit"]), post_create_action: proc do |u| - @old_username_to_new_usernames[user["username"]] = u.username import_profile_picture(user, u) import_profile_background(user, u) end } end end + + @usernames = UserCustomField.joins(:user).where(name: 'import_username').pluck('user_custom_fields.value', 'users.username').to_h + end def create_groups_membership @@ -168,10 +182,8 @@ EOM next if user_ids_in_group.size == 0 values = user_ids_in_group.map { |user_id| "(#{group.id}, #{user_id}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)" }.join(",") - User.exec_sql <<-SQL - BEGIN; - INSERT INTO group_users (group_id, user_id, created_at, updated_at) VALUES #{values}; - COMMIT; + DB.exec <<~SQL + INSERT INTO group_users (group_id, user_id, created_at, updated_at) VALUES #{values} SQL Group.reset_counters(group.id, :group_users) @@ -321,16 +333,17 @@ EOM t end - # uncomment below lines to create permalink - # topics.each do |thread| - # topic_id = "thread-#{thread["threadid"]}" - # topic = topic_lookup_from_imported_post_id(topic_id) - # if topic.present? - # title_slugified = thread["title"].gsub(" ","-").gsub(".","-") if thread["title"].present? - # url_slug = "threads/#{thread["threadid"]}-#{title_slugified}" if thread["title"].present? - # Permalink.create(url: url_slug, topic_id: topic[:topic_id].to_i) if url_slug.present? && topic[:topic_id].present? - # end - # end + # Add the following to permalink_normalizations for this to work: + # /forum\/.*?\/(\d*)\-.*/thread/\1 + + topics.each do |thread| + topic_id = "thread-#{thread["threadid"]}" + topic = topic_lookup_from_imported_post_id(topic_id) + if topic.present? + url_slug = "thread/#{thread["threadid"]}" if thread["title"].present? + Permalink.create(url: url_slug, topic_id: topic[:topic_id].to_i) if url_slug.present? && topic[:topic_id].present? + end + end end end @@ -388,8 +401,9 @@ EOM # find the uploaded file information from the db def find_upload(post, attachment_id) sql = "SELECT a.attachmentid attachment_id, a.userid user_id, a.filedataid file_id, a.filename filename, - a.caption caption + LENGTH(fd.filedata) AS dbsize, filedata, a.caption caption FROM #{TABLE_PREFIX}attachment a + LEFT JOIN #{TABLE_PREFIX}filedata fd ON fd.filedataid = a.filedataid WHERE a.attachmentid = #{attachment_id}" results = mysql_query(sql) @@ -399,13 +413,22 @@ EOM end filename = File.join(ATTACHMENT_DIR, row['user_id'].to_s.split('').join('/'), "#{row['file_id']}.attach") - unless File.exists?(filename) - puts "Attachment file doesn't exist: #{filename}" - return - end - real_filename = row['filename'] real_filename.prepend SecureRandom.hex if real_filename[0] == '.' + + unless File.exists?(filename) + if row['dbsize'].to_i == 0 + puts "Attachment file #{row['filedataid']} doesn't exist" + return nil + end + + tmpfile = 'attach_' + row['filedataid'].to_s + filename = File.join('/tmp/', tmpfile) + File.open(filename, 'wb') { |f| + f.write(row['filedata']) + } + end + upload = create_upload(post.user.id, filename, real_filename) if upload.nil? || !upload.valid? @@ -609,7 +632,7 @@ EOM WHERE id IN (SELECT topic_id FROM closed_topic_ids) SQL - Topic.exec_sql(sql, closed_topic_ids) + DB.exec(sql, closed_topic_ids) end def post_process_posts @@ -620,8 +643,9 @@ EOM Post.find_each do |post| begin + old_raw = post.raw.dup new_raw = postprocess_post_raw(post.raw) - if new_raw != post.raw + if new_raw != old_raw post.raw = new_raw post.save end @@ -685,11 +709,8 @@ EOM # [MENTION][/MENTION] raw.gsub!(/\[mention\](.+?)\[\/mention\]/i) do - old_username = $1 - if @old_username_to_new_usernames.has_key?(old_username) - old_username = @old_username_to_new_usernames[old_username] - end - "@#{old_username}" + new_username = get_username_for_old_username($1) + "@#{new_username}" end # [FONT=blah] and [COLOR=blah] @@ -698,6 +719,7 @@ EOM raw.gsub! /\[COLOR=#.*?\](.*?)\[\/COLOR\]/im, '\1' raw.gsub! /\[SIZE=.*?\](.*?)\[\/SIZE\]/im, '\1' + raw.gsub! /\[SUP\](.*?)\[\/SUP\]/im, '\1' raw.gsub! /\[h=.*?\](.*?)\[\/h\]/im, '\1' # [CENTER]...[/CENTER] @@ -705,10 +727,18 @@ EOM # [INDENT]...[/INDENT] raw.gsub! /\[INDENT\](.*?)\[\/INDENT\]/im, '\1' - raw.gsub! /\[TABLE\](.*?)\[\/TABLE\]/im, '\1' - raw.gsub! /\[TR\](.*?)\[\/TR\]/im, '\1' - raw.gsub! /\[TD\](.*?)\[\/TD\]/im, '\1' - raw.gsub! /\[TD="?.*?"?\](.*?)\[\/TD\]/im, '\1' + + # Tables to MD + raw.gsub!(/\[TABLE.*?\](.*?)\[\/TABLE\]/im) { |t| + rows = $1.gsub!(/\s*\[TR\](.*?)\[\/TR\]\s*/im) { |r| + cols = $1.gsub! /\s*\[TD.*?\](.*?)\[\/TD\]\s*/im, '|\1' + "#{cols}|\n" + } + header, rest = rows.split "\n", 2 + c = header.count "|" + sep = "|---" * (c - 1) + "#{header}\n#{sep}|\n#{rest}\n" + } # [QUOTE]...[/QUOTE] raw.gsub!(/\[quote\](.+?)\[\/quote\]/im) { |quote| @@ -719,10 +749,8 @@ EOM # [QUOTE=]...[/QUOTE] raw.gsub!(/\[quote=([^;\]]+)\](.+?)\[\/quote\]/im) do old_username, quote = $1, $2 - if @old_username_to_new_usernames.has_key?(old_username) - old_username = @old_username_to_new_usernames[old_username] - end - "\n[quote=\"#{old_username}\"]\n#{quote}\n[/quote]\n" + new_username = get_username_for_old_username(old_username) + "\n[quote=\"#{new_username}\"]\n#{quote}\n[/quote]\n" end # [YOUTUBE][/YOUTUBE] @@ -731,6 +759,9 @@ EOM # [VIDEO=youtube;]...[/VIDEO] raw.gsub!(/\[video=youtube;([^\]]+)\].*?\[\/video\]/i) { "\n//youtu.be/#{$1}\n" } + # Fix uppercase B U and I tags + raw.gsub!(/(\[\/?[BUI]\])/i) { $1.downcase } + # More Additions .... # [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler] @@ -760,16 +791,19 @@ EOM raw.gsub!(/\[quote=([^;]+);(\d+)\](.+?)\[\/quote\]/im) do old_username, post_id, quote = $1, $2, $3 - if @old_username_to_new_usernames.has_key?(old_username) - old_username = @old_username_to_new_usernames[old_username] - end + new_username = get_username_for_old_username(old_username) + + # There is a bug here when the first post in a topic is quoted. + # The first post in a topic does not have an post_custom_field referring to the post number, + # but it refers to thread-XXX instead, so this lookup fails miserably then. + # Fixing this would imply rewriting that logic completely. if topic_lookup = topic_lookup_from_imported_post_id(post_id) post_number = topic_lookup[:post_number] topic_id = topic_lookup[:topic_id] - "\n[quote=\"#{old_username},post:#{post_number},topic:#{topic_id}\"]\n#{quote}\n[/quote]\n" + "\n[quote=\"#{new_username},post:#{post_number},topic:#{topic_id}\"]\n#{quote}\n[/quote]\n" else - "\n[quote=\"#{old_username}\"]\n#{quote}\n[/quote]\n" + "\n[quote=\"#{new_username}\"]\n#{quote}\n[/quote]\n" end end diff --git a/script/import_scripts/vbulletin5.rb b/script/import_scripts/vbulletin5.rb index da1ceea84b..36a46745b5 100644 --- a/script/import_scripts/vbulletin5.rb +++ b/script/import_scripts/vbulletin5.rb @@ -418,7 +418,7 @@ class ImportScripts::VBulletin < ImportScripts::Base WHERE id IN (SELECT topic_id FROM closed_topic_ids) SQL - Topic.exec_sql(sql, @closed_topic_ids) + DB.exec(sql, @closed_topic_ids) end def post_process_posts diff --git a/script/import_scripts/zendesk.rb b/script/import_scripts/zendesk.rb index 305431c7a5..15d44282b2 100644 --- a/script/import_scripts/zendesk.rb +++ b/script/import_scripts/zendesk.rb @@ -203,7 +203,7 @@ class ImportScripts::Zendesk < ImportScripts::Base end { - id: import_topic_id(row['id']), + id: row['id'], raw: normalize_raw(row['raw']), user_id: user_id_from_imported_user_id(row['user_id']) || Discourse.system_user.id, topic_id: topic[:topic_id], diff --git a/script/import_scripts/zendesk_api.rb b/script/import_scripts/zendesk_api.rb new file mode 100644 index 0000000000..ddea6f1cb5 --- /dev/null +++ b/script/import_scripts/zendesk_api.rb @@ -0,0 +1,306 @@ +# Zendesk importer +# +# This one uses their API. + +require 'reverse_markdown' +require_relative 'base' +require_relative 'base/generic_database' + +# Call it like this: +# RAILS_ENV=production bundle exec ruby script/import_scripts/zendesk_api.rb SOURCE_URL DIRNAME AUTH_EMAIL AUTH_TOKEN +class ImportScripts::Zendesk < ImportScripts::Base + BATCH_SIZE = 1000 + + def initialize(source_url, path, auth_email, auth_token) + super() + + @source_url = source_url + @path = path + @auth_email = auth_email + @auth_token = auth_token + @db = ImportScripts::GenericDatabase.new(@path, batch_size: BATCH_SIZE, recreate: true) + end + + def execute + fetch_from_api + + import_categories + import_users + import_topics + import_posts + end + + def fetch_from_api + puts '', 'fetching categories...' + + get_from_api('/api/v2/community/topics.json', 'topics') do |row| + @db.insert_category( + id: row['id'], + name: row['name'], + description: row['description'], + position: row['position'], + url: row['html_url'] + ) + end + + puts '', 'fetching topics...' + + get_from_api('/api/v2/community/posts.json', 'posts') do |row| + @db.insert_topic( + id: row['id'], + title: row['title'], + raw: row['details'], + category_id: row['topic_id'], + closed: row['closed'], + user_id: row['author_id'], + created_at: row['created_at'], + url: row['html_url'] + ) + end + + puts '', 'fetching posts...' + total_count = @db.count_topics + start_time = Time.now + last_id = '' + + batches do |offset| + rows, last_id = @db.fetch_topics(last_id) + break if rows.empty? + + print_status(offset, total_count, start_time) + + rows.each do |topic_row| + get_from_api("/api/v2/community/posts/#{topic_row['id']}/comments.json", 'comments', show_status: false) do |row| + @db.insert_post( + id: row['id'], + raw: row['body'], + topic_id: topic_row['id'], + user_id: row['author_id'], + created_at: row['created_at'], + url: row['html_url'] + ) + end + end + end + + puts '', 'fetching users...' + + results = @db.execute_sql("SELECT user_id FROM topic") + user_ids = results.map { |h| h['user_id']&.to_i } + results = @db.execute_sql("SELECT user_id FROM post") + user_ids += results.map { |h| h['user_id']&.to_i } + user_ids.uniq! + user_ids.sort! + + total_users = user_ids.size + start_time = Time.now + + while !user_ids.empty? + print_status(total_users - user_ids.size, total_users, start_time) + get_from_api("/api/v2/users/show_many.json?ids=#{user_ids.shift(50).join(',')}", 'users', show_status: false) do |row| + @db.insert_user( + id: row['id'], + email: row['email'], + name: row['name'], + created_at: row['created_at'], + last_seen_at: row['last_login_at'], + active: row['active'] + ) + end + end + + @db.sort_posts_by_created_at + end + + def import_categories + puts "", "creating categories" + rows = @db.fetch_categories + + create_categories(rows) do |row| + { + id: row['id'], + name: row['name'], + description: row['description'], + position: row['position'], + post_create_action: proc do |category| + url = remove_domain(row['url']) + Permalink.create(url: url, category_id: category.id) unless permalink_exists?(url) + end + } + end + end + + def import_users + puts "", "creating users" + total_count = @db.count_users + last_id = '' + + batches do |offset| + rows, last_id = @db.fetch_users(last_id) + break if rows.empty? + + next if all_records_exist?(:users, rows.map { |row| row['id'] }) + + create_users(rows, total: total_count, offset: offset) do |row| + { + id: row['id'], + email: row['email'], + name: row['name'], + created_at: row['created_at'], + last_seen_at: row['last_seen_at'], + active: row['active'] == 1 + } + end + end + end + + def import_topics + puts "", "creating topics" + total_count = @db.count_topics + last_id = '' + + batches do |offset| + rows, last_id = @db.fetch_topics(last_id) + break if rows.empty? + + next if all_records_exist?(:posts, rows.map { |row| import_topic_id(row['id']) }) + + create_posts(rows, total: total_count, offset: offset) do |row| + { + id: import_topic_id(row['id']), + title: row['title'].present? ? row['title'].strip[0...255] : "Topic title missing", + raw: normalize_raw(row['raw']), + category: category_id_from_imported_category_id(row['category_id']), + user_id: user_id_from_imported_user_id(row['user_id']) || Discourse.system_user.id, + created_at: row['created_at'], + closed: row['closed'] == 1, + post_create_action: proc do |post| + url = remove_domain(row['url']) + Permalink.create(url: url, topic_id: post.topic.id) unless permalink_exists?(url) + end + } + end + end + end + + def import_topic_id(topic_id) + "T#{topic_id}" + end + + def import_posts + puts "", "creating posts" + total_count = @db.count_posts + last_row_id = 0 + + batches do |offset| + rows, last_row_id = @db.fetch_posts(last_row_id) + break if rows.empty? + + create_posts(rows, total: total_count, offset: offset) do |row| + topic = topic_lookup_from_imported_post_id(import_topic_id(row['topic_id'])) + + if topic.nil? + p "MISSING TOPIC #{row['topic_id']}" + p row + next + end + + { + id: row['id'], + raw: normalize_raw(row['raw']), + user_id: user_id_from_imported_user_id(row['user_id']) || Discourse.system_user.id, + topic_id: topic[:topic_id], + created_at: row['created_at'], + post_create_action: proc do |post| + url = remove_domain(row['url']) + Permalink.create(url: url, post_id: post.id) unless permalink_exists?(url) + end + } + end + end + end + + def normalize_raw(raw) + raw = raw.gsub('\n', '') + raw = ReverseMarkdown.convert(raw) + raw + end + + def remove_domain(url) + url.sub(@source_url, "") + end + + def permalink_exists?(url) + Permalink.find_by(url: url) + end + + def connection + @_connection ||= begin + connect_uri = URI.parse(@source_url) + + http = Net::HTTP.new(connect_uri.host, connect_uri.port) + http.open_timeout = 30 + http.read_timeout = 30 + http.use_ssl = connect_uri.scheme == "https" + + http + end + end + + def authorization + @_authorization ||= begin + auth_str = "#{@auth_email}/token:#{@auth_token}" + "Basic #{Base64.strict_encode64(auth_str)}" + end + end + + def get_from_api(path, array_name, show_status: true) + url = "#{@source_url}#{path}" + start_time = Time.now + + while url + get = Net::HTTP::Get.new(url) + get['User-Agent'] = 'Discourse Zendesk Importer' + get['Authorization'] = authorization + + retry_count = 0 + + begin + while retry_count < 5 + begin + response = connection.request(get) + puts("Retry successful!") if retry_count > 0 + break + rescue => e + puts "Request failed #{url}. Waiting and will retry. #{e.class.name} #{e.message}" + sleep(20) + retry_count += 1 + end + end + end + + json = JSON.parse(response.body) + + json[array_name].each do |row| + yield row + end + + url = json['next_page'] + + if show_status + if json['page'] && json['page_count'] + print_status(json['page'], json['page_count'], start_time) + else + print '.' + end + end + end + end +end + +unless ARGV.length == 4 && Dir.exist?(ARGV[1]) + puts "", "Usage:", "", "bundle exec ruby script/import_scripts/zendesk_api.rb SOURCE_URL DIRNAME AUTH_EMAIL AUTH_TOKEN", "" + exit 1 +end + +ImportScripts::Zendesk.new(ARGV[0], ARGV[1], ARGV[2], ARGV[3]).perform diff --git a/script/memory-analysis b/script/memory-analysis new file mode 100755 index 0000000000..616714043c --- /dev/null +++ b/script/memory-analysis @@ -0,0 +1,168 @@ +#!/usr/bin/env ruby + +require 'fileutils' +require 'pathname' +require 'tmpdir' +require 'json' +require 'set' + +def usage + STDERR.puts "Usage: memory-analysis [PID|DUMPFILE]" + exit 1 +end + +if ARGV.length != 1 + usage +end + +dumpfile = ARGV[0] + +if !File.exist?(dumpfile) + pid = dumpfile.to_i + usage if pid == 0 + + time = Time.now.utc + utc = time.strftime("%Y-%m-%d-%H-%M-%S") + dumpfile = "#{Pathname.new(Dir.tmpdir).realpath}/#{pid}_#{utc}.dump" + + puts "Dumping heap for pid #{pid} to #{dumpfile}" + puts + + `rbtrace -p #{pid} -e 'Thread.new{GC.start;require "objspace";io=File.open("#{dumpfile}", "w"); ObjectSpace.dump_all(output: io); io.close}'` + + old_size = 0 + + found = false + 20.times do + sleep 0.2 + found = File.exist?(dumpfile) + break if found + end + + if !found + STDERR.puts "Unable to find dumpfile #{dumpfile}, is rbtrace running properly, did you pick the right pid?" + usage + end + + while true + sleep 0.5 + size = File.size(dumpfile) + if size == old_size && size > 0 + break + end + old_size = size + end +end + +puts "Processing heap dump" + +class Stats + + def initialize + @classes = {} + @class_stats = {} + @type_stats = {} + @threads = Set.new + @thread_owners = {} + end + + def print + puts "Stats by Type" + puts "-" * 20 + puts + + @type_stats.sort_by { |_, (_, size)| -size }.each do |k, (count, size)| + puts "#{k} Count: #{count} Size: #{size}" + end + puts + + puts "Stats by Class" + puts "-" * 20 + @class_stats.sort_by { |_, (_, size)| -size }.each do |k, (count, size)| + puts "#{@classes[k] || k} Count: #{count} Size: #{size}" + end + + puts "Thread Stats" + puts "-" * 20 + @thread_owners.sort_by { |_ , count| -count }.each do |name, count| + puts "#{count} refs from #{name}" + end + end + + def thread_class + @thread_class ||= + begin + @classes.find do |addr, n| + n == "Thread" + end.first + end + end + + def detect_threads(line) + parsed = JSON.parse(line) + + if parsed["class"] == thread_class + @threads << parsed["address"] + end + end + + def detect_thread_owners(line) + parsed = JSON.parse(line) + + if refs = parsed["references"] + i = 0 + while i < refs.length + if @threads.include?(refs[i]) + klass = @classes[parsed["class"]] || "#{parsed["type"]} #{parsed["address"]}" + @thread_owners[klass] ||= 0 + @thread_owners[klass] += 1 + end + i += 1 + end + end + end + + def injest(line) + parsed = JSON.parse(line) + if parsed["type"] == "CLASS" + @classes[parsed["address"]] = parsed["name"] + end + + type_stat = @type_stats[parsed["type"]] ||= [0, 0] + + if klass = parsed["class"] + class_stat = @class_stats[parsed["class"]] ||= [0, 0] + class_stat[0] += 1 + class_stat[1] += parsed["memsize"] || 0 + end + + type_stat[0] += 1 + type_stat[1] += parsed["memsize"] || 0 + end +end + +def process_dumpfile(dumpfile) + stats = Stats.new + + File.open(dumpfile).each_line do |line| + stats.injest(line) + end + + puts "pass 1 done" + + File.open(dumpfile).each_line do |line| + stats.detect_threads(line) + end + + puts "pass 2 done" + + File.open(dumpfile).each_line do |line| + stats.detect_thread_owners(line) + end + + stats +end + +stats = process_dumpfile(dumpfile) + +stats.print diff --git a/script/mwrap_sidekiq b/script/mwrap_sidekiq new file mode 100755 index 0000000000..ca5c139ac2 --- /dev/null +++ b/script/mwrap_sidekiq @@ -0,0 +1,142 @@ +#!/usr/bin/env ruby +if !ENV["LD_PRELOAD"]&.include?('mwrap') + # use malloc from libc that interacts better with mwrap + ENV['RAILS_ENV'] = 'production' + ENV["LD_PRELOAD"] = "" + ENV["MALLOC_ARENA_MAX"] = "2" + exec "mwrap #{__FILE__}" +end + +require 'mwrap' +require 'webrick' + +require File.expand_path("../../config/environment", __FILE__) + +def render_table(array) + buffer = +"" + + width = array[0].map { |k| k.to_s.length } + cols = array[0].length + + array.each do |row| + row.each_with_index do |val, i| + width[i] = [width[i].to_i, val.to_s.length].max + end + end + + array[0].each_with_index do |col, i| + buffer << col.to_s.ljust(width[i], ' ') + if i == cols - 1 + buffer << "\n" + else + buffer << ' | ' + end + end + + buffer << ("-" * (width.sum + width.length)) + buffer << "\n" + + array.drop(1).each do |row| + row.each_with_index do |val, i| + buffer << val.to_s.ljust(width[i], ' ') + if i == cols - 1 + buffer << "\n" + else + buffer << ' | ' + end + end + end + + buffer +end + +def rss + `ps -o rss= -p #{Process.pid}`.chomp.to_i +end + +def mwrap_log + report = +"" + + Mwrap.quiet do + report << "Generation: #{GC.count} RSS kb: #{rss} Accounted Mem kb: #{(Mwrap.total_bytes_allocated - Mwrap.total_bytes_freed) / 1024}\n" + report << "Allocated bytes: #{Mwrap.total_bytes_allocated} Freed bytes: #{Mwrap.total_bytes_freed}\n" + stat = GC.stat + stat.each do |k, v| + report << "#{k}: #{v}\n" + end + report << "\n" + + table = [] + Mwrap.each(200) do |loc, total, allocations, frees, age_sum, max_life| + table << [total, allocations, frees, frees == 0 ? -1 : (age_sum / frees.to_f).round(2), max_life, loc] + end + + table.sort! { |a, b| b[1] - b[2] <=> a[1] - a[2] } + + table.prepend(["total", "allocations", "frees", "mean_life", "max_life", "location"]) + + report << render_table(table) + end + + report +end + +Thread.new do + begin + puts "Starting Logging Thread" + path = "/tmp/mwrap_#{Process.pid}" + `mkdir -p #{path}` + + while true + log = mwrap_log + f = "#{path}/log_#{Time.now.strftime("%Y_%m_%d_%H%M%S")}" + File.write(f, log) + puts "Wrote #{f}" + sleep 60 * 60 + end + rescue => e + STDERR.puts "ERROR crashed logger #{e}" + STDERR.puts e.backtrace + end +end + +Thread.new do + puts "Starting WEBrick on port 9874" + server = WEBrick::HTTPServer.new(Port: 9874) + server.mount_proc '/' do |req, res| + res['ContentType'] = 'text/plain; charset=utf-8' + res.body = mwrap_log + res.status = 200 + end + begin + server.start + rescue => e + STDERR.puts "Failed to start start server #{e}" + end +end + +require 'sidekiq/cli' + +begin + #Sidekiq::Logging.logger = nil + cli = Sidekiq::CLI.instance + + options = ["-c", GlobalSetting.sidekiq_workers.to_s] + + [['critical', 4], ['default', 2], ['low', 1]].each do |queue_name, weight| + custom_queue_hostname = ENV["UNICORN_SIDEKIQ_#{queue_name.upcase}_QUEUE_HOSTNAME"] + + if !custom_queue_hostname || custom_queue_hostname.split(',').include?(`hostname`.strip) + options << "-q" + options << "#{queue_name},#{weight}" + end + end + + cli.parse(options) + load Rails.root + "config/initializers/100-sidekiq.rb" + cli.run +rescue => e + STDERR.puts e.message + STDERR.puts e.backtrace.join("\n") + exit 1 +end diff --git a/script/osx_dev b/script/osx_dev index d121076838..a03ac0c7af 100755 --- a/script/osx_dev +++ b/script/osx_dev @@ -40,12 +40,12 @@ source ~/.rvm/scripts/rvm rvm get stable rvm autolibs homebrew # Tell RVM to install anything it's missing with homebrew rvm requirements # This will install baseline requirements that might be missing -rvm install 2.0.0-turbo # Now, install Ruby 2.0.0 with performance patches -rvm --create --ruby-version use 2.0.0-turbo # Use this Ruby as the default in this directory +rvm install 2.4.4 # Now, install Ruby 2.4.4 +rvm --create --ruby-version use 2.4.4 # Use this Ruby as the default in this directory # Check that the correct version is installed and active echo "Checking Ruby installation..." -ruby -v | grep 2.0.0 +ruby -v | grep 2.4.4 ## Configure PostgreSQL (PostgreSQL was installed by Homebrew using `brew bundle`) ## echo "Loading PostgreSQL..." diff --git a/script/plugin-translations.rb b/script/plugin-translations.rb index c01e804a8c..f4ed4165c9 100644 --- a/script/plugin-translations.rb +++ b/script/plugin-translations.rb @@ -19,6 +19,7 @@ class PluginTxUpdater 'discourse-canned-replies', 'discourse-characters-required', 'discourse-chat-integration', + 'discourse-checklist', 'discourse-data-explorer', 'discourse-math', 'discourse-oauth2-basic', @@ -48,6 +49,7 @@ class PluginTxUpdater system_cmd('bundle exec bin/pull_translations.rb') system_cmd('git add config/locales/*') system_cmd('git add Gemfile.lock') rescue true # might be gitignored + system_cmd('git add .tx/config') rescue true system_cmd('git commit -m "Update translations"') system_cmd('git push origin master') if @push rescue => e diff --git a/script/pull_translations.rb b/script/pull_translations.rb index 8870974c5e..c828348619 100755 --- a/script/pull_translations.rb +++ b/script/pull_translations.rb @@ -12,11 +12,17 @@ def expand_path(path) File.expand_path("../../#{path}", __FILE__) end +# List of locales that will break Discourse and need to be fixed +# by translators in Transifex. +def broken_locales + ['ja'] +end + def supported_locales Dir.glob(expand_path('config/locales/client.*.yml')) .map { |x| x.split('.')[-2] } .select { |x| x != 'en' } - .sort + .sort - broken_locales end YML_DIRS = ['config/locales', diff --git a/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb b/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb index a4ca7ede22..98a35defd5 100644 --- a/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb +++ b/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb @@ -27,7 +27,9 @@ describe ActiveRecord::ConnectionHandling do let(:postgresql_fallback_handler) { PostgreSQLFallbackHandler.instance } before do - skip("Figure out why this test leaks connections") + # TODO: tgxworld will rewrite it without stubs + skip("Skip causes our build to be unstable") + @threads = Thread.list postgresql_fallback_handler.initialized = true ['default', multisite_db].each do |db| @@ -36,25 +38,24 @@ describe ActiveRecord::ConnectionHandling do end after do + Sidekiq.unpause! postgresql_fallback_handler.setup! - postgresql_fallback_handler.clear_connections + ActiveRecord::Base.unstub(:postgresql_connection) + (Thread.list - @threads).each(&:kill) + ActiveRecord::Base.connection_pool.disconnect! + ActiveRecord::Base.establish_connection end describe "#postgresql_fallback_connection" do it 'should return a PostgreSQL adapter' do - begin - connection = ActiveRecord::Base.postgresql_fallback_connection(config) + connection = ActiveRecord::Base.postgresql_fallback_connection(config) - expect(connection) - .to be_an_instance_of(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) - ensure - connection.disconnect! - end + expect(connection) + .to be_an_instance_of(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) end context 'when master server is down' do before do - @replica_connection = mock('replica_connection') end @@ -161,8 +162,11 @@ describe ActiveRecord::ConnectionHandling do end def with_multisite_db(dbname) - RailsMultisite::ConnectionManagement.expects(:current_db).returns(dbname).at_least_once - yield - RailsMultisite::ConnectionManagement.unstub(:current_db) + begin + RailsMultisite::ConnectionManagement.expects(:current_db).returns(dbname).at_least_once + yield + ensure + RailsMultisite::ConnectionManagement.unstub(:current_db) + end end end diff --git a/spec/components/auth/default_current_user_provider_spec.rb b/spec/components/auth/default_current_user_provider_spec.rb index 75a76ef27a..20cf716d96 100644 --- a/spec/components/auth/default_current_user_provider_spec.rb +++ b/spec/components/auth/default_current_user_provider_spec.rb @@ -156,6 +156,39 @@ describe Auth::DefaultCurrentUserProvider do ).should_update_last_seen?).to eq(false) end + it "should not update last seen for suspended users" do + user = Fabricate(:user) + provider = provider('/') + cookies = {} + provider.log_on_user(user, {}, cookies) + unhashed_token = cookies["_t"][:value] + + freeze_time + Sidekiq::Testing.inline! do + # Need to clear this key from redis, otherwise + # this test could fail if run twice in 1 minute + $redis.del("user:#{user.id}:#{Time.now.to_date}") + provider2 = provider("/", "HTTP_COOKIE" => "_t=#{unhashed_token}") + u = provider2.current_user + u.reload + expect(u.last_seen_at).to eq(Time.now) + + freeze_time 20.minutes.from_now + + u.last_seen_at = nil + u.suspended_till = 1.year.from_now + u.save! + + $redis.del("user:#{user.id}:#{Time.now.to_date}") + provider2 = provider("/", "HTTP_COOKIE" => "_t=#{unhashed_token}") + expect(provider2.current_user).to eq(nil) + + u.reload + expect(u.last_seen_at).to eq(nil) + end + + end + it "should update ajax reqs with discourse visible" do expect(provider("/topic/anything/goes", :method => "POST", @@ -335,6 +368,26 @@ describe Auth::DefaultCurrentUserProvider do ) end + it "can clear old duplicate keys correctly" do + dupe = UserApiKey.create!( + application_name: 'my app', + client_id: '12345', + scopes: ['read'], + key: SecureRandom.hex, + user_id: user.id + ) + + params = { + "REQUEST_METHOD" => "GET", + "HTTP_USER_API_KEY" => api_key.key, + "HTTP_USER_API_CLIENT_ID" => dupe.client_id, + } + + good_provider = provider("/", params) + expect(good_provider.current_user.id).to eq(user.id) + expect(UserApiKey.find_by(id: dupe.id)).to eq(nil) + end + it "allows user API access correctly" do params = { "REQUEST_METHOD" => "GET", diff --git a/spec/components/auth/facebook_authenticator_spec.rb b/spec/components/auth/facebook_authenticator_spec.rb index c7d26b6e86..ccdd3865cb 100644 --- a/spec/components/auth/facebook_authenticator_spec.rb +++ b/spec/components/auth/facebook_authenticator_spec.rb @@ -38,6 +38,36 @@ describe Auth::FacebookAuthenticator do expect(result.user.user_profile.location).to eq("America") end + it 'can connect to a different existing user account' do + authenticator = Auth::FacebookAuthenticator.new + user1 = Fabricate(:user) + user2 = Fabricate(:user) + + FacebookUserInfo.create!(user_id: user1.id, facebook_user_id: 100) + + hash = { + "extra" => { + "raw_info" => { + "username" => "bob" + } + }, + "info" => { + "location" => "America", + "description" => "bio", + "urls" => { + "Website" => "https://awesome.com" + } + }, + "uid" => "100" + } + + result = authenticator.after_authenticate(hash, existing_account: user2) + + expect(result.user.id).to eq(user2.id) + expect(FacebookUserInfo.exists?(user_id: user1.id)).to eq(false) + expect(FacebookUserInfo.exists?(user_id: user2.id)).to eq(true) + end + it 'can create a proper result for non existing users' do hash = { @@ -62,4 +92,58 @@ describe Auth::FacebookAuthenticator do end end + context 'description_for_user' do + let(:user) { Fabricate(:user) } + let(:authenticator) { Auth::FacebookAuthenticator.new } + + it 'returns empty string if no entry for user' do + expect(authenticator.description_for_user(user)).to eq("") + end + + it 'returns correct information' do + FacebookUserInfo.create!(user_id: user.id, facebook_user_id: 12345, email: 'someuser@somedomain.tld') + expect(authenticator.description_for_user(user)).to eq('someuser@somedomain.tld') + end + end + + context 'revoke' do + let(:user) { Fabricate(:user) } + let(:authenticator) { Auth::FacebookAuthenticator.new } + + it 'raises exception if no entry for user' do + expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound) + end + + context "with valid record" do + before do + SiteSetting.facebook_app_id = '123' + SiteSetting.facebook_app_secret = 'abcde' + FacebookUserInfo.create!(user_id: user.id, facebook_user_id: 12345, email: 'someuser@somedomain.tld') + end + + it 'revokes correctly' do + stub = stub_request(:delete, authenticator.revoke_url(12345)).to_return(body: "true") + + expect(authenticator.can_revoke?).to eq(true) + expect(authenticator.revoke(user)).to eq(true) + + expect(stub).to have_been_requested.once + expect(authenticator.description_for_user(user)).to eq("") + end + + it 'handles errors correctly' do + stub = stub_request(:delete, authenticator.revoke_url(12345)).to_return(status: 404) + + expect(authenticator.revoke(user)).to eq(false) + expect(stub).to have_been_requested.once + expect(authenticator.description_for_user(user)).to eq('someuser@somedomain.tld') + + expect(authenticator.revoke(user, skip_remote: true)).to eq(true) + expect(stub).to have_been_requested.once + expect(authenticator.description_for_user(user)).to eq("") + + end + end + end + end diff --git a/spec/components/auth/github_authenticator_spec.rb b/spec/components/auth/github_authenticator_spec.rb index 17fff987cd..4ade566557 100644 --- a/spec/components/auth/github_authenticator_spec.rb +++ b/spec/components/auth/github_authenticator_spec.rb @@ -202,6 +202,36 @@ describe Auth::GithubAuthenticator do expect(result.email_valid).to eq(true) end + it 'can connect to a different existing user account' do + user1 = Fabricate(:user) + user2 = Fabricate(:user) + + GithubUserInfo.create!(user_id: user1.id, github_user_id: 100, screen_name: "boris") + + result = authenticator.after_authenticate(data, existing_account: user2) + + expect(result.user.id).to eq(user2.id) + expect(GithubUserInfo.exists?(user_id: user1.id)).to eq(false) + expect(GithubUserInfo.exists?(user_id: user2.id)).to eq(true) + end + + end + + context 'revoke' do + let(:user) { Fabricate(:user) } + let(:authenticator) { Auth::GithubAuthenticator.new } + + it 'raises exception if no entry for user' do + expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound) + end + + it 'revokes correctly' do + GithubUserInfo.create!(user_id: user.id, github_user_id: 100, screen_name: "boris") + expect(authenticator.can_revoke?).to eq(true) + expect(authenticator.revoke(user)).to eq(true) + expect(authenticator.description_for_user(user)).to eq("") + end + end describe 'avatar retrieval' do diff --git a/spec/components/auth/google_oauth2_authenticator_spec.rb b/spec/components/auth/google_oauth2_authenticator_spec.rb index 525d65f9aa..06962d0c15 100644 --- a/spec/components/auth/google_oauth2_authenticator_spec.rb +++ b/spec/components/auth/google_oauth2_authenticator_spec.rb @@ -58,6 +58,35 @@ describe Auth::GoogleOAuth2Authenticator do expect(result.user.id).to eq(user.id) end + it 'can connect to a different existing user account' do + authenticator = Auth::GoogleOAuth2Authenticator.new + user1 = Fabricate(:user) + user2 = Fabricate(:user) + + GoogleUserInfo.create!(user_id: user1.id, google_user_id: 100) + + hash = { + uid: "100", + info: { + name: "John Doe", + email: user1.email + }, + extra: { + raw_info: { + email: user1.email, + email_verified: true, + name: "John Doe" + } + } + } + + result = authenticator.after_authenticate(hash, existing_account: user2) + + expect(result.user.id).to eq(user2.id) + expect(GoogleUserInfo.exists?(user_id: user1.id)).to eq(false) + expect(GoogleUserInfo.exists?(user_id: user2.id)).to eq(true) + end + it 'can create a proper result for non existing users' do hash = { uid: "123456789", @@ -81,4 +110,21 @@ describe Auth::GoogleOAuth2Authenticator do expect(result.extra_data[:name]).to eq("Jane Doe") end end + + context 'revoke' do + let(:user) { Fabricate(:user) } + let(:authenticator) { Auth::GoogleOAuth2Authenticator.new } + + it 'raises exception if no entry for user' do + expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound) + end + + it 'revokes correctly' do + GoogleUserInfo.create!(user_id: user.id, google_user_id: 12345, email: 'someuser@somedomain.tld') + expect(authenticator.can_revoke?).to eq(true) + expect(authenticator.revoke(user)).to eq(true) + expect(authenticator.description_for_user(user)).to eq("") + end + + end end diff --git a/spec/components/auth/open_id_authenticator_spec.rb b/spec/components/auth/open_id_authenticator_spec.rb index 983fea379a..761bd1af95 100644 --- a/spec/components/auth/open_id_authenticator_spec.rb +++ b/spec/components/auth/open_id_authenticator_spec.rb @@ -9,7 +9,7 @@ load 'auth/open_id_authenticator.rb' describe Auth::OpenIdAuthenticator do it "can lookup pre-existing user if trusted" do - auth = Auth::OpenIdAuthenticator.new("test", "id", trusted: true) + auth = Auth::OpenIdAuthenticator.new("test", "id", "enable_yahoo_logins", trusted: true) user = Fabricate(:user) response = OpenStruct.new(identity_url: 'abc') @@ -18,8 +18,43 @@ describe Auth::OpenIdAuthenticator do end it "raises an exception when email is missing" do - auth = Auth::OpenIdAuthenticator.new("test", "id", trusted: true) + auth = Auth::OpenIdAuthenticator.new("test", "id", "enable_yahoo_logins", trusted: true) response = OpenStruct.new(identity_url: 'abc') expect { auth.after_authenticate(info: {}, extra: { response: response }) }.to raise_error(Discourse::InvalidParameters) end + + it 'can connect to a different existing user account' do + authenticator = Auth::OpenIdAuthenticator.new("test", "id", "enable_yahoo_logins", trusted: true) + user1 = Fabricate(:user) + user2 = Fabricate(:user) + + UserOpenId.create!(url: "id/123" , user_id: user1.id, email: "bob@example.com", active: true) + + hash = { + info: { email: user1.email }, extra: { response: OpenStruct.new(identity_url: 'id/123') } + } + + result = authenticator.after_authenticate(hash, existing_account: user2) + + expect(result.user.id).to eq(user2.id) + expect(UserOpenId.exists?(user_id: user1.id)).to eq(false) + expect(UserOpenId.exists?(user_id: user2.id)).to eq(true) + end + + context 'revoke' do + let(:user) { Fabricate(:user) } + let(:authenticator) { Auth::OpenIdAuthenticator.new("test", "id", "enable_yahoo_logins", trusted: true) } + + it 'raises exception if no entry for user' do + expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound) + end + + it 'revokes correctly' do + UserOpenId.create!(url: "id/123" , user_id: user.id, email: "bob@example.com", active: true) + expect(authenticator.can_revoke?).to eq(true) + expect(authenticator.revoke(user)).to eq(true) + expect(authenticator.description_for_user(user)).to eq("") + end + + end end diff --git a/spec/components/auth/twitter_authenticator_spec.rb b/spec/components/auth/twitter_authenticator_spec.rb index 8c2d465965..f6b620dfdf 100644 --- a/spec/components/auth/twitter_authenticator_spec.rb +++ b/spec/components/auth/twitter_authenticator_spec.rb @@ -25,4 +25,45 @@ describe Auth::TwitterAuthenticator do expect(info.email).to eq(user.email) end + it 'can connect to a different existing user account' do + authenticator = Auth::TwitterAuthenticator.new + user1 = Fabricate(:user) + user2 = Fabricate(:user) + + TwitterUserInfo.create!(user_id: user1.id, twitter_user_id: 100, screen_name: "boris") + + hash = { + info: { + "email" => user1.email, + "username" => "test", + "name" => "test", + "nickname" => "minion", + }, + "uid" => "100" + } + + result = authenticator.after_authenticate(hash, existing_account: user2) + + expect(result.user.id).to eq(user2.id) + expect(TwitterUserInfo.exists?(user_id: user1.id)).to eq(false) + expect(TwitterUserInfo.exists?(user_id: user2.id)).to eq(true) + end + + context 'revoke' do + let(:user) { Fabricate(:user) } + let(:authenticator) { Auth::TwitterAuthenticator.new } + + it 'raises exception if no entry for user' do + expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound) + end + + it 'revokes correctly' do + TwitterUserInfo.create!(user_id: user.id, twitter_user_id: 100, screen_name: "boris") + expect(authenticator.can_revoke?).to eq(true) + expect(authenticator.revoke(user)).to eq(true) + expect(authenticator.description_for_user(user)).to eq("") + end + + end + end diff --git a/spec/components/avatar_lookup_spec.rb b/spec/components/avatar_lookup_spec.rb index c744b6301d..7cf86afd44 100644 --- a/spec/components/avatar_lookup_spec.rb +++ b/spec/components/avatar_lookup_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' require_dependency 'avatar_lookup' describe AvatarLookup do - let!(:user) { Fabricate(:user) } + let!(:user) { Fabricate(:user, username: "john_doe", name: "John Doe") } describe '#[]' do before do @@ -20,7 +20,10 @@ describe AvatarLookup do end it 'returns user if user_id exists' do - expect(@avatar_lookup[user.id]).to eq(user) + avatar_lookup_user = @avatar_lookup[user.id] + expect(avatar_lookup_user).to eq(user) + expect(avatar_lookup_user.username).to eq("john_doe") + expect(avatar_lookup_user.name).to eq("John Doe") end end end diff --git a/spec/components/composer_messages_finder_spec.rb b/spec/components/composer_messages_finder_spec.rb index 3425162702..7112e2812d 100644 --- a/spec/components/composer_messages_finder_spec.rb +++ b/spec/components/composer_messages_finder_spec.rb @@ -157,6 +157,7 @@ describe ComposerMessagesFinder do Fabricate(:post, topic: topic, user: user) Fabricate(:post, topic: topic, user: user) + Fabricate(:post, topic: topic, user: user, post_type: Post.types[:small_action]) SiteSetting.sequential_replies_threshold = 2 end diff --git a/spec/components/concern/has_custom_fields_spec.rb b/spec/components/concern/has_custom_fields_spec.rb index 035e0260c5..1a55fc9f7c 100644 --- a/spec/components/concern/has_custom_fields_spec.rb +++ b/spec/components/concern/has_custom_fields_spec.rb @@ -4,8 +4,8 @@ describe HasCustomFields do context "custom_fields" do before do - Topic.exec_sql("create temporary table custom_fields_test_items(id SERIAL primary key)") - Topic.exec_sql("create temporary table custom_fields_test_item_custom_fields(id SERIAL primary key, custom_fields_test_item_id int, name varchar(256) not null, value text)") + DB.exec("create temporary table custom_fields_test_items(id SERIAL primary key)") + DB.exec("create temporary table custom_fields_test_item_custom_fields(id SERIAL primary key, custom_fields_test_item_id int, name varchar(256) not null, value text)") class CustomFieldsTestItem < ActiveRecord::Base include HasCustomFields @@ -17,8 +17,8 @@ describe HasCustomFields do end after do - Topic.exec_sql("drop table custom_fields_test_items") - Topic.exec_sql("drop table custom_fields_test_item_custom_fields") + DB.exec("drop table custom_fields_test_items") + DB.exec("drop table custom_fields_test_item_custom_fields") # import is making my life hard, we need to nuke this out of orbit des = ActiveSupport::DescendantsTracker.class_variable_get :@@direct_descendants @@ -75,7 +75,7 @@ describe HasCustomFields do # should be casted right after saving expect(test_item.custom_fields["a"]).to eq("0") - CustomFieldsTestItem.exec_sql("UPDATE custom_fields_test_item_custom_fields SET value='1' WHERE custom_fields_test_item_id=? AND name='a'", test_item.id) + DB.exec("UPDATE custom_fields_test_item_custom_fields SET value='1' WHERE custom_fields_test_item_id=? AND name='a'", test_item.id) # still the same, did not load expect(test_item.custom_fields["a"]).to eq("0") diff --git a/spec/components/concern/has_search_data_spec.rb b/spec/components/concern/has_search_data_spec.rb index 9cc3089f58..9c8b3728ef 100644 --- a/spec/components/concern/has_search_data_spec.rb +++ b/spec/components/concern/has_search_data_spec.rb @@ -3,8 +3,8 @@ require "rails_helper" describe HasSearchData do context "belongs to its model" do before do - Topic.exec_sql("create temporary table model_items(id SERIAL primary key)") - Topic.exec_sql("create temporary table model_item_search_data(model_item_id int primary key, search_data tsvector, raw_data text, locale text)") + DB.exec("create temporary table model_items(id SERIAL primary key)") + DB.exec("create temporary table model_item_search_data(model_item_id int primary key, search_data tsvector, raw_data text, locale text)") class ModelItem < ActiveRecord::Base has_one :model_item_search_data, dependent: :destroy @@ -16,8 +16,8 @@ describe HasSearchData do end after do - Topic.exec_sql("drop table model_items") - Topic.exec_sql("drop table model_item_search_data") + DB.exec("drop table model_items") + DB.exec("drop table model_item_search_data") # import is making my life hard, we need to nuke this out of orbit des = ActiveSupport::DescendantsTracker.class_variable_get :@@direct_descendants @@ -35,7 +35,7 @@ describe HasSearchData do item end - it 'sets its primary key into asscoiated model' do + it 'sets its primary key into associated model' do expect(ModelItemSearchData.primary_key).to eq 'model_item_id' end diff --git a/spec/components/concern/positionable_spec.rb b/spec/components/concern/positionable_spec.rb index d8433d6711..4ab010a538 100644 --- a/spec/components/concern/positionable_spec.rb +++ b/spec/components/concern/positionable_spec.rb @@ -12,11 +12,11 @@ describe Positionable do include Positionable end - Topic.exec_sql("create temporary table test_items(id int primary key, position int)") + DB.exec("create temporary table test_items(id int primary key, position int)") end after do - Topic.exec_sql("drop table test_items") + DB.exec("drop table test_items") # import is making my life hard, we need to nuke this out of orbit des = ActiveSupport::DescendantsTracker.class_variable_get :@@direct_descendants @@ -25,7 +25,7 @@ describe Positionable do it "can position stuff correctly" do 5.times do |i| - Topic.exec_sql("insert into test_items(id,position) values(#{i}, #{i})") + DB.exec("insert into test_items(id,position) values(#{i}, #{i})") end expect(positions).to eq([0, 1, 2, 3, 4]) diff --git a/spec/components/concern/searchable_spec.rb b/spec/components/concern/searchable_spec.rb index 365f2b16f8..5c55c7d1ff 100644 --- a/spec/components/concern/searchable_spec.rb +++ b/spec/components/concern/searchable_spec.rb @@ -3,8 +3,8 @@ require "rails_helper" describe Searchable do context "has search data" do before do - Topic.exec_sql("create temporary table searchable_records(id SERIAL primary key)") - Topic.exec_sql("create temporary table searchable_record_search_data(searchable_record_id int primary key, search_data tsvector, raw_data text, locale text)") + DB.exec("create temporary table searchable_records(id SERIAL primary key)") + DB.exec("create temporary table searchable_record_search_data(searchable_record_id int primary key, search_data tsvector, raw_data text, locale text)") class SearchableRecord < ActiveRecord::Base include Searchable @@ -17,8 +17,8 @@ describe Searchable do end after do - Topic.exec_sql("drop table searchable_records") - Topic.exec_sql("drop table searchable_record_search_data") + DB.exec("drop table searchable_records") + DB.exec("drop table searchable_record_search_data") # import is making my life hard, we need to nuke this out of orbit des = ActiveSupport::DescendantsTracker.class_variable_get :@@direct_descendants diff --git a/spec/components/concern/second_factor_manager_spec.rb b/spec/components/concern/second_factor_manager_spec.rb index ccecf68da5..0080f2ff67 100644 --- a/spec/components/concern/second_factor_manager_spec.rb +++ b/spec/components/concern/second_factor_manager_spec.rb @@ -1,10 +1,13 @@ require 'rails_helper' RSpec.describe SecondFactorManager do - let(:user_second_factor) { Fabricate(:user_second_factor) } - let(:user) { user_second_factor.user } + let(:user_second_factor_totp) { Fabricate(:user_second_factor_totp) } + let(:user) { user_second_factor_totp.user } let(:another_user) { Fabricate(:user) } + let(:user_second_factor_backup) { Fabricate(:user_second_factor_backup) } + let(:user_backup) { user_second_factor_backup.user } + describe '#totp' do it 'should return the right data' do totp = nil @@ -14,7 +17,7 @@ RSpec.describe SecondFactorManager do end.to change { UserSecondFactor.count }.by(1) expect(totp.issuer).to eq(SiteSetting.title) - expect(totp.secret).to eq(another_user.reload.user_second_factor.data) + expect(totp.secret).to eq(another_user.reload.user_second_factors.totp.data) end end @@ -37,7 +40,7 @@ RSpec.describe SecondFactorManager do describe '#totp_provisioning_uri' do it 'should return the right uri' do expect(user.totp_provisioning_uri).to eq( - "otpauth://totp/#{SiteSetting.title}:#{user.email}?secret=#{user_second_factor.data}&issuer=#{SiteSetting.title}" + "otpauth://totp/#{SiteSetting.title}:#{user.email}?secret=#{user_second_factor_totp.data}&issuer=#{SiteSetting.title}" ) end end @@ -45,12 +48,12 @@ RSpec.describe SecondFactorManager do describe '#authenticate_totp' do it 'should be able to authenticate a token' do freeze_time do - expect(user.user_second_factor.last_used).to eq(nil) + expect(user.user_second_factors.totp.last_used).to eq(nil) token = user.totp.now expect(user.authenticate_totp(token)).to eq(true) - expect(user.user_second_factor.last_used).to eq(DateTime.now) + expect(user.user_second_factors.totp.last_used).to eq(DateTime.now) expect(user.authenticate_totp(token)).to eq(false) end end @@ -58,14 +61,14 @@ RSpec.describe SecondFactorManager do describe 'when token is blank' do it 'should be false' do expect(user.authenticate_totp(nil)).to eq(false) - expect(user.user_second_factor.last_used).to eq(nil) + expect(user.user_second_factors.totp.last_used).to eq(nil) end end describe 'when token is invalid' do it 'should be false' do expect(user.authenticate_totp('111111')).to eq(false) - expect(user.user_second_factor.last_used).to eq(nil) + expect(user.user_second_factors.totp.last_used).to eq(nil) end end end @@ -79,7 +82,7 @@ RSpec.describe SecondFactorManager do describe "when user's second factor record is disabled" do it 'should return false' do - user.user_second_factor.update!(enabled: false) + user.user_second_factors.totp.update!(enabled: false) expect(user.totp_enabled?).to eq(false) end end @@ -107,4 +110,85 @@ RSpec.describe SecondFactorManager do end end end + + context 'backup codes' do + describe '#generate_backup_codes' do + it 'should generate and store 10 backup codes' do + backup_codes = user.generate_backup_codes + + expect(backup_codes.length).to be 10 + expect(user_backup.user_second_factors.backup_codes).to be_present + expect(user_backup.user_second_factors.backup_codes.pluck(:method).uniq[0]).to eq(UserSecondFactor.methods[:backup_codes]) + expect(user_backup.user_second_factors.backup_codes.pluck(:enabled).uniq[0]).to eq(true) + end + end + + describe '#create_backup_codes' do + it 'should create 10 backup code records' do + raw_codes = Array.new(10) { SecureRandom.hex(8) } + backup_codes = another_user.create_backup_codes(raw_codes) + + expect(another_user.user_second_factors.backup_codes.length).to be 10 + end + end + + describe '#authenticate_backup_code' do + it 'should be able to authenticate a backup code' do + backup_code = "iAmValidBackupCode" + + expect(user_backup.authenticate_backup_code(backup_code)).to eq(true) + expect(user_backup.authenticate_backup_code(backup_code)).to eq(false) + end + + describe 'when code is blank' do + it 'should be false' do + expect(user_backup.authenticate_backup_code(nil)).to eq(false) + end + end + + describe 'when code is invalid' do + it 'should be false' do + expect(user_backup.authenticate_backup_code("notValidBackupCode")).to eq(false) + end + end + end + + describe '#backup_codes_enabled?' do + describe 'when user does not have a second factor backup enabled' do + it 'should return false' do + expect(another_user.backup_codes_enabled?).to eq(false) + end + end + + describe "when user's second factor backup codes have been used" do + it 'should return false' do + user_backup.user_second_factors.backup_codes.update_all(enabled: false) + expect(user_backup.backup_codes_enabled?).to eq(false) + end + end + + describe "when user's second factor code is available" do + it 'should return true' do + expect(user_backup.backup_codes_enabled?).to eq(true) + end + end + + describe 'when SSO is enabled' do + it 'should return false' do + SiteSetting.sso_url = 'http://someurl.com' + SiteSetting.enable_sso = true + + expect(user_backup.backup_codes_enabled?).to eq(false) + end + end + + describe 'when local login is disabled' do + it 'should return false' do + SiteSetting.enable_local_logins = false + + expect(user_backup.backup_codes_enabled?).to eq(false) + end + end + end + end end diff --git a/spec/components/cooked_post_processor_spec.rb b/spec/components/cooked_post_processor_spec.rb index 103bbc4f79..8bf669506f 100644 --- a/spec/components/cooked_post_processor_spec.rb +++ b/spec/components/cooked_post_processor_spec.rb @@ -4,18 +4,29 @@ require "cooked_post_processor" describe CookedPostProcessor do context ".post_process" do + let(:upload) do + Fabricate(:upload, + url: '/uploads/default/original/1X/1/1234567890123456.jpg' + ) + end + + let(:post) do + Fabricate(:post, raw: <<~RAW) + + RAW + end - let(:post) { build(:post) } let(:cpp) { CookedPostProcessor.new(post) } let(:post_process) { sequence("post_process") } it "post process in sequence" do cpp.expects(:post_process_oneboxes).in_sequence(post_process) cpp.expects(:post_process_images).in_sequence(post_process) - cpp.expects(:keep_reverse_index_up_to_date).in_sequence(post_process) cpp.expects(:optimize_urls).in_sequence(post_process) cpp.expects(:pull_hotlinked_images).in_sequence(post_process) cpp.post_process + + expect(PostUpload.exists?(post: post, upload: upload)).to eq(true) end end @@ -40,52 +51,6 @@ describe CookedPostProcessor do end end - context ".keep_reverse_index_up_to_date" do - let(:video_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.mp4') } - let(:image_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.jpg') } - let(:audio_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.ogg') } - let(:attachment_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.csv') } - - let(:raw) do - <<~RAW - Link - - - - - - RAW - end - - let(:post) { Fabricate(:post, raw: raw) } - let(:cpp) { CookedPostProcessor.new(post) } - - it "finds all the uploads in the post" do - cpp.keep_reverse_index_up_to_date - - expect(PostUpload.where(post: post).map(&:upload_id).sort).to eq( - [video_upload.id, image_upload.id, audio_upload.id, attachment_upload.id].sort - ) - end - - it "cleans the reverse index up for the current post" do - cpp.keep_reverse_index_up_to_date - - post_uploads_ids = post.post_uploads.pluck(:id) - - cpp.keep_reverse_index_up_to_date - - expect(post.reload.post_uploads.pluck(:id)).to_not eq(post_uploads_ids) - end - - end - context ".post_process_images" do shared_examples "leave dimensions alone" do @@ -152,22 +117,47 @@ describe CookedPostProcessor do before do SiteSetting.max_image_height = 2000 SiteSetting.create_thumbnails = true - - Upload.expects(:get_from_url).returns(upload) FastImage.expects(:size).returns([1750, 2000]) - OptimizedImage.expects(:resize).returns(true) - - FileStore::BaseStore.any_instance.expects(:get_depth_for).returns(0) end it "generates overlay information" do + Upload.expects(:get_from_url).returns(upload) + OptimizedImage.expects(:resize).returns(true) + + FileStore::BaseStore.any_instance.expects(:get_depth_for).returns(0) + cpp.post_process_images - expect(cpp.html).to match_html "

+ expect(cpp.html).to match_html "

" expect(cpp).to be_dirty end + describe 'when image is an svg' do + let(:post) do + Fabricate(:post, raw: '') + end + + it 'should not add lightbox' do + cpp.post_process_images + + expect(cpp.html).to match_html("

") + end + + describe 'when image src is an URL' do + let(:post) do + Fabricate(:post, raw: '') + end + + it 'should not add lightbox' do + SiteSetting.crawl_images = true + cpp.post_process_images + + expect(cpp.html).to match_html("

") + end + end + end + end context "with tall images" do @@ -214,7 +204,7 @@ describe CookedPostProcessor do it "crops the image" do cpp.post_process_images - expect(cpp.html).to match_html "

+ expect(cpp.html).to match_html "

" expect(cpp).to be_dirty @@ -245,7 +235,7 @@ describe CookedPostProcessor do it "generates overlay information" do cpp.post_process_images - expect(cpp.html).to match_html "

+ expect(cpp.html).to match_html "

" expect(cpp).to be_dirty @@ -254,7 +244,7 @@ describe CookedPostProcessor do it "should escape the filename" do upload.update_attributes!(original_filename: ">.png") cpp.post_process_images - expect(cpp.html).to match_html "

+ expect(cpp.html).to match_html "

" end @@ -280,7 +270,7 @@ describe CookedPostProcessor do it "generates overlay information" do cpp.post_process_images - expect(cpp.html).to match_html "

+ expect(cpp.html).to match_html "

" expect(cpp).to be_dirty @@ -488,6 +478,24 @@ describe CookedPostProcessor do expect(cpp).to be_dirty expect(cpp.html).to match_html "
GANGNAM STYLE
" end + + it "replaces downloaded onebox image" do + url = 'https://image.com/my-avatar' + image_url = 'https://image.com/avatar.png' + + Oneboxer.stubs(:onebox).with(url, anything).returns("") + + post = Fabricate(:post, raw: url) + upload = Fabricate(:upload, url: "https://test.s3.amazonaws.com/something.png") + + post.custom_fields[Post::DOWNLOADED_IMAGES] = { "//image.com/avatar.png": upload.id } + post.save_custom_fields + + cpp = CookedPostProcessor.new(post, invalidate_oneboxes: true) + cpp.post_process_oneboxes + + expect(cpp.doc.to_s).to eq("

") + end end context ".post_process_oneboxes removes nofollow if add_rel_nofollow_to_user_content is disabled" do @@ -551,13 +559,14 @@ describe CookedPostProcessor do it "uses schemaless url for uploads" do cpp.optimize_urls - expect(cpp.html).to match_html '

Link
-
+ expect(cpp.html).to match_html <<~HTML +

Link
+
Google

text.txt (20 Bytes)
- :smile: -

' + :smile:

+ HTML end context "when CDN is enabled" do @@ -565,51 +574,55 @@ describe CookedPostProcessor do it "uses schemaless CDN url for http uploads" do Rails.configuration.action_controller.stubs(:asset_host).returns("http://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html '

Link
-
+ expect(cpp.html).to match_html <<~HTML +

Link
+
Google

text.txt (20 Bytes)
- :smile: -

' + :smile:

+ HTML end it "doesn't use schemaless CDN url for https uploads" do Rails.configuration.action_controller.stubs(:asset_host).returns("https://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html '

Link
-
+ expect(cpp.html).to match_html <<~HTML +

Link
+
Google

text.txt (20 Bytes)
- :smile: -

' + :smile:

+ HTML end it "doesn't use CDN when login is required" do SiteSetting.login_required = true Rails.configuration.action_controller.stubs(:asset_host).returns("http://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html '

Link
-
+ expect(cpp.html).to match_html <<~HTML +

Link
+
Google

text.txt (20 Bytes)
- :smile: -

' + :smile:

+ HTML end it "doesn't use CDN when preventing anons from downloading files" do SiteSetting.prevent_anons_from_downloading_files = true Rails.configuration.action_controller.stubs(:asset_host).returns("http://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html '

Link
-
+ expect(cpp.html).to match_html <<~HTML +

Link
+
Google

text.txt (20 Bytes)
- :smile: -

' + :smile:

+ HTML end end diff --git a/spec/components/crawler_detection_spec.rb b/spec/components/crawler_detection_spec.rb index 65f811ef51..7fff4e80cc 100644 --- a/spec/components/crawler_detection_spec.rb +++ b/spec/components/crawler_detection_spec.rb @@ -2,47 +2,61 @@ require 'rails_helper' require_dependency 'crawler_detection' describe CrawlerDetection do + + def crawler!(s) + if (!CrawlerDetection.crawler?(s)) + raise "#{s} should be a crawler!" + end + end + + def not_crawler!(s) + if CrawlerDetection.crawler?(s) + raise "#{s} should not be a crawler!" + end + end + describe "crawler?" do it "can be amended via site settings" do SiteSetting.crawler_user_agents = 'Mooble|Kaboodle+*' - expect(CrawlerDetection.crawler?("Mozilla/5.0 Safari (compatible; Kaboodle+*/2.1; +http://www.google.com/bot.html)")).to eq(true) - expect(CrawlerDetection.crawler?("Mozilla/5.0 Safari (compatible; Mooble+*/2.1; +http://www.google.com/bot.html)")).to eq(true) - expect(CrawlerDetection.crawler?("Mozilla/5.0 Safari (compatible; Gooble+*/2.1; +http://www.google.com/bot.html)")).to eq(false) + + crawler! "Mozilla/5.0 Safari (compatible; Kaboodle+*/2.1; +http://www.google.com/bot.html)" + crawler! "Mozilla/5.0 Safari (compatible; Mooble+*/2.1; +http://www.google.com/bot.html)" + not_crawler! "Mozilla/5.0 Safari (compatible; Gooble+*/2.1; +http://www.google.com/bot.html)" end it "returns true for crawler user agents" do # https://support.google.com/webmasters/answer/1061943?hl=en - expect(described_class.crawler?("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")).to eq(true) - expect(described_class.crawler?("Googlebot/2.1 (+http://www.google.com/bot.html)")).to eq(true) - expect(described_class.crawler?("Googlebot-News")).to eq(true) - expect(described_class.crawler?("Googlebot-Image/1.0")).to eq(true) - expect(described_class.crawler?("Googlebot-Video/1.0")).to eq(true) - expect(described_class.crawler?("(compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)")).to eq(true) - expect(described_class.crawler?("Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")).to eq(true) - expect(described_class.crawler?("(compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)")).to eq(true) - expect(described_class.crawler?("Mediapartners-Google")).to eq(true) - expect(described_class.crawler?("AdsBot-Google (+http://www.google.com/adsbot.html)")).to eq(true) - expect(described_class.crawler?("Twitterbot")).to eq(true) - expect(described_class.crawler?("facebookexternalhit/1.1 (+http(s)://www.facebook.com/externalhit_uatext.php)")).to eq(true) - expect(described_class.crawler?("Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)")).to eq(true) - expect(described_class.crawler?("Baiduspider+(+http://www.baidu.com/search/spider.htm)")).to eq(true) - expect(described_class.crawler?("Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)")).to eq(true) - - expect(described_class.crawler?("DiscourseAPI Ruby Gem 0.19.0")).to eq(true) - expect(described_class.crawler?("Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)")).to eq(true) - expect(described_class.crawler?("LogicMonitor SiteMonitor/1.0")).to eq(true) - expect(described_class.crawler?("Java/1.8.0_151")).to eq(true) - expect(described_class.crawler?("Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)")).to eq(true) + crawler! "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" + crawler! "Googlebot/2.1 (+http://www.google.com/bot.html)" + crawler! "Googlebot-News" + crawler! "Googlebot-Image/1.0" + crawler! "Googlebot-Video/1.0" + crawler! "(compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)" + crawler! "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" + crawler! "(compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)" + crawler! "Mediapartners-Google" + crawler! "AdsBot-Google (+http://www.google.com/adsbot.html)" + crawler! "Twitterbot" + crawler! "facebookexternalhit/1.1 (+http(s)://www.facebook.com/externalhit_uatext.php)" + crawler! "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" + crawler! "Baiduspider+(+http://www.baidu.com/search/spider.htm)" + crawler! "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" + crawler! "DiscourseAPI Ruby Gem 0.19.0" + crawler! "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)" + crawler! "LogicMonitor SiteMonitor/1.0" + crawler! "Java/1.8.0_151" + crawler! "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)" end it "returns false for non-crawler user agents" do - expect(described_class.crawler?("Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36")).to eq(false) - expect(described_class.crawler?("Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko")).to eq(false) - expect(described_class.crawler?("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)")).to eq(false) - expect(described_class.crawler?("Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25")).to eq(false) - expect(described_class.crawler?("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")).to eq(false) - expect(described_class.crawler?("Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30")).to eq(false) + not_crawler! "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36" + not_crawler! "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko" + not_crawler! "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)" + not_crawler! "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25" + not_crawler! "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0" + not_crawler! "Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30" + not_crawler! "Mozilla/5.0 (Linux; Android 6.0; CUBOT DINOSAUR Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Mobile Safari/537.36+" end end diff --git a/spec/components/discourse_i18n_spec.rb b/spec/components/discourse_i18n_spec.rb index 72dfc368ce..77c287ed07 100644 --- a/spec/components/discourse_i18n_spec.rb +++ b/spec/components/discourse_i18n_spec.rb @@ -12,6 +12,7 @@ describe I18n::Backend::DiscourseI18n do backend.store_translations(:en, items: { one: 'one item', other: "%{count} items" }) backend.store_translations(:de, bar: 'Bar in :de') backend.store_translations(:ru, baz: 'Baz in :ru') + backend.store_translations(:en, link: '[text](url)') end after do @@ -32,6 +33,7 @@ describe I18n::Backend::DiscourseI18n do expect(backend.search(:en, 'Foo')).to eq('foo' => 'Foo in :en') expect(backend.search(:en, 'hello')).to eq('wat' => 'Hello %{count}') expect(backend.search(:en, 'items.one')).to eq('items.one' => 'one item') + expect(backend.search(:en, '](')).to eq('link' => '[text](url)') end it 'can return multiple results' do @@ -114,7 +116,9 @@ describe I18n::Backend::DiscourseI18n do TranslationOverride.upsert!('en', 'wat', 'Overwritten value') expect(I18n.search('wat', backend: backend)).to eq('wat' => 'Overwritten value') expect(I18n.search('Overwritten', backend: backend)).to eq('wat' => 'Overwritten value') - expect(I18n.search('Hello', backend: backend)).to eq({}) + + TranslationOverride.upsert!('en', 'wat', 'Overwritten with (parentheses)') + expect(I18n.search('Overwritten with (', backend: backend)).to eq('wat' => 'Overwritten with (parentheses)') end it 'supports disabling' do diff --git a/spec/components/discourse_plugin_registry_spec.rb b/spec/components/discourse_plugin_registry_spec.rb index 82ecbbe680..207352877d 100644 --- a/spec/components/discourse_plugin_registry_spec.rb +++ b/spec/components/discourse_plugin_registry_spec.rb @@ -29,6 +29,13 @@ describe DiscoursePluginRegistry do end end + context '#auth_providers' do + it 'defaults to an empty Set' do + registry.auth_providers = nil + expect(registry.auth_providers).to eq(Set.new) + end + end + context '#admin_javascripts' do it 'defaults to an empty Set' do registry.admin_javascripts = nil @@ -92,6 +99,28 @@ describe DiscoursePluginRegistry do end end + context '.register_auth_provider' do + let(:registry) { DiscoursePluginRegistry } + let(:auth_provider) do + provider = Auth::AuthProvider.new + provider.authenticator = Auth::Authenticator.new + provider + end + + before do + registry.register_auth_provider(auth_provider) + end + + after do + registry.reset! + end + + it 'is returned by DiscoursePluginRegistry.auth_providers' do + expect(registry.auth_providers.include?(auth_provider)).to eq(true) + end + + end + context '.register_service_worker' do let(:registry) { DiscoursePluginRegistry } diff --git a/spec/components/discourse_spec.rb b/spec/components/discourse_spec.rb index b9ef0df7d9..0d0e5df374 100644 --- a/spec/components/discourse_spec.rb +++ b/spec/components/discourse_spec.rb @@ -59,6 +59,54 @@ describe Discourse do end end + context 'authenticators' do + it 'returns inbuilt authenticators' do + expect(Discourse.authenticators).to match_array(Discourse::BUILTIN_AUTH.map(&:authenticator)) + end + + context 'with authentication plugin installed' do + let(:plugin_auth_provider) do + authenticator_class = Class.new(Auth::Authenticator) do + def name + 'pluginauth' + end + + def enabled + true + end + end + + provider = Auth::AuthProvider.new + provider.authenticator = authenticator_class.new + provider + end + + before do + DiscoursePluginRegistry.register_auth_provider(plugin_auth_provider) + end + + after do + DiscoursePluginRegistry.reset! + end + + it 'returns inbuilt and plugin authenticators' do + expect(Discourse.authenticators).to match_array( + Discourse::BUILTIN_AUTH.map(&:authenticator) + [plugin_auth_provider.authenticator]) + end + + end + end + + context 'enabled_authenticators' do + it 'only returns enabled authenticators' do + expect(Discourse.enabled_authenticators.length).to be(0) + expect { SiteSetting.enable_twitter_logins = true } + .to change { Discourse.enabled_authenticators.length }.by(1) + expect(Discourse.enabled_authenticators.length).to be(1) + expect(Discourse.enabled_authenticators.first).to be_instance_of(Auth::TwitterAuthenticator) + end + end + context '#site_contact_user' do let!(:admin) { Fabricate(:admin) } @@ -177,6 +225,7 @@ describe Discourse do it "returns true when user enabled readonly mode key is present in redis" do Discourse.enable_readonly_mode(user_readonly_mode_key) expect(Discourse.readonly_mode?).to eq(true) + expect(Discourse.readonly_mode?(readonly_mode_key)).to eq(false) Discourse.disable_readonly_mode(user_readonly_mode_key) expect(Discourse.readonly_mode?).to eq(false) @@ -225,4 +274,41 @@ describe Discourse do end end + context '#deprecate' do + + class FakeLogger + attr_reader :warnings + def warn(m) + @warnings ||= [] + @warnings << m + end + end + + def old_method(m) + Discourse.deprecate(m) + end + + def old_method_caller(m) + old_method(m) + end + + before do + @orig_logger = Rails.logger + Rails.logger = @fake_logger = FakeLogger.new + end + + after do + Rails.logger = @orig_logger + end + + it 'can deprecate usage' do + k = SecureRandom.hex + expect(old_method_caller(k)).to include("old_method_caller") + expect(old_method_caller(k)).to include("discourse_spec") + expect(old_method_caller(k)).to include(k) + + expect(@fake_logger.warnings).to eq([old_method_caller(k)]) + end + end + end diff --git a/spec/components/distributed_cache_spec.rb b/spec/components/distributed_cache_spec.rb index a1b442edf1..4ff420c96e 100644 --- a/spec/components/distributed_cache_spec.rb +++ b/spec/components/distributed_cache_spec.rb @@ -29,6 +29,20 @@ describe DistributedCache do cache(cache_name) end + it 'supports arrays with hashes' do + + c1 = cache("test1") + c2 = cache("test1") + + c1["test"] = [{ test: :test }] + + wait_for do + c2["test"] == [{ test: :test }] + end + + expect(c2[:test]).to eq([{ test: :test }]) + end + it 'allows us to store Set' do c1 = cache("test1") c2 = cache("test1") diff --git a/spec/components/email/message_builder_spec.rb b/spec/components/email/message_builder_spec.rb index 9ed9200d51..95cb5f4f97 100644 --- a/spec/components/email/message_builder_spec.rb +++ b/spec/components/email/message_builder_spec.rb @@ -9,6 +9,7 @@ describe Email::MessageBuilder do let(:builder) { Email::MessageBuilder.new(to_address, subject: subject, body: body) } let(:build_args) { builder.build_args } let(:header_args) { builder.header_args } + let(:allow_reply_header) { described_class::ALLOW_REPLY_BY_EMAIL_HEADER } it "has the correct to address" do expect(build_args[:to]).to eq(to_address) @@ -44,7 +45,6 @@ describe Email::MessageBuilder do context "with allow_reply_by_email" do let(:reply_by_email_builder) { Email::MessageBuilder.new(to_address, allow_reply_by_email: true) } - let(:reply_key) { reply_by_email_builder.header_args['X-Discourse-Reply-Key'] } context "With the SiteSetting enabled" do before do @@ -52,18 +52,22 @@ describe Email::MessageBuilder do SiteSetting.stubs(:reply_by_email_address).returns("r+%{reply_key}@reply.myforum.com") end - it "has a X-Discourse-Reply-Key" do - expect(reply_key).to be_present - expect(reply_key.size).to eq(32) - end - it "returns a Reply-To header with the reply key" do - expect(reply_by_email_builder.header_args['Reply-To']).to eq("\"#{SiteSetting.title}\" ") + expect(reply_by_email_builder.header_args['Reply-To']) + .to eq("\"#{SiteSetting.title}\" ") + + expect(reply_by_email_builder.header_args[allow_reply_header]) + .to eq(true) end it "cleans up the site title" do SiteSetting.stubs(:title).returns(">>>Obnoxious Title: Deal, \"With\" It<<<") - expect(reply_by_email_builder.header_args['Reply-To']).to eq("\"Obnoxious Title Deal With It\" ") + + expect(reply_by_email_builder.header_args['Reply-To']) + .to eq("\"Obnoxious Title Deal With It\" ") + + expect(reply_by_email_builder.header_args[allow_reply_header]) + .to eq(true) end end @@ -72,33 +76,39 @@ describe Email::MessageBuilder do SiteSetting.stubs(:reply_by_email_enabled?).returns(false) end - it "has no X-Discourse-Reply-Key" do - expect(reply_key).to be_blank - end - it "returns a Reply-To header that's the same as From" do - expect(header_args['Reply-To']).to eq(build_args[:from]) + expect(reply_by_email_builder.header_args['Reply-To']) + .to eq(reply_by_email_builder.build_args[:from]) + + expect(reply_by_email_builder.header_args[allow_reply_header]) + .to eq(nil) end end end context "with allow_reply_by_email" do - let(:reply_by_email_builder) { Email::MessageBuilder.new(to_address, allow_reply_by_email: true, private_reply: true, from_alias: "Username") } - let(:reply_key) { reply_by_email_builder.header_args['X-Discourse-Reply-Key'] } + let(:reply_by_email_builder) do + Email::MessageBuilder.new(to_address, + allow_reply_by_email: true, + private_reply: true, + from_alias: "Username" + ) + end context "With the SiteSetting enabled" do before do SiteSetting.stubs(:reply_by_email_enabled?).returns(true) - SiteSetting.stubs(:reply_by_email_address).returns("r+%{reply_key}@reply.myforum.com") - end - it "has a X-Discourse-Reply-Key" do - expect(reply_key).to be_present - expect(reply_key.size).to eq(32) + SiteSetting.stubs(:reply_by_email_address) + .returns("r+%{reply_key}@reply.myforum.com") end it "returns a Reply-To header with the reply key" do - expect(reply_by_email_builder.header_args['Reply-To']).to eq("\"Username\" ") + expect(reply_by_email_builder.header_args['Reply-To']) + .to eq("\"Username\" ") + + expect(reply_by_email_builder.header_args[allow_reply_header]) + .to eq(true) end end @@ -107,12 +117,12 @@ describe Email::MessageBuilder do SiteSetting.stubs(:reply_by_email_enabled?).returns(false) end - it "has no X-Discourse-Reply-Key" do - expect(reply_key).to be_blank - end - it "returns a Reply-To header that's the same as From" do - expect(header_args['Reply-To']).to eq(build_args[:from]) + expect(reply_by_email_builder.header_args['Reply-To']) + .to eq(reply_by_email_builder.build_args[:from]) + + expect(reply_by_email_builder.header_args[allow_reply_header]) + .to eq(nil) end end end @@ -247,17 +257,6 @@ describe Email::MessageBuilder do end - context "PM multiple participants" do - let(:pm_multiple) { Email::MessageBuilder.new(to_address, - body: 'hello world', - private_reply: true, - participants: "user1, user2") } - - it "lists participants out" do - expect(pm_multiple.body).to match('hello world\nuser1, user2') - end - end - context "from field" do it "has the default from" do diff --git a/spec/components/email/processor_spec.rb b/spec/components/email/processor_spec.rb index 727ea23bb5..c953400f52 100644 --- a/spec/components/email/processor_spec.rb +++ b/spec/components/email/processor_spec.rb @@ -2,9 +2,51 @@ require "rails_helper" require "email/processor" describe Email::Processor do + after do + $redis.flushall + end let(:from) { "foo@bar.com" } + context "when reply via email is too short" do + let(:mail) { file_from_fixtures("chinese_reply.eml", "emails").read } + let(:post) { Fabricate(:post) } + let(:user) { Fabricate(:user, email: 'discourse@bar.com') } + + let!(:post_reply_key) do + Fabricate(:post_reply_key, + user: user, + post: post, + reply_key: '4f97315cc828096c9cb34c6f1a0d6fe8' + ) + end + + before do + SiteSetting.email_in = true + SiteSetting.reply_by_email_address = "reply+%{reply_key}@bar.com" + SiteSetting.min_post_length = 1000 + end + + it "rejects reply and sends an email with custom error message" do + processor = Email::Processor.new(mail) + processor.process! + + rejection_raw = ActionMailer::Base.deliveries.first.body.raw_source + + count = SiteSetting.min_post_length + destination = processor.receiver.mail.to + former_title = processor.receiver.mail.subject + + expect(rejection_raw.gsub(/\r/, "")).to eq( + I18n.t("system_messages.email_reject_post_too_short.text_body_template", + count: count, + destination: destination, + former_title: former_title + ).gsub(/\r/, "") + ) + end + end + describe "rate limits" do let(:mail) { "From: #{from}\nTo: bar@foo.com\nSubject: FOO BAR\n\nFoo foo bar bar?" } @@ -119,4 +161,27 @@ describe Email::Processor do expect { Email::Processor.process!(email) }.to_not change { EmailLog.count } end end + + describe 'when replying to a post that is too old' do + let(:mail) { file_from_fixtures("old_destination.eml", "emails").read } + + it 'rejects the email with the right response' do + SiteSetting.disallow_reply_by_email_after_days = 2 + + topic = Fabricate(:topic, id: 424242) + post = Fabricate(:post, topic: topic, id: 123456, created_at: 3.days.ago) + + processor = Email::Processor.new(mail) + processor.process! + + rejection_raw = ActionMailer::Base.deliveries.first.body.to_s + + expect(rejection_raw).to eq(I18n.t("system_messages.email_reject_old_destination.text_body_template", + destination: '["reply+4f97315cc828096c9cb34c6f1a0d6fe8@bar.com"]', + former_title: 'Some Old Post', + short_url: "#{Discourse.base_url}/p/#{post.id}", + number_of_days: 2 + )) + end + end end diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index a6525afce8..f7721a0e90 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -63,12 +63,12 @@ describe Email::Receiver do it "doesn't raise an InactiveUserError when the sender is staged" do user = Fabricate(:user, email: "staged@bar.com", active: false, staged: true) + post = Fabricate(:post) - email_log = Fabricate(:email_log, - to_address: 'reply+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@bar.com', - reply_key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + post_reply_key = Fabricate(:post_reply_key, user: user, - post: Fabricate(:post) + post: post, + reply_key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ) expect { process(:staged_sender) }.not_to raise_error @@ -79,10 +79,28 @@ describe Email::Receiver do end it "raises an OldDestinationError when notification is too old" do - topic = Fabricate(:topic, id: 424242) - post = Fabricate(:post, topic: topic, id: 123456, created_at: 1.year.ago) + SiteSetting.disallow_reply_by_email_after_days = 2 - expect { process(:old_destination) }.to raise_error(Email::Receiver::OldDestinationError) + topic = Fabricate(:topic, id: 424242) + post = Fabricate(:post, topic: topic, id: 123456) + + expect { process(:old_destination) }.to raise_error( + Email::Receiver::BadDestinationAddress + ) + + IncomingEmail.destroy_all + post.update!(created_at: 3.days.ago) + + expect { process(:old_destination) }.to raise_error( + Email::Receiver::OldDestinationError + ) + + SiteSetting.disallow_reply_by_email_after_days = 0 + IncomingEmail.destroy_all + + expect { process(:old_destination) }.to raise_error( + Email::Receiver::BadDestinationAddress + ) end it "raises a BouncerEmailError when email is a bounced email" do @@ -129,6 +147,17 @@ describe Email::Receiver do expect(email_log_2.bounced).to eq(true) end + it "sends a system message once they reach the 'bounce_score_threshold'" do + expect(user.active).to eq(true) + + user.user_stat.bounce_score = SiteSetting.bounce_score_threshold - 1 + user.user_stat.save! + + SystemMessage.expects(:create_from_system_user).with(user, :email_revoked) + + expect { process(:hard_bounce_via_verp) }.to raise_error(Email::Receiver::BouncedEmailError) + end + it "automatically deactive users once they reach the 'bounce_score_threshold_deactivate' threshold" do expect(user.active).to eq(true) @@ -153,7 +182,14 @@ describe Email::Receiver do let(:user) { Fabricate(:user, email: "discourse@bar.com") } let(:topic) { create_topic(category: category, user: user) } let(:post) { create_post(topic: topic, user: user) } - let!(:email_log) { Fabricate(:email_log, reply_key: reply_key, user: user, topic: topic, post: post) } + + let!(:post_reply_key) do + Fabricate(:post_reply_key, + reply_key: reply_key, + user: user, + post: post + ) + end it "uses MD5 of 'mail_string' there is no message_id" do mail_string = email(:missing_message_id) @@ -169,6 +205,21 @@ describe Email::Receiver do expect { process(:from_reply_by_email_address) }.to raise_error(Email::Receiver::FromReplyByAddressError) end + it "accepts reply from secondary email address" do + Fabricate(:secondary_email, email: "someone_else@bar.com", user: user) + + expect { process(:reply_user_not_matching) } + .to change { topic.posts.count } + + post = Post.last + + expect(post.raw).to eq( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ) + + expect(post.user).to eq(user) + end + it "raises a TopicNotFoundError when the topic was deleted" do topic.update_columns(deleted_at: 1.day.ago) expect { process(:reply_user_matching) }.to raise_error(Email::Receiver::TopicNotFoundError) @@ -185,7 +236,7 @@ describe Email::Receiver do end it "raises an InvalidPost when there was an error while creating the post" do - expect { process(:too_small) }.to raise_error(Email::Receiver::InvalidPost) + expect { process(:too_small) }.to raise_error(Email::Receiver::TooShortPost) end it "raises an InvalidPost when there are too may mentions" do @@ -300,6 +351,12 @@ describe Email::Receiver do expect { process(:staged_reply_restricted) }.to change { topic.posts.count } end + it "posts a reply to the topic when the post was deleted" do + post.update_columns(deleted_at: 1.day.ago) + expect { process(:reply_user_matching) }.to change { topic.posts.count } + expect(topic.ordered_posts.last.reply_to_post_number).to be_nil + end + describe 'Unsubscribing via email' do let(:last_email) { ActionMailer::Base.deliveries.last } @@ -490,32 +547,60 @@ describe Email::Receiver do expect(topic.topic_users.count).to eq(3) end + it "invites users with a secondary email in the chain" do + user1 = Fabricate(:user, + trust_level: SiteSetting.email_in_min_trust, + user_emails: [ + Fabricate.build(:secondary_email, email: "discourse@bar.com"), + Fabricate.build(:secondary_email, email: "someone@else.com"), + ] + ) + + user2 = Fabricate(:user, + trust_level: SiteSetting.email_in_min_trust, + user_emails: [ + Fabricate.build(:secondary_email, email: "team@bar.com"), + Fabricate.build(:secondary_email, email: "wat@bar.com"), + ] + ) + + expect { process(:cc) }.to change(Topic, :count) + expect(Topic.last.allowed_users).to contain_exactly(user1, user2) + end + it "cap the number of staged users created per email" do SiteSetting.maximum_staged_users_per_email = 1 expect { process(:cc) }.to change(Topic, :count) expect(Topic.last.ordered_posts[-1].post_type).to eq(Post.types[:moderator_action]) end - it "associates email replies using both 'In-Reply-To' and 'References' headers when 'find_related_post_with_key' is disabled" do - SiteSetting.find_related_post_with_key = false + describe "when 'find_related_post_with_key' is disabled" do + before do + SiteSetting.find_related_post_with_key = false + end - expect { process(:email_reply_1) }.to change(Topic, :count) + it "associates email replies using both 'In-Reply-To' and 'References' headers" do + expect { process(:email_reply_1) } + .to change(Topic, :count).by(1) & change(Post, :count).by(3) - topic = Topic.last + topic = Topic.last + ordered_posts = topic.ordered_posts - expect { process(:email_reply_2) }.to change { topic.posts.count } - expect { process(:email_reply_3) }.to change { topic.posts.count } + expect(ordered_posts.first.raw).to eq('This is email reply **1**.') - # Why 5 when we only processed 3 emails? - # - 3 of them are indeed "regular" posts generated from the emails - # - The 2 others are "small action" posts automatically added because - # we invited 2 users (two@foo.com and three@foo.com) - expect(topic.posts.count).to eq(5) + ordered_posts[1..-1].each do |post| + expect(post.action_code).to eq('invited_user') + expect(post.user.email).to eq('one@foo.com') - # trash all but the 1st post - topic.ordered_posts[1..-1].each(&:trash!) + expect(%w{two three}.include?(post.custom_fields["action_code_who"])) + .to eq(true) + end - expect { process(:email_reply_4) }.to change { topic.posts.count } + expect { process(:email_reply_2) }.to change { topic.posts.count }.by(1) + expect { process(:email_reply_3) }.to change { topic.posts.count }.by(1) + ordered_posts[1..-1].each(&:trash!) + expect { process(:email_reply_4) }.to change { topic.posts.count }.by(1) + end end it "supports any kind of attachments when 'allow_all_attachments_for_group_messages' is enabled" do @@ -568,7 +653,6 @@ describe Email::Receiver do context "when message sent to a group has no key and find_related_post_with_key is enabled" do let!(:topic) do - SiteSetting.find_related_post_with_key = true process(:email_reply_1) Topic.last end @@ -622,6 +706,51 @@ describe Email::Receiver do expect { process(:new_user) }.to change(Topic, :count) end + it "creates visible topic for ham" do + SiteSetting.email_in_spam_header = 'none' + + Fabricate(:user, email: "existing@bar.com", trust_level: SiteSetting.email_in_min_trust) + expect { process(:existing_user) }.to change { Topic.count }.by(1) # Topic created + + topic = Topic.last + expect(topic.visible).to eq(true) + + post = Post.last + expect(post.hidden).to eq(false) + expect(post.hidden_at).to eq(nil) + expect(post.hidden_reason_id).to eq(nil) + end + + it "creates hidden topic for X-Spam-Flag" do + SiteSetting.email_in_spam_header = 'X-Spam-Flag' + + Fabricate(:user, email: "existing@bar.com", trust_level: SiteSetting.email_in_min_trust) + expect { process(:spam_x_spam_flag) }.to change { Topic.count }.by(1) # Topic created + + topic = Topic.last + expect(topic.visible).to eq(false) + + post = Post.last + expect(post.hidden).to eq(true) + expect(post.hidden_at).not_to eq(nil) + expect(post.hidden_reason_id).to eq(Post.hidden_reasons[:email_spam_header_found]) + end + + it "creates hidden topic for X-Spam-Status" do + SiteSetting.email_in_spam_header = 'X-Spam-Status' + + Fabricate(:user, email: "existing@bar.com", trust_level: SiteSetting.email_in_min_trust) + expect { process(:spam_x_spam_status) }.to change { Topic.count }.by(1) # Topic created + + topic = Topic.last + expect(topic.visible).to eq(false) + + post = Post.last + expect(post.hidden).to eq(true) + expect(post.hidden_at).not_to eq(nil) + expect(post.hidden_reason_id).to eq(Post.hidden_reasons[:email_spam_header_found]) + end + it "adds the 'elided' part of the original message when always_show_trimmed_content is enabled" do SiteSetting.always_show_trimmed_content = true @@ -651,6 +780,24 @@ describe Email::Receiver do SiteSetting.ignore_by_title = "foo" expect { process(:ignored) }.to_not change(Topic, :count) end + + it "associates email from a secondary address with user" do + user = Fabricate(:user, + trust_level: SiteSetting.email_in_min_trust, + user_emails: [ + Fabricate.build(:secondary_email, email: "existing@bar.com") + ] + ) + + expect { process(:existing_user) }.to change(Topic, :count).by(1) + + topic = Topic.last + + expect(topic.posts.last.raw) + .to eq("Hey, this is a topic from an existing user ;)") + + expect(topic.user).to eq(user) + end end context "new topic in a category that allows strangers" do @@ -715,12 +862,15 @@ describe Email::Receiver do context "with a valid reply" do it "returns the destination when the key is valid" do - Fabricate(:email_log, reply_key: '4f97315cc828096c9cb34c6f1a0d6fe8') + post_reply_key = Fabricate(:post_reply_key, + reply_key: '4f97315cc828096c9cb34c6f1a0d6fe8' + ) dest = Email::Receiver.check_address('foo+4f97315cc828096c9cb34c6f1a0d6fe8@bar.com') + expect(dest).to be_present expect(dest[:type]).to eq(:reply) - expect(dest[:obj]).to be_present + expect(dest[:obj]).to eq(post_reply_key) end end end @@ -826,7 +976,10 @@ describe Email::Receiver do let(:user) { Fabricate(:user, email: "discourse@bar.com") } let(:topic) { create_topic(category: category, user: user) } let(:post) { create_post(topic: topic, user: user) } - let!(:email_log) { Fabricate(:email_log, reply_key: reply_key, user: user, topic: topic, post: post) } + + let!(:post_reply_key) do + Fabricate(:post_reply_key, reply_key: reply_key, user: user, post: post) + end context "when the email address isn't matching the one we sent the notification to" do include_examples "no staged users", :reply_user_not_matching, Email::Receiver::ReplyUserNotMatchingError @@ -878,7 +1031,6 @@ describe Email::Receiver do before do SiteSetting.block_auto_generated_emails = true - SiteSetting.find_related_post_with_key = true end it "should allow creating topic even when email is autogenerated" do diff --git a/spec/components/email/sender_spec.rb b/spec/components/email/sender_spec.rb index 7c73e7e2fb..321b2690a1 100644 --- a/spec/components/email/sender_spec.rb +++ b/spec/components/email/sender_spec.rb @@ -2,19 +2,43 @@ require 'rails_helper' require 'email/sender' describe Email::Sender do + let(:post) { Fabricate(:post) } - it "doesn't deliver mail when mails are disabled" do - SiteSetting.disable_emails = true - Mail::Message.any_instance.expects(:deliver_now).never - message = Mail::Message.new(to: "hello@world.com" , body: "hello") - expect(Email::Sender.new(message, :hello).send).to eq(nil) - end + context "disable_emails is enabled" do + let(:user) { Fabricate(:user) } + let(:moderator) { Fabricate(:moderator) } - it "delivers mail when mails are disabled but the email_type is admin_login" do - SiteSetting.disable_emails = true - Mail::Message.any_instance.expects(:deliver_now).once - message = Mail::Message.new(to: "hello@world.com" , body: "hello") - Email::Sender.new(message, :admin_login).send + context "disable_emails is enabled for everyone" do + before { SiteSetting.disable_emails = "yes" } + + it "doesn't deliver mail when mails are disabled" do + Mail::Message.any_instance.expects(:deliver_now).never + message = Mail::Message.new(to: moderator.email , body: "hello") + expect(Email::Sender.new(message, :hello).send).to eq(nil) + end + + it "delivers mail when mails are disabled but the email_type is admin_login" do + Mail::Message.any_instance.expects(:deliver_now).once + message = Mail::Message.new(to: moderator.email , body: "hello") + Email::Sender.new(message, :admin_login).send + end + end + + context "disable_emails is enabled for non-staff users" do + before { SiteSetting.disable_emails = "non-staff" } + + it "doesn't deliver mail to normal user" do + Mail::Message.any_instance.expects(:deliver_now).never + message = Mail::Message.new(to: user.email, body: "hello") + expect(Email::Sender.new(message, :hello).send).to eq(nil) + end + + it "delivers mail to staff user" do + Mail::Message.any_instance.expects(:deliver_now).once + message = Mail::Message.new(to: moderator.email, body: "hello") + Email::Sender.new(message, :hello).send + end + end end it "doesn't deliver mail when the message is of type NullMail" do @@ -269,19 +293,19 @@ describe Email::Sender do let(:email_log) { EmailLog.last } it 'should create the right log' do - email_sender.send + expect do + email_sender.send + end.to_not change { PostReplyKey.count } expect(email_log).to be_present expect(email_log.email_type).to eq('valid_type') expect(email_log.to_address).to eq('eviltrout@test.domain') - expect(email_log.reply_key).to be_blank expect(email_log.user_id).to be_blank end end context "email log with a post id and topic id" do - let(:topic) { Fabricate(:topic) } - let(:post) { Fabricate(:post, topic: topic) } + let(:topic) { post.topic } before do message.header['X-Discourse-Post-Id'] = post.id @@ -293,20 +317,7 @@ describe Email::Sender do it 'should create the right log' do email_sender.send expect(email_log.post_id).to eq(post.id) - expect(email_log.topic_id).to eq(topic.id) - end - end - - context "email log with a reply key" do - before do - message.header['X-Discourse-Reply-Key'] = reply_key - end - - let(:email_log) { EmailLog.last } - - it 'should create the right log' do - email_sender.send - expect(email_log.reply_key).to eq(reply_key) + expect(email_log.topic.id).to eq(topic.id) end end @@ -322,6 +333,25 @@ describe Email::Sender do end end + context 'with a deleted post' do + + it 'should skip sending the email' do + post = Fabricate(:post, deleted_at: 1.day.ago) + + message = Mail::Message.new to: 'disc@ourse.org', body: 'some content' + message.header['X-Discourse-Post-Id'] = post.id + message.header['X-Discourse-Topic-Id'] = post.topic_id + message.expects(:deliver_now).never + + email_sender = Email::Sender.new(message, :valid_type) + expect { email_sender.send }.to change { SkippedEmailLog.count } + + log = SkippedEmailLog.last + expect(log.reason_type).to eq(SkippedEmailLog.reason_types[:sender_post_deleted]) + end + + end + context 'with a user' do let(:message) do message = Mail::Message.new to: 'eviltrout@test.domain', body: 'test body' @@ -341,6 +371,42 @@ describe Email::Sender do expect(@email_log.user_id).to eq(user.id) end + describe "post reply keys" do + let(:post) { Fabricate(:post) } + + before do + message.header['X-Discourse-Post-Id'] = post.id + message.header['Reply-To'] = "test-%{reply_key}@test.com" + end + + describe 'when allow reply by email header is not present' do + it 'should not create a post reply key' do + expect { email_sender.send }.to_not change { PostReplyKey.count } + end + end + + describe 'when allow reply by email header is present' do + let(:header) { Email::MessageBuilder::ALLOW_REPLY_BY_EMAIL_HEADER } + + before do + message.header[header] = "test-%{reply_key}@test.com" + end + + it 'should create a post reply key' do + expect { email_sender.send }.to change { PostReplyKey.count }.by(1) + post_reply_key = PostReplyKey.last + + expect(message.header['Reply-To'].value).to eq( + "test-#{post_reply_key.reply_key}@test.com" + ) + + expect(message.header[header]).to eq(nil) + expect(post_reply_key.user_id).to eq(user.id) + expect(post_reply_key.post_id).to eq(post.id) + expect { email_sender.send }.to change { PostReplyKey.count }.by(0) + end + end + end end end diff --git a/spec/components/file_helper_spec.rb b/spec/components/file_helper_spec.rb index 2ba6cb405e..ec81a94b57 100644 --- a/spec/components/file_helper_spec.rb +++ b/spec/components/file_helper_spec.rb @@ -4,7 +4,7 @@ require 'file_helper' describe FileHelper do let(:url) { "https://eviltrout.com/trout.png" } - let(:png) { Base64.decode64("R0lGODlhAQABALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//wBiZCH5BAEAAA8ALAAAAAABAAEAAAQC8EUAOw==") } + let(:png) { File.read("#{Rails.root}/spec/fixtures/images/cropped.png") } before do stub_request(:any, /https:\/\/eviltrout.com/) @@ -12,7 +12,6 @@ describe FileHelper do end describe "download" do - it "correctly raises an OpenURI HTTP error if it gets a 404 even with redirect" do url = "http://fourohfour.com/404" stub_request(:get, url).to_return(status: 404, body: "404") @@ -53,21 +52,80 @@ describe FileHelper do end it "returns a file with the image" do - tmpfile = FileHelper.download( - url, - max_file_size: 10000, - tmp_file_name: 'trouttmp' - ) - expect(tmpfile.read[0..5]).to eq("GIF89a") + begin + tmpfile = FileHelper.download( + url, + max_file_size: 10000, + tmp_file_name: 'trouttmp' + ) + + expect(Base64.encode64(tmpfile.read)).to eq(Base64.encode64(png)) + ensure + tmpfile&.close + end end it "works with a protocol relative url" do - tmpfile = FileHelper.download( - "//eviltrout.com/trout.png", - max_file_size: 10000, - tmp_file_name: 'trouttmp' - ) - expect(tmpfile.read[0..5]).to eq("GIF89a") + begin + tmpfile = FileHelper.download( + "//eviltrout.com/trout.png", + max_file_size: 10000, + tmp_file_name: 'trouttmp' + ) + + expect(Base64.encode64(tmpfile.read)).to eq(Base64.encode64(png)) + ensure + tmpfile&.close + end + end + + describe 'when max_file_size is exceeded' do + it 'should return nil' do + tmpfile = FileHelper.download( + "//eviltrout.com/trout.png", + max_file_size: 1, + tmp_file_name: 'trouttmp' + ) + + expect(tmpfile).to eq(nil) + end + + it 'is able to retain the tmpfile' do + begin + tmpfile = FileHelper.download( + "//eviltrout.com/trout.png", + max_file_size: 1, + tmp_file_name: 'trouttmp', + retain_on_max_file_size_exceeded: true + ) + + expect(tmpfile.closed?).to eq(false) + ensure + tmpfile&.close + end + end + end + + describe 'when url is a jpeg' do + let(:url) { "https://eviltrout.com/trout.jpg" } + + it "should prioritize the content type returned by the response" do + begin + stub_request(:get, url).to_return(body: png, headers: { + "content-type": "image/png" + }) + + tmpfile = FileHelper.download( + url, + max_file_size: 10000, + tmp_file_name: 'trouttmp' + ) + + expect(File.extname(tmpfile)).to eq('.png') + ensure + tmpfile&.close + end + end end end diff --git a/spec/components/file_store/base_store_spec.rb b/spec/components/file_store/base_store_spec.rb index 89f0a105da..20d898ee36 100644 --- a/spec/components/file_store/base_store_spec.rb +++ b/spec/components/file_store/base_store_spec.rb @@ -1,4 +1,5 @@ require 'rails_helper' +require_dependency 'file_store/base_store' RSpec.describe FileStore::BaseStore do let(:upload) { Fabricate(:upload, id: 9999, sha1: Digest::SHA1.hexdigest('9999')) } diff --git a/spec/components/file_store/s3_store_spec.rb b/spec/components/file_store/s3_store_spec.rb index 00df4f36f9..53db46819e 100644 --- a/spec/components/file_store/s3_store_spec.rb +++ b/spec/components/file_store/s3_store_spec.rb @@ -41,14 +41,14 @@ describe FileStore::S3Store do describe "#store_upload" do it "returns an absolute schemaless url" do store.expects(:get_depth_for).with(upload.id).returns(0) - s3_helper.expects(:s3_bucket).returns(s3_bucket) + s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once s3_object = stub s3_bucket.expects(:object).with("original/1X/#{upload.sha1}.png").returns(s3_object) s3_object.expects(:upload_file) expect(store.store_upload(uploaded_file, upload)).to eq( - "//s3-upload-bucket.s3-us-west-1.amazonaws.com/original/1X/#{upload.sha1}.png" + "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/original/1X/#{upload.sha1}.png" ) end @@ -66,7 +66,7 @@ describe FileStore::S3Store do s3_object.expects(:upload_file) expect(store.store_upload(uploaded_file, upload)).to eq( - "//s3-upload-bucket.s3-us-west-1.amazonaws.com/discourse-uploads/original/1X/#{upload.sha1}.png" + "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/discourse-uploads/original/1X/#{upload.sha1}.png" ) end end @@ -83,7 +83,7 @@ describe FileStore::S3Store do s3_object.expects(:upload_file) expect(store.store_optimized_image(optimized_image_file, optimized_image)).to eq( - "//s3-upload-bucket.s3-us-west-1.amazonaws.com/#{path}" + "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/#{path}" ) end @@ -102,21 +102,48 @@ describe FileStore::S3Store do s3_object.expects(:upload_file) expect(store.store_optimized_image(optimized_image_file, optimized_image)).to eq( - "//s3-upload-bucket.s3-us-west-1.amazonaws.com/#{path}" + "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/#{path}" ) end end end end + context 'copying files in S3' do + include_context "s3 helpers" + + describe '#copy_file' do + it "copies the from in S3 with the right paths" do + s3_helper.expects(:s3_bucket).returns(s3_bucket) + + upload.update!( + url: "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/original/1X/#{upload.sha1}.png" + ) + + source = Discourse.store.get_path_for_upload(upload) + destination = Discourse.store.get_path_for_upload(upload).sub('.png', '.jpg') + + s3_object = stub + + s3_bucket.expects(:object).with(destination).returns(s3_object) + + s3_object.expects(:copy_from).with( + copy_source: "s3-upload-bucket/#{source}" + ) + + store.copy_file(upload.url, source, destination) + end + end + end + context 'removal from s3' do include_context "s3 helpers" describe "#remove_upload" do it "removes the file from s3 with the right paths" do store.expects(:get_depth_for).with(upload.id).returns(0) - s3_helper.expects(:s3_bucket).returns(s3_bucket) - upload.update_attributes!(url: "//s3-upload-bucket.s3-us-west-1.amazonaws.com/original/1X/#{upload.sha1}.png") + s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once + upload.update_attributes!(url: "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/original/1X/#{upload.sha1}.png") s3_object = stub s3_bucket.expects(:object).with("tombstone/original/1X/#{upload.sha1}.png").returns(s3_object) @@ -134,8 +161,8 @@ describe FileStore::S3Store do it "removes the file from s3 with the right paths" do store.expects(:get_depth_for).with(upload.id).returns(0) - s3_helper.expects(:s3_bucket).returns(s3_bucket) - upload.update_attributes!(url: "//s3-upload-bucket.s3-us-west-1.amazonaws.com/discourse-uploads/original/1X/#{upload.sha1}.png") + s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once + upload.update_attributes!(url: "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/discourse-uploads/original/1X/#{upload.sha1}.png") s3_object = stub s3_bucket.expects(:object).with("discourse-uploads/tombstone/original/1X/#{upload.sha1}.png").returns(s3_object) @@ -151,14 +178,14 @@ describe FileStore::S3Store do describe "#remove_optimized_image" do let(:optimized_image) do Fabricate(:optimized_image, - url: "//s3-upload-bucket.s3-us-west-1.amazonaws.com/optimized/1X/#{upload.sha1}_1_100x200.png", + url: "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/optimized/1X/#{upload.sha1}_1_100x200.png", upload: upload ) end it "removes the file from s3 with the right paths" do store.expects(:get_depth_for).with(optimized_image.upload.id).returns(0) - s3_helper.expects(:s3_bucket).returns(s3_bucket) + s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once s3_object = stub s3_bucket.expects(:object).with("tombstone/optimized/1X/#{upload.sha1}_1_100x200.png").returns(s3_object) @@ -176,7 +203,7 @@ describe FileStore::S3Store do it "removes the file from s3 with the right paths" do store.expects(:get_depth_for).with(optimized_image.upload.id).returns(0) - s3_helper.expects(:s3_bucket).returns(s3_bucket) + s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once s3_object = stub s3_bucket.expects(:object).with("discourse-uploads/tombstone/optimized/1X/#{upload.sha1}_1_100x200.png").returns(s3_object) @@ -193,10 +220,11 @@ describe FileStore::S3Store do describe ".has_been_uploaded?" do it "identifies S3 uploads" do - expect(store.has_been_uploaded?("//s3-upload-bucket.s3.amazonaws.com/1337.png")).to eq(true) + expect(store.has_been_uploaded?("//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/1337.png")).to eq(true) end it "does not match other s3 urls" do + expect(store.has_been_uploaded?("//s3-upload-bucket.s3.amazonaws.com/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s3-upload-bucket.s3-us-east-1.amazonaws.com/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s3.amazonaws.com/s3-upload-bucket/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s4_upload_bucket.s3.amazonaws.com/1337.png")).to eq(false) @@ -206,19 +234,21 @@ describe FileStore::S3Store do describe ".absolute_base_url" do it "returns a lowercase schemaless absolute url" do - expect(store.absolute_base_url).to eq("//s3-upload-bucket.s3.amazonaws.com") + expect(store.absolute_base_url).to eq("//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com") end it "uses the proper endpoint" do SiteSetting.s3_region = "us-east-1" - expect(FileStore::S3Store.new(s3_helper).absolute_base_url).to eq("//s3-upload-bucket.s3.amazonaws.com") + expect(FileStore::S3Store.new(s3_helper).absolute_base_url).to eq("//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com") SiteSetting.s3_region = "us-west-2" - expect(FileStore::S3Store.new(s3_helper).absolute_base_url).to eq("//s3-upload-bucket.s3-us-west-2.amazonaws.com") + expect(FileStore::S3Store.new(s3_helper).absolute_base_url).to eq("//s3-upload-bucket.s3.dualstack.us-west-2.amazonaws.com") SiteSetting.s3_region = "cn-north-1" expect(FileStore::S3Store.new(s3_helper).absolute_base_url).to eq("//s3-upload-bucket.s3.cn-north-1.amazonaws.com.cn") + SiteSetting.s3_region = "cn-northwest-1" + expect(FileStore::S3Store.new(s3_helper).absolute_base_url).to eq("//s3-upload-bucket.s3.cn-northwest-1.amazonaws.com.cn") end end @@ -255,4 +285,22 @@ describe FileStore::S3Store do assert_path("https://hello", nil) end end + + describe '.cdn_url' do + + it 'supports subfolder' do + SiteSetting.s3_upload_bucket = 's3-upload-bucket/livechat' + SiteSetting.s3_cdn_url = 'https://rainbow.com' + + # none of this should matter at all + # subfolder should not leak into uploads + global_setting :relative_url_root, '/community' + Discourse.stubs(:base_uri).returns("/community") + + url = "//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/livechat/original/gif.png" + + expect(store.cdn_url(url)).to eq("https://rainbow.com/original/gif.png") + end + end + end diff --git a/spec/components/final_destination_spec.rb b/spec/components/final_destination_spec.rb index 6a30757a7c..78105c7f0d 100644 --- a/spec/components/final_destination_spec.rb +++ b/spec/components/final_destination_spec.rb @@ -47,6 +47,14 @@ describe FinalDestination do FinalDestination.new(url, opts) end + it 'correctly parses ignored hostnames' do + fd = FinalDestination.new('https://meta.discourse.org', + ignore_redirects: ['http://google.com', 'youtube.com', 'https://meta.discourse.org', '://bing.com'] + ) + + expect(fd.ignored).to eq(['test.localhost', 'google.com', 'meta.discourse.org']) + end + describe '.resolve' do it "has a ready status code before anything happens" do diff --git a/spec/components/freedom_patches/pool_drainer_spec.rb b/spec/components/freedom_patches/pool_drainer_spec.rb deleted file mode 100644 index 32fc98dc85..0000000000 --- a/spec/components/freedom_patches/pool_drainer_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'rails_helper' - -describe 'pool drainer' do - let(:pool) do - ActiveRecord::Base.connection_pool - end - - it 'can correctly drain the connection pool' do - pool.drain - old = pool.connections.length - expect(old).to eq(1) - - Thread.new do - conn = pool.checkout - pool.checkin conn - end.join - - expect(pool.connections.length).to eq(old + 1) - pool.drain - expect(pool.connections.length).to eq(old) - end - - it 'can drain with idle time setting' do - pool.drain - old = pool.connections.length - expect(old).to eq(1) - - Thread.new do - conn = pool.checkout - pool.checkin conn - end.join - - expect(pool.connections.length).to eq(old + 1) - pool.drain(1.minute) - expect(pool.connections.length).to eq(old + 1) - - # make sure we don't corrupt internal state - 20.times do - conn = pool.checkout - pool.checkin conn - pool.drain - end - - end - -end diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index 5b29ff6f43..fc620ecc03 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -26,21 +26,59 @@ describe Guardian do expect { Guardian.new(user) }.not_to raise_error end + describe "link_posting_access" do + it "is none for anonymous users" do + expect(Guardian.new.link_posting_access).to eq('none') + end + + it "is full for regular users" do + expect(Guardian.new(user).link_posting_access).to eq('full') + end + + it "is none for a user of a low trust level" do + user.trust_level = 0 + SiteSetting.min_trust_to_post_links = 1 + expect(Guardian.new(user).link_posting_access).to eq('none') + end + + it "is limited for a user of a low trust level with a whitelist" do + SiteSetting.whitelisted_link_domains = 'example.com' + user.trust_level = 0 + SiteSetting.min_trust_to_post_links = 1 + expect(Guardian.new(user).link_posting_access).to eq('limited') + end + end + describe "can_post_link?" do + let(:host) { "discourse.org" } + it "returns false for anonymous users" do - expect(Guardian.new.can_post_link?).to eq(false) + expect(Guardian.new.can_post_link?(host: host)).to eq(false) end it "returns true for a regular user" do - expect(Guardian.new(user).can_post_link?).to eq(true) + expect(Guardian.new(user).can_post_link?(host: host)).to eq(true) end it "supports customization by site setting" do user.trust_level = 0 SiteSetting.min_trust_to_post_links = 0 - expect(Guardian.new(user).can_post_link?).to eq(true) + expect(Guardian.new(user).can_post_link?(host: host)).to eq(true) SiteSetting.min_trust_to_post_links = 1 - expect(Guardian.new(user).can_post_link?).to eq(false) + expect(Guardian.new(user).can_post_link?(host: host)).to eq(false) + end + + describe "whitelisted host" do + before do + SiteSetting.whitelisted_link_domains = host + end + + it "allows a new user to post the link to the host" do + user.trust_level = 0 + SiteSetting.min_trust_to_post_links = 1 + expect(Guardian.new(user).can_post_link?(host: host)).to eq(true) + expect(Guardian.new(user).can_post_link?(host: 'another-host.com')).to eq(false) + end end end @@ -66,6 +104,13 @@ describe Guardian do expect(Guardian.new(user).post_can_act?(post, :like)).to be_falsey end + it "works as expected for silenced users" do + UserSilencer.silence(user, admin) + expect(Guardian.new(user).post_can_act?(post, :spam)).to be_falsey + expect(Guardian.new(user).post_can_act?(post, :like)).to be_truthy + expect(Guardian.new(user).post_can_act?(post, :bookmark)).to be_truthy + end + it "allows flagging archived posts" do post.topic.archived = true expect(Guardian.new(user).post_can_act?(post, :spam)).to be_truthy @@ -77,16 +122,26 @@ describe Guardian do expect(Guardian.new(user).post_can_act?(staff_post, :spam)).to be_truthy end - it "doesn't allow flagging of staff posts when allow_flagging_staff is false" do - SiteSetting.allow_flagging_staff = false - staff_post = Fabricate(:post, user: Fabricate(:moderator)) - expect(Guardian.new(user).post_can_act?(staff_post, :spam)).to eq(false) - end + describe 'when allow_flagging_staff is false' do + let(:staff_post) { Fabricate(:post, user: Fabricate(:moderator)) } - it "allows liking of staff when allow_flagging_staff is false" do - SiteSetting.allow_flagging_staff = false - staff_post = Fabricate(:post, user: Fabricate(:moderator)) - expect(Guardian.new(user).post_can_act?(staff_post, :like)).to eq(true) + before do + SiteSetting.allow_flagging_staff = false + end + + it "doesn't allow flagging of staff posts" do + expect(Guardian.new(user).post_can_act?(staff_post, :spam)).to eq(false) + end + + it "allows flagging of staff posts when staff has been deleted" do + staff_post.user.destroy! + staff_post.reload + expect(Guardian.new(user).post_can_act?(staff_post, :spam)).to eq(true) + end + + it "allows liking of staff" do + expect(Guardian.new(user).post_can_act?(staff_post, :like)).to eq(true) + end end it "returns false when liking yourself" do @@ -369,7 +424,6 @@ describe Guardian do expect(guardian.can_see_post_actors?(topic, PostActionType.types[:bookmark])).to be_falsey expect(guardian.can_see_post_actors?(topic, PostActionType.types[:off_topic])).to be_falsey expect(guardian.can_see_post_actors?(topic, PostActionType.types[:spam])).to be_falsey - expect(guardian.can_see_post_actors?(topic, PostActionType.types[:vote])).to be_truthy expect(guardian.can_see_post_actors?(topic, PostActionType.types[:notify_user])).to be_falsey expect(Guardian.new(moderator).can_see_post_actors?(topic, PostActionType.types[:notify_user])).to be_truthy @@ -514,6 +568,7 @@ describe Guardian do let(:user) { Fabricate(:user, trust_level: TrustLevel[2]) } let!(:pm) { Fabricate(:private_message_topic, user: user) } let(:admin) { Fabricate(:admin) } + let(:moderator) { Fabricate(:moderator) } context "when private messages are disabled" do it "allows an admin to invite to the pm" do @@ -532,6 +587,22 @@ describe Guardian do expect(Guardian.new(user).can_invite_to?(pm)).to be_falsey end end + + context "when PM has receached the maximum number of recipients" do + before do + SiteSetting.max_allowed_message_recipients = 2 + end + + it "doesn't allow a regular user to invite" do + expect(Guardian.new(user).can_invite_to?(pm)).to be_falsey + end + + it "allows staff to invite" do + expect(Guardian.new(admin).can_invite_to?(pm)).to be_truthy + pm.grant_permission_to_user(moderator.email) + expect(Guardian.new(moderator).can_invite_to?(pm)).to be_truthy + end + end end end @@ -999,18 +1070,6 @@ describe Guardian do expect(guardian.post_can_act?(post, :vote)).to be_truthy end - it "doesn't allow voting if the user has an action from voting already" do - expect(guardian.post_can_act?(post, :vote, opts: { - taken_actions: { PostActionType.types[:vote] => 1 } - })).to be_falsey - end - - it "allows voting if the user has performed a different action" do - expect(guardian.post_can_act?(post, :vote, opts: { - taken_actions: { PostActionType.types[:like] => 1 } - })).to be_truthy - end - it "isn't allowed on archived topics" do topic.archived = true expect(Guardian.new(user).post_can_act?(post, :like)).to be_falsey @@ -1144,6 +1203,11 @@ describe Guardian do describe 'a Post' do + it 'returns false for silenced users' do + post.user.silenced_till = 1.day.from_now + expect(Guardian.new(post.user).can_edit?(post)).to be_falsey + end + it 'returns false when not logged in' do expect(Guardian.new.can_edit?(post)).to be_falsey end @@ -1669,34 +1733,6 @@ describe Guardian do expect(Guardian.new(admin).can_delete?(post)).to be_falsey end - context 'post is older than post_edit_time_limit' do - let(:old_post) { build(:post, topic: topic, user: topic.user, post_number: 2, created_at: 6.minutes.ago) } - before do - SiteSetting.post_edit_time_limit = 5 - end - - it 'returns false to the author of the post' do - expect(Guardian.new(old_post.user).can_delete?(old_post)).to eq(false) - end - - it 'returns true as a moderator' do - expect(Guardian.new(moderator).can_delete?(old_post)).to eq(true) - end - - it 'returns true as an admin' do - expect(Guardian.new(admin).can_delete?(old_post)).to eq(true) - end - - it "returns false when it's the OP, even as a moderator" do - old_post.post_number = 1 - expect(Guardian.new(moderator).can_delete?(old_post)).to eq(false) - end - - it 'returns false for another regular user trying to delete your post' do - expect(Guardian.new(coding_horror).can_delete?(old_post)).to eq(false) - end - end - context 'the topic is archived' do before do post.topic.archived = true @@ -2540,6 +2576,49 @@ describe Guardian do end end + describe "#allow_themes?" do + let(:theme) { Fabricate(:theme) } + let(:theme2) { Fabricate(:theme) } + + it "allows staff to use any themes" do + expect(Guardian.new(moderator).allow_themes?([theme.id, theme2.id])).to eq(false) + expect(Guardian.new(admin).allow_themes?([theme.id, theme2.id])).to eq(false) + + expect(Guardian.new(moderator).allow_themes?([theme.id, theme2.id], include_preview: true)).to eq(true) + expect(Guardian.new(admin).allow_themes?([theme.id, theme2.id], include_preview: true)).to eq(true) + end + + it "only allows normal users to use user-selectable themes or default theme" do + user_guardian = Guardian.new(user) + + expect(user_guardian.allow_themes?([theme.id, theme2.id])).to eq(false) + expect(user_guardian.allow_themes?([theme.id])).to eq(false) + expect(user_guardian.allow_themes?([theme2.id])).to eq(false) + + theme.set_default! + expect(user_guardian.allow_themes?([theme.id])).to eq(true) + expect(user_guardian.allow_themes?([theme2.id])).to eq(false) + expect(user_guardian.allow_themes?([theme.id, theme2.id])).to eq(false) + + theme2.update!(user_selectable: true) + expect(user_guardian.allow_themes?([theme2.id])).to eq(true) + expect(user_guardian.allow_themes?([theme2.id, theme.id])).to eq(false) + end + + it "allows child themes to be only used with their parent" do + user_guardian = Guardian.new(user) + + theme.update!(user_selectable: true) + theme2.update!(user_selectable: true) + expect(user_guardian.allow_themes?([theme.id, theme2.id])).to eq(false) + + theme2.update!(user_selectable: false, component: true) + theme.add_child_theme!(theme2) + expect(user_guardian.allow_themes?([theme.id, theme2.id])).to eq(true) + expect(user_guardian.allow_themes?([theme2.id])).to eq(false) + end + end + describe 'can_wiki?' do let(:post) { build(:post, created_at: 1.minute.ago) } @@ -2614,37 +2693,72 @@ describe Guardian do context "tagging is enabled" do before do SiteSetting.tagging_enabled = true - SiteSetting.min_trust_to_create_tag = 3 SiteSetting.min_trust_level_to_tag_topics = 1 end - describe "can_create_tag" do - it "returns false if trust level is too low" do - expect(Guardian.new(trust_level_2).can_create_tag?).to be_falsey + context 'min_trust_to_create_tag is 3' do + before do + SiteSetting.min_trust_to_create_tag = 3 end - it "returns true if trust level is high enough" do - expect(Guardian.new(trust_level_3).can_create_tag?).to be_truthy + describe "can_create_tag" do + it "returns false if trust level is too low" do + expect(Guardian.new(trust_level_2).can_create_tag?).to be_falsey + end + + it "returns true if trust level is high enough" do + expect(Guardian.new(trust_level_3).can_create_tag?).to be_truthy + end + + it "returns true for staff" do + expect(Guardian.new(admin).can_create_tag?).to be_truthy + expect(Guardian.new(moderator).can_create_tag?).to be_truthy + end end - it "returns true for staff" do + describe "can_tag_topics" do + it "returns false if trust level is too low" do + expect(Guardian.new(Fabricate(:user, trust_level: 0)).can_tag_topics?).to be_falsey + end + + it "returns true if trust level is high enough" do + expect(Guardian.new(Fabricate(:user, trust_level: 1)).can_tag_topics?).to be_truthy + end + + it "returns true for staff" do + expect(Guardian.new(admin).can_tag_topics?).to be_truthy + expect(Guardian.new(moderator).can_tag_topics?).to be_truthy + end + end + end + + context 'min_trust_to_create_tag is "staff"' do + before do + SiteSetting.min_trust_to_create_tag = 'staff' + end + + it "returns false if not staff" do + expect(Guardian.new(trust_level_4).can_create_tag?).to eq(false) + end + + it "returns true if staff" do expect(Guardian.new(admin).can_create_tag?).to be_truthy expect(Guardian.new(moderator).can_create_tag?).to be_truthy end end - describe "can_tag_topics" do - it "returns false if trust level is too low" do - expect(Guardian.new(Fabricate(:user, trust_level: 0)).can_tag_topics?).to be_falsey + context 'min_trust_to_create_tag is "admin"' do + before do + SiteSetting.min_trust_to_create_tag = 'admin' end - it "returns true if trust level is high enough" do - expect(Guardian.new(Fabricate(:user, trust_level: 1)).can_tag_topics?).to be_truthy + it "returns false if not admin" do + expect(Guardian.new(trust_level_4).can_create_tag?).to eq(false) + expect(Guardian.new(moderator).can_create_tag?).to eq(false) end - it "returns true for staff" do - expect(Guardian.new(admin).can_tag_topics?).to be_truthy - expect(Guardian.new(moderator).can_tag_topics?).to be_truthy + it "returns true if admin" do + expect(Guardian.new(admin).can_create_tag?).to be_truthy end end end diff --git a/spec/components/hijack_spec.rb b/spec/components/hijack_spec.rb index 0a8b44eeee..7e34413b50 100644 --- a/spec/components/hijack_spec.rb +++ b/spec/components/hijack_spec.rb @@ -107,7 +107,7 @@ describe Hijack do expected = { "Access-Control-Allow-Origin" => "www.rainbows.com", - "Access-Control-Allow-Headers" => "X-Requested-With, X-CSRF-Token, Discourse-Visible", + "Access-Control-Allow-Headers" => "Content-Type, X-Requested-With, X-CSRF-Token, Discourse-Visible, User-Api-Key, User-Api-Client-Id", "Access-Control-Allow-Credentials" => "true" } diff --git a/spec/components/middleware/anonymous_cache_spec.rb b/spec/components/middleware/anonymous_cache_spec.rb index ed4ad96c34..4d63d4f5e4 100644 --- a/spec/components/middleware/anonymous_cache_spec.rb +++ b/spec/components/middleware/anonymous_cache_spec.rb @@ -32,14 +32,14 @@ describe Middleware::AnonymousCache::Helper do context "per theme cache" do it "handles theme keys" do - theme = Theme.create(name: "test", user_id: -1, user_selectable: true) + theme = Fabricate(:theme, user_selectable: true) - with_bad_theme_key = new_helper("HTTP_COOKIE" => "theme_key=abc").cache_key + with_bad_theme_key = new_helper("HTTP_COOKIE" => "theme_ids=abc").cache_key with_no_theme_key = new_helper().cache_key expect(with_bad_theme_key).to eq(with_no_theme_key) - with_good_theme_key = new_helper("HTTP_COOKIE" => "theme_key=#{theme.key}").cache_key + with_good_theme_key = new_helper("HTTP_COOKIE" => "theme_ids=#{theme.id}").cache_key expect(with_good_theme_key).not_to eq(with_no_theme_key) end @@ -152,4 +152,101 @@ describe Middleware::AnonymousCache::Helper do end end + context "crawler blocking" do + let :non_crawler do + { + "HTTP_USER_AGENT" => + "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" + } + end + + def get(path, options) + middleware = Middleware::AnonymousCache.new(lambda { |_| [200, {}, []] }) + @env = env({ + "REQUEST_URI" => path, + "PATH_INFO" => path, + "REQUEST_PATH" => path + }.merge(options[:headers])) + @status = middleware.call(@env).first + end + + it "applies whitelisted_crawler_user_agents correctly" do + SiteSetting.whitelisted_crawler_user_agents = 'Googlebot' + + get '/', headers: { + 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)' + } + + expect(@status).to eq(200) + + get '/', headers: { + 'HTTP_USER_AGENT' => 'Anotherbot/2.1 (+http://www.notgoogle.com/bot.html)' + } + + expect(@status).to eq(403) + + get '/', headers: non_crawler + expect(@status).to eq(200) + end + + it "applies blacklisted_crawler_user_agents correctly" do + SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' + + get '/', headers: non_crawler + expect(@status).to eq(200) + + get '/', headers: { + 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)' + } + + expect(@status).to eq(403) + + get '/', headers: { + 'HTTP_USER_AGENT' => 'Twitterbot/2.1 (+http://www.notgoogle.com/bot.html)' + } + + expect(@status).to eq(200) + end + + it "should never block robots.txt" do + SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' + + get '/robots.txt', headers: { + 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)' + } + + expect(@status).to eq(200) + end + + it "should never block srv/status" do + SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' + + get '/srv/status', headers: { + 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)' + } + + expect(@status).to eq(200) + end + + it "blocked crawlers shouldn't log page views" do + SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' + + get '/', headers: { + 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)' + } + + expect(@env["discourse.request_tracker.skip"]).to eq(true) + end + + it "blocks json requests" do + SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' + + get '/srv/status.json', headers: { + 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)' + } + + expect(@status).to eq(403) + end + end + end diff --git a/spec/components/middleware/request_tracker_spec.rb b/spec/components/middleware/request_tracker_spec.rb index d93e4085db..69f5a0906c 100644 --- a/spec/components/middleware/request_tracker_spec.rb +++ b/spec/components/middleware/request_tracker_spec.rb @@ -286,57 +286,4 @@ describe Middleware::RequestTracker do end end - context "crawler blocking" do - let :middleware do - app = lambda do |env| - [200, {}, ['OK']] - end - - Middleware::RequestTracker.new(app) - end - - def expect_success_response(status, _, response) - expect(status).to eq(200) - expect(response).to eq(['OK']) - end - - def expect_blocked_response(status, _, response) - expect(status).to eq(403) - expect(response).to eq(['Crawler is not allowed']) - end - - it "applies whitelisted_crawler_user_agents correctly" do - SiteSetting.whitelisted_crawler_user_agents = 'Googlebot' - expect_success_response(*middleware.call(env)) - expect_blocked_response(*middleware.call(env('HTTP_USER_AGENT' => 'Twitterbot'))) - expect_success_response(*middleware.call(env('HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)'))) - expect_blocked_response(*middleware.call(env('HTTP_USER_AGENT' => 'DiscourseAPI Ruby Gem 0.19.0'))) - end - - it "applies blacklisted_crawler_user_agents correctly" do - SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' - expect_success_response(*middleware.call(env)) - expect_blocked_response(*middleware.call(env('HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)'))) - expect_success_response(*middleware.call(env('HTTP_USER_AGENT' => 'Twitterbot'))) - expect_success_response(*middleware.call(env('HTTP_USER_AGENT' => 'DiscourseAPI Ruby Gem 0.19.0'))) - end - - it "blocked crawlers shouldn't log page views" do - ApplicationRequest.clear_cache! - SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' - expect { - middleware.call(env('HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)')) - ApplicationRequest.write_cache! - }.to_not change { ApplicationRequest.count } - end - - it "blocks json requests" do - SiteSetting.blacklisted_crawler_user_agents = 'Googlebot' - expect_blocked_response(*middleware.call(env( - 'HTTP_USER_AGENT' => 'Googlebot/2.1 (+http://www.google.com/bot.html)', - 'HTTP_ACCEPT' => 'application/json' - ))) - end - end - end diff --git a/spec/components/migration/column_dropper_spec.rb b/spec/components/migration/column_dropper_spec.rb index 9a0bd536e2..4dc80556f8 100644 --- a/spec/components/migration/column_dropper_spec.rb +++ b/spec/components/migration/column_dropper_spec.rb @@ -4,7 +4,7 @@ require_dependency 'migration/column_dropper' RSpec.describe Migration::ColumnDropper do def has_column?(table, column) - ActiveRecord::Base.exec_sql(<<~SQL, table: table, column: column).to_a.length == 1 + DB.exec(<<~SQL, table: table, column: column) == 1 SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE @@ -15,7 +15,7 @@ RSpec.describe Migration::ColumnDropper do end def update_first_migration_date(created_at) - ActiveRecord::Base.exec_sql(<<~SQL, created_at: created_at) + DB.exec(<<~SQL, created_at: created_at) UPDATE schema_migration_details SET created_at = :created_at WHERE id = (SELECT MIN(id) @@ -25,15 +25,13 @@ RSpec.describe Migration::ColumnDropper do describe ".drop" do let(:migration_name) do - ActiveRecord::Base - .exec_sql("SELECT name FROM schema_migration_details ORDER BY id DESC LIMIT 1") - .getvalue(0, 0) + DB.query_single("SELECT name FROM schema_migration_details ORDER BY id DESC LIMIT 1").first end before do - Topic.exec_sql "ALTER TABLE topics ADD COLUMN junk int" + DB.exec "ALTER TABLE topics ADD COLUMN junk int" - ActiveRecord::Base.exec_sql(<<~SQL, name: migration_name, created_at: 15.minutes.ago) + DB.exec(<<~SQL, name: migration_name, created_at: 15.minutes.ago) UPDATE schema_migration_details SET created_at = :created_at WHERE name = :name @@ -42,6 +40,7 @@ RSpec.describe Migration::ColumnDropper do it "can correctly drop columns after correct delay" do dropped_proc_called = false + after_dropped_proc_called = false update_first_migration_date(2.years.ago) Migration::ColumnDropper.drop( @@ -49,35 +48,42 @@ RSpec.describe Migration::ColumnDropper do after_migration: migration_name, columns: ['junk'], delay: 20.minutes, - on_drop: ->() { dropped_proc_called = true } + on_drop: ->() { dropped_proc_called = true }, + after_drop: ->() { after_dropped_proc_called = true } ) expect(has_column?('topics', 'junk')).to eq(true) expect(dropped_proc_called).to eq(false) + expect(dropped_proc_called).to eq(false) Migration::ColumnDropper.drop( table: 'topics', after_migration: migration_name, columns: ['junk'], delay: 10.minutes, - on_drop: ->() { dropped_proc_called = true } + on_drop: ->() { dropped_proc_called = true }, + after_drop: ->() { after_dropped_proc_called = true } ) expect(has_column?('topics', 'junk')).to eq(false) expect(dropped_proc_called).to eq(true) + expect(after_dropped_proc_called).to eq(true) dropped_proc_called = false + after_dropped_proc_called = false Migration::ColumnDropper.drop( table: 'topics', after_migration: migration_name, columns: ['junk'], delay: 10.minutes, - on_drop: ->() { dropped_proc_called = true } + on_drop: ->() { dropped_proc_called = true }, + after_drop: ->() { after_dropped_proc_called = true } ) # it should call "on_drop" only when there are columns to drop expect(dropped_proc_called).to eq(false) + expect(after_dropped_proc_called).to eq(false) end it "drops the columns immediately if the first migration was less than 10 minutes ago" do @@ -114,7 +120,7 @@ RSpec.describe Migration::ColumnDropper do let(:table_name) { "table_with_readonly_column" } before do - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL CREATE TABLE #{table_name} (topic_id INTEGER, email TEXT); INSERT INTO #{table_name} (topic_id, email) @@ -127,16 +133,14 @@ RSpec.describe Migration::ColumnDropper do after do ActiveRecord::Base.connection.reset! - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL DROP TABLE IF EXISTS #{table_name}; DROP TRIGGER IF EXISTS #{table_name}_email_readonly ON #{table_name}; SQL end it 'should be droppable' do - name = Topic - .exec_sql("SELECT name FROM schema_migration_details LIMIT 1") - .getvalue(0, 0) + name = DB.query_single("SELECT name FROM schema_migration_details LIMIT 1").first dropped_proc_called = false Migration::ColumnDropper.drop( @@ -148,23 +152,27 @@ RSpec.describe Migration::ColumnDropper do ) expect(dropped_proc_called).to eq(true) - end + it 'should prevent updates to the readonly column' do - expect do - ActiveRecord::Base.connection.raw_connection.exec <<~SQL + begin + DB.exec <<~SQL UPDATE #{table_name} SET email = 'testing@email.com' WHERE topic_id = 1; SQL - end.to raise_error( - PG::RaiseException, - /Discourse: email in #{table_name} is readonly/ - ) + rescue PG::RaiseException => e + [ + "Discourse: email in #{table_name} is readonly", + 'discourse_functions.raise_table_with_readonly_column_email_readonly()' + ].each do |message| + expect(e.message).to include(message) + end + end end it 'should allow updates to the other columns' do - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL UPDATE #{table_name} SET topic_id = 2 WHERE topic_id = 1 @@ -188,14 +196,14 @@ RSpec.describe Migration::ColumnDropper do end it 'should allow insertions to the other columns' do - ActiveRecord::Base.exec_sql <<~SQL + DB.exec <<~SQL INSERT INTO #{table_name} (topic_id) VALUES (2); SQL expect( - ActiveRecord::Base.exec_sql("SELECT * FROM #{table_name} WHERE topic_id = 2;").values - ).to include([2, nil]) + DB.query_single("SELECT topic_id FROM #{table_name} WHERE topic_id = 2") + ).to eq([2]) end end end diff --git a/spec/components/migration/safe_migrate_spec.rb b/spec/components/migration/safe_migrate_spec.rb index 1be7f7c86d..15659e4b90 100644 --- a/spec/components/migration/safe_migrate_spec.rb +++ b/spec/components/migration/safe_migrate_spec.rb @@ -21,6 +21,11 @@ describe Migration::SafeMigrate do $stdout = old_stdout end + def migrate_up(path) + migrations = ActiveRecord::MigrationContext.new(path).migrations + ActiveRecord::Migrator.new(:up, migrations, migrations.first.version).run + end + it "bans all table removal" do Migration::SafeMigrate.enable! @@ -28,7 +33,7 @@ describe Migration::SafeMigrate do output = capture_stdout do expect(lambda do - ActiveRecord::Migrator.up([path]) + migrate_up(path) end).to raise_error(StandardError) end @@ -45,14 +50,14 @@ describe Migration::SafeMigrate do output = capture_stdout do expect(lambda do - ActiveRecord::Migrator.up([path]) + migrate_up(path) end).to raise_error(StandardError) end - expect(output).to include("TableDropper") - expect { User.first }.not_to raise_error expect(User.first).not_to eq(nil) + + expect(output).to include("TableDropper") end it "bans all column removal" do @@ -62,7 +67,7 @@ describe Migration::SafeMigrate do output = capture_stdout do expect(lambda do - ActiveRecord::Migrator.up([path]) + migrate_up(path) end).to raise_error(StandardError) end @@ -79,7 +84,7 @@ describe Migration::SafeMigrate do output = capture_stdout do expect(lambda do - ActiveRecord::Migrator.up([path]) + migrate_up(path) end).to raise_error(StandardError) end @@ -96,7 +101,7 @@ describe Migration::SafeMigrate do path = File.expand_path "#{Rails.root}/spec/fixtures/migrate/drop_table" output = capture_stdout do - ActiveRecord::Migrator.up([path]) + migrate_up(path) end expect(output).to include("drop_table(:users)") diff --git a/spec/components/migration/table_dropper_spec.rb b/spec/components/migration/table_dropper_spec.rb index 0b798f82bc..7db3c64f1d 100644 --- a/spec/components/migration/table_dropper_spec.rb +++ b/spec/components/migration/table_dropper_spec.rb @@ -11,11 +11,11 @@ describe Migration::TableDropper do table_name = '#{table_name}' SQL - ActiveRecord::Base.exec_sql(sql).to_a.length > 0 + DB.exec(sql) > 0 end def update_first_migration_date(created_at) - ActiveRecord::Base.exec_sql(<<~SQL, created_at: created_at) + DB.exec(<<~SQL, created_at: created_at) UPDATE schema_migration_details SET created_at = :created_at WHERE id = (SELECT MIN(id) @@ -24,19 +24,17 @@ describe Migration::TableDropper do end def create_new_table - ActiveRecord::Base.exec_sql "CREATE TABLE table_with_new_name (topic_id INTEGER)" + DB.exec "CREATE TABLE table_with_new_name (topic_id INTEGER)" end let(:migration_name) do - ActiveRecord::Base - .exec_sql("SELECT name FROM schema_migration_details ORDER BY id DESC LIMIT 1") - .getvalue(0, 0) + DB.query_single("SELECT name FROM schema_migration_details ORDER BY id DESC LIMIT 1").first end before do - ActiveRecord::Base.exec_sql "CREATE TABLE table_with_old_name (topic_id INTEGER)" + DB.exec "CREATE TABLE table_with_old_name (topic_id INTEGER)" - ActiveRecord::Base.exec_sql(<<~SQL, name: migration_name, created_at: 15.minutes.ago) + DB.exec(<<~SQL, name: migration_name, created_at: 15.minutes.ago) UPDATE schema_migration_details SET created_at = :created_at WHERE name = :name diff --git a/spec/components/new_post_manager_spec.rb b/spec/components/new_post_manager_spec.rb index 22218a67dc..347adbb132 100644 --- a/spec/components/new_post_manager_spec.rb +++ b/spec/components/new_post_manager_spec.rb @@ -281,4 +281,51 @@ describe NewPostManager do end end + context 'when posting in the category requires approval' do + let(:user) { Fabricate(:user) } + let(:category) { Fabricate(:category) } + + context 'when new topics require approval' do + before do + category.custom_fields[Category::REQUIRE_TOPIC_APPROVAL] = true + category.save + end + + it 'enqueues new topics' do + manager = NewPostManager.new( + user, + raw: 'this is a new topic', + title: "Let's start a new topic!", + category: category.id + ) + + expect(manager.perform.action).to eq(:enqueued) + end + end + + context 'when new posts require approval' do + let(:topic) { Fabricate(:topic, category: category) } + + before do + category.custom_fields[Category::REQUIRE_REPLY_APPROVAL] = true + category.save + end + + it 'enqueues new posts' do + manager = NewPostManager.new(user, raw: 'this is a new post', topic_id: topic.id) + expect(manager.perform.action).to eq(:enqueued) + end + + it "doesn't blow up with invalid topic_id" do + expect do + manager = NewPostManager.new( + user, + raw: 'this is a new topic', + topic_id: 97546 + ) + expect(manager.perform.action).to eq(:create_post) + end.not_to raise_error + end + end + end end diff --git a/spec/components/oneboxer_spec.rb b/spec/components/oneboxer_spec.rb index b5ebd305ce..79520340ab 100644 --- a/spec/components/oneboxer_spec.rb +++ b/spec/components/oneboxer_spec.rb @@ -107,4 +107,13 @@ describe Oneboxer do end end + it "does not crawl blacklisted URLs" do + SiteSetting.onebox_domains_blacklist = "git.*.com|bitbucket.com" + url = 'https://github.com/discourse/discourse/commit/21b562852885f883be43032e03c709241e8e6d4f' + stub_request(:head, 'https://discourse.org/').to_return(status: 302, body: "", headers: { location: url }) + + expect(Oneboxer.external_onebox(url)[:onebox]).to be_empty + expect(Oneboxer.external_onebox('https://discourse.org/')[:onebox]).to be_empty + end + end diff --git a/spec/components/plugin/instance_spec.rb b/spec/components/plugin/instance_spec.rb index b791a7d8f8..61accafbf4 100644 --- a/spec/components/plugin/instance_spec.rb +++ b/spec/components/plugin/instance_spec.rb @@ -116,7 +116,49 @@ describe Plugin::Instance do end end + context "#add_report" do + it "adds a report" do + plugin = Plugin::Instance.new nil, "/tmp/test.rb" + plugin.add_report("readers") {} + + expect(Report.respond_to?(:report_readers)).to eq(true) + end + end + + it 'patches the enabled? function for auth_providers if not defined' do + SiteSetting.stubs(:ubuntu_login_enabled).returns(false) + + plugin = Plugin::Instance.new + + # No enabled_site_setting + authenticator = Auth::Authenticator.new + plugin.auth_provider(authenticator: authenticator) + plugin.notify_after_initialize + expect(authenticator.enabled?).to eq(true) + + # With enabled site setting + authenticator = Auth::Authenticator.new + plugin.auth_provider(enabled_setting: 'ubuntu_login_enabled', authenticator: authenticator) + plugin.notify_after_initialize + expect(authenticator.enabled?).to eq(false) + + # Defines own method + SiteSetting.stubs(:ubuntu_login_enabled).returns(true) + authenticator = Class.new(Auth::Authenticator) do + def enabled? + false + end + end.new + plugin.auth_provider(enabled_setting: 'ubuntu_login_enabled', authenticator: authenticator) + plugin.notify_after_initialize + expect(authenticator.enabled?).to eq(false) + end + context "activate!" do + before do + SiteSetting.stubs(:ubuntu_login_enabled).returns(false) + end + it "can activate plugins correctly" do plugin = Plugin::Instance.new plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb" @@ -126,10 +168,6 @@ describe Plugin::Instance do File.open("#{plugin.auto_generated_path}/junk", "w") { |f| f.write("junk") } plugin.activate! - expect(plugin.auth_providers.count).to eq(1) - auth_provider = plugin.auth_providers[0] - expect(auth_provider.authenticator.name).to eq('ubuntu') - # calls ensure_assets! make sure they are there expect(plugin.assets.count).to eq(1) plugin.assets.each do |a, opts| @@ -140,6 +178,17 @@ describe Plugin::Instance do expect(File.exists?(junk_file)).to eq(false) end + it "registers auth providers correctly" do + plugin = Plugin::Instance.new + plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb" + plugin.activate! + + expect(plugin.auth_providers.count).to eq(1) + auth_provider = plugin.auth_providers[0] + expect(auth_provider.authenticator.name).to eq('ubuntu') + expect(DiscoursePluginRegistry.auth_providers.count).to eq(1) + end + it "finds all the custom assets" do plugin = Plugin::Instance.new plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb" diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb index 876b5a9830..2ad2736ab2 100644 --- a/spec/components/post_creator_spec.rb +++ b/spec/components/post_creator_spec.rb @@ -38,6 +38,15 @@ describe PostCreator do expect(post.wiki).to eq(true) end + it "can be created with a hidden reason" do + hri = Post.hidden_reasons[:flag_threshold_reached] + post = PostCreator.create(user, basic_topic_params.merge(hidden_reason_id: hri)) + expect(post.hidden).to eq(true) + expect(post.hidden_at).to be_present + expect(post.hidden_reason_id).to eq(hri) + expect(post.topic.visible).to eq(false) + end + it "ensures the user can create the topic" do Guardian.any_instance.expects(:can_create?).with(Topic, nil).returns(false) expect { creator.create }.to raise_error(Discourse::InvalidAccess) @@ -71,6 +80,14 @@ describe PostCreator do context "success" do before { creator } + it "is not hidden" do + p = creator.create + expect(p.hidden).to eq(false) + expect(p.hidden_at).not_to be_present + expect(p.hidden_reason_id).to eq(nil) + expect(p.topic.visible).to eq(true) + end + it "doesn't return true for spam" do creator.create expect(creator.spam?).to eq(false) @@ -169,11 +186,25 @@ describe PostCreator do end it 'queues up post processing job when saved' do - Jobs.expects(:enqueue).with(:feature_topic_users, has_key(:topic_id)) - Jobs.expects(:enqueue).with(:process_post, has_key(:post_id)) - Jobs.expects(:enqueue).with(:post_alert, has_key(:post_id)) - Jobs.expects(:enqueue).with(:notify_mailing_list_subscribers, has_key(:post_id)) creator.create + + post = Post.last + post_id = post.id + topic_id = post.topic_id + + process_post_args = Jobs::ProcessPost.jobs.first["args"].first + expect(process_post_args["post_id"]).to eq(post_id) + + feature_topic_users_args = Jobs::FeatureTopicUsers.jobs.first["args"].first + expect(feature_topic_users_args["topic_id"]).to eq(topic_id) + + post_alert_args = Jobs::PostAlert.jobs.first["args"].first + expect(post_alert_args["post_id"]).to eq(post_id) + + notify_mailing_list_subscribers_args = + Jobs::NotifyMailingListSubscribers.jobs.first["args"].first + + expect(notify_mailing_list_subscribers_args["post_id"]).to eq(post_id) end it 'passes the invalidate_oneboxes along to the job if present' do @@ -1037,6 +1068,22 @@ describe PostCreator do topic_user = TopicUser.find_by(user_id: user.id, topic_id: post.topic_id) expect(topic_user.notification_level).to eq(TopicUser.notification_levels[:regular]) end + + it "user preferences for notification level when replying doesn't affect PMs" do + user.user_option.update!(notification_level_when_replying: 1) + + admin = Fabricate(:admin) + pm = Fabricate(:private_message_topic, user: admin) + + pm.invite(admin, user.username) + PostCreator.create( + user, + topic_id: pm.id, + raw: "this is a test reply 123 123 ;)" + ) + topic_user = TopicUser.find_by(user_id: user.id, topic_id: pm.id) + expect(topic_user.notification_level).to eq(3) + end end describe '#create!' do diff --git a/spec/components/post_destroyer_spec.rb b/spec/components/post_destroyer_spec.rb index 416686c063..ddd00be307 100644 --- a/spec/components/post_destroyer_spec.rb +++ b/spec/components/post_destroyer_spec.rb @@ -91,6 +91,12 @@ describe PostDestroyer do reply1.reload expect(reply1.deleted_at).to eq(nil) + # defer the flag, we should be able to delete the stub + PostAction.defer_flags!(reply1, Discourse.system_user) + PostDestroyer.destroy_stubs + + reply1.reload + expect(reply1.deleted_at).to_not eq(nil) end it 'uses the delete_removed_posts_after site setting' do @@ -265,9 +271,10 @@ describe PostDestroyer do end it "when topic is destroyed, it updates user_stats correctly" do - post + SiteSetting.min_topic_title_length = 5 + post.topic.update_column(:title, "xyz") + user1 = post.user - user1.reload user2 = Fabricate(:user) reply = create_post(topic_id: post.topic_id, user: user2) reply2 = create_post(topic_id: post.topic_id, user: user1) @@ -275,6 +282,7 @@ describe PostDestroyer do expect(user1.user_stat.post_count).to eq(1) expect(user2.user_stat.topic_count).to eq(0) expect(user2.user_stat.post_count).to eq(1) + PostDestroyer.new(Fabricate(:admin), post).destroy user1.reload user2.reload @@ -360,16 +368,43 @@ describe PostDestroyer do end + context 'private message' do + let(:author) { Fabricate(:user) } + let(:private_message) { Fabricate(:private_message_topic, user: author) } + let!(:first_post) { Fabricate(:post, topic: private_message, user: author) } + let!(:second_post) { Fabricate(:post, topic: private_message, user: author, post_number: 2) } + + it "doesn't update post_count for a reply" do + expect { + PostDestroyer.new(admin, second_post).destroy + author.reload + }.to_not change { author.post_count } + + expect { + PostDestroyer.new(admin, second_post).recover + }.to_not change { author.post_count } + end + + it "doesn't update topic_count for first post" do + expect { + PostDestroyer.new(admin, first_post).destroy + author.reload + }.to_not change { author.topic_count } + expect(author.post_count).to eq(0) # also unchanged + end + end + context 'deleting the second post in a topic' do let(:user) { Fabricate(:user) } let!(:post) { create_post(user: user) } - let(:topic) { post.topic.reload } + let(:topic) { post.topic } let(:second_user) { Fabricate(:coding_horror) } let!(:second_post) { create_post(topic: topic, user: second_user) } before do PostDestroyer.new(moderator, second_post).destroy + topic.reload end it 'resets the last_poster_id back to the OP' do @@ -380,6 +415,10 @@ describe PostDestroyer do expect(topic.last_posted_at.to_i).to eq(post.created_at.to_i) end + it 'resets the highest_post_number' do + expect(topic.highest_post_number).to eq(post.post_number) + end + context 'topic_user' do let(:topic_user) { second_user.topic_users.find_by(topic_id: topic.id) } @@ -395,9 +434,7 @@ describe PostDestroyer do it "sets the second user's last_read_post_number back to 1" do expect(topic_user.highest_seen_post_number).to eq(1) end - end - end context "deleting a post belonging to a deleted topic" do @@ -535,6 +572,10 @@ describe PostDestroyer do let!(:bookmark) { PostAction.act(moderator, second_post, PostActionType.types[:bookmark]) } let!(:flag) { PostAction.act(moderator, second_post, PostActionType.types[:off_topic]) } + before do + SiteSetting.queue_jobs = false + end + it "should delete public post actions and agree with flags" do second_post.expects(:update_flagged_posts_count) @@ -549,6 +590,37 @@ describe PostDestroyer do second_post.reload expect(second_post.bookmark_count).to eq(0) expect(second_post.off_topic_count).to eq(1) + + notification = second_post.user.notifications.where(notification_type: Notification.types[:private_message]).last + expect(notification).to be_present + expect(notification.topic.title).to eq(I18n.t('system_messages.flags_agreed_and_post_deleted.subject_template')) + end + + it "should not send the flags_agreed_and_post_deleted message if it was deleted by system" do + second_post.expects(:update_flagged_posts_count) + PostDestroyer.new(Discourse.system_user, second_post).destroy + expect( + Topic.where(title: I18n.t('system_messages.flags_agreed_and_post_deleted.subject_template')).exists? + ).to eq(false) + end + + it "should not send the flags_agreed_and_post_deleted message if it was deleted by author" do + SiteSetting.delete_removed_posts_after = 0 + second_post.expects(:update_flagged_posts_count) + PostDestroyer.new(second_post.user, second_post).destroy + expect( + Topic.where(title: I18n.t('system_messages.flags_agreed_and_post_deleted.subject_template')).exists? + ).to eq(false) + end + + it "should not send the flags_agreed_and_post_deleted message if flags were deferred" do + second_post.expects(:update_flagged_posts_count) + PostAction.defer_flags!(second_post, moderator) + second_post.reload + PostDestroyer.new(moderator, second_post).destroy + expect( + Topic.where(title: I18n.t('system_messages.flags_agreed_and_post_deleted.subject_template')).exists? + ).to eq(false) end end diff --git a/spec/components/post_revisor_spec.rb b/spec/components/post_revisor_spec.rb index 3e6efb0a6f..5fd997bd43 100644 --- a/spec/components/post_revisor_spec.rb +++ b/spec/components/post_revisor_spec.rb @@ -62,6 +62,23 @@ describe PostRevisor do expect(post.topic.category_id).to eq(category.id) end + it 'does not revise category when the destination category requires topic approval' do + new_category = Fabricate(:category) + new_category.custom_fields[Category::REQUIRE_TOPIC_APPROVAL] = true + new_category.save! + + post = create_post + old_category_id = post.topic.category_id + + post.revise(post.user, category_id: new_category.id) + expect(post.reload.topic.category_id).to eq(old_category_id) + + new_category.custom_fields[Category::REQUIRE_TOPIC_APPROVAL] = false + new_category.save! + + post.revise(post.user, category_id: new_category.id) + expect(post.reload.topic.category_id).to eq(new_category.id) + end end context 'revise wiki' do @@ -86,7 +103,7 @@ describe PostRevisor do let(:post) { Fabricate(:post, post_args) } let(:first_version_at) { post.last_version_at } - subject { described_class.new(post) } + subject { PostRevisor.new(post) } describe 'with the same body' do it "doesn't change version" do @@ -402,7 +419,7 @@ describe PostRevisor do describe "topic excerpt" do it "topic excerpt is updated only if first post is revised" do - revisor = described_class.new(post) + revisor = PostRevisor.new(post) first_post = topic.posts.by_post_number.first expect { revisor.revise!(first_post.user, { raw: 'Edit the first post' }, revised_at: first_post.updated_at + 10.seconds) @@ -410,7 +427,7 @@ describe PostRevisor do }.to change { topic.excerpt } second_post = Fabricate(:post, post_args.merge(post_number: 2, topic_id: topic.id)) expect { - described_class.new(second_post).revise!(second_post.user, raw: 'Edit the 2nd post') + PostRevisor.new(second_post).revise!(second_post.user, raw: 'Edit the 2nd post') topic.reload }.to_not change { topic.excerpt } end @@ -423,10 +440,10 @@ describe PostRevisor do end context "#publish_changes" do - let!(:post) { Fabricate(:post, topic_id: topic.id) } + let!(:post) { Fabricate(:post, topic: topic) } it "should publish topic changes to clients" do - revisor = described_class.new(topic.ordered_posts.first, topic) + revisor = PostRevisor.new(topic.ordered_posts.first, topic) message = MessageBus.track_publish("/topic/#{topic.id}") do revisor.revise!(newuser, title: 'this is a test topic') diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 60d5dc3cc5..d115a69bff 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -35,7 +35,7 @@ describe PrettyText do -
`); +
` + ); } }); @@ -47,14 +46,14 @@ var generateClickEventOn = function(selector) { }; QUnit.test("does not track clicks on lightboxes", function(assert) { - var clickEvent = generateClickEventOn('.lightbox'); + var clickEvent = generateClickEventOn(".lightbox"); sandbox.stub(clickEvent, "preventDefault"); assert.ok(track(clickEvent)); assert.ok(!clickEvent.preventDefault.calledOnce); }); QUnit.test("it calls preventDefault when clicking on an a", function(assert) { - var clickEvent = generateClickEventOn('a'); + var clickEvent = generateClickEventOn("a"); sandbox.stub(clickEvent, "preventDefault"); track(clickEvent); assert.ok(clickEvent.preventDefault.calledOnce); @@ -62,99 +61,80 @@ QUnit.test("it calls preventDefault when clicking on an a", function(assert) { }); QUnit.test("does not track clicks when forcibly disabled", function(assert) { - assert.ok(track(generateClickEventOn('.no-track-link'))); + assert.ok(track(generateClickEventOn(".no-track-link"))); }); QUnit.test("does not track clicks on back buttons", function(assert) { - assert.ok(track(generateClickEventOn('.back'))); + assert.ok(track(generateClickEventOn(".back"))); }); QUnit.test("does not track clicks in quotes", function(assert) { - track(generateClickEventOn('.inside-quote')); + track(generateClickEventOn(".inside-quote")); assert.ok(DiscourseURL.redirectTo.calledWith("http://discuss.domain.com")); }); QUnit.test("does not track clicks on category badges", assert => { - assert.ok(track(generateClickEventOn('.hashtag'))); + assert.ok(track(generateClickEventOn(".hashtag"))); }); QUnit.test("does not track clicks on mailto", function(assert) { - assert.ok(track(generateClickEventOn('.mailto'))); + assert.ok(track(generateClickEventOn(".mailto"))); }); QUnit.test("removes the href and put it as a data attribute", function(assert) { - track(generateClickEventOn('a')); + track(generateClickEventOn("a")); - var $link = fixture('a').first(); - assert.ok($link.hasClass('no-href')); - assert.equal($link.data('href'), 'http://www.google.com'); - assert.blank($link.attr('href')); - assert.ok($link.data('auto-route')); + var $link = fixture("a").first(); + assert.ok($link.hasClass("no-href")); + assert.equal($link.data("href"), "http://www.google.com"); + assert.blank($link.attr("href")); + assert.ok($link.data("auto-route")); assert.ok(DiscourseURL.redirectTo.calledOnce); }); asyncTestDiscourse("restores the href after a while", function(assert) { assert.expect(1); - track(generateClickEventOn('a')); + track(generateClickEventOn("a")); const done = assert.async(); setTimeout(function() { done(); - assert.equal(fixture('a').attr('href'), "http://www.google.com"); + assert.equal(fixture("a").attr("href"), "http://www.google.com"); }, 75); }); var badgeClickCount = function(assert, id, expected) { - track(generateClickEventOn('#' + id)); - var $badge = $('span.badge', fixture('#' + id).first()); + track(generateClickEventOn("#" + id)); + var $badge = $("span.badge", fixture("#" + id).first()); assert.equal(parseInt($badge.html(), 10), expected); }; QUnit.test("does not update badge clicks on my own link", function(assert) { - sandbox.stub(Discourse.User, 'currentProp').withArgs('id').returns(314); - badgeClickCount(assert, 'with-badge', 1); + sandbox + .stub(Discourse.User, "currentProp") + .withArgs("id") + .returns(314); + badgeClickCount(assert, "with-badge", 1); }); QUnit.test("does not update badge clicks in my own post", function(assert) { - sandbox.stub(Discourse.User, 'currentProp').withArgs('id').returns(3141); - badgeClickCount(assert, 'with-badge-but-not-mine', 1); + sandbox + .stub(Discourse.User, "currentProp") + .withArgs("id") + .returns(3141); + badgeClickCount(assert, "with-badge-but-not-mine", 1); }); QUnit.test("updates badge counts correctly", function(assert) { - badgeClickCount(assert, 'inside-onebox', 1); - badgeClickCount(assert, 'inside-onebox-forced', 2); - badgeClickCount(assert, 'with-badge', 2); -}); - -var trackRightClick = function() { - var clickEvent = generateClickEventOn('a'); - clickEvent.which = 3; - return track(clickEvent); -}; - -QUnit.test("right clicks change the href", function(assert) { - assert.ok(trackRightClick()); - assert.equal(fixture('a').first().prop('href'), "http://www.google.com/"); -}); - -QUnit.test("right clicks are tracked", function(assert) { - Discourse.SiteSettings.track_external_right_clicks = true; - trackRightClick(); - assert.equal(fixture('a').first().attr('href'), "/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337"); -}); - -QUnit.test("preventDefault is not called for right clicks", function(assert) { - var clickEvent = generateClickEventOn('a'); - clickEvent.which = 3; - sandbox.stub(clickEvent, "preventDefault"); - assert.ok(track(clickEvent)); - assert.ok(!clickEvent.preventDefault.calledOnce); + badgeClickCount(assert, "inside-onebox", 1); + badgeClickCount(assert, "inside-onebox-forced", 2); + badgeClickCount(assert, "with-badge", 2); }); var testOpenInANewTab = function(description, clickEventModifier) { test(description, function(assert) { - var clickEvent = generateClickEventOn('a'); + var clickEvent = generateClickEventOn("a"); clickEventModifier(clickEvent); sandbox.stub(clickEvent, "preventDefault"); assert.ok(track(clickEvent)); @@ -162,19 +142,27 @@ var testOpenInANewTab = function(description, clickEventModifier) { }); }; -testOpenInANewTab("it opens in a new tab when pressing shift", function(clickEvent) { +testOpenInANewTab("it opens in a new tab when pressing shift", function( + clickEvent +) { clickEvent.shiftKey = true; }); -testOpenInANewTab("it opens in a new tab when pressing meta", function(clickEvent) { +testOpenInANewTab("it opens in a new tab when pressing meta", function( + clickEvent +) { clickEvent.metaKey = true; }); -testOpenInANewTab("it opens in a new tab when pressing ctrl", function(clickEvent) { +testOpenInANewTab("it opens in a new tab when pressing ctrl", function( + clickEvent +) { clickEvent.ctrlKey = true; }); -testOpenInANewTab("it opens in a new tab on middle click", function(clickEvent) { +testOpenInANewTab("it opens in a new tab on middle click", function( + clickEvent +) { clickEvent.button = 2; }); @@ -182,7 +170,7 @@ QUnit.test("tracks via AJAX if we're on the same site", function(assert) { sandbox.stub(DiscourseURL, "routeTo"); sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com"); - assert.ok(!track(generateClickEventOn('#same-site'))); + assert.ok(!track(generateClickEventOn("#same-site"))); assert.ok(DiscourseURL.routeTo.calledOnce); }); @@ -190,19 +178,35 @@ QUnit.test("does not track via AJAX for attachments", function(assert) { sandbox.stub(DiscourseURL, "routeTo"); sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com"); - assert.ok(!track(generateClickEventOn('.attachment'))); + assert.ok(!track(generateClickEventOn(".attachment"))); assert.ok(DiscourseURL.redirectTo.calledOnce); }); -QUnit.test("tracks custom urls when opening in another window", function(assert) { - var clickEvent = generateClickEventOn('a'); - sandbox.stub(Discourse.User, "currentProp").withArgs('external_links_in_new_tab').returns(true); +QUnit.test("tracks custom urls when opening in another window", function( + assert +) { + var clickEvent = generateClickEventOn("a"); + sandbox + .stub(Discourse.User, "currentProp") + .withArgs("external_links_in_new_tab") + .returns(true); assert.ok(!track(clickEvent)); - assert.ok(windowOpen.calledWith('/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337', '_blank')); + assert.ok( + windowOpen.calledWith( + "/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337", + "_blank" + ) + ); }); -QUnit.test("tracks custom urls when opening in another window", function(assert) { - var clickEvent = generateClickEventOn('a'); +QUnit.test("tracks custom urls when opening in another window", function( + assert +) { + var clickEvent = generateClickEventOn("a"); assert.ok(!track(clickEvent)); - assert.ok(redirectTo.calledWith('/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337')); + assert.ok( + redirectTo.calledWith( + "/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337" + ) + ); }); diff --git a/test/javascripts/lib/computed-test.js.es6 b/test/javascripts/lib/computed-test.js.es6 index 6752784a2c..26158686ad 100644 --- a/test/javascripts/lib/computed-test.js.es6 +++ b/test/javascripts/lib/computed-test.js.es6 @@ -1,4 +1,11 @@ -import { setting, propertyEqual, propertyNotEqual, fmt, i18n, url } from 'discourse/lib/computed'; +import { + setting, + propertyEqual, + propertyNotEqual, + fmt, + i18n, + url +} from "discourse/lib/computed"; QUnit.module("lib:computed", { beforeEach() { @@ -14,91 +21,135 @@ QUnit.module("lib:computed", { QUnit.test("setting", assert => { var t = Em.Object.extend({ - vehicle: setting('vehicle'), - missingProp: setting('madeUpThing') + vehicle: setting("vehicle"), + missingProp: setting("madeUpThing") }).create(); Discourse.SiteSettings.vehicle = "airplane"; - assert.equal(t.get('vehicle'), "airplane", "it has the value of the site setting"); - assert.ok(!t.get('missingProp'), "it is falsy when the site setting is not defined"); + assert.equal( + t.get("vehicle"), + "airplane", + "it has the value of the site setting" + ); + assert.ok( + !t.get("missingProp"), + "it is falsy when the site setting is not defined" + ); }); QUnit.test("propertyEqual", assert => { var t = Em.Object.extend({ - same: propertyEqual('cookies', 'biscuits') + same: propertyEqual("cookies", "biscuits") }).create({ cookies: 10, biscuits: 10 }); - assert.ok(t.get('same'), "it is true when the properties are the same"); - t.set('biscuits', 9); - assert.ok(!t.get('same'), "it isn't true when one property is different"); + assert.ok(t.get("same"), "it is true when the properties are the same"); + t.set("biscuits", 9); + assert.ok(!t.get("same"), "it isn't true when one property is different"); }); QUnit.test("propertyNotEqual", assert => { var t = Em.Object.extend({ - diff: propertyNotEqual('cookies', 'biscuits') + diff: propertyNotEqual("cookies", "biscuits") }).create({ cookies: 10, biscuits: 10 }); - assert.ok(!t.get('diff'), "it isn't true when the properties are the same"); - t.set('biscuits', 9); - assert.ok(t.get('diff'), "it is true when one property is different"); + assert.ok(!t.get("diff"), "it isn't true when the properties are the same"); + t.set("biscuits", 9); + assert.ok(t.get("diff"), "it is true when one property is different"); }); - QUnit.test("fmt", assert => { var t = Em.Object.extend({ - exclaimyUsername: fmt('username', "!!! %@ !!!"), - multiple: fmt('username', 'mood', "%@ is %@") + exclaimyUsername: fmt("username", "!!! %@ !!!"), + multiple: fmt("username", "mood", "%@ is %@") }).create({ - username: 'eviltrout', + username: "eviltrout", mood: "happy" }); - assert.equal(t.get('exclaimyUsername'), '!!! eviltrout !!!', "it inserts the string"); - assert.equal(t.get('multiple'), "eviltrout is happy", "it inserts multiple strings"); + assert.equal( + t.get("exclaimyUsername"), + "!!! eviltrout !!!", + "it inserts the string" + ); + assert.equal( + t.get("multiple"), + "eviltrout is happy", + "it inserts multiple strings" + ); - t.set('username', 'codinghorror'); - assert.equal(t.get('multiple'), "codinghorror is happy", "it supports changing properties"); - t.set('mood', 'ecstatic'); - assert.equal(t.get('multiple'), "codinghorror is ecstatic", "it supports changing another property"); + t.set("username", "codinghorror"); + assert.equal( + t.get("multiple"), + "codinghorror is happy", + "it supports changing properties" + ); + t.set("mood", "ecstatic"); + assert.equal( + t.get("multiple"), + "codinghorror is ecstatic", + "it supports changing another property" + ); }); - QUnit.test("i18n", assert => { var t = Em.Object.extend({ - exclaimyUsername: i18n('username', "!!! %@ !!!"), - multiple: i18n('username', 'mood', "%@ is %@") + exclaimyUsername: i18n("username", "!!! %@ !!!"), + multiple: i18n("username", "mood", "%@ is %@") }).create({ - username: 'eviltrout', + username: "eviltrout", mood: "happy" }); - assert.equal(t.get('exclaimyUsername'), '%@ translated: !!! eviltrout !!!', "it inserts the string and then translates"); - assert.equal(t.get('multiple'), "%@ translated: eviltrout is happy", "it inserts multiple strings and then translates"); + assert.equal( + t.get("exclaimyUsername"), + "%@ translated: !!! eviltrout !!!", + "it inserts the string and then translates" + ); + assert.equal( + t.get("multiple"), + "%@ translated: eviltrout is happy", + "it inserts multiple strings and then translates" + ); - t.set('username', 'codinghorror'); - assert.equal(t.get('multiple'), "%@ translated: codinghorror is happy", "it supports changing properties"); - t.set('mood', 'ecstatic'); - assert.equal(t.get('multiple'), "%@ translated: codinghorror is ecstatic", "it supports changing another property"); + t.set("username", "codinghorror"); + assert.equal( + t.get("multiple"), + "%@ translated: codinghorror is happy", + "it supports changing properties" + ); + t.set("mood", "ecstatic"); + assert.equal( + t.get("multiple"), + "%@ translated: codinghorror is ecstatic", + "it supports changing another property" + ); }); - QUnit.test("url", assert => { var t, testClass; testClass = Em.Object.extend({ - userUrl: url('username', "/u/%@") + userUrl: url("username", "/u/%@") }); - t = testClass.create({ username: 'eviltrout' }); - assert.equal(t.get('userUrl'), "/u/eviltrout", "it supports urls without a prefix"); + t = testClass.create({ username: "eviltrout" }); + assert.equal( + t.get("userUrl"), + "/u/eviltrout", + "it supports urls without a prefix" + ); Discourse.BaseUri = "/prefixed"; - t = testClass.create({ username: 'eviltrout' }); - assert.equal(t.get('userUrl'), "/prefixed/u/eviltrout", "it supports urls with a prefix"); + t = testClass.create({ username: "eviltrout" }); + assert.equal( + t.get("userUrl"), + "/prefixed/u/eviltrout", + "it supports urls with a prefix" + ); }); diff --git a/test/javascripts/lib/discourse-test.js.es6 b/test/javascripts/lib/discourse-test.js.es6 index 4bafe429ab..94498a1646 100644 --- a/test/javascripts/lib/discourse-test.js.es6 +++ b/test/javascripts/lib/discourse-test.js.es6 @@ -3,5 +3,24 @@ QUnit.module("lib:discourse"); QUnit.test("getURL on subfolder install", assert => { Discourse.BaseUri = "/forum"; assert.equal(Discourse.getURL("/"), "/forum/", "root url has subfolder"); - assert.equal(Discourse.getURL("/u/neil"), "/forum/u/neil", "relative url has subfolder"); -}); \ No newline at end of file + assert.equal( + Discourse.getURL("/u/neil"), + "/forum/u/neil", + "relative url has subfolder" + ); +}); + +QUnit.test("getURLWithCDN on subfolder install with S3", assert => { + Discourse.BaseUri = "/forum"; + + Discourse.S3CDN = "https://awesome.cdn/site"; + Discourse.S3BaseUrl = "//test.s3-us-west-1.amazonaws.com/site"; + + let url = "//test.s3-us-west-1.amazonaws.com/site/forum/awesome.png"; + let expected = "https://awesome.cdn/site/forum/awesome.png"; + + assert.equal(Discourse.getURLWithCDN(url), expected, "at correct path"); + + Discourse.S3CDN = null; + Discourse.S3BaseUrl = null; +}); diff --git a/test/javascripts/lib/emoji-test.js.es6 b/test/javascripts/lib/emoji-test.js.es6 index 8512b9f05c..47665a8c8a 100644 --- a/test/javascripts/lib/emoji-test.js.es6 +++ b/test/javascripts/lib/emoji-test.js.es6 @@ -1,27 +1,68 @@ -import { emojiSearch, IMAGE_VERSION as v } from 'pretty-text/emoji'; -import { emojiUnescape } from 'discourse/lib/text'; +import { emojiSearch, IMAGE_VERSION as v } from "pretty-text/emoji"; +import { emojiUnescape } from "discourse/lib/text"; -QUnit.module('lib:emoji'); +QUnit.module("lib:emoji"); QUnit.test("emojiUnescape", assert => { const testUnescape = (input, expected, description) => { assert.equal(emojiUnescape(input), expected, description); }; - testUnescape("Not emoji :O) :frog) :smile)", "Not emoji :O) :frog) :smile)", "title without emoji"); - testUnescape("Not emoji :frog :smile", "Not emoji :frog :smile", "end colon is not optional"); - testUnescape("emoticons :)", `emoticons slight_smile`, "emoticons are still supported"); - testUnescape("With emoji :O: :frog: :smile:", + testUnescape( + "Not emoji :O) :frog) :smile)", + "Not emoji :O) :frog) :smile)", + "title without emoji" + ); + testUnescape( + "Not emoji :frog :smile", + "Not emoji :frog :smile", + "end colon is not optional" + ); + testUnescape( + "emoticons :)", + `emoticons slight_smile`, + "emoticons are still supported" + ); + testUnescape( + "With emoji :O: :frog: :smile:", `With emoji O frog smile`, - "title with emoji"); - testUnescape("a:smile:a", "a:smile:a", "word characters not allowed next to emoji"); - testUnescape("(:frog:) :)", `(frog) slight_smile`, "non-word characters allowed next to emoji"); - testUnescape(":smile: hi", `smile hi`, "start of line"); - testUnescape("hi :smile:", `hi smile`, "end of line"); - testUnescape("hi :blonde_woman:t4:", `hi blonde_woman:t4`, "support for skin tones"); - testUnescape("hi :blonde_woman:t4: :blonde_man:t6:", `hi blonde_woman:t4 blonde_man:t6`, "support for multiple skin tones"); - testUnescape("hi :blonde_man:t6", "hi :blonde_man:t6", "end colon not optional for skin tones"); - + "title with emoji" + ); + testUnescape( + "a:smile:a", + "a:smile:a", + "word characters not allowed next to emoji" + ); + testUnescape( + "(:frog:) :)", + `(frog) slight_smile`, + "non-word characters allowed next to emoji" + ); + testUnescape( + ":smile: hi", + `smile hi`, + "start of line" + ); + testUnescape( + "hi :smile:", + `hi smile`, + "end of line" + ); + testUnescape( + "hi :blonde_woman:t4:", + `hi blonde_woman:t4`, + "support for skin tones" + ); + testUnescape( + "hi :blonde_woman:t4: :blonde_man:t6:", + `hi blonde_woman:t4 blonde_man:t6`, + "support for multiple skin tones" + ); + testUnescape( + "hi :blonde_man:t6", + "hi :blonde_man:t6", + "end colon not optional for skin tones" + ); }); QUnit.test("Emoji search", assert => { @@ -29,6 +70,5 @@ QUnit.test("Emoji search", assert => { assert.equal(emojiSearch("+1").length, 1); // able to find middle of line search - assert.equal(emojiSearch("check", {maxResults: 3}).length, 3); - + assert.equal(emojiSearch("check", { maxResults: 3 }).length, 3); }); diff --git a/test/javascripts/lib/formatter-test.js.es6 b/test/javascripts/lib/formatter-test.js.es6 index 984f689a63..693fdeb823 100644 --- a/test/javascripts/lib/formatter-test.js.es6 +++ b/test/javascripts/lib/formatter-test.js.es6 @@ -1,10 +1,18 @@ var clock; -import { relativeAge, autoUpdatingRelativeAge, updateRelativeAge, breakUp, number, longDate, durationTiny } from 'discourse/lib/formatter'; +import { + relativeAge, + autoUpdatingRelativeAge, + updateRelativeAge, + breakUp, + number, + longDate, + durationTiny +} from "discourse/lib/formatter"; QUnit.module("lib:formatter", { beforeEach() { - clock = sinon.useFakeTimers(new Date(2012,11,31,12,0).getTime()); + clock = sinon.useFakeTimers(new Date(2012, 11, 31, 12, 0).getTime()); }, afterEach() { @@ -14,12 +22,12 @@ QUnit.module("lib:formatter", { var format = "tiny"; var leaveAgo = false; -var mins_ago = function(mins){ - return new Date((new Date()) - mins * 60 * 1000); +var mins_ago = function(mins) { + return new Date(new Date() - mins * 60 * 1000); }; var formatMins = function(mins) { - return relativeAge(mins_ago(mins), {format: format, leaveAgo: leaveAgo}); + return relativeAge(mins_ago(mins), { format: format, leaveAgo: leaveAgo }); }; var formatHours = function(hours) { @@ -30,19 +38,22 @@ var formatDays = function(days) { return formatHours(days * 24); }; -var shortDate = function(days){ - return moment().subtract(days, 'days').format('MMM D'); +var shortDate = function(days) { + return moment() + .subtract(days, "days") + .format("MMM D"); }; QUnit.test("formating medium length dates", assert => { - format = "medium"; - var strip = function(html){ + var strip = function(html) { return $(html).text(); }; - var shortDateYear = function(days){ - return moment().subtract(days, 'days').format("MMM D, 'YY"); + var shortDateYear = function(days) { + return moment() + .subtract(days, "days") + .format("MMM D, 'YY"); }; leaveAgo = true; @@ -76,15 +87,17 @@ QUnit.test("formating medium length dates", assert => { assert.equal($(formatDays(0)).attr("class"), "date"); clock.restore(); - clock = sinon.useFakeTimers(new Date(2012,0,9,12,0).getTime()); // Jan 9, 2012 + clock = sinon.useFakeTimers(new Date(2012, 0, 9, 12, 0).getTime()); // Jan 9, 2012 assert.equal(strip(formatDays(8)), shortDate(8)); assert.equal(strip(formatDays(10)), shortDateYear(10)); }); QUnit.test("formating tiny dates", assert => { - var shortDateYear = function(days){ - return moment().subtract(days, 'days').format("MMM 'YY"); + var shortDateYear = function(days) { + return moment() + .subtract(days, "days") + .format("MMM 'YY"); }; format = "tiny"; @@ -103,7 +116,7 @@ QUnit.test("formating tiny dates", assert => { assert.equal(formatDays(365), shortDate(365)); assert.equal(formatDays(366), shortDateYear(366)); // leap year assert.equal(formatDays(500), shortDateYear(500)); - assert.equal(formatDays(365*2 + 1), shortDateYear(365*2 + 1)); // one leap year + assert.equal(formatDays(365 * 2 + 1), shortDateYear(365 * 2 + 1)); // one leap year var originalValue = Discourse.SiteSettings.relative_date_duration; Discourse.SiteSettings.relative_date_duration = 7; @@ -124,14 +137,14 @@ QUnit.test("formating tiny dates", assert => { assert.equal(formatDays(366), shortDateYear(366)); Discourse.SiteSettings.relative_date_duration = null; - assert.equal(formatDays(1), '1d'); - assert.equal(formatDays(14), '14d'); + assert.equal(formatDays(1), "1d"); + assert.equal(formatDays(14), "14d"); assert.equal(formatDays(15), shortDate(15)); Discourse.SiteSettings.relative_date_duration = 14; clock.restore(); - clock = sinon.useFakeTimers(new Date(2012,0,12,12,0).getTime()); // Jan 12, 2012 + clock = sinon.useFakeTimers(new Date(2012, 0, 12, 12, 0).getTime()); // Jan 12, 2012 assert.equal(formatDays(11), "11d"); assert.equal(formatDays(14), "14d"); @@ -139,7 +152,7 @@ QUnit.test("formating tiny dates", assert => { assert.equal(formatDays(366), shortDateYear(366)); clock.restore(); - clock = sinon.useFakeTimers(new Date(2012,0,20,12,0).getTime()); // Jan 20, 2012 + clock = sinon.useFakeTimers(new Date(2012, 0, 20, 12, 0).getTime()); // Jan 20, 2012 assert.equal(formatDays(14), "14d"); assert.equal(formatDays(15), shortDate(15)); @@ -149,51 +162,59 @@ QUnit.test("formating tiny dates", assert => { }); QUnit.test("autoUpdatingRelativeAge", assert => { - var d = moment().subtract(1, 'day').toDate(); + var d = moment() + .subtract(1, "day") + .toDate(); var $elem = $(autoUpdatingRelativeAge(d)); - assert.equal($elem.data('format'), "tiny"); - assert.equal($elem.data('time'), d.getTime()); - assert.equal($elem.attr('title'), undefined); + assert.equal($elem.data("format"), "tiny"); + assert.equal($elem.data("time"), d.getTime()); + assert.equal($elem.attr("title"), undefined); - $elem = $(autoUpdatingRelativeAge(d, {title: true})); - assert.equal($elem.attr('title'), longDate(d)); + $elem = $(autoUpdatingRelativeAge(d, { title: true })); + assert.equal($elem.attr("title"), longDate(d)); - $elem = $(autoUpdatingRelativeAge(d,{format: 'medium', title: true, leaveAgo: true})); - assert.equal($elem.data('format'), "medium-with-ago"); - assert.equal($elem.data('time'), d.getTime()); - assert.equal($elem.attr('title'), longDate(d)); - assert.equal($elem.html(), '1 day ago'); + $elem = $( + autoUpdatingRelativeAge(d, { + format: "medium", + title: true, + leaveAgo: true + }) + ); + assert.equal($elem.data("format"), "medium-with-ago"); + assert.equal($elem.data("time"), d.getTime()); + assert.equal($elem.attr("title"), longDate(d)); + assert.equal($elem.html(), "1 day ago"); - $elem = $(autoUpdatingRelativeAge(d,{format: 'medium'})); - assert.equal($elem.data('format'), "medium"); - assert.equal($elem.data('time'), d.getTime()); - assert.equal($elem.attr('title'), undefined); - assert.equal($elem.html(), '1 day'); + $elem = $(autoUpdatingRelativeAge(d, { format: "medium" })); + assert.equal($elem.data("format"), "medium"); + assert.equal($elem.data("time"), d.getTime()); + assert.equal($elem.attr("title"), undefined); + assert.equal($elem.html(), "1 day"); }); -QUnit.test("updateRelativeAge", assert =>{ - +QUnit.test("updateRelativeAge", assert => { var d = new Date(); var $elem = $(autoUpdatingRelativeAge(d)); - $elem.data('time', d.getTime() - 2 * 60 * 1000); + $elem.data("time", d.getTime() - 2 * 60 * 1000); updateRelativeAge($elem); assert.equal($elem.html(), "2m"); d = new Date(); - $elem = $(autoUpdatingRelativeAge(d, {format: 'medium', leaveAgo: true})); - $elem.data('time', d.getTime() - 2 * 60 * 1000); + $elem = $(autoUpdatingRelativeAge(d, { format: "medium", leaveAgo: true })); + $elem.data("time", d.getTime() - 2 * 60 * 1000); updateRelativeAge($elem); assert.equal($elem.html(), "2 mins ago"); }); -QUnit.test("breakUp", assert =>{ - - var b = function(s,hint){ return breakUp(s,hint); }; +QUnit.test("breakUp", assert => { + var b = function(s, hint) { + return breakUp(s, hint); + }; assert.equal(b("hello"), "hello"); assert.equal(b("helloworld"), "helloworld"); @@ -201,8 +222,10 @@ QUnit.test("breakUp", assert =>{ assert.equal(b("he_man"), "he_​man"); assert.equal(b("he11111"), "he​11111"); assert.equal(b("HRCBob"), "HRC​Bob"); - assert.equal(b("bobmarleytoo","Bob Marley Too"), "bob​marley​too"); - + assert.equal( + b("bobmarleytoo", "Bob Marley Too"), + "bob​marley​too" + ); }); QUnit.test("number", assert => { @@ -214,32 +237,56 @@ QUnit.test("number", assert => { assert.equal(number("2499999.5"), "2.5M", "it abbreviates millions"); assert.equal(number(1000000), "1.0M", "it abbreviates a million"); assert.equal(number(999999), "999k", "it abbreviates hundreds of thousands"); - assert.equal(number(18.2), "18", "it returns a float number rounded to an integer as a string"); - assert.equal(number(18.6), "19", "it returns a float number rounded to an integer as a string"); - assert.equal(number("12.3"), "12", "it returns a string float rounded to an integer as a string"); - assert.equal(number("12.6"), "13", "it returns a string float rounded to an integer as a string"); + assert.equal( + number(18.2), + "18", + "it returns a float number rounded to an integer as a string" + ); + assert.equal( + number(18.6), + "19", + "it returns a float number rounded to an integer as a string" + ); + assert.equal( + number("12.3"), + "12", + "it returns a string float rounded to an integer as a string" + ); + assert.equal( + number("12.6"), + "13", + "it returns a string float rounded to an integer as a string" + ); }); QUnit.test("durationTiny", assert => { - assert.equal(durationTiny(), '—', "undefined is a dash"); - assert.equal(durationTiny(null), '—', "null is a dash"); - assert.equal(durationTiny(0), '< 1m', "0 seconds shows as < 1m"); - assert.equal(durationTiny(59), '< 1m', "59 seconds shows as < 1m"); - assert.equal(durationTiny(60), '1m', "60 seconds shows as 1m"); - assert.equal(durationTiny(90), '2m', "90 seconds shows as 2m"); - assert.equal(durationTiny(120), '2m', "120 seconds shows as 2m"); - assert.equal(durationTiny(60 * 45), '1h', "45 minutes shows as 1h"); - assert.equal(durationTiny(60 * 60), '1h', "60 minutes shows as 1h"); - assert.equal(durationTiny(60 * 90), '2h', "90 minutes shows as 2h"); - assert.equal(durationTiny(3600 * 23), '23h', "23 hours shows as 23h"); - assert.equal(durationTiny(3600 * 24 - 29), '1d', "23 hours 31 mins shows as 1d"); - assert.equal(durationTiny(3600 * 24 * 89), '89d', "89 days shows as 89d"); - assert.equal(durationTiny(60 * (525600 - 1)), '12mon', "364 days shows as 12mon"); - assert.equal(durationTiny(60 * 525600), '1y', "365 days shows as 1y"); - assert.equal(durationTiny(86400 * 456), '1y', "456 days shows as 1y"); - assert.equal(durationTiny(86400 * 457), '> 1y', "457 days shows as > 1y"); - assert.equal(durationTiny(86400 * 638), '> 1y', "638 days shows as > 1y"); - assert.equal(durationTiny(86400 * 639), '2y', "639 days shows as 2y"); - assert.equal(durationTiny(86400 * 821), '2y', "821 days shows as 2y"); - assert.equal(durationTiny(86400 * 822), '> 2y', "822 days shows as > 2y"); + assert.equal(durationTiny(), "—", "undefined is a dash"); + assert.equal(durationTiny(null), "—", "null is a dash"); + assert.equal(durationTiny(0), "< 1m", "0 seconds shows as < 1m"); + assert.equal(durationTiny(59), "< 1m", "59 seconds shows as < 1m"); + assert.equal(durationTiny(60), "1m", "60 seconds shows as 1m"); + assert.equal(durationTiny(90), "2m", "90 seconds shows as 2m"); + assert.equal(durationTiny(120), "2m", "120 seconds shows as 2m"); + assert.equal(durationTiny(60 * 45), "1h", "45 minutes shows as 1h"); + assert.equal(durationTiny(60 * 60), "1h", "60 minutes shows as 1h"); + assert.equal(durationTiny(60 * 90), "2h", "90 minutes shows as 2h"); + assert.equal(durationTiny(3600 * 23), "23h", "23 hours shows as 23h"); + assert.equal( + durationTiny(3600 * 24 - 29), + "1d", + "23 hours 31 mins shows as 1d" + ); + assert.equal(durationTiny(3600 * 24 * 89), "89d", "89 days shows as 89d"); + assert.equal( + durationTiny(60 * (525600 - 1)), + "12mon", + "364 days shows as 12mon" + ); + assert.equal(durationTiny(60 * 525600), "1y", "365 days shows as 1y"); + assert.equal(durationTiny(86400 * 456), "1y", "456 days shows as 1y"); + assert.equal(durationTiny(86400 * 457), "> 1y", "457 days shows as > 1y"); + assert.equal(durationTiny(86400 * 638), "> 1y", "638 days shows as > 1y"); + assert.equal(durationTiny(86400 * 639), "2y", "639 days shows as 2y"); + assert.equal(durationTiny(86400 * 821), "2y", "821 days shows as 2y"); + assert.equal(durationTiny(86400 * 822), "> 2y", "822 days shows as > 2y"); }); diff --git a/test/javascripts/lib/i18n-test.js.es6 b/test/javascripts/lib/i18n-test.js.es6 index e653a8d0ca..0f14258901 100644 --- a/test/javascripts/lib/i18n-test.js.es6 +++ b/test/javascripts/lib/i18n-test.js.es6 @@ -7,50 +7,50 @@ QUnit.module("lib:i18n", { I18n.locale = "fr"; I18n.translations = { - "fr_FOO": { - "js": { - "topic": { - "reply": { - "title": "Foo" + fr_FOO: { + js: { + topic: { + reply: { + title: "Foo" } - }, - } - }, - "fr": { - "js": { - "hello": "Bonjour", - "topic": { - "reply": { - "title": "Répondre" - }, - "share": { - "title": "Partager" - } - }, - "character_count": { - "zero": "{{count}} ZERO", - "one": "{{count}} ONE", - "two": "{{count}} TWO", - "few": "{{count}} FEW", - "many": "{{count}} MANY", - "other": "{{count}} OTHER" } } }, - "en": { - "js": { - "hello": { - "world": "Hello World!", - "universe": "" - }, - "topic": { - "reply": { - "help": "begin composing a reply to this topic" + fr: { + js: { + hello: "Bonjour", + topic: { + reply: { + title: "Répondre" + }, + share: { + title: "Partager" } }, - "word_count": { - "one": "1 word", - "other": "{{count}} words" + character_count: { + zero: "{{count}} ZERO", + one: "{{count}} ONE", + two: "{{count}} TWO", + few: "{{count}} FEW", + many: "{{count}} MANY", + other: "{{count}} OTHER" + } + } + }, + en: { + js: { + hello: { + world: "Hello World!", + universe: "" + }, + topic: { + reply: { + help: "begin composing a reply to this topic" + } + }, + word_count: { + one: "1 word", + other: "{{count}} words" } } } @@ -61,7 +61,7 @@ QUnit.module("lib:i18n", { if (n === 0) return "zero"; if (n === 1) return "one"; if (n === 2) return "two"; - if (n >= 3 && n <= 9) return "few"; + if (n >= 3 && n <= 9) return "few"; if (n >= 10 && n <= 99) return "many"; return "other"; }; @@ -80,16 +80,32 @@ QUnit.test("defaults", assert => { }); QUnit.test("translations", assert => { - assert.equal(I18n.t("topic.reply.title"), "Répondre", "uses locale translations when they exist"); - assert.equal(I18n.t("topic.reply.help"), "begin composing a reply to this topic", "fallbacks to English translations"); - assert.equal(I18n.t("hello.world"), "Hello World!", "doesn't break if a key is overriden in a locale"); + assert.equal( + I18n.t("topic.reply.title"), + "Répondre", + "uses locale translations when they exist" + ); + assert.equal( + I18n.t("topic.reply.help"), + "begin composing a reply to this topic", + "fallbacks to English translations" + ); + assert.equal( + I18n.t("hello.world"), + "Hello World!", + "doesn't break if a key is overriden in a locale" + ); assert.equal(I18n.t("hello.universe"), "", "allows empty strings"); }); QUnit.test("extra translations", assert => { - I18n.extras = [{ "admin": { "title": "Discourse Admin" }}]; + I18n.extras = [{ admin: { title: "Discourse Admin" } }]; - assert.equal(I18n.t("admin.title"), "Discourse Admin", "it check extra translations when they exists"); + assert.equal( + I18n.t("admin.title"), + "Discourse Admin", + "it check extra translations when they exists" + ); }); QUnit.test("pluralizations", assert => { @@ -112,7 +128,19 @@ QUnit.test("fallback", assert => { I18n.locale = "fr_FOO"; I18n.fallbackLocale = "fr"; - assert.equal(I18n.t("topic.reply.title"), "Foo", "uses locale translations when they exist"); - assert.equal(I18n.t("topic.share.title"), "Partager", "falls back to fallbackLocale translations when they exist"); - assert.equal(I18n.t("topic.reply.help"), "begin composing a reply to this topic", "falls back to English translations"); + assert.equal( + I18n.t("topic.reply.title"), + "Foo", + "uses locale translations when they exist" + ); + assert.equal( + I18n.t("topic.share.title"), + "Partager", + "falls back to fallbackLocale translations when they exist" + ); + assert.equal( + I18n.t("topic.reply.help"), + "begin composing a reply to this topic", + "falls back to English translations" + ); }); diff --git a/test/javascripts/lib/key-value-store-test.js.es6 b/test/javascripts/lib/key-value-store-test.js.es6 index 1bbafcc5cb..5e21cb8770 100644 --- a/test/javascripts/lib/key-value-store-test.js.es6 +++ b/test/javascripts/lib/key-value-store-test.js.es6 @@ -2,17 +2,17 @@ import KeyValueStore from "discourse/lib/key-value-store"; QUnit.module("lib:key-value-store"); -QUnit.test("it's able to get the result back from the store", (assert) => { +QUnit.test("it's able to get the result back from the store", assert => { const store = new KeyValueStore("_test"); store.set({ key: "bob", value: "uncle" }); assert.equal(store.get("bob"), "uncle"); }); -QUnit.test("is able to nuke the store", (assert) => { +QUnit.test("is able to nuke the store", assert => { const store = new KeyValueStore("_test"); store.set({ key: "bob1", value: "uncle" }); store.abandonLocal(); localStorage.a = 1; assert.equal(store.get("bob1"), void 0); assert.equal(localStorage.a, "1"); -}); \ No newline at end of file +}); diff --git a/test/javascripts/lib/preload-store-test.js.es6 b/test/javascripts/lib/preload-store-test.js.es6 index 26f8d04059..b17d8f20e8 100644 --- a/test/javascripts/lib/preload-store-test.js.es6 +++ b/test/javascripts/lib/preload-store-test.js.es6 @@ -1,78 +1,100 @@ -import PreloadStore from 'preload-store'; +import PreloadStore from "preload-store"; QUnit.module("preload-store", { beforeEach() { - PreloadStore.store('bane', 'evil'); + PreloadStore.store("bane", "evil"); } }); QUnit.test("get", assert => { - assert.blank(PreloadStore.get('joker'), "returns blank for a missing key"); - assert.equal(PreloadStore.get('bane'), 'evil', "returns the value for that key"); + assert.blank(PreloadStore.get("joker"), "returns blank for a missing key"); + assert.equal( + PreloadStore.get("bane"), + "evil", + "returns the value for that key" + ); }); QUnit.test("remove", assert => { - PreloadStore.remove('bane'); - assert.blank(PreloadStore.get('bane'), "removes the value if the key exists"); + PreloadStore.remove("bane"); + assert.blank(PreloadStore.get("bane"), "removes the value if the key exists"); }); -asyncTestDiscourse("getAndRemove returns a promise that resolves to null", function(assert) { +asyncTestDiscourse( + "getAndRemove returns a promise that resolves to null", + function(assert) { + assert.expect(1); + + const done = assert.async(); + PreloadStore.getAndRemove("joker").then(function(result) { + assert.blank(result); + done(); + }); + } +); + +asyncTestDiscourse( + "getAndRemove returns a promise that resolves to the result of the finder", + function(assert) { + assert.expect(1); + + const done = assert.async(); + const finder = function() { + return "batdance"; + }; + PreloadStore.getAndRemove("joker", finder).then(function(result) { + assert.equal(result, "batdance"); + done(); + }); + } +); + +asyncTestDiscourse( + "getAndRemove returns a promise that resolves to the result of the finder's promise", + function(assert) { + assert.expect(1); + + const finder = function() { + return new Ember.RSVP.Promise(function(resolve) { + resolve("hahahah"); + }); + }; + + const done = assert.async(); + PreloadStore.getAndRemove("joker", finder).then(function(result) { + assert.equal(result, "hahahah"); + done(); + }); + } +); + +asyncTestDiscourse( + "returns a promise that rejects with the result of the finder's rejected promise", + function(assert) { + assert.expect(1); + + const finder = function() { + return new Ember.RSVP.Promise(function(resolve, reject) { + reject("error"); + }); + }; + + const done = assert.async(); + PreloadStore.getAndRemove("joker", finder).then(null, function(result) { + assert.equal(result, "error"); + done(); + }); + } +); + +asyncTestDiscourse("returns a promise that resolves to 'evil'", function( + assert +) { assert.expect(1); const done = assert.async(); - PreloadStore.getAndRemove('joker').then(function(result) { - assert.blank(result); - done(); - }); -}); - -asyncTestDiscourse("getAndRemove returns a promise that resolves to the result of the finder", function(assert) { - assert.expect(1); - - const done = assert.async(); - const finder = function() { return 'batdance'; }; - PreloadStore.getAndRemove('joker', finder).then(function(result) { - assert.equal(result, 'batdance'); - done(); - }); - -}); - -asyncTestDiscourse("getAndRemove returns a promise that resolves to the result of the finder's promise", function(assert) { - assert.expect(1); - - const finder = function() { - return new Ember.RSVP.Promise(function(resolve) { resolve('hahahah'); }); - }; - - const done = assert.async(); - PreloadStore.getAndRemove('joker', finder).then(function(result) { - assert.equal(result, 'hahahah'); - done(); - }); -}); - -asyncTestDiscourse("returns a promise that rejects with the result of the finder's rejected promise", function(assert) { - assert.expect(1); - - const finder = function() { - return new Ember.RSVP.Promise(function(resolve, reject) { reject('error'); }); - }; - - const done = assert.async(); - PreloadStore.getAndRemove('joker', finder).then(null, function(result) { - assert.equal(result, 'error'); - done(); - }); - -}); - -asyncTestDiscourse("returns a promise that resolves to 'evil'", function(assert) { - assert.expect(1); - - const done = assert.async(); - PreloadStore.getAndRemove('bane').then(function(result) { - assert.equal(result, 'evil'); + PreloadStore.getAndRemove("bane").then(function(result) { + assert.equal(result, "evil"); done(); }); }); diff --git a/test/javascripts/lib/pretty-text-test.js.es6 b/test/javascripts/lib/pretty-text-test.js.es6 index 892a9aca49..c7313b99da 100644 --- a/test/javascripts/lib/pretty-text-test.js.es6 +++ b/test/javascripts/lib/pretty-text-test.js.es6 @@ -1,7 +1,7 @@ -import Quote from 'discourse/lib/quote'; -import Post from 'discourse/models/post'; -import { default as PrettyText, buildOptions } from 'pretty-text/pretty-text'; -import { IMAGE_VERSION as v} from 'pretty-text/emoji'; +import Quote from "discourse/lib/quote"; +import Post from "discourse/models/post"; +import { default as PrettyText, buildOptions } from "pretty-text/pretty-text"; +import { IMAGE_VERSION as v } from "pretty-text/emoji"; QUnit.module("lib:pretty-text"); @@ -10,13 +10,13 @@ const rawOpts = { enable_emoji: true, enable_emoji_shortcuts: true, enable_mentions: true, - emoji_set: 'emoji_one', - highlighted_languages: 'json|ruby|javascript', - default_code_lang: 'auto', + emoji_set: "emoji_one", + highlighted_languages: "json|ruby|javascript", + default_code_lang: "auto", enable_markdown_linkify: true, - markdown_linkify_tlds: 'com' + markdown_linkify_tlds: "com" }, - censoredWords: 'shucks|whiz|whizzer|a**le|badword*', + censoredWords: "shucks|whiz|whizzer|a**le|badword*", getURL: url => url }; @@ -47,18 +47,31 @@ QUnit.assert.cookedPara = function(input, expected, message) { QUnit.assert.cooked(input, `

${expected}

`, message); }; - QUnit.skip("Pending Engine fixes and spec fixes", assert => { - assert.cooked("Derpy: http://derp.com?_test_=1", - '

Derpy: http://derp.com?_test_=1

', - "works with underscores in urls"); + assert.cooked( + "Derpy: http://derp.com?_test_=1", + '

Derpy: http://derp.com?_test_=1

', + "works with underscores in urls" + ); - assert.cooked("**a*_b**", "

a*_b

", "allows for characters within bold"); + assert.cooked( + "**a*_b**", + "

a*_b

", + "allows for characters within bold" + ); }); QUnit.test("buildOptions", assert => { - assert.ok(buildOptions({ siteSettings: { enable_emoji: true } }).discourse.features.emoji, 'emoji enabled'); - assert.ok(!buildOptions({ siteSettings: { enable_emoji: false } }).discourse.features.emoji, 'emoji disabled'); + assert.ok( + buildOptions({ siteSettings: { enable_emoji: true } }).discourse.features + .emoji, + "emoji enabled" + ); + assert.ok( + !buildOptions({ siteSettings: { enable_emoji: false } }).discourse.features + .emoji, + "emoji disabled" + ); }); QUnit.test("basic cooking", assert => { @@ -67,151 +80,275 @@ QUnit.test("basic cooking", assert => { assert.cooked("__bold__", "

bold

", "it bolds text."); assert.cooked("*trout*", "

trout

", "it italicizes text."); assert.cooked("_trout_", "

trout

", "it italicizes text."); - assert.cooked("***hello***", "

hello

", "it can do bold and italics at once."); - assert.cooked("word_with_underscores", "

word_with_underscores

", "it doesn't do intraword italics"); - assert.cooked("common/_special_font_face.html.erb", "

common/_special_font_face.html.erb

", "it doesn't intraword with a slash"); - assert.cooked("hello \\*evil\\*", "

hello *evil*

", "it supports escaping of asterisks"); - assert.cooked("hello \\_evil\\_", "

hello _evil_

", "it supports escaping of italics"); - assert.cooked("brussels sprouts are *awful*.", "

brussels sprouts are awful.

", "it doesn't swallow periods."); + assert.cooked( + "***hello***", + "

hello

", + "it can do bold and italics at once." + ); + assert.cooked( + "word_with_underscores", + "

word_with_underscores

", + "it doesn't do intraword italics" + ); + assert.cooked( + "common/_special_font_face.html.erb", + "

common/_special_font_face.html.erb

", + "it doesn't intraword with a slash" + ); + assert.cooked( + "hello \\*evil\\*", + "

hello *evil*

", + "it supports escaping of asterisks" + ); + assert.cooked( + "hello \\_evil\\_", + "

hello _evil_

", + "it supports escaping of italics" + ); + assert.cooked( + "brussels sprouts are *awful*.", + "

brussels sprouts are awful.

", + "it doesn't swallow periods." + ); }); QUnit.test("Nested bold and italics", assert => { - assert.cooked("*this is italic **with some bold** inside*", "

this is italic with some bold inside

", "it handles nested bold in italics"); + assert.cooked( + "*this is italic **with some bold** inside*", + "

this is italic with some bold inside

", + "it handles nested bold in italics" + ); }); QUnit.test("Traditional Line Breaks", assert => { const input = "1\n2\n3"; - assert.cooked(input, "

1
\n2
\n3

", "automatically handles trivial newlines"); - assert.cookedOptions(input, { siteSettings: {traditional_markdown_linebreaks: true} }, "

1\n2\n3

"); + assert.cooked( + input, + "

1
\n2
\n3

", + "automatically handles trivial newlines" + ); + assert.cookedOptions( + input, + { siteSettings: { traditional_markdown_linebreaks: true } }, + "

1\n2\n3

" + ); }); QUnit.test("Unbalanced underscores", assert => { - assert.cooked("[evil_trout][1] hello_\n\n[1]: http://eviltrout.com", "

evil_trout hello_

"); + assert.cooked( + "[evil_trout][1] hello_\n\n[1]: http://eviltrout.com", + '

evil_trout hello_

' + ); }); QUnit.test("Line Breaks", assert => { - assert.cooked("[] first choice\n[] second choice", - "

[] first choice
\n[] second choice

", - "it handles new lines correctly with [] options"); + assert.cooked( + "[] first choice\n[] second choice", + "

[] first choice
\n[] second choice

", + "it handles new lines correctly with [] options" + ); // note this is a change from previous engine but is correct // we have an html block and behavior is defined per common mark // spec // ole engine would wrap trout in a

- assert.cooked("

evil
\ntrout", - "
evil
\ntrout", - "it doesn't insert
after blockquotes"); + assert.cooked( + "
evil
\ntrout", + "
evil
\ntrout", + "it doesn't insert
after blockquotes" + ); - assert.cooked("leading
evil
\ntrout", - "

leading

evil

\ntrout

", - "it doesn't insert
after blockquotes with leading text"); + assert.cooked( + "leading
evil
\ntrout", + "

leading

evil

\ntrout

", + "it doesn't insert
after blockquotes with leading text" + ); }); QUnit.test("Paragraphs for HTML", assert => { - assert.cooked("
hello world
", "
hello world
", "it doesn't surround
with paragraphs"); - assert.cooked("

hello world

", "

hello world

", "it doesn't surround

with paragraphs"); - assert.cooked("hello world", "

hello world

", "it surrounds inline html tags with paragraphs"); - assert.cooked("hello world", "

hello world

", "it surrounds inline html tags with paragraphs"); + assert.cooked( + "
hello world
", + "
hello world
", + "it doesn't surround
with paragraphs" + ); + assert.cooked( + "

hello world

", + "

hello world

", + "it doesn't surround

with paragraphs" + ); + assert.cooked( + "hello world", + "

hello world

", + "it surrounds inline html tags with paragraphs" + ); + assert.cooked( + "hello world", + "

hello world

", + "it surrounds inline html tags with paragraphs" + ); }); QUnit.test("Links", assert => { + assert.cooked( + "EvilTrout: http://eviltrout.com", + '

EvilTrout: http://eviltrout.com

', + "autolinks a URL" + ); - assert.cooked("EvilTrout: http://eviltrout.com", - '

EvilTrout: http://eviltrout.com

', - "autolinks a URL"); + assert.cooked( + "Youtube: http://www.youtube.com/watch?v=1MrpeBRkM5A", + '

Youtube: http://www.youtube.com/watch?v=1MrpeBRkM5A

', + "allows links to contain query params" + ); - assert.cooked("Youtube: http://www.youtube.com/watch?v=1MrpeBRkM5A", - '

Youtube: http://www.youtube.com/watch?v=1MrpeBRkM5A

', - "allows links to contain query params"); + assert.cooked( + "Derpy: http://derp.com?__test=1", + '

Derpy: http://derp.com?__test=1

', + "works with double underscores in urls" + ); - assert.cooked("Derpy: http://derp.com?__test=1", - '

Derpy: http://derp.com?__test=1

', - "works with double underscores in urls"); + assert.cooked( + "Atwood: www.codinghorror.com", + '

Atwood: www.codinghorror.com

', + "autolinks something that begins with www" + ); - assert.cooked("Atwood: www.codinghorror.com", - '

Atwood: www.codinghorror.com

', - "autolinks something that begins with www"); + assert.cooked( + "Atwood: http://www.codinghorror.com", + '

Atwood: http://www.codinghorror.com

', + "autolinks a URL with http://www" + ); - assert.cooked("Atwood: http://www.codinghorror.com", - '

Atwood: http://www.codinghorror.com

', - "autolinks a URL with http://www"); + assert.cooked( + "EvilTrout: http://eviltrout.com hello", + '

EvilTrout: http://eviltrout.com hello

', + "autolinks with trailing text" + ); - assert.cooked("EvilTrout: http://eviltrout.com hello", - '

EvilTrout: http://eviltrout.com hello

', - "autolinks with trailing text"); + assert.cooked( + "here is [an example](http://twitter.com)", + '

here is an example

', + "supports markdown style links" + ); - assert.cooked("here is [an example](http://twitter.com)", - '

here is an example

', - "supports markdown style links"); + assert.cooked( + "Batman: http://en.wikipedia.org/wiki/The_Dark_Knight_(film)", + '

Batman: http://en.wikipedia.org/wiki/The_Dark_Knight_(film)

', + "autolinks a URL with parentheses (like Wikipedia)" + ); - assert.cooked("Batman: http://en.wikipedia.org/wiki/The_Dark_Knight_(film)", - '

Batman: http://en.wikipedia.org/wiki/The_Dark_Knight_(film)

', - "autolinks a URL with parentheses (like Wikipedia)"); + assert.cooked( + "Here's a tweet:\nhttps://twitter.com/evil_trout/status/345954894420787200", + '

Here\'s a tweet:
\nhttps://twitter.com/evil_trout/status/345954894420787200

', + "It doesn't strip the new line." + ); - assert.cooked("Here's a tweet:\nhttps://twitter.com/evil_trout/status/345954894420787200", - "

Here's a tweet:
\nhttps://twitter.com/evil_trout/status/345954894420787200

", - "It doesn't strip the new line."); + assert.cooked( + "1. View @eviltrout's profile here: http://meta.discourse.org/u/eviltrout/activity
next line.", + '
    \n
  1. View @eviltrout\'s profile here: http://meta.discourse.org/u/eviltrout/activity
    next line.
  2. \n
', + "allows autolinking within a list without inserting a paragraph." + ); - assert.cooked("1. View @eviltrout's profile here: http://meta.discourse.org/u/eviltrout/activity
next line.", - "
    \n
  1. View @eviltrout's profile here: http://meta.discourse.org/u/eviltrout/activity
    next line.
  2. \n
", - "allows autolinking within a list without inserting a paragraph."); + assert.cooked( + "[3]: http://eviltrout.com", + "", + "It doesn't autolink markdown link references" + ); - assert.cooked("[3]: http://eviltrout.com", "", "It doesn't autolink markdown link references"); + assert.cooked( + "[]: http://eviltrout.com", + '

[]: http://eviltrout.com

', + "It doesn't accept empty link references" + ); - assert.cooked("[]: http://eviltrout.com", "

[]: http://eviltrout.com

", "It doesn't accept empty link references"); + assert.cooked( + "[b]label[/b]: description", + '

label: description

', + "It doesn't accept BBCode as link references" + ); - assert.cooked("[b]label[/b]: description", "

label: description

", "It doesn't accept BBCode as link references"); + assert.cooked( + "http://discourse.org and http://discourse.org/another_url and http://www.imdb.com/name/nm2225369", + '

http://discourse.org and ' + + 'http://discourse.org/another_url and ' + + 'http://www.imdb.com/name/nm2225369

', + "allows multiple links on one line" + ); - assert.cooked("http://discourse.org and http://discourse.org/another_url and http://www.imdb.com/name/nm2225369", - "

http://discourse.org and " + - "http://discourse.org/another_url and " + - "http://www.imdb.com/name/nm2225369

", - 'allows multiple links on one line'); + assert.cooked( + "* [Evil Trout][1]\n\n[1]: http://eviltrout.com", + '', + "allows markdown link references in a list" + ); - assert.cooked("* [Evil Trout][1]\n\n[1]: http://eviltrout.com", - "", - "allows markdown link references in a list"); + assert.cooked( + "User [MOD]: Hello!", + "

User [MOD]: Hello!

", + "It does not consider references that are obviously not URLs" + ); - assert.cooked("User [MOD]: Hello!", - "

User [MOD]: Hello!

", - "It does not consider references that are obviously not URLs"); + assert.cooked( + "http://eviltrout.com", + '

http://eviltrout.com

', + "Links within HTML tags" + ); - assert.cooked("http://eviltrout.com", "

http://eviltrout.com

", "Links within HTML tags"); + assert.cooked( + "[http://google.com ... wat](http://discourse.org)", + '

http://google.com ... wat

', + "it supports links within links" + ); - assert.cooked("[http://google.com ... wat](http://discourse.org)", - "

http://google.com ... wat

", - "it supports links within links"); + assert.cooked( + "[http://google.com](http://discourse.org)", + '

http://google.com

', + "it supports markdown links where the name and link match" + ); - assert.cooked("[http://google.com](http://discourse.org)", - "

http://google.com

", - "it supports markdown links where the name and link match"); + assert.cooked( + '[Link](http://www.example.com) (with an outer "description")', + '

Link (with an outer "description")

', + "it doesn't consume closing parens as part of the url" + ); + assert.cooked( + "A link inside parentheses (http://www.example.com)", + '

A link inside parentheses (http://www.example.com)

', + "it auto-links a url within parentheses" + ); - assert.cooked("[Link](http://www.example.com) (with an outer \"description\")", - "

Link (with an outer "description")

", - "it doesn't consume closing parens as part of the url"); - - assert.cooked("A link inside parentheses (http://www.example.com)", - "

A link inside parentheses (http://www.example.com)

", - "it auto-links a url within parentheses"); - - assert.cooked("[ul][1]\n\n[1]: http://eviltrout.com", - "

ul

", - "it can use `ul` as a link name"); + assert.cooked( + "[ul][1]\n\n[1]: http://eviltrout.com", + '

ul

', + "it can use `ul` as a link name" + ); }); QUnit.test("simple quotes", assert => { - assert.cooked("> nice!", "
\n

nice!

\n
", "it supports simple quotes"); - assert.cooked(" > nice!", "
\n

nice!

\n
", "it allows quotes with preceding spaces"); - assert.cooked("> level 1\n> > level 2", - "
\n

level 1

\n
\n

level 2

\n
\n
", - "it allows nesting of blockquotes"); - assert.cooked("> level 1\n> > level 2", - "
\n

level 1

\n
\n

level 2

\n
\n
", - "it allows nesting of blockquotes with spaces"); + assert.cooked( + "> nice!", + "
\n

nice!

\n
", + "it supports simple quotes" + ); + assert.cooked( + " > nice!", + "
\n

nice!

\n
", + "it allows quotes with preceding spaces" + ); + assert.cooked( + "> level 1\n> > level 2", + "
\n

level 1

\n
\n

level 2

\n
\n
", + "it allows nesting of blockquotes" + ); + assert.cooked( + "> level 1\n> > level 2", + "
\n

level 1

\n
\n

level 2

\n
\n
", + "it allows nesting of blockquotes with spaces" + ); - assert.cooked("- hello\n\n > world\n > eviltrout", -`
    + assert.cooked( + "- hello\n\n > world\n > eviltrout", + `
    • hello

      @@ -220,21 +357,26 @@ eviltrout

    `, - "it allows quotes within a list."); + "it allows quotes within a list." + ); - assert.cooked("-

    eviltrout

    ", - "
      \n
    • \n

      eviltrout

    • \n
    ", - "it allows paragraphs within a list."); - - - assert.cooked(" > indent 1\n > indent 2", "
    \n

    indent 1
    \nindent 2

    \n
    ", "allow multiple spaces to indent"); + assert.cooked( + "-

    eviltrout

    ", + "
      \n
    • \n

      eviltrout

    • \n
    ", + "it allows paragraphs within a list." + ); + assert.cooked( + " > indent 1\n > indent 2", + "
    \n

    indent 1
    \nindent 2

    \n
    ", + "allow multiple spaces to indent" + ); }); QUnit.test("Quotes", assert => { - - assert.cookedOptions("[quote=\"eviltrout, post: 1\"]\na quote\n\nsecond line\n\nthird line\n[/quote]", - { topicId: 2 }, + assert.cookedOptions( + '[quote="eviltrout, post: 1"]\na quote\n\nsecond line\n\nthird line\n[/quote]', + { topicId: 2 }, ``, - "works with multiple lines"); + "works with multiple lines" + ); - assert.cookedOptions("[quote=\"bob, post:1\"]\nmy quote\n[/quote]", - { topicId: 2, lookupAvatar: function() { } }, + assert.cookedOptions( + '[quote="bob, post:1"]\nmy quote\n[/quote]', + { topicId: 2, lookupAvatar: function() {} }, ``, - "includes no avatar if none is found"); + "includes no avatar if none is found" + ); - assert.cooked(`[quote]\na\n\n[quote]\nb\n[/quote]\n[/quote]`, + assert.cooked( + `[quote]\na\n\n[quote]\nb\n[/quote]\n[/quote]`, ` `, - "handles nested quotes properly"); + "handles nested quotes properly" + ); - assert.cookedOptions(`[quote="bob, post:1, topic:1"]\ntest quote\n[/quote]`, { lookupPrimaryUserGroupByPostNumber: () => "aUserGroup" }, - `
"), "
"); - assert.equal(pt.sanitize("

hello

"), "

hello

"); + assert.equal(pt.sanitize('bug'), "bug"); + assert.equal( + pt.sanitize("
"), + "
" + ); + assert.equal( + pt.sanitize("

hello

"), + "

hello

" + ); assert.equal(pt.sanitize("<3 <3"), "<3 <3"); assert.equal(pt.sanitize("<_<"), "<_<"); - cooked("hello", "

hello

", "it sanitizes while cooking"); + cooked( + "hello", + "

hello

", + "it sanitizes while cooking" + ); - cooked("disney reddit", - "

disney reddit

", - "we can embed proper links"); + cooked( + "disney reddit", + '

disney reddit

', + "we can embed proper links" + ); cooked("
hello
", "hello", "it does not allow centering"); - cooked("
a\n
\n", "
a\n
", "it does not double sanitize"); + cooked( + "
a\n
\n", + "
a\n
", + "it does not double sanitize" + ); - cooked("", "", "it does not allow most iframes"); + cooked( + '', + "", + "it does not allow most iframes" + ); - cooked("", - "", - "it allows iframe to google maps"); + cooked( + '', + '', + "it allows iframe to google maps" + ); - cooked("", - "", - "it allows iframe to OpenStreetMap"); + cooked( + '', + '', + "it allows iframe to OpenStreetMap" + ); assert.equal(pt.sanitize(""), "hullo"); assert.equal(pt.sanitize(""), "press me!"); @@ -40,24 +70,62 @@ QUnit.test("sanitize", assert => { assert.equal(pt.sanitize("hello"), "hello"); assert.equal(pt.sanitize("highlight"), "highlight"); - cooked("[the answer](javascript:alert(42))", "

[the answer](javascript:alert(42))

", "it prevents XSS"); + cooked( + "[the answer](javascript:alert(42))", + "

[the answer](javascript:alert(42))

", + "it prevents XSS" + ); - cooked("\n", "

", "it doesn't circumvent XSS with comments"); + cooked( + '\n', + "

", + "it doesn't circumvent XSS with comments" + ); - cooked("a", "

a

", "it sanitizes spans"); - cooked("a", "

a

", "it sanitizes spans"); - cooked("a", "

a

", "it sanitizes spans"); + cooked( + 'a', + "

a

", + "it sanitizes spans" + ); + cooked( + 'a', + "

a

", + "it sanitizes spans" + ); + cooked( + 'a', + '

a

', + "it sanitizes spans" + ); cooked("Ctrl+C", "

Ctrl+C

"); - cooked("it has been 1 day 0 days since our last test failure", "

it has been 1 day 0 days since our last test failure

"); - cooked(`it has been 1 day 0 days since our last test failure`, `

it has been 1 day 0 days since our last test failure

`); + cooked( + "it has been 1 day 0 days since our last test failure", + "

it has been 1 day 0 days since our last test failure

" + ); + cooked( + `it has been 1 day 0 days since our last test failure`, + `

it has been 1 day 0 days since our last test failure

` + ); cooked(`
hello
`, `
hello
`); - cooked(`1 + 1 is 3 2`, `

1 + 1 is 3 2

`); - cooked(`JS`, `

JS

`); - cooked(`
Forum
Software
`, `
Forum
Software
`); - cooked(`high low HUGE`, `

high low HUGE

`); + cooked( + `1 + 1 is 3 2`, + `

1 + 1 is 3 2

` + ); + cooked( + `JS`, + `

JS

` + ); + cooked( + `
Forum
Software
`, + `
Forum
Software
` + ); + cooked( + `high low HUGE`, + `

high low HUGE

` + ); cooked(`
RTL text
`, `
RTL text
`); }); @@ -65,22 +133,58 @@ QUnit.test("sanitize", assert => { QUnit.test("ids on headings", assert => { const pt = new PrettyText(buildOptions({ siteSettings: {} })); assert.equal(pt.sanitize("

Test Heading

"), "

Test Heading

"); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`
Test Heading
`), `
Test Heading
`); - assert.equal(pt.sanitize(`
Test Heading
`), `
Test Heading
`); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`
Test Heading
`), + `
Test Heading
` + ); + assert.equal( + pt.sanitize(`
Test Heading
`), + `
Test Heading
` + ); }); QUnit.test("poorly formed ids on headings", assert => { let pt = new PrettyText(buildOptions({ siteSettings: {} })); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); - assert.equal(pt.sanitize(`

Test Heading

`), `

Test Heading

`); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); + assert.equal( + pt.sanitize(`

Test Heading

`), + `

Test Heading

` + ); }); QUnit.test("urlAllowed", assert => { @@ -91,8 +195,9 @@ QUnit.test("urlAllowed", assert => { allowed("https://eviltrout.com/evil/trout", "allows https urls"); allowed("//eviltrout.com/evil/trout", "allows protocol relative urls"); - assert.equal(hrefAllowed("http://google.com/test'onmouseover=alert('XSS!');//.swf"), - "http://google.com/test%27onmouseover=alert(%27XSS!%27);//.swf", - "escape single quotes"); + assert.equal( + hrefAllowed("http://google.com/test'onmouseover=alert('XSS!');//.swf"), + "http://google.com/test%27onmouseover=alert(%27XSS!%27);//.swf", + "escape single quotes" + ); }); - diff --git a/test/javascripts/lib/sharing-test.js.es6 b/test/javascripts/lib/sharing-test.js.es6 new file mode 100644 index 0000000000..2a6f249b78 --- /dev/null +++ b/test/javascripts/lib/sharing-test.js.es6 @@ -0,0 +1,42 @@ +import Sharing from "discourse/lib/sharing"; + +QUnit.module("lib:sharing", { + beforeEach() { + Sharing._reset(); + } +}); + +QUnit.test("addSource", assert => { + const sharingSettings = "facebook|twitter"; + + assert.blank(Sharing.activeSources(sharingSettings)); + + Sharing.addSource({ + id: "facebook" + }); + + assert.equal(Sharing.activeSources(sharingSettings).length, 1); +}); + +QUnit.test("addSharingId", assert => { + const sharingSettings = ""; + + assert.blank(Sharing.activeSources(sharingSettings)); + + Sharing.addSource({ + id: "new-source" + }); + + assert.blank( + Sharing.activeSources(sharingSettings), + "it doesn’t activate a source not in settings" + ); + + Sharing.addSharingId("new-source"); + + assert.equal( + Sharing.activeSources(sharingSettings).length, + 1, + "it adds sharing id to existing sharing settings" + ); +}); diff --git a/test/javascripts/lib/text-direction-test.js.es6 b/test/javascripts/lib/text-direction-test.js.es6 index c8ddee262b..b266af0165 100644 --- a/test/javascripts/lib/text-direction-test.js.es6 +++ b/test/javascripts/lib/text-direction-test.js.es6 @@ -1,23 +1,22 @@ -import { isRTL, isLTR } from 'discourse/lib/text-direction'; +import { isRTL, isLTR } from "discourse/lib/text-direction"; -QUnit.module('lib:text-direction'); +QUnit.module("lib:text-direction"); QUnit.test("isRTL", assert => { // Hebrew - assert.equal(isRTL('זה מבחן'), true); + assert.equal(isRTL("זה מבחן"), true); // Arabic - assert.equal(isRTL('هذا اختبار'), true); + assert.equal(isRTL("هذا اختبار"), true); // Persian - assert.equal(isRTL('این یک امتحان است'), true); + assert.equal(isRTL("این یک امتحان است"), true); - assert.equal(isRTL('This is a test'), false); - assert.equal(isRTL(''), false); + assert.equal(isRTL("This is a test"), false); + assert.equal(isRTL(""), false); }); QUnit.test("isLTR", assert => { - assert.equal(isLTR('This is a test'), true); - assert.equal(isLTR('זה מבחן'), false); + assert.equal(isLTR("This is a test"), true); + assert.equal(isLTR("זה מבחן"), false); }); - diff --git a/test/javascripts/lib/to-markdown-test.js.es6 b/test/javascripts/lib/to-markdown-test.js.es6 index 6336da48ad..57a437a4a5 100644 --- a/test/javascripts/lib/to-markdown-test.js.es6 +++ b/test/javascripts/lib/to-markdown-test.js.es6 @@ -1,4 +1,4 @@ -import toMarkdown from 'discourse/lib/to-markdown'; +import toMarkdown from "discourse/lib/to-markdown"; QUnit.module("lib:to-markdown"); @@ -70,7 +70,7 @@ QUnit.test("converts heading tags", assert => { }); QUnit.test("converts ul list tag", assert => { - const html = ` + let html = `
  • Item 1
  • @@ -84,7 +84,20 @@ QUnit.test("converts ul list tag", assert => {
  • Item 3
`; - const markdown = `* Item 1\n* Item 2\n * Sub Item 1\n * Sub Item 2\n\n * Sub Item 3\n * Sub *Sub* Item 1\n * Sub **Sub** Item 2\n* Item 3`; + let markdown = `* Item 1\n* Item 2\n * Sub Item 1\n * Sub Item 2\n * Sub Item 3\n * Sub *Sub* Item 1\n * Sub **Sub** Item 2\n* Item 3`; + assert.equal(toMarkdown(html), markdown); + + html = ` +
    +
  • Bullets at level 1

  • +
  • Bullets at level 1

    • Bullets at level 2

    • Bullets at level 2

      • Bullets at level 3

    • Bullets at level 2

  • Bullets at level 1

`; + markdown = `* Bullets at level 1 +* Bullets at level 1 + * Bullets at level 2 + * Bullets at level 2 + * Bullets at level 3 + * Bullets at level 2 +* Bullets at level 1`; assert.equal(toMarkdown(html), markdown); }); @@ -119,31 +132,34 @@ QUnit.test("converts table tags", assert => { assert.equal(toMarkdown(html), markdown); }); -QUnit.test("replace pipes with spaces if table format not supported", assert => { - let html = ` +QUnit.test( + "replace pipes with spaces if table format not supported", + assert => { + let html = `
Headi

ng 1
Head 2
Loremipsum
sit amet
`; - let markdown = `Headi\n\nng 1 Head 2\nLorem ipsum\n[![](http://dolor.com/image.png)](http://example.com) *sit amet*`; - assert.equal(toMarkdown(html), markdown); + let markdown = `Headi\n\nng 1 Head 2\nLorem ipsum\n[![](http://dolor.com/image.png)](http://example.com) *sit amet*`; + assert.equal(toMarkdown(html), markdown); - html = ` + html = `
Heading 1
Lorem
sit amet
`; - markdown = `Heading 1\nLorem\n*sit amet*`; - assert.equal(toMarkdown(html), markdown); + markdown = `Heading 1\nLorem\n*sit amet*`; + assert.equal(toMarkdown(html), markdown); - html = `
Loremsit amet
`; - markdown = `Lorem **sit amet**`; - assert.equal(toMarkdown(html), markdown); -}); + html = `
Loremsit amet
`; + markdown = `Lorem **sit amet**`; + assert.equal(toMarkdown(html), markdown); + } +); QUnit.test("converts img tag", assert => { const url = "https://example.com/image.png"; @@ -154,10 +170,16 @@ QUnit.test("converts img tag", assert => { assert.equal(toMarkdown(html), `![description|50x100](${url})`); html = `description`; - assert.equal(toMarkdown(html), `[![description](${url})](http://example.com)`); + assert.equal( + toMarkdown(html), + `[![description](${url})](http://example.com)` + ); html = `description `; - assert.equal(toMarkdown(html), `[description ![](${url})](http://example.com)`); + assert.equal( + toMarkdown(html), + `[description ![](${url})](http://example.com)` + ); html = `description`; assert.equal(toMarkdown(html), ""); @@ -167,7 +189,8 @@ QUnit.test("converts img tag", assert => { }); QUnit.test("supporting html tags by keeping them", assert => { - let html = "Lorem ipsum dolor sit amet, consectetur"; + let html = + "Lorem ipsum dolor sit amet, consectetur"; let output = html; assert.equal(toMarkdown(html), output); @@ -216,11 +239,13 @@ QUnit.test("converts blockquote tag", assert => { let output = "> Lorem ipsum"; assert.equal(toMarkdown(html), output); - html = "
Lorem ipsum

dolor sit amet

"; + html = + "
Lorem ipsum

dolor sit amet

"; output = "> Lorem ipsum\n\n> dolor sit amet"; assert.equal(toMarkdown(html), output); - html = "
\nLorem ipsum\n

dolor

sit
amet

"; + html = + "
\nLorem ipsum\n

dolor

sit
amet

"; output = "> Lorem ipsum\n> > dolor\n> > > sit\n> > amet"; assert.equal(toMarkdown(html), output); }); @@ -302,3 +327,16 @@ QUnit.test("keeps mention/hash class", assert => { assert.equal(toMarkdown(html), markdown); }); + +QUnit.test("keeps emoji and removes click count", assert => { + const html = ` +

+ A link1 with click count + and :boom: emoji. +

+ `; + + const markdown = `A [link](http://example.com) with click count and :boom: emoji.`; + + assert.equal(toMarkdown(html), markdown); +}); diff --git a/test/javascripts/lib/tooltip-test.js.es6 b/test/javascripts/lib/tooltip-test.js.es6 new file mode 100644 index 0000000000..f65d326da5 --- /dev/null +++ b/test/javascripts/lib/tooltip-test.js.es6 @@ -0,0 +1,25 @@ +import { registerTooltip } from "discourse/lib/tooltip"; + +// prettier-ignore +QUnit.module("lib:tooltip", { + beforeEach() { + fixture().html( + "test" + ); + } +}); + +QUnit.test("it prevents XSS injection", assert => { + const $testLink = fixture(".test-link"); + registerTooltip($testLink); + $testLink.click(); + + andThen(() => { + assert.equal( + fixture(".tooltip-content") + .html() + .trim(), + "XSS<s onmouseover=alert(document.domain)>XSS" + ); + }); +}); diff --git a/test/javascripts/lib/url-test.js.es6 b/test/javascripts/lib/url-test.js.es6 index 15f760d92d..993fe8c23f 100644 --- a/test/javascripts/lib/url-test.js.es6 +++ b/test/javascripts/lib/url-test.js.es6 @@ -1,4 +1,4 @@ -import { default as DiscourseURL, userPath } from 'discourse/lib/url'; +import { default as DiscourseURL, userPath } from "discourse/lib/url"; QUnit.module("lib:url"); @@ -7,34 +7,61 @@ QUnit.test("isInternal with a HTTP url", assert => { assert.not(DiscourseURL.isInternal(null), "a blank URL is not internal"); assert.ok(DiscourseURL.isInternal("/test"), "relative URLs are internal"); - assert.ok(DiscourseURL.isInternal("//eviltrout.com"), "a url on the same host is internal (protocol-less)"); - assert.ok(DiscourseURL.isInternal("http://eviltrout.com/tophat"), "a url on the same host is internal"); - assert.ok(DiscourseURL.isInternal("https://eviltrout.com/moustache"), "a url on a HTTPS of the same host is internal"); - assert.not(DiscourseURL.isInternal("//twitter.com.com"), "a different host is not internal (protocol-less)"); - assert.not(DiscourseURL.isInternal("http://twitter.com"), "a different host is not internal"); + assert.ok( + DiscourseURL.isInternal("//eviltrout.com"), + "a url on the same host is internal (protocol-less)" + ); + assert.ok( + DiscourseURL.isInternal("http://eviltrout.com/tophat"), + "a url on the same host is internal" + ); + assert.ok( + DiscourseURL.isInternal("https://eviltrout.com/moustache"), + "a url on a HTTPS of the same host is internal" + ); + assert.not( + DiscourseURL.isInternal("//twitter.com.com"), + "a different host is not internal (protocol-less)" + ); + assert.not( + DiscourseURL.isInternal("http://twitter.com"), + "a different host is not internal" + ); }); QUnit.test("isInternal with a HTTPS url", assert => { sandbox.stub(DiscourseURL, "origin").returns("https://eviltrout.com"); - assert.ok(DiscourseURL.isInternal("http://eviltrout.com/monocle"), "HTTPS urls match HTTP urls"); + assert.ok( + DiscourseURL.isInternal("http://eviltrout.com/monocle"), + "HTTPS urls match HTTP urls" + ); }); QUnit.test("isInternal on subfolder install", assert => { sandbox.stub(DiscourseURL, "origin").returns("http://eviltrout.com/forum"); - assert.not(DiscourseURL.isInternal("http://eviltrout.com"), "the host root is not internal"); - assert.not(DiscourseURL.isInternal("http://eviltrout.com/tophat"), "a url on the same host but on a different folder is not internal"); - assert.ok(DiscourseURL.isInternal("http://eviltrout.com/forum/moustache"), "a url on the same host and on the same folder is internal"); + assert.not( + DiscourseURL.isInternal("http://eviltrout.com"), + "the host root is not internal" + ); + assert.not( + DiscourseURL.isInternal("http://eviltrout.com/tophat"), + "a url on the same host but on a different folder is not internal" + ); + assert.ok( + DiscourseURL.isInternal("http://eviltrout.com/forum/moustache"), + "a url on the same host and on the same folder is internal" + ); }); QUnit.test("userPath", assert => { - assert.equal(userPath(), '/u'); - assert.equal(userPath('eviltrout'), '/u/eviltrout'); - assert.equal(userPath('hp.json'), '/u/hp.json'); + assert.equal(userPath(), "/u"); + assert.equal(userPath("eviltrout"), "/u/eviltrout"); + assert.equal(userPath("hp.json"), "/u/hp.json"); }); QUnit.test("userPath with BaseUri", assert => { Discourse.BaseUri = "/forum"; - assert.equal(userPath(), '/forum/u'); - assert.equal(userPath('eviltrout'), '/forum/u/eviltrout'); - assert.equal(userPath('hp.json'), '/forum/u/hp.json'); + assert.equal(userPath(), "/forum/u"); + assert.equal(userPath("eviltrout"), "/forum/u/eviltrout"); + assert.equal(userPath("hp.json"), "/forum/u/hp.json"); }); diff --git a/test/javascripts/lib/user-search-test.js.es6 b/test/javascripts/lib/user-search-test.js.es6 index a34f114395..068b648627 100644 --- a/test/javascripts/lib/user-search-test.js.es6 +++ b/test/javascripts/lib/user-search-test.js.es6 @@ -1,67 +1,68 @@ -import userSearch from 'discourse/lib/user-search'; +import userSearch from "discourse/lib/user-search"; QUnit.module("lib:user-search", { beforeEach() { - const response = (object) => { - return [ - 200, - {"Content-Type": "application/json"}, - object - ]; + const response = object => { + return [200, { "Content-Type": "application/json" }, object]; }; - server.get('/u/search/users', () => { //eslint-disable-line - return response( - { - users: [ - { - "username": "TeaMoe", - "name": "TeaMoe", - "avatar_template": "https://avatars.discourse.org/v3/letter/t/41988e/{size}.png" - }, - { - "username": "TeamOneJ", - "name": "J Cobb", - "avatar_template": + // prettier-ignore + server.get("/u/search/users", () => { //eslint-disable-line + return response({ + users: [ + { + username: "TeaMoe", + name: "TeaMoe", + avatar_template: + "https://avatars.discourse.org/v3/letter/t/41988e/{size}.png" + }, + { + username: "TeamOneJ", + name: "J Cobb", + avatar_template: "https://avatars.discourse.org/v3/letter/t/3d9bf3/{size}.png" - }, - { - "username": "kudos", - "name": "Team Blogeto.com", - "avatar_template": "/user_avatar/meta.discourse.org/kudos/{size}/62185_1.png" - }, - { - "username": "RosieLinda", - "name": "Linda Teaman", - "avatar_template": "https://avatars.discourse.org/v3/letter/r/bc8723/{size}.png" - }, - { - "username": "legalatom", - "name": "Team LegalAtom", - "avatar_template": "https://avatars.discourse.org/v3/letter/l/a9a28c/{size}.png" - }, - { - "username": "dzsat_team", - "name": "Dz Sat Dz Sat", - "avatar_template": "https://avatars.discourse.org/v3/letter/d/eb9ed0/{size}.png" - } - ], - groups: [ - { - "name": "bob", - "usernames": [] - }, - { - "name": "team", - "usernames": [] - } - ] - }); + }, + { + username: "kudos", + name: "Team Blogeto.com", + avatar_template: + "/user_avatar/meta.discourse.org/kudos/{size}/62185_1.png" + }, + { + username: "RosieLinda", + name: "Linda Teaman", + avatar_template: + "https://avatars.discourse.org/v3/letter/r/bc8723/{size}.png" + }, + { + username: "legalatom", + name: "Team LegalAtom", + avatar_template: + "https://avatars.discourse.org/v3/letter/l/a9a28c/{size}.png" + }, + { + username: "dzsat_team", + name: "Dz Sat Dz Sat", + avatar_template: + "https://avatars.discourse.org/v3/letter/d/eb9ed0/{size}.png" + } + ], + groups: [ + { + name: "bob", + usernames: [] + }, + { + name: "team", + usernames: [] + } + ] + }); }); } }); QUnit.test("it places groups unconditionally for exact match", async assert => { - let results = await userSearch({term: 'Team'}); - assert.equal(results[results.length-1]["name"], "team"); + let results = await userSearch({ term: "Team" }); + assert.equal(results[results.length - 1]["name"], "team"); }); diff --git a/test/javascripts/lib/utilities-test.js.es6 b/test/javascripts/lib/utilities-test.js.es6 index 9b5f4e4265..ba2448b35c 100644 --- a/test/javascripts/lib/utilities-test.js.es6 +++ b/test/javascripts/lib/utilities-test.js.es6 @@ -16,21 +16,43 @@ import { caretRowCol, setCaretPosition, fillMissingDates -} from 'discourse/lib/utilities'; -import * as Utilities from 'discourse/lib/utilities'; +} from "discourse/lib/utilities"; +import * as Utilities from "discourse/lib/utilities"; QUnit.module("lib:utilities"); QUnit.test("emailValid", assert => { - assert.ok(emailValid('Bob@example.com'), "allows upper case in the first part of emails"); - assert.ok(emailValid('bob@EXAMPLE.com'), "allows upper case in the email domain"); + assert.ok( + emailValid("Bob@example.com"), + "allows upper case in the first part of emails" + ); + assert.ok( + emailValid("bob@EXAMPLE.com"), + "allows upper case in the email domain" + ); }); QUnit.test("extractDomainFromUrl", assert => { - assert.equal(extractDomainFromUrl('http://meta.discourse.org:443/random'), 'meta.discourse.org', "extract domain name from url"); - assert.equal(extractDomainFromUrl('meta.discourse.org:443/random'), 'meta.discourse.org', "extract domain regardless of scheme presence"); - assert.equal(extractDomainFromUrl('http://192.168.0.1:443/random'), '192.168.0.1', "works for IP address"); - assert.equal(extractDomainFromUrl('http://localhost:443/random'), 'localhost', "works for localhost"); + assert.equal( + extractDomainFromUrl("http://meta.discourse.org:443/random"), + "meta.discourse.org", + "extract domain name from url" + ); + assert.equal( + extractDomainFromUrl("meta.discourse.org:443/random"), + "meta.discourse.org", + "extract domain regardless of scheme presence" + ); + assert.equal( + extractDomainFromUrl("http://192.168.0.1:443/random"), + "192.168.0.1", + "works for IP address" + ); + assert.equal( + extractDomainFromUrl("http://localhost:443/random"), + "localhost", + "works for localhost" + ); }); var validUpload = validateUploadedFiles; @@ -45,7 +67,7 @@ QUnit.test("uploading one file", assert => { sandbox.stub(bootbox, "alert"); assert.not(validUpload([1, 2])); - assert.ok(bootbox.alert.calledWith(I18n.t('post.errors.too_many_uploads'))); + assert.ok(bootbox.alert.calledWith(I18n.t("post.errors.too_many_uploads"))); }); QUnit.test("new user cannot upload images", assert => { @@ -53,8 +75,13 @@ QUnit.test("new user cannot upload images", assert => { Discourse.User.resetCurrent(Discourse.User.create()); sandbox.stub(bootbox, "alert"); - assert.not(validUpload([{name: "image.png"}]), 'the upload is not valid'); - assert.ok(bootbox.alert.calledWith(I18n.t('post.errors.image_upload_not_allowed_for_new_user')), 'the alert is called'); + assert.not(validUpload([{ name: "image.png" }]), "the upload is not valid"); + assert.ok( + bootbox.alert.calledWith( + I18n.t("post.errors.image_upload_not_allowed_for_new_user") + ), + "the alert is called" + ); }); QUnit.test("new user cannot upload attachments", assert => { @@ -62,14 +89,24 @@ QUnit.test("new user cannot upload attachments", assert => { sandbox.stub(bootbox, "alert"); Discourse.User.resetCurrent(Discourse.User.create()); - assert.not(validUpload([{name: "roman.txt"}])); - assert.ok(bootbox.alert.calledWith(I18n.t('post.errors.attachment_upload_not_allowed_for_new_user'))); + assert.not(validUpload([{ name: "roman.txt" }])); + assert.ok( + bootbox.alert.calledWith( + I18n.t("post.errors.attachment_upload_not_allowed_for_new_user") + ) + ); }); QUnit.test("ensures an authorized upload", assert => { sandbox.stub(bootbox, "alert"); assert.not(validUpload([{ name: "unauthorized.html" }])); - assert.ok(bootbox.alert.calledWith(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedExtensions() }))); + assert.ok( + bootbox.alert.calledWith( + I18n.t("post.errors.upload_not_authorized", { + authorized_extensions: authorizedExtensions() + }) + ) + ); }); QUnit.test("staff can upload anything in PM", assert => { @@ -80,19 +117,28 @@ QUnit.test("staff can upload anything in PM", assert => { sandbox.stub(bootbox, "alert"); assert.not(validUpload(files)); - assert.ok(validUpload(files, { isPrivateMessage: true, allowStaffToUploadAnyFileInPm: true })); + assert.ok( + validUpload(files, { + isPrivateMessage: true, + allowStaffToUploadAnyFileInPm: true + }) + ); }); var imageSize = 10 * 1024; var dummyBlob = function() { - var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; + var BlobBuilder = + window.BlobBuilder || + window.WebKitBlobBuilder || + window.MozBlobBuilder || + window.MSBlobBuilder; if (BlobBuilder) { var bb = new BlobBuilder(); bb.append([new Int8Array(imageSize)]); return bb.getBlob("image/png"); } else { - return new Blob([new Int8Array(imageSize)], { "type" : "image\/png" }); + return new Blob([new Int8Array(imageSize)], { type: "image/png" }); } }; @@ -115,30 +161,50 @@ var testUploadMarkdown = function(filename) { return getUploadMarkdown({ original_filename: filename, filesize: 42, - width: 100, - height: 200, + thumbnail_width: 100, + thumbnail_height: 200, url: "/uploads/123/abcdef.ext" }); }; QUnit.test("getUploadMarkdown", assert => { - assert.equal(testUploadMarkdown("lolcat.gif"),'![lolcat|100x200](/uploads/123/abcdef.ext)'); - assert.equal(testUploadMarkdown("[foo|bar].png"),'![%5Bfoo%7Cbar%5D|100x200](/uploads/123/abcdef.ext)'); - assert.ok(testUploadMarkdown("important.txt") === 'important.txt (42 Bytes)\n'); + assert.equal( + testUploadMarkdown("lolcat.gif"), + "![lolcat|100x200](/uploads/123/abcdef.ext)" + ); + assert.equal( + testUploadMarkdown("[foo|bar].png"), + "![%5Bfoo%7Cbar%5D|100x200](/uploads/123/abcdef.ext)" + ); + assert.ok( + testUploadMarkdown("important.txt") === + 'important.txt (42 Bytes)\n' + ); }); QUnit.test("replaces GUID in image alt text on iOS", assert => { - assert.equal(testUploadMarkdown("8F2B469B-6B2C-4213-BC68-57B4876365A0.jpeg"),'![8F2B469B-6B2C-4213-BC68-57B4876365A0|100x200](/uploads/123/abcdef.ext)'); + assert.equal( + testUploadMarkdown("8F2B469B-6B2C-4213-BC68-57B4876365A0.jpeg"), + "![8F2B469B-6B2C-4213-BC68-57B4876365A0|100x200](/uploads/123/abcdef.ext)" + ); - sandbox.stub(Utilities, 'isAppleDevice').returns(true); - assert.equal(testUploadMarkdown("8F2B469B-6B2C-4213-BC68-57B4876365A0.jpeg"),'![image|100x200](/uploads/123/abcdef.ext)'); + sandbox.stub(Utilities, "isAppleDevice").returns(true); + assert.equal( + testUploadMarkdown("8F2B469B-6B2C-4213-BC68-57B4876365A0.jpeg"), + "![image|100x200](/uploads/123/abcdef.ext)" + ); }); QUnit.test("isAnImage", assert => { - _.each(["png", "jpg", "jpeg", "bmp", "gif", "tif", "tiff", "ico"], function(extension) { + _.each(["png", "jpg", "jpeg", "bmp", "gif", "tif", "tiff", "ico"], function( + extension + ) { var image = "image." + extension; assert.ok(isAnImage(image), image + " is recognized as an image"); - assert.ok(isAnImage("http://foo.bar/path/to/" + image), image + " is recognized as an image"); + assert.ok( + isAnImage("http://foo.bar/path/to/" + image), + image + " is recognized as an image" + ); }); assert.not(isAnImage("file.txt")); assert.not(isAnImage("http://foo.bar/path/to/file.txt")); @@ -147,13 +213,21 @@ QUnit.test("isAnImage", assert => { QUnit.test("avatarUrl", assert => { var rawSize = getRawSize; - assert.blank(avatarUrl('', 'tiny'), "no template returns blank"); - assert.equal(avatarUrl('/fake/template/{size}.png', 'tiny'), "/fake/template/" + rawSize(20) + ".png", "simple avatar url"); - assert.equal(avatarUrl('/fake/template/{size}.png', 'large'), "/fake/template/" + rawSize(45) + ".png", "different size"); + assert.blank(avatarUrl("", "tiny"), "no template returns blank"); + assert.equal( + avatarUrl("/fake/template/{size}.png", "tiny"), + "/fake/template/" + rawSize(20) + ".png", + "simple avatar url" + ); + assert.equal( + avatarUrl("/fake/template/{size}.png", "large"), + "/fake/template/" + rawSize(45) + ".png", + "different size" + ); }); var setDevicePixelRatio = function(value) { - if (Object.defineProperty && !window.hasOwnProperty('devicePixelRatio')) { + if (Object.defineProperty && !window.hasOwnProperty("devicePixelRatio")) { Object.defineProperty(window, "devicePixelRatio", { value: 2 }); } else { window.devicePixelRatio = value; @@ -165,20 +239,36 @@ QUnit.test("avatarImg", assert => { setDevicePixelRatio(2); var avatarTemplate = "/path/to/avatar/{size}.png"; - assert.equal(avatarImg({avatarTemplate: avatarTemplate, size: 'tiny'}), - "", - "it returns the avatar html"); + assert.equal( + avatarImg({ avatarTemplate: avatarTemplate, size: "tiny" }), + "", + "it returns the avatar html" + ); - assert.equal(avatarImg({avatarTemplate: avatarTemplate, size: 'tiny', title: 'evilest trout'}), - "", - "it adds a title if supplied"); + assert.equal( + avatarImg({ + avatarTemplate: avatarTemplate, + size: "tiny", + title: "evilest trout" + }), + "", + "it adds a title if supplied" + ); - assert.equal(avatarImg({avatarTemplate: avatarTemplate, size: 'tiny', extraClasses: 'evil fish'}), - "", - "it adds extra classes if supplied"); + assert.equal( + avatarImg({ + avatarTemplate: avatarTemplate, + size: "tiny", + extraClasses: "evil fish" + }), + "", + "it adds extra classes if supplied" + ); - assert.blank(avatarImg({avatarTemplate: "", size: 'tiny'}), - "it doesn't render avatars for invalid avatar template"); + assert.blank( + avatarImg({ avatarTemplate: "", size: "tiny" }), + "it doesn't render avatars for invalid avatar template" + ); setDevicePixelRatio(oldRatio); }); @@ -191,22 +281,33 @@ QUnit.test("allowsImages", assert => { assert.ok(allowsImages(), "works with old extensions syntax"); Discourse.SiteSettings.authorized_extensions = "txt|pdf|*"; - assert.ok(allowsImages(), "images are allowed when all extensions are allowed"); + assert.ok( + allowsImages(), + "images are allowed when all extensions are allowed" + ); Discourse.SiteSettings.authorized_extensions = "json|jpg|pdf|txt"; - assert.ok(allowsImages(), "images are allowed when at least one extension is an image extension"); + assert.ok( + allowsImages(), + "images are allowed when at least one extension is an image extension" + ); }); - QUnit.test("allowsAttachments", assert => { Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif"; assert.not(allowsAttachments(), "no attachments allowed by default"); Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif|*"; - assert.ok(allowsAttachments(), "attachments are allowed when all extensions are allowed"); + assert.ok( + allowsAttachments(), + "attachments are allowed when all extensions are allowed" + ); Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif|pdf"; - assert.ok(allowsAttachments(), "attachments are allowed when at least one extension is not an image extension"); + assert.ok( + allowsAttachments(), + "attachments are allowed when at least one extension is not an image extension" + ); Discourse.SiteSettings.authorized_extensions = ".jpg|.jpeg|.gif|.pdf"; assert.ok(allowsAttachments(), "works with old extensions syntax"); @@ -214,12 +315,20 @@ QUnit.test("allowsAttachments", assert => { QUnit.test("defaultHomepage", assert => { Discourse.SiteSettings.top_menu = "latest|top|hot"; - assert.equal(defaultHomepage(), "latest", "default homepage is the first item in the top_menu site setting"); + assert.equal( + defaultHomepage(), + "latest", + "default homepage is the first item in the top_menu site setting" + ); var meta = document.createElement("meta"); meta.name = "discourse_current_homepage"; meta.content = "hot"; document.body.appendChild(meta); - assert.equal(defaultHomepage(), "hot", "default homepage is pulled from "); + assert.equal( + defaultHomepage(), + "hot", + "default homepage is pulled from " + ); document.body.removeChild(meta); }); @@ -229,12 +338,16 @@ QUnit.test("setDefaultHomepage", assert => { meta.content = "hot"; document.body.appendChild(meta); setDefaultHomepage("top"); - assert.equal(meta.content, "top", "default homepage set by setDefaultHomepage"); + assert.equal( + meta.content, + "top", + "default homepage set by setDefaultHomepage" + ); document.body.removeChild(meta); }); QUnit.test("caretRowCol", assert => { - var textarea = document.createElement('textarea'); + var textarea = document.createElement("textarea"); const content = document.createTextNode("01234\n56789\n012345"); textarea.appendChild(content); document.body.appendChild(textarea); @@ -243,8 +356,16 @@ QUnit.test("caretRowCol", assert => { setCaretPosition(textarea, setCaretPos); const result = caretRowCol(textarea); - assert.equal(result.rowNum, expectedRowNum, "returns the right row of the caret"); - assert.equal(result.colNum, expectedColNum, "returns the right col of the caret"); + assert.equal( + result.rowNum, + expectedRowNum, + "returns the right row of the caret" + ); + assert.equal( + result.colNum, + expectedColNum, + "returns the right col of the caret" + ); }; assertResult(0, 1, 0); @@ -259,8 +380,12 @@ QUnit.test("caretRowCol", assert => { QUnit.test("fillMissingDates", assert => { const startDate = "2017-11-12"; // YYYY-MM-DD const endDate = "2017-12-12"; // YYYY-MM-DD - const data = '[{"x":"2017-11-12","y":3},{"x":"2017-11-27","y":2},{"x":"2017-12-06","y":9},{"x":"2017-12-11","y":2}]'; + const data = + '[{"x":"2017-11-12","y":3},{"x":"2017-11-27","y":2},{"x":"2017-12-06","y":9},{"x":"2017-12-11","y":2}]'; - assert.equal(fillMissingDates(JSON.parse(data), startDate, endDate).length, 31, - "it returns a JSON array with 31 dates"); + assert.equal( + fillMissingDates(JSON.parse(data), startDate, endDate).length, + 31, + "it returns a JSON array with 31 dates" + ); }); diff --git a/test/javascripts/lib/white-lister-test.js.es6 b/test/javascripts/lib/white-lister-test.js.es6 index e8bb3d8f30..0529e52515 100644 --- a/test/javascripts/lib/white-lister-test.js.es6 +++ b/test/javascripts/lib/white-lister-test.js.es6 @@ -1,48 +1,58 @@ -import WhiteLister from 'pretty-text/white-lister'; +import WhiteLister from "pretty-text/white-lister"; QUnit.module("lib:whiteLister"); QUnit.test("whiteLister", assert => { const whiteLister = new WhiteLister(); - assert.ok(Object.keys(whiteLister.getWhiteList().tagList).length > 1, "should have some defaults"); + assert.ok( + Object.keys(whiteLister.getWhiteList().tagList).length > 1, + "should have some defaults" + ); whiteLister.disable("default"); - assert.ok(Object.keys(whiteLister.getWhiteList().tagList).length === 0, "should have no defaults if disabled"); + assert.ok( + Object.keys(whiteLister.getWhiteList().tagList).length === 0, + "should have no defaults if disabled" + ); whiteLister.whiteListFeature("test", [ - 'custom.foo', - 'custom.baz', - 'custom[data-*]', - 'custom[rel=nofollow]' + "custom.foo", + "custom.baz", + "custom[data-*]", + "custom[rel=nofollow]" ]); - whiteLister.whiteListFeature("test", [ - 'custom[rel=test]' - ]); + whiteLister.whiteListFeature("test", ["custom[rel=test]"]); whiteLister.enable("test"); - assert.deepEqual(whiteLister.getWhiteList(), { - tagList: { - custom: [] - }, - attrList: { - custom: { - "class": ["foo", "baz"], - "data-*": ["*"], - "rel": ["nofollow", "test"] + assert.deepEqual( + whiteLister.getWhiteList(), + { + tagList: { + custom: [] + }, + attrList: { + custom: { + class: ["foo", "baz"], + "data-*": ["*"], + rel: ["nofollow", "test"] + } } - } - }, 'Expecting a correct white list'); - + }, + "Expecting a correct white list" + ); whiteLister.disable("test"); - assert.deepEqual(whiteLister.getWhiteList(), { - tagList: {}, - attrList: {} - }, 'Expecting an empty white list'); - + assert.deepEqual( + whiteLister.getWhiteList(), + { + tagList: {}, + attrList: {} + }, + "Expecting an empty white list" + ); }); diff --git a/test/javascripts/mixins/grant-badge-controller-test.js.es6 b/test/javascripts/mixins/grant-badge-controller-test.js.es6 index d1e34cd133..c08276c80d 100644 --- a/test/javascripts/mixins/grant-badge-controller-test.js.es6 +++ b/test/javascripts/mixins/grant-badge-controller-test.js.es6 @@ -1,38 +1,83 @@ -import GrantBadgeControllerMixin from 'discourse/mixins/grant-badge-controller'; -import Badge from 'discourse/models/badge'; +import GrantBadgeControllerMixin from "discourse/mixins/grant-badge-controller"; +import Badge from "discourse/models/badge"; -QUnit.module('mixin:grant-badge-controller', { +QUnit.module("mixin:grant-badge-controller", { before: function() { - this.GrantBadgeController = Ember.Controller.extend(GrantBadgeControllerMixin); + this.GrantBadgeController = Ember.Controller.extend( + GrantBadgeControllerMixin + ); - this.badgeFirst = Badge.create({ id: 3, name: 'A Badge', enabled: true, manually_grantable: true }); - this.badgeMiddle = Badge.create({ id: 1, name: 'My Badge', enabled: true, manually_grantable: true }); - this.badgeLast = Badge.create({ id: 2, name: 'Zoo Badge', enabled: true, manually_grantable: true }); - this.badgeDisabled = Badge.create({ id: 4, name: 'Disabled Badge', enabled: false, manually_grantable: true }); - this.badgeAutomatic = Badge.create({ id: 5, name: 'Automatic Badge', enabled: true, manually_grantable: false }); + this.badgeFirst = Badge.create({ + id: 3, + name: "A Badge", + enabled: true, + manually_grantable: true + }); + this.badgeMiddle = Badge.create({ + id: 1, + name: "My Badge", + enabled: true, + manually_grantable: true + }); + this.badgeLast = Badge.create({ + id: 2, + name: "Zoo Badge", + enabled: true, + manually_grantable: true + }); + this.badgeDisabled = Badge.create({ + id: 4, + name: "Disabled Badge", + enabled: false, + manually_grantable: true + }); + this.badgeAutomatic = Badge.create({ + id: 5, + name: "Automatic Badge", + enabled: true, + manually_grantable: false + }); }, beforeEach: function() { this.subject = this.GrantBadgeController.create({ userBadges: [], - allBadges: [this.badgeLast, this.badgeFirst, this.badgeMiddle, this.badgeDisabled, this.badgeAutomatic], + allBadges: [ + this.badgeLast, + this.badgeFirst, + this.badgeMiddle, + this.badgeDisabled, + this.badgeAutomatic + ] }); } }); -QUnit.test('grantableBadges', function(assert) { - const sortedNames = [this.badgeFirst.name, this.badgeMiddle.name, this.badgeLast.name]; - const badgeNames = this.subject.get('grantableBadges').map(badge => badge.name); +QUnit.test("grantableBadges", function(assert) { + const sortedNames = [ + this.badgeFirst.name, + this.badgeMiddle.name, + this.badgeLast.name + ]; + const badgeNames = this.subject + .get("grantableBadges") + .map(badge => badge.name); - assert.not(badgeNames.includes(this.badgeDisabled), 'excludes disabled badges'); - assert.not(badgeNames.includes(this.badgeAutomatic), 'excludes automatic badges'); - assert.deepEqual(badgeNames, sortedNames, 'sorts badges by name'); + assert.not( + badgeNames.includes(this.badgeDisabled), + "excludes disabled badges" + ); + assert.not( + badgeNames.includes(this.badgeAutomatic), + "excludes automatic badges" + ); + assert.deepEqual(badgeNames, sortedNames, "sorts badges by name"); }); -QUnit.test('selectedBadgeGrantable', function(assert) { - this.subject.set('selectedBadgeId', this.badgeDisabled.id); - assert.not(this.subject.get('selectedBadgeGrantable')); +QUnit.test("selectedBadgeGrantable", function(assert) { + this.subject.set("selectedBadgeId", this.badgeDisabled.id); + assert.not(this.subject.get("selectedBadgeGrantable")); - this.subject.set('selectedBadgeId', this.badgeFirst.id); - assert.ok(this.subject.get('selectedBadgeGrantable')); + this.subject.set("selectedBadgeId", this.badgeFirst.id); + assert.ok(this.subject.get("selectedBadgeGrantable")); }); diff --git a/test/javascripts/mixins/singleton-test.js.es6 b/test/javascripts/mixins/singleton-test.js.es6 index 2e5635a4d1..0ed6c198ee 100644 --- a/test/javascripts/mixins/singleton-test.js.es6 +++ b/test/javascripts/mixins/singleton-test.js.es6 @@ -1,4 +1,4 @@ -import Singleton from 'discourse/mixins/singleton'; +import Singleton from "discourse/mixins/singleton"; QUnit.module("mixin:singleton"); @@ -7,9 +7,17 @@ QUnit.test("current", assert => { DummyModel.reopenClass(Singleton); var current = DummyModel.current(); - assert.present(current, 'current returns the current instance'); - assert.equal(current, DummyModel.current(), 'calling it again returns the same instance'); - assert.notEqual(current, DummyModel.create({}), 'we can create other instances that are not the same as current'); + assert.present(current, "current returns the current instance"); + assert.equal( + current, + DummyModel.current(), + "calling it again returns the same instance" + ); + assert.notEqual( + current, + DummyModel.create({}), + "we can create other instances that are not the same as current" + ); }); QUnit.test("currentProp reading", assert => { @@ -17,39 +25,60 @@ QUnit.test("currentProp reading", assert => { DummyModel.reopenClass(Singleton); var current = DummyModel.current(); - assert.blank(DummyModel.currentProp('evil'), 'by default attributes are blank'); - current.set('evil', 'trout'); - assert.equal(DummyModel.currentProp('evil'), 'trout', 'after changing the instance, the value is set'); + assert.blank( + DummyModel.currentProp("evil"), + "by default attributes are blank" + ); + current.set("evil", "trout"); + assert.equal( + DummyModel.currentProp("evil"), + "trout", + "after changing the instance, the value is set" + ); }); QUnit.test("currentProp writing", assert => { var DummyModel = Ember.Object.extend({}); DummyModel.reopenClass(Singleton); - assert.blank(DummyModel.currentProp('adventure'), 'by default attributes are blank'); - var result = DummyModel.currentProp('adventure', 'time'); - assert.equal(result, 'time', 'it returns the new value'); - assert.equal(DummyModel.currentProp('adventure'), 'time', 'after calling currentProp the value is set'); + assert.blank( + DummyModel.currentProp("adventure"), + "by default attributes are blank" + ); + var result = DummyModel.currentProp("adventure", "time"); + assert.equal(result, "time", "it returns the new value"); + assert.equal( + DummyModel.currentProp("adventure"), + "time", + "after calling currentProp the value is set" + ); - DummyModel.currentProp('count', 0); - assert.equal(DummyModel.currentProp('count'), 0, 'we can set the value to 0'); + DummyModel.currentProp("count", 0); + assert.equal(DummyModel.currentProp("count"), 0, "we can set the value to 0"); - DummyModel.currentProp('adventure', null); - assert.equal(DummyModel.currentProp('adventure'), null, 'we can set the value to null'); + DummyModel.currentProp("adventure", null); + assert.equal( + DummyModel.currentProp("adventure"), + null, + "we can set the value to null" + ); }); QUnit.test("createCurrent", assert => { var Shoe = Ember.Object.extend({}); Shoe.reopenClass(Singleton, { createCurrent: function() { - return Shoe.create({toes: 5}); + return Shoe.create({ toes: 5 }); } }); - assert.equal(Shoe.currentProp('toes'), 5, 'it created the class using `createCurrent`'); + assert.equal( + Shoe.currentProp("toes"), + 5, + "it created the class using `createCurrent`" + ); }); - QUnit.test("createCurrent that returns null", assert => { var Missing = Ember.Object.extend({}); Missing.reopenClass(Singleton, { @@ -59,5 +88,8 @@ QUnit.test("createCurrent that returns null", assert => { }); assert.blank(Missing.current(), "it doesn't return an instance"); - assert.blank(Missing.currentProp('madeup'), "it won't raise an error asking for a property. Will just return null."); -}); \ No newline at end of file + assert.blank( + Missing.currentProp("madeup"), + "it won't raise an error asking for a property. Will just return null." + ); +}); diff --git a/test/javascripts/models/badge-test.js.es6 b/test/javascripts/models/badge-test.js.es6 index d9a6e0b2d3..e29710e1f8 100644 --- a/test/javascripts/models/badge-test.js.es6 +++ b/test/javascripts/models/badge-test.js.es6 @@ -1,51 +1,75 @@ -import Badge from 'discourse/models/badge'; +import Badge from "discourse/models/badge"; QUnit.module("model:badge"); -QUnit.test('newBadge', assert => { - const badge1 = Badge.create({name: "New Badge"}), - badge2 = Badge.create({id: 1, name: "Old Badge"}); - assert.ok(badge1.get('newBadge'), "badges without ids are new"); - assert.ok(!badge2.get('newBadge'), "badges with ids are not new"); +QUnit.test("newBadge", assert => { + const badge1 = Badge.create({ name: "New Badge" }), + badge2 = Badge.create({ id: 1, name: "Old Badge" }); + assert.ok(badge1.get("newBadge"), "badges without ids are new"); + assert.ok(!badge2.get("newBadge"), "badges with ids are not new"); }); - -QUnit.test('createFromJson array', assert => { - const badgesJson = {"badge_types":[{"id":6,"name":"Silver 1"}],"badges":[{"id":1126,"name":"Badge 1","description":null,"badge_type_id":6}]}; +QUnit.test("createFromJson array", assert => { + const badgesJson = { + badge_types: [{ id: 6, name: "Silver 1" }], + badges: [{ id: 1126, name: "Badge 1", description: null, badge_type_id: 6 }] + }; const badges = Badge.createFromJson(badgesJson); assert.ok(Array.isArray(badges), "returns an array"); - assert.equal(badges[0].get('name'), "Badge 1", "badge details are set"); - assert.equal(badges[0].get('badge_type.name'), "Silver 1", "badge_type reference is set"); + assert.equal(badges[0].get("name"), "Badge 1", "badge details are set"); + assert.equal( + badges[0].get("badge_type.name"), + "Silver 1", + "badge_type reference is set" + ); }); -QUnit.test('createFromJson single', assert => { - const badgeJson = {"badge_types":[{"id":6,"name":"Silver 1"}],"badge":{"id":1126,"name":"Badge 1","description":null,"badge_type_id":6}}; +QUnit.test("createFromJson single", assert => { + const badgeJson = { + badge_types: [{ id: 6, name: "Silver 1" }], + badge: { id: 1126, name: "Badge 1", description: null, badge_type_id: 6 } + }; const badge = Badge.createFromJson(badgeJson); assert.ok(!Array.isArray(badge), "does not returns an array"); }); -QUnit.test('updateFromJson', assert => { - const badgeJson = {"badge_types":[{"id":6,"name":"Silver 1"}],"badge":{"id":1126,"name":"Badge 1","description":null,"badge_type_id":6}}; - const badge = Badge.create({name: "Badge 1"}); +QUnit.test("updateFromJson", assert => { + const badgeJson = { + badge_types: [{ id: 6, name: "Silver 1" }], + badge: { id: 1126, name: "Badge 1", description: null, badge_type_id: 6 } + }; + const badge = Badge.create({ name: "Badge 1" }); badge.updateFromJson(badgeJson); - assert.equal(badge.get('id'), 1126, "id is set"); - assert.equal(badge.get('badge_type.name'), "Silver 1", "badge_type reference is set"); + assert.equal(badge.get("id"), 1126, "id is set"); + assert.equal( + badge.get("badge_type.name"), + "Silver 1", + "badge_type reference is set" + ); }); -QUnit.test('save', assert => { +QUnit.test("save", assert => { assert.expect(0); - const badge = Badge.create({name: "New Badge", description: "This is a new badge.", badge_type_id: 1}); + const badge = Badge.create({ + name: "New Badge", + description: "This is a new badge.", + badge_type_id: 1 + }); return badge.save(["name", "description", "badge_type_id"]); }); -QUnit.test('destroy', assert => { +QUnit.test("destroy", assert => { assert.expect(0); - const badge = Badge.create({name: "New Badge", description: "This is a new badge.", badge_type_id: 1}); + const badge = Badge.create({ + name: "New Badge", + description: "This is a new badge.", + badge_type_id: 1 + }); badge.destroy(); - badge.set('id', 3); + badge.set("id", 3); return badge.destroy(); -}); \ No newline at end of file +}); diff --git a/test/javascripts/models/category-test.js.es6 b/test/javascripts/models/category-test.js.es6 index fc5065566a..9e2437cf57 100644 --- a/test/javascripts/models/category-test.js.es6 +++ b/test/javascripts/models/category-test.js.es6 @@ -1,146 +1,322 @@ -import createStore from 'helpers/create-store'; -import Category from 'discourse/models/category'; +import createStore from "helpers/create-store"; +import Category from "discourse/models/category"; QUnit.module("model:category"); -QUnit.test('slugFor', assert =>{ +QUnit.test("slugFor", assert => { const store = createStore(); const slugFor = function(cat, val, text) { assert.equal(Discourse.Category.slugFor(cat), val, text); }; - slugFor(store.createRecord('category', {slug: 'hello'}), "hello", "It calculates the proper slug for hello"); - slugFor(store.createRecord('category', {id: 123, slug: ''}), "123-category", "It returns id-category for empty strings"); - slugFor(store.createRecord('category', {id: 456}), "456-category", "It returns id-category for undefined slugs"); - slugFor(store.createRecord('category', {slug: '熱帶風暴畫眉'}), "熱帶風暴畫眉", "It can be non english characters"); + slugFor( + store.createRecord("category", { slug: "hello" }), + "hello", + "It calculates the proper slug for hello" + ); + slugFor( + store.createRecord("category", { id: 123, slug: "" }), + "123-category", + "It returns id-category for empty strings" + ); + slugFor( + store.createRecord("category", { id: 456 }), + "456-category", + "It returns id-category for undefined slugs" + ); + slugFor( + store.createRecord("category", { slug: "熱帶風暴畫眉" }), + "熱帶風暴畫眉", + "It can be non english characters" + ); - const parentCategory = store.createRecord('category', {id: 345, slug: 'darth'}); - slugFor(store.createRecord('category', {slug: 'luke', parentCategory: parentCategory}), - "darth/luke", - "it uses the parent slug before the child"); + const parentCategory = store.createRecord("category", { + id: 345, + slug: "darth" + }); + slugFor( + store.createRecord("category", { + slug: "luke", + parentCategory: parentCategory + }), + "darth/luke", + "it uses the parent slug before the child" + ); - slugFor(store.createRecord('category', {id: 555, parentCategory: parentCategory}), - "darth/555-category", - "it uses the parent slug before the child and then uses id"); + slugFor( + store.createRecord("category", { id: 555, parentCategory: parentCategory }), + "darth/555-category", + "it uses the parent slug before the child and then uses id" + ); - parentCategory.set('slug', null); - slugFor(store.createRecord('category', {id: 555, parentCategory: parentCategory}), - "345-category/555-category", - "it uses the parent before the child and uses ids for both"); + parentCategory.set("slug", null); + slugFor( + store.createRecord("category", { id: 555, parentCategory: parentCategory }), + "345-category/555-category", + "it uses the parent before the child and uses ids for both" + ); }); - -QUnit.test('findBySlug', assert => { +QUnit.test("findBySlug", assert => { assert.expect(6); const store = createStore(); - const darth = store.createRecord('category', {id: 1, slug: 'darth'}), - luke = store.createRecord('category', {id: 2, slug: 'luke', parentCategory: darth}), - hurricane = store.createRecord('category', {id: 3, slug: '熱帶風暴畫眉'}), - newsFeed = store.createRecord('category', {id: 4, slug: '뉴스피드', parentCategory: hurricane}), - time = store.createRecord('category', {id: 5, slug: '时间', parentCategory: darth}), - bah = store.createRecord('category', {id: 6, slug: 'bah', parentCategory: hurricane}), + const darth = store.createRecord("category", { id: 1, slug: "darth" }), + luke = store.createRecord("category", { + id: 2, + slug: "luke", + parentCategory: darth + }), + hurricane = store.createRecord("category", { id: 3, slug: "熱帶風暴畫眉" }), + newsFeed = store.createRecord("category", { + id: 4, + slug: "뉴스피드", + parentCategory: hurricane + }), + time = store.createRecord("category", { + id: 5, + slug: "时间", + parentCategory: darth + }), + bah = store.createRecord("category", { + id: 6, + slug: "bah", + parentCategory: hurricane + }), categoryList = [darth, luke, hurricane, newsFeed, time, bah]; - sandbox.stub(Discourse.Category, 'list').returns(categoryList); + sandbox.stub(Discourse.Category, "list").returns(categoryList); - assert.deepEqual(Discourse.Category.findBySlug('darth'), darth, 'we can find a category'); - assert.deepEqual(Discourse.Category.findBySlug('luke', 'darth'), luke, 'we can find the other category with parent category'); - assert.deepEqual(Discourse.Category.findBySlug('熱帶風暴畫眉'), hurricane, 'we can find a category with CJK slug'); - assert.deepEqual(Discourse.Category.findBySlug('뉴스피드', '熱帶風暴畫眉'), newsFeed, 'we can find a category with CJK slug whose parent slug is also CJK'); - assert.deepEqual(Discourse.Category.findBySlug('时间', 'darth'), time, 'we can find a category with CJK slug whose parent slug is english'); - assert.deepEqual(Discourse.Category.findBySlug('bah', '熱帶風暴畫眉'), bah, 'we can find a category with english slug whose parent slug is CJK'); + assert.deepEqual( + Discourse.Category.findBySlug("darth"), + darth, + "we can find a category" + ); + assert.deepEqual( + Discourse.Category.findBySlug("luke", "darth"), + luke, + "we can find the other category with parent category" + ); + assert.deepEqual( + Discourse.Category.findBySlug("熱帶風暴畫眉"), + hurricane, + "we can find a category with CJK slug" + ); + assert.deepEqual( + Discourse.Category.findBySlug("뉴스피드", "熱帶風暴畫眉"), + newsFeed, + "we can find a category with CJK slug whose parent slug is also CJK" + ); + assert.deepEqual( + Discourse.Category.findBySlug("时间", "darth"), + time, + "we can find a category with CJK slug whose parent slug is english" + ); + assert.deepEqual( + Discourse.Category.findBySlug("bah", "熱帶風暴畫眉"), + bah, + "we can find a category with english slug whose parent slug is CJK" + ); sandbox.restore(); }); -QUnit.test('findSingleBySlug', assert => { +QUnit.test("findSingleBySlug", assert => { assert.expect(6); const store = createStore(); - const darth = store.createRecord('category', {id: 1, slug: 'darth'}), - luke = store.createRecord('category', {id: 2, slug: 'luke', parentCategory: darth}), - hurricane = store.createRecord('category', {id: 3, slug: '熱帶風暴畫眉'}), - newsFeed = store.createRecord('category', {id: 4, slug: '뉴스피드', parentCategory: hurricane}), - time = store.createRecord('category', {id: 5, slug: '时间', parentCategory: darth}), - bah = store.createRecord('category', {id: 6, slug: 'bah', parentCategory: hurricane}), + const darth = store.createRecord("category", { id: 1, slug: "darth" }), + luke = store.createRecord("category", { + id: 2, + slug: "luke", + parentCategory: darth + }), + hurricane = store.createRecord("category", { id: 3, slug: "熱帶風暴畫眉" }), + newsFeed = store.createRecord("category", { + id: 4, + slug: "뉴스피드", + parentCategory: hurricane + }), + time = store.createRecord("category", { + id: 5, + slug: "时间", + parentCategory: darth + }), + bah = store.createRecord("category", { + id: 6, + slug: "bah", + parentCategory: hurricane + }), categoryList = [darth, luke, hurricane, newsFeed, time, bah]; - sandbox.stub(Discourse.Category, 'list').returns(categoryList); + sandbox.stub(Discourse.Category, "list").returns(categoryList); - assert.deepEqual(Discourse.Category.findSingleBySlug('darth'), darth, 'we can find a category'); - assert.deepEqual(Discourse.Category.findSingleBySlug('darth/luke'), luke, 'we can find the other category with parent category'); - assert.deepEqual(Discourse.Category.findSingleBySlug('熱帶風暴畫眉'), hurricane, 'we can find a category with CJK slug'); - assert.deepEqual(Discourse.Category.findSingleBySlug('熱帶風暴畫眉/뉴스피드'), newsFeed, 'we can find a category with CJK slug whose parent slug is also CJK'); - assert.deepEqual(Discourse.Category.findSingleBySlug('darth/时间'), time, 'we can find a category with CJK slug whose parent slug is english'); - assert.deepEqual(Discourse.Category.findSingleBySlug('熱帶風暴畫眉/bah'), bah, 'we can find a category with english slug whose parent slug is CJK'); + assert.deepEqual( + Discourse.Category.findSingleBySlug("darth"), + darth, + "we can find a category" + ); + assert.deepEqual( + Discourse.Category.findSingleBySlug("darth/luke"), + luke, + "we can find the other category with parent category" + ); + assert.deepEqual( + Discourse.Category.findSingleBySlug("熱帶風暴畫眉"), + hurricane, + "we can find a category with CJK slug" + ); + assert.deepEqual( + Discourse.Category.findSingleBySlug("熱帶風暴畫眉/뉴스피드"), + newsFeed, + "we can find a category with CJK slug whose parent slug is also CJK" + ); + assert.deepEqual( + Discourse.Category.findSingleBySlug("darth/时间"), + time, + "we can find a category with CJK slug whose parent slug is english" + ); + assert.deepEqual( + Discourse.Category.findSingleBySlug("熱帶風暴畫眉/bah"), + bah, + "we can find a category with english slug whose parent slug is CJK" + ); }); -QUnit.test('findByIds', assert => { +QUnit.test("findByIds", assert => { const store = createStore(); - const categories = { - 1: store.createRecord('category', {id: 1}), - 2: store.createRecord('category', {id: 2}) + const categories = { + 1: store.createRecord("category", { id: 1 }), + 2: store.createRecord("category", { id: 2 }) }; - sandbox.stub(Discourse.Category, 'idMap').returns(categories); - assert.deepEqual(Discourse.Category.findByIds([1,2,3]), _.values(categories)); + sandbox.stub(Discourse.Category, "idMap").returns(categories); + assert.deepEqual( + Discourse.Category.findByIds([1, 2, 3]), + _.values(categories) + ); }); -QUnit.test('search with category name', assert => { +QUnit.test("search with category name", assert => { const store = createStore(), - category1 = store.createRecord('category', { id: 1, name: 'middle term', slug: 'different-slug' }), - category2 = store.createRecord('category', { id: 2, name: 'middle term', slug: 'another-different-slug' }); + category1 = store.createRecord("category", { + id: 1, + name: "middle term", + slug: "different-slug" + }), + category2 = store.createRecord("category", { + id: 2, + name: "middle term", + slug: "another-different-slug" + }); sandbox.stub(Category, "listByActivity").returns([category1, category2]); - assert.deepEqual(Category.search('term', { limit: 0 }), [], "returns an empty array when limit is 0"); - assert.deepEqual(Category.search(''), [category1, category2], "orders by activity if no term is matched"); - assert.deepEqual(Category.search('term'), [category1, category2], "orders by activity"); + assert.deepEqual( + Category.search("term", { limit: 0 }), + [], + "returns an empty array when limit is 0" + ); + assert.deepEqual( + Category.search(""), + [category1, category2], + "orders by activity if no term is matched" + ); + assert.deepEqual( + Category.search("term"), + [category1, category2], + "orders by activity" + ); - category2.set('name', 'TeRm start'); - assert.deepEqual(Category.search('tErM'), [category2, category1], "ignores case of category name and search term"); + category2.set("name", "TeRm start"); + assert.deepEqual( + Category.search("tErM"), + [category2, category1], + "ignores case of category name and search term" + ); - category2.set('name', 'term start'); - assert.deepEqual(Category.search('term'), [category2, category1], "orders matching begin with and then contains"); + category2.set("name", "term start"); + assert.deepEqual( + Category.search("term"), + [category2, category1], + "orders matching begin with and then contains" + ); sandbox.restore(); - const child_category1 = store.createRecord('category', { id: 3, name: 'term start', parent_category_id: category1.get('id') }), - read_restricted_category = store.createRecord('category', { id: 4, name: 'some term', read_restricted: true }); + const child_category1 = store.createRecord("category", { + id: 3, + name: "term start", + parent_category_id: category1.get("id") + }), + read_restricted_category = store.createRecord("category", { + id: 4, + name: "some term", + read_restricted: true + }); - sandbox.stub(Category, "listByActivity").returns([read_restricted_category, category1, child_category1, category2]); + sandbox + .stub(Category, "listByActivity") + .returns([read_restricted_category, category1, child_category1, category2]); - assert.deepEqual(Category.search(''), - [category1, category2, read_restricted_category], - "prioritize non read_restricted and does not include child categories when term is blank"); + assert.deepEqual( + Category.search(""), + [category1, category2, read_restricted_category], + "prioritize non read_restricted and does not include child categories when term is blank" + ); - assert.deepEqual(Category.search('', { limit: 3 }), - [category1, category2, read_restricted_category], - "prioritize non read_restricted and does not include child categories categories when term is blank with limit"); + assert.deepEqual( + Category.search("", { limit: 3 }), + [category1, category2, read_restricted_category], + "prioritize non read_restricted and does not include child categories categories when term is blank with limit" + ); - assert.deepEqual(Category.search('term'), - [child_category1, category2, category1, read_restricted_category], - "prioritize non read_restricted"); + assert.deepEqual( + Category.search("term"), + [child_category1, category2, category1, read_restricted_category], + "prioritize non read_restricted" + ); - assert.deepEqual(Category.search('term', { limit: 3 }), - [child_category1, category2, read_restricted_category], - "prioritize non read_restricted with limit"); + assert.deepEqual( + Category.search("term", { limit: 3 }), + [child_category1, category2, read_restricted_category], + "prioritize non read_restricted with limit" + ); sandbox.restore(); }); -QUnit.test('search with category slug', assert => { +QUnit.test("search with category slug", assert => { const store = createStore(), - category1 = store.createRecord('category', { id: 1, name: 'middle term', slug: 'different-slug' }), - category2 = store.createRecord('category', { id: 2, name: 'middle term', slug: 'another-different-slug' }); + category1 = store.createRecord("category", { + id: 1, + name: "middle term", + slug: "different-slug" + }), + category2 = store.createRecord("category", { + id: 2, + name: "middle term", + slug: "another-different-slug" + }); sandbox.stub(Category, "listByActivity").returns([category1, category2]); - assert.deepEqual(Category.search('different-slug'), [category1, category2], "returns the right categories"); - assert.deepEqual(Category.search('another-different'), [category2], "returns the right categories"); + assert.deepEqual( + Category.search("different-slug"), + [category1, category2], + "returns the right categories" + ); + assert.deepEqual( + Category.search("another-different"), + [category2], + "returns the right categories" + ); - category2.set('slug', 'ANOTher-DIFfereNT'); - assert.deepEqual(Category.search('anOtHer-dIfFeREnt'), [category2], "ignores case of category slug and search term"); + category2.set("slug", "ANOTher-DIFfereNT"); + assert.deepEqual( + Category.search("anOtHer-dIfFeREnt"), + [category2], + "ignores case of category slug and search term" + ); }); diff --git a/test/javascripts/models/composer-test.js.es6 b/test/javascripts/models/composer-test.js.es6 index 4add3a8452..f1706421f7 100644 --- a/test/javascripts/models/composer-test.js.es6 +++ b/test/javascripts/models/composer-test.js.es6 @@ -1,13 +1,13 @@ -import { currentUser } from 'helpers/qunit-helpers'; -import Composer from 'discourse/models/composer'; -import createStore from 'helpers/create-store'; +import { currentUser } from "helpers/qunit-helpers"; +import Composer from "discourse/models/composer"; +import createStore from "helpers/create-store"; QUnit.module("model:composer"); function createComposer(opts) { opts = opts || {}; opts.user = opts.user || currentUser(); - return createStore().createRecord('composer', opts); + return createStore().createRecord("composer", opts); } function openComposer(opts) { @@ -16,85 +16,150 @@ function openComposer(opts) { return composer; } -QUnit.test('replyLength', assert => { +QUnit.test("replyLength", assert => { const replyLength = function(val, expectedLength) { const composer = createComposer({ reply: val }); - assert.equal(composer.get('replyLength'), expectedLength); + assert.equal(composer.get("replyLength"), expectedLength); }; replyLength("basic reply", 11, "basic reply length"); replyLength(" \nbasic reply\t", 11, "trims whitespaces"); replyLength("ba sic\n\nreply", 12, "count only significant whitespaces"); - replyLength("1[quote=]not counted[/quote]2[quote=]at all[/quote]3", 3, "removes quotes"); - replyLength("1[quote=]not[quote=]counted[/quote]yay[/quote]2", 2, "handles nested quotes correctly"); + replyLength( + "1[quote=]not counted[/quote]2[quote=]at all[/quote]3", + 3, + "removes quotes" + ); + replyLength( + "1[quote=]not[quote=]counted[/quote]yay[/quote]2", + 2, + "handles nested quotes correctly" + ); }); -QUnit.test('missingReplyCharacters', assert => { +QUnit.test("missingReplyCharacters", assert => { Discourse.SiteSettings.min_first_post_length = 40; - const missingReplyCharacters = function(val, isPM, isFirstPost, expected, message) { - const composer = createComposer({ reply: val, creatingPrivateMessage: isPM, creatingTopic: isFirstPost }); - assert.equal(composer.get('missingReplyCharacters'), expected, message); + const missingReplyCharacters = function( + val, + isPM, + isFirstPost, + expected, + message + ) { + const composer = createComposer({ + reply: val, + creatingPrivateMessage: isPM, + creatingTopic: isFirstPost + }); + assert.equal(composer.get("missingReplyCharacters"), expected, message); }; - missingReplyCharacters('hi', false, false, Discourse.SiteSettings.min_post_length - 2, 'too short public post'); - missingReplyCharacters('hi', false, true, Discourse.SiteSettings.min_first_post_length - 2, 'too short first post'); - missingReplyCharacters('hi', true, false, Discourse.SiteSettings.min_personal_message_post_length - 2, 'too short private message'); + missingReplyCharacters( + "hi", + false, + false, + Discourse.SiteSettings.min_post_length - 2, + "too short public post" + ); + missingReplyCharacters( + "hi", + false, + true, + Discourse.SiteSettings.min_first_post_length - 2, + "too short first post" + ); + missingReplyCharacters( + "hi", + true, + false, + Discourse.SiteSettings.min_personal_message_post_length - 2, + "too short private message" + ); const link = "http://imgur.com/gallery/grxX8"; - const composer = createComposer({ canEditTopicFeaturedLink: true, title: link, featuredLink: link, reply: link }); + const composer = createComposer({ + canEditTopicFeaturedLink: true, + title: link, + featuredLink: link, + reply: link + }); - assert.equal(composer.get('missingReplyCharacters'), 0, "don't require any post content"); + assert.equal( + composer.get("missingReplyCharacters"), + 0, + "don't require any post content" + ); }); -QUnit.test('missingTitleCharacters', assert => { +QUnit.test("missingTitleCharacters", assert => { const missingTitleCharacters = function(val, isPM, expected, message) { - const composer = createComposer({ title: val, creatingPrivateMessage: isPM }); - assert.equal(composer.get('missingTitleCharacters'), expected, message); + const composer = createComposer({ + title: val, + creatingPrivateMessage: isPM + }); + assert.equal(composer.get("missingTitleCharacters"), expected, message); }; - missingTitleCharacters('hi', false, Discourse.SiteSettings.min_topic_title_length - 2, 'too short post title'); - missingTitleCharacters('z', true, Discourse.SiteSettings.min_personal_message_title_length - 1, 'too short pm title'); + missingTitleCharacters( + "hi", + false, + Discourse.SiteSettings.min_topic_title_length - 2, + "too short post title" + ); + missingTitleCharacters( + "z", + true, + Discourse.SiteSettings.min_personal_message_title_length - 1, + "too short pm title" + ); }); -QUnit.test('replyDirty', assert => { +QUnit.test("replyDirty", assert => { const composer = createComposer(); - assert.ok(!composer.get('replyDirty'), "by default it's false"); + assert.ok(!composer.get("replyDirty"), "by default it's false"); composer.setProperties({ originalText: "hello", reply: "hello" }); - assert.ok(!composer.get('replyDirty'), "it's false when the originalText is the same as the reply"); - composer.set('reply', 'hello world'); - assert.ok(composer.get('replyDirty'), "it's true when the reply changes"); + assert.ok( + !composer.get("replyDirty"), + "it's false when the originalText is the same as the reply" + ); + composer.set("reply", "hello world"); + assert.ok(composer.get("replyDirty"), "it's true when the reply changes"); }); QUnit.test("appendText", assert => { const composer = createComposer(); - assert.blank(composer.get('reply'), "the reply is blank by default"); + assert.blank(composer.get("reply"), "the reply is blank by default"); composer.appendText("hello"); - assert.equal(composer.get('reply'), "hello", "it appends text to nothing"); + assert.equal(composer.get("reply"), "hello", "it appends text to nothing"); composer.appendText(" world"); - assert.equal(composer.get('reply'), "hello world", "it appends text to existing text"); + assert.equal( + composer.get("reply"), + "hello world", + "it appends text to existing text" + ); composer.clearState(); composer.appendText("a\n\n\n\nb"); - composer.appendText("c",3,{block: true}); + composer.appendText("c", 3, { block: true }); assert.equal(composer.get("reply"), "a\n\nc\n\nb"); composer.clearState(); composer.appendText("ab"); - composer.appendText("c",1,{block: true}); + composer.appendText("c", 1, { block: true }); assert.equal(composer.get("reply"), "a\n\nc\n\nb"); composer.clearState(); composer.appendText("\nab"); - composer.appendText("c",0,{block: true}); + composer.appendText("c", 0, { block: true }); assert.equal(composer.get("reply"), "c\n\nab"); }); @@ -102,16 +167,24 @@ QUnit.test("appendText", assert => { QUnit.test("prependText", assert => { const composer = createComposer(); - assert.blank(composer.get('reply'), "the reply is blank by default"); + assert.blank(composer.get("reply"), "the reply is blank by default"); composer.prependText("hello"); - assert.equal(composer.get('reply'), "hello", "it prepends text to nothing"); + assert.equal(composer.get("reply"), "hello", "it prepends text to nothing"); composer.prependText("world "); - assert.equal(composer.get('reply'), "world hello", "it prepends text to existing text"); + assert.equal( + composer.get("reply"), + "world hello", + "it prepends text to existing text" + ); - composer.prependText("before new line", {new_line: true}); - assert.equal(composer.get('reply'), "before new line\n\nworld hello", "it prepends text with new line to existing text"); + composer.prependText("before new line", { new_line: true }); + assert.equal( + composer.get("reply"), + "before new line\n\nworld hello", + "it prepends text with new line to existing text" + ); }); QUnit.test("Title length for regular topics", assert => { @@ -119,44 +192,44 @@ QUnit.test("Title length for regular topics", assert => { Discourse.SiteSettings.max_topic_title_length = 10; const composer = createComposer(); - composer.set('title', 'asdf'); - assert.ok(!composer.get('titleLengthValid'), "short titles are not valid"); + composer.set("title", "asdf"); + assert.ok(!composer.get("titleLengthValid"), "short titles are not valid"); - composer.set('title', 'this is a long title'); - assert.ok(!composer.get('titleLengthValid'), "long titles are not valid"); + composer.set("title", "this is a long title"); + assert.ok(!composer.get("titleLengthValid"), "long titles are not valid"); - composer.set('title', 'just right'); - assert.ok(composer.get('titleLengthValid'), "in the range is okay"); + composer.set("title", "just right"); + assert.ok(composer.get("titleLengthValid"), "in the range is okay"); }); QUnit.test("Title length for private messages", assert => { Discourse.SiteSettings.min_personal_message_title_length = 5; Discourse.SiteSettings.max_topic_title_length = 10; - const composer = createComposer({action: Composer.PRIVATE_MESSAGE}); + const composer = createComposer({ action: Composer.PRIVATE_MESSAGE }); - composer.set('title', 'asdf'); - assert.ok(!composer.get('titleLengthValid'), "short titles are not valid"); + composer.set("title", "asdf"); + assert.ok(!composer.get("titleLengthValid"), "short titles are not valid"); - composer.set('title', 'this is a long title'); - assert.ok(!composer.get('titleLengthValid'), "long titles are not valid"); + composer.set("title", "this is a long title"); + assert.ok(!composer.get("titleLengthValid"), "long titles are not valid"); - composer.set('title', 'just right'); - assert.ok(composer.get('titleLengthValid'), "in the range is okay"); + composer.set("title", "just right"); + assert.ok(composer.get("titleLengthValid"), "in the range is okay"); }); QUnit.test("Title length for private messages", assert => { Discourse.SiteSettings.min_personal_message_title_length = 5; Discourse.SiteSettings.max_topic_title_length = 10; - const composer = createComposer({action: Composer.PRIVATE_MESSAGE}); + const composer = createComposer({ action: Composer.PRIVATE_MESSAGE }); - composer.set('title', 'asdf'); - assert.ok(!composer.get('titleLengthValid'), "short titles are not valid"); + composer.set("title", "asdf"); + assert.ok(!composer.get("titleLengthValid"), "short titles are not valid"); - composer.set('title', 'this is a long title'); - assert.ok(!composer.get('titleLengthValid'), "long titles are not valid"); + composer.set("title", "this is a long title"); + assert.ok(!composer.get("titleLengthValid"), "long titles are not valid"); - composer.set('title', 'just right'); - assert.ok(composer.get('titleLengthValid'), "in the range is okay"); + composer.set("title", "just right"); + assert.ok(composer.get("titleLengthValid"), "in the range is okay"); }); QUnit.test("Post length for private messages with non human users", assert => { @@ -164,59 +237,88 @@ QUnit.test("Post length for private messages with non human users", assert => { topic: Ember.Object.create({ pm_with_non_human_user: true }) }); - assert.equal(composer.get('minimumPostLength'), 1); + assert.equal(composer.get("minimumPostLength"), 1); }); -QUnit.test('editingFirstPost', assert => { +QUnit.test("editingFirstPost", assert => { const composer = createComposer(); - assert.ok(!composer.get('editingFirstPost'), "it's false by default"); + assert.ok(!composer.get("editingFirstPost"), "it's false by default"); - const post = Discourse.Post.create({id: 123, post_number: 2}); - composer.setProperties({post: post, action: Composer.EDIT }); - assert.ok(!composer.get('editingFirstPost'), "it's false when not editing the first post"); - - post.set('post_number', 1); - assert.ok(composer.get('editingFirstPost'), "it's true when editing the first post"); + const post = Discourse.Post.create({ id: 123, post_number: 2 }); + composer.setProperties({ post: post, action: Composer.EDIT }); + assert.ok( + !composer.get("editingFirstPost"), + "it's false when not editing the first post" + ); + post.set("post_number", 1); + assert.ok( + composer.get("editingFirstPost"), + "it's true when editing the first post" + ); }); -QUnit.test('clearState', assert => { +QUnit.test("clearState", assert => { const composer = createComposer({ - originalText: 'asdf', - reply: 'asdf2', - post: Discourse.Post.create({id: 1}), - title: 'wat' + originalText: "asdf", + reply: "asdf2", + post: Discourse.Post.create({ id: 1 }), + title: "wat" }); composer.clearState(); - assert.blank(composer.get('originalText')); - assert.blank(composer.get('reply')); - assert.blank(composer.get('post')); - assert.blank(composer.get('title')); - + assert.blank(composer.get("originalText")); + assert.blank(composer.get("reply")); + assert.blank(composer.get("post")); + assert.blank(composer.get("title")); }); -QUnit.test('initial category when uncategorized is allowed', assert => { +QUnit.test("initial category when uncategorized is allowed", assert => { Discourse.SiteSettings.allow_uncategorized_topics = true; - const composer = openComposer({action: 'createTopic', draftKey: 'asfd', draftSequence: 1}); - assert.ok(!composer.get('categoryId'), "Uncategorized by default"); + const composer = openComposer({ + action: "createTopic", + draftKey: "asfd", + draftSequence: 1 + }); + assert.ok(!composer.get("categoryId"), "Uncategorized by default"); }); -QUnit.test('initial category when uncategorized is not allowed', assert => { +QUnit.test("initial category when uncategorized is not allowed", assert => { Discourse.SiteSettings.allow_uncategorized_topics = false; - const composer = openComposer({action: 'createTopic', draftKey: 'asfd', draftSequence: 1}); - assert.ok(!composer.get('categoryId'), "Uncategorized by default. Must choose a category."); + const composer = openComposer({ + action: "createTopic", + draftKey: "asfd", + draftSequence: 1 + }); + assert.ok( + !composer.get("categoryId"), + "Uncategorized by default. Must choose a category." + ); }); -QUnit.test('open with a quote', assert => { - const quote = '[quote="neil, post:5, topic:413"]\nSimmer down you two.\n[/quote]'; +QUnit.test("open with a quote", assert => { + const quote = + '[quote="neil, post:5, topic:413"]\nSimmer down you two.\n[/quote]'; const newComposer = function() { - return openComposer({action: Composer.REPLY, draftKey: 'asfd', draftSequence: 1, quote: quote}); + return openComposer({ + action: Composer.REPLY, + draftKey: "asfd", + draftSequence: 1, + quote: quote + }); }; - assert.equal(newComposer().get('originalText'), quote, "originalText is the quote" ); - assert.equal(newComposer().get('replyDirty'), false, "replyDirty is initally false with a quote" ); + assert.equal( + newComposer().get("originalText"), + quote, + "originalText is the quote" + ); + assert.equal( + newComposer().get("replyDirty"), + false, + "replyDirty is initally false with a quote" + ); }); QUnit.test("Title length for static page topics as admin", assert => { @@ -224,42 +326,69 @@ QUnit.test("Title length for static page topics as admin", assert => { Discourse.SiteSettings.max_topic_title_length = 10; const composer = createComposer(); - const post = Discourse.Post.create({id: 123, post_number: 2, static_doc: true}); - composer.setProperties({post: post, action: Composer.EDIT }); + const post = Discourse.Post.create({ + id: 123, + post_number: 2, + static_doc: true + }); + composer.setProperties({ post: post, action: Composer.EDIT }); - composer.set('title', 'asdf'); - assert.ok(composer.get('titleLengthValid'), "admins can use short titles"); + composer.set("title", "asdf"); + assert.ok(composer.get("titleLengthValid"), "admins can use short titles"); - composer.set('title', 'this is a long title'); - assert.ok(composer.get('titleLengthValid'), "admins can use long titles"); + composer.set("title", "this is a long title"); + assert.ok(composer.get("titleLengthValid"), "admins can use long titles"); - composer.set('title', 'just right'); - assert.ok(composer.get('titleLengthValid'), "in the range is okay"); + composer.set("title", "just right"); + assert.ok(composer.get("titleLengthValid"), "in the range is okay"); - composer.set('title', ''); - assert.ok(!composer.get('titleLengthValid'), "admins must set title to at least 1 character"); + composer.set("title", ""); + assert.ok( + !composer.get("titleLengthValid"), + "admins must set title to at least 1 character" + ); }); QUnit.test("title placeholder depends on what you're doing", assert => { - let composer = createComposer({action: Composer.CREATE_TOPIC}); - assert.equal(composer.get('titlePlaceholder'), 'composer.title_placeholder', "placeholder for normal topic"); + let composer = createComposer({ action: Composer.CREATE_TOPIC }); + assert.equal( + composer.get("titlePlaceholder"), + "composer.title_placeholder", + "placeholder for normal topic" + ); - composer = createComposer({action: Composer.PRIVATE_MESSAGE}); - assert.equal(composer.get('titlePlaceholder'), 'composer.title_placeholder', "placeholder for private message"); + composer = createComposer({ action: Composer.PRIVATE_MESSAGE }); + assert.equal( + composer.get("titlePlaceholder"), + "composer.title_placeholder", + "placeholder for private message" + ); Discourse.SiteSettings.topic_featured_link_enabled = true; - composer = createComposer({action: Composer.CREATE_TOPIC}); - assert.equal(composer.get('titlePlaceholder'), 'composer.title_or_link_placeholder', "placeholder invites you to paste a link"); + composer = createComposer({ action: Composer.CREATE_TOPIC }); + assert.equal( + composer.get("titlePlaceholder"), + "composer.title_or_link_placeholder", + "placeholder invites you to paste a link" + ); - composer = createComposer({action: Composer.PRIVATE_MESSAGE}); - assert.equal(composer.get('titlePlaceholder'), 'composer.title_placeholder', "placeholder for private message with topic links enabled"); + composer = createComposer({ action: Composer.PRIVATE_MESSAGE }); + assert.equal( + composer.get("titlePlaceholder"), + "composer.title_placeholder", + "placeholder for private message with topic links enabled" + ); }); QUnit.test("allows featured link before choosing a category", assert => { Discourse.SiteSettings.topic_featured_link_enabled = true; Discourse.SiteSettings.allow_uncategorized_topics = false; - let composer = createComposer({action: Composer.CREATE_TOPIC}); - assert.equal(composer.get('titlePlaceholder'), 'composer.title_or_link_placeholder', "placeholder invites you to paste a link"); - assert.ok(composer.get('canEditTopicFeaturedLink'), "can paste link"); -}); \ No newline at end of file + let composer = createComposer({ action: Composer.CREATE_TOPIC }); + assert.equal( + composer.get("titlePlaceholder"), + "composer.title_or_link_placeholder", + "placeholder invites you to paste a link" + ); + assert.ok(composer.get("canEditTopicFeaturedLink"), "can paste link"); +}); diff --git a/test/javascripts/models/email-log-test.js.es6 b/test/javascripts/models/email-log-test.js.es6 index be18f9190f..f6e00b14e2 100644 --- a/test/javascripts/models/email-log-test.js.es6 +++ b/test/javascripts/models/email-log-test.js.es6 @@ -1,7 +1,33 @@ -import EmailLog from 'admin/models/email-log'; +import EmailLog from "admin/models/email-log"; QUnit.module("Discourse.EmailLog"); QUnit.test("create", assert => { assert.ok(EmailLog.create(), "it can be created without arguments"); -}); \ No newline at end of file +}); + +QUnit.test("subfolder support", assert => { + Discourse.BaseUri = "/forum"; + const attrs = { + id: 60, + to_address: "wikiman@asdf.com", + email_type: "user_linked", + user_id: 9, + created_at: "2018-08-08T17:21:52.022Z", + post_url: "/t/some-pro-tips-for-you/41/5", + post_description: "Some Pro Tips For You", + bounced: false, + user: { + id: 9, + username: "wikiman", + avatar_template: + "/forum/letter_avatar_proxy/v2/letter/w/dfb087/{size}.png" + } + }; + const emailLog = EmailLog.create(attrs); + assert.equal( + emailLog.get("post_url"), + "/forum/t/some-pro-tips-for-you/41/5", + "includes the subfolder in the post url" + ); +}); diff --git a/test/javascripts/models/group-test.js.es6 b/test/javascripts/models/group-test.js.es6 index 6b1b726dd5..33cb5a709c 100644 --- a/test/javascripts/models/group-test.js.es6 +++ b/test/javascripts/models/group-test.js.es6 @@ -1,13 +1,21 @@ -import Group from 'discourse/models/group'; +import Group from "discourse/models/group"; QUnit.module("model:group"); -QUnit.test('displayName', assert => { - const group = Group.create({ name: "test", display_name: 'donkey' }); +QUnit.test("displayName", assert => { + const group = Group.create({ name: "test", display_name: "donkey" }); - assert.equal(group.get('displayName'), "donkey", 'it should return the display name'); + assert.equal( + group.get("displayName"), + "donkey", + "it should return the display name" + ); - group.set('display_name', null); + group.set("display_name", null); - assert.equal(group.get('displayName'), "test", "it should return the group's name"); + assert.equal( + group.get("displayName"), + "test", + "it should return the group's name" + ); }); diff --git a/test/javascripts/models/invite-test.js.es6 b/test/javascripts/models/invite-test.js.es6 index 0cdc361fca..323375d42b 100644 --- a/test/javascripts/models/invite-test.js.es6 +++ b/test/javascripts/models/invite-test.js.es6 @@ -1,7 +1,7 @@ -import Invite from 'discourse/models/invite'; +import Invite from "discourse/models/invite"; QUnit.module("model:invite"); QUnit.test("create", assert => { assert.ok(Invite.create(), "it can be created without arguments"); -}); \ No newline at end of file +}); diff --git a/test/javascripts/models/model-test.js.es6 b/test/javascripts/models/model-test.js.es6 index dba22bd390..f5e81acae7 100644 --- a/test/javascripts/models/model-test.js.es6 +++ b/test/javascripts/models/model-test.js.es6 @@ -1,21 +1,35 @@ -import Model from 'discourse/models/model'; +import Model from "discourse/models/model"; QUnit.module("model:discourse"); -QUnit.test("extractByKey: converts a list of hashes into a hash of instances of specified class, indexed by their ids", assert => { - var firstObject = {id: "id_1", foo: "foo_1"}; - var secondObject = {id: "id_2", foo: "foo_2"}; +QUnit.test( + "extractByKey: converts a list of hashes into a hash of instances of specified class, indexed by their ids", + assert => { + var firstObject = { id: "id_1", foo: "foo_1" }; + var secondObject = { id: "id_2", foo: "foo_2" }; - var actual = Model.extractByKey([firstObject, secondObject], Ember.Object); - var expected = { - id_1: Ember.Object.create(firstObject), - id_2: Ember.Object.create(secondObject) - }; + var actual = Model.extractByKey([firstObject, secondObject], Ember.Object); + var expected = { + id_1: Ember.Object.create(firstObject), + id_2: Ember.Object.create(secondObject) + }; - assert.ok(_.isEqual(actual, expected)); -}); + assert.ok(_.isEqual(actual, expected)); + } +); -QUnit.test("extractByKey: returns an empty hash if there isn't anything to convert", assert => { - assert.deepEqual(Model.extractByKey(), {}, "when called without parameters"); - assert.deepEqual(Model.extractByKey([]), {}, "when called with an empty array"); -}); +QUnit.test( + "extractByKey: returns an empty hash if there isn't anything to convert", + assert => { + assert.deepEqual( + Model.extractByKey(), + {}, + "when called without parameters" + ); + assert.deepEqual( + Model.extractByKey([]), + {}, + "when called with an empty array" + ); + } +); diff --git a/test/javascripts/models/nav-item-test.js.es6 b/test/javascripts/models/nav-item-test.js.es6 index 38174eb639..115417e4d4 100644 --- a/test/javascripts/models/nav-item-test.js.es6 +++ b/test/javascripts/models/nav-item-test.js.es6 @@ -1,25 +1,32 @@ -import createStore from 'helpers/create-store'; +import createStore from "helpers/create-store"; QUnit.module("Discourse.NavItem", { beforeEach() { Ember.run(function() { - const asianCategory = Discourse.Category.create({name: '确实是这样', id: 343434}); - Discourse.Site.currentProp('categories').addObject(asianCategory); + const asianCategory = Discourse.Category.create({ + name: "确实是这样", + id: 343434 + }); + Discourse.Site.currentProp("categories").addObject(asianCategory); }); } }); -QUnit.test('href', assert =>{ +QUnit.test("href", assert => { assert.expect(4); function href(text, expected, label) { - assert.equal(Discourse.NavItem.fromText(text, {}).get('href'), expected, label); + assert.equal( + Discourse.NavItem.fromText(text, {}).get("href"), + expected, + label + ); } - href('latest', '/latest', 'latest'); - href('categories', '/categories', 'categories'); - href('category/bug', '/c/bug', 'English category name'); - href('category/确实是这样', '/c/343434-category', 'Chinese category name'); + href("latest", "/latest", "latest"); + href("categories", "/categories", "categories"); + href("category/bug", "/c/bug", "English category name"); + href("category/确实是这样", "/c/343434-category", "Chinese category name"); }); QUnit.test("count", assert => { @@ -31,5 +38,9 @@ QUnit.test("count", assert => { tracker.states["t1"] = { topic_id: 1, last_read_post_number: null }; tracker.incrementMessageCount(); - assert.equal(navItem.get("count"), 1, "it updates when a new message arrives"); + assert.equal( + navItem.get("count"), + 1, + "it updates when a new message arrives" + ); }); diff --git a/test/javascripts/models/post-stream-test.js.es6 b/test/javascripts/models/post-stream-test.js.es6 index 7418102a17..26e4780eb3 100644 --- a/test/javascripts/models/post-stream-test.js.es6 +++ b/test/javascripts/models/post-stream-test.js.es6 @@ -1,85 +1,145 @@ QUnit.module("model:post-stream"); -import createStore from 'helpers/create-store'; +import createStore from "helpers/create-store"; const buildStream = function(id, stream) { const store = createStore(); - const topic = store.createRecord('topic', {id, chunk_size: 5}); - const ps = topic.get('postStream'); + const topic = store.createRecord("topic", { id, chunk_size: 5 }); + const ps = topic.get("postStream"); if (stream) { - ps.set('stream', stream); + ps.set("stream", stream); } return ps; }; -const participant = {username: 'eviltrout'}; +const participant = { username: "eviltrout" }; -QUnit.test('create', assert => { +QUnit.test("create", assert => { const store = createStore(); - assert.ok(store.createRecord('postStream'), 'it can be created with no parameters'); + assert.ok( + store.createRecord("postStream"), + "it can be created with no parameters" + ); }); -QUnit.test('defaults', assert => { +QUnit.test("defaults", assert => { const postStream = buildStream(1234); - assert.blank(postStream.get('posts'), "there are no posts in a stream by default"); - assert.ok(!postStream.get('loaded'), "it has never loaded"); - assert.present(postStream.get('topic')); + assert.blank( + postStream.get("posts"), + "there are no posts in a stream by default" + ); + assert.ok(!postStream.get("loaded"), "it has never loaded"); + assert.present(postStream.get("topic")); }); -QUnit.test('appending posts', assert => { +QUnit.test("appending posts", assert => { const postStream = buildStream(4567, [1, 3, 4]); const store = postStream.store; - assert.equal(postStream.get('firstPostId'), 1); - assert.equal(postStream.get('lastPostId'), 4, "the last post id is 4"); + assert.equal(postStream.get("firstPostId"), 1); + assert.equal(postStream.get("lastPostId"), 4, "the last post id is 4"); - assert.ok(!postStream.get('hasPosts'), "there are no posts by default"); - assert.ok(!postStream.get('firstPostPresent'), "the first post is not loaded"); - assert.ok(!postStream.get('loadedAllPosts'), "the last post is not loaded"); - assert.equal(postStream.get('posts.length'), 0, "it has no posts initially"); + assert.ok(!postStream.get("hasPosts"), "there are no posts by default"); + assert.ok( + !postStream.get("firstPostPresent"), + "the first post is not loaded" + ); + assert.ok(!postStream.get("loadedAllPosts"), "the last post is not loaded"); + assert.equal(postStream.get("posts.length"), 0, "it has no posts initially"); - postStream.appendPost(store.createRecord('post', {id: 2, post_number: 2})); - assert.ok(!postStream.get('firstPostPresent'), "the first post is still not loaded"); - assert.equal(postStream.get('posts.length'), 1, "it has one post in the stream"); + postStream.appendPost(store.createRecord("post", { id: 2, post_number: 2 })); + assert.ok( + !postStream.get("firstPostPresent"), + "the first post is still not loaded" + ); + assert.equal( + postStream.get("posts.length"), + 1, + "it has one post in the stream" + ); - postStream.appendPost(store.createRecord('post', {id: 4, post_number: 4})); - assert.ok(!postStream.get('firstPostPresent'), "the first post is still loaded"); - assert.ok(postStream.get('loadedAllPosts'), "the last post is now loaded"); - assert.equal(postStream.get('posts.length'), 2, "it has two posts in the stream"); + postStream.appendPost(store.createRecord("post", { id: 4, post_number: 4 })); + assert.ok( + !postStream.get("firstPostPresent"), + "the first post is still loaded" + ); + assert.ok(postStream.get("loadedAllPosts"), "the last post is now loaded"); + assert.equal( + postStream.get("posts.length"), + 2, + "it has two posts in the stream" + ); - postStream.appendPost(store.createRecord('post', {id: 4, post_number: 4})); - assert.equal(postStream.get('posts.length'), 2, "it will not add the same post with id twice"); + postStream.appendPost(store.createRecord("post", { id: 4, post_number: 4 })); + assert.equal( + postStream.get("posts.length"), + 2, + "it will not add the same post with id twice" + ); - const stagedPost = store.createRecord('post', {raw: 'incomplete post'}); + const stagedPost = store.createRecord("post", { raw: "incomplete post" }); postStream.appendPost(stagedPost); - assert.equal(postStream.get('posts.length'), 3, "it can handle posts without ids"); + assert.equal( + postStream.get("posts.length"), + 3, + "it can handle posts without ids" + ); postStream.appendPost(stagedPost); - assert.equal(postStream.get('posts.length'), 3, "it won't add the same post without an id twice"); + assert.equal( + postStream.get("posts.length"), + 3, + "it won't add the same post without an id twice" + ); // change the stream - postStream.set('stream', [1, 2, 4]); - assert.ok(!postStream.get('firstPostPresent'), "the first post no longer loaded since the stream changed."); - assert.ok(postStream.get('loadedAllPosts'), "the last post is still the last post in the new stream"); + postStream.set("stream", [1, 2, 4]); + assert.ok( + !postStream.get("firstPostPresent"), + "the first post no longer loaded since the stream changed." + ); + assert.ok( + postStream.get("loadedAllPosts"), + "the last post is still the last post in the new stream" + ); }); -QUnit.test('closestPostNumberFor', assert => { +QUnit.test("closestPostNumberFor", assert => { const postStream = buildStream(1231); const store = postStream.store; - assert.blank(postStream.closestPostNumberFor(1), "there is no closest post when nothing is loaded"); + assert.blank( + postStream.closestPostNumberFor(1), + "there is no closest post when nothing is loaded" + ); - postStream.appendPost(store.createRecord('post', {id: 1, post_number: 2})); - postStream.appendPost(store.createRecord('post', {id: 2, post_number: 3})); + postStream.appendPost(store.createRecord("post", { id: 1, post_number: 2 })); + postStream.appendPost(store.createRecord("post", { id: 2, post_number: 3 })); - assert.equal(postStream.closestPostNumberFor(2), 2, "If a post is in the stream it returns its post number"); - assert.equal(postStream.closestPostNumberFor(3), 3, "If a post is in the stream it returns its post number"); - assert.equal(postStream.closestPostNumberFor(10), 3, "it clips to the upper bound of the stream"); - assert.equal(postStream.closestPostNumberFor(0), 2, "it clips to the lower bound of the stream"); + assert.equal( + postStream.closestPostNumberFor(2), + 2, + "If a post is in the stream it returns its post number" + ); + assert.equal( + postStream.closestPostNumberFor(3), + 3, + "If a post is in the stream it returns its post number" + ); + assert.equal( + postStream.closestPostNumberFor(10), + 3, + "it clips to the upper bound of the stream" + ); + assert.equal( + postStream.closestPostNumberFor(0), + 2, + "it clips to the lower bound of the stream" + ); }); -QUnit.test('closestDaysAgoFor', assert => { +QUnit.test("closestDaysAgoFor", assert => { const postStream = buildStream(1231); - postStream.set('timelineLookup', [[1, 10], [3, 8], [5, 1]]); + postStream.set("timelineLookup", [[1, 10], [3, 8], [5, 1]]); assert.equal(postStream.closestDaysAgoFor(1), 10); assert.equal(postStream.closestDaysAgoFor(2), 10); @@ -91,37 +151,40 @@ QUnit.test('closestDaysAgoFor', assert => { assert.equal(postStream.closestDaysAgoFor(-1), 10); assert.equal(postStream.closestDaysAgoFor(0), 10); assert.equal(postStream.closestDaysAgoFor(10), 1); + + postStream.set("timelineLookup", []); + assert.equal(postStream.closestDaysAgoFor(1), undefined); }); -QUnit.test('closestDaysAgoFor - empty', assert => { +QUnit.test("closestDaysAgoFor - empty", assert => { const postStream = buildStream(1231); - postStream.set('timelineLookup', []); + postStream.set("timelineLookup", []); assert.equal(postStream.closestDaysAgoFor(1), null); }); -QUnit.test('updateFromJson', assert => { +QUnit.test("updateFromJson", assert => { const postStream = buildStream(1231); postStream.updateFromJson({ - posts: [{id: 1}], + posts: [{ id: 1 }], stream: [1], extra_property: 12 }); - assert.equal(postStream.get('posts.length'), 1, 'it loaded the posts'); - assert.containsInstance(postStream.get('posts'), Discourse.Post); + assert.equal(postStream.get("posts.length"), 1, "it loaded the posts"); + assert.containsInstance(postStream.get("posts"), Discourse.Post); - assert.equal(postStream.get('extra_property'), 12); + assert.equal(postStream.get("extra_property"), 12); }); QUnit.test("removePosts", assert => { - const postStream = buildStream(10000001, [1,2,3]); + const postStream = buildStream(10000001, [1, 2, 3]); const store = postStream.store; - const p1 = store.createRecord('post', {id: 1, post_number: 2}), - p2 = store.createRecord('post', {id: 2, post_number: 3}), - p3 = store.createRecord('post', {id: 3, post_number: 4}); + const p1 = store.createRecord("post", { id: 1, post_number: 2 }), + p2 = store.createRecord("post", { id: 2, post_number: 3 }), + p3 = store.createRecord("post", { id: 3, post_number: 4 }); postStream.appendPost(p1); postStream.appendPost(p2); @@ -129,12 +192,11 @@ QUnit.test("removePosts", assert => { // Removing nothing does nothing postStream.removePosts(); - assert.equal(postStream.get('posts.length'), 3); + assert.equal(postStream.get("posts.length"), 3); postStream.removePosts([p1, p3]); - assert.equal(postStream.get('posts.length'), 1); - assert.deepEqual(postStream.get('stream'), [2]); - + assert.equal(postStream.get("posts.length"), 1); + assert.deepEqual(postStream.get("stream"), [2]); }); QUnit.test("cancelFilter", assert => { @@ -142,156 +204,331 @@ QUnit.test("cancelFilter", assert => { sandbox.stub(postStream, "refresh").returns(new Ember.RSVP.resolve()); - postStream.set('summary', true); + postStream.set("summary", true); postStream.cancelFilter(); - assert.ok(!postStream.get('summary'), "summary is cancelled"); + assert.ok(!postStream.get("summary"), "summary is cancelled"); postStream.toggleParticipant(participant); postStream.cancelFilter(); - assert.blank(postStream.get('userFilters'), "cancelling the filters clears the userFilters"); + assert.blank( + postStream.get("userFilters"), + "cancelling the filters clears the userFilters" + ); }); QUnit.test("findPostIdForPostNumber", assert => { const postStream = buildStream(1234, [10, 20, 30, 40, 50, 60, 70]); - postStream.set('gaps', { before: { 60: [55, 58] } }); - - assert.equal(postStream.findPostIdForPostNumber(500), null, 'it returns null when the post cannot be found'); - assert.equal(postStream.findPostIdForPostNumber(1), 10, 'it finds the postId at the beginning'); - assert.equal(postStream.findPostIdForPostNumber(5), 50, 'it finds the postId in the middle'); - assert.equal(postStream.findPostIdForPostNumber(8), 60, 'it respects gaps'); + postStream.set("gaps", { before: { 60: [55, 58] } }); + assert.equal( + postStream.findPostIdForPostNumber(500), + null, + "it returns null when the post cannot be found" + ); + assert.equal( + postStream.findPostIdForPostNumber(1), + 10, + "it finds the postId at the beginning" + ); + assert.equal( + postStream.findPostIdForPostNumber(5), + 50, + "it finds the postId in the middle" + ); + assert.equal(postStream.findPostIdForPostNumber(8), 60, "it respects gaps"); }); QUnit.test("toggleParticipant", assert => { const postStream = buildStream(1236); sandbox.stub(postStream, "refresh").returns(new Ember.RSVP.resolve()); - assert.equal(postStream.get('userFilters.length'), 0, "by default no participants are toggled"); + assert.equal( + postStream.get("userFilters.length"), + 0, + "by default no participants are toggled" + ); postStream.toggleParticipant(participant.username); - assert.ok(postStream.get('userFilters').includes('eviltrout'), 'eviltrout is in the filters'); + assert.ok( + postStream.get("userFilters").includes("eviltrout"), + "eviltrout is in the filters" + ); postStream.toggleParticipant(participant.username); - assert.blank(postStream.get('userFilters'), "toggling the participant again removes them"); + assert.blank( + postStream.get("userFilters"), + "toggling the participant again removes them" + ); }); QUnit.test("streamFilters", assert => { const postStream = buildStream(1237); sandbox.stub(postStream, "refresh").returns(new Ember.RSVP.resolve()); - assert.deepEqual(postStream.get('streamFilters'), {}, "there are no postFilters by default"); - assert.ok(postStream.get('hasNoFilters'), "there are no filters by default"); + assert.deepEqual( + postStream.get("streamFilters"), + {}, + "there are no postFilters by default" + ); + assert.ok(postStream.get("hasNoFilters"), "there are no filters by default"); - postStream.set('summary', true); - assert.deepEqual(postStream.get('streamFilters'), {filter: "summary"}, "postFilters contains the summary flag"); - assert.ok(!postStream.get('hasNoFilters'), "now there are filters present"); + postStream.set("summary", true); + assert.deepEqual( + postStream.get("streamFilters"), + { filter: "summary" }, + "postFilters contains the summary flag" + ); + assert.ok(!postStream.get("hasNoFilters"), "now there are filters present"); postStream.toggleParticipant(participant.username); - assert.deepEqual(postStream.get('streamFilters'), { - username_filters: 'eviltrout', - }, "streamFilters contains the username we filtered"); + assert.deepEqual( + postStream.get("streamFilters"), + { + username_filters: "eviltrout" + }, + "streamFilters contains the username we filtered" + ); }); QUnit.test("loading", assert => { let postStream = buildStream(1234); - assert.ok(!postStream.get('loading'), "we're not loading by default"); + assert.ok(!postStream.get("loading"), "we're not loading by default"); - postStream.set('loadingAbove', true); - assert.ok(postStream.get('loading'), "we're loading if loading above"); + postStream.set("loadingAbove", true); + assert.ok(postStream.get("loading"), "we're loading if loading above"); postStream = buildStream(1234); - postStream.set('loadingBelow', true); - assert.ok(postStream.get('loading'), "we're loading if loading below"); + postStream.set("loadingBelow", true); + assert.ok(postStream.get("loading"), "we're loading if loading below"); postStream = buildStream(1234); - postStream.set('loadingFilter', true); - assert.ok(postStream.get('loading'), "we're loading if loading a filter"); + postStream.set("loadingFilter", true); + assert.ok(postStream.get("loading"), "we're loading if loading a filter"); }); QUnit.test("nextWindow", assert => { - const postStream = buildStream(1234, [1,2,3,5,8,9,10,11,13,14,15,16]); + const postStream = buildStream(1234, [ + 1, + 2, + 3, + 5, + 8, + 9, + 10, + 11, + 13, + 14, + 15, + 16 + ]); - assert.blank(postStream.get('nextWindow'), 'With no posts loaded, the window is blank'); + assert.blank( + postStream.get("nextWindow"), + "With no posts loaded, the window is blank" + ); - postStream.updateFromJson({ posts: [{id: 1}, {id: 2}] }); - assert.deepEqual(postStream.get('nextWindow'), [3,5,8,9,10], - "If we've loaded the first 2 posts, the window should be the 5 after that"); + postStream.updateFromJson({ posts: [{ id: 1 }, { id: 2 }] }); + assert.deepEqual( + postStream.get("nextWindow"), + [3, 5, 8, 9, 10], + "If we've loaded the first 2 posts, the window should be the 5 after that" + ); - postStream.updateFromJson({ posts: [{id: 13}] }); - assert.deepEqual(postStream.get('nextWindow'), [14, 15, 16], "Boundary check: stop at the end."); + postStream.updateFromJson({ posts: [{ id: 13 }] }); + assert.deepEqual( + postStream.get("nextWindow"), + [14, 15, 16], + "Boundary check: stop at the end." + ); - postStream.updateFromJson({ posts: [{id: 16}] }); - assert.blank(postStream.get('nextWindow'), "Once we've seen everything there's nothing to load."); + postStream.updateFromJson({ posts: [{ id: 16 }] }); + assert.blank( + postStream.get("nextWindow"), + "Once we've seen everything there's nothing to load." + ); }); QUnit.test("previousWindow", assert => { - const postStream = buildStream(1234, [1,2,3,5,8,9,10,11,13,14,15,16]); + const postStream = buildStream(1234, [ + 1, + 2, + 3, + 5, + 8, + 9, + 10, + 11, + 13, + 14, + 15, + 16 + ]); - assert.blank(postStream.get('previousWindow'), 'With no posts loaded, the window is blank'); + assert.blank( + postStream.get("previousWindow"), + "With no posts loaded, the window is blank" + ); - postStream.updateFromJson({ posts: [{id: 11}, {id: 13}] }); - assert.deepEqual(postStream.get('previousWindow'), [3, 5, 8, 9, 10], - "If we've loaded in the middle, it's the previous 5 posts"); + postStream.updateFromJson({ posts: [{ id: 11 }, { id: 13 }] }); + assert.deepEqual( + postStream.get("previousWindow"), + [3, 5, 8, 9, 10], + "If we've loaded in the middle, it's the previous 5 posts" + ); - postStream.updateFromJson({ posts: [{id: 3}] }); - assert.deepEqual(postStream.get('previousWindow'), [1, 2], "Boundary check: stop at the beginning."); + postStream.updateFromJson({ posts: [{ id: 3 }] }); + assert.deepEqual( + postStream.get("previousWindow"), + [1, 2], + "Boundary check: stop at the beginning." + ); - postStream.updateFromJson({ posts: [{id: 1}] }); - assert.blank(postStream.get('previousWindow'), "Once we've seen everything there's nothing to load."); + postStream.updateFromJson({ posts: [{ id: 1 }] }); + assert.blank( + postStream.get("previousWindow"), + "Once we've seen everything there's nothing to load." + ); }); QUnit.test("storePost", assert => { const postStream = buildStream(1234), - store = postStream.store, - post = store.createRecord('post', {id: 1, post_number: 100, raw: 'initial value'}); + store = postStream.store, + post = store.createRecord("post", { + id: 1, + post_number: 100, + raw: "initial value" + }); - assert.blank(postStream.get('topic.highest_post_number'), "it has no highest post number yet"); + assert.blank( + postStream.get("topic.highest_post_number"), + "it has no highest post number yet" + ); let stored = postStream.storePost(post); assert.equal(post, stored, "it returns the post it stored"); - assert.equal(post.get('topic'), postStream.get('topic'), "it creates the topic reference properly"); - assert.equal(postStream.get('topic.highest_post_number'), 100, "it set the highest post number"); + assert.equal( + post.get("topic"), + postStream.get("topic"), + "it creates the topic reference properly" + ); + assert.equal( + postStream.get("topic.highest_post_number"), + 100, + "it set the highest post number" + ); - const dupePost = store.createRecord('post', {id: 1, post_number: 100, raw: 'updated value'}); + const dupePost = store.createRecord("post", { + id: 1, + post_number: 100, + raw: "updated value" + }); const storedDupe = postStream.storePost(dupePost); - assert.equal(storedDupe, post, "it returns the previously stored post instead to avoid dupes"); - assert.equal(storedDupe.get('raw'), 'updated value', 'it updates the previously stored post'); + assert.equal( + storedDupe, + post, + "it returns the previously stored post instead to avoid dupes" + ); + assert.equal( + storedDupe.get("raw"), + "updated value", + "it updates the previously stored post" + ); - const postWithoutId = store.createRecord('post', {raw: 'hello world'}); + const postWithoutId = store.createRecord("post", { raw: "hello world" }); stored = postStream.storePost(postWithoutId); assert.equal(stored, postWithoutId, "it returns the same post back"); - }); QUnit.test("identity map", assert => { const postStream = buildStream(1234); const store = postStream.store; - const p1 = postStream.appendPost(store.createRecord('post', {id: 1, post_number: 1})); - const p3 = postStream.appendPost(store.createRecord('post', {id: 3, post_number: 4})); + const p1 = postStream.appendPost( + store.createRecord("post", { id: 1, post_number: 1 }) + ); + const p3 = postStream.appendPost( + store.createRecord("post", { id: 3, post_number: 4 }) + ); - assert.equal(postStream.findLoadedPost(1), p1, "it can return cached posts by id"); + assert.equal( + postStream.findLoadedPost(1), + p1, + "it can return cached posts by id" + ); assert.blank(postStream.findLoadedPost(4), "it can't find uncached posts"); // Find posts by ids uses the identity map return postStream.findPostsByIds([1, 2, 3]).then(result => { assert.equal(result.length, 3); assert.equal(result.objectAt(0), p1); - assert.equal(result.objectAt(1).get('post_number'), 2); + assert.equal(result.objectAt(1).get("post_number"), 2); assert.equal(result.objectAt(2), p3); }); }); QUnit.test("loadIntoIdentityMap with no data", assert => { - return buildStream(1234).loadIntoIdentityMap([]).then(result => { - assert.equal(result.length, 0, 'requesting no posts produces no posts'); - }); + return buildStream(1234) + .loadIntoIdentityMap([]) + .then(result => { + assert.equal(result.length, 0, "requesting no posts produces no posts"); + }); }); QUnit.test("loadIntoIdentityMap with post ids", assert => { const postStream = buildStream(1234); return postStream.loadIntoIdentityMap([10]).then(function() { - assert.present(postStream.findLoadedPost(10), "it adds the returned post to the store"); + assert.present( + postStream.findLoadedPost(10), + "it adds the returned post to the store" + ); + }); +}); + +QUnit.test("appendMore for megatopic", assert => { + const postStream = buildStream(1234); + const store = createStore(); + const post = store.createRecord("post", { id: 1, post_number: 1 }); + + postStream.setProperties({ + isMegaTopic: true, + posts: [post] + }); + + return postStream.appendMore().then(() => { + assert.present( + postStream.findLoadedPost(2), + "it adds the returned post to the store" + ); + + assert.equal( + postStream.get("posts").length, + 6, + "it adds the right posts into the stream" + ); + }); +}); + +QUnit.test("prependMore for megatopic", assert => { + const postStream = buildStream(1234); + const store = createStore(); + const post = store.createRecord("post", { id: 6, post_number: 6 }); + + postStream.setProperties({ + isMegaTopic: true, + posts: [post] + }); + + return postStream.prependMore().then(() => { + assert.present( + postStream.findLoadedPost(5), + "it adds the returned post to the store" + ); + + assert.equal( + postStream.get("posts").length, + 6, + "it adds the right posts into the stream" + ); }); }); @@ -299,14 +536,29 @@ QUnit.test("staging and undoing a new post", assert => { const postStream = buildStream(10101, [1]); const store = postStream.store; - const original = store.createRecord('post', {id: 1, post_number: 1, topic_id: 10101}); + const original = store.createRecord("post", { + id: 1, + post_number: 1, + topic_id: 10101 + }); postStream.appendPost(original); - assert.ok(postStream.get('lastAppended'), original, "the original post is lastAppended"); + assert.ok( + postStream.get("lastAppended"), + original, + "the original post is lastAppended" + ); - const user = Discourse.User.create({username: 'eviltrout', name: 'eviltrout', id: 321}); - const stagedPost = store.createRecord('post', { raw: 'hello world this is my new post', topic_id: 10101 }); + const user = Discourse.User.create({ + username: "eviltrout", + name: "eviltrout", + id: 321 + }); + const stagedPost = store.createRecord("post", { + raw: "hello world this is my new post", + topic_id: 10101 + }); - const topic = postStream.get('topic'); + const topic = postStream.get("topic"); topic.setProperties({ posts_count: 1, highest_post_number: 1 @@ -315,67 +567,149 @@ QUnit.test("staging and undoing a new post", assert => { // Stage the new post in the stream const result = postStream.stagePost(stagedPost, user); assert.equal(result, "staged", "it returns staged"); - assert.equal(topic.get('highest_post_number'), 2, "it updates the highest_post_number"); - assert.ok(postStream.get('loading'), "it is loading while the post is being staged"); - assert.ok(postStream.get('lastAppended'), original, "it doesn't consider staged posts as the lastAppended"); + assert.equal( + topic.get("highest_post_number"), + 2, + "it updates the highest_post_number" + ); + assert.ok( + postStream.get("loading"), + "it is loading while the post is being staged" + ); + assert.ok( + postStream.get("lastAppended"), + original, + "it doesn't consider staged posts as the lastAppended" + ); - assert.equal(topic.get('posts_count'), 2, "it increases the post count"); - assert.present(topic.get('last_posted_at'), "it updates last_posted_at"); - assert.equal(topic.get('details.last_poster'), user, "it changes the last poster"); + assert.equal(topic.get("posts_count"), 2, "it increases the post count"); + assert.present(topic.get("last_posted_at"), "it updates last_posted_at"); + assert.equal( + topic.get("details.last_poster"), + user, + "it changes the last poster" + ); - assert.equal(stagedPost.get('topic'), topic, "it assigns the topic reference"); - assert.equal(stagedPost.get('post_number'), 2, "it is assigned the probable post_number"); - assert.present(stagedPost.get('created_at'), "it is assigned a created date"); - assert.ok(postStream.get('posts').includes(stagedPost), "the post is added to the stream"); - assert.equal(stagedPost.get('id'), -1, "the post has a magical -1 id"); + assert.equal( + stagedPost.get("topic"), + topic, + "it assigns the topic reference" + ); + assert.equal( + stagedPost.get("post_number"), + 2, + "it is assigned the probable post_number" + ); + assert.present(stagedPost.get("created_at"), "it is assigned a created date"); + assert.ok( + postStream.get("posts").includes(stagedPost), + "the post is added to the stream" + ); + assert.equal(stagedPost.get("id"), -1, "the post has a magical -1 id"); // Undoing a created post (there was an error) postStream.undoPost(stagedPost); - assert.ok(!postStream.get('loading'), "it is no longer loading"); - assert.equal(topic.get('highest_post_number'), 1, "it reverts the highest_post_number"); - assert.equal(topic.get('posts_count'), 1, "it reverts the post count"); - assert.equal(postStream.get('filteredPostsCount'), 1, "it retains the filteredPostsCount"); - assert.ok(!postStream.get('posts').includes(stagedPost), "the post is removed from the stream"); - assert.ok(postStream.get('lastAppended'), original, "it doesn't consider undid post lastAppended"); + assert.ok(!postStream.get("loading"), "it is no longer loading"); + assert.equal( + topic.get("highest_post_number"), + 1, + "it reverts the highest_post_number" + ); + assert.equal(topic.get("posts_count"), 1, "it reverts the post count"); + assert.equal( + postStream.get("filteredPostsCount"), + 1, + "it retains the filteredPostsCount" + ); + assert.ok( + !postStream.get("posts").includes(stagedPost), + "the post is removed from the stream" + ); + assert.ok( + postStream.get("lastAppended"), + original, + "it doesn't consider undid post lastAppended" + ); }); QUnit.test("staging and committing a post", assert => { const postStream = buildStream(10101, [1]); const store = postStream.store; - const original = store.createRecord('post', {id: 1, post_number: 1, topic_id: 10101}); + const original = store.createRecord("post", { + id: 1, + post_number: 1, + topic_id: 10101 + }); postStream.appendPost(original); - assert.ok(postStream.get('lastAppended'), original, "the original post is lastAppended"); + assert.ok( + postStream.get("lastAppended"), + original, + "the original post is lastAppended" + ); - const user = Discourse.User.create({username: 'eviltrout', name: 'eviltrout', id: 321}); - const stagedPost = store.createRecord('post', { raw: 'hello world this is my new post', topic_id: 10101 }); + const user = Discourse.User.create({ + username: "eviltrout", + name: "eviltrout", + id: 321 + }); + const stagedPost = store.createRecord("post", { + raw: "hello world this is my new post", + topic_id: 10101 + }); - const topic = postStream.get('topic'); - topic.set('posts_count', 1); + const topic = postStream.get("topic"); + topic.set("posts_count", 1); // Stage the new post in the stream let result = postStream.stagePost(stagedPost, user); assert.equal(result, "staged", "it returns staged"); - assert.ok(postStream.get('loading'), "it is loading while the post is being staged"); + assert.ok( + postStream.get("loading"), + "it is loading while the post is being staged" + ); stagedPost.setProperties({ id: 1234, raw: "different raw value" }); result = postStream.stagePost(stagedPost, user); - assert.equal(result, "alreadyStaging", "you can't stage a post while it is currently staging"); - assert.ok(postStream.get('lastAppended'), original, "staging a post doesn't change the lastAppended"); + assert.equal( + result, + "alreadyStaging", + "you can't stage a post while it is currently staging" + ); + assert.ok( + postStream.get("lastAppended"), + original, + "staging a post doesn't change the lastAppended" + ); postStream.commitPost(stagedPost); - assert.ok(postStream.get('posts').includes(stagedPost), "the post is still in the stream"); - assert.ok(!postStream.get('loading'), "it is no longer loading"); + assert.ok( + postStream.get("posts").includes(stagedPost), + "the post is still in the stream" + ); + assert.ok(!postStream.get("loading"), "it is no longer loading"); - assert.equal(postStream.get('filteredPostsCount'), 2, "it increases the filteredPostsCount"); + assert.equal( + postStream.get("filteredPostsCount"), + 2, + "it increases the filteredPostsCount" + ); - const found = postStream.findLoadedPost(stagedPost.get('id')); + const found = postStream.findLoadedPost(stagedPost.get("id")); assert.present(found, "the post is in the identity map"); assert.ok(postStream.indexOf(stagedPost) > -1, "the post is in the stream"); - assert.equal(found.get('raw'), 'different raw value', 'it also updated the value in the stream'); - assert.ok(postStream.get('lastAppended'), found, "comitting a post changes lastAppended"); + assert.equal( + found.get("raw"), + "different raw value", + "it also updated the value in the stream" + ); + assert.ok( + postStream.get("lastAppended"), + found, + "comitting a post changes lastAppended" + ); }); QUnit.test("loadedAllPosts when the id changes", assert => { @@ -383,55 +717,108 @@ QUnit.test("loadedAllPosts when the id changes", assert => { // message bus. If the id of a post changes we should reconsider the loadedAllPosts property. const postStream = buildStream(10101, [1, 2]); const store = postStream.store; - const postWithoutId = store.createRecord('post', { raw: 'hello world this is my new post' }); + const postWithoutId = store.createRecord("post", { + raw: "hello world this is my new post" + }); - postStream.appendPost(store.createRecord('post', {id: 1, post_number: 1})); + postStream.appendPost(store.createRecord("post", { id: 1, post_number: 1 })); postStream.appendPost(postWithoutId); - assert.ok(!postStream.get('loadedAllPosts'), 'the last post is not loaded'); + assert.ok(!postStream.get("loadedAllPosts"), "the last post is not loaded"); - postWithoutId.set('id', 2); - assert.ok(postStream.get('loadedAllPosts'), 'the last post is loaded now that the post has an id'); + postWithoutId.set("id", 2); + assert.ok( + postStream.get("loadedAllPosts"), + "the last post is loaded now that the post has an id" + ); +}); + +QUnit.test("triggerRecoveredPost", async assert => { + const postStream = buildStream(4567); + const store = postStream.store; + + [1, 2, 3, 5].forEach(id => { + postStream.appendPost( + store.createRecord("post", { id: id, post_number: id }) + ); + }); + + const response = object => { + return [200, { "Content-Type": "application/json" }, object]; + }; + + // prettier-ignore + server.get("/posts/4", () => { // eslint-disable-line no-undef + return response({ id: 4, post_number: 4 }); + }); + + assert.equal( + postStream.get("postsWithPlaceholders.length"), + 4, + "it should return the right length" + ); + + await postStream.triggerRecoveredPost(4); + + assert.equal( + postStream.get("postsWithPlaceholders.length"), + 5, + "it should return the right length" + ); }); QUnit.test("comitting and triggerNewPostInStream race condition", assert => { const postStream = buildStream(4964); const store = postStream.store; - postStream.appendPost(store.createRecord('post', {id: 1, post_number: 1})); - const user = Discourse.User.create({username: 'eviltrout', name: 'eviltrout', id: 321}); - const stagedPost = store.createRecord('post', { raw: 'hello world this is my new post' }); + postStream.appendPost(store.createRecord("post", { id: 1, post_number: 1 })); + const user = Discourse.User.create({ + username: "eviltrout", + name: "eviltrout", + id: 321 + }); + const stagedPost = store.createRecord("post", { + raw: "hello world this is my new post" + }); postStream.stagePost(stagedPost, user); - assert.equal(postStream.get('filteredPostsCount'), 0, "it has no filteredPostsCount yet"); - stagedPost.set('id', 123); + assert.equal( + postStream.get("filteredPostsCount"), + 0, + "it has no filteredPostsCount yet" + ); + stagedPost.set("id", 123); - sandbox.stub(postStream, 'appendMore'); + sandbox.stub(postStream, "appendMore"); postStream.triggerNewPostInStream(123); - assert.equal(postStream.get('filteredPostsCount'), 1, "it added the post"); + assert.equal(postStream.get("filteredPostsCount"), 1, "it added the post"); postStream.commitPost(stagedPost); - assert.equal(postStream.get('filteredPostsCount'), 1, "it does not add the same post twice"); + assert.equal( + postStream.get("filteredPostsCount"), + 1, + "it does not add the same post twice" + ); }); QUnit.test("postsWithPlaceholders", assert => { const postStream = buildStream(4964, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); - const postsWithPlaceholders = postStream.get('postsWithPlaceholders'); + const postsWithPlaceholders = postStream.get("postsWithPlaceholders"); const store = postStream.store; const testProxy = Ember.ArrayProxy.create({ content: postsWithPlaceholders }); - const p1 = store.createRecord('post', {id: 1, post_number: 1}); - const p2 = store.createRecord('post', {id: 2, post_number: 2}); - const p3 = store.createRecord('post', {id: 3, post_number: 3}); - const p4 = store.createRecord('post', {id: 4, post_number: 4}); + const p1 = store.createRecord("post", { id: 1, post_number: 1 }); + const p2 = store.createRecord("post", { id: 2, post_number: 2 }); + const p3 = store.createRecord("post", { id: 3, post_number: 3 }); + const p4 = store.createRecord("post", { id: 4, post_number: 4 }); postStream.appendPost(p1); postStream.appendPost(p2); postStream.appendPost(p3); // Test enumerable and array access - assert.equal(postsWithPlaceholders.get('length'), 3); - assert.equal(testProxy.get('length'), 3); + assert.equal(postsWithPlaceholders.get("length"), 3); + assert.equal(testProxy.get("length"), 3); assert.equal(postsWithPlaceholders.nextObject(0), p1); assert.equal(postsWithPlaceholders.objectAt(0), p1); assert.equal(postsWithPlaceholders.nextObject(1, p1), p2); @@ -440,8 +827,12 @@ QUnit.test("postsWithPlaceholders", assert => { assert.equal(postsWithPlaceholders.objectAt(2), p3); const promise = postStream.appendMore(); - assert.equal(postsWithPlaceholders.get('length'), 8, 'we immediately have a larger placeholder window'); - assert.equal(testProxy.get('length'), 8); + assert.equal( + postsWithPlaceholders.get("length"), + 8, + "we immediately have a larger placeholder window" + ); + assert.equal(testProxy.get("length"), 8); assert.ok(!!postsWithPlaceholders.nextObject(3, p3)); assert.ok(!!postsWithPlaceholders.objectAt(4)); assert.ok(postsWithPlaceholders.objectAt(3) !== p4); @@ -449,9 +840,62 @@ QUnit.test("postsWithPlaceholders", assert => { return promise.then(() => { assert.equal(postsWithPlaceholders.objectAt(3), p4); - assert.equal(postsWithPlaceholders.get('length'), 8, 'have a larger placeholder window when loaded'); - assert.equal(testProxy.get('length'), 8); + assert.equal( + postsWithPlaceholders.get("length"), + 8, + "have a larger placeholder window when loaded" + ); + assert.equal(testProxy.get("length"), 8); assert.equal(testProxy.objectAt(3), p4); }); - +}); + +QUnit.test("filteredPostsCount", assert => { + const postStream = buildStream(4567, [1, 3, 4]); + + assert.equal(postStream.get("filteredPostsCount"), 3); + + // Megatopic + postStream.set("isMegaTopic", true); + postStream.set("topic.highest_post_number", 4); + + assert.equal(postStream.get("filteredPostsCount"), 4); +}); + +QUnit.test("firstPostId", assert => { + const postStream = buildStream(4567, [1, 3, 4]); + + assert.equal(postStream.get("firstPostId"), 1); + + postStream.setProperties({ + isMegaTopic: true, + firstId: 2 + }); + + assert.equal(postStream.get("firstPostId"), 2); +}); + +QUnit.test("lastPostId", assert => { + const postStream = buildStream(4567, [1, 3, 4]); + + assert.equal(postStream.get("lastPostId"), 4); + + postStream.setProperties({ + isMegaTopic: true, + lastId: 2 + }); + + assert.equal(postStream.get("lastPostId"), 2); +}); + +QUnit.test("progressIndexOfPostId", assert => { + const postStream = buildStream(4567, [1, 3, 4]); + const store = createStore(); + const post = store.createRecord("post", { id: 1, post_number: 5 }); + + assert.equal(postStream.progressIndexOfPostId(post), 1); + + postStream.set("isMegaTopic", true); + + assert.equal(postStream.progressIndexOfPostId(post), 5); }); diff --git a/test/javascripts/models/post-test.js.es6 b/test/javascripts/models/post-test.js.es6 index 22cb0bde24..2ded01501f 100644 --- a/test/javascripts/models/post-test.js.es6 +++ b/test/javascripts/models/post-test.js.es6 @@ -1,72 +1,96 @@ QUnit.module("Discourse.Post"); var buildPost = function(args) { - return Discourse.Post.create(_.merge({ - id: 1, - can_delete: true, - version: 1 - }, args || {})); + return Discourse.Post.create( + _.merge( + { + id: 1, + can_delete: true, + version: 1 + }, + args || {} + ) + ); }; -QUnit.test('defaults', assert => { - var post = Discourse.Post.create({id: 1}); - assert.blank(post.get('deleted_at'), "it has no deleted_at by default"); - assert.blank(post.get('deleted_by'), "there is no deleted_by by default"); +QUnit.test("defaults", assert => { + var post = Discourse.Post.create({ id: 1 }); + assert.blank(post.get("deleted_at"), "it has no deleted_at by default"); + assert.blank(post.get("deleted_by"), "there is no deleted_by by default"); }); -QUnit.test('new_user', assert => { - var post = Discourse.Post.create({trust_level: 0}); - assert.ok(post.get('new_user'), "post is from a new user"); +QUnit.test("new_user", assert => { + var post = Discourse.Post.create({ trust_level: 0 }); + assert.ok(post.get("new_user"), "post is from a new user"); - post.set('trust_level', 1); - assert.ok(!post.get('new_user'), "post is no longer from a new user"); + post.set("trust_level", 1); + assert.ok(!post.get("new_user"), "post is no longer from a new user"); }); -QUnit.test('firstPost', assert => { - var post = Discourse.Post.create({post_number: 1}); - assert.ok(post.get('firstPost'), "it's the first post"); +QUnit.test("firstPost", assert => { + var post = Discourse.Post.create({ post_number: 1 }); + assert.ok(post.get("firstPost"), "it's the first post"); - post.set('post_number', 10); - assert.ok(!post.get('firstPost'), "post is no longer the first post"); + post.set("post_number", 10); + assert.ok(!post.get("firstPost"), "post is no longer the first post"); }); -QUnit.test('updateFromPost', assert => { +QUnit.test("updateFromPost", assert => { var post = Discourse.Post.create({ post_number: 1, - raw: 'hello world' + raw: "hello world" }); - post.updateFromPost(Discourse.Post.create({ - raw: 'different raw', - wat: function() { return 123; } - })); + post.updateFromPost( + Discourse.Post.create({ + raw: "different raw", + wat: function() { + return 123; + } + }) + ); - assert.equal(post.get('raw'), "different raw", "raw field updated"); + assert.equal(post.get("raw"), "different raw", "raw field updated"); }); -QUnit.test('destroy by staff', assert => { - var user = Discourse.User.create({username: 'staff', staff: true}), - post = buildPost({user: user}); +QUnit.test("destroy by staff", assert => { + var user = Discourse.User.create({ username: "staff", staff: true }), + post = buildPost({ user: user }); post.destroy(user); - assert.present(post.get('deleted_at'), "it has a `deleted_at` field."); - assert.equal(post.get('deleted_by'), user, "it has the user in the `deleted_by` field"); + assert.present(post.get("deleted_at"), "it has a `deleted_at` field."); + assert.equal( + post.get("deleted_by"), + user, + "it has the user in the `deleted_by` field" + ); post.recover(); - assert.blank(post.get('deleted_at'), "it clears `deleted_at` when recovering"); - assert.blank(post.get('deleted_by'), "it clears `deleted_by` when recovering"); - + assert.blank( + post.get("deleted_at"), + "it clears `deleted_at` when recovering" + ); + assert.blank( + post.get("deleted_by"), + "it clears `deleted_by` when recovering" + ); }); -QUnit.test('destroy by non-staff', assert => { +QUnit.test("destroy by non-staff", assert => { var originalCooked = "this is the original cooked value", - user = Discourse.User.create({username: 'evil trout'}), - post = buildPost({user: user, cooked: originalCooked}); + user = Discourse.User.create({ username: "evil trout" }), + post = buildPost({ user: user, cooked: originalCooked }); return post.destroy(user).then(() => { - assert.ok(!post.get('can_delete'), "the post can't be deleted again in this session"); - assert.ok(post.get('cooked') !== originalCooked, "the cooked content changed"); - assert.equal(post.get('version'), 2, "the version number increased"); + assert.ok( + !post.get("can_delete"), + "the post can't be deleted again in this session" + ); + assert.ok( + post.get("cooked") !== originalCooked, + "the cooked content changed" + ); + assert.equal(post.get("version"), 2, "the version number increased"); }); }); diff --git a/test/javascripts/models/report-test.js.es6 b/test/javascripts/models/report-test.js.es6 index 6af1310573..702017fe36 100644 --- a/test/javascripts/models/report-test.js.es6 +++ b/test/javascripts/models/report-test.js.es6 @@ -6,7 +6,12 @@ function reportWithData(data) { return Report.create({ type: "topics", data: _.map(data, (val, index) => { - return { x: moment().subtract(index, "days").format("YYYY-MM-DD"), y: val }; + return { + x: moment() + .subtract(index, "days") + .format("YYYY-MM-DD"), + y: val + }; }) }); } @@ -16,11 +21,23 @@ QUnit.test("counts", assert => { assert.equal(report.get("todayCount"), 5); assert.equal(report.get("yesterdayCount"), 4); - assert.equal(report.valueFor(2, 4), 6, "adds the values for the given range of days, inclusive"); - assert.equal(report.get("lastSevenDaysCount"), 307, "sums 7 days excluding today"); + assert.equal( + report.valueFor(2, 4), + 6, + "adds the values for the given range of days, inclusive" + ); + assert.equal( + report.get("lastSevenDaysCount"), + 307, + "sums 7 days excluding today" + ); report.set("method", "average"); - assert.equal(report.valueFor(2, 4), 2, "averages the values for the given range of days"); + assert.equal( + report.valueFor(2, 4), + 2, + "averages the values for the given range of days" + ); }); QUnit.test("percentChangeString", assert => { @@ -29,32 +46,55 @@ QUnit.test("percentChangeString", assert => { assert.equal(report.percentChangeString(5, 8), "+60%", "value increased"); assert.equal(report.percentChangeString(8, 2), "-75%", "value decreased"); assert.equal(report.percentChangeString(8, 8), "0%", "value unchanged"); - assert.blank(report.percentChangeString(0, 8), "returns blank when previous value was 0"); + assert.blank( + report.percentChangeString(0, 8), + "returns blank when previous value was 0" + ); assert.equal(report.percentChangeString(8, 0), "-100%", "yesterday was 0"); - assert.blank(report.percentChangeString(0, 0), "returns blank when both were 0"); + assert.blank( + report.percentChangeString(0, 0), + "returns blank when both were 0" + ); }); QUnit.test("yesterdayCountTitle with valid values", assert => { - const title = reportWithData([6,8,5,2,1]).get("yesterdayCountTitle"); + const title = reportWithData([6, 8, 5, 2, 1]).get("yesterdayCountTitle"); assert.ok(title.indexOf("+60%") !== -1); assert.ok(title.match(/Was 5/)); }); QUnit.test("yesterdayCountTitle when two days ago was 0", assert => { - const title = reportWithData([6,8,0,2,1]).get("yesterdayCountTitle"); + const title = reportWithData([6, 8, 0, 2, 1]).get("yesterdayCountTitle"); assert.equal(title.indexOf("%"), -1); assert.ok(title.match(/Was 0/)); }); - QUnit.test("sevenDaysCountTitle", assert => { - const title = reportWithData([100,1,1,1,1,1,1,1,2,2,2,2,2,2,2,100,100]).get("sevenDaysCountTitle"); + const title = reportWithData([ + 100, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 100, + 100 + ]).get("sevenDaysCountTitle"); assert.ok(title.match(/-50%/)); assert.ok(title.match(/Was 14/)); }); QUnit.test("thirtyDaysCountTitle", assert => { - const report = reportWithData([5,5,5,5]); + const report = reportWithData([5, 5, 5, 5]); report.set("prev30Days", 10); const title = report.get("thirtyDaysCountTitle"); @@ -66,23 +106,23 @@ QUnit.test("sevenDaysTrend", assert => { let report; let trend; - report = reportWithData([0, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1]); + report = reportWithData([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "no-change"); - report = reportWithData([0, 1,1,1,1,1,1,1, 0,0,0,0,0,0,0]); + report = reportWithData([0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "high-trending-up"); - report = reportWithData([0, 1,1,1,1,1,1,1, 1,1,1,1,1,1,0]); + report = reportWithData([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "trending-up"); - report = reportWithData([0, 0,0,0,0,0,0,0, 1,1,1,1,1,1,1]); + report = reportWithData([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "high-trending-down"); - report = reportWithData([0, 1,1,1,1,1,1,0, 1,1,1,1,1,1,1]); + report = reportWithData([0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "trending-down"); }); @@ -116,27 +156,187 @@ QUnit.test("thirtyDaysTrend", assert => { let report; let trend; - report = reportWithData([0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + report = reportWithData([ + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ]); report.set("prev30Days", 30); trend = report.get("thirtyDaysTrend"); assert.ok(trend === "no-change"); - report = reportWithData([0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + report = reportWithData([ + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ]); report.set("prev30Days", 0); trend = report.get("thirtyDaysTrend"); assert.ok(trend === "high-trending-up"); - report = reportWithData([0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + report = reportWithData([ + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ]); report.set("prev30Days", 25); trend = report.get("thirtyDaysTrend"); assert.ok(trend === "trending-up"); - report = reportWithData([0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); + report = reportWithData([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]); report.set("prev30Days", 60); trend = report.get("thirtyDaysTrend"); assert.ok(trend === "high-trending-down"); - report = reportWithData([0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]); + report = reportWithData([ + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ]); report.set("prev30Days", 35); trend = report.get("thirtyDaysTrend"); assert.ok(trend === "trending-down"); @@ -171,11 +371,11 @@ QUnit.test("small variation (-2/+2% change) is no-change", assert => { let report; let trend; - report = reportWithData([0, 1,1,1,1,1,1,0.9, 1,1,1,1,1,1,1]); + report = reportWithData([0, 1, 1, 1, 1, 1, 1, 0.9, 1, 1, 1, 1, 1, 1, 1]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "no-change"); - report = reportWithData([0, 1,1,1,1,1,1,1.1, 1,1,1,1,1,1,1]); + report = reportWithData([0, 1, 1, 1, 1, 1, 1, 1.1, 1, 1, 1, 1, 1, 1, 1]); trend = report.get("sevenDaysTrend"); assert.ok(trend === "no-change"); }); @@ -191,3 +391,128 @@ QUnit.test("average", assert => { report.set("average", false); assert.ok(report.get("lastSevenDaysCount") === 35); }); + +QUnit.test("computed labels", assert => { + const data = [ + { + username: "joffrey", + user_id: 1, + user_avatar: "/", + flag_count: 1876, + time_read: 287362, + note: "This is a long note", + topic_id: 2, + topic_title: "Test topic", + post_number: 3, + post_raw: "This is the beginning of" + } + ]; + + const labels = [ + { + type: "user", + properties: { + username: "username", + id: "user_id", + avatar: "user_avatar" + }, + title: "Moderator" + }, + { type: "number", property: "flag_count", title: "Flag count" }, + { type: "seconds", property: "time_read", title: "Time read" }, + { type: "text", property: "note", title: "Note" }, + { + type: "topic", + properties: { + title: "topic_title", + id: "topic_id" + }, + title: "Topic" + }, + { + type: "post", + properties: { + topic_id: "topic_id", + number: "post_number", + truncated_raw: "post_raw" + }, + title: "Post" + } + ]; + + const report = Report.create({ + type: "topics", + labels, + data + }); + + const row = report.get("data.0"); + const computedLabels = report.get("computedLabels"); + + const usernameLabel = computedLabels[0]; + assert.equal(usernameLabel.mainProperty, "username"); + assert.equal(usernameLabel.sortProperty, "username"); + assert.equal(usernameLabel.title, "Moderator"); + assert.equal(usernameLabel.type, "user"); + const computedUsernameLabel = usernameLabel.compute(row); + assert.equal( + computedUsernameLabel.formatedValue, + "joffrey" + ); + assert.equal(computedUsernameLabel.value, "joffrey"); + + const flagCountLabel = computedLabels[1]; + assert.equal(flagCountLabel.mainProperty, "flag_count"); + assert.equal(flagCountLabel.sortProperty, "flag_count"); + assert.equal(flagCountLabel.title, "Flag count"); + assert.equal(flagCountLabel.type, "number"); + let computedFlagCountLabel = flagCountLabel.compute(row); + assert.equal(computedFlagCountLabel.formatedValue, "1.9k"); + assert.equal(computedFlagCountLabel.value, 1876); + computedFlagCountLabel = flagCountLabel.compute(row, { + formatNumbers: false + }); + assert.equal(computedFlagCountLabel.formatedValue, 1876); + + const timeReadLabel = computedLabels[2]; + assert.equal(timeReadLabel.mainProperty, "time_read"); + assert.equal(timeReadLabel.sortProperty, "time_read"); + assert.equal(timeReadLabel.title, "Time read"); + assert.equal(timeReadLabel.type, "seconds"); + const computedTimeReadLabel = timeReadLabel.compute(row); + assert.equal(computedTimeReadLabel.formatedValue, "3d"); + assert.equal(computedTimeReadLabel.value, 287362); + + const noteLabel = computedLabels[3]; + assert.equal(noteLabel.mainProperty, "note"); + assert.equal(noteLabel.sortProperty, "note"); + assert.equal(noteLabel.title, "Note"); + assert.equal(noteLabel.type, "text"); + const computedNoteLabel = noteLabel.compute(row); + assert.equal(computedNoteLabel.formatedValue, "This is a long note"); + assert.equal(computedNoteLabel.value, "This is a long note"); + + const topicLabel = computedLabels[4]; + assert.equal(topicLabel.mainProperty, "topic_title"); + assert.equal(topicLabel.sortProperty, "topic_title"); + assert.equal(topicLabel.title, "Topic"); + assert.equal(topicLabel.type, "topic"); + const computedTopicLabel = topicLabel.compute(row); + assert.equal( + computedTopicLabel.formatedValue, + "Test topic" + ); + assert.equal(computedTopicLabel.value, "Test topic"); + + const postLabel = computedLabels[5]; + assert.equal(postLabel.mainProperty, "post_raw"); + assert.equal(postLabel.sortProperty, "post_raw"); + assert.equal(postLabel.title, "Post"); + assert.equal(postLabel.type, "post"); + const computedPostLabel = postLabel.compute(row); + assert.equal( + computedPostLabel.formatedValue, + "This is the beginning of" + ); + assert.equal(computedPostLabel.value, "This is the beginning of"); +}); diff --git a/test/javascripts/models/rest-model-test.js.es6 b/test/javascripts/models/rest-model-test.js.es6 index 031cb3b0c2..c737eb965a 100644 --- a/test/javascripts/models/rest-model-test.js.es6 +++ b/test/javascripts/models/rest-model-test.js.es6 @@ -1,9 +1,9 @@ -QUnit.module('rest-model'); +QUnit.module("rest-model"); -import createStore from 'helpers/create-store'; -import RestModel from 'discourse/models/rest'; +import createStore from "helpers/create-store"; +import RestModel from "discourse/models/rest"; -QUnit.test('munging', assert => { +QUnit.test("munging", assert => { const store = createStore(); const Grape = RestModel.extend(); Grape.reopenClass({ @@ -14,82 +14,88 @@ QUnit.test('munging', assert => { }); var g = Grape.create({ store, percent: 0.4 }); - assert.equal(g.get('inverse'), 0.6, 'it runs `munge` on `create`'); + assert.equal(g.get("inverse"), 0.6, "it runs `munge` on `create`"); }); -QUnit.test('update', assert => { +QUnit.test("update", assert => { const store = createStore(); - return store.find('widget', 123).then(function(widget) { - assert.equal(widget.get('name'), 'Trout Lure'); + return store.find("widget", 123).then(function(widget) { + assert.equal(widget.get("name"), "Trout Lure"); + assert.ok(!widget.get("isSaving"), "it is not saving"); - assert.ok(!widget.get('isSaving')); - const promise = widget.update({ name: 'new name' }); - assert.ok(widget.get('isSaving')); - promise.then(function() { - assert.ok(!widget.get('isSaving')); - assert.equal(widget.get('name'), 'new name'); + const promise = widget.update({ name: "new name" }); + assert.ok(widget.get("isSaving"), "it is saving"); + + promise.then(function(result) { + assert.ok(!widget.get("isSaving"), "it is no longer saving"); + assert.equal(widget.get("name"), "new name"); + + assert.ok(result.target, "it has a reference to the record"); + assert.equal(result.target.name, widget.get("name")); }); }); }); -QUnit.test('updating simultaneously', assert => { +QUnit.test("updating simultaneously", assert => { assert.expect(2); const store = createStore(); - return store.find('widget', 123).then(function(widget) { - - const firstPromise = widget.update({ name: 'new name' }); - const secondPromise = widget.update({ name: 'new name' }); + return store.find("widget", 123).then(function(widget) { + const firstPromise = widget.update({ name: "new name" }); + const secondPromise = widget.update({ name: "new name" }); firstPromise.then(function() { - assert.ok(true, 'the first promise succeeeds'); + assert.ok(true, "the first promise succeeeds"); }); secondPromise.catch(function() { - assert.ok(true, 'the second promise fails'); + assert.ok(true, "the second promise fails"); }); }); }); -QUnit.test('save new', assert => { +QUnit.test("save new", assert => { const store = createStore(); - const widget = store.createRecord('widget'); + const widget = store.createRecord("widget"); - assert.ok(widget.get('isNew'), 'it is a new record'); - assert.ok(!widget.get('isCreated'), 'it is not created'); - assert.ok(!widget.get('isSaving')); + assert.ok(widget.get("isNew"), "it is a new record"); + assert.ok(!widget.get("isCreated"), "it is not created"); + assert.ok(!widget.get("isSaving"), "it is not saving"); - const promise = widget.save({ name: 'Evil Widget' }); - assert.ok(widget.get('isSaving')); + const promise = widget.save({ name: "Evil Widget" }); + assert.ok(widget.get("isSaving"), "it is not saving"); - return promise.then(function() { - assert.ok(!widget.get('isSaving')); - assert.ok(widget.get('id'), 'it has an id'); - assert.ok(widget.get('name'), 'Evil Widget'); - assert.ok(widget.get('isCreated'), 'it is created'); - assert.ok(!widget.get('isNew'), 'it is no longer new'); + return promise.then(function(result) { + assert.ok(!widget.get("isSaving"), "it is no longer saving"); + assert.ok(widget.get("id"), "it has an id"); + assert.ok(widget.get("name"), "Evil Widget"); + assert.ok(widget.get("isCreated"), "it is created"); + assert.ok(!widget.get("isNew"), "it is no longer new"); + + assert.ok(result.target, "it has a reference to the record"); + assert.equal(result.target.name, widget.get("name")); }); }); -QUnit.test('creating simultaneously', assert => { +QUnit.test("creating simultaneously", assert => { assert.expect(2); const store = createStore(); - const widget = store.createRecord('widget'); + const widget = store.createRecord("widget"); - const firstPromise = widget.save({ name: 'Evil Widget' }); - const secondPromise = widget.save({ name: 'Evil Widget' }); + const firstPromise = widget.save({ name: "Evil Widget" }); + const secondPromise = widget.save({ name: "Evil Widget" }); firstPromise.then(function() { - assert.ok(true, 'the first promise succeeeds'); + assert.ok(true, "the first promise succeeeds"); }); secondPromise.catch(function() { - assert.ok(true, 'the second promise fails'); + assert.ok(true, "the second promise fails"); }); }); -QUnit.test('destroyRecord', assert => { +QUnit.test("destroyRecord", assert => { const store = createStore(); - return store.find('widget', 123).then(function(widget) { + return store.find("widget", 123).then(function(widget) { widget.destroyRecord().then(function(result) { assert.ok(result); }); diff --git a/test/javascripts/models/result-set-test.js.es6 b/test/javascripts/models/result-set-test.js.es6 index 2912b8ddb8..1f819b317e 100644 --- a/test/javascripts/models/result-set-test.js.es6 +++ b/test/javascripts/models/result-set-test.js.es6 @@ -1,49 +1,53 @@ -QUnit.module('result-set'); +QUnit.module("result-set"); -import ResultSet from 'discourse/models/result-set'; -import createStore from 'helpers/create-store'; +import ResultSet from "discourse/models/result-set"; +import createStore from "helpers/create-store"; -QUnit.test('defaults', assert => { +QUnit.test("defaults", assert => { const rs = ResultSet.create({ content: [] }); - assert.equal(rs.get('length'), 0); - assert.equal(rs.get('totalRows'), 0); - assert.ok(!rs.get('loadMoreUrl')); - assert.ok(!rs.get('loading')); - assert.ok(!rs.get('loadingMore')); - assert.ok(!rs.get('refreshing')); + assert.equal(rs.get("length"), 0); + assert.equal(rs.get("totalRows"), 0); + assert.ok(!rs.get("loadMoreUrl")); + assert.ok(!rs.get("loading")); + assert.ok(!rs.get("loadingMore")); + assert.ok(!rs.get("refreshing")); }); -QUnit.test('pagination support', assert => { +QUnit.test("pagination support", assert => { const store = createStore(); - return store.findAll('widget').then(function(rs) { - assert.equal(rs.get('length'), 2); - assert.equal(rs.get('totalRows'), 4); - assert.ok(rs.get('loadMoreUrl'), 'has a url to load more'); - assert.ok(!rs.get('loadingMore'), 'it is not loading more'); - assert.ok(rs.get('canLoadMore')); + return store.findAll("widget").then(function(rs) { + assert.equal(rs.get("length"), 2); + assert.equal(rs.get("totalRows"), 4); + assert.ok(rs.get("loadMoreUrl"), "has a url to load more"); + assert.ok(!rs.get("loadingMore"), "it is not loading more"); + assert.ok(rs.get("canLoadMore")); const promise = rs.loadMore(); - assert.ok(rs.get('loadingMore'), 'it is loading more'); + assert.ok(rs.get("loadingMore"), "it is loading more"); promise.then(function() { - assert.ok(!rs.get('loadingMore'), 'it finished loading more'); - assert.equal(rs.get('length'), 4); - assert.ok(!rs.get('loadMoreUrl')); - assert.ok(!rs.get('canLoadMore')); + assert.ok(!rs.get("loadingMore"), "it finished loading more"); + assert.equal(rs.get("length"), 4); + assert.ok(!rs.get("loadMoreUrl")); + assert.ok(!rs.get("canLoadMore")); }); }); }); -QUnit.test('refresh support', assert => { +QUnit.test("refresh support", assert => { const store = createStore(); - return store.findAll('widget').then(function(rs) { - assert.equal(rs.get('refreshUrl'), '/widgets?refresh=true', 'it has the refresh url'); + return store.findAll("widget").then(function(rs) { + assert.equal( + rs.get("refreshUrl"), + "/widgets?refresh=true", + "it has the refresh url" + ); const promise = rs.refresh(); - assert.ok(rs.get('refreshing'), 'it is refreshing'); + assert.ok(rs.get("refreshing"), "it is refreshing"); promise.then(function() { - assert.ok(!rs.get('refreshing'), 'it is finished refreshing'); + assert.ok(!rs.get("refreshing"), "it is finished refreshing"); }); }); -}); \ No newline at end of file +}); diff --git a/test/javascripts/models/session-test.js.es6 b/test/javascripts/models/session-test.js.es6 index ff330fd77f..2208c91a01 100644 --- a/test/javascripts/models/session-test.js.es6 +++ b/test/javascripts/models/session-test.js.es6 @@ -2,7 +2,11 @@ import Session from "discourse/models/session"; QUnit.module("model:session"); -QUnit.test('highestSeenByTopic', assert => { +QUnit.test("highestSeenByTopic", assert => { const session = Session.current(); - assert.deepEqual(session.get('highestSeenByTopic'), {}, "by default it returns an empty object"); -}); \ No newline at end of file + assert.deepEqual( + session.get("highestSeenByTopic"), + {}, + "by default it returns an empty object" + ); +}); diff --git a/test/javascripts/models/site-test.js.es6 b/test/javascripts/models/site-test.js.es6 index bce69122dc..f18a291b95 100644 --- a/test/javascripts/models/site-test.js.es6 +++ b/test/javascripts/models/site-test.js.es6 @@ -1,48 +1,71 @@ -import createStore from 'helpers/create-store'; +import createStore from "helpers/create-store"; QUnit.module("model:site"); -QUnit.test('create', assert => { - assert.ok(Discourse.Site.create(), 'it can create with no parameters'); +QUnit.test("create", assert => { + assert.ok(Discourse.Site.create(), "it can create with no parameters"); }); -QUnit.test('instance', assert => { +QUnit.test("instance", assert => { const site = Discourse.Site.current(); assert.present(site, "We have a current site singleton"); - assert.present(site.get('categories'), "The instance has a list of categories"); - assert.present(site.get('flagTypes'), "The instance has a list of flag types"); - assert.present(site.get('trustLevels'), "The instance has a list of trust levels"); - + assert.present( + site.get("categories"), + "The instance has a list of categories" + ); + assert.present( + site.get("flagTypes"), + "The instance has a list of flag types" + ); + assert.present( + site.get("trustLevels"), + "The instance has a list of trust levels" + ); }); -QUnit.test('create categories', assert => { +QUnit.test("create categories", assert => { const store = createStore(); - const site = store.createRecord('site', { - categories: [{ id: 1234, name: 'Test'}, - { id: 3456, name: 'Test Subcategory', parent_category_id: 1234}, - { id: 3458, name: 'Invalid Subcategory', parent_category_id: 6666}] + const site = store.createRecord("site", { + categories: [ + { id: 1234, name: "Test" }, + { id: 3456, name: "Test Subcategory", parent_category_id: 1234 }, + { id: 3458, name: "Invalid Subcategory", parent_category_id: 6666 } + ] }); - const categories = site.get('categories'); - site.get('sortedCategories'); + const categories = site.get("categories"); + site.get("sortedCategories"); assert.present(categories, "The categories are present"); assert.equal(categories.length, 3, "it loaded all three categories"); - const parent = categories.findBy('id', 1234); + const parent = categories.findBy("id", 1234); assert.present(parent, "it loaded the parent category"); - assert.blank(parent.get('parentCategory'), 'it has no parent category'); + assert.blank(parent.get("parentCategory"), "it has no parent category"); - const subcategory = categories.findBy('id', 3456); + assert.equal(parent.get("subcategories").length, 1); + + const subcategory = categories.findBy("id", 3456); assert.present(subcategory, "it loaded the subcategory"); - assert.equal(subcategory.get('parentCategory'), parent, "it has associated the child with the parent"); + assert.equal( + subcategory.get("parentCategory"), + parent, + "it has associated the child with the parent" + ); // remove invalid category and child categories.removeObject(categories[2]); categories.removeObject(categories[1]); - assert.equal(categories.length, site.get('categoriesByCount').length, "categories by count should change on removal"); - assert.equal(categories.length, site.get('sortedCategories').length, "sorted categories should change on removal"); - -}); \ No newline at end of file + assert.equal( + categories.length, + site.get("categoriesByCount").length, + "categories by count should change on removal" + ); + assert.equal( + categories.length, + site.get("sortedCategories").length, + "sorted categories should change on removal" + ); +}); diff --git a/test/javascripts/models/staff-action-log-test.js.es6 b/test/javascripts/models/staff-action-log-test.js.es6 index 2e9756ff9e..22ef0192db 100644 --- a/test/javascripts/models/staff-action-log-test.js.es6 +++ b/test/javascripts/models/staff-action-log-test.js.es6 @@ -1,7 +1,7 @@ -import StaffActionLog from 'admin/models/staff-action-log'; +import StaffActionLog from "admin/models/staff-action-log"; QUnit.module("StaffActionLog"); QUnit.test("create", assert => { assert.ok(StaffActionLog.create(), "it can be created without arguments"); -}); \ No newline at end of file +}); diff --git a/test/javascripts/models/store-test.js.es6 b/test/javascripts/models/store-test.js.es6 index e62d77dc4e..a9ce8e2c59 100644 --- a/test/javascripts/models/store-test.js.es6 +++ b/test/javascripts/models/store-test.js.es6 @@ -1,169 +1,190 @@ -QUnit.module('service:store'); +QUnit.module("service:store"); -import createStore from 'helpers/create-store'; +import createStore from "helpers/create-store"; -QUnit.test('createRecord', assert => { +QUnit.test("createRecord", assert => { const store = createStore(); - const widget = store.createRecord('widget', {id: 111, name: 'hello'}); + const widget = store.createRecord("widget", { id: 111, name: "hello" }); - assert.ok(!widget.get('isNew'), 'it is not a new record'); - assert.equal(widget.get('name'), 'hello'); - assert.equal(widget.get('id'), 111); + assert.ok(!widget.get("isNew"), "it is not a new record"); + assert.equal(widget.get("name"), "hello"); + assert.equal(widget.get("id"), 111); }); -QUnit.test('createRecord without an `id`', assert => { +QUnit.test("createRecord without an `id`", assert => { const store = createStore(); - const widget = store.createRecord('widget', {name: 'hello'}); + const widget = store.createRecord("widget", { name: "hello" }); - assert.ok(widget.get('isNew'), 'it is a new record'); - assert.ok(!widget.get('id'), 'there is no id'); + assert.ok(widget.get("isNew"), "it is a new record"); + assert.ok(!widget.get("id"), "there is no id"); }); QUnit.test("createRecord doesn't modify the input `id` field", assert => { const store = createStore(); - const widget = store.createRecord('widget', {id: 1, name: 'hello'}); + const widget = store.createRecord("widget", { id: 1, name: "hello" }); - const obj = { id: 1, name: 'something' }; + const obj = { id: 1, name: "something" }; - const other = store.createRecord('widget', obj); - assert.equal(widget, other, 'returns the same record'); - assert.equal(widget.name, 'something', 'it updates the properties'); - assert.equal(obj.id, 1, 'it does not remove the id from the input'); + const other = store.createRecord("widget", obj); + assert.equal(widget, other, "returns the same record"); + assert.equal(widget.name, "something", "it updates the properties"); + assert.equal(obj.id, 1, "it does not remove the id from the input"); }); -QUnit.test('createRecord without attributes', assert => { +QUnit.test("createRecord without attributes", assert => { const store = createStore(); - const widget = store.createRecord('widget'); + const widget = store.createRecord("widget"); - assert.ok(!widget.get('id'), 'there is no id'); - assert.ok(widget.get('isNew'), 'it is a new record'); + assert.ok(!widget.get("id"), "there is no id"); + assert.ok(widget.get("isNew"), "it is a new record"); }); -QUnit.test('createRecord with a record as attributes returns that record from the map', assert => { - const store = createStore(); - const widget = store.createRecord('widget', {id: 33}); - const secondWidget = store.createRecord('widget', {id: 33}); +QUnit.test( + "createRecord with a record as attributes returns that record from the map", + assert => { + const store = createStore(); + const widget = store.createRecord("widget", { id: 33 }); + const secondWidget = store.createRecord("widget", { id: 33 }); - assert.equal(widget, secondWidget, 'they should be the same'); -}); + assert.equal(widget, secondWidget, "they should be the same"); + } +); -QUnit.test('find', assert => { +QUnit.test("find", assert => { const store = createStore(); - return store.find('widget', 123).then(function(w) { - assert.equal(w.get('name'), 'Trout Lure'); - assert.equal(w.get('id'), 123); - assert.ok(!w.get('isNew'), 'found records are not new'); - assert.equal(w.get('extras.hello'), 'world', "extra attributes are set"); + return store.find("widget", 123).then(function(w) { + assert.equal(w.get("name"), "Trout Lure"); + assert.equal(w.get("id"), 123); + assert.ok(!w.get("isNew"), "found records are not new"); + assert.equal(w.get("extras.hello"), "world", "extra attributes are set"); // A second find by id returns the same object - store.find('widget', 123).then(function(w2) { + store.find("widget", 123).then(function(w2) { assert.equal(w, w2); - assert.equal(w.get('extras.hello'), 'world', "extra attributes are set"); + assert.equal(w.get("extras.hello"), "world", "extra attributes are set"); }); }); }); -QUnit.test('find with object id', assert => { +QUnit.test("find with object id", assert => { const store = createStore(); - return store.find('widget', {id: 123}).then(function(w) { - assert.equal(w.get('firstObject.name'), 'Trout Lure'); + return store.find("widget", { id: 123 }).then(function(w) { + assert.equal(w.get("firstObject.name"), "Trout Lure"); }); }); -QUnit.test('find with query param', assert => { +QUnit.test("find with query param", assert => { const store = createStore(); - return store.find('widget', {name: 'Trout Lure'}).then(function(w) { - assert.equal(w.get('firstObject.id'), 123); + return store.find("widget", { name: "Trout Lure" }).then(function(w) { + assert.equal(w.get("firstObject.id"), 123); }); }); -QUnit.test('findStale with no stale results', (assert) => { +QUnit.test("findStale with no stale results", assert => { const store = createStore(); - const stale = store.findStale('widget', {name: 'Trout Lure'}); + const stale = store.findStale("widget", { name: "Trout Lure" }); - assert.ok(!stale.hasResults, 'there are no stale results'); - assert.ok(!stale.results, 'results are present'); + assert.ok(!stale.hasResults, "there are no stale results"); + assert.ok(!stale.results, "results are present"); return stale.refresh().then(function(w) { - assert.equal(w.get('firstObject.id'), 123, 'a `refresh()` method provides results for stale'); + assert.equal( + w.get("firstObject.id"), + 123, + "a `refresh()` method provides results for stale" + ); }); }); -QUnit.test('update', assert => { +QUnit.test("update", assert => { const store = createStore(); - return store.update('widget', 123, {name: 'hello'}).then(function(result) { + return store.update("widget", 123, { name: "hello" }).then(function(result) { assert.ok(result); }); }); -QUnit.test('update with a multi world name', function(assert) { +QUnit.test("update with a multi world name", function(assert) { const store = createStore(); - return store.update('cool-thing', 123, {name: 'hello'}).then(function(result) { - assert.ok(result); - assert.equal(result.payload.name, 'hello'); + return store + .update("cool-thing", 123, { name: "hello" }) + .then(function(result) { + assert.ok(result); + assert.equal(result.payload.name, "hello"); + }); +}); + +QUnit.test("findAll", assert => { + const store = createStore(); + return store.findAll("widget").then(function(result) { + assert.equal(result.get("length"), 2); + const w = result.findBy("id", 124); + assert.ok(!w.get("isNew"), "found records are not new"); + assert.equal(w.get("name"), "Evil Repellant"); }); }); -QUnit.test('findAll', assert => { +QUnit.test("destroyRecord", function(assert) { const store = createStore(); - return store.findAll('widget').then(function(result) { - assert.equal(result.get('length'), 2); - const w = result.findBy('id', 124); - assert.ok(!w.get('isNew'), 'found records are not new'); - assert.equal(w.get('name'), 'Evil Repellant'); - }); -}); - -QUnit.test('destroyRecord', function(assert) { - const store = createStore(); - return store.find('widget', 123).then(function(w) { - store.destroyRecord('widget', w).then(function(result) { + return store.find("widget", 123).then(function(w) { + store.destroyRecord("widget", w).then(function(result) { assert.ok(result); }); }); }); -QUnit.test('destroyRecord when new', function(assert) { +QUnit.test("destroyRecord when new", function(assert) { const store = createStore(); - const w = store.createRecord('widget', {name: 'hello'}); - store.destroyRecord('widget', w).then(function(result) { + const w = store.createRecord("widget", { name: "hello" }); + store.destroyRecord("widget", w).then(function(result) { assert.ok(result); }); }); -QUnit.test('find embedded', function(assert) { +QUnit.test("find embedded", function(assert) { const store = createStore(); - return store.find('fruit', 2).then(function(f) { - assert.ok(f.get('farmer'), 'it has the embedded object'); + return store.find("fruit", 2).then(function(f) { + assert.ok(f.get("farmer"), "it has the embedded object"); - const fruitCols = f.get('colors'); + const fruitCols = f.get("colors"); assert.equal(fruitCols.length, 2); - assert.equal(fruitCols[0].get('id'), 1); - assert.equal(fruitCols[1].get('id'), 2); + assert.equal(fruitCols[0].get("id"), 1); + assert.equal(fruitCols[1].get("id"), 2); - assert.ok(f.get('category'), 'categories are found automatically'); + assert.ok(f.get("category"), "categories are found automatically"); }); }); -QUnit.test('meta types', function(assert) { +QUnit.test("meta types", function(assert) { const store = createStore(); - return store.find('barn', 1).then(function(f) { - assert.equal(f.get('owner.name'), 'Old MacDonald', 'it has the embedded farmer'); + return store.find("barn", 1).then(function(f) { + assert.equal( + f.get("owner.name"), + "Old MacDonald", + "it has the embedded farmer" + ); }); }); -QUnit.test('findAll embedded', function(assert) { +QUnit.test("findAll embedded", function(assert) { const store = createStore(); - return store.findAll('fruit').then(function(fruits) { - assert.equal(fruits.objectAt(0).get('farmer.name'), 'Old MacDonald'); - assert.equal(fruits.objectAt(0).get('farmer'), fruits.objectAt(1).get('farmer'), 'points at the same object'); - assert.equal(fruits.get('extras.hello'), 'world', 'it can supply extra information'); + return store.findAll("fruit").then(function(fruits) { + assert.equal(fruits.objectAt(0).get("farmer.name"), "Old MacDonald"); + assert.equal( + fruits.objectAt(0).get("farmer"), + fruits.objectAt(1).get("farmer"), + "points at the same object" + ); + assert.equal( + fruits.get("extras.hello"), + "world", + "it can supply extra information" + ); - const fruitCols = fruits.objectAt(0).get('colors'); + const fruitCols = fruits.objectAt(0).get("colors"); assert.equal(fruitCols.length, 2); - assert.equal(fruitCols[0].get('id'), 1); - assert.equal(fruitCols[1].get('id'), 2); + assert.equal(fruitCols[0].get("id"), 1); + assert.equal(fruitCols[1].get("id"), 2); - assert.equal(fruits.objectAt(2).get('farmer.name'), 'Luke Skywalker'); + assert.equal(fruits.objectAt(2).get("farmer.name"), "Luke Skywalker"); }); }); diff --git a/test/javascripts/models/topic-details-test.js.es6 b/test/javascripts/models/topic-details-test.js.es6 index bc004748a1..35534faf69 100644 --- a/test/javascripts/models/topic-details-test.js.es6 +++ b/test/javascripts/models/topic-details-test.js.es6 @@ -1,26 +1,29 @@ QUnit.module("model:topic-details"); -import Topic from 'discourse/models/topic'; +import Topic from "discourse/models/topic"; var buildDetails = function(id) { - var topic = Topic.create({id: id}); - return topic.get('details'); + var topic = Topic.create({ id: id }); + return topic.get("details"); }; -QUnit.test('defaults', assert => { +QUnit.test("defaults", assert => { var details = buildDetails(1234); assert.present(details, "the details are present by default"); - assert.ok(!details.get('loaded'), "details are not loaded by default"); + assert.ok(!details.get("loaded"), "details are not loaded by default"); }); -QUnit.test('updateFromJson', assert => { +QUnit.test("updateFromJson", assert => { var details = buildDetails(1234); details.updateFromJson({ - allowed_users: [{username: 'eviltrout'}] + allowed_users: [{ username: "eviltrout" }] }); - assert.equal(details.get('allowed_users.length'), 1, 'it loaded the allowed users'); - assert.containsInstance(details.get('allowed_users'), Discourse.User); - + assert.equal( + details.get("allowed_users.length"), + 1, + "it loaded the allowed users" + ); + assert.containsInstance(details.get("allowed_users"), Discourse.User); }); diff --git a/test/javascripts/models/topic-test.js.es6 b/test/javascripts/models/topic-test.js.es6 index 7c33bceff0..a3e89726cb 100644 --- a/test/javascripts/models/topic-test.js.es6 +++ b/test/javascripts/models/topic-test.js.es6 @@ -1,58 +1,92 @@ -import { IMAGE_VERSION as v } from 'pretty-text/emoji'; +import { IMAGE_VERSION as v } from "pretty-text/emoji"; QUnit.module("model:topic"); -import Topic from 'discourse/models/topic'; +import Topic from "discourse/models/topic"; QUnit.test("defaults", assert => { const topic = Topic.create({ id: 1234 }); - assert.blank(topic.get('deleted_at'), 'deleted_at defaults to blank'); - assert.blank(topic.get('deleted_by'), 'deleted_by defaults to blank'); + assert.blank(topic.get("deleted_at"), "deleted_at defaults to blank"); + assert.blank(topic.get("deleted_by"), "deleted_by defaults to blank"); }); QUnit.test("visited", assert => { - const topic = Topic.create({ highest_post_number: 2, last_read_post_number: 1 }); + const topic = Topic.create({ + highest_post_number: 2, + last_read_post_number: 1 + }); - assert.not(topic.get("visited"), "not visited unless we've read all the posts"); + assert.not( + topic.get("visited"), + "not visited unless we've read all the posts" + ); topic.set("last_read_post_number", 2); assert.ok(topic.get("visited"), "is visited once we've read all the posts"); topic.set("last_read_post_number", 3); - assert.ok(topic.get("visited"), "is visited if we've read all the posts and some are deleted at the end"); + assert.ok( + topic.get("visited"), + "is visited if we've read all the posts and some are deleted at the end" + ); }); -QUnit.test('has details', assert => { +QUnit.test("lastUnreadUrl", assert => { + const category = Em.Object.create({ + navigate_to_first_post_after_read: true + }); + + const topic = Topic.create({ + id: 101, + highest_post_number: 10, + last_read_post_number: 10, + slug: "hello" + }); + + topic.set("category", category); + + assert.equal(topic.get("lastUnreadUrl"), "/t/hello/101/1"); +}); + +QUnit.test("has details", assert => { const topic = Topic.create({ id: 1234 }); - const topicDetails = topic.get('details'); + const topicDetails = topic.get("details"); assert.present(topicDetails, "a topic has topicDetails after we create it"); - assert.equal(topicDetails.get('topic'), topic, "the topicDetails has a reference back to the topic"); + assert.equal( + topicDetails.get("topic"), + topic, + "the topicDetails has a reference back to the topic" + ); }); -QUnit.test('has a postStream', assert => { +QUnit.test("has a postStream", assert => { const topic = Topic.create({ id: 1234 }); - const postStream = topic.get('postStream'); + const postStream = topic.get("postStream"); assert.present(postStream, "a topic has a postStream after we create it"); - assert.equal(postStream.get('topic'), topic, "the postStream has a reference back to the topic"); + assert.equal( + postStream.get("topic"), + topic, + "the postStream has a reference back to the topic" + ); }); -QUnit.test('has suggestedTopics', assert => { +QUnit.test("has suggestedTopics", assert => { const topic = Topic.create({ suggested_topics: [{ id: 1 }, { id: 2 }] }); - const suggestedTopics = topic.get('suggestedTopics'); + const suggestedTopics = topic.get("suggestedTopics"); - assert.equal(suggestedTopics.length, 2, 'it loaded the suggested_topics'); + assert.equal(suggestedTopics.length, 2, "it loaded the suggested_topics"); assert.containsInstance(suggestedTopics, Topic); }); -QUnit.test('category relationship', assert => { +QUnit.test("category relationship", assert => { // It finds the category by id const category = Discourse.Category.list()[0]; - const topic = Topic.create({ id: 1111, category_id: category.get('id') }); + const topic = Topic.create({ id: 1111, category_id: category.get("id") }); - assert.equal(topic.get('category'), category); + assert.equal(topic.get("category"), category); }); QUnit.test("updateFromJson", assert => { @@ -60,57 +94,78 @@ QUnit.test("updateFromJson", assert => { const category = Discourse.Category.list()[0]; topic.updateFromJson({ - post_stream: [1,2,3], - details: { hello: 'world' }, - cool: 'property', - category_id: category.get('id') + post_stream: [1, 2, 3], + details: { hello: "world" }, + cool: "property", + category_id: category.get("id") }); - assert.blank(topic.get('post_stream'), "it does not update post_stream"); - assert.equal(topic.get('details.hello'), 'world', 'it updates the details'); - assert.equal(topic.get('cool'), "property", "it updates other properties"); - assert.equal(topic.get('category'), category); + assert.blank(topic.get("post_stream"), "it does not update post_stream"); + assert.equal(topic.get("details.hello"), "world", "it updates the details"); + assert.equal(topic.get("cool"), "property", "it updates other properties"); + assert.equal(topic.get("category"), category); }); QUnit.test("destroy", assert => { - const user = Discourse.User.create({ username: 'eviltrout' }); + const user = Discourse.User.create({ username: "eviltrout" }); const topic = Topic.create({ id: 1234 }); topic.destroy(user); - assert.present(topic.get('deleted_at'), 'deleted at is set'); - assert.equal(topic.get('deleted_by'), user, 'deleted by is set'); + assert.present(topic.get("deleted_at"), "deleted at is set"); + assert.equal(topic.get("deleted_by"), user, "deleted by is set"); }); QUnit.test("recover", assert => { - const user = Discourse.User.create({ username: 'eviltrout' }); - const topic = Topic.create({ id: 1234, deleted_at: new Date(), deleted_by: user }); + const user = Discourse.User.create({ username: "eviltrout" }); + const topic = Topic.create({ + id: 1234, + deleted_at: new Date(), + deleted_by: user + }); topic.recover(); - assert.blank(topic.get('deleted_at'), "it clears deleted_at"); - assert.blank(topic.get('deleted_by'), "it clears deleted_by"); + assert.blank(topic.get("deleted_at"), "it clears deleted_at"); + assert.blank(topic.get("deleted_by"), "it clears deleted_by"); }); -QUnit.test('fancyTitle', assert => { - const topic = Topic.create({ fancy_title: ":smile: with all :) the emojis :pear::peach:" }); +QUnit.test("fancyTitle", assert => { + const topic = Topic.create({ + fancy_title: ":smile: with all :) the emojis :pear::peach:" + }); - assert.equal(topic.get('fancyTitle'), - `smile with all slight_smile the emojis pearpeach`, - "supports emojis"); + assert.equal( + topic.get("fancyTitle"), + `smile with all slight_smile the emojis pearpeach`, + "supports emojis" + ); }); -QUnit.test('fancyTitle direction', assert => { +QUnit.test("fancyTitle direction", assert => { const rtlTopic = Topic.create({ fancy_title: "هذا اختبار" }); - const ltrTopic = Topic.create({ fancy_title: "This is a test"}); + const ltrTopic = Topic.create({ fancy_title: "This is a test" }); Discourse.SiteSettings.support_mixed_text_direction = true; - assert.equal(rtlTopic.get('fancyTitle'), `هذا اختبار`, "sets the dir-span to rtl"); - assert.equal(ltrTopic.get('fancyTitle'), `This is a test`, "sets the dir-span to ltr"); + assert.equal( + rtlTopic.get("fancyTitle"), + `هذا اختبار`, + "sets the dir-span to rtl" + ); + assert.equal( + ltrTopic.get("fancyTitle"), + `This is a test`, + "sets the dir-span to ltr" + ); }); -QUnit.test('excerpt', assert => { - const topic = Topic.create({ excerpt: "This is a test topic :smile:", pinned: true }); +QUnit.test("excerpt", assert => { + const topic = Topic.create({ + excerpt: "This is a test topic :smile:", + pinned: true + }); - assert.equal(topic.get('escapedExcerpt'), - `This is a test topic smile`, - "supports emojis"); + assert.equal( + topic.get("escapedExcerpt"), + `This is a test topic smile`, + "supports emojis" + ); }); diff --git a/test/javascripts/models/topic-tracking-state-test.js.es6 b/test/javascripts/models/topic-tracking-state-test.js.es6 index 3c184cb759..5799b4f116 100644 --- a/test/javascripts/models/topic-tracking-state-test.js.es6 +++ b/test/javascripts/models/topic-tracking-state-test.js.es6 @@ -1,50 +1,92 @@ -import TopicTrackingState from 'discourse/models/topic-tracking-state'; -import createStore from 'helpers/create-store'; +import TopicTrackingState from "discourse/models/topic-tracking-state"; +import createStore from "helpers/create-store"; QUnit.module("model:topic-tracking-state"); -QUnit.test("sync", function (assert) { +QUnit.test("sync", function(assert) { const state = TopicTrackingState.create(); - state.states["t111"] = {last_read_post_number: null}; + state.states["t111"] = { last_read_post_number: null }; state.updateSeen(111, 7); - const list = {topics: [{ - highest_post_number: null, - id: 111, - unread: 10, - new_posts: 10 - }]}; + const list = { + topics: [ + { + highest_post_number: null, + id: 111, + unread: 10, + new_posts: 10 + } + ] + }; state.sync(list, "new"); - assert.equal(list.topics.length, 0, "expect new topic to be removed as it was seen"); + assert.equal( + list.topics.length, + 0, + "expect new topic to be removed as it was seen" + ); }); -QUnit.test("subscribe to category", function(assert){ - +QUnit.test("subscribe to category", function(assert) { const store = createStore(); - const darth = store.createRecord('category', {id: 1, slug: 'darth'}), - luke = store.createRecord('category', {id: 2, slug: 'luke', parentCategory: darth}), + const darth = store.createRecord("category", { id: 1, slug: "darth" }), + luke = store.createRecord("category", { + id: 2, + slug: "luke", + parentCategory: darth + }), categoryList = [darth, luke]; - sandbox.stub(Discourse.Category, 'list').returns(categoryList); - + sandbox.stub(Discourse.Category, "list").returns(categoryList); const state = TopicTrackingState.create(); - state.trackIncoming('c/darth/l/latest'); + state.trackIncoming("c/darth/l/latest"); - state.notify({message_type: 'new_topic', topic_id: 1, payload: {category_id: 2, topic_id: 1}}); - state.notify({message_type: 'new_topic', topic_id: 2, payload: {category_id: 3, topic_id: 2}}); - state.notify({message_type: 'new_topic', topic_id: 3, payload: {category_id: 1, topic_id: 3}}); + state.notify({ + message_type: "new_topic", + topic_id: 1, + payload: { category_id: 2, topic_id: 1 } + }); + state.notify({ + message_type: "new_topic", + topic_id: 2, + payload: { category_id: 3, topic_id: 2 } + }); + state.notify({ + message_type: "new_topic", + topic_id: 3, + payload: { category_id: 1, topic_id: 3 } + }); - assert.equal(state.get("incomingCount"), 2, "expect to properly track incoming for category"); + assert.equal( + state.get("incomingCount"), + 2, + "expect to properly track incoming for category" + ); state.resetTracking(); - state.trackIncoming('c/darth/luke/l/latest'); + state.trackIncoming("c/darth/luke/l/latest"); - state.notify({message_type: 'new_topic', topic_id: 1, payload: {category_id: 2, topic_id: 1}}); - state.notify({message_type: 'new_topic', topic_id: 2, payload: {category_id: 3, topic_id: 2}}); - state.notify({message_type: 'new_topic', topic_id: 3, payload: {category_id: 1, topic_id: 3}}); + state.notify({ + message_type: "new_topic", + topic_id: 1, + payload: { category_id: 2, topic_id: 1 } + }); + state.notify({ + message_type: "new_topic", + topic_id: 2, + payload: { category_id: 3, topic_id: 2 } + }); + state.notify({ + message_type: "new_topic", + topic_id: 3, + payload: { category_id: 1, topic_id: 3 } + }); - assert.equal(state.get("incomingCount"), 1, "expect to properly track incoming for subcategory"); -}); \ No newline at end of file + assert.equal( + state.get("incomingCount"), + 1, + "expect to properly track incoming for subcategory" + ); +}); diff --git a/test/javascripts/models/user-action-test.js.es6 b/test/javascripts/models/user-action-test.js.es6 index 93a988acac..c39d7d828f 100644 --- a/test/javascripts/models/user-action-test.js.es6 +++ b/test/javascripts/models/user-action-test.js.es6 @@ -7,12 +7,14 @@ QUnit.test("collapsing likes", assert => { topic_id: 1, user_id: 1, post_number: 1 - }), Discourse.UserAction.create({ + }), + Discourse.UserAction.create({ action_type: Discourse.UserAction.TYPES.edits, topic_id: 2, user_id: 1, post_number: 1 - }), Discourse.UserAction.create({ + }), + Discourse.UserAction.create({ action_type: Discourse.UserAction.TYPES.likes_given, topic_id: 1, user_id: 2, @@ -22,6 +24,6 @@ QUnit.test("collapsing likes", assert => { assert.equal(actions.length, 2); - assert.equal(actions[0].get('children.length'), 1); - assert.equal(actions[0].get('children')[0].items.length, 2); -}); \ No newline at end of file + assert.equal(actions[0].get("children.length"), 1); + assert.equal(actions[0].get("children")[0].items.length, 2); +}); diff --git a/test/javascripts/models/user-badge-test.js.es6 b/test/javascripts/models/user-badge-test.js.es6 index 0794c2f92c..2a0fdd9d6f 100644 --- a/test/javascripts/models/user-badge-test.js.es6 +++ b/test/javascripts/models/user-badge-test.js.es6 @@ -1,42 +1,60 @@ -import UserBadge from 'discourse/models/user-badge'; -import badgeFixtures from 'fixtures/user-badges'; +import UserBadge from "discourse/models/user-badge"; +import badgeFixtures from "fixtures/user-badges"; QUnit.module("model:user-badge"); -QUnit.test('createFromJson single', assert => { - const userBadge = UserBadge.createFromJson(badgeFixtures['/user_badges']); +QUnit.test("createFromJson single", assert => { + const userBadge = UserBadge.createFromJson(badgeFixtures["/user_badges"]); assert.ok(!Array.isArray(userBadge), "does not return an array"); - assert.equal(userBadge.get('badge.name'), "Badge 2", "badge reference is set"); - assert.equal(userBadge.get('badge.badge_type.name'), "Silver 2", "badge.badge_type reference is set"); - assert.equal(userBadge.get('granted_by.username'), "anne3", "granted_by reference is set"); + assert.equal( + userBadge.get("badge.name"), + "Badge 2", + "badge reference is set" + ); + assert.equal( + userBadge.get("badge.badge_type.name"), + "Silver 2", + "badge.badge_type reference is set" + ); + assert.equal( + userBadge.get("granted_by.username"), + "anne3", + "granted_by reference is set" + ); }); -QUnit.test('createFromJson array', assert => { - const userBadges = UserBadge.createFromJson(badgeFixtures['/user-badges/:username']); +QUnit.test("createFromJson array", assert => { + const userBadges = UserBadge.createFromJson( + badgeFixtures["/user-badges/:username"] + ); assert.ok(Array.isArray(userBadges), "returns an array"); - assert.equal(userBadges[0].get('granted_by'), null, "granted_by reference is not set when null"); + assert.equal( + userBadges[0].get("granted_by"), + null, + "granted_by reference is not set when null" + ); }); -QUnit.test('findByUsername', assert => { +QUnit.test("findByUsername", assert => { return UserBadge.findByUsername("anne3").then(function(badges) { assert.ok(Array.isArray(badges), "returns an array"); }); }); -QUnit.test('findByBadgeId', assert => { +QUnit.test("findByBadgeId", assert => { return UserBadge.findByBadgeId(880).then(function(badges) { assert.ok(Array.isArray(badges), "returns an array"); }); }); -QUnit.test('grant', assert => { +QUnit.test("grant", assert => { return UserBadge.grant(1, "username").then(function(userBadge) { assert.ok(!Array.isArray(userBadge), "does not return an array"); }); }); -QUnit.test('revoke', assert => { +QUnit.test("revoke", assert => { assert.expect(0); - const userBadge = UserBadge.create({id: 1}); + const userBadge = UserBadge.create({ id: 1 }); return userBadge.revoke(); -}); \ No newline at end of file +}); diff --git a/test/javascripts/models/user-drafts-test.js.es6 b/test/javascripts/models/user-drafts-test.js.es6 new file mode 100644 index 0000000000..895bdce550 --- /dev/null +++ b/test/javascripts/models/user-drafts-test.js.es6 @@ -0,0 +1,31 @@ +import UserDraft from "discourse/models/user-draft"; +import { NEW_TOPIC_KEY } from "discourse/models/composer"; + +QUnit.module("model:user-drafts"); + +QUnit.test("stream", assert => { + const user = Discourse.User.create({ id: 1, username: "eviltrout" }); + const stream = user.get("userDraftsStream"); + assert.present(stream, "a user has a drafts stream by default"); + assert.equal(stream.get("itemsLoaded"), 0, "no items are loaded by default"); + assert.blank(stream.get("content"), "no content by default"); +}); + +QUnit.test("draft", assert => { + const drafts = [ + UserDraft.create({ + draft_key: "topic_1", + post_number: "10" + }), + UserDraft.create({ + draft_key: NEW_TOPIC_KEY + }) + ]; + + assert.equal(drafts.length, 2, "drafts count is right"); + assert.equal( + drafts[1].get("draftType"), + I18n.t("drafts.new_topic"), + "loads correct draftType label" + ); +}); diff --git a/test/javascripts/models/user-stream-test.js.es6 b/test/javascripts/models/user-stream-test.js.es6 index 272dae3d33..d8be562c7a 100644 --- a/test/javascripts/models/user-stream-test.js.es6 +++ b/test/javascripts/models/user-stream-test.js.es6 @@ -1,30 +1,31 @@ QUnit.module("Discourse.UserStream"); -QUnit.test('basics', assert =>{ - var user = Discourse.User.create({id: 1, username: 'eviltrout'}); - var stream = user.get('stream'); +QUnit.test("basics", assert => { + var user = Discourse.User.create({ id: 1, username: "eviltrout" }); + var stream = user.get("stream"); assert.present(stream, "a user has a stream by default"); - assert.equal(stream.get('user'), user, "the stream points back to the user"); + assert.equal(stream.get("user"), user, "the stream points back to the user"); - assert.equal(stream.get('itemsLoaded'), 0, "no items are loaded by default"); - assert.blank(stream.get('content'), "no content by default"); - assert.blank(stream.get('filter'), "no filter by default"); + assert.equal(stream.get("itemsLoaded"), 0, "no items are loaded by default"); + assert.blank(stream.get("content"), "no content by default"); + assert.blank(stream.get("filter"), "no filter by default"); - assert.ok(!stream.get('loaded'), "the stream is not loaded by default"); + assert.ok(!stream.get("loaded"), "the stream is not loaded by default"); }); - -QUnit.test('filterParam', assert => { - var user = Discourse.User.create({id: 1, username: 'eviltrout'}); - var stream = user.get('stream'); +QUnit.test("filterParam", assert => { + var user = Discourse.User.create({ id: 1, username: "eviltrout" }); + var stream = user.get("stream"); // defaults to posts/topics - assert.equal(stream.get('filterParam'), "4,5"); + assert.equal(stream.get("filterParam"), "4,5"); - stream.set('filter', Discourse.UserAction.TYPES.likes_given); - assert.equal(stream.get('filterParam'), Discourse.UserAction.TYPES.likes_given); + stream.set("filter", Discourse.UserAction.TYPES.likes_given); + assert.equal( + stream.get("filterParam"), + Discourse.UserAction.TYPES.likes_given + ); - stream.set('filter', Discourse.UserAction.TYPES.replies); - assert.equal(stream.get('filterParam'), '6,9'); - -}); \ No newline at end of file + stream.set("filter", Discourse.UserAction.TYPES.replies); + assert.equal(stream.get("filterParam"), "6,9"); +}); diff --git a/test/javascripts/models/user-test.js.es6 b/test/javascripts/models/user-test.js.es6 index fb37937495..20ef656cf2 100644 --- a/test/javascripts/models/user-test.js.es6 +++ b/test/javascripts/models/user-test.js.es6 @@ -1,46 +1,68 @@ -import User from 'discourse/models/user'; -import Group from 'discourse/models/group'; +import User from "discourse/models/user"; +import Group from "discourse/models/group"; QUnit.module("model:user"); -QUnit.test('staff', assert =>{ - var user = User.create({id: 1, username: 'eviltrout'}); +QUnit.test("staff", assert => { + var user = User.create({ id: 1, username: "eviltrout" }); - assert.ok(!user.get('staff'), "user is not staff"); + assert.ok(!user.get("staff"), "user is not staff"); - user.toggleProperty('moderator'); - assert.ok(user.get('staff'), "moderators are staff"); + user.toggleProperty("moderator"); + assert.ok(user.get("staff"), "moderators are staff"); - user.setProperties({moderator: false, admin: true}); - assert.ok(user.get('staff'), "admins are staff"); + user.setProperties({ moderator: false, admin: true }); + assert.ok(user.get("staff"), "admins are staff"); }); -QUnit.test('searchContext', assert => { - var user = User.create({id: 1, username: 'EvilTrout'}); +QUnit.test("searchContext", assert => { + var user = User.create({ id: 1, username: "EvilTrout" }); - assert.deepEqual(user.get('searchContext'), {type: 'user', id: 'eviltrout', user: user}, "has a search context"); + assert.deepEqual( + user.get("searchContext"), + { type: "user", id: "eviltrout", user: user }, + "has a search context" + ); }); QUnit.test("isAllowedToUploadAFile", assert => { var user = User.create({ trust_level: 0, admin: true }); - assert.ok(user.isAllowedToUploadAFile("image"), "admin can always upload a file"); + assert.ok( + user.isAllowedToUploadAFile("image"), + "admin can always upload a file" + ); user.setProperties({ admin: false, moderator: true }); - assert.ok(user.isAllowedToUploadAFile("image"), "moderator can always upload a file"); + assert.ok( + user.isAllowedToUploadAFile("image"), + "moderator can always upload a file" + ); }); -QUnit.test('canMangeGroup', assert => { +QUnit.test("canMangeGroup", assert => { let user = User.create({ admin: true }); let group = Group.create({ automatic: true }); - assert.equal(user.canManageGroup(group), false, "automatic groups cannot be managed."); + assert.equal( + user.canManageGroup(group), + false, + "automatic groups cannot be managed." + ); group.set("automatic", false); - assert.equal(user.canManageGroup(group), true, "an admin should be able to manage the group"); + assert.equal( + user.canManageGroup(group), + true, + "an admin should be able to manage the group" + ); - user.set('admin', false); + user.set("admin", false); group.setProperties({ is_group_owner: true }); - assert.equal(user.canManageGroup(group), true, "a group owner should be able to manage the group"); -}); \ No newline at end of file + assert.equal( + user.canManageGroup(group), + true, + "a group owner should be able to manage the group" + ); +}); diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js index e5832987b4..0e0f819935 100644 --- a/test/javascripts/test_helper.js +++ b/test/javascripts/test_helper.js @@ -11,7 +11,7 @@ //= require ember-qunit //= require fake_xml_http_request //= require route-recognizer -//= require pretender +//= require pretender/pretender //= require discourse-loader //= require preload-store @@ -33,6 +33,7 @@ //= require helpers/assertions //= require helpers/select-kit-helper +//= require helpers/d-editor-helper //= require helpers/qunit-helpers //= require_tree ./fixtures @@ -51,12 +52,16 @@ window.MessageBus.stop(); // Trick JSHint into allow document.write var d = document; d.write(''); -d.write('
'); -d.write(''); +d.write( + '
' +); +d.write( + "" +); Ember.Test.adapter = window.QUnitAdapter.create(); -Discourse.rootElement = '#ember-testing'; +Discourse.rootElement = "#ember-testing"; Discourse.setupForTesting(); Discourse.injectTestHelpers(); Discourse.start(); @@ -69,21 +74,23 @@ if (window.Logster) { } var origDebounce = Ember.run.debounce, - pretender = require('helpers/create-pretender', null, null, false), - fixtures = require('fixtures/site-fixtures', null, null, false).default, - flushMap = require('discourse/models/store', null, null, false).flushMap, - ScrollingDOMMethods = require('discourse/mixins/scrolling', null, null, false).ScrollingDOMMethods, - _DiscourseURL = require('discourse/lib/url', null, null, false).default, - applyPretender = require('helpers/qunit-helpers', null, null, false).applyPretender, - server; + pretender = require("helpers/create-pretender", null, null, false), + fixtures = require("fixtures/site-fixtures", null, null, false).default, + flushMap = require("discourse/models/store", null, null, false).flushMap, + ScrollingDOMMethods = require("discourse/mixins/scrolling", null, null, false) + .ScrollingDOMMethods, + _DiscourseURL = require("discourse/lib/url", null, null, false).default, + applyPretender = require("helpers/qunit-helpers", null, null, false) + .applyPretender, + server; function dup(obj) { return jQuery.extend(true, {}, obj); } function resetSite(siteSettings, extras) { - var createStore = require('helpers/create-store').default; - var siteAttrs = $.extend({}, fixtures['site.json'].site, extras || {}); + var createStore = require("helpers/create-store").default; + var siteAttrs = $.extend({}, fixtures["site.json"].site, extras || {}); siteAttrs.store = createStore(); siteAttrs.siteSettings = siteSettings; Discourse.Site.resetCurrent(Discourse.Site.create(siteAttrs)); @@ -113,7 +120,7 @@ QUnit.testStart(function(ctx) { _DiscourseURL.redirectedTo = url; }; - var ps = require('preload-store').default; + var ps = require("preload-store").default; ps.reset(); window.sandbox = sinon.sandbox.create(); @@ -122,10 +129,10 @@ QUnit.testStart(function(ctx) { window.sandbox.stub(ScrollingDOMMethods, "unbindOnScroll"); // Unless we ever need to test this, let's leave it off. - $.fn.autocomplete = function() { }; + $.fn.autocomplete = function() {}; // Don't debounce in test unless we're testing debouncing - if (ctx.module.indexOf('debounce') === -1) { + if (ctx.module.indexOf("debounce") === -1) { Ember.run.debounce = Ember.run; } }); @@ -135,7 +142,7 @@ QUnit.testDone(function() { window.sandbox.restore(); // Destroy any modals - $('.modal-backdrop').remove(); + $(".modal-backdrop").remove(); flushMap(); server.shutdown(); @@ -150,18 +157,22 @@ window.controllerFor = helpers.controllerFor; window.fixture = helpers.fixture; function getUrlParameter(name) { - name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); - var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); - var results = regex.exec(location.search); - return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); -}; + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); + var results = regex.exec(location.search); + return results === null + ? "" + : decodeURIComponent(results[1].replace(/\+/g, " ")); +} -var skipCore = (getUrlParameter('qunit_skip_core') == '1'); -var pluginPath = getUrlParameter('qunit_single_plugin') ? "\/"+getUrlParameter('qunit_single_plugin')+"\/" : "\/plugins\/"; +var skipCore = getUrlParameter("qunit_skip_core") == "1"; +var pluginPath = getUrlParameter("qunit_single_plugin") + ? "/" + getUrlParameter("qunit_single_plugin") + "/" + : "/plugins/"; Object.keys(requirejs.entries).forEach(function(entry) { - var isTest = (/\-test/).test(entry); - var regex = new RegExp(pluginPath) + var isTest = /\-test/.test(entry); + var regex = new RegExp(pluginPath); var isPlugin = regex.test(entry); if (isTest && (!skipCore || isPlugin)) { diff --git a/test/javascripts/widgets/actions-summary-test.js.es6 b/test/javascripts/widgets/actions-summary-test.js.es6 index f4eb8b7882..407200feed 100644 --- a/test/javascripts/widgets/actions-summary-test.js.es6 +++ b/test/javascripts/widgets/actions-summary-test.js.es6 @@ -1,80 +1,91 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('actions-summary'); +moduleForWidget("actions-summary"); -widgetTest('listing actions', { +widgetTest("listing actions", { template: '{{mount-widget widget="actions-summary" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { actionsSummary: [ - {id: 1, action: 'off_topic', description: 'very off topic'}, - {id: 2, action: 'spam', description: 'suspicious message'} + { id: 1, action: "off_topic", description: "very off topic" }, + { id: 2, action: "spam", description: "suspicious message" } ] }); }, - test(assert) { - assert.equal(this.$('.post-actions .post-action').length, 2); + async test(assert) { + assert.equal(this.$(".post-actions .post-action").length, 2); - click('.post-action:eq(0) .action-link a'); - andThen(() => { - assert.equal(this.$('.post-action:eq(0) img.avatar').length, 1, 'clicking it shows the user'); - }); + await click(".post-action:eq(0) .action-link a"); + assert.equal( + this.$(".post-action:eq(0) img.avatar").length, + 1, + "clicking it shows the user" + ); } }); -widgetTest('undo', { - template: '{{mount-widget widget="actions-summary" args=args undoPostAction=undoPostAction}}', +widgetTest("undo", { + template: + '{{mount-widget widget="actions-summary" args=args undoPostAction=undoPostAction}}', beforeEach() { - this.set('args', { + this.set("args", { actionsSummary: [ - {action: 'off_topic', description: 'very off topic', canUndo: true}, + { action: "off_topic", description: "very off topic", canUndo: true } ] }); - this.set('undoPostAction', () => this.undid = true); + this.set("undoPostAction", () => (this.undid = true)); }, - test(assert) { - assert.equal(this.$('.post-actions .post-action').length, 1); + async test(assert) { + assert.equal(this.$(".post-actions .post-action").length, 1); - click('.action-link.undo'); - andThen(() => { - assert.ok(this.undid, 'it triggered the action'); - }); + await click(".action-link.undo"); + assert.ok(this.undid, "it triggered the action"); } }); -widgetTest('deferFlags', { - template: '{{mount-widget widget="actions-summary" args=args deferPostActionFlags="deferPostActionFlags"}}', +widgetTest("deferFlags", { + template: + '{{mount-widget widget="actions-summary" args=args deferPostActionFlags="deferPostActionFlags"}}', beforeEach() { - this.set('args', { + this.set("args", { actionsSummary: [ - {action: 'off_topic', description: 'very off topic', canDeferFlags: true, count: 1}, + { + action: "off_topic", + description: "very off topic", + canDeferFlags: true, + count: 1 + } ] }); - this.on('deferPostActionFlags', () => this.deferred = true); + this.on("deferPostActionFlags", () => (this.deferred = true)); }, - test(assert) { - assert.equal(this.$('.post-actions .post-action').length, 1); + async test(assert) { + assert.equal(this.$(".post-actions .post-action").length, 1); - click('.action-link.defer-flags'); - andThen(() => { - assert.ok(this.deferred, 'it triggered the action'); - }); + await click(".action-link.defer-flags"); + assert.ok(this.deferred, "it triggered the action"); } }); -widgetTest('post deleted', { +widgetTest("post deleted", { template: '{{mount-widget widget="actions-summary" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { deleted_at: "2016-01-01", - deletedByUsername: 'eviltrout', - deletedByAvatarTemplate: '/images/avatar.png' + deletedByUsername: "eviltrout", + deletedByAvatarTemplate: "/images/avatar.png" }); }, test(assert) { - assert.ok(this.$('.post-action .d-icon-trash-o').length === 1, 'it has the deleted icon'); - assert.ok(this.$('.avatar[title=eviltrout]').length === 1, 'it has the deleted by avatar'); + assert.ok( + this.$(".post-action .d-icon-trash-o").length === 1, + "it has the deleted icon" + ); + assert.ok( + this.$(".avatar[title=eviltrout]").length === 1, + "it has the deleted by avatar" + ); } }); diff --git a/test/javascripts/widgets/button-test.js.es6 b/test/javascripts/widgets/button-test.js.es6 index 96bd4b245c..6286e3947b 100644 --- a/test/javascripts/widgets/button-test.js.es6 +++ b/test/javascripts/widgets/button-test.js.es6 @@ -1,43 +1,52 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('button'); +moduleForWidget("button"); -widgetTest('icon only button', { +widgetTest("icon only button", { template: '{{mount-widget widget="button" args=args}}', beforeEach() { - this.set('args', { icon: 'smile-o' }); + this.set("args", { icon: "smile-o" }); }, test(assert) { - assert.ok(this.$('button.btn.btn-icon.no-text').length, 'it has all the classes'); - assert.ok(this.$('button .d-icon.d-icon-smile-o').length, 'it has the icon'); + assert.ok( + this.$("button.btn.btn-icon.no-text").length, + "it has all the classes" + ); + assert.ok( + this.$("button .d-icon.d-icon-smile-o").length, + "it has the icon" + ); } }); -widgetTest('icon and text button', { +widgetTest("icon and text button", { template: '{{mount-widget widget="button" args=args}}', beforeEach() { - this.set('args', { icon: 'plus', label: 'topic.create' }); + this.set("args", { icon: "plus", label: "topic.create" }); }, test(assert) { - assert.ok(this.$('button.btn.btn-icon-text').length, 'it has all the classes'); - assert.ok(this.$('button .d-icon.d-icon-plus').length, 'it has the icon'); - assert.ok(this.$('button span.d-button-label').length, 'it has the label'); + assert.ok( + this.$("button.btn.btn-icon-text").length, + "it has all the classes" + ); + assert.ok(this.$("button .d-icon.d-icon-plus").length, "it has the icon"); + assert.ok(this.$("button span.d-button-label").length, "it has the label"); } }); -widgetTest('text only button', { +widgetTest("text only button", { template: '{{mount-widget widget="button" args=args}}', beforeEach() { - this.set('args', { label: 'topic.create' }); + this.set("args", { label: "topic.create" }); }, test(assert) { - assert.ok(this.$('button.btn.btn-text').length, 'it has all the classes'); - assert.ok(this.$('button span.d-button-label').length, 'it has the label'); + assert.ok(this.$("button.btn.btn-text").length, "it has all the classes"); + assert.ok(this.$("button span.d-button-label").length, "it has the label"); } }); diff --git a/test/javascripts/widgets/hamburger-menu-test.js.es6 b/test/javascripts/widgets/hamburger-menu-test.js.es6 index c8f67ccf1e..e94233df47 100644 --- a/test/javascripts/widgets/hamburger-menu-test.js.es6 +++ b/test/javascripts/widgets/hamburger-menu-test.js.es6 @@ -1,63 +1,72 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; +import { NotificationLevels } from "discourse/lib/notification-levels"; -moduleForWidget('hamburger-menu'); +moduleForWidget("hamburger-menu"); -widgetTest('prioritize faq', { +const topCategoryIds = [2, 3, 1]; +let mutedCategoryIds = []; +let unreadCategoryIds = []; +let categoriesByCount = []; + +widgetTest("prioritize faq", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { - this.siteSettings.faq_url = 'http://example.com/faq'; - this.currentUser.set('read_faq', false); + this.siteSettings.faq_url = "http://example.com/faq"; + this.currentUser.set("read_faq", false); }, test(assert) { - assert.ok(this.$('.faq-priority').length); - assert.ok(!this.$('.faq-link').length); + assert.ok(this.$(".faq-priority").length); + assert.ok(!this.$(".faq-link").length); } }); -widgetTest('prioritize faq - user has read', { +widgetTest("prioritize faq - user has read", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { - this.siteSettings.faq_url = 'http://example.com/faq'; - this.currentUser.set('read_faq', true); + this.siteSettings.faq_url = "http://example.com/faq"; + this.currentUser.set("read_faq", true); }, test(assert) { - assert.ok(!this.$('.faq-priority').length); - assert.ok(this.$('.faq-link').length); + assert.ok(!this.$(".faq-priority").length); + assert.ok(this.$(".faq-link").length); } }); -widgetTest('staff menu - not staff', { +widgetTest("staff menu - not staff", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { - this.currentUser.set('staff', false); + this.currentUser.set("staff", false); }, test(assert) { - assert.ok(!this.$('.admin-link').length); + assert.ok(!this.$(".admin-link").length); } }); -widgetTest('staff menu', { +widgetTest("staff menu", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { - this.currentUser.setProperties({ staff: true, site_flagged_posts_count: 3 }); + this.currentUser.setProperties({ + staff: true, + site_flagged_posts_count: 3 + }); }, test(assert) { - assert.ok(this.$('.admin-link').length); - assert.ok(this.$('.flagged-posts-link').length); - assert.equal(this.$('.flagged-posts').text(), '3'); - assert.ok(!this.$('.settings-link').length); + assert.ok(this.$(".admin-link").length); + assert.ok(this.$(".flagged-posts-link").length); + assert.equal(this.$(".flagged-posts").text(), "3"); + assert.ok(!this.$(".settings-link").length); } }); -widgetTest('staff menu - admin', { +widgetTest("staff menu - admin", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { @@ -65,12 +74,11 @@ widgetTest('staff menu - admin', { }, test(assert) { - assert.ok(this.$('.settings-link').length); + assert.ok(this.$(".settings-link").length); } }); - -widgetTest('queued posts', { +widgetTest("queued posts", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { @@ -82,12 +90,12 @@ widgetTest('queued posts', { }, test(assert) { - assert.ok(this.$('.queued-posts-link').length); - assert.equal(this.$('.queued-posts').text(), '5'); + assert.ok(this.$(".queued-posts-link").length); + assert.equal(this.$(".queued-posts").text(), "5"); } }); -widgetTest('queued posts - disabled', { +widgetTest("queued posts - disabled", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { @@ -95,36 +103,109 @@ widgetTest('queued posts - disabled', { }, test(assert) { - assert.ok(!this.$('.queued-posts-link').length); + assert.ok(!this.$(".queued-posts-link").length); } }); - -widgetTest('logged in links', { +widgetTest("logged in links", { template: '{{mount-widget widget="hamburger-menu"}}', test(assert) { - assert.ok(this.$('.new-topics-link').length); - assert.ok(this.$('.unread-topics-link').length); + assert.ok(this.$(".new-topics-link").length); + assert.ok(this.$(".unread-topics-link").length); } }); -widgetTest('general links', { +widgetTest("general links", { template: '{{mount-widget widget="hamburger-menu"}}', anonymous: true, test(assert) { assert.ok(this.$("li[class='']").length === 0); - assert.ok(this.$('.latest-topics-link').length); - assert.ok(!this.$('.new-topics-link').length); - assert.ok(!this.$('.unread-topics-link').length); - assert.ok(this.$('.top-topics-link').length); - assert.ok(this.$('.badge-link').length); - assert.ok(this.$('.category-link').length > 0); + assert.ok(this.$(".latest-topics-link").length); + assert.ok(!this.$(".new-topics-link").length); + assert.ok(!this.$(".unread-topics-link").length); + assert.ok(this.$(".top-topics-link").length); + assert.ok(this.$(".badge-link").length); + assert.ok(this.$(".category-link").length > 0); } }); -widgetTest('badges link - disabled', { +let maxCategoriesToDisplay; + +widgetTest("top categories - anonymous", { + template: '{{mount-widget widget="hamburger-menu"}}', + anonymous: true, + + beforeEach() { + this.siteSettings.header_dropdown_category_count = 8; + maxCategoriesToDisplay = this.siteSettings.header_dropdown_category_count; + categoriesByCount = this.site.get("categoriesByCount"); + }, + + test(assert) { + const count = categoriesByCount.length; + const maximum = + count <= maxCategoriesToDisplay ? count : maxCategoriesToDisplay; + assert.equal(find(".category-link").length, maximum); + assert.equal( + find(".category-link .category-name").text(), + categoriesByCount + .slice(0, maxCategoriesToDisplay) + .map(c => c.name) + .join("") + ); + } +}); + +widgetTest("top categories", { + template: '{{mount-widget widget="hamburger-menu"}}', + + beforeEach() { + this.siteSettings.header_dropdown_category_count = 8; + maxCategoriesToDisplay = this.siteSettings.header_dropdown_category_count; + categoriesByCount = this.site.get("categoriesByCount").slice(); + categoriesByCount.every(c => { + if (!topCategoryIds.includes(c.id)) { + if (mutedCategoryIds.length === 0) { + mutedCategoryIds.push(c.id); + c.set("notification_level", NotificationLevels.MUTED); + } else if (unreadCategoryIds.length === 0) { + unreadCategoryIds.push(c.id); + c.set("unreadTopics", 5); + } else { + unreadCategoryIds.splice(0, 0, c.id); + c.set("newTopics", 10); + return false; + } + } + return true; + }); + this.currentUser.set("top_category_ids", topCategoryIds); + }, + + test(assert) { + assert.equal(find(".category-link").length, maxCategoriesToDisplay); + + categoriesByCount = categoriesByCount.filter( + c => !mutedCategoryIds.includes(c.id) + ); + let ids = [ + ...unreadCategoryIds, + ...topCategoryIds, + ...categoriesByCount.map(c => c.id) + ] + .uniq() + .slice(0, maxCategoriesToDisplay); + + assert.equal( + find(".category-link .category-name").text(), + ids.map(i => categoriesByCount.find(c => c.id === i).name).join("") + ); + } +}); + +widgetTest("badges link - disabled", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { @@ -132,27 +213,27 @@ widgetTest('badges link - disabled', { }, test(assert) { - assert.ok(!this.$('.badge-link').length); + assert.ok(!this.$(".badge-link").length); } }); -widgetTest('badges link', { +widgetTest("badges link", { template: '{{mount-widget widget="hamburger-menu"}}', test(assert) { - assert.ok(this.$('.badge-link').length); + assert.ok(this.$(".badge-link").length); } }); -widgetTest('user directory link', { +widgetTest("user directory link", { template: '{{mount-widget widget="hamburger-menu"}}', test(assert) { - assert.ok(this.$('.user-directory-link').length); + assert.ok(this.$(".user-directory-link").length); } }); -widgetTest('user directory link - disabled', { +widgetTest("user directory link - disabled", { template: '{{mount-widget widget="hamburger-menu"}}', beforeEach() { @@ -160,15 +241,15 @@ widgetTest('user directory link - disabled', { }, test(assert) { - assert.ok(!this.$('.user-directory-link').length); + assert.ok(!this.$(".user-directory-link").length); } }); -widgetTest('general links', { +widgetTest("general links", { template: '{{mount-widget widget="hamburger-menu"}}', test(assert) { - assert.ok(this.$('.about-link').length); - assert.ok(this.$('.keyboard-shortcuts-link').length); + assert.ok(this.$(".about-link").length); + assert.ok(this.$(".keyboard-shortcuts-link").length); } }); diff --git a/test/javascripts/widgets/header-test.js.es6 b/test/javascripts/widgets/header-test.js.es6 index f91ab7755e..dc12a9e74f 100644 --- a/test/javascripts/widgets/header-test.js.es6 +++ b/test/javascripts/widgets/header-test.js.es6 @@ -1,75 +1,74 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('header'); +moduleForWidget("header"); -widgetTest('rendering basics', { +widgetTest("rendering basics", { template: '{{mount-widget widget="header"}}', test(assert) { - assert.ok(this.$('header.d-header').length); - assert.ok(this.$('#site-logo').length); + assert.ok(this.$("header.d-header").length); + assert.ok(this.$("#site-logo").length); } }); -widgetTest('sign up / login buttons', { - template: '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', +widgetTest("sign up / login buttons", { + template: + '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', anonymous: true, beforeEach() { - this.set('args', { canSignUp: true }); - this.on('showCreateAccount', () => this.signupShown = true); - this.on('showLogin', () => this.loginShown = true); + this.set("args", { canSignUp: true }); + this.on("showCreateAccount", () => (this.signupShown = true)); + this.on("showLogin", () => (this.loginShown = true)); }, - test(assert) { - assert.ok(this.$('button.sign-up-button').length); - assert.ok(this.$('button.login-button').length); + async test(assert) { + assert.ok(this.$("button.sign-up-button").length); + assert.ok(this.$("button.login-button").length); - click('button.sign-up-button'); - andThen(() => { - assert.ok(this.signupShown); - }); + await click("button.sign-up-button"); + assert.ok(this.signupShown); - click('button.login-button'); - andThen(() => { - assert.ok(this.loginShown); - }); + await click("button.login-button"); + assert.ok(this.loginShown); } }); -widgetTest('anon when login required', { - template: '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', +widgetTest("anon when login required", { + template: + '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', anonymous: true, beforeEach() { - this.set('args', { canSignUp: true }); - this.on('showCreateAccount', () => this.signupShown = true); - this.on('showLogin', () => this.loginShown = true); + this.set("args", { canSignUp: true }); + this.on("showCreateAccount", () => (this.signupShown = true)); + this.on("showLogin", () => (this.loginShown = true)); this.siteSettings.login_required = true; }, test(assert) { - assert.ok(exists('button.login-button')); - assert.ok(exists('button.sign-up-button')); - assert.ok(!exists('#search-button')); - assert.ok(!exists('#toggle-hamburger-menu')); + assert.ok(exists("button.login-button")); + assert.ok(exists("button.sign-up-button")); + assert.ok(!exists("#search-button")); + assert.ok(!exists("#toggle-hamburger-menu")); } }); -widgetTest('logged in when login required', { - template: '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', +widgetTest("logged in when login required", { + template: + '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', beforeEach() { - this.set('args', { canSignUp: true }); - this.on('showCreateAccount', () => this.signupShown = true); - this.on('showLogin', () => this.loginShown = true); + this.set("args", { canSignUp: true }); + this.on("showCreateAccount", () => (this.signupShown = true)); + this.on("showLogin", () => (this.loginShown = true)); this.siteSettings.login_required = true; }, test(assert) { - assert.ok(!exists('button.login-button')); - assert.ok(!exists('button.sign-up-button')); - assert.ok(exists('#search-button')); - assert.ok(exists('#toggle-hamburger-menu')); - assert.ok(exists('#current-user')); + assert.ok(!exists("button.login-button")); + assert.ok(!exists("button.sign-up-button")); + assert.ok(exists("#search-button")); + assert.ok(exists("#toggle-hamburger-menu")); + assert.ok(exists("#current-user")); } }); diff --git a/test/javascripts/widgets/home-logo-test.js.es6 b/test/javascripts/widgets/home-logo-test.js.es6 index 70615b7805..9911a3345c 100644 --- a/test/javascripts/widgets/home-logo-test.js.es6 +++ b/test/javascripts/widgets/home-logo-test.js.es6 @@ -1,90 +1,90 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('home-logo'); +moduleForWidget("home-logo"); -const bigLogo = '/images/d-logo-sketch.png?test'; -const smallLogo = '/images/d-logo-sketch-small.png?test'; -const mobileLogo = '/images/d-logo-sketch.png?mobile'; +const bigLogo = "/images/d-logo-sketch.png?test"; +const smallLogo = "/images/d-logo-sketch-small.png?test"; +const mobileLogo = "/images/d-logo-sketch.png?mobile"; const title = "Cool Forum"; -widgetTest('basics', { +widgetTest("basics", { template: '{{mount-widget widget="home-logo" args=args}}', beforeEach() { this.siteSettings.logo_url = bigLogo; this.siteSettings.logo_small_url = smallLogo; this.siteSettings.title = title; - this.set('args', { minimized: false }); + this.set("args", { minimized: false }); }, test(assert) { - assert.ok(this.$('.title').length === 1); + assert.ok(this.$(".title").length === 1); - assert.ok(this.$('img#site-logo.logo-big').length === 1); - assert.equal(this.$('#site-logo').attr('src'), bigLogo); - assert.equal(this.$('#site-logo').attr('alt'), title); + assert.ok(this.$("img#site-logo.logo-big").length === 1); + assert.equal(this.$("#site-logo").attr("src"), bigLogo); + assert.equal(this.$("#site-logo").attr("alt"), title); } }); -widgetTest('basics - minimized', { +widgetTest("basics - minimized", { template: '{{mount-widget widget="home-logo" args=args}}', beforeEach() { this.siteSettings.logo_url = bigLogo; - this.siteSettings.logo_small_url= smallLogo; + this.siteSettings.logo_small_url = smallLogo; this.siteSettings.title = title; - this.set('args', { minimized: true }); + this.set("args", { minimized: true }); }, test(assert) { - assert.ok(this.$('img.logo-small').length === 1); - assert.equal(this.$('img.logo-small').attr('src'), smallLogo); - assert.equal(this.$('img.logo-small').attr('alt'), title); + assert.ok(this.$("img.logo-small").length === 1); + assert.equal(this.$("img.logo-small").attr("src"), smallLogo); + assert.equal(this.$("img.logo-small").attr("alt"), title); } }); -widgetTest('no logo', { +widgetTest("no logo", { template: '{{mount-widget widget="home-logo" args=args}}', beforeEach() { - this.siteSettings.logo_url = ''; - this.siteSettings.logo_small_url = ''; + this.siteSettings.logo_url = ""; + this.siteSettings.logo_small_url = ""; this.siteSettings.title = title; - this.set('args', { minimized: false }); + this.set("args", { minimized: false }); }, test(assert) { - assert.ok(this.$('h1#site-text-logo.text-logo').length === 1); - assert.equal(this.$('#site-text-logo').text(), title); + assert.ok(this.$("h1#site-text-logo.text-logo").length === 1); + assert.equal(this.$("#site-text-logo").text(), title); } }); -widgetTest('no logo - minimized', { +widgetTest("no logo - minimized", { template: '{{mount-widget widget="home-logo" args=args}}', beforeEach() { - this.siteSettings.logo_url = ''; - this.siteSettings.logo_small_url = ''; + this.siteSettings.logo_url = ""; + this.siteSettings.logo_small_url = ""; this.siteSettings.title = title; - this.set('args', { minimized: true }); + this.set("args", { minimized: true }); }, test(assert) { - assert.ok(this.$('.d-icon-home').length === 1); + assert.ok(this.$(".d-icon-home").length === 1); } }); -widgetTest('mobile logo', { +widgetTest("mobile logo", { template: '{{mount-widget widget="home-logo" args=args}}', beforeEach() { this.siteSettings.mobile_logo_url = mobileLogo; - this.siteSettings.logo_small_url= smallLogo; + this.siteSettings.logo_small_url = smallLogo; this.site.mobileView = true; }, test(assert) { - assert.ok(this.$('img#site-logo.logo-big').length === 1); - assert.equal(this.$('#site-logo').attr('src'), mobileLogo); + assert.ok(this.$("img#site-logo.logo-big").length === 1); + assert.equal(this.$("#site-logo").attr("src"), mobileLogo); } }); -widgetTest('mobile without logo', { +widgetTest("mobile without logo", { template: '{{mount-widget widget="home-logo" args=args}}', beforeEach() { this.siteSettings.logo_url = bigLogo; @@ -92,7 +92,56 @@ widgetTest('mobile without logo', { }, test(assert) { - assert.ok(this.$('img#site-logo.logo-big').length === 1); - assert.equal(this.$('#site-logo').attr('src'), bigLogo); + assert.ok(this.$("img#site-logo.logo-big").length === 1); + assert.equal(this.$("#site-logo").attr("src"), bigLogo); + } +}); + +widgetTest("basics, subfolder", { + template: '{{mount-widget widget="home-logo" args=args}}', + beforeEach() { + Discourse.BaseUri = "/forum"; + this.siteSettings.logo_url = bigLogo; + this.siteSettings.logo_small_url = smallLogo; + this.siteSettings.title = title; + this.set("args", { minimized: false }); + }, + + test(assert) { + assert.ok(this.$("img#site-logo.logo-big").length === 1); + assert.equal(this.$("#site-logo").attr("src"), `/forum${bigLogo}`); + assert.equal(this.$("#site-logo").attr("alt"), title); + } +}); + +widgetTest("basics, subfolder - minimized", { + template: '{{mount-widget widget="home-logo" args=args}}', + beforeEach() { + Discourse.BaseUri = "/forum"; + this.siteSettings.logo_url = bigLogo; + this.siteSettings.logo_small_url = smallLogo; + this.siteSettings.title = title; + this.set("args", { minimized: true }); + }, + + test(assert) { + assert.ok(this.$("img.logo-small").length === 1); + assert.equal(this.$("img.logo-small").attr("src"), `/forum${smallLogo}`); + assert.equal(this.$("img.logo-small").attr("alt"), title); + } +}); + +widgetTest("mobile logo, subfolder", { + template: '{{mount-widget widget="home-logo" args=args}}', + beforeEach() { + Discourse.BaseUri = "/forum"; + this.siteSettings.mobile_logo_url = mobileLogo; + this.siteSettings.logo_small_url = smallLogo; + this.site.mobileView = true; + }, + + test(assert) { + assert.ok(this.$("img#site-logo.logo-big").length === 1); + assert.equal(this.$("#site-logo").attr("src"), `/forum${mobileLogo}`); } }); diff --git a/test/javascripts/widgets/post-links-test.js.es6 b/test/javascripts/widgets/post-links-test.js.es6 index c3e8f0c267..4dce86ea4b 100644 --- a/test/javascripts/widgets/post-links-test.js.es6 +++ b/test/javascripts/widgets/post-links-test.js.es6 @@ -1,27 +1,39 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('post-links'); +moduleForWidget("post-links"); widgetTest("duplicate links", { template: '{{mount-widget widget="post-links" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { id: 2, links: [ - { title: "Evil Trout Link", url: "http://eviltrout.com", reflection: true }, - { title: "Evil Trout Link", url: "http://dupe.eviltrout.com", reflection: true } + { + title: "Evil Trout Link", + url: "http://eviltrout.com", + reflection: true + }, + { + title: "Evil Trout Link", + url: "http://dupe.eviltrout.com", + reflection: true + } ] }); }, test(assert) { - assert.equal(this.$('.post-links a.track-link').length, 1, 'it hides the dupe link'); + assert.equal( + this.$(".post-links a.track-link").length, + 1, + "it hides the dupe link" + ); } }); widgetTest("collapsed links", { template: '{{mount-widget widget="post-links" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { id: 1, links: [ { title: "Link 1", url: "http://eviltrout.com?1", reflection: true }, @@ -30,15 +42,13 @@ widgetTest("collapsed links", { { title: "Link 4", url: "http://eviltrout.com?4", reflection: true }, { title: "Link 5", url: "http://eviltrout.com?5", reflection: true }, { title: "Link 6", url: "http://eviltrout.com?6", reflection: true }, - { title: "Link 7", url: "http://eviltrout.com?7", reflection: true }, + { title: "Link 7", url: "http://eviltrout.com?7", reflection: true } ] }); }, - test(assert) { - assert.ok(this.$('.expand-links').length === 1, 'collapsed by default'); - click('a.expand-links'); - andThen(() => { - assert.equal(this.$('.post-links a.track-link').length, 7); - }); + async test(assert) { + assert.ok(this.$(".expand-links").length === 1, "collapsed by default"); + await click("a.expand-links"); + assert.equal(this.$(".post-links a.track-link").length, 7); } }); diff --git a/test/javascripts/widgets/post-stream-test.js.es6 b/test/javascripts/widgets/post-stream-test.js.es6 index 071d59db95..040084efc4 100644 --- a/test/javascripts/widgets/post-stream-test.js.es6 +++ b/test/javascripts/widgets/post-stream-test.js.es6 @@ -1,70 +1,144 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; -import Topic from 'discourse/models/topic'; -import Post from 'discourse/models/post'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; +import Topic from "discourse/models/topic"; +import Post from "discourse/models/post"; -moduleForWidget('post-stream'); +moduleForWidget("post-stream"); function postStreamTest(name, attrs) { widgetTest(name, { template: `{{mount-widget widget="post-stream" args=(hash posts=posts)}}`, beforeEach() { - const site = this.container.lookup('site:main'); + const site = this.container.lookup("site:main"); let posts = attrs.posts.call(this); - posts.forEach(p => p.set('site', site)); - this.set('posts', posts); + posts.forEach(p => p.set("site", site)); + this.set("posts", posts); }, test: attrs.test }); } -postStreamTest('basics', { +postStreamTest("basics", { posts() { - const site = this.container.lookup('site:main'); + const site = this.container.lookup("site:main"); const topic = Topic.create({ details: { created_by: { id: 123 } } }); return [ - Post.create({ topic, id: 1, post_number: 1, user_id: 123, primary_group_name: 'trout', avatar_template: '/images/avatar.png' }), - Post.create({ topic, id: 2, post_number: 2, post_type: site.get('post_types.moderator_action') }), + Post.create({ + topic, + id: 1, + post_number: 1, + user_id: 123, + primary_group_name: "trout", + avatar_template: "/images/avatar.png" + }), + Post.create({ + topic, + id: 2, + post_number: 2, + post_type: site.get("post_types.moderator_action") + }), Post.create({ topic, id: 3, post_number: 3, hidden: true }), - Post.create({ topic, id: 4, post_number: 4, post_type: site.get('post_types.whisper') }), - Post.create({ topic, id: 5, post_number: 5, wiki: true, via_email: true }), - Post.create({ topic, id: 6, post_number: 6, via_email: true, is_auto_generated: true }), + Post.create({ + topic, + id: 4, + post_number: 4, + post_type: site.get("post_types.whisper") + }), + Post.create({ + topic, + id: 5, + post_number: 5, + wiki: true, + via_email: true + }), + Post.create({ + topic, + id: 6, + post_number: 6, + via_email: true, + is_auto_generated: true + }) ]; }, test(assert) { - assert.equal(this.$('.post-stream').length, 1); - assert.equal(this.$('.topic-post').length, 6, 'renders all posts'); + assert.equal(this.$(".post-stream").length, 1); + assert.equal(this.$(".topic-post").length, 6, "renders all posts"); // look for special class bindings - assert.equal(this.$('.topic-post:eq(0).topic-owner').length, 1, 'it applies the topic owner class'); - assert.equal(this.$('.topic-post:eq(0).group-trout').length, 1, 'it applies the primary group class'); - assert.equal(this.$('.topic-post:eq(0).regular').length, 1, 'it applies the regular class'); - assert.equal(this.$('.topic-post:eq(1).moderator').length, 1, 'it applies the moderator class'); - assert.equal(this.$('.topic-post:eq(2).post-hidden').length, 1, 'it applies the hidden class'); - assert.equal(this.$('.topic-post:eq(3).whisper').length, 1, 'it applies the whisper class'); - assert.equal(this.$('.topic-post:eq(4).wiki').length, 1, 'it applies the wiki class'); + assert.equal( + this.$(".topic-post:eq(0).topic-owner").length, + 1, + "it applies the topic owner class" + ); + assert.equal( + this.$(".topic-post:eq(0).group-trout").length, + 1, + "it applies the primary group class" + ); + assert.equal( + this.$(".topic-post:eq(0).regular").length, + 1, + "it applies the regular class" + ); + assert.equal( + this.$(".topic-post:eq(1).moderator").length, + 1, + "it applies the moderator class" + ); + assert.equal( + this.$(".topic-post:eq(2).post-hidden").length, + 1, + "it applies the hidden class" + ); + assert.equal( + this.$(".topic-post:eq(3).whisper").length, + 1, + "it applies the whisper class" + ); + assert.equal( + this.$(".topic-post:eq(4).wiki").length, + 1, + "it applies the wiki class" + ); // it renders an article for the body with appropriate attributes - assert.equal(this.$('article#post_2').length, 1); - assert.equal(this.$('article[data-user-id=123]').length, 1); - assert.equal(this.$('article[data-post-id=3]').length, 1); - assert.equal(this.$('article#post_5.via-email').length, 1); - assert.equal(this.$('article#post_6.is-auto-generated').length, 1); + assert.equal(this.$("article#post_2").length, 1); + assert.equal(this.$("article[data-user-id=123]").length, 1); + assert.equal(this.$("article[data-post-id=3]").length, 1); + assert.equal(this.$("article#post_5.via-email").length, 1); + assert.equal(this.$("article#post_6.is-auto-generated").length, 1); - assert.equal(this.$('article:eq(0) .main-avatar').length, 1, 'renders the main avatar'); + assert.equal( + this.$("article:eq(0) .main-avatar").length, + 1, + "renders the main avatar" + ); } }); -postStreamTest('deleted posts', { +postStreamTest("deleted posts", { posts() { const topic = Topic.create({ details: { created_by: { id: 123 } } }); return [ - Post.create({ topic, id: 1, post_number: 1, deleted_at: new Date().toString() }), + Post.create({ + topic, + id: 1, + post_number: 1, + deleted_at: new Date().toString() + }) ]; }, test(assert) { - assert.equal(this.$('.topic-post.deleted').length, 1, 'it applies the deleted class'); - assert.equal(this.$('.deleted-user-avatar').length, 1, 'it has the trash avatar'); + assert.equal( + this.$(".topic-post.deleted").length, + 1, + "it applies the deleted class" + ); + assert.equal( + this.$(".deleted-user-avatar").length, + 1, + "it has the trash avatar" + ); } }); diff --git a/test/javascripts/widgets/post-test.js.es6 b/test/javascripts/widgets/post-test.js.es6 index 0296c9dcf3..f01f7df534 100644 --- a/test/javascripts/widgets/post-test.js.es6 +++ b/test/javascripts/widgets/post-test.js.es6 @@ -1,643 +1,645 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('post'); +moduleForWidget("post"); -widgetTest('basic elements', { +widgetTest("basic elements", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { shareUrl: '/example', post_number: 1 }); + this.set("args", { shareUrl: "/example", post_number: 1 }); }, test(assert) { - assert.ok(this.$('.names').length, 'includes poster name'); + assert.ok(this.$(".names").length, "includes poster name"); - assert.ok(this.$('a.post-date').length, 'includes post date'); - assert.ok(this.$('a.post-date[data-share-url]').length); - assert.ok(this.$('a.post-date[data-post-number]').length); + assert.ok(this.$("a.post-date").length, "includes post date"); + assert.ok(this.$("a.post-date[data-share-url]").length); + assert.ok(this.$("a.post-date[data-post-number]").length); } }); -widgetTest('wiki', { - template: '{{mount-widget widget="post" args=args showHistory="showHistory"}}', +widgetTest("wiki", { + template: + '{{mount-widget widget="post" args=args showHistory="showHistory"}}', beforeEach() { - this.set('args', { wiki: true, version: 2, canViewEditHistory: true }); - this.on('showHistory', () => this.historyShown = true); + this.set("args", { wiki: true, version: 2, canViewEditHistory: true }); + this.on("showHistory", () => (this.historyShown = true)); }, - test(assert) { - click('.post-info .wiki'); - andThen(() => { - assert.ok(this.historyShown, 'clicking the wiki icon displays the post history'); - }); + async test(assert) { + await click(".post-info .wiki"); + assert.ok( + this.historyShown, + "clicking the wiki icon displays the post history" + ); } }); -widgetTest('wiki without revision', { +widgetTest("wiki without revision", { template: '{{mount-widget widget="post" args=args editPost="editPost"}}', beforeEach() { - this.set('args', { wiki: true, version: 1, canViewEditHistory: true }); - this.on('editPost', () => this.editPostCalled = true); + this.set("args", { wiki: true, version: 1, canViewEditHistory: true }); + this.on("editPost", () => (this.editPostCalled = true)); }, - test(assert) { - click('.post-info .wiki'); - andThen(() => { - assert.ok(this.editPostCalled, 'clicking wiki icon edits the post'); - }); + async test(assert) { + await click(".post-info .wiki"); + assert.ok(this.editPostCalled, "clicking wiki icon edits the post"); } }); -widgetTest('via-email', { - template: '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', +widgetTest("via-email", { + template: + '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', beforeEach() { - this.set('args', { via_email: true, canViewRawEmail: true }); - this.on('showRawEmail', () => this.rawEmailShown = true); + this.set("args", { via_email: true, canViewRawEmail: true }); + this.on("showRawEmail", () => (this.rawEmailShown = true)); }, - test(assert) { - click('.post-info.via-email'); - andThen(() => { - assert.ok(this.rawEmailShown, 'clicking the enveloppe shows the raw email'); - }); + async test(assert) { + await click(".post-info.via-email"); + assert.ok(this.rawEmailShown, "clicking the enveloppe shows the raw email"); } }); -widgetTest('via-email without permission', { - template: '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', +widgetTest("via-email without permission", { + template: + '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', beforeEach() { - this.set('args', { via_email: true, canViewRawEmail: false }); - this.on('showRawEmail', () => this.rawEmailShown = true); + this.set("args", { via_email: true, canViewRawEmail: false }); + this.on("showRawEmail", () => (this.rawEmailShown = true)); }, - test(assert) { - click('.post-info.via-email'); - andThen(() => { - assert.ok(!this.rawEmailShown, `clicking the enveloppe doesn't show the raw email`); - }); + async test(assert) { + await click(".post-info.via-email"); + assert.ok( + !this.rawEmailShown, + `clicking the enveloppe doesn't show the raw email` + ); } }); -widgetTest('history', { - template: '{{mount-widget widget="post" args=args showHistory="showHistory"}}', +widgetTest("history", { + template: + '{{mount-widget widget="post" args=args showHistory="showHistory"}}', beforeEach() { - this.set('args', { version: 3, canViewEditHistory: true }); - this.on('showHistory', () => this.historyShown = true); + this.set("args", { version: 3, canViewEditHistory: true }); + this.on("showHistory", () => (this.historyShown = true)); }, - test(assert) { - click('.post-info.edits'); - andThen(() => { - assert.ok(this.historyShown, 'clicking the pencil shows the history'); - }); + async test(assert) { + await click(".post-info.edits"); + assert.ok(this.historyShown, "clicking the pencil shows the history"); } }); -widgetTest('history without view permission', { - template: '{{mount-widget widget="post" args=args showHistory="showHistory"}}', +widgetTest("history without view permission", { + template: + '{{mount-widget widget="post" args=args showHistory="showHistory"}}', beforeEach() { - this.set('args', { version: 3, canViewEditHistory: false }); - this.on('showHistory', () => this.historyShown = true); + this.set("args", { version: 3, canViewEditHistory: false }); + this.on("showHistory", () => (this.historyShown = true)); }, - test(assert) { - click('.post-info.edits'); - andThen(() => { - assert.ok(!this.historyShown, `clicking the pencil doesn't show the history`); - }); + async test(assert) { + await click(".post-info.edits"); + assert.ok( + !this.historyShown, + `clicking the pencil doesn't show the history` + ); } }); -widgetTest('whisper', { +widgetTest("whisper", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { isWhisper: true }); + this.set("args", { isWhisper: true }); }, test(assert) { - assert.ok(this.$('.topic-post.whisper').length === 1); - assert.ok(this.$('.post-info.whisper').length === 1); + assert.ok(this.$(".topic-post.whisper").length === 1); + assert.ok(this.$(".post-info.whisper").length === 1); } }); -widgetTest('like count button', { +widgetTest("like count button", { template: '{{mount-widget widget="post" model=post args=args}}', beforeEach(store) { - const topic = store.createRecord('topic', {id: 123}); - const post = store.createRecord('post', { + const topic = store.createRecord("topic", { id: 123 }); + const post = store.createRecord("post", { id: 1, post_number: 1, topic, like_count: 3, - actions_summary: [ {id: 2, count: 1, hidden: false, can_act: true} ] + actions_summary: [{ id: 2, count: 1, hidden: false, can_act: true }] }); - this.set('post', post); - this.set('args', { likeCount: 1 }); + this.set("post", post); + this.set("args", { likeCount: 1 }); }, - test(assert) { - assert.ok(this.$('button.like-count').length === 1); - assert.ok(this.$('.who-liked').length === 0); + async test(assert) { + assert.ok(this.$("button.like-count").length === 1); + assert.ok(this.$(".who-liked").length === 0); // toggle it on - click('button.like-count'); - andThen(() => { - assert.ok(this.$('.who-liked').length === 1); - assert.ok(this.$('.who-liked a.trigger-user-card').length === 1); - }); + await click("button.like-count"); + assert.ok(this.$(".who-liked").length === 1); + assert.ok(this.$(".who-liked a.trigger-user-card").length === 1); // toggle it off - click('button.like-count'); - andThen(() => { - assert.ok(this.$('.who-liked').length === 0); - assert.ok(this.$('.who-liked a.trigger-user-card').length === 0); - }); + await click("button.like-count"); + assert.ok(this.$(".who-liked").length === 0); + assert.ok(this.$(".who-liked a.trigger-user-card").length === 0); } }); widgetTest(`like count with no likes`, { template: '{{mount-widget widget="post" model=post args=args}}', beforeEach() { - this.set('args', { likeCount: 0 }); + this.set("args", { likeCount: 0 }); }, test(assert) { - assert.ok(this.$('button.like-count').length === 0); + assert.ok(this.$("button.like-count").length === 0); } }); -widgetTest('share button', { +widgetTest("share button", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { shareUrl: 'http://share-me.example.com' }); + this.set("args", { shareUrl: "http://share-me.example.com" }); }, test(assert) { - assert.ok(!!this.$('.actions button[data-share-url]').length, 'it renders a share button'); + assert.ok( + !!this.$(".actions button[data-share-url]").length, + "it renders a share button" + ); } }); -widgetTest('liking', { - template: '{{mount-widget widget="post-menu" args=args toggleLike="toggleLike"}}', +widgetTest("liking", { + template: + '{{mount-widget widget="post-menu" args=args toggleLike="toggleLike"}}', beforeEach() { const args = { showLike: true, canToggleLike: true }; - this.set('args', args); - this.on('toggleLike', () => { + this.set("args", args); + this.on("toggleLike", () => { args.liked = !args.liked; args.likeCount = args.liked ? 1 : 0; }); }, - test(assert) { - assert.ok(!!this.$('.actions button.like').length); - assert.ok(this.$('.actions button.like-count').length === 0); + async test(assert) { + assert.ok(!!this.$(".actions button.like").length); + assert.ok(this.$(".actions button.like-count").length === 0); - click('.actions button.like'); - andThen(() => { - assert.ok(!this.$('.actions button.like').length); - assert.ok(!!this.$('.actions button.has-like').length); - assert.ok(this.$('.actions button.like-count').length === 1); - }); + await click(".actions button.like"); + assert.ok(!this.$(".actions button.like").length); + assert.ok(!!this.$(".actions button.has-like").length); + assert.ok(this.$(".actions button.like-count").length === 1); - click('.actions button.has-like'); - andThen(() => { - assert.ok(!!this.$('.actions button.like').length); - assert.ok(!this.$('.actions button.has-like').length); - assert.ok(this.$('.actions button.like-count').length === 0); - }); + await click(".actions button.has-like"); + assert.ok(!!this.$(".actions button.like").length); + assert.ok(!this.$(".actions button.has-like").length); + assert.ok(this.$(".actions button.like-count").length === 0); } }); -widgetTest('anon liking', { - template: '{{mount-widget widget="post-menu" args=args showLogin="showLogin"}}', +widgetTest("anon liking", { + template: + '{{mount-widget widget="post-menu" args=args showLogin="showLogin"}}', anonymous: true, beforeEach() { const args = { showLike: true }; - this.set('args', args); - this.on("showLogin", () => this.loginShown = true); + this.set("args", args); + this.on("showLogin", () => (this.loginShown = true)); }, - test(assert) { - assert.ok(!!this.$('.actions button.like').length); - assert.ok(this.$('.actions button.like-count').length === 0); + async test(assert) { + assert.ok(!!this.$(".actions button.like").length); + assert.ok(this.$(".actions button.like-count").length === 0); - click('.actions button.like'); - andThen(() => { - assert.ok(this.loginShown); - }); + await click(".actions button.like"); + assert.ok(this.loginShown); } }); - -widgetTest('edit button', { +widgetTest("edit button", { template: '{{mount-widget widget="post" args=args editPost="editPost"}}', beforeEach() { - this.set('args', { canEdit: true }); - this.on('editPost', () => this.editPostCalled = true); + this.set("args", { canEdit: true }); + this.on("editPost", () => (this.editPostCalled = true)); }, - test(assert) { - click('button.edit'); - andThen(() => { - assert.ok(this.editPostCalled, 'it triggered the edit action'); - }); + async test(assert) { + await click("button.edit"); + assert.ok(this.editPostCalled, "it triggered the edit action"); } }); widgetTest(`edit button - can't edit`, { template: '{{mount-widget widget="post" args=args editPost="editPost"}}', beforeEach() { - this.set('args', { canEdit: false }); + this.set("args", { canEdit: false }); }, test(assert) { - assert.equal(this.$('button.edit').length, 0, `button is not displayed`); + assert.equal(this.$("button.edit").length, 0, `button is not displayed`); } }); -widgetTest('recover button', { +widgetTest("recover button", { template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', beforeEach() { - this.set('args', { canDelete: true }); - this.on('deletePost', () => this.deletePostCalled = true); + this.set("args", { canDelete: true }); + this.on("deletePost", () => (this.deletePostCalled = true)); }, - test(assert) { - click('button.delete'); - andThen(() => { - assert.ok(this.deletePostCalled, 'it triggered the delete action'); - }); + async test(assert) { + await click("button.delete"); + assert.ok(this.deletePostCalled, "it triggered the delete action"); } }); -widgetTest('delete topic button', { +widgetTest("delete topic button", { template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', beforeEach() { - this.set('args', { canDeleteTopic: true }); - this.on('deletePost', () => this.deletePostCalled = true); + this.set("args", { canDeleteTopic: true }); + this.on("deletePost", () => (this.deletePostCalled = true)); }, - test(assert) { - click('button.delete'); - andThen(() => { - assert.ok(this.deletePostCalled, 'it triggered the delete action'); - }); + async test(assert) { + await click("button.delete"); + assert.ok(this.deletePostCalled, "it triggered the delete action"); } }); widgetTest(`delete topic button - can't delete`, { template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', beforeEach() { - this.set('args', { canDeleteTopic: false }); + this.set("args", { canDeleteTopic: false }); }, test(assert) { - assert.equal(this.$('button.delete').length, 0, `button is not displayed`); + assert.equal(this.$("button.delete").length, 0, `button is not displayed`); } }); -widgetTest('recover topic button', { - template: '{{mount-widget widget="post" args=args recoverPost="recoverPost"}}', +widgetTest( + `delete topic button - can't delete when topic author without permission`, + { + template: + '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + beforeEach() { + this.set("args", { + canDeleteTopic: false, + yours: true, + firstPost: true + }); + }, + + test(assert) { + assert.equal(this.$("button.delete").length, 1, `button is displayed`); + assert.equal( + this.$("button.delete").attr("title"), + I18n.t("post.controls.delete_topic_disallowed"), + `shows the right button title for users without permissions` + ); + } + } +); + +widgetTest("recover topic button", { + template: + '{{mount-widget widget="post" args=args recoverPost="recoverPost"}}', beforeEach() { - this.set('args', { canRecoverTopic: true }); - this.on('recoverPost', () => this.recovered = true); + this.set("args", { canRecoverTopic: true }); + this.on("recoverPost", () => (this.recovered = true)); }, - test(assert) { - click('button.recover'); - andThen(() => assert.ok(this.recovered)); + async test(assert) { + await click("button.recover"); + assert.ok(this.recovered); } }); widgetTest(`recover topic button - can't recover`, { template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', beforeEach() { - this.set('args', { canRecoverTopic: false }); + this.set("args", { canRecoverTopic: false }); }, test(assert) { - assert.equal(this.$('button.recover').length, 0, `button is not displayed`); + assert.equal(this.$("button.recover").length, 0, `button is not displayed`); } }); -widgetTest('delete post button', { +widgetTest("delete post button", { template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', beforeEach() { - this.set('args', { canDelete: true }); - this.on('deletePost', () => this.deletePostCalled = true); + this.set("args", { canDelete: true }); + this.on("deletePost", () => (this.deletePostCalled = true)); }, - test(assert) { - click('button.delete'); - andThen(() => { - assert.ok(this.deletePostCalled, 'it triggered the delete action'); - }); + async test(assert) { + await click("button.delete"); + assert.ok(this.deletePostCalled, "it triggered the delete action"); } }); widgetTest(`delete post button - can't delete`, { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { canDelete: false }); + this.set("args", { canDelete: false }); }, test(assert) { - assert.equal(this.$('button.delete').length, 0, `button is not displayed`); + assert.equal(this.$("button.delete").length, 0, `button is not displayed`); } }); -widgetTest('recover post button', { - template: '{{mount-widget widget="post" args=args recoverPost="recoverPost"}}', +widgetTest("recover post button", { + template: + '{{mount-widget widget="post" args=args recoverPost="recoverPost"}}', beforeEach() { - this.set('args', { canRecover: true }); - this.on('recoverPost', () => this.recovered = true); + this.set("args", { canRecover: true }); + this.on("recoverPost", () => (this.recovered = true)); }, - test(assert) { - click('button.recover'); - andThen(() => assert.ok(this.recovered)); + async test(assert) { + await click("button.recover"); + assert.ok(this.recovered); } }); widgetTest(`recover post button - can't recover`, { template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', beforeEach() { - this.set('args', { canRecover: false }); + this.set("args", { canRecover: false }); }, test(assert) { - assert.equal(this.$('button.recover').length, 0, `button is not displayed`); + assert.equal(this.$("button.recover").length, 0, `button is not displayed`); } }); widgetTest(`flagging`, { template: '{{mount-widget widget="post" args=args showFlags="showFlags"}}', beforeEach() { - this.set('args', { canFlag: true }); - this.on('showFlags', () => this.flagsShown = true); + this.set("args", { canFlag: true }); + this.on("showFlags", () => (this.flagsShown = true)); }, - test(assert) { - assert.ok(this.$('button.create-flag').length === 1); + async test(assert) { + assert.ok(this.$("button.create-flag").length === 1); - click('button.create-flag'); - andThen(() => { - assert.ok(this.flagsShown, 'it triggered the action'); - }); + await click("button.create-flag"); + assert.ok(this.flagsShown, "it triggered the action"); } }); widgetTest(`flagging: can't flag`, { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { canFlag: false }); + this.set("args", { canFlag: false }); }, test(assert) { - assert.ok(this.$('button.create-flag').length === 0); + assert.ok(this.$("button.create-flag").length === 0); } }); widgetTest(`read indicator`, { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { read: true }); + this.set("args", { read: true }); }, test(assert) { - assert.ok(this.$('.read-state.read').length); + assert.ok(this.$(".read-state.read").length); } }); widgetTest(`unread indicator`, { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { read: false }); + this.set("args", { read: false }); }, test(assert) { - assert.ok(this.$('.read-state').length); + assert.ok(this.$(".read-state").length); } }); widgetTest("reply directly above (supressed)", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { - replyToUsername: 'eviltrout', - replyToAvatarTemplate: '/images/avatar.png', + this.set("args", { + replyToUsername: "eviltrout", + replyToAvatarTemplate: "/images/avatar.png", replyDirectlyAbove: true }); }, test(assert) { - assert.equal(this.$('a.reply-to-tab').length, 0, 'hides the tab'); - assert.equal(this.$('.avoid-tab').length, 0, "doesn't have the avoid tab class"); + assert.equal(this.$("a.reply-to-tab").length, 0, "hides the tab"); + assert.equal( + this.$(".avoid-tab").length, + 0, + "doesn't have the avoid tab class" + ); } }); widgetTest("reply a few posts above (supressed)", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { - replyToUsername: 'eviltrout', - replyToAvatarTemplate: '/images/avatar.png', + this.set("args", { + replyToUsername: "eviltrout", + replyToAvatarTemplate: "/images/avatar.png", replyDirectlyAbove: false }); }, test(assert) { - assert.ok(this.$('a.reply-to-tab').length, 'shows the tab'); - assert.equal(this.$('.avoid-tab').length, 1, "has the avoid tab class"); + assert.ok(this.$("a.reply-to-tab").length, "shows the tab"); + assert.equal(this.$(".avoid-tab").length, 1, "has the avoid tab class"); } }); widgetTest("reply directly above", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { - replyToUsername: 'eviltrout', - replyToAvatarTemplate: '/images/avatar.png', + this.set("args", { + replyToUsername: "eviltrout", + replyToAvatarTemplate: "/images/avatar.png", replyDirectlyAbove: true }); this.siteSettings.suppress_reply_directly_above = false; }, - test(assert) { - assert.equal(this.$('.avoid-tab').length, 1, "has the avoid tab class"); - click('a.reply-to-tab'); - andThen(() => { - assert.equal(this.$('section.embedded-posts.top .cooked').length, 1); - assert.equal(this.$('section.embedded-posts .d-icon-arrow-up').length, 1); - }); + async test(assert) { + assert.equal(this.$(".avoid-tab").length, 1, "has the avoid tab class"); + await click("a.reply-to-tab"); + assert.equal(this.$("section.embedded-posts.top .cooked").length, 1); + assert.equal(this.$("section.embedded-posts .d-icon-arrow-up").length, 1); } }); widgetTest("cooked content hidden", { - template: '{{mount-widget widget="post" args=args expandHidden="expandHidden"}}', + template: + '{{mount-widget widget="post" args=args expandHidden="expandHidden"}}', beforeEach() { - this.set('args', { cooked_hidden: true }); - this.on('expandHidden', () => this.unhidden = true); + this.set("args", { cooked_hidden: true }); + this.on("expandHidden", () => (this.unhidden = true)); }, - test(assert) { - click('.topic-body .expand-hidden'); - andThen(() => { - assert.ok(this.unhidden, 'triggers the action'); - }); + async test(assert) { + await click(".topic-body .expand-hidden"); + assert.ok(this.unhidden, "triggers the action"); } }); widgetTest("expand first post", { template: '{{mount-widget widget="post" model=post args=args}}', beforeEach(store) { - this.set('args', { expandablePost: true }); - this.set('post', store.createRecord('post', { id: 1234 })); + this.set("args", { expandablePost: true }); + this.set("post", store.createRecord("post", { id: 1234 })); }, - test(assert) { - click('.topic-body .expand-post'); - andThen(() => { - assert.equal(this.$('.expand-post').length, 0, 'button is gone'); - }); + async test(assert) { + await click(".topic-body .expand-post"); + assert.equal(this.$(".expand-post").length, 0, "button is gone"); } }); widgetTest("can't bookmark", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { canBookmark: false }); + this.set("args", { canBookmark: false }); }, test(assert) { - assert.equal(this.$('button.bookmark').length, 0); - assert.equal(this.$('button.bookmarked').length, 0); + assert.equal(this.$("button.bookmark").length, 0); + assert.equal(this.$("button.bookmarked").length, 0); } }); widgetTest("bookmark", { - template: '{{mount-widget widget="post" args=args toggleBookmark="toggleBookmark"}}', + template: + '{{mount-widget widget="post" args=args toggleBookmark="toggleBookmark"}}', beforeEach() { const args = { canBookmark: true }; - this.set('args', args); - this.on('toggleBookmark', () => args.bookmarked = true); + this.set("args", args); + this.on("toggleBookmark", () => (args.bookmarked = true)); }, - test(assert) { - assert.equal(this.$('.post-menu-area .bookmark').length, 1); - assert.equal(this.$('button.bookmarked').length, 0); + async test(assert) { + assert.equal(this.$(".post-menu-area .bookmark").length, 1); + assert.equal(this.$("button.bookmarked").length, 0); - click('button.bookmark'); - andThen(() => { - assert.equal(this.$('button.bookmarked').length, 1); - }); + await click("button.bookmark"); + assert.equal(this.$("button.bookmarked").length, 1); } }); widgetTest("can't show admin menu when you can't manage", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { canManage: false }); + this.set("args", { canManage: false }); }, test(assert) { - assert.equal(this.$('.post-menu-area .show-post-admin-menu').length, 0); + assert.equal(this.$(".post-menu-area .show-post-admin-menu").length, 0); } }); widgetTest("show admin menu", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { canManage: true }); + this.set("args", { canManage: true }); }, - test(assert) { - assert.equal(this.$('.post-admin-menu').length, 0); - click('.post-menu-area .show-post-admin-menu'); - andThen(() => { - assert.equal(this.$('.post-admin-menu').length, 1, 'it shows the popup'); - }); - click('.post-menu-area'); - andThen(() => { - assert.equal(this.$('.post-admin-menu').length, 0, 'clicking outside clears the popup'); - }); + async test(assert) { + assert.equal(this.$(".post-admin-menu").length, 0); + await click(".post-menu-area .show-post-admin-menu"); + assert.equal(this.$(".post-admin-menu").length, 1, "it shows the popup"); + await click(".post-menu-area"); + assert.equal( + this.$(".post-admin-menu").length, + 0, + "clicking outside clears the popup" + ); } }); widgetTest("toggle moderator post", { - template: '{{mount-widget widget="post" args=args togglePostType="togglePostType"}}', + template: + '{{mount-widget widget="post" args=args togglePostType="togglePostType"}}', beforeEach() { - this.set('args', { canManage: true }); - this.on('togglePostType', () => this.toggled = true); + this.set("args", { canManage: true }); + this.on("togglePostType", () => (this.toggled = true)); }, - test(assert) { - click('.post-menu-area .show-post-admin-menu'); - click('.post-admin-menu .toggle-post-type'); - andThen(() => { - assert.ok(this.toggled); - assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); - }); + async test(assert) { + await click(".post-menu-area .show-post-admin-menu"); + await click(".post-admin-menu .toggle-post-type"); + assert.ok(this.toggled); + assert.equal(this.$(".post-admin-menu").length, 0, "also hides the menu"); } }); widgetTest("toggle moderator post", { - template: '{{mount-widget widget="post" args=args togglePostType="togglePostType"}}', + template: + '{{mount-widget widget="post" args=args togglePostType="togglePostType"}}', beforeEach() { - this.set('args', { canManage: true }); - this.on('togglePostType', () => this.toggled = true); + this.set("args", { canManage: true }); + this.on("togglePostType", () => (this.toggled = true)); }, - test(assert) { - click('.post-menu-area .show-post-admin-menu'); - click('.post-admin-menu .toggle-post-type'); - andThen(() => { - assert.ok(this.toggled); - assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); - }); + async test(assert) { + await click(".post-menu-area .show-post-admin-menu"); + await click(".post-admin-menu .toggle-post-type"); + assert.ok(this.toggled); + assert.equal(this.$(".post-admin-menu").length, 0, "also hides the menu"); } }); widgetTest("rebake post", { template: '{{mount-widget widget="post" args=args rebakePost="rebakePost"}}', beforeEach() { - this.set('args', { canManage: true }); - this.on('rebakePost', () => this.baked = true); + this.set("args", { canManage: true }); + this.on("rebakePost", () => (this.baked = true)); }, - test(assert) { - click('.post-menu-area .show-post-admin-menu'); - click('.post-admin-menu .rebuild-html'); - andThen(() => { - assert.ok(this.baked); - assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); - }); + async test(assert) { + await click(".post-menu-area .show-post-admin-menu"); + await click(".post-admin-menu .rebuild-html"); + assert.ok(this.baked); + assert.equal(this.$(".post-admin-menu").length, 0, "also hides the menu"); } }); widgetTest("unhide post", { template: '{{mount-widget widget="post" args=args unhidePost="unhidePost"}}', beforeEach() { - this.set('args', { canManage: true, hidden: true }); - this.on('unhidePost', () => this.unhidden = true); + this.set("args", { canManage: true, hidden: true }); + this.on("unhidePost", () => (this.unhidden = true)); }, - test(assert) { - click('.post-menu-area .show-post-admin-menu'); - click('.post-admin-menu .unhide-post'); - andThen(() => { - assert.ok(this.unhidden); - assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); - }); + async test(assert) { + await click(".post-menu-area .show-post-admin-menu"); + await click(".post-admin-menu .unhide-post"); + assert.ok(this.unhidden); + assert.equal(this.$(".post-admin-menu").length, 0, "also hides the menu"); } }); widgetTest("change owner", { - template: '{{mount-widget widget="post" args=args changePostOwner="changePostOwner"}}', + template: + '{{mount-widget widget="post" args=args changePostOwner="changePostOwner"}}', beforeEach() { this.currentUser.admin = true; - this.set('args', { canManage: true }); - this.on('changePostOwner', () => this.owned = true); + this.set("args", { canManage: true }); + this.on("changePostOwner", () => (this.owned = true)); }, - test(assert) { - click('.post-menu-area .show-post-admin-menu'); - click('.post-admin-menu .change-owner'); - andThen(() => { - assert.ok(this.owned); - assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); - }); + async test(assert) { + await click(".post-menu-area .show-post-admin-menu"); + await click(".post-admin-menu .change-owner"); + assert.ok(this.owned); + assert.equal(this.$(".post-admin-menu").length, 0, "also hides the menu"); } }); widgetTest("reply", { - template: '{{mount-widget widget="post" args=args replyToPost="replyToPost"}}', + template: + '{{mount-widget widget="post" args=args replyToPost="replyToPost"}}', beforeEach() { - this.set('args', { canCreatePost: true }); - this.on('replyToPost', () => this.replied = true); + this.set("args", { canCreatePost: true }); + this.on("replyToPost", () => (this.replied = true)); }, - test(assert) { - click('.post-controls .create'); - andThen(() => { - assert.ok(this.replied); - }); + async test(assert) { + await click(".post-controls .create"); + assert.ok(this.replied); } }); widgetTest("reply - without permissions", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { canCreatePost: false }); + this.set("args", { canCreatePost: false }); }, test(assert) { - assert.equal(this.$('.post-controls .create').length, 0); + assert.equal(this.$(".post-controls .create").length, 0); } }); widgetTest("replies - no replies", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', {replyCount: 0}); + this.set("args", { replyCount: 0 }); }, test(assert) { - assert.equal(this.$('button.show-replies').length, 0); + assert.equal(this.$("button.show-replies").length, 0); } }); @@ -645,10 +647,10 @@ widgetTest("replies - multiple replies", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { this.siteSettings.suppress_reply_directly_below = true; - this.set('args', {replyCount: 2, replyDirectlyBelow: true}); + this.set("args", { replyCount: 2, replyDirectlyBelow: true }); }, test(assert) { - assert.equal(this.$('button.show-replies').length, 1); + assert.equal(this.$("button.show-replies").length, 1); } }); @@ -656,10 +658,10 @@ widgetTest("replies - one below, suppressed", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { this.siteSettings.suppress_reply_directly_below = true; - this.set('args', {replyCount: 1, replyDirectlyBelow: true}); + this.set("args", { replyCount: 1, replyDirectlyBelow: true }); }, test(assert) { - assert.equal(this.$('button.show-replies').length, 0); + assert.equal(this.$("button.show-replies").length, 0); } }); @@ -667,147 +669,159 @@ widgetTest("replies - one below, not suppressed", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { this.siteSettings.suppress_reply_directly_below = false; - this.set('args', {id: 6654, replyCount: 1, replyDirectlyBelow: true}); + this.set("args", { id: 6654, replyCount: 1, replyDirectlyBelow: true }); }, - test(assert) { - click('button.show-replies'); - andThen(() => { - assert.equal(this.$('section.embedded-posts.bottom .cooked').length, 1); - assert.equal(this.$('section.embedded-posts .d-icon-arrow-down').length, 1); - }); + async test(assert) { + await click("button.show-replies"); + assert.equal(this.$("section.embedded-posts.bottom .cooked").length, 1); + assert.equal(this.$("section.embedded-posts .d-icon-arrow-down").length, 1); } }); widgetTest("topic map not shown", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { showTopicMap: false }); + this.set("args", { showTopicMap: false }); }, test(assert) { - assert.equal(this.$('.topic-map').length, 0); + assert.equal(this.$(".topic-map").length, 0); } }); widgetTest("topic map - few posts", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { showTopicMap: true, topicPostsCount: 2, - participants: [ - {username: 'eviltrout'}, - {username: 'codinghorror'}, - ] + participants: [{ username: "eviltrout" }, { username: "codinghorror" }] }); }, - test(assert) { - assert.equal(this.$('li.avatars a.poster').length, 0, 'shows no participants when collapsed'); + async test(assert) { + assert.equal( + this.$("li.avatars a.poster").length, + 0, + "shows no participants when collapsed" + ); - click('nav.buttons button'); - andThen(() => { - assert.equal(this.$('.topic-map-expanded a.poster').length, 2, 'shows all when expanded'); - }); + await click("nav.buttons button"); + assert.equal( + this.$(".topic-map-expanded a.poster").length, + 2, + "shows all when expanded" + ); } }); widgetTest("topic map - participants", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { showTopicMap: true, topicPostsCount: 10, participants: [ - {username: 'eviltrout'}, - {username: 'codinghorror'}, - {username: 'sam'}, - {username: 'ZogStrIP'}, + { username: "eviltrout" }, + { username: "codinghorror" }, + { username: "sam" }, + { username: "ZogStrIP" } ], - userFilters: ['sam', 'codinghorror'] + userFilters: ["sam", "codinghorror"] }); }, - test(assert) { - assert.equal(this.$('li.avatars a.poster').length, 3, 'limits to three participants'); + async test(assert) { + assert.equal( + this.$("li.avatars a.poster").length, + 3, + "limits to three participants" + ); - click('nav.buttons button'); - andThen(() => { - assert.equal(this.$('li.avatars a.poster').length, 0); - assert.equal(this.$('.topic-map-expanded a.poster').length, 4, 'shows all when expanded'); - assert.equal(this.$('a.poster.toggled').length, 2, 'two are toggled'); - }); + await click("nav.buttons button"); + assert.equal(this.$("li.avatars a.poster").length, 0); + assert.equal( + this.$(".topic-map-expanded a.poster").length, + 4, + "shows all when expanded" + ); + assert.equal(this.$("a.poster.toggled").length, 2, "two are toggled"); } }); widgetTest("topic map - links", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { showTopicMap: true, topicLinks: [ - {url: 'http://link1.example.com', clicks: 0}, - {url: 'http://link2.example.com', clicks: 0}, - {url: 'http://link3.example.com', clicks: 0}, - {url: 'http://link4.example.com', clicks: 0}, - {url: 'http://link5.example.com', clicks: 0}, - {url: 'http://link6.example.com', clicks: 0}, + { url: "http://link1.example.com", clicks: 0 }, + { url: "http://link2.example.com", clicks: 0 }, + { url: "http://link3.example.com", clicks: 0 }, + { url: "http://link4.example.com", clicks: 0 }, + { url: "http://link5.example.com", clicks: 0 }, + { url: "http://link6.example.com", clicks: 0 } ] }); }, - test(assert) { - assert.equal(this.$('.topic-map').length, 1); - assert.equal(this.$('.map.map-collapsed').length, 1); - assert.equal(this.$('.topic-map-expanded').length, 0); + async test(assert) { + assert.equal(this.$(".topic-map").length, 1); + assert.equal(this.$(".map.map-collapsed").length, 1); + assert.equal(this.$(".topic-map-expanded").length, 0); - click('nav.buttons button'); - andThen(() => { - assert.equal(this.$('.map.map-collapsed').length, 0); - assert.equal(this.$('.topic-map .d-icon-chevron-up').length, 1); - assert.equal(this.$('.topic-map-expanded').length, 1); - assert.equal(this.$('.topic-map-expanded .topic-link').length, 5, 'it limits the links displayed'); - }); + await click("nav.buttons button"); + assert.equal(this.$(".map.map-collapsed").length, 0); + assert.equal(this.$(".topic-map .d-icon-chevron-up").length, 1); + assert.equal(this.$(".topic-map-expanded").length, 1); + assert.equal( + this.$(".topic-map-expanded .topic-link").length, + 5, + "it limits the links displayed" + ); - click('.link-summary button'); - andThen(() => { - assert.equal(this.$('.topic-map-expanded .topic-link').length, 6, 'all links now shown'); - }); + await click(".link-summary button"); + assert.equal( + this.$(".topic-map-expanded .topic-link").length, + 6, + "all links now shown" + ); } }); widgetTest("topic map - no summary", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { showTopicMap: true }); + this.set("args", { showTopicMap: true }); }, test(assert) { - assert.equal(this.$('.toggle-summary').length, 0); + assert.equal(this.$(".toggle-summary").length, 0); } }); widgetTest("topic map - has summary", { - template: '{{mount-widget widget="post" args=args toggleSummary="toggleSummary"}}', + template: + '{{mount-widget widget="post" args=args toggleSummary="toggleSummary"}}', beforeEach() { - this.set('args', { showTopicMap: true, hasTopicSummary: true }); - this.on('toggleSummary', () => this.summaryToggled = true); + this.set("args", { showTopicMap: true, hasTopicSummary: true }); + this.on("toggleSummary", () => (this.summaryToggled = true)); }, - test(assert) { - assert.equal(this.$('.toggle-summary').length, 1); + async test(assert) { + assert.equal(this.$(".toggle-summary").length, 1); - click('.toggle-summary button'); - andThen(() => assert.ok(this.summaryToggled)); + await click(".toggle-summary button"); + assert.ok(this.summaryToggled); } }); widgetTest("pm map", { template: '{{mount-widget widget="post" args=args}}', beforeEach() { - this.set('args', { + this.set("args", { showTopicMap: true, showPMMap: true, allowedGroups: [], - allowedUsers: [ Ember.Object.create({ username: 'eviltrout' }) ] + allowedUsers: [Ember.Object.create({ username: "eviltrout" })] }); }, test(assert) { - assert.equal(this.$('.private-message-map').length, 1); - assert.equal(this.$('.private-message-map .user').length, 1); + assert.equal(this.$(".private-message-map").length, 1); + assert.equal(this.$(".private-message-map .user").length, 1); } }); diff --git a/test/javascripts/widgets/poster-name-test.js.es6 b/test/javascripts/widgets/poster-name-test.js.es6 index c8ab8391d7..c618f6f32b 100644 --- a/test/javascripts/widgets/poster-name-test.js.es6 +++ b/test/javascripts/widgets/poster-name-test.js.es6 @@ -1,57 +1,58 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('poster-name'); +moduleForWidget("poster-name"); -widgetTest('basic rendering', { +widgetTest("basic rendering", { template: '{{mount-widget widget="poster-name" args=args}}', beforeEach() { - this.set('args', { - username: 'eviltrout', - usernameUrl: '/u/eviltrout', - name: 'Robin Ward', - user_title: 'Trout Master' }); + this.set("args", { + username: "eviltrout", + usernameUrl: "/u/eviltrout", + name: "Robin Ward", + user_title: "Trout Master" + }); }, test(assert) { - assert.ok(this.$('.names').length); - assert.ok(this.$('span.username').length); - assert.ok(this.$('a[data-user-card=eviltrout]').length); - assert.equal(this.$('.username a').text(), 'eviltrout'); - assert.equal(this.$('.full-name a').text(), 'Robin Ward'); - assert.equal(this.$('.user-title').text(), 'Trout Master'); + assert.ok(this.$(".names").length); + assert.ok(this.$("span.username").length); + assert.ok(this.$("a[data-user-card=eviltrout]").length); + assert.equal(this.$(".username a").text(), "eviltrout"); + assert.equal(this.$(".full-name a").text(), "Robin Ward"); + assert.equal(this.$(".user-title").text(), "Trout Master"); } }); -widgetTest('extra classes and glyphs', { +widgetTest("extra classes and glyphs", { template: '{{mount-widget widget="poster-name" args=args}}', beforeEach() { - this.set('args', { - username: 'eviltrout', - usernameUrl: '/u/eviltrout', + this.set("args", { + username: "eviltrout", + usernameUrl: "/u/eviltrout", staff: true, admin: true, moderator: true, new_user: true, - primary_group_name: 'fish' - }); + primary_group_name: "fish" + }); }, test(assert) { - assert.ok(this.$('span.staff').length); - assert.ok(this.$('span.admin').length); - assert.ok(this.$('span.moderator').length); - assert.ok(this.$('.d-icon-shield').length); - assert.ok(this.$('span.new-user').length); - assert.ok(this.$('span.fish').length); + assert.ok(this.$("span.staff").length); + assert.ok(this.$("span.admin").length); + assert.ok(this.$("span.moderator").length); + assert.ok(this.$(".d-icon-shield").length); + assert.ok(this.$("span.new-user").length); + assert.ok(this.$("span.fish").length); } }); -widgetTest('disable display name on posts', { +widgetTest("disable display name on posts", { template: '{{mount-widget widget="poster-name" args=args}}', beforeEach() { this.siteSettings.display_name_on_posts = false; - this.set('args', { username: 'eviltrout', name: 'Robin Ward' }); + this.set("args", { username: "eviltrout", name: "Robin Ward" }); }, test(assert) { - assert.equal(this.$('.full-name').length, 0); + assert.equal(this.$(".full-name").length, 0); } }); @@ -60,9 +61,9 @@ widgetTest("doesn't render a name if it's similar to the username", { beforeEach() { this.siteSettings.prioritize_username_in_ux = true; this.siteSettings.display_name_on_posts = true; - this.set('args', { username: 'eviltrout', name: 'evil-trout' }); + this.set("args", { username: "eviltrout", name: "evil-trout" }); }, test(assert) { - assert.equal(this.$('.second').length, 0); + assert.equal(this.$(".second").length, 0); } }); diff --git a/test/javascripts/widgets/topic-participant-test.js.es6 b/test/javascripts/widgets/topic-participant-test.js.es6 index 67ba90a063..88f309da1e 100644 --- a/test/javascripts/widgets/topic-participant-test.js.es6 +++ b/test/javascripts/widgets/topic-participant-test.js.es6 @@ -1,43 +1,49 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('topic-participant'); +moduleForWidget("topic-participant"); -widgetTest('one post', { +widgetTest("one post", { template: '{{mount-widget widget="topic-participant" args=args}}', beforeEach() { - this.set('args', { - username: 'test', - avatar_template: '/images/avatar.png', + this.set("args", { + username: "test", + avatar_template: "/images/avatar.png", post_count: 1 }); }, test(assert) { - assert.ok(exists('a.poster.trigger-user-card')); - assert.ok(!exists('span.post-count'), "don't show count for only 1 post"); - assert.ok(!exists('.avatar-flair'), "no avatar flair"); + assert.ok(exists("a.poster.trigger-user-card")); + assert.ok(!exists("span.post-count"), "don't show count for only 1 post"); + assert.ok(!exists(".avatar-flair"), "no avatar flair"); } }); -widgetTest('many posts, a primary group with flair', { +widgetTest("many posts, a primary group with flair", { template: '{{mount-widget widget="topic-participant" args=args}}', beforeEach() { - this.set('args', { - username: 'test', - avatar_template: '/images/avatar.png', + this.set("args", { + username: "test", + avatar_template: "/images/avatar.png", post_count: 5, - primary_group_name: 'devs', + primary_group_name: "devs", primary_group_flair_url: "/images/d-logo-sketch-small.png", primary_group_flair_bg_color: "222" }); }, test(assert) { - assert.ok(exists('a.poster.trigger-user-card')); - assert.ok(exists('span.post-count'), "show count for many posts"); - assert.ok(exists('.group-devs a.poster'), "add class for the group outside the link"); - assert.ok(exists('.avatar-flair.avatar-flair-devs'), "show flair with group class"); + assert.ok(exists("a.poster.trigger-user-card")); + assert.ok(exists("span.post-count"), "show count for many posts"); + assert.ok( + exists(".group-devs a.poster"), + "add class for the group outside the link" + ); + assert.ok( + exists(".avatar-flair.avatar-flair-devs"), + "show flair with group class" + ); } }); diff --git a/test/javascripts/widgets/user-menu-test.js.es6 b/test/javascripts/widgets/user-menu-test.js.es6 index 19b4640a65..b48dc952ce 100644 --- a/test/javascripts/widgets/user-menu-test.js.es6 +++ b/test/javascripts/widgets/user-menu-test.js.es6 @@ -1,80 +1,77 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; -moduleForWidget('user-menu'); +moduleForWidget("user-menu"); -widgetTest('basics', { +widgetTest("basics", { template: '{{mount-widget widget="user-menu"}}', test(assert) { - assert.ok(this.$('.user-menu').length); - assert.ok(this.$('.user-activity-link').length); - assert.ok(this.$('.user-bookmarks-link').length); - assert.ok(this.$('.user-preferences-link').length); - assert.ok(this.$('.notifications').length); - assert.ok(this.$('.dismiss-link').length); + assert.ok(this.$(".user-menu").length); + assert.ok(this.$(".user-activity-link").length); + assert.ok(this.$(".user-bookmarks-link").length); + assert.ok(this.$(".user-preferences-link").length); + assert.ok(this.$(".notifications").length); + assert.ok(this.$(".dismiss-link").length); } }); -widgetTest('log out', { +widgetTest("log out", { template: '{{mount-widget widget="user-menu" logout="logout"}}', beforeEach() { - this.on('logout', () => this.loggedOut = true); + this.on("logout", () => (this.loggedOut = true)); }, - test(assert) { - assert.ok(this.$('.logout').length); + async test(assert) { + assert.ok(this.$(".logout").length); - click('.logout'); - andThen(() => { - assert.ok(this.loggedOut); - }); + await click(".logout"); + assert.ok(this.loggedOut); } }); -widgetTest('private messages - disabled', { +widgetTest("private messages - disabled", { template: '{{mount-widget widget="user-menu"}}', beforeEach() { this.siteSettings.enable_personal_messages = false; }, test(assert) { - assert.ok(!this.$('.user-pms-link').length); + assert.ok(!this.$(".user-pms-link").length); } }); -widgetTest('private messages - enabled', { +widgetTest("private messages - enabled", { template: '{{mount-widget widget="user-menu"}}', beforeEach() { this.siteSettings.enable_personal_messages = true; }, test(assert) { - assert.ok(this.$('.user-pms-link').length); + assert.ok(this.$(".user-pms-link").length); } }); -widgetTest('anonymous', { - template: '{{mount-widget widget="user-menu" toggleAnonymous="toggleAnonymous"}}', +widgetTest("anonymous", { + template: + '{{mount-widget widget="user-menu" toggleAnonymous="toggleAnonymous"}}', beforeEach() { this.currentUser.setProperties({ is_anonymous: false, trust_level: 3 }); this.siteSettings.allow_anonymous_posting = true; this.siteSettings.anonymous_posting_min_trust_level = 3; - this.on('toggleAnonymous', () => this.anonymous = true); + this.on("toggleAnonymous", () => (this.anonymous = true)); }, - test(assert) { - assert.ok(this.$('.enable-anonymous').length); - click('.enable-anonymous'); - andThen(() => { - assert.ok(this.anonymous); - }); + async test(assert) { + assert.ok(this.$(".enable-anonymous").length); + await click(".enable-anonymous"); + assert.ok(this.anonymous); } }); -widgetTest('anonymous - disabled', { +widgetTest("anonymous - disabled", { template: '{{mount-widget widget="user-menu"}}', beforeEach() { @@ -82,25 +79,24 @@ widgetTest('anonymous - disabled', { }, test(assert) { - assert.ok(!this.$('.enable-anonymous').length); + assert.ok(!this.$(".enable-anonymous").length); } }); -widgetTest('anonymous - switch back', { - template: '{{mount-widget widget="user-menu" toggleAnonymous="toggleAnonymous"}}', +widgetTest("anonymous - switch back", { + template: + '{{mount-widget widget="user-menu" toggleAnonymous="toggleAnonymous"}}', beforeEach() { this.currentUser.setProperties({ is_anonymous: true }); this.siteSettings.allow_anonymous_posting = true; - this.on('toggleAnonymous', () => this.anonymous = true); + this.on("toggleAnonymous", () => (this.anonymous = true)); }, - test(assert) { - assert.ok(this.$('.disable-anonymous').length); - click('.disable-anonymous'); - andThen(() => { - assert.ok(this.anonymous); - }); + async test(assert) { + assert.ok(this.$(".disable-anonymous").length); + await click(".disable-anonymous"); + assert.ok(this.anonymous); } }); diff --git a/test/javascripts/widgets/widget-test.js.es6 b/test/javascripts/widgets/widget-test.js.es6 index 78502f6ccd..0b5eba78ea 100644 --- a/test/javascripts/widgets/widget-test.js.es6 +++ b/test/javascripts/widgets/widget-test.js.es6 @@ -1,24 +1,24 @@ -import { moduleForWidget, widgetTest } from 'helpers/widget-test'; -import { createWidget } from 'discourse/widgets/widget'; -import { withPluginApi } from 'discourse/lib/plugin-api'; -import hbs from 'discourse/widgets/hbs-compiler'; +import { moduleForWidget, widgetTest } from "helpers/widget-test"; +import { createWidget } from "discourse/widgets/widget"; +import { withPluginApi } from "discourse/lib/plugin-api"; +import hbs from "discourse/widgets/hbs-compiler"; -moduleForWidget('base'); +moduleForWidget("base"); -widgetTest('widget attributes are passed in via args', { +widgetTest("widget attributes are passed in via args", { template: `{{mount-widget widget="hello-test" args=args}}`, beforeEach() { - createWidget('hello-test', { - tagName: 'div.test', + createWidget("hello-test", { + tagName: "div.test", template: hbs`Hello {{attrs.name}}` }); - this.set('args', { name: 'Robin' }); + this.set("args", { name: "Robin" }); }, test(assert) { - assert.equal(this.$('.test').text(), "Hello Robin"); + assert.equal(this.$(".test").text(), "Hello Robin"); } }); @@ -26,15 +26,15 @@ widgetTest("hbs template - no tagName", { template: `{{mount-widget widget="hbs-test" args=args}}`, beforeEach() { - createWidget('hbs-test', { + createWidget("hbs-test", { template: hbs`
Hello {{attrs.name}}
` }); - this.set('args', { name: 'Robin' }); + this.set("args", { name: "Robin" }); }, test(assert) { - assert.equal(this.$('div.test').text(), "Hello Robin"); + assert.equal(this.$("div.test").text(), "Hello Robin"); } }); @@ -42,84 +42,87 @@ widgetTest("hbs template - with tagName", { template: `{{mount-widget widget="hbs-test" args=args}}`, beforeEach() { - createWidget('hbs-test', { - tagName: 'div.test', + createWidget("hbs-test", { + tagName: "div.test", template: hbs`Hello {{attrs.name}}` }); - this.set('args', { name: 'Robin' }); + this.set("args", { name: "Robin" }); }, test(assert) { - assert.equal(this.$('div.test').text(), "Hello Robin"); + assert.equal(this.$("div.test").text(), "Hello Robin"); } }); -widgetTest('buildClasses', { +widgetTest("buildClasses", { template: `{{mount-widget widget="classname-test" args=args}}`, beforeEach() { - createWidget('classname-test', { - tagName: 'div.test', + createWidget("classname-test", { + tagName: "div.test", buildClasses(attrs) { - return ['static', attrs.dynamic]; + return ["static", attrs.dynamic]; } }); - this.set('args', { dynamic: 'cool-class' }); + this.set("args", { dynamic: "cool-class" }); }, test(assert) { - assert.ok(this.$('.test.static.cool-class').length, 'it has all the classes'); + assert.ok( + this.$(".test.static.cool-class").length, + "it has all the classes" + ); } }); -widgetTest('buildAttributes', { +widgetTest("buildAttributes", { template: `{{mount-widget widget="attributes-test" args=args}}`, beforeEach() { - createWidget('attributes-test', { - tagName: 'div.test', + createWidget("attributes-test", { + tagName: "div.test", buildAttributes(attrs) { - return { "data-evil": 'trout', "aria-label": attrs.label }; + return { "data-evil": "trout", "aria-label": attrs.label }; } }); - this.set('args', { label: 'accessibility' }); + this.set("args", { label: "accessibility" }); }, test(assert) { - assert.ok(this.$('.test[data-evil=trout]').length); - assert.ok(this.$('.test[aria-label=accessibility]').length); + assert.ok(this.$(".test[data-evil=trout]").length); + assert.ok(this.$(".test[aria-label=accessibility]").length); } }); -widgetTest('buildId', { +widgetTest("buildId", { template: `{{mount-widget widget="id-test" args=args}}`, beforeEach() { - createWidget('id-test', { + createWidget("id-test", { buildId(attrs) { return `test-${attrs.id}`; } }); - this.set('args', { id: 1234 }); + this.set("args", { id: 1234 }); }, test(assert) { - assert.ok(this.$('#test-1234').length); + assert.ok(this.$("#test-1234").length); } }); -widgetTest('widget state', { +widgetTest("widget state", { template: `{{mount-widget widget="state-test"}}`, beforeEach() { - createWidget('state-test', { - tagName: 'button.test', + createWidget("state-test", { + tagName: "button.test", buildKey: () => `button-test`, template: hbs`{{state.clicks}} clicks`, @@ -133,24 +136,22 @@ widgetTest('widget state', { }); }, - test(assert) { - assert.ok(this.$('button.test').length, 'it renders the button'); - assert.equal(this.$('button.test').text(), "0 clicks"); + async test(assert) { + assert.ok(this.$("button.test").length, "it renders the button"); + assert.equal(this.$("button.test").text(), "0 clicks"); - click(this.$('button')); - andThen(() => { - assert.equal(this.$('button.test').text(), "1 clicks"); - }); + await click(this.$("button")); + assert.equal(this.$("button.test").text(), "1 clicks"); } }); -widgetTest('widget update with promise', { +widgetTest("widget update with promise", { template: `{{mount-widget widget="promise-test"}}`, beforeEach() { - createWidget('promise-test', { - tagName: 'button.test', - buildKey: () => 'promise-test', + createWidget("promise-test", { + tagName: "button.test", + buildKey: () => "promise-test", template: hbs` {{#if state.name}} {{state.name}} @@ -170,31 +171,39 @@ widgetTest('widget update with promise', { }); }, - test(assert) { - assert.equal(this.$('button.test').text().trim(), "No name"); + async test(assert) { + assert.equal( + this.$("button.test") + .text() + .trim(), + "No name" + ); - click(this.$('button')); - andThen(() => { - assert.equal(this.$('button.test').text().trim(), "Robin"); - }); + await click(this.$("button")); + assert.equal( + this.$("button.test") + .text() + .trim(), + "Robin" + ); } }); -widgetTest('widget attaching', { +widgetTest("widget attaching", { template: `{{mount-widget widget="attach-test"}}`, beforeEach() { - createWidget('test-embedded', { tagName: 'div.embedded' }); + createWidget("test-embedded", { tagName: "div.embedded" }); - createWidget('attach-test', { - tagName: 'div.container', + createWidget("attach-test", { + tagName: "div.container", template: hbs`{{attach widget="test-embedded" attrs=attrs}}` }); }, test(assert) { - assert.ok(this.$('.container').length, "renders container"); - assert.ok(this.$('.container .embedded').length, "renders attached"); + assert.ok(this.$(".container").length, "renders container"); + assert.ok(this.$(".container .embedded").length, "renders attached"); } }); @@ -202,13 +211,13 @@ widgetTest("handlebars d-icon", { template: `{{mount-widget widget="hbs-icon-test" args=args}}`, beforeEach() { - createWidget('hbs-icon-test', { + createWidget("hbs-icon-test", { template: hbs`{{d-icon "arrow-down"}}` }); }, test(assert) { - assert.equal(this.$('i.fa.fa-arrow-down').length, 1); + assert.equal(this.$("i.fa.fa-arrow-down").length, 1); } }); @@ -216,34 +225,36 @@ widgetTest("handlebars i18n", { template: `{{mount-widget widget="hbs-i18n-test" args=args}}`, beforeEach() { - createWidget('hbs-i18n-test', { + createWidget("hbs-i18n-test", { template: hbs` {{i18n "hbs_test0"}} {{i18n attrs.key}} test ` }); - I18n.extras = [ { - "hbs_test0": "evil", - "hbs_test1": "trout" - } ]; - this.set('args', { key: 'hbs_test1' }); + I18n.extras = [ + { + hbs_test0: "evil", + hbs_test1: "trout" + } + ]; + this.set("args", { key: "hbs_test1" }); }, test(assert) { // comin up - assert.equal(this.$('span.string').text(), 'evil'); - assert.equal(this.$('span.var').text(), 'trout'); - assert.equal(this.$('a').prop('title'), 'evil'); + assert.equal(this.$("span.string").text(), "evil"); + assert.equal(this.$("span.var").text(), "trout"); + assert.equal(this.$("a").prop("title"), "evil"); } }); -widgetTest('handlebars #each', { +widgetTest("handlebars #each", { template: `{{mount-widget widget="hbs-each-test" args=args}}`, beforeEach() { - createWidget('hbs-each-test', { - tagName: 'ul', + createWidget("hbs-each-test", { + tagName: "ul", template: hbs` {{#each attrs.items as |item|}}
  • {{item}}
  • @@ -251,77 +262,76 @@ widgetTest('handlebars #each', { ` }); - this.set('args', { - items: ['one', 'two', 'three'] + this.set("args", { + items: ["one", "two", "three"] }); }, test(assert) { - assert.equal(this.$('ul li').length, 3); - assert.equal(this.$('ul li:eq(0)').text(), "one"); + assert.equal(this.$("ul li").length, 3); + assert.equal(this.$("ul li:eq(0)").text(), "one"); } - }); -widgetTest('widget decorating', { +widgetTest("widget decorating", { template: `{{mount-widget widget="decorate-test"}}`, beforeEach() { - createWidget('decorate-test', { - tagName: 'div.decorate', + createWidget("decorate-test", { + tagName: "div.decorate", template: hbs`main content` }); - withPluginApi('0.1', api => { - api.decorateWidget('decorate-test:before', dec => { - return dec.h('b', 'before'); + withPluginApi("0.1", api => { + api.decorateWidget("decorate-test:before", dec => { + return dec.h("b", "before"); }); - api.decorateWidget('decorate-test:after', dec => { - return dec.h('i', 'after'); + api.decorateWidget("decorate-test:after", dec => { + return dec.h("i", "after"); }); }); }, test(assert) { - assert.ok(this.$('.decorate').length); - assert.equal(this.$('.decorate b').text(), 'before'); - assert.equal(this.$('.decorate i').text(), 'after'); + assert.ok(this.$(".decorate").length); + assert.equal(this.$(".decorate b").text(), "before"); + assert.equal(this.$(".decorate i").text(), "after"); } }); -widgetTest('widget settings', { +widgetTest("widget settings", { template: `{{mount-widget widget="settings-test"}}`, beforeEach() { - createWidget('settings-test', { - tagName: 'div.settings', + createWidget("settings-test", { + tagName: "div.settings", template: hbs`age is {{settings.age}}`, settings: { age: 36 } }); }, test(assert) { - assert.equal(this.$('.settings').text(), 'age is 36'); + assert.equal(this.$(".settings").text(), "age is 36"); } }); -widgetTest('override settings', { +widgetTest("override settings", { template: `{{mount-widget widget="ov-settings-test"}}`, beforeEach() { - createWidget('ov-settings-test', { - tagName: 'div.settings', + createWidget("ov-settings-test", { + tagName: "div.settings", template: hbs`age is {{settings.age}}`, - settings: { age: 36 }, + settings: { age: 36 } }); - withPluginApi('0.1', api => { - api.changeWidgetSetting('ov-settings-test', 'age', 37); + withPluginApi("0.1", api => { + api.changeWidgetSetting("ov-settings-test", "age", 37); }); }, test(assert) { - assert.equal(this.$('.settings').text(), 'age is 37'); + assert.equal(this.$(".settings").text(), "age is 37"); } }); diff --git a/test/smoke_test.js b/test/smoke_test.js index 095d2b95ab..3bc3e7559b 100644 --- a/test/smoke_test.js +++ b/test/smoke_test.js @@ -16,7 +16,7 @@ const path = require('path'); const browser = await puppeteer.launch({ // when debugging localy setting headless to "false" can be very helpful headless: true, - args: ["--disable-local-storage"] + args: ["--disable-local-storage", "--no-sandbox"] }); const page = await browser.newPage(); @@ -59,11 +59,11 @@ const path = require('path'); return exec(description, fn, assertion); }; - page.on('console', msg => console.log(`PAGE LOG: ${msg.text}`)); + page.on('console', msg => console.log(`PAGE LOG: ${msg.text()}`)); page.on('response', resp => { - if (resp.status !== 200) { - console.log("FAILED HTTP REQUEST TO " + resp.url + " Status is: " + resp.status); + if (resp.status() !== 200) { + console.log("FAILED HTTP REQUEST TO " + resp.url() + " Status is: " + resp.status()); } return resp; }); @@ -218,20 +218,10 @@ const path = require('path'); return page.type("#reply-control .d-editor-input", post); }); - await assert("waiting for the preview", () => { - let promise = page.waitForSelector(".d-editor-preview p", + await exec("waiting for the preview", () => { + return page.waitForXPath("//div[contains(@class, 'd-editor-preview') and contains(.//p, 'I can even write a reply')]", { visible: true } ); - - promise = promise.then(() => { - return page.evaluate(() => { - return document.querySelector(".d-editor-preview").innerText; - }); - }); - - return promise; - }, output => { - return output.match("I can even write a reply"); }); await exec("submit the topic", () => { diff --git a/vendor/assets/javascripts/mousetrap.js b/vendor/assets/javascripts/mousetrap.js index 6e28146130..b2a79743e9 100644 --- a/vendor/assets/javascripts/mousetrap.js +++ b/vendor/assets/javascripts/mousetrap.js @@ -575,8 +575,8 @@ // // chrome will not fire a keypress if meta or control is down // safari will fire a keypress if meta or meta+shift is down - // firefox will fire a keypress if meta or control is down - if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { + // firefox will fire a keypress if meta, alt or control is down + if ((action == 'keypress' && !e.altKey && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { // when you bind a combination or sequence a second time it // should overwrite the first one. if a sequenceName or diff --git a/vendor/assets/javascripts/pretender.js b/vendor/assets/javascripts/pretender.js deleted file mode 100644 index c547ed2850..0000000000 --- a/vendor/assets/javascripts/pretender.js +++ /dev/null @@ -1,476 +0,0 @@ - (function(self) { -'use strict'; - -var appearsBrowserified = typeof self !== 'undefined' && - typeof process !== 'undefined' && - Object.prototype.toString.call(process) === '[object Object]'; - -var RouteRecognizer = appearsBrowserified ? require('route-recognizer') : self.RouteRecognizer; -var FakeXMLHttpRequest = appearsBrowserified ? require('fake-xml-http-request') : self.FakeXMLHttpRequest; - -/** - * parseURL - decompose a URL into its parts - * @param {String} url a URL - * @return {Object} parts of the URL, including the following - * - * 'https://www.yahoo.com:1234/mypage?test=yes#abc' - * - * { - * host: 'www.yahoo.com:1234', - * protocol: 'https:', - * search: '?test=yes', - * hash: '#abc', - * href: 'https://www.yahoo.com:1234/mypage?test=yes#abc', - * pathname: '/mypage', - * fullpath: '/mypage?test=yes' - * } - */ -function parseURL(url) { - // TODO: something for when document isn't present... #yolo - var anchor = document.createElement('a'); - anchor.href = url; - - if (!anchor.host) { - anchor.href = anchor.href; // IE: load the host and protocol - } - - var pathname = anchor.pathname; - if (pathname.charAt(0) !== '/') { - pathname = '/' + pathname; // IE: prepend leading slash - } - - var host = anchor.host; - if (anchor.port === '80' || anchor.port === '443') { - host = anchor.hostname; // IE: remove default port - } - - return { - host: host, - protocol: anchor.protocol, - search: anchor.search, - hash: anchor.hash, - href: anchor.href, - pathname: pathname, - fullpath: pathname + (anchor.search || '') + (anchor.hash || '') - }; -} - - -/** - * Registry - * - * A registry is a map of HTTP verbs to route recognizers. - */ - -function Registry(/* host */) { - // Herein we keep track of RouteRecognizer instances - // keyed by HTTP method. Feel free to add more as needed. - this.verbs = { - GET: new RouteRecognizer(), - PUT: new RouteRecognizer(), - POST: new RouteRecognizer(), - DELETE: new RouteRecognizer(), - PATCH: new RouteRecognizer(), - HEAD: new RouteRecognizer(), - OPTIONS: new RouteRecognizer() - }; -} - -/** - * Hosts - * - * a map of hosts to Registries, ultimately allowing - * a per-host-and-port, per HTTP verb lookup of RouteRecognizers - */ -function Hosts() { - this._registries = {}; -} - -/** - * Hosts#forURL - retrieve a map of HTTP verbs to RouteRecognizers - * for a given URL - * - * @param {String} url a URL - * @return {Registry} a map of HTTP verbs to RouteRecognizers - * corresponding to the provided URL's - * hostname and port - */ -Hosts.prototype.forURL = function(url) { - var host = parseURL(url).host; - var registry = this._registries[host]; - - if (registry === undefined) { - registry = (this._registries[host] = new Registry(host)); - } - - return registry.verbs; -}; - -function Pretender(/* routeMap1, routeMap2, ...*/) { - this.hosts = new Hosts(); - - this.handlers = []; - this.handledRequests = []; - this.passthroughRequests = []; - this.unhandledRequests = []; - this.requestReferences = []; - - // reference the native XMLHttpRequest object so - // it can be restored later - this._nativeXMLHttpRequest = self.XMLHttpRequest; - - // capture xhr requests, channeling them into - // the route map. - self.XMLHttpRequest = interceptor(this, this._nativeXMLHttpRequest); - - // 'start' the server - this.running = true; - - // trigger the route map DSL. - for (var i = 0; i < arguments.length; i++) { - this.map(arguments[i]); - } -} - -function interceptor(pretender, nativeRequest) { - function FakeRequest() { - // super() - FakeXMLHttpRequest.call(this); - } - // extend - var proto = new FakeXMLHttpRequest(); - proto.send = function send() { - if (!pretender.running) { - throw new Error('You shut down a Pretender instance while there was a pending request. ' + - 'That request just tried to complete. Check to see if you accidentally shut down ' + - 'a pretender earlier than you intended to'); - } - - FakeXMLHttpRequest.prototype.send.apply(this, arguments); - if (!pretender.checkPassthrough(this)) { - pretender.handleRequest(this); - } else { - var xhr = createPassthrough(this); - xhr.send.apply(xhr, arguments); - } - }; - - - function createPassthrough(fakeXHR) { - // event types to handle on the xhr - var evts = ['error', 'timeout', 'abort', 'readystatechange']; - - // event types to handle on the xhr.upload - var uploadEvents = []; - - // properties to copy from the native xhr to fake xhr - var lifecycleProps = ['readyState', 'responseText', 'responseXML', 'status', 'statusText']; - - var xhr = fakeXHR._passthroughRequest = new pretender._nativeXMLHttpRequest(); - - if (fakeXHR.responseType === 'arraybuffer') { - lifecycleProps = ['readyState', 'response', 'status', 'statusText']; - xhr.responseType = fakeXHR.responseType; - } - - // use onload if the browser supports it - if ('onload' in xhr) { - evts.push('load'); - } - - // add progress event for async calls - // avoid using progress events for sync calls, they will hang https://bugs.webkit.org/show_bug.cgi?id=40996. - if (fakeXHR.async && fakeXHR.responseType !== 'arraybuffer') { - evts.push('progress'); - uploadEvents.push('progress'); - } - - // update `propertyNames` properties from `fromXHR` to `toXHR` - function copyLifecycleProperties(propertyNames, fromXHR, toXHR) { - for (var i = 0; i < propertyNames.length; i++) { - var prop = propertyNames[i]; - if (fromXHR[prop]) { - toXHR[prop] = fromXHR[prop]; - } - } - } - - // fire fake event on `eventable` - function dispatchEvent(eventable, eventType, event) { - eventable.dispatchEvent(event); - if (eventable['on' + eventType]) { - eventable['on' + eventType](event); - } - } - - // set the on- handler on the native xhr for the given eventType - function createHandler(eventType) { - xhr['on' + eventType] = function(event) { - copyLifecycleProperties(lifecycleProps, xhr, fakeXHR); - dispatchEvent(fakeXHR, eventType, event); - }; - } - - // set the on- handler on the native xhr's `upload` property for - // the given eventType - function createUploadHandler(eventType) { - if (xhr.upload) { - xhr.upload['on' + eventType] = function(event) { - dispatchEvent(fakeXHR.upload, eventType, event); - }; - } - } - - xhr.open(fakeXHR.method, fakeXHR.url, fakeXHR.async, fakeXHR.username, fakeXHR.password); - - var i; - for (i = 0; i < evts.length; i++) { - createHandler(evts[i]); - } - for (i = 0; i < uploadEvents.length; i++) { - createUploadHandler(uploadEvents[i]); - } - - if (fakeXHR.async) { - xhr.timeout = fakeXHR.timeout; - xhr.withCredentials = fakeXHR.withCredentials; - } - for (var h in fakeXHR.requestHeaders) { - xhr.setRequestHeader(h, fakeXHR.requestHeaders[h]); - } - return xhr; - } - - proto._passthroughCheck = function(method, args) { - if (this._passthroughRequest) { - return this._passthroughRequest[method].apply(this._passthroughRequest, args); - } - return FakeXMLHttpRequest.prototype[method].apply(this, args); - }; - - proto.abort = function abort() { - return this._passthroughCheck('abort', arguments); - }; - - proto.getResponseHeader = function getResponseHeader() { - return this._passthroughCheck('getResponseHeader', arguments); - }; - - proto.getAllResponseHeaders = function getAllResponseHeaders() { - return this._passthroughCheck('getAllResponseHeaders', arguments); - }; - - FakeRequest.prototype = proto; - - if (nativeRequest.prototype._passthroughCheck) { - console.warn('You created a second Pretender instance while there was already one running. ' + - 'Running two Pretender servers at once will lead to unexpected results and will ' + - 'be removed entirely in a future major version.' + - 'Please call .shutdown() on your instances when you no longer need them to respond.'); - } - return FakeRequest; -} - -function verbify(verb) { - return function(path, handler, async) { - return this.register(verb, path, handler, async); - }; -} - -function scheduleProgressEvent(request, startTime, totalTime) { - setTimeout(function() { - if (!request.aborted && !request.status) { - var ellapsedTime = new Date().getTime() - startTime.getTime(); - request.upload._progress(true, ellapsedTime, totalTime); - request._progress(true, ellapsedTime, totalTime); - scheduleProgressEvent(request, startTime, totalTime); - } - }, 50); -} - -function isArray(array) { - return Object.prototype.toString.call(array) === '[object Array]'; -} - -var PASSTHROUGH = {}; - -Pretender.prototype = { - get: verbify('GET'), - post: verbify('POST'), - put: verbify('PUT'), - 'delete': verbify('DELETE'), - patch: verbify('PATCH'), - head: verbify('HEAD'), - options: verbify('OPTIONS'), - map: function(maps) { - maps.call(this); - }, - register: function register(verb, url, handler, async) { - if (!handler) { - throw new Error('The function you tried passing to Pretender to handle ' + - verb + ' ' + url + ' is undefined or missing.'); - } - - handler.numberOfCalls = 0; - handler.async = async; - this.handlers.push(handler); - - var registry = this.hosts.forURL(url)[verb]; - - registry.add([{ - path: parseURL(url).fullpath, - handler: handler - }]); - - return handler; - }, - passthrough: PASSTHROUGH, - checkPassthrough: function checkPassthrough(request) { - var verb = request.method.toUpperCase(); - - var path = parseURL(request.url).fullpath; - - verb = verb.toUpperCase(); - - var recognized = this.hosts.forURL(request.url)[verb].recognize(path); - var match = recognized && recognized[0]; - if (match && match.handler === PASSTHROUGH) { - this.passthroughRequests.push(request); - this.passthroughRequest(verb, path, request); - return true; - } - - return false; - }, - handleRequest: function handleRequest(request) { - var verb = request.method.toUpperCase(); - var path = request.url; - - var handler = this._handlerFor(verb, path, request); - - if (handler) { - handler.handler.numberOfCalls++; - var async = handler.handler.async; - this.handledRequests.push(request); - - var pretender = this; - - var _handleRequest = function(statusHeadersAndBody) { - if (!isArray(statusHeadersAndBody)) { - var note = 'Remember to `return [status, headers, body];` in your route handler.'; - throw new Error('Nothing returned by handler for ' + path + '. ' + note); - } - - var status = statusHeadersAndBody[0], - headers = pretender.prepareHeaders(statusHeadersAndBody[1]), - body = pretender.prepareBody(statusHeadersAndBody[2], headers); - - pretender.handleResponse(request, async, function() { - request.respond(status, headers, body); - pretender.handledRequest(verb, path, request); - }); - }; - - try { - var result = handler.handler(request); - if (result && typeof result.then === 'function') { - // `result` is a promise, resolve it - result.then(function(resolvedResult) { - _handleRequest(resolvedResult); - }); - } else { - _handleRequest(result); - } - } catch (error) { - this.erroredRequest(verb, path, request, error); - this.resolve(request); - } - } else { - this.unhandledRequests.push(request); - this.unhandledRequest(verb, path, request); - } - }, - handleResponse: function handleResponse(request, strategy, callback) { - var delay = typeof strategy === 'function' ? strategy() : strategy; - delay = typeof delay === 'boolean' || typeof delay === 'number' ? delay : 0; - - if (delay === false) { - callback(); - } else { - var pretender = this; - pretender.requestReferences.push({ - request: request, - callback: callback - }); - - if (delay !== true) { - scheduleProgressEvent(request, new Date(), delay); - setTimeout(function() { - pretender.resolve(request); - }, delay); - } - } - }, - resolve: function resolve(request) { - for (var i = 0, len = this.requestReferences.length; i < len; i++) { - var res = this.requestReferences[i]; - if (res.request === request) { - res.callback(); - this.requestReferences.splice(i, 1); - break; - } - } - }, - requiresManualResolution: function(verb, path) { - var handler = this._handlerFor(verb.toUpperCase(), path, {}); - if (!handler) { return false; } - - var async = handler.handler.async; - return typeof async === 'function' ? async() === true : async === true; - }, - prepareBody: function(body) { return body; }, - prepareHeaders: function(headers) { return headers; }, - handledRequest: function(/* verb, path, request */) { /* no-op */}, - passthroughRequest: function(/* verb, path, request */) { /* no-op */}, - unhandledRequest: function(verb, path/*, request */) { - throw new Error('Pretender intercepted ' + verb + ' ' + - path + ' but no handler was defined for this type of request'); - }, - erroredRequest: function(verb, path, request, error) { - error.message = 'Pretender intercepted ' + verb + ' ' + - path + ' but encountered an error: ' + error.message; - throw error; - }, - _handlerFor: function(verb, url, request) { - var registry = this.hosts.forURL(url)[verb]; - var matches = registry.recognize(parseURL(url).fullpath); - - var match = matches ? matches[0] : null; - if (match) { - request.params = match.params; - request.queryParams = matches.queryParams; - } - - return match; - }, - shutdown: function shutdown() { - self.XMLHttpRequest = this._nativeXMLHttpRequest; - - // 'stop' the server - this.running = false; - } -}; - -Pretender.parseURL = parseURL; -Pretender.Hosts = Hosts; -Pretender.Registry = Registry; - -if (typeof module === 'object') { - module.exports = Pretender; -} else if (typeof define !== 'undefined') { - define('pretender', [], function() { - return Pretender; - }); -} -self.Pretender = Pretender; -}(self)); diff --git a/yarn.lock b/yarn.lock index e73d58eb46..62f9d572c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,54 +2,77 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.31": - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz#473d021ecc573a2cce1c07d5b509d5215f46ba35" +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + dependencies: + "@babel/highlight" "7.0.0-beta.44" + +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" -"@babel/helper-function-name@7.0.0-beta.31": - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz#afe63ad799209989348b1109b44feb66aa245f57" +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.31" - "@babel/template" "7.0.0-beta.31" - "@babel/traverse" "7.0.0-beta.31" - "@babel/types" "7.0.0-beta.31" - -"@babel/helper-get-function-arity@7.0.0-beta.31": - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz#1176d79252741218e0aec872ada07efb2b37a493" - dependencies: - "@babel/types" "7.0.0-beta.31" - -"@babel/template@7.0.0-beta.31": - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.31.tgz#577bb29389f6c497c3e7d014617e7d6713f68bda" - dependencies: - "@babel/code-frame" "7.0.0-beta.31" - "@babel/types" "7.0.0-beta.31" - babylon "7.0.0-beta.31" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" lodash "^4.2.0" -"@babel/traverse@7.0.0-beta.31": - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.31.tgz#db399499ad74aefda014f0c10321ab255134b1df" +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" dependencies: - "@babel/code-frame" "7.0.0-beta.31" - "@babel/helper-function-name" "7.0.0-beta.31" - "@babel/types" "7.0.0-beta.31" - babylon "7.0.0-beta.31" - debug "^3.0.1" - globals "^10.0.0" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" invariant "^2.2.0" lodash "^4.2.0" -"@babel/types@7.0.0-beta.31": - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.31.tgz#42c9c86784f674c173fb21882ca9643334029de4" +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -63,9 +86,9 @@ version "0.3.29" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" -"@types/node@6.0.66": - version "6.0.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.66.tgz#5680b74a6135d33d4c00447e7c3dc691a4601625" +"@types/node@^9.3.0": + version "9.6.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.20.tgz#b59a1bd357ae2df7d44d5ac98e9b64eb96ea1fef" "@types/rimraf@^0.0.28": version "0.0.28" @@ -81,9 +104,9 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" +acorn@^5.5.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.6.2.tgz#b1da1d7be2ac1b4a327fb9eab851702c5045b4e7" agent-base@^4.1.0: version "4.1.2" @@ -158,18 +181,20 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-eslint@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.0.3.tgz#f29ecf02336be438195325cd47c468da81ee4e98" +babel-eslint@^8.2: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" dependencies: - "@babel/code-frame" "7.0.0-beta.31" - "@babel/traverse" "7.0.0-beta.31" - "@babel/types" "7.0.0-beta.31" - babylon "7.0.0-beta.31" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" -babylon@7.0.0-beta.31: - version "7.0.0-beta.31" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.31.tgz#7ec10f81e0e456fd0f855ad60fa30c2ac454283f" +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" balanced-match@^1.0.0: version "1.0.0" @@ -182,6 +207,10 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -214,22 +243,22 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -chrome-launcher@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.10.0.tgz#4291ab1d20bb097da80b085e8c8c8e6b3e3d72c9" +chrome-launcher@^0.10: + version "0.10.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.10.2.tgz#f7d860ddec627b6f01015736b5ae1e33b3d165b1" dependencies: "@types/core-js" "^0.9.41" "@types/mkdirp" "^0.3.29" - "@types/node" "6.0.66" + "@types/node" "^9.3.0" "@types/rimraf" "^0.0.28" is-wsl "^1.1.0" lighthouse-logger "^1.0.0" mkdirp "0.5.1" rimraf "^2.6.1" -chrome-remote-interface@^0.25.4: - version "0.25.4" - resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.25.4.tgz#3a84aa9ef053dc2fd25d3b4c30d7501cb5f73883" +chrome-remote-interface@^0.25: + version "0.25.7" + resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz#827e85fbef3cc561a9ef2404eb7eee355968c5bc" dependencies: commander "2.11.x" ws "3.3.x" @@ -270,7 +299,16 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.0, concat-stream@^1.6.0: +concat-stream@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -296,7 +334,7 @@ debug@2.6.9, debug@^2.6.8: dependencies: ms "2.0.0" -debug@^3.0.1, debug@^3.1.0: +debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -318,9 +356,9 @@ del@^2.0.2: pinkie-promise "^2.0.0" rimraf "^2.2.8" -doctrine@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: esutils "^2.0.2" @@ -338,28 +376,32 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -eslint-scope@^3.7.1: +eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^4.13.1: - version "4.13.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.13.1.tgz#0055e0014464c7eb7878caf549ef2941992b444f" +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.19: + version "4.19.1" + resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" chalk "^2.1.0" concat-stream "^1.6.0" cross-spawn "^5.1.0" - debug "^3.0.1" - doctrine "^2.0.2" + debug "^3.1.0" + doctrine "^2.1.0" eslint-scope "^3.7.1" - espree "^3.5.2" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" esquery "^1.0.0" - estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" @@ -380,18 +422,19 @@ eslint@^4.13.1: path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" + regexpp "^1.0.1" require-uncached "^1.0.3" semver "^5.3.0" strip-ansi "^4.0.0" strip-json-comments "~2.0.1" - table "^4.0.1" + table "4.0.2" text-table "~0.2.0" -espree@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: - acorn "^5.2.1" + acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@^4.0.0: @@ -411,7 +454,7 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -427,15 +470,19 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" -extract-zip@^1.6.5: - version "1.6.6" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" +extract-zip@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" dependencies: - concat-stream "1.6.0" + concat-stream "1.6.2" debug "2.6.9" - mkdirp "0.5.0" + mkdirp "0.5.1" yauzl "2.4.1" +fake-xml-http-request@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -495,14 +542,14 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^10.0.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-10.4.0.tgz#5c477388b128a9e4c5c5d01c7a2aca68c68b2da7" - globals@^11.0.1: version "11.1.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" +globals@^11.1.0: + version "11.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -528,9 +575,9 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" -https-proxy-agent@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" dependencies: agent-base "^4.1.0" debug "^3.1.0" @@ -634,6 +681,10 @@ js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -672,9 +723,9 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" +mime@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" mimic-fn@^1.0.0: version "1.1.0" @@ -690,12 +741,6 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - dependencies: - minimist "0.0.8" - mkdirp@0.5.1, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -779,6 +824,17 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" +pretender@^1.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" + dependencies: + fake-xml-http-request "^1.6.0" + route-recognizer "^0.3.3" + +prettier@^1.13: + version "1.14.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -795,18 +851,18 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -puppeteer@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-0.13.0.tgz#2e6956205f2c640964c2107f620ae1eef8bde8fd" +puppeteer@^1.4: + version "1.8.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.8.0.tgz#9e8bbd2f5448cc19cac220efc0512837104877ad" dependencies: - debug "^2.6.8" - extract-zip "^1.6.5" - https-proxy-agent "^2.1.0" - mime "^1.3.4" + debug "^3.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" progress "^2.0.0" proxy-from-env "^1.0.0" rimraf "^2.6.1" - ws "^3.0.0" + ws "^5.1.1" readable-stream@^2.2.2: version "2.3.3" @@ -820,6 +876,10 @@ readable-stream@^2.2.2: string_decoder "~1.0.3" util-deprecate "~1.0.1" +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -844,6 +904,10 @@ rimraf@^2.2.8, rimraf@^2.6.1: dependencies: glob "^7.0.5" +route-recognizer@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -888,6 +952,10 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -931,7 +999,7 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" -table@^4.0.1: +table@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" dependencies: @@ -960,6 +1028,10 @@ to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -998,7 +1070,7 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -ws@3.3.x, ws@^3.0.0: +ws@3.3.x: version "3.3.2" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.2.tgz#96c1d08b3fefda1d5c1e33700d3bfaa9be2d5608" dependencies: @@ -1006,6 +1078,12 @@ ws@3.3.x, ws@^3.0.0: safe-buffer "~5.1.0" ultron "~1.1.0" +ws@^5.1.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + dependencies: + async-limiter "~1.0.0" + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"